blob: 63505fd5a8cc50fc199ee7a77149b020ed319f1b [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,
279 test_params_.quic_max_time_before_crypto_handshake_seconds,
280 test_params_.quic_max_idle_time_before_crypto_handshake_seconds,
281 test_params_.quic_migrate_sessions_on_network_change_v2,
282 test_params_.quic_migrate_sessions_early_v2,
283 test_params_.quic_retry_on_alternate_network_before_handshake,
Zhongyi Shic16b4102019-02-12 00:37:40284 test_params_.quic_idle_session_migration_period,
Zhongyi Shi967d2f12019-02-08 20:58:53285 test_params_.quic_max_time_on_non_default_network,
286 test_params_.quic_max_migrations_to_non_default_network_on_write_error,
287 test_params_
288 .quic_max_migrations_to_non_default_network_on_path_degrading,
289 test_params_.quic_allow_server_migration,
290 test_params_.quic_race_stale_dns_on_connection,
291 test_params_.quic_go_away_on_path_degrading,
292 test_params_.quic_race_cert_verification,
293 test_params_.quic_estimate_initial_rtt,
294 test_params_.quic_headers_include_h2_stream_dependency,
295 test_params_.quic_connection_options,
296 test_params_.quic_client_connection_options,
297 test_params_.quic_enable_socket_recv_optimization));
[email protected]e13201d82012-12-12 05:00:32298 }
299
Zhongyi Shi5f587cc2017-11-21 23:24:17300 void InitializeConnectionMigrationV2Test(
301 NetworkChangeNotifier::NetworkList connected_networks) {
302 scoped_mock_network_change_notifier_.reset(
303 new ScopedMockNetworkChangeNotifier());
304 MockNetworkChangeNotifier* mock_ncn =
305 scoped_mock_network_change_notifier_->mock_network_change_notifier();
306 mock_ncn->ForceNetworkHandlesSupported();
307 mock_ncn->SetConnectedNetworksList(connected_networks);
Zhongyi Shi967d2f12019-02-08 20:58:53308 test_params_.quic_migrate_sessions_on_network_change_v2 = true;
309 test_params_.quic_migrate_sessions_early_v2 = true;
Zhongyi Shi5f587cc2017-11-21 23:24:17310 socket_factory_.reset(new TestConnectionMigrationSocketFactory);
311 Initialize();
312 }
313
Yixin Wang7891a39d2017-11-08 20:59:24314 std::unique_ptr<HttpStream> CreateStream(QuicStreamRequest* request) {
315 std::unique_ptr<QuicChromiumClientSession::Handle> session =
316 request->ReleaseSessionHandle();
317 if (!session || !session->IsConnected())
318 return nullptr;
319
320 return std::make_unique<QuicHttpStream>(std::move(session));
321 }
322
bnccb7ff3c2015-05-21 20:51:55323 bool HasActiveSession(const HostPortPair& host_port_pair) {
Ryan Hamilton4f0b26e2018-06-27 23:52:32324 quic::QuicServerId server_id(host_port_pair.host(), host_port_pair.port(),
325 false);
bnc5fdc07162016-05-23 17:36:03326 return QuicStreamFactoryPeer::HasActiveSession(factory_.get(), server_id);
bnccb7ff3c2015-05-21 20:51:55327 }
328
Renjiea0cb4a2c2018-09-26 23:37:30329 bool HasLiveSession(const HostPortPair& host_port_pair) {
330 quic::QuicServerId server_id(host_port_pair.host(), host_port_pair.port(),
331 false);
332 return QuicStreamFactoryPeer::HasLiveSession(factory_.get(), host_port_pair,
333 server_id);
334 }
335
zhongyi363c91c2017-03-23 23:16:08336 bool HasActiveJob(const HostPortPair& host_port_pair,
337 const PrivacyMode privacy_mode) {
Ryan Hamilton4f0b26e2018-06-27 23:52:32338 quic::QuicServerId server_id(host_port_pair.host(), host_port_pair.port(),
339 privacy_mode == PRIVACY_MODE_ENABLED);
zhongyi363c91c2017-03-23 23:16:08340 return QuicStreamFactoryPeer::HasActiveJob(factory_.get(), server_id);
341 }
342
Ryan Hamilton8d9ee76e2018-05-29 23:52:52343 bool HasActiveCertVerifierJob(const quic::QuicServerId& server_id) {
rtennetid073dd22016-08-04 01:58:33344 return QuicStreamFactoryPeer::HasActiveCertVerifierJob(factory_.get(),
345 server_id);
346 }
347
Zhongyi Shic1449372018-08-09 09:58:58348 // Get the pending, not activated session, if there is only one session alive.
349 QuicChromiumClientSession* GetPendingSession(
350 const HostPortPair& host_port_pair) {
351 quic::QuicServerId server_id(host_port_pair.host(), host_port_pair.port(),
352 false);
353 return QuicStreamFactoryPeer::GetPendingSession(factory_.get(), server_id,
354 host_port_pair);
355 }
356
bnc912a04b2016-04-20 14:19:50357 QuicChromiumClientSession* GetActiveSession(
358 const HostPortPair& host_port_pair) {
Ryan Hamilton4f0b26e2018-06-27 23:52:32359 quic::QuicServerId server_id(host_port_pair.host(), host_port_pair.port(),
360 false);
bnc5fdc07162016-05-23 17:36:03361 return QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server_id);
bnc912a04b2016-04-20 14:19:50362 }
363
[email protected]bf4ea2f2014-03-10 22:57:53364 int GetSourcePortForNewSession(const HostPortPair& destination) {
[email protected]d8e2abf82014-03-06 10:30:10365 return GetSourcePortForNewSessionInner(destination, false);
366 }
367
rjshaded5ced072015-12-18 19:26:02368 int GetSourcePortForNewSessionAndGoAway(const HostPortPair& destination) {
[email protected]d8e2abf82014-03-06 10:30:10369 return GetSourcePortForNewSessionInner(destination, true);
370 }
371
[email protected]bf4ea2f2014-03-10 22:57:53372 int GetSourcePortForNewSessionInner(const HostPortPair& destination,
[email protected]d8e2abf82014-03-06 10:30:10373 bool goaway_received) {
[email protected]3c772402013-12-18 21:38:11374 // Should only be called if there is no active session for this destination.
bnccb7ff3c2015-05-21 20:51:55375 EXPECT_FALSE(HasActiveSession(destination));
Zhongyi Shi5f587cc2017-11-21 23:24:17376 size_t socket_count = socket_factory_->udp_client_socket_ports().size();
[email protected]3c772402013-12-18 21:38:11377
rcha00569732016-08-27 11:09:36378 MockQuicData socket_data;
379 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:43380 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:17381 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]3c772402013-12-18 21:38:11382
zhongyi98d6a9262017-05-19 02:47:45383 QuicStreamRequest request(factory_.get());
ckrasic3865ee0f2016-02-29 22:04:56384 GURL url("https://" + destination.host() + "/");
Zhongyi Shia6b68d112018-09-24 07:49:03385 EXPECT_EQ(
386 ERR_IO_PENDING,
387 request.Request(
388 destination, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
389 /*cert_verify_flags=*/0, url, net_log_, &net_error_details_,
390 failed_on_default_network_callback_, callback_.callback()));
[email protected]3c772402013-12-18 21:38:11391
robpercival214763f2016-07-01 23:27:01392 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:24393 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]3c772402013-12-18 21:38:11394 EXPECT_TRUE(stream.get());
395 stream.reset();
396
bnc912a04b2016-04-20 14:19:50397 QuicChromiumClientSession* session = GetActiveSession(destination);
[email protected]3c772402013-12-18 21:38:11398
Zhongyi Shi5f587cc2017-11-21 23:24:17399 if (socket_count + 1 != socket_factory_->udp_client_socket_ports().size()) {
mmenke651bae7f2015-12-18 21:26:45400 ADD_FAILURE();
[email protected]3c772402013-12-18 21:38:11401 return 0;
402 }
403
[email protected]d8e2abf82014-03-06 10:30:10404 if (goaway_received) {
Ryan Hamilton8d9ee76e2018-05-29 23:52:52405 quic::QuicGoAwayFrame goaway(quic::kInvalidControlFrameId,
406 quic::QUIC_NO_ERROR, 1, "");
rtenneti9bd5d4b2015-08-21 05:44:52407 session->connection()->OnGoAwayFrame(goaway);
[email protected]d8e2abf82014-03-06 10:30:10408 }
[email protected]3c772402013-12-18 21:38:11409
jri7046038f2015-10-22 00:29:26410 factory_->OnSessionClosed(session);
bnccb7ff3c2015-05-21 20:51:55411 EXPECT_FALSE(HasActiveSession(destination));
rch37de576c2015-05-17 20:28:17412 EXPECT_TRUE(socket_data.AllReadDataConsumed());
413 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
Zhongyi Shi5f587cc2017-11-21 23:24:17414 return socket_factory_->udp_client_socket_ports()[socket_count];
[email protected]3c772402013-12-18 21:38:11415 }
416
Ryan Hamilton8d9ee76e2018-05-29 23:52:52417 std::unique_ptr<quic::QuicEncryptedPacket>
Fan Yangac867502019-01-28 21:10:23418 ConstructClientConnectionClosePacket(uint64_t num) {
Bin Wu5311aca2018-01-22 01:19:03419 return client_maker_.MakeConnectionClosePacket(
Ryan Hamilton8d9ee76e2018-05-29 23:52:52420 num, false, quic::QUIC_CRYPTO_VERSION_NOT_SUPPORTED, "Time to panic!");
rtenneti1cd3b162015-09-29 02:58:28421 }
422
Ryan Hamilton8d9ee76e2018-05-29 23:52:52423 std::unique_ptr<quic::QuicEncryptedPacket> ConstructClientRstPacket(
Fan Yangac867502019-01-28 21:10:23424 uint64_t packet_number,
Ryan Hamilton8d9ee76e2018-05-29 23:52:52425 quic::QuicRstStreamErrorCode error_code) {
Fan Yang32c5a112018-12-10 20:06:33426 quic::QuicStreamId stream_id =
427 GetNthClientInitiatedBidirectionalStreamId(0);
fayang3bcb8b502016-12-07 21:44:37428 return client_maker_.MakeRstPacket(packet_number, true, stream_id,
Jana Iyengarba355772017-09-21 22:03:21429 error_code);
fayang3bcb8b502016-12-07 21:44:37430 }
431
bncf8bf0722015-05-19 20:04:13432 static ProofVerifyDetailsChromium DefaultProofVerifyDetails() {
rch6faa4d42016-01-05 20:48:43433 // Load a certificate that is valid for *.example.org
bncf8bf0722015-05-19 20:04:13434 scoped_refptr<X509Certificate> test_cert(
rch6faa4d42016-01-05 20:48:43435 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
bncf8bf0722015-05-19 20:04:13436 EXPECT_TRUE(test_cert.get());
437 ProofVerifyDetailsChromium verify_details;
438 verify_details.cert_verify_result.verified_cert = test_cert;
439 verify_details.cert_verify_result.is_issued_by_known_root = true;
440 return verify_details;
441 }
442
jri8c44d692015-10-23 23:53:41443 void NotifyIPAddressChanged() {
444 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
jri7e636642016-01-14 06:57:08445 // Spin the message loop so the notification is delivered.
fdoray92e35a72016-06-10 15:54:55446 base::RunLoop().RunUntilIdle();
jri8c44d692015-10-23 23:53:41447 }
448
Ryan Hamilton8d9ee76e2018-05-29 23:52:52449 std::unique_ptr<quic::QuicEncryptedPacket> ConstructGetRequestPacket(
Fan Yangac867502019-01-28 21:10:23450 uint64_t packet_number,
Ryan Hamilton8d9ee76e2018-05-29 23:52:52451 quic::QuicStreamId stream_id,
jri7e636642016-01-14 06:57:08452 bool should_include_version,
453 bool fin) {
Ryan Hamilton0239aac2018-05-19 00:03:13454 spdy::SpdyHeaderBlock headers =
alyssar2adf3ac2016-05-03 17:12:58455 client_maker_.GetRequestHeaders("GET", "https", "/");
Ryan Hamilton0239aac2018-05-19 00:03:13456 spdy::SpdyPriority priority =
jri7e636642016-01-14 06:57:08457 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
458 size_t spdy_headers_frame_len;
alyssar2adf3ac2016-05-03 17:12:58459 return client_maker_.MakeRequestHeadersPacket(
jri7e636642016-01-14 06:57:08460 packet_number, stream_id, should_include_version, fin, priority,
Yixin Wang7a3f1b8d2018-01-17 21:40:48461 std::move(headers), 0, &spdy_headers_frame_len);
jri7e636642016-01-14 06:57:08462 }
463
Ryan Hamilton8d9ee76e2018-05-29 23:52:52464 std::unique_ptr<quic::QuicEncryptedPacket> ConstructGetRequestPacket(
Fan Yangac867502019-01-28 21:10:23465 uint64_t packet_number,
Ryan Hamilton8d9ee76e2018-05-29 23:52:52466 quic::QuicStreamId stream_id,
Zhongyi Shi3c4c9e92018-07-02 23:16:23467 quic::QuicStreamId parent_stream_id,
fayang3bcb8b502016-12-07 21:44:37468 bool should_include_version,
469 bool fin,
Ryan Hamilton8d9ee76e2018-05-29 23:52:52470 quic::QuicStreamOffset* offset) {
Ryan Hamilton0239aac2018-05-19 00:03:13471 spdy::SpdyHeaderBlock headers =
fayang3bcb8b502016-12-07 21:44:37472 client_maker_.GetRequestHeaders("GET", "https", "/");
Ryan Hamilton0239aac2018-05-19 00:03:13473 spdy::SpdyPriority priority =
fayang3bcb8b502016-12-07 21:44:37474 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
475 size_t spdy_headers_frame_len;
476 return client_maker_.MakeRequestHeadersPacket(
477 packet_number, stream_id, should_include_version, fin, priority,
Zhongyi Shi3c4c9e92018-07-02 23:16:23478 std::move(headers), parent_stream_id, &spdy_headers_frame_len, offset);
479 }
480
481 std::unique_ptr<quic::QuicEncryptedPacket> ConstructGetRequestPacket(
Fan Yangac867502019-01-28 21:10:23482 uint64_t packet_number,
Zhongyi Shi3c4c9e92018-07-02 23:16:23483 quic::QuicStreamId stream_id,
484 bool should_include_version,
485 bool fin,
486 quic::QuicStreamOffset* offset) {
487 return ConstructGetRequestPacket(packet_number, stream_id,
488 /*parent_stream_id=*/0,
489 should_include_version, fin, offset);
fayang3bcb8b502016-12-07 21:44:37490 }
491
Ryan Hamilton8d9ee76e2018-05-29 23:52:52492 std::unique_ptr<quic::QuicEncryptedPacket> ConstructOkResponsePacket(
Fan Yangac867502019-01-28 21:10:23493 uint64_t packet_number,
Ryan Hamilton8d9ee76e2018-05-29 23:52:52494 quic::QuicStreamId stream_id,
jri7e636642016-01-14 06:57:08495 bool should_include_version,
496 bool fin) {
Ryan Hamilton0239aac2018-05-19 00:03:13497 spdy::SpdyHeaderBlock headers = server_maker_.GetResponseHeaders("200 OK");
jri7e636642016-01-14 06:57:08498 size_t spdy_headers_frame_len;
alyssar2adf3ac2016-05-03 17:12:58499 return server_maker_.MakeResponseHeadersPacket(
bnc086b39e12016-06-24 13:05:26500 packet_number, stream_id, should_include_version, fin,
501 std::move(headers), &spdy_headers_frame_len);
jri7e636642016-01-14 06:57:08502 }
503
Ryan Hamilton8d9ee76e2018-05-29 23:52:52504 std::unique_ptr<quic::QuicReceivedPacket> ConstructInitialSettingsPacket() {
rch5cb522462017-04-25 20:18:36505 return client_maker_.MakeInitialSettingsPacket(1, nullptr);
506 }
507
Ryan Hamilton8d9ee76e2018-05-29 23:52:52508 std::unique_ptr<quic::QuicReceivedPacket> ConstructInitialSettingsPacket(
Fan Yangac867502019-01-28 21:10:23509 uint64_t packet_number,
Ryan Hamilton8d9ee76e2018-05-29 23:52:52510 quic::QuicStreamOffset* offset) {
rch5cb522462017-04-25 20:18:36511 return client_maker_.MakeInitialSettingsPacket(packet_number, offset);
fayang3bcb8b502016-12-07 21:44:37512 }
513
jri053fdbd2016-08-19 02:33:05514 // Helper method for server migration tests.
Ryan Hamilton8d9ee76e2018-05-29 23:52:52515 void VerifyServerMigration(const quic::QuicConfig& config,
bnc6a0348c2017-05-22 18:56:19516 IPEndPoint expected_address) {
Zhongyi Shi967d2f12019-02-08 20:58:53517 test_params_.quic_allow_server_migration = true;
jri053fdbd2016-08-19 02:33:05518 Initialize();
519
520 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
521 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri053fdbd2016-08-19 02:33:05522 crypto_client_stream_factory_.SetConfig(config);
523
524 // Set up first socket data provider.
rcha00569732016-08-27 11:09:36525 MockQuicData socket_data1;
526 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi5f587cc2017-11-21 23:24:17527 socket_data1.AddSocketDataToFactory(socket_factory_.get());
jri053fdbd2016-08-19 02:33:05528
rcha00569732016-08-27 11:09:36529 // Set up second socket data provider that is used after
530 // migration.
531 MockQuicData socket_data2;
532 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:43533 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
fayang3bcb8b502016-12-07 21:44:37534 socket_data2.AddWrite(
Zhongyi Shi32f2fd02018-04-16 18:23:43535 SYNCHRONOUS, client_maker_.MakePingPacket(2, /*include_version=*/true));
536 socket_data2.AddWrite(
Fan Yang32c5a112018-12-10 20:06:33537 SYNCHRONOUS, client_maker_.MakeRstPacket(
538 3, true, GetNthClientInitiatedBidirectionalStreamId(0),
539 quic::QUIC_STREAM_CANCELLED));
Zhongyi Shi5f587cc2017-11-21 23:24:17540 socket_data2.AddSocketDataToFactory(socket_factory_.get());
jri053fdbd2016-08-19 02:33:05541
542 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:45543 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:33544 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:03545 request.Request(
546 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
547 SocketTag(),
548 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
549 failed_on_default_network_callback_, callback_.callback()));
jri053fdbd2016-08-19 02:33:05550 EXPECT_EQ(OK, callback_.WaitForResult());
bnceb9aa7112017-01-05 01:03:46551
552 // Run QuicChromiumClientSession::WriteToNewSocket()
553 // posted by QuicChromiumClientSession::MigrateToSocket().
554 base::RunLoop().RunUntilIdle();
555
Yixin Wang7891a39d2017-11-08 20:59:24556 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri053fdbd2016-08-19 02:33:05557 EXPECT_TRUE(stream.get());
558
559 // Cause QUIC stream to be created.
560 HttpRequestInfo request_info;
561 request_info.method = "GET";
562 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:39563 request_info.traffic_annotation =
564 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:27565 EXPECT_EQ(OK,
566 stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:39567 net_log_, CompletionOnceCallback()));
jri053fdbd2016-08-19 02:33:05568 // Ensure that session is alive and active.
569 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
570 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
571 EXPECT_TRUE(HasActiveSession(host_port_pair_));
572
573 IPEndPoint actual_address;
574 session->GetDefaultSocket()->GetPeerAddress(&actual_address);
575 EXPECT_EQ(actual_address, expected_address);
576 DVLOG(1) << "Socket connected to: " << actual_address.address().ToString()
577 << " " << actual_address.port();
578 DVLOG(1) << "Expected address: " << expected_address.address().ToString()
579 << " " << expected_address.port();
580
581 stream.reset();
582 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
583 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
584 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
585 }
586
tbansal3b966952016-10-25 23:25:14587 // Verifies that the QUIC stream factory is initialized correctly.
tbansal9b1cdf32017-05-10 17:28:39588 void VerifyInitialization() {
rch431dd4452017-04-19 15:22:35589 store_server_configs_in_properties_ = true;
Zhongyi Shi967d2f12019-02-08 20:58:53590 test_params_.quic_idle_connection_timeout_seconds = 500;
tbansal3b966952016-10-25 23:25:14591 Initialize();
Ryan Hamiltona12722b2017-08-12 02:23:20592 factory_->set_require_confirmation(false);
tbansal3b966952016-10-25 23:25:14593 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
594 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rch431dd4452017-04-19 15:22:35595 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
596 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:27597 MockCryptoClientStream::ZERO_RTT);
Ryan Hamilton8d9ee76e2018-05-29 23:52:52598 const quic::QuicConfig* config =
599 QuicStreamFactoryPeer::GetConfig(factory_.get());
ckrasic32b17dcd2016-10-31 06:15:35600 EXPECT_EQ(500, config->IdleNetworkTimeout().ToSeconds());
tbansal3b966952016-10-25 23:25:14601
602 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
603
bnc3472afd2016-11-17 15:27:21604 const AlternativeService alternative_service1(
605 kProtoQUIC, host_port_pair_.host(), host_port_pair_.port());
tbansal3b966952016-10-25 23:25:14606 AlternativeServiceInfoVector alternative_service_info_vector;
607 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
608 alternative_service_info_vector.push_back(
zhongyie537a002017-06-27 16:48:21609 AlternativeServiceInfo::CreateQuicAlternativeServiceInfo(
610 alternative_service1, expiration, {version_}));
tbansal3b966952016-10-25 23:25:14611 http_server_properties_.SetAlternativeServices(
612 url::SchemeHostPort(url_), alternative_service_info_vector);
613
614 HostPortPair host_port_pair2(kServer2HostName, kDefaultServerPort);
615 url::SchemeHostPort server2("https", kServer2HostName, kDefaultServerPort);
bnc3472afd2016-11-17 15:27:21616 const AlternativeService alternative_service2(
617 kProtoQUIC, host_port_pair2.host(), host_port_pair2.port());
tbansal3b966952016-10-25 23:25:14618 AlternativeServiceInfoVector alternative_service_info_vector2;
619 alternative_service_info_vector2.push_back(
zhongyie537a002017-06-27 16:48:21620 AlternativeServiceInfo::CreateQuicAlternativeServiceInfo(
621 alternative_service2, expiration, {version_}));
tbansal9b1cdf32017-05-10 17:28:39622
623 http_server_properties_.SetAlternativeServices(
624 server2, alternative_service_info_vector2);
625 // Verify that the properties of both QUIC servers are stored in the
626 // HTTP properties map.
627 EXPECT_EQ(2U, http_server_properties_.alternative_service_map().size());
tbansal3b966952016-10-25 23:25:14628
629 http_server_properties_.SetMaxServerConfigsStoredInProperties(
Yixin Wang4a227aa22017-11-30 21:33:01630 kDefaultMaxQuicServerEntries);
tbansal3b966952016-10-25 23:25:14631
Ryan Hamilton8d9ee76e2018-05-29 23:52:52632 quic::QuicServerId quic_server_id(kDefaultServerHostName, 443,
633 PRIVACY_MODE_DISABLED);
rch431dd4452017-04-19 15:22:35634 std::unique_ptr<QuicServerInfo> quic_server_info =
Jeremy Roman0579ed62017-08-29 15:56:19635 std::make_unique<PropertiesBasedQuicServerInfo>(
rch431dd4452017-04-19 15:22:35636 quic_server_id, &http_server_properties_);
tbansal3b966952016-10-25 23:25:14637
638 // Update quic_server_info's server_config and persist it.
639 QuicServerInfo::State* state = quic_server_info->mutable_state();
640 // Minimum SCFG that passes config validation checks.
641 const char scfg[] = {// SCFG
642 0x53, 0x43, 0x46, 0x47,
643 // num entries
644 0x01, 0x00,
645 // padding
646 0x00, 0x00,
647 // EXPY
648 0x45, 0x58, 0x50, 0x59,
649 // EXPY end offset
650 0x08, 0x00, 0x00, 0x00,
651 // Value
652 '1', '2', '3', '4', '5', '6', '7', '8'};
653
654 // Create temporary strings becasue Persist() clears string data in |state|.
655 string server_config(reinterpret_cast<const char*>(&scfg), sizeof(scfg));
656 string source_address_token("test_source_address_token");
657 string cert_sct("test_cert_sct");
658 string chlo_hash("test_chlo_hash");
659 string signature("test_signature");
660 string test_cert("test_cert");
rch872e00e2016-12-02 02:48:18661 std::vector<string> certs;
tbansal3b966952016-10-25 23:25:14662 certs.push_back(test_cert);
663 state->server_config = server_config;
664 state->source_address_token = source_address_token;
665 state->cert_sct = cert_sct;
666 state->chlo_hash = chlo_hash;
667 state->server_config_sig = signature;
668 state->certs = certs;
669
670 quic_server_info->Persist();
671
Ryan Hamilton8d9ee76e2018-05-29 23:52:52672 quic::QuicServerId quic_server_id2(kServer2HostName, 443,
673 PRIVACY_MODE_DISABLED);
rch431dd4452017-04-19 15:22:35674 std::unique_ptr<QuicServerInfo> quic_server_info2 =
Jeremy Roman0579ed62017-08-29 15:56:19675 std::make_unique<PropertiesBasedQuicServerInfo>(
rch431dd4452017-04-19 15:22:35676 quic_server_id2, &http_server_properties_);
tbansal3b966952016-10-25 23:25:14677 // Update quic_server_info2's server_config and persist it.
678 QuicServerInfo::State* state2 = quic_server_info2->mutable_state();
679
680 // Minimum SCFG that passes config validation checks.
681 const char scfg2[] = {// SCFG
682 0x53, 0x43, 0x46, 0x47,
683 // num entries
684 0x01, 0x00,
685 // padding
686 0x00, 0x00,
687 // EXPY
688 0x45, 0x58, 0x50, 0x59,
689 // EXPY end offset
690 0x08, 0x00, 0x00, 0x00,
691 // Value
692 '8', '7', '3', '4', '5', '6', '2', '1'};
693
694 // Create temporary strings becasue Persist() clears string data in
695 // |state2|.
696 string server_config2(reinterpret_cast<const char*>(&scfg2), sizeof(scfg2));
697 string source_address_token2("test_source_address_token2");
698 string cert_sct2("test_cert_sct2");
699 string chlo_hash2("test_chlo_hash2");
700 string signature2("test_signature2");
701 string test_cert2("test_cert2");
rch872e00e2016-12-02 02:48:18702 std::vector<string> certs2;
tbansal3b966952016-10-25 23:25:14703 certs2.push_back(test_cert2);
704 state2->server_config = server_config2;
705 state2->source_address_token = source_address_token2;
706 state2->cert_sct = cert_sct2;
707 state2->chlo_hash = chlo_hash2;
708 state2->server_config_sig = signature2;
709 state2->certs = certs2;
710
711 quic_server_info2->Persist();
712
tbansal3b966952016-10-25 23:25:14713 // Verify the MRU order is maintained.
714 const QuicServerInfoMap& quic_server_info_map =
715 http_server_properties_.quic_server_info_map();
716 EXPECT_EQ(2u, quic_server_info_map.size());
jdoerrie22a91d8b92018-10-05 08:43:26717 auto quic_server_info_map_it = quic_server_info_map.begin();
tbansal3b966952016-10-25 23:25:14718 EXPECT_EQ(quic_server_info_map_it->first, quic_server_id2);
719 ++quic_server_info_map_it;
720 EXPECT_EQ(quic_server_info_map_it->first, quic_server_id);
721
Renjiea0cb4a2c2018-09-26 23:37:30722 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
723 "192.168.0.1", "");
rch431dd4452017-04-19 15:22:35724
725 // Create a session and verify that the cached state is loaded.
726 MockQuicData socket_data;
727 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi5f587cc2017-11-21 23:24:17728 socket_data.AddSocketDataToFactory(socket_factory_.get());
rch431dd4452017-04-19 15:22:35729
zhongyi98d6a9262017-05-19 02:47:45730 QuicStreamRequest request(factory_.get());
Yixin Wang247ea642017-11-15 01:15:50731 EXPECT_EQ(ERR_IO_PENDING,
Ryan Hamilton4f0b26e2018-06-27 23:52:32732 request.Request(
733 HostPortPair(quic_server_id.host(), quic_server_id.port()),
734 version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
735 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
Zhongyi Shia6b68d112018-09-24 07:49:03736 failed_on_default_network_callback_, callback_.callback()));
rch431dd4452017-04-19 15:22:35737 EXPECT_THAT(callback_.WaitForResult(), IsOk());
738
tbansal3b966952016-10-25 23:25:14739 EXPECT_FALSE(QuicStreamFactoryPeer::CryptoConfigCacheIsEmpty(
740 factory_.get(), quic_server_id));
Ryan Hamilton8d9ee76e2018-05-29 23:52:52741 quic::QuicCryptoClientConfig* crypto_config =
tbansal3b966952016-10-25 23:25:14742 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
Ryan Hamilton8d9ee76e2018-05-29 23:52:52743 quic::QuicCryptoClientConfig::CachedState* cached =
tbansal3b966952016-10-25 23:25:14744 crypto_config->LookupOrCreate(quic_server_id);
745 EXPECT_FALSE(cached->server_config().empty());
746 EXPECT_TRUE(cached->GetServerConfig());
747 EXPECT_EQ(server_config, cached->server_config());
748 EXPECT_EQ(source_address_token, cached->source_address_token());
749 EXPECT_EQ(cert_sct, cached->cert_sct());
750 EXPECT_EQ(chlo_hash, cached->chlo_hash());
751 EXPECT_EQ(signature, cached->signature());
752 ASSERT_EQ(1U, cached->certs().size());
753 EXPECT_EQ(test_cert, cached->certs()[0]);
754
rch431dd4452017-04-19 15:22:35755 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
756
757 // Create a session and verify that the cached state is loaded.
758 MockQuicData socket_data2;
759 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi5f587cc2017-11-21 23:24:17760 socket_data2.AddSocketDataToFactory(socket_factory_.get());
rch431dd4452017-04-19 15:22:35761
Renjiea0cb4a2c2018-09-26 23:37:30762 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
763 "192.168.0.2", "");
rch431dd4452017-04-19 15:22:35764
zhongyi98d6a9262017-05-19 02:47:45765 QuicStreamRequest request2(factory_.get());
rch431dd4452017-04-19 15:22:35766 EXPECT_EQ(ERR_IO_PENDING,
Ryan Hamilton4f0b26e2018-06-27 23:52:32767 request2.Request(
768 HostPortPair(quic_server_id2.host(), quic_server_id2.port()),
769 version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
770 /*cert_verify_flags=*/0, GURL("https://mail.example.org/"),
Zhongyi Shia6b68d112018-09-24 07:49:03771 net_log_, &net_error_details_,
772 failed_on_default_network_callback_, callback_.callback()));
rch431dd4452017-04-19 15:22:35773 EXPECT_THAT(callback_.WaitForResult(), IsOk());
774
tbansal3b966952016-10-25 23:25:14775 EXPECT_FALSE(QuicStreamFactoryPeer::CryptoConfigCacheIsEmpty(
776 factory_.get(), quic_server_id2));
Ryan Hamilton8d9ee76e2018-05-29 23:52:52777 quic::QuicCryptoClientConfig::CachedState* cached2 =
tbansal3b966952016-10-25 23:25:14778 crypto_config->LookupOrCreate(quic_server_id2);
779 EXPECT_FALSE(cached2->server_config().empty());
780 EXPECT_TRUE(cached2->GetServerConfig());
781 EXPECT_EQ(server_config2, cached2->server_config());
782 EXPECT_EQ(source_address_token2, cached2->source_address_token());
783 EXPECT_EQ(cert_sct2, cached2->cert_sct());
784 EXPECT_EQ(chlo_hash2, cached2->chlo_hash());
785 EXPECT_EQ(signature2, cached2->signature());
786 ASSERT_EQ(1U, cached->certs().size());
787 EXPECT_EQ(test_cert2, cached2->certs()[0]);
788 }
789
jri5b785512016-09-13 04:29:11790 void RunTestLoopUntilIdle() {
791 while (!runner_->GetPostedTasks().empty())
792 runner_->RunNextTask();
793 }
794
Fan Yang32c5a112018-12-10 20:06:33795 quic::QuicStreamId GetNthClientInitiatedBidirectionalStreamId(int n) {
796 return quic::test::GetNthClientInitiatedBidirectionalStreamId(version_, n);
ckrasicbf2f59c2017-05-04 23:54:36797 }
798
Fan Yang32c5a112018-12-10 20:06:33799 quic::QuicStreamId GetNthServerInitiatedUnidirectionalStreamId(int n) {
800 return quic::test::GetNthServerInitiatedUnidirectionalStreamId(version_, n);
ckrasicbf2f59c2017-05-04 23:54:36801 }
802
Zhongyi Shia6b68d112018-09-24 07:49:03803 void OnFailedOnDefaultNetwork(int rv) { failed_on_default_network_ = true; }
804
jri9f303712016-09-13 01:10:22805 // Helper methods for tests of connection migration on write error.
806 void TestMigrationOnWriteErrorNonMigratableStream(IoMode write_error_mode);
Zhongyi Shi0439ecc72018-07-11 04:41:26807 // Migratable stream triggers write error.
808 void TestMigrationOnWriteErrorMixedStreams(IoMode write_error_mode);
809 // Non-migratable stream triggers write error.
810 void TestMigrationOnWriteErrorMixedStreams2(IoMode write_error_mode);
jri9f303712016-09-13 01:10:22811 void TestMigrationOnWriteErrorMigrationDisabled(IoMode write_error_mode);
812 void TestMigrationOnWriteError(IoMode write_error_mode);
Zhongyi Shi0439ecc72018-07-11 04:41:26813 void TestMigrationOnWriteErrorWithMultipleRequests(IoMode write_error_mode);
jri9f303712016-09-13 01:10:22814 void TestMigrationOnWriteErrorNoNewNetwork(IoMode write_error_mode);
Zhongyi Shi7f1d9212018-06-22 23:24:36815 void TestMigrationOnMultipleWriteErrors(
816 IoMode write_error_mode_on_old_network,
817 IoMode write_error_mode_on_new_network);
Zhongyi Shib24001c02018-06-18 20:01:52818 void TestMigrationOnNetworkNotificationWithWriteErrorQueuedLater(
819 bool disconnected);
Zhongyi Shi1e2bc742018-06-16 02:06:07820 void TestMigrationOnWriteErrorWithNotificationQueuedLater(bool disconnected);
Zhongyi Shi9f316b262018-06-18 22:01:16821 void TestMigrationOnNetworkDisconnected(bool async_write_before);
Zhongyi Shia0644e32018-06-21 05:19:52822 void TestMigrationOnNetworkMadeDefault(IoMode write_mode);
Zhongyi Shi22fd5f52018-06-20 17:39:09823 void TestMigrationOnPathDegrading(bool async_write_before);
Zhongyi Shib3bc982c2018-07-10 19:59:24824 void TestMigrateSessionWithDrainingStream(
825 IoMode write_mode_for_queued_packet);
jri5b785512016-09-13 04:29:11826 void TestMigrationOnWriteErrorPauseBeforeConnected(IoMode write_error_mode);
Zhongyi Shi4ac9e1f2018-06-21 05:21:47827 void TestMigrationOnWriteErrorWithMultipleNotifications(
jri5b785512016-09-13 04:29:11828 IoMode write_error_mode,
Zhongyi Shi4ac9e1f2018-06-21 05:21:47829 bool disconnect_before_connect);
Zhongyi Shi634c1882018-08-16 04:05:59830 void TestNoAlternateNetworkBeforeHandshake(quic::QuicErrorCode error);
Zhongyi Shi8de43832018-08-15 23:40:00831 void TestNewConnectionOnAlternateNetworkBeforeHandshake(
832 quic::QuicErrorCode error);
jri9f303712016-09-13 01:10:22833
Jana Iyengarf6b13d82017-09-04 02:09:10834 QuicFlagSaver flags_; // Save/restore all QUIC flag values.
Renjiea0cb4a2c2018-09-26 23:37:30835 std::unique_ptr<MockHostResolverBase> host_resolver_;
Ryan Sleevib8449e02018-07-15 04:31:07836 std::unique_ptr<SSLConfigService> ssl_config_service_;
Zhongyi Shi5f587cc2017-11-21 23:24:17837 std::unique_ptr<MockClientSocketFactory> socket_factory_;
[email protected]e8ff26842013-03-22 21:02:05838 MockCryptoClientStreamFactory crypto_client_stream_factory_;
Ryan Hamilton8d9ee76e2018-05-29 23:52:52839 quic::test::MockRandom random_generator_;
840 quic::MockClock clock_;
rtenneti38f5cd52014-10-28 20:28:28841 scoped_refptr<TestTaskRunner> runner_;
Ryan Hamilton8d9ee76e2018-05-29 23:52:52842 const quic::QuicTransportVersion version_;
alyssar2adf3ac2016-05-03 17:12:58843 QuicTestPacketMaker client_maker_;
844 QuicTestPacketMaker server_maker_;
rtenneticcab42b2015-10-09 06:38:16845 HttpServerPropertiesImpl http_server_properties_;
danakjad1777e2016-04-16 00:56:42846 std::unique_ptr<CertVerifier> cert_verifier_;
[email protected]080b77932014-08-04 01:22:46847 TransportSecurityState transport_security_state_;
danakjad1777e2016-04-16 00:56:42848 std::unique_ptr<CTVerifier> cert_transparency_verifier_;
Ryan Sleevi8a9c9c12018-05-09 02:36:23849 DefaultCTPolicyEnforcer ct_policy_enforcer_;
danakjad1777e2016-04-16 00:56:42850 std::unique_ptr<ScopedMockNetworkChangeNotifier>
jri7e636642016-01-14 06:57:08851 scoped_mock_network_change_notifier_;
danakjad1777e2016-04-16 00:56:42852 std::unique_ptr<QuicStreamFactory> factory_;
[email protected]bf4ea2f2014-03-10 22:57:53853 HostPortPair host_port_pair_;
ckrasic3865ee0f2016-02-29 22:04:56854 GURL url_;
855 GURL url2_;
856 GURL url3_;
857 GURL url4_;
858
[email protected]9dd3ff0f2014-03-26 09:51:28859 PrivacyMode privacy_mode_;
tfarina42834112016-09-22 13:38:20860 NetLogWithSource net_log_;
[email protected]e13201d82012-12-12 05:00:32861 TestCompletionCallback callback_;
Zhongyi Shia6b68d112018-09-24 07:49:03862 const CompletionRepeatingCallback failed_on_default_network_callback_;
863 bool failed_on_default_network_;
Ryan Hamilton75f197262017-08-17 14:00:07864 NetErrorDetails net_error_details_;
jri7046038f2015-10-22 00:29:26865
866 // Variables to configure QuicStreamFactory.
Zhongyi Shi967d2f12019-02-08 20:58:53867 HttpNetworkSession::Params test_params_;
rch431dd4452017-04-19 15:22:35868 bool store_server_configs_in_properties_;
[email protected]e13201d82012-12-12 05:00:32869};
870
bnc359ed2a2016-04-29 20:43:45871class QuicStreamFactoryTest : public QuicStreamFactoryTestBase,
872 public ::testing::TestWithParam<TestParams> {
873 protected:
Yixin Wang079ad542018-01-11 04:06:05874 QuicStreamFactoryTest()
875 : QuicStreamFactoryTestBase(
876 GetParam().version,
877 GetParam().client_headers_include_h2_stream_dependency) {}
bnc359ed2a2016-04-29 20:43:45878};
879
Victor Costane635086f2019-01-27 05:20:30880INSTANTIATE_TEST_SUITE_P(VersionIncludeStreamDependencySequence,
881 QuicStreamFactoryTest,
882 ::testing::ValuesIn(GetTestParams()));
[email protected]1e960032013-12-20 19:00:20883
[email protected]1e960032013-12-20 19:00:20884TEST_P(QuicStreamFactoryTest, Create) {
jri7046038f2015-10-22 00:29:26885 Initialize();
rch6faa4d42016-01-05 20:48:43886 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
887 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26888
rcha00569732016-08-27 11:09:36889 MockQuicData socket_data;
890 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:43891 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:17892 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]e13201d82012-12-12 05:00:32893
zhongyi98d6a9262017-05-19 02:47:45894 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:33895 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:03896 request.Request(
897 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
898 SocketTag(),
899 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
900 failed_on_default_network_callback_, callback_.callback()));
[email protected]e13201d82012-12-12 05:00:32901
robpercival214763f2016-07-01 23:27:01902 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:24903 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]0edce6a2013-05-08 18:02:40904 EXPECT_TRUE(stream.get());
[email protected]e13201d82012-12-12 05:00:32905
Renjiea0cb4a2c2018-09-26 23:37:30906 EXPECT_EQ(DEFAULT_PRIORITY, host_resolver_->last_request_priority());
Yixin Wang247ea642017-11-15 01:15:50907
zhongyi98d6a9262017-05-19 02:47:45908 QuicStreamRequest request2(factory_.get());
zhongyia00ca012017-07-06 23:36:39909 EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
Paul Jensen8e3c5d32018-02-19 17:06:33910 DEFAULT_PRIORITY, SocketTag(),
911 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:03912 &net_error_details_,
913 failed_on_default_network_callback_,
914 callback_.callback()));
rch68a80eb2017-04-25 05:24:24915 // Will reset stream 3.
Yixin Wang7891a39d2017-11-08 20:59:24916 stream = CreateStream(&request2);
rch68a80eb2017-04-25 05:24:24917
918 EXPECT_TRUE(stream.get());
919
920 // TODO(rtenneti): We should probably have a tests that HTTP and HTTPS result
921 // in streams on different sessions.
zhongyi98d6a9262017-05-19 02:47:45922 QuicStreamRequest request3(factory_.get());
zhongyia00ca012017-07-06 23:36:39923 EXPECT_EQ(OK, request3.Request(host_port_pair_, version_, privacy_mode_,
Paul Jensen8e3c5d32018-02-19 17:06:33924 DEFAULT_PRIORITY, SocketTag(),
925 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:03926 &net_error_details_,
927 failed_on_default_network_callback_,
928 callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:24929 stream = CreateStream(&request3); // Will reset stream 5.
Ryan Hamiltona12722b2017-08-12 02:23:20930 stream.reset(); // Will reset stream 7.
[email protected]e13201d82012-12-12 05:00:32931
rch37de576c2015-05-17 20:28:17932 EXPECT_TRUE(socket_data.AllReadDataConsumed());
933 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:32934}
935
[email protected]8bd2b812014-03-26 04:01:17936TEST_P(QuicStreamFactoryTest, CreateZeroRtt) {
jri7046038f2015-10-22 00:29:26937 Initialize();
Ryan Hamiltona12722b2017-08-12 02:23:20938 factory_->set_require_confirmation(false);
rch6faa4d42016-01-05 20:48:43939 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
940 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:26941
rcha00569732016-08-27 11:09:36942 MockQuicData socket_data;
943 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi5f587cc2017-11-21 23:24:17944 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]8bd2b812014-03-26 04:01:17945
946 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:27947 MockCryptoClientStream::ZERO_RTT);
Renjiea0cb4a2c2018-09-26 23:37:30948 host_resolver_->set_synchronous_mode(true);
949 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
950 "192.168.0.1", "");
[email protected]8bd2b812014-03-26 04:01:17951
zhongyi98d6a9262017-05-19 02:47:45952 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:33953 EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
954 DEFAULT_PRIORITY, SocketTag(),
955 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:03956 &net_error_details_,
957 failed_on_default_network_callback_,
958 callback_.callback()));
[email protected]8bd2b812014-03-26 04:01:17959
Yixin Wang7891a39d2017-11-08 20:59:24960 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]8bd2b812014-03-26 04:01:17961 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:17962 EXPECT_TRUE(socket_data.AllReadDataConsumed());
963 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]8bd2b812014-03-26 04:01:17964}
965
rchd6163f32017-01-30 23:50:38966TEST_P(QuicStreamFactoryTest, DefaultInitialRtt) {
967 Initialize();
968 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
969 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
970
971 MockQuicData socket_data;
972 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:43973 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:17974 socket_data.AddSocketDataToFactory(socket_factory_.get());
rchd6163f32017-01-30 23:50:38975
zhongyi98d6a9262017-05-19 02:47:45976 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:33977 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:03978 request.Request(
979 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
980 SocketTag(),
981 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
982 failed_on_default_network_callback_, callback_.callback()));
rchd6163f32017-01-30 23:50:38983
984 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:24985 std::unique_ptr<HttpStream> stream = CreateStream(&request);
rchd6163f32017-01-30 23:50:38986 EXPECT_TRUE(stream.get());
987
988 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
Ryan Hamiltona12722b2017-08-12 02:23:20989 EXPECT_TRUE(session->require_confirmation());
rchd6163f32017-01-30 23:50:38990 EXPECT_EQ(100000u, session->connection()->GetStats().srtt_us);
991 ASSERT_FALSE(session->config()->HasInitialRoundTripTimeUsToSend());
992}
993
Helen Li0e823912017-09-25 19:48:30994TEST_P(QuicStreamFactoryTest, FactoryDestroyedWhenJobPending) {
995 Initialize();
996 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
997 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
998
999 MockQuicData socket_data;
1000 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431001 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171002 socket_data.AddSocketDataToFactory(socket_factory_.get());
Helen Li0e823912017-09-25 19:48:301003
1004 auto request = std::make_unique<QuicStreamRequest>(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331005 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031006 request->Request(
1007 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1008 SocketTag(),
1009 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1010 failed_on_default_network_callback_, callback_.callback()));
Helen Li0e823912017-09-25 19:48:301011 request.reset();
1012 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
1013 // Tearing down a QuicStreamFactory with a pending Job should not cause any
1014 // crash. crbug.com/768343.
1015 factory_.reset();
1016}
1017
Ryan Hamiltona12722b2017-08-12 02:23:201018TEST_P(QuicStreamFactoryTest, RequireConfirmation) {
1019 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:271020 MockCryptoClientStream::ZERO_RTT);
Renjiea0cb4a2c2018-09-26 23:37:301021 host_resolver_->set_synchronous_mode(true);
1022 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
1023 "192.168.0.1", "");
Ryan Hamiltona12722b2017-08-12 02:23:201024 Initialize();
1025 factory_->set_require_confirmation(true);
1026 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1027 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1028
1029 MockQuicData socket_data;
1030 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431031 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171032 socket_data.AddSocketDataToFactory(socket_factory_.get());
Ryan Hamiltona12722b2017-08-12 02:23:201033
1034 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331035 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031036 request.Request(
1037 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1038 SocketTag(),
1039 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1040 failed_on_default_network_callback_, callback_.callback()));
Ryan Hamiltona12722b2017-08-12 02:23:201041
Ryan Hamilton8e32a2b2017-08-28 20:06:521042 IPAddress last_address;
1043 EXPECT_FALSE(http_server_properties_.GetSupportsQuic(&last_address));
1044
Ryan Hamiltona12722b2017-08-12 02:23:201045 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
Ryan Hamilton8d9ee76e2018-05-29 23:52:521046 quic::QuicSession::HANDSHAKE_CONFIRMED);
Ryan Hamiltona12722b2017-08-12 02:23:201047
Ryan Hamilton8e32a2b2017-08-28 20:06:521048 EXPECT_TRUE(http_server_properties_.GetSupportsQuic(&last_address));
1049
Ryan Hamiltona12722b2017-08-12 02:23:201050 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241051 std::unique_ptr<HttpStream> stream = CreateStream(&request);
Ryan Hamiltona12722b2017-08-12 02:23:201052 EXPECT_TRUE(stream.get());
1053
1054 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
1055 EXPECT_TRUE(session->require_confirmation());
1056}
1057
1058TEST_P(QuicStreamFactoryTest, DontRequireConfirmationFromSameIP) {
1059 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:271060 MockCryptoClientStream::ZERO_RTT);
Renjiea0cb4a2c2018-09-26 23:37:301061 host_resolver_->set_synchronous_mode(true);
1062 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
1063 "192.168.0.1", "");
Ryan Hamiltona12722b2017-08-12 02:23:201064 Initialize();
1065 factory_->set_require_confirmation(true);
1066 http_server_properties_.SetSupportsQuic(IPAddress(192, 0, 2, 33));
1067
1068 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1069 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1070
1071 MockQuicData socket_data;
1072 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431073 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171074 socket_data.AddSocketDataToFactory(socket_factory_.get());
Ryan Hamiltona12722b2017-08-12 02:23:201075
1076 QuicStreamRequest request(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031077 EXPECT_THAT(request.Request(
1078 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1079 SocketTag(),
1080 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1081 failed_on_default_network_callback_, callback_.callback()),
Paul Jensen8e3c5d32018-02-19 17:06:331082 IsOk());
Ryan Hamiltona12722b2017-08-12 02:23:201083
Ryan Hamilton8e32a2b2017-08-28 20:06:521084 IPAddress last_address;
1085 EXPECT_FALSE(http_server_properties_.GetSupportsQuic(&last_address));
1086
Yixin Wang7891a39d2017-11-08 20:59:241087 std::unique_ptr<HttpStream> stream = CreateStream(&request);
Ryan Hamiltona12722b2017-08-12 02:23:201088 EXPECT_TRUE(stream.get());
1089
1090 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
1091 EXPECT_FALSE(session->require_confirmation());
Ryan Hamilton8e32a2b2017-08-28 20:06:521092
1093 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
Ryan Hamilton8d9ee76e2018-05-29 23:52:521094 quic::QuicSession::HANDSHAKE_CONFIRMED);
Ryan Hamilton8e32a2b2017-08-28 20:06:521095
1096 EXPECT_TRUE(http_server_properties_.GetSupportsQuic(&last_address));
Ryan Hamiltona12722b2017-08-12 02:23:201097}
1098
rchd6163f32017-01-30 23:50:381099TEST_P(QuicStreamFactoryTest, CachedInitialRtt) {
1100 ServerNetworkStats stats;
1101 stats.srtt = base::TimeDelta::FromMilliseconds(10);
1102 http_server_properties_.SetServerNetworkStats(url::SchemeHostPort(url_),
1103 stats);
Zhongyi Shi967d2f12019-02-08 20:58:531104 test_params_.quic_estimate_initial_rtt = true;
rchd6163f32017-01-30 23:50:381105
1106 Initialize();
1107 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1108 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1109
1110 MockQuicData socket_data;
1111 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431112 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171113 socket_data.AddSocketDataToFactory(socket_factory_.get());
rchd6163f32017-01-30 23:50:381114
zhongyi98d6a9262017-05-19 02:47:451115 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331116 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031117 request.Request(
1118 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1119 SocketTag(),
1120 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1121 failed_on_default_network_callback_, callback_.callback()));
rchd6163f32017-01-30 23:50:381122
1123 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241124 std::unique_ptr<HttpStream> stream = CreateStream(&request);
rchd6163f32017-01-30 23:50:381125 EXPECT_TRUE(stream.get());
1126
1127 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
1128 EXPECT_EQ(10000u, session->connection()->GetStats().srtt_us);
1129 ASSERT_TRUE(session->config()->HasInitialRoundTripTimeUsToSend());
1130 EXPECT_EQ(10000u, session->config()->GetInitialRoundTripTimeUsToSend());
1131}
1132
1133TEST_P(QuicStreamFactoryTest, 2gInitialRtt) {
1134 ScopedMockNetworkChangeNotifier notifier;
1135 notifier.mock_network_change_notifier()->SetConnectionType(
1136 NetworkChangeNotifier::CONNECTION_2G);
Zhongyi Shi967d2f12019-02-08 20:58:531137 test_params_.quic_estimate_initial_rtt = true;
rchd6163f32017-01-30 23:50:381138
1139 Initialize();
1140 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1141 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1142
1143 MockQuicData socket_data;
1144 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431145 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171146 socket_data.AddSocketDataToFactory(socket_factory_.get());
rchd6163f32017-01-30 23:50:381147
zhongyi98d6a9262017-05-19 02:47:451148 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331149 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031150 request.Request(
1151 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1152 SocketTag(),
1153 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1154 failed_on_default_network_callback_, callback_.callback()));
rchd6163f32017-01-30 23:50:381155
1156 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241157 std::unique_ptr<HttpStream> stream = CreateStream(&request);
rchd6163f32017-01-30 23:50:381158 EXPECT_TRUE(stream.get());
1159
1160 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
1161 EXPECT_EQ(1200000u, session->connection()->GetStats().srtt_us);
1162 ASSERT_TRUE(session->config()->HasInitialRoundTripTimeUsToSend());
1163 EXPECT_EQ(1200000u, session->config()->GetInitialRoundTripTimeUsToSend());
1164}
1165
1166TEST_P(QuicStreamFactoryTest, 3gInitialRtt) {
1167 ScopedMockNetworkChangeNotifier notifier;
1168 notifier.mock_network_change_notifier()->SetConnectionType(
1169 NetworkChangeNotifier::CONNECTION_3G);
Zhongyi Shi967d2f12019-02-08 20:58:531170 test_params_.quic_estimate_initial_rtt = true;
rchd6163f32017-01-30 23:50:381171
1172 Initialize();
1173 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1174 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1175
1176 MockQuicData socket_data;
1177 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431178 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171179 socket_data.AddSocketDataToFactory(socket_factory_.get());
rchd6163f32017-01-30 23:50:381180
zhongyi98d6a9262017-05-19 02:47:451181 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331182 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031183 request.Request(
1184 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1185 SocketTag(),
1186 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1187 failed_on_default_network_callback_, callback_.callback()));
rchd6163f32017-01-30 23:50:381188
1189 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241190 std::unique_ptr<HttpStream> stream = CreateStream(&request);
rchd6163f32017-01-30 23:50:381191 EXPECT_TRUE(stream.get());
1192
1193 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
1194 EXPECT_EQ(400000u, session->connection()->GetStats().srtt_us);
1195 ASSERT_TRUE(session->config()->HasInitialRoundTripTimeUsToSend());
1196 EXPECT_EQ(400000u, session->config()->GetInitialRoundTripTimeUsToSend());
1197}
1198
rch68955482015-09-24 00:14:391199TEST_P(QuicStreamFactoryTest, GoAway) {
jri7046038f2015-10-22 00:29:261200 Initialize();
rch6faa4d42016-01-05 20:48:431201 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1202 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:261203
rcha00569732016-08-27 11:09:361204 MockQuicData socket_data;
1205 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431206 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171207 socket_data.AddSocketDataToFactory(socket_factory_.get());
rch68955482015-09-24 00:14:391208
zhongyi98d6a9262017-05-19 02:47:451209 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331210 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031211 request.Request(
1212 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1213 SocketTag(),
1214 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1215 failed_on_default_network_callback_, callback_.callback()));
rch68955482015-09-24 00:14:391216
robpercival214763f2016-07-01 23:27:011217 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241218 std::unique_ptr<HttpStream> stream = CreateStream(&request);
rch68955482015-09-24 00:14:391219 EXPECT_TRUE(stream.get());
1220
bnc912a04b2016-04-20 14:19:501221 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
rch68955482015-09-24 00:14:391222
Ryan Hamilton8d9ee76e2018-05-29 23:52:521223 session->OnGoAway(quic::QuicGoAwayFrame());
rch68955482015-09-24 00:14:391224
bnc912a04b2016-04-20 14:19:501225 EXPECT_FALSE(HasActiveSession(host_port_pair_));
rch68955482015-09-24 00:14:391226
1227 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1228 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1229}
1230
zhongyi6b5a3892016-03-12 04:46:201231TEST_P(QuicStreamFactoryTest, GoAwayForConnectionMigrationWithPortOnly) {
1232 Initialize();
1233 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1234 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1235
rcha00569732016-08-27 11:09:361236 MockQuicData socket_data;
1237 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431238 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171239 socket_data.AddSocketDataToFactory(socket_factory_.get());
zhongyi6b5a3892016-03-12 04:46:201240
zhongyi98d6a9262017-05-19 02:47:451241 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331242 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031243 request.Request(
1244 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1245 SocketTag(),
1246 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1247 failed_on_default_network_callback_, callback_.callback()));
zhongyi6b5a3892016-03-12 04:46:201248
robpercival214763f2016-07-01 23:27:011249 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241250 std::unique_ptr<HttpStream> stream = CreateStream(&request);
zhongyi6b5a3892016-03-12 04:46:201251 EXPECT_TRUE(stream.get());
1252
bnc912a04b2016-04-20 14:19:501253 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
zhongyi6b5a3892016-03-12 04:46:201254
Ryan Hamilton8d9ee76e2018-05-29 23:52:521255 session->OnGoAway(quic::QuicGoAwayFrame(
1256 quic::kInvalidControlFrameId, quic::QUIC_ERROR_MIGRATING_PORT, 0,
1257 "peer connection migration due to port change only"));
zhongyi6b5a3892016-03-12 04:46:201258 NetErrorDetails details;
1259 EXPECT_FALSE(details.quic_port_migration_detected);
1260 session->PopulateNetErrorDetails(&details);
1261 EXPECT_TRUE(details.quic_port_migration_detected);
1262 details.quic_port_migration_detected = false;
1263 stream->PopulateNetErrorDetails(&details);
1264 EXPECT_TRUE(details.quic_port_migration_detected);
1265
bnc912a04b2016-04-20 14:19:501266 EXPECT_FALSE(HasActiveSession(host_port_pair_));
zhongyi6b5a3892016-03-12 04:46:201267
1268 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1269 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1270}
1271
[email protected]5db452202014-08-19 05:22:151272TEST_P(QuicStreamFactoryTest, Pooling) {
jri7046038f2015-10-22 00:29:261273 Initialize();
rch6faa4d42016-01-05 20:48:431274 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1275 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:261276
rcha00569732016-08-27 11:09:361277 MockQuicData socket_data;
1278 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431279 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171280 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]eed749f92013-12-23 18:57:381281
rch6faa4d42016-01-05 20:48:431282 HostPortPair server2(kServer2HostName, kDefaultServerPort);
Renjiea0cb4a2c2018-09-26 23:37:301283 host_resolver_->set_synchronous_mode(true);
1284 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
1285 "192.168.0.1", "");
1286 host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:381287
zhongyi98d6a9262017-05-19 02:47:451288 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331289 EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
1290 DEFAULT_PRIORITY, SocketTag(),
1291 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:031292 &net_error_details_,
1293 failed_on_default_network_callback_,
1294 callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241295 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]eed749f92013-12-23 18:57:381296 EXPECT_TRUE(stream.get());
1297
1298 TestCompletionCallback callback;
zhongyi98d6a9262017-05-19 02:47:451299 QuicStreamRequest request2(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031300 EXPECT_EQ(OK,
1301 request2.Request(
1302 server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1303 /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
1304 failed_on_default_network_callback_, callback.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241305 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
[email protected]eed749f92013-12-23 18:57:381306 EXPECT_TRUE(stream2.get());
1307
bnc912a04b2016-04-20 14:19:501308 EXPECT_EQ(GetActiveSession(host_port_pair_), GetActiveSession(server2));
[email protected]eed749f92013-12-23 18:57:381309
rch37de576c2015-05-17 20:28:171310 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1311 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:381312}
1313
jri94ddc3142016-08-26 01:32:431314TEST_P(QuicStreamFactoryTest, PoolingWithServerMigration) {
1315 // Set up session to migrate.
Renjiea0cb4a2c2018-09-26 23:37:301316 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
1317 "192.168.0.1", "");
jri94ddc3142016-08-26 01:32:431318 IPEndPoint alt_address = IPEndPoint(IPAddress(1, 2, 3, 4), 443);
Ryan Hamilton8d9ee76e2018-05-29 23:52:521319 quic::QuicConfig config;
fayang91ca2012016-11-22 07:42:461320 config.SetAlternateServerAddressToSend(
Ryan Hamilton8d9ee76e2018-05-29 23:52:521321 quic::QuicSocketAddress(quic::QuicSocketAddressImpl(alt_address)));
jri94ddc3142016-08-26 01:32:431322
1323 VerifyServerMigration(config, alt_address);
1324
1325 // Close server-migrated session.
1326 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
Renjieba55fae2018-09-20 03:05:161327 session->CloseSessionOnError(0u, quic::QUIC_NO_ERROR,
1328 quic::ConnectionCloseBehavior::SILENT_CLOSE);
jri94ddc3142016-08-26 01:32:431329
1330 // Set up server IP, socket, proof, and config for new session.
1331 HostPortPair server2(kServer2HostName, kDefaultServerPort);
Renjiea0cb4a2c2018-09-26 23:37:301332 host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
jri94ddc3142016-08-26 01:32:431333
1334 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
Ryan Hamilton8d9ee76e2018-05-29 23:52:521335 std::unique_ptr<quic::QuicEncryptedPacket> settings_packet(
rch5cb522462017-04-25 20:18:361336 client_maker_.MakeInitialSettingsPacket(1, nullptr));
bnceb9aa7112017-01-05 01:03:461337 MockWrite writes[] = {MockWrite(SYNCHRONOUS, settings_packet->data(),
1338 settings_packet->length(), 1)};
fayang3bcb8b502016-12-07 21:44:371339
Ryan Sleevib8d7ea02018-05-07 20:01:011340 SequencedSocketData socket_data(reads, writes);
Zhongyi Shi5f587cc2017-11-21 23:24:171341 socket_factory_->AddSocketDataProvider(&socket_data);
jri94ddc3142016-08-26 01:32:431342
1343 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1344 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
Ryan Hamilton8d9ee76e2018-05-29 23:52:521345 quic::QuicConfig config2;
jri94ddc3142016-08-26 01:32:431346 crypto_client_stream_factory_.SetConfig(config2);
1347
1348 // Create new request to cause new session creation.
1349 TestCompletionCallback callback;
zhongyi98d6a9262017-05-19 02:47:451350 QuicStreamRequest request2(factory_.get());
jri94ddc3142016-08-26 01:32:431351 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031352 request2.Request(
1353 server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1354 /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
1355 failed_on_default_network_callback_, callback.callback()));
jri94ddc3142016-08-26 01:32:431356 EXPECT_EQ(OK, callback.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:241357 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
jri94ddc3142016-08-26 01:32:431358 EXPECT_TRUE(stream2.get());
1359
1360 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1361 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1362 // EXPECT_EQ(GetActiveSession(host_port_pair_), GetActiveSession(server2));
1363}
1364
[email protected]eed749f92013-12-23 18:57:381365TEST_P(QuicStreamFactoryTest, NoPoolingAfterGoAway) {
jri7046038f2015-10-22 00:29:261366 Initialize();
rch6faa4d42016-01-05 20:48:431367 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1368 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1369 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:261370
rcha00569732016-08-27 11:09:361371 MockQuicData socket_data1;
1372 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431373 socket_data1.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171374 socket_data1.AddSocketDataToFactory(socket_factory_.get());
rcha00569732016-08-27 11:09:361375 MockQuicData socket_data2;
1376 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431377 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171378 socket_data2.AddSocketDataToFactory(socket_factory_.get());
[email protected]eed749f92013-12-23 18:57:381379
rch6faa4d42016-01-05 20:48:431380 HostPortPair server2(kServer2HostName, kDefaultServerPort);
Renjiea0cb4a2c2018-09-26 23:37:301381 host_resolver_->set_synchronous_mode(true);
1382 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
1383 "192.168.0.1", "");
1384 host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:381385
zhongyi98d6a9262017-05-19 02:47:451386 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331387 EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
1388 DEFAULT_PRIORITY, SocketTag(),
1389 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:031390 &net_error_details_,
1391 failed_on_default_network_callback_,
1392 callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241393 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]eed749f92013-12-23 18:57:381394 EXPECT_TRUE(stream.get());
1395
1396 TestCompletionCallback callback;
zhongyi98d6a9262017-05-19 02:47:451397 QuicStreamRequest request2(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031398 EXPECT_EQ(OK,
1399 request2.Request(
1400 server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1401 /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
1402 failed_on_default_network_callback_, callback.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241403 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
[email protected]eed749f92013-12-23 18:57:381404 EXPECT_TRUE(stream2.get());
1405
bnc912a04b2016-04-20 14:19:501406 factory_->OnSessionGoingAway(GetActiveSession(host_port_pair_));
1407 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1408 EXPECT_FALSE(HasActiveSession(server2));
[email protected]eed749f92013-12-23 18:57:381409
1410 TestCompletionCallback callback3;
zhongyi98d6a9262017-05-19 02:47:451411 QuicStreamRequest request3(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031412 EXPECT_EQ(OK,
1413 request3.Request(
1414 server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1415 /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
1416 failed_on_default_network_callback_, callback3.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241417 std::unique_ptr<HttpStream> stream3 = CreateStream(&request3);
[email protected]eed749f92013-12-23 18:57:381418 EXPECT_TRUE(stream3.get());
1419
bnc912a04b2016-04-20 14:19:501420 EXPECT_TRUE(HasActiveSession(server2));
[email protected]eed749f92013-12-23 18:57:381421
rch37de576c2015-05-17 20:28:171422 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
1423 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
1424 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1425 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:381426}
1427
[email protected]5db452202014-08-19 05:22:151428TEST_P(QuicStreamFactoryTest, HttpsPooling) {
jri7046038f2015-10-22 00:29:261429 Initialize();
rch6faa4d42016-01-05 20:48:431430
rcha00569732016-08-27 11:09:361431 MockQuicData socket_data;
1432 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431433 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171434 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]eed749f92013-12-23 18:57:381435
rch6faa4d42016-01-05 20:48:431436 HostPortPair server1(kDefaultServerHostName, 443);
1437 HostPortPair server2(kServer2HostName, 443);
[email protected]eed749f92013-12-23 18:57:381438
bncf8bf0722015-05-19 20:04:131439 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
bnc20daf9a2015-05-15 17:11:011440 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]eed749f92013-12-23 18:57:381441
Renjiea0cb4a2c2018-09-26 23:37:301442 host_resolver_->set_synchronous_mode(true);
1443 host_resolver_->rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
1444 host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]eed749f92013-12-23 18:57:381445
zhongyi98d6a9262017-05-19 02:47:451446 QuicStreamRequest request(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031447 EXPECT_EQ(OK,
1448 request.Request(
1449 server1, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1450 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1451 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241452 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]eed749f92013-12-23 18:57:381453 EXPECT_TRUE(stream.get());
1454
1455 TestCompletionCallback callback;
zhongyi98d6a9262017-05-19 02:47:451456 QuicStreamRequest request2(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031457 EXPECT_EQ(OK,
1458 request2.Request(
1459 server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1460 /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
1461 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241462 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
[email protected]eed749f92013-12-23 18:57:381463 EXPECT_TRUE(stream2.get());
1464
bnc912a04b2016-04-20 14:19:501465 EXPECT_EQ(GetActiveSession(server1), GetActiveSession(server2));
[email protected]eed749f92013-12-23 18:57:381466
rch37de576c2015-05-17 20:28:171467 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1468 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]eed749f92013-12-23 18:57:381469}
1470
[email protected]5db452202014-08-19 05:22:151471TEST_P(QuicStreamFactoryTest, HttpsPoolingWithMatchingPins) {
jri7046038f2015-10-22 00:29:261472 Initialize();
rcha00569732016-08-27 11:09:361473 MockQuicData socket_data;
1474 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431475 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171476 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]5db452202014-08-19 05:22:151477
rch6faa4d42016-01-05 20:48:431478 HostPortPair server1(kDefaultServerHostName, 443);
1479 HostPortPair server2(kServer2HostName, 443);
Matt Mueller230996f12018-10-22 19:39:441480 transport_security_state_.EnableStaticPinsForTesting();
1481 ScopedTransportSecurityStateSource scoped_security_state_source;
[email protected]5db452202014-08-19 05:22:151482
Matt Mueller230996f12018-10-22 19:39:441483 HashValue primary_pin(HASH_VALUE_SHA256);
1484 EXPECT_TRUE(primary_pin.FromString(
1485 "sha256/Nn8jk5By4Vkq6BeOVZ7R7AC6XUUBZsWmUbJR1f1Y5FY="));
bncf8bf0722015-05-19 20:04:131486 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
Matt Mueller230996f12018-10-22 19:39:441487 verify_details.cert_verify_result.public_key_hashes.push_back(primary_pin);
bnc20daf9a2015-05-15 17:11:011488 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
[email protected]5db452202014-08-19 05:22:151489
Renjiea0cb4a2c2018-09-26 23:37:301490 host_resolver_->set_synchronous_mode(true);
1491 host_resolver_->rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
1492 host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]5db452202014-08-19 05:22:151493
zhongyi98d6a9262017-05-19 02:47:451494 QuicStreamRequest request(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031495 EXPECT_EQ(OK,
1496 request.Request(
1497 server1, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1498 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1499 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241500 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]5db452202014-08-19 05:22:151501 EXPECT_TRUE(stream.get());
1502
1503 TestCompletionCallback callback;
zhongyi98d6a9262017-05-19 02:47:451504 QuicStreamRequest request2(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031505 EXPECT_EQ(OK,
1506 request2.Request(
1507 server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1508 /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
1509 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241510 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
[email protected]5db452202014-08-19 05:22:151511 EXPECT_TRUE(stream2.get());
1512
bnc912a04b2016-04-20 14:19:501513 EXPECT_EQ(GetActiveSession(server1), GetActiveSession(server2));
[email protected]5db452202014-08-19 05:22:151514
rch37de576c2015-05-17 20:28:171515 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1516 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]5db452202014-08-19 05:22:151517}
1518
1519TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithDifferentPins) {
jri7046038f2015-10-22 00:29:261520 Initialize();
rcha00569732016-08-27 11:09:361521
1522 MockQuicData socket_data1;
1523 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431524 socket_data1.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171525 socket_data1.AddSocketDataToFactory(socket_factory_.get());
rcha00569732016-08-27 11:09:361526 MockQuicData socket_data2;
1527 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431528 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171529 socket_data2.AddSocketDataToFactory(socket_factory_.get());
[email protected]5db452202014-08-19 05:22:151530
rch6faa4d42016-01-05 20:48:431531 HostPortPair server1(kDefaultServerHostName, 443);
1532 HostPortPair server2(kServer2HostName, 443);
Matt Mueller230996f12018-10-22 19:39:441533 transport_security_state_.EnableStaticPinsForTesting();
1534 ScopedTransportSecurityStateSource scoped_security_state_source;
[email protected]5db452202014-08-19 05:22:151535
bncf8bf0722015-05-19 20:04:131536 ProofVerifyDetailsChromium verify_details1 = DefaultProofVerifyDetails();
Matt Mueller230996f12018-10-22 19:39:441537 uint8_t bad_pin = 3;
bnc20daf9a2015-05-15 17:11:011538 verify_details1.cert_verify_result.public_key_hashes.push_back(
1539 test::GetTestHashValue(bad_pin));
1540 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details1);
1541
Matt Mueller230996f12018-10-22 19:39:441542 HashValue primary_pin(HASH_VALUE_SHA256);
1543 EXPECT_TRUE(primary_pin.FromString(
1544 "sha256/Nn8jk5By4Vkq6BeOVZ7R7AC6XUUBZsWmUbJR1f1Y5FY="));
bncf8bf0722015-05-19 20:04:131545 ProofVerifyDetailsChromium verify_details2 = DefaultProofVerifyDetails();
Matt Mueller230996f12018-10-22 19:39:441546 verify_details2.cert_verify_result.public_key_hashes.push_back(primary_pin);
bnc20daf9a2015-05-15 17:11:011547 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
[email protected]5db452202014-08-19 05:22:151548
Renjiea0cb4a2c2018-09-26 23:37:301549 host_resolver_->set_synchronous_mode(true);
1550 host_resolver_->rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
1551 host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
[email protected]5db452202014-08-19 05:22:151552
zhongyi98d6a9262017-05-19 02:47:451553 QuicStreamRequest request(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031554 EXPECT_EQ(OK,
1555 request.Request(
1556 server1, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1557 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1558 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241559 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]5db452202014-08-19 05:22:151560 EXPECT_TRUE(stream.get());
1561
1562 TestCompletionCallback callback;
zhongyi98d6a9262017-05-19 02:47:451563 QuicStreamRequest request2(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031564 EXPECT_EQ(OK,
1565 request2.Request(
1566 server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1567 /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
1568 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241569 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
[email protected]5db452202014-08-19 05:22:151570 EXPECT_TRUE(stream2.get());
1571
bnc912a04b2016-04-20 14:19:501572 EXPECT_NE(GetActiveSession(server1), GetActiveSession(server2));
[email protected]5db452202014-08-19 05:22:151573
rch37de576c2015-05-17 20:28:171574 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
1575 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
1576 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1577 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]5db452202014-08-19 05:22:151578}
1579
[email protected]1e960032013-12-20 19:00:201580TEST_P(QuicStreamFactoryTest, Goaway) {
jri7046038f2015-10-22 00:29:261581 Initialize();
rch6faa4d42016-01-05 20:48:431582 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1583 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1584 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1585
rcha00569732016-08-27 11:09:361586 MockQuicData socket_data;
1587 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431588 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171589 socket_data.AddSocketDataToFactory(socket_factory_.get());
rcha00569732016-08-27 11:09:361590 MockQuicData socket_data2;
1591 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431592 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171593 socket_data2.AddSocketDataToFactory(socket_factory_.get());
[email protected]4d283b32013-10-17 12:57:271594
zhongyi98d6a9262017-05-19 02:47:451595 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331596 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031597 request.Request(
1598 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1599 SocketTag(),
1600 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1601 failed_on_default_network_callback_, callback_.callback()));
[email protected]4d283b32013-10-17 12:57:271602
robpercival214763f2016-07-01 23:27:011603 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241604 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]4d283b32013-10-17 12:57:271605 EXPECT_TRUE(stream.get());
1606
1607 // Mark the session as going away. Ensure that while it is still alive
1608 // that it is no longer active.
bnc912a04b2016-04-20 14:19:501609 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri7046038f2015-10-22 00:29:261610 factory_->OnSessionGoingAway(session);
1611 EXPECT_EQ(true,
1612 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
bnc912a04b2016-04-20 14:19:501613 EXPECT_FALSE(HasActiveSession(host_port_pair_));
[email protected]4d283b32013-10-17 12:57:271614
1615 // Create a new request for the same destination and verify that a
1616 // new session is created.
zhongyi98d6a9262017-05-19 02:47:451617 QuicStreamRequest request2(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331618 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031619 request2.Request(
1620 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1621 SocketTag(),
1622 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1623 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:011624 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241625 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
[email protected]4d283b32013-10-17 12:57:271626 EXPECT_TRUE(stream2.get());
1627
bnc912a04b2016-04-20 14:19:501628 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1629 EXPECT_NE(session, GetActiveSession(host_port_pair_));
jri7046038f2015-10-22 00:29:261630 EXPECT_EQ(true,
1631 QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
[email protected]4d283b32013-10-17 12:57:271632
1633 stream2.reset();
1634 stream.reset();
1635
rch37de576c2015-05-17 20:28:171636 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1637 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1638 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1639 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]4d283b32013-10-17 12:57:271640}
1641
[email protected]1e960032013-12-20 19:00:201642TEST_P(QuicStreamFactoryTest, MaxOpenStream) {
jri7046038f2015-10-22 00:29:261643 Initialize();
rch6faa4d42016-01-05 20:48:431644 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1645 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1646
Fan Yang32c5a112018-12-10 20:06:331647 quic::QuicStreamId stream_id = GetNthClientInitiatedBidirectionalStreamId(0);
rcha00569732016-08-27 11:09:361648 MockQuicData socket_data;
Zhongyi Shi32f2fd02018-04-16 18:23:431649 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Frank Kastenholz878763bf2018-11-28 19:14:481650 if (version_ == quic::QUIC_VERSION_99) {
Fan Yang32c5a112018-12-10 20:06:331651 socket_data.AddWrite(
1652 SYNCHRONOUS,
1653 client_maker_.MakeStreamIdBlockedPacket(
1654 2, true, GetNthClientInitiatedBidirectionalStreamId(49)));
Frank Kastenholzc9b9bea2018-12-03 20:13:471655 socket_data.AddWrite(
1656 SYNCHRONOUS, client_maker_.MakeRstPacket(3, true, stream_id,
1657 quic::QUIC_STREAM_CANCELLED));
1658 socket_data.AddRead(
1659 ASYNC, server_maker_.MakeRstPacket(1, false, stream_id,
1660 quic::QUIC_STREAM_CANCELLED));
Fan Yang32c5a112018-12-10 20:06:331661 socket_data.AddRead(
1662 ASYNC, server_maker_.MakeMaxStreamIdPacket(
1663 4, true, GetNthClientInitiatedBidirectionalStreamId(50)));
Frank Kastenholzc9b9bea2018-12-03 20:13:471664 } else {
1665 socket_data.AddWrite(
1666 SYNCHRONOUS, client_maker_.MakeRstPacket(2, true, stream_id,
1667 quic::QUIC_STREAM_CANCELLED));
1668 socket_data.AddRead(
1669 ASYNC, server_maker_.MakeRstPacket(1, false, stream_id,
1670 quic::QUIC_STREAM_CANCELLED));
Frank Kastenholz878763bf2018-11-28 19:14:481671 }
rcha00569732016-08-27 11:09:361672 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi5f587cc2017-11-21 23:24:171673 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]0b2294d32013-08-02 00:46:361674
1675 HttpRequestInfo request_info;
Ramin Halavati683bcaa92018-02-14 08:42:391676 request_info.traffic_annotation =
1677 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
1678
xunjieli1d2b4272017-04-25 22:37:171679 std::vector<std::unique_ptr<HttpStream>> streams;
Ryan Hamilton9835e662018-08-02 05:36:271680 // The MockCryptoClientStream sets max_open_streams to be
Ryan Hamilton8d9ee76e2018-05-29 23:52:521681 // quic::kDefaultMaxStreamsPerConnection / 2.
1682 for (size_t i = 0; i < quic::kDefaultMaxStreamsPerConnection / 2; i++) {
zhongyi98d6a9262017-05-19 02:47:451683 QuicStreamRequest request(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:031684 int rv = request.Request(
1685 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
1686 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1687 failed_on_default_network_callback_, callback_.callback());
[email protected]0b2294d32013-08-02 00:46:361688 if (i == 0) {
robpercival214763f2016-07-01 23:27:011689 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1690 EXPECT_THAT(callback_.WaitForResult(), IsOk());
[email protected]0b2294d32013-08-02 00:46:361691 } else {
robpercival214763f2016-07-01 23:27:011692 EXPECT_THAT(rv, IsOk());
[email protected]0b2294d32013-08-02 00:46:361693 }
Yixin Wang7891a39d2017-11-08 20:59:241694 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]0b2294d32013-08-02 00:46:361695 EXPECT_TRUE(stream);
Steven Valdezb4ff0412018-01-18 22:39:271696 EXPECT_EQ(OK,
1697 stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:391698 net_log_, CompletionOnceCallback()));
avib3635452016-10-21 18:33:531699 streams.push_back(std::move(stream));
[email protected]0b2294d32013-08-02 00:46:361700 }
1701
zhongyi98d6a9262017-05-19 02:47:451702 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331703 EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
1704 DEFAULT_PRIORITY, SocketTag(),
1705 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:031706 &net_error_details_,
1707 failed_on_default_network_callback_,
1708 CompletionOnceCallback()));
Yixin Wang7891a39d2017-11-08 20:59:241709 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]0b2294d32013-08-02 00:46:361710 EXPECT_TRUE(stream);
rjshaded5ced072015-12-18 19:26:021711 EXPECT_EQ(ERR_IO_PENDING,
Steven Valdezb4ff0412018-01-18 22:39:271712 stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
1713 net_log_, callback_.callback()));
[email protected]0b2294d32013-08-02 00:46:361714
1715 // Close the first stream.
1716 streams.front()->Close(false);
ckrasicea295fe2015-10-31 05:03:271717 // Trigger exchange of RSTs that in turn allow progress for the last
1718 // stream.
Frank Kastenholz878763bf2018-11-28 19:14:481719 base::RunLoop().RunUntilIdle();
robpercival214763f2016-07-01 23:27:011720 EXPECT_THAT(callback_.WaitForResult(), IsOk());
[email protected]0b2294d32013-08-02 00:46:361721
rch37de576c2015-05-17 20:28:171722 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1723 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
ckrasicea295fe2015-10-31 05:03:271724
1725 // Force close of the connection to suppress the generation of RST
1726 // packets when streams are torn down, which wouldn't be relevant to
1727 // this test anyway.
bnc912a04b2016-04-20 14:19:501728 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
Ryan Hamilton8d9ee76e2018-05-29 23:52:521729 session->connection()->CloseConnection(
1730 quic::QUIC_PUBLIC_RESET, "test",
1731 quic::ConnectionCloseBehavior::SILENT_CLOSE);
[email protected]0b2294d32013-08-02 00:46:361732}
1733
[email protected]1e960032013-12-20 19:00:201734TEST_P(QuicStreamFactoryTest, ResolutionErrorInCreate) {
jri7046038f2015-10-22 00:29:261735 Initialize();
rcha00569732016-08-27 11:09:361736 MockQuicData socket_data;
Zhongyi Shi5f587cc2017-11-21 23:24:171737 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]e13201d82012-12-12 05:00:321738
Renjiea0cb4a2c2018-09-26 23:37:301739 host_resolver_->rules()->AddSimulatedFailure(kDefaultServerHostName);
[email protected]e13201d82012-12-12 05:00:321740
zhongyi98d6a9262017-05-19 02:47:451741 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331742 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031743 request.Request(
1744 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1745 SocketTag(),
1746 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1747 failed_on_default_network_callback_, callback_.callback()));
[email protected]e13201d82012-12-12 05:00:321748
robpercival214763f2016-07-01 23:27:011749 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_NAME_NOT_RESOLVED));
[email protected]e13201d82012-12-12 05:00:321750
rch37de576c2015-05-17 20:28:171751 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1752 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:321753}
1754
[email protected]1e960032013-12-20 19:00:201755TEST_P(QuicStreamFactoryTest, ConnectErrorInCreate) {
jri7046038f2015-10-22 00:29:261756 Initialize();
rcha00569732016-08-27 11:09:361757
1758 MockQuicData socket_data;
1759 socket_data.AddConnect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
Zhongyi Shi5f587cc2017-11-21 23:24:171760 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]3c772402013-12-18 21:38:111761
zhongyi98d6a9262017-05-19 02:47:451762 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331763 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031764 request.Request(
1765 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1766 SocketTag(),
1767 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1768 failed_on_default_network_callback_, callback_.callback()));
[email protected]3c772402013-12-18 21:38:111769
robpercival214763f2016-07-01 23:27:011770 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_ADDRESS_IN_USE));
[email protected]3c772402013-12-18 21:38:111771
rch37de576c2015-05-17 20:28:171772 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1773 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]3c772402013-12-18 21:38:111774}
1775
[email protected]1e960032013-12-20 19:00:201776TEST_P(QuicStreamFactoryTest, CancelCreate) {
jri7046038f2015-10-22 00:29:261777 Initialize();
rcha00569732016-08-27 11:09:361778 MockQuicData socket_data;
1779 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431780 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171781 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]e13201d82012-12-12 05:00:321782 {
zhongyi98d6a9262017-05-19 02:47:451783 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331784 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031785 request.Request(
1786 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1787 SocketTag(),
1788 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1789 failed_on_default_network_callback_, callback_.callback()));
[email protected]e13201d82012-12-12 05:00:321790 }
1791
mmenke651bae7f2015-12-18 21:26:451792 base::RunLoop().RunUntilIdle();
[email protected]e13201d82012-12-12 05:00:321793
zhongyi98d6a9262017-05-19 02:47:451794 QuicStreamRequest request2(factory_.get());
zhongyia00ca012017-07-06 23:36:391795 EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
Paul Jensen8e3c5d32018-02-19 17:06:331796 DEFAULT_PRIORITY, SocketTag(),
1797 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:031798 &net_error_details_,
1799 failed_on_default_network_callback_,
1800 callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:241801 std::unique_ptr<HttpStream> stream = CreateStream(&request2);
rch68a80eb2017-04-25 05:24:241802
[email protected]e13201d82012-12-12 05:00:321803 EXPECT_TRUE(stream.get());
1804 stream.reset();
1805
rch37de576c2015-05-17 20:28:171806 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1807 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
[email protected]e13201d82012-12-12 05:00:321808}
1809
[email protected]1e960032013-12-20 19:00:201810TEST_P(QuicStreamFactoryTest, CloseAllSessions) {
jri7046038f2015-10-22 00:29:261811 Initialize();
rch6faa4d42016-01-05 20:48:431812 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1813 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1814 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1815
rcha00569732016-08-27 11:09:361816 MockQuicData socket_data;
1817 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431818 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Ryan Hamilton8d9ee76e2018-05-29 23:52:521819 socket_data.AddWrite(
1820 SYNCHRONOUS, ConstructClientRstPacket(2, quic::QUIC_RST_ACKNOWLEDGEMENT));
Renjieba55fae2018-09-20 03:05:161821 socket_data.AddWrite(SYNCHRONOUS,
1822 client_maker_.MakeConnectionClosePacket(
1823 3, true, quic::QUIC_INTERNAL_ERROR, "net error"));
Zhongyi Shi5f587cc2017-11-21 23:24:171824 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]56dfb902013-01-03 23:17:551825
rcha00569732016-08-27 11:09:361826 MockQuicData socket_data2;
1827 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431828 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171829 socket_data2.AddSocketDataToFactory(socket_factory_.get());
[email protected]56dfb902013-01-03 23:17:551830
zhongyi98d6a9262017-05-19 02:47:451831 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331832 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031833 request.Request(
1834 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1835 SocketTag(),
1836 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1837 failed_on_default_network_callback_, callback_.callback()));
[email protected]56dfb902013-01-03 23:17:551838
robpercival214763f2016-07-01 23:27:011839 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241840 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]0b2294d32013-08-02 00:46:361841 HttpRequestInfo request_info;
Ramin Halavati683bcaa92018-02-14 08:42:391842 request_info.traffic_annotation =
1843 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:271844 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:391845 net_log_, CompletionOnceCallback()));
[email protected]56dfb902013-01-03 23:17:551846
1847 // Close the session and verify that stream saw the error.
Ryan Hamilton8d9ee76e2018-05-29 23:52:521848 factory_->CloseAllSessions(ERR_INTERNET_DISCONNECTED,
1849 quic::QUIC_INTERNAL_ERROR);
[email protected]56dfb902013-01-03 23:17:551850 EXPECT_EQ(ERR_INTERNET_DISCONNECTED,
1851 stream->ReadResponseHeaders(callback_.callback()));
1852
1853 // Now attempting to request a stream to the same origin should create
1854 // a new session.
1855
zhongyi98d6a9262017-05-19 02:47:451856 QuicStreamRequest request2(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331857 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031858 request2.Request(
1859 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1860 SocketTag(),
1861 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1862 failed_on_default_network_callback_, callback_.callback()));
[email protected]56dfb902013-01-03 23:17:551863
robpercival214763f2016-07-01 23:27:011864 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:241865 stream = CreateStream(&request2);
[email protected]56dfb902013-01-03 23:17:551866 stream.reset(); // Will reset stream 3.
1867
rch37de576c2015-05-17 20:28:171868 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1869 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1870 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1871 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]56dfb902013-01-03 23:17:551872}
1873
zhongyi363c91c2017-03-23 23:16:081874// Regression test for crbug.com/700617. Test a write error during the
1875// crypto handshake will not hang QuicStreamFactory::Job and should
1876// report QUIC_HANDSHAKE_FAILED to upper layers. Subsequent
1877// QuicStreamRequest should succeed without hanging.
1878TEST_P(QuicStreamFactoryTest,
1879 WriteErrorInCryptoConnectWithAsyncHostResolution) {
1880 Initialize();
1881 // Use unmocked crypto stream to do crypto connect.
1882 crypto_client_stream_factory_.set_handshake_mode(
Zhongyi Shi879659422018-08-02 17:58:251883 MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
zhongyi363c91c2017-03-23 23:16:081884
1885 MockQuicData socket_data;
1886 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
1887 // Trigger PACKET_WRITE_ERROR when sending packets in crypto connect.
1888 socket_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
Zhongyi Shi5f587cc2017-11-21 23:24:171889 socket_data.AddSocketDataToFactory(socket_factory_.get());
zhongyi363c91c2017-03-23 23:16:081890
1891 // Create request, should fail after the write of the CHLO fails.
zhongyi98d6a9262017-05-19 02:47:451892 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331893 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031894 request.Request(
1895 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1896 SocketTag(),
1897 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1898 failed_on_default_network_callback_, callback_.callback()));
zhongyi363c91c2017-03-23 23:16:081899 EXPECT_EQ(ERR_QUIC_HANDSHAKE_FAILED, callback_.WaitForResult());
1900 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1901 EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_));
1902
1903 // Verify new requests can be sent normally without hanging.
1904 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:271905 MockCryptoClientStream::COLD_START);
zhongyi363c91c2017-03-23 23:16:081906 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1907 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1908 MockQuicData socket_data2;
1909 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431910 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171911 socket_data2.AddSocketDataToFactory(socket_factory_.get());
zhongyi363c91c2017-03-23 23:16:081912
zhongyi98d6a9262017-05-19 02:47:451913 QuicStreamRequest request2(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331914 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031915 request2.Request(
1916 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1917 SocketTag(),
1918 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1919 failed_on_default_network_callback_, callback_.callback()));
zhongyi363c91c2017-03-23 23:16:081920 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1921 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
1922 // Run the message loop to complete host resolution.
1923 base::RunLoop().RunUntilIdle();
1924
1925 // Complete handshake. QuicStreamFactory::Job should complete and succeed.
1926 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
Ryan Hamilton8d9ee76e2018-05-29 23:52:521927 quic::QuicSession::HANDSHAKE_CONFIRMED);
zhongyi363c91c2017-03-23 23:16:081928 EXPECT_THAT(callback_.WaitForResult(), IsOk());
1929 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1930 EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_));
1931
1932 // Create QuicHttpStream.
Yixin Wang7891a39d2017-11-08 20:59:241933 std::unique_ptr<HttpStream> stream = CreateStream(&request2);
zhongyi363c91c2017-03-23 23:16:081934 EXPECT_TRUE(stream.get());
1935 stream.reset();
1936 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1937 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1938 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1939 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1940}
1941
1942TEST_P(QuicStreamFactoryTest, WriteErrorInCryptoConnectWithSyncHostResolution) {
1943 Initialize();
1944 // Use unmocked crypto stream to do crypto connect.
1945 crypto_client_stream_factory_.set_handshake_mode(
Zhongyi Shi879659422018-08-02 17:58:251946 MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
Renjiea0cb4a2c2018-09-26 23:37:301947 host_resolver_->set_synchronous_mode(true);
1948 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
1949 "192.168.0.1", "");
zhongyi363c91c2017-03-23 23:16:081950
1951 MockQuicData socket_data;
1952 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
1953 // Trigger PACKET_WRITE_ERROR when sending packets in crypto connect.
1954 socket_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
Zhongyi Shi5f587cc2017-11-21 23:24:171955 socket_data.AddSocketDataToFactory(socket_factory_.get());
zhongyi363c91c2017-03-23 23:16:081956
1957 // Create request, should fail immediately.
zhongyi98d6a9262017-05-19 02:47:451958 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331959 EXPECT_EQ(ERR_QUIC_HANDSHAKE_FAILED,
Zhongyi Shia6b68d112018-09-24 07:49:031960 request.Request(
1961 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1962 SocketTag(),
1963 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1964 failed_on_default_network_callback_, callback_.callback()));
zhongyi363c91c2017-03-23 23:16:081965 // Check no active session, or active jobs left for this server.
1966 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1967 EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_));
1968
1969 // Verify new requests can be sent normally without hanging.
1970 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:271971 MockCryptoClientStream::COLD_START);
zhongyi363c91c2017-03-23 23:16:081972 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1973 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1974 MockQuicData socket_data2;
1975 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:431976 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:171977 socket_data2.AddSocketDataToFactory(socket_factory_.get());
zhongyi363c91c2017-03-23 23:16:081978
zhongyi98d6a9262017-05-19 02:47:451979 QuicStreamRequest request2(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:331980 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:031981 request2.Request(
1982 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
1983 SocketTag(),
1984 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
1985 failed_on_default_network_callback_, callback_.callback()));
zhongyi363c91c2017-03-23 23:16:081986 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1987 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
1988
1989 // Complete handshake.
1990 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
Ryan Hamilton8d9ee76e2018-05-29 23:52:521991 quic::QuicSession::HANDSHAKE_CONFIRMED);
zhongyi363c91c2017-03-23 23:16:081992 EXPECT_THAT(callback_.WaitForResult(), IsOk());
1993 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1994 EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_));
1995
1996 // Create QuicHttpStream.
Yixin Wang7891a39d2017-11-08 20:59:241997 std::unique_ptr<HttpStream> stream = CreateStream(&request2);
zhongyi363c91c2017-03-23 23:16:081998 EXPECT_TRUE(stream.get());
1999 stream.reset();
2000 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2001 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2002 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2003 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2004}
2005
Zhongyi Shi63574b72018-06-01 20:22:252006TEST_P(QuicStreamFactoryTest, CloseSessionsOnIPAddressChanged) {
Zhongyi Shi967d2f12019-02-08 20:58:532007 test_params_.quic_close_sessions_on_ip_change = true;
jri7046038f2015-10-22 00:29:262008 Initialize();
rch6faa4d42016-01-05 20:48:432009 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2010 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2011 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri8c44d692015-10-23 23:53:412012
rcha00569732016-08-27 11:09:362013 MockQuicData socket_data;
2014 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:432015 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Ryan Hamilton8d9ee76e2018-05-29 23:52:522016 socket_data.AddWrite(
2017 SYNCHRONOUS, ConstructClientRstPacket(2, quic::QUIC_RST_ACKNOWLEDGEMENT));
Renjieba55fae2018-09-20 03:05:162018 socket_data.AddWrite(
2019 SYNCHRONOUS, client_maker_.MakeConnectionClosePacket(
2020 3, true, quic::QUIC_IP_ADDRESS_CHANGED, "net error"));
Zhongyi Shi5f587cc2017-11-21 23:24:172021 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]f698a012013-05-06 20:18:592022
rcha00569732016-08-27 11:09:362023 MockQuicData socket_data2;
2024 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:432025 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:172026 socket_data2.AddSocketDataToFactory(socket_factory_.get());
[email protected]f698a012013-05-06 20:18:592027
zhongyi98d6a9262017-05-19 02:47:452028 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332029 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032030 request.Request(
2031 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2032 SocketTag(),
2033 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2034 failed_on_default_network_callback_, callback_.callback()));
[email protected]f698a012013-05-06 20:18:592035
robpercival214763f2016-07-01 23:27:012036 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:242037 std::unique_ptr<HttpStream> stream = CreateStream(&request);
[email protected]0b2294d32013-08-02 00:46:362038 HttpRequestInfo request_info;
Ramin Halavati683bcaa92018-02-14 08:42:392039 request_info.traffic_annotation =
2040 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:272041 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:392042 net_log_, CompletionOnceCallback()));
[email protected]f698a012013-05-06 20:18:592043
Zhongyi Shi63574b72018-06-01 20:22:252044 // Check an active session exisits for the destination.
2045 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2046 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
2047 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2048
Ryan Hamilton8e32a2b2017-08-28 20:06:522049 IPAddress last_address;
2050 EXPECT_TRUE(http_server_properties_.GetSupportsQuic(&last_address));
Zhongyi Shi63574b72018-06-01 20:22:252051 // Change the IP address and verify that stream saw the error and the active
2052 // session is closed.
jri8c44d692015-10-23 23:53:412053 NotifyIPAddressChanged();
[email protected]f698a012013-05-06 20:18:592054 EXPECT_EQ(ERR_NETWORK_CHANGED,
2055 stream->ReadResponseHeaders(callback_.callback()));
jri7046038f2015-10-22 00:29:262056 EXPECT_TRUE(factory_->require_confirmation());
Ryan Hamilton8e32a2b2017-08-28 20:06:522057 EXPECT_FALSE(http_server_properties_.GetSupportsQuic(&last_address));
Zhongyi Shi63574b72018-06-01 20:22:252058 // Check no active session exists for the destination.
2059 EXPECT_FALSE(HasActiveSession(host_port_pair_));
[email protected]f698a012013-05-06 20:18:592060
2061 // Now attempting to request a stream to the same origin should create
2062 // a new session.
zhongyi98d6a9262017-05-19 02:47:452063 QuicStreamRequest request2(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332064 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032065 request2.Request(
2066 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2067 SocketTag(),
2068 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2069 failed_on_default_network_callback_, callback_.callback()));
[email protected]f698a012013-05-06 20:18:592070
robpercival214763f2016-07-01 23:27:012071 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:242072 stream = CreateStream(&request2);
[email protected]f698a012013-05-06 20:18:592073
Zhongyi Shi63574b72018-06-01 20:22:252074 // Check a new active session exisits for the destination and the old session
2075 // is no longer live.
2076 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2077 QuicChromiumClientSession* session2 = GetActiveSession(host_port_pair_);
2078 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session2));
2079
2080 stream.reset(); // Will reset stream 3.
rch37de576c2015-05-17 20:28:172081 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2082 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2083 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2084 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]f698a012013-05-06 20:18:592085}
2086
Zhongyi Shi63574b72018-06-01 20:22:252087// Test that if goaway_session_on_ip_change is set, old sessions will be marked
2088// as going away on IP address change instead of being closed. New requests will
2089// go to a new connection.
2090TEST_P(QuicStreamFactoryTest, GoAwaySessionsOnIPAddressChanged) {
Zhongyi Shi967d2f12019-02-08 20:58:532091 test_params_.quic_goaway_sessions_on_ip_change = true;
Zhongyi Shi63574b72018-06-01 20:22:252092 Initialize();
2093 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2094 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2095 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2096
2097 MockQuicData quic_data1;
2098 quic::QuicStreamOffset header_stream_offset = 0;
2099 quic_data1.AddWrite(SYNCHRONOUS,
2100 ConstructInitialSettingsPacket(1, &header_stream_offset));
Fan Yang32c5a112018-12-10 20:06:332101 quic_data1.AddWrite(
2102 SYNCHRONOUS, ConstructGetRequestPacket(
2103 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
2104 true, &header_stream_offset));
Zhongyi Shi63574b72018-06-01 20:22:252105 quic_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause
2106 quic_data1.AddRead(
Fan Yang32c5a112018-12-10 20:06:332107 ASYNC,
2108 ConstructOkResponsePacket(
2109 1, GetNthClientInitiatedBidirectionalStreamId(0), false, true));
Zhongyi Shi63574b72018-06-01 20:22:252110 quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
2111 quic_data1.AddSocketDataToFactory(socket_factory_.get());
2112
2113 MockQuicData quic_data2;
2114 quic::QuicStreamOffset header_stream_offset2 = 0;
2115 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
2116 quic_data2.AddWrite(
2117 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset2));
2118 quic_data2.AddSocketDataToFactory(socket_factory_.get());
2119
2120 // Create request and QuicHttpStream.
2121 QuicStreamRequest request(factory_.get());
2122 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032123 request.Request(
2124 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2125 SocketTag(),
2126 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2127 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi63574b72018-06-01 20:22:252128 EXPECT_THAT(callback_.WaitForResult(), IsOk());
2129 std::unique_ptr<HttpStream> stream = CreateStream(&request);
2130 EXPECT_TRUE(stream.get());
2131
2132 // Cause QUIC stream to be created.
2133 HttpRequestInfo request_info;
2134 request_info.method = "GET";
2135 request_info.url = url_;
2136 request_info.traffic_annotation =
2137 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
2138 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
2139 net_log_, CompletionOnceCallback()));
2140
2141 // Ensure that session is alive and active.
2142 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
2143 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2144 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2145
2146 // Send GET request on stream.
2147 HttpResponseInfo response;
2148 HttpRequestHeaders request_headers;
2149 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
2150 callback_.callback()));
2151
2152 // Receive an IP address change notification.
2153 NotifyIPAddressChanged();
2154
2155 // The connection should still be alive, but marked as going away.
2156 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2157 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2158 EXPECT_EQ(1u, session->GetNumActiveStreams());
2159
2160 // Resume the data, response should be read from the original connection.
2161 quic_data1.Resume();
2162 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
2163 EXPECT_EQ(200, response.headers->response_code());
2164 EXPECT_EQ(0u, session->GetNumActiveStreams());
2165
2166 // Second request should be sent on a new connection.
2167 QuicStreamRequest request2(factory_.get());
2168 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032169 request2.Request(
2170 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2171 SocketTag(),
2172 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2173 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi63574b72018-06-01 20:22:252174 EXPECT_THAT(callback_.WaitForResult(), IsOk());
2175 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
2176 EXPECT_TRUE(stream2.get());
2177
2178 // Check an active session exisits for the destination.
2179 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2180 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2181 QuicChromiumClientSession* session2 = GetActiveSession(host_port_pair_);
2182 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session2));
2183
2184 stream.reset();
2185 stream2.reset();
2186 EXPECT_TRUE(quic_data1.AllReadDataConsumed());
2187 EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
2188 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
2189 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
2190}
2191
Jana Iyengarba355772017-09-21 22:03:212192TEST_P(QuicStreamFactoryTest, OnIPAddressChangedWithConnectionMigration) {
Zhongyi Shi1a054612018-06-14 04:59:082193 InitializeConnectionMigrationV2Test(
Jana Iyengarba355772017-09-21 22:03:212194 {kDefaultNetworkForTests, kNewNetworkForTests});
2195 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2196 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2197 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2198
2199 MockQuicData socket_data;
2200 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:432201 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Ryan Hamilton8d9ee76e2018-05-29 23:52:522202 socket_data.AddWrite(
2203 SYNCHRONOUS, ConstructClientRstPacket(2, quic::QUIC_STREAM_CANCELLED));
Zhongyi Shi5f587cc2017-11-21 23:24:172204 socket_data.AddSocketDataToFactory(socket_factory_.get());
Jana Iyengarba355772017-09-21 22:03:212205
2206 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332207 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032208 request.Request(
2209 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2210 SocketTag(),
2211 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2212 failed_on_default_network_callback_, callback_.callback()));
Jana Iyengarba355772017-09-21 22:03:212213
2214 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:242215 std::unique_ptr<HttpStream> stream = CreateStream(&request);
Jana Iyengarba355772017-09-21 22:03:212216 HttpRequestInfo request_info;
Ramin Halavati683bcaa92018-02-14 08:42:392217 request_info.traffic_annotation =
2218 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:272219 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:392220 net_log_, CompletionOnceCallback()));
Jana Iyengarba355772017-09-21 22:03:212221
2222 IPAddress last_address;
2223 EXPECT_TRUE(http_server_properties_.GetSupportsQuic(&last_address));
2224
2225 // Change the IP address and verify that the connection is unaffected.
2226 NotifyIPAddressChanged();
2227 EXPECT_FALSE(factory_->require_confirmation());
2228 EXPECT_TRUE(http_server_properties_.GetSupportsQuic(&last_address));
2229
2230 // Attempting a new request to the same origin uses the same connection.
2231 QuicStreamRequest request2(factory_.get());
2232 EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
Paul Jensen8e3c5d32018-02-19 17:06:332233 DEFAULT_PRIORITY, SocketTag(),
2234 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:032235 &net_error_details_,
2236 failed_on_default_network_callback_,
2237 callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:242238 stream = CreateStream(&request2);
Jana Iyengarba355772017-09-21 22:03:212239
2240 stream.reset();
2241 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2242 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2243}
2244
Zhongyi Shia0644e32018-06-21 05:19:522245TEST_P(QuicStreamFactoryTest, MigrateOnNetworkMadeDefaultWithSynchronousWrite) {
2246 TestMigrationOnNetworkMadeDefault(SYNCHRONOUS);
jri9f303712016-09-13 01:10:222247}
2248
Zhongyi Shia0644e32018-06-21 05:19:522249TEST_P(QuicStreamFactoryTest, MigrateOnNetworkMadeDefaultWithAsyncWrite) {
2250 TestMigrationOnNetworkMadeDefault(ASYNC);
jri9f303712016-09-13 01:10:222251}
2252
Zhongyi Shia0644e32018-06-21 05:19:522253// Sets up a test which attempts connection migration successfully after probing
2254// when a new network is made as default and the old default is still available.
2255// |write_mode| specifies the write mode for the last write before
2256// OnNetworkMadeDefault is delivered to session.
2257void QuicStreamFactoryTestBase::TestMigrationOnNetworkMadeDefault(
2258 IoMode write_mode) {
2259 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
jri7e636642016-01-14 06:57:082260 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2261 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2262 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2263
Zhongyi Shia0644e32018-06-21 05:19:522264 // Using a testing task runner so that we can control time.
2265 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
2266 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
2267
2268 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2269 ->QueueNetworkMadeDefault(kDefaultNetworkForTests);
2270
2271 MockQuicData quic_data1;
Ryan Hamilton8d9ee76e2018-05-29 23:52:522272 quic::QuicStreamOffset header_stream_offset = 0;
Zhongyi Shia0644e32018-06-21 05:19:522273 quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging Read.
2274 quic_data1.AddWrite(SYNCHRONOUS,
2275 ConstructInitialSettingsPacket(1, &header_stream_offset));
2276 quic_data1.AddWrite(
Fan Yang32c5a112018-12-10 20:06:332277 write_mode, ConstructGetRequestPacket(
2278 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
2279 true, &header_stream_offset));
Zhongyi Shia0644e32018-06-21 05:19:522280 quic_data1.AddSocketDataToFactory(socket_factory_.get());
2281
2282 // Set up the second socket data provider that is used after migration.
2283 // The response to the earlier request is read on the new socket.
2284 MockQuicData quic_data2;
2285 // Connectivity probe to be sent on the new path.
Zhongyi Shi879659422018-08-02 17:58:252286 quic_data2.AddWrite(SYNCHRONOUS,
2287 client_maker_.MakeConnectivityProbingPacket(3, true));
Zhongyi Shia0644e32018-06-21 05:19:522288 quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // Pause
2289 // Connectivity probe to receive from the server.
Zhongyi Shi879659422018-08-02 17:58:252290 quic_data2.AddRead(ASYNC,
2291 server_maker_.MakeConnectivityProbingPacket(1, false));
Zhongyi Shia0644e32018-06-21 05:19:522292 // Ping packet to send after migration is completed.
2293 quic_data2.AddWrite(ASYNC,
2294 client_maker_.MakeAckAndPingPacket(4, false, 1, 1, 1));
2295 quic_data2.AddRead(
Fan Yang32c5a112018-12-10 20:06:332296 ASYNC,
2297 ConstructOkResponsePacket(
2298 2, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
Zhongyi Shia0644e32018-06-21 05:19:522299 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Fan Yang32c5a112018-12-10 20:06:332300 quic_data2.AddWrite(
2301 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
2302 5, false, GetNthClientInitiatedBidirectionalStreamId(0),
2303 quic::QUIC_STREAM_CANCELLED, 2, 2, 1, true));
Zhongyi Shia0644e32018-06-21 05:19:522304 quic_data2.AddSocketDataToFactory(socket_factory_.get());
jri7e636642016-01-14 06:57:082305
2306 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:452307 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332308 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032309 request.Request(
2310 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2311 SocketTag(),
2312 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2313 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:012314 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:242315 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri7e636642016-01-14 06:57:082316 EXPECT_TRUE(stream.get());
2317
2318 // Cause QUIC stream to be created.
2319 HttpRequestInfo request_info;
2320 request_info.method = "GET";
bnc3d9035b32016-06-30 18:18:482321 request_info.url = url_;
Ramin Halavati683bcaa92018-02-14 08:42:392322 request_info.traffic_annotation =
2323 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:272324 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:392325 net_log_, CompletionOnceCallback()));
jri7e636642016-01-14 06:57:082326
2327 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502328 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri7e636642016-01-14 06:57:082329 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2330 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2331
2332 // Send GET request on stream.
2333 HttpResponseInfo response;
2334 HttpRequestHeaders request_headers;
2335 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
2336 callback_.callback()));
2337
Zhongyi Shia0644e32018-06-21 05:19:522338 // Deliver a signal that a alternate network is connected now, this should
2339 // cause the connection to start early migration on path degrading.
2340 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2341 ->SetConnectedNetworksList(
2342 {kDefaultNetworkForTests, kNewNetworkForTests});
2343 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2344 ->NotifyNetworkConnected(kNewNetworkForTests);
jri9f303712016-09-13 01:10:222345
Zhongyi Shia0644e32018-06-21 05:19:522346 // Cause the connection to report path degrading to the session.
2347 // Due to lack of alternate network, session will not mgirate connection.
2348 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
jri7e636642016-01-14 06:57:082349 scoped_mock_network_change_notifier_->mock_network_change_notifier()
jrie2661982016-08-20 08:24:342350 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
jri7e636642016-01-14 06:57:082351
Zhongyi Shia0644e32018-06-21 05:19:522352 // A task will be posted to migrate to the new default network.
2353 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
2354 EXPECT_EQ(base::TimeDelta(), task_runner->NextPendingTaskDelay());
2355
2356 // Execute the posted task to migrate back to the default network.
2357 task_runner->RunUntilIdle();
2358 // Another task to try send a new connectivity probe is posted. And a task to
2359 // retry migrate back to default network is scheduled.
2360 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
2361 // Next connectivity probe is scheduled to be sent in 2 *
2362 // kDefaultRTTMilliSecs.
2363 base::TimeDelta next_task_delay = task_runner->NextPendingTaskDelay();
2364 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
2365 next_task_delay);
2366
2367 // The connection should still be alive, and not marked as going away.
jri7e636642016-01-14 06:57:082368 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia0644e32018-06-21 05:19:522369 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2370 EXPECT_EQ(1u, session->GetNumActiveStreams());
2371 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
2372
2373 // Resume quic data and a connectivity probe response will be read on the new
2374 // socket, declare probing as successful. And a new task to WriteToNewSocket
2375 // will be posted to complete migration.
2376 quic_data2.Resume();
2377
2378 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2379 EXPECT_TRUE(HasActiveSession(host_port_pair_));
jri7e636642016-01-14 06:57:082380 EXPECT_EQ(1u, session->GetNumActiveStreams());
2381
Zhongyi Shia0644e32018-06-21 05:19:522382 // There should be three pending tasks, the nearest one will complete
2383 // migration to the new network.
2384 EXPECT_EQ(3u, task_runner->GetPendingTaskCount());
2385 next_task_delay = task_runner->NextPendingTaskDelay();
2386 EXPECT_EQ(base::TimeDelta(), next_task_delay);
2387 task_runner->FastForwardBy(next_task_delay);
2388
2389 // Response headers are received over the new network.
2390 EXPECT_THAT(callback_.WaitForResult(), IsOk());
jri7e636642016-01-14 06:57:082391 EXPECT_EQ(200, response.headers->response_code());
2392
Zhongyi Shia0644e32018-06-21 05:19:522393 // Now there are two pending tasks, the nearest one was to send connectivity
2394 // probe and has been cancelled due to successful migration.
2395 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
2396 next_task_delay = task_runner->NextPendingTaskDelay();
2397 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
2398 next_task_delay);
2399 task_runner->FastForwardBy(next_task_delay);
jri7e636642016-01-14 06:57:082400
Zhongyi Shia0644e32018-06-21 05:19:522401 // There's one more task to mgirate back to the default network in 0.4s, which
2402 // is also cancelled due to the success migration on the previous trial.
2403 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
2404 next_task_delay = task_runner->NextPendingTaskDelay();
2405 base::TimeDelta expected_delay =
2406 base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs) -
2407 base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs);
2408 EXPECT_EQ(expected_delay, next_task_delay);
2409 task_runner->FastForwardBy(next_task_delay);
2410 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
jri7e636642016-01-14 06:57:082411
Zhongyi Shia0644e32018-06-21 05:19:522412 // Verify that the session is still alive.
jri7e636642016-01-14 06:57:082413 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia0644e32018-06-21 05:19:522414 EXPECT_TRUE(HasActiveSession(host_port_pair_));
jri7e636642016-01-14 06:57:082415
Zhongyi Shia0644e32018-06-21 05:19:522416 stream.reset();
2417 EXPECT_TRUE(quic_data1.AllReadDataConsumed());
2418 EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
2419 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
2420 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
jri7e636642016-01-14 06:57:082421}
2422
Zhongyi Shib3bc982c2018-07-10 19:59:242423// Regression test for http://859674.
2424// This test veries that a writer will not attempt to write packets until being
2425// unblocked on both socket level and network level. In this test, a probing
2426// writer is used to send two connectivity probes to the peer: where the first
2427// one completes successfully, while a connectivity response is received before
2428// completes sending the second one. The connection migration attempt will
2429// proceed while the probing writer is blocked at the socket level, which will
2430// block the writer on the network level. Once connection migration completes
2431// successfully, the probing writer will be unblocked on the network level, it
2432// will not attempt to write new packets until the socket level is unblocked.
2433TEST_P(QuicStreamFactoryTest, MigratedToBlockedSocketAfterProbing) {
2434 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
2435 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2436 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2437 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2438
2439 // Using a testing task runner so that we can control time.
2440 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
2441 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
2442
2443 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2444 ->QueueNetworkMadeDefault(kDefaultNetworkForTests);
2445
2446 MockQuicData quic_data1;
2447 quic::QuicStreamOffset header_stream_offset = 0;
2448 quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging Read.
2449 quic_data1.AddWrite(SYNCHRONOUS,
2450 ConstructInitialSettingsPacket(1, &header_stream_offset));
Fan Yang32c5a112018-12-10 20:06:332451 quic_data1.AddWrite(
2452 SYNCHRONOUS, ConstructGetRequestPacket(
2453 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
2454 true, &header_stream_offset));
Zhongyi Shib3bc982c2018-07-10 19:59:242455 quic_data1.AddSocketDataToFactory(socket_factory_.get());
2456
2457 // Set up the second socket data provider that is used after migration.
2458 // The response to the earlier request is read on the new socket.
2459 MockQuicData quic_data2;
2460 // First connectivity probe to be sent on the new path.
Zhongyi Shi879659422018-08-02 17:58:252461 quic_data2.AddWrite(SYNCHRONOUS,
2462 client_maker_.MakeConnectivityProbingPacket(3, true));
Zhongyi Shib3bc982c2018-07-10 19:59:242463 quic_data2.AddRead(ASYNC,
2464 ERR_IO_PENDING); // Pause so that we can control time.
2465 // Connectivity probe to receive from the server.
Zhongyi Shi879659422018-08-02 17:58:252466 quic_data2.AddRead(ASYNC,
2467 server_maker_.MakeConnectivityProbingPacket(1, false));
Zhongyi Shib3bc982c2018-07-10 19:59:242468 // Second connectivity probe which will complete asynchronously.
Zhongyi Shi879659422018-08-02 17:58:252469 quic_data2.AddWrite(ASYNC,
2470 client_maker_.MakeConnectivityProbingPacket(4, true));
Zhongyi Shib3bc982c2018-07-10 19:59:242471 quic_data2.AddRead(
Fan Yang32c5a112018-12-10 20:06:332472 ASYNC,
2473 ConstructOkResponsePacket(
2474 2, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
Zhongyi Shib3bc982c2018-07-10 19:59:242475 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
2476 quic_data2.AddWrite(ASYNC,
2477 client_maker_.MakeAckAndPingPacket(5, false, 1, 1, 1));
Fan Yang32c5a112018-12-10 20:06:332478 quic_data2.AddWrite(
2479 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
2480 6, false, GetNthClientInitiatedBidirectionalStreamId(0),
2481 quic::QUIC_STREAM_CANCELLED, 2, 2, 1, true));
Zhongyi Shib3bc982c2018-07-10 19:59:242482
2483 quic_data2.AddSocketDataToFactory(socket_factory_.get());
2484
2485 // Create request and QuicHttpStream.
2486 QuicStreamRequest request(factory_.get());
2487 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032488 request.Request(
2489 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2490 SocketTag(),
2491 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2492 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shib3bc982c2018-07-10 19:59:242493 EXPECT_THAT(callback_.WaitForResult(), IsOk());
2494 std::unique_ptr<HttpStream> stream = CreateStream(&request);
2495 EXPECT_TRUE(stream.get());
2496
2497 // Cause QUIC stream to be created.
2498 HttpRequestInfo request_info;
2499 request_info.method = "GET";
2500 request_info.url = url_;
2501 request_info.traffic_annotation =
2502 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
2503 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
2504 net_log_, CompletionOnceCallback()));
2505
2506 // Ensure that session is alive and active.
2507 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
2508 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2509 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2510
2511 // Send GET request on stream.
2512 HttpResponseInfo response;
2513 HttpRequestHeaders request_headers;
2514 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
2515 callback_.callback()));
2516
2517 // Deliver a signal that a alternate network is connected now, this should
2518 // cause the connection to start early migration on path degrading.
2519 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2520 ->SetConnectedNetworksList(
2521 {kDefaultNetworkForTests, kNewNetworkForTests});
2522 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2523 ->NotifyNetworkConnected(kNewNetworkForTests);
2524
2525 // Cause the connection to report path degrading to the session.
2526 // Due to lack of alternate network, session will not mgirate connection.
2527 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
2528 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2529 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
2530
2531 // A task will be posted to migrate to the new default network.
2532 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
2533 EXPECT_EQ(base::TimeDelta(), task_runner->NextPendingTaskDelay());
2534
2535 // Execute the posted task to migrate back to the default network.
2536 task_runner->RunUntilIdle();
2537 // Another task to resend a new connectivity probe is posted. And a task to
2538 // retry migrate back to default network is scheduled.
2539 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
2540 // Next connectivity probe is scheduled to be sent in 2 *
2541 // kDefaultRTTMilliSecs.
2542 base::TimeDelta next_task_delay = task_runner->NextPendingTaskDelay();
2543 base::TimeDelta expected_delay =
2544 base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs);
2545 EXPECT_EQ(expected_delay, next_task_delay);
2546
2547 // Fast forward to send the second connectivity probe. The write will be
2548 // asynchronous and complete after the read completes.
2549 task_runner->FastForwardBy(next_task_delay);
2550
2551 // Resume quic data and a connectivity probe response will be read on the new
2552 // socket, declare probing as successful.
2553 quic_data2.Resume();
2554
2555 // The connection should still be alive, and not marked as going away.
2556 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2557 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2558 EXPECT_EQ(1u, session->GetNumActiveStreams());
2559 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
2560
2561 // There should be three pending tasks, the nearest one will complete
2562 // migration to the new network. Second task will retry migrate back to
2563 // default but cancelled, and the third task will retry send connectivity
2564 // probe but also cancelled.
2565 EXPECT_EQ(3u, task_runner->GetPendingTaskCount());
2566 EXPECT_EQ(base::TimeDelta(), task_runner->NextPendingTaskDelay());
2567 task_runner->RunUntilIdle();
2568
2569 // Response headers are received over the new network.
2570 EXPECT_THAT(callback_.WaitForResult(), IsOk());
2571 EXPECT_EQ(200, response.headers->response_code());
2572
2573 // Run the message loop to complete the asynchronous write of ack and ping.
2574 base::RunLoop().RunUntilIdle();
2575
2576 // Now there are two pending tasks, the nearest one was to retry migrate back
2577 // to default network and has been cancelled due to successful migration.
2578 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
2579 expected_delay =
2580 base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs) -
2581 expected_delay;
2582 next_task_delay = task_runner->NextPendingTaskDelay();
2583 EXPECT_EQ(expected_delay, next_task_delay);
2584 task_runner->FastForwardBy(next_task_delay);
2585
2586 // There's one more task to retry sending connectivity probe in 0.4s and has
2587 // also been cancelled due to the successful probing.
2588 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
2589 next_task_delay = task_runner->NextPendingTaskDelay();
2590 expected_delay =
2591 base::TimeDelta::FromMilliseconds(3 * 2 * kDefaultRTTMilliSecs) -
2592 base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs);
2593 EXPECT_EQ(expected_delay, next_task_delay);
2594 task_runner->FastForwardBy(next_task_delay);
2595 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
2596
2597 // Verify that the session is still alive.
2598 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2599 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2600
2601 stream.reset();
2602 EXPECT_TRUE(quic_data1.AllReadDataConsumed());
2603 EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
2604 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
2605 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
2606}
2607
Zhongyi Shib1b1fa42018-06-19 23:13:472608// This test verifies that session times out connection migration attempt
2609// with signals delivered in the following order (no alternate network is
2610// available):
2611// - default network disconnected is delivered: session attempts connection
2612// migration but found not alternate network. Session waits for a new network
2613// comes up in the next kWaitTimeForNewNetworkSecs seonds.
2614// - no new network is connected, migration times out. Session is closed.
2615TEST_P(QuicStreamFactoryTest, MigrationTimeoutWithNoNewNetwork) {
2616 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
jri7e636642016-01-14 06:57:082617 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2618 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2619
Zhongyi Shib1b1fa42018-06-19 23:13:472620 // Using a testing task runner so that we can control time.
2621 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
2622 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
jri5b785512016-09-13 04:29:112623
rcha00569732016-08-27 11:09:362624 MockQuicData socket_data;
2625 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:432626 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:172627 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri7e636642016-01-14 06:57:082628
2629 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:452630 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332631 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032632 request.Request(
2633 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2634 SocketTag(),
2635 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2636 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:012637 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:242638 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri7e636642016-01-14 06:57:082639 EXPECT_TRUE(stream.get());
2640
2641 // Cause QUIC stream to be created.
2642 HttpRequestInfo request_info;
Ramin Halavati683bcaa92018-02-14 08:42:392643 request_info.traffic_annotation =
2644 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:272645 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:392646 net_log_, CompletionOnceCallback()));
jri7e636642016-01-14 06:57:082647
2648 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502649 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri7e636642016-01-14 06:57:082650 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2651 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2652
2653 // Trigger connection migration. Since there are no networks
jri5b785512016-09-13 04:29:112654 // to migrate to, this should cause the session to wait for a new network.
jri7e636642016-01-14 06:57:082655 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2656 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
2657
jri5b785512016-09-13 04:29:112658 // The migration will not fail until the migration alarm timeout.
2659 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shib1b1fa42018-06-19 23:13:472660 EXPECT_TRUE(HasActiveSession(host_port_pair_));
jri5b785512016-09-13 04:29:112661 EXPECT_EQ(1u, session->GetNumActiveStreams());
2662 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
2663 EXPECT_EQ(true, session->connection()->writer()->IsWriteBlocked());
2664
Zhongyi Shib1b1fa42018-06-19 23:13:472665 // Migration will be timed out after kWaitTimeForNewNetwokSecs.
2666 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
2667 base::TimeDelta next_task_delay = task_runner->NextPendingTaskDelay();
2668 EXPECT_EQ(base::TimeDelta::FromSeconds(kWaitTimeForNewNetworkSecs),
2669 next_task_delay);
2670 task_runner->FastForwardBy(next_task_delay);
jri5b785512016-09-13 04:29:112671
2672 // The connection should now be closed. A request for response
2673 // headers should fail.
jri7e636642016-01-14 06:57:082674 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2675 EXPECT_FALSE(HasActiveSession(host_port_pair_));
jri5b785512016-09-13 04:29:112676 EXPECT_EQ(ERR_NETWORK_CHANGED, callback_.WaitForResult());
jri7e636642016-01-14 06:57:082677
2678 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2679 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2680}
2681
Zhongyi Shi21e99532018-07-17 22:23:072682// This test verifies that connectivity probes will be sent even if there is
2683// a non-migratable stream. However, when connection migrates to the
Zhongyi Shic16b4102019-02-12 00:37:402684// successfully probed path, any non-migratable streams will be reset.
jri9f303712016-09-13 01:10:222685TEST_P(QuicStreamFactoryTest, OnNetworkMadeDefaultNonMigratableStream) {
Zhongyi Shi5f587cc2017-11-21 23:24:172686 InitializeConnectionMigrationV2Test(
2687 {kDefaultNetworkForTests, kNewNetworkForTests});
2688 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2689 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2690
2691 MockQuicData socket_data;
2692 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:432693 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Renjieba55fae2018-09-20 03:05:162694
Zhongyi Shi5f587cc2017-11-21 23:24:172695 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri231c2972016-03-08 19:50:112696
Zhongyi Shi21e99532018-07-17 22:23:072697 // Set up the second socket data provider that is used for probing.
2698 MockQuicData quic_data1;
2699 // Connectivity probe to be sent on the new path.
Zhongyi Shi879659422018-08-02 17:58:252700 quic_data1.AddWrite(SYNCHRONOUS,
2701 client_maker_.MakeConnectivityProbingPacket(2, true));
Zhongyi Shi21e99532018-07-17 22:23:072702 quic_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause
2703 // Connectivity probe to receive from the server.
Zhongyi Shi879659422018-08-02 17:58:252704 quic_data1.AddRead(ASYNC,
2705 server_maker_.MakeConnectivityProbingPacket(1, false));
Zhongyi Shic16b4102019-02-12 00:37:402706 quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
2707 // A RESET will be sent to the peer to cancel the non-migratable stream.
2708 quic_data1.AddWrite(
2709 SYNCHRONOUS, client_maker_.MakeRstPacket(
2710 3, false, GetNthClientInitiatedBidirectionalStreamId(0),
2711 quic::QUIC_STREAM_CANCELLED));
2712 // Ping packet to send after migration is completed.
2713 quic_data1.AddWrite(SYNCHRONOUS,
2714 client_maker_.MakeAckAndPingPacket(4, false, 1, 1, 1));
Zhongyi Shi21e99532018-07-17 22:23:072715 quic_data1.AddSocketDataToFactory(socket_factory_.get());
2716
jri231c2972016-03-08 19:50:112717 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:452718 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332719 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032720 request.Request(
2721 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2722 SocketTag(),
2723 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2724 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:012725 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:242726 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri231c2972016-03-08 19:50:112727 EXPECT_TRUE(stream.get());
2728
2729 // Cause QUIC stream to be created, but marked as non-migratable.
2730 HttpRequestInfo request_info;
Zhongyi Shibb28b1f2018-07-18 02:41:262731 request_info.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION_TO_CELLULAR;
Ramin Halavati683bcaa92018-02-14 08:42:392732 request_info.traffic_annotation =
2733 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:272734 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:392735 net_log_, CompletionOnceCallback()));
jri231c2972016-03-08 19:50:112736
2737 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502738 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri231c2972016-03-08 19:50:112739 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2740 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2741
Zhongyi Shi21e99532018-07-17 22:23:072742 // Trigger connection migration. Session will start to probe the alternative
2743 // network. Although there is a non-migratable stream, session will still be
2744 // active until probing is declared as successful.
jri231c2972016-03-08 19:50:112745 scoped_mock_network_change_notifier_->mock_network_change_notifier()
jrie2661982016-08-20 08:24:342746 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
jri231c2972016-03-08 19:50:112747
2748 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shi21e99532018-07-17 22:23:072749 EXPECT_TRUE(HasActiveSession(host_port_pair_));
jri231c2972016-03-08 19:50:112750 EXPECT_EQ(1u, session->GetNumActiveStreams());
2751
Zhongyi Shi21e99532018-07-17 22:23:072752 // Resume data to read a connectivity probing response, which will cause
Zhongyi Shic16b4102019-02-12 00:37:402753 // non-migtable streams to be closed.
Zhongyi Shi21e99532018-07-17 22:23:072754 quic_data1.Resume();
2755 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shic16b4102019-02-12 00:37:402756 EXPECT_TRUE(HasActiveSession(host_port_pair_));
Zhongyi Shi21e99532018-07-17 22:23:072757 EXPECT_EQ(0u, session->GetNumActiveStreams());
jri231c2972016-03-08 19:50:112758
Zhongyi Shic16b4102019-02-12 00:37:402759 base::RunLoop().RunUntilIdle();
2760
Zhongyi Shi21e99532018-07-17 22:23:072761 EXPECT_TRUE(quic_data1.AllReadDataConsumed());
2762 EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
jri231c2972016-03-08 19:50:112763 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2764 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2765}
2766
jri9f303712016-09-13 01:10:222767TEST_P(QuicStreamFactoryTest, OnNetworkMadeDefaultConnectionMigrationDisabled) {
Zhongyi Shi5f587cc2017-11-21 23:24:172768 InitializeConnectionMigrationV2Test(
2769 {kDefaultNetworkForTests, kNewNetworkForTests});
2770 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2771 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2772
2773 MockQuicData socket_data;
2774 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:432775 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
2776 socket_data.AddWrite(
Fan Yang32c5a112018-12-10 20:06:332777 SYNCHRONOUS, client_maker_.MakeRstPacket(
2778 2, true, GetNthClientInitiatedBidirectionalStreamId(0),
2779 quic::QUIC_STREAM_CANCELLED));
Zhongyi Shi5f587cc2017-11-21 23:24:172780 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri9c541572016-03-29 17:51:482781
2782 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:452783 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332784 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032785 request.Request(
2786 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2787 SocketTag(),
2788 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2789 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:012790 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:242791 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri9c541572016-03-29 17:51:482792 EXPECT_TRUE(stream.get());
2793
2794 // Cause QUIC stream to be created.
2795 HttpRequestInfo request_info;
Ramin Halavati683bcaa92018-02-14 08:42:392796 request_info.traffic_annotation =
2797 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:272798 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:392799 net_log_, CompletionOnceCallback()));
jri9c541572016-03-29 17:51:482800
2801 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502802 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri9c541572016-03-29 17:51:482803 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2804 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2805
2806 // Set session config to have connection migration disabled.
Ryan Hamilton8d9ee76e2018-05-29 23:52:522807 quic::test::QuicConfigPeer::SetReceivedDisableConnectionMigration(
2808 session->config());
jri9c541572016-03-29 17:51:482809 EXPECT_TRUE(session->config()->DisableConnectionMigration());
2810
2811 // Trigger connection migration. Since there is a non-migratable stream,
2812 // this should cause session to continue but be marked as going away.
2813 scoped_mock_network_change_notifier_->mock_network_change_notifier()
jrie2661982016-08-20 08:24:342814 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
jri9c541572016-03-29 17:51:482815
2816 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2817 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2818 EXPECT_EQ(1u, session->GetNumActiveStreams());
2819
2820 stream.reset();
2821
2822 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2823 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2824}
2825
jri9f303712016-09-13 01:10:222826TEST_P(QuicStreamFactoryTest, OnNetworkDisconnectedNonMigratableStream) {
Zhongyi Shi5f587cc2017-11-21 23:24:172827 InitializeConnectionMigrationV2Test(
2828 {kDefaultNetworkForTests, kNewNetworkForTests});
2829 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2830 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2831
Zhongyi Shic16b4102019-02-12 00:37:402832 quic::QuicStreamOffset header_stream_offset = 0;
2833 MockQuicData failed_socket_data;
2834 failed_socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
2835 failed_socket_data.AddWrite(
2836 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
2837 // A RESET will be sent to the peer to cancel the non-migratable stream.
2838 failed_socket_data.AddWrite(
Fan Yang32c5a112018-12-10 20:06:332839 SYNCHRONOUS, client_maker_.MakeRstPacket(
2840 2, true, GetNthClientInitiatedBidirectionalStreamId(0),
2841 quic::QUIC_STREAM_CANCELLED));
Zhongyi Shic16b4102019-02-12 00:37:402842 failed_socket_data.AddSocketDataToFactory(socket_factory_.get());
2843
2844 // Set up second socket data provider that is used after migration.
2845 MockQuicData socket_data;
2846 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
2847 // Ping packet to send after migration.
2848 socket_data.AddWrite(
2849 SYNCHRONOUS, client_maker_.MakePingPacket(3, /*include_version=*/true));
Zhongyi Shi5f587cc2017-11-21 23:24:172850 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri231c2972016-03-08 19:50:112851
2852 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:452853 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332854 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032855 request.Request(
2856 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2857 SocketTag(),
2858 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2859 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:012860 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:242861 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri231c2972016-03-08 19:50:112862 EXPECT_TRUE(stream.get());
2863
2864 // Cause QUIC stream to be created, but marked as non-migratable.
2865 HttpRequestInfo request_info;
Zhongyi Shibb28b1f2018-07-18 02:41:262866 request_info.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION_TO_CELLULAR;
Ramin Halavati683bcaa92018-02-14 08:42:392867 request_info.traffic_annotation =
2868 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:272869 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:392870 net_log_, CompletionOnceCallback()));
jri231c2972016-03-08 19:50:112871
2872 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502873 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri231c2972016-03-08 19:50:112874 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2875 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2876
2877 // Trigger connection migration. Since there is a non-migratable stream,
2878 // this should cause a RST_STREAM frame to be emitted with
Zhongyi Shic16b4102019-02-12 00:37:402879 // quic::QUIC_STREAM_CANCELLED error code.
2880 // The connection will then be migrated to the alternate network.
jri231c2972016-03-08 19:50:112881 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2882 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
2883
Zhongyi Shic16b4102019-02-12 00:37:402884 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2885 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2886 EXPECT_EQ(0u, session->GetNumActiveStreams());
jri231c2972016-03-08 19:50:112887
Zhongyi Shic16b4102019-02-12 00:37:402888 base::RunLoop().RunUntilIdle();
2889
2890 EXPECT_TRUE(failed_socket_data.AllReadDataConsumed());
2891 EXPECT_TRUE(failed_socket_data.AllWriteDataConsumed());
jri231c2972016-03-08 19:50:112892 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2893 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2894}
2895
jri9c541572016-03-29 17:51:482896TEST_P(QuicStreamFactoryTest,
jri9f303712016-09-13 01:10:222897 OnNetworkDisconnectedConnectionMigrationDisabled) {
Zhongyi Shi5f587cc2017-11-21 23:24:172898 InitializeConnectionMigrationV2Test(
2899 {kDefaultNetworkForTests, kNewNetworkForTests});
2900 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2901 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2902
2903 MockQuicData socket_data;
2904 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:432905 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
2906 socket_data.AddWrite(
Fan Yang32c5a112018-12-10 20:06:332907 SYNCHRONOUS, client_maker_.MakeRstPacket(
2908 2, true, GetNthClientInitiatedBidirectionalStreamId(0),
2909 quic::QUIC_RST_ACKNOWLEDGEMENT));
Zhongyi Shi5f587cc2017-11-21 23:24:172910 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri9c541572016-03-29 17:51:482911
2912 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:452913 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332914 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032915 request.Request(
2916 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2917 SocketTag(),
2918 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2919 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:012920 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:242921 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri9c541572016-03-29 17:51:482922 EXPECT_TRUE(stream.get());
2923
2924 // Cause QUIC stream to be created.
2925 HttpRequestInfo request_info;
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()));
jri9c541572016-03-29 17:51:482930
2931 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:502932 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri9c541572016-03-29 17:51:482933 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2934 EXPECT_TRUE(HasActiveSession(host_port_pair_));
2935
2936 // Set session config to have connection migration disabled.
Ryan Hamilton8d9ee76e2018-05-29 23:52:522937 quic::test::QuicConfigPeer::SetReceivedDisableConnectionMigration(
2938 session->config());
jri9c541572016-03-29 17:51:482939 EXPECT_TRUE(session->config()->DisableConnectionMigration());
2940
2941 // Trigger connection migration. Since there is a non-migratable stream,
2942 // this should cause a RST_STREAM frame to be emitted with
Ryan Hamilton8d9ee76e2018-05-29 23:52:522943 // quic::QUIC_RST_ACKNOWLEDGEMENT error code, and the session will be closed.
jri9c541572016-03-29 17:51:482944 scoped_mock_network_change_notifier_->mock_network_change_notifier()
2945 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
2946
2947 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2948 EXPECT_FALSE(HasActiveSession(host_port_pair_));
2949
2950 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2951 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2952}
2953
jri9f303712016-09-13 01:10:222954TEST_P(QuicStreamFactoryTest, OnNetworkMadeDefaultNoOpenStreams) {
Zhongyi Shi5f587cc2017-11-21 23:24:172955 InitializeConnectionMigrationV2Test(
2956 {kDefaultNetworkForTests, kNewNetworkForTests});
2957 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
2958 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
2959
2960 MockQuicData socket_data;
2961 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:432962 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:172963 socket_data.AddSocketDataToFactory(socket_factory_.get());
2964
Zhongyi Shic16b4102019-02-12 00:37:402965 // Set up the second socket data provider that is used for probing.
2966 MockQuicData quic_data1;
2967 // Connectivity probe to be sent on the new path.
2968 quic_data1.AddWrite(SYNCHRONOUS,
2969 client_maker_.MakeConnectivityProbingPacket(2, true));
2970 quic_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause
2971 // Connectivity probe to receive from the server.
2972 quic_data1.AddRead(ASYNC,
2973 server_maker_.MakeConnectivityProbingPacket(1, false));
2974 quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
2975 // Ping packet to send after migration is completed.
2976 quic_data1.AddWrite(SYNCHRONOUS,
2977 client_maker_.MakeAckAndPingPacket(3, false, 1, 1, 1));
2978 quic_data1.AddSocketDataToFactory(socket_factory_.get());
2979
Zhongyi Shi5f587cc2017-11-21 23:24:172980 // Create request and QuicHttpStream.
2981 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:332982 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:032983 request.Request(
2984 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
2985 SocketTag(),
2986 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
2987 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi5f587cc2017-11-21 23:24:172988 EXPECT_THAT(callback_.WaitForResult(), IsOk());
2989 std::unique_ptr<HttpStream> stream = CreateStream(&request);
2990 EXPECT_TRUE(stream.get());
2991
2992 // Ensure that session is alive and active.
2993 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
2994 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
2995 EXPECT_TRUE(HasActiveSession(host_port_pair_));
Zhongyi Shic16b4102019-02-12 00:37:402996 EXPECT_EQ(0u, session->GetNumActiveStreams());
2997 EXPECT_EQ(0u, session->GetNumDrainingStreams());
Zhongyi Shi5f587cc2017-11-21 23:24:172998
2999 // Trigger connection migration.
3000 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3001 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
Zhongyi Shic16b4102019-02-12 00:37:403002 // Verify that the session is still active.
3003 EXPECT_TRUE(HasActiveSession(host_port_pair_));
Zhongyi Shi5f587cc2017-11-21 23:24:173004
Zhongyi Shic16b4102019-02-12 00:37:403005 quic_data1.Resume();
3006 base::RunLoop().RunUntilIdle();
Zhongyi Shi5f587cc2017-11-21 23:24:173007
3008 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3009 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
Zhongyi Shic16b4102019-02-12 00:37:403010 EXPECT_TRUE(quic_data1.AllReadDataConsumed());
3011 EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
Zhongyi Shi5f587cc2017-11-21 23:24:173012}
3013
jri9f303712016-09-13 01:10:223014TEST_P(QuicStreamFactoryTest, OnNetworkDisconnectedNoOpenStreams) {
Zhongyi Shi5f587cc2017-11-21 23:24:173015 InitializeConnectionMigrationV2Test(
3016 {kDefaultNetworkForTests, kNewNetworkForTests});
3017 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3018 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3019
Zhongyi Shic16b4102019-02-12 00:37:403020 MockQuicData default_socket_data;
3021 default_socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3022 default_socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
3023 default_socket_data.AddSocketDataToFactory(socket_factory_.get());
3024
3025 // Set up second socket data provider that is used after migration.
3026 MockQuicData alternate_socket_data;
3027 alternate_socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
3028 // Ping packet to send after migration.
3029 alternate_socket_data.AddWrite(
3030 SYNCHRONOUS, client_maker_.MakePingPacket(2, /*include_version=*/true));
3031 alternate_socket_data.AddSocketDataToFactory(socket_factory_.get());
Zhongyi Shi5f587cc2017-11-21 23:24:173032
3033 // Create request and QuicHttpStream.
3034 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:333035 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:033036 request.Request(
3037 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
3038 SocketTag(),
3039 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
3040 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi5f587cc2017-11-21 23:24:173041 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3042 std::unique_ptr<HttpStream> stream = CreateStream(&request);
3043 EXPECT_TRUE(stream.get());
3044
Zhongyi Shic16b4102019-02-12 00:37:403045 // Ensure that session is active.
Zhongyi Shi5f587cc2017-11-21 23:24:173046 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3047
3048 // Trigger connection migration. Since there are no active streams,
3049 // the session will be closed.
3050 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3051 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
3052
Zhongyi Shic16b4102019-02-12 00:37:403053 EXPECT_TRUE(HasActiveSession(host_port_pair_));
Zhongyi Shi5f587cc2017-11-21 23:24:173054
Zhongyi Shic16b4102019-02-12 00:37:403055 EXPECT_TRUE(default_socket_data.AllReadDataConsumed());
3056 EXPECT_TRUE(default_socket_data.AllWriteDataConsumed());
3057 EXPECT_TRUE(alternate_socket_data.AllReadDataConsumed());
3058 EXPECT_TRUE(alternate_socket_data.AllWriteDataConsumed());
Zhongyi Shi5f587cc2017-11-21 23:24:173059}
3060
Zhongyi Shi9f316b262018-06-18 22:01:163061// This test verifies session migrates to the alternate network immediately when
3062// default network disconnects with a synchronous write before migration.
3063TEST_P(QuicStreamFactoryTest, MigrateOnDefaultNetworkDisconnectedSync) {
3064 TestMigrationOnNetworkDisconnected(/*async_write_before*/ false);
3065}
3066
3067// This test verifies session migrates to the alternate network immediately when
3068// default network disconnects with an asynchronously write before migration.
3069TEST_P(QuicStreamFactoryTest, MigrateOnDefaultNetworkDisconnectedAsync) {
3070 TestMigrationOnNetworkDisconnected(/*async_write_before*/ true);
3071}
3072
3073void QuicStreamFactoryTestBase::TestMigrationOnNetworkDisconnected(
3074 bool async_write_before) {
3075 InitializeConnectionMigrationV2Test(
3076 {kDefaultNetworkForTests, kNewNetworkForTests});
3077 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3078 ->NotifyNetworkMadeDefault(kDefaultNetworkForTests);
3079 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3080 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3081 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3082
3083 // Use the test task runner.
3084 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
3085
3086 int packet_number = 1;
3087 MockQuicData socket_data;
3088 quic::QuicStreamOffset header_stream_offset = 0;
3089 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3090 socket_data.AddWrite(
3091 SYNCHRONOUS,
3092 ConstructInitialSettingsPacket(packet_number++, &header_stream_offset));
3093 socket_data.AddWrite(
Fan Yang32c5a112018-12-10 20:06:333094 SYNCHRONOUS,
3095 ConstructGetRequestPacket(packet_number++,
3096 GetNthClientInitiatedBidirectionalStreamId(0),
3097 true, true, &header_stream_offset));
Zhongyi Shi9f316b262018-06-18 22:01:163098 if (async_write_before) {
3099 socket_data.AddWrite(ASYNC, OK);
3100 packet_number++;
3101 }
3102 socket_data.AddSocketDataToFactory(socket_factory_.get());
3103
3104 // Create request and QuicHttpStream.
3105 QuicStreamRequest request(factory_.get());
3106 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:033107 request.Request(
3108 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
3109 SocketTag(),
3110 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
3111 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi9f316b262018-06-18 22:01:163112 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3113 std::unique_ptr<HttpStream> stream = CreateStream(&request);
3114 EXPECT_TRUE(stream.get());
3115
3116 // Cause QUIC stream to be created.
3117 HttpRequestInfo request_info;
3118 request_info.method = "GET";
3119 request_info.url = url_;
3120 request_info.traffic_annotation =
3121 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
3122 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
3123 net_log_, CompletionOnceCallback()));
3124
3125 // Ensure that session is alive and active.
3126 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
3127 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3128 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3129
3130 // Send GET request on stream.
3131 HttpResponseInfo response;
3132 HttpRequestHeaders request_headers;
3133 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
3134 callback_.callback()));
3135
Zhongyi Shi22fd5f52018-06-20 17:39:093136 if (async_write_before)
Zhongyi Shi9f316b262018-06-18 22:01:163137 session->SendPing();
Zhongyi Shi9f316b262018-06-18 22:01:163138
3139 // Set up second socket data provider that is used after migration.
3140 // The response to the earlier request is read on this new socket.
3141 MockQuicData socket_data1;
3142 socket_data1.AddWrite(
3143 SYNCHRONOUS,
3144 client_maker_.MakePingPacket(packet_number++, /*include_version=*/true));
3145 socket_data1.AddRead(
Fan Yang32c5a112018-12-10 20:06:333146 ASYNC,
3147 ConstructOkResponsePacket(
3148 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
Zhongyi Shi9f316b262018-06-18 22:01:163149 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3150 socket_data1.AddWrite(
Fan Yang32c5a112018-12-10 20:06:333151 SYNCHRONOUS,
3152 client_maker_.MakeAckAndRstPacket(
3153 packet_number++, false, GetNthClientInitiatedBidirectionalStreamId(0),
3154 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi9f316b262018-06-18 22:01:163155 socket_data1.AddSocketDataToFactory(socket_factory_.get());
3156
3157 // Trigger connection migration.
3158 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3159 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
3160
3161 // The connection should still be alive, not marked as going away.
3162 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3163 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3164 EXPECT_EQ(1u, session->GetNumActiveStreams());
3165 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
3166
3167 // Ensure that the session is still alive.
3168 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3169 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3170 EXPECT_EQ(1u, session->GetNumActiveStreams());
3171
3172 // Run the message loop so that data queued in the new socket is read by the
3173 // packet reader.
3174 runner_->RunNextTask();
3175
3176 // Response headers are received over the new network.
3177 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3178 EXPECT_EQ(200, response.headers->response_code());
3179
3180 // Check that the session is still alive.
3181 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3182 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3183
3184 // There should be posted tasks not executed, which is to migrate back to
3185 // default network.
3186 EXPECT_FALSE(runner_->GetPostedTasks().empty());
3187
3188 // Receive signal to mark new network as default.
3189 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3190 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
3191
3192 stream.reset();
3193 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3194 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3195 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
3196 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
3197}
3198
Zhongyi Shi5f587cc2017-11-21 23:24:173199// This test receives NCN signals in the following order:
3200// - default network disconnected
3201// - after a pause, new network is connected.
3202// - new network is made default.
3203TEST_P(QuicStreamFactoryTest, NewNetworkConnectedAfterNoNetwork) {
3204 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
3205 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3206 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3207 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3208
3209 // Use the test task runner.
3210 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
3211
3212 MockQuicData socket_data;
Ryan Hamilton8d9ee76e2018-05-29 23:52:523213 quic::QuicStreamOffset header_stream_offset = 0;
Zhongyi Shi5f587cc2017-11-21 23:24:173214 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3215 socket_data.AddWrite(
Zhongyi Shi32f2fd02018-04-16 18:23:433216 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
Fan Yang32c5a112018-12-10 20:06:333217 socket_data.AddWrite(
3218 SYNCHRONOUS, ConstructGetRequestPacket(
3219 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
3220 true, &header_stream_offset));
Zhongyi Shi5f587cc2017-11-21 23:24:173221 socket_data.AddSocketDataToFactory(socket_factory_.get());
3222
3223 // Create request and QuicHttpStream.
3224 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:333225 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:033226 request.Request(
3227 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
3228 SocketTag(),
3229 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
3230 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi5f587cc2017-11-21 23:24:173231 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3232 std::unique_ptr<HttpStream> stream = CreateStream(&request);
3233 EXPECT_TRUE(stream.get());
3234
3235 // Cause QUIC stream to be created.
3236 HttpRequestInfo request_info;
3237 request_info.method = "GET";
3238 request_info.url = url_;
Ramin Halavati683bcaa92018-02-14 08:42:393239 request_info.traffic_annotation =
3240 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:273241 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:393242 net_log_, CompletionOnceCallback()));
Zhongyi Shi5f587cc2017-11-21 23:24:173243
3244 // Ensure that session is alive and active.
3245 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
3246 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3247 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3248
3249 // Send GET request on stream.
3250 HttpResponseInfo response;
3251 HttpRequestHeaders request_headers;
3252 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
3253 callback_.callback()));
3254
3255 // Trigger connection migration. Since there are no networks
3256 // to migrate to, this should cause the session to wait for a new network.
3257 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3258 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
3259
3260 // The connection should still be alive, not marked as going away.
3261 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3262 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3263 EXPECT_EQ(1u, session->GetNumActiveStreams());
3264 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
3265
3266 // Set up second socket data provider that is used after migration.
3267 // The response to the earlier request is read on this new socket.
3268 MockQuicData socket_data1;
3269 socket_data1.AddWrite(
Zhongyi Shi32f2fd02018-04-16 18:23:433270 SYNCHRONOUS, client_maker_.MakePingPacket(3, /*include_version=*/true));
3271 socket_data1.AddRead(
Fan Yang32c5a112018-12-10 20:06:333272 ASYNC,
3273 ConstructOkResponsePacket(
3274 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
Zhongyi Shi5f587cc2017-11-21 23:24:173275 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Fan Yang32c5a112018-12-10 20:06:333276 socket_data1.AddWrite(
3277 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
3278 4, false, GetNthClientInitiatedBidirectionalStreamId(0),
3279 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi5f587cc2017-11-21 23:24:173280 socket_data1.AddSocketDataToFactory(socket_factory_.get());
3281
3282 // Add a new network and notify the stream factory of a new connected network.
3283 // This causes a PING packet to be sent over the new network.
3284 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3285 ->SetConnectedNetworksList({kNewNetworkForTests});
3286 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3287 ->NotifyNetworkConnected(kNewNetworkForTests);
3288
3289 // Ensure that the session is still alive.
3290 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3291 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3292 EXPECT_EQ(1u, session->GetNumActiveStreams());
3293
3294 // Run the message loop so that data queued in the new socket is read by the
3295 // packet reader.
3296 runner_->RunNextTask();
3297
3298 // Response headers are received over the new network.
3299 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3300 EXPECT_EQ(200, response.headers->response_code());
3301
3302 // Check that the session is still alive.
3303 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3304 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3305
3306 // There should posted tasks not executed, which is to migrate back to default
3307 // network.
3308 EXPECT_FALSE(runner_->GetPostedTasks().empty());
3309
3310 // Receive signal to mark new network as default.
3311 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3312 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
3313
3314 stream.reset();
3315 EXPECT_TRUE(socket_data.AllReadDataConsumed());
3316 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
3317 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
3318 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
3319}
3320
Zhongyi Shid3d5f502018-08-10 00:22:223321// Regression test for http://crbug.com/872011.
3322// This test verifies that migrate to the probing socket will not trigger
3323// new packets being read synchronously and generate ACK frame while
3324// processing the initial connectivity probe response, which may cause a
3325// connection being closed with INTERNAL_ERROR as pending ACK frame is not
3326// allowed when processing a new packet.
Zhongyi Shi6a7323b2018-12-07 01:26:323327TEST_P(QuicStreamFactoryTest, MigrateToProbingSocket) {
Zhongyi Shid3d5f502018-08-10 00:22:223328 InitializeConnectionMigrationV2Test(
3329 {kDefaultNetworkForTests, kNewNetworkForTests});
3330 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3331 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3332 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3333
3334 // Using a testing task runner so that we can control time.
3335 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
3336 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
3337
3338 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3339 ->QueueNetworkMadeDefault(kDefaultNetworkForTests);
3340
3341 int packet_number = 1;
3342 MockQuicData quic_data1;
3343 quic::QuicStreamOffset header_stream_offset = 0;
3344 quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging Read.
3345 quic_data1.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket(
3346 packet_number++, &header_stream_offset));
3347 quic_data1.AddWrite(
Fan Yang32c5a112018-12-10 20:06:333348 SYNCHRONOUS,
3349 ConstructGetRequestPacket(packet_number++,
3350 GetNthClientInitiatedBidirectionalStreamId(0),
3351 true, true, &header_stream_offset));
Zhongyi Shid3d5f502018-08-10 00:22:223352 quic_data1.AddSocketDataToFactory(socket_factory_.get());
3353
3354 // Set up the second socket data provider that is used for probing on the
3355 // alternate network.
3356 MockQuicData quic_data2;
3357 // Connectivity probe to be sent on the new path.
3358 quic_data2.AddWrite(SYNCHRONOUS, client_maker_.MakeConnectivityProbingPacket(
3359 packet_number++, true));
3360 quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // Pause
3361 // First connectivity probe to receive from the server, which will complete
3362 // connection migraiton on path degrading.
3363 quic_data2.AddRead(ASYNC,
3364 server_maker_.MakeConnectivityProbingPacket(1, false));
3365 // Read multiple connectivity probes synchronously.
3366 quic_data2.AddRead(SYNCHRONOUS,
3367 server_maker_.MakeConnectivityProbingPacket(2, false));
3368 quic_data2.AddRead(SYNCHRONOUS,
3369 server_maker_.MakeConnectivityProbingPacket(3, false));
3370 quic_data2.AddRead(SYNCHRONOUS,
3371 server_maker_.MakeConnectivityProbingPacket(4, false));
3372 quic_data2.AddWrite(
3373 ASYNC, client_maker_.MakeAckPacket(packet_number++, 1, 4, 1, 1, true));
3374 quic_data2.AddRead(
Fan Yang32c5a112018-12-10 20:06:333375 ASYNC,
3376 ConstructOkResponsePacket(
3377 5, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
Zhongyi Shid3d5f502018-08-10 00:22:223378 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3379 quic_data2.AddWrite(
Fan Yang32c5a112018-12-10 20:06:333380 SYNCHRONOUS,
3381 client_maker_.MakeAckAndRstPacket(
3382 packet_number++, false, GetNthClientInitiatedBidirectionalStreamId(0),
3383 quic::QUIC_STREAM_CANCELLED, 5, 1, 1, true));
Zhongyi Shid3d5f502018-08-10 00:22:223384 quic_data2.AddSocketDataToFactory(socket_factory_.get());
3385
3386 // Create request and QuicHttpStream.
3387 QuicStreamRequest request(factory_.get());
3388 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:033389 request.Request(
3390 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
3391 SocketTag(),
3392 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
3393 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shid3d5f502018-08-10 00:22:223394 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3395 std::unique_ptr<HttpStream> stream = CreateStream(&request);
3396 EXPECT_TRUE(stream.get());
3397
3398 // Cause QUIC stream to be created.
3399 HttpRequestInfo request_info;
3400 request_info.method = "GET";
3401 request_info.url = url_;
3402 request_info.traffic_annotation =
3403 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
3404 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
3405 net_log_, CompletionOnceCallback()));
3406
3407 // Ensure that session is alive and active.
3408 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
3409 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3410 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3411
3412 // Send GET request on stream.
3413 HttpResponseInfo response;
3414 HttpRequestHeaders request_headers;
3415 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
3416 callback_.callback()));
3417
3418 // Cause the connection to report path degrading to the session.
3419 // Session will start to probe the alternate network.
3420 session->connection()->OnPathDegradingTimeout();
3421
3422 // Next connectivity probe is scheduled to be sent in 2 *
3423 // kDefaultRTTMilliSecs.
3424 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
3425 base::TimeDelta next_task_delay = task_runner->NextPendingTaskDelay();
3426 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
3427 next_task_delay);
3428
3429 // The connection should still be alive, and not marked as going away.
3430 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3431 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3432 EXPECT_EQ(1u, session->GetNumActiveStreams());
3433 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
3434
3435 // Resume quic data and a connectivity probe response will be read on the new
3436 // socket.
3437 quic_data2.Resume();
3438
3439 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3440 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3441 EXPECT_EQ(1u, session->GetNumActiveStreams());
3442
3443 // There should be three pending tasks, the nearest one will complete
3444 // migration to the new network.
3445 EXPECT_EQ(3u, task_runner->GetPendingTaskCount());
3446 next_task_delay = task_runner->NextPendingTaskDelay();
3447 EXPECT_EQ(base::TimeDelta(), next_task_delay);
3448 task_runner->FastForwardBy(next_task_delay);
3449
3450 // Response headers are received over the new network.
3451 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3452 EXPECT_EQ(200, response.headers->response_code());
3453
3454 // Now there are two pending tasks, the nearest one was to send connectivity
3455 // probe and has been cancelled due to successful migration.
3456 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
3457 next_task_delay = task_runner->NextPendingTaskDelay();
3458 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
3459 next_task_delay);
3460 task_runner->FastForwardBy(next_task_delay);
3461
3462 // There's one more task to mgirate back to the default network in 0.4s.
3463 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
3464 next_task_delay = task_runner->NextPendingTaskDelay();
3465 base::TimeDelta expected_delay =
3466 base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs) -
3467 base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs);
3468 EXPECT_EQ(expected_delay, next_task_delay);
3469
3470 // Deliver a signal that the alternate network now becomes default to session,
3471 // this will cancel mgirate back to default network timer.
3472 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3473 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
3474
3475 task_runner->FastForwardBy(next_task_delay);
3476 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
3477
3478 // Verify that the session is still alive.
3479 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3480 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3481
3482 stream.reset();
3483 EXPECT_TRUE(quic_data1.AllReadDataConsumed());
3484 EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
3485 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
3486 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
3487}
3488
Zhongyi Shic4823bd2018-04-27 00:49:193489// This test verifies that the connection migrates to the alternate network
Zhongyi Shi22fd5f52018-06-20 17:39:093490// early when path degrading is detected with an ASYNCHRONOUS write before
3491// migration.
3492TEST_P(QuicStreamFactoryTest, MigrateEarlyOnPathDegradingAysnc) {
3493 TestMigrationOnPathDegrading(/*async_write_before_migration*/ true);
3494}
3495
3496// This test verifies that the connection migrates to the alternate network
3497// early when path degrading is detected with a SYNCHRONOUS write before
3498// migration.
3499TEST_P(QuicStreamFactoryTest, MigrateEarlyOnPathDegradingSync) {
3500 TestMigrationOnPathDegrading(/*async_write_before_migration*/ false);
3501}
3502
3503void QuicStreamFactoryTestBase::TestMigrationOnPathDegrading(
3504 bool async_write_before) {
Zhongyi Shic4823bd2018-04-27 00:49:193505 InitializeConnectionMigrationV2Test(
3506 {kDefaultNetworkForTests, kNewNetworkForTests});
3507 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3508 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3509 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3510
3511 // Using a testing task runner so that we can control time.
3512 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
3513 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
3514
3515 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3516 ->QueueNetworkMadeDefault(kDefaultNetworkForTests);
3517
Zhongyi Shi22fd5f52018-06-20 17:39:093518 int packet_number = 1;
Zhongyi Shic4823bd2018-04-27 00:49:193519 MockQuicData quic_data1;
Ryan Hamilton8d9ee76e2018-05-29 23:52:523520 quic::QuicStreamOffset header_stream_offset = 0;
Zhongyi Shic4823bd2018-04-27 00:49:193521 quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging Read.
Zhongyi Shi22fd5f52018-06-20 17:39:093522 quic_data1.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket(
3523 packet_number++, &header_stream_offset));
3524 quic_data1.AddWrite(
Fan Yang32c5a112018-12-10 20:06:333525 SYNCHRONOUS,
3526 ConstructGetRequestPacket(packet_number++,
3527 GetNthClientInitiatedBidirectionalStreamId(0),
3528 true, true, &header_stream_offset));
Zhongyi Shi22fd5f52018-06-20 17:39:093529 if (async_write_before) {
3530 quic_data1.AddWrite(ASYNC, OK);
3531 packet_number++;
3532 }
Zhongyi Shic4823bd2018-04-27 00:49:193533 quic_data1.AddSocketDataToFactory(socket_factory_.get());
3534
3535 // Set up the second socket data provider that is used after migration.
3536 // The response to the earlier request is read on the new socket.
3537 MockQuicData quic_data2;
3538 // Connectivity probe to be sent on the new path.
Zhongyi Shi22fd5f52018-06-20 17:39:093539 quic_data2.AddWrite(SYNCHRONOUS, client_maker_.MakeConnectivityProbingPacket(
Zhongyi Shi879659422018-08-02 17:58:253540 packet_number++, true));
Zhongyi Shic4823bd2018-04-27 00:49:193541 quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // Pause
3542 // Connectivity probe to receive from the server.
Zhongyi Shi879659422018-08-02 17:58:253543 quic_data2.AddRead(ASYNC,
3544 server_maker_.MakeConnectivityProbingPacket(1, false));
Zhongyi Shic4823bd2018-04-27 00:49:193545 // Ping packet to send after migration is completed.
Zhongyi Shi22fd5f52018-06-20 17:39:093546 quic_data2.AddWrite(ASYNC, client_maker_.MakeAckAndPingPacket(
3547 packet_number++, false, 1, 1, 1));
Ryan Hamiltona3ee93a72018-08-01 22:03:083548 quic_data2.AddRead(
Fan Yang32c5a112018-12-10 20:06:333549 ASYNC,
3550 ConstructOkResponsePacket(
3551 2, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
Zhongyi Shic4823bd2018-04-27 00:49:193552 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi22fd5f52018-06-20 17:39:093553 quic_data2.AddWrite(
Fan Yang32c5a112018-12-10 20:06:333554 SYNCHRONOUS,
3555 client_maker_.MakeAckAndRstPacket(
3556 packet_number++, false, GetNthClientInitiatedBidirectionalStreamId(0),
3557 quic::QUIC_STREAM_CANCELLED, 2, 2, 1, true));
Zhongyi Shic4823bd2018-04-27 00:49:193558 quic_data2.AddSocketDataToFactory(socket_factory_.get());
3559
3560 // Create request and QuicHttpStream.
3561 QuicStreamRequest request(factory_.get());
3562 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:033563 request.Request(
3564 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
3565 SocketTag(),
3566 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
3567 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shic4823bd2018-04-27 00:49:193568 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3569 std::unique_ptr<HttpStream> stream = CreateStream(&request);
3570 EXPECT_TRUE(stream.get());
3571
3572 // Cause QUIC stream to be created.
3573 HttpRequestInfo request_info;
3574 request_info.method = "GET";
3575 request_info.url = url_;
3576 request_info.traffic_annotation =
3577 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
3578 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
3579 net_log_, CompletionOnceCallback()));
3580
3581 // Ensure that session is alive and active.
3582 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
3583 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3584 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3585
3586 // Send GET request on stream.
3587 HttpResponseInfo response;
3588 HttpRequestHeaders request_headers;
3589 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
3590 callback_.callback()));
3591
Zhongyi Shi22fd5f52018-06-20 17:39:093592 if (async_write_before)
3593 session->SendPing();
3594
Zhongyi Shiaba4a832018-04-30 20:29:083595 // Cause the connection to report path degrading to the session.
3596 // Session will start to probe the alternate network.
3597 session->connection()->OnPathDegradingTimeout();
3598
3599 // Next connectivity probe is scheduled to be sent in 2 *
3600 // kDefaultRTTMilliSecs.
3601 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
3602 base::TimeDelta next_task_delay = task_runner->NextPendingTaskDelay();
3603 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
3604 next_task_delay);
3605
3606 // The connection should still be alive, and not marked as going away.
3607 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3608 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3609 EXPECT_EQ(1u, session->GetNumActiveStreams());
3610 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
3611
3612 // Resume quic data and a connectivity probe response will be read on the new
3613 // socket.
3614 quic_data2.Resume();
3615
3616 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3617 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3618 EXPECT_EQ(1u, session->GetNumActiveStreams());
3619
3620 // There should be three pending tasks, the nearest one will complete
3621 // migration to the new network.
3622 EXPECT_EQ(3u, task_runner->GetPendingTaskCount());
3623 next_task_delay = task_runner->NextPendingTaskDelay();
3624 EXPECT_EQ(base::TimeDelta(), next_task_delay);
3625 task_runner->FastForwardBy(next_task_delay);
3626
3627 // Response headers are received over the new network.
3628 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3629 EXPECT_EQ(200, response.headers->response_code());
3630
3631 // Now there are two pending tasks, the nearest one was to send connectivity
3632 // probe and has been cancelled due to successful migration.
3633 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
3634 next_task_delay = task_runner->NextPendingTaskDelay();
3635 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
3636 next_task_delay);
3637 task_runner->FastForwardBy(next_task_delay);
3638
3639 // There's one more task to mgirate back to the default network in 0.4s.
3640 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
3641 next_task_delay = task_runner->NextPendingTaskDelay();
3642 base::TimeDelta expected_delay =
3643 base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs) -
3644 base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs);
3645 EXPECT_EQ(expected_delay, next_task_delay);
3646
3647 // Deliver a signal that the alternate network now becomes default to session,
3648 // this will cancel mgirate back to default network timer.
3649 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3650 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
3651
3652 task_runner->FastForwardBy(next_task_delay);
3653 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
3654
3655 // Verify that the session is still alive.
3656 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3657 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3658
3659 stream.reset();
3660 EXPECT_TRUE(quic_data1.AllReadDataConsumed());
3661 EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
3662 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
3663 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
3664}
3665
Renjiea5722ccf2018-08-10 00:18:493666// This test verifies that the session marks itself GOAWAY on path degrading
3667// and it does not receive any new request
3668TEST_P(QuicStreamFactoryTest, GoawayOnPathDegrading) {
Zhongyi Shi967d2f12019-02-08 20:58:533669 test_params_.quic_go_away_on_path_degrading = true;
Renjiea5722ccf2018-08-10 00:18:493670 Initialize();
3671 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3672 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3673 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3674
3675 MockQuicData quic_data1;
3676 quic::QuicStreamOffset header_stream_offset = 0;
3677 quic_data1.AddWrite(SYNCHRONOUS,
3678 ConstructInitialSettingsPacket(1, &header_stream_offset));
Fan Yang32c5a112018-12-10 20:06:333679 quic_data1.AddWrite(
3680 SYNCHRONOUS, ConstructGetRequestPacket(
3681 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
3682 true, &header_stream_offset));
Renjiea5722ccf2018-08-10 00:18:493683 quic_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause
3684 quic_data1.AddRead(
Fan Yang32c5a112018-12-10 20:06:333685 ASYNC,
3686 ConstructOkResponsePacket(
3687 1, GetNthClientInitiatedBidirectionalStreamId(0), false, true));
Renjiea5722ccf2018-08-10 00:18:493688 quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
3689 quic_data1.AddSocketDataToFactory(socket_factory_.get());
3690
3691 MockQuicData quic_data2;
3692 quic::QuicStreamOffset header_stream_offset2 = 0;
3693 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
3694 quic_data2.AddWrite(
3695 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset2));
3696 quic_data2.AddSocketDataToFactory(socket_factory_.get());
3697
3698 // Creat request and QuicHttpStream.
3699 QuicStreamRequest request(factory_.get());
3700 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:033701 request.Request(
3702 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
3703 SocketTag(),
3704 /*cerf_verify_flags=*/0, url_, net_log_, &net_error_details_,
3705 failed_on_default_network_callback_, callback_.callback()));
Renjiea5722ccf2018-08-10 00:18:493706 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3707 std::unique_ptr<HttpStream> stream = CreateStream(&request);
3708 EXPECT_TRUE(stream.get());
3709
3710 // Cause QUIC stream to be created.
3711 HttpRequestInfo request_info;
3712 request_info.method = "GET";
3713 request_info.url = url_;
3714 request_info.traffic_annotation =
3715 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
3716 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
3717 net_log_, CompletionOnceCallback()));
3718
3719 // Ensure that session is alive and active.
3720 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
3721 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3722 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3723
3724 // Send GET request on stream.
3725 HttpResponseInfo response;
3726 HttpRequestHeaders request_headers;
3727 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
3728 callback_.callback()));
3729
3730 // Trigger the connection to report path degrading to the session.
3731 // Session will mark itself GOAWAY.
3732 session->connection()->OnPathDegradingTimeout();
3733
3734 // The connection should still be alive, but marked as going away.
3735 EXPECT_FALSE(HasActiveSession(host_port_pair_));
3736 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3737 EXPECT_EQ(1u, session->GetNumActiveStreams());
3738
3739 // Second request should be sent on a new connection.
3740 QuicStreamRequest request2(factory_.get());
3741 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:033742 request2.Request(
3743 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
3744 SocketTag(),
3745 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
3746 failed_on_default_network_callback_, callback_.callback()));
Renjiea5722ccf2018-08-10 00:18:493747 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3748 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
3749 EXPECT_TRUE(stream2.get());
3750
3751 // Resume the data, verify old request can read response on the old session
3752 // successfully.
3753 quic_data1.Resume();
3754 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
3755 EXPECT_EQ(200, response.headers->response_code());
3756 EXPECT_EQ(0U, session->GetNumActiveStreams());
3757
3758 // Check an active session exists for the destination.
3759 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3760 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3761 QuicChromiumClientSession* session2 = GetActiveSession(host_port_pair_);
3762 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session2));
3763 EXPECT_NE(session, session2);
3764
3765 stream.reset();
3766 stream2.reset();
3767 EXPECT_TRUE(quic_data1.AllReadDataConsumed());
3768 EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
3769 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
3770 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
3771}
3772
Zhongyi Shibb770d92018-06-16 02:07:003773// This test verifies that the connection will not migrate to a bad socket
3774// when path degrading is detected.
3775TEST_P(QuicStreamFactoryTest, DoNotMigrateToBadSocketOnPathDegrading) {
3776 InitializeConnectionMigrationV2Test(
3777 {kDefaultNetworkForTests, kNewNetworkForTests});
3778 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3779 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3780 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3781
3782 // Using a testing task runner so that we can control time.
3783 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
3784 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
3785
3786 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3787 ->QueueNetworkMadeDefault(kDefaultNetworkForTests);
3788
3789 MockQuicData quic_data;
3790 quic::QuicStreamOffset header_stream_offset = 0;
3791 quic_data.AddWrite(SYNCHRONOUS,
3792 ConstructInitialSettingsPacket(1, &header_stream_offset));
Zhongyi Shibb770d92018-06-16 02:07:003793 quic_data.AddWrite(SYNCHRONOUS,
Fan Yang32c5a112018-12-10 20:06:333794 ConstructGetRequestPacket(
3795 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
3796 true, &header_stream_offset));
3797 quic_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause
3798 quic_data.AddRead(ASYNC, ConstructOkResponsePacket(
3799 1, GetNthClientInitiatedBidirectionalStreamId(0),
3800 false, false));
3801 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3802 quic_data.AddWrite(
3803 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
3804 3, false, GetNthClientInitiatedBidirectionalStreamId(0),
3805 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shibb770d92018-06-16 02:07:003806 quic_data.AddSocketDataToFactory(socket_factory_.get());
3807
3808 // Set up second socket that will immediately return disconnected.
3809 // The stream factory will abort probe the alternate network.
3810 MockConnect bad_connect = MockConnect(SYNCHRONOUS, ERR_INTERNET_DISCONNECTED);
3811 SequencedSocketData socket_data(bad_connect, base::span<MockRead>(),
3812 base::span<MockWrite>());
3813 socket_factory_->AddSocketDataProvider(&socket_data);
3814
3815 // Create request and QuicHttpStream.
3816 QuicStreamRequest request(factory_.get());
3817 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:033818 request.Request(
3819 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
3820 SocketTag(),
3821 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
3822 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shibb770d92018-06-16 02:07:003823 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3824 std::unique_ptr<HttpStream> stream = CreateStream(&request);
3825 EXPECT_TRUE(stream.get());
3826
3827 // Cause QUIC stream to be created.
3828 HttpRequestInfo request_info;
3829 request_info.method = "GET";
3830 request_info.url = url_;
3831 request_info.traffic_annotation =
3832 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
3833 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
3834 net_log_, CompletionOnceCallback()));
3835
3836 // Ensure that session is alive and active.
3837 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
3838 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3839 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3840
3841 // Send GET request on stream.
3842 HttpResponseInfo response;
3843 HttpRequestHeaders request_headers;
3844 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
3845 callback_.callback()));
3846
3847 // Cause the connection to report path degrading to the session.
3848 // Session will start to probe the alternate network.
3849 session->connection()->OnPathDegradingTimeout();
3850
3851 // The connection should still be alive, and not marked as going away.
3852 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3853 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3854 EXPECT_EQ(1u, session->GetNumActiveStreams());
3855 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
3856
3857 // Resume the data, and response header is received over the original network.
3858 quic_data.Resume();
3859 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3860 EXPECT_EQ(200, response.headers->response_code());
3861
3862 // Verify there is no pending task as probing alternate network is halted.
3863 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
3864
3865 // Verify that the session is still alive.
3866 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3867 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3868
3869 stream.reset();
3870 EXPECT_TRUE(quic_data.AllReadDataConsumed());
3871 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
3872}
3873
Zhongyi Shif5cc30392018-05-30 18:25:153874// Regression test for http://crbug.com/847569.
3875// This test verifies that the connection migrates to the alternate network
3876// early when there is no active stream but a draining stream.
Zhongyi Shib3bc982c2018-07-10 19:59:243877// The first packet being written after migration is a synchrnous write, which
3878// will cause a PING packet being sent.
3879TEST_P(QuicStreamFactoryTest, MigrateSessionWithDrainingStreamSync) {
3880 TestMigrateSessionWithDrainingStream(SYNCHRONOUS);
3881}
3882
3883// Regression test for http://crbug.com/847569.
3884// This test verifies that the connection migrates to the alternate network
3885// early when there is no active stream but a draining stream.
3886// The first packet being written after migration is an asynchronous write, no
3887// PING packet will be sent.
3888TEST_P(QuicStreamFactoryTest, MigrateSessionWithDrainingStreamAsync) {
3889 TestMigrateSessionWithDrainingStream(ASYNC);
3890}
3891
3892void QuicStreamFactoryTestBase::TestMigrateSessionWithDrainingStream(
3893 IoMode write_mode_for_queued_packet) {
Zhongyi Shif5cc30392018-05-30 18:25:153894 InitializeConnectionMigrationV2Test(
3895 {kDefaultNetworkForTests, kNewNetworkForTests});
3896 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
3897 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3898 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
3899
3900 // Using a testing task runner so that we can control time.
3901 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
3902 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
3903
3904 scoped_mock_network_change_notifier_->mock_network_change_notifier()
3905 ->QueueNetworkMadeDefault(kDefaultNetworkForTests);
3906
Zhongyi Shib3bc982c2018-07-10 19:59:243907 int packet_number = 1;
Zhongyi Shif5cc30392018-05-30 18:25:153908 MockQuicData quic_data1;
3909 quic::QuicStreamOffset header_stream_offset = 0;
Zhongyi Shib3bc982c2018-07-10 19:59:243910 quic_data1.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket(
3911 packet_number++, &header_stream_offset));
3912 quic_data1.AddWrite(
Fan Yang32c5a112018-12-10 20:06:333913 SYNCHRONOUS,
3914 ConstructGetRequestPacket(packet_number++,
3915 GetNthClientInitiatedBidirectionalStreamId(0),
3916 true, true, &header_stream_offset));
Zhongyi Shif5cc30392018-05-30 18:25:153917 // Read an out of order packet with FIN to drain the stream.
3918 quic_data1.AddRead(
Fan Yang32c5a112018-12-10 20:06:333919 ASYNC, ConstructOkResponsePacket(
3920 2, GetNthClientInitiatedBidirectionalStreamId(0), false,
3921 true)); // keep sending version.
Zhongyi Shib3bc982c2018-07-10 19:59:243922 quic_data1.AddWrite(SYNCHRONOUS, client_maker_.MakeAckPacket(
3923 packet_number++, 2, 2, 2, 1, true));
Zhongyi Shif5cc30392018-05-30 18:25:153924 quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3925 quic_data1.AddSocketDataToFactory(socket_factory_.get());
3926
3927 // Set up the second socket data provider that is used after migration.
3928 MockQuicData quic_data2;
3929 // Connectivity probe to be sent on the new path.
Zhongyi Shib3bc982c2018-07-10 19:59:243930 quic_data2.AddWrite(SYNCHRONOUS, client_maker_.MakeConnectivityProbingPacket(
Zhongyi Shi879659422018-08-02 17:58:253931 packet_number++, false));
Zhongyi Shif5cc30392018-05-30 18:25:153932 quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // Pause
3933 // Connectivity probe to receive from the server.
Zhongyi Shi879659422018-08-02 17:58:253934 quic_data2.AddRead(ASYNC,
3935 server_maker_.MakeConnectivityProbingPacket(3, false));
Zhongyi Shif5cc30392018-05-30 18:25:153936 // Ping packet to send after migration is completed.
Zhongyi Shib3bc982c2018-07-10 19:59:243937 quic_data2.AddWrite(
3938 write_mode_for_queued_packet,
3939 client_maker_.MakeAckPacket(packet_number++, 2, 3, 3, 1, true));
3940 if (write_mode_for_queued_packet == SYNCHRONOUS) {
3941 quic_data2.AddWrite(ASYNC,
3942 client_maker_.MakePingPacket(packet_number++, false));
3943 }
Zhongyi Shif5cc30392018-05-30 18:25:153944 quic_data2.AddRead(
Fan Yang32c5a112018-12-10 20:06:333945 ASYNC,
3946 ConstructOkResponsePacket(
3947 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
Zhongyi Shib3bc982c2018-07-10 19:59:243948 quic_data2.AddWrite(SYNCHRONOUS, client_maker_.MakeAckPacket(
3949 packet_number++, 1, 3, 1, 1, true));
Zhongyi Shif5cc30392018-05-30 18:25:153950 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
3951 quic_data2.AddSocketDataToFactory(socket_factory_.get());
3952
3953 // Create request and QuicHttpStream.
3954 QuicStreamRequest request(factory_.get());
3955 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:033956 request.Request(
3957 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
3958 SocketTag(),
3959 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
3960 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shif5cc30392018-05-30 18:25:153961 EXPECT_THAT(callback_.WaitForResult(), IsOk());
3962 std::unique_ptr<HttpStream> stream = CreateStream(&request);
3963 EXPECT_TRUE(stream.get());
3964
3965 // Cause QUIC stream to be created.
3966 HttpRequestInfo request_info;
3967 request_info.method = "GET";
3968 request_info.url = url_;
3969 request_info.traffic_annotation =
3970 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
3971 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
3972 net_log_, CompletionOnceCallback()));
3973
3974 // Ensure that session is alive and active.
3975 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
3976 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
3977 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3978
3979 // Send GET request on stream.
3980 HttpResponseInfo response;
3981 HttpRequestHeaders request_headers;
3982 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
3983 callback_.callback()));
3984
3985 // Run the message loop to receive the out of order packet which contains a
3986 // FIN and drains the stream.
3987 base::RunLoop().RunUntilIdle();
3988 EXPECT_EQ(0u, session->GetNumActiveStreams());
3989
3990 // Cause the connection to report path degrading to the session.
3991 // Session should still start to probe the alternate network.
3992 session->connection()->OnPathDegradingTimeout();
3993 EXPECT_TRUE(HasActiveSession(host_port_pair_));
3994
3995 // Next connectivity probe is scheduled to be sent in 2 *
3996 // kDefaultRTTMilliSecs.
3997 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
3998 base::TimeDelta next_task_delay = task_runner->NextPendingTaskDelay();
3999 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
4000 next_task_delay);
4001
4002 // The connection should still be alive, and not marked as going away.
4003 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shif5cc30392018-05-30 18:25:154004
4005 // Resume quic data and a connectivity probe response will be read on the new
4006 // socket.
4007 quic_data2.Resume();
4008
4009 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4010 EXPECT_TRUE(HasActiveSession(host_port_pair_));
Zhongyi Shi0439ecc72018-07-11 04:41:264011 EXPECT_EQ(0u, session->GetNumActiveStreams());
4012 EXPECT_EQ(1u, session->GetNumDrainingStreams());
Zhongyi Shif5cc30392018-05-30 18:25:154013
4014 // There should be three pending tasks, the nearest one will complete
4015 // migration to the new network.
4016 EXPECT_EQ(3u, task_runner->GetPendingTaskCount());
4017 next_task_delay = task_runner->NextPendingTaskDelay();
4018 EXPECT_EQ(base::TimeDelta(), next_task_delay);
4019 task_runner->FastForwardBy(next_task_delay);
4020
4021 // Now there are two pending tasks, the nearest one was to send connectivity
4022 // probe and has been cancelled due to successful migration.
4023 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
4024 next_task_delay = task_runner->NextPendingTaskDelay();
4025 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
4026 next_task_delay);
4027 task_runner->FastForwardBy(next_task_delay);
4028
4029 // There's one more task to mgirate back to the default network in 0.4s.
4030 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
4031 next_task_delay = task_runner->NextPendingTaskDelay();
4032 base::TimeDelta expected_delay =
4033 base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs) -
4034 base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs);
4035 EXPECT_EQ(expected_delay, next_task_delay);
4036
Zhongyi Shib3bc982c2018-07-10 19:59:244037 base::RunLoop().RunUntilIdle();
4038
Zhongyi Shif5cc30392018-05-30 18:25:154039 // Deliver a signal that the alternate network now becomes default to session,
4040 // this will cancel mgirate back to default network timer.
4041 scoped_mock_network_change_notifier_->mock_network_change_notifier()
4042 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
4043
4044 task_runner->FastForwardBy(next_task_delay);
4045 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
4046
4047 // Verify that the session is still alive.
4048 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4049 EXPECT_TRUE(HasActiveSession(host_port_pair_));
Zhongyi Shi0439ecc72018-07-11 04:41:264050 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
Zhongyi Shif5cc30392018-05-30 18:25:154051
4052 stream.reset();
4053 EXPECT_TRUE(quic_data1.AllReadDataConsumed());
4054 EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
4055 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
4056 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
4057}
4058
Zhongyi Shiaba4a832018-04-30 20:29:084059// Regression test for http://crbug.com/835444.
4060// This test verifies that the connection migrates to the alternate network
4061// when the alternate network is connected after path has been degrading.
4062TEST_P(QuicStreamFactoryTest, MigrateOnNewNetworkConnectAfterPathDegrading) {
4063 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
4064 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4065 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4066 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4067
4068 // Using a testing task runner so that we can control time.
4069 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
4070 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
4071
4072 scoped_mock_network_change_notifier_->mock_network_change_notifier()
4073 ->QueueNetworkMadeDefault(kDefaultNetworkForTests);
4074
4075 MockQuicData quic_data1;
Ryan Hamilton8d9ee76e2018-05-29 23:52:524076 quic::QuicStreamOffset header_stream_offset = 0;
Zhongyi Shiaba4a832018-04-30 20:29:084077 quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging Read.
4078 quic_data1.AddWrite(SYNCHRONOUS,
4079 ConstructInitialSettingsPacket(1, &header_stream_offset));
Fan Yang32c5a112018-12-10 20:06:334080 quic_data1.AddWrite(
4081 SYNCHRONOUS, ConstructGetRequestPacket(
4082 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
4083 true, &header_stream_offset));
Zhongyi Shiaba4a832018-04-30 20:29:084084 quic_data1.AddSocketDataToFactory(socket_factory_.get());
4085
4086 // Set up the second socket data provider that is used after migration.
4087 // The response to the earlier request is read on the new socket.
4088 MockQuicData quic_data2;
4089 // Connectivity probe to be sent on the new path.
Zhongyi Shi879659422018-08-02 17:58:254090 quic_data2.AddWrite(SYNCHRONOUS,
4091 client_maker_.MakeConnectivityProbingPacket(3, true));
Zhongyi Shiaba4a832018-04-30 20:29:084092 quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // Pause
4093 // Connectivity probe to receive from the server.
Zhongyi Shi879659422018-08-02 17:58:254094 quic_data2.AddRead(ASYNC,
4095 server_maker_.MakeConnectivityProbingPacket(1, false));
Zhongyi Shiaba4a832018-04-30 20:29:084096 // Ping packet to send after migration is completed.
4097 quic_data2.AddWrite(ASYNC,
4098 client_maker_.MakeAckAndPingPacket(4, false, 1, 1, 1));
4099 quic_data2.AddRead(
Fan Yang32c5a112018-12-10 20:06:334100 ASYNC,
4101 ConstructOkResponsePacket(
4102 2, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
Zhongyi Shiaba4a832018-04-30 20:29:084103 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Fan Yang32c5a112018-12-10 20:06:334104 quic_data2.AddWrite(
4105 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
4106 5, false, GetNthClientInitiatedBidirectionalStreamId(0),
4107 quic::QUIC_STREAM_CANCELLED, 2, 2, 1, true));
Zhongyi Shiaba4a832018-04-30 20:29:084108 quic_data2.AddSocketDataToFactory(socket_factory_.get());
4109
4110 // Create request and QuicHttpStream.
4111 QuicStreamRequest request(factory_.get());
4112 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:034113 request.Request(
4114 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
4115 SocketTag(),
4116 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
4117 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shiaba4a832018-04-30 20:29:084118 EXPECT_THAT(callback_.WaitForResult(), IsOk());
4119 std::unique_ptr<HttpStream> stream = CreateStream(&request);
4120 EXPECT_TRUE(stream.get());
4121
4122 // Cause QUIC stream to be created.
4123 HttpRequestInfo request_info;
4124 request_info.method = "GET";
4125 request_info.url = url_;
4126 request_info.traffic_annotation =
4127 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
4128 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
4129 net_log_, CompletionOnceCallback()));
4130
4131 // Ensure that session is alive and active.
4132 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
4133 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4134 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4135
4136 // Send GET request on stream.
4137 HttpResponseInfo response;
4138 HttpRequestHeaders request_headers;
4139 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
4140 callback_.callback()));
4141
4142 // Cause the connection to report path degrading to the session.
4143 // Due to lack of alternate network, session will not mgirate connection.
4144 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
4145 session->connection()->OnPathDegradingTimeout();
4146 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
4147
4148 // Deliver a signal that a alternate network is connected now, this should
4149 // cause the connection to start early migration on path degrading.
4150 scoped_mock_network_change_notifier_->mock_network_change_notifier()
4151 ->SetConnectedNetworksList(
4152 {kDefaultNetworkForTests, kNewNetworkForTests});
4153 scoped_mock_network_change_notifier_->mock_network_change_notifier()
4154 ->NotifyNetworkConnected(kNewNetworkForTests);
Zhongyi Shic4823bd2018-04-27 00:49:194155
4156 // Next connectivity probe is scheduled to be sent in 2 *
4157 // kDefaultRTTMilliSecs.
4158 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
4159 base::TimeDelta next_task_delay = task_runner->NextPendingTaskDelay();
4160 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
4161 next_task_delay);
4162
4163 // The connection should still be alive, and not marked as going away.
4164 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4165 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4166 EXPECT_EQ(1u, session->GetNumActiveStreams());
4167 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
4168
4169 // Resume quic data and a connectivity probe response will be read on the new
4170 // socket.
4171 quic_data2.Resume();
4172
4173 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4174 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4175 EXPECT_EQ(1u, session->GetNumActiveStreams());
4176
4177 // There should be three pending tasks, the nearest one will complete
4178 // migration to the new network.
4179 EXPECT_EQ(3u, task_runner->GetPendingTaskCount());
4180 next_task_delay = task_runner->NextPendingTaskDelay();
4181 EXPECT_EQ(base::TimeDelta(), next_task_delay);
4182 task_runner->FastForwardBy(next_task_delay);
4183
4184 // Response headers are received over the new network.
4185 EXPECT_THAT(callback_.WaitForResult(), IsOk());
4186 EXPECT_EQ(200, response.headers->response_code());
4187
4188 // Now there are two pending tasks, the nearest one was to send connectivity
4189 // probe and has been cancelled due to successful migration.
4190 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
4191 next_task_delay = task_runner->NextPendingTaskDelay();
4192 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
4193 next_task_delay);
4194 task_runner->FastForwardBy(next_task_delay);
4195
4196 // There's one more task to mgirate back to the default network in 0.4s.
4197 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
4198 next_task_delay = task_runner->NextPendingTaskDelay();
4199 base::TimeDelta expected_delay =
4200 base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs) -
4201 base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs);
4202 EXPECT_EQ(expected_delay, next_task_delay);
4203
4204 // Deliver a signal that the alternate network now becomes default to session,
4205 // this will cancel mgirate back to default network timer.
4206 scoped_mock_network_change_notifier_->mock_network_change_notifier()
4207 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
4208
4209 task_runner->FastForwardBy(next_task_delay);
4210 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
4211
4212 // Verify that the session is still alive.
4213 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4214 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4215
4216 stream.reset();
4217 EXPECT_TRUE(quic_data1.AllReadDataConsumed());
4218 EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
4219 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
4220 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
4221}
4222
Zhongyi Shi28f6e352018-06-20 21:15:434223// This test verifies that multiple sessions are migrated on connection
4224// migration signal.
jrie3d187c2016-09-16 14:29:174225TEST_P(QuicStreamFactoryTest,
Zhongyi Shi28f6e352018-06-20 21:15:434226 MigrateMultipleSessionsToBadSocketsAfterDisconnected) {
4227 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
jrie3d187c2016-09-16 14:29:174228
4229 MockQuicData socket_data1;
4230 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:434231 socket_data1.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
jrie3d187c2016-09-16 14:29:174232 socket_data1.AddWrite(ASYNC, OK);
Zhongyi Shi5f587cc2017-11-21 23:24:174233 socket_data1.AddSocketDataToFactory(socket_factory_.get());
jrie3d187c2016-09-16 14:29:174234 MockQuicData socket_data2;
4235 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:434236 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
jrie3d187c2016-09-16 14:29:174237 socket_data2.AddWrite(ASYNC, OK);
Zhongyi Shi5f587cc2017-11-21 23:24:174238 socket_data2.AddSocketDataToFactory(socket_factory_.get());
jrie3d187c2016-09-16 14:29:174239
4240 HostPortPair server1(kDefaultServerHostName, 443);
4241 HostPortPair server2(kServer2HostName, 443);
4242
4243 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4244 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4245 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4246
Renjiea0cb4a2c2018-09-26 23:37:304247 host_resolver_->set_synchronous_mode(true);
4248 host_resolver_->rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
4249 host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.2", "");
jrie3d187c2016-09-16 14:29:174250
4251 // Create request and QuicHttpStream to create session1.
zhongyi98d6a9262017-05-19 02:47:454252 QuicStreamRequest request1(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:034253 EXPECT_EQ(OK,
4254 request1.Request(
4255 server1, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
4256 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
4257 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:244258 std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
jrie3d187c2016-09-16 14:29:174259 EXPECT_TRUE(stream1.get());
4260
4261 // Create request and QuicHttpStream to create session2.
zhongyi98d6a9262017-05-19 02:47:454262 QuicStreamRequest request2(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:034263 EXPECT_EQ(OK,
4264 request2.Request(
4265 server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
4266 /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
4267 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:244268 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
jrie3d187c2016-09-16 14:29:174269 EXPECT_TRUE(stream2.get());
4270
4271 QuicChromiumClientSession* session1 = GetActiveSession(server1);
4272 QuicChromiumClientSession* session2 = GetActiveSession(server2);
4273 EXPECT_NE(session1, session2);
4274
4275 // Cause QUIC stream to be created and send GET so session1 has an open
4276 // stream.
4277 HttpRequestInfo request_info1;
4278 request_info1.method = "GET";
4279 request_info1.url = url_;
Ramin Halavati683bcaa92018-02-14 08:42:394280 request_info1.traffic_annotation =
4281 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:274282 EXPECT_EQ(OK,
4283 stream1->InitializeStream(&request_info1, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:394284 net_log_, CompletionOnceCallback()));
jrie3d187c2016-09-16 14:29:174285 HttpResponseInfo response1;
4286 HttpRequestHeaders request_headers1;
4287 EXPECT_EQ(OK, stream1->SendRequest(request_headers1, &response1,
4288 callback_.callback()));
4289
4290 // Cause QUIC stream to be created and send GET so session2 has an open
4291 // stream.
4292 HttpRequestInfo request_info2;
4293 request_info2.method = "GET";
4294 request_info2.url = url_;
Ramin Halavati683bcaa92018-02-14 08:42:394295 request_info2.traffic_annotation =
4296 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:274297 EXPECT_EQ(OK,
4298 stream2->InitializeStream(&request_info2, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:394299 net_log_, CompletionOnceCallback()));
jrie3d187c2016-09-16 14:29:174300 HttpResponseInfo response2;
4301 HttpRequestHeaders request_headers2;
4302 EXPECT_EQ(OK, stream2->SendRequest(request_headers2, &response2,
4303 callback_.callback()));
4304
4305 // Cause both sessions to be paused due to DISCONNECTED.
4306 scoped_mock_network_change_notifier_->mock_network_change_notifier()
4307 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
4308
4309 // Ensure that both sessions are paused but alive.
4310 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session1));
4311 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session2));
4312
Zhongyi Shi28f6e352018-06-20 21:15:434313 // Add new sockets to use post migration. Those are bad sockets and will cause
4314 // migration to fail.
jrie3d187c2016-09-16 14:29:174315 MockConnect connect_result =
4316 MockConnect(SYNCHRONOUS, ERR_INTERNET_DISCONNECTED);
Ryan Sleevib8d7ea02018-05-07 20:01:014317 SequencedSocketData socket_data3(connect_result, base::span<MockRead>(),
4318 base::span<MockWrite>());
Zhongyi Shi5f587cc2017-11-21 23:24:174319 socket_factory_->AddSocketDataProvider(&socket_data3);
Ryan Sleevib8d7ea02018-05-07 20:01:014320 SequencedSocketData socket_data4(connect_result, base::span<MockRead>(),
4321 base::span<MockWrite>());
Zhongyi Shi5f587cc2017-11-21 23:24:174322 socket_factory_->AddSocketDataProvider(&socket_data4);
jrie3d187c2016-09-16 14:29:174323
Zhongyi Shi28f6e352018-06-20 21:15:434324 // Connect the new network and cause migration to bad sockets, causing
4325 // sessions to close.
jrie3d187c2016-09-16 14:29:174326 scoped_mock_network_change_notifier_->mock_network_change_notifier()
4327 ->SetConnectedNetworksList({kNewNetworkForTests});
4328 scoped_mock_network_change_notifier_->mock_network_change_notifier()
4329 ->NotifyNetworkConnected(kNewNetworkForTests);
4330
4331 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session1));
4332 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session2));
4333
4334 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
4335 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
4336 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
4337 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
4338}
4339
Zhongyi Shi6ec9b36e2018-06-20 20:32:544340// This test verifies that session attempts connection migration with signals
4341// delivered in the following order (no alternate network is available):
4342// - path degrading is detected: session attempts connection migration but no
4343// alternate network is available, session caches path degrading signal in
4344// connection and stays on the original network.
4345// - original network backs up, request is served in the orignal network,
4346// session is not marked as going away.
4347TEST_P(QuicStreamFactoryTest, MigrateOnPathDegradingWithNoNewNetwork) {
4348 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
jrid36ada62016-02-06 02:42:084349 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4350 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4351
Zhongyi Shi6ec9b36e2018-06-20 20:32:544352 MockQuicData quic_data;
4353 quic::QuicStreamOffset header_stream_offset = 0;
4354 quic_data.AddWrite(SYNCHRONOUS,
4355 ConstructInitialSettingsPacket(1, &header_stream_offset));
Fan Yang32c5a112018-12-10 20:06:334356 quic_data.AddWrite(SYNCHRONOUS,
4357 ConstructGetRequestPacket(
4358 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
4359 true, &header_stream_offset));
Zhongyi Shi6ec9b36e2018-06-20 20:32:544360 quic_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause for path degrading signal.
4361
4362 // The rest of the data will still flow in the original socket as there is no
4363 // new network after path degrading.
Fan Yang32c5a112018-12-10 20:06:334364 quic_data.AddRead(ASYNC, ConstructOkResponsePacket(
4365 1, GetNthClientInitiatedBidirectionalStreamId(0),
4366 false, false));
Zhongyi Shi6ec9b36e2018-06-20 20:32:544367 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Fan Yang32c5a112018-12-10 20:06:334368 quic_data.AddWrite(
4369 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
4370 3, false, GetNthClientInitiatedBidirectionalStreamId(0),
4371 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi6ec9b36e2018-06-20 20:32:544372 quic_data.AddSocketDataToFactory(socket_factory_.get());
jrid36ada62016-02-06 02:42:084373
4374 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:454375 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:334376 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:034377 request.Request(
4378 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
4379 SocketTag(),
4380 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
4381 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:014382 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:244383 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jrid36ada62016-02-06 02:42:084384 EXPECT_TRUE(stream.get());
4385
4386 // Cause QUIC stream to be created.
4387 HttpRequestInfo request_info;
Zhongyi Shi6ec9b36e2018-06-20 20:32:544388 request_info.method = "GET";
4389 request_info.url = url_;
Ramin Halavati683bcaa92018-02-14 08:42:394390 request_info.traffic_annotation =
4391 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Zhongyi Shi6ec9b36e2018-06-20 20:32:544392 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:394393 net_log_, CompletionOnceCallback()));
jrid36ada62016-02-06 02:42:084394
4395 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:504396 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jrid36ada62016-02-06 02:42:084397 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4398 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4399
Zhongyi Shi6ec9b36e2018-06-20 20:32:544400 // Send GET request on stream.
4401 HttpResponseInfo response;
4402 HttpRequestHeaders request_headers;
4403 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
4404 callback_.callback()));
jrid36ada62016-02-06 02:42:084405
Zhongyi Shi6ec9b36e2018-06-20 20:32:544406 // Trigger connection migration on path degrading. Since there are no networks
4407 // to migrate to, the session will remain on the original network, not marked
4408 // as going away.
4409 session->connection()->OnPathDegradingTimeout();
4410 EXPECT_TRUE(session->connection()->IsPathDegrading());
4411
4412 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4413 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4414 EXPECT_EQ(1u, session->GetNumActiveStreams());
4415 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
4416
4417 // Resume so that rest of the data will flow in the original socket.
4418 quic_data.Resume();
jrid36ada62016-02-06 02:42:084419
4420 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4421 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4422 EXPECT_EQ(1u, session->GetNumActiveStreams());
4423
4424 stream.reset();
Zhongyi Shi6ec9b36e2018-06-20 20:32:544425 EXPECT_TRUE(quic_data.AllReadDataConsumed());
4426 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
jrid36ada62016-02-06 02:42:084427}
4428
Zhongyi Shi21e99532018-07-17 22:23:074429// This test verifies that session with non-migratable stream will probe the
4430// alternate network on path degrading, and close the non-migratable streams
4431// when probe is successful.
jri231c2972016-03-08 19:50:114432TEST_P(QuicStreamFactoryTest, MigrateSessionEarlyNonMigratableStream) {
Zhongyi Shi1a054612018-06-14 04:59:084433 InitializeConnectionMigrationV2Test(
jri231c2972016-03-08 19:50:114434 {kDefaultNetworkForTests, kNewNetworkForTests});
4435 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4436 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4437
rcha00569732016-08-27 11:09:364438 MockQuicData socket_data;
4439 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:434440 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:174441 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri231c2972016-03-08 19:50:114442
Zhongyi Shi21e99532018-07-17 22:23:074443 // Set up the second socket data provider that is used for probing.
4444 MockQuicData quic_data1;
4445 // Connectivity probe to be sent on the new path.
Zhongyi Shi879659422018-08-02 17:58:254446 quic_data1.AddWrite(SYNCHRONOUS,
4447 client_maker_.MakeConnectivityProbingPacket(2, true));
Zhongyi Shi21e99532018-07-17 22:23:074448 quic_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause
4449 // Connectivity probe to receive from the server.
Zhongyi Shi879659422018-08-02 17:58:254450 quic_data1.AddRead(ASYNC,
4451 server_maker_.MakeConnectivityProbingPacket(1, false));
Zhongyi Shic16b4102019-02-12 00:37:404452 quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
4453 // A RESET will be sent to the peer to cancel the non-migratable stream.
4454 quic_data1.AddWrite(
4455 SYNCHRONOUS, client_maker_.MakeRstPacket(
4456 3, false, GetNthClientInitiatedBidirectionalStreamId(0),
4457 quic::QUIC_STREAM_CANCELLED));
4458 // Ping packet to send after migration is completed.
4459 quic_data1.AddWrite(SYNCHRONOUS,
4460 client_maker_.MakeAckAndPingPacket(4, false, 1, 1, 1));
Zhongyi Shi21e99532018-07-17 22:23:074461 quic_data1.AddSocketDataToFactory(socket_factory_.get());
4462
jri231c2972016-03-08 19:50:114463 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:454464 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:334465 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:034466 request.Request(
4467 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
4468 SocketTag(),
4469 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
4470 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:014471 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:244472 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri231c2972016-03-08 19:50:114473 EXPECT_TRUE(stream.get());
4474
4475 // Cause QUIC stream to be created, but marked as non-migratable.
4476 HttpRequestInfo request_info;
Zhongyi Shibb28b1f2018-07-18 02:41:264477 request_info.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION_TO_CELLULAR;
Ramin Halavati683bcaa92018-02-14 08:42:394478 request_info.traffic_annotation =
4479 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:274480 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:394481 net_log_, CompletionOnceCallback()));
jri231c2972016-03-08 19:50:114482
4483 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:504484 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri231c2972016-03-08 19:50:114485 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4486 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4487
4488 // Trigger connection migration. Since there is a non-migratable stream,
Zhongyi Shic16b4102019-02-12 00:37:404489 // this should cause session to migrate.
jri231c2972016-03-08 19:50:114490 session->OnPathDegrading();
4491
4492 // Run the message loop so that data queued in the new socket is read by the
4493 // packet reader.
4494 base::RunLoop().RunUntilIdle();
4495
jri231c2972016-03-08 19:50:114496 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4497 EXPECT_EQ(1u, session->GetNumActiveStreams());
4498
Zhongyi Shi21e99532018-07-17 22:23:074499 // Resume the data to read the connectivity probing response to declare probe
4500 // as successful. Non-migratable streams will be closed.
4501 quic_data1.Resume();
Zhongyi Shic16b4102019-02-12 00:37:404502 base::RunLoop().RunUntilIdle();
4503
4504 EXPECT_TRUE(HasActiveSession(host_port_pair_));
Zhongyi Shi21e99532018-07-17 22:23:074505 EXPECT_EQ(0u, session->GetNumActiveStreams());
jri231c2972016-03-08 19:50:114506
Zhongyi Shi21e99532018-07-17 22:23:074507 EXPECT_TRUE(quic_data1.AllReadDataConsumed());
4508 EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
jri231c2972016-03-08 19:50:114509 EXPECT_TRUE(socket_data.AllReadDataConsumed());
4510 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
4511}
4512
jri9c541572016-03-29 17:51:484513TEST_P(QuicStreamFactoryTest, MigrateSessionEarlyConnectionMigrationDisabled) {
Zhongyi Shi1a054612018-06-14 04:59:084514 InitializeConnectionMigrationV2Test(
jri9c541572016-03-29 17:51:484515 {kDefaultNetworkForTests, kNewNetworkForTests});
4516 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4517 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4518
rcha00569732016-08-27 11:09:364519 MockQuicData socket_data;
4520 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:434521 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
4522 socket_data.AddWrite(
Fan Yang32c5a112018-12-10 20:06:334523 SYNCHRONOUS, client_maker_.MakeRstPacket(
4524 2, true, GetNthClientInitiatedBidirectionalStreamId(0),
4525 quic::QUIC_STREAM_CANCELLED));
Zhongyi Shi5f587cc2017-11-21 23:24:174526 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri9c541572016-03-29 17:51:484527
4528 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:454529 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:334530 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:034531 request.Request(
4532 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
4533 SocketTag(),
4534 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
4535 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:014536 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:244537 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri9c541572016-03-29 17:51:484538 EXPECT_TRUE(stream.get());
4539
4540 // Cause QUIC stream to be created.
4541 HttpRequestInfo request_info;
Ramin Halavati683bcaa92018-02-14 08:42:394542 request_info.traffic_annotation =
4543 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:274544 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:394545 net_log_, CompletionOnceCallback()));
jri9c541572016-03-29 17:51:484546
4547 // Ensure that session is alive and active.
bnc912a04b2016-04-20 14:19:504548 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
jri9c541572016-03-29 17:51:484549 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4550 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4551
4552 // Set session config to have connection migration disabled.
Ryan Hamilton8d9ee76e2018-05-29 23:52:524553 quic::test::QuicConfigPeer::SetReceivedDisableConnectionMigration(
4554 session->config());
jri9c541572016-03-29 17:51:484555 EXPECT_TRUE(session->config()->DisableConnectionMigration());
4556
4557 // Trigger connection migration. Since there is a non-migratable stream,
4558 // this should cause session to be continue without migrating.
4559 session->OnPathDegrading();
4560
4561 // Run the message loop so that data queued in the new socket is read by the
4562 // packet reader.
4563 base::RunLoop().RunUntilIdle();
4564
4565 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4566 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4567 EXPECT_EQ(1u, session->GetNumActiveStreams());
4568
4569 stream.reset();
4570
4571 EXPECT_TRUE(socket_data.AllReadDataConsumed());
4572 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
4573}
4574
Zhongyi Shi3c4c9e92018-07-02 23:16:234575// Regression test for http://crbug.com/791886.
4576// This test verifies that the old packet writer which encountered an
4577// asynchronous write error will be blocked during migration on write error. New
4578// packets would not be written until the one with write error is rewritten on
4579// the new network.
4580TEST_P(QuicStreamFactoryTest, MigrateSessionOnAysncWriteError) {
4581 InitializeConnectionMigrationV2Test(
4582 {kDefaultNetworkForTests, kNewNetworkForTests});
4583 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4584 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4585 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4586
4587 // Using a testing task runner so that we can control time.
4588 // base::RunLoop() controls mocked socket writes and reads.
4589 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
4590 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
4591
4592 MockQuicData socket_data;
4593 quic::QuicStreamOffset header_stream_offset = 0;
4594 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4595 socket_data.AddWrite(
4596 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
4597 socket_data.AddWrite(ASYNC, ERR_ADDRESS_UNREACHABLE);
4598 socket_data.AddSocketDataToFactory(socket_factory_.get());
4599
4600 // Set up second socket data provider that is used after
4601 // migration. The request is rewritten to this new socket, and the
4602 // response to the request is read on this new socket.
4603 MockQuicData socket_data1;
Zhongyi Shi3c4c9e92018-07-02 23:16:234604 socket_data1.AddWrite(
Fan Yang32c5a112018-12-10 20:06:334605 SYNCHRONOUS, ConstructGetRequestPacket(
4606 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
4607 true, &header_stream_offset));
4608 socket_data1.AddWrite(SYNCHRONOUS,
4609 ConstructGetRequestPacket(
4610 3, GetNthClientInitiatedBidirectionalStreamId(1),
4611 GetNthClientInitiatedBidirectionalStreamId(0), true,
4612 true, &header_stream_offset));
4613 socket_data1.AddRead(
4614 ASYNC,
4615 ConstructOkResponsePacket(
4616 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
4617 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4618 socket_data1.AddWrite(
4619 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
4620 4, false, GetNthClientInitiatedBidirectionalStreamId(0),
4621 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
4622 socket_data1.AddWrite(
4623 SYNCHRONOUS, client_maker_.MakeRstPacket(
4624 5, false, GetNthClientInitiatedBidirectionalStreamId(1),
Frank Kastenholz684ea412019-02-13 18:48:184625 quic::QUIC_STREAM_CANCELLED, 0,
4626 /*include_stop_sending_if_v99=*/true));
Zhongyi Shi3c4c9e92018-07-02 23:16:234627
4628 socket_data1.AddSocketDataToFactory(socket_factory_.get());
4629
4630 // Create request #1 and QuicHttpStream.
4631 QuicStreamRequest request1(factory_.get());
4632 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:034633 request1.Request(
4634 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
4635 SocketTag(),
4636 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
4637 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi3c4c9e92018-07-02 23:16:234638 EXPECT_THAT(callback_.WaitForResult(), IsOk());
4639 std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
4640 EXPECT_TRUE(stream1.get());
4641
4642 HttpRequestInfo request_info1;
4643 request_info1.method = "GET";
4644 request_info1.url = GURL("https://www.example.org/");
4645 request_info1.traffic_annotation =
4646 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
4647 EXPECT_EQ(OK,
4648 stream1->InitializeStream(&request_info1, true, DEFAULT_PRIORITY,
4649 net_log_, CompletionOnceCallback()));
4650
4651 // Request #2 returns synchronously because it pools to existing session.
4652 TestCompletionCallback callback2;
4653 QuicStreamRequest request2(factory_.get());
4654 EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
4655 DEFAULT_PRIORITY, SocketTag(),
4656 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:034657 &net_error_details_,
4658 failed_on_default_network_callback_,
4659 callback2.callback()));
Zhongyi Shi3c4c9e92018-07-02 23:16:234660 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
4661 EXPECT_TRUE(stream2.get());
4662
4663 HttpRequestInfo request_info2;
4664 request_info2.method = "GET";
4665 request_info2.url = GURL("https://www.example.org/");
4666 request_info2.traffic_annotation =
4667 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
4668 EXPECT_EQ(OK,
4669 stream2->InitializeStream(&request_info2, true, DEFAULT_PRIORITY,
4670 net_log_, CompletionOnceCallback()));
4671
4672 // Ensure that session is alive and active.
4673 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
4674 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4675 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4676 EXPECT_EQ(2u, session->GetNumActiveStreams());
4677
4678 // Send GET request on stream1. This should cause an async write error.
4679 HttpResponseInfo response;
4680 HttpRequestHeaders request_headers;
4681 EXPECT_EQ(OK, stream1->SendRequest(request_headers, &response,
4682 callback_.callback()));
4683 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
4684
4685 // Run the message loop so that asynchronous write completes and a connection
4686 // migration on write error attempt is posted in QuicStreamFactory's task
4687 // runner.
4688 base::RunLoop().RunUntilIdle();
4689 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
4690
4691 // Send GET request on stream. This will cause another write attempt before
4692 // migration on write error is exectued.
4693 HttpResponseInfo response2;
4694 HttpRequestHeaders request_headers2;
4695 EXPECT_EQ(OK, stream2->SendRequest(request_headers2, &response2,
4696 callback2.callback()));
4697
4698 // Run the task runner so that migration on write error is finally executed.
4699 task_runner->RunUntilIdle();
4700
Zhongyi Shia7dd46b2018-07-12 22:59:294701 // Verify the session is still alive and not marked as going away.
Zhongyi Shi3c4c9e92018-07-02 23:16:234702 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia7dd46b2018-07-12 22:59:294703 EXPECT_TRUE(HasActiveSession(host_port_pair_));
Zhongyi Shi3c4c9e92018-07-02 23:16:234704 EXPECT_EQ(2u, session->GetNumActiveStreams());
Zhongyi Shia7dd46b2018-07-12 22:59:294705 // There should be one task posted to migrate back to the default network in
4706 // kMinRetryTimeForDefaultNetworkSecs.
4707 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
4708 EXPECT_EQ(base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs),
4709 task_runner->NextPendingTaskDelay());
Zhongyi Shi3c4c9e92018-07-02 23:16:234710
4711 // Verify that response headers on the migrated socket were delivered to the
4712 // stream.
4713 EXPECT_EQ(OK, stream1->ReadResponseHeaders(callback_.callback()));
4714 EXPECT_EQ(200, response.headers->response_code());
4715
4716 stream1.reset();
4717 stream2.reset();
4718
4719 EXPECT_TRUE(socket_data.AllReadDataConsumed());
4720 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
4721 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
4722 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
4723}
4724
Zhongyi Shia7dd46b2018-07-12 22:59:294725// Verify session is not marked as going away after connection migration on
4726// write error and migrate back to default network logic is applied to bring the
4727// migrated session back to the default network. Migration singals delivered
4728// in the following order (alternate network is always availabe):
4729// - session on the default network encountered a write error;
4730// - session successfully migrated to the non-default network;
4731// - session attempts to migrate back to default network post migration;
4732// - migration back to the default network is successful.
4733TEST_P(QuicStreamFactoryTest, MigrateBackToDefaultPostMigrationOnWriteError) {
4734 InitializeConnectionMigrationV2Test(
4735 {kDefaultNetworkForTests, kNewNetworkForTests});
4736 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
4737 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4738 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
4739
4740 // Using a testing task runner so that we can control time.
4741 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
4742 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
4743
4744 MockQuicData socket_data;
4745 quic::QuicStreamOffset header_stream_offset = 0;
4746 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4747 socket_data.AddWrite(
4748 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
4749 socket_data.AddWrite(ASYNC, ERR_ADDRESS_UNREACHABLE);
4750 socket_data.AddSocketDataToFactory(socket_factory_.get());
4751
4752 // Set up second socket data provider that is used after
4753 // migration. The request is rewritten to this new socket, and the
4754 // response to the request is read on this new socket.
4755 MockQuicData quic_data2;
Fan Yang32c5a112018-12-10 20:06:334756 quic_data2.AddWrite(
4757 SYNCHRONOUS, ConstructGetRequestPacket(
4758 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
4759 true, &header_stream_offset));
Zhongyi Shia7dd46b2018-07-12 22:59:294760 quic_data2.AddRead(
Fan Yang32c5a112018-12-10 20:06:334761 ASYNC,
4762 ConstructOkResponsePacket(
4763 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
Zhongyi Shia7dd46b2018-07-12 22:59:294764 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4765 quic_data2.AddSocketDataToFactory(socket_factory_.get());
4766
4767 // Create request QuicHttpStream.
4768 QuicStreamRequest request1(factory_.get());
4769 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:034770 request1.Request(
4771 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
4772 SocketTag(),
4773 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
4774 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shia7dd46b2018-07-12 22:59:294775 EXPECT_THAT(callback_.WaitForResult(), IsOk());
4776 std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
4777 EXPECT_TRUE(stream1.get());
4778
4779 HttpRequestInfo request_info1;
4780 request_info1.method = "GET";
4781 request_info1.url = GURL("https://www.example.org/");
4782 request_info1.traffic_annotation =
4783 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
4784 EXPECT_EQ(OK,
4785 stream1->InitializeStream(&request_info1, true, DEFAULT_PRIORITY,
4786 net_log_, CompletionOnceCallback()));
4787
4788 // Ensure that session is alive and active.
4789 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
4790 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4791 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4792 EXPECT_EQ(1u, session->GetNumActiveStreams());
4793
4794 // Send GET request. This should cause an async write error.
4795 HttpResponseInfo response;
4796 HttpRequestHeaders request_headers;
4797 EXPECT_EQ(OK, stream1->SendRequest(request_headers, &response,
4798 callback_.callback()));
4799 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
4800
4801 // Run the message loop so that asynchronous write completes and a connection
4802 // migration on write error attempt is posted in QuicStreamFactory's task
4803 // runner.
4804 base::RunLoop().RunUntilIdle();
4805 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
4806
4807 // Run the task runner so that migration on write error is finally executed.
4808 task_runner->RunUntilIdle();
4809
4810 // Verify the session is still alive and not marked as going away.
4811 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4812 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4813 EXPECT_EQ(1u, session->GetNumActiveStreams());
4814 // There should be one task posted to migrate back to the default network in
4815 // kMinRetryTimeForDefaultNetworkSecs.
4816 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
4817 base::TimeDelta expected_delay =
4818 base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs);
4819 EXPECT_EQ(expected_delay, task_runner->NextPendingTaskDelay());
4820
4821 // Verify that response headers on the migrated socket were delivered to the
4822 // stream.
4823 EXPECT_EQ(OK, stream1->ReadResponseHeaders(callback_.callback()));
4824 EXPECT_EQ(200, response.headers->response_code());
4825
4826 // Set up the third socket data provider for migrate back to default network.
4827 MockQuicData quic_data3;
4828 // Connectivity probe to be sent on the new path.
Zhongyi Shi879659422018-08-02 17:58:254829 quic_data3.AddWrite(SYNCHRONOUS,
4830 client_maker_.MakeConnectivityProbingPacket(3, false));
Zhongyi Shia7dd46b2018-07-12 22:59:294831 // Connectivity probe to receive from the server.
Zhongyi Shi879659422018-08-02 17:58:254832 quic_data3.AddRead(ASYNC,
4833 server_maker_.MakeConnectivityProbingPacket(2, false));
Zhongyi Shia7dd46b2018-07-12 22:59:294834 quic_data3.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4835 quic_data3.AddWrite(ASYNC, client_maker_.MakeAckPacket(4, 1, 2, 1, 1, true));
4836 quic_data3.AddWrite(
Fan Yang32c5a112018-12-10 20:06:334837 SYNCHRONOUS, client_maker_.MakeRstPacket(
4838 5, false, GetNthClientInitiatedBidirectionalStreamId(0),
Frank Kastenholz684ea412019-02-13 18:48:184839 quic::QUIC_STREAM_CANCELLED, 0,
4840 /*include_stop_sending_if_v99=*/true));
Zhongyi Shia7dd46b2018-07-12 22:59:294841 quic_data3.AddSocketDataToFactory(socket_factory_.get());
4842
4843 // Fast forward to fire the migrate back timer and verify the session
4844 // successfully migrates back to the default network.
4845 task_runner->FastForwardBy(expected_delay);
4846
4847 // Verify the session is still alive and not marked as going away.
4848 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4849 EXPECT_TRUE(HasActiveSession(host_port_pair_));
4850 EXPECT_EQ(1u, session->GetNumActiveStreams());
4851
4852 // There should be one task posted to one will resend a connectivity probe and
4853 // the other will retry migrate back, both are cancelled.
4854 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
4855 task_runner->FastForwardBy(
4856 base::TimeDelta::FromSeconds(2 * kMinRetryTimeForDefaultNetworkSecs));
4857 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
4858
4859 stream1.reset();
4860 EXPECT_TRUE(socket_data.AllReadDataConsumed());
4861 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
4862 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
4863 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
4864 EXPECT_TRUE(quic_data3.AllReadDataConsumed());
4865 EXPECT_TRUE(quic_data3.AllWriteDataConsumed());
4866}
4867
Zhongyi Shic1449372018-08-09 09:58:584868// This test verifies that the connection will not attempt connection migration
4869// (send connectivity probes on alternate path) when path degrading is detected
4870// and handshake is not confirmed.
4871TEST_P(QuicStreamFactoryTest,
4872 NoMigrationOnPathDegradingBeforeHandshakeConfirmed) {
4873 InitializeConnectionMigrationV2Test(
4874 {kDefaultNetworkForTests, kNewNetworkForTests});
4875
4876 // Using a testing task runner.
4877 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
4878 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
4879
4880 // Use cold start mode to send crypto message for handshake.
4881 crypto_client_stream_factory_.set_handshake_mode(
4882 MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
4883
4884 MockQuicData socket_data;
4885 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4886 socket_data.AddWrite(ASYNC, client_maker_.MakeDummyCHLOPacket(1));
4887 socket_data.AddSocketDataToFactory(socket_factory_.get());
4888
4889 // Create request and QuicHttpStream.
4890 QuicStreamRequest request(factory_.get());
4891 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:034892 request.Request(
4893 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
4894 SocketTag(),
4895 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
4896 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shic1449372018-08-09 09:58:584897
4898 base::RunLoop().RunUntilIdle();
4899
4900 // Ensure that session is alive but not active.
4901 EXPECT_FALSE(HasActiveSession(host_port_pair_));
4902 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
4903 QuicChromiumClientSession* session = GetPendingSession(host_port_pair_);
4904 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4905 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
4906
4907 // Cause the connection to report path degrading to the session.
4908 // Session will ignore the signal as handshake is not completed.
4909 session->connection()->OnPathDegradingTimeout();
4910 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
4911
4912 EXPECT_FALSE(HasActiveSession(host_port_pair_));
Zhongyi Shi8de43832018-08-15 23:40:004913 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
Zhongyi Shic1449372018-08-09 09:58:584914 EXPECT_TRUE(socket_data.AllReadDataConsumed());
4915 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
4916}
4917
Zhongyi Shi634c1882018-08-16 04:05:594918// This test verifies that if a connection is closed with
4919// QUIC_NETWORK_IDLE_TIMEOUT before handshake is completed and there is no
4920// alternate network, no new connection will be created.
4921TEST_P(QuicStreamFactoryTest, NoAlternateNetworkBeforeHandshakeOnIdleTimeout) {
4922 TestNoAlternateNetworkBeforeHandshake(quic::QUIC_NETWORK_IDLE_TIMEOUT);
4923}
4924
4925// This test verifies that if a connection is closed with QUIC_HANDSHAKE_TIMEOUT
4926// and there is no alternate network, no new connection will be created.
4927TEST_P(QuicStreamFactoryTest, NoAlternateNetworkOnHandshakeTimeout) {
4928 TestNoAlternateNetworkBeforeHandshake(quic::QUIC_HANDSHAKE_TIMEOUT);
4929}
4930
4931void QuicStreamFactoryTestBase::TestNoAlternateNetworkBeforeHandshake(
4932 quic::QuicErrorCode quic_error) {
4933 DCHECK(quic_error == quic::QUIC_NETWORK_IDLE_TIMEOUT ||
4934 quic_error == quic::QUIC_HANDSHAKE_TIMEOUT);
4935 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
4936
4937 // Using a testing task runner.
4938 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
4939 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
4940
4941 // Use cold start mode to send crypto message for handshake.
4942 crypto_client_stream_factory_.set_handshake_mode(
4943 MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
4944
4945 MockQuicData socket_data;
4946 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
4947 socket_data.AddWrite(ASYNC, client_maker_.MakeDummyCHLOPacket(1));
4948 socket_data.AddSocketDataToFactory(socket_factory_.get());
4949
4950 // Create request.
4951 QuicStreamRequest request(factory_.get());
4952 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:034953 request.Request(
4954 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
4955 SocketTag(),
4956 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
4957 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi634c1882018-08-16 04:05:594958
4959 base::RunLoop().RunUntilIdle();
4960
4961 // Ensure that session is alive but not active.
4962 EXPECT_FALSE(HasActiveSession(host_port_pair_));
4963 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
4964 QuicChromiumClientSession* session = GetPendingSession(host_port_pair_);
4965 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
4966 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
4967
4968 // Cause the connection to report path degrading to the session.
4969 // Session will ignore the signal as handshake is not completed.
4970 session->connection()->OnPathDegradingTimeout();
4971 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
4972 EXPECT_FALSE(HasActiveSession(host_port_pair_));
4973 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
4974
4975 // Cause the connection to close due to |quic_error| before handshake.
4976 quic::QuicString error_details;
4977 if (quic_error == quic::QUIC_NETWORK_IDLE_TIMEOUT) {
4978 error_details = "No recent network activity.";
4979 } else {
4980 error_details = "Handshake timeout expired.";
4981 }
4982 session->connection()->CloseConnection(
4983 quic_error, error_details, quic::ConnectionCloseBehavior::SILENT_CLOSE);
4984
4985 // A task will be posted to clean up the session in the factory.
4986 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
4987 task_runner->FastForwardUntilNoTasksRemain();
4988
4989 // No new session should be created as there is no alternate network.
4990 EXPECT_FALSE(HasActiveSession(host_port_pair_));
4991 EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_));
4992 EXPECT_TRUE(socket_data.AllReadDataConsumed());
4993 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
4994}
4995
Zhongyi Shi8de43832018-08-15 23:40:004996TEST_P(QuicStreamFactoryTest, NewConnectionBeforeHandshakeAfterIdleTimeout) {
4997 TestNewConnectionOnAlternateNetworkBeforeHandshake(
4998 quic::QUIC_NETWORK_IDLE_TIMEOUT);
4999}
5000
5001TEST_P(QuicStreamFactoryTest, NewConnectionAfterHandshakeTimeout) {
5002 TestNewConnectionOnAlternateNetworkBeforeHandshake(
5003 quic::QUIC_HANDSHAKE_TIMEOUT);
5004}
5005
Zhongyi Shif3fcbbe62018-08-16 22:52:085006// Sets up a test to verify that a new connection will be created on the
5007// alternate network after the initial connection fails before handshake with
5008// signals delivered in the following order (alternate network is available):
5009// - the default network is not able to complete crypto handshake;
5010// - the original connection is closed with |quic_error|;
5011// - a new connection is created on the alternate network and is able to finish
5012// crypto handshake;
5013// - the new session on the alternate network attempts to migrate back to the
5014// default network by sending probes;
5015// - default network being disconnected is delivered: session will stop probing
5016// the original network.
5017// - alternate network is made by default.
Zhongyi Shi8de43832018-08-15 23:40:005018void QuicStreamFactoryTestBase::
5019 TestNewConnectionOnAlternateNetworkBeforeHandshake(
5020 quic::QuicErrorCode quic_error) {
5021 DCHECK(quic_error == quic::QUIC_NETWORK_IDLE_TIMEOUT ||
5022 quic_error == quic::QUIC_HANDSHAKE_TIMEOUT);
Zhongyi Shi967d2f12019-02-08 20:58:535023 test_params_.quic_retry_on_alternate_network_before_handshake = true;
Zhongyi Shi8de43832018-08-15 23:40:005024 InitializeConnectionMigrationV2Test(
5025 {kDefaultNetworkForTests, kNewNetworkForTests});
5026
5027 // Using a testing task runner.
5028 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
5029 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
5030
5031 // Use cold start mode to send crypto message for handshake.
5032 crypto_client_stream_factory_.set_handshake_mode(
5033 MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
5034
5035 // Socket data for connection on the default network.
5036 MockQuicData socket_data;
5037 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5038 socket_data.AddWrite(ASYNC, client_maker_.MakeDummyCHLOPacket(1));
5039 socket_data.AddSocketDataToFactory(socket_factory_.get());
5040
5041 // Socket data for connection on the alternate network.
5042 MockQuicData socket_data2;
5043 quic::QuicStreamOffset header_stream_offset = 0;
5044 socket_data2.AddWrite(SYNCHRONOUS, client_maker_.MakeDummyCHLOPacket(1));
5045 socket_data2.AddRead(ASYNC, ERR_IO_PENDING); // Pause.
5046 // Change the encryption level after handshake is confirmed.
5047 client_maker_.SetEncryptionLevel(quic::ENCRYPTION_FORWARD_SECURE);
5048 socket_data2.AddWrite(
5049 ASYNC, ConstructInitialSettingsPacket(2, &header_stream_offset));
5050 socket_data2.AddWrite(
Fan Yang32c5a112018-12-10 20:06:335051 ASYNC, ConstructGetRequestPacket(
5052 3, GetNthClientInitiatedBidirectionalStreamId(0), true, true,
5053 &header_stream_offset));
Zhongyi Shi8de43832018-08-15 23:40:005054 socket_data2.AddRead(
Fan Yang32c5a112018-12-10 20:06:335055 ASYNC,
5056 ConstructOkResponsePacket(
5057 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
Zhongyi Shi8de43832018-08-15 23:40:005058 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Fan Yang32c5a112018-12-10 20:06:335059 socket_data2.AddWrite(
5060 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
5061 5, false, GetNthClientInitiatedBidirectionalStreamId(0),
5062 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi8de43832018-08-15 23:40:005063 socket_data2.AddSocketDataToFactory(socket_factory_.get());
5064
Zhongyi Shif3fcbbe62018-08-16 22:52:085065 // Socket data for probing on the default network.
5066 MockQuicData probing_data;
5067 probing_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
5068 probing_data.AddWrite(SYNCHRONOUS,
5069 client_maker_.MakeConnectivityProbingPacket(4, false));
5070 probing_data.AddSocketDataToFactory(socket_factory_.get());
5071
Zhongyi Shi8de43832018-08-15 23:40:005072 // Create request and QuicHttpStream.
5073 QuicStreamRequest request(factory_.get());
5074 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:035075 request.Request(
5076 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5077 SocketTag(),
5078 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
5079 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi8de43832018-08-15 23:40:005080
5081 base::RunLoop().RunUntilIdle();
5082
5083 // Ensure that session is alive but not active.
5084 EXPECT_FALSE(HasActiveSession(host_port_pair_));
5085 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
5086 QuicChromiumClientSession* session = GetPendingSession(host_port_pair_);
5087 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5088 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
Zhongyi Shia6b68d112018-09-24 07:49:035089 EXPECT_FALSE(failed_on_default_network_);
Zhongyi Shi8de43832018-08-15 23:40:005090
5091 quic::QuicString error_details;
5092 if (quic_error == quic::QUIC_NETWORK_IDLE_TIMEOUT) {
5093 error_details = "No recent network activity.";
5094 } else {
5095 error_details = "Handshake timeout expired.";
5096 }
5097 session->connection()->CloseConnection(
5098 quic_error, error_details, quic::ConnectionCloseBehavior::SILENT_CLOSE);
5099
5100 // A task will be posted to clean up the session in the factory.
5101 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
5102 task_runner->FastForwardUntilNoTasksRemain();
5103
5104 // Verify a new session is created on the alternate network.
5105 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
5106 EXPECT_FALSE(HasActiveSession(host_port_pair_));
5107 QuicChromiumClientSession* session2 = GetPendingSession(host_port_pair_);
5108 EXPECT_NE(session, session2);
Zhongyi Shia6b68d112018-09-24 07:49:035109 EXPECT_TRUE(failed_on_default_network_);
Zhongyi Shi8de43832018-08-15 23:40:005110
5111 // Confirm the handshake on the alternate network.
5112 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
5113 quic::QuicSession::HANDSHAKE_CONFIRMED);
5114 EXPECT_THAT(callback_.WaitForResult(), IsOk());
5115 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5116 // Resume the data now so that data can be sent and read.
5117 socket_data2.Resume();
5118
5119 // Create the stream.
5120 std::unique_ptr<HttpStream> stream = CreateStream(&request);
5121 EXPECT_TRUE(stream.get());
5122 HttpRequestInfo request_info;
5123 request_info.method = "GET";
5124 request_info.url = GURL("https://www.example.org/");
5125 request_info.traffic_annotation =
5126 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
5127 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
5128 net_log_, CompletionOnceCallback()));
5129 // Send the request.
5130 HttpResponseInfo response;
5131 HttpRequestHeaders request_headers;
5132 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
5133 callback_.callback()));
5134 // Run the message loop to finish asynchronous mock write.
5135 base::RunLoop().RunUntilIdle();
5136 // Read the response.
5137 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
5138 EXPECT_EQ(200, response.headers->response_code());
5139
Zhongyi Shif3fcbbe62018-08-16 22:52:085140 // There should be a new task posted to migrate back to the default network.
5141 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
5142 base::TimeDelta next_task_delay = task_runner->NextPendingTaskDelay();
5143 EXPECT_EQ(base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs),
5144 next_task_delay);
5145 task_runner->FastForwardBy(next_task_delay);
5146
5147 // There should be two tasks posted. One will retry probing and the other
5148 // will retry migrate back.
5149 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
5150 next_task_delay = task_runner->NextPendingTaskDelay();
5151 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2 * kDefaultRTTMilliSecs),
5152 next_task_delay);
5153
5154 // Deliver the signal that the default network is disconnected.
5155 scoped_mock_network_change_notifier_->mock_network_change_notifier()
5156 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
5157 // Verify no connectivity probes will be sent as probing will be cancelled.
5158 task_runner->FastForwardUntilNoTasksRemain();
5159 // Deliver the signal that the alternate network is made default.
5160 scoped_mock_network_change_notifier_->mock_network_change_notifier()
5161 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
5162 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
5163
Zhongyi Shi8de43832018-08-15 23:40:005164 stream.reset();
5165 EXPECT_TRUE(socket_data.AllReadDataConsumed());
5166 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
5167 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
5168 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
5169}
5170
Zhongyi Shi247d6322018-07-24 07:03:355171// Test that connection will be closed with PACKET_WRITE_ERROR if a write error
5172// is triggered before handshake is confirmed and connection migration is turned
5173// on.
5174TEST_P(QuicStreamFactoryTest, MigrationOnWriteErrorBeforeHandshakeConfirmed) {
Zhongyi Shi967d2f12019-02-08 20:58:535175 DCHECK(!test_params_.quic_retry_on_alternate_network_before_handshake);
Zhongyi Shi247d6322018-07-24 07:03:355176 InitializeConnectionMigrationV2Test(
5177 {kDefaultNetworkForTests, kNewNetworkForTests});
5178
5179 // Use unmocked crypto stream to do crypto connect.
5180 crypto_client_stream_factory_.set_handshake_mode(
Zhongyi Shi879659422018-08-02 17:58:255181 MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
Zhongyi Shi247d6322018-07-24 07:03:355182
5183 MockQuicData socket_data;
5184 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5185 // Trigger PACKET_WRITE_ERROR when sending packets in crypto connect.
5186 socket_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
5187 socket_data.AddSocketDataToFactory(socket_factory_.get());
5188
5189 // Create request, should fail after the write of the CHLO fails.
5190 QuicStreamRequest request(factory_.get());
5191 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:035192 request.Request(
5193 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5194 SocketTag(),
5195 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
5196 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi247d6322018-07-24 07:03:355197 EXPECT_EQ(ERR_QUIC_HANDSHAKE_FAILED, callback_.WaitForResult());
5198 EXPECT_FALSE(HasActiveSession(host_port_pair_));
5199 EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_));
5200
5201 // Verify new requests can be sent normally.
5202 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:275203 MockCryptoClientStream::COLD_START);
Zhongyi Shi247d6322018-07-24 07:03:355204 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
5205 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5206 MockQuicData socket_data2;
5207 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5208 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
5209 socket_data2.AddSocketDataToFactory(socket_factory_.get());
5210
5211 QuicStreamRequest request2(factory_.get());
5212 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:035213 request2.Request(
5214 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5215 SocketTag(),
5216 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
5217 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi247d6322018-07-24 07:03:355218 EXPECT_FALSE(HasActiveSession(host_port_pair_));
5219 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
5220 // Run the message loop to complete host resolution.
5221 base::RunLoop().RunUntilIdle();
5222
5223 // Complete handshake. QuicStreamFactory::Job should complete and succeed.
5224 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
5225 quic::QuicSession::HANDSHAKE_CONFIRMED);
5226 EXPECT_THAT(callback_.WaitForResult(), IsOk());
5227 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5228 EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_));
5229
5230 // Create QuicHttpStream.
5231 std::unique_ptr<HttpStream> stream = CreateStream(&request2);
5232 EXPECT_TRUE(stream.get());
5233 stream.reset();
5234 EXPECT_TRUE(socket_data.AllReadDataConsumed());
5235 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
5236 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
5237 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
5238}
5239
Zhongyi Shif2524bf2019-01-27 07:44:035240// Test that if the original connection is closed with QUIC_PACKET_WRITE_ERROR
5241// before handshake is confirmed and new connection before handshake is turned
5242// on, a new connection will be retried on the alternate network.
5243TEST_P(QuicStreamFactoryTest,
5244 RetryConnectionOnWriteErrorBeforeHandshakeConfirmed) {
Zhongyi Shi967d2f12019-02-08 20:58:535245 test_params_.quic_retry_on_alternate_network_before_handshake = true;
Zhongyi Shif2524bf2019-01-27 07:44:035246 InitializeConnectionMigrationV2Test(
5247 {kDefaultNetworkForTests, kNewNetworkForTests});
5248
5249 // Use unmocked crypto stream to do crypto connect.
5250 crypto_client_stream_factory_.set_handshake_mode(
5251 MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
5252
5253 // Socket data for connection on the default network.
5254 MockQuicData socket_data;
5255 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5256 // Trigger PACKET_WRITE_ERROR when sending packets in crypto connect.
5257 socket_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
5258 socket_data.AddSocketDataToFactory(socket_factory_.get());
5259
5260 // Socket data for connection on the alternate network.
5261 MockQuicData socket_data2;
5262 quic::QuicStreamOffset header_stream_offset = 0;
5263 socket_data2.AddWrite(SYNCHRONOUS, client_maker_.MakeDummyCHLOPacket(1));
5264 socket_data2.AddRead(ASYNC, ERR_IO_PENDING); // Pause.
5265 // Change the encryption level after handshake is confirmed.
5266 client_maker_.SetEncryptionLevel(quic::ENCRYPTION_FORWARD_SECURE);
5267 socket_data2.AddWrite(
5268 ASYNC, ConstructInitialSettingsPacket(2, &header_stream_offset));
5269 socket_data2.AddWrite(
5270 ASYNC, ConstructGetRequestPacket(
5271 3, GetNthClientInitiatedBidirectionalStreamId(0), true, true,
5272 &header_stream_offset));
5273 socket_data2.AddRead(
5274 ASYNC,
5275 ConstructOkResponsePacket(
5276 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
5277 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5278 socket_data2.AddWrite(
5279 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
5280 4, false, GetNthClientInitiatedBidirectionalStreamId(0),
5281 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
5282 socket_data2.AddSocketDataToFactory(socket_factory_.get());
5283
5284 // Create request, should fail after the write of the CHLO fails.
5285 QuicStreamRequest request(factory_.get());
5286 EXPECT_EQ(ERR_IO_PENDING,
5287 request.Request(
5288 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5289 SocketTag(),
5290 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
5291 failed_on_default_network_callback_, callback_.callback()));
5292 // Ensure that the session is alive but not active.
5293 EXPECT_FALSE(HasActiveSession(host_port_pair_));
5294 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
5295 base::RunLoop().RunUntilIdle();
5296 QuicChromiumClientSession* session = GetPendingSession(host_port_pair_);
5297 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5298
5299 // Confirm the handshake on the alternate network.
5300 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
5301 quic::QuicSession::HANDSHAKE_CONFIRMED);
5302 EXPECT_THAT(callback_.WaitForResult(), IsOk());
5303 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5304
5305 // Resume the data now so that data can be sent and read.
5306 socket_data2.Resume();
5307
5308 // Create the stream.
5309 std::unique_ptr<HttpStream> stream = CreateStream(&request);
5310 EXPECT_TRUE(stream.get());
5311 HttpRequestInfo request_info;
5312 request_info.method = "GET";
5313 request_info.url = GURL("https://www.example.org/");
5314 request_info.traffic_annotation =
5315 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
5316 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
5317 net_log_, CompletionOnceCallback()));
5318 // Send the request.
5319 HttpResponseInfo response;
5320 HttpRequestHeaders request_headers;
5321 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
5322 callback_.callback()));
5323 // Run the message loop to finish asynchronous mock write.
5324 base::RunLoop().RunUntilIdle();
5325 // Read the response.
5326 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
5327 EXPECT_EQ(200, response.headers->response_code());
5328
5329 stream.reset();
5330 EXPECT_TRUE(socket_data.AllReadDataConsumed());
5331 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
5332 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
5333 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
5334}
5335
jri9f303712016-09-13 01:10:225336void QuicStreamFactoryTestBase::TestMigrationOnWriteError(
5337 IoMode write_error_mode) {
Zhongyi Shi1a054612018-06-14 04:59:085338 InitializeConnectionMigrationV2Test(
jri9f303712016-09-13 01:10:225339 {kDefaultNetworkForTests, kNewNetworkForTests});
5340 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
5341 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5342 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5343
Zhongyi Shi3c4c9e92018-07-02 23:16:235344 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
5345
jri9f303712016-09-13 01:10:225346 MockQuicData socket_data;
Ryan Hamilton8d9ee76e2018-05-29 23:52:525347 quic::QuicStreamOffset header_stream_offset = 0;
jri9f303712016-09-13 01:10:225348 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
rch5cb522462017-04-25 20:18:365349 socket_data.AddWrite(
Zhongyi Shi32f2fd02018-04-16 18:23:435350 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
jri9f303712016-09-13 01:10:225351 socket_data.AddWrite(write_error_mode, ERR_ADDRESS_UNREACHABLE);
Zhongyi Shi5f587cc2017-11-21 23:24:175352 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri9f303712016-09-13 01:10:225353
5354 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:455355 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:335356 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:035357 request.Request(
5358 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5359 SocketTag(),
5360 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
5361 failed_on_default_network_callback_, callback_.callback()));
jri9f303712016-09-13 01:10:225362 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:245363 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri9f303712016-09-13 01:10:225364 EXPECT_TRUE(stream.get());
5365
5366 // Cause QUIC stream to be created.
5367 HttpRequestInfo request_info;
5368 request_info.method = "GET";
5369 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:395370 request_info.traffic_annotation =
5371 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:275372 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:395373 net_log_, CompletionOnceCallback()));
jri9f303712016-09-13 01:10:225374
5375 // Ensure that session is alive and active.
5376 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
5377 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5378 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5379
5380 // Set up second socket data provider that is used after
5381 // migration. The request is rewritten to this new socket, and the
5382 // response to the request is read on this new socket.
5383 MockQuicData socket_data1;
Fan Yang32c5a112018-12-10 20:06:335384 socket_data1.AddWrite(
5385 SYNCHRONOUS, ConstructGetRequestPacket(
5386 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
5387 true, &header_stream_offset));
Zhongyi Shi32f2fd02018-04-16 18:23:435388 socket_data1.AddRead(
Fan Yang32c5a112018-12-10 20:06:335389 ASYNC,
5390 ConstructOkResponsePacket(
5391 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
jri9f303712016-09-13 01:10:225392 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Fan Yang32c5a112018-12-10 20:06:335393 socket_data1.AddWrite(
5394 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
5395 3, false, GetNthClientInitiatedBidirectionalStreamId(0),
5396 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi5f587cc2017-11-21 23:24:175397 socket_data1.AddSocketDataToFactory(socket_factory_.get());
jri9f303712016-09-13 01:10:225398
5399 // Send GET request on stream. This should cause a write error, which triggers
5400 // a connection migration attempt.
5401 HttpResponseInfo response;
5402 HttpRequestHeaders request_headers;
5403 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
5404 callback_.callback()));
5405
5406 // Run the message loop so that the migration attempt is executed and
5407 // data queued in the new socket is read by the packet reader.
5408 base::RunLoop().RunUntilIdle();
5409
Zhongyi Shia7dd46b2018-07-12 22:59:295410 // Verify that session is alive and not marked as going awya.
jri9f303712016-09-13 01:10:225411 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia7dd46b2018-07-12 22:59:295412 EXPECT_TRUE(HasActiveSession(host_port_pair_));
jri9f303712016-09-13 01:10:225413 EXPECT_EQ(1u, session->GetNumActiveStreams());
5414
5415 // Verify that response headers on the migrated socket were delivered to the
5416 // stream.
5417 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
5418 EXPECT_EQ(200, response.headers->response_code());
5419
5420 stream.reset();
5421
5422 EXPECT_TRUE(socket_data.AllReadDataConsumed());
5423 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
5424 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
5425 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
5426}
5427
5428TEST_P(QuicStreamFactoryTest, MigrateSessionOnWriteErrorSynchronous) {
5429 TestMigrationOnWriteError(SYNCHRONOUS);
5430}
5431
5432TEST_P(QuicStreamFactoryTest, MigrateSessionOnWriteErrorAsync) {
5433 TestMigrationOnWriteError(ASYNC);
5434}
5435
5436void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorNoNewNetwork(
5437 IoMode write_error_mode) {
Zhongyi Shi1a054612018-06-14 04:59:085438 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
jri9f303712016-09-13 01:10:225439 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
5440 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5441
jri5b785512016-09-13 04:29:115442 // Use the test task runner, to force the migration alarm timeout later.
5443 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
5444
jri9f303712016-09-13 01:10:225445 MockQuicData socket_data;
5446 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:435447 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
jri9f303712016-09-13 01:10:225448 socket_data.AddWrite(write_error_mode, ERR_ADDRESS_UNREACHABLE);
Zhongyi Shi5f587cc2017-11-21 23:24:175449 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri9f303712016-09-13 01:10:225450
5451 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:455452 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:335453 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:035454 request.Request(
5455 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5456 SocketTag(),
5457 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
5458 failed_on_default_network_callback_, callback_.callback()));
jri9f303712016-09-13 01:10:225459 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:245460 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri9f303712016-09-13 01:10:225461 EXPECT_TRUE(stream.get());
5462
5463 // Cause QUIC stream to be created.
5464 HttpRequestInfo request_info;
5465 request_info.method = "GET";
5466 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:395467 request_info.traffic_annotation =
5468 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:275469 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:395470 net_log_, CompletionOnceCallback()));
jri9f303712016-09-13 01:10:225471
5472 // Ensure that session is alive and active.
5473 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
5474 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5475 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5476
jri5b785512016-09-13 04:29:115477 // Send GET request on stream. This causes a write error, which triggers
5478 // a connection migration attempt. Since there are no networks
5479 // to migrate to, this causes the session to wait for a new network.
jri9f303712016-09-13 01:10:225480 HttpResponseInfo response;
5481 HttpRequestHeaders request_headers;
5482 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
5483 callback_.callback()));
jri5b785512016-09-13 04:29:115484
5485 // Complete any pending writes. Pending async MockQuicData writes
5486 // are run on the message loop, not on the test runner.
jri9f303712016-09-13 01:10:225487 base::RunLoop().RunUntilIdle();
jri5b785512016-09-13 04:29:115488
5489 // Write error causes migration task to be posted. Spin the loop.
5490 if (write_error_mode == ASYNC)
5491 runner_->RunNextTask();
5492
5493 // Migration has not yet failed. The session should be alive and active.
5494 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5495 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5496 EXPECT_EQ(1u, session->GetNumActiveStreams());
5497 EXPECT_TRUE(session->connection()->writer()->IsWriteBlocked());
5498
5499 // The migration will not fail until the migration alarm timeout.
5500 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5501 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5502 EXPECT_EQ(1u, session->GetNumActiveStreams());
5503 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
5504
5505 // Force migration alarm timeout to run.
5506 RunTestLoopUntilIdle();
5507
5508 // The connection should be closed. A request for response headers
5509 // should fail.
jri9f303712016-09-13 01:10:225510 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5511 EXPECT_FALSE(HasActiveSession(host_port_pair_));
jri5b785512016-09-13 04:29:115512 EXPECT_EQ(ERR_NETWORK_CHANGED, callback_.WaitForResult());
5513 EXPECT_EQ(ERR_NETWORK_CHANGED,
5514 stream->ReadResponseHeaders(callback_.callback()));
jri9f303712016-09-13 01:10:225515
Zhongyi Shi59aaf072019-01-17 03:32:135516 NetErrorDetails error_details;
5517 stream->PopulateNetErrorDetails(&error_details);
5518 EXPECT_EQ(error_details.quic_connection_error,
5519 quic::QUIC_CONNECTION_MIGRATION_NO_NEW_NETWORK);
5520
jri9f303712016-09-13 01:10:225521 EXPECT_TRUE(socket_data.AllReadDataConsumed());
5522 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
5523}
5524
5525TEST_P(QuicStreamFactoryTest,
5526 MigrateSessionOnWriteErrorNoNewNetworkSynchronous) {
5527 TestMigrationOnWriteErrorNoNewNetwork(SYNCHRONOUS);
5528}
5529
5530TEST_P(QuicStreamFactoryTest, MigrateSessionOnWriteErrorNoNewNetworkAsync) {
5531 TestMigrationOnWriteErrorNoNewNetwork(ASYNC);
5532}
5533
Zhongyi Shi0439ecc72018-07-11 04:41:265534TEST_P(QuicStreamFactoryTest,
5535 MigrateSessionOnWriteErrorWithMultipleRequestsSync) {
5536 TestMigrationOnWriteErrorWithMultipleRequests(SYNCHRONOUS);
5537}
5538
5539TEST_P(QuicStreamFactoryTest,
5540 MigrateSessionOnWriteErrorWithMultipleRequestsAsync) {
5541 TestMigrationOnWriteErrorWithMultipleRequests(ASYNC);
5542}
5543
5544// Sets up a test which verifies that connection migration on write error can
5545// eventually succeed and rewrite the packet on the new network with *multiple*
5546// migratable streams.
5547void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorWithMultipleRequests(
5548 IoMode write_error_mode) {
5549 InitializeConnectionMigrationV2Test(
5550 {kDefaultNetworkForTests, kNewNetworkForTests});
5551 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
5552 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5553 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5554
5555 MockQuicData socket_data;
5556 quic::QuicStreamOffset header_stream_offset = 0;
5557 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5558 socket_data.AddWrite(
5559 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
5560 socket_data.AddWrite(write_error_mode, ERR_ADDRESS_UNREACHABLE);
5561 socket_data.AddSocketDataToFactory(socket_factory_.get());
5562
5563 // Set up second socket data provider that is used after
5564 // migration. The request is rewritten to this new socket, and the
5565 // response to the request is read on this new socket.
5566 MockQuicData socket_data1;
Zhongyi Shi0439ecc72018-07-11 04:41:265567 socket_data1.AddWrite(
Fan Yang32c5a112018-12-10 20:06:335568 SYNCHRONOUS, ConstructGetRequestPacket(
5569 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
5570 true, &header_stream_offset));
5571 socket_data1.AddRead(
5572 ASYNC,
5573 ConstructOkResponsePacket(
5574 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
5575 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5576 socket_data1.AddWrite(
5577 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
5578 3, false, GetNthClientInitiatedBidirectionalStreamId(0),
5579 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
5580 socket_data1.AddWrite(
5581 SYNCHRONOUS, client_maker_.MakeRstPacket(
5582 4, false, GetNthClientInitiatedBidirectionalStreamId(1),
Frank Kastenholz684ea412019-02-13 18:48:185583 quic::QUIC_STREAM_CANCELLED, 0,
5584 /*include_stop_sending_if_v99=*/true));
Zhongyi Shi0439ecc72018-07-11 04:41:265585
5586 socket_data1.AddSocketDataToFactory(socket_factory_.get());
5587
5588 // Create request #1 and QuicHttpStream.
5589 QuicStreamRequest request1(factory_.get());
5590 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:035591 request1.Request(
5592 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5593 SocketTag(),
5594 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
5595 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi0439ecc72018-07-11 04:41:265596 EXPECT_THAT(callback_.WaitForResult(), IsOk());
5597 std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
5598 EXPECT_TRUE(stream1.get());
5599
5600 HttpRequestInfo request_info1;
5601 request_info1.method = "GET";
5602 request_info1.url = GURL("https://www.example.org/");
5603 request_info1.traffic_annotation =
5604 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
5605 EXPECT_EQ(OK,
5606 stream1->InitializeStream(&request_info1, true, DEFAULT_PRIORITY,
5607 net_log_, CompletionOnceCallback()));
5608
5609 // Second request returns synchronously because it pools to existing session.
5610 TestCompletionCallback callback2;
5611 QuicStreamRequest request2(factory_.get());
5612 EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
5613 DEFAULT_PRIORITY, SocketTag(),
5614 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:035615 &net_error_details_,
5616 failed_on_default_network_callback_,
5617 callback2.callback()));
Zhongyi Shi0439ecc72018-07-11 04:41:265618 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
5619 EXPECT_TRUE(stream2.get());
5620 HttpRequestInfo request_info2;
5621 request_info2.method = "GET";
5622 request_info2.url = GURL("https://www.example.org/");
5623 request_info2.traffic_annotation =
5624 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
5625 EXPECT_EQ(OK,
5626 stream2->InitializeStream(&request_info2, true, DEFAULT_PRIORITY,
5627 net_log_, CompletionOnceCallback()));
5628
5629 // Ensure that session is alive and active.
5630 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
5631 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5632 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5633 EXPECT_EQ(2u, session->GetNumActiveStreams());
5634
5635 // Send GET request on stream. This should cause a write error, which triggers
5636 // a connection migration attempt.
5637 HttpResponseInfo response;
5638 HttpRequestHeaders request_headers;
5639 EXPECT_EQ(OK, stream1->SendRequest(request_headers, &response,
5640 callback_.callback()));
5641
5642 // Run the message loop so that the migration attempt is executed and
5643 // data queued in the new socket is read by the packet reader.
5644 base::RunLoop().RunUntilIdle();
5645
Zhongyi Shia7dd46b2018-07-12 22:59:295646 // Verify session is still alive and not marked as going away.
Zhongyi Shi0439ecc72018-07-11 04:41:265647 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia7dd46b2018-07-12 22:59:295648 EXPECT_TRUE(HasActiveSession(host_port_pair_));
Zhongyi Shi0439ecc72018-07-11 04:41:265649 EXPECT_EQ(2u, session->GetNumActiveStreams());
5650
5651 // Verify that response headers on the migrated socket were delivered to the
5652 // stream.
5653 EXPECT_EQ(OK, stream1->ReadResponseHeaders(callback_.callback()));
5654 EXPECT_EQ(200, response.headers->response_code());
5655
5656 stream1.reset();
5657 stream2.reset();
5658
5659 EXPECT_TRUE(socket_data.AllReadDataConsumed());
5660 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
5661 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
5662 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
5663}
5664
5665TEST_P(QuicStreamFactoryTest, MigrateOnWriteErrorWithMixedRequestsSync) {
5666 TestMigrationOnWriteErrorMixedStreams(SYNCHRONOUS);
5667}
5668
5669TEST_P(QuicStreamFactoryTest, MigrateOnWriteErrorWithMixedRequestsAsync) {
5670 TestMigrationOnWriteErrorMixedStreams(ASYNC);
5671}
5672
5673// Sets up a test that verifies connection migration manages to migrate to
5674// alternate network after encountering a SYNC/ASYNC write error based on
5675// |write_error_mode| on the original network.
5676// Note there are mixed types of unfinished requests before migration: one
5677// migratable and one non-migratable. The *migratable* one triggers write
5678// error.
5679void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorMixedStreams(
5680 IoMode write_error_mode) {
5681 InitializeConnectionMigrationV2Test(
5682 {kDefaultNetworkForTests, kNewNetworkForTests});
5683 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
5684 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5685 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5686
5687 int packet_number = 1;
5688 MockQuicData socket_data;
5689 quic::QuicStreamOffset header_stream_offset = 0;
5690 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5691 socket_data.AddWrite(
5692 SYNCHRONOUS,
5693 ConstructInitialSettingsPacket(packet_number++, &header_stream_offset));
5694 socket_data.AddWrite(write_error_mode, ERR_ADDRESS_UNREACHABLE);
5695 socket_data.AddSocketDataToFactory(socket_factory_.get());
5696
5697 // Set up second socket data provider that is used after
5698 // migration. The request is rewritten to this new socket, and the
5699 // response to the request is read on this new socket.
5700 MockQuicData socket_data1;
5701 socket_data1.AddWrite(
Fan Yang32c5a112018-12-10 20:06:335702 SYNCHRONOUS,
5703 ConstructGetRequestPacket(packet_number++,
5704 GetNthClientInitiatedBidirectionalStreamId(0),
5705 true, true, &header_stream_offset));
Zhongyi Shi0439ecc72018-07-11 04:41:265706 socket_data1.AddWrite(
Fan Yang32c5a112018-12-10 20:06:335707 SYNCHRONOUS,
5708 client_maker_.MakeRstPacket(packet_number++, true,
5709 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 socket_data1.AddRead(
Fan Yang32c5a112018-12-10 20:06:335713 ASYNC,
5714 ConstructOkResponsePacket(
5715 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
Zhongyi Shi0439ecc72018-07-11 04:41:265716 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5717 socket_data1.AddWrite(
Fan Yang32c5a112018-12-10 20:06:335718 SYNCHRONOUS,
5719 client_maker_.MakeAckAndRstPacket(
5720 packet_number++, false, GetNthClientInitiatedBidirectionalStreamId(0),
5721 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi0439ecc72018-07-11 04:41:265722 socket_data1.AddSocketDataToFactory(socket_factory_.get());
5723
5724 // Create request #1 and QuicHttpStream.
5725 QuicStreamRequest request1(factory_.get());
5726 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:035727 request1.Request(
5728 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5729 SocketTag(),
5730 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
5731 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi0439ecc72018-07-11 04:41:265732 EXPECT_THAT(callback_.WaitForResult(), IsOk());
5733 std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
5734 EXPECT_TRUE(stream1.get());
5735
5736 HttpRequestInfo request_info1;
5737 request_info1.method = "GET";
5738 request_info1.url = GURL("https://www.example.org/");
5739 request_info1.traffic_annotation =
5740 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
5741 EXPECT_EQ(OK,
5742 stream1->InitializeStream(&request_info1, true, DEFAULT_PRIORITY,
5743 net_log_, CompletionOnceCallback()));
5744
5745 // Second request returns synchronously because it pools to existing session.
5746 TestCompletionCallback callback2;
5747 QuicStreamRequest request2(factory_.get());
5748 EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
5749 DEFAULT_PRIORITY, SocketTag(),
5750 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:035751 &net_error_details_,
5752 failed_on_default_network_callback_,
5753 callback2.callback()));
Zhongyi Shi0439ecc72018-07-11 04:41:265754 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
5755 EXPECT_TRUE(stream2.get());
5756
5757 HttpRequestInfo request_info2;
5758 request_info2.method = "GET";
Zhongyi Shibb28b1f2018-07-18 02:41:265759 request_info2.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION_TO_CELLULAR;
Zhongyi Shi0439ecc72018-07-11 04:41:265760 request_info2.url = GURL("https://www.example.org/");
5761 request_info2.traffic_annotation =
5762 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
5763 EXPECT_EQ(OK,
5764 stream2->InitializeStream(&request_info2, true, DEFAULT_PRIORITY,
5765 net_log_, CompletionOnceCallback()));
5766
5767 // Ensure that session is alive and active.
5768 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
5769 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5770 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5771 EXPECT_EQ(2u, session->GetNumActiveStreams());
5772
5773 // Send GET request on stream 1. This should cause a write error, which
5774 // triggers a connection migration attempt.
5775 HttpResponseInfo response;
5776 HttpRequestHeaders request_headers;
5777 EXPECT_EQ(OK, stream1->SendRequest(request_headers, &response,
5778 callback_.callback()));
5779
5780 // Run the message loop so that the migration attempt is executed and
5781 // data queued in the new socket is read by the packet reader.
5782 base::RunLoop().RunUntilIdle();
5783
Zhongyi Shia7dd46b2018-07-12 22:59:295784 // Verify that the session is still alive and not marked as going away.
5785 // Non-migratable stream should be closed due to migration.
Zhongyi Shi0439ecc72018-07-11 04:41:265786 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia7dd46b2018-07-12 22:59:295787 EXPECT_TRUE(HasActiveSession(host_port_pair_));
Zhongyi Shi0439ecc72018-07-11 04:41:265788 EXPECT_EQ(1u, session->GetNumActiveStreams());
5789
5790 // Verify that response headers on the migrated socket were delivered to the
5791 // stream.
5792 EXPECT_EQ(OK, stream1->ReadResponseHeaders(callback_.callback()));
5793 EXPECT_EQ(200, response.headers->response_code());
5794
5795 stream1.reset();
5796
5797 EXPECT_TRUE(socket_data.AllReadDataConsumed());
5798 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
5799 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
5800 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
5801}
5802
5803TEST_P(QuicStreamFactoryTest, MigrateOnWriteErrorWithMixedRequests2Sync) {
5804 TestMigrationOnWriteErrorMixedStreams2(SYNCHRONOUS);
5805}
5806
5807TEST_P(QuicStreamFactoryTest, MigrateOnWriteErrorWithMixedRequests2Async) {
5808 TestMigrationOnWriteErrorMixedStreams2(ASYNC);
5809}
5810
5811// The one triggers write error is a non-migratable stream.
5812// Sets up a test that verifies connection migration manages to migrate to
5813// alternate network after encountering a SYNC/ASYNC write error based on
5814// |write_error_mode| on the original network.
5815// Note there are mixed types of unfinished requests before migration: one
5816// migratable and one non-migratable. The *non-migratable* one triggers write
5817// error.
5818void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorMixedStreams2(
5819 IoMode write_error_mode) {
5820 InitializeConnectionMigrationV2Test(
5821 {kDefaultNetworkForTests, kNewNetworkForTests});
5822 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
5823 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5824 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5825
5826 int packet_number = 1;
5827 MockQuicData socket_data;
5828 quic::QuicStreamOffset header_stream_offset = 0;
5829 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5830 socket_data.AddWrite(
5831 SYNCHRONOUS,
5832 ConstructInitialSettingsPacket(packet_number++, &header_stream_offset));
5833 socket_data.AddWrite(write_error_mode,
5834 ERR_ADDRESS_UNREACHABLE); // Write error.
5835 socket_data.AddSocketDataToFactory(socket_factory_.get());
5836
5837 // Set up second socket data provider that is used after
5838 // migration. The request is rewritten to this new socket, and the
5839 // response to the request is read on this new socket.
5840 MockQuicData socket_data1;
5841 // The packet triggered writer error will be sent anyway even if the stream
5842 // will be cancelled later.
5843 socket_data1.AddWrite(
Fan Yang32c5a112018-12-10 20:06:335844 SYNCHRONOUS,
5845 ConstructGetRequestPacket(packet_number++,
5846 GetNthClientInitiatedBidirectionalStreamId(1),
5847 true, true, &header_stream_offset));
Zhongyi Shi0439ecc72018-07-11 04:41:265848 socket_data1.AddWrite(
Fan Yang32c5a112018-12-10 20:06:335849 SYNCHRONOUS,
5850 client_maker_.MakeRstPacket(packet_number++, true,
5851 GetNthClientInitiatedBidirectionalStreamId(1),
Frank Kastenholz684ea412019-02-13 18:48:185852 quic::QUIC_STREAM_CANCELLED, 0,
5853 /*include_stop_sending_if_v99=*/true));
Zhongyi Shi0439ecc72018-07-11 04:41:265854 socket_data1.AddWrite(
Fan Yang32c5a112018-12-10 20:06:335855 SYNCHRONOUS,
5856 ConstructGetRequestPacket(packet_number++,
5857 GetNthClientInitiatedBidirectionalStreamId(0),
5858 true, true, &header_stream_offset));
Zhongyi Shi0439ecc72018-07-11 04:41:265859 socket_data1.AddRead(
Fan Yang32c5a112018-12-10 20:06:335860 ASYNC,
5861 ConstructOkResponsePacket(
5862 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
Zhongyi Shi0439ecc72018-07-11 04:41:265863 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5864 socket_data1.AddWrite(
Fan Yang32c5a112018-12-10 20:06:335865 SYNCHRONOUS,
5866 client_maker_.MakeAckAndRstPacket(
5867 packet_number++, false, GetNthClientInitiatedBidirectionalStreamId(0),
5868 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi0439ecc72018-07-11 04:41:265869 socket_data1.AddSocketDataToFactory(socket_factory_.get());
5870
5871 // Create request #1 and QuicHttpStream.
5872 QuicStreamRequest request1(factory_.get());
5873 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:035874 request1.Request(
5875 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5876 SocketTag(),
5877 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
5878 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi0439ecc72018-07-11 04:41:265879 EXPECT_THAT(callback_.WaitForResult(), IsOk());
5880 std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
5881 EXPECT_TRUE(stream1.get());
5882
5883 HttpRequestInfo request_info1;
5884 request_info1.method = "GET";
5885 request_info1.url = GURL("https://www.example.org/");
5886 request_info1.traffic_annotation =
5887 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
5888 EXPECT_EQ(OK,
5889 stream1->InitializeStream(&request_info1, true, DEFAULT_PRIORITY,
5890 net_log_, CompletionOnceCallback()));
5891
5892 // Second request returns synchronously because it pools to existing session.
5893 TestCompletionCallback callback2;
5894 QuicStreamRequest request2(factory_.get());
5895 EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
5896 DEFAULT_PRIORITY, SocketTag(),
5897 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:035898 &net_error_details_,
5899 failed_on_default_network_callback_,
5900 callback2.callback()));
Zhongyi Shi0439ecc72018-07-11 04:41:265901 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
5902 EXPECT_TRUE(stream2.get());
5903
5904 HttpRequestInfo request_info2;
5905 request_info2.method = "GET";
Zhongyi Shibb28b1f2018-07-18 02:41:265906 request_info2.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION_TO_CELLULAR;
Zhongyi Shi0439ecc72018-07-11 04:41:265907 request_info2.url = GURL("https://www.example.org/");
5908 request_info2.traffic_annotation =
5909 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
5910 EXPECT_EQ(OK,
5911 stream2->InitializeStream(&request_info2, true, DEFAULT_PRIORITY,
5912 net_log_, CompletionOnceCallback()));
5913
5914 // Ensure that session is alive and active.
5915 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
5916 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
5917 EXPECT_TRUE(HasActiveSession(host_port_pair_));
5918 EXPECT_EQ(2u, session->GetNumActiveStreams());
5919
5920 // Send GET request on stream 2 which is non-migratable. This should cause a
5921 // write error, which triggers a connection migration attempt.
5922 HttpResponseInfo response2;
5923 HttpRequestHeaders request_headers2;
5924 EXPECT_EQ(OK, stream2->SendRequest(request_headers2, &response2,
5925 callback2.callback()));
5926
5927 // Run the message loop so that the migration attempt is executed and
Zhongyi Shia7dd46b2018-07-12 22:59:295928 // data queued in the new socket is read by the packet reader. Session is
5929 // still alive and not marked as going away, non-migratable stream will be
5930 // closed.
Zhongyi Shi0439ecc72018-07-11 04:41:265931 base::RunLoop().RunUntilIdle();
5932 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia7dd46b2018-07-12 22:59:295933 EXPECT_TRUE(HasActiveSession(host_port_pair_));
Zhongyi Shi0439ecc72018-07-11 04:41:265934 EXPECT_EQ(1u, session->GetNumActiveStreams());
5935
5936 // Send GET request on stream 1.
5937 HttpResponseInfo response;
5938 HttpRequestHeaders request_headers;
5939 EXPECT_EQ(OK, stream1->SendRequest(request_headers, &response,
5940 callback_.callback()));
5941
5942 base::RunLoop().RunUntilIdle();
5943
5944 // Verify that response headers on the migrated socket were delivered to the
5945 // stream.
5946 EXPECT_EQ(OK, stream1->ReadResponseHeaders(callback_.callback()));
5947 EXPECT_EQ(200, response.headers->response_code());
5948
5949 stream1.reset();
5950
5951 EXPECT_TRUE(socket_data.AllReadDataConsumed());
5952 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
5953 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
5954 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
5955}
5956
Zhongyi Shic16b4102019-02-12 00:37:405957// This test verifies that when a connection encounters a packet write error, it
5958// will cancel non-migratable streams, and migrate to the alternate network.
jri9f303712016-09-13 01:10:225959void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorNonMigratableStream(
5960 IoMode write_error_mode) {
Zhongyi Shic16b4102019-02-12 00:37:405961 DVLOG(1) << "Write error mode: "
jri9f303712016-09-13 01:10:225962 << ((write_error_mode == SYNCHRONOUS) ? "SYNCHRONOUS" : "ASYNC");
Zhongyi Shi1a054612018-06-14 04:59:085963 InitializeConnectionMigrationV2Test(
jri9f303712016-09-13 01:10:225964 {kDefaultNetworkForTests, kNewNetworkForTests});
5965 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
5966 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
5967
Zhongyi Shic16b4102019-02-12 00:37:405968 quic::QuicStreamOffset header_stream_offset = 0;
5969 // The socket data provider for the original socket before migration.
5970 MockQuicData failed_socket_data;
5971 failed_socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
5972 failed_socket_data.AddWrite(
5973 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
5974 failed_socket_data.AddWrite(write_error_mode, ERR_ADDRESS_UNREACHABLE);
5975 failed_socket_data.AddSocketDataToFactory(socket_factory_.get());
5976
5977 // Set up second socket data provider that is used after migration.
jri9f303712016-09-13 01:10:225978 MockQuicData socket_data;
Zhongyi Shic16b4102019-02-12 00:37:405979 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
5980 // Although the write error occurs when writing a packet for the
5981 // non-migratable stream and the stream will be cancelled during migration,
5982 // the packet will still be retransimitted at the connection level.
5983 socket_data.AddWrite(
5984 SYNCHRONOUS, ConstructGetRequestPacket(
5985 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
5986 true, &header_stream_offset));
5987 // A RESET will be sent to the peer to cancel the non-migratable stream.
5988 socket_data.AddWrite(
5989 SYNCHRONOUS, client_maker_.MakeRstPacket(
5990 3, true, GetNthClientInitiatedBidirectionalStreamId(0),
5991 quic::QUIC_STREAM_CANCELLED));
Zhongyi Shi5f587cc2017-11-21 23:24:175992 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri9f303712016-09-13 01:10:225993
5994 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:455995 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:335996 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:035997 request.Request(
5998 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
5999 SocketTag(),
6000 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
6001 failed_on_default_network_callback_, callback_.callback()));
jri9f303712016-09-13 01:10:226002 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:246003 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri9f303712016-09-13 01:10:226004 EXPECT_TRUE(stream.get());
6005
6006 // Cause QUIC stream to be created, but marked as non-migratable.
6007 HttpRequestInfo request_info;
Zhongyi Shibb28b1f2018-07-18 02:41:266008 request_info.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION_TO_CELLULAR;
jri9f303712016-09-13 01:10:226009 request_info.method = "GET";
6010 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:396011 request_info.traffic_annotation =
6012 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:276013 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:396014 net_log_, CompletionOnceCallback()));
jri9f303712016-09-13 01:10:226015
6016 // Ensure that session is alive and active.
6017 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
6018 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6019 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6020
6021 // Send GET request on stream. This should cause a write error, which triggers
6022 // a connection migration attempt.
6023 HttpResponseInfo response;
6024 HttpRequestHeaders request_headers;
6025 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
6026 callback_.callback()));
6027
6028 // Run message loop to execute migration attempt.
6029 base::RunLoop().RunUntilIdle();
6030
Zhongyi Shic16b4102019-02-12 00:37:406031 // Migration closes the non-migratable stream and then migrates to the
6032 // alternate network successfully..
6033 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6034 EXPECT_TRUE(HasActiveSession(host_port_pair_));
jri9f303712016-09-13 01:10:226035
Zhongyi Shic16b4102019-02-12 00:37:406036 EXPECT_TRUE(failed_socket_data.AllReadDataConsumed());
6037 EXPECT_TRUE(failed_socket_data.AllWriteDataConsumed());
jri9f303712016-09-13 01:10:226038 EXPECT_TRUE(socket_data.AllReadDataConsumed());
6039 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
6040}
6041
6042TEST_P(QuicStreamFactoryTest,
6043 MigrateSessionOnWriteErrorNonMigratableStreamSynchronous) {
6044 TestMigrationOnWriteErrorNonMigratableStream(SYNCHRONOUS);
6045}
6046
6047TEST_P(QuicStreamFactoryTest,
6048 MigrateSessionOnWriteErrorNonMigratableStreamAsync) {
6049 TestMigrationOnWriteErrorNonMigratableStream(ASYNC);
6050}
6051
6052void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorMigrationDisabled(
6053 IoMode write_error_mode) {
Zhongyi Shi1a054612018-06-14 04:59:086054 InitializeConnectionMigrationV2Test(
jri9f303712016-09-13 01:10:226055 {kDefaultNetworkForTests, kNewNetworkForTests});
6056 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
6057 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6058
6059 MockQuicData socket_data;
6060 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:436061 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
jri9f303712016-09-13 01:10:226062 socket_data.AddWrite(write_error_mode, ERR_ADDRESS_UNREACHABLE);
Zhongyi Shi5f587cc2017-11-21 23:24:176063 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri9f303712016-09-13 01:10:226064
6065 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:456066 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:336067 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:036068 request.Request(
6069 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
6070 SocketTag(),
6071 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
6072 failed_on_default_network_callback_, callback_.callback()));
jri9f303712016-09-13 01:10:226073 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:246074 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri9f303712016-09-13 01:10:226075 EXPECT_TRUE(stream.get());
6076
6077 // Cause QUIC stream to be created.
6078 HttpRequestInfo request_info;
6079 request_info.method = "GET";
6080 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:396081 request_info.traffic_annotation =
6082 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:276083 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:396084 net_log_, CompletionOnceCallback()));
jri9f303712016-09-13 01:10:226085
6086 // Ensure that session is alive and active.
6087 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
6088 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6089 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6090
6091 // Set session config to have connection migration disabled.
Ryan Hamilton8d9ee76e2018-05-29 23:52:526092 quic::test::QuicConfigPeer::SetReceivedDisableConnectionMigration(
6093 session->config());
jri9f303712016-09-13 01:10:226094 EXPECT_TRUE(session->config()->DisableConnectionMigration());
6095
6096 // Send GET request on stream. This should cause a write error, which triggers
6097 // a connection migration attempt.
6098 HttpResponseInfo response;
6099 HttpRequestHeaders request_headers;
6100 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
6101 callback_.callback()));
6102 // Run message loop to execute migration attempt.
6103 base::RunLoop().RunUntilIdle();
6104 // Migration fails, and session is closed and deleted.
6105 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6106 EXPECT_FALSE(HasActiveSession(host_port_pair_));
6107 EXPECT_TRUE(socket_data.AllReadDataConsumed());
6108 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
6109}
6110
6111TEST_P(QuicStreamFactoryTest,
6112 MigrateSessionOnWriteErrorMigrationDisabledSynchronous) {
6113 TestMigrationOnWriteErrorMigrationDisabled(SYNCHRONOUS);
6114}
6115
6116TEST_P(QuicStreamFactoryTest,
6117 MigrateSessionOnWriteErrorMigrationDisabledAsync) {
6118 TestMigrationOnWriteErrorMigrationDisabled(ASYNC);
6119}
6120
Zhongyi Shi7f1d9212018-06-22 23:24:366121// Sets up a test which verifies that connection migration on write error can
6122// eventually succeed and rewrite the packet on the new network with singals
6123// delivered in the following order (alternate network is always availabe):
6124// - original network encounters a SYNC/ASYNC write error based on
6125// |write_error_mode_on_old_network|, the packet failed to be written is
6126// cached, session migrates immediately to the alternate network.
6127// - an immediate SYNC/ASYNC write error based on
6128// |write_error_mode_on_new_network| is encountered after migration to the
6129// alternate network, session migrates immediately to the original network.
6130// - an immediate SYNC/ASYNC write error based on
6131// |write_error_mode_on_old_network| is encountered after migration to the
6132// original network, session migrates immediately to the alternate network.
6133// - finally, session successfully sends the packet and reads the response on
6134// the alternate network.
6135// TODO(zhongyi): once https://crbug.com/855666 is fixed, this test should be
6136// modified to test that session is closed early if hopping between networks
6137// with consecutive write errors is detected.
jri9f303712016-09-13 01:10:226138void QuicStreamFactoryTestBase::TestMigrationOnMultipleWriteErrors(
Zhongyi Shi7f1d9212018-06-22 23:24:366139 IoMode write_error_mode_on_old_network,
6140 IoMode write_error_mode_on_new_network) {
6141 InitializeConnectionMigrationV2Test(
jri9f303712016-09-13 01:10:226142 {kDefaultNetworkForTests, kNewNetworkForTests});
6143 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
6144 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6145 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6146
Zhongyi Shi7f1d9212018-06-22 23:24:366147 // Set up the socket data used by the original network, which encounters a
6148 // write erorr.
6149 MockQuicData socket_data1;
6150 quic::QuicStreamOffset header_stream_offset = 0;
6151 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
6152 socket_data1.AddWrite(
6153 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
6154 socket_data1.AddWrite(write_error_mode_on_old_network,
6155 ERR_ADDRESS_UNREACHABLE); // Write Error
6156 socket_data1.AddSocketDataToFactory(socket_factory_.get());
6157
6158 // Set up the socket data used by the alternate network, which also
6159 // encounters a write error.
6160 MockQuicData failed_quic_data2;
6161 failed_quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
6162 failed_quic_data2.AddWrite(write_error_mode_on_new_network, ERR_FAILED);
6163 failed_quic_data2.AddSocketDataToFactory(socket_factory_.get());
6164
6165 // Set up the third socket data used by original network, which encounters a
6166 // write error again.
6167 MockQuicData failed_quic_data1;
6168 failed_quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
6169 failed_quic_data1.AddWrite(write_error_mode_on_old_network, ERR_FAILED);
6170 failed_quic_data1.AddSocketDataToFactory(socket_factory_.get());
6171
6172 // Set up the last socket data used by the alternate network, which will
6173 // finish migration successfully. The request is rewritten to this new socket,
6174 // and the response to the request is read on this socket.
6175 MockQuicData socket_data2;
Fan Yang32c5a112018-12-10 20:06:336176 socket_data2.AddWrite(
6177 SYNCHRONOUS, ConstructGetRequestPacket(
6178 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
6179 true, &header_stream_offset));
Zhongyi Shi7f1d9212018-06-22 23:24:366180 socket_data2.AddRead(
Fan Yang32c5a112018-12-10 20:06:336181 ASYNC,
6182 ConstructOkResponsePacket(
6183 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
Zhongyi Shi7f1d9212018-06-22 23:24:366184 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Fan Yang32c5a112018-12-10 20:06:336185 socket_data2.AddWrite(
6186 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
6187 3, false, GetNthClientInitiatedBidirectionalStreamId(0),
6188 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi7f1d9212018-06-22 23:24:366189 socket_data2.AddSocketDataToFactory(socket_factory_.get());
jri9f303712016-09-13 01:10:226190
6191 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:456192 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:336193 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:036194 request.Request(
6195 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
6196 SocketTag(),
6197 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
6198 failed_on_default_network_callback_, callback_.callback()));
jri9f303712016-09-13 01:10:226199 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:246200 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri9f303712016-09-13 01:10:226201 EXPECT_TRUE(stream.get());
6202
6203 // Cause QUIC stream to be created.
6204 HttpRequestInfo request_info;
6205 request_info.method = "GET";
6206 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:396207 request_info.traffic_annotation =
6208 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:276209 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:396210 net_log_, CompletionOnceCallback()));
jri9f303712016-09-13 01:10:226211
6212 // Ensure that session is alive and active.
6213 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
6214 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6215 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6216
Zhongyi Shi7f1d9212018-06-22 23:24:366217 // Send GET request on stream.
6218 // This should encounter a write error on network 1,
6219 // then migrate to network 2, which encounters another write error,
6220 // and migrate again to network 1, which encoutners one more write error.
6221 // Finally the session migrates to network 2 successfully.
jri9f303712016-09-13 01:10:226222 HttpResponseInfo response;
6223 HttpRequestHeaders request_headers;
6224 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
6225 callback_.callback()));
jri9f303712016-09-13 01:10:226226
jri9f303712016-09-13 01:10:226227 base::RunLoop().RunUntilIdle();
Zhongyi Shi7f1d9212018-06-22 23:24:366228 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6229 EXPECT_EQ(1u, session->GetNumActiveStreams());
jri9f303712016-09-13 01:10:226230
Zhongyi Shi7f1d9212018-06-22 23:24:366231 // Verify that response headers on the migrated socket were delivered to the
6232 // stream.
6233 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
6234 EXPECT_EQ(200, response.headers->response_code());
jri9f303712016-09-13 01:10:226235
6236 stream.reset();
Zhongyi Shi7f1d9212018-06-22 23:24:366237 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
6238 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
6239 EXPECT_TRUE(failed_quic_data2.AllReadDataConsumed());
6240 EXPECT_TRUE(failed_quic_data2.AllWriteDataConsumed());
6241 EXPECT_TRUE(failed_quic_data1.AllReadDataConsumed());
6242 EXPECT_TRUE(failed_quic_data1.AllWriteDataConsumed());
6243 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
6244 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
jri9f303712016-09-13 01:10:226245}
6246
6247TEST_P(QuicStreamFactoryTest, MigrateSessionOnMultipleWriteErrorsSyncSync) {
Zhongyi Shi7f1d9212018-06-22 23:24:366248 TestMigrationOnMultipleWriteErrors(
6249 /*write_error_mode_on_old_network*/ SYNCHRONOUS,
6250 /*write_error_mode_on_new_network*/ SYNCHRONOUS);
jri9f303712016-09-13 01:10:226251}
6252
6253TEST_P(QuicStreamFactoryTest, MigrateSessionOnMultipleWriteErrorsSyncAsync) {
Zhongyi Shi7f1d9212018-06-22 23:24:366254 TestMigrationOnMultipleWriteErrors(
6255 /*write_error_mode_on_old_network*/ SYNCHRONOUS,
6256 /*write_error_mode_on_new_network*/ ASYNC);
jri9f303712016-09-13 01:10:226257}
6258
6259TEST_P(QuicStreamFactoryTest, MigrateSessionOnMultipleWriteErrorsAsyncSync) {
Zhongyi Shi7f1d9212018-06-22 23:24:366260 TestMigrationOnMultipleWriteErrors(
6261 /*write_error_mode_on_old_network*/ ASYNC,
6262 /*write_error_mode_on_new_network*/ SYNCHRONOUS);
jri9f303712016-09-13 01:10:226263}
6264
6265TEST_P(QuicStreamFactoryTest, MigrateSessionOnMultipleWriteErrorsAsyncAsync) {
Zhongyi Shi7f1d9212018-06-22 23:24:366266 TestMigrationOnMultipleWriteErrors(
6267 /*write_error_mode_on_old_network*/ ASYNC,
6268 /*write_error_mode_on_new_network*/ ASYNC);
jri9f303712016-09-13 01:10:226269}
6270
Zhongyi Shi6abe33812018-07-24 19:43:116271// Verifies that a connection is closed when connection migration is triggered
6272// on network being disconnected and the handshake is not confirmed.
6273TEST_P(QuicStreamFactoryTest, NoMigrationBeforeHandshakeOnNetworkDisconnected) {
6274 InitializeConnectionMigrationV2Test(
6275 {kDefaultNetworkForTests, kNewNetworkForTests});
6276
Zhongyi Shi879659422018-08-02 17:58:256277 // Use cold start mode to do crypto connect, and send CHLO packet on wire.
Zhongyi Shi6abe33812018-07-24 19:43:116278 crypto_client_stream_factory_.set_handshake_mode(
Zhongyi Shi879659422018-08-02 17:58:256279 MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
Zhongyi Shi6abe33812018-07-24 19:43:116280
Zhongyi Shi6abe33812018-07-24 19:43:116281 MockQuicData socket_data;
Zhongyi Shi879659422018-08-02 17:58:256282 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi5068bb02018-08-03 02:44:096283 socket_data.AddWrite(ASYNC, client_maker_.MakeDummyCHLOPacket(1));
Zhongyi Shi6abe33812018-07-24 19:43:116284 socket_data.AddSocketDataToFactory(socket_factory_.get());
6285
6286 // Create request and QuicHttpStream.
6287 QuicStreamRequest request(factory_.get());
6288 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:036289 request.Request(
6290 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
6291 SocketTag(),
6292 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
6293 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shi6abe33812018-07-24 19:43:116294 // Deliver the network notification, which should cause the connection to be
6295 // closed.
6296 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6297 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
6298 EXPECT_EQ(ERR_NETWORK_CHANGED, callback_.WaitForResult());
Zhongyi Shi4293b142018-07-25 00:33:576299
Zhongyi Shi6abe33812018-07-24 19:43:116300 EXPECT_FALSE(HasActiveSession(host_port_pair_));
6301 EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_));
Zhongyi Shi4293b142018-07-25 00:33:576302 EXPECT_TRUE(socket_data.AllReadDataConsumed());
6303 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
Zhongyi Shi6abe33812018-07-24 19:43:116304}
6305
Zhongyi Shib24001c02018-06-18 20:01:526306// Sets up the connection migration test where network change notification is
6307// queued BEFORE connection migration attempt on write error is posted.
6308void QuicStreamFactoryTestBase::
6309 TestMigrationOnNetworkNotificationWithWriteErrorQueuedLater(
6310 bool disconnected) {
6311 InitializeConnectionMigrationV2Test(
jried79618b2016-07-02 03:18:526312 {kDefaultNetworkForTests, kNewNetworkForTests});
6313 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
6314 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6315 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6316
rcha00569732016-08-27 11:09:366317 MockQuicData socket_data;
Ryan Hamilton8d9ee76e2018-05-29 23:52:526318 quic::QuicStreamOffset header_stream_offset = 0;
rcha00569732016-08-27 11:09:366319 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
rch5cb522462017-04-25 20:18:366320 socket_data.AddWrite(
Zhongyi Shi32f2fd02018-04-16 18:23:436321 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
rcha00569732016-08-27 11:09:366322 socket_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
Zhongyi Shi5f587cc2017-11-21 23:24:176323 socket_data.AddSocketDataToFactory(socket_factory_.get());
jried79618b2016-07-02 03:18:526324
6325 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:456326 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:336327 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:036328 request.Request(
6329 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
6330 SocketTag(),
6331 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
6332 failed_on_default_network_callback_, callback_.callback()));
jried79618b2016-07-02 03:18:526333 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:246334 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jried79618b2016-07-02 03:18:526335 EXPECT_TRUE(stream.get());
6336
6337 // Cause QUIC stream to be created.
6338 HttpRequestInfo request_info;
6339 request_info.method = "GET";
6340 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:396341 request_info.traffic_annotation =
6342 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:276343 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:396344 net_log_, CompletionOnceCallback()));
jried79618b2016-07-02 03:18:526345
6346 // Ensure that session is alive and active.
6347 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
6348 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6349 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6350
6351 // Set up second socket data provider that is used after
6352 // migration. The request is rewritten to this new socket, and the
6353 // response to the request is read on this new socket.
rcha00569732016-08-27 11:09:366354 MockQuicData socket_data1;
Fan Yang32c5a112018-12-10 20:06:336355 socket_data1.AddWrite(
6356 SYNCHRONOUS, ConstructGetRequestPacket(
6357 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
6358 true, &header_stream_offset));
Zhongyi Shi32f2fd02018-04-16 18:23:436359 socket_data1.AddRead(
Fan Yang32c5a112018-12-10 20:06:336360 ASYNC,
6361 ConstructOkResponsePacket(
6362 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
rcha00569732016-08-27 11:09:366363 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Fan Yang32c5a112018-12-10 20:06:336364 socket_data1.AddWrite(
6365 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
6366 3, false, GetNthClientInitiatedBidirectionalStreamId(0),
6367 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi5f587cc2017-11-21 23:24:176368 socket_data1.AddSocketDataToFactory(socket_factory_.get());
jried79618b2016-07-02 03:18:526369
jri9f303712016-09-13 01:10:226370 // First queue a network change notification in the message loop.
6371 if (disconnected) {
6372 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6373 ->QueueNetworkDisconnected(kDefaultNetworkForTests);
6374 } else {
6375 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6376 ->QueueNetworkMadeDefault(kNewNetworkForTests);
6377 }
6378 // Send GET request on stream. This should cause a write error,
6379 // which triggers a connection migration attempt. This will queue a
6380 // migration attempt behind the notification in the message loop.
jried79618b2016-07-02 03:18:526381 HttpResponseInfo response;
6382 HttpRequestHeaders request_headers;
6383 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
6384 callback_.callback()));
6385
jried79618b2016-07-02 03:18:526386 base::RunLoop().RunUntilIdle();
Zhongyi Shia7dd46b2018-07-12 22:59:296387 // Verify the session is still alive and not marked as going away post
6388 // migration.
jried79618b2016-07-02 03:18:526389 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia7dd46b2018-07-12 22:59:296390 EXPECT_TRUE(HasActiveSession(host_port_pair_));
jried79618b2016-07-02 03:18:526391 EXPECT_EQ(1u, session->GetNumActiveStreams());
6392
6393 // Verify that response headers on the migrated socket were delivered to the
6394 // stream.
6395 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
6396 EXPECT_EQ(200, response.headers->response_code());
6397
6398 stream.reset();
6399
6400 EXPECT_TRUE(socket_data.AllReadDataConsumed());
6401 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
6402 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
6403 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
6404}
6405
Zhongyi Shib24001c02018-06-18 20:01:526406// This test verifies that session attempts connection migration successfully
6407// with signals delivered in the following order (alternate network is always
6408// available):
6409// - a notification that default network is disconnected is queued.
6410// - write error is triggered: session posts a task to attempt connection
6411// migration, |migration_pending_| set to true.
6412// - default network disconnected is delivered: session immediately migrates to
6413// the alternate network, |migration_pending_| set to false.
Zhongyi Shif3d6cddb2018-07-11 03:30:026414// - connection migration on write error attempt aborts: writer encountered
6415// error is no longer in active use.
jri9f303712016-09-13 01:10:226416TEST_P(QuicStreamFactoryTest,
Zhongyi Shib24001c02018-06-18 20:01:526417 MigrateOnNetworkDisconnectedWithWriteErrorQueuedLater) {
6418 TestMigrationOnNetworkNotificationWithWriteErrorQueuedLater(
6419 /*disconnected=*/true);
jri9f303712016-09-13 01:10:226420}
6421
Zhongyi Shib24001c02018-06-18 20:01:526422// This test verifies that session attempts connection migration successfully
6423// with signals delivered in the following order (alternate network is always
6424// available):
6425// - a notification that alternate network is made default is queued.
6426// - write error is triggered: session posts a task to attempt connection
6427// migration, block future migrations.
6428// - new default notification is delivered: migrate back timer spins and task is
6429// posted to migrate to the new default network.
6430// - connection migration on write error attempt proceeds successfully: session
6431// is
6432// marked as going away, future migrations unblocked.
6433// - migrate back to default network task executed: session is already on the
6434// default network, no-op.
jri9f303712016-09-13 01:10:226435TEST_P(QuicStreamFactoryTest,
Zhongyi Shib24001c02018-06-18 20:01:526436 MigrateOnWriteErrorWithNetworkMadeDefaultQueuedEarlier) {
6437 TestMigrationOnNetworkNotificationWithWriteErrorQueuedLater(
6438 /*disconnected=*/false);
jri9f303712016-09-13 01:10:226439}
6440
Zhongyi Shi1e2bc742018-06-16 02:06:076441// Sets up the connection migration test where network change notification is
6442// queued AFTER connection migration attempt on write error is posted.
6443void QuicStreamFactoryTestBase::
6444 TestMigrationOnWriteErrorWithNotificationQueuedLater(bool disconnected) {
Zhongyi Shi1a054612018-06-14 04:59:086445 InitializeConnectionMigrationV2Test(
jri9f303712016-09-13 01:10:226446 {kDefaultNetworkForTests, kNewNetworkForTests});
jried79618b2016-07-02 03:18:526447 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
6448 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri9f303712016-09-13 01:10:226449 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jried79618b2016-07-02 03:18:526450
rcha00569732016-08-27 11:09:366451 MockQuicData socket_data;
Ryan Hamilton8d9ee76e2018-05-29 23:52:526452 quic::QuicStreamOffset header_stream_offset = 0;
rcha00569732016-08-27 11:09:366453 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
rch5cb522462017-04-25 20:18:366454 socket_data.AddWrite(
Zhongyi Shi32f2fd02018-04-16 18:23:436455 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
rcha00569732016-08-27 11:09:366456 socket_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
Zhongyi Shi5f587cc2017-11-21 23:24:176457 socket_data.AddSocketDataToFactory(socket_factory_.get());
jried79618b2016-07-02 03:18:526458
6459 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:456460 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:336461 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:036462 request.Request(
6463 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
6464 SocketTag(),
6465 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
6466 failed_on_default_network_callback_, callback_.callback()));
jried79618b2016-07-02 03:18:526467 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:246468 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jried79618b2016-07-02 03:18:526469 EXPECT_TRUE(stream.get());
6470
6471 // Cause QUIC stream to be created.
6472 HttpRequestInfo request_info;
6473 request_info.method = "GET";
6474 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:396475 request_info.traffic_annotation =
6476 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:276477 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:396478 net_log_, CompletionOnceCallback()));
jried79618b2016-07-02 03:18:526479
6480 // Ensure that session is alive and active.
6481 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
6482 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6483 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6484
jri9f303712016-09-13 01:10:226485 // Set up second socket data provider that is used after
6486 // migration. The request is rewritten to this new socket, and the
6487 // response to the request is read on this new socket.
6488 MockQuicData socket_data1;
Fan Yang32c5a112018-12-10 20:06:336489 socket_data1.AddWrite(
6490 SYNCHRONOUS, ConstructGetRequestPacket(
6491 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
6492 true, &header_stream_offset));
Zhongyi Shi32f2fd02018-04-16 18:23:436493 socket_data1.AddRead(
Fan Yang32c5a112018-12-10 20:06:336494 ASYNC,
6495 ConstructOkResponsePacket(
6496 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
jri9f303712016-09-13 01:10:226497 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Fan Yang32c5a112018-12-10 20:06:336498 socket_data1.AddWrite(
6499 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
6500 3, false, GetNthClientInitiatedBidirectionalStreamId(0),
6501 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi5f587cc2017-11-21 23:24:176502 socket_data1.AddSocketDataToFactory(socket_factory_.get());
jri9f303712016-09-13 01:10:226503
6504 // Send GET request on stream. This should cause a write error,
6505 // which triggers a connection migration attempt. This will queue a
6506 // migration attempt in the message loop.
jried79618b2016-07-02 03:18:526507 HttpResponseInfo response;
6508 HttpRequestHeaders request_headers;
jri9f303712016-09-13 01:10:226509 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
6510 callback_.callback()));
jried79618b2016-07-02 03:18:526511
jri9f303712016-09-13 01:10:226512 // Now queue a network change notification in the message loop behind
6513 // the migration attempt.
6514 if (disconnected) {
6515 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6516 ->QueueNetworkDisconnected(kDefaultNetworkForTests);
6517 } else {
6518 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6519 ->QueueNetworkMadeDefault(kNewNetworkForTests);
6520 }
6521
6522 base::RunLoop().RunUntilIdle();
Zhongyi Shia7dd46b2018-07-12 22:59:296523 // Verify session is still alive and not marked as going away.
jri9f303712016-09-13 01:10:226524 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia7dd46b2018-07-12 22:59:296525 EXPECT_TRUE(HasActiveSession(host_port_pair_));
jri9f303712016-09-13 01:10:226526 EXPECT_EQ(1u, session->GetNumActiveStreams());
6527
6528 // Verify that response headers on the migrated socket were delivered to the
6529 // stream.
6530 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
6531 EXPECT_EQ(200, response.headers->response_code());
6532
6533 stream.reset();
jried79618b2016-07-02 03:18:526534
6535 EXPECT_TRUE(socket_data.AllReadDataConsumed());
6536 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
jri9f303712016-09-13 01:10:226537 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
6538 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
jried79618b2016-07-02 03:18:526539}
6540
Zhongyi Shi1e2bc742018-06-16 02:06:076541// This test verifies that session attempts connection migration successfully
6542// with signals delivered in the following order (alternate network is always
6543// available):
6544// - write error is triggered: session posts a task to complete connection
6545// migration.
6546// - a notification that alternate network is made default is queued.
6547// - connection migration attempt proceeds successfully, session is marked as
6548// going away.
6549// - new default notification is delivered after connection migration has been
6550// completed.
jri9f303712016-09-13 01:10:226551TEST_P(QuicStreamFactoryTest,
Zhongyi Shi1e2bc742018-06-16 02:06:076552 MigrateOnWriteErrorWithNetworkMadeDefaultQueuedLater) {
6553 TestMigrationOnWriteErrorWithNotificationQueuedLater(/*disconnected=*/false);
jried79618b2016-07-02 03:18:526554}
6555
Zhongyi Shi1e2bc742018-06-16 02:06:076556// This test verifies that session attempts connection migration successfully
6557// with signals delivered in the following order (alternate network is always
6558// available):
6559// - write error is triggered: session posts a task to complete connection
6560// migration.
6561// - a notification that default network is diconnected is queued.
6562// - connection migration attempt proceeds successfully, session is marked as
6563// going away.
6564// - disconnect notification is delivered after connection migration has been
6565// completed.
jri9f303712016-09-13 01:10:226566TEST_P(QuicStreamFactoryTest,
Zhongyi Shi1e2bc742018-06-16 02:06:076567 MigrateOnWriteErrorWithNetworkDisconnectedQueuedLater) {
6568 TestMigrationOnWriteErrorWithNotificationQueuedLater(/*disconnected=*/true);
jried79618b2016-07-02 03:18:526569}
6570
Zhongyi Shia3810c52018-06-15 23:07:196571// This tests connection migration on write error with signals delivered in the
6572// following order:
6573// - a synchronous/asynchronous write error is triggered base on
Zhongyi Shif3d6cddb2018-07-11 03:30:026574// |write_error_mode|: connection migration attempt is posted.
6575// - old default network disconnects, migration waits for a new network.
Zhongyi Shia3810c52018-06-15 23:07:196576// - after a pause, new network is connected: session will migrate to new
6577// network immediately.
Zhongyi Shif3d6cddb2018-07-11 03:30:026578// - migration on writer error is exectued and aborts as writer passed in is no
6579// longer active in use.
Zhongyi Shia3810c52018-06-15 23:07:196580// - new network is made default.
jri5b785512016-09-13 04:29:116581void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorPauseBeforeConnected(
6582 IoMode write_error_mode) {
Zhongyi Shia3810c52018-06-15 23:07:196583 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
jri5b785512016-09-13 04:29:116584 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
6585 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6586 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6587
Zhongyi Shia3810c52018-06-15 23:07:196588 // Use the test task runner.
6589 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
6590
jri5b785512016-09-13 04:29:116591 MockQuicData socket_data;
Ryan Hamilton8d9ee76e2018-05-29 23:52:526592 quic::QuicStreamOffset header_stream_offset = 0;
Zhongyi Shia3810c52018-06-15 23:07:196593 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
rch5cb522462017-04-25 20:18:366594 socket_data.AddWrite(
Zhongyi Shi32f2fd02018-04-16 18:23:436595 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
Zhongyi Shia3810c52018-06-15 23:07:196596 socket_data.AddWrite(write_error_mode, ERR_FAILED);
Zhongyi Shi5f587cc2017-11-21 23:24:176597 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri5b785512016-09-13 04:29:116598
6599 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:456600 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:336601 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:036602 request.Request(
6603 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
6604 SocketTag(),
6605 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
6606 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shia3810c52018-06-15 23:07:196607 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:246608 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri5b785512016-09-13 04:29:116609 EXPECT_TRUE(stream.get());
6610
6611 // Cause QUIC stream to be created.
6612 HttpRequestInfo request_info;
6613 request_info.method = "GET";
Zhongyi Shia3810c52018-06-15 23:07:196614 request_info.url = url_;
Ramin Halavati683bcaa92018-02-14 08:42:396615 request_info.traffic_annotation =
6616 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:276617 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:396618 net_log_, CompletionOnceCallback()));
jri5b785512016-09-13 04:29:116619
6620 // Ensure that session is alive and active.
6621 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
6622 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6623 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6624
Zhongyi Shia3810c52018-06-15 23:07:196625 // Send GET request on stream.
jri5b785512016-09-13 04:29:116626 HttpResponseInfo response;
6627 HttpRequestHeaders request_headers;
6628 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
6629 callback_.callback()));
6630
Zhongyi Shia3810c52018-06-15 23:07:196631 // The connection should still be alive, not marked as going away.
jri5b785512016-09-13 04:29:116632 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6633 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6634 EXPECT_EQ(1u, session->GetNumActiveStreams());
6635 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
6636
Zhongyi Shia3810c52018-06-15 23:07:196637 // Set up second socket data provider that is used after migration.
6638 // The response to the earlier request is read on this new socket.
jri5b785512016-09-13 04:29:116639 MockQuicData socket_data1;
Fan Yang32c5a112018-12-10 20:06:336640 socket_data1.AddWrite(
6641 SYNCHRONOUS, ConstructGetRequestPacket(
6642 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
6643 true, &header_stream_offset));
Zhongyi Shi32f2fd02018-04-16 18:23:436644 socket_data1.AddRead(
Fan Yang32c5a112018-12-10 20:06:336645 ASYNC,
6646 ConstructOkResponsePacket(
6647 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
jri5b785512016-09-13 04:29:116648 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Fan Yang32c5a112018-12-10 20:06:336649 socket_data1.AddWrite(
6650 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
6651 3, false, GetNthClientInitiatedBidirectionalStreamId(0),
6652 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi5f587cc2017-11-21 23:24:176653 socket_data1.AddSocketDataToFactory(socket_factory_.get());
jri5b785512016-09-13 04:29:116654
Zhongyi Shia3810c52018-06-15 23:07:196655 // On a DISCONNECTED notification, nothing happens.
6656 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6657 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
6658 // Add a new network and notify the stream factory of a new connected network.
6659 // This causes a PING packet to be sent over the new network.
jri5b785512016-09-13 04:29:116660 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6661 ->SetConnectedNetworksList({kNewNetworkForTests});
6662 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6663 ->NotifyNetworkConnected(kNewNetworkForTests);
6664
Zhongyi Shia3810c52018-06-15 23:07:196665 // Ensure that the session is still alive.
jri5b785512016-09-13 04:29:116666 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia3810c52018-06-15 23:07:196667 EXPECT_TRUE(HasActiveSession(host_port_pair_));
jri5b785512016-09-13 04:29:116668 EXPECT_EQ(1u, session->GetNumActiveStreams());
6669
Zhongyi Shia3810c52018-06-15 23:07:196670 // Run the message loop migration for write error can finish.
6671 runner_->RunUntilIdle();
6672
6673 // Response headers are received over the new network.
jri5b785512016-09-13 04:29:116674 EXPECT_THAT(callback_.WaitForResult(), IsOk());
6675 EXPECT_EQ(200, response.headers->response_code());
6676
Zhongyi Shia3810c52018-06-15 23:07:196677 // Check that the session is still alive.
6678 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
jri5b785512016-09-13 04:29:116679 EXPECT_TRUE(HasActiveSession(host_port_pair_));
Zhongyi Shia3810c52018-06-15 23:07:196680
6681 // There should be no posted tasks not executed, no way to migrate back to
6682 // default network.
6683 EXPECT_TRUE(runner_->GetPostedTasks().empty());
6684
6685 // Receive signal to mark new network as default.
6686 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6687 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
jri5b785512016-09-13 04:29:116688
6689 stream.reset();
jri5b785512016-09-13 04:29:116690 EXPECT_TRUE(socket_data.AllReadDataConsumed());
6691 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
6692 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
6693 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
jri5b785512016-09-13 04:29:116694}
6695
6696TEST_P(QuicStreamFactoryTest,
Zhongyi Shia3810c52018-06-15 23:07:196697 MigrateSessionOnSyncWriteErrorPauseBeforeConnected) {
jri5b785512016-09-13 04:29:116698 TestMigrationOnWriteErrorPauseBeforeConnected(SYNCHRONOUS);
6699}
6700
6701TEST_P(QuicStreamFactoryTest,
Zhongyi Shia3810c52018-06-15 23:07:196702 MigrateSessionOnAsyncWriteErrorPauseBeforeConnected) {
jri5b785512016-09-13 04:29:116703 TestMigrationOnWriteErrorPauseBeforeConnected(ASYNC);
6704}
6705
Zhongyi Shif3d6cddb2018-07-11 03:30:026706// This test verifies that when session successfully migrate to the alternate
6707// network, packet write error on the old writer will be ignored and will not
6708// trigger connection migration on write error.
6709TEST_P(QuicStreamFactoryTest, IgnoreWriteErrorFromOldWriterAfterMigration) {
6710 InitializeConnectionMigrationV2Test(
6711 {kDefaultNetworkForTests, kNewNetworkForTests});
6712 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
6713 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6714 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6715
6716 // Using a testing task runner so that we can verify whether the migrate on
6717 // write error task is posted.
6718 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
6719 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
6720
6721 MockQuicData socket_data;
6722 quic::QuicStreamOffset header_stream_offset = 0;
6723 socket_data.AddWrite(
6724 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
6725 socket_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause
6726 socket_data.AddWrite(ASYNC, ERR_ADDRESS_UNREACHABLE);
6727 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
6728 socket_data.AddSocketDataToFactory(socket_factory_.get());
6729
6730 // Create request and QuicHttpStream.
6731 QuicStreamRequest request(factory_.get());
6732 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:036733 request.Request(
6734 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
6735 SocketTag(),
6736 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
6737 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shif3d6cddb2018-07-11 03:30:026738 EXPECT_EQ(OK, callback_.WaitForResult());
6739 std::unique_ptr<HttpStream> stream = CreateStream(&request);
6740 EXPECT_TRUE(stream.get());
6741
6742 // Cause QUIC stream to be created.
6743 HttpRequestInfo request_info;
6744 request_info.method = "GET";
6745 request_info.url = GURL("https://www.example.org/");
6746 request_info.traffic_annotation =
6747 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
6748 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
6749 net_log_, CompletionOnceCallback()));
6750
6751 // Ensure that session is alive and active.
6752 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
6753 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6754 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6755
6756 // Set up second socket data provider that is used after
6757 // migration. The response to the request is read on this new socket.
6758 MockQuicData socket_data1;
6759 socket_data1.AddWrite(
6760 SYNCHRONOUS, client_maker_.MakePingPacket(3, /*include_version=*/true));
6761 socket_data1.AddRead(
Fan Yang32c5a112018-12-10 20:06:336762 ASYNC,
6763 ConstructOkResponsePacket(
6764 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
Zhongyi Shif3d6cddb2018-07-11 03:30:026765 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Fan Yang32c5a112018-12-10 20:06:336766 socket_data1.AddWrite(
6767 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
6768 4, false, GetNthClientInitiatedBidirectionalStreamId(0),
6769 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shif3d6cddb2018-07-11 03:30:026770 socket_data1.AddSocketDataToFactory(socket_factory_.get());
6771
6772 // Send GET request on stream.
6773 HttpResponseInfo response;
6774 HttpRequestHeaders request_headers;
6775 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
6776 callback_.callback()));
6777
6778 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
6779 // Now notify network is disconnected, cause the migration to complete
6780 // immediately.
6781 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6782 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
6783 // There will be two pending task, one will complete migration with no delay
6784 // and the other will attempt to migrate back to the default network with
6785 // delay.
6786 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
6787
6788 // Complete migration.
6789 task_runner->RunUntilIdle();
6790 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
6791
6792 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6793 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6794 EXPECT_EQ(1u, session->GetNumActiveStreams());
6795
6796 // Verify that response headers on the migrated socket were delivered to the
6797 // stream.
6798 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
6799 EXPECT_EQ(200, response.headers->response_code());
6800
6801 // Resume the old socket data, a write error will be delivered to the old
6802 // packet writer. Verify no additional task is posted.
6803 socket_data.Resume();
6804 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
6805
6806 stream.reset();
6807 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
6808 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
6809 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
6810}
6811
6812// This test verifies that when session successfully migrate to the alternate
6813// network, packet read error on the old reader will be ignored and will not
6814// close the connection.
6815TEST_P(QuicStreamFactoryTest, IgnoreReadErrorFromOldReaderAfterMigration) {
6816 InitializeConnectionMigrationV2Test(
6817 {kDefaultNetworkForTests, kNewNetworkForTests});
6818 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
6819 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6820 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6821
6822 // Using a testing task runner.
6823 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
6824 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
6825
6826 MockQuicData socket_data;
6827 quic::QuicStreamOffset header_stream_offset = 0;
6828 socket_data.AddWrite(
6829 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
6830 socket_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause
6831 socket_data.AddRead(ASYNC, ERR_ADDRESS_UNREACHABLE);
6832 socket_data.AddSocketDataToFactory(socket_factory_.get());
6833
6834 // Create request and QuicHttpStream.
6835 QuicStreamRequest request(factory_.get());
6836 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:036837 request.Request(
6838 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
6839 SocketTag(),
6840 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
6841 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shif3d6cddb2018-07-11 03:30:026842 EXPECT_EQ(OK, callback_.WaitForResult());
6843 std::unique_ptr<HttpStream> stream = CreateStream(&request);
6844 EXPECT_TRUE(stream.get());
6845
6846 // Cause QUIC stream to be created.
6847 HttpRequestInfo request_info;
6848 request_info.method = "GET";
6849 request_info.url = GURL("https://www.example.org/");
6850 request_info.traffic_annotation =
6851 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
6852 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
6853 net_log_, CompletionOnceCallback()));
6854
6855 // Ensure that session is alive and active.
6856 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
6857 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6858 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6859
6860 // Set up second socket data provider that is used after
6861 // migration. The request is written to this new socket, and the
6862 // response to the request is read on this new socket.
6863 MockQuicData socket_data1;
6864 socket_data1.AddWrite(
6865 SYNCHRONOUS, client_maker_.MakePingPacket(2, /*include_version=*/true));
Fan Yang32c5a112018-12-10 20:06:336866 socket_data1.AddWrite(
6867 SYNCHRONOUS, ConstructGetRequestPacket(
6868 3, GetNthClientInitiatedBidirectionalStreamId(0), true,
6869 true, &header_stream_offset));
Zhongyi Shif3d6cddb2018-07-11 03:30:026870 socket_data1.AddRead(
Fan Yang32c5a112018-12-10 20:06:336871 ASYNC,
6872 ConstructOkResponsePacket(
6873 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
Zhongyi Shif3d6cddb2018-07-11 03:30:026874 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Fan Yang32c5a112018-12-10 20:06:336875 socket_data1.AddWrite(
6876 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
6877 4, false, GetNthClientInitiatedBidirectionalStreamId(0),
6878 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shif3d6cddb2018-07-11 03:30:026879 socket_data1.AddSocketDataToFactory(socket_factory_.get());
6880
6881 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
6882 // Now notify network is disconnected, cause the migration to complete
6883 // immediately.
6884 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6885 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
6886 // There will be two pending task, one will complete migration with no delay
6887 // and the other will attempt to migrate back to the default network with
6888 // delay.
6889 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
6890
6891 // Complete migration.
6892 task_runner->RunUntilIdle();
6893 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
6894
6895 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6896 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6897 EXPECT_EQ(1u, session->GetNumActiveStreams());
6898
6899 // Send GET request on stream.
6900 HttpResponseInfo response;
6901 HttpRequestHeaders request_headers;
6902 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
6903 callback_.callback()));
6904
6905 // Verify that response headers on the migrated socket were delivered to the
6906 // stream.
6907 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
6908 EXPECT_EQ(OK, callback_.WaitForResult());
6909 EXPECT_EQ(200, response.headers->response_code());
6910
6911 // Resume the old socket data, a read error will be delivered to the old
6912 // packet reader. Verify that the session is not affected.
6913 socket_data.Resume();
6914 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
6915 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6916 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6917 EXPECT_EQ(1u, session->GetNumActiveStreams());
6918
6919 stream.reset();
6920 EXPECT_TRUE(socket_data.AllReadDataConsumed());
6921 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
6922 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
6923 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
6924}
6925
6926// This test verifies that after migration on network is executed, packet
6927// read error on the old reader will be ignored and will not close the
6928// connection.
6929TEST_P(QuicStreamFactoryTest, IgnoreReadErrorOnOldReaderDuringMigration) {
6930 InitializeConnectionMigrationV2Test(
6931 {kDefaultNetworkForTests, kNewNetworkForTests});
6932 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
6933 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6934 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
6935
6936 // Using a testing task runner.
6937 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
6938 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
6939
6940 MockQuicData socket_data;
6941 quic::QuicStreamOffset header_stream_offset = 0;
6942 socket_data.AddWrite(
6943 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
6944 socket_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause
6945 socket_data.AddRead(ASYNC, ERR_ADDRESS_UNREACHABLE);
6946 socket_data.AddSocketDataToFactory(socket_factory_.get());
6947
6948 // Create request and QuicHttpStream.
6949 QuicStreamRequest request(factory_.get());
6950 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:036951 request.Request(
6952 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
6953 SocketTag(),
6954 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
6955 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shif3d6cddb2018-07-11 03:30:026956 EXPECT_EQ(OK, callback_.WaitForResult());
6957 std::unique_ptr<HttpStream> stream = CreateStream(&request);
6958 EXPECT_TRUE(stream.get());
6959
6960 // Cause QUIC stream to be created.
6961 HttpRequestInfo request_info;
6962 request_info.method = "GET";
6963 request_info.url = GURL("https://www.example.org/");
6964 request_info.traffic_annotation =
6965 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
6966 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
6967 net_log_, CompletionOnceCallback()));
6968
6969 // Ensure that session is alive and active.
6970 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
6971 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
6972 EXPECT_TRUE(HasActiveSession(host_port_pair_));
6973
6974 // Set up second socket data provider that is used after
6975 // migration. The request is written to this new socket, and the
6976 // response to the request is read on this new socket.
6977 MockQuicData socket_data1;
6978 socket_data1.AddWrite(
6979 SYNCHRONOUS, client_maker_.MakePingPacket(2, /*include_version=*/true));
Fan Yang32c5a112018-12-10 20:06:336980 socket_data1.AddWrite(
6981 SYNCHRONOUS, ConstructGetRequestPacket(
6982 3, GetNthClientInitiatedBidirectionalStreamId(0), true,
6983 true, &header_stream_offset));
Zhongyi Shif3d6cddb2018-07-11 03:30:026984 socket_data1.AddRead(
Fan Yang32c5a112018-12-10 20:06:336985 ASYNC,
6986 ConstructOkResponsePacket(
6987 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
Zhongyi Shif3d6cddb2018-07-11 03:30:026988 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Fan Yang32c5a112018-12-10 20:06:336989 socket_data1.AddWrite(
6990 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
6991 4, false, GetNthClientInitiatedBidirectionalStreamId(0),
6992 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shif3d6cddb2018-07-11 03:30:026993 socket_data1.AddSocketDataToFactory(socket_factory_.get());
6994
6995 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
6996 // Now notify network is disconnected, cause the migration to complete
6997 // immediately.
6998 scoped_mock_network_change_notifier_->mock_network_change_notifier()
6999 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
7000 // There will be two pending task, one will complete migration with no delay
7001 // and the other will attempt to migrate back to the default network with
7002 // delay.
7003 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
7004
7005 // Resume the old socket data, a read error will be delivered to the old
7006 // packet reader. Verify that the session is not affected.
7007 socket_data.Resume();
7008 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
7009 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
7010 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7011 EXPECT_EQ(1u, session->GetNumActiveStreams());
7012
7013 // Complete migration.
7014 task_runner->RunUntilIdle();
7015 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
7016
7017 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
7018 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7019 EXPECT_EQ(1u, session->GetNumActiveStreams());
7020
7021 // Send GET request on stream.
7022 HttpResponseInfo response;
7023 HttpRequestHeaders request_headers;
7024 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
7025 callback_.callback()));
7026
7027 // Verify that response headers on the migrated socket were delivered to the
7028 // stream.
7029 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
7030 EXPECT_EQ(OK, callback_.WaitForResult());
7031 EXPECT_EQ(200, response.headers->response_code());
7032
7033 stream.reset();
7034 EXPECT_TRUE(socket_data.AllReadDataConsumed());
7035 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
7036 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
7037 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
7038}
7039
7040// This test verifies that after migration on write error is posted, packet
7041// read error on the old reader will be ignored and will not close the
7042// connection.
7043TEST_P(QuicStreamFactoryTest,
7044 IgnoreReadErrorOnOldReaderDuringPendingMigrationOnWriteError) {
7045 InitializeConnectionMigrationV2Test(
7046 {kDefaultNetworkForTests, kNewNetworkForTests});
7047 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
7048 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7049 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7050
7051 // Using a testing task runner.
7052 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
7053 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
7054
7055 MockQuicData socket_data;
7056 quic::QuicStreamOffset header_stream_offset = 0;
7057 socket_data.AddWrite(
7058 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
7059 socket_data.AddWrite(ASYNC, ERR_FAILED); // Write error.
7060 socket_data.AddRead(ASYNC, ERR_ADDRESS_UNREACHABLE); // Read error.
7061 socket_data.AddSocketDataToFactory(socket_factory_.get());
7062
7063 // Create request and QuicHttpStream.
7064 QuicStreamRequest request(factory_.get());
7065 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:037066 request.Request(
7067 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
7068 SocketTag(),
7069 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
7070 failed_on_default_network_callback_, callback_.callback()));
Zhongyi Shif3d6cddb2018-07-11 03:30:027071 EXPECT_EQ(OK, callback_.WaitForResult());
7072 std::unique_ptr<HttpStream> stream = CreateStream(&request);
7073 EXPECT_TRUE(stream.get());
7074
7075 // Cause QUIC stream to be created.
7076 HttpRequestInfo request_info;
7077 request_info.method = "GET";
7078 request_info.url = GURL("https://www.example.org/");
7079 request_info.traffic_annotation =
7080 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
7081 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
7082 net_log_, CompletionOnceCallback()));
7083
7084 // Ensure that session is alive and active.
7085 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
7086 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
7087 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7088
7089 // Set up second socket data provider that is used after
7090 // migration. The request is written to this new socket, and the
7091 // response to the request is read on this new socket.
7092 MockQuicData socket_data1;
Fan Yang32c5a112018-12-10 20:06:337093 socket_data1.AddWrite(
7094 SYNCHRONOUS, ConstructGetRequestPacket(
7095 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
7096 true, &header_stream_offset));
Zhongyi Shif3d6cddb2018-07-11 03:30:027097 socket_data1.AddRead(
Fan Yang32c5a112018-12-10 20:06:337098 ASYNC,
7099 ConstructOkResponsePacket(
7100 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
Zhongyi Shif3d6cddb2018-07-11 03:30:027101
7102 socket_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause.
7103 socket_data1.AddRead(ASYNC, ERR_FAILED); // Read error to close connection.
7104 socket_data1.AddSocketDataToFactory(socket_factory_.get());
7105
7106 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
7107 // Send GET request on stream.
7108 HttpResponseInfo response;
7109 HttpRequestHeaders request_headers;
7110 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
7111 callback_.callback()));
7112 // Run the message loop to complete asynchronous write and read with errors.
7113 base::RunLoop().RunUntilIdle();
7114 // There will be one pending task to complete migration on write error.
7115 // Verify session is not closed with read error.
7116 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
7117 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
7118 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7119 EXPECT_EQ(1u, session->GetNumActiveStreams());
7120
7121 // Complete migration.
7122 task_runner->RunUntilIdle();
Zhongyi Shia7dd46b2018-07-12 22:59:297123 // There will be one more task posted attempting to migrate back to the
7124 // default network.
7125 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
Zhongyi Shif3d6cddb2018-07-11 03:30:027126 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shia7dd46b2018-07-12 22:59:297127 EXPECT_TRUE(HasActiveSession(host_port_pair_));
Zhongyi Shif3d6cddb2018-07-11 03:30:027128 EXPECT_EQ(1u, session->GetNumActiveStreams());
7129
7130 // Verify that response headers on the migrated socket were delivered to the
7131 // stream.
7132 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
7133 EXPECT_EQ(200, response.headers->response_code());
7134
7135 // Resume to consume the read error on new socket, which will close
7136 // the connection.
7137 socket_data1.Resume();
7138
7139 EXPECT_TRUE(socket_data.AllReadDataConsumed());
7140 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
7141 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
7142 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
7143}
7144
Zhongyi Shi4ac9e1f2018-06-21 05:21:477145// Migrate on asynchronous write error, old network disconnects after alternate
7146// network connects.
7147TEST_P(QuicStreamFactoryTest,
7148 MigrateSessionOnWriteErrorWithDisconnectAfterConnectAysnc) {
7149 TestMigrationOnWriteErrorWithMultipleNotifications(
7150 ASYNC, /*disconnect_before_connect*/ false);
7151}
7152
7153// Migrate on synchronous write error, old network disconnects after alternate
7154// network connects.
7155TEST_P(QuicStreamFactoryTest,
7156 MigrateSessionOnWriteErrorWithDisconnectAfterConnectSync) {
7157 TestMigrationOnWriteErrorWithMultipleNotifications(
7158 SYNCHRONOUS, /*disconnect_before_connect*/ false);
7159}
7160
7161// Migrate on asynchronous write error, old network disconnects before alternate
7162// network connects.
7163TEST_P(QuicStreamFactoryTest,
7164 MigrateSessionOnWriteErrorWithDisconnectBeforeConnectAysnc) {
7165 TestMigrationOnWriteErrorWithMultipleNotifications(
7166 ASYNC, /*disconnect_before_connect*/ true);
7167}
7168
7169// Migrate on synchronous write error, old network disconnects before alternate
7170// network connects.
7171TEST_P(QuicStreamFactoryTest,
7172 MigrateSessionOnWriteErrorWithDisconnectBeforeConnectSync) {
7173 TestMigrationOnWriteErrorWithMultipleNotifications(
7174 SYNCHRONOUS, /*disconnect_before_connect*/ true);
7175}
7176
7177// Setps up test which verifies that session successfully migrate to alternate
7178// network with signals delivered in the following order:
7179// *NOTE* Signal (A) and (B) can reverse order based on
7180// |disconnect_before_connect|.
7181// - (No alternate network is connected) session connects to
7182// kDefaultNetworkForTests.
7183// - An async/sync write error is encountered based on |write_error_mode|:
7184// session posted task to migrate session on write error.
7185// - Posted task is executed, miration moves to pending state due to lack of
7186// alternate network.
7187// - (A) An alternate network is connected, pending migration completes.
7188// - (B) Old default network disconnects, no migration will be attempted as
Zhongyi Shi329f5cbd2018-06-22 23:51:187189// session has already migrate to the alternate network.
Zhongyi Shi4ac9e1f2018-06-21 05:21:477190// - The alternate network is made default.
jri5b785512016-09-13 04:29:117191void QuicStreamFactoryTestBase::
Zhongyi Shi4ac9e1f2018-06-21 05:21:477192 TestMigrationOnWriteErrorWithMultipleNotifications(
jri5b785512016-09-13 04:29:117193 IoMode write_error_mode,
Zhongyi Shi4ac9e1f2018-06-21 05:21:477194 bool disconnect_before_connect) {
Zhongyi Shi329f5cbd2018-06-22 23:51:187195 InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
jri5b785512016-09-13 04:29:117196 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
7197 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7198 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7199
7200 MockQuicData socket_data;
Ryan Hamilton8d9ee76e2018-05-29 23:52:527201 quic::QuicStreamOffset header_stream_offset = 0;
jri5b785512016-09-13 04:29:117202 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
rch5cb522462017-04-25 20:18:367203 socket_data.AddWrite(
Zhongyi Shi32f2fd02018-04-16 18:23:437204 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
Zhongyi Shi4ac9e1f2018-06-21 05:21:477205 socket_data.AddWrite(write_error_mode, ERR_FAILED); // Write error.
Zhongyi Shi5f587cc2017-11-21 23:24:177206 socket_data.AddSocketDataToFactory(socket_factory_.get());
jri5b785512016-09-13 04:29:117207
7208 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:457209 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337210 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:037211 request.Request(
7212 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
7213 SocketTag(),
7214 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
7215 failed_on_default_network_callback_, callback_.callback()));
jri5b785512016-09-13 04:29:117216 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:247217 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri5b785512016-09-13 04:29:117218 EXPECT_TRUE(stream.get());
7219
7220 // Cause QUIC stream to be created.
7221 HttpRequestInfo request_info;
7222 request_info.method = "GET";
7223 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:397224 request_info.traffic_annotation =
7225 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:277226 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:397227 net_log_, CompletionOnceCallback()));
jri5b785512016-09-13 04:29:117228
7229 // Ensure that session is alive and active.
7230 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
7231 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
7232 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7233
7234 // Send GET request on stream. This should cause a write error, which triggers
7235 // a connection migration attempt.
7236 HttpResponseInfo response;
7237 HttpRequestHeaders request_headers;
7238 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
7239 callback_.callback()));
Zhongyi Shi4ac9e1f2018-06-21 05:21:477240 // Run the message loop so that posted task to migrate to socket will be
7241 // executed. A new task will be posted to wait for a new network.
jri5b785512016-09-13 04:29:117242 base::RunLoop().RunUntilIdle();
7243
7244 // In this particular code path, the network will not yet be marked
7245 // as going away and the session will still be alive.
7246 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
7247 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7248 EXPECT_EQ(1u, session->GetNumActiveStreams());
7249 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
7250
7251 // Set up second socket data provider that is used after
7252 // migration. The request is rewritten to this new socket, and the
7253 // response to the request is read on this new socket.
7254 MockQuicData socket_data1;
Fan Yang32c5a112018-12-10 20:06:337255 socket_data1.AddWrite(
7256 SYNCHRONOUS, ConstructGetRequestPacket(
7257 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
7258 true, &header_stream_offset));
Zhongyi Shi32f2fd02018-04-16 18:23:437259 socket_data1.AddRead(
Fan Yang32c5a112018-12-10 20:06:337260 ASYNC,
7261 ConstructOkResponsePacket(
7262 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
jri5b785512016-09-13 04:29:117263 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Fan Yang32c5a112018-12-10 20:06:337264 socket_data1.AddWrite(
7265 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
7266 3, false, GetNthClientInitiatedBidirectionalStreamId(0),
7267 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi5f587cc2017-11-21 23:24:177268 socket_data1.AddSocketDataToFactory(socket_factory_.get());
jri5b785512016-09-13 04:29:117269
7270 scoped_mock_network_change_notifier_->mock_network_change_notifier()
7271 ->SetConnectedNetworksList(
7272 {kDefaultNetworkForTests, kNewNetworkForTests});
Zhongyi Shi4ac9e1f2018-06-21 05:21:477273 if (disconnect_before_connect) {
7274 // Now deliver a DISCONNECT notification.
jri5b785512016-09-13 04:29:117275 scoped_mock_network_change_notifier_->mock_network_change_notifier()
7276 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
Zhongyi Shi4ac9e1f2018-06-21 05:21:477277
7278 // Now deliver a CONNECTED notification and completes migration.
jri5b785512016-09-13 04:29:117279 scoped_mock_network_change_notifier_->mock_network_change_notifier()
Zhongyi Shi4ac9e1f2018-06-21 05:21:477280 ->NotifyNetworkConnected(kNewNetworkForTests);
7281 } else {
7282 // Now deliver a CONNECTED notification and completes migration.
7283 scoped_mock_network_change_notifier_->mock_network_change_notifier()
7284 ->NotifyNetworkConnected(kNewNetworkForTests);
7285
7286 // Now deliver a DISCONNECT notification.
7287 scoped_mock_network_change_notifier_->mock_network_change_notifier()
7288 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
jri5b785512016-09-13 04:29:117289 }
jri5b785512016-09-13 04:29:117290 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
Zhongyi Shi329f5cbd2018-06-22 23:51:187291 EXPECT_TRUE(HasActiveSession(host_port_pair_));
jri5b785512016-09-13 04:29:117292 EXPECT_EQ(1u, session->GetNumActiveStreams());
7293
7294 // This is the callback for the response headers that returned
7295 // pending previously, because no result was available. Check that
7296 // the result is now available due to the successful migration.
7297 EXPECT_THAT(callback_.WaitForResult(), IsOk());
7298 EXPECT_EQ(200, response.headers->response_code());
7299
Zhongyi Shi4ac9e1f2018-06-21 05:21:477300 // Deliver a MADEDEFAULT notification.
jri5b785512016-09-13 04:29:117301 scoped_mock_network_change_notifier_->mock_network_change_notifier()
Zhongyi Shi4ac9e1f2018-06-21 05:21:477302 ->NotifyNetworkMadeDefault(kNewNetworkForTests);
jri5b785512016-09-13 04:29:117303
zhongyi98d6a9262017-05-19 02:47:457304 QuicStreamRequest request2(factory_.get());
Zhongyi Shi329f5cbd2018-06-22 23:51:187305 EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
7306 DEFAULT_PRIORITY, SocketTag(),
7307 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:037308 &net_error_details_,
7309 failed_on_default_network_callback_,
7310 callback_.callback()));
Yixin Wang7891a39d2017-11-08 20:59:247311 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
jri5b785512016-09-13 04:29:117312 EXPECT_TRUE(stream2.get());
7313
7314 EXPECT_TRUE(HasActiveSession(host_port_pair_));
Zhongyi Shi329f5cbd2018-06-22 23:51:187315 EXPECT_EQ(session, GetActiveSession(host_port_pair_));
jri5b785512016-09-13 04:29:117316
7317 stream.reset();
7318 stream2.reset();
7319
7320 EXPECT_TRUE(socket_data.AllReadDataConsumed());
7321 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
7322 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
7323 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
jri5b785512016-09-13 04:29:117324}
7325
Zhongyi Shic16b4102019-02-12 00:37:407326// This test verifies after session migrates off the default network, it keeps
7327// retrying migrate back to the default network until successfully gets on the
7328// default network or the idle migration period threshold is exceeded.
7329// The default threshold is 30s.
7330TEST_P(QuicStreamFactoryTest, DefaultIdleMigrationPeriod) {
7331 InitializeConnectionMigrationV2Test(
7332 {kDefaultNetworkForTests, kNewNetworkForTests});
7333 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
7334 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7335
7336 // Using a testing task runner and a test tick tock.
7337 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
7338 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
7339 QuicStreamFactoryPeer::SetTickClock(factory_.get(),
7340 task_runner->GetMockTickClock());
7341
7342 MockQuicData default_socket_data;
7343 default_socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
7344 default_socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
7345 default_socket_data.AddSocketDataToFactory(socket_factory_.get());
7346
7347 // Set up second socket data provider that is used after migration.
7348 MockQuicData alternate_socket_data;
7349 alternate_socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
7350 // Ping packet to send after migration.
7351 alternate_socket_data.AddWrite(
7352 SYNCHRONOUS, client_maker_.MakePingPacket(2, /*include_version=*/true));
7353 alternate_socket_data.AddSocketDataToFactory(socket_factory_.get());
7354
7355 // Set up probing socket for migrating back to the default network.
7356 MockQuicData quic_data; // retry count: 0.
7357 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
7358 quic_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
7359 quic_data.AddSocketDataToFactory(socket_factory_.get());
7360
7361 MockQuicData quic_data1; // retry count: 1
7362 quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
7363 quic_data1.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
7364 quic_data1.AddSocketDataToFactory(socket_factory_.get());
7365
7366 MockQuicData quic_data2; // retry count: 2
7367 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
7368 quic_data2.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
7369 quic_data2.AddSocketDataToFactory(socket_factory_.get());
7370
7371 MockQuicData quic_data3; // retry count: 3
7372 quic_data3.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
7373 quic_data3.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
7374 quic_data3.AddSocketDataToFactory(socket_factory_.get());
7375
7376 MockQuicData quic_data4; // retry count: 4
7377 quic_data4.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
7378 quic_data4.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
7379 quic_data4.AddSocketDataToFactory(socket_factory_.get());
7380
7381 MockQuicData quic_data5; // retry count: 5
7382 quic_data5.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
7383 quic_data5.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
7384 quic_data5.AddSocketDataToFactory(socket_factory_.get());
7385
7386 // Create request and QuicHttpStream.
7387 QuicStreamRequest request(factory_.get());
7388 EXPECT_EQ(ERR_IO_PENDING,
7389 request.Request(
7390 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
7391 SocketTag(),
7392 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
7393 failed_on_default_network_callback_, callback_.callback()));
7394 EXPECT_THAT(callback_.WaitForResult(), IsOk());
7395 std::unique_ptr<HttpStream> stream = CreateStream(&request);
7396 EXPECT_TRUE(stream.get());
7397
7398 // Ensure that session is active.
7399 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7400
7401 // Trigger connection migration. Since there are no active streams,
7402 // the session will be closed.
7403 scoped_mock_network_change_notifier_->mock_network_change_notifier()
7404 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
7405
7406 // The nearest task will complete migration.
7407 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
7408 EXPECT_EQ(base::TimeDelta(), task_runner->NextPendingTaskDelay());
7409 task_runner->FastForwardBy(base::TimeDelta());
7410
7411 // The migrate back timer will fire. Due to default network
7412 // being disconnected, no attempt will be exercised to migrate back.
7413 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
7414 EXPECT_EQ(base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs),
7415 task_runner->NextPendingTaskDelay());
7416 task_runner->FastForwardBy(task_runner->NextPendingTaskDelay());
7417 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
7418
7419 // Deliver the signal that the old default network now backs up.
7420 scoped_mock_network_change_notifier_->mock_network_change_notifier()
7421 ->NotifyNetworkMadeDefault(kDefaultNetworkForTests);
7422
7423 // A task is posted to migrate back to the default network immediately.
7424 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
7425 EXPECT_EQ(base::TimeDelta(), task_runner->NextPendingTaskDelay());
7426 task_runner->FastForwardBy(base::TimeDelta());
7427
7428 // Retry migrate back in 1, 2, 4, 8, 16s.
7429 // Session will be closed due to idle migration timeout.
7430 for (int i = 0; i < 5; i++) {
7431 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7432 // A task is posted to migrate back to the default network in 2^i seconds.
7433 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
7434 EXPECT_EQ(base::TimeDelta::FromSeconds(UINT64_C(1) << i),
7435 task_runner->NextPendingTaskDelay());
7436 task_runner->FastForwardBy(task_runner->NextPendingTaskDelay());
7437 }
7438
7439 EXPECT_TRUE(default_socket_data.AllReadDataConsumed());
7440 EXPECT_TRUE(default_socket_data.AllWriteDataConsumed());
7441 EXPECT_TRUE(alternate_socket_data.AllReadDataConsumed());
7442 EXPECT_TRUE(alternate_socket_data.AllWriteDataConsumed());
7443}
7444
7445TEST_P(QuicStreamFactoryTest, CustomIdleMigrationPeriod) {
7446 // The customized threshold is 15s.
7447 test_params_.quic_idle_session_migration_period =
7448 base::TimeDelta::FromSeconds(15);
7449 InitializeConnectionMigrationV2Test(
7450 {kDefaultNetworkForTests, kNewNetworkForTests});
7451 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
7452 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7453
7454 // Using a testing task runner and a test tick tock.
7455 auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
7456 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
7457 QuicStreamFactoryPeer::SetTickClock(factory_.get(),
7458 task_runner->GetMockTickClock());
7459
7460 MockQuicData default_socket_data;
7461 default_socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
7462 default_socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
7463 default_socket_data.AddSocketDataToFactory(socket_factory_.get());
7464
7465 // Set up second socket data provider that is used after migration.
7466 MockQuicData alternate_socket_data;
7467 alternate_socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
7468 // Ping packet to send after migration.
7469 alternate_socket_data.AddWrite(
7470 SYNCHRONOUS, client_maker_.MakePingPacket(2, /*include_version=*/true));
7471 alternate_socket_data.AddSocketDataToFactory(socket_factory_.get());
7472
7473 // Set up probing socket for migrating back to the default network.
7474 MockQuicData quic_data; // retry count: 0.
7475 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
7476 quic_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
7477 quic_data.AddSocketDataToFactory(socket_factory_.get());
7478
7479 MockQuicData quic_data1; // retry count: 1
7480 quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
7481 quic_data1.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
7482 quic_data1.AddSocketDataToFactory(socket_factory_.get());
7483
7484 MockQuicData quic_data2; // retry count: 2
7485 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
7486 quic_data2.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
7487 quic_data2.AddSocketDataToFactory(socket_factory_.get());
7488
7489 MockQuicData quic_data3; // retry count: 3
7490 quic_data3.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
7491 quic_data3.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
7492 quic_data3.AddSocketDataToFactory(socket_factory_.get());
7493
7494 MockQuicData quic_data4; // retry count: 4
7495 quic_data4.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
7496 quic_data4.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
7497 quic_data4.AddSocketDataToFactory(socket_factory_.get());
7498
7499 // Create request and QuicHttpStream.
7500 QuicStreamRequest request(factory_.get());
7501 EXPECT_EQ(ERR_IO_PENDING,
7502 request.Request(
7503 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
7504 SocketTag(),
7505 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
7506 failed_on_default_network_callback_, callback_.callback()));
7507 EXPECT_THAT(callback_.WaitForResult(), IsOk());
7508 std::unique_ptr<HttpStream> stream = CreateStream(&request);
7509 EXPECT_TRUE(stream.get());
7510
7511 // Ensure that session is active.
7512 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7513
7514 // Trigger connection migration. Since there are no active streams,
7515 // the session will be closed.
7516 scoped_mock_network_change_notifier_->mock_network_change_notifier()
7517 ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
7518
7519 // The nearest task will complete migration.
7520 EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
7521 EXPECT_EQ(base::TimeDelta(), task_runner->NextPendingTaskDelay());
7522 task_runner->FastForwardBy(base::TimeDelta());
7523
7524 // The migrate back timer will fire. Due to default network
7525 // being disconnected, no attempt will be exercised to migrate back.
7526 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
7527 EXPECT_EQ(base::TimeDelta::FromSeconds(kMinRetryTimeForDefaultNetworkSecs),
7528 task_runner->NextPendingTaskDelay());
7529 task_runner->FastForwardBy(task_runner->NextPendingTaskDelay());
7530 EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
7531
7532 // Deliver the signal that the old default network now backs up.
7533 scoped_mock_network_change_notifier_->mock_network_change_notifier()
7534 ->NotifyNetworkMadeDefault(kDefaultNetworkForTests);
7535
7536 // A task is posted to migrate back to the default network immediately.
7537 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
7538 EXPECT_EQ(base::TimeDelta(), task_runner->NextPendingTaskDelay());
7539 task_runner->FastForwardBy(base::TimeDelta());
7540
7541 // Retry migrate back in 1, 2, 4, 8s.
7542 // Session will be closed due to idle migration timeout.
7543 for (int i = 0; i < 4; i++) {
7544 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7545 // A task is posted to migrate back to the default network in 2^i seconds.
7546 EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
7547 EXPECT_EQ(base::TimeDelta::FromSeconds(UINT64_C(1) << i),
7548 task_runner->NextPendingTaskDelay());
7549 task_runner->FastForwardBy(task_runner->NextPendingTaskDelay());
7550 }
7551
7552 EXPECT_TRUE(default_socket_data.AllReadDataConsumed());
7553 EXPECT_TRUE(default_socket_data.AllWriteDataConsumed());
7554 EXPECT_TRUE(alternate_socket_data.AllReadDataConsumed());
7555 EXPECT_TRUE(alternate_socket_data.AllWriteDataConsumed());
7556}
7557
jri217455a12016-07-13 20:15:097558TEST_P(QuicStreamFactoryTest, ServerMigration) {
Zhongyi Shi967d2f12019-02-08 20:58:537559 test_params_.quic_allow_server_migration = true;
jri217455a12016-07-13 20:15:097560 Initialize();
7561
7562 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
7563 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7564 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7565
rcha00569732016-08-27 11:09:367566 MockQuicData socket_data1;
Ryan Hamilton8d9ee76e2018-05-29 23:52:527567 quic::QuicStreamOffset header_stream_offset = 0;
rcha00569732016-08-27 11:09:367568 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
rch5cb522462017-04-25 20:18:367569 socket_data1.AddWrite(
Zhongyi Shi32f2fd02018-04-16 18:23:437570 SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
Fan Yang32c5a112018-12-10 20:06:337571 socket_data1.AddWrite(
7572 SYNCHRONOUS, ConstructGetRequestPacket(
7573 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
7574 true, &header_stream_offset));
Zhongyi Shi5f587cc2017-11-21 23:24:177575 socket_data1.AddSocketDataToFactory(socket_factory_.get());
jri217455a12016-07-13 20:15:097576
7577 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:457578 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337579 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:037580 request.Request(
7581 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
7582 SocketTag(),
7583 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
7584 failed_on_default_network_callback_, callback_.callback()));
jri217455a12016-07-13 20:15:097585 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:247586 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri217455a12016-07-13 20:15:097587 EXPECT_TRUE(stream.get());
7588
7589 // Cause QUIC stream to be created.
7590 HttpRequestInfo request_info;
7591 request_info.method = "GET";
7592 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:397593 request_info.traffic_annotation =
7594 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:277595 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:397596 net_log_, CompletionOnceCallback()));
jri217455a12016-07-13 20:15:097597
7598 // Ensure that session is alive and active.
7599 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
7600 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
7601 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7602
7603 // Send GET request on stream.
7604 HttpResponseInfo response;
7605 HttpRequestHeaders request_headers;
7606 EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
7607 callback_.callback()));
7608
7609 IPEndPoint ip;
7610 session->GetDefaultSocket()->GetPeerAddress(&ip);
7611 DVLOG(1) << "Socket connected to: " << ip.address().ToString() << " "
7612 << ip.port();
7613
7614 // Set up second socket data provider that is used after
7615 // migration. The request is rewritten to this new socket, and the
7616 // response to the request is read on this new socket.
rcha00569732016-08-27 11:09:367617 MockQuicData socket_data2;
7618 socket_data2.AddWrite(
Zhongyi Shi32f2fd02018-04-16 18:23:437619 SYNCHRONOUS, client_maker_.MakePingPacket(3, /*include_version=*/true));
7620 socket_data2.AddRead(
Fan Yang32c5a112018-12-10 20:06:337621 ASYNC,
7622 ConstructOkResponsePacket(
7623 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
rcha00569732016-08-27 11:09:367624 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Fan Yang32c5a112018-12-10 20:06:337625 socket_data2.AddWrite(
7626 SYNCHRONOUS, client_maker_.MakeAckAndRstPacket(
7627 4, false, GetNthClientInitiatedBidirectionalStreamId(0),
7628 quic::QUIC_STREAM_CANCELLED, 1, 1, 1, true));
Zhongyi Shi5f587cc2017-11-21 23:24:177629 socket_data2.AddSocketDataToFactory(socket_factory_.get());
jri217455a12016-07-13 20:15:097630
7631 const uint8_t kTestIpAddress[] = {1, 2, 3, 4};
7632 const uint16_t kTestPort = 123;
Zhongyi Shif124a582017-11-02 00:15:047633 session->Migrate(NetworkChangeNotifier::kInvalidNetworkHandle,
7634 IPEndPoint(IPAddress(kTestIpAddress), kTestPort), true,
7635 net_log_);
jri217455a12016-07-13 20:15:097636
7637 session->GetDefaultSocket()->GetPeerAddress(&ip);
7638 DVLOG(1) << "Socket migrated to: " << ip.address().ToString() << " "
7639 << ip.port();
7640
7641 // The session should be alive and active.
7642 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
7643 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7644 EXPECT_EQ(1u, session->GetNumActiveStreams());
7645
7646 // Run the message loop so that data queued in the new socket is read by the
7647 // packet reader.
7648 base::RunLoop().RunUntilIdle();
7649
7650 // Verify that response headers on the migrated socket were delivered to the
7651 // stream.
7652 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
7653 EXPECT_EQ(200, response.headers->response_code());
7654
7655 stream.reset();
7656
7657 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
7658 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
7659 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
7660 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
7661}
7662
jri053fdbd2016-08-19 02:33:057663TEST_P(QuicStreamFactoryTest, ServerMigrationIPv4ToIPv4) {
7664 // Add alternate IPv4 server address to config.
7665 IPEndPoint alt_address = IPEndPoint(IPAddress(1, 2, 3, 4), 123);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527666 quic::QuicConfig config;
fayang91ca2012016-11-22 07:42:467667 config.SetAlternateServerAddressToSend(
Ryan Hamilton8d9ee76e2018-05-29 23:52:527668 quic::QuicSocketAddress(quic::QuicSocketAddressImpl(alt_address)));
jri053fdbd2016-08-19 02:33:057669 VerifyServerMigration(config, alt_address);
7670}
7671
7672TEST_P(QuicStreamFactoryTest, ServerMigrationIPv6ToIPv6) {
7673 // Add a resolver rule to make initial connection to an IPv6 address.
Renjiea0cb4a2c2018-09-26 23:37:307674 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
7675 "fe80::aebc:32ff:febb:1e33", "");
jri053fdbd2016-08-19 02:33:057676 // Add alternate IPv6 server address to config.
7677 IPEndPoint alt_address = IPEndPoint(
7678 IPAddress(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16), 123);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527679 quic::QuicConfig config;
fayang91ca2012016-11-22 07:42:467680 config.SetAlternateServerAddressToSend(
Ryan Hamilton8d9ee76e2018-05-29 23:52:527681 quic::QuicSocketAddress(quic::QuicSocketAddressImpl(alt_address)));
jri053fdbd2016-08-19 02:33:057682 VerifyServerMigration(config, alt_address);
7683}
7684
7685TEST_P(QuicStreamFactoryTest, ServerMigrationIPv6ToIPv4) {
7686 // Add a resolver rule to make initial connection to an IPv6 address.
Renjiea0cb4a2c2018-09-26 23:37:307687 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
7688 "fe80::aebc:32ff:febb:1e33", "");
jri053fdbd2016-08-19 02:33:057689 // Add alternate IPv4 server address to config.
7690 IPEndPoint alt_address = IPEndPoint(IPAddress(1, 2, 3, 4), 123);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527691 quic::QuicConfig config;
fayang91ca2012016-11-22 07:42:467692 config.SetAlternateServerAddressToSend(
Ryan Hamilton8d9ee76e2018-05-29 23:52:527693 quic::QuicSocketAddress(quic::QuicSocketAddressImpl(alt_address)));
jri053fdbd2016-08-19 02:33:057694 IPEndPoint expected_address(
7695 ConvertIPv4ToIPv4MappedIPv6(alt_address.address()), alt_address.port());
7696 VerifyServerMigration(config, expected_address);
7697}
7698
7699TEST_P(QuicStreamFactoryTest, ServerMigrationIPv4ToIPv6Fails) {
Zhongyi Shi967d2f12019-02-08 20:58:537700 test_params_.quic_allow_server_migration = true;
jri053fdbd2016-08-19 02:33:057701 Initialize();
7702
7703 // Add a resolver rule to make initial connection to an IPv4 address.
Renjiea0cb4a2c2018-09-26 23:37:307704 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(), "1.2.3.4",
7705 "");
jri053fdbd2016-08-19 02:33:057706 // Add alternate IPv6 server address to config.
7707 IPEndPoint alt_address = IPEndPoint(
7708 IPAddress(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16), 123);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527709 quic::QuicConfig config;
fayang91ca2012016-11-22 07:42:467710 config.SetAlternateServerAddressToSend(
Ryan Hamilton8d9ee76e2018-05-29 23:52:527711 quic::QuicSocketAddress(quic::QuicSocketAddressImpl(alt_address)));
jri053fdbd2016-08-19 02:33:057712
7713 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
7714 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7715 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7716
7717 crypto_client_stream_factory_.SetConfig(config);
7718
7719 // Set up only socket data provider.
rcha00569732016-08-27 11:09:367720 MockQuicData socket_data1;
7721 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:437722 socket_data1.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
7723 socket_data1.AddWrite(
Fan Yang32c5a112018-12-10 20:06:337724 SYNCHRONOUS, client_maker_.MakeRstPacket(
7725 2, true, GetNthClientInitiatedBidirectionalStreamId(0),
7726 quic::QUIC_STREAM_CANCELLED));
Zhongyi Shi5f587cc2017-11-21 23:24:177727 socket_data1.AddSocketDataToFactory(socket_factory_.get());
jri053fdbd2016-08-19 02:33:057728
7729 // Create request and QuicHttpStream.
zhongyi98d6a9262017-05-19 02:47:457730 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337731 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:037732 request.Request(
7733 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
7734 SocketTag(),
7735 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
7736 failed_on_default_network_callback_, callback_.callback()));
jri053fdbd2016-08-19 02:33:057737 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:247738 std::unique_ptr<HttpStream> stream = CreateStream(&request);
jri053fdbd2016-08-19 02:33:057739 EXPECT_TRUE(stream.get());
7740
7741 // Cause QUIC stream to be created.
7742 HttpRequestInfo request_info;
7743 request_info.method = "GET";
7744 request_info.url = GURL("https://www.example.org/");
Ramin Halavati683bcaa92018-02-14 08:42:397745 request_info.traffic_annotation =
7746 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:277747 EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:397748 net_log_, CompletionOnceCallback()));
jri053fdbd2016-08-19 02:33:057749
7750 // Ensure that session is alive and active.
7751 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
7752 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
7753 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7754
7755 IPEndPoint actual_address;
7756 session->GetDefaultSocket()->GetPeerAddress(&actual_address);
7757 // No migration should have happened.
7758 IPEndPoint expected_address =
7759 IPEndPoint(IPAddress(1, 2, 3, 4), kDefaultServerPort);
7760 EXPECT_EQ(actual_address, expected_address);
7761 DVLOG(1) << "Socket connected to: " << actual_address.address().ToString()
7762 << " " << actual_address.port();
7763 DVLOG(1) << "Expected address: " << expected_address.address().ToString()
7764 << " " << expected_address.port();
7765
7766 stream.reset();
7767 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
7768 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
7769}
7770
rsleevi17784692016-10-12 01:36:207771TEST_P(QuicStreamFactoryTest, OnCertDBChanged) {
jri7046038f2015-10-22 00:29:267772 Initialize();
rch6faa4d42016-01-05 20:48:437773 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
7774 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7775 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7776
rcha00569732016-08-27 11:09:367777 MockQuicData socket_data;
7778 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:437779 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:177780 socket_data.AddSocketDataToFactory(socket_factory_.get());
[email protected]d7d1e50b2013-11-25 22:08:097781
rcha00569732016-08-27 11:09:367782 MockQuicData socket_data2;
7783 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:437784 socket_data2.AddWrite(SYNCHRONOUS,
7785 ConstructInitialSettingsPacket(1, nullptr));
Zhongyi Shi5f587cc2017-11-21 23:24:177786 socket_data2.AddSocketDataToFactory(socket_factory_.get());
[email protected]d7d1e50b2013-11-25 22:08:097787
zhongyi98d6a9262017-05-19 02:47:457788 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337789 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:037790 request.Request(
7791 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
7792 SocketTag(),
7793 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
7794 failed_on_default_network_callback_, callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:097795
robpercival214763f2016-07-01 23:27:017796 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:247797 std::unique_ptr<HttpStream> stream = CreateStream(&request);
Charles 'Buck' Krasic71763c9f2018-02-16 02:37:287798 EXPECT_TRUE(stream);
7799 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
[email protected]d7d1e50b2013-11-25 22:08:097800
7801 // Change the CA cert and verify that stream saw the event.
mattmfd05a1f2017-02-18 06:18:447802 factory_->OnCertDBChanged();
Charles 'Buck' Krasic71763c9f2018-02-16 02:37:287803
jri7046038f2015-10-22 00:29:267804 EXPECT_FALSE(factory_->require_confirmation());
Charles 'Buck' Krasic71763c9f2018-02-16 02:37:287805 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
7806 EXPECT_FALSE(HasActiveSession(host_port_pair_));
[email protected]d7d1e50b2013-11-25 22:08:097807
7808 // Now attempting to request a stream to the same origin should create
7809 // a new session.
7810
zhongyi98d6a9262017-05-19 02:47:457811 QuicStreamRequest request2(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337812 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:037813 request2.Request(
7814 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
7815 SocketTag(),
7816 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
7817 failed_on_default_network_callback_, callback_.callback()));
[email protected]d7d1e50b2013-11-25 22:08:097818
robpercival214763f2016-07-01 23:27:017819 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Charles 'Buck' Krasic71763c9f2018-02-16 02:37:287820 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
7821 EXPECT_TRUE(stream2);
7822 QuicChromiumClientSession* session2 = GetActiveSession(host_port_pair_);
7823 EXPECT_TRUE(HasActiveSession(host_port_pair_));
7824 EXPECT_NE(session, session2);
7825 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
7826 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session2));
7827
7828 stream2.reset();
7829 stream.reset();
[email protected]d7d1e50b2013-11-25 22:08:097830
rch37de576c2015-05-17 20:28:177831 EXPECT_TRUE(socket_data.AllReadDataConsumed());
7832 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
7833 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
7834 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
[email protected]d7d1e50b2013-11-25 22:08:097835}
7836
[email protected]1e960032013-12-20 19:00:207837TEST_P(QuicStreamFactoryTest, SharedCryptoConfig) {
jri7046038f2015-10-22 00:29:267838 Initialize();
rch6faa4d42016-01-05 20:48:437839
rch872e00e2016-12-02 02:48:187840 std::vector<string> cannoncial_suffixes;
[email protected]6e12d702013-11-13 00:17:177841 cannoncial_suffixes.push_back(string(".c.youtube.com"));
7842 cannoncial_suffixes.push_back(string(".googlevideo.com"));
[email protected]c49ff182013-09-28 08:33:267843
[email protected]6e12d702013-11-13 00:17:177844 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
7845 string r1_host_name("r1");
7846 string r2_host_name("r2");
7847 r1_host_name.append(cannoncial_suffixes[i]);
7848 r2_host_name.append(cannoncial_suffixes[i]);
[email protected]b70fdb792013-10-25 19:04:147849
[email protected]bf4ea2f2014-03-10 22:57:537850 HostPortPair host_port_pair1(r1_host_name, 80);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527851 quic::QuicCryptoClientConfig* crypto_config =
jri7046038f2015-10-22 00:29:267852 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
Ryan Hamilton4f0b26e2018-06-27 23:52:327853 quic::QuicServerId server_id1(host_port_pair1.host(),
7854 host_port_pair1.port(), privacy_mode_);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527855 quic::QuicCryptoClientConfig::CachedState* cached1 =
[email protected]257f24f2014-04-01 09:15:377856 crypto_config->LookupOrCreate(server_id1);
[email protected]6e12d702013-11-13 00:17:177857 EXPECT_FALSE(cached1->proof_valid());
7858 EXPECT_TRUE(cached1->source_address_token().empty());
7859
7860 // Mutate the cached1 to have different data.
7861 // TODO(rtenneti): mutate other members of CachedState.
7862 cached1->set_source_address_token(r1_host_name);
7863 cached1->SetProofValid();
7864
[email protected]bf4ea2f2014-03-10 22:57:537865 HostPortPair host_port_pair2(r2_host_name, 80);
Ryan Hamilton4f0b26e2018-06-27 23:52:327866 quic::QuicServerId server_id2(host_port_pair2.host(),
7867 host_port_pair2.port(), privacy_mode_);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527868 quic::QuicCryptoClientConfig::CachedState* cached2 =
[email protected]257f24f2014-04-01 09:15:377869 crypto_config->LookupOrCreate(server_id2);
[email protected]6e12d702013-11-13 00:17:177870 EXPECT_EQ(cached1->source_address_token(), cached2->source_address_token());
7871 EXPECT_TRUE(cached2->proof_valid());
7872 }
[email protected]b70fdb792013-10-25 19:04:147873}
7874
[email protected]1e960032013-12-20 19:00:207875TEST_P(QuicStreamFactoryTest, CryptoConfigWhenProofIsInvalid) {
jri7046038f2015-10-22 00:29:267876 Initialize();
rch872e00e2016-12-02 02:48:187877 std::vector<string> cannoncial_suffixes;
[email protected]6e12d702013-11-13 00:17:177878 cannoncial_suffixes.push_back(string(".c.youtube.com"));
7879 cannoncial_suffixes.push_back(string(".googlevideo.com"));
[email protected]b70fdb792013-10-25 19:04:147880
[email protected]6e12d702013-11-13 00:17:177881 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
7882 string r3_host_name("r3");
7883 string r4_host_name("r4");
7884 r3_host_name.append(cannoncial_suffixes[i]);
7885 r4_host_name.append(cannoncial_suffixes[i]);
[email protected]b70fdb792013-10-25 19:04:147886
[email protected]bf4ea2f2014-03-10 22:57:537887 HostPortPair host_port_pair1(r3_host_name, 80);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527888 quic::QuicCryptoClientConfig* crypto_config =
jri7046038f2015-10-22 00:29:267889 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
Ryan Hamilton4f0b26e2018-06-27 23:52:327890 quic::QuicServerId server_id1(host_port_pair1.host(),
7891 host_port_pair1.port(), privacy_mode_);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527892 quic::QuicCryptoClientConfig::CachedState* cached1 =
[email protected]257f24f2014-04-01 09:15:377893 crypto_config->LookupOrCreate(server_id1);
[email protected]6e12d702013-11-13 00:17:177894 EXPECT_FALSE(cached1->proof_valid());
7895 EXPECT_TRUE(cached1->source_address_token().empty());
7896
7897 // Mutate the cached1 to have different data.
7898 // TODO(rtenneti): mutate other members of CachedState.
7899 cached1->set_source_address_token(r3_host_name);
7900 cached1->SetProofInvalid();
7901
[email protected]bf4ea2f2014-03-10 22:57:537902 HostPortPair host_port_pair2(r4_host_name, 80);
Ryan Hamilton4f0b26e2018-06-27 23:52:327903 quic::QuicServerId server_id2(host_port_pair2.host(),
7904 host_port_pair2.port(), privacy_mode_);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527905 quic::QuicCryptoClientConfig::CachedState* cached2 =
[email protected]257f24f2014-04-01 09:15:377906 crypto_config->LookupOrCreate(server_id2);
[email protected]6e12d702013-11-13 00:17:177907 EXPECT_NE(cached1->source_address_token(), cached2->source_address_token());
7908 EXPECT_TRUE(cached2->source_address_token().empty());
7909 EXPECT_FALSE(cached2->proof_valid());
7910 }
[email protected]c49ff182013-09-28 08:33:267911}
7912
rtenneti34dffe752015-02-24 23:27:327913TEST_P(QuicStreamFactoryTest, EnableNotLoadFromDiskCache) {
jri7046038f2015-10-22 00:29:267914 Initialize();
Ryan Hamiltona12722b2017-08-12 02:23:207915 factory_->set_require_confirmation(false);
rch6faa4d42016-01-05 20:48:437916 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
7917 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7918
jri7046038f2015-10-22 00:29:267919 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
rtenneti34dffe752015-02-24 23:27:327920
rcha00569732016-08-27 11:09:367921 MockQuicData socket_data;
7922 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi5f587cc2017-11-21 23:24:177923 socket_data.AddSocketDataToFactory(socket_factory_.get());
rtenneti34dffe752015-02-24 23:27:327924
7925 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:277926 MockCryptoClientStream::ZERO_RTT);
Renjiea0cb4a2c2018-09-26 23:37:307927 host_resolver_->set_synchronous_mode(true);
7928 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
7929 "192.168.0.1", "");
rtenneti34dffe752015-02-24 23:27:327930
zhongyi98d6a9262017-05-19 02:47:457931 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337932 EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
7933 DEFAULT_PRIORITY, SocketTag(),
7934 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:037935 &net_error_details_,
7936 failed_on_default_network_callback_,
7937 callback_.callback()));
rtenneti34dffe752015-02-24 23:27:327938
7939 // If we are waiting for disk cache, we would have posted a task. Verify that
7940 // the CancelWaitForDataReady task hasn't been posted.
7941 ASSERT_EQ(0u, runner_->GetPostedTasks().size());
7942
Yixin Wang7891a39d2017-11-08 20:59:247943 std::unique_ptr<HttpStream> stream = CreateStream(&request);
rtenneti34dffe752015-02-24 23:27:327944 EXPECT_TRUE(stream.get());
rch37de576c2015-05-17 20:28:177945 EXPECT_TRUE(socket_data.AllReadDataConsumed());
7946 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
rtenneti34dffe752015-02-24 23:27:327947}
7948
dmurph44ca4f42016-09-09 20:39:097949TEST_P(QuicStreamFactoryTest, ReducePingTimeoutOnConnectionTimeOutOpenStreams) {
Zhongyi Shi967d2f12019-02-08 20:58:537950 test_params_.quic_reduced_ping_timeout_seconds = 10;
dmurph44ca4f42016-09-09 20:39:097951 Initialize();
7952 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
7953 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7954 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
7955
7956 QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
zhongyidd1439f62016-09-02 02:02:267957
7958 MockQuicData socket_data;
7959 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:437960 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:177961 socket_data.AddSocketDataToFactory(socket_factory_.get());
zhongyidd1439f62016-09-02 02:02:267962
7963 MockQuicData socket_data2;
7964 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:437965 socket_data2.AddWrite(SYNCHRONOUS,
7966 ConstructInitialSettingsPacket(1, nullptr));
Zhongyi Shi5f587cc2017-11-21 23:24:177967 socket_data2.AddSocketDataToFactory(socket_factory_.get());
zhongyidd1439f62016-09-02 02:02:267968
7969 HostPortPair server2(kServer2HostName, kDefaultServerPort);
7970
7971 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:277972 MockCryptoClientStream::CONFIRM_HANDSHAKE);
Renjiea0cb4a2c2018-09-26 23:37:307973 host_resolver_->set_synchronous_mode(true);
7974 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
7975 "192.168.0.1", "");
7976 host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
zhongyidd1439f62016-09-02 02:02:267977
7978 // Quic should use default PING timeout when no previous connection times out
7979 // with open stream.
Ryan Hamilton8d9ee76e2018-05-29 23:52:527980 EXPECT_EQ(quic::QuicTime::Delta::FromSeconds(quic::kPingTimeoutSecs),
zhongyidd1439f62016-09-02 02:02:267981 QuicStreamFactoryPeer::GetPingTimeout(factory_.get()));
zhongyi98d6a9262017-05-19 02:47:457982 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:337983 EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
7984 DEFAULT_PRIORITY, SocketTag(),
7985 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:037986 &net_error_details_,
7987 failed_on_default_network_callback_,
7988 callback_.callback()));
zhongyidd1439f62016-09-02 02:02:267989
7990 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
Ryan Hamilton8d9ee76e2018-05-29 23:52:527991 EXPECT_EQ(quic::QuicTime::Delta::FromSeconds(quic::kPingTimeoutSecs),
zhongyidd1439f62016-09-02 02:02:267992 session->connection()->ping_timeout());
7993
Yixin Wang7891a39d2017-11-08 20:59:247994 std::unique_ptr<HttpStream> stream = CreateStream(&request);
zhongyidd1439f62016-09-02 02:02:267995 EXPECT_TRUE(stream.get());
7996 HttpRequestInfo request_info;
Ramin Halavati683bcaa92018-02-14 08:42:397997 request_info.traffic_annotation =
7998 MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
Steven Valdezb4ff0412018-01-18 22:39:277999 EXPECT_EQ(OK, stream->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:398000 net_log_, CompletionOnceCallback()));
zhongyidd1439f62016-09-02 02:02:268001
8002 DVLOG(1)
8003 << "Created 1st session and initialized a stream. Now trigger timeout";
Ryan Hamilton8d9ee76e2018-05-29 23:52:528004 session->connection()->CloseConnection(
8005 quic::QUIC_NETWORK_IDLE_TIMEOUT, "test",
8006 quic::ConnectionCloseBehavior::SILENT_CLOSE);
zhongyidd1439f62016-09-02 02:02:268007 // Need to spin the loop now to ensure that
8008 // QuicStreamFactory::OnSessionClosed() runs.
8009 base::RunLoop run_loop;
8010 run_loop.RunUntilIdle();
8011
zhongyidd1439f62016-09-02 02:02:268012 // The first connection times out with open stream, QUIC should reduce initial
8013 // PING time for subsequent connections.
Ryan Hamilton8d9ee76e2018-05-29 23:52:528014 EXPECT_EQ(quic::QuicTime::Delta::FromSeconds(10),
zhongyidd1439f62016-09-02 02:02:268015 QuicStreamFactoryPeer::GetPingTimeout(factory_.get()));
8016
8017 // Test two-in-a-row timeouts with open streams.
8018 DVLOG(1) << "Create 2nd session and timeout with open stream";
8019 TestCompletionCallback callback2;
zhongyi98d6a9262017-05-19 02:47:458020 QuicStreamRequest request2(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:038021 EXPECT_EQ(OK,
8022 request2.Request(
8023 server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
8024 /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
8025 failed_on_default_network_callback_, callback2.callback()));
zhongyidd1439f62016-09-02 02:02:268026 QuicChromiumClientSession* session2 = GetActiveSession(server2);
Ryan Hamilton8d9ee76e2018-05-29 23:52:528027 EXPECT_EQ(quic::QuicTime::Delta::FromSeconds(10),
zhongyidd1439f62016-09-02 02:02:268028 session2->connection()->ping_timeout());
8029
Yixin Wang7891a39d2017-11-08 20:59:248030 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
zhongyidd1439f62016-09-02 02:02:268031 EXPECT_TRUE(stream2.get());
Steven Valdezb4ff0412018-01-18 22:39:278032 EXPECT_EQ(OK,
8033 stream2->InitializeStream(&request_info, false, DEFAULT_PRIORITY,
Bence Békya25e3f72018-02-13 21:13:398034 net_log_, CompletionOnceCallback()));
zhongyidd1439f62016-09-02 02:02:268035 session2->connection()->CloseConnection(
Ryan Hamilton8d9ee76e2018-05-29 23:52:528036 quic::QUIC_NETWORK_IDLE_TIMEOUT, "test",
8037 quic::ConnectionCloseBehavior::SILENT_CLOSE);
zhongyidd1439f62016-09-02 02:02:268038 // Need to spin the loop now to ensure that
8039 // QuicStreamFactory::OnSessionClosed() runs.
8040 base::RunLoop run_loop2;
8041 run_loop2.RunUntilIdle();
zhongyidd1439f62016-09-02 02:02:268042
8043 EXPECT_TRUE(socket_data.AllReadDataConsumed());
8044 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
8045 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
8046 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
8047}
8048
tbansal3b966952016-10-25 23:25:148049// Verifies that the QUIC stream factory is initialized correctly.
rtenneticd2aaa15b2015-10-10 20:29:338050TEST_P(QuicStreamFactoryTest, MaybeInitialize) {
tbansal9b1cdf32017-05-10 17:28:398051 VerifyInitialization();
rtenneti8a80a6dc2015-09-21 19:51:138052}
8053
rtennetid073dd22016-08-04 01:58:338054TEST_P(QuicStreamFactoryTest, StartCertVerifyJob) {
8055 Initialize();
8056
rcha00569732016-08-27 11:09:368057 MockQuicData socket_data;
8058 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:438059 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:178060 socket_data.AddSocketDataToFactory(socket_factory_.get());
rtennetid073dd22016-08-04 01:58:338061
8062 // Save current state of |race_cert_verification|.
8063 bool race_cert_verification =
8064 QuicStreamFactoryPeer::GetRaceCertVerification(factory_.get());
8065
8066 // Load server config.
8067 HostPortPair host_port_pair(kDefaultServerHostName, kDefaultServerPort);
Ryan Hamilton4f0b26e2018-06-27 23:52:328068 quic::QuicServerId quic_server_id(host_port_pair_.host(),
8069 host_port_pair_.port(),
8070 privacy_mode_ == PRIVACY_MODE_ENABLED);
rtennetid073dd22016-08-04 01:58:338071 QuicStreamFactoryPeer::CacheDummyServerConfig(factory_.get(), quic_server_id);
8072
8073 QuicStreamFactoryPeer::SetRaceCertVerification(factory_.get(), true);
8074 EXPECT_FALSE(HasActiveCertVerifierJob(quic_server_id));
8075
8076 // Start CertVerifyJob.
Ryan Hamilton8d9ee76e2018-05-29 23:52:528077 quic::QuicAsyncStatus status = QuicStreamFactoryPeer::StartCertVerifyJob(
rtennetid073dd22016-08-04 01:58:338078 factory_.get(), quic_server_id, /*cert_verify_flags=*/0, net_log_);
Ryan Hamilton8d9ee76e2018-05-29 23:52:528079 if (status == quic::QUIC_PENDING) {
rtennetid073dd22016-08-04 01:58:338080 // Verify CertVerifierJob has started.
8081 EXPECT_TRUE(HasActiveCertVerifierJob(quic_server_id));
8082
8083 while (HasActiveCertVerifierJob(quic_server_id)) {
8084 base::RunLoop().RunUntilIdle();
8085 }
8086 }
8087 // Verify CertVerifierJob has finished.
8088 EXPECT_FALSE(HasActiveCertVerifierJob(quic_server_id));
8089
8090 // Start a QUIC request.
zhongyi98d6a9262017-05-19 02:47:458091 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:338092 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:038093 request.Request(
8094 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
8095 SocketTag(),
8096 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8097 failed_on_default_network_callback_, callback_.callback()));
rtennetid073dd22016-08-04 01:58:338098
8099 EXPECT_EQ(OK, callback_.WaitForResult());
8100
Yixin Wang7891a39d2017-11-08 20:59:248101 std::unique_ptr<HttpStream> stream = CreateStream(&request);
rtennetid073dd22016-08-04 01:58:338102 EXPECT_TRUE(stream.get());
8103
8104 // Restore |race_cert_verification|.
8105 QuicStreamFactoryPeer::SetRaceCertVerification(factory_.get(),
8106 race_cert_verification);
8107
8108 EXPECT_TRUE(socket_data.AllReadDataConsumed());
8109 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
8110
8111 // Verify there are no outstanding CertVerifierJobs after request has
8112 // finished.
8113 EXPECT_FALSE(HasActiveCertVerifierJob(quic_server_id));
8114}
8115
rtenneti1cd3b162015-09-29 02:58:288116TEST_P(QuicStreamFactoryTest, YieldAfterPackets) {
jri7046038f2015-10-22 00:29:268117 Initialize();
Ryan Hamiltona12722b2017-08-12 02:23:208118 factory_->set_require_confirmation(false);
rch6faa4d42016-01-05 20:48:438119 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8120 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
jri7046038f2015-10-22 00:29:268121 QuicStreamFactoryPeer::SetYieldAfterPackets(factory_.get(), 0);
rtenneti1cd3b162015-09-29 02:58:288122
rcha00569732016-08-27 11:09:368123 MockQuicData socket_data;
Fan Yangac867502019-01-28 21:10:238124 socket_data.AddRead(SYNCHRONOUS, ConstructClientConnectionClosePacket(1));
rcha00569732016-08-27 11:09:368125 socket_data.AddRead(ASYNC, OK);
Zhongyi Shi5f587cc2017-11-21 23:24:178126 socket_data.AddSocketDataToFactory(socket_factory_.get());
rtenneti1cd3b162015-09-29 02:58:288127
8128 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:278129 MockCryptoClientStream::ZERO_RTT);
Renjiea0cb4a2c2018-09-26 23:37:308130 host_resolver_->set_synchronous_mode(true);
8131 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
8132 "192.168.0.1", "");
rtenneti1cd3b162015-09-29 02:58:288133
rcha02807b42016-01-29 21:56:158134 // Set up the TaskObserver to verify QuicChromiumPacketReader::StartReading
8135 // posts a task.
rtenneti1cd3b162015-09-29 02:58:288136 // TODO(rtenneti): Change SpdySessionTestTaskObserver to NetTestTaskObserver??
rcha02807b42016-01-29 21:56:158137 SpdySessionTestTaskObserver observer("quic_chromium_packet_reader.cc",
8138 "StartReading");
rtenneti1cd3b162015-09-29 02:58:288139
zhongyi98d6a9262017-05-19 02:47:458140 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:338141 EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
8142 DEFAULT_PRIORITY, SocketTag(),
8143 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:038144 &net_error_details_,
8145 failed_on_default_network_callback_,
8146 callback_.callback()));
rtenneti1cd3b162015-09-29 02:58:288147
rcha02807b42016-01-29 21:56:158148 // Call run_loop so that QuicChromiumPacketReader::OnReadComplete() gets
8149 // called.
rtenneti1cd3b162015-09-29 02:58:288150 base::RunLoop run_loop;
8151 run_loop.RunUntilIdle();
8152
8153 // Verify task that the observer's executed_count is 1, which indicates
rcha02807b42016-01-29 21:56:158154 // QuicChromiumPacketReader::StartReading() has posted only one task and
8155 // yielded the read.
rtenneti1cd3b162015-09-29 02:58:288156 EXPECT_EQ(1u, observer.executed_count());
8157
Yixin Wang7891a39d2017-11-08 20:59:248158 std::unique_ptr<HttpStream> stream = CreateStream(&request);
xunjieli2608f9b2016-03-14 13:39:238159 EXPECT_FALSE(stream.get()); // Session is already closed.
rtenneti1cd3b162015-09-29 02:58:288160 EXPECT_TRUE(socket_data.AllReadDataConsumed());
8161 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
8162}
8163
8164TEST_P(QuicStreamFactoryTest, YieldAfterDuration) {
jri7046038f2015-10-22 00:29:268165 Initialize();
Ryan Hamiltona12722b2017-08-12 02:23:208166 factory_->set_require_confirmation(false);
rch6faa4d42016-01-05 20:48:438167 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8168 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
rtenneti1cd3b162015-09-29 02:58:288169 QuicStreamFactoryPeer::SetYieldAfterDuration(
Ryan Hamilton8d9ee76e2018-05-29 23:52:528170 factory_.get(), quic::QuicTime::Delta::FromMilliseconds(-1));
rtenneti1cd3b162015-09-29 02:58:288171
rcha00569732016-08-27 11:09:368172 MockQuicData socket_data;
Fan Yangac867502019-01-28 21:10:238173 socket_data.AddRead(SYNCHRONOUS, ConstructClientConnectionClosePacket(1));
rcha00569732016-08-27 11:09:368174 socket_data.AddRead(ASYNC, OK);
Zhongyi Shi5f587cc2017-11-21 23:24:178175 socket_data.AddSocketDataToFactory(socket_factory_.get());
rtenneti1cd3b162015-09-29 02:58:288176
8177 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:278178 MockCryptoClientStream::ZERO_RTT);
Renjiea0cb4a2c2018-09-26 23:37:308179 host_resolver_->set_synchronous_mode(true);
8180 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
8181 "192.168.0.1", "");
rtenneti1cd3b162015-09-29 02:58:288182
rcha02807b42016-01-29 21:56:158183 // Set up the TaskObserver to verify QuicChromiumPacketReader::StartReading
8184 // posts a task.
rtenneti1cd3b162015-09-29 02:58:288185 // TODO(rtenneti): Change SpdySessionTestTaskObserver to NetTestTaskObserver??
rcha02807b42016-01-29 21:56:158186 SpdySessionTestTaskObserver observer("quic_chromium_packet_reader.cc",
8187 "StartReading");
rtenneti1cd3b162015-09-29 02:58:288188
zhongyi98d6a9262017-05-19 02:47:458189 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:338190 EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
8191 DEFAULT_PRIORITY, SocketTag(),
8192 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:038193 &net_error_details_,
8194 failed_on_default_network_callback_,
8195 callback_.callback()));
rtenneti1cd3b162015-09-29 02:58:288196
rcha02807b42016-01-29 21:56:158197 // Call run_loop so that QuicChromiumPacketReader::OnReadComplete() gets
8198 // called.
rtenneti1cd3b162015-09-29 02:58:288199 base::RunLoop run_loop;
8200 run_loop.RunUntilIdle();
8201
8202 // Verify task that the observer's executed_count is 1, which indicates
rcha02807b42016-01-29 21:56:158203 // QuicChromiumPacketReader::StartReading() has posted only one task and
8204 // yielded the read.
rtenneti1cd3b162015-09-29 02:58:288205 EXPECT_EQ(1u, observer.executed_count());
8206
Yixin Wang7891a39d2017-11-08 20:59:248207 std::unique_ptr<HttpStream> stream = CreateStream(&request);
xunjieli2608f9b2016-03-14 13:39:238208 EXPECT_FALSE(stream.get()); // Session is already closed.
rtenneti1cd3b162015-09-29 02:58:288209 EXPECT_TRUE(socket_data.AllReadDataConsumed());
8210 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
8211}
8212
ckrasic3865ee0f2016-02-29 22:04:568213TEST_P(QuicStreamFactoryTest, ServerPushSessionAffinity) {
8214 Initialize();
8215 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8216 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8217
rcha00569732016-08-27 11:09:368218 MockQuicData socket_data;
8219 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:438220 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:178221 socket_data.AddSocketDataToFactory(socket_factory_.get());
ckrasic3865ee0f2016-02-29 22:04:568222
zhongyi98d6a9262017-05-19 02:47:458223 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:338224 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:038225 request.Request(
8226 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
8227 SocketTag(),
8228 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8229 failed_on_default_network_callback_, callback_.callback()));
ckrasic3865ee0f2016-02-29 22:04:568230
robpercival214763f2016-07-01 23:27:018231 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:248232 std::unique_ptr<HttpStream> stream = CreateStream(&request);
ckrasic3865ee0f2016-02-29 22:04:568233 EXPECT_TRUE(stream.get());
8234
8235 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get()));
8236
bnc5fdc07162016-05-23 17:36:038237 string url = "https://www.example.org/";
ckrasic3865ee0f2016-02-29 22:04:568238
bnc912a04b2016-04-20 14:19:508239 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
ckrasic3865ee0f2016-02-29 22:04:568240
Ryan Hamilton8d9ee76e2018-05-29 23:52:528241 quic::QuicClientPromisedInfo promised(
Fan Yang32c5a112018-12-10 20:06:338242 session, GetNthServerInitiatedUnidirectionalStreamId(0), kDefaultUrl);
ckrasic3865ee0f2016-02-29 22:04:568243 (*QuicStreamFactoryPeer::GetPushPromiseIndex(factory_.get())
bnc3d9035b32016-06-30 18:18:488244 ->promised_by_url())[kDefaultUrl] = &promised;
ckrasic3865ee0f2016-02-29 22:04:568245
zhongyi98d6a9262017-05-19 02:47:458246 QuicStreamRequest request2(factory_.get());
zhongyia00ca012017-07-06 23:36:398247 EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
Paul Jensen8e3c5d32018-02-19 17:06:338248 DEFAULT_PRIORITY, SocketTag(),
8249 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:038250 &net_error_details_,
8251 failed_on_default_network_callback_,
8252 callback_.callback()));
ckrasic3865ee0f2016-02-29 22:04:568253
8254 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get()));
8255}
8256
8257TEST_P(QuicStreamFactoryTest, ServerPushPrivacyModeMismatch) {
8258 Initialize();
8259 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8260 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8261 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8262
rcha00569732016-08-27 11:09:368263 MockQuicData socket_data1;
8264 socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:438265 socket_data1.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
8266 socket_data1.AddWrite(
Fan Yang32c5a112018-12-10 20:06:338267 SYNCHRONOUS, client_maker_.MakeRstPacket(
8268 2, true, GetNthServerInitiatedUnidirectionalStreamId(0),
8269 quic::QUIC_STREAM_CANCELLED));
Zhongyi Shi5f587cc2017-11-21 23:24:178270 socket_data1.AddSocketDataToFactory(socket_factory_.get());
ckrasic3865ee0f2016-02-29 22:04:568271
rcha00569732016-08-27 11:09:368272 MockQuicData socket_data2;
8273 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:438274 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:178275 socket_data2.AddSocketDataToFactory(socket_factory_.get());
ckrasic3865ee0f2016-02-29 22:04:568276
zhongyi98d6a9262017-05-19 02:47:458277 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:338278 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:038279 request.Request(
8280 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
8281 SocketTag(),
8282 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8283 failed_on_default_network_callback_, callback_.callback()));
ckrasic3865ee0f2016-02-29 22:04:568284
robpercival214763f2016-07-01 23:27:018285 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:248286 std::unique_ptr<HttpStream> stream = CreateStream(&request);
ckrasic3865ee0f2016-02-29 22:04:568287 EXPECT_TRUE(stream.get());
8288
8289 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get()));
8290
bnc5fdc07162016-05-23 17:36:038291 string url = "https://www.example.org/";
bnc912a04b2016-04-20 14:19:508292 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
ckrasic3865ee0f2016-02-29 22:04:568293
Ryan Hamilton8d9ee76e2018-05-29 23:52:528294 quic::QuicClientPromisedInfo promised(
Fan Yang32c5a112018-12-10 20:06:338295 session, GetNthServerInitiatedUnidirectionalStreamId(0), kDefaultUrl);
ckrasic3865ee0f2016-02-29 22:04:568296
Ryan Hamilton8d9ee76e2018-05-29 23:52:528297 quic::QuicClientPushPromiseIndex* index =
ckrasic3865ee0f2016-02-29 22:04:568298 QuicStreamFactoryPeer::GetPushPromiseIndex(factory_.get());
8299
bnc3d9035b32016-06-30 18:18:488300 (*index->promised_by_url())[kDefaultUrl] = &promised;
8301 EXPECT_EQ(index->GetPromised(kDefaultUrl), &promised);
ckrasic3865ee0f2016-02-29 22:04:568302
8303 // Doing the request should not use the push stream, but rather
8304 // cancel it because the privacy modes do not match.
zhongyi98d6a9262017-05-19 02:47:458305 QuicStreamRequest request2(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:338306 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:038307 request2.Request(
8308 host_port_pair_, version_, PRIVACY_MODE_ENABLED,
8309 DEFAULT_PRIORITY, SocketTag(),
8310 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8311 failed_on_default_network_callback_, callback_.callback()));
ckrasic3865ee0f2016-02-29 22:04:568312
8313 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get()));
bnc3d9035b32016-06-30 18:18:488314 EXPECT_EQ(index->GetPromised(kDefaultUrl), nullptr);
ckrasic3865ee0f2016-02-29 22:04:568315
robpercival214763f2016-07-01 23:27:018316 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:248317 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
ckrasic3865ee0f2016-02-29 22:04:568318 EXPECT_TRUE(stream2.get());
8319
8320 EXPECT_TRUE(socket_data1.AllReadDataConsumed());
8321 EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
8322 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
8323 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
8324}
8325
Ryan Hamilton8d9ee76e2018-05-29 23:52:528326// Pool to existing session with matching quic::QuicServerId
bnc359ed2a2016-04-29 20:43:458327// even if destination is different.
8328TEST_P(QuicStreamFactoryTest, PoolByOrigin) {
8329 Initialize();
8330
8331 HostPortPair destination1("first.example.com", 443);
8332 HostPortPair destination2("second.example.com", 443);
8333
8334 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8335 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8336
rcha00569732016-08-27 11:09:368337 MockQuicData socket_data;
8338 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:438339 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:178340 socket_data.AddSocketDataToFactory(socket_factory_.get());
bnc359ed2a2016-04-29 20:43:458341
zhongyi98d6a9262017-05-19 02:47:458342 QuicStreamRequest request1(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:038343 EXPECT_EQ(
8344 ERR_IO_PENDING,
8345 request1.Request(
8346 destination1, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
8347 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8348 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:018349 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:248350 std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
bnc359ed2a2016-04-29 20:43:458351 EXPECT_TRUE(stream1.get());
8352 EXPECT_TRUE(HasActiveSession(host_port_pair_));
8353
8354 // Second request returns synchronously because it pools to existing session.
8355 TestCompletionCallback callback2;
zhongyi98d6a9262017-05-19 02:47:458356 QuicStreamRequest request2(factory_.get());
zhongyia00ca012017-07-06 23:36:398357 EXPECT_EQ(OK, request2.Request(destination2, version_, privacy_mode_,
Paul Jensen8e3c5d32018-02-19 17:06:338358 DEFAULT_PRIORITY, SocketTag(),
8359 /*cert_verify_flags=*/0, url_, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:038360 &net_error_details_,
8361 failed_on_default_network_callback_,
8362 callback2.callback()));
Yixin Wang7891a39d2017-11-08 20:59:248363 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
bnc359ed2a2016-04-29 20:43:458364 EXPECT_TRUE(stream2.get());
8365
rchf0b18c8a2017-05-05 19:31:578366 QuicChromiumClientSession::Handle* session1 =
8367 QuicHttpStreamPeer::GetSessionHandle(stream1.get());
8368 QuicChromiumClientSession::Handle* session2 =
8369 QuicHttpStreamPeer::GetSessionHandle(stream2.get());
8370 EXPECT_TRUE(session1->SharesSameSession(*session2));
Ryan Hamilton4f0b26e2018-06-27 23:52:328371 EXPECT_EQ(quic::QuicServerId(host_port_pair_.host(), host_port_pair_.port(),
8372 privacy_mode_ == PRIVACY_MODE_ENABLED),
bnc359ed2a2016-04-29 20:43:458373 session1->server_id());
8374
8375 EXPECT_TRUE(socket_data.AllReadDataConsumed());
8376 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
8377}
8378
8379class QuicStreamFactoryWithDestinationTest
8380 : public QuicStreamFactoryTestBase,
8381 public ::testing::TestWithParam<PoolingTestParams> {
8382 protected:
8383 QuicStreamFactoryWithDestinationTest()
Yixin Wang079ad542018-01-11 04:06:058384 : QuicStreamFactoryTestBase(
8385 GetParam().version,
8386 GetParam().client_headers_include_h2_stream_dependency),
bnc359ed2a2016-04-29 20:43:458387 destination_type_(GetParam().destination_type),
8388 hanging_read_(SYNCHRONOUS, ERR_IO_PENDING, 0) {}
8389
8390 HostPortPair GetDestination() {
8391 switch (destination_type_) {
8392 case SAME_AS_FIRST:
8393 return origin1_;
8394 case SAME_AS_SECOND:
8395 return origin2_;
8396 case DIFFERENT:
8397 return HostPortPair(kDifferentHostname, 443);
8398 default:
8399 NOTREACHED();
8400 return HostPortPair();
8401 }
8402 }
8403
8404 void AddHangingSocketData() {
8405 std::unique_ptr<SequencedSocketData> sequenced_socket_data(
Ryan Sleevib8d7ea02018-05-07 20:01:018406 new SequencedSocketData(base::make_span(&hanging_read_, 1),
8407 base::span<MockWrite>()));
Zhongyi Shi5f587cc2017-11-21 23:24:178408 socket_factory_->AddSocketDataProvider(sequenced_socket_data.get());
bnc359ed2a2016-04-29 20:43:458409 sequenced_socket_data_vector_.push_back(std::move(sequenced_socket_data));
8410 }
8411
8412 bool AllDataConsumed() {
8413 for (const auto& socket_data_ptr : sequenced_socket_data_vector_) {
8414 if (!socket_data_ptr->AllReadDataConsumed() ||
8415 !socket_data_ptr->AllWriteDataConsumed()) {
8416 return false;
8417 }
8418 }
8419 return true;
8420 }
8421
8422 DestinationType destination_type_;
8423 HostPortPair origin1_;
8424 HostPortPair origin2_;
8425 MockRead hanging_read_;
rch872e00e2016-12-02 02:48:188426 std::vector<std::unique_ptr<SequencedSocketData>>
8427 sequenced_socket_data_vector_;
bnc359ed2a2016-04-29 20:43:458428};
8429
Victor Costane635086f2019-01-27 05:20:308430INSTANTIATE_TEST_SUITE_P(VersionIncludeStreamDependencySequence,
8431 QuicStreamFactoryWithDestinationTest,
8432 ::testing::ValuesIn(GetPoolingTestParams()));
bnc359ed2a2016-04-29 20:43:458433
8434// A single QUIC request fails because the certificate does not match the origin
8435// hostname, regardless of whether it matches the alternative service hostname.
8436TEST_P(QuicStreamFactoryWithDestinationTest, InvalidCertificate) {
8437 if (destination_type_ == DIFFERENT)
8438 return;
8439
8440 Initialize();
8441
8442 GURL url("https://mail.example.com/");
8443 origin1_ = HostPortPair::FromURL(url);
8444
8445 // Not used for requests, but this provides a test case where the certificate
8446 // is valid for the hostname of the alternative service.
8447 origin2_ = HostPortPair("mail.example.org", 433);
8448
8449 HostPortPair destination = GetDestination();
8450
8451 scoped_refptr<X509Certificate> cert(
8452 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
Ryan Sleevidef35f62018-01-23 21:12:248453 ASSERT_FALSE(cert->VerifyNameMatch(origin1_.host()));
8454 ASSERT_TRUE(cert->VerifyNameMatch(origin2_.host()));
bnc359ed2a2016-04-29 20:43:458455
8456 ProofVerifyDetailsChromium verify_details;
8457 verify_details.cert_verify_result.verified_cert = cert;
8458 verify_details.cert_verify_result.is_issued_by_known_root = true;
8459 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8460
8461 AddHangingSocketData();
8462
zhongyi98d6a9262017-05-19 02:47:458463 QuicStreamRequest request(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:038464 EXPECT_EQ(
8465 ERR_IO_PENDING,
8466 request.Request(
8467 destination, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
8468 /*cert_verify_flags=*/0, url, net_log_, &net_error_details_,
8469 failed_on_default_network_callback_, callback_.callback()));
bnc359ed2a2016-04-29 20:43:458470
robpercival214763f2016-07-01 23:27:018471 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_QUIC_HANDSHAKE_FAILED));
bnc359ed2a2016-04-29 20:43:458472
8473 EXPECT_TRUE(AllDataConsumed());
8474}
8475
8476// QuicStreamRequest is pooled based on |destination| if certificate matches.
8477TEST_P(QuicStreamFactoryWithDestinationTest, SharedCertificate) {
8478 Initialize();
8479
8480 GURL url1("https://www.example.org/");
8481 GURL url2("https://mail.example.org/");
8482 origin1_ = HostPortPair::FromURL(url1);
8483 origin2_ = HostPortPair::FromURL(url2);
8484
8485 HostPortPair destination = GetDestination();
8486
8487 scoped_refptr<X509Certificate> cert(
8488 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
Ryan Sleevidef35f62018-01-23 21:12:248489 ASSERT_TRUE(cert->VerifyNameMatch(origin1_.host()));
8490 ASSERT_TRUE(cert->VerifyNameMatch(origin2_.host()));
8491 ASSERT_FALSE(cert->VerifyNameMatch(kDifferentHostname));
bnc359ed2a2016-04-29 20:43:458492
8493 ProofVerifyDetailsChromium verify_details;
8494 verify_details.cert_verify_result.verified_cert = cert;
8495 verify_details.cert_verify_result.is_issued_by_known_root = true;
8496 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8497
fayang3bcb8b502016-12-07 21:44:378498 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
Ryan Hamilton8d9ee76e2018-05-29 23:52:528499 std::unique_ptr<quic::QuicEncryptedPacket> settings_packet(
rch5cb522462017-04-25 20:18:368500 client_maker_.MakeInitialSettingsPacket(1, nullptr));
bnceb9aa7112017-01-05 01:03:468501 MockWrite writes[] = {MockWrite(SYNCHRONOUS, settings_packet->data(),
8502 settings_packet->length(), 1)};
fayang3bcb8b502016-12-07 21:44:378503 std::unique_ptr<SequencedSocketData> sequenced_socket_data(
Ryan Sleevib8d7ea02018-05-07 20:01:018504 new SequencedSocketData(reads, writes));
Zhongyi Shi5f587cc2017-11-21 23:24:178505 socket_factory_->AddSocketDataProvider(sequenced_socket_data.get());
fayang3bcb8b502016-12-07 21:44:378506 sequenced_socket_data_vector_.push_back(std::move(sequenced_socket_data));
bnc359ed2a2016-04-29 20:43:458507
zhongyi98d6a9262017-05-19 02:47:458508 QuicStreamRequest request1(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:038509 EXPECT_EQ(
8510 ERR_IO_PENDING,
8511 request1.Request(
8512 destination, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
8513 /*cert_verify_flags=*/0, url1, net_log_, &net_error_details_,
8514 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:018515 EXPECT_THAT(callback_.WaitForResult(), IsOk());
fayang3bcb8b502016-12-07 21:44:378516
Yixin Wang7891a39d2017-11-08 20:59:248517 std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
bnc359ed2a2016-04-29 20:43:458518 EXPECT_TRUE(stream1.get());
8519 EXPECT_TRUE(HasActiveSession(origin1_));
8520
8521 // Second request returns synchronously because it pools to existing session.
8522 TestCompletionCallback callback2;
zhongyi98d6a9262017-05-19 02:47:458523 QuicStreamRequest request2(factory_.get());
zhongyia00ca012017-07-06 23:36:398524 EXPECT_EQ(OK, request2.Request(destination, version_, privacy_mode_,
Paul Jensen8e3c5d32018-02-19 17:06:338525 DEFAULT_PRIORITY, SocketTag(),
8526 /*cert_verify_flags=*/0, url2, net_log_,
Zhongyi Shia6b68d112018-09-24 07:49:038527 &net_error_details_,
8528 failed_on_default_network_callback_,
8529 callback2.callback()));
Yixin Wang7891a39d2017-11-08 20:59:248530 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
bnc359ed2a2016-04-29 20:43:458531 EXPECT_TRUE(stream2.get());
8532
rchf0b18c8a2017-05-05 19:31:578533 QuicChromiumClientSession::Handle* session1 =
8534 QuicHttpStreamPeer::GetSessionHandle(stream1.get());
8535 QuicChromiumClientSession::Handle* session2 =
8536 QuicHttpStreamPeer::GetSessionHandle(stream2.get());
8537 EXPECT_TRUE(session1->SharesSameSession(*session2));
bnc359ed2a2016-04-29 20:43:458538
Ryan Hamilton4f0b26e2018-06-27 23:52:328539 EXPECT_EQ(quic::QuicServerId(origin1_.host(), origin1_.port(),
8540 privacy_mode_ == PRIVACY_MODE_ENABLED),
8541 session1->server_id());
bnc359ed2a2016-04-29 20:43:458542
8543 EXPECT_TRUE(AllDataConsumed());
8544}
8545
bnc47eba7d2016-07-01 00:43:388546// QuicStreamRequest is not pooled if PrivacyMode differs.
8547TEST_P(QuicStreamFactoryWithDestinationTest, DifferentPrivacyMode) {
8548 Initialize();
8549
8550 GURL url1("https://www.example.org/");
8551 GURL url2("https://mail.example.org/");
8552 origin1_ = HostPortPair::FromURL(url1);
8553 origin2_ = HostPortPair::FromURL(url2);
8554
8555 HostPortPair destination = GetDestination();
8556
8557 scoped_refptr<X509Certificate> cert(
8558 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
Ryan Sleevidef35f62018-01-23 21:12:248559 ASSERT_TRUE(cert->VerifyNameMatch(origin1_.host()));
8560 ASSERT_TRUE(cert->VerifyNameMatch(origin2_.host()));
8561 ASSERT_FALSE(cert->VerifyNameMatch(kDifferentHostname));
bnc47eba7d2016-07-01 00:43:388562
8563 ProofVerifyDetailsChromium verify_details1;
8564 verify_details1.cert_verify_result.verified_cert = cert;
8565 verify_details1.cert_verify_result.is_issued_by_known_root = true;
8566 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details1);
8567
8568 ProofVerifyDetailsChromium verify_details2;
8569 verify_details2.cert_verify_result.verified_cert = cert;
8570 verify_details2.cert_verify_result.is_issued_by_known_root = true;
8571 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
8572
fayang3bcb8b502016-12-07 21:44:378573 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
Ryan Hamilton8d9ee76e2018-05-29 23:52:528574 std::unique_ptr<quic::QuicEncryptedPacket> settings_packet(
rch5cb522462017-04-25 20:18:368575 client_maker_.MakeInitialSettingsPacket(1, nullptr));
bnceb9aa7112017-01-05 01:03:468576 MockWrite writes[] = {MockWrite(SYNCHRONOUS, settings_packet->data(),
8577 settings_packet->length(), 1)};
fayang3bcb8b502016-12-07 21:44:378578 std::unique_ptr<SequencedSocketData> sequenced_socket_data(
Ryan Sleevib8d7ea02018-05-07 20:01:018579 new SequencedSocketData(reads, writes));
Zhongyi Shi5f587cc2017-11-21 23:24:178580 socket_factory_->AddSocketDataProvider(sequenced_socket_data.get());
fayang3bcb8b502016-12-07 21:44:378581 sequenced_socket_data_vector_.push_back(std::move(sequenced_socket_data));
8582 std::unique_ptr<SequencedSocketData> sequenced_socket_data1(
Ryan Sleevib8d7ea02018-05-07 20:01:018583 new SequencedSocketData(reads, writes));
Zhongyi Shi5f587cc2017-11-21 23:24:178584 socket_factory_->AddSocketDataProvider(sequenced_socket_data1.get());
fayang3bcb8b502016-12-07 21:44:378585 sequenced_socket_data_vector_.push_back(std::move(sequenced_socket_data1));
bnc47eba7d2016-07-01 00:43:388586
zhongyi98d6a9262017-05-19 02:47:458587 QuicStreamRequest request1(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:338588 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:038589 request1.Request(
8590 destination, version_, PRIVACY_MODE_DISABLED, DEFAULT_PRIORITY,
8591 SocketTag(),
8592 /*cert_verify_flags=*/0, url1, net_log_, &net_error_details_,
8593 failed_on_default_network_callback_, callback_.callback()));
bnc47eba7d2016-07-01 00:43:388594 EXPECT_EQ(OK, callback_.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:248595 std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
bnc47eba7d2016-07-01 00:43:388596 EXPECT_TRUE(stream1.get());
8597 EXPECT_TRUE(HasActiveSession(origin1_));
8598
8599 TestCompletionCallback callback2;
zhongyi98d6a9262017-05-19 02:47:458600 QuicStreamRequest request2(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:338601 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:038602 request2.Request(
8603 destination, version_, PRIVACY_MODE_ENABLED, DEFAULT_PRIORITY,
8604 SocketTag(),
8605 /*cert_verify_flags=*/0, url2, net_log_, &net_error_details_,
8606 failed_on_default_network_callback_, callback2.callback()));
bnc47eba7d2016-07-01 00:43:388607 EXPECT_EQ(OK, callback2.WaitForResult());
Yixin Wang7891a39d2017-11-08 20:59:248608 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
bnc47eba7d2016-07-01 00:43:388609 EXPECT_TRUE(stream2.get());
8610
8611 // |request2| does not pool to the first session, because PrivacyMode does not
8612 // match. Instead, another session is opened to the same destination, but
Ryan Hamilton8d9ee76e2018-05-29 23:52:528613 // with a different quic::QuicServerId.
rchf0b18c8a2017-05-05 19:31:578614 QuicChromiumClientSession::Handle* session1 =
8615 QuicHttpStreamPeer::GetSessionHandle(stream1.get());
8616 QuicChromiumClientSession::Handle* session2 =
8617 QuicHttpStreamPeer::GetSessionHandle(stream2.get());
8618 EXPECT_FALSE(session1->SharesSameSession(*session2));
bnc47eba7d2016-07-01 00:43:388619
Ryan Hamilton4f0b26e2018-06-27 23:52:328620 EXPECT_EQ(quic::QuicServerId(origin1_.host(), origin1_.port(), false),
bnc47eba7d2016-07-01 00:43:388621 session1->server_id());
Ryan Hamilton4f0b26e2018-06-27 23:52:328622 EXPECT_EQ(quic::QuicServerId(origin2_.host(), origin2_.port(), true),
bnc47eba7d2016-07-01 00:43:388623 session2->server_id());
8624
8625 EXPECT_TRUE(AllDataConsumed());
8626}
8627
bnc359ed2a2016-04-29 20:43:458628// QuicStreamRequest is not pooled if certificate does not match its origin.
8629TEST_P(QuicStreamFactoryWithDestinationTest, DisjointCertificate) {
8630 Initialize();
8631
8632 GURL url1("https://news.example.org/");
8633 GURL url2("https://mail.example.com/");
8634 origin1_ = HostPortPair::FromURL(url1);
8635 origin2_ = HostPortPair::FromURL(url2);
8636
8637 HostPortPair destination = GetDestination();
8638
8639 scoped_refptr<X509Certificate> cert1(
8640 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
Ryan Sleevidef35f62018-01-23 21:12:248641 ASSERT_TRUE(cert1->VerifyNameMatch(origin1_.host()));
8642 ASSERT_FALSE(cert1->VerifyNameMatch(origin2_.host()));
8643 ASSERT_FALSE(cert1->VerifyNameMatch(kDifferentHostname));
bnc359ed2a2016-04-29 20:43:458644
8645 ProofVerifyDetailsChromium verify_details1;
8646 verify_details1.cert_verify_result.verified_cert = cert1;
8647 verify_details1.cert_verify_result.is_issued_by_known_root = true;
8648 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details1);
8649
8650 scoped_refptr<X509Certificate> cert2(
8651 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
Ryan Sleevidef35f62018-01-23 21:12:248652 ASSERT_TRUE(cert2->VerifyNameMatch(origin2_.host()));
8653 ASSERT_FALSE(cert2->VerifyNameMatch(kDifferentHostname));
bnc359ed2a2016-04-29 20:43:458654
8655 ProofVerifyDetailsChromium verify_details2;
8656 verify_details2.cert_verify_result.verified_cert = cert2;
8657 verify_details2.cert_verify_result.is_issued_by_known_root = true;
8658 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
8659
fayang3bcb8b502016-12-07 21:44:378660 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
Ryan Hamilton8d9ee76e2018-05-29 23:52:528661 std::unique_ptr<quic::QuicEncryptedPacket> settings_packet(
rch5cb522462017-04-25 20:18:368662 client_maker_.MakeInitialSettingsPacket(1, nullptr));
bnceb9aa7112017-01-05 01:03:468663 MockWrite writes[] = {MockWrite(SYNCHRONOUS, settings_packet->data(),
8664 settings_packet->length(), 1)};
fayang3bcb8b502016-12-07 21:44:378665 std::unique_ptr<SequencedSocketData> sequenced_socket_data(
Ryan Sleevib8d7ea02018-05-07 20:01:018666 new SequencedSocketData(reads, writes));
Zhongyi Shi5f587cc2017-11-21 23:24:178667 socket_factory_->AddSocketDataProvider(sequenced_socket_data.get());
fayang3bcb8b502016-12-07 21:44:378668 sequenced_socket_data_vector_.push_back(std::move(sequenced_socket_data));
8669 std::unique_ptr<SequencedSocketData> sequenced_socket_data1(
Ryan Sleevib8d7ea02018-05-07 20:01:018670 new SequencedSocketData(reads, writes));
Zhongyi Shi5f587cc2017-11-21 23:24:178671 socket_factory_->AddSocketDataProvider(sequenced_socket_data1.get());
fayang3bcb8b502016-12-07 21:44:378672 sequenced_socket_data_vector_.push_back(std::move(sequenced_socket_data1));
bnc359ed2a2016-04-29 20:43:458673
zhongyi98d6a9262017-05-19 02:47:458674 QuicStreamRequest request1(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:038675 EXPECT_EQ(
8676 ERR_IO_PENDING,
8677 request1.Request(
8678 destination, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
8679 /*cert_verify_flags=*/0, url1, net_log_, &net_error_details_,
8680 failed_on_default_network_callback_, callback_.callback()));
robpercival214763f2016-07-01 23:27:018681 EXPECT_THAT(callback_.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:248682 std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
bnc359ed2a2016-04-29 20:43:458683 EXPECT_TRUE(stream1.get());
8684 EXPECT_TRUE(HasActiveSession(origin1_));
8685
8686 TestCompletionCallback callback2;
zhongyi98d6a9262017-05-19 02:47:458687 QuicStreamRequest request2(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:038688 EXPECT_EQ(
8689 ERR_IO_PENDING,
8690 request2.Request(
8691 destination, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
8692 /*cert_verify_flags=*/0, url2, net_log_, &net_error_details_,
8693 failed_on_default_network_callback_, callback2.callback()));
robpercival214763f2016-07-01 23:27:018694 EXPECT_THAT(callback2.WaitForResult(), IsOk());
Yixin Wang7891a39d2017-11-08 20:59:248695 std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
bnc359ed2a2016-04-29 20:43:458696 EXPECT_TRUE(stream2.get());
8697
8698 // |request2| does not pool to the first session, because the certificate does
8699 // not match. Instead, another session is opened to the same destination, but
Ryan Hamilton8d9ee76e2018-05-29 23:52:528700 // with a different quic::QuicServerId.
rchf0b18c8a2017-05-05 19:31:578701 QuicChromiumClientSession::Handle* session1 =
8702 QuicHttpStreamPeer::GetSessionHandle(stream1.get());
8703 QuicChromiumClientSession::Handle* session2 =
8704 QuicHttpStreamPeer::GetSessionHandle(stream2.get());
8705 EXPECT_FALSE(session1->SharesSameSession(*session2));
bnc359ed2a2016-04-29 20:43:458706
Ryan Hamilton4f0b26e2018-06-27 23:52:328707 EXPECT_EQ(quic::QuicServerId(origin1_.host(), origin1_.port(),
8708 privacy_mode_ == PRIVACY_MODE_ENABLED),
8709 session1->server_id());
8710 EXPECT_EQ(quic::QuicServerId(origin2_.host(), origin2_.port(),
8711 privacy_mode_ == PRIVACY_MODE_ENABLED),
8712 session2->server_id());
bnc359ed2a2016-04-29 20:43:458713
8714 EXPECT_TRUE(AllDataConsumed());
8715}
8716
msramek992625ec2016-08-04 18:33:588717// This test verifies that QuicStreamFactory::ClearCachedStatesInCryptoConfig
8718// correctly transform an origin filter to a ServerIdFilter. Whether the
8719// deletion itself works correctly is tested in QuicCryptoClientConfigTest.
8720TEST_P(QuicStreamFactoryTest, ClearCachedStatesInCryptoConfig) {
8721 Initialize();
Ryan Hamilton8d9ee76e2018-05-29 23:52:528722 quic::QuicCryptoClientConfig* crypto_config =
msramek992625ec2016-08-04 18:33:588723 QuicStreamFactoryPeer::GetCryptoConfig(factory_.get());
8724
8725 struct TestCase {
8726 TestCase(const std::string& host,
8727 int port,
8728 PrivacyMode privacy_mode,
Ryan Hamilton8d9ee76e2018-05-29 23:52:528729 quic::QuicCryptoClientConfig* crypto_config)
msramek992625ec2016-08-04 18:33:588730 : server_id(host, port, privacy_mode),
8731 state(crypto_config->LookupOrCreate(server_id)) {
rch872e00e2016-12-02 02:48:188732 std::vector<string> certs(1);
msramek992625ec2016-08-04 18:33:588733 certs[0] = "cert";
8734 state->SetProof(certs, "cert_sct", "chlo_hash", "signature");
8735 state->set_source_address_token("TOKEN");
8736 state->SetProofValid();
8737
8738 EXPECT_FALSE(state->certs().empty());
8739 }
8740
Ryan Hamilton8d9ee76e2018-05-29 23:52:528741 quic::QuicServerId server_id;
8742 quic::QuicCryptoClientConfig::CachedState* state;
msramek992625ec2016-08-04 18:33:588743 } test_cases[] = {
8744 TestCase("www.google.com", 443, privacy_mode_, crypto_config),
8745 TestCase("www.example.com", 443, privacy_mode_, crypto_config),
8746 TestCase("www.example.com", 4433, privacy_mode_, crypto_config)};
8747
8748 // Clear cached states for the origin https://www.example.com:4433.
8749 GURL origin("https://www.example.com:4433");
csharrisonebeca8e2016-10-18 02:35:368750 factory_->ClearCachedStatesInCryptoConfig(base::Bind(
8751 static_cast<bool (*)(const GURL&, const GURL&)>(::operator==), origin));
msramek992625ec2016-08-04 18:33:588752 EXPECT_FALSE(test_cases[0].state->certs().empty());
8753 EXPECT_FALSE(test_cases[1].state->certs().empty());
8754 EXPECT_TRUE(test_cases[2].state->certs().empty());
8755
8756 // Clear all cached states.
8757 factory_->ClearCachedStatesInCryptoConfig(
8758 base::Callback<bool(const GURL&)>());
8759 EXPECT_TRUE(test_cases[0].state->certs().empty());
8760 EXPECT_TRUE(test_cases[1].state->certs().empty());
8761 EXPECT_TRUE(test_cases[2].state->certs().empty());
8762}
8763
Yixin Wang46a425f2017-08-10 23:02:208764// Passes connection options and client connection options to QuicStreamFactory,
Ryan Hamilton8d9ee76e2018-05-29 23:52:528765// then checks that its internal quic::QuicConfig is correct.
Yixin Wang46a425f2017-08-10 23:02:208766TEST_P(QuicStreamFactoryTest, ConfigConnectionOptions) {
Zhongyi Shi967d2f12019-02-08 20:58:538767 test_params_.quic_connection_options.push_back(quic::kTIME);
8768 test_params_.quic_connection_options.push_back(quic::kTBBR);
8769 test_params_.quic_connection_options.push_back(quic::kREJ);
Yixin Wang46a425f2017-08-10 23:02:208770
Zhongyi Shi967d2f12019-02-08 20:58:538771 test_params_.quic_client_connection_options.push_back(quic::kTBBR);
8772 test_params_.quic_client_connection_options.push_back(quic::k1RTT);
Yixin Wang46a425f2017-08-10 23:02:208773
8774 Initialize();
8775
Ryan Hamilton8d9ee76e2018-05-29 23:52:528776 const quic::QuicConfig* config =
8777 QuicStreamFactoryPeer::GetConfig(factory_.get());
Zhongyi Shi967d2f12019-02-08 20:58:538778 EXPECT_EQ(test_params_.quic_connection_options,
8779 config->SendConnectionOptions());
Yixin Wang46a425f2017-08-10 23:02:208780 EXPECT_TRUE(config->HasClientRequestedIndependentOption(
Ryan Hamilton8d9ee76e2018-05-29 23:52:528781 quic::kTBBR, quic::Perspective::IS_CLIENT));
Yixin Wang46a425f2017-08-10 23:02:208782 EXPECT_TRUE(config->HasClientRequestedIndependentOption(
Ryan Hamilton8d9ee76e2018-05-29 23:52:528783 quic::k1RTT, quic::Perspective::IS_CLIENT));
Yixin Wang46a425f2017-08-10 23:02:208784}
8785
Yixin Wang247ea642017-11-15 01:15:508786// Verifies that the host resolver uses the request priority passed to
8787// QuicStreamRequest::Request().
8788TEST_P(QuicStreamFactoryTest, HostResolverUsesRequestPriority) {
8789 Initialize();
8790 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8791 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8792
8793 MockQuicData socket_data;
8794 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:438795 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Zhongyi Shi5f587cc2017-11-21 23:24:178796 socket_data.AddSocketDataToFactory(socket_factory_.get());
Yixin Wang247ea642017-11-15 01:15:508797
8798 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:338799 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:038800 request.Request(
8801 host_port_pair_, version_, privacy_mode_, MAXIMUM_PRIORITY,
8802 SocketTag(),
8803 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8804 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang247ea642017-11-15 01:15:508805
8806 EXPECT_THAT(callback_.WaitForResult(), IsOk());
8807 std::unique_ptr<HttpStream> stream = CreateStream(&request);
8808 EXPECT_TRUE(stream.get());
8809
Renjiea0cb4a2c2018-09-26 23:37:308810 EXPECT_EQ(MAXIMUM_PRIORITY, host_resolver_->last_request_priority());
Yixin Wang247ea642017-11-15 01:15:508811
8812 EXPECT_TRUE(socket_data.AllReadDataConsumed());
8813 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
8814}
8815
Lily Chenf11e1292018-11-29 16:42:098816TEST_P(QuicStreamFactoryTest, HostResolverRequestReprioritizedOnSetPriority) {
8817 Initialize();
8818 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8819 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8820
8821 MockQuicData socket_data;
8822 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
8823 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
8824 socket_data.AddSocketDataToFactory(socket_factory_.get());
8825
8826 QuicStreamRequest request(factory_.get());
8827 EXPECT_EQ(ERR_IO_PENDING,
8828 request.Request(
8829 host_port_pair_, version_, privacy_mode_, MAXIMUM_PRIORITY,
8830 SocketTag(),
8831 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8832 failed_on_default_network_callback_, callback_.callback()));
8833
8834 EXPECT_EQ(MAXIMUM_PRIORITY, host_resolver_->last_request_priority());
8835 EXPECT_EQ(MAXIMUM_PRIORITY, host_resolver_->request_priority(1));
8836
8837 QuicStreamRequest request2(factory_.get());
8838 EXPECT_EQ(ERR_IO_PENDING,
8839 request2.Request(
8840 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
8841 SocketTag(),
8842 /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
8843 failed_on_default_network_callback_, callback_.callback()));
8844 EXPECT_EQ(DEFAULT_PRIORITY, host_resolver_->last_request_priority());
8845 EXPECT_EQ(DEFAULT_PRIORITY, host_resolver_->request_priority(2));
8846
8847 request.SetPriority(LOWEST);
8848 EXPECT_EQ(LOWEST, host_resolver_->request_priority(1));
8849 EXPECT_EQ(DEFAULT_PRIORITY, host_resolver_->request_priority(2));
8850}
8851
Zhongyi Shi967d2f12019-02-08 20:58:538852// Passes |quic_max_time_before_crypto_handshake_seconds| and
8853// |quic_max_idle_time_before_crypto_handshake_seconds| to QuicStreamFactory,
Ryan Hamilton8d9ee76e2018-05-29 23:52:528854// checks that its internal quic::QuicConfig is correct.
Yixin Wang469da562017-11-15 21:34:588855TEST_P(QuicStreamFactoryTest, ConfigMaxTimeBeforeCryptoHandshake) {
Zhongyi Shi967d2f12019-02-08 20:58:538856 test_params_.quic_max_time_before_crypto_handshake_seconds = 11;
8857 test_params_.quic_max_idle_time_before_crypto_handshake_seconds = 13;
Yixin Wang469da562017-11-15 21:34:588858 Initialize();
8859
Ryan Hamilton8d9ee76e2018-05-29 23:52:528860 const quic::QuicConfig* config =
8861 QuicStreamFactoryPeer::GetConfig(factory_.get());
8862 EXPECT_EQ(quic::QuicTime::Delta::FromSeconds(11),
Yixin Wang469da562017-11-15 21:34:588863 config->max_time_before_crypto_handshake());
Ryan Hamilton8d9ee76e2018-05-29 23:52:528864 EXPECT_EQ(quic::QuicTime::Delta::FromSeconds(13),
Yixin Wang469da562017-11-15 21:34:588865 config->max_idle_time_before_crypto_handshake());
8866}
8867
Yixin Wang7c5d11a82017-12-21 02:40:008868// Verify ResultAfterHostResolutionCallback behavior when host resolution
8869// succeeds asynchronously, then crypto handshake fails synchronously.
8870TEST_P(QuicStreamFactoryTest, ResultAfterHostResolutionCallbackAsyncSync) {
8871 Initialize();
8872 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8873 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8874
Renjiea0cb4a2c2018-09-26 23:37:308875 host_resolver_->set_ondemand_mode(true);
Yixin Wang7c5d11a82017-12-21 02:40:008876
8877 MockQuicData socket_data;
8878 socket_data.AddRead(SYNCHRONOUS, ERR_FAILED);
8879 socket_data.AddWrite(SYNCHRONOUS, ERR_FAILED);
8880 socket_data.AddSocketDataToFactory(socket_factory_.get());
8881
8882 QuicStreamRequest request(factory_.get());
8883 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:038884 request.Request(
8885 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
8886 SocketTag(),
8887 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8888 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7c5d11a82017-12-21 02:40:008889
8890 TestCompletionCallback host_resolution_callback;
8891 EXPECT_TRUE(
8892 request.WaitForHostResolution(host_resolution_callback.callback()));
8893
8894 // |host_resolver_| has not finished host resolution at this point, so
8895 // |host_resolution_callback| should not have a result.
8896 base::RunLoop().RunUntilIdle();
8897 EXPECT_FALSE(host_resolution_callback.have_result());
8898
8899 // Allow |host_resolver_| to finish host resolution.
8900 // Since the request fails immediately after host resolution (getting
8901 // ERR_FAILED from socket reads/writes), |host_resolution_callback| should be
8902 // called with ERR_QUIC_PROTOCOL_ERROR since that's the next result in
8903 // forming the connection.
Renjiea0cb4a2c2018-09-26 23:37:308904 host_resolver_->ResolveAllPending();
Yixin Wang7c5d11a82017-12-21 02:40:008905 base::RunLoop().RunUntilIdle();
8906 EXPECT_TRUE(host_resolution_callback.have_result());
8907 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, host_resolution_callback.WaitForResult());
8908
8909 // Calling WaitForHostResolution() a second time should return
8910 // false since host resolution has finished already.
8911 EXPECT_FALSE(
8912 request.WaitForHostResolution(host_resolution_callback.callback()));
8913
8914 EXPECT_TRUE(callback_.have_result());
8915 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback_.WaitForResult());
8916}
8917
8918// Verify ResultAfterHostResolutionCallback behavior when host resolution
8919// succeeds asynchronously, then crypto handshake fails asynchronously.
8920TEST_P(QuicStreamFactoryTest, ResultAfterHostResolutionCallbackAsyncAsync) {
8921 Initialize();
8922 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8923 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8924
Renjiea0cb4a2c2018-09-26 23:37:308925 host_resolver_->set_ondemand_mode(true);
Yixin Wang7c5d11a82017-12-21 02:40:008926 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:278927 MockCryptoClientStream::ZERO_RTT);
Yixin Wang7c5d11a82017-12-21 02:40:008928 factory_->set_require_confirmation(true);
8929
8930 MockQuicData socket_data;
8931 socket_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause
8932 socket_data.AddRead(ASYNC, ERR_FAILED);
8933 socket_data.AddWrite(ASYNC, ERR_FAILED);
8934 socket_data.AddSocketDataToFactory(socket_factory_.get());
8935
8936 QuicStreamRequest request(factory_.get());
8937 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:038938 request.Request(
8939 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
8940 SocketTag(),
8941 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8942 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7c5d11a82017-12-21 02:40:008943
8944 TestCompletionCallback host_resolution_callback;
8945 EXPECT_TRUE(
8946 request.WaitForHostResolution(host_resolution_callback.callback()));
8947
8948 // |host_resolver_| has not finished host resolution at this point, so
8949 // |host_resolution_callback| should not have a result.
8950 base::RunLoop().RunUntilIdle();
8951 EXPECT_FALSE(host_resolution_callback.have_result());
8952
8953 // Allow |host_resolver_| to finish host resolution. Since crypto handshake
8954 // will hang after host resolution, |host_resolution_callback| should run with
8955 // ERR_IO_PENDING since that's the next result in forming the connection.
Renjiea0cb4a2c2018-09-26 23:37:308956 host_resolver_->ResolveAllPending();
Yixin Wang7c5d11a82017-12-21 02:40:008957 base::RunLoop().RunUntilIdle();
8958 EXPECT_TRUE(host_resolution_callback.have_result());
8959 EXPECT_EQ(ERR_IO_PENDING, host_resolution_callback.WaitForResult());
8960
8961 // Calling WaitForHostResolution() a second time should return
8962 // false since host resolution has finished already.
8963 EXPECT_FALSE(
8964 request.WaitForHostResolution(host_resolution_callback.callback()));
8965
8966 EXPECT_FALSE(callback_.have_result());
8967 socket_data.GetSequencedSocketData()->Resume();
8968 base::RunLoop().RunUntilIdle();
8969 EXPECT_TRUE(callback_.have_result());
8970 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback_.WaitForResult());
8971}
8972
8973// Verify ResultAfterHostResolutionCallback behavior when host resolution
8974// succeeds synchronously, then crypto handshake fails synchronously.
8975TEST_P(QuicStreamFactoryTest, ResultAfterHostResolutionCallbackSyncSync) {
8976 Initialize();
8977 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
8978 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
8979
Renjiea0cb4a2c2018-09-26 23:37:308980 host_resolver_->set_synchronous_mode(true);
Yixin Wang7c5d11a82017-12-21 02:40:008981
8982 MockQuicData socket_data;
8983 socket_data.AddRead(SYNCHRONOUS, ERR_FAILED);
8984 socket_data.AddWrite(SYNCHRONOUS, ERR_FAILED);
8985 socket_data.AddSocketDataToFactory(socket_factory_.get());
8986
8987 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:338988 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR,
Zhongyi Shia6b68d112018-09-24 07:49:038989 request.Request(
8990 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
8991 SocketTag(),
8992 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
8993 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7c5d11a82017-12-21 02:40:008994
8995 // WaitForHostResolution() should return false since host
8996 // resolution has finished already.
8997 TestCompletionCallback host_resolution_callback;
8998 EXPECT_FALSE(
8999 request.WaitForHostResolution(host_resolution_callback.callback()));
9000 base::RunLoop().RunUntilIdle();
9001 EXPECT_FALSE(host_resolution_callback.have_result());
9002 EXPECT_FALSE(callback_.have_result());
9003}
9004
9005// Verify ResultAfterHostResolutionCallback behavior when host resolution
9006// succeeds synchronously, then crypto handshake fails asynchronously.
9007TEST_P(QuicStreamFactoryTest, ResultAfterHostResolutionCallbackSyncAsync) {
9008 Initialize();
9009 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9010 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9011
9012 // Host resolution will succeed synchronously, but Request() as a whole
9013 // will fail asynchronously.
Renjiea0cb4a2c2018-09-26 23:37:309014 host_resolver_->set_synchronous_mode(true);
Yixin Wang7c5d11a82017-12-21 02:40:009015 crypto_client_stream_factory_.set_handshake_mode(
Ryan Hamilton9835e662018-08-02 05:36:279016 MockCryptoClientStream::ZERO_RTT);
Yixin Wang7c5d11a82017-12-21 02:40:009017 factory_->set_require_confirmation(true);
9018
9019 MockQuicData socket_data;
9020 socket_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause
9021 socket_data.AddRead(ASYNC, ERR_FAILED);
9022 socket_data.AddWrite(ASYNC, ERR_FAILED);
9023 socket_data.AddSocketDataToFactory(socket_factory_.get());
9024
9025 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:339026 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:039027 request.Request(
9028 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9029 SocketTag(),
9030 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9031 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7c5d11a82017-12-21 02:40:009032
9033 // WaitForHostResolution() should return false since host
9034 // resolution has finished already.
9035 TestCompletionCallback host_resolution_callback;
9036 EXPECT_FALSE(
9037 request.WaitForHostResolution(host_resolution_callback.callback()));
9038 base::RunLoop().RunUntilIdle();
9039 EXPECT_FALSE(host_resolution_callback.have_result());
9040
9041 EXPECT_FALSE(callback_.have_result());
9042 socket_data.GetSequencedSocketData()->Resume();
9043 base::RunLoop().RunUntilIdle();
9044 EXPECT_TRUE(callback_.have_result());
9045 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback_.WaitForResult());
9046}
9047
9048// Verify ResultAfterHostResolutionCallback behavior when host resolution fails
9049// synchronously.
9050TEST_P(QuicStreamFactoryTest, ResultAfterHostResolutionCallbackFailSync) {
9051 Initialize();
9052 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9053 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9054
9055 // Host resolution will fail synchronously.
Renjiea0cb4a2c2018-09-26 23:37:309056 host_resolver_->rules()->AddSimulatedFailure(host_port_pair_.host());
9057 host_resolver_->set_synchronous_mode(true);
Yixin Wang7c5d11a82017-12-21 02:40:009058
9059 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:339060 EXPECT_EQ(ERR_NAME_NOT_RESOLVED,
Zhongyi Shia6b68d112018-09-24 07:49:039061 request.Request(
9062 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9063 SocketTag(),
9064 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9065 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7c5d11a82017-12-21 02:40:009066
9067 // WaitForHostResolution() should return false since host
9068 // resolution has failed already.
9069 TestCompletionCallback host_resolution_callback;
9070 EXPECT_FALSE(
9071 request.WaitForHostResolution(host_resolution_callback.callback()));
9072 base::RunLoop().RunUntilIdle();
9073 EXPECT_FALSE(host_resolution_callback.have_result());
9074}
9075
9076// Verify ResultAfterHostResolutionCallback behavior when host resolution fails
9077// asynchronously.
9078TEST_P(QuicStreamFactoryTest, ResultAfterHostResolutionCallbackFailAsync) {
9079 Initialize();
9080 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9081 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9082
Renjiea0cb4a2c2018-09-26 23:37:309083 host_resolver_->rules()->AddSimulatedFailure(host_port_pair_.host());
Yixin Wang7c5d11a82017-12-21 02:40:009084
9085 QuicStreamRequest request(factory_.get());
Paul Jensen8e3c5d32018-02-19 17:06:339086 EXPECT_EQ(ERR_IO_PENDING,
Zhongyi Shia6b68d112018-09-24 07:49:039087 request.Request(
9088 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9089 SocketTag(),
9090 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9091 failed_on_default_network_callback_, callback_.callback()));
Yixin Wang7c5d11a82017-12-21 02:40:009092
9093 TestCompletionCallback host_resolution_callback;
9094 EXPECT_TRUE(
9095 request.WaitForHostResolution(host_resolution_callback.callback()));
9096
9097 // Allow |host_resolver_| to fail host resolution. |host_resolution_callback|
9098 // Should run with ERR_NAME_NOT_RESOLVED since that's the error host
9099 // resolution failed with.
9100 base::RunLoop().RunUntilIdle();
9101 EXPECT_TRUE(host_resolution_callback.have_result());
9102 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, host_resolution_callback.WaitForResult());
9103
9104 EXPECT_TRUE(callback_.have_result());
9105 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult());
9106}
9107
Renjiea0cb4a2c2018-09-26 23:37:309108// With dns race experiment turned on, and DNS resolve succeeds synchronously,
9109// the final connection is established through the resolved DNS. No racing
9110// connection.
9111TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceAndHostResolutionSync) {
Zhongyi Shi967d2f12019-02-08 20:58:539112 test_params_.quic_race_stale_dns_on_connection = true;
Renjiea0cb4a2c2018-09-26 23:37:309113 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9114 Initialize();
9115 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9116 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9117
9118 // Set an address in resolver for synchronous return.
9119 host_resolver_->set_synchronous_mode(true);
9120 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
9121 kNonCachedIPAddress, "");
9122
9123 // Set up a different address in stale resolver cache.
9124 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
9125 HostCache::Entry entry(OK,
9126 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
9127 HostCache::Entry::SOURCE_DNS);
9128 base::TimeDelta zero;
9129 HostCache* cache = host_resolver_->GetHostCache();
9130 cache->Set(key, entry, base::TimeTicks::Now(), zero);
9131 // Expire the cache
9132 cache->OnNetworkChange();
Renjie8d2d8d91b2018-09-29 00:29:039133
Renjiea0cb4a2c2018-09-26 23:37:309134 MockQuicData quic_data;
9135 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9136 quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
9137 quic_data.AddSocketDataToFactory(socket_factory_.get());
9138
9139 QuicStreamRequest request(factory_.get());
9140 EXPECT_THAT(request.Request(
9141 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9142 SocketTag(),
9143 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9144 failed_on_default_network_callback_, callback_.callback()),
9145 IsOk());
9146 std::unique_ptr<HttpStream> stream = CreateStream(&request);
9147 EXPECT_TRUE(stream.get());
9148 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
9149 EXPECT_EQ(
9150 session->peer_address().impl().socket_address().ToStringWithoutPort(),
9151 kNonCachedIPAddress);
9152
9153 EXPECT_TRUE(quic_data.AllReadDataConsumed());
9154 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
9155}
9156
9157// With dns race experiment on, DNS resolve returns async, no matching cache in
9158// host resolver, connection should be successful and through resolved DNS. No
9159// racing connection.
9160TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceAndHostResolutionAsync) {
Renjiea0cb4a2c2018-09-26 23:37:309161 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9162 Initialize();
9163 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9164 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9165
9166 // Set an address in resolver for asynchronous return.
9167 host_resolver_->set_ondemand_mode(true);
9168 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
9169 kNonCachedIPAddress, "");
9170
9171 MockQuicData quic_data;
9172 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9173 quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
9174 quic_data.AddSocketDataToFactory(socket_factory_.get());
9175
9176 QuicStreamRequest request(factory_.get());
9177 EXPECT_EQ(ERR_IO_PENDING,
9178 request.Request(
9179 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9180 SocketTag(),
9181 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9182 failed_on_default_network_callback_, callback_.callback()));
9183 TestCompletionCallback host_resolution_callback;
9184 EXPECT_TRUE(
9185 request.WaitForHostResolution(host_resolution_callback.callback()));
9186 base::RunLoop().RunUntilIdle();
9187 EXPECT_FALSE(host_resolution_callback.have_result());
9188
9189 // Cause the host resolution to return.
9190 host_resolver_->ResolveAllPending();
9191 EXPECT_THAT(host_resolution_callback.WaitForResult(), IsOk());
9192 EXPECT_THAT(callback_.WaitForResult(), IsOk());
9193
9194 std::unique_ptr<HttpStream> stream = CreateStream(&request);
9195 EXPECT_TRUE(stream.get());
9196 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
9197
9198 EXPECT_EQ(
9199 session->peer_address().impl().socket_address().ToStringWithoutPort(),
9200 kNonCachedIPAddress);
9201
9202 EXPECT_TRUE(quic_data.AllReadDataConsumed());
9203 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
9204}
9205
9206// With dns race experiment on, DNS resolve returns async, stale dns used,
9207// connects synchrounously, and then the resolved DNS matches.
9208TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceHostResolveAsyncStaleMatch) {
Zhongyi Shi967d2f12019-02-08 20:58:539209 test_params_.quic_race_stale_dns_on_connection = true;
Renjiea0cb4a2c2018-09-26 23:37:309210 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9211 Initialize();
9212 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9213 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9214
9215 // Set an address in resolver for asynchronous return.
9216 host_resolver_->set_ondemand_mode(true);
9217 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
9218 kCachedIPAddress.ToString(), "");
9219
9220 // Set up the same address in the stale resolver cache.
9221 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
9222 HostCache::Entry entry(OK,
9223 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
9224 HostCache::Entry::SOURCE_DNS);
9225 base::TimeDelta zero;
9226 HostCache* cache = host_resolver_->GetHostCache();
9227 cache->Set(key, entry, base::TimeTicks::Now(), zero);
9228 // Expire the cache
9229 cache->OnNetworkChange();
9230
9231 MockQuicData quic_data;
9232 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9233 quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
9234 quic_data.AddSocketDataToFactory(socket_factory_.get());
9235
9236 QuicStreamRequest request(factory_.get());
9237 EXPECT_EQ(ERR_IO_PENDING,
9238 request.Request(
9239 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9240 SocketTag(),
9241 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9242 failed_on_default_network_callback_, callback_.callback()));
9243
9244 // Check that the racing job is running.
9245 EXPECT_TRUE(HasLiveSession(host_port_pair_));
9246 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
9247
9248 // Resolve dns and return.
9249 host_resolver_->ResolveAllPending();
9250 EXPECT_THAT(callback_.WaitForResult(), IsOk());
9251 std::unique_ptr<HttpStream> stream = CreateStream(&request);
9252 EXPECT_TRUE(stream.get());
9253
9254 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
9255
9256 EXPECT_EQ(
9257 session->peer_address().impl().socket_address().ToStringWithoutPort(),
9258 kCachedIPAddress.ToString());
9259
9260 EXPECT_TRUE(quic_data.AllReadDataConsumed());
9261 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
9262}
9263
9264// With dns race experiment on, dns resolve async, stale dns used, connect
9265// async, and then the result matches.
9266TEST_P(QuicStreamFactoryTest,
9267 ResultAfterDNSRaceHostResolveAsyncConnectAsyncStaleMatch) {
Zhongyi Shi967d2f12019-02-08 20:58:539268 test_params_.quic_race_stale_dns_on_connection = true;
Renjiea0cb4a2c2018-09-26 23:37:309269 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9270 Initialize();
9271 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9272 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9273
9274 // Set an address in resolver for asynchronous return.
9275 host_resolver_->set_ondemand_mode(true);
9276 factory_->set_require_confirmation(true);
9277 crypto_client_stream_factory_.set_handshake_mode(
9278 MockCryptoClientStream::ZERO_RTT);
9279 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
9280 kCachedIPAddress.ToString(), "");
9281
9282 // Set up the same address in the stale resolver cache.
9283 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
9284 HostCache::Entry entry(OK,
9285 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
9286 HostCache::Entry::SOURCE_DNS);
9287 base::TimeDelta zero;
9288 HostCache* cache = host_resolver_->GetHostCache();
9289 cache->Set(key, entry, base::TimeTicks::Now(), zero);
9290 // Expire the cache
9291 cache->OnNetworkChange();
9292
9293 MockQuicData quic_data;
9294 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9295 quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
9296 quic_data.AddSocketDataToFactory(socket_factory_.get());
9297
9298 QuicStreamRequest request(factory_.get());
9299 EXPECT_EQ(ERR_IO_PENDING,
9300 request.Request(
9301 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9302 SocketTag(),
9303 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9304 failed_on_default_network_callback_, callback_.callback()));
9305
9306 // Send Crypto handshake so connect will call back.
9307 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
9308 quic::QuicSession::HANDSHAKE_CONFIRMED);
9309 base::RunLoop().RunUntilIdle();
9310
9311 // Check that the racing job is running.
9312 EXPECT_TRUE(HasLiveSession(host_port_pair_));
9313 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
9314
9315 // Resolve dns and call back, make sure job finishes.
9316 host_resolver_->ResolveAllPending();
9317 EXPECT_THAT(callback_.WaitForResult(), IsOk());
9318
9319 std::unique_ptr<HttpStream> stream = CreateStream(&request);
9320 EXPECT_TRUE(stream.get());
9321
9322 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
9323
9324 EXPECT_EQ(
9325 session->peer_address().impl().socket_address().ToStringWithoutPort(),
9326 kCachedIPAddress.ToString());
9327
9328 EXPECT_TRUE(quic_data.AllReadDataConsumed());
9329 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
9330}
9331
9332// With dns race experiment on, dns resolve async, stale dns used, dns resolve
9333// return, then connection finishes and matches with the result.
9334TEST_P(QuicStreamFactoryTest,
9335 ResultAfterDNSRaceHostResolveAsyncStaleMatchConnectAsync) {
Zhongyi Shi967d2f12019-02-08 20:58:539336 test_params_.quic_race_stale_dns_on_connection = true;
Renjiea0cb4a2c2018-09-26 23:37:309337 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9338 Initialize();
9339 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9340 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9341
9342 // Set an address in resolver for asynchronous return.
9343 host_resolver_->set_ondemand_mode(true);
9344 factory_->set_require_confirmation(true);
9345 crypto_client_stream_factory_.set_handshake_mode(
9346 MockCryptoClientStream::ZERO_RTT);
9347 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
9348 kCachedIPAddress.ToString(), "");
9349
9350 // Set up the same address in the stale resolver cache.
9351 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
9352 HostCache::Entry entry(OK,
9353 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
9354 HostCache::Entry::SOURCE_DNS);
9355 base::TimeDelta zero;
9356 HostCache* cache = host_resolver_->GetHostCache();
9357 cache->Set(key, entry, base::TimeTicks::Now(), zero);
9358 // Expire the cache
9359 cache->OnNetworkChange();
9360
9361 MockQuicData quic_data;
9362 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9363 quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
9364 quic_data.AddSocketDataToFactory(socket_factory_.get());
9365
9366 QuicStreamRequest request(factory_.get());
9367 EXPECT_EQ(ERR_IO_PENDING,
9368 request.Request(
9369 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9370 SocketTag(),
9371 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9372 failed_on_default_network_callback_, callback_.callback()));
9373
9374 // Finish dns async, check we still need to wait for stale connection async.
9375 host_resolver_->ResolveAllPending();
9376 base::RunLoop().RunUntilIdle();
9377 EXPECT_FALSE(callback_.have_result());
9378
9379 // Finish stale connection async, and the stale connection should pass dns
9380 // validation.
9381 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
9382 quic::QuicSession::HANDSHAKE_CONFIRMED);
9383 EXPECT_THAT(callback_.WaitForResult(), IsOk());
9384 std::unique_ptr<HttpStream> stream = CreateStream(&request);
9385 EXPECT_TRUE(stream.get());
9386
9387 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
9388 EXPECT_EQ(
9389 session->peer_address().impl().socket_address().ToStringWithoutPort(),
9390 kCachedIPAddress.ToString());
9391
9392 EXPECT_TRUE(quic_data.AllReadDataConsumed());
9393 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
9394}
9395
9396// With dns race experiment on, dns resolve async, stale used and connects
9397// sync, but dns no match
9398TEST_P(QuicStreamFactoryTest,
9399 ResultAfterDNSRaceHostResolveAsyncStaleSyncNoMatch) {
Zhongyi Shi967d2f12019-02-08 20:58:539400 test_params_.quic_race_stale_dns_on_connection = true;
Renjiea0cb4a2c2018-09-26 23:37:309401 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9402 Initialize();
9403 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9404 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9405
9406 // Set an address in resolver for asynchronous return.
9407 host_resolver_->set_ondemand_mode(true);
9408 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
9409 kNonCachedIPAddress, "");
9410
9411 // Set up a different address in the stale resolver cache.
9412 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
9413 HostCache::Entry entry(OK,
9414 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
9415 HostCache::Entry::SOURCE_DNS);
9416 base::TimeDelta zero;
9417 HostCache* cache = host_resolver_->GetHostCache();
9418 cache->Set(key, entry, base::TimeTicks::Now(), zero);
9419 // Expire the cache
9420 cache->OnNetworkChange();
9421
9422 // Socket for the stale connection which will invoke connection closure.
9423 MockQuicData quic_data;
9424 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9425 quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
9426 quic_data.AddWrite(
Renjief5fcb172019-02-05 01:59:339427 SYNCHRONOUS,
9428 client_maker_.MakeConnectionClosePacket(
9429 2, true, quic::QUIC_STALE_CONNECTION_CANCELLED, "net error"));
Renjiea0cb4a2c2018-09-26 23:37:309430 quic_data.AddSocketDataToFactory(socket_factory_.get());
9431
9432 // Socket for the new connection.
9433 MockQuicData quic_data2;
9434 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9435 quic_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
9436 quic_data2.AddSocketDataToFactory(socket_factory_.get());
9437
9438 QuicStreamRequest request(factory_.get());
9439 EXPECT_EQ(ERR_IO_PENDING,
9440 request.Request(
9441 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9442 SocketTag(),
9443 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9444 failed_on_default_network_callback_, callback_.callback()));
9445
9446 // Check the stale connection is running.
9447 EXPECT_TRUE(HasLiveSession(host_port_pair_));
9448 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
9449
9450 // Finish dns resolution and check the job has finished.
9451 host_resolver_->ResolveAllPending();
9452 EXPECT_THAT(callback_.WaitForResult(), IsOk());
9453
9454 std::unique_ptr<HttpStream> stream = CreateStream(&request);
9455 EXPECT_TRUE(stream.get());
9456
9457 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
9458
9459 EXPECT_EQ(
9460 session->peer_address().impl().socket_address().ToStringWithoutPort(),
9461 kNonCachedIPAddress);
9462
9463 EXPECT_TRUE(quic_data.AllReadDataConsumed());
9464 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
9465 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
9466 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
9467}
9468
9469// With dns race experiment on, dns resolve async, stale used and connects
9470// async, finishes before dns, but no match
9471TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceStaleAsyncResolveAsyncNoMatch) {
Zhongyi Shi967d2f12019-02-08 20:58:539472 test_params_.quic_race_stale_dns_on_connection = true;
Renjiea0cb4a2c2018-09-26 23:37:309473 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9474 Initialize();
9475 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9476 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9477
9478 // Set an address in resolver for asynchronous return.
9479 host_resolver_->set_ondemand_mode(true);
9480 factory_->set_require_confirmation(true);
9481 crypto_client_stream_factory_.set_handshake_mode(
9482 MockCryptoClientStream::ZERO_RTT);
9483 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
9484 kNonCachedIPAddress, "");
9485
9486 // Set up a different address in the stale resolvercache.
9487 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
9488 HostCache::Entry entry(OK,
9489 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
9490 HostCache::Entry::SOURCE_DNS);
9491 base::TimeDelta zero;
9492 HostCache* cache = host_resolver_->GetHostCache();
9493 cache->Set(key, entry, base::TimeTicks::Now(), zero);
9494 // Expire the cache
9495 cache->OnNetworkChange();
9496
9497 MockQuicData quic_data;
9498 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9499 quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
9500 quic_data.AddWrite(
Renjief5fcb172019-02-05 01:59:339501 SYNCHRONOUS,
9502 client_maker_.MakeConnectionClosePacket(
9503 2, true, quic::QUIC_STALE_CONNECTION_CANCELLED, "net error"));
Renjiea0cb4a2c2018-09-26 23:37:309504 quic_data.AddSocketDataToFactory(socket_factory_.get());
9505
9506 MockQuicData quic_data2;
9507 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9508 quic_data2.AddSocketDataToFactory(socket_factory_.get());
9509
9510 QuicStreamRequest request(factory_.get());
9511 EXPECT_EQ(ERR_IO_PENDING,
9512 request.Request(
9513 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9514 SocketTag(),
9515 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9516 failed_on_default_network_callback_, callback_.callback()));
9517
9518 // Finish the stale connection.
9519 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
9520 quic::QuicSession::HANDSHAKE_CONFIRMED);
9521 base::RunLoop().RunUntilIdle();
9522 EXPECT_TRUE(HasLiveSession(host_port_pair_));
9523 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
9524
9525 // Finish host resolution and check the job is done.
9526 host_resolver_->ResolveAllPending();
9527 EXPECT_THAT(callback_.WaitForResult(), IsOk());
9528
9529 std::unique_ptr<HttpStream> stream = CreateStream(&request);
9530 EXPECT_TRUE(stream.get());
9531
9532 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
9533 EXPECT_EQ(
9534 session->peer_address().impl().socket_address().ToStringWithoutPort(),
9535 kNonCachedIPAddress);
9536
9537 EXPECT_TRUE(quic_data.AllReadDataConsumed());
9538 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
9539 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
9540 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
9541}
9542
9543// With dns race experiment on, dns resolve async, stale used and connects
9544// async, dns finishes first, but no match
9545TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceResolveAsyncStaleAsyncNoMatch) {
Zhongyi Shi967d2f12019-02-08 20:58:539546 test_params_.quic_race_stale_dns_on_connection = true;
Renjiea0cb4a2c2018-09-26 23:37:309547 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9548 Initialize();
9549 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9550 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9551
9552 // Set an address in resolver for asynchronous return.
9553 host_resolver_->set_ondemand_mode(true);
9554 factory_->set_require_confirmation(true);
9555 crypto_client_stream_factory_.set_handshake_mode(
9556 MockCryptoClientStream::ZERO_RTT);
9557 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
9558 kNonCachedIPAddress, "");
9559
9560 // Set up a different address in the stale resolver cache.
9561 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
9562 HostCache::Entry entry(OK,
9563 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
9564 HostCache::Entry::SOURCE_DNS);
9565 base::TimeDelta zero;
9566 HostCache* cache = host_resolver_->GetHostCache();
9567 cache->Set(key, entry, base::TimeTicks::Now(), zero);
9568 // Expire the cache
9569 cache->OnNetworkChange();
9570
9571 MockQuicData quic_data;
9572 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Renjie8d2d8d91b2018-09-29 00:29:039573 client_maker_.SetEncryptionLevel(quic::ENCRYPTION_INITIAL);
Renjiea0cb4a2c2018-09-26 23:37:309574 quic_data.AddWrite(
Renjief5fcb172019-02-05 01:59:339575 SYNCHRONOUS,
9576 client_maker_.MakeConnectionClosePacket(
9577 1, true, quic::QUIC_STALE_CONNECTION_CANCELLED, "net error"));
Renjiea0cb4a2c2018-09-26 23:37:309578 quic_data.AddSocketDataToFactory(socket_factory_.get());
9579
9580 MockQuicData quic_data2;
9581 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Renjie8d2d8d91b2018-09-29 00:29:039582 client_maker_.SetEncryptionLevel(quic::ENCRYPTION_FORWARD_SECURE);
9583 quic_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Renjiea0cb4a2c2018-09-26 23:37:309584 quic_data2.AddSocketDataToFactory(socket_factory_.get());
9585
9586 QuicStreamRequest request(factory_.get());
9587 EXPECT_EQ(ERR_IO_PENDING,
9588 request.Request(
9589 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9590 SocketTag(),
9591 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9592 failed_on_default_network_callback_, callback_.callback()));
9593 // Finish dns resolution, but need to wait for stale connection.
9594 host_resolver_->ResolveAllPending();
Renjie8d2d8d91b2018-09-29 00:29:039595 base::RunLoop().RunUntilIdle();
Renjiea0cb4a2c2018-09-26 23:37:309596 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
9597 quic::QuicSession::HANDSHAKE_CONFIRMED);
9598 EXPECT_THAT(callback_.WaitForResult(), IsOk());
9599
9600 std::unique_ptr<HttpStream> stream = CreateStream(&request);
9601 EXPECT_TRUE(stream.get());
9602
9603 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
9604 EXPECT_EQ(
9605 session->peer_address().impl().socket_address().ToStringWithoutPort(),
9606 kNonCachedIPAddress);
9607
9608 EXPECT_TRUE(quic_data.AllReadDataConsumed());
9609 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
9610 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
9611 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
9612}
9613
9614// With dns race experiment on, dns resolve returns error sync, same behavior
9615// as experiment is not on
9616TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceHostResolveError) {
Zhongyi Shi967d2f12019-02-08 20:58:539617 test_params_.quic_race_stale_dns_on_connection = true;
Renjiea0cb4a2c2018-09-26 23:37:309618 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9619 Initialize();
9620 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9621 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9622
9623 // Set synchronous failure in resolver.
9624 host_resolver_->set_synchronous_mode(true);
9625 host_resolver_->rules()->AddSimulatedFailure(host_port_pair_.host());
9626
9627 MockQuicData quic_data;
9628 quic_data.AddSocketDataToFactory(socket_factory_.get());
9629 QuicStreamRequest request(factory_.get());
9630
9631 EXPECT_EQ(ERR_NAME_NOT_RESOLVED,
9632 request.Request(
9633 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9634 SocketTag(),
9635 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9636 failed_on_default_network_callback_, callback_.callback()));
9637}
9638
9639// With dns race experiment on, no cache available, dns resolve returns error
9640// async
9641TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceHostResolveAsyncError) {
Zhongyi Shi967d2f12019-02-08 20:58:539642 test_params_.quic_race_stale_dns_on_connection = true;
Renjiea0cb4a2c2018-09-26 23:37:309643 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9644 Initialize();
9645 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9646 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9647
9648 // Set asynchronous failure in resolver.
9649 host_resolver_->set_ondemand_mode(true);
9650 host_resolver_->rules()->AddSimulatedFailure(host_port_pair_.host());
9651
9652 MockQuicData quic_data;
9653 quic_data.AddSocketDataToFactory(socket_factory_.get());
9654 QuicStreamRequest request(factory_.get());
9655
9656 EXPECT_EQ(ERR_IO_PENDING,
9657 request.Request(
9658 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9659 SocketTag(),
9660 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9661 failed_on_default_network_callback_, callback_.callback()));
9662
9663 // Resolve and expect result that shows the resolution error.
9664 host_resolver_->ResolveAllPending();
9665 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_NAME_NOT_RESOLVED));
9666}
9667
9668// With dns race experiment on, dns resolve async, staled used and connects
9669// sync, dns returns error and no connection is established.
9670TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceStaleSyncHostResolveError) {
Zhongyi Shi967d2f12019-02-08 20:58:539671 test_params_.quic_race_stale_dns_on_connection = true;
Renjiea0cb4a2c2018-09-26 23:37:309672 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9673 Initialize();
9674 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9675 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9676
9677 // Set asynchronous failure in resolver.
9678 host_resolver_->set_ondemand_mode(true);
9679 host_resolver_->rules()->AddSimulatedFailure(host_port_pair_.host());
9680
9681 // Set up an address in the stale cache.
9682 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
9683 HostCache::Entry entry(OK,
9684 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
9685 HostCache::Entry::SOURCE_DNS);
9686 base::TimeDelta zero;
9687 HostCache* cache = host_resolver_->GetHostCache();
9688 cache->Set(key, entry, base::TimeTicks::Now(), zero);
9689 // Expire the cache
9690 cache->OnNetworkChange();
9691
9692 // Socket for the stale connection which is supposed to disconnect.
9693 MockQuicData quic_data;
9694 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9695 quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
9696 quic_data.AddWrite(
Renjief5fcb172019-02-05 01:59:339697 SYNCHRONOUS,
9698 client_maker_.MakeConnectionClosePacket(
9699 2, true, quic::QUIC_STALE_CONNECTION_CANCELLED, "net error"));
Renjiea0cb4a2c2018-09-26 23:37:309700 quic_data.AddSocketDataToFactory(socket_factory_.get());
9701
9702 QuicStreamRequest request(factory_.get());
9703 EXPECT_EQ(ERR_IO_PENDING,
9704 request.Request(
9705 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9706 SocketTag(),
9707 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9708 failed_on_default_network_callback_, callback_.callback()));
9709
9710 // Check that the stale connection is running.
9711 EXPECT_TRUE(HasLiveSession(host_port_pair_));
9712 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
9713
9714 // Finish host resolution.
9715 host_resolver_->ResolveAllPending();
9716 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_NAME_NOT_RESOLVED));
9717
Renjiea0cb4a2c2018-09-26 23:37:309718 EXPECT_TRUE(quic_data.AllReadDataConsumed());
9719 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
9720}
9721
9722// With dns race experiment on, dns resolve async, stale used and connection
9723// return error, then dns matches
9724TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceStaleErrorDNSMatches) {
Zhongyi Shi967d2f12019-02-08 20:58:539725 test_params_.quic_race_stale_dns_on_connection = true;
Renjiea0cb4a2c2018-09-26 23:37:309726 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9727 Initialize();
9728 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9729 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9730
9731 // Set an address in host resolver for asynchronous return.
9732 host_resolver_->set_ondemand_mode(true);
9733 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
9734 kCachedIPAddress.ToString(), "");
9735
9736 // Set up the same address in the stale resolver cache.
9737 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
9738 HostCache::Entry entry(OK,
9739 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
9740 HostCache::Entry::SOURCE_DNS);
9741 base::TimeDelta zero;
9742 HostCache* cache = host_resolver_->GetHostCache();
9743 cache->Set(key, entry, base::TimeTicks::Now(), zero);
9744 // Expire the cache
9745 cache->OnNetworkChange();
9746
9747 // Simulate synchronous connect failure.
9748 MockQuicData quic_data;
9749 quic_data.AddConnect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
9750 quic_data.AddSocketDataToFactory(socket_factory_.get());
9751
9752 MockQuicData quic_data2;
9753 quic_data2.AddConnect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
9754 quic_data2.AddSocketDataToFactory(socket_factory_.get());
9755
9756 QuicStreamRequest request(factory_.get());
9757 EXPECT_EQ(ERR_IO_PENDING,
9758 request.Request(
9759 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9760 SocketTag(),
9761 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9762 failed_on_default_network_callback_, callback_.callback()));
9763 EXPECT_FALSE(HasLiveSession(host_port_pair_));
9764 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
9765
9766 host_resolver_->ResolveAllPending();
9767 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_ADDRESS_IN_USE));
9768}
9769
9770// With dns race experiment on, dns resolve async, stale used and connection
9771// returns error, dns no match, new connection is established
9772TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceStaleErrorDNSNoMatch) {
Zhongyi Shi967d2f12019-02-08 20:58:539773 test_params_.quic_race_stale_dns_on_connection = true;
Renjiea0cb4a2c2018-09-26 23:37:309774 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9775 Initialize();
9776 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9777 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9778
9779 // Set an address in host resolver.
9780 host_resolver_->set_ondemand_mode(true);
9781 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
9782 kNonCachedIPAddress, "");
9783
9784 // Set up a different address in stale resolver cache.
9785 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
9786 HostCache::Entry entry(OK,
9787 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
9788 HostCache::Entry::SOURCE_DNS);
9789 base::TimeDelta zero;
9790 HostCache* cache = host_resolver_->GetHostCache();
9791 cache->Set(key, entry, base::TimeTicks::Now(), zero);
9792 // Expire the cache
9793 cache->OnNetworkChange();
9794
9795 // Add failure for the stale connection.
9796 MockQuicData quic_data;
9797 quic_data.AddConnect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
9798 quic_data.AddSocketDataToFactory(socket_factory_.get());
9799
9800 MockQuicData quic_data2;
9801 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9802 quic_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
9803 quic_data2.AddSocketDataToFactory(socket_factory_.get());
9804
9805 QuicStreamRequest request(factory_.get());
9806 EXPECT_EQ(ERR_IO_PENDING,
9807 request.Request(
9808 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9809 SocketTag(),
9810 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9811 failed_on_default_network_callback_, callback_.callback()));
9812
9813 // Check that the stale connection fails.
9814 EXPECT_FALSE(HasLiveSession(host_port_pair_));
9815 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
9816
9817 // Finish host resolution and check the job finishes ok.
9818 host_resolver_->ResolveAllPending();
9819 EXPECT_THAT(callback_.WaitForResult(), IsOk());
9820
9821 std::unique_ptr<HttpStream> stream = CreateStream(&request);
9822 EXPECT_TRUE(stream.get());
9823
9824 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
9825
9826 EXPECT_EQ(
9827 session->peer_address().impl().socket_address().ToStringWithoutPort(),
9828 kNonCachedIPAddress);
9829
9830 EXPECT_TRUE(quic_data2.AllReadDataConsumed());
9831 EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
9832}
9833
9834// With dns race experiment on, dns resolve async, stale used and connection
9835// returns error, dns no match, new connection error
9836TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceStaleErrorDNSNoMatchError) {
Zhongyi Shi967d2f12019-02-08 20:58:539837 test_params_.quic_race_stale_dns_on_connection = true;
Renjiea0cb4a2c2018-09-26 23:37:309838 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9839 Initialize();
9840 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9841 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9842
9843 // Set an address in host resolver asynchronously.
9844 host_resolver_->set_ondemand_mode(true);
9845 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
9846 kNonCachedIPAddress, "");
9847
9848 // Set up a different address in the stale cache.
9849 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
9850 HostCache::Entry entry(OK,
9851 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
9852 HostCache::Entry::SOURCE_DNS);
9853 base::TimeDelta zero;
9854 HostCache* cache = host_resolver_->GetHostCache();
9855 cache->Set(key, entry, base::TimeTicks::Now(), zero);
9856 // Expire the cache
9857 cache->OnNetworkChange();
9858
9859 // Add failure for stale connection.
9860 MockQuicData quic_data;
9861 quic_data.AddConnect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
9862 quic_data.AddSocketDataToFactory(socket_factory_.get());
9863
9864 // Add failure for resolved dns connection.
9865 MockQuicData quic_data2;
9866 quic_data2.AddConnect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
9867 quic_data2.AddSocketDataToFactory(socket_factory_.get());
9868
9869 QuicStreamRequest request(factory_.get());
9870 EXPECT_EQ(ERR_IO_PENDING,
9871 request.Request(
9872 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9873 SocketTag(),
9874 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9875 failed_on_default_network_callback_, callback_.callback()));
9876
9877 // Check the stale connection fails.
9878 EXPECT_FALSE(HasLiveSession(host_port_pair_));
9879 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
9880
9881 // Check the resolved dns connection fails.
9882 host_resolver_->ResolveAllPending();
9883 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_ADDRESS_IN_USE));
9884}
9885
9886// With dns race experiment on, dns resolve async and stale connect async, dns
9887// resolve returns error and then preconnect finishes
9888TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceResolveAsyncErrorStaleAsync) {
Zhongyi Shi967d2f12019-02-08 20:58:539889 test_params_.quic_race_stale_dns_on_connection = true;
Renjiea0cb4a2c2018-09-26 23:37:309890 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9891 Initialize();
9892 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9893 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9894
9895 // Add asynchronous failure in host resolver.
9896 host_resolver_->set_ondemand_mode(true);
9897 host_resolver_->rules()->AddSimulatedFailure(host_port_pair_.host());
9898 factory_->set_require_confirmation(true);
9899 crypto_client_stream_factory_.set_handshake_mode(
9900 MockCryptoClientStream::ZERO_RTT);
9901
9902 // Set up an address in stale resolver cache.
9903 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
9904 HostCache::Entry entry(OK,
9905 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
9906 HostCache::Entry::SOURCE_DNS);
9907 base::TimeDelta zero;
9908 HostCache* cache = host_resolver_->GetHostCache();
9909 cache->Set(key, entry, base::TimeTicks::Now(), zero);
9910 // Expire the cache
9911 cache->OnNetworkChange();
9912
9913 // Socket data for stale connection which is supposed to disconnect.
9914 MockQuicData quic_data;
9915 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9916 client_maker_.SetEncryptionLevel(quic::ENCRYPTION_INITIAL);
9917 quic_data.AddWrite(
Renjief5fcb172019-02-05 01:59:339918 SYNCHRONOUS,
9919 client_maker_.MakeConnectionClosePacket(
9920 1, true, quic::QUIC_STALE_CONNECTION_CANCELLED, "net error"));
Renjiea0cb4a2c2018-09-26 23:37:309921 quic_data.AddSocketDataToFactory(socket_factory_.get());
9922
9923 QuicStreamRequest request(factory_.get());
9924 EXPECT_EQ(ERR_IO_PENDING,
9925 request.Request(
9926 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9927 SocketTag(),
9928 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9929 failed_on_default_network_callback_, callback_.callback()));
9930
9931 // host resolution returned but stale connection hasn't finished yet.
9932 host_resolver_->ResolveAllPending();
9933 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_NAME_NOT_RESOLVED));
9934
9935 EXPECT_TRUE(quic_data.AllReadDataConsumed());
9936 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
9937}
9938
9939// With dns race experiment on, dns resolve async and stale connect async, dns
Renjiea0cb4a2c2018-09-26 23:37:309940// resolve returns error and then preconnect fails.
9941TEST_P(QuicStreamFactoryTest,
9942 ResultAfterDNSRaceResolveAsyncErrorStaleAsyncError) {
Zhongyi Shi967d2f12019-02-08 20:58:539943 test_params_.quic_race_stale_dns_on_connection = true;
Renjiea0cb4a2c2018-09-26 23:37:309944 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9945 Initialize();
9946 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
9947 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
9948
9949 // Add asynchronous failure to host resolver.
9950 host_resolver_->set_ondemand_mode(true);
9951 factory_->set_require_confirmation(true);
9952 crypto_client_stream_factory_.set_handshake_mode(
9953 MockCryptoClientStream::ZERO_RTT);
9954 host_resolver_->rules()->AddSimulatedFailure(host_port_pair_.host());
9955
9956 // Set up an address in stale resolver cache.
9957 HostCache::Key key(host_port_pair_.host(), ADDRESS_FAMILY_UNSPECIFIED, 0);
9958 HostCache::Entry entry(OK,
9959 AddressList::CreateFromIPAddress(kCachedIPAddress, 0),
9960 HostCache::Entry::SOURCE_DNS);
9961 base::TimeDelta zero;
9962 HostCache* cache = host_resolver_->GetHostCache();
9963 cache->Set(key, entry, base::TimeTicks::Now(), zero);
9964 // Expire the cache
9965 cache->OnNetworkChange();
9966
9967 MockQuicData quic_data;
9968 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
9969 client_maker_.SetEncryptionLevel(quic::ENCRYPTION_INITIAL);
9970 quic_data.AddWrite(
Renjief5fcb172019-02-05 01:59:339971 SYNCHRONOUS,
9972 client_maker_.MakeConnectionClosePacket(
9973 1, true, quic::QUIC_STALE_CONNECTION_CANCELLED, "net error"));
Renjiea0cb4a2c2018-09-26 23:37:309974 quic_data.AddSocketDataToFactory(socket_factory_.get());
9975
9976 QuicStreamRequest request(factory_.get());
9977 EXPECT_EQ(ERR_IO_PENDING,
9978 request.Request(
9979 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
9980 SocketTag(),
9981 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
9982 failed_on_default_network_callback_, callback_.callback()));
9983
9984 // Host Resolution returns failure but stale connection hasn't finished.
9985 host_resolver_->ResolveAllPending();
9986
9987 // Check that the final error is on resolution failure.
9988 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_NAME_NOT_RESOLVED));
9989
9990 EXPECT_TRUE(quic_data.AllReadDataConsumed());
9991}
9992
9993// With dns race experiment on, test that host resolution callback behaves
9994// normal as experiment is not on
9995TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceHostResolveAsync) {
Zhongyi Shi967d2f12019-02-08 20:58:539996 test_params_.quic_race_stale_dns_on_connection = true;
Renjiea0cb4a2c2018-09-26 23:37:309997 host_resolver_ = std::make_unique<MockCachingHostResolver>();
9998 Initialize();
9999 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
10000 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
10001
10002 host_resolver_->set_ondemand_mode(true);
10003 host_resolver_->rules()->AddIPLiteralRule(host_port_pair_.host(),
10004 kNonCachedIPAddress, "");
10005
10006 MockQuicData quic_data;
10007 quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
10008 quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
10009 quic_data.AddSocketDataToFactory(socket_factory_.get());
10010
10011 QuicStreamRequest request(factory_.get());
10012 EXPECT_EQ(ERR_IO_PENDING,
10013 request.Request(
10014 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
10015 SocketTag(),
10016 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
10017 failed_on_default_network_callback_, callback_.callback()));
10018
10019 // Check that expect_on_host_resolution_ is properlly set.
10020 TestCompletionCallback host_resolution_callback;
10021 EXPECT_TRUE(
10022 request.WaitForHostResolution(host_resolution_callback.callback()));
10023 base::RunLoop().RunUntilIdle();
10024 EXPECT_FALSE(host_resolution_callback.have_result());
10025
10026 host_resolver_->ResolveAllPending();
10027 EXPECT_THAT(host_resolution_callback.WaitForResult(), IsOk());
10028
10029 // Check that expect_on_host_resolution_ is flipped back.
10030 EXPECT_FALSE(
10031 request.WaitForHostResolution(host_resolution_callback.callback()));
10032
10033 EXPECT_TRUE(quic_data.AllReadDataConsumed());
10034 EXPECT_TRUE(quic_data.AllWriteDataConsumed());
10035}
10036
Paul Jensen8e3c5d32018-02-19 17:06:3310037// Test that QuicStreamRequests with similar and different tags results in
10038// reused and unique QUIC streams using appropriately tagged sockets.
10039TEST_P(QuicStreamFactoryTest, Tag) {
10040 MockTaggingClientSocketFactory* socket_factory =
10041 new MockTaggingClientSocketFactory();
10042 socket_factory_.reset(socket_factory);
10043 Initialize();
10044 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
10045 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
10046
10047 // Prepare to establish two QUIC sessions.
10048 MockQuicData socket_data;
10049 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:4310050 socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Paul Jensen8e3c5d32018-02-19 17:06:3310051 socket_data.AddSocketDataToFactory(socket_factory_.get());
10052 MockQuicData socket_data2;
10053 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
Zhongyi Shi32f2fd02018-04-16 18:23:4310054 socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
Paul Jensen8e3c5d32018-02-19 17:06:3310055 socket_data2.AddSocketDataToFactory(socket_factory_.get());
10056
10057#if defined(OS_ANDROID)
10058 SocketTag tag1(SocketTag::UNSET_UID, 0x12345678);
10059 SocketTag tag2(getuid(), 0x87654321);
10060#else
10061 // On non-Android platforms we can only use the default constructor.
10062 SocketTag tag1, tag2;
10063#endif
10064
10065 // Request a stream with |tag1|.
10066 QuicStreamRequest request1(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:0310067 int rv = request1.Request(
10068 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY, tag1,
10069 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
10070 failed_on_default_network_callback_, callback_.callback());
Paul Jensen8e3c5d32018-02-19 17:06:3310071 EXPECT_THAT(callback_.GetResult(rv), IsOk());
10072 EXPECT_EQ(socket_factory->GetLastProducedUDPSocket()->tag(), tag1);
10073 EXPECT_TRUE(socket_factory->GetLastProducedUDPSocket()
10074 ->tagged_before_data_transferred());
10075 std::unique_ptr<QuicChromiumClientSession::Handle> stream1 =
10076 request1.ReleaseSessionHandle();
10077 EXPECT_TRUE(stream1);
10078 EXPECT_TRUE(stream1->IsConnected());
10079
10080 // Request a stream with |tag1| and verify underlying session is reused.
10081 QuicStreamRequest request2(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:0310082 rv = request2.Request(
10083 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY, tag1,
10084 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
10085 failed_on_default_network_callback_, callback_.callback());
Paul Jensen8e3c5d32018-02-19 17:06:3310086 EXPECT_THAT(callback_.GetResult(rv), IsOk());
10087 std::unique_ptr<QuicChromiumClientSession::Handle> stream2 =
10088 request2.ReleaseSessionHandle();
10089 EXPECT_TRUE(stream2);
10090 EXPECT_TRUE(stream2->IsConnected());
10091 EXPECT_TRUE(stream2->SharesSameSession(*stream1));
10092
10093 // Request a stream with |tag2| and verify a new session is created.
10094 QuicStreamRequest request3(factory_.get());
Zhongyi Shia6b68d112018-09-24 07:49:0310095 rv = request3.Request(
10096 host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY, tag2,
10097 /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
10098 failed_on_default_network_callback_, callback_.callback());
Paul Jensen8e3c5d32018-02-19 17:06:3310099 EXPECT_THAT(callback_.GetResult(rv), IsOk());
10100 EXPECT_EQ(socket_factory->GetLastProducedUDPSocket()->tag(), tag2);
10101 EXPECT_TRUE(socket_factory->GetLastProducedUDPSocket()
10102 ->tagged_before_data_transferred());
10103 std::unique_ptr<QuicChromiumClientSession::Handle> stream3 =
10104 request3.ReleaseSessionHandle();
10105 EXPECT_TRUE(stream3);
10106 EXPECT_TRUE(stream3->IsConnected());
10107#if defined(OS_ANDROID)
10108 EXPECT_FALSE(stream3->SharesSameSession(*stream1));
10109#else
10110 // Same tag should reuse session.
10111 EXPECT_TRUE(stream3->SharesSameSession(*stream1));
10112#endif
10113}
10114
[email protected]e13201d82012-12-12 05:00:3210115} // namespace test
[email protected]e13201d82012-12-12 05:00:3210116} // namespace net