blob: 9d18d6cdbef02a256154e662d2d5460c691be7fe [file] [log] [blame]
[email protected]a33347c2012-01-09 18:27:011// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]212d1492008-09-05 19:38:542// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Eric Orth960e7062019-03-08 18:43:545#include "net/dns/host_resolver_manager.h"
[email protected]212d1492008-09-05 19:38:546
Eric Orth828bd3ae2018-12-12 17:30:367#include <algorithm>
Eric Roman21b39232019-06-28 21:28:218#include <limits>
[email protected]471822ca2009-01-29 11:32:269#include <string>
jsbellcea42a52015-11-30 23:50:2510#include <tuple>
Eric Orth70992982018-07-24 00:25:0011#include <utility>
olli.raula9cdf9d72015-12-10 14:24:2912#include <vector>
[email protected]471822ca2009-01-29 11:32:2613
Weza03bae02018-07-13 17:17:3314#include "base/auto_reset.h"
[email protected]aa22b242011-11-16 18:58:2915#include "base/bind.h"
danakjdb9ae7942020-11-11 16:01:3516#include "base/callback_helpers.h"
skyostil4891b25b2015-06-11 11:43:4517#include "base/location.h"
Avi Drissman13fc8932015-12-20 04:40:4618#include "base/macros.h"
[email protected]3b63f8f42011-03-28 01:54:1519#include "base/memory/ref_counted.h"
David Van Cleve1fb5e8c2019-11-04 16:45:1620#include "base/numerics/safe_conversions.h"
Eric Orth394db1732019-08-27 20:09:3921#include "base/rand_util.h"
[email protected]daae1322013-09-05 18:26:5022#include "base/run_loop.h"
Eric Orthfe6d5482019-09-03 18:27:5723#include "base/sequenced_task_runner.h"
skyostil4891b25b2015-06-11 11:43:4524#include "base/single_thread_task_runner.h"
Eric Orth5d21f152020-10-21 19:15:4325#include "base/strings/string_number_conversions.h"
[email protected]be528af2013-06-11 07:39:4826#include "base/strings/string_util.h"
27#include "base/strings/stringprintf.h"
[email protected]189163e2011-05-11 01:48:5428#include "base/synchronization/condition_variable.h"
29#include "base/synchronization/lock.h"
Eric Orthfe6d5482019-09-03 18:27:5730#include "base/task/post_task.h"
Gabriel Charetteeadf58862019-08-29 05:20:2731#include "base/task/thread_pool/thread_pool_instance.h"
Guido Urdanetaef4e91942020-11-09 15:06:2432#include "base/test/bind.h"
David Van Cleveb1f45bd2019-11-14 07:36:4933#include "base/test/metrics/histogram_tester.h"
Matt Menkef4023312019-11-01 18:24:5534#include "base/test/scoped_feature_list.h"
Eric Orth026776a2019-01-18 00:13:2835#include "base/test/simple_test_clock.h"
Eric Orth9a037562018-07-03 21:24:3836#include "base/test/test_mock_time_task_runner.h"
[email protected]57a48d32012-03-03 00:04:5537#include "base/test/test_timeouts.h"
Francois Doraya2d01ba2017-09-25 19:17:4038#include "base/threading/thread_restrictions.h"
gabf767595f2016-05-11 18:50:3539#include "base/threading/thread_task_runner_handle.h"
[email protected]66e96c42013-06-28 15:20:3140#include "base/time/time.h"
Eric Orth026776a2019-01-18 00:13:2841#include "base/timer/mock_timer.h"
Miriam Gershenson48857a352018-03-22 21:14:0342#include "base/values.h"
jdoerriedfede5ad2019-02-11 13:06:5743#include "build/build_config.h"
Eric Orth2bc48c72021-02-22 21:37:1144#include "net/base/address_family.h"
[email protected]ecfa71c2008-09-09 13:28:3645#include "net/base/address_list.h"
Matt Menkef4023312019-11-01 18:24:5546#include "net/base/features.h"
Eric Orth026776a2019-01-18 00:13:2847#include "net/base/host_port_pair.h"
martijna23c8962016-03-04 18:18:5148#include "net/base/ip_address.h"
Eric Orth026776a2019-01-18 00:13:2849#include "net/base/ip_endpoint.h"
mgershaf9a9232017-04-13 20:19:0350#include "net/base/mock_network_change_notifier.h"
[email protected]471822ca2009-01-29 11:32:2651#include "net/base/net_errors.h"
Matt Menkef4023312019-11-01 18:24:5552#include "net/base/network_isolation_key.h"
Matt Menke4807a9a2020-11-21 00:14:4153#include "net/base/schemeful_site.h"
[email protected]78eac2a2012-03-14 19:09:2754#include "net/dns/dns_client.h"
Eric Orthc1eb1292018-10-09 22:07:0755#include "net/dns/dns_config.h"
[email protected]78eac2a2012-03-14 19:09:2756#include "net/dns/dns_test_util.h"
Eric Orth192e3bb2018-11-14 19:30:3257#include "net/dns/dns_util.h"
[email protected]f2cb3cf2013-03-21 01:40:5358#include "net/dns/mock_host_resolver.h"
Eric Orth9871aafa2018-10-02 19:59:1859#include "net/dns/mock_mdns_client.h"
60#include "net/dns/mock_mdns_socket_factory.h"
Eric Orth09746312021-05-05 15:44:5861#include "net/dns/public/dns_config_overrides.h"
Eric Orthc63cf502020-04-03 21:21:2762#include "net/dns/public/dns_over_https_server_config.h"
Eric Orth09746312021-05-05 15:44:5863#include "net/dns/public/dns_query_type.h"
Matt Menke991dd7e2021-07-22 17:31:5164#include "net/dns/public/mdns_listener_update_type.h"
Katharine Daly886eef72019-11-22 02:56:0365#include "net/dns/public/resolve_error_info.h"
Ben Schwartz432ce032021-05-05 21:49:2466#include "net/dns/public/secure_dns_mode.h"
67#include "net/dns/public/secure_dns_policy.h"
Eric Orth069a3c6e2020-01-31 23:14:2468#include "net/dns/resolve_context.h"
Eric Orthfe6d5482019-09-03 18:27:5769#include "net/dns/test_dns_config_service.h"
mikecirone8b85c432016-09-08 19:11:0070#include "net/log/net_log_event_type.h"
71#include "net/log/net_log_source_type.h"
mikecironef22f9812016-10-04 03:40:1972#include "net/log/net_log_with_source.h"
sergeyub8cdc212015-05-14 18:50:3773#include "net/log/test_net_log.h"
Eric Roman79cc7552019-07-19 02:17:5474#include "net/log/test_net_log_util.h"
Eric Orth394db1732019-08-27 20:09:3975#include "net/socket/socket_test_util.h"
robpercival214763f2016-07-01 23:27:0176#include "net/test/gtest_util.h"
Gabriel Charettec7108742019-08-23 03:31:4077#include "net/test/test_with_task_environment.h"
Eric Orth6f1c5172019-04-16 17:08:2778#include "net/url_request/url_request_context.h"
79#include "net/url_request/url_request_test_util.h"
robpercival214763f2016-07-01 23:27:0180#include "testing/gmock/include/gmock/gmock.h"
[email protected]ecfa71c2008-09-09 13:28:3681#include "testing/gtest/include/gtest/gtest.h"
Matt Menkef4023312019-11-01 18:24:5582#include "url/gurl.h"
Eric Orthc4cca5d2021-07-02 19:59:0183#include "url/scheme_host_port.h"
84#include "url/url_constants.h"
[email protected]212d1492008-09-05 19:38:5485
Eric Orth026776a2019-01-18 00:13:2886#if BUILDFLAG(ENABLE_MDNS)
87#include "net/dns/mdns_client_impl.h"
88#endif // BUILDFLAG(ENABLE_MDNS)
89
robpercival214763f2016-07-01 23:27:0190using net::test::IsError;
91using net::test::IsOk;
Eric Orth9871aafa2018-10-02 19:59:1892using ::testing::_;
David Van Clevec719c882019-11-04 15:47:4093using ::testing::AllOf;
Eric Orth9871aafa2018-10-02 19:59:1894using ::testing::Between;
95using ::testing::ByMove;
David Van Clevec719c882019-11-04 15:47:4096using ::testing::Eq;
Daniel McArdle2daa3ec2020-06-03 16:05:4897using ::testing::IsEmpty;
David Van Clevec719c882019-11-04 15:47:4098using ::testing::Optional;
99using ::testing::Pair;
100using ::testing::Property;
Eric Orth9871aafa2018-10-02 19:59:18101using ::testing::Return;
David Van Clevec719c882019-11-04 15:47:40102using ::testing::UnorderedElementsAre;
robpercival214763f2016-07-01 23:27:01103
[email protected]259aefa2009-08-20 22:45:00104namespace net {
[email protected]68ad3ee2010-01-30 03:45:39105
[email protected]38b50d92012-04-19 21:07:52106namespace {
[email protected]112bd462009-12-10 07:23:40107
[email protected]78eac2a2012-03-14 19:09:27108const size_t kMaxJobs = 10u;
109const size_t kMaxRetryAttempts = 4u;
[email protected]68ad3ee2010-01-30 03:45:39110
Eric Orth59066222019-03-07 23:52:27111ProcTaskParams DefaultParams(HostResolverProc* resolver_proc) {
112 return ProcTaskParams(resolver_proc, kMaxRetryAttempts);
[email protected]0f292de02012-02-01 22:28:20113}
114
[email protected]38b50d92012-04-19 21:07:52115// A HostResolverProc that pushes each host mapped into a list and allows
116// waiting for a specific number of requests. Unlike RuleBasedHostResolverProc
[email protected]1ee9afa12013-04-16 14:18:06117// it never calls SystemHostResolverCall. By default resolves all hostnames to
[email protected]38b50d92012-04-19 21:07:52118// "127.0.0.1". After AddRule(), it resolves only names explicitly specified.
119class MockHostResolverProc : public HostResolverProc {
[email protected]57a48d32012-03-03 00:04:55120 public:
[email protected]38b50d92012-04-19 21:07:52121 struct ResolveKey {
Eric Orth322af3e42018-08-20 18:12:59122 ResolveKey(const std::string& hostname,
123 AddressFamily address_family,
124 HostResolverFlags flags)
125 : hostname(hostname), address_family(address_family), flags(flags) {}
[email protected]38b50d92012-04-19 21:07:52126 bool operator<(const ResolveKey& other) const {
Eric Orth322af3e42018-08-20 18:12:59127 return std::tie(address_family, hostname, flags) <
128 std::tie(other.address_family, other.hostname, other.flags);
[email protected]38b50d92012-04-19 21:07:52129 }
[email protected]137af622010-02-05 02:14:35130 std::string hostname;
131 AddressFamily address_family;
Eric Orth322af3e42018-08-20 18:12:59132 HostResolverFlags flags;
[email protected]137af622010-02-05 02:14:35133 };
134
[email protected]38b50d92012-04-19 21:07:52135 typedef std::vector<ResolveKey> CaptureList;
[email protected]137af622010-02-05 02:14:35136
[email protected]38b50d92012-04-19 21:07:52137 MockHostResolverProc()
Raul Tambre94493c652019-03-11 17:18:35138 : HostResolverProc(nullptr),
[email protected]57a48d32012-03-03 00:04:55139 num_requests_waiting_(0),
140 num_slots_available_(0),
141 requests_waiting_(&lock_),
Eric Orth960e7062019-03-08 18:43:54142 slots_available_(&lock_) {}
[email protected]57a48d32012-03-03 00:04:55143
Peter Boström407869b2021-10-07 04:42:48144 MockHostResolverProc(const MockHostResolverProc&) = delete;
145 MockHostResolverProc& operator=(const MockHostResolverProc&) = delete;
146
[email protected]57a48d32012-03-03 00:04:55147 // Waits until |count| calls to |Resolve| are blocked. Returns false when
148 // timed out.
149 bool WaitFor(unsigned count) {
150 base::AutoLock lock(lock_);
151 base::Time start_time = base::Time::Now();
152 while (num_requests_waiting_ < count) {
153 requests_waiting_.TimedWait(TestTimeouts::action_timeout());
154 if (base::Time::Now() > start_time + TestTimeouts::action_timeout())
155 return false;
156 }
157 return true;
158 }
159
160 // Signals |count| waiting calls to |Resolve|. First come first served.
161 void SignalMultiple(unsigned count) {
162 base::AutoLock lock(lock_);
163 num_slots_available_ += count;
164 slots_available_.Broadcast();
165 }
166
167 // Signals all waiting calls to |Resolve|. Beware of races.
168 void SignalAll() {
169 base::AutoLock lock(lock_);
[email protected]38b50d92012-04-19 21:07:52170 num_slots_available_ = num_requests_waiting_;
[email protected]57a48d32012-03-03 00:04:55171 slots_available_.Broadcast();
172 }
173
Eric Orth322af3e42018-08-20 18:12:59174 void AddRule(const std::string& hostname,
175 AddressFamily family,
176 const AddressList& result,
177 HostResolverFlags flags = 0) {
[email protected]38b50d92012-04-19 21:07:52178 base::AutoLock lock(lock_);
Eric Orth322af3e42018-08-20 18:12:59179 rules_[ResolveKey(hostname, family, flags)] = result;
[email protected]57a48d32012-03-03 00:04:55180 }
181
Eric Orth322af3e42018-08-20 18:12:59182 void AddRule(const std::string& hostname,
183 AddressFamily family,
184 const std::string& ip_list,
185 HostResolverFlags flags = 0,
186 const std::string& canonical_name = "") {
[email protected]38b50d92012-04-19 21:07:52187 AddressList result;
Cammie Smith Barnes958c7f32020-12-17 16:43:11188 std::vector<std::string> dns_aliases;
189 if (canonical_name != "")
190 dns_aliases = {canonical_name};
191 int rv = ParseAddressList(ip_list, dns_aliases, &result);
[email protected]38b50d92012-04-19 21:07:52192 DCHECK_EQ(OK, rv);
Eric Orth322af3e42018-08-20 18:12:59193 AddRule(hostname, family, result, flags);
[email protected]38b50d92012-04-19 21:07:52194 }
[email protected]57a48d32012-03-03 00:04:55195
[email protected]38b50d92012-04-19 21:07:52196 void AddRuleForAllFamilies(const std::string& hostname,
Eric Orth322af3e42018-08-20 18:12:59197 const std::string& ip_list,
198 HostResolverFlags flags = 0,
199 const std::string& canonical_name = "") {
[email protected]38b50d92012-04-19 21:07:52200 AddressList result;
Cammie Smith Barnes958c7f32020-12-17 16:43:11201 std::vector<std::string> dns_aliases;
202 if (canonical_name != "")
203 dns_aliases = {canonical_name};
204 int rv = ParseAddressList(ip_list, dns_aliases, &result);
[email protected]38b50d92012-04-19 21:07:52205 DCHECK_EQ(OK, rv);
Eric Orth322af3e42018-08-20 18:12:59206 AddRule(hostname, ADDRESS_FAMILY_UNSPECIFIED, result, flags);
207 AddRule(hostname, ADDRESS_FAMILY_IPV4, result, flags);
208 AddRule(hostname, ADDRESS_FAMILY_IPV6, result, flags);
[email protected]38b50d92012-04-19 21:07:52209 }
[email protected]137af622010-02-05 02:14:35210
dchengb03027d2014-10-21 12:00:20211 int Resolve(const std::string& hostname,
212 AddressFamily address_family,
213 HostResolverFlags host_resolver_flags,
214 AddressList* addrlist,
215 int* os_error) override {
[email protected]38b50d92012-04-19 21:07:52216 base::AutoLock lock(lock_);
Eric Orth322af3e42018-08-20 18:12:59217 capture_list_.push_back(
218 ResolveKey(hostname, address_family, host_resolver_flags));
[email protected]38b50d92012-04-19 21:07:52219 ++num_requests_waiting_;
220 requests_waiting_.Broadcast();
Francois Doraya2d01ba2017-09-25 19:17:40221 {
222 base::ScopedAllowBaseSyncPrimitivesForTesting
223 scoped_allow_base_sync_primitives;
224 while (!num_slots_available_)
225 slots_available_.Wait();
226 }
[email protected]38b50d92012-04-19 21:07:52227 DCHECK_GT(num_requests_waiting_, 0u);
228 --num_slots_available_;
229 --num_requests_waiting_;
230 if (rules_.empty()) {
Cammie Smith Barnes958c7f32020-12-17 16:43:11231 int rv = ParseAddressList("127.0.0.1", {} /* dns_aliases */, addrlist);
[email protected]38b50d92012-04-19 21:07:52232 DCHECK_EQ(OK, rv);
233 return OK;
234 }
Eric Orth2bc48c72021-02-22 21:37:11235 ResolveKey key(hostname, address_family, host_resolver_flags);
[email protected]38b50d92012-04-19 21:07:52236 if (rules_.count(key) == 0)
237 return ERR_NAME_NOT_RESOLVED;
238 *addrlist = rules_[key];
239 return OK;
[email protected]137af622010-02-05 02:14:35240 }
[email protected]38b50d92012-04-19 21:07:52241
242 CaptureList GetCaptureList() const {
243 CaptureList copy;
244 {
245 base::AutoLock lock(lock_);
246 copy = capture_list_;
247 }
248 return copy;
249 }
250
Matt Menkef4023312019-11-01 18:24:55251 void ClearCaptureList() {
252 base::AutoLock lock(lock_);
253 capture_list_.clear();
254 }
255
[email protected]38b50d92012-04-19 21:07:52256 bool HasBlockedRequests() const {
257 base::AutoLock lock(lock_);
258 return num_requests_waiting_ > num_slots_available_;
259 }
260
[email protected]a9813302012-04-28 09:29:28261 protected:
Chris Watkins68b15032017-12-01 03:07:13262 ~MockHostResolverProc() override = default;
[email protected]38b50d92012-04-19 21:07:52263
[email protected]a9813302012-04-28 09:29:28264 private:
[email protected]38b50d92012-04-19 21:07:52265 mutable base::Lock lock_;
266 std::map<ResolveKey, AddressList> rules_;
267 CaptureList capture_list_;
268 unsigned num_requests_waiting_;
269 unsigned num_slots_available_;
270 base::ConditionVariable requests_waiting_;
271 base::ConditionVariable slots_available_;
[email protected]38b50d92012-04-19 21:07:52272};
273
Eric Orth70992982018-07-24 00:25:00274class ResolveHostResponseHelper {
275 public:
276 using Callback =
277 base::OnceCallback<void(CompletionOnceCallback completion_callback,
278 int error)>;
279
David Van Cleve1fb5e8c2019-11-04 16:45:16280 ResolveHostResponseHelper() = default;
Eric Orth70992982018-07-24 00:25:00281 explicit ResolveHostResponseHelper(
Eric Orth314e8b42019-11-12 00:32:21282 std::unique_ptr<HostResolverManager::CancellableResolveHostRequest>
283 request)
Eric Orth70992982018-07-24 00:25:00284 : request_(std::move(request)) {
Katharine Daly886eef72019-11-22 02:56:03285 top_level_result_error_ = request_->Start(base::BindOnce(
Eric Orth70992982018-07-24 00:25:00286 &ResolveHostResponseHelper::OnComplete, base::Unretained(this)));
287 }
288 ResolveHostResponseHelper(
Eric Orth314e8b42019-11-12 00:32:21289 std::unique_ptr<HostResolverManager::CancellableResolveHostRequest>
290 request,
Eric Orth70992982018-07-24 00:25:00291 Callback custom_callback)
292 : request_(std::move(request)) {
Katharine Daly886eef72019-11-22 02:56:03293 top_level_result_error_ = request_->Start(
Eric Orth70992982018-07-24 00:25:00294 base::BindOnce(std::move(custom_callback),
295 base::BindOnce(&ResolveHostResponseHelper::OnComplete,
296 base::Unretained(this))));
297 }
298
Peter Boström407869b2021-10-07 04:42:48299 ResolveHostResponseHelper(const ResolveHostResponseHelper&) = delete;
300 ResolveHostResponseHelper& operator=(const ResolveHostResponseHelper&) =
301 delete;
302
Katharine Daly886eef72019-11-22 02:56:03303 bool complete() const { return top_level_result_error_ != ERR_IO_PENDING; }
304
305 int top_level_result_error() {
306 WaitForCompletion();
307 return top_level_result_error_;
308 }
309
Eric Orth70992982018-07-24 00:25:00310 int result_error() {
311 WaitForCompletion();
Katharine Daly886eef72019-11-22 02:56:03312 return request_->GetResolveErrorInfo().error;
Eric Orth70992982018-07-24 00:25:00313 }
314
Eric Orth314e8b42019-11-12 00:32:21315 HostResolverManager::CancellableResolveHostRequest* request() {
316 return request_.get();
317 }
Eric Orth70992982018-07-24 00:25:00318
319 void CancelRequest() {
320 DCHECK(request_);
321 DCHECK(!complete());
322
323 request_ = nullptr;
324 }
325
326 void OnComplete(int error) {
327 DCHECK(!complete());
Katharine Daly886eef72019-11-22 02:56:03328 top_level_result_error_ = error;
Eric Orth70992982018-07-24 00:25:00329
330 run_loop_.Quit();
331 }
332
333 private:
334 void WaitForCompletion() {
335 DCHECK(request_);
336 if (complete()) {
337 return;
338 }
339 run_loop_.Run();
340 DCHECK(complete());
341 }
342
Eric Orth314e8b42019-11-12 00:32:21343 std::unique_ptr<HostResolverManager::CancellableResolveHostRequest> request_;
Katharine Daly886eef72019-11-22 02:56:03344 int top_level_result_error_ = ERR_IO_PENDING;
Eric Orth70992982018-07-24 00:25:00345 base::RunLoop run_loop_;
Eric Orth70992982018-07-24 00:25:00346};
347
[email protected]189163e2011-05-11 01:48:54348// Using LookupAttemptHostResolverProc simulate very long lookups, and control
349// which attempt resolves the host.
350class LookupAttemptHostResolverProc : public HostResolverProc {
351 public:
352 LookupAttemptHostResolverProc(HostResolverProc* previous,
353 int attempt_number_to_resolve,
354 int total_attempts)
355 : HostResolverProc(previous),
356 attempt_number_to_resolve_(attempt_number_to_resolve),
357 current_attempt_number_(0),
358 total_attempts_(total_attempts),
359 total_attempts_resolved_(0),
360 resolved_attempt_number_(0),
Eric Orth9a037562018-07-03 21:24:38361 num_attempts_waiting_(0),
362 all_done_(&lock_),
363 blocked_attempt_signal_(&lock_) {}
[email protected]189163e2011-05-11 01:48:54364
365 // Test harness will wait for all attempts to finish before checking the
366 // results.
Eric Orth9a037562018-07-03 21:24:38367 void WaitForAllAttemptsToFinish() {
368 base::AutoLock auto_lock(lock_);
369 while (total_attempts_resolved_ != total_attempts_) {
370 all_done_.Wait();
371 }
372 }
373
374 void WaitForNAttemptsToBeBlocked(int n) {
375 base::AutoLock auto_lock(lock_);
376 while (num_attempts_waiting_ < n) {
377 blocked_attempt_signal_.Wait();
[email protected]189163e2011-05-11 01:48:54378 }
379 }
380
381 // All attempts will wait for an attempt to resolve the host.
382 void WaitForAnAttemptToComplete() {
[email protected]189163e2011-05-11 01:48:54383 {
384 base::AutoLock auto_lock(lock_);
Francois Doraya2d01ba2017-09-25 19:17:40385 base::ScopedAllowBaseSyncPrimitivesForTesting
386 scoped_allow_base_sync_primitives;
Eric Orth9a037562018-07-03 21:24:38387 while (resolved_attempt_number_ == 0)
388 all_done_.Wait();
[email protected]189163e2011-05-11 01:48:54389 }
390 all_done_.Broadcast(); // Tell all waiting attempts to proceed.
391 }
392
393 // Returns the number of attempts that have finished the Resolve() method.
Eric Roman21b39232019-06-28 21:28:21394 int GetTotalAttemptsResolved() {
395 base::AutoLock auto_lock(lock_);
396 return total_attempts_resolved_;
397 }
[email protected]189163e2011-05-11 01:48:54398
Eric Roman21b39232019-06-28 21:28:21399 // Sets the resolved attempt number and unblocks waiting
400 // attempts.
401 void SetResolvedAttemptNumber(int n) {
402 base::AutoLock auto_lock(lock_);
403 EXPECT_EQ(0, resolved_attempt_number_);
404 resolved_attempt_number_ = n;
405 all_done_.Broadcast();
406 }
Eric Orth9a037562018-07-03 21:24:38407
[email protected]189163e2011-05-11 01:48:54408 // HostResolverProc methods.
dchengb03027d2014-10-21 12:00:20409 int Resolve(const std::string& host,
410 AddressFamily address_family,
411 HostResolverFlags host_resolver_flags,
412 AddressList* addrlist,
413 int* os_error) override {
[email protected]189163e2011-05-11 01:48:54414 bool wait_for_right_attempt_to_complete = true;
415 {
416 base::AutoLock auto_lock(lock_);
417 ++current_attempt_number_;
Eric Orth9a037562018-07-03 21:24:38418 ++num_attempts_waiting_;
[email protected]189163e2011-05-11 01:48:54419 if (current_attempt_number_ == attempt_number_to_resolve_) {
420 resolved_attempt_number_ = current_attempt_number_;
421 wait_for_right_attempt_to_complete = false;
422 }
423 }
424
Eric Orth9a037562018-07-03 21:24:38425 blocked_attempt_signal_.Broadcast();
426
[email protected]189163e2011-05-11 01:48:54427 if (wait_for_right_attempt_to_complete)
428 // Wait for the attempt_number_to_resolve_ attempt to resolve.
429 WaitForAnAttemptToComplete();
430
431 int result = ResolveUsingPrevious(host, address_family, host_resolver_flags,
432 addrlist, os_error);
433
434 {
435 base::AutoLock auto_lock(lock_);
436 ++total_attempts_resolved_;
Eric Orth9a037562018-07-03 21:24:38437 --num_attempts_waiting_;
[email protected]189163e2011-05-11 01:48:54438 }
439
440 all_done_.Broadcast(); // Tell all attempts to proceed.
441
442 // Since any negative number is considered a network error, with -1 having
443 // special meaning (ERR_IO_PENDING). We could return the attempt that has
444 // resolved the host as a negative number. For example, if attempt number 3
445 // resolves the host, then this method returns -4.
446 if (result == OK)
447 return -1 - resolved_attempt_number_;
448 else
449 return result;
450 }
451
[email protected]a9813302012-04-28 09:29:28452 protected:
Chris Watkins68b15032017-12-01 03:07:13453 ~LookupAttemptHostResolverProc() override = default;
[email protected]189163e2011-05-11 01:48:54454
[email protected]a9813302012-04-28 09:29:28455 private:
[email protected]189163e2011-05-11 01:48:54456 int attempt_number_to_resolve_;
457 int current_attempt_number_; // Incremented whenever Resolve is called.
458 int total_attempts_;
459 int total_attempts_resolved_;
460 int resolved_attempt_number_;
Eric Orth9a037562018-07-03 21:24:38461 int num_attempts_waiting_;
[email protected]189163e2011-05-11 01:48:54462
463 // All attempts wait for right attempt to be resolve.
464 base::Lock lock_;
465 base::ConditionVariable all_done_;
Eric Orth9a037562018-07-03 21:24:38466 base::ConditionVariable blocked_attempt_signal_;
[email protected]189163e2011-05-11 01:48:54467};
468
Eric Orth960e7062019-03-08 18:43:54469// TestHostResolverManager's sole purpose is to mock the IPv6 reachability test.
cbentzel1906f872015-06-05 16:25:25470// By default, this pretends that IPv6 is globally reachable.
471// This class is necessary so unit tests run the same on dual-stack machines as
472// well as IPv4 only machines.
Eric Orth960e7062019-03-08 18:43:54473class TestHostResolverManager : public HostResolverManager {
cbentzel1906f872015-06-05 16:25:25474 public:
Eric Orth4d635c12019-04-24 22:53:04475 TestHostResolverManager(const HostResolver::ManagerOptions& options,
Eric Orthfe6d5482019-09-03 18:27:57476 SystemDnsConfigChangeNotifier* notifier,
dalykc27699a2019-07-29 20:53:29477 NetLog* net_log,
Eric Orthfe6d5482019-09-03 18:27:57478 bool ipv6_reachable = true)
479 : HostResolverManager(options, notifier, net_log),
Eric Orth960e7062019-03-08 18:43:54480 ipv6_reachable_(ipv6_reachable) {}
cbentzel1906f872015-06-05 16:25:25481
Eric Orth960e7062019-03-08 18:43:54482 ~TestHostResolverManager() override = default;
cbentzel1906f872015-06-05 16:25:25483
484 private:
485 const bool ipv6_reachable_;
486
mgershaf9a9232017-04-13 20:19:03487 bool IsGloballyReachable(const IPAddress& dest,
488 const NetLogWithSource& net_log) override {
cbentzel1906f872015-06-05 16:25:25489 return ipv6_reachable_;
490 }
491};
492
Matt Menkec35d1632018-11-29 12:43:49493bool HasAddress(const IPAddress& search_address, const AddressList& addresses) {
tfarina9ed7f8c52016-02-19 17:50:18494 for (const auto& address : addresses) {
Matt Menkec35d1632018-11-29 12:43:49495 if (search_address == address.address())
tfarina9ed7f8c52016-02-19 17:50:18496 return true;
497 }
498 return false;
499}
500
501void TestBothLoopbackIPs(const std::string& host) {
tfarina9ed7f8c52016-02-19 17:50:18502 AddressList addresses;
Matt Menkec35d1632018-11-29 12:43:49503 EXPECT_TRUE(ResolveLocalHostname(host, &addresses));
tfarina9ed7f8c52016-02-19 17:50:18504 EXPECT_EQ(2u, addresses.size());
Matt Menkec35d1632018-11-29 12:43:49505 EXPECT_TRUE(HasAddress(IPAddress::IPv4Localhost(), addresses));
506 EXPECT_TRUE(HasAddress(IPAddress::IPv6Localhost(), addresses));
tfarina9ed7f8c52016-02-19 17:50:18507}
508
[email protected]38b50d92012-04-19 21:07:52509} // namespace
[email protected]8a00f00a2009-06-12 00:49:38510
Gabriel Charette694c3c332019-08-19 14:53:05511class HostResolverManagerTest : public TestWithTaskEnvironment {
[email protected]471822ca2009-01-29 11:32:26512 public:
[email protected]38b50d92012-04-19 21:07:52513 static const int kDefaultPort = 80;
514
David Van Cleve1fb5e8c2019-11-04 16:45:16515 explicit HostResolverManagerTest(
516 base::test::TaskEnvironment::TimeSource time_source =
517 base::test::TaskEnvironment::TimeSource::SYSTEM_TIME)
518 : TestWithTaskEnvironment(time_source),
519 proc_(new MockHostResolverProc()) {}
[email protected]471822ca2009-01-29 11:32:26520
Eric Orth607b6d82019-05-08 16:43:32521 void CreateResolver(bool check_ipv6_on_wifi = true) {
Eric Orth70992982018-07-24 00:25:00522 CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:32523 true /* ipv6_reachable */,
524 check_ipv6_on_wifi);
[email protected]daae1322013-09-05 18:26:50525 }
526
Eric Orth37b18192019-04-22 19:09:28527 void DestroyResolver() {
528 if (!resolver_)
529 return;
530
Eric Orthaf82b49a2020-02-01 01:48:50531 resolver_->DeregisterResolveContext(resolve_context_.get());
Eric Orth37b18192019-04-22 19:09:28532 resolver_ = nullptr;
533 }
534
Eric Orth960e7062019-03-08 18:43:54535 // This HostResolverManager will only allow 1 outstanding resolve at a time
536 // and perform no retries.
Eric Orth607b6d82019-05-08 16:43:32537 void CreateSerialResolver(bool check_ipv6_on_wifi = true) {
Eric Orth59066222019-03-07 23:52:27538 ProcTaskParams params = DefaultParams(proc_.get());
[email protected]daae1322013-09-05 18:26:50539 params.max_retry_attempts = 0u;
Eric Orth607b6d82019-05-08 16:43:32540 CreateResolverWithLimitsAndParams(1u, params, true /* ipv6_reachable */,
541 check_ipv6_on_wifi);
[email protected]daae1322013-09-05 18:26:50542 }
543
[email protected]471822ca2009-01-29 11:32:26544 protected:
[email protected]daae1322013-09-05 18:26:50545 // testing::Test implementation:
Eric Orth6f1c5172019-04-16 17:08:27546 void SetUp() override {
Eric Orth6f1c5172019-04-16 17:08:27547 request_context_ = std::make_unique<TestURLRequestContext>();
Eric Orthaf82b49a2020-02-01 01:48:50548 resolve_context_ = std::make_unique<ResolveContext>(
549 request_context_.get(), true /* enable_caching */);
550 CreateResolver();
Eric Orth6f1c5172019-04-16 17:08:27551 }
[email protected]70c04ab2013-08-22 16:05:12552
dcheng67be2b1f2014-10-27 21:47:29553 void TearDown() override {
Eric Orth37b18192019-04-22 19:09:28554 if (resolver_) {
[email protected]daae1322013-09-05 18:26:50555 EXPECT_EQ(0u, resolver_->num_running_dispatcher_jobs_for_tests());
Eric Orth37b18192019-04-22 19:09:28556 }
Eric Orthaf82b49a2020-02-01 01:48:50557 DestroyResolver();
[email protected]daae1322013-09-05 18:26:50558 EXPECT_FALSE(proc_->HasBlockedRequests());
559 }
560
Eric Orth4e55b362019-05-07 22:00:03561 void CreateResolverWithLimitsAndParams(size_t max_concurrent_resolves,
562 const ProcTaskParams& params,
Eric Orth607b6d82019-05-08 16:43:32563 bool ipv6_reachable,
564 bool check_ipv6_on_wifi) {
Eric Orth4d635c12019-04-24 22:53:04565 HostResolver::ManagerOptions options = DefaultOptions();
[email protected]106ccd2c2014-06-17 09:21:00566 options.max_concurrent_resolves = max_concurrent_resolves;
Eric Orth607b6d82019-05-08 16:43:32567 options.check_ipv6_on_wifi = check_ipv6_on_wifi;
Eric Orth4e55b362019-05-07 22:00:03568
569 CreateResolverWithOptionsAndParams(std::move(options), params,
570 ipv6_reachable);
571 }
572
573 virtual HostResolver::ManagerOptions DefaultOptions() {
574 HostResolver::ManagerOptions options;
575 options.max_concurrent_resolves = kMaxJobs;
576 options.max_system_retry_attempts = kMaxRetryAttempts;
577 return options;
578 }
579
580 virtual void CreateResolverWithOptionsAndParams(
581 HostResolver::ManagerOptions options,
582 const ProcTaskParams& params,
583 bool ipv6_reachable) {
584 // Use HostResolverManagerDnsTest if enabling DNS client.
dalykc27699a2019-07-29 20:53:29585 DCHECK(!options.insecure_dns_client_enabled);
Eric Orth4e55b362019-05-07 22:00:03586
587 DestroyResolver();
588
589 resolver_ = std::make_unique<TestHostResolverManager>(
Eric Orthfe6d5482019-09-03 18:27:57590 options, nullptr /* notifier */, nullptr /* net_log */, ipv6_reachable);
[email protected]106ccd2c2014-06-17 09:21:00591 resolver_->set_proc_params_for_test(params);
Eric Orth37b18192019-04-22 19:09:28592
Eric Orthaf82b49a2020-02-01 01:48:50593 resolver_->RegisterResolveContext(resolve_context_.get());
[email protected]471822ca2009-01-29 11:32:26594 }
[email protected]aa22b242011-11-16 18:58:29595
[email protected]38b50d92012-04-19 21:07:52596 // Friendship is not inherited, so use proxies to access those.
[email protected]daae1322013-09-05 18:26:50597 size_t num_running_dispatcher_jobs() const {
[email protected]38b50d92012-04-19 21:07:52598 DCHECK(resolver_.get());
[email protected]daae1322013-09-05 18:26:50599 return resolver_->num_running_dispatcher_jobs_for_tests();
[email protected]38b50d92012-04-19 21:07:52600 }
601
Eric Orth60931742018-11-05 23:40:57602 void set_allow_fallback_to_proctask(bool allow_fallback_to_proctask) {
[email protected]16c2bd72013-06-28 01:19:22603 DCHECK(resolver_.get());
Eric Orth60931742018-11-05 23:40:57604 resolver_->allow_fallback_to_proctask_ = allow_fallback_to_proctask;
[email protected]16c2bd72013-06-28 01:19:22605 }
606
dalykc27699a2019-07-29 20:53:29607 static unsigned maximum_insecure_dns_task_failures() {
Eric Orth394db1732019-08-27 20:09:39608 return DnsClient::kMaxInsecureFallbackFailures;
[email protected]daae1322013-09-05 18:26:50609 }
610
tfarina42834112016-09-22 13:38:20611 bool IsIPv6Reachable(const NetLogWithSource& net_log) {
sergeyub8cdc212015-05-14 18:50:37612 return resolver_->IsIPv6Reachable(net_log);
613 }
614
Eric Orth394db1732019-08-27 20:09:39615 void PopulateCache(const HostCache::Key& key, IPEndPoint endpoint) {
Eric Orthaf82b49a2020-02-01 01:48:50616 resolver_->CacheResult(resolve_context_->host_cache(), key,
dalyke966a1832019-06-05 20:53:13617 HostCache::Entry(OK, AddressList(endpoint),
618 HostCache::Entry::SOURCE_UNKNOWN),
Peter Kastinge5a38ed2021-10-02 03:06:35619 base::Seconds(1));
dalyke966a1832019-06-05 20:53:13620 }
621
dalyk48b20a992019-02-25 16:10:26622 const std::pair<const HostCache::Key, HostCache::Entry>* GetCacheHit(
623 const HostCache::Key& key) {
Eric Orthaf82b49a2020-02-01 01:48:50624 DCHECK(resolve_context_->host_cache());
625 return resolve_context_->host_cache()->LookupStale(
626 key, base::TimeTicks(), nullptr, false /* ignore_secure */);
Rob Percival94f21ad2017-11-14 10:20:24627 }
628
juliatuttle9fb7aeb2016-06-06 20:16:33629 void MakeCacheStale() {
Eric Orthaf82b49a2020-02-01 01:48:50630 DCHECK(resolve_context_->host_cache());
631 resolve_context_->host_cache()->Invalidate();
juliatuttle9fb7aeb2016-06-06 20:16:33632 }
633
Eric Orth70992982018-07-24 00:25:00634 IPEndPoint CreateExpected(const std::string& ip_literal, uint16_t port) {
635 IPAddress ip;
636 bool result = ip.AssignFromIPLiteral(ip_literal);
637 DCHECK(result);
638 return IPEndPoint(ip, port);
639 }
640
[email protected]38b50d92012-04-19 21:07:52641 scoped_refptr<MockHostResolverProc> proc_;
Eric Orth960e7062019-03-08 18:43:54642 std::unique_ptr<HostResolverManager> resolver_;
Eric Orth6f1c5172019-04-16 17:08:27643 std::unique_ptr<URLRequestContext> request_context_;
Eric Orth069a3c6e2020-01-31 23:14:24644 std::unique_ptr<ResolveContext> resolve_context_;
[email protected]471822ca2009-01-29 11:32:26645};
646
Eric Orth960e7062019-03-08 18:43:54647TEST_F(HostResolverManagerTest, AsynchronousLookup) {
[email protected]38b50d92012-04-19 21:07:52648 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42");
649 proc_->SignalMultiple(1u);
[email protected]471822ca2009-01-29 11:32:26650
Eric Orth70992982018-07-24 00:25:00651 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55652 HostPortPair("just.testing", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:52653 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:50654 resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:00655
656 EXPECT_THAT(response.result_error(), IsOk());
Katharine Daly886eef72019-11-22 02:56:03657 EXPECT_THAT(response.top_level_result_error(), IsOk());
Eric Orth70992982018-07-24 00:25:00658 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
659 testing::ElementsAre(CreateExpected("192.168.1.42", 80)));
Eric Ortheb332862019-01-26 00:52:38660 EXPECT_FALSE(response.request()->GetStaleInfo());
Eric Orth70992982018-07-24 00:25:00661
662 EXPECT_EQ("just.testing", proc_->GetCaptureList()[0].hostname);
Eric Orth26fa08e2019-02-22 01:28:37663
dalyk48b20a992019-02-25 16:10:26664 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result =
665 GetCacheHit(HostCache::Key("just.testing", DnsQueryType::UNSPECIFIED,
666 0 /* host_resolver_flags */,
Matt Menke7b4a32f2019-10-25 22:13:46667 HostResolverSource::ANY,
668 NetworkIsolationKey()));
dalyk48b20a992019-02-25 16:10:26669 EXPECT_TRUE(cache_result);
Eric Orth70992982018-07-24 00:25:00670}
671
Eric Orthc4cca5d2021-07-02 19:59:01672// TODO(crbug.com/1206799): Confirm scheme behavior once it affects behavior.
673TEST_F(HostResolverManagerTest, AsynchronousLookupWithScheme) {
674 proc_->AddRuleForAllFamilies("host.test", "192.168.1.42");
675 proc_->SignalMultiple(1u);
676
677 ResolveHostResponseHelper response(resolver_->CreateRequest(
678 url::SchemeHostPort(url::kHttpScheme, "host.test", 80),
679 NetworkIsolationKey(), NetLogWithSource(), absl::nullopt,
680 resolve_context_.get(), resolve_context_->host_cache()));
681
682 EXPECT_THAT(response.result_error(), IsOk());
683 EXPECT_THAT(response.top_level_result_error(), IsOk());
684 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
685 testing::ElementsAre(CreateExpected("192.168.1.42", 80)));
686 EXPECT_FALSE(response.request()->GetStaleInfo());
687
688 EXPECT_EQ("host.test", proc_->GetCaptureList()[0].hostname);
689
690 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result =
691 GetCacheHit(HostCache::Key(
692 "host.test", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
693 HostResolverSource::ANY, NetworkIsolationKey()));
694 EXPECT_TRUE(cache_result);
695}
696
Eric Orth6f1c5172019-04-16 17:08:27697TEST_F(HostResolverManagerTest, JobsClearedOnCompletion) {
698 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42");
699 proc_->SignalMultiple(1u);
700
701 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55702 HostPortPair("just.testing", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:52703 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:50704 resolve_context_->host_cache()));
Eric Orth6f1c5172019-04-16 17:08:27705 EXPECT_EQ(1u, resolver_->num_jobs_for_testing());
706
707 EXPECT_THAT(response.result_error(), IsOk());
708 EXPECT_EQ(0u, resolver_->num_jobs_for_testing());
709}
710
711TEST_F(HostResolverManagerTest, JobsClearedOnCompletion_MultipleRequests) {
712 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42");
713 proc_->SignalMultiple(1u);
714
715 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55716 HostPortPair("just.testing", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:52717 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:50718 resolve_context_->host_cache()));
Eric Orth6f1c5172019-04-16 17:08:27719 ResolveHostResponseHelper response2(resolver_->CreateRequest(
Eric Orthc4cca5d2021-07-02 19:59:01720 HostPortPair("just.testing", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:52721 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:50722 resolve_context_->host_cache()));
Eric Orth6f1c5172019-04-16 17:08:27723 EXPECT_EQ(1u, resolver_->num_jobs_for_testing());
724
725 EXPECT_THAT(response1.result_error(), IsOk());
726 EXPECT_THAT(response2.result_error(), IsOk());
727 EXPECT_EQ(0u, resolver_->num_jobs_for_testing());
728}
729
730TEST_F(HostResolverManagerTest, JobsClearedOnCompletion_Failure) {
731 proc_->AddRuleForAllFamilies(std::string(),
Eric Roman862ae4b22019-08-22 20:25:44732 "0.0.0.1"); // Default to failures.
Eric Orth6f1c5172019-04-16 17:08:27733 proc_->SignalMultiple(1u);
734
735 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55736 HostPortPair("just.testing", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:52737 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:50738 resolve_context_->host_cache()));
Eric Orth6f1c5172019-04-16 17:08:27739 EXPECT_EQ(1u, resolver_->num_jobs_for_testing());
740
741 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
742 EXPECT_EQ(0u, resolver_->num_jobs_for_testing());
743}
744
745TEST_F(HostResolverManagerTest, JobsClearedOnCompletion_Abort) {
746 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42");
747
748 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55749 HostPortPair("just.testing", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:52750 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:50751 resolve_context_->host_cache()));
Eric Orth6f1c5172019-04-16 17:08:27752 EXPECT_EQ(1u, resolver_->num_jobs_for_testing());
753
754 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
755 proc_->SignalMultiple(1u);
756
757 EXPECT_THAT(response.result_error(), IsError(ERR_NETWORK_CHANGED));
758 EXPECT_EQ(0u, resolver_->num_jobs_for_testing());
759}
760
Eric Orth960e7062019-03-08 18:43:54761TEST_F(HostResolverManagerTest, DnsQueryType) {
Eric Orth00fe5a62018-08-15 22:20:00762 proc_->AddRule("host", ADDRESS_FAMILY_IPV4, "192.168.1.20");
763 proc_->AddRule("host", ADDRESS_FAMILY_IPV6, "::5");
764
765 HostResolver::ResolveHostParameters parameters;
766
Eric Orth192e3bb2018-11-14 19:30:32767 parameters.dns_query_type = DnsQueryType::A;
Eric Orth117e1992019-04-17 00:24:15768 ResolveHostResponseHelper v4_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55769 HostPortPair("host", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:50770 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth00fe5a62018-08-15 22:20:00771
Eric Orth192e3bb2018-11-14 19:30:32772 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth117e1992019-04-17 00:24:15773 ResolveHostResponseHelper v6_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55774 HostPortPair("host", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:50775 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth00fe5a62018-08-15 22:20:00776
777 proc_->SignalMultiple(2u);
778
779 EXPECT_THAT(v4_response.result_error(), IsOk());
780 EXPECT_THAT(v4_response.request()->GetAddressResults().value().endpoints(),
781 testing::ElementsAre(CreateExpected("192.168.1.20", 80)));
782
783 EXPECT_THAT(v6_response.result_error(), IsOk());
784 EXPECT_THAT(v6_response.request()->GetAddressResults().value().endpoints(),
785 testing::ElementsAre(CreateExpected("::5", 80)));
786}
787
Cammie Smith Barnes958c7f32020-12-17 16:43:11788TEST_F(HostResolverManagerTest, DnsQueryWithoutAliases) {
789 proc_->AddRule("host", ADDRESS_FAMILY_IPV4, "192.168.1.20");
790
791 HostResolver::ResolveHostParameters parameters;
792
793 parameters.dns_query_type = DnsQueryType::A;
794 ResolveHostResponseHelper response(resolver_->CreateRequest(
795 HostPortPair("host", 80), NetworkIsolationKey(), NetLogWithSource(),
796 parameters, resolve_context_.get(), resolve_context_->host_cache()));
797
798 proc_->SignalMultiple(1u);
799
800 EXPECT_THAT(response.result_error(), IsOk());
801 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
802 testing::ElementsAre(CreateExpected("192.168.1.20", 80)));
803 EXPECT_FALSE(response.request()->GetDnsAliasResults());
804}
805
Eric Orth960e7062019-03-08 18:43:54806TEST_F(HostResolverManagerTest, LocalhostIPV4IPV6Lookup) {
Eric Orth00fe5a62018-08-15 22:20:00807 HostResolver::ResolveHostParameters parameters;
808
Eric Orth192e3bb2018-11-14 19:30:32809 parameters.dns_query_type = DnsQueryType::A;
Eric Orth00fe5a62018-08-15 22:20:00810 ResolveHostResponseHelper v4_v4_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55811 HostPortPair("localhost", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:50812 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth00fe5a62018-08-15 22:20:00813 EXPECT_THAT(v4_v4_response.result_error(), IsOk());
814 EXPECT_THAT(v4_v4_response.request()->GetAddressResults().value().endpoints(),
815 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
816
Eric Orth192e3bb2018-11-14 19:30:32817 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth00fe5a62018-08-15 22:20:00818 ResolveHostResponseHelper v4_v6_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55819 HostPortPair("localhost", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:50820 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth00fe5a62018-08-15 22:20:00821 EXPECT_THAT(v4_v6_response.result_error(), IsOk());
822 EXPECT_THAT(v4_v6_response.request()->GetAddressResults().value().endpoints(),
823 testing::ElementsAre(CreateExpected("::1", 80)));
824
825 ResolveHostResponseHelper v4_unsp_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55826 HostPortPair("localhost", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:52827 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth00fe5a62018-08-15 22:20:00828 EXPECT_THAT(v4_unsp_response.result_error(), IsOk());
829 EXPECT_THAT(
830 v4_unsp_response.request()->GetAddressResults().value().endpoints(),
831 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
832 CreateExpected("::1", 80)));
833}
834
Eric Orth960e7062019-03-08 18:43:54835TEST_F(HostResolverManagerTest, ResolveIPLiteralWithHostResolverSystemOnly) {
eroman368a1002016-03-04 21:52:55836 const char kIpLiteral[] = "178.78.32.1";
837 // Add a mapping to tell if the resolver proc was called (if it was called,
838 // then the result will be the remapped value. Otherwise it will be the IP
839 // literal).
840 proc_->AddRuleForAllFamilies(kIpLiteral, "183.45.32.1");
841
Eric Orthdc35748e2018-08-23 22:41:48842 HostResolver::ResolveHostParameters parameters;
843 parameters.source = HostResolverSource::SYSTEM;
Eric Orth117e1992019-04-17 00:24:15844 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55845 HostPortPair(kIpLiteral, 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:50846 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthdc35748e2018-08-23 22:41:48847
848 // IP literal resolution is expected to take precedence over source, so the
849 // result is expected to be the input IP, not the result IP from the proc rule
850 EXPECT_THAT(response.result_error(), IsOk());
851 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
852 testing::ElementsAre(CreateExpected(kIpLiteral, 80)));
Eric Ortheb332862019-01-26 00:52:38853 EXPECT_FALSE(response.request()->GetStaleInfo());
Eric Orthdc35748e2018-08-23 22:41:48854}
855
Eric Orth960e7062019-03-08 18:43:54856TEST_F(HostResolverManagerTest, EmptyListMeansNameNotResolved) {
[email protected]49b70b222013-05-07 21:24:23857 proc_->AddRuleForAllFamilies("just.testing", "");
858 proc_->SignalMultiple(1u);
859
Eric Orth70992982018-07-24 00:25:00860 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55861 HostPortPair("just.testing", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:52862 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:50863 resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:00864
865 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
866 EXPECT_FALSE(response.request()->GetAddressResults());
Eric Ortheb332862019-01-26 00:52:38867 EXPECT_FALSE(response.request()->GetStaleInfo());
Eric Orth70992982018-07-24 00:25:00868
869 EXPECT_EQ("just.testing", proc_->GetCaptureList()[0].hostname);
870}
871
Eric Orth960e7062019-03-08 18:43:54872TEST_F(HostResolverManagerTest, FailedAsynchronousLookup) {
[email protected]007b3f82013-04-09 08:46:45873 proc_->AddRuleForAllFamilies(std::string(),
Eric Roman862ae4b22019-08-22 20:25:44874 "0.0.0.1"); // Default to failures.
[email protected]38b50d92012-04-19 21:07:52875 proc_->SignalMultiple(1u);
[email protected]a33347c2012-01-09 18:27:01876
Eric Orth70992982018-07-24 00:25:00877 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55878 HostPortPair("just.testing", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:52879 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:50880 resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:00881 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
Katharine Daly886eef72019-11-22 02:56:03882 EXPECT_THAT(response.top_level_result_error(),
883 IsError(ERR_NAME_NOT_RESOLVED));
Eric Orth70992982018-07-24 00:25:00884 EXPECT_FALSE(response.request()->GetAddressResults());
Eric Ortheb332862019-01-26 00:52:38885 EXPECT_FALSE(response.request()->GetStaleInfo());
Eric Orth70992982018-07-24 00:25:00886
887 EXPECT_EQ("just.testing", proc_->GetCaptureList()[0].hostname);
888
889 // Also test that the error is not cached.
dalyk48b20a992019-02-25 16:10:26890 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result =
891 GetCacheHit(HostCache::Key("just.testing", DnsQueryType::UNSPECIFIED,
892 0 /* host_resolver_flags */,
Matt Menke7b4a32f2019-10-25 22:13:46893 HostResolverSource::ANY,
894 NetworkIsolationKey()));
dalyk48b20a992019-02-25 16:10:26895 EXPECT_FALSE(cache_result);
Eric Orth70992982018-07-24 00:25:00896}
897
Eric Orth960e7062019-03-08 18:43:54898TEST_F(HostResolverManagerTest, AbortedAsynchronousLookup) {
Eric Orth70992982018-07-24 00:25:00899 ResolveHostResponseHelper response0(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55900 HostPortPair("just.testing", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:52901 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:50902 resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:00903 ASSERT_FALSE(response0.complete());
904 ASSERT_TRUE(proc_->WaitFor(1u));
905
906 // Resolver is destroyed while job is running on WorkerPool.
Eric Orth37b18192019-04-22 19:09:28907 DestroyResolver();
Eric Orth70992982018-07-24 00:25:00908
909 proc_->SignalAll();
910
911 // To ensure there was no spurious callback, complete with a new resolver.
912 CreateResolver();
913 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55914 HostPortPair("just.testing", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:52915 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:50916 resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:00917
918 proc_->SignalMultiple(2u);
919
920 EXPECT_THAT(response1.result_error(), IsOk());
921
922 // This request was canceled.
923 EXPECT_FALSE(response0.complete());
924}
925
Eric Orth960e7062019-03-08 18:43:54926TEST_F(HostResolverManagerTest, NumericIPv4Address) {
Eric Orth70992982018-07-24 00:25:00927 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55928 HostPortPair("127.1.2.3", 5555), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:52929 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:50930 resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:00931
932 EXPECT_THAT(response.result_error(), IsOk());
933 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
934 testing::ElementsAre(CreateExpected("127.1.2.3", 5555)));
935}
936
Eric Orthc4cca5d2021-07-02 19:59:01937TEST_F(HostResolverManagerTest, NumericIPv4AddressWithScheme) {
938 ResolveHostResponseHelper response(resolver_->CreateRequest(
939 url::SchemeHostPort(url::kHttpsScheme, "127.1.2.3", 5555),
940 NetworkIsolationKey(), NetLogWithSource(), absl::nullopt,
941 resolve_context_.get(), resolve_context_->host_cache()));
942
943 EXPECT_THAT(response.result_error(), IsOk());
944 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
945 testing::ElementsAre(CreateExpected("127.1.2.3", 5555)));
946}
947
Eric Orth960e7062019-03-08 18:43:54948TEST_F(HostResolverManagerTest, NumericIPv6Address) {
[email protected]dbcff96272009-05-07 00:23:44949 // Resolve a plain IPv6 address. Don't worry about [brackets], because
950 // the caller should have removed them.
Eric Orth70992982018-07-24 00:25:00951 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55952 HostPortPair("2001:db8::1", 5555), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:52953 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:50954 resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:00955
956 EXPECT_THAT(response.result_error(), IsOk());
957 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
958 testing::ElementsAre(CreateExpected("2001:db8::1", 5555)));
959}
960
Eric Orthc4cca5d2021-07-02 19:59:01961TEST_F(HostResolverManagerTest, NumericIPv6AddressWithScheme) {
962 ResolveHostResponseHelper response(resolver_->CreateRequest(
963 url::SchemeHostPort(url::kFtpScheme, "[2001:db8::1]", 5555),
964 NetworkIsolationKey(), NetLogWithSource(), absl::nullopt,
965 resolve_context_.get(), resolve_context_->host_cache()));
966
967 EXPECT_THAT(response.result_error(), IsOk());
968 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
969 testing::ElementsAre(CreateExpected("2001:db8::1", 5555)));
970}
971
Eric Orth960e7062019-03-08 18:43:54972TEST_F(HostResolverManagerTest, EmptyHost) {
Eric Orth70992982018-07-24 00:25:00973 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55974 HostPortPair(std::string(), 5555), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:52975 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:50976 resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:00977
978 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
979 EXPECT_FALSE(response.request()->GetAddressResults());
980}
981
Eric Orth960e7062019-03-08 18:43:54982TEST_F(HostResolverManagerTest, EmptyDotsHost) {
[email protected]e806cd72013-05-17 02:08:43983 for (int i = 0; i < 16; ++i) {
Eric Orth6f1c5172019-04-16 17:08:27984 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55985 HostPortPair(std::string(i, '.'), 5555), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:52986 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:50987 resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:00988
989 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
990 EXPECT_FALSE(response.request()->GetAddressResults());
991 }
992}
993
Eric Orth960e7062019-03-08 18:43:54994TEST_F(HostResolverManagerTest, LongHost) {
Eric Orth6f1c5172019-04-16 17:08:27995 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55996 HostPortPair(std::string(4097, 'a'), 5555), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:52997 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:50998 resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:00999
1000 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
1001 EXPECT_FALSE(response.request()->GetAddressResults());
1002}
1003
Eric Orth960e7062019-03-08 18:43:541004TEST_F(HostResolverManagerTest, DeDupeRequests) {
[email protected]b59ff372009-07-15 22:04:321005 // Start 5 requests, duplicating hosts "a" and "b". Since the resolver_proc is
[email protected]8a00f00a2009-06-12 00:49:381006 // blocked, these should all pile up until we signal it.
Eric Orth70992982018-07-24 00:25:001007 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:151008 responses.emplace_back(
1009 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551010 HostPortPair("a", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:521011 absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:501012 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151013 responses.emplace_back(
1014 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551015 HostPortPair("b", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:521016 absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:501017 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151018 responses.emplace_back(
1019 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Eric Orthc4cca5d2021-07-02 19:59:011020 HostPortPair("b", 80), NetworkIsolationKey(), NetLogWithSource(),
1021 absl::nullopt, resolve_context_.get(),
1022 resolve_context_->host_cache())));
1023 responses.emplace_back(
1024 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1025 HostPortPair("a", 80), NetworkIsolationKey(), NetLogWithSource(),
1026 absl::nullopt, resolve_context_.get(),
1027 resolve_context_->host_cache())));
1028 responses.emplace_back(
1029 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1030 HostPortPair("b", 80), NetworkIsolationKey(), NetLogWithSource(),
1031 absl::nullopt, resolve_context_.get(),
1032 resolve_context_->host_cache())));
1033
1034 for (auto& response : responses) {
1035 ASSERT_FALSE(response->complete());
1036 }
1037
1038 proc_->SignalMultiple(2u); // One for "a:80", one for "b:80".
1039
1040 for (auto& response : responses) {
1041 EXPECT_THAT(response->result_error(), IsOk());
1042 }
1043}
1044
1045// TODO(crbug.com/1206799): Delete/adapt once requests with different ports are
1046// not deduped.
1047TEST_F(HostResolverManagerTest, DeDupeRequestsWithDifferentPorts) {
1048 // Start 5 requests, duplicating hosts "a" and "b". Since the resolver_proc is
1049 // blocked, these should all pile up until we signal it.
1050 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
1051 responses.emplace_back(
1052 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1053 HostPortPair("a", 80), NetworkIsolationKey(), NetLogWithSource(),
1054 absl::nullopt, resolve_context_.get(),
1055 resolve_context_->host_cache())));
1056 responses.emplace_back(
1057 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1058 HostPortPair("b", 80), NetworkIsolationKey(), NetLogWithSource(),
1059 absl::nullopt, resolve_context_.get(),
1060 resolve_context_->host_cache())));
1061 responses.emplace_back(
1062 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551063 HostPortPair("b", 81), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:521064 absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:501065 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151066 responses.emplace_back(
1067 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551068 HostPortPair("a", 82), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:521069 absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:501070 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151071 responses.emplace_back(
1072 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551073 HostPortPair("b", 83), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:521074 absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:501075 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:001076
1077 for (auto& response : responses) {
1078 ASSERT_FALSE(response->complete());
1079 }
1080
1081 proc_->SignalMultiple(2u); // One for "a", one for "b".
1082
1083 for (auto& response : responses) {
1084 EXPECT_THAT(response->result_error(), IsOk());
1085 }
1086}
1087
Eric Orth960e7062019-03-08 18:43:541088TEST_F(HostResolverManagerTest, CancelMultipleRequests) {
Eric Orth70992982018-07-24 00:25:001089 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:151090 responses.emplace_back(
1091 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551092 HostPortPair("a", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:521093 absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:501094 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151095 responses.emplace_back(
1096 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551097 HostPortPair("b", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:521098 absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:501099 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151100 responses.emplace_back(
1101 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Eric Orthc4cca5d2021-07-02 19:59:011102 HostPortPair("b", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:521103 absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:501104 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151105 responses.emplace_back(
1106 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Eric Orthc4cca5d2021-07-02 19:59:011107 HostPortPair("a", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:521108 absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:501109 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151110 responses.emplace_back(
1111 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Eric Orthc4cca5d2021-07-02 19:59:011112 HostPortPair("b", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:521113 absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:501114 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:001115
1116 for (auto& response : responses) {
1117 ASSERT_FALSE(response->complete());
1118 }
1119
Eric Orthc4cca5d2021-07-02 19:59:011120 // Cancel everything except request for requests[3] ("a", 80).
Eric Orth70992982018-07-24 00:25:001121 responses[0]->CancelRequest();
1122 responses[1]->CancelRequest();
1123 responses[2]->CancelRequest();
1124 responses[4]->CancelRequest();
1125
1126 proc_->SignalMultiple(2u); // One for "a", one for "b".
1127
1128 EXPECT_THAT(responses[3]->result_error(), IsOk());
1129
1130 EXPECT_FALSE(responses[0]->complete());
1131 EXPECT_FALSE(responses[1]->complete());
1132 EXPECT_FALSE(responses[2]->complete());
1133 EXPECT_FALSE(responses[4]->complete());
1134}
1135
Eric Orth960e7062019-03-08 18:43:541136TEST_F(HostResolverManagerTest, CanceledRequestsReleaseJobSlots) {
Eric Orth70992982018-07-24 00:25:001137 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
1138
1139 // Fill up the dispatcher and queue.
1140 for (unsigned i = 0; i < kMaxJobs + 1; ++i) {
1141 std::string hostname = "a_";
1142 hostname[1] = 'a' + i;
1143
Eric Orth117e1992019-04-17 00:24:151144 responses.emplace_back(
1145 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551146 HostPortPair(hostname, 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:521147 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:501148 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:001149 ASSERT_FALSE(responses.back()->complete());
1150
Eric Orth117e1992019-04-17 00:24:151151 responses.emplace_back(
1152 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Eric Orthc4cca5d2021-07-02 19:59:011153 HostPortPair(hostname, 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:521154 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:501155 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:001156 ASSERT_FALSE(responses.back()->complete());
1157 }
1158
1159 ASSERT_TRUE(proc_->WaitFor(kMaxJobs));
1160
1161 // Cancel all but last two.
1162 for (unsigned i = 0; i < responses.size() - 2; ++i) {
1163 responses[i]->CancelRequest();
1164 }
1165
1166 ASSERT_TRUE(proc_->WaitFor(kMaxJobs + 1));
1167
1168 proc_->SignalAll();
1169
1170 size_t num_requests = responses.size();
1171 EXPECT_THAT(responses[num_requests - 1]->result_error(), IsOk());
1172 EXPECT_THAT(responses[num_requests - 2]->result_error(), IsOk());
1173 for (unsigned i = 0; i < num_requests - 2; ++i) {
1174 EXPECT_FALSE(responses[i]->complete());
1175 }
1176}
1177
Eric Orth960e7062019-03-08 18:43:541178TEST_F(HostResolverManagerTest, CancelWithinCallback) {
Eric Orth70992982018-07-24 00:25:001179 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
1180 auto custom_callback = base::BindLambdaForTesting(
1181 [&](CompletionOnceCallback completion_callback, int error) {
1182 for (auto& response : responses) {
1183 // Cancelling request is required to complete first, so that it can
1184 // attempt to cancel the others. This test assumes all jobs are
1185 // completed in order.
1186 DCHECK(!response->complete());
1187
1188 response->CancelRequest();
1189 }
1190 std::move(completion_callback).Run(error);
1191 });
1192
1193 ResolveHostResponseHelper cancelling_response(
Matt Menkef4023312019-11-01 18:24:551194 resolver_->CreateRequest(HostPortPair("a", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:521195 NetLogWithSource(), absl::nullopt,
Eric Orthaf82b49a2020-02-01 01:48:501196 resolve_context_.get(),
1197 resolve_context_->host_cache()),
Eric Orth70992982018-07-24 00:25:001198 std::move(custom_callback));
1199
Eric Orth117e1992019-04-17 00:24:151200 responses.emplace_back(
1201 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Eric Orthc4cca5d2021-07-02 19:59:011202 HostPortPair("a", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:521203 absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:501204 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151205 responses.emplace_back(
1206 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Eric Orthc4cca5d2021-07-02 19:59:011207 HostPortPair("a", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:521208 absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:501209 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:001210
1211 proc_->SignalMultiple(2u); // One for "a". One for "finalrequest".
1212
1213 EXPECT_THAT(cancelling_response.result_error(), IsOk());
1214
1215 ResolveHostResponseHelper final_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551216 HostPortPair("finalrequest", 70), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:521217 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:501218 resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:001219 EXPECT_THAT(final_response.result_error(), IsOk());
1220
1221 for (auto& response : responses) {
1222 EXPECT_FALSE(response->complete());
1223 }
1224}
1225
Eric Orth960e7062019-03-08 18:43:541226TEST_F(HostResolverManagerTest, DeleteWithinCallback) {
Eric Orth70992982018-07-24 00:25:001227 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
1228 auto custom_callback = base::BindLambdaForTesting(
1229 [&](CompletionOnceCallback completion_callback, int error) {
1230 for (auto& response : responses) {
1231 // Deleting request is required to be first, so the other requests
1232 // will still be running to be deleted. This test assumes that the
1233 // Jobs will be Aborted in order and the requests in order within the
1234 // jobs.
1235 DCHECK(!response->complete());
1236 }
1237
Eric Orth37b18192019-04-22 19:09:281238 DestroyResolver();
Eric Orth70992982018-07-24 00:25:001239 std::move(completion_callback).Run(error);
1240 });
1241
1242 ResolveHostResponseHelper deleting_response(
Matt Menkef4023312019-11-01 18:24:551243 resolver_->CreateRequest(HostPortPair("a", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:521244 NetLogWithSource(), absl::nullopt,
Eric Orthaf82b49a2020-02-01 01:48:501245 resolve_context_.get(),
1246 resolve_context_->host_cache()),
Eric Orth70992982018-07-24 00:25:001247 std::move(custom_callback));
1248
1249 // Start additional requests to be cancelled as part of the first's deletion.
1250 // Assumes all requests for a job are handled in order so that the deleting
1251 // request will run first and cancel the rest.
Eric Orth117e1992019-04-17 00:24:151252 responses.emplace_back(
1253 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551254 HostPortPair("a", 81), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:521255 absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:501256 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151257 responses.emplace_back(
1258 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551259 HostPortPair("a", 82), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:521260 absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:501261 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:001262
1263 proc_->SignalMultiple(3u);
1264
1265 EXPECT_THAT(deleting_response.result_error(), IsOk());
1266
1267 base::RunLoop().RunUntilIdle();
1268 for (auto& response : responses) {
1269 EXPECT_FALSE(response->complete());
1270 }
1271}
1272
Francois Doray4a0a6f12019-08-19 15:25:221273TEST_F(HostResolverManagerTest, DeleteWithinAbortedCallback) {
Eric Orth70992982018-07-24 00:25:001274 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
1275 ResolveHostResponseHelper::Callback custom_callback =
1276 base::BindLambdaForTesting(
1277 [&](CompletionOnceCallback completion_callback, int error) {
1278 for (auto& response : responses) {
1279 // Deleting request is required to be first, so the other requests
1280 // will still be running to be deleted. This test assumes that the
1281 // Jobs will be Aborted in order and the requests in order within
1282 // the jobs.
1283 DCHECK(!response->complete());
1284 }
Eric Orth37b18192019-04-22 19:09:281285 DestroyResolver();
Eric Orth70992982018-07-24 00:25:001286 std::move(completion_callback).Run(error);
1287 });
1288
1289 ResolveHostResponseHelper deleting_response(
Matt Menkef4023312019-11-01 18:24:551290 resolver_->CreateRequest(HostPortPair("a", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:521291 NetLogWithSource(), absl::nullopt,
Eric Orthaf82b49a2020-02-01 01:48:501292 resolve_context_.get(),
1293 resolve_context_->host_cache()),
Eric Orth70992982018-07-24 00:25:001294 std::move(custom_callback));
1295
Eric Orth117e1992019-04-17 00:24:151296 responses.emplace_back(
1297 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Eric Orthc4cca5d2021-07-02 19:59:011298 HostPortPair("a", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:521299 absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:501300 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151301 responses.emplace_back(
1302 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551303 HostPortPair("b", 82), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:521304 absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:501305 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151306 responses.emplace_back(
1307 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Eric Orthc4cca5d2021-07-02 19:59:011308 HostPortPair("b", 82), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:521309 absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:501310 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:001311
1312 // Wait for all calls to queue up, trigger abort via IP address change, then
1313 // signal all the queued requests to let them all try to finish.
1314 EXPECT_TRUE(proc_->WaitFor(2u));
Paul Jensenf47bbab2018-09-14 16:34:041315 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
Eric Orth70992982018-07-24 00:25:001316 proc_->SignalAll();
1317
1318 EXPECT_THAT(deleting_response.result_error(), IsError(ERR_NETWORK_CHANGED));
1319 base::RunLoop().RunUntilIdle();
1320 for (auto& response : responses) {
1321 EXPECT_FALSE(response->complete());
1322 }
1323}
1324
Eric Orth960e7062019-03-08 18:43:541325TEST_F(HostResolverManagerTest, StartWithinCallback) {
Eric Orth70992982018-07-24 00:25:001326 std::unique_ptr<ResolveHostResponseHelper> new_response;
1327 auto custom_callback = base::BindLambdaForTesting(
1328 [&](CompletionOnceCallback completion_callback, int error) {
1329 new_response = std::make_unique<ResolveHostResponseHelper>(
Matt Menkef4023312019-11-01 18:24:551330 resolver_->CreateRequest(HostPortPair("new", 70),
1331 NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:521332 absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:501333 resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:001334 std::move(completion_callback).Run(error);
1335 });
1336
1337 ResolveHostResponseHelper starting_response(
Matt Menkef4023312019-11-01 18:24:551338 resolver_->CreateRequest(HostPortPair("a", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:521339 NetLogWithSource(), absl::nullopt,
Eric Orthaf82b49a2020-02-01 01:48:501340 resolve_context_.get(),
1341 resolve_context_->host_cache()),
Eric Orth70992982018-07-24 00:25:001342 std::move(custom_callback));
1343
1344 proc_->SignalMultiple(2u); // One for "a". One for "new".
1345
1346 EXPECT_THAT(starting_response.result_error(), IsOk());
1347 EXPECT_THAT(new_response->result_error(), IsOk());
1348}
1349
Eric Orth3bd9e512019-03-29 15:33:351350TEST_F(HostResolverManagerTest, StartWithinEvictionCallback) {
1351 CreateSerialResolver();
1352 resolver_->SetMaxQueuedJobsForTesting(2);
1353
1354 std::unique_ptr<ResolveHostResponseHelper> new_response;
1355 auto custom_callback = base::BindLambdaForTesting(
1356 [&](CompletionOnceCallback completion_callback, int error) {
1357 new_response = std::make_unique<ResolveHostResponseHelper>(
Matt Menkef4023312019-11-01 18:24:551358 resolver_->CreateRequest(HostPortPair("new", 70),
1359 NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:521360 absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:501361 resolve_context_->host_cache()));
Eric Orth3bd9e512019-03-29 15:33:351362 std::move(completion_callback).Run(error);
1363 });
1364
Eric Orth117e1992019-04-17 00:24:151365 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551366 HostPortPair("initial", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:521367 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth3bd9e512019-03-29 15:33:351368 ResolveHostResponseHelper evictee1_response(
Matt Menkef4023312019-11-01 18:24:551369 resolver_->CreateRequest(HostPortPair("evictee1", 80),
1370 NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:521371 absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:501372 resolve_context_->host_cache()),
Eric Orth3bd9e512019-03-29 15:33:351373 std::move(custom_callback));
Eric Orth117e1992019-04-17 00:24:151374 ResolveHostResponseHelper evictee2_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551375 HostPortPair("evictee2", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:521376 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth3bd9e512019-03-29 15:33:351377
1378 // Now one running request ("initial") and two queued requests ("evictee1" and
1379 // "evictee2"). Any further requests will cause evictions.
Eric Orth117e1992019-04-17 00:24:151380 ResolveHostResponseHelper evictor_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551381 HostPortPair("evictor", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:521382 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth3bd9e512019-03-29 15:33:351383 EXPECT_THAT(evictee1_response.result_error(),
1384 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
1385
1386 // "new" should evict "evictee2"
1387 EXPECT_THAT(evictee2_response.result_error(),
1388 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
1389
1390 proc_->SignalMultiple(3u);
1391
1392 EXPECT_THAT(initial_response.result_error(), IsOk());
1393 EXPECT_THAT(evictor_response.result_error(), IsOk());
1394 EXPECT_THAT(new_response->result_error(), IsOk());
1395}
1396
1397// Test where we start a new request within an eviction callback that itself
1398// evicts the first evictor.
1399TEST_F(HostResolverManagerTest, StartWithinEvictionCallback_DoubleEviction) {
1400 CreateSerialResolver();
1401 resolver_->SetMaxQueuedJobsForTesting(1);
1402
1403 std::unique_ptr<ResolveHostResponseHelper> new_response;
1404 auto custom_callback = base::BindLambdaForTesting(
1405 [&](CompletionOnceCallback completion_callback, int error) {
1406 new_response = std::make_unique<ResolveHostResponseHelper>(
Matt Menkef4023312019-11-01 18:24:551407 resolver_->CreateRequest(HostPortPair("new", 70),
1408 NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:521409 absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:501410 resolve_context_->host_cache()));
Eric Orth3bd9e512019-03-29 15:33:351411 std::move(completion_callback).Run(error);
1412 });
1413
Eric Orth117e1992019-04-17 00:24:151414 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551415 HostPortPair("initial", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:521416 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth3bd9e512019-03-29 15:33:351417 ResolveHostResponseHelper evictee_response(
Matt Menkef4023312019-11-01 18:24:551418 resolver_->CreateRequest(HostPortPair("evictee", 80),
1419 NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:521420 absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:501421 resolve_context_->host_cache()),
Eric Orth3bd9e512019-03-29 15:33:351422 std::move(custom_callback));
1423
1424 // Now one running request ("initial") and one queued requests ("evictee").
1425 // Any further requests will cause evictions.
Eric Orth117e1992019-04-17 00:24:151426 ResolveHostResponseHelper evictor_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551427 HostPortPair("evictor", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:521428 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth3bd9e512019-03-29 15:33:351429 EXPECT_THAT(evictee_response.result_error(),
1430 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
1431
1432 // "new" should evict "evictor"
1433 EXPECT_THAT(evictor_response.result_error(),
1434 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
1435
1436 proc_->SignalMultiple(2u);
1437
1438 EXPECT_THAT(initial_response.result_error(), IsOk());
1439 EXPECT_THAT(new_response->result_error(), IsOk());
1440}
1441
1442TEST_F(HostResolverManagerTest, StartWithinEvictionCallback_SameRequest) {
1443 CreateSerialResolver();
1444 resolver_->SetMaxQueuedJobsForTesting(2);
1445
1446 std::unique_ptr<ResolveHostResponseHelper> new_response;
1447 auto custom_callback = base::BindLambdaForTesting(
1448 [&](CompletionOnceCallback completion_callback, int error) {
1449 new_response = std::make_unique<ResolveHostResponseHelper>(
Eric Orthc4cca5d2021-07-02 19:59:011450 resolver_->CreateRequest(HostPortPair("evictor", 80),
Matt Menkef4023312019-11-01 18:24:551451 NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:521452 absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:501453 resolve_context_->host_cache()));
Eric Orth3bd9e512019-03-29 15:33:351454 std::move(completion_callback).Run(error);
1455 });
1456
Eric Orth117e1992019-04-17 00:24:151457 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551458 HostPortPair("initial", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:521459 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth3bd9e512019-03-29 15:33:351460 ResolveHostResponseHelper evictee_response(
Matt Menkef4023312019-11-01 18:24:551461 resolver_->CreateRequest(HostPortPair("evictee", 80),
1462 NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:521463 absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:501464 resolve_context_->host_cache()),
Eric Orth3bd9e512019-03-29 15:33:351465 std::move(custom_callback));
1466 ResolveHostResponseHelper additional_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551467 HostPortPair("additional", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:521468 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth3bd9e512019-03-29 15:33:351469
1470 // Now one running request ("initial") and two queued requests ("evictee" and
1471 // "additional"). Any further requests will cause evictions.
Eric Orth117e1992019-04-17 00:24:151472 ResolveHostResponseHelper evictor_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551473 HostPortPair("evictor", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:521474 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth3bd9e512019-03-29 15:33:351475 EXPECT_THAT(evictee_response.result_error(),
1476 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
1477
1478 // Second "evictor" should be joined with the first and not evict "additional"
1479
1480 // Only 3 proc requests because both "evictor" requests are combined.
1481 proc_->SignalMultiple(3u);
1482
1483 EXPECT_THAT(initial_response.result_error(), IsOk());
1484 EXPECT_THAT(additional_response.result_error(), IsOk());
1485 EXPECT_THAT(evictor_response.result_error(), IsOk());
1486 EXPECT_THAT(new_response->result_error(), IsOk());
1487}
1488
Eric Orth960e7062019-03-08 18:43:541489TEST_F(HostResolverManagerTest, BypassCache) {
Eric Orthdc35748e2018-08-23 22:41:481490 proc_->SignalMultiple(2u);
1491
Eric Orth117e1992019-04-17 00:24:151492 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551493 HostPortPair("a", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:521494 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthdc35748e2018-08-23 22:41:481495 EXPECT_THAT(initial_response.result_error(), IsOk());
1496 EXPECT_EQ(1u, proc_->GetCaptureList().size());
1497
Eric Orth117e1992019-04-17 00:24:151498 ResolveHostResponseHelper cached_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551499 HostPortPair("a", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:521500 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthdc35748e2018-08-23 22:41:481501 EXPECT_THAT(cached_response.result_error(), IsOk());
1502 // Expect no increase to calls to |proc_| because result was cached.
1503 EXPECT_EQ(1u, proc_->GetCaptureList().size());
1504
1505 HostResolver::ResolveHostParameters parameters;
Eric Ortheb332862019-01-26 00:52:381506 parameters.cache_usage =
1507 HostResolver::ResolveHostParameters::CacheUsage::DISALLOWED;
Eric Orth117e1992019-04-17 00:24:151508 ResolveHostResponseHelper cache_bypassed_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551509 HostPortPair("a", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501510 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthdc35748e2018-08-23 22:41:481511 EXPECT_THAT(cache_bypassed_response.result_error(), IsOk());
1512 // Expect call to |proc_| because cache was bypassed.
1513 EXPECT_EQ(2u, proc_->GetCaptureList().size());
1514}
1515
Paul Jensenf47bbab2018-09-14 16:34:041516// Test that IP address changes flush the cache but initial DNS config reads
Eric Orth70992982018-07-24 00:25:001517// do not.
Eric Orth960e7062019-03-08 18:43:541518TEST_F(HostResolverManagerTest, FlushCacheOnIPAddressChange) {
Eric Orth70992982018-07-24 00:25:001519 proc_->SignalMultiple(2u); // One before the flush, one after.
1520
Eric Orth117e1992019-04-17 00:24:151521 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551522 HostPortPair("host1", 70), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:521523 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:001524 EXPECT_THAT(initial_response.result_error(), IsOk());
1525 EXPECT_EQ(1u, proc_->GetCaptureList().size());
1526
Eric Orth117e1992019-04-17 00:24:151527 ResolveHostResponseHelper cached_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551528 HostPortPair("host1", 75), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:521529 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:001530 EXPECT_THAT(cached_response.result_error(), IsOk());
1531 EXPECT_EQ(1u, proc_->GetCaptureList().size()); // No expected increase.
1532
Paul Jensenf47bbab2018-09-14 16:34:041533 // Flush cache by triggering an IP address change.
1534 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
Eric Orth70992982018-07-24 00:25:001535 base::RunLoop().RunUntilIdle(); // Notification happens async.
1536
1537 // Resolve "host1" again -- this time it won't be served from cache, so it
1538 // will complete asynchronously.
Eric Orth117e1992019-04-17 00:24:151539 ResolveHostResponseHelper flushed_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551540 HostPortPair("host1", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:521541 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:001542 EXPECT_THAT(flushed_response.result_error(), IsOk());
1543 EXPECT_EQ(2u, proc_->GetCaptureList().size()); // Expected increase.
1544}
1545
Paul Jensenf47bbab2018-09-14 16:34:041546// Test that IP address changes send ERR_NETWORK_CHANGED to pending requests.
Eric Orth960e7062019-03-08 18:43:541547TEST_F(HostResolverManagerTest, AbortOnIPAddressChanged) {
Eric Orth117e1992019-04-17 00:24:151548 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551549 HostPortPair("host1", 70), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:521550 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:001551
1552 ASSERT_FALSE(response.complete());
1553 ASSERT_TRUE(proc_->WaitFor(1u));
1554
Paul Jensenf47bbab2018-09-14 16:34:041555 // Triggering an IP address change.
1556 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
Eric Orth70992982018-07-24 00:25:001557 base::RunLoop().RunUntilIdle(); // Notification happens async.
1558 proc_->SignalAll();
1559
1560 EXPECT_THAT(response.result_error(), IsError(ERR_NETWORK_CHANGED));
1561 EXPECT_FALSE(response.request()->GetAddressResults());
Eric Orthaf82b49a2020-02-01 01:48:501562 EXPECT_EQ(0u, resolve_context_->host_cache()->size());
Eric Orth70992982018-07-24 00:25:001563}
1564
Paul Jensenf47bbab2018-09-14 16:34:041565// Obey pool constraints after IP address has changed.
Eric Orth960e7062019-03-08 18:43:541566TEST_F(HostResolverManagerTest, ObeyPoolConstraintsAfterIPAddressChange) {
[email protected]38b50d92012-04-19 21:07:521567 // Runs at most one job at a time.
1568 CreateSerialResolver();
Eric Orth70992982018-07-24 00:25:001569
1570 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:151571 responses.emplace_back(
1572 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551573 HostPortPair("a", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:521574 absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:501575 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151576 responses.emplace_back(
1577 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551578 HostPortPair("b", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:521579 absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:501580 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151581 responses.emplace_back(
1582 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551583 HostPortPair("c", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:521584 absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:501585 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:001586
1587 for (auto& response : responses) {
1588 ASSERT_FALSE(response->complete());
1589 }
1590 ASSERT_TRUE(proc_->WaitFor(1u));
1591
Paul Jensenf47bbab2018-09-14 16:34:041592 // Triggering an IP address change.
1593 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
Eric Orth70992982018-07-24 00:25:001594 base::RunLoop().RunUntilIdle(); // Notification happens async.
1595 proc_->SignalMultiple(3u); // Let the false-start go so that we can catch it.
1596
1597 // Requests should complete one at a time, with the first failing.
1598 EXPECT_THAT(responses[0]->result_error(), IsError(ERR_NETWORK_CHANGED));
1599 EXPECT_EQ(1u, num_running_dispatcher_jobs());
1600 EXPECT_FALSE(responses[1]->complete());
1601 EXPECT_FALSE(responses[2]->complete());
1602
1603 EXPECT_THAT(responses[1]->result_error(), IsOk());
1604 EXPECT_EQ(1u, num_running_dispatcher_jobs());
1605 EXPECT_FALSE(responses[2]->complete());
1606
1607 EXPECT_THAT(responses[2]->result_error(), IsOk());
1608}
1609
[email protected]b3601bc22012-02-21 21:23:201610// Tests that a new Request made from the callback of a previously aborted one
1611// will not be aborted.
Eric Orth960e7062019-03-08 18:43:541612TEST_F(HostResolverManagerTest, AbortOnlyExistingRequestsOnIPAddressChange) {
Eric Orth70992982018-07-24 00:25:001613 auto custom_callback_template = base::BindLambdaForTesting(
1614 [&](const HostPortPair& next_host,
1615 std::unique_ptr<ResolveHostResponseHelper>* next_response,
1616 CompletionOnceCallback completion_callback, int error) {
1617 *next_response = std::make_unique<ResolveHostResponseHelper>(
Eric Orthaf82b49a2020-02-01 01:48:501618 resolver_->CreateRequest(next_host, NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:521619 NetLogWithSource(), absl::nullopt,
Eric Orthaf82b49a2020-02-01 01:48:501620 resolve_context_.get(),
1621 resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:001622 std::move(completion_callback).Run(error);
1623 });
1624
1625 std::vector<std::unique_ptr<ResolveHostResponseHelper>> next_responses(3);
1626
1627 ResolveHostResponseHelper response0(
Matt Menkef4023312019-11-01 18:24:551628 resolver_->CreateRequest(HostPortPair("bbb", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:521629 NetLogWithSource(), absl::nullopt,
Eric Orthaf82b49a2020-02-01 01:48:501630 resolve_context_.get(),
1631 resolve_context_->host_cache()),
Eric Orth70992982018-07-24 00:25:001632 base::BindOnce(custom_callback_template, HostPortPair("zzz", 80),
1633 &next_responses[0]));
1634
1635 ResolveHostResponseHelper response1(
Matt Menkef4023312019-11-01 18:24:551636 resolver_->CreateRequest(HostPortPair("eee", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:521637 NetLogWithSource(), absl::nullopt,
Eric Orthaf82b49a2020-02-01 01:48:501638 resolve_context_.get(),
1639 resolve_context_->host_cache()),
Eric Orth70992982018-07-24 00:25:001640 base::BindOnce(custom_callback_template, HostPortPair("aaa", 80),
1641 &next_responses[1]));
1642
1643 ResolveHostResponseHelper response2(
Matt Menkef4023312019-11-01 18:24:551644 resolver_->CreateRequest(HostPortPair("ccc", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:521645 NetLogWithSource(), absl::nullopt,
Eric Orthaf82b49a2020-02-01 01:48:501646 resolve_context_.get(),
1647 resolve_context_->host_cache()),
Eric Orth70992982018-07-24 00:25:001648 base::BindOnce(custom_callback_template, HostPortPair("eee", 80),
1649 &next_responses[2]));
1650
1651 // Wait until all are blocked;
1652 ASSERT_TRUE(proc_->WaitFor(3u));
Paul Jensenf47bbab2018-09-14 16:34:041653 // Trigger an IP address change.
1654 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
Eric Orth70992982018-07-24 00:25:001655 // This should abort all running jobs.
1656 base::RunLoop().RunUntilIdle();
1657
1658 EXPECT_THAT(response0.result_error(), IsError(ERR_NETWORK_CHANGED));
1659 EXPECT_THAT(response1.result_error(), IsError(ERR_NETWORK_CHANGED));
1660 EXPECT_THAT(response2.result_error(), IsError(ERR_NETWORK_CHANGED));
1661
1662 EXPECT_FALSE(next_responses[0]->complete());
1663 EXPECT_FALSE(next_responses[1]->complete());
1664 EXPECT_FALSE(next_responses[2]->complete());
1665
1666 // Unblock all calls to proc.
1667 proc_->SignalMultiple(6u);
1668
1669 // Run until the re-started requests finish.
1670 EXPECT_THAT(next_responses[0]->result_error(), IsOk());
1671 EXPECT_THAT(next_responses[1]->result_error(), IsOk());
1672 EXPECT_THAT(next_responses[2]->result_error(), IsOk());
1673
1674 // Verify that results of aborted Jobs were not cached.
1675 EXPECT_EQ(6u, proc_->GetCaptureList().size());
Eric Orthaf82b49a2020-02-01 01:48:501676 EXPECT_EQ(3u, resolve_context_->host_cache()->size());
Eric Orth70992982018-07-24 00:25:001677}
1678
[email protected]68ad3ee2010-01-30 03:45:391679// Tests that when the maximum threads is set to 1, requests are dequeued
1680// in order of priority.
Eric Orth960e7062019-03-08 18:43:541681TEST_F(HostResolverManagerTest, HigherPriorityRequestsStartedFirst) {
[email protected]38b50d92012-04-19 21:07:521682 CreateSerialResolver();
[email protected]68ad3ee2010-01-30 03:45:391683
Eric Orth00fe5a62018-08-15 22:20:001684 HostResolver::ResolveHostParameters low_priority;
1685 low_priority.initial_priority = LOW;
1686 HostResolver::ResolveHostParameters medium_priority;
1687 medium_priority.initial_priority = MEDIUM;
1688 HostResolver::ResolveHostParameters highest_priority;
1689 highest_priority.initial_priority = HIGHEST;
1690
1691 // Note that at this point the MockHostResolverProc is blocked, so any
1692 // requests we make will not complete.
1693
1694 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:151695 responses.emplace_back(
1696 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551697 HostPortPair("req0", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501698 low_priority, resolve_context_.get(),
1699 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151700 responses.emplace_back(
1701 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551702 HostPortPair("req1", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501703 medium_priority, resolve_context_.get(),
1704 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151705 responses.emplace_back(
1706 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551707 HostPortPair("req2", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501708 medium_priority, resolve_context_.get(),
1709 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151710 responses.emplace_back(
1711 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551712 HostPortPair("req3", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501713 low_priority, resolve_context_.get(),
1714 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151715 responses.emplace_back(
1716 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551717 HostPortPair("req4", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501718 highest_priority, resolve_context_.get(),
1719 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151720 responses.emplace_back(
1721 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551722 HostPortPair("req5", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501723 low_priority, resolve_context_.get(),
1724 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151725 responses.emplace_back(
1726 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551727 HostPortPair("req6", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501728 low_priority, resolve_context_.get(),
1729 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151730 responses.emplace_back(
1731 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551732 HostPortPair("req5", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501733 highest_priority, resolve_context_.get(),
1734 resolve_context_->host_cache())));
Eric Orth00fe5a62018-08-15 22:20:001735
1736 for (const auto& response : responses) {
1737 ASSERT_FALSE(response->complete());
1738 }
1739
1740 // Unblock the resolver thread so the requests can run.
1741 proc_->SignalMultiple(responses.size()); // More than needed.
1742
1743 // Wait for all the requests to complete successfully.
1744 for (auto& response : responses) {
1745 EXPECT_THAT(response->result_error(), IsOk());
1746 }
1747
1748 // Since we have restricted to a single concurrent thread in the jobpool,
1749 // the requests should complete in order of priority (with the exception
1750 // of the first request, which gets started right away, since there is
1751 // nothing outstanding).
1752 MockHostResolverProc::CaptureList capture_list = proc_->GetCaptureList();
1753 ASSERT_EQ(7u, capture_list.size());
1754
1755 EXPECT_EQ("req0", capture_list[0].hostname);
1756 EXPECT_EQ("req4", capture_list[1].hostname);
1757 EXPECT_EQ("req5", capture_list[2].hostname);
1758 EXPECT_EQ("req1", capture_list[3].hostname);
1759 EXPECT_EQ("req2", capture_list[4].hostname);
1760 EXPECT_EQ("req3", capture_list[5].hostname);
1761 EXPECT_EQ("req6", capture_list[6].hostname);
1762}
1763
juliatuttlec53b19a72016-05-05 13:51:311764// Test that changing a job's priority affects the dequeueing order.
Eric Orth960e7062019-03-08 18:43:541765TEST_F(HostResolverManagerTest, ChangePriority) {
juliatuttlec53b19a72016-05-05 13:51:311766 CreateSerialResolver();
1767
Eric Orth26fa08e2019-02-22 01:28:371768 HostResolver::ResolveHostParameters lowest_priority;
1769 lowest_priority.initial_priority = LOWEST;
1770 HostResolver::ResolveHostParameters low_priority;
1771 low_priority.initial_priority = LOW;
1772 HostResolver::ResolveHostParameters medium_priority;
1773 medium_priority.initial_priority = MEDIUM;
juliatuttlec53b19a72016-05-05 13:51:311774
Eric Orth26fa08e2019-02-22 01:28:371775 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:151776 responses.emplace_back(
1777 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551778 HostPortPair("req0", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501779 medium_priority, resolve_context_.get(),
1780 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151781 responses.emplace_back(
1782 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551783 HostPortPair("req1", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501784 low_priority, resolve_context_.get(),
1785 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151786 responses.emplace_back(
1787 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551788 HostPortPair("req2", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501789 lowest_priority, resolve_context_.get(),
1790 resolve_context_->host_cache())));
juliatuttlec53b19a72016-05-05 13:51:311791
1792 // req0 starts immediately; without ChangePriority, req1 and then req2 should
1793 // run.
Eric Orth26fa08e2019-02-22 01:28:371794 for (const auto& response : responses) {
1795 ASSERT_FALSE(response->complete());
1796 }
juliatuttlec53b19a72016-05-05 13:51:311797
Eric Orth26fa08e2019-02-22 01:28:371798 // Changing req2 to HIGHEST should make it run before req1.
juliatuttlec53b19a72016-05-05 13:51:311799 // (It can't run before req0, since req0 started immediately.)
Eric Orth26fa08e2019-02-22 01:28:371800 responses[2]->request()->ChangeRequestPriority(HIGHEST);
juliatuttlec53b19a72016-05-05 13:51:311801
1802 // Let all 3 requests finish.
1803 proc_->SignalMultiple(3u);
1804
Eric Orth26fa08e2019-02-22 01:28:371805 for (auto& response : responses) {
1806 EXPECT_THAT(response->result_error(), IsOk());
1807 }
juliatuttlec53b19a72016-05-05 13:51:311808
1809 MockHostResolverProc::CaptureList capture_list = proc_->GetCaptureList();
1810 ASSERT_EQ(3u, capture_list.size());
1811
1812 EXPECT_EQ("req0", capture_list[0].hostname);
1813 EXPECT_EQ("req2", capture_list[1].hostname);
1814 EXPECT_EQ("req1", capture_list[2].hostname);
1815}
1816
[email protected]38b50d92012-04-19 21:07:521817// Try cancelling a job which has not started yet.
Eric Orth960e7062019-03-08 18:43:541818TEST_F(HostResolverManagerTest, CancelPendingRequest) {
[email protected]38b50d92012-04-19 21:07:521819 CreateSerialResolver();
[email protected]68ad3ee2010-01-30 03:45:391820
Eric Orth00fe5a62018-08-15 22:20:001821 HostResolver::ResolveHostParameters lowest_priority;
1822 lowest_priority.initial_priority = LOWEST;
1823 HostResolver::ResolveHostParameters low_priority;
1824 low_priority.initial_priority = LOW;
1825 HostResolver::ResolveHostParameters medium_priority;
1826 medium_priority.initial_priority = MEDIUM;
1827 HostResolver::ResolveHostParameters highest_priority;
1828 highest_priority.initial_priority = HIGHEST;
1829
Eric Orth70992982018-07-24 00:25:001830 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:151831 responses.emplace_back(
1832 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551833 HostPortPair("req0", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501834 lowest_priority, resolve_context_.get(),
1835 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151836 responses.emplace_back(
1837 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551838 HostPortPair("req1", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501839 highest_priority, resolve_context_.get(),
1840 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151841 responses.emplace_back(
1842 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551843 HostPortPair("req2", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501844 medium_priority, resolve_context_.get(),
1845 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151846 responses.emplace_back(
1847 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551848 HostPortPair("req3", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501849 low_priority, resolve_context_.get(),
1850 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151851 responses.emplace_back(
1852 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551853 HostPortPair("req4", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501854 highest_priority, resolve_context_.get(),
1855 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151856 responses.emplace_back(
1857 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551858 HostPortPair("req5", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501859 lowest_priority, resolve_context_.get(),
1860 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151861 responses.emplace_back(
1862 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551863 HostPortPair("req6", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501864 medium_priority, resolve_context_.get(),
1865 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:001866
1867 // Cancel some requests
1868 responses[1]->CancelRequest();
1869 responses[4]->CancelRequest();
1870 responses[5]->CancelRequest();
1871
1872 // Unblock the resolver thread so the requests can run.
1873 proc_->SignalMultiple(responses.size()); // More than needed.
1874
1875 // Let everything try to finish.
1876 base::RunLoop().RunUntilIdle();
1877
1878 // Wait for all the requests to complete succesfully.
1879 EXPECT_THAT(responses[0]->result_error(), IsOk());
1880 EXPECT_THAT(responses[2]->result_error(), IsOk());
1881 EXPECT_THAT(responses[3]->result_error(), IsOk());
1882 EXPECT_THAT(responses[6]->result_error(), IsOk());
1883
1884 // Cancelled requests shouldn't complete.
1885 EXPECT_FALSE(responses[1]->complete());
1886 EXPECT_FALSE(responses[4]->complete());
1887 EXPECT_FALSE(responses[5]->complete());
1888
1889 // Verify that they called out the the resolver proc (which runs on the
1890 // resolver thread) in the expected order.
1891 MockHostResolverProc::CaptureList capture_list = proc_->GetCaptureList();
1892 ASSERT_EQ(4u, capture_list.size());
1893
1894 EXPECT_EQ("req0", capture_list[0].hostname);
1895 EXPECT_EQ("req2", capture_list[1].hostname);
Eric Orth00fe5a62018-08-15 22:20:001896 EXPECT_EQ("req6", capture_list[2].hostname);
1897 EXPECT_EQ("req3", capture_list[3].hostname);
Eric Orth70992982018-07-24 00:25:001898}
1899
[email protected]68ad3ee2010-01-30 03:45:391900// Test that when too many requests are enqueued, old ones start to be aborted.
Eric Orth960e7062019-03-08 18:43:541901TEST_F(HostResolverManagerTest, QueueOverflow) {
[email protected]38b50d92012-04-19 21:07:521902 CreateSerialResolver();
[email protected]68ad3ee2010-01-30 03:45:391903
[email protected]0f292de02012-02-01 22:28:201904 // Allow only 3 queued jobs.
1905 const size_t kMaxPendingJobs = 3u;
Eric Orth70992982018-07-24 00:25:001906 resolver_->SetMaxQueuedJobsForTesting(kMaxPendingJobs);
[email protected]68ad3ee2010-01-30 03:45:391907
Eric Orth00fe5a62018-08-15 22:20:001908 HostResolver::ResolveHostParameters lowest_priority;
1909 lowest_priority.initial_priority = LOWEST;
1910 HostResolver::ResolveHostParameters low_priority;
1911 low_priority.initial_priority = LOW;
1912 HostResolver::ResolveHostParameters medium_priority;
1913 medium_priority.initial_priority = MEDIUM;
1914 HostResolver::ResolveHostParameters highest_priority;
1915 highest_priority.initial_priority = HIGHEST;
1916
Eric Orth70992982018-07-24 00:25:001917 // Note that at this point the MockHostResolverProc is blocked, so any
1918 // requests we make will not complete.
1919
1920 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:151921 responses.emplace_back(
1922 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551923 HostPortPair("req0", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501924 lowest_priority, resolve_context_.get(),
1925 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151926 responses.emplace_back(
1927 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551928 HostPortPair("req1", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501929 highest_priority, resolve_context_.get(),
1930 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151931 responses.emplace_back(
1932 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551933 HostPortPair("req2", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501934 medium_priority, resolve_context_.get(),
1935 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151936 responses.emplace_back(
1937 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551938 HostPortPair("req3", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501939 medium_priority, resolve_context_.get(),
1940 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:001941
1942 // At this point, there are 3 enqueued jobs (and one "running" job).
1943 // Insertion of subsequent requests will cause evictions.
1944
Eric Orth117e1992019-04-17 00:24:151945 responses.emplace_back(
1946 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551947 HostPortPair("req4", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501948 low_priority, resolve_context_.get(),
1949 resolve_context_->host_cache())));
Eric Orth00fe5a62018-08-15 22:20:001950 EXPECT_THAT(responses[4]->result_error(),
1951 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE)); // Evicts self.
1952 EXPECT_FALSE(responses[4]->request()->GetAddressResults());
Eric Orth70992982018-07-24 00:25:001953
Eric Orth117e1992019-04-17 00:24:151954 responses.emplace_back(
1955 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551956 HostPortPair("req5", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501957 medium_priority, resolve_context_.get(),
1958 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:001959 EXPECT_THAT(responses[2]->result_error(),
1960 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
1961 EXPECT_FALSE(responses[2]->request()->GetAddressResults());
1962
Eric Orth117e1992019-04-17 00:24:151963 responses.emplace_back(
1964 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551965 HostPortPair("req6", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501966 highest_priority, resolve_context_.get(),
1967 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:001968 EXPECT_THAT(responses[3]->result_error(),
1969 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
1970 EXPECT_FALSE(responses[3]->request()->GetAddressResults());
1971
Eric Orth117e1992019-04-17 00:24:151972 responses.emplace_back(
1973 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551974 HostPortPair("req7", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501975 medium_priority, resolve_context_.get(),
1976 resolve_context_->host_cache())));
Eric Orth00fe5a62018-08-15 22:20:001977 EXPECT_THAT(responses[5]->result_error(),
Eric Orth70992982018-07-24 00:25:001978 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
Eric Orth00fe5a62018-08-15 22:20:001979 EXPECT_FALSE(responses[5]->request()->GetAddressResults());
Eric Orth70992982018-07-24 00:25:001980
1981 // Unblock the resolver thread so the requests can run.
1982 proc_->SignalMultiple(4u);
1983
1984 // The rest should succeed.
1985 EXPECT_THAT(responses[0]->result_error(), IsOk());
1986 EXPECT_TRUE(responses[0]->request()->GetAddressResults());
Eric Orth00fe5a62018-08-15 22:20:001987 EXPECT_THAT(responses[1]->result_error(), IsOk());
1988 EXPECT_TRUE(responses[1]->request()->GetAddressResults());
Eric Orth70992982018-07-24 00:25:001989 EXPECT_THAT(responses[6]->result_error(), IsOk());
1990 EXPECT_TRUE(responses[6]->request()->GetAddressResults());
1991 EXPECT_THAT(responses[7]->result_error(), IsOk());
1992 EXPECT_TRUE(responses[7]->request()->GetAddressResults());
1993
1994 // Verify that they called out the the resolver proc (which runs on the
1995 // resolver thread) in the expected order.
1996 MockHostResolverProc::CaptureList capture_list = proc_->GetCaptureList();
1997 ASSERT_EQ(4u, capture_list.size());
1998
1999 EXPECT_EQ("req0", capture_list[0].hostname);
Eric Orth00fe5a62018-08-15 22:20:002000 EXPECT_EQ("req1", capture_list[1].hostname);
Eric Orth70992982018-07-24 00:25:002001 EXPECT_EQ("req6", capture_list[2].hostname);
2002 EXPECT_EQ("req7", capture_list[3].hostname);
2003
2004 // Verify that the evicted (incomplete) requests were not cached.
Eric Orthaf82b49a2020-02-01 01:48:502005 EXPECT_EQ(4u, resolve_context_->host_cache()->size());
Eric Orth70992982018-07-24 00:25:002006
2007 for (size_t i = 0; i < responses.size(); ++i) {
2008 EXPECT_TRUE(responses[i]->complete()) << i;
2009 }
2010}
2011
2012// Tests that jobs can self-evict by setting the max queue to 0.
Eric Orth960e7062019-03-08 18:43:542013TEST_F(HostResolverManagerTest, QueueOverflow_SelfEvict) {
Eric Orth70992982018-07-24 00:25:002014 CreateSerialResolver();
2015 resolver_->SetMaxQueuedJobsForTesting(0);
2016
2017 // Note that at this point the MockHostResolverProc is blocked, so any
2018 // requests we make will not complete.
2019
Eric Orth117e1992019-04-17 00:24:152020 ResolveHostResponseHelper run_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552021 HostPortPair("run", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:522022 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:002023
Eric Orth117e1992019-04-17 00:24:152024 ResolveHostResponseHelper evict_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552025 HostPortPair("req1", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:522026 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:002027 EXPECT_THAT(evict_response.result_error(),
2028 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
2029 EXPECT_FALSE(evict_response.request()->GetAddressResults());
2030
2031 proc_->SignalMultiple(1u);
2032
2033 EXPECT_THAT(run_response.result_error(), IsOk());
2034 EXPECT_TRUE(run_response.request()->GetAddressResults());
2035}
2036
Eric Orth00fe5a62018-08-15 22:20:002037// Make sure that the dns query type parameter is respected when raw IPs are
2038// passed in.
Eric Orth960e7062019-03-08 18:43:542039TEST_F(HostResolverManagerTest, AddressFamilyWithRawIPs) {
Eric Orth00fe5a62018-08-15 22:20:002040 HostResolver::ResolveHostParameters v4_parameters;
Eric Orth192e3bb2018-11-14 19:30:322041 v4_parameters.dns_query_type = DnsQueryType::A;
Eric Orth00fe5a62018-08-15 22:20:002042
2043 HostResolver::ResolveHostParameters v6_parameters;
Eric Orth192e3bb2018-11-14 19:30:322044 v6_parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth00fe5a62018-08-15 22:20:002045
2046 ResolveHostResponseHelper v4_v4_request(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552047 HostPortPair("127.0.0.1", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:502048 v4_parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth00fe5a62018-08-15 22:20:002049 EXPECT_THAT(v4_v4_request.result_error(), IsOk());
2050 EXPECT_THAT(v4_v4_request.request()->GetAddressResults().value().endpoints(),
2051 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
2052
2053 ResolveHostResponseHelper v4_v6_request(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552054 HostPortPair("127.0.0.1", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:502055 v6_parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth00fe5a62018-08-15 22:20:002056 EXPECT_THAT(v4_v6_request.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
2057
2058 ResolveHostResponseHelper v4_unsp_request(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552059 HostPortPair("127.0.0.1", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:522060 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth00fe5a62018-08-15 22:20:002061 EXPECT_THAT(v4_unsp_request.result_error(), IsOk());
2062 EXPECT_THAT(
2063 v4_unsp_request.request()->GetAddressResults().value().endpoints(),
2064 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
2065
Eric Orth117e1992019-04-17 00:24:152066 ResolveHostResponseHelper v6_v4_request(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552067 HostPortPair("::1", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:502068 v4_parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth00fe5a62018-08-15 22:20:002069 EXPECT_THAT(v6_v4_request.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
2070
Eric Orth117e1992019-04-17 00:24:152071 ResolveHostResponseHelper v6_v6_request(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552072 HostPortPair("::1", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:502073 v6_parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth00fe5a62018-08-15 22:20:002074 EXPECT_THAT(v6_v6_request.result_error(), IsOk());
2075 EXPECT_THAT(v6_v6_request.request()->GetAddressResults().value().endpoints(),
2076 testing::ElementsAre(CreateExpected("::1", 80)));
2077
Eric Orth117e1992019-04-17 00:24:152078 ResolveHostResponseHelper v6_unsp_request(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552079 HostPortPair("::1", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:522080 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth00fe5a62018-08-15 22:20:002081 EXPECT_THAT(v6_unsp_request.result_error(), IsOk());
2082 EXPECT_THAT(
2083 v6_unsp_request.request()->GetAddressResults().value().endpoints(),
2084 testing::ElementsAre(CreateExpected("::1", 80)));
2085}
2086
Eric Orth960e7062019-03-08 18:43:542087TEST_F(HostResolverManagerTest, LocalOnly_FromCache) {
Eric Ortheb332862019-01-26 00:52:382088 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42");
2089 proc_->SignalMultiple(1u); // Need only one.
2090
2091 HostResolver::ResolveHostParameters source_none_parameters;
2092 source_none_parameters.source = HostResolverSource::LOCAL_ONLY;
2093
2094 // First NONE query expected to complete synchronously with a cache miss.
Eric Orth6f1c5172019-04-16 17:08:272095 ResolveHostResponseHelper cache_miss_request(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552096 HostPortPair("just.testing", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:242097 NetLogWithSource(), source_none_parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502098 resolve_context_->host_cache()));
Eric Ortheb332862019-01-26 00:52:382099 EXPECT_TRUE(cache_miss_request.complete());
2100 EXPECT_THAT(cache_miss_request.result_error(), IsError(ERR_DNS_CACHE_MISS));
2101 EXPECT_FALSE(cache_miss_request.request()->GetAddressResults());
2102 EXPECT_FALSE(cache_miss_request.request()->GetStaleInfo());
2103
2104 // Normal query to populate the cache.
2105 ResolveHostResponseHelper normal_request(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552106 HostPortPair("just.testing", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:522107 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502108 resolve_context_->host_cache()));
Eric Ortheb332862019-01-26 00:52:382109 EXPECT_THAT(normal_request.result_error(), IsOk());
2110 EXPECT_FALSE(normal_request.request()->GetStaleInfo());
2111
2112 // Second NONE query expected to complete synchronously with cache hit.
Eric Orth6f1c5172019-04-16 17:08:272113 ResolveHostResponseHelper cache_hit_request(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552114 HostPortPair("just.testing", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:242115 NetLogWithSource(), source_none_parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502116 resolve_context_->host_cache()));
Eric Ortheb332862019-01-26 00:52:382117 EXPECT_TRUE(cache_hit_request.complete());
2118 EXPECT_THAT(cache_hit_request.result_error(), IsOk());
2119 EXPECT_THAT(
2120 cache_hit_request.request()->GetAddressResults().value().endpoints(),
2121 testing::ElementsAre(CreateExpected("192.168.1.42", 80)));
2122 EXPECT_FALSE(cache_hit_request.request()->GetStaleInfo().value().is_stale());
2123}
2124
Eric Orth960e7062019-03-08 18:43:542125TEST_F(HostResolverManagerTest, LocalOnly_StaleEntry) {
Eric Ortheb332862019-01-26 00:52:382126 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42");
2127 proc_->SignalMultiple(1u); // Need only one.
2128
2129 HostResolver::ResolveHostParameters source_none_parameters;
2130 source_none_parameters.source = HostResolverSource::LOCAL_ONLY;
2131
2132 // First NONE query expected to complete synchronously with a cache miss.
Eric Orth6f1c5172019-04-16 17:08:272133 ResolveHostResponseHelper cache_miss_request(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552134 HostPortPair("just.testing", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:242135 NetLogWithSource(), source_none_parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502136 resolve_context_->host_cache()));
Eric Ortheb332862019-01-26 00:52:382137 EXPECT_TRUE(cache_miss_request.complete());
2138 EXPECT_THAT(cache_miss_request.result_error(), IsError(ERR_DNS_CACHE_MISS));
2139 EXPECT_FALSE(cache_miss_request.request()->GetAddressResults());
2140 EXPECT_FALSE(cache_miss_request.request()->GetStaleInfo());
2141
2142 // Normal query to populate the cache.
2143 ResolveHostResponseHelper normal_request(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552144 HostPortPair("just.testing", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:522145 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502146 resolve_context_->host_cache()));
Eric Ortheb332862019-01-26 00:52:382147 EXPECT_THAT(normal_request.result_error(), IsOk());
2148 EXPECT_FALSE(normal_request.request()->GetStaleInfo());
2149
2150 MakeCacheStale();
2151
2152 // Second NONE query still expected to complete synchronously with cache miss.
Eric Orth6f1c5172019-04-16 17:08:272153 ResolveHostResponseHelper stale_request(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552154 HostPortPair("just.testing", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:242155 NetLogWithSource(), source_none_parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502156 resolve_context_->host_cache()));
Eric Ortheb332862019-01-26 00:52:382157 EXPECT_TRUE(stale_request.complete());
2158 EXPECT_THAT(stale_request.result_error(), IsError(ERR_DNS_CACHE_MISS));
2159 EXPECT_FALSE(stale_request.request()->GetAddressResults());
2160 EXPECT_FALSE(stale_request.request()->GetStaleInfo());
2161}
2162
Eric Orth960e7062019-03-08 18:43:542163TEST_F(HostResolverManagerTest, LocalOnly_FromIp) {
Eric Ortheb332862019-01-26 00:52:382164 HostResolver::ResolveHostParameters source_none_parameters;
2165 source_none_parameters.source = HostResolverSource::LOCAL_ONLY;
2166
Eric Orth117e1992019-04-17 00:24:152167 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552168 HostPortPair("1.2.3.4", 56), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:502169 source_none_parameters, resolve_context_.get(),
2170 resolve_context_->host_cache()));
Eric Ortheb332862019-01-26 00:52:382171
2172 // Expected to resolve synchronously.
2173 EXPECT_TRUE(response.complete());
2174 EXPECT_THAT(response.result_error(), IsOk());
2175 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
2176 testing::ElementsAre(CreateExpected("1.2.3.4", 56)));
2177 EXPECT_FALSE(response.request()->GetStaleInfo());
2178}
2179
Eric Orth960e7062019-03-08 18:43:542180TEST_F(HostResolverManagerTest, LocalOnly_InvalidName) {
Eric Ortheb332862019-01-26 00:52:382181 proc_->AddRuleForAllFamilies("foo,bar.com", "192.168.1.42");
2182
2183 HostResolver::ResolveHostParameters source_none_parameters;
2184 source_none_parameters.source = HostResolverSource::LOCAL_ONLY;
2185
Eric Orth6f1c5172019-04-16 17:08:272186 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552187 HostPortPair("foo,bar.com", 57), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:242188 NetLogWithSource(), source_none_parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502189 resolve_context_->host_cache()));
Eric Ortheb332862019-01-26 00:52:382190
2191 // Expected to fail synchronously.
2192 EXPECT_TRUE(response.complete());
2193 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
2194 EXPECT_FALSE(response.request()->GetAddressResults());
2195 EXPECT_FALSE(response.request()->GetStaleInfo());
2196}
2197
Eric Orth960e7062019-03-08 18:43:542198TEST_F(HostResolverManagerTest, LocalOnly_InvalidLocalhost) {
Eric Ortheb332862019-01-26 00:52:382199 HostResolver::ResolveHostParameters source_none_parameters;
2200 source_none_parameters.source = HostResolverSource::LOCAL_ONLY;
2201
Eric Orth6f1c5172019-04-16 17:08:272202 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552203 HostPortPair("foo,bar.localhost", 58), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:242204 NetLogWithSource(), source_none_parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502205 resolve_context_->host_cache()));
Eric Ortheb332862019-01-26 00:52:382206
2207 // Expected to fail synchronously.
2208 EXPECT_TRUE(response.complete());
2209 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
2210 EXPECT_FALSE(response.request()->GetAddressResults());
2211 EXPECT_FALSE(response.request()->GetStaleInfo());
2212}
2213
Eric Orth960e7062019-03-08 18:43:542214TEST_F(HostResolverManagerTest, StaleAllowed) {
Eric Ortheb332862019-01-26 00:52:382215 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42");
2216 proc_->SignalMultiple(1u); // Need only one.
2217
2218 HostResolver::ResolveHostParameters stale_allowed_parameters;
2219 stale_allowed_parameters.source = HostResolverSource::LOCAL_ONLY;
2220 stale_allowed_parameters.cache_usage =
2221 HostResolver::ResolveHostParameters::CacheUsage::STALE_ALLOWED;
2222
2223 // First query expected to complete synchronously as a cache miss.
Eric Orth6f1c5172019-04-16 17:08:272224 ResolveHostResponseHelper cache_miss_request(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552225 HostPortPair("just.testing", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:242226 NetLogWithSource(), stale_allowed_parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502227 resolve_context_->host_cache()));
Eric Ortheb332862019-01-26 00:52:382228 EXPECT_TRUE(cache_miss_request.complete());
2229 EXPECT_THAT(cache_miss_request.result_error(), IsError(ERR_DNS_CACHE_MISS));
2230 EXPECT_FALSE(cache_miss_request.request()->GetAddressResults());
2231 EXPECT_FALSE(cache_miss_request.request()->GetStaleInfo());
2232
2233 // Normal query to populate cache
2234 ResolveHostResponseHelper normal_request(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552235 HostPortPair("just.testing", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:522236 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502237 resolve_context_->host_cache()));
Eric Ortheb332862019-01-26 00:52:382238 EXPECT_THAT(normal_request.result_error(), IsOk());
2239 EXPECT_FALSE(normal_request.request()->GetStaleInfo());
2240
2241 MakeCacheStale();
2242
2243 // Second NONE query expected to get a stale cache hit.
Eric Orth6f1c5172019-04-16 17:08:272244 ResolveHostResponseHelper stale_request(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552245 HostPortPair("just.testing", 84), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:242246 NetLogWithSource(), stale_allowed_parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502247 resolve_context_->host_cache()));
Eric Ortheb332862019-01-26 00:52:382248 EXPECT_TRUE(stale_request.complete());
2249 EXPECT_THAT(stale_request.result_error(), IsOk());
2250 EXPECT_THAT(stale_request.request()->GetAddressResults().value().endpoints(),
2251 testing::ElementsAre(CreateExpected("192.168.1.42", 84)));
2252 EXPECT_TRUE(stale_request.request()->GetStaleInfo().value().is_stale());
2253}
2254
Eric Orth960e7062019-03-08 18:43:542255TEST_F(HostResolverManagerTest, StaleAllowed_NonLocal) {
Eric Ortheb332862019-01-26 00:52:382256 proc_->AddRuleForAllFamilies("just.testing", "192.168.2.42");
2257 proc_->SignalMultiple(1u); // Need only one.
2258
2259 HostResolver::ResolveHostParameters stale_allowed_parameters;
2260 stale_allowed_parameters.cache_usage =
2261 HostResolver::ResolveHostParameters::CacheUsage::STALE_ALLOWED;
2262
2263 // Normal non-local resolves should still work normally with the STALE_ALLOWED
2264 // parameter, and there should be no stale info.
Eric Orth6f1c5172019-04-16 17:08:272265 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552266 HostPortPair("just.testing", 85), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:242267 NetLogWithSource(), stale_allowed_parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502268 resolve_context_->host_cache()));
Eric Ortheb332862019-01-26 00:52:382269 EXPECT_THAT(response.result_error(), IsOk());
2270 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
2271 testing::ElementsAre(CreateExpected("192.168.2.42", 85)));
2272 EXPECT_FALSE(response.request()->GetStaleInfo());
2273}
2274
Eric Orth960e7062019-03-08 18:43:542275TEST_F(HostResolverManagerTest, StaleAllowed_FromIp) {
Eric Ortheb332862019-01-26 00:52:382276 HostResolver::ResolveHostParameters stale_allowed_parameters;
2277 stale_allowed_parameters.cache_usage =
2278 HostResolver::ResolveHostParameters::CacheUsage::STALE_ALLOWED;
2279
Eric Orth6f1c5172019-04-16 17:08:272280 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552281 HostPortPair("1.2.3.4", 57), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:502282 stale_allowed_parameters, resolve_context_.get(),
2283 resolve_context_->host_cache()));
Eric Ortheb332862019-01-26 00:52:382284
2285 // Expected to resolve synchronously without stale info.
2286 EXPECT_TRUE(response.complete());
2287 EXPECT_THAT(response.result_error(), IsOk());
2288 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
2289 testing::ElementsAre(CreateExpected("1.2.3.4", 57)));
2290 EXPECT_FALSE(response.request()->GetStaleInfo());
2291}
2292
Miriam Gershensone3bc63022017-10-09 19:57:052293// TODO(mgersh): add a test case for errors with positive TTL after
2294// https://crbug.com/115051 is fixed.
2295
[email protected]189163e2011-05-11 01:48:542296// Test the retry attempts simulating host resolver proc that takes too long.
Eric Orth960e7062019-03-08 18:43:542297TEST_F(HostResolverManagerTest, MultipleAttempts) {
[email protected]189163e2011-05-11 01:48:542298 // Total number of attempts would be 3 and we want the 3rd attempt to resolve
Eric Orth9a037562018-07-03 21:24:382299 // the host. First and second attempt will be forced to wait until they get
[email protected]189163e2011-05-11 01:48:542300 // word that a resolution has completed. The 3rd resolution attempt will try
Eric Orth9a037562018-07-03 21:24:382301 // to get done ASAP, and won't wait.
[email protected]189163e2011-05-11 01:48:542302 int kAttemptNumberToResolve = 3;
2303 int kTotalAttempts = 3;
2304
Eric Orth9a037562018-07-03 21:24:382305 // Add a little bit of extra fudge to the delay to allow reasonable
2306 // flexibility for time > vs >= etc. We don't need to fail the test if we
2307 // retry at t=6001 instead of t=6000.
Peter Kastinge5a38ed2021-10-02 03:06:352308 base::TimeDelta kSleepFudgeFactor = base::Milliseconds(1);
Eric Orth9a037562018-07-03 21:24:382309
[email protected]189163e2011-05-11 01:48:542310 scoped_refptr<LookupAttemptHostResolverProc> resolver_proc(
Raul Tambre94493c652019-03-11 17:18:352311 new LookupAttemptHostResolverProc(nullptr, kAttemptNumberToResolve,
Eric Orth70992982018-07-24 00:25:002312 kTotalAttempts));
2313
Eric Orth59066222019-03-07 23:52:272314 ProcTaskParams params = DefaultParams(resolver_proc.get());
Eric Orth70992982018-07-24 00:25:002315 base::TimeDelta unresponsive_delay = params.unresponsive_delay;
2316 int retry_factor = params.retry_factor;
2317
Eric Orth607b6d82019-05-08 16:43:322318 CreateResolverWithLimitsAndParams(kMaxJobs, params, true /* ipv6_reachable */,
2319 true /* check_ipv6_on_wifi */);
Eric Orth70992982018-07-24 00:25:002320
2321 // Override the current thread task runner, so we can simulate the passage of
2322 // time and avoid any actual sleeps.
2323 auto test_task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
Minoru Chikamune76ba6822021-01-12 10:39:512324 base::ThreadTaskRunnerHandleOverrideForTesting task_runner_handle_override(
2325 test_task_runner);
Eric Orth70992982018-07-24 00:25:002326
2327 // Resolve "host1".
Eric Orth117e1992019-04-17 00:24:152328 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552329 HostPortPair("host1", 70), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:522330 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:002331 EXPECT_FALSE(response.complete());
2332
2333 resolver_proc->WaitForNAttemptsToBeBlocked(1);
2334 EXPECT_FALSE(response.complete());
2335
2336 test_task_runner->FastForwardBy(unresponsive_delay + kSleepFudgeFactor);
2337 resolver_proc->WaitForNAttemptsToBeBlocked(2);
2338 EXPECT_FALSE(response.complete());
2339
2340 test_task_runner->FastForwardBy(unresponsive_delay * retry_factor +
2341 kSleepFudgeFactor);
2342
2343 resolver_proc->WaitForAllAttemptsToFinish();
2344 test_task_runner->RunUntilIdle();
2345
2346 // Resolve returns -4 to indicate that 3rd attempt has resolved the host.
2347 // Since we're using a TestMockTimeTaskRunner, the RunLoop stuff in
2348 // result_error() will fail if it actually has to wait, but unless there's an
2349 // error, the result should be immediately ready by this point.
2350 EXPECT_EQ(-4, response.result_error());
2351
2352 // We should be done with retries, but make sure none erroneously happen.
2353 test_task_runner->FastForwardUntilNoTasksRemain();
2354
Eric Roman21b39232019-06-28 21:28:212355 EXPECT_EQ(resolver_proc->GetTotalAttemptsResolved(), kTotalAttempts);
2356}
2357
2358// Regression test for https://crbug.com/976948.
2359//
2360// Tests that when the maximum number of retries is set to
2361// |HostResolver::ManagerOptions::kDefaultRetryAttempts| the
2362// number of retries used is 4 rather than something higher.
2363TEST_F(HostResolverManagerTest, DefaultMaxRetryAttempts) {
2364 auto test_task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
Minoru Chikamune76ba6822021-01-12 10:39:512365 base::ThreadTaskRunnerHandleOverrideForTesting task_runner_handle_override(
2366 test_task_runner);
Eric Roman21b39232019-06-28 21:28:212367
2368 // Instantiate a ResolverProc that will block all incoming requests.
2369 auto resolver_proc = base::MakeRefCounted<LookupAttemptHostResolverProc>(
2370 nullptr, std::numeric_limits<size_t>::max(),
2371 std::numeric_limits<size_t>::max());
2372
2373 // This corresponds to kDefaultMaxRetryAttempts in
2374 // ProcTaskParams::ProcTaskParams(). The correspondence is verified below,
2375 // since that symbol is not exported.
2376 const size_t expected_max_retries = 4;
2377
2378 // Use the special value |ManagerOptions::kDefaultRetryAttempts|, which is
2379 // expected to translate into |expected_num_retries|.
2380 ASSERT_NE(HostResolver::ManagerOptions::kDefaultRetryAttempts,
2381 expected_max_retries);
2382 ProcTaskParams params(resolver_proc.get(),
2383 HostResolver::ManagerOptions::kDefaultRetryAttempts);
2384 ASSERT_EQ(params.max_retry_attempts, expected_max_retries);
2385
2386 CreateResolverWithLimitsAndParams(kMaxJobs, params,
2387 false /* ipv6_reachable */,
2388 false /* check_ipv6_on_wifi */);
2389
2390 // Resolve "host1". The resolver proc will hang all requests so this
2391 // resolution should remain stalled until calling SetResolvedAttemptNumber().
2392 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552393 HostPortPair("host1", 70), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:522394 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Roman21b39232019-06-28 21:28:212395 EXPECT_FALSE(response.complete());
2396
2397 // Simulate running the main thread (network task runner) for a long
2398 // time. Because none of the attempts posted to worker pool can complete, this
2399 // should cause all of the retry attempts to get posted, according to the
2400 // exponential backoff schedule.
Peter Kastinge5a38ed2021-10-02 03:06:352401 test_task_runner->FastForwardBy(base::Minutes(20));
Eric Roman21b39232019-06-28 21:28:212402
2403 // Unblock the resolver proc, then wait for all the worker pool and main
2404 // thread tasks to complete. Note that the call to SetResolvedAttemptNumber(1)
2405 // will cause all the blocked resolver procs tasks fail with -2.
2406 resolver_proc->SetResolvedAttemptNumber(1);
2407 const int kExpectedError = -2;
2408 base::ThreadPoolInstance::Get()->FlushForTesting();
2409 test_task_runner->RunUntilIdle();
2410
2411 ASSERT_TRUE(response.complete());
2412 EXPECT_EQ(kExpectedError, response.result_error());
2413
2414 // Ensure that the original attempt was executed on the worker pool, as well
2415 // as the maximum number of allowed retries, and no more.
2416 EXPECT_EQ(static_cast<int>(expected_max_retries + 1),
2417 resolver_proc->GetTotalAttemptsResolved());
Eric Orth70992982018-07-24 00:25:002418}
2419
eroman91dd3602015-03-26 03:46:332420// If a host resolves to a list that includes 127.0.53.53, this is treated as
2421// an error. 127.0.53.53 is a localhost address, however it has been given a
eroman1efc237c2016-12-14 00:00:452422// special significance by ICANN to help surface name collision resulting from
eroman91dd3602015-03-26 03:46:332423// the new gTLDs.
Eric Orth960e7062019-03-08 18:43:542424TEST_F(HostResolverManagerTest, NameCollisionIcann) {
eroman91dd3602015-03-26 03:46:332425 proc_->AddRuleForAllFamilies("single", "127.0.53.53");
2426 proc_->AddRuleForAllFamilies("multiple", "127.0.0.1,127.0.53.53");
2427 proc_->AddRuleForAllFamilies("ipv6", "::127.0.53.53");
2428 proc_->AddRuleForAllFamilies("not_reserved1", "53.53.0.127");
2429 proc_->AddRuleForAllFamilies("not_reserved2", "127.0.53.54");
2430 proc_->AddRuleForAllFamilies("not_reserved3", "10.0.53.53");
2431 proc_->SignalMultiple(6u);
2432
Eric Orth117e1992019-04-17 00:24:152433 ResolveHostResponseHelper single_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552434 HostPortPair("single", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:522435 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:002436 EXPECT_THAT(single_response.result_error(),
2437 IsError(ERR_ICANN_NAME_COLLISION));
2438 EXPECT_FALSE(single_response.request()->GetAddressResults());
2439
2440 // ERR_ICANN_NAME_COLLISION is cached like any other error, using a fixed TTL
2441 // for failed entries from proc-based resolver. That said, the fixed TTL is 0,
2442 // so it should never be cached.
dalyk48b20a992019-02-25 16:10:262443 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result =
Matt Menke7b4a32f2019-10-25 22:13:462444 GetCacheHit(HostCache::Key(
2445 "single", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
2446 HostResolverSource::ANY, NetworkIsolationKey()));
dalyk48b20a992019-02-25 16:10:262447 EXPECT_FALSE(cache_result);
Eric Orth70992982018-07-24 00:25:002448
Eric Orth117e1992019-04-17 00:24:152449 ResolveHostResponseHelper multiple_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552450 HostPortPair("multiple", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:522451 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:002452 EXPECT_THAT(multiple_response.result_error(),
2453 IsError(ERR_ICANN_NAME_COLLISION));
2454
2455 // Resolving an IP literal of 127.0.53.53 however is allowed.
2456 ResolveHostResponseHelper literal_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552457 HostPortPair("127.0.53.53", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:522458 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502459 resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:002460 EXPECT_THAT(literal_response.result_error(), IsOk());
2461
2462 // Moreover the address should not be recognized when embedded in an IPv6
2463 // address.
2464 ResolveHostResponseHelper ipv6_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552465 HostPortPair("127.0.53.53", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:522466 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502467 resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:002468 EXPECT_THAT(ipv6_response.result_error(), IsOk());
2469
2470 // Try some other IPs which are similar, but NOT an exact match on
2471 // 127.0.53.53.
2472 ResolveHostResponseHelper similar_response1(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552473 HostPortPair("not_reserved1", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:522474 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502475 resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:002476 EXPECT_THAT(similar_response1.result_error(), IsOk());
2477
2478 ResolveHostResponseHelper similar_response2(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552479 HostPortPair("not_reserved2", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:522480 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502481 resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:002482 EXPECT_THAT(similar_response2.result_error(), IsOk());
2483
2484 ResolveHostResponseHelper similar_response3(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552485 HostPortPair("not_reserved3", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:522486 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502487 resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:002488 EXPECT_THAT(similar_response3.result_error(), IsOk());
2489}
2490
Eric Orth960e7062019-03-08 18:43:542491TEST_F(HostResolverManagerTest, IsIPv6Reachable) {
2492 // The real HostResolverManager is needed since TestHostResolverManager will
cbentzel1906f872015-06-05 16:25:252493 // bypass the IPv6 reachability tests.
Eric Orth37b18192019-04-22 19:09:282494 DestroyResolver();
Eric Orthfe6d5482019-09-03 18:27:572495 resolver_ = std::make_unique<HostResolverManager>(
2496 DefaultOptions(), nullptr /* system_dns_config_notifier */,
2497 nullptr /* net_log */);
cbentzel1906f872015-06-05 16:25:252498
sergeyub8cdc212015-05-14 18:50:372499 // Verify that two consecutive calls return the same value.
Matt Muellerd9342e3a2019-11-26 01:41:142500 RecordingTestNetLog test_net_log;
tfarina42834112016-09-22 13:38:202501 NetLogWithSource net_log =
2502 NetLogWithSource::Make(&test_net_log, NetLogSourceType::NONE);
2503 bool result1 = IsIPv6Reachable(net_log);
2504 bool result2 = IsIPv6Reachable(net_log);
sergeyub8cdc212015-05-14 18:50:372505 EXPECT_EQ(result1, result2);
2506
2507 // Filter reachability check events and verify that there are two of them.
Eric Roman79cc7552019-07-19 02:17:542508 auto probe_event_list = test_net_log.GetEntriesWithType(
Eric Orth9600a6c52021-09-01 21:23:412509 NetLogEventType::HOST_RESOLVER_MANAGER_IPV6_REACHABILITY_CHECK);
sergeyub8cdc212015-05-14 18:50:372510 ASSERT_EQ(2U, probe_event_list.size());
2511
2512 // Verify that the first request was not cached and the second one was.
Eric Roman79cc7552019-07-19 02:17:542513 EXPECT_FALSE(GetBooleanValueFromParams(probe_event_list[0], "cached"));
2514 EXPECT_TRUE(GetBooleanValueFromParams(probe_event_list[1], "cached"));
sergeyub8cdc212015-05-14 18:50:372515}
2516
Eric Orth960e7062019-03-08 18:43:542517TEST_F(HostResolverManagerTest, IncludeCanonicalName) {
Eric Orth322af3e42018-08-20 18:12:592518 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42",
2519 HOST_RESOLVER_CANONNAME, "canon.name");
2520 proc_->SignalMultiple(2u);
2521
2522 HostResolver::ResolveHostParameters parameters;
2523 parameters.include_canonical_name = true;
2524 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552525 HostPortPair("just.testing", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:242526 NetLogWithSource(), parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502527 resolve_context_->host_cache()));
Eric Orth322af3e42018-08-20 18:12:592528 ResolveHostResponseHelper response_no_flag(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552529 HostPortPair("just.testing", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:522530 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502531 resolve_context_->host_cache()));
Eric Orth322af3e42018-08-20 18:12:592532
2533 EXPECT_THAT(response.result_error(), IsOk());
2534 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
2535 testing::ElementsAre(CreateExpected("192.168.1.42", 80)));
2536 EXPECT_EQ("canon.name",
Cammie Smith Barnes78c07782020-12-07 23:27:042537 response.request()->GetAddressResults().value().GetCanonicalName());
Eric Orth322af3e42018-08-20 18:12:592538
2539 EXPECT_THAT(response_no_flag.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
2540}
2541
Eric Orth960e7062019-03-08 18:43:542542TEST_F(HostResolverManagerTest, LoopbackOnly) {
Eric Orth322af3e42018-08-20 18:12:592543 proc_->AddRuleForAllFamilies("otherlocal", "127.0.0.1",
2544 HOST_RESOLVER_LOOPBACK_ONLY);
2545 proc_->SignalMultiple(2u);
2546
2547 HostResolver::ResolveHostParameters parameters;
2548 parameters.loopback_only = true;
2549 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552550 HostPortPair("otherlocal", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:502551 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth322af3e42018-08-20 18:12:592552 ResolveHostResponseHelper response_no_flag(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552553 HostPortPair("otherlocal", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:522554 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth322af3e42018-08-20 18:12:592555
2556 EXPECT_THAT(response.result_error(), IsOk());
2557 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
2558 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
2559
2560 EXPECT_THAT(response_no_flag.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
2561}
2562
Eric Orth960e7062019-03-08 18:43:542563TEST_F(HostResolverManagerTest, IsSpeculative) {
Eric Orthb30bc172018-08-17 21:09:572564 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42");
2565 proc_->SignalMultiple(1u);
2566
2567 HostResolver::ResolveHostParameters parameters;
2568 parameters.is_speculative = true;
2569
2570 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552571 HostPortPair("just.testing", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:242572 NetLogWithSource(), parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502573 resolve_context_->host_cache()));
Eric Orthb30bc172018-08-17 21:09:572574
2575 EXPECT_THAT(response.result_error(), IsOk());
2576 EXPECT_FALSE(response.request()->GetAddressResults());
2577
2578 ASSERT_EQ(1u, proc_->GetCaptureList().size());
2579 EXPECT_EQ("just.testing", proc_->GetCaptureList()[0].hostname);
2580
2581 // Reresolve without the |is_speculative| flag should immediately return from
2582 // cache.
2583 ResolveHostResponseHelper response2(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552584 HostPortPair("just.testing", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:522585 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502586 resolve_context_->host_cache()));
Eric Orthb30bc172018-08-17 21:09:572587
2588 EXPECT_THAT(response2.result_error(), IsOk());
2589 EXPECT_THAT(response2.request()->GetAddressResults().value().endpoints(),
2590 testing::ElementsAre(CreateExpected("192.168.1.42", 80)));
2591
2592 EXPECT_EQ("just.testing", proc_->GetCaptureList()[0].hostname);
2593 EXPECT_EQ(1u, proc_->GetCaptureList().size()); // No increase.
2594}
2595
Eric Orth2bc48c72021-02-22 21:37:112596TEST_F(HostResolverManagerTest, AvoidMulticastResolutionParameter) {
2597 proc_->AddRuleForAllFamilies("avoid.multicast.test", "123.123.123.123",
2598 HOST_RESOLVER_AVOID_MULTICAST);
2599 proc_->SignalMultiple(2u);
2600
2601 HostResolver::ResolveHostParameters parameters;
2602 parameters.avoid_multicast_resolution = true;
2603 ResolveHostResponseHelper response(resolver_->CreateRequest(
2604 HostPortPair("avoid.multicast.test", 80), NetworkIsolationKey(),
2605 NetLogWithSource(), parameters, resolve_context_.get(),
2606 resolve_context_->host_cache()));
2607 ResolveHostResponseHelper response_no_flag(resolver_->CreateRequest(
2608 HostPortPair("avoid.multicast.test", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:522609 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orth2bc48c72021-02-22 21:37:112610 resolve_context_->host_cache()));
2611
2612 EXPECT_THAT(response.result_error(), IsOk());
2613 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
2614 testing::ElementsAre(CreateExpected("123.123.123.123", 80)));
2615
2616 EXPECT_THAT(response_no_flag.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
2617}
2618
Eric Orth9871aafa2018-10-02 19:59:182619#if BUILDFLAG(ENABLE_MDNS)
2620const uint8_t kMdnsResponseA[] = {
2621 // Header
2622 0x00, 0x00, // ID is zeroed out
2623 0x81, 0x80, // Standard query response, RA, no error
2624 0x00, 0x00, // No questions (for simplicity)
2625 0x00, 0x01, // 1 RR (answers)
2626 0x00, 0x00, // 0 authority RRs
2627 0x00, 0x00, // 0 additional RRs
2628
2629 // "myhello.local."
2630 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2631 0x00,
2632
2633 0x00, 0x01, // TYPE is A.
2634 0x00, 0x01, // CLASS is IN.
2635 0x00, 0x00, 0x00, 0x10, // TTL is 16 (seconds)
2636 0x00, 0x04, // RDLENGTH is 4 bytes.
2637 0x01, 0x02, 0x03, 0x04, // 1.2.3.4
2638};
2639
Eric Orth026776a2019-01-18 00:13:282640const uint8_t kMdnsResponseA2[] = {
2641 // Header
2642 0x00, 0x00, // ID is zeroed out
2643 0x81, 0x80, // Standard query response, RA, no error
2644 0x00, 0x00, // No questions (for simplicity)
2645 0x00, 0x01, // 1 RR (answers)
2646 0x00, 0x00, // 0 authority RRs
2647 0x00, 0x00, // 0 additional RRs
2648
2649 // "myhello.local."
2650 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2651 0x00,
2652
2653 0x00, 0x01, // TYPE is A.
2654 0x00, 0x01, // CLASS is IN.
2655 0x00, 0x00, 0x00, 0x10, // TTL is 16 (seconds)
2656 0x00, 0x04, // RDLENGTH is 4 bytes.
2657 0x05, 0x06, 0x07, 0x08, // 5.6.7.8
2658};
2659
2660const uint8_t kMdnsResponseA2Goodbye[] = {
2661 // Header
2662 0x00, 0x00, // ID is zeroed out
2663 0x81, 0x80, // Standard query response, RA, no error
2664 0x00, 0x00, // No questions (for simplicity)
2665 0x00, 0x01, // 1 RR (answers)
2666 0x00, 0x00, // 0 authority RRs
2667 0x00, 0x00, // 0 additional RRs
2668
2669 // "myhello.local."
2670 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2671 0x00,
2672
2673 0x00, 0x01, // TYPE is A.
2674 0x00, 0x01, // CLASS is IN.
2675 0x00, 0x00, 0x00, 0x00, // TTL is 0 (signaling "goodbye" removal of result)
2676 0x00, 0x04, // RDLENGTH is 4 bytes.
2677 0x05, 0x06, 0x07, 0x08, // 5.6.7.8
2678};
2679
Eric Orth9871aafa2018-10-02 19:59:182680const uint8_t kMdnsResponseAAAA[] = {
2681 // Header
2682 0x00, 0x00, // ID is zeroed out
2683 0x81, 0x80, // Standard query response, RA, no error
2684 0x00, 0x00, // No questions (for simplicity)
2685 0x00, 0x01, // 1 RR (answers)
2686 0x00, 0x00, // 0 authority RRs
2687 0x00, 0x00, // 0 additional RRs
2688
2689 // "myhello.local."
2690 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2691 0x00,
2692
2693 0x00, 0x1C, // TYPE is AAAA.
2694 0x00, 0x01, // CLASS is IN.
2695 0x00, 0x00, 0x00, 0x10, // TTL is 16 (seconds)
2696 0x00, 0x10, // RDLENGTH is 16 bytes.
2697
2698 // 000a:0000:0000:0000:0001:0002:0003:0004
2699 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02,
Eric Orth960e7062019-03-08 18:43:542700 0x00, 0x03, 0x00, 0x04};
Eric Orth9871aafa2018-10-02 19:59:182701
2702// An MDNS response indicating that the responder owns the hostname, but the
2703// specific requested type (AAAA) does not exist because the responder only has
2704// A addresses.
2705const uint8_t kMdnsResponseNsec[] = {
2706 // Header
2707 0x00, 0x00, // ID is zeroed out
2708 0x81, 0x80, // Standard query response, RA, no error
2709 0x00, 0x00, // No questions (for simplicity)
2710 0x00, 0x01, // 1 RR (answers)
2711 0x00, 0x00, // 0 authority RRs
2712 0x00, 0x00, // 0 additional RRs
2713
2714 // "myhello.local."
2715 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2716 0x00,
2717
2718 0x00, 0x2f, // TYPE is NSEC.
2719 0x00, 0x01, // CLASS is IN.
2720 0x00, 0x00, 0x00, 0x10, // TTL is 16 (seconds)
2721 0x00, 0x06, // RDLENGTH is 6 bytes.
2722 0xc0, 0x0c, // Next Domain Name (always pointer back to name in MDNS)
2723 0x00, // Bitmap block number (always 0 in MDNS)
2724 0x02, // Bitmap length is 2
2725 0x00, 0x08 // A type only
2726};
2727
Eric Orth828bd3ae2018-12-12 17:30:362728const uint8_t kMdnsResponseTxt[] = {
2729 // Header
2730 0x00, 0x00, // ID is zeroed out
2731 0x81, 0x80, // Standard query response, RA, no error
2732 0x00, 0x00, // No questions (for simplicity)
2733 0x00, 0x01, // 1 RR (answers)
2734 0x00, 0x00, // 0 authority RRs
2735 0x00, 0x00, // 0 additional RRs
2736
2737 // "myhello.local."
2738 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2739 0x00,
2740
2741 0x00, 0x10, // TYPE is TXT.
2742 0x00, 0x01, // CLASS is IN.
2743 0x00, 0x00, 0x00, 0x11, // TTL is 17 (seconds)
2744 0x00, 0x08, // RDLENGTH is 8 bytes.
2745
2746 // "foo"
2747 0x03, 0x66, 0x6f, 0x6f,
2748 // "bar"
Eric Orth960e7062019-03-08 18:43:542749 0x03, 0x62, 0x61, 0x72};
Eric Orth828bd3ae2018-12-12 17:30:362750
Eric Orthe9db8d232019-01-14 21:24:452751const uint8_t kMdnsResponsePtr[] = {
2752 // Header
2753 0x00, 0x00, // ID is zeroed out
2754 0x81, 0x80, // Standard query response, RA, no error
2755 0x00, 0x00, // No questions (for simplicity)
2756 0x00, 0x01, // 1 RR (answers)
2757 0x00, 0x00, // 0 authority RRs
2758 0x00, 0x00, // 0 additional RRs
2759
2760 // "myhello.local."
2761 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2762 0x00,
2763
2764 0x00, 0x0c, // TYPE is PTR.
2765 0x00, 0x01, // CLASS is IN.
2766 0x00, 0x00, 0x00, 0x12, // TTL is 18 (seconds)
2767 0x00, 0x09, // RDLENGTH is 9 bytes.
2768
2769 // "foo.com."
2770 0x03, 'f', 'o', 'o', 0x03, 'c', 'o', 'm', 0x00};
2771
Eric Orth026776a2019-01-18 00:13:282772const uint8_t kMdnsResponsePtrRoot[] = {
2773 // Header
2774 0x00, 0x00, // ID is zeroed out
2775 0x81, 0x80, // Standard query response, RA, no error
2776 0x00, 0x00, // No questions (for simplicity)
2777 0x00, 0x01, // 1 RR (answers)
2778 0x00, 0x00, // 0 authority RRs
2779 0x00, 0x00, // 0 additional RRs
2780
2781 // "myhello.local."
2782 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2783 0x00,
2784
2785 0x00, 0x0c, // TYPE is PTR.
2786 0x00, 0x01, // CLASS is IN.
2787 0x00, 0x00, 0x00, 0x13, // TTL is 19 (seconds)
2788 0x00, 0x01, // RDLENGTH is 1 byte.
2789
2790 // "." (the root domain)
2791 0x00};
2792
Eric Ortha625b042019-01-16 01:14:452793const uint8_t kMdnsResponseSrv[] = {
2794 // Header
2795 0x00, 0x00, // ID is zeroed out
2796 0x81, 0x80, // Standard query response, RA, no error
2797 0x00, 0x00, // No questions (for simplicity)
2798 0x00, 0x01, // 1 RR (answers)
2799 0x00, 0x00, // 0 authority RRs
2800 0x00, 0x00, // 0 additional RRs
2801
2802 // "myhello.local."
2803 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2804 0x00,
2805
2806 0x00, 0x21, // TYPE is SRV.
2807 0x00, 0x01, // CLASS is IN.
2808 0x00, 0x00, 0x00, 0x13, // TTL is 19 (seconds)
2809 0x00, 0x0f, // RDLENGTH is 15 bytes.
2810
2811 0x00, 0x05, // Priority 5
2812 0x00, 0x01, // Weight 1
2813 0x20, 0x49, // Port 8265
2814
2815 // "foo.com."
2816 0x03, 'f', 'o', 'o', 0x03, 'c', 'o', 'm', 0x00};
2817
Bailey Berroe70f06c2019-03-11 22:22:462818const uint8_t kMdnsResponseSrvUnrestricted[] = {
2819 // Header
2820 0x00, 0x00, // ID is zeroed out
2821 0x81, 0x80, // Standard query response, RA, no error
2822 0x00, 0x00, // No questions (for simplicity)
2823 0x00, 0x01, // 1 RR (answers)
2824 0x00, 0x00, // 0 authority RRs
2825 0x00, 0x00, // 0 additional RRs
2826
2827 // "foo bar(A1B2)._ipps._tcp.local"
2828 0x0d, 'f', 'o', 'o', ' ', 'b', 'a', 'r', '(', 'A', '1', 'B', '2', ')', 0x05,
2829 '_', 'i', 'p', 'p', 's', 0x04, '_', 't', 'c', 'p', 0x05, 'l', 'o', 'c', 'a',
2830 'l', 0x00,
2831
2832 0x00, 0x21, // TYPE is SRV.
2833 0x00, 0x01, // CLASS is IN.
2834 0x00, 0x00, 0x00, 0x13, // TTL is 19 (seconds)
2835 0x00, 0x0f, // RDLENGTH is 15 bytes.
2836
2837 0x00, 0x05, // Priority 5
2838 0x00, 0x01, // Weight 1
2839 0x20, 0x49, // Port 8265
2840
2841 // "foo.com."
2842 0x03, 'f', 'o', 'o', 0x03, 'c', 'o', 'm', 0x00};
2843
2844const uint8_t kMdnsResponseSrvUnrestrictedResult[] = {
2845 // Header
2846 0x00, 0x00, // ID is zeroed out
2847 0x81, 0x80, // Standard query response, RA, no error
2848 0x00, 0x00, // No questions (for simplicity)
2849 0x00, 0x01, // 1 RR (answers)
2850 0x00, 0x00, // 0 authority RRs
2851 0x00, 0x00, // 0 additional RRs
2852
2853 // "myhello.local."
2854 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2855 0x00,
2856
2857 0x00, 0x21, // TYPE is SRV.
2858 0x00, 0x01, // CLASS is IN.
2859 0x00, 0x00, 0x00, 0x13, // TTL is 19 (seconds)
2860 0x00, 0x15, // RDLENGTH is 21 bytes.
2861
2862 0x00, 0x05, // Priority 5
2863 0x00, 0x01, // Weight 1
2864 0x20, 0x49, // Port 8265
2865
2866 // "foo bar.local"
2867 0x07, 'f', 'o', 'o', ' ', 'b', 'a', 'r', 0x05, 'l', 'o', 'c', 'a', 'l',
2868 0x00};
2869
Eric Orth960e7062019-03-08 18:43:542870TEST_F(HostResolverManagerTest, Mdns) {
Eric Orth9871aafa2018-10-02 19:59:182871 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2872 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2873 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2874 // 2 socket creations for every transaction.
2875 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(4);
2876
2877 HostResolver::ResolveHostParameters parameters;
2878 parameters.source = HostResolverSource::MULTICAST_DNS;
2879
2880 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552881 HostPortPair("myhello.local", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:242882 NetLogWithSource(), parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502883 resolve_context_->host_cache()));
Eric Orth9871aafa2018-10-02 19:59:182884
2885 socket_factory_ptr->SimulateReceive(kMdnsResponseA, sizeof(kMdnsResponseA));
2886 socket_factory_ptr->SimulateReceive(kMdnsResponseAAAA,
2887 sizeof(kMdnsResponseAAAA));
2888
2889 EXPECT_THAT(response.result_error(), IsOk());
2890 EXPECT_THAT(
2891 response.request()->GetAddressResults().value().endpoints(),
2892 testing::UnorderedElementsAre(
2893 CreateExpected("1.2.3.4", 80),
2894 CreateExpected("000a:0000:0000:0000:0001:0002:0003:0004", 80)));
Eric Orth828bd3ae2018-12-12 17:30:362895 EXPECT_FALSE(response.request()->GetTextResults());
2896 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth7139e0552020-11-04 02:41:112897 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Eric Orth9871aafa2018-10-02 19:59:182898}
2899
Eric Orth960e7062019-03-08 18:43:542900TEST_F(HostResolverManagerTest, Mdns_AaaaOnly) {
Eric Orth9871aafa2018-10-02 19:59:182901 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2902 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2903 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2904 // 2 socket creations for every transaction.
2905 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(2);
2906
2907 HostResolver::ResolveHostParameters parameters;
Eric Orth192e3bb2018-11-14 19:30:322908 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth9871aafa2018-10-02 19:59:182909 parameters.source = HostResolverSource::MULTICAST_DNS;
2910
2911 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552912 HostPortPair("myhello.local", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:242913 NetLogWithSource(), parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502914 resolve_context_->host_cache()));
Eric Orth9871aafa2018-10-02 19:59:182915
2916 socket_factory_ptr->SimulateReceive(kMdnsResponseAAAA,
2917 sizeof(kMdnsResponseAAAA));
2918
2919 EXPECT_THAT(response.result_error(), IsOk());
2920 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
2921 testing::ElementsAre(CreateExpected(
2922 "000a:0000:0000:0000:0001:0002:0003:0004", 80)));
2923}
2924
Eric Orth960e7062019-03-08 18:43:542925TEST_F(HostResolverManagerTest, Mdns_Txt) {
Eric Orth828bd3ae2018-12-12 17:30:362926 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2927 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2928 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2929 // 2 socket creations for every transaction.
2930 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(2);
2931
2932 HostResolver::ResolveHostParameters parameters;
2933 parameters.dns_query_type = DnsQueryType::TXT;
2934 parameters.source = HostResolverSource::MULTICAST_DNS;
2935
2936 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552937 HostPortPair("myhello.local", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:242938 NetLogWithSource(), parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502939 resolve_context_->host_cache()));
Eric Orth828bd3ae2018-12-12 17:30:362940
2941 socket_factory_ptr->SimulateReceive(kMdnsResponseTxt,
2942 sizeof(kMdnsResponseTxt));
2943
2944 EXPECT_THAT(response.result_error(), IsOk());
2945 EXPECT_FALSE(response.request()->GetAddressResults());
2946 EXPECT_THAT(response.request()->GetTextResults(),
2947 testing::Optional(testing::ElementsAre("foo", "bar")));
2948 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth7139e0552020-11-04 02:41:112949 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Eric Orth828bd3ae2018-12-12 17:30:362950}
2951
Eric Orth960e7062019-03-08 18:43:542952TEST_F(HostResolverManagerTest, Mdns_Ptr) {
Eric Orthe9db8d232019-01-14 21:24:452953 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2954 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2955 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2956 // 2 socket creations for every transaction.
2957 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(2);
2958
2959 HostResolver::ResolveHostParameters parameters;
2960 parameters.dns_query_type = DnsQueryType::PTR;
2961 parameters.source = HostResolverSource::MULTICAST_DNS;
2962
2963 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552964 HostPortPair("myhello.local", 83), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:242965 NetLogWithSource(), parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502966 resolve_context_->host_cache()));
Eric Orthe9db8d232019-01-14 21:24:452967
2968 socket_factory_ptr->SimulateReceive(kMdnsResponsePtr,
2969 sizeof(kMdnsResponsePtr));
2970
2971 EXPECT_THAT(response.result_error(), IsOk());
2972 EXPECT_FALSE(response.request()->GetAddressResults());
2973 EXPECT_FALSE(response.request()->GetTextResults());
Eric Orth7139e0552020-11-04 02:41:112974 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Eric Orthe9db8d232019-01-14 21:24:452975 EXPECT_THAT(
2976 response.request()->GetHostnameResults(),
2977 testing::Optional(testing::ElementsAre(HostPortPair("foo.com", 83))));
2978}
2979
Eric Orth960e7062019-03-08 18:43:542980TEST_F(HostResolverManagerTest, Mdns_Srv) {
Eric Ortha625b042019-01-16 01:14:452981 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2982 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2983 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2984 // 2 socket creations for every transaction.
2985 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(2);
2986
2987 HostResolver::ResolveHostParameters parameters;
2988 parameters.dns_query_type = DnsQueryType::SRV;
2989 parameters.source = HostResolverSource::MULTICAST_DNS;
2990
2991 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552992 HostPortPair("myhello.local", 83), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:242993 NetLogWithSource(), parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502994 resolve_context_->host_cache()));
Eric Ortha625b042019-01-16 01:14:452995
2996 socket_factory_ptr->SimulateReceive(kMdnsResponseSrv,
2997 sizeof(kMdnsResponseSrv));
2998
2999 EXPECT_THAT(response.result_error(), IsOk());
3000 EXPECT_FALSE(response.request()->GetAddressResults());
3001 EXPECT_FALSE(response.request()->GetTextResults());
Eric Orth7139e0552020-11-04 02:41:113002 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Eric Ortha625b042019-01-16 01:14:453003 EXPECT_THAT(
3004 response.request()->GetHostnameResults(),
3005 testing::Optional(testing::ElementsAre(HostPortPair("foo.com", 8265))));
3006}
3007
Bailey Berroe70f06c2019-03-11 22:22:463008// Test that we are able to create multicast DNS requests that contain
3009// characters not permitted in the DNS spec such as spaces and parenthesis.
3010TEST_F(HostResolverManagerTest, Mdns_Srv_Unrestricted) {
3011 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3012 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
3013 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
3014
3015 HostResolver::ResolveHostParameters parameters;
3016 parameters.dns_query_type = DnsQueryType::SRV;
3017 parameters.source = HostResolverSource::MULTICAST_DNS;
3018
3019 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:553020 HostPortPair("foo bar(A1B2)._ipps._tcp.local", 83), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:243021 NetLogWithSource(), parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:503022 resolve_context_->host_cache()));
Bailey Berroe70f06c2019-03-11 22:22:463023
3024 socket_factory_ptr->SimulateReceive(kMdnsResponseSrvUnrestricted,
3025 sizeof(kMdnsResponseSrvUnrestricted));
3026
3027 EXPECT_THAT(response.result_error(), IsOk());
3028 EXPECT_FALSE(response.request()->GetAddressResults());
3029 EXPECT_FALSE(response.request()->GetTextResults());
Eric Orth7139e0552020-11-04 02:41:113030 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Bailey Berroe70f06c2019-03-11 22:22:463031 EXPECT_THAT(
3032 response.request()->GetHostnameResults(),
3033 testing::Optional(testing::ElementsAre(HostPortPair("foo.com", 8265))));
3034}
3035
3036// Test that we are able to create multicast DNS requests that contain
3037// characters not permitted in the DNS spec such as spaces and parenthesis.
3038TEST_F(HostResolverManagerTest, Mdns_Srv_Result_Unrestricted) {
3039 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3040 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
3041 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
3042
3043 HostResolver::ResolveHostParameters parameters;
3044 parameters.dns_query_type = DnsQueryType::SRV;
3045 parameters.source = HostResolverSource::MULTICAST_DNS;
3046
3047 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:553048 HostPortPair("myhello.local", 83), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:243049 NetLogWithSource(), parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:503050 resolve_context_->host_cache()));
Bailey Berroe70f06c2019-03-11 22:22:463051
3052 socket_factory_ptr->SimulateReceive(
3053 kMdnsResponseSrvUnrestrictedResult,
3054 sizeof(kMdnsResponseSrvUnrestrictedResult));
3055
3056 EXPECT_THAT(response.result_error(), IsOk());
3057 EXPECT_FALSE(response.request()->GetAddressResults());
3058 EXPECT_FALSE(response.request()->GetTextResults());
Eric Orth7139e0552020-11-04 02:41:113059 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Bailey Berroe70f06c2019-03-11 22:22:463060 EXPECT_THAT(response.request()->GetHostnameResults(),
3061 testing::Optional(
3062 testing::ElementsAre(HostPortPair("foo bar.local", 8265))));
3063}
3064
Eric Orth9871aafa2018-10-02 19:59:183065// Test multicast DNS handling of NSEC responses (used for explicit negative
3066// response).
Eric Orth960e7062019-03-08 18:43:543067TEST_F(HostResolverManagerTest, Mdns_Nsec) {
Eric Orth9871aafa2018-10-02 19:59:183068 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3069 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
3070 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
3071 // 2 socket creations for every transaction.
3072 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(2);
3073
3074 HostResolver::ResolveHostParameters parameters;
Eric Orth192e3bb2018-11-14 19:30:323075 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth9871aafa2018-10-02 19:59:183076 parameters.source = HostResolverSource::MULTICAST_DNS;
3077
3078 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:553079 HostPortPair("myhello.local", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:243080 NetLogWithSource(), parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:503081 resolve_context_->host_cache()));
Eric Orth9871aafa2018-10-02 19:59:183082
3083 socket_factory_ptr->SimulateReceive(kMdnsResponseNsec,
3084 sizeof(kMdnsResponseNsec));
3085
3086 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
3087 EXPECT_FALSE(response.request()->GetAddressResults());
3088}
3089
Eric Orth960e7062019-03-08 18:43:543090TEST_F(HostResolverManagerTest, Mdns_NoResponse) {
Eric Orth9871aafa2018-10-02 19:59:183091 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3092 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
3093 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
3094 // 2 socket creations for every transaction.
3095 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(4);
3096
3097 // Add a little bit of extra fudge to the delay to allow reasonable
3098 // flexibility for time > vs >= etc. We don't need to fail the test if we
3099 // timeout at t=6001 instead of t=6000.
Peter Kastinge5a38ed2021-10-02 03:06:353100 base::TimeDelta kSleepFudgeFactor = base::Milliseconds(1);
Eric Orth9871aafa2018-10-02 19:59:183101
3102 // Override the current thread task runner, so we can simulate the passage of
3103 // time to trigger the timeout.
3104 auto test_task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
Minoru Chikamune76ba6822021-01-12 10:39:513105 base::ThreadTaskRunnerHandleOverrideForTesting task_runner_handle_override(
3106 test_task_runner);
Eric Orth9871aafa2018-10-02 19:59:183107
3108 HostResolver::ResolveHostParameters parameters;
3109 parameters.source = HostResolverSource::MULTICAST_DNS;
3110
3111 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:553112 HostPortPair("myhello.local", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:243113 NetLogWithSource(), parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:503114 resolve_context_->host_cache()));
Eric Orth9871aafa2018-10-02 19:59:183115
3116 ASSERT_TRUE(test_task_runner->HasPendingTask());
3117 test_task_runner->FastForwardBy(MDnsTransaction::kTransactionTimeout +
3118 kSleepFudgeFactor);
3119
3120 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
3121 EXPECT_FALSE(response.request()->GetAddressResults());
Eric Orth828bd3ae2018-12-12 17:30:363122 EXPECT_FALSE(response.request()->GetTextResults());
3123 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth7139e0552020-11-04 02:41:113124 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Eric Orth828bd3ae2018-12-12 17:30:363125
3126 test_task_runner->FastForwardUntilNoTasksRemain();
3127}
3128
Eric Orth960e7062019-03-08 18:43:543129TEST_F(HostResolverManagerTest, Mdns_WrongType) {
Eric Orth828bd3ae2018-12-12 17:30:363130 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3131 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
3132 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
3133 // 2 socket creations for every transaction.
3134 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(2);
3135
3136 // Add a little bit of extra fudge to the delay to allow reasonable
3137 // flexibility for time > vs >= etc. We don't need to fail the test if we
3138 // timeout at t=6001 instead of t=6000.
Peter Kastinge5a38ed2021-10-02 03:06:353139 base::TimeDelta kSleepFudgeFactor = base::Milliseconds(1);
Eric Orth828bd3ae2018-12-12 17:30:363140
3141 // Override the current thread task runner, so we can simulate the passage of
3142 // time to trigger the timeout.
3143 auto test_task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
Minoru Chikamune76ba6822021-01-12 10:39:513144 base::ThreadTaskRunnerHandleOverrideForTesting task_runner_handle_override(
3145 test_task_runner);
Eric Orth828bd3ae2018-12-12 17:30:363146
3147 HostResolver::ResolveHostParameters parameters;
3148 parameters.dns_query_type = DnsQueryType::A;
3149 parameters.source = HostResolverSource::MULTICAST_DNS;
3150
3151 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:553152 HostPortPair("myhello.local", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:243153 NetLogWithSource(), parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:503154 resolve_context_->host_cache()));
Eric Orth828bd3ae2018-12-12 17:30:363155
3156 // Not the requested type. Should be ignored.
3157 socket_factory_ptr->SimulateReceive(kMdnsResponseTxt,
3158 sizeof(kMdnsResponseTxt));
3159
3160 ASSERT_TRUE(test_task_runner->HasPendingTask());
3161 test_task_runner->FastForwardBy(MDnsTransaction::kTransactionTimeout +
3162 kSleepFudgeFactor);
3163
3164 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
3165 EXPECT_FALSE(response.request()->GetAddressResults());
3166 EXPECT_FALSE(response.request()->GetTextResults());
3167 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth7139e0552020-11-04 02:41:113168 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Eric Orth9871aafa2018-10-02 19:59:183169
3170 test_task_runner->FastForwardUntilNoTasksRemain();
3171}
3172
3173// Test for a request for both A and AAAA results where results only exist for
3174// one type.
Eric Orth960e7062019-03-08 18:43:543175TEST_F(HostResolverManagerTest, Mdns_PartialResults) {
Eric Orth9871aafa2018-10-02 19:59:183176 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3177 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
3178 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
3179 // 2 socket creations for every transaction.
3180 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(4);
3181
3182 // Add a little bit of extra fudge to the delay to allow reasonable
3183 // flexibility for time > vs >= etc. We don't need to fail the test if we
3184 // timeout at t=6001 instead of t=6000.
Peter Kastinge5a38ed2021-10-02 03:06:353185 base::TimeDelta kSleepFudgeFactor = base::Milliseconds(1);
Eric Orth9871aafa2018-10-02 19:59:183186
3187 // Override the current thread task runner, so we can simulate the passage of
3188 // time to trigger the timeout.
3189 auto test_task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
Minoru Chikamune76ba6822021-01-12 10:39:513190 base::ThreadTaskRunnerHandleOverrideForTesting task_runner_handle_override(
3191 test_task_runner);
Eric Orth9871aafa2018-10-02 19:59:183192
3193 HostResolver::ResolveHostParameters parameters;
3194 parameters.source = HostResolverSource::MULTICAST_DNS;
3195
3196 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:553197 HostPortPair("myhello.local", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:243198 NetLogWithSource(), parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:503199 resolve_context_->host_cache()));
Eric Orth9871aafa2018-10-02 19:59:183200
3201 ASSERT_TRUE(test_task_runner->HasPendingTask());
3202
3203 socket_factory_ptr->SimulateReceive(kMdnsResponseA, sizeof(kMdnsResponseA));
3204 test_task_runner->FastForwardBy(MDnsTransaction::kTransactionTimeout +
3205 kSleepFudgeFactor);
3206
3207 EXPECT_THAT(response.result_error(), IsOk());
3208 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
3209 testing::ElementsAre(CreateExpected("1.2.3.4", 80)));
3210
3211 test_task_runner->FastForwardUntilNoTasksRemain();
3212}
3213
Eric Orth960e7062019-03-08 18:43:543214TEST_F(HostResolverManagerTest, Mdns_Cancel) {
Eric Orth9871aafa2018-10-02 19:59:183215 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3216 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
3217 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
3218 // 2 socket creations for every transaction.
3219 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(4);
3220
3221 HostResolver::ResolveHostParameters parameters;
3222 parameters.source = HostResolverSource::MULTICAST_DNS;
3223
3224 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:553225 HostPortPair("myhello.local", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:243226 NetLogWithSource(), parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:503227 resolve_context_->host_cache()));
Eric Orth9871aafa2018-10-02 19:59:183228
3229 response.CancelRequest();
3230
3231 socket_factory_ptr->SimulateReceive(kMdnsResponseA, sizeof(kMdnsResponseA));
3232 socket_factory_ptr->SimulateReceive(kMdnsResponseAAAA,
3233 sizeof(kMdnsResponseAAAA));
3234
3235 base::RunLoop().RunUntilIdle();
3236 EXPECT_FALSE(response.complete());
3237}
3238
3239// Test for a two-transaction query where the first fails to start. The second
3240// should be cancelled.
Eric Orth960e7062019-03-08 18:43:543241TEST_F(HostResolverManagerTest, Mdns_PartialFailure) {
Eric Orth9871aafa2018-10-02 19:59:183242 // Setup a mock MDnsClient where the first transaction will always return
3243 // |false| immediately on Start(). Second transaction may or may not be
3244 // created, but if it is, Start() not expected to be called because the
3245 // overall request should immediately fail.
3246 auto transaction1 = std::make_unique<MockMDnsTransaction>();
3247 EXPECT_CALL(*transaction1, Start()).WillOnce(Return(false));
3248 auto transaction2 = std::make_unique<MockMDnsTransaction>();
3249 EXPECT_CALL(*transaction2, Start()).Times(0);
3250
3251 auto client = std::make_unique<MockMDnsClient>();
3252 EXPECT_CALL(*client, CreateTransaction(_, _, _, _))
3253 .Times(Between(1, 2)) // Second transaction optionally created.
3254 .WillOnce(Return(ByMove(std::move(transaction1))))
3255 .WillOnce(Return(ByMove(std::move(transaction2))));
3256 EXPECT_CALL(*client, IsListening()).WillRepeatedly(Return(true));
3257 resolver_->SetMdnsClientForTesting(std::move(client));
3258
3259 HostResolver::ResolveHostParameters parameters;
3260 parameters.source = HostResolverSource::MULTICAST_DNS;
3261
3262 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:553263 HostPortPair("myhello.local", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:243264 NetLogWithSource(), parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:503265 resolve_context_->host_cache()));
Eric Orth9871aafa2018-10-02 19:59:183266
3267 EXPECT_THAT(response.result_error(), IsError(ERR_FAILED));
3268 EXPECT_FALSE(response.request()->GetAddressResults());
3269}
Eric Orth026776a2019-01-18 00:13:283270
Eric Orthe857ebb2019-03-13 23:02:073271TEST_F(HostResolverManagerTest, Mdns_ListenFailure) {
3272 // Inject an MdnsClient mock that will always fail to start listening.
3273 auto client = std::make_unique<MockMDnsClient>();
3274 EXPECT_CALL(*client, StartListening(_)).WillOnce(Return(ERR_FAILED));
3275 EXPECT_CALL(*client, IsListening()).WillRepeatedly(Return(false));
3276 resolver_->SetMdnsClientForTesting(std::move(client));
3277
3278 HostResolver::ResolveHostParameters parameters;
3279 parameters.source = HostResolverSource::MULTICAST_DNS;
3280
3281 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:553282 HostPortPair("myhello.local", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:243283 NetLogWithSource(), parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:503284 resolve_context_->host_cache()));
Eric Orthe857ebb2019-03-13 23:02:073285
3286 EXPECT_THAT(response.result_error(), IsError(ERR_FAILED));
3287 EXPECT_FALSE(response.request()->GetAddressResults());
3288}
3289
Eric Orth026776a2019-01-18 00:13:283290// Implementation of HostResolver::MdnsListenerDelegate that records all
3291// received results in maps.
3292class TestMdnsListenerDelegate : public HostResolver::MdnsListener::Delegate {
3293 public:
Matt Menke991dd7e2021-07-22 17:31:513294 using UpdateKey = std::pair<MdnsListenerUpdateType, DnsQueryType>;
Eric Orth026776a2019-01-18 00:13:283295
Matt Menke991dd7e2021-07-22 17:31:513296 void OnAddressResult(MdnsListenerUpdateType update_type,
3297 DnsQueryType result_type,
3298 IPEndPoint address) override {
David Van Cleveac020732019-10-29 00:27:093299 address_results_.insert({{update_type, result_type}, address});
Eric Orth026776a2019-01-18 00:13:283300 }
3301
Matt Menke991dd7e2021-07-22 17:31:513302 void OnTextResult(MdnsListenerUpdateType update_type,
3303 DnsQueryType result_type,
3304 std::vector<std::string> text_records) override {
Eric Orth026776a2019-01-18 00:13:283305 for (auto& text_record : text_records) {
3306 text_results_.insert(
3307 {{update_type, result_type}, std::move(text_record)});
3308 }
3309 }
3310
Matt Menke991dd7e2021-07-22 17:31:513311 void OnHostnameResult(MdnsListenerUpdateType update_type,
3312 DnsQueryType result_type,
3313 HostPortPair host) override {
Eric Orth026776a2019-01-18 00:13:283314 hostname_results_.insert({{update_type, result_type}, std::move(host)});
3315 }
3316
Matt Menke991dd7e2021-07-22 17:31:513317 void OnUnhandledResult(MdnsListenerUpdateType update_type,
3318 DnsQueryType result_type) override {
Eric Orth026776a2019-01-18 00:13:283319 unhandled_results_.insert({update_type, result_type});
3320 }
3321
3322 const std::multimap<UpdateKey, IPEndPoint>& address_results() {
3323 return address_results_;
3324 }
3325
3326 const std::multimap<UpdateKey, std::string>& text_results() {
3327 return text_results_;
3328 }
3329
3330 const std::multimap<UpdateKey, HostPortPair>& hostname_results() {
3331 return hostname_results_;
3332 }
3333
3334 const std::multiset<UpdateKey>& unhandled_results() {
3335 return unhandled_results_;
3336 }
3337
3338 template <typename T>
3339 static std::pair<UpdateKey, T> CreateExpectedResult(
Matt Menke991dd7e2021-07-22 17:31:513340 MdnsListenerUpdateType update_type,
Eric Orth026776a2019-01-18 00:13:283341 DnsQueryType query_type,
3342 T result) {
3343 return std::make_pair(std::make_pair(update_type, query_type), result);
3344 }
3345
3346 private:
3347 std::multimap<UpdateKey, IPEndPoint> address_results_;
3348 std::multimap<UpdateKey, std::string> text_results_;
3349 std::multimap<UpdateKey, HostPortPair> hostname_results_;
3350 std::multiset<UpdateKey> unhandled_results_;
3351};
3352
Eric Orth960e7062019-03-08 18:43:543353TEST_F(HostResolverManagerTest, MdnsListener) {
Eric Orth026776a2019-01-18 00:13:283354 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3355 base::SimpleTestClock clock;
3356 clock.SetNow(base::Time::Now());
3357 auto cache_cleanup_timer = std::make_unique<base::MockOneShotTimer>();
3358 auto* cache_cleanup_timer_ptr = cache_cleanup_timer.get();
3359 auto mdns_client =
3360 std::make_unique<MDnsClientImpl>(&clock, std::move(cache_cleanup_timer));
Eric Orthe857ebb2019-03-13 23:02:073361 ASSERT_THAT(mdns_client->StartListening(socket_factory.get()), IsOk());
Eric Orth026776a2019-01-18 00:13:283362 resolver_->SetMdnsClientForTesting(std::move(mdns_client));
3363
3364 std::unique_ptr<HostResolver::MdnsListener> listener =
3365 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 80),
3366 DnsQueryType::A);
3367
3368 TestMdnsListenerDelegate delegate;
3369 ASSERT_THAT(listener->Start(&delegate), IsOk());
3370 ASSERT_THAT(delegate.address_results(), testing::IsEmpty());
3371
3372 socket_factory->SimulateReceive(kMdnsResponseA, sizeof(kMdnsResponseA));
3373 socket_factory->SimulateReceive(kMdnsResponseA2, sizeof(kMdnsResponseA2));
3374 socket_factory->SimulateReceive(kMdnsResponseA2Goodbye,
3375 sizeof(kMdnsResponseA2Goodbye));
3376
3377 // Per RFC6762 section 10.1, removals take effect 1 second after receiving the
3378 // goodbye message.
Peter Kastinge5a38ed2021-10-02 03:06:353379 clock.Advance(base::Seconds(1));
Eric Orth026776a2019-01-18 00:13:283380 cache_cleanup_timer_ptr->Fire();
3381
3382 // Expect 1 record adding "1.2.3.4", another changing to "5.6.7.8", and a
3383 // final removing "5.6.7.8".
3384 EXPECT_THAT(delegate.address_results(),
3385 testing::ElementsAre(
3386 TestMdnsListenerDelegate::CreateExpectedResult(
Matt Menke991dd7e2021-07-22 17:31:513387 MdnsListenerUpdateType::kAdded, DnsQueryType::A,
3388 CreateExpected("1.2.3.4", 80)),
Eric Orth026776a2019-01-18 00:13:283389 TestMdnsListenerDelegate::CreateExpectedResult(
Matt Menke991dd7e2021-07-22 17:31:513390 MdnsListenerUpdateType::kChanged, DnsQueryType::A,
3391 CreateExpected("5.6.7.8", 80)),
Eric Orth026776a2019-01-18 00:13:283392 TestMdnsListenerDelegate::CreateExpectedResult(
Matt Menke991dd7e2021-07-22 17:31:513393 MdnsListenerUpdateType::kRemoved, DnsQueryType::A,
3394 CreateExpected("5.6.7.8", 80))));
Eric Orth026776a2019-01-18 00:13:283395
3396 EXPECT_THAT(delegate.text_results(), testing::IsEmpty());
3397 EXPECT_THAT(delegate.hostname_results(), testing::IsEmpty());
3398 EXPECT_THAT(delegate.unhandled_results(), testing::IsEmpty());
3399}
3400
Eric Orthe857ebb2019-03-13 23:02:073401TEST_F(HostResolverManagerTest, MdnsListener_StartListenFailure) {
3402 // Inject an MdnsClient mock that will always fail to start listening.
3403 auto client = std::make_unique<MockMDnsClient>();
3404 EXPECT_CALL(*client, StartListening(_)).WillOnce(Return(ERR_TIMED_OUT));
3405 EXPECT_CALL(*client, IsListening()).WillRepeatedly(Return(false));
3406 resolver_->SetMdnsClientForTesting(std::move(client));
3407
3408 std::unique_ptr<HostResolver::MdnsListener> listener =
3409 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 80),
3410 DnsQueryType::A);
3411 TestMdnsListenerDelegate delegate;
3412 EXPECT_THAT(listener->Start(&delegate), IsError(ERR_TIMED_OUT));
3413 EXPECT_THAT(delegate.address_results(), testing::IsEmpty());
3414}
3415
Eric Orth026776a2019-01-18 00:13:283416// Test that removal notifications are sent on natural expiration of MDNS
3417// records.
Eric Orth960e7062019-03-08 18:43:543418TEST_F(HostResolverManagerTest, MdnsListener_Expiration) {
Eric Orth026776a2019-01-18 00:13:283419 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3420 base::SimpleTestClock clock;
3421 clock.SetNow(base::Time::Now());
3422 auto cache_cleanup_timer = std::make_unique<base::MockOneShotTimer>();
3423 auto* cache_cleanup_timer_ptr = cache_cleanup_timer.get();
3424 auto mdns_client =
3425 std::make_unique<MDnsClientImpl>(&clock, std::move(cache_cleanup_timer));
Eric Orthe857ebb2019-03-13 23:02:073426 ASSERT_THAT(mdns_client->StartListening(socket_factory.get()), IsOk());
Eric Orth026776a2019-01-18 00:13:283427 resolver_->SetMdnsClientForTesting(std::move(mdns_client));
3428
3429 std::unique_ptr<HostResolver::MdnsListener> listener =
3430 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 100),
3431 DnsQueryType::A);
3432
3433 TestMdnsListenerDelegate delegate;
3434 ASSERT_THAT(listener->Start(&delegate), IsOk());
3435 ASSERT_THAT(delegate.address_results(), testing::IsEmpty());
3436
3437 socket_factory->SimulateReceive(kMdnsResponseA, sizeof(kMdnsResponseA));
3438
3439 EXPECT_THAT(
3440 delegate.address_results(),
3441 testing::ElementsAre(TestMdnsListenerDelegate::CreateExpectedResult(
Matt Menke991dd7e2021-07-22 17:31:513442 MdnsListenerUpdateType::kAdded, DnsQueryType::A,
3443 CreateExpected("1.2.3.4", 100))));
Eric Orth026776a2019-01-18 00:13:283444
Peter Kastinge5a38ed2021-10-02 03:06:353445 clock.Advance(base::Seconds(16));
Eric Orth026776a2019-01-18 00:13:283446 cache_cleanup_timer_ptr->Fire();
3447
3448 EXPECT_THAT(delegate.address_results(),
3449 testing::ElementsAre(
3450 TestMdnsListenerDelegate::CreateExpectedResult(
Matt Menke991dd7e2021-07-22 17:31:513451 MdnsListenerUpdateType::kAdded, DnsQueryType::A,
3452 CreateExpected("1.2.3.4", 100)),
Eric Orth026776a2019-01-18 00:13:283453 TestMdnsListenerDelegate::CreateExpectedResult(
Matt Menke991dd7e2021-07-22 17:31:513454 MdnsListenerUpdateType::kRemoved, DnsQueryType::A,
3455 CreateExpected("1.2.3.4", 100))));
Eric Orth026776a2019-01-18 00:13:283456
3457 EXPECT_THAT(delegate.text_results(), testing::IsEmpty());
3458 EXPECT_THAT(delegate.hostname_results(), testing::IsEmpty());
3459 EXPECT_THAT(delegate.unhandled_results(), testing::IsEmpty());
3460}
3461
Eric Orth960e7062019-03-08 18:43:543462TEST_F(HostResolverManagerTest, MdnsListener_Txt) {
Eric Orth026776a2019-01-18 00:13:283463 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3464 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
3465 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
3466
3467 std::unique_ptr<HostResolver::MdnsListener> listener =
3468 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 12),
3469 DnsQueryType::TXT);
3470
3471 TestMdnsListenerDelegate delegate;
3472 ASSERT_THAT(listener->Start(&delegate), IsOk());
3473 ASSERT_THAT(delegate.text_results(), testing::IsEmpty());
3474
3475 socket_factory_ptr->SimulateReceive(kMdnsResponseTxt,
3476 sizeof(kMdnsResponseTxt));
3477
Matt Menke991dd7e2021-07-22 17:31:513478 EXPECT_THAT(
3479 delegate.text_results(),
3480 testing::ElementsAre(
3481 TestMdnsListenerDelegate::CreateExpectedResult(
3482 MdnsListenerUpdateType::kAdded, DnsQueryType::TXT, "foo"),
3483 TestMdnsListenerDelegate::CreateExpectedResult(
3484 MdnsListenerUpdateType::kAdded, DnsQueryType::TXT, "bar")));
Eric Orth026776a2019-01-18 00:13:283485
3486 EXPECT_THAT(delegate.address_results(), testing::IsEmpty());
3487 EXPECT_THAT(delegate.hostname_results(), testing::IsEmpty());
3488 EXPECT_THAT(delegate.unhandled_results(), testing::IsEmpty());
3489}
3490
Eric Orth960e7062019-03-08 18:43:543491TEST_F(HostResolverManagerTest, MdnsListener_Ptr) {
Eric Orth026776a2019-01-18 00:13:283492 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3493 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
3494 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
3495
3496 std::unique_ptr<HostResolver::MdnsListener> listener =
3497 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 13),
3498 DnsQueryType::PTR);
3499
3500 TestMdnsListenerDelegate delegate;
3501 ASSERT_THAT(listener->Start(&delegate), IsOk());
3502 ASSERT_THAT(delegate.text_results(), testing::IsEmpty());
3503
3504 socket_factory_ptr->SimulateReceive(kMdnsResponsePtr,
3505 sizeof(kMdnsResponsePtr));
3506
3507 EXPECT_THAT(
3508 delegate.hostname_results(),
3509 testing::ElementsAre(TestMdnsListenerDelegate::CreateExpectedResult(
Matt Menke991dd7e2021-07-22 17:31:513510 MdnsListenerUpdateType::kAdded, DnsQueryType::PTR,
3511 HostPortPair("foo.com", 13))));
Eric Orth026776a2019-01-18 00:13:283512
3513 EXPECT_THAT(delegate.address_results(), testing::IsEmpty());
3514 EXPECT_THAT(delegate.text_results(), testing::IsEmpty());
3515 EXPECT_THAT(delegate.unhandled_results(), testing::IsEmpty());
3516}
3517
Eric Orth960e7062019-03-08 18:43:543518TEST_F(HostResolverManagerTest, MdnsListener_Srv) {
Eric Orth026776a2019-01-18 00:13:283519 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3520 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
3521 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
3522
3523 std::unique_ptr<HostResolver::MdnsListener> listener =
3524 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 14),
3525 DnsQueryType::SRV);
3526
3527 TestMdnsListenerDelegate delegate;
3528 ASSERT_THAT(listener->Start(&delegate), IsOk());
3529 ASSERT_THAT(delegate.text_results(), testing::IsEmpty());
3530
3531 socket_factory_ptr->SimulateReceive(kMdnsResponseSrv,
3532 sizeof(kMdnsResponseSrv));
3533
3534 EXPECT_THAT(
3535 delegate.hostname_results(),
3536 testing::ElementsAre(TestMdnsListenerDelegate::CreateExpectedResult(
Matt Menke991dd7e2021-07-22 17:31:513537 MdnsListenerUpdateType::kAdded, DnsQueryType::SRV,
3538 HostPortPair("foo.com", 8265))));
Eric Orth026776a2019-01-18 00:13:283539
3540 EXPECT_THAT(delegate.address_results(), testing::IsEmpty());
3541 EXPECT_THAT(delegate.text_results(), testing::IsEmpty());
3542 EXPECT_THAT(delegate.unhandled_results(), testing::IsEmpty());
3543}
3544
3545// Ensure query types we are not listening for do not affect MdnsListener.
Eric Orth960e7062019-03-08 18:43:543546TEST_F(HostResolverManagerTest, MdnsListener_NonListeningTypes) {
Eric Orth026776a2019-01-18 00:13:283547 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3548 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
3549 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
3550
3551 std::unique_ptr<HostResolver::MdnsListener> listener =
3552 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 41),
3553 DnsQueryType::A);
3554
3555 TestMdnsListenerDelegate delegate;
3556 ASSERT_THAT(listener->Start(&delegate), IsOk());
3557
3558 socket_factory_ptr->SimulateReceive(kMdnsResponseAAAA,
3559 sizeof(kMdnsResponseAAAA));
3560
3561 EXPECT_THAT(delegate.address_results(), testing::IsEmpty());
3562 EXPECT_THAT(delegate.text_results(), testing::IsEmpty());
3563 EXPECT_THAT(delegate.hostname_results(), testing::IsEmpty());
3564 EXPECT_THAT(delegate.unhandled_results(), testing::IsEmpty());
3565}
3566
Eric Orth960e7062019-03-08 18:43:543567TEST_F(HostResolverManagerTest, MdnsListener_RootDomain) {
Eric Orth026776a2019-01-18 00:13:283568 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3569 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
3570 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
3571
3572 std::unique_ptr<HostResolver::MdnsListener> listener =
3573 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 5),
3574 DnsQueryType::PTR);
3575
3576 TestMdnsListenerDelegate delegate;
3577 ASSERT_THAT(listener->Start(&delegate), IsOk());
3578
3579 socket_factory_ptr->SimulateReceive(kMdnsResponsePtrRoot,
3580 sizeof(kMdnsResponsePtrRoot));
3581
3582 EXPECT_THAT(delegate.unhandled_results(),
3583 testing::ElementsAre(std::make_pair(
Matt Menke991dd7e2021-07-22 17:31:513584 MdnsListenerUpdateType::kAdded, DnsQueryType::PTR)));
Eric Orth026776a2019-01-18 00:13:283585
3586 EXPECT_THAT(delegate.address_results(), testing::IsEmpty());
3587 EXPECT_THAT(delegate.text_results(), testing::IsEmpty());
3588 EXPECT_THAT(delegate.hostname_results(), testing::IsEmpty());
3589}
Eric Orth9871aafa2018-10-02 19:59:183590#endif // BUILDFLAG(ENABLE_MDNS)
3591
[email protected]78eac2a2012-03-14 19:09:273592DnsConfig CreateValidDnsConfig() {
martijna23c8962016-03-04 18:18:513593 IPAddress dns_ip(192, 168, 1, 0);
[email protected]78eac2a2012-03-14 19:09:273594 DnsConfig config;
[email protected]38b50d92012-04-19 21:07:523595 config.nameservers.push_back(IPEndPoint(dns_ip, dns_protocol::kDefaultPort));
Eric Orthc63cf502020-04-03 21:21:273596 config.dns_over_https_servers.push_back({DnsOverHttpsServerConfig(
dalyk4f4ac712019-05-31 16:33:133597 "https://dns.example.com/", true /* use_post */)});
Eric Ortha093b092020-09-24 23:13:023598 config.secure_dns_mode = SecureDnsMode::kOff;
[email protected]78eac2a2012-03-14 19:09:273599 EXPECT_TRUE(config.IsValid());
3600 return config;
3601}
3602
dalykf93a48e372019-09-04 02:57:593603DnsConfig CreateUpgradableDnsConfig() {
3604 DnsConfig config;
Eric Ortha093b092020-09-24 23:13:023605 config.secure_dns_mode = SecureDnsMode::kAutomatic;
dalykf93a48e372019-09-04 02:57:593606 config.allow_dns_over_https_upgrade = true;
3607 // Cloudflare upgradeable IPs
3608 IPAddress dns_ip0(1, 0, 0, 1);
3609 IPAddress dns_ip1;
3610 EXPECT_TRUE(dns_ip1.AssignFromIPLiteral("2606:4700:4700::1111"));
3611 // SafeBrowsing family filter upgradeable IP
3612 IPAddress dns_ip2;
3613 EXPECT_TRUE(dns_ip2.AssignFromIPLiteral("2a0d:2a00:2::"));
3614 // SafeBrowsing security filter upgradeable IP
3615 IPAddress dns_ip3(185, 228, 169, 9);
3616 // Non-upgradeable IP
3617 IPAddress dns_ip4(1, 2, 3, 4);
3618
3619 config.nameservers.push_back(IPEndPoint(dns_ip0, dns_protocol::kDefaultPort));
3620 config.nameservers.push_back(IPEndPoint(dns_ip1, dns_protocol::kDefaultPort));
3621 config.nameservers.push_back(IPEndPoint(dns_ip2, 54));
3622 config.nameservers.push_back(IPEndPoint(dns_ip3, dns_protocol::kDefaultPort));
3623 config.nameservers.push_back(IPEndPoint(dns_ip4, dns_protocol::kDefaultPort));
3624 EXPECT_TRUE(config.IsValid());
3625 return config;
3626}
3627
Matt Menkef4023312019-11-01 18:24:553628// Check that entries are written to the cache with the right NIK.
3629TEST_F(HostResolverManagerTest, NetworkIsolationKeyWriteToHostCache) {
Matt Menke4807a9a2020-11-21 00:14:413630 const SchemefulSite kSite1(GURL("https://origin1.test/"));
3631 const SchemefulSite kSite2(GURL("https://origin2.test/"));
3632 const NetworkIsolationKey kNetworkIsolationKey1(kSite1, kSite1);
3633 const NetworkIsolationKey kNetworkIsolationKey2(kSite2, kSite2);
Matt Menkef4023312019-11-01 18:24:553634
3635 const char kFirstDnsResult[] = "192.168.1.42";
3636 const char kSecondDnsResult[] = "192.168.1.43";
3637
3638 for (bool split_cache_by_network_isolation_key : {false, true}) {
3639 base::test::ScopedFeatureList feature_list;
3640 if (split_cache_by_network_isolation_key) {
3641 feature_list.InitAndEnableFeature(
3642 features::kSplitHostCacheByNetworkIsolationKey);
3643 } else {
3644 feature_list.InitAndDisableFeature(
3645 features::kSplitHostCacheByNetworkIsolationKey);
3646 }
3647 proc_->AddRuleForAllFamilies("just.testing", kFirstDnsResult);
3648 proc_->SignalMultiple(1u);
3649
3650 // Resolve a host using kNetworkIsolationKey1.
3651 ResolveHostResponseHelper response1(resolver_->CreateRequest(
3652 HostPortPair("just.testing", 80), kNetworkIsolationKey1,
Anton Bikineev068d2912021-05-15 20:43:523653 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:503654 resolve_context_->host_cache()));
Matt Menkef4023312019-11-01 18:24:553655 EXPECT_THAT(response1.result_error(), IsOk());
3656 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
3657 testing::ElementsAre(CreateExpected(kFirstDnsResult, 80)));
3658 EXPECT_FALSE(response1.request()->GetStaleInfo());
3659 EXPECT_EQ(1u, proc_->GetCaptureList().size());
3660
3661 // If the host cache is being split by NetworkIsolationKeys, there should be
3662 // an entry in the HostCache with kNetworkIsolationKey1. Otherwise, there
3663 // should be an entry with the empy NIK.
3664 if (split_cache_by_network_isolation_key) {
3665 EXPECT_TRUE(GetCacheHit(
3666 HostCache::Key("just.testing", DnsQueryType::UNSPECIFIED,
3667 0 /* host_resolver_flags */, HostResolverSource::ANY,
3668 kNetworkIsolationKey1)));
3669
3670 EXPECT_FALSE(GetCacheHit(
3671 HostCache::Key("just.testing", DnsQueryType::UNSPECIFIED,
3672 0 /* host_resolver_flags */, HostResolverSource::ANY,
3673 NetworkIsolationKey())));
3674 } else {
3675 EXPECT_FALSE(GetCacheHit(
3676 HostCache::Key("just.testing", DnsQueryType::UNSPECIFIED,
3677 0 /* host_resolver_flags */, HostResolverSource::ANY,
3678 kNetworkIsolationKey1)));
3679
3680 EXPECT_TRUE(GetCacheHit(
3681 HostCache::Key("just.testing", DnsQueryType::UNSPECIFIED,
3682 0 /* host_resolver_flags */, HostResolverSource::ANY,
3683 NetworkIsolationKey())));
3684 }
3685
3686 // There should be no entry using kNetworkIsolationKey2 in either case.
3687 EXPECT_FALSE(GetCacheHit(HostCache::Key(
3688 "just.testing", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
3689 HostResolverSource::ANY, kNetworkIsolationKey2)));
3690
3691 // A request using kNetworkIsolationKey2 should only be served out of the
3692 // cache of the cache if |split_cache_by_network_isolation_key| is false. If
3693 // it's not served over the network, it is provided a different result.
3694 if (split_cache_by_network_isolation_key) {
3695 proc_->AddRuleForAllFamilies("just.testing", kSecondDnsResult);
3696 proc_->SignalMultiple(1u);
3697 }
3698 ResolveHostResponseHelper response2(resolver_->CreateRequest(
3699 HostPortPair("just.testing", 80), kNetworkIsolationKey2,
Anton Bikineev068d2912021-05-15 20:43:523700 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:503701 resolve_context_->host_cache()));
Matt Menkef4023312019-11-01 18:24:553702 EXPECT_THAT(response2.result_error(), IsOk());
3703 if (split_cache_by_network_isolation_key) {
3704 EXPECT_THAT(response2.request()->GetAddressResults().value().endpoints(),
3705 testing::ElementsAre(CreateExpected(kSecondDnsResult, 80)));
3706 EXPECT_FALSE(response2.request()->GetStaleInfo());
3707 EXPECT_EQ(2u, proc_->GetCaptureList().size());
3708 EXPECT_TRUE(GetCacheHit(
3709 HostCache::Key("just.testing", DnsQueryType::UNSPECIFIED,
3710 0 /* host_resolver_flags */, HostResolverSource::ANY,
3711 kNetworkIsolationKey2)));
3712 } else {
3713 EXPECT_THAT(response2.request()->GetAddressResults().value().endpoints(),
3714 testing::ElementsAre(CreateExpected(kFirstDnsResult, 80)));
3715 EXPECT_TRUE(response2.request()->GetStaleInfo());
3716 EXPECT_EQ(1u, proc_->GetCaptureList().size());
3717 EXPECT_FALSE(GetCacheHit(
3718 HostCache::Key("just.testing", DnsQueryType::UNSPECIFIED,
3719 0 /* host_resolver_flags */, HostResolverSource::ANY,
3720 kNetworkIsolationKey2)));
3721 }
3722
Eric Orthaf82b49a2020-02-01 01:48:503723 resolve_context_->host_cache()->clear();
Matt Menkef4023312019-11-01 18:24:553724 proc_->ClearCaptureList();
3725 }
3726}
3727
3728// Check that entries are read to the cache with the right NIK.
3729TEST_F(HostResolverManagerTest, NetworkIsolationKeyReadFromHostCache) {
Matt Menke4807a9a2020-11-21 00:14:413730 const SchemefulSite kSite1(GURL("https://origin1.test/"));
3731 const SchemefulSite kSite2(GURL("https://origin2.test/"));
3732 const NetworkIsolationKey kNetworkIsolationKey1(kSite1, kSite1);
3733 const NetworkIsolationKey kNetworkIsolationKey2(kSite2, kSite2);
Matt Menkef4023312019-11-01 18:24:553734
3735 struct CacheEntry {
3736 NetworkIsolationKey network_isolation_key;
3737 const char* cached_ip_address;
3738 };
3739
3740 const CacheEntry kCacheEntries[] = {
3741 {NetworkIsolationKey(), "192.168.1.42"},
3742 {kNetworkIsolationKey1, "192.168.1.43"},
3743 {kNetworkIsolationKey2, "192.168.1.44"},
3744 };
3745
3746 // Add entries to cache for the empty NIK, NIK1, and NIK2. Only the
3747 // HostResolverManager obeys features::kSplitHostCacheByNetworkIsolationKey,
3748 // so this is fine to do regardless of the feature value.
3749 for (const auto& cache_entry : kCacheEntries) {
3750 HostCache::Key key("just.testing", DnsQueryType::UNSPECIFIED, 0,
3751 HostResolverSource::ANY,
3752 cache_entry.network_isolation_key);
3753 IPAddress address;
3754 ASSERT_TRUE(address.AssignFromIPLiteral(cache_entry.cached_ip_address));
3755 HostCache::Entry entry =
3756 HostCache::Entry(OK, AddressList::CreateFromIPAddress(address, 80),
3757 HostCache::Entry::SOURCE_UNKNOWN);
Eric Orthaf82b49a2020-02-01 01:48:503758 resolve_context_->host_cache()->Set(key, entry, base::TimeTicks::Now(),
Peter Kastinge5a38ed2021-10-02 03:06:353759 base::Days(1));
Matt Menkef4023312019-11-01 18:24:553760 }
3761
3762 for (bool split_cache_by_network_isolation_key : {false, true}) {
3763 base::test::ScopedFeatureList feature_list;
3764 if (split_cache_by_network_isolation_key) {
3765 feature_list.InitAndEnableFeature(
3766 features::kSplitHostCacheByNetworkIsolationKey);
3767 } else {
3768 feature_list.InitAndDisableFeature(
3769 features::kSplitHostCacheByNetworkIsolationKey);
3770 }
3771
3772 // A request that uses kNetworkIsolationKey1 will return cache entry 1 if
3773 // the NetworkIsolationKeys are being used, and cache entry 0 otherwise.
3774 ResolveHostResponseHelper response1(resolver_->CreateRequest(
3775 HostPortPair("just.testing", 80), kNetworkIsolationKey1,
Anton Bikineev068d2912021-05-15 20:43:523776 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:503777 resolve_context_->host_cache()));
Matt Menkef4023312019-11-01 18:24:553778 EXPECT_THAT(response1.result_error(), IsOk());
3779 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
3780 testing::ElementsAre(CreateExpected(
3781 kCacheEntries[split_cache_by_network_isolation_key ? 1 : 0]
3782 .cached_ip_address,
3783 80)));
3784 EXPECT_TRUE(response1.request()->GetStaleInfo());
3785
3786 // A request that uses kNetworkIsolationKey2 will return cache entry 2 if
3787 // the NetworkIsolationKeys are being used, and cache entry 0 otherwise.
3788 ResolveHostResponseHelper response2(resolver_->CreateRequest(
3789 HostPortPair("just.testing", 80), kNetworkIsolationKey2,
Anton Bikineev068d2912021-05-15 20:43:523790 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:503791 resolve_context_->host_cache()));
Matt Menkef4023312019-11-01 18:24:553792 EXPECT_THAT(response2.result_error(), IsOk());
3793 EXPECT_THAT(response2.request()->GetAddressResults().value().endpoints(),
3794 testing::ElementsAre(CreateExpected(
3795 kCacheEntries[split_cache_by_network_isolation_key ? 2 : 0]
3796 .cached_ip_address,
3797 80)));
3798 EXPECT_TRUE(response2.request()->GetStaleInfo());
3799 }
3800}
3801
3802// Test that two requests made with different NetworkIsolationKeys are not
3803// merged if |features::kSplitHostCacheByNetworkIsolationKey| is enabled.
3804TEST_F(HostResolverManagerTest, NetworkIsolationKeyTwoRequestsAtOnce) {
Matt Menke4807a9a2020-11-21 00:14:413805 const SchemefulSite kSite1(GURL("https://origin1.test/"));
3806 const SchemefulSite kSite2(GURL("https://origin2.test/"));
3807 const NetworkIsolationKey kNetworkIsolationKey1(kSite1, kSite1);
3808 const NetworkIsolationKey kNetworkIsolationKey2(kSite2, kSite2);
Matt Menkef4023312019-11-01 18:24:553809
3810 const char kDnsResult[] = "192.168.1.42";
3811
3812 for (bool split_cache_by_network_isolation_key : {false, true}) {
3813 base::test::ScopedFeatureList feature_list;
3814 if (split_cache_by_network_isolation_key) {
3815 feature_list.InitAndEnableFeature(
3816 features::kSplitHostCacheByNetworkIsolationKey);
3817 } else {
3818 feature_list.InitAndDisableFeature(
3819 features::kSplitHostCacheByNetworkIsolationKey);
3820 }
3821 proc_->AddRuleForAllFamilies("just.testing", kDnsResult);
3822
3823 // Start resolving a host using kNetworkIsolationKey1.
3824 ResolveHostResponseHelper response1(resolver_->CreateRequest(
3825 HostPortPair("just.testing", 80), kNetworkIsolationKey1,
Anton Bikineev068d2912021-05-15 20:43:523826 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:503827 resolve_context_->host_cache()));
Matt Menkef4023312019-11-01 18:24:553828 EXPECT_FALSE(response1.complete());
3829
3830 // Start resolving the same host using kNetworkIsolationKey2.
3831 ResolveHostResponseHelper response2(resolver_->CreateRequest(
3832 HostPortPair("just.testing", 80), kNetworkIsolationKey2,
Anton Bikineev068d2912021-05-15 20:43:523833 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:503834 resolve_context_->host_cache()));
Matt Menkef4023312019-11-01 18:24:553835 EXPECT_FALSE(response2.complete());
3836
3837 // Wait for and complete the expected number of over-the-wire DNS
3838 // resolutions.
3839 if (split_cache_by_network_isolation_key) {
3840 proc_->WaitFor(2);
3841 EXPECT_EQ(2u, proc_->GetCaptureList().size());
3842 proc_->SignalMultiple(2u);
3843 } else {
3844 proc_->WaitFor(1);
3845 EXPECT_EQ(1u, proc_->GetCaptureList().size());
3846 proc_->SignalMultiple(1u);
3847 }
3848
3849 // Both requests should have completed successfully, with neither served out
3850 // of the cache.
3851
3852 EXPECT_THAT(response1.result_error(), IsOk());
3853 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
3854 testing::ElementsAre(CreateExpected(kDnsResult, 80)));
3855 EXPECT_FALSE(response1.request()->GetStaleInfo());
3856
3857 EXPECT_THAT(response2.result_error(), IsOk());
3858 EXPECT_THAT(response2.request()->GetAddressResults().value().endpoints(),
3859 testing::ElementsAre(CreateExpected(kDnsResult, 80)));
3860 EXPECT_FALSE(response2.request()->GetStaleInfo());
3861
Eric Orthaf82b49a2020-02-01 01:48:503862 resolve_context_->host_cache()->clear();
Matt Menkef4023312019-11-01 18:24:553863 proc_->ClearCaptureList();
3864 }
3865}
3866
Eric Orth069a3c6e2020-01-31 23:14:243867// Test that two otherwise-identical requests with different ResolveContexts are
3868// not merged.
3869TEST_F(HostResolverManagerTest, ContextsNotMerged) {
3870 const char kDnsResult[] = "192.168.1.42";
3871
3872 proc_->AddRuleForAllFamilies("just.testing", kDnsResult);
3873
3874 // Start resolving a host using |resolve_context_|.
3875 ResolveHostResponseHelper response1(resolver_->CreateRequest(
3876 HostPortPair("just.testing", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:523877 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:503878 resolve_context_->host_cache()));
Eric Orth069a3c6e2020-01-31 23:14:243879 EXPECT_FALSE(response1.complete());
3880
3881 // Start resolving the same host using another ResolveContext and cache.
Eric Orthaf82b49a2020-02-01 01:48:503882 ResolveContext resolve_context2(resolve_context_->url_request_context(),
3883 true /* enable_caching */);
3884 resolver_->RegisterResolveContext(&resolve_context2);
Eric Orth069a3c6e2020-01-31 23:14:243885 ResolveHostResponseHelper response2(resolver_->CreateRequest(
3886 HostPortPair("just.testing", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:523887 NetLogWithSource(), absl::nullopt, &resolve_context2,
Eric Orthaf82b49a2020-02-01 01:48:503888 resolve_context2.host_cache()));
Eric Orth069a3c6e2020-01-31 23:14:243889 EXPECT_FALSE(response2.complete());
3890
3891 EXPECT_EQ(2u, resolver_->num_jobs_for_testing());
3892
3893 // Wait for and complete the 2 over-the-wire DNS resolutions.
3894 proc_->WaitFor(2);
3895 EXPECT_EQ(2u, proc_->GetCaptureList().size());
3896 proc_->SignalMultiple(2u);
3897
3898 // Both requests should have completed successfully, with neither served out
3899 // of the cache.
3900
3901 EXPECT_THAT(response1.result_error(), IsOk());
3902 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
3903 testing::ElementsAre(CreateExpected(kDnsResult, 80)));
3904 EXPECT_FALSE(response1.request()->GetStaleInfo());
3905
3906 EXPECT_THAT(response2.result_error(), IsOk());
3907 EXPECT_THAT(response2.request()->GetAddressResults().value().endpoints(),
3908 testing::ElementsAre(CreateExpected(kDnsResult, 80)));
3909 EXPECT_FALSE(response2.request()->GetStaleInfo());
3910
Eric Orthaf82b49a2020-02-01 01:48:503911 EXPECT_EQ(1u, resolve_context_->host_cache()->size());
3912 EXPECT_EQ(1u, resolve_context2.host_cache()->size());
Eric Orth069a3c6e2020-01-31 23:14:243913
Eric Orthaf82b49a2020-02-01 01:48:503914 resolver_->DeregisterResolveContext(&resolve_context2);
Eric Orth069a3c6e2020-01-31 23:14:243915}
3916
[email protected]1d932852012-06-19 19:40:333917// Specialized fixture for tests of DnsTask.
Eric Orth960e7062019-03-08 18:43:543918class HostResolverManagerDnsTest : public HostResolverManagerTest {
[email protected]daae1322013-09-05 18:26:503919 public:
David Van Cleve1fb5e8c2019-11-04 16:45:163920 explicit HostResolverManagerDnsTest(
3921 base::test::TaskEnvironment::TimeSource time_source =
Eric Orth5d21f152020-10-21 19:15:433922 base::test::TaskEnvironment::TimeSource::MOCK_TIME)
David Van Cleve1fb5e8c2019-11-04 16:45:163923 : HostResolverManagerTest(time_source),
Eric Orth23935862020-01-10 00:42:243924 notifier_task_runner_(
3925 base::MakeRefCounted<base::TestMockTimeTaskRunner>()),
Eric Orthfe6d5482019-09-03 18:27:573926 dns_client_(nullptr) {
3927 auto config_service = std::make_unique<TestDnsConfigService>();
3928 config_service_ = config_service.get();
3929 notifier_ = std::make_unique<SystemDnsConfigChangeNotifier>(
3930 notifier_task_runner_, std::move(config_service));
3931 }
[email protected]daae1322013-09-05 18:26:503932
[email protected]1d932852012-06-19 19:40:333933 protected:
Miriam Gershenson17acdf092017-08-23 19:43:083934 void TearDown() override {
Eric Orth960e7062019-03-08 18:43:543935 HostResolverManagerTest::TearDown();
Eric Orthfe6d5482019-09-03 18:27:573936 InvalidateDnsConfig();
Eric Orth23935862020-01-10 00:42:243937
3938 // Ensure |notifier_| is fully cleaned up before test shutdown.
3939 notifier_.reset();
3940 notifier_task_runner_->RunUntilIdle();
Miriam Gershenson17acdf092017-08-23 19:43:083941 }
3942
Eric Orth960e7062019-03-08 18:43:543943 // HostResolverManagerTest implementation:
Eric Orth4e55b362019-05-07 22:00:033944 HostResolver::ManagerOptions DefaultOptions() override {
3945 HostResolver::ManagerOptions options =
3946 HostResolverManagerTest::DefaultOptions();
dalykc27699a2019-07-29 20:53:293947 options.insecure_dns_client_enabled = true;
Eric Orth09746312021-05-05 15:44:583948 options.additional_types_via_insecure_dns_enabled = true;
Eric Orth4e55b362019-05-07 22:00:033949 return options;
3950 }
3951
Eric Orth4e55b362019-05-07 22:00:033952 void CreateResolverWithOptionsAndParams(HostResolver::ManagerOptions options,
3953 const ProcTaskParams& params,
3954 bool ipv6_reachable) override {
Eric Orth37b18192019-04-22 19:09:283955 DestroyResolver();
3956
Eric Orth4e55b362019-05-07 22:00:033957 resolver_ = std::make_unique<TestHostResolverManager>(
Eric Orthfe6d5482019-09-03 18:27:573958 options, notifier_.get(), nullptr /* net_log */, ipv6_reachable);
dalykc27699a2019-07-29 20:53:293959 auto dns_client =
3960 std::make_unique<MockDnsClient>(DnsConfig(), CreateDefaultDnsRules());
3961 dns_client_ = dns_client.get();
3962 resolver_->SetDnsClientForTesting(std::move(dns_client));
Eric Orth09746312021-05-05 15:44:583963 resolver_->SetInsecureDnsClientEnabled(
3964 options.insecure_dns_client_enabled,
3965 options.additional_types_via_insecure_dns_enabled);
[email protected]106ccd2c2014-06-17 09:21:003966 resolver_->set_proc_params_for_test(params);
Eric Orth37b18192019-04-22 19:09:283967
Eric Orthaf82b49a2020-02-01 01:48:503968 resolver_->RegisterResolveContext(resolve_context_.get());
[email protected]1d932852012-06-19 19:40:333969 }
3970
Eric Orth828bd3ae2018-12-12 17:30:363971 // Call after CreateResolver() to update the resolver with a new MockDnsClient
3972 // using |config| and |rules|.
3973 void UseMockDnsClient(const DnsConfig& config, MockDnsClientRuleList rules) {
3974 // HostResolver expects DnsConfig to get set after setting DnsClient, so
3975 // create first with an empty config and then update the config.
3976 auto dns_client =
3977 std::make_unique<MockDnsClient>(DnsConfig(), std::move(rules));
3978 dns_client_ = dns_client.get();
Eric Orth4e55b362019-05-07 22:00:033979 resolver_->SetDnsClientForTesting(std::move(dns_client));
Eric Orth09746312021-05-05 15:44:583980 resolver_->SetInsecureDnsClientEnabled(
3981 /*enabled=*/true,
3982 /*additional_dns_types_enabled=*/true);
Eric Orth828bd3ae2018-12-12 17:30:363983 if (!config.Equals(DnsConfig()))
3984 ChangeDnsConfig(config);
eroman1efc237c2016-12-14 00:00:453985 }
3986
Eric Orth828bd3ae2018-12-12 17:30:363987 static MockDnsClientRuleList CreateDefaultDnsRules() {
3988 MockDnsClientRuleList rules;
3989
3990 AddDnsRule(&rules, "nodomain", dns_protocol::kTypeA,
Peter Kastingd039b772021-08-18 00:06:203991 MockDnsClientRule::ResultType::kNoDomain, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363992 AddDnsRule(&rules, "nodomain", dns_protocol::kTypeAAAA,
Peter Kastingd039b772021-08-18 00:06:203993 MockDnsClientRule::ResultType::kNoDomain, false /* delay */);
3994 AddDnsRule(&rules, "nx", dns_protocol::kTypeA,
3995 MockDnsClientRule::ResultType::kFail, false /* delay */);
3996 AddDnsRule(&rules, "nx", dns_protocol::kTypeAAAA,
3997 MockDnsClientRule::ResultType::kFail, false /* delay */);
3998 AddDnsRule(&rules, "ok", dns_protocol::kTypeA,
3999 MockDnsClientRule::ResultType::kOk, false /* delay */);
4000 AddDnsRule(&rules, "ok", dns_protocol::kTypeAAAA,
4001 MockDnsClientRule::ResultType::kOk, false /* delay */);
4002 AddDnsRule(&rules, "4ok", dns_protocol::kTypeA,
4003 MockDnsClientRule::ResultType::kOk, false /* delay */);
4004 AddDnsRule(&rules, "4ok", dns_protocol::kTypeAAAA,
4005 MockDnsClientRule::ResultType::kEmpty, false /* delay */);
4006 AddDnsRule(&rules, "6ok", dns_protocol::kTypeA,
4007 MockDnsClientRule::ResultType::kEmpty, false /* delay */);
4008 AddDnsRule(&rules, "6ok", dns_protocol::kTypeAAAA,
4009 MockDnsClientRule::ResultType::kOk, false /* delay */);
4010 AddDnsRule(&rules, "4nx", dns_protocol::kTypeA,
4011 MockDnsClientRule::ResultType::kOk, false /* delay */);
4012 AddDnsRule(&rules, "4nx", dns_protocol::kTypeAAAA,
4013 MockDnsClientRule::ResultType::kFail, false /* delay */);
4014 AddDnsRule(&rules, "empty", dns_protocol::kTypeA,
4015 MockDnsClientRule::ResultType::kEmpty, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:364016 AddDnsRule(&rules, "empty", dns_protocol::kTypeAAAA,
Peter Kastingd039b772021-08-18 00:06:204017 MockDnsClientRule::ResultType::kEmpty, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:364018
Peter Kastingd039b772021-08-18 00:06:204019 AddDnsRule(&rules, "slow_nx", dns_protocol::kTypeA,
4020 MockDnsClientRule::ResultType::kFail, true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:364021 AddDnsRule(&rules, "slow_nx", dns_protocol::kTypeAAAA,
Peter Kastingd039b772021-08-18 00:06:204022 MockDnsClientRule::ResultType::kFail, true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:364023
Peter Kastingd039b772021-08-18 00:06:204024 AddDnsRule(&rules, "4slow_ok", dns_protocol::kTypeA,
4025 MockDnsClientRule::ResultType::kOk, true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:364026 AddDnsRule(&rules, "4slow_ok", dns_protocol::kTypeAAAA,
Peter Kastingd039b772021-08-18 00:06:204027 MockDnsClientRule::ResultType::kOk, false /* delay */);
4028 AddDnsRule(&rules, "6slow_ok", dns_protocol::kTypeA,
4029 MockDnsClientRule::ResultType::kOk, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:364030 AddDnsRule(&rules, "6slow_ok", dns_protocol::kTypeAAAA,
Peter Kastingd039b772021-08-18 00:06:204031 MockDnsClientRule::ResultType::kOk, true /* delay */);
4032 AddDnsRule(&rules, "4slow_4ok", dns_protocol::kTypeA,
4033 MockDnsClientRule::ResultType::kOk, true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:364034 AddDnsRule(&rules, "4slow_4ok", dns_protocol::kTypeAAAA,
Peter Kastingd039b772021-08-18 00:06:204035 MockDnsClientRule::ResultType::kEmpty, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:364036 AddDnsRule(&rules, "4slow_4timeout", dns_protocol::kTypeA,
Peter Kastingd039b772021-08-18 00:06:204037 MockDnsClientRule::ResultType::kTimeout, true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:364038 AddDnsRule(&rules, "4slow_4timeout", dns_protocol::kTypeAAAA,
Peter Kastingd039b772021-08-18 00:06:204039 MockDnsClientRule::ResultType::kOk, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:364040 AddDnsRule(&rules, "4slow_6timeout", dns_protocol::kTypeA,
Peter Kastingd039b772021-08-18 00:06:204041 MockDnsClientRule::ResultType::kOk, true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:364042 AddDnsRule(&rules, "4slow_6timeout", dns_protocol::kTypeAAAA,
Peter Kastingd039b772021-08-18 00:06:204043 MockDnsClientRule::ResultType::kTimeout, false /* delay */);
dalyk48b20a992019-02-25 16:10:264044
Eric Orth828bd3ae2018-12-12 17:30:364045 AddDnsRule(&rules, "4collision", dns_protocol::kTypeA,
dalyk48b20a992019-02-25 16:10:264046 IPAddress(127, 0, 53, 53), false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:364047 AddDnsRule(&rules, "4collision", dns_protocol::kTypeAAAA,
Peter Kastingd039b772021-08-18 00:06:204048 MockDnsClientRule::ResultType::kEmpty, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:364049 AddDnsRule(&rules, "6collision", dns_protocol::kTypeA,
Peter Kastingd039b772021-08-18 00:06:204050 MockDnsClientRule::ResultType::kEmpty, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:364051 // This isn't the expected IP for collisions (but looks close to it).
4052 AddDnsRule(&rules, "6collision", dns_protocol::kTypeAAAA,
4053 IPAddress(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 0, 53, 53),
dalyk48b20a992019-02-25 16:10:264054 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:364055
dalyk4f4ac712019-05-31 16:33:134056 AddSecureDnsRule(&rules, "automatic_nodomain", dns_protocol::kTypeA,
Peter Kastingd039b772021-08-18 00:06:204057 MockDnsClientRule::ResultType::kNoDomain,
4058 false /* delay */);
dalyk4f4ac712019-05-31 16:33:134059 AddSecureDnsRule(&rules, "automatic_nodomain", dns_protocol::kTypeAAAA,
Peter Kastingd039b772021-08-18 00:06:204060 MockDnsClientRule::ResultType::kNoDomain,
4061 false /* delay */);
dalyk4f4ac712019-05-31 16:33:134062 AddDnsRule(&rules, "automatic_nodomain", dns_protocol::kTypeA,
Peter Kastingd039b772021-08-18 00:06:204063 MockDnsClientRule::ResultType::kNoDomain, false /* delay */);
dalyk4f4ac712019-05-31 16:33:134064 AddDnsRule(&rules, "automatic_nodomain", dns_protocol::kTypeAAAA,
Peter Kastingd039b772021-08-18 00:06:204065 MockDnsClientRule::ResultType::kNoDomain, false /* delay */);
dalyk4f4ac712019-05-31 16:33:134066 AddSecureDnsRule(&rules, "automatic", dns_protocol::kTypeA,
Peter Kastingd039b772021-08-18 00:06:204067 MockDnsClientRule::ResultType::kOk, false /* delay */);
dalyk4f4ac712019-05-31 16:33:134068 AddSecureDnsRule(&rules, "automatic", dns_protocol::kTypeAAAA,
Peter Kastingd039b772021-08-18 00:06:204069 MockDnsClientRule::ResultType::kOk, false /* delay */);
4070 AddDnsRule(&rules, "automatic", dns_protocol::kTypeA,
4071 MockDnsClientRule::ResultType::kOk, false /* delay */);
dalyk4f4ac712019-05-31 16:33:134072 AddDnsRule(&rules, "automatic", dns_protocol::kTypeAAAA,
Peter Kastingd039b772021-08-18 00:06:204073 MockDnsClientRule::ResultType::kOk, false /* delay */);
dalyk4f4ac712019-05-31 16:33:134074 AddDnsRule(&rules, "insecure_automatic", dns_protocol::kTypeA,
Peter Kastingd039b772021-08-18 00:06:204075 MockDnsClientRule::ResultType::kOk, false /* delay */);
dalyk4f4ac712019-05-31 16:33:134076 AddDnsRule(&rules, "insecure_automatic", dns_protocol::kTypeAAAA,
Peter Kastingd039b772021-08-18 00:06:204077 MockDnsClientRule::ResultType::kOk, false /* delay */);
dalyk4f4ac712019-05-31 16:33:134078
dalykc27699a2019-07-29 20:53:294079 AddSecureDnsRule(&rules, "secure", dns_protocol::kTypeA,
Peter Kastingd039b772021-08-18 00:06:204080 MockDnsClientRule::ResultType::kOk, false /* delay */);
dalykc27699a2019-07-29 20:53:294081 AddSecureDnsRule(&rules, "secure", dns_protocol::kTypeAAAA,
Peter Kastingd039b772021-08-18 00:06:204082 MockDnsClientRule::ResultType::kOk, false /* delay */);
dalykc27699a2019-07-29 20:53:294083
Eric Orth828bd3ae2018-12-12 17:30:364084 return rules;
eroman1efc237c2016-12-14 00:00:454085 }
4086
Eric Orth828bd3ae2018-12-12 17:30:364087 // Adds a rule to |rules|.
4088 static void AddDnsRule(MockDnsClientRuleList* rules,
4089 const std::string& prefix,
4090 uint16_t qtype,
4091 MockDnsClientRule::ResultType result_type,
4092 bool delay) {
dalyk4f4ac712019-05-31 16:33:134093 rules->emplace_back(prefix, qtype, false /* secure */,
dalykad3f6c32019-03-06 13:38:334094 MockDnsClientRule::Result(result_type), delay);
Eric Orth828bd3ae2018-12-12 17:30:364095 }
4096
4097 static void AddDnsRule(MockDnsClientRuleList* rules,
4098 const std::string& prefix,
4099 uint16_t qtype,
4100 const IPAddress& result_ip,
4101 bool delay) {
Eric Ortha97f0f72020-10-16 16:10:324102 rules->emplace_back(prefix, qtype, false /* secure */,
4103 MockDnsClientRule::Result(
4104 BuildTestDnsAddressResponse(prefix, result_ip)),
4105 delay);
Eric Orth828bd3ae2018-12-12 17:30:364106 }
4107
4108 static void AddDnsRule(MockDnsClientRuleList* rules,
4109 const std::string& prefix,
4110 uint16_t qtype,
4111 IPAddress result_ip,
4112 std::string cannonname,
4113 bool delay) {
Eric Ortha97f0f72020-10-16 16:10:324114 rules->emplace_back(
4115 prefix, qtype, false /* secure */,
4116 MockDnsClientRule::Result(BuildTestDnsAddressResponseWithCname(
4117 prefix, result_ip, std::move(cannonname))),
4118 delay);
[email protected]0adcb2b2012-08-15 21:30:464119 }
4120
Cammie Smith Barnes78c07782020-12-07 23:27:044121 static void AddDnsRule(MockDnsClientRuleList* rules,
4122
4123 const std::string& prefix,
4124 uint16_t qtype,
4125 DnsResponse dns_test_response,
4126 bool delay) {
4127 rules->emplace_back(prefix, qtype, false /* secure */,
4128 MockDnsClientRule::Result(std::move(dns_test_response)),
4129 delay);
4130 }
4131
dalyk48b20a992019-02-25 16:10:264132 static void AddSecureDnsRule(MockDnsClientRuleList* rules,
4133 const std::string& prefix,
4134 uint16_t qtype,
4135 MockDnsClientRule::ResultType result_type,
4136 bool delay) {
dalyk4f4ac712019-05-31 16:33:134137 rules->emplace_back(prefix, qtype, true /* secure */,
4138 MockDnsClientRule::Result(result_type), delay);
dalyk48b20a992019-02-25 16:10:264139 }
4140
[email protected]1d932852012-06-19 19:40:334141 void ChangeDnsConfig(const DnsConfig& config) {
Eric Orthfe6d5482019-09-03 18:27:574142 DCHECK(config.IsValid());
4143
4144 notifier_task_runner_->PostTask(
4145 FROM_HERE,
4146 base::BindOnce(&TestDnsConfigService::OnHostsRead,
4147 base::Unretained(config_service_), config.hosts));
4148 notifier_task_runner_->PostTask(
4149 FROM_HERE, base::BindOnce(&TestDnsConfigService::OnConfigRead,
4150 base::Unretained(config_service_), config));
4151
Eric Orth23935862020-01-10 00:42:244152 notifier_task_runner_->RunUntilIdle();
4153 base::RunLoop().RunUntilIdle();
Eric Orthfe6d5482019-09-03 18:27:574154 }
4155
4156 void InvalidateDnsConfig() {
4157 notifier_task_runner_->PostTask(
4158 FROM_HERE,
4159 base::BindOnce(&TestDnsConfigService::OnHostsRead,
4160 base::Unretained(config_service_), DnsHosts()));
4161 notifier_task_runner_->PostTask(
4162 FROM_HERE, base::BindOnce(&TestDnsConfigService::InvalidateConfig,
4163 base::Unretained(config_service_)));
4164
Eric Orth23935862020-01-10 00:42:244165 notifier_task_runner_->FastForwardBy(
4166 DnsConfigService::kInvalidationTimeout);
4167 base::RunLoop().RunUntilIdle();
[email protected]1d932852012-06-19 19:40:334168 }
4169
Miriam Gershenson44aafc122017-10-18 19:29:254170 void SetInitialDnsConfig(const DnsConfig& config) {
Eric Orthfe6d5482019-09-03 18:27:574171 InvalidateDnsConfig();
4172 ChangeDnsConfig(config);
Miriam Gershenson44aafc122017-10-18 19:29:254173 }
4174
Ben Schwartz432ce032021-05-05 21:49:244175 void TriggerInsecureFailureCondition() {
4176 proc_->AddRuleForAllFamilies(std::string(),
4177 std::string()); // Default to failures.
4178
4179 // Disable Secure DNS for these requests.
4180 HostResolver::ResolveHostParameters parameters;
4181 parameters.secure_dns_policy = SecureDnsPolicy::kDisable;
4182
4183 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
4184 for (unsigned i = 0; i < maximum_insecure_dns_task_failures(); ++i) {
4185 // Use custom names to require separate Jobs.
4186 std::string hostname = base::StringPrintf("nx_%u", i);
4187 // Ensure fallback to ProcTask succeeds.
4188 proc_->AddRuleForAllFamilies(hostname, "192.168.1.101");
4189 responses.emplace_back(
4190 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
4191 HostPortPair(hostname, 80), NetworkIsolationKey(),
4192 NetLogWithSource(), parameters, resolve_context_.get(),
4193 resolve_context_->host_cache())));
4194 }
4195
4196 proc_->SignalMultiple(responses.size());
4197
4198 for (const auto& response : responses)
4199 EXPECT_THAT(response->result_error(), IsOk());
4200
4201 ASSERT_FALSE(proc_->HasBlockedRequests());
4202 }
4203
Eric Orth23935862020-01-10 00:42:244204 scoped_refptr<base::TestMockTimeTaskRunner> notifier_task_runner_;
Eric Orthfe6d5482019-09-03 18:27:574205 TestDnsConfigService* config_service_;
4206 std::unique_ptr<SystemDnsConfigChangeNotifier> notifier_;
4207
[email protected]daae1322013-09-05 18:26:504208 // Owned by |resolver_|.
4209 MockDnsClient* dns_client_;
[email protected]1d932852012-06-19 19:40:334210};
4211
Eric Orthfe6d5482019-09-03 18:27:574212TEST_F(HostResolverManagerDnsTest, FlushCacheOnDnsConfigChange) {
4213 proc_->SignalMultiple(2u); // One before the flush, one after.
4214
4215 // Resolve to populate the cache.
4216 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554217 HostPortPair("host1", 70), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:524218 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthfe6d5482019-09-03 18:27:574219 EXPECT_THAT(initial_response.result_error(), IsOk());
4220 EXPECT_EQ(1u, proc_->GetCaptureList().size());
4221
4222 // Result expected to come from the cache.
4223 ResolveHostResponseHelper cached_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554224 HostPortPair("host1", 75), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:524225 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthfe6d5482019-09-03 18:27:574226 EXPECT_THAT(cached_response.result_error(), IsOk());
4227 EXPECT_EQ(1u, proc_->GetCaptureList().size()); // No expected increase.
4228
4229 // Flush cache by triggering a DNS config change.
4230 ChangeDnsConfig(CreateValidDnsConfig());
4231
4232 // Expect flushed from cache and therefore served from |proc_|.
4233 ResolveHostResponseHelper flushed_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554234 HostPortPair("host1", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:524235 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthfe6d5482019-09-03 18:27:574236 EXPECT_THAT(flushed_response.result_error(), IsOk());
4237 EXPECT_EQ(2u, proc_->GetCaptureList().size()); // Expected increase.
4238}
4239
dalykc27699a2019-07-29 20:53:294240TEST_F(HostResolverManagerDnsTest, DisableAndEnableInsecureDnsClient) {
Eric Orth4e55b362019-05-07 22:00:034241 // Disable fallback to allow testing how requests are initially handled.
4242 set_allow_fallback_to_proctask(false);
4243
4244 ChangeDnsConfig(CreateValidDnsConfig());
4245 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.2.47");
4246 proc_->SignalMultiple(1u);
4247
Eric Orth09746312021-05-05 15:44:584248 resolver_->SetInsecureDnsClientEnabled(
4249 /*enabled=*/false,
4250 /*additional_dns_types_enabled*/ false);
Eric Orth4e55b362019-05-07 22:00:034251 ResolveHostResponseHelper response_proc(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554252 HostPortPair("nx_succeed", 1212), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:524253 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:504254 resolve_context_->host_cache()));
Eric Orth4e55b362019-05-07 22:00:034255 EXPECT_THAT(response_proc.result_error(), IsOk());
4256 EXPECT_THAT(response_proc.request()->GetAddressResults().value().endpoints(),
4257 testing::ElementsAre(CreateExpected("192.168.2.47", 1212)));
4258
Eric Orth09746312021-05-05 15:44:584259 resolver_->SetInsecureDnsClientEnabled(/*enabled*/ true,
4260 /*additional_dns_types_enabled=*/true);
Eric Orth4e55b362019-05-07 22:00:034261 ResolveHostResponseHelper response_dns_client(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554262 HostPortPair("ok_fail", 1212), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:524263 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth4e55b362019-05-07 22:00:034264 EXPECT_THAT(response_dns_client.result_error(), IsOk());
4265 EXPECT_THAT(
4266 response_dns_client.request()->GetAddressResults().value().endpoints(),
4267 testing::UnorderedElementsAre(CreateExpected("::1", 1212),
4268 CreateExpected("127.0.0.1", 1212)));
4269}
4270
dalyk6d7d8ead2019-08-15 03:30:084271TEST_F(HostResolverManagerDnsTest, UseProcTaskWhenPrivateDnsActive) {
4272 // Disable fallback to allow testing how requests are initially handled.
4273 set_allow_fallback_to_proctask(false);
4274 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.2.47");
4275 proc_->SignalMultiple(1u);
4276
4277 DnsConfig config = CreateValidDnsConfig();
4278 config.dns_over_tls_active = true;
4279 ChangeDnsConfig(config);
4280 ResolveHostResponseHelper response_proc(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554281 HostPortPair("nx_succeed", 1212), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:524282 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:504283 resolve_context_->host_cache()));
dalyk6d7d8ead2019-08-15 03:30:084284 EXPECT_THAT(response_proc.result_error(), IsOk());
4285 EXPECT_THAT(response_proc.request()->GetAddressResults().value().endpoints(),
4286 testing::ElementsAre(CreateExpected("192.168.2.47", 1212)));
4287}
4288
Mike Westda1c690e2017-08-12 05:57:164289// RFC 6761 localhost names should always resolve to loopback.
Eric Orth960e7062019-03-08 18:43:544290TEST_F(HostResolverManagerDnsTest, LocalhostLookup) {
Mike Westda1c690e2017-08-12 05:57:164291 // Add a rule resolving localhost names to a non-loopback IP and test
4292 // that they still resolves to loopback.
4293 proc_->AddRuleForAllFamilies("foo.localhost", "192.168.1.42");
4294 proc_->AddRuleForAllFamilies("localhost", "192.168.1.42");
4295 proc_->AddRuleForAllFamilies("localhost.", "192.168.1.42");
4296
Eric Orth70992982018-07-24 00:25:004297 ResolveHostResponseHelper response0(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554298 HostPortPair("foo.localhost", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:524299 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:504300 resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:004301 EXPECT_THAT(response0.result_error(), IsOk());
4302 EXPECT_THAT(response0.request()->GetAddressResults().value().endpoints(),
4303 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4304 CreateExpected("::1", 80)));
4305
4306 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554307 HostPortPair("localhost", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:524308 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:004309 EXPECT_THAT(response1.result_error(), IsOk());
4310 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
4311 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4312 CreateExpected("::1", 80)));
4313
4314 ResolveHostResponseHelper response2(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554315 HostPortPair("localhost.", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:524316 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:004317 EXPECT_THAT(response2.result_error(), IsOk());
4318 EXPECT_THAT(response2.request()->GetAddressResults().value().endpoints(),
4319 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4320 CreateExpected("::1", 80)));
4321}
4322
Mike Westda1c690e2017-08-12 05:57:164323// RFC 6761 localhost names should always resolve to loopback, even if a HOSTS
4324// file is active.
Eric Orth960e7062019-03-08 18:43:544325TEST_F(HostResolverManagerDnsTest, LocalhostLookupWithHosts) {
Mike Westda1c690e2017-08-12 05:57:164326 DnsHosts hosts;
4327 hosts[DnsHostsKey("localhost", ADDRESS_FAMILY_IPV4)] =
4328 IPAddress({192, 168, 1, 1});
4329 hosts[DnsHostsKey("foo.localhost", ADDRESS_FAMILY_IPV4)] =
4330 IPAddress({192, 168, 1, 2});
4331
4332 DnsConfig config = CreateValidDnsConfig();
4333 config.hosts = hosts;
4334 ChangeDnsConfig(config);
4335
Eric Orth70992982018-07-24 00:25:004336 ResolveHostResponseHelper response0(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554337 HostPortPair("localhost", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:524338 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:004339 EXPECT_THAT(response0.result_error(), IsOk());
4340 EXPECT_THAT(response0.request()->GetAddressResults().value().endpoints(),
4341 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4342 CreateExpected("::1", 80)));
4343
4344 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554345 HostPortPair("foo.localhost", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:524346 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:504347 resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:004348 EXPECT_THAT(response1.result_error(), IsOk());
4349 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
4350 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4351 CreateExpected("::1", 80)));
4352}
4353
Eric Orth960e7062019-03-08 18:43:544354// Test successful and fallback resolutions in HostResolverManager::DnsTask.
4355TEST_F(HostResolverManagerDnsTest, DnsTask) {
[email protected]38b50d92012-04-19 21:07:524356 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.102");
4357 // All other hostnames will fail in proc_.
[email protected]78eac2a2012-03-14 19:09:274358
4359 // Initially there is no config, so client should not be invoked.
Eric Orth117e1992019-04-17 00:24:154360 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554361 HostPortPair("ok_fail", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:524362 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:004363 EXPECT_FALSE(initial_response.complete());
4364
4365 proc_->SignalMultiple(1u);
4366
4367 EXPECT_THAT(initial_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
4368
4369 ChangeDnsConfig(CreateValidDnsConfig());
4370
Eric Orth117e1992019-04-17 00:24:154371 ResolveHostResponseHelper response0(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554372 HostPortPair("ok_fail", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:524373 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth117e1992019-04-17 00:24:154374 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554375 HostPortPair("nx_fail", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:524376 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:004377 ResolveHostResponseHelper response2(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554378 HostPortPair("nx_succeed", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:524379 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:004380
4381 proc_->SignalMultiple(4u);
4382
4383 // Resolved by MockDnsClient.
4384 EXPECT_THAT(response0.result_error(), IsOk());
4385 EXPECT_THAT(response0.request()->GetAddressResults().value().endpoints(),
4386 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4387 CreateExpected("::1", 80)));
4388
4389 // Fallback to ProcTask.
4390 EXPECT_THAT(response1.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
4391 EXPECT_THAT(response2.result_error(), IsOk());
4392 EXPECT_THAT(response2.request()->GetAddressResults().value().endpoints(),
4393 testing::ElementsAre(CreateExpected("192.168.1.102", 80)));
4394}
4395
Eric Orthc4cca5d2021-07-02 19:59:014396TEST_F(HostResolverManagerDnsTest, DnsTaskWithScheme) {
4397 ChangeDnsConfig(CreateValidDnsConfig());
4398
4399 ResolveHostResponseHelper response(resolver_->CreateRequest(
4400 url::SchemeHostPort(url::kWsScheme, "ok_fail", 80), NetworkIsolationKey(),
4401 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
4402 resolve_context_->host_cache()));
4403
4404 // Resolved by MockDnsClient.
4405 EXPECT_THAT(response.result_error(), IsOk());
4406 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
4407 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4408 CreateExpected("::1", 80)));
4409}
4410
Eric Orth960e7062019-03-08 18:43:544411// Test successful and failing resolutions in HostResolverManager::DnsTask when
[email protected]16c2bd72013-06-28 01:19:224412// fallback to ProcTask is disabled.
Eric Orth960e7062019-03-08 18:43:544413TEST_F(HostResolverManagerDnsTest, NoFallbackToProcTask) {
Eric Orth60931742018-11-05 23:40:574414 set_allow_fallback_to_proctask(false);
[email protected]16c2bd72013-06-28 01:19:224415
[email protected]16c2bd72013-06-28 01:19:224416 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.102");
4417 // All other hostnames will fail in proc_.
4418
4419 // Set empty DnsConfig.
Eric Orthfe6d5482019-09-03 18:27:574420 InvalidateDnsConfig();
[email protected]16c2bd72013-06-28 01:19:224421 // Initially there is no config, so client should not be invoked.
Eric Orth117e1992019-04-17 00:24:154422 ResolveHostResponseHelper initial_response0(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554423 HostPortPair("ok_fail", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:524424 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:004425 ResolveHostResponseHelper initial_response1(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554426 HostPortPair("nx_succeed", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:524427 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:004428 proc_->SignalMultiple(2u);
4429
4430 EXPECT_THAT(initial_response0.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
4431 EXPECT_THAT(initial_response1.result_error(), IsOk());
4432 EXPECT_THAT(
4433 initial_response1.request()->GetAddressResults().value().endpoints(),
4434 testing::ElementsAre(CreateExpected("192.168.1.102", 80)));
4435
dalykc27699a2019-07-29 20:53:294436 // Switch to a valid config.
Eric Orth70992982018-07-24 00:25:004437 ChangeDnsConfig(CreateValidDnsConfig());
Eric Orth70992982018-07-24 00:25:004438 // First request is resolved by MockDnsClient, others should fail due to
4439 // disabled fallback to ProcTask.
Eric Orth117e1992019-04-17 00:24:154440 ResolveHostResponseHelper response0(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554441 HostPortPair("ok_fail", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:524442 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth117e1992019-04-17 00:24:154443 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554444 HostPortPair("nx_succeed", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:524445 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:004446 proc_->SignalMultiple(6u);
4447
Eric Orth70992982018-07-24 00:25:004448 // Resolved by MockDnsClient.
4449 EXPECT_THAT(response0.result_error(), IsOk());
4450 EXPECT_THAT(response0.request()->GetAddressResults().value().endpoints(),
4451 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4452 CreateExpected("::1", 80)));
4453 // Fallback to ProcTask is disabled.
4454 EXPECT_THAT(response1.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
4455}
4456
[email protected]16c2bd72013-06-28 01:19:224457// Test behavior of OnDnsTaskFailure when Job is aborted.
Eric Orth960e7062019-03-08 18:43:544458TEST_F(HostResolverManagerDnsTest, OnDnsTaskFailureAbortedJob) {
[email protected]16c2bd72013-06-28 01:19:224459 ChangeDnsConfig(CreateValidDnsConfig());
Eric Orth117e1992019-04-17 00:24:154460 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554461 HostPortPair("nx_abort", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:524462 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:004463 // Abort all jobs here.
4464 CreateResolver();
4465 proc_->SignalMultiple(1u);
4466 // Run to completion.
4467 base::RunLoop().RunUntilIdle(); // Notification happens async.
4468 // It shouldn't crash during OnDnsTaskFailure callbacks.
4469 EXPECT_FALSE(response.complete());
4470
4471 // Repeat test with Fallback to ProcTask disabled
Eric Orth60931742018-11-05 23:40:574472 set_allow_fallback_to_proctask(false);
Eric Orth70992982018-07-24 00:25:004473 ChangeDnsConfig(CreateValidDnsConfig());
Eric Orth117e1992019-04-17 00:24:154474 ResolveHostResponseHelper no_fallback_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554475 HostPortPair("nx_abort", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:524476 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:004477 // Abort all jobs here.
4478 CreateResolver();
4479 proc_->SignalMultiple(2u);
4480 // Run to completion.
4481 base::RunLoop().RunUntilIdle(); // Notification happens async.
4482 // It shouldn't crash during OnDnsTaskFailure callbacks.
4483 EXPECT_FALSE(no_fallback_response.complete());
4484}
4485
Eric Orth60931742018-11-05 23:40:574486// Fallback to proc allowed with ANY source.
Eric Orth960e7062019-03-08 18:43:544487TEST_F(HostResolverManagerDnsTest, FallbackBySource_Any) {
Eric Orth60931742018-11-05 23:40:574488 // Ensure fallback is otherwise allowed by resolver settings.
4489 set_allow_fallback_to_proctask(true);
4490
4491 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.102");
4492 // All other hostnames will fail in proc_.
4493
4494 ChangeDnsConfig(CreateValidDnsConfig());
4495
Eric Orth117e1992019-04-17 00:24:154496 ResolveHostResponseHelper response0(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554497 HostPortPair("nx_fail", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:524498 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth60931742018-11-05 23:40:574499 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554500 HostPortPair("nx_succeed", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:524501 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth60931742018-11-05 23:40:574502 proc_->SignalMultiple(2u);
4503
4504 EXPECT_THAT(response0.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
4505 EXPECT_THAT(response1.result_error(), IsOk());
4506 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
4507 testing::ElementsAre(CreateExpected("192.168.1.102", 80)));
4508}
4509
4510// Fallback to proc not allowed with DNS source.
Eric Orth960e7062019-03-08 18:43:544511TEST_F(HostResolverManagerDnsTest, FallbackBySource_Dns) {
Eric Orth60931742018-11-05 23:40:574512 // Ensure fallback is otherwise allowed by resolver settings.
4513 set_allow_fallback_to_proctask(true);
4514
4515 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.102");
4516 // All other hostnames will fail in proc_.
4517
4518 ChangeDnsConfig(CreateValidDnsConfig());
4519
4520 HostResolver::ResolveHostParameters parameters;
4521 parameters.source = HostResolverSource::DNS;
Eric Orth117e1992019-04-17 00:24:154522 ResolveHostResponseHelper response0(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554523 HostPortPair("nx_fail", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504524 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth60931742018-11-05 23:40:574525 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554526 HostPortPair("nx_succeed", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504527 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth60931742018-11-05 23:40:574528 // Nothing should reach |proc_| on success, but let failures through to fail
4529 // instead of hanging.
4530 proc_->SignalMultiple(2u);
4531
4532 EXPECT_THAT(response0.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
4533 EXPECT_THAT(response1.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
4534}
4535
4536// Fallback to proc on DnsClient change allowed with ANY source.
Eric Orth960e7062019-03-08 18:43:544537TEST_F(HostResolverManagerDnsTest, FallbackOnAbortBySource_Any) {
Eric Orth60931742018-11-05 23:40:574538 // Ensure fallback is otherwise allowed by resolver settings.
4539 set_allow_fallback_to_proctask(true);
4540
4541 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.102");
4542 // All other hostnames will fail in proc_.
4543
4544 ChangeDnsConfig(CreateValidDnsConfig());
4545
Eric Orth117e1992019-04-17 00:24:154546 ResolveHostResponseHelper response0(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554547 HostPortPair("ok_fail", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:524548 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth60931742018-11-05 23:40:574549 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554550 HostPortPair("nx_succeed", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:524551 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth60931742018-11-05 23:40:574552 proc_->SignalMultiple(2u);
4553
dalykc27699a2019-07-29 20:53:294554 // Simulate the case when the preference or policy has disabled the insecure
4555 // DNS client causing AbortInsecureDnsTasks.
Eric Orth09746312021-05-05 15:44:584556 resolver_->SetInsecureDnsClientEnabled(
4557 /*enabled=*/false,
4558 /*additional_dns_types_enabled=*/false);
Eric Orth60931742018-11-05 23:40:574559
4560 // All requests should fallback to proc resolver.
4561 EXPECT_THAT(response0.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
4562 EXPECT_THAT(response1.result_error(), IsOk());
4563 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
4564 testing::ElementsAre(CreateExpected("192.168.1.102", 80)));
4565}
4566
4567// Fallback to proc on DnsClient change not allowed with DNS source.
Eric Orth960e7062019-03-08 18:43:544568TEST_F(HostResolverManagerDnsTest, FallbackOnAbortBySource_Dns) {
Eric Orth60931742018-11-05 23:40:574569 // Ensure fallback is otherwise allowed by resolver settings.
4570 set_allow_fallback_to_proctask(true);
4571
4572 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.102");
4573 // All other hostnames will fail in proc_.
4574
4575 ChangeDnsConfig(CreateValidDnsConfig());
4576
4577 HostResolver::ResolveHostParameters parameters;
4578 parameters.source = HostResolverSource::DNS;
Eric Orth117e1992019-04-17 00:24:154579 ResolveHostResponseHelper response0(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554580 HostPortPair("ok_fail", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504581 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth60931742018-11-05 23:40:574582 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554583 HostPortPair("nx_succeed", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504584 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth60931742018-11-05 23:40:574585 // Nothing should reach |proc_| on success, but let failures through to fail
4586 // instead of hanging.
4587 proc_->SignalMultiple(2u);
4588
dalykc27699a2019-07-29 20:53:294589 // Simulate the case when the preference or policy has disabled the insecure
4590 // DNS client causing AbortInsecureDnsTasks.
Eric Orth09746312021-05-05 15:44:584591 resolver_->SetInsecureDnsClientEnabled(
4592 /*enabled=*/false,
4593 /*additional_dns_types_enabled=*/false);
Eric Orth60931742018-11-05 23:40:574594
4595 // No fallback expected. All requests should fail.
4596 EXPECT_THAT(response0.result_error(), IsError(ERR_NETWORK_CHANGED));
4597 EXPECT_THAT(response1.result_error(), IsError(ERR_NETWORK_CHANGED));
4598}
4599
dalykc27699a2019-07-29 20:53:294600// Insecure DnsClient change shouldn't affect secure DnsTasks.
4601TEST_F(HostResolverManagerDnsTest,
4602 DisableInsecureDnsClient_SecureDnsTasksUnaffected) {
4603 // Ensure fallback is otherwise allowed by resolver settings.
4604 set_allow_fallback_to_proctask(true);
4605
4606 proc_->AddRuleForAllFamilies("automatic", "192.168.1.102");
4607 // All other hostnames will fail in proc_.
4608
4609 ChangeDnsConfig(CreateValidDnsConfig());
Ben Schwartz432ce032021-05-05 21:49:244610 DnsConfigOverrides overrides;
4611 overrides.secure_dns_mode = SecureDnsMode::kAutomatic;
4612 resolver_->SetDnsConfigOverrides(overrides);
dalykc27699a2019-07-29 20:53:294613
dalykc27699a2019-07-29 20:53:294614 ResolveHostResponseHelper response_secure(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554615 HostPortPair("automatic", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:524616 /* optional_parameters=*/absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:504617 resolve_context_->host_cache()));
dalykc27699a2019-07-29 20:53:294618 EXPECT_FALSE(response_secure.complete());
4619
4620 // Simulate the case when the preference or policy has disabled the insecure
4621 // DNS client causing AbortInsecureDnsTasks.
Eric Orth09746312021-05-05 15:44:584622 resolver_->SetInsecureDnsClientEnabled(
4623 /*enabled=*/false,
4624 /*additional_dns_types_enabled*/ false);
dalykc27699a2019-07-29 20:53:294625
4626 EXPECT_THAT(response_secure.result_error(), IsOk());
4627 EXPECT_THAT(
4628 response_secure.request()->GetAddressResults().value().endpoints(),
4629 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4630 CreateExpected("::1", 80)));
4631}
4632
Eric Orth960e7062019-03-08 18:43:544633TEST_F(HostResolverManagerDnsTest, DnsTaskUnspec) {
[email protected]0adcb2b2012-08-15 21:30:464634 ChangeDnsConfig(CreateValidDnsConfig());
4635
4636 proc_->AddRuleForAllFamilies("4nx", "192.168.1.101");
4637 // All other hostnames will fail in proc_.
4638
Eric Orth70992982018-07-24 00:25:004639 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:154640 responses.emplace_back(
4641 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554642 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:524643 absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:504644 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:154645 responses.emplace_back(
4646 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554647 HostPortPair("4ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:524648 absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:504649 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:154650 responses.emplace_back(
4651 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554652 HostPortPair("6ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:524653 absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:504654 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:154655 responses.emplace_back(
4656 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554657 HostPortPair("4nx", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:524658 absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:504659 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:004660
4661 proc_->SignalMultiple(4u);
4662
4663 for (auto& response : responses) {
4664 EXPECT_THAT(response->result_error(), IsOk());
4665 }
4666
4667 EXPECT_THAT(responses[0]->request()->GetAddressResults().value().endpoints(),
4668 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4669 CreateExpected("::1", 80)));
4670 EXPECT_THAT(responses[1]->request()->GetAddressResults().value().endpoints(),
4671 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
4672 EXPECT_THAT(responses[2]->request()->GetAddressResults().value().endpoints(),
4673 testing::ElementsAre(CreateExpected("::1", 80)));
4674 EXPECT_THAT(responses[3]->request()->GetAddressResults().value().endpoints(),
4675 testing::ElementsAre(CreateExpected("192.168.1.101", 80)));
4676}
4677
Eric Orth960e7062019-03-08 18:43:544678TEST_F(HostResolverManagerDnsTest, NameCollisionIcann) {
eroman1efc237c2016-12-14 00:00:454679 ChangeDnsConfig(CreateValidDnsConfig());
4680
Eric Orth70992982018-07-24 00:25:004681 // When the resolver returns an A record with 127.0.53.53 it should be
4682 // mapped to a special error.
4683 ResolveHostResponseHelper response_ipv4(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554684 HostPortPair("4collision", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:524685 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:004686 EXPECT_THAT(response_ipv4.result_error(), IsError(ERR_ICANN_NAME_COLLISION));
4687 EXPECT_FALSE(response_ipv4.request()->GetAddressResults());
4688
4689 // When the resolver returns an AAAA record with ::127.0.53.53 it should
4690 // work just like any other IP. (Despite having the same suffix, it is not
4691 // considered special)
4692 ResolveHostResponseHelper response_ipv6(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554693 HostPortPair("6collision", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:524694 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:004695 EXPECT_THAT(response_ipv6.result_error(), IsOk());
4696 EXPECT_THAT(response_ipv6.request()->GetAddressResults().value().endpoints(),
4697 testing::ElementsAre(CreateExpected("::127.0.53.53", 80)));
4698}
4699
Eric Orth960e7062019-03-08 18:43:544700TEST_F(HostResolverManagerDnsTest, ServeFromHosts) {
[email protected]d7b9a2b2012-05-31 22:31:194701 // Initially, use empty HOSTS file.
[email protected]bb0e34542012-08-31 19:52:404702 DnsConfig config = CreateValidDnsConfig();
4703 ChangeDnsConfig(config);
[email protected]d7b9a2b2012-05-31 22:31:194704
[email protected]007b3f82013-04-09 08:46:454705 proc_->AddRuleForAllFamilies(std::string(),
4706 std::string()); // Default to failures.
[email protected]38b50d92012-04-19 21:07:524707 proc_->SignalMultiple(1u); // For the first request which misses.
[email protected]78eac2a2012-03-14 19:09:274708
Eric Orth117e1992019-04-17 00:24:154709 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554710 HostPortPair("nx_ipv4", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:524711 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:004712 EXPECT_THAT(initial_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
4713
4714 IPAddress local_ipv4 = IPAddress::IPv4Localhost();
4715 IPAddress local_ipv6 = IPAddress::IPv6Localhost();
4716
4717 DnsHosts hosts;
4718 hosts[DnsHostsKey("nx_ipv4", ADDRESS_FAMILY_IPV4)] = local_ipv4;
4719 hosts[DnsHostsKey("nx_ipv6", ADDRESS_FAMILY_IPV6)] = local_ipv6;
4720 hosts[DnsHostsKey("nx_both", ADDRESS_FAMILY_IPV4)] = local_ipv4;
4721 hosts[DnsHostsKey("nx_both", ADDRESS_FAMILY_IPV6)] = local_ipv6;
4722
4723 // Update HOSTS file.
4724 config.hosts = hosts;
4725 ChangeDnsConfig(config);
4726
Eric Orth117e1992019-04-17 00:24:154727 ResolveHostResponseHelper response_ipv4(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554728 HostPortPair("nx_ipv4", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:524729 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:004730 EXPECT_THAT(response_ipv4.result_error(), IsOk());
4731 EXPECT_THAT(response_ipv4.request()->GetAddressResults().value().endpoints(),
4732 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
Cammie Smith Barnes958c7f32020-12-17 16:43:114733 EXPECT_FALSE(response_ipv4.request()->GetDnsAliasResults());
Eric Orth70992982018-07-24 00:25:004734
Eric Orth117e1992019-04-17 00:24:154735 ResolveHostResponseHelper response_ipv6(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554736 HostPortPair("nx_ipv6", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:524737 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:004738 EXPECT_THAT(response_ipv6.result_error(), IsOk());
4739 EXPECT_THAT(response_ipv6.request()->GetAddressResults().value().endpoints(),
4740 testing::ElementsAre(CreateExpected("::1", 80)));
Cammie Smith Barnes958c7f32020-12-17 16:43:114741 EXPECT_FALSE(response_ipv6.request()->GetDnsAliasResults());
Eric Orth70992982018-07-24 00:25:004742
Eric Orth117e1992019-04-17 00:24:154743 ResolveHostResponseHelper response_both(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554744 HostPortPair("nx_both", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:524745 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:004746 EXPECT_THAT(response_both.result_error(), IsOk());
4747 EXPECT_THAT(response_both.request()->GetAddressResults().value().endpoints(),
4748 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4749 CreateExpected("::1", 80)));
Cammie Smith Barnes958c7f32020-12-17 16:43:114750 EXPECT_FALSE(response_both.request()->GetDnsAliasResults());
Eric Orth70992982018-07-24 00:25:004751
Eric Orth00fe5a62018-08-15 22:20:004752 // Requests with specified DNS query type.
4753 HostResolver::ResolveHostParameters parameters;
4754
Eric Orth192e3bb2018-11-14 19:30:324755 parameters.dns_query_type = DnsQueryType::A;
Eric Orth117e1992019-04-17 00:24:154756 ResolveHostResponseHelper response_specified_ipv4(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554757 HostPortPair("nx_ipv4", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504758 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth00fe5a62018-08-15 22:20:004759 EXPECT_THAT(response_specified_ipv4.result_error(), IsOk());
4760 EXPECT_THAT(response_specified_ipv4.request()
4761 ->GetAddressResults()
4762 .value()
4763 .endpoints(),
4764 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
Cammie Smith Barnes958c7f32020-12-17 16:43:114765 EXPECT_FALSE(response_specified_ipv4.request()->GetDnsAliasResults());
Eric Orth00fe5a62018-08-15 22:20:004766
Eric Orth192e3bb2018-11-14 19:30:324767 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth117e1992019-04-17 00:24:154768 ResolveHostResponseHelper response_specified_ipv6(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554769 HostPortPair("nx_ipv6", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504770 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth00fe5a62018-08-15 22:20:004771 EXPECT_THAT(response_specified_ipv6.result_error(), IsOk());
4772 EXPECT_THAT(response_specified_ipv6.request()
4773 ->GetAddressResults()
4774 .value()
4775 .endpoints(),
4776 testing::ElementsAre(CreateExpected("::1", 80)));
Cammie Smith Barnes958c7f32020-12-17 16:43:114777 EXPECT_FALSE(response_specified_ipv6.request()->GetDnsAliasResults());
Eric Orth00fe5a62018-08-15 22:20:004778
Eric Orth70992982018-07-24 00:25:004779 // Request with upper case.
Eric Orth117e1992019-04-17 00:24:154780 ResolveHostResponseHelper response_upper(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554781 HostPortPair("nx_IPV4", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:524782 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:004783 EXPECT_THAT(response_upper.result_error(), IsOk());
4784 EXPECT_THAT(response_upper.request()->GetAddressResults().value().endpoints(),
4785 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
Cammie Smith Barnes958c7f32020-12-17 16:43:114786 EXPECT_FALSE(response_upper.request()->GetDnsAliasResults());
Eric Orth70992982018-07-24 00:25:004787}
4788
dalykc27699a2019-07-29 20:53:294789TEST_F(HostResolverManagerDnsTest, SkipHostsWithUpcomingProcTask) {
4790 // Disable the DnsClient.
Eric Orth09746312021-05-05 15:44:584791 resolver_->SetInsecureDnsClientEnabled(
4792 /*enabled=*/false,
4793 /*additional_dns_types_enabled=*/false);
dalykc27699a2019-07-29 20:53:294794
4795 proc_->AddRuleForAllFamilies(std::string(),
4796 std::string()); // Default to failures.
4797 proc_->SignalMultiple(1u); // For the first request which misses.
4798
4799 DnsConfig config = CreateValidDnsConfig();
4800 DnsHosts hosts;
4801 hosts[DnsHostsKey("hosts", ADDRESS_FAMILY_IPV4)] = IPAddress::IPv4Localhost();
4802
4803 // Update HOSTS file.
4804 config.hosts = hosts;
4805 ChangeDnsConfig(config);
4806
4807 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554808 HostPortPair("hosts", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:524809 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
dalykc27699a2019-07-29 20:53:294810 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
4811}
4812
Eric Orthdc35748e2018-08-23 22:41:484813// Test that hosts ending in ".local" or ".local." are resolved using the system
4814// resolver.
Eric Orth960e7062019-03-08 18:43:544815TEST_F(HostResolverManagerDnsTest, BypassDnsTask) {
Eric Orth70992982018-07-24 00:25:004816 ChangeDnsConfig(CreateValidDnsConfig());
4817
4818 proc_->AddRuleForAllFamilies(std::string(),
4819 std::string()); // Default to failures.
4820
4821 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
4822
Eric Orth117e1992019-04-17 00:24:154823 responses.emplace_back(
4824 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554825 HostPortPair("ok.local", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:524826 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:504827 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:004828 responses.emplace_back(
4829 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554830 HostPortPair("ok.local.", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:524831 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:504832 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:154833 responses.emplace_back(
4834 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554835 HostPortPair("oklocal", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:524836 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:504837 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:154838 responses.emplace_back(
4839 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554840 HostPortPair("oklocal.", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:524841 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:504842 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:154843 responses.emplace_back(
4844 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554845 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:524846 absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:504847 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:004848
4849 proc_->SignalMultiple(5u);
4850
4851 for (size_t i = 0; i < 2; ++i)
4852 EXPECT_THAT(responses[i]->result_error(), IsError(ERR_NAME_NOT_RESOLVED));
4853
4854 for (size_t i = 2; i < responses.size(); ++i)
4855 EXPECT_THAT(responses[i]->result_error(), IsOk());
4856}
4857
Eric Orth828bd3ae2018-12-12 17:30:364858#if BUILDFLAG(ENABLE_MDNS)
4859// Test that non-address queries for hosts ending in ".local" are resolved using
4860// the MDNS resolver.
Eric Orth960e7062019-03-08 18:43:544861TEST_F(HostResolverManagerDnsTest, BypassDnsToMdnsWithNonAddress) {
Eric Orth828bd3ae2018-12-12 17:30:364862 // Ensure DNS task and system (proc) requests will fail.
4863 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:134864 rules.emplace_back(
4865 "myhello.local", dns_protocol::kTypeTXT, false /* secure */,
Peter Kastingd039b772021-08-18 00:06:204866 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kFail),
4867 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:364868 CreateResolver();
4869 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
4870 proc_->AddRuleForAllFamilies(std::string(), std::string());
4871
4872 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
4873 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
4874 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
4875 // 2 socket creations for every transaction.
4876 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(2);
4877
4878 HostResolver::ResolveHostParameters dns_parameters;
4879 dns_parameters.dns_query_type = DnsQueryType::TXT;
4880
4881 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554882 HostPortPair("myhello.local", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:244883 NetLogWithSource(), dns_parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:504884 resolve_context_->host_cache()));
Eric Orth828bd3ae2018-12-12 17:30:364885
4886 socket_factory_ptr->SimulateReceive(kMdnsResponseTxt,
4887 sizeof(kMdnsResponseTxt));
4888 proc_->SignalMultiple(1u);
4889
4890 EXPECT_THAT(response.result_error(), IsOk());
4891 EXPECT_THAT(response.request()->GetTextResults(),
4892 testing::Optional(testing::ElementsAre("foo", "bar")));
4893}
4894#endif // BUILDFLAG(ENABLE_MDNS)
4895
Eric Orthdc35748e2018-08-23 22:41:484896// Test that DNS task is always used when explicitly requested as the source,
4897// even with a case that would normally bypass it eg hosts ending in ".local".
Eric Orth960e7062019-03-08 18:43:544898TEST_F(HostResolverManagerDnsTest, DnsNotBypassedWhenDnsSource) {
Eric Orthdc35748e2018-08-23 22:41:484899 // Ensure DNS task requests will succeed and system (proc) requests will fail.
4900 ChangeDnsConfig(CreateValidDnsConfig());
4901 proc_->AddRuleForAllFamilies(std::string(), std::string());
4902
4903 HostResolver::ResolveHostParameters dns_parameters;
4904 dns_parameters.source = HostResolverSource::DNS;
4905
Eric Orth117e1992019-04-17 00:24:154906 ResolveHostResponseHelper dns_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554907 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504908 dns_parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth117e1992019-04-17 00:24:154909 ResolveHostResponseHelper dns_local_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554910 HostPortPair("ok.local", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504911 dns_parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth117e1992019-04-17 00:24:154912 ResolveHostResponseHelper normal_local_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554913 HostPortPair("ok.local", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:524914 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthdc35748e2018-08-23 22:41:484915
4916 proc_->SignalMultiple(3u);
4917
4918 EXPECT_THAT(dns_response.result_error(), IsOk());
4919 EXPECT_THAT(dns_local_response.result_error(), IsOk());
4920 EXPECT_THAT(normal_local_response.result_error(),
4921 IsError(ERR_NAME_NOT_RESOLVED));
4922}
4923
Eric Orth960e7062019-03-08 18:43:544924TEST_F(HostResolverManagerDnsTest, SystemOnlyBypassesDnsTask) {
Eric Orthdc35748e2018-08-23 22:41:484925 // Ensure DNS task requests will succeed and system (proc) requests will fail.
4926 ChangeDnsConfig(CreateValidDnsConfig());
4927 proc_->AddRuleForAllFamilies(std::string(), std::string());
4928
Eric Orth117e1992019-04-17 00:24:154929 ResolveHostResponseHelper dns_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554930 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:524931 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthdc35748e2018-08-23 22:41:484932
4933 HostResolver::ResolveHostParameters parameters;
4934 parameters.source = HostResolverSource::SYSTEM;
Eric Orth117e1992019-04-17 00:24:154935 ResolveHostResponseHelper system_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554936 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504937 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthdc35748e2018-08-23 22:41:484938
4939 proc_->SignalMultiple(2u);
4940
4941 EXPECT_THAT(dns_response.result_error(), IsOk());
4942 EXPECT_THAT(system_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
4943}
4944
dalykc27699a2019-07-29 20:53:294945TEST_F(HostResolverManagerDnsTest,
4946 DisableInsecureDnsClientOnPersistentFailure) {
[email protected]f0f602bd2012-11-15 18:01:024947 ChangeDnsConfig(CreateValidDnsConfig());
4948
[email protected]f0f602bd2012-11-15 18:01:024949 // Check that DnsTask works.
Eric Orth117e1992019-04-17 00:24:154950 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554951 HostPortPair("ok_1", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:524952 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:004953 EXPECT_THAT(initial_response.result_error(), IsOk());
4954
Ben Schwartz432ce032021-05-05 21:49:244955 TriggerInsecureFailureCondition();
Eric Orth70992982018-07-24 00:25:004956
dalykc27699a2019-07-29 20:53:294957 // Insecure DnsTasks should be disabled by now unless explicitly requested via
4958 // |source|.
Eric Orth117e1992019-04-17 00:24:154959 ResolveHostResponseHelper fail_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554960 HostPortPair("ok_2", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:524961 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth60931742018-11-05 23:40:574962 HostResolver::ResolveHostParameters parameters;
4963 parameters.source = HostResolverSource::DNS;
Eric Orth117e1992019-04-17 00:24:154964 ResolveHostResponseHelper dns_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554965 HostPortPair("ok_2", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504966 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth60931742018-11-05 23:40:574967 proc_->SignalMultiple(2u);
Eric Orth70992982018-07-24 00:25:004968 EXPECT_THAT(fail_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
Eric Orth60931742018-11-05 23:40:574969 EXPECT_THAT(dns_response.result_error(), IsOk());
Eric Orth70992982018-07-24 00:25:004970
Eric Orth70992982018-07-24 00:25:004971 // Check that it is re-enabled after DNS change.
4972 ChangeDnsConfig(CreateValidDnsConfig());
Eric Orth117e1992019-04-17 00:24:154973 ResolveHostResponseHelper reenabled_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554974 HostPortPair("ok_3", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:524975 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:004976 EXPECT_THAT(reenabled_response.result_error(), IsOk());
4977}
4978
Ben Schwartz432ce032021-05-05 21:49:244979TEST_F(HostResolverManagerDnsTest, SecureDnsWorksAfterInsecureFailure) {
4980 DnsConfig config = CreateValidDnsConfig();
4981 config.secure_dns_mode = SecureDnsMode::kSecure;
4982 ChangeDnsConfig(config);
4983
4984 TriggerInsecureFailureCondition();
4985
4986 // Secure DnsTasks should not be affected.
4987 ResolveHostResponseHelper secure_response(resolver_->CreateRequest(
4988 HostPortPair("secure", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:524989 /* optional_parameters=*/absl::nullopt, resolve_context_.get(),
Ben Schwartz432ce032021-05-05 21:49:244990 resolve_context_->host_cache()));
4991 EXPECT_THAT(secure_response.result_error(), IsOk());
4992}
4993
Eric Orth960e7062019-03-08 18:43:544994TEST_F(HostResolverManagerDnsTest, DontDisableDnsClientOnSporadicFailure) {
[email protected]f0f602bd2012-11-15 18:01:024995 ChangeDnsConfig(CreateValidDnsConfig());
4996
4997 // |proc_| defaults to successes.
4998
4999 // 20 failures interleaved with 20 successes.
Eric Orth70992982018-07-24 00:25:005000 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
5001 for (unsigned i = 0; i < 40; ++i) {
5002 // Use custom names to require separate Jobs.
5003 std::string hostname = (i % 2) == 0 ? base::StringPrintf("nx_%u", i)
5004 : base::StringPrintf("ok_%u", i);
Eric Orth117e1992019-04-17 00:24:155005 responses.emplace_back(
5006 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555007 HostPortPair(hostname, 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:525008 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:505009 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:005010 }
5011
5012 proc_->SignalMultiple(40u);
5013
Eric Orth26fa08e2019-02-22 01:28:375014 for (const auto& response : responses)
5015 EXPECT_THAT(response->result_error(), IsOk());
Eric Orth70992982018-07-24 00:25:005016
5017 // Make |proc_| default to failures.
5018 proc_->AddRuleForAllFamilies(std::string(), std::string());
5019
5020 // DnsTask should still be enabled.
Eric Orth117e1992019-04-17 00:24:155021 ResolveHostResponseHelper final_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555022 HostPortPair("ok_last", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:525023 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:005024 EXPECT_THAT(final_response.result_error(), IsOk());
5025}
5026
Eric Orth394db1732019-08-27 20:09:395027TEST_F(HostResolverManagerDnsTest, Ipv6Unreachable) {
5028 CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_.get()),
5029 false /* ipv6_reachable */,
5030 true /* check_ipv6_on_wifi */);
5031 ChangeDnsConfig(CreateValidDnsConfig());
5032
5033 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555034 HostPortPair("ok", 500), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:525035 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth394db1732019-08-27 20:09:395036 EXPECT_THAT(response.result_error(), IsOk());
5037
5038 // Only expect IPv4 results.
5039 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
5040 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 500)));
5041}
5042
5043// Without a valid DnsConfig, assume IPv6 is needed and ignore prober.
5044TEST_F(HostResolverManagerDnsTest, Ipv6Unreachable_InvalidConfig) {
5045 CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_.get()),
5046 false /* ipv6_reachable */,
5047 true /* check_ipv6_on_wifi */);
5048
5049 proc_->AddRule("example.com", ADDRESS_FAMILY_UNSPECIFIED, "1.2.3.4,::5");
5050 proc_->SignalMultiple(1u);
5051
5052 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555053 HostPortPair("example.com", 500), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:525054 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:505055 resolve_context_->host_cache()));
Eric Orth394db1732019-08-27 20:09:395056 EXPECT_THAT(response.result_error(), IsOk());
5057 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
5058 testing::UnorderedElementsAre(CreateExpected("1.2.3.4", 500),
5059 CreateExpected("::5", 500)));
5060}
5061
5062TEST_F(HostResolverManagerDnsTest, Ipv6Unreachable_UseLocalIpv6) {
5063 CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_.get()),
5064 false /* ipv6_reachable */,
5065 true /* check_ipv6_on_wifi */);
5066
5067 DnsConfig config = CreateValidDnsConfig();
5068 config.use_local_ipv6 = true;
5069 ChangeDnsConfig(config);
5070
5071 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555072 HostPortPair("ok", 500), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:525073 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth394db1732019-08-27 20:09:395074 EXPECT_THAT(response1.result_error(), IsOk());
5075 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
5076 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 500),
5077 CreateExpected("::1", 500)));
5078
5079 // Set |use_local_ipv6| to false. Expect only IPv4 results.
5080 config.use_local_ipv6 = false;
5081 ChangeDnsConfig(config);
5082
5083 ResolveHostResponseHelper response2(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555084 HostPortPair("ok", 500), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:525085 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth394db1732019-08-27 20:09:395086 EXPECT_THAT(response2.result_error(), IsOk());
5087 EXPECT_THAT(response2.request()->GetAddressResults().value().endpoints(),
5088 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 500)));
5089}
5090
[email protected]ec666ab22013-04-17 20:05:595091// Confirm that resolving "localhost" is unrestricted even if there are no
5092// global IPv6 address. See SystemHostResolverCall for rationale.
5093// Test both the DnsClient and system host resolver paths.
Eric Orth394db1732019-08-27 20:09:395094TEST_F(HostResolverManagerDnsTest, Ipv6Unreachable_Localhost) {
Eric Orth70992982018-07-24 00:25:005095 CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:325096 false /* ipv6_reachable */,
5097 true /* check_ipv6_on_wifi */);
Eric Orth70992982018-07-24 00:25:005098
5099 // Make request fail if we actually get to the system resolver.
5100 proc_->AddRuleForAllFamilies(std::string(), std::string());
5101
5102 // Try without DnsClient.
Eric Orth09746312021-05-05 15:44:585103 resolver_->SetInsecureDnsClientEnabled(
5104 /*enabled=*/false,
5105 /*additional_dns_types_enabled=*/false);
Eric Orth70992982018-07-24 00:25:005106 ResolveHostResponseHelper system_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555107 HostPortPair("localhost", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:525108 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:005109 EXPECT_THAT(system_response.result_error(), IsOk());
5110 EXPECT_THAT(
5111 system_response.request()->GetAddressResults().value().endpoints(),
5112 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
5113 CreateExpected("::1", 80)));
5114
5115 // With DnsClient
Eric Orth828bd3ae2018-12-12 17:30:365116 UseMockDnsClient(CreateValidDnsConfig(), CreateDefaultDnsRules());
Eric Orth70992982018-07-24 00:25:005117 ResolveHostResponseHelper builtin_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555118 HostPortPair("localhost", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:525119 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:005120 EXPECT_THAT(builtin_response.result_error(), IsOk());
5121 EXPECT_THAT(
5122 builtin_response.request()->GetAddressResults().value().endpoints(),
5123 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
5124 CreateExpected("::1", 80)));
5125
5126 // DnsClient configured without ipv6 (but ipv6 should still work for
5127 // localhost).
5128 DnsConfig config = CreateValidDnsConfig();
5129 config.use_local_ipv6 = false;
5130 ChangeDnsConfig(config);
5131 ResolveHostResponseHelper ipv6_disabled_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555132 HostPortPair("localhost", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:525133 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:005134 EXPECT_THAT(ipv6_disabled_response.result_error(), IsOk());
5135 EXPECT_THAT(
5136 ipv6_disabled_response.request()->GetAddressResults().value().endpoints(),
5137 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
5138 CreateExpected("::1", 80)));
5139}
5140
dalykc27699a2019-07-29 20:53:295141TEST_F(HostResolverManagerDnsTest, SeparateJobsBySecureDnsMode) {
5142 MockDnsClientRuleList rules;
Peter Kastingd039b772021-08-18 00:06:205143 rules.emplace_back(
5144 "a", dns_protocol::kTypeA, true /* secure */,
5145 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
5146 false /* delay */);
5147 rules.emplace_back(
5148 "a", dns_protocol::kTypeAAAA, true /* secure */,
5149 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
5150 false /* delay */);
5151 rules.emplace_back(
5152 "a", dns_protocol::kTypeA, false /* secure */,
5153 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
5154 true /* delay */);
5155 rules.emplace_back(
5156 "a", dns_protocol::kTypeAAAA, false /* secure */,
5157 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
5158 true /* delay */);
dalykc27699a2019-07-29 20:53:295159 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
5160 DnsConfigOverrides overrides;
Eric Ortha093b092020-09-24 23:13:025161 overrides.secure_dns_mode = SecureDnsMode::kAutomatic;
dalykc27699a2019-07-29 20:53:295162 resolver_->SetDnsConfigOverrides(overrides);
5163
Ben Schwartz432ce032021-05-05 21:49:245164 // Create three requests. One with a DISABLE policy parameter, one with no
5165 // resolution parameters at all, and one with an ALLOW policy parameter
5166 // (which is a no-op).
5167 HostResolver::ResolveHostParameters parameters_disable_secure;
5168 parameters_disable_secure.secure_dns_policy = SecureDnsPolicy::kDisable;
5169 ResolveHostResponseHelper insecure_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555170 HostPortPair("a", 80), NetworkIsolationKey(), NetLogWithSource(),
Ben Schwartz432ce032021-05-05 21:49:245171 parameters_disable_secure, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:505172 resolve_context_->host_cache()));
dalykc27699a2019-07-29 20:53:295173 EXPECT_EQ(1u, resolver_->num_jobs_for_testing());
5174
5175 ResolveHostResponseHelper automatic_response0(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555176 HostPortPair("a", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:525177 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
dalykc27699a2019-07-29 20:53:295178 EXPECT_EQ(2u, resolver_->num_jobs_for_testing());
5179
Ben Schwartz432ce032021-05-05 21:49:245180 HostResolver::ResolveHostParameters parameters_allow_secure;
5181 parameters_allow_secure.secure_dns_policy = SecureDnsPolicy::kAllow;
dalykc27699a2019-07-29 20:53:295182 ResolveHostResponseHelper automatic_response1(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555183 HostPortPair("a", 80), NetworkIsolationKey(), NetLogWithSource(),
Ben Schwartz432ce032021-05-05 21:49:245184 parameters_allow_secure, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:505185 resolve_context_->host_cache()));
dalykc27699a2019-07-29 20:53:295186 // The AUTOMATIC mode requests should be joined into the same job.
5187 EXPECT_EQ(2u, resolver_->num_jobs_for_testing());
5188
Ben Schwartz432ce032021-05-05 21:49:245189 // Automatic mode requests have completed. Insecure request is still blocked.
dalykc27699a2019-07-29 20:53:295190 base::RunLoop().RunUntilIdle();
Ben Schwartz432ce032021-05-05 21:49:245191 EXPECT_FALSE(insecure_response.complete());
5192 EXPECT_TRUE(automatic_response0.complete());
5193 EXPECT_TRUE(automatic_response1.complete());
dalykc27699a2019-07-29 20:53:295194 EXPECT_THAT(automatic_response0.result_error(), IsOk());
5195 EXPECT_THAT(automatic_response1.result_error(), IsOk());
Ben Schwartz432ce032021-05-05 21:49:245196
5197 // Complete insecure transaction.
5198 dns_client_->CompleteDelayedTransactions();
5199 EXPECT_TRUE(insecure_response.complete());
5200 EXPECT_THAT(insecure_response.result_error(), IsOk());
dalykc27699a2019-07-29 20:53:295201}
5202
[email protected]daae1322013-09-05 18:26:505203// Cancel a request with a single DNS transaction active.
Eric Orth960e7062019-03-08 18:43:545204TEST_F(HostResolverManagerDnsTest, CancelWithOneTransactionActive) {
Eric Orth70992982018-07-24 00:25:005205 // Disable ipv6 to ensure we'll only try a single transaction for the host.
5206 CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:325207 false /* ipv6_reachable */,
5208 true /* check_ipv6_on_wifi */);
Eric Orth70992982018-07-24 00:25:005209 DnsConfig config = CreateValidDnsConfig();
5210 config.use_local_ipv6 = false;
5211 ChangeDnsConfig(config);
5212
Eric Orth117e1992019-04-17 00:24:155213 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555214 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:525215 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:005216 ASSERT_FALSE(response.complete());
5217 ASSERT_EQ(1u, num_running_dispatcher_jobs());
5218
5219 response.CancelRequest();
5220 base::RunLoop().RunUntilIdle();
5221 EXPECT_FALSE(response.complete());
5222
5223 // Dispatcher state checked in TearDown.
5224}
5225
[email protected]daae1322013-09-05 18:26:505226// Cancel a request with a single DNS transaction active and another pending.
Eric Orth960e7062019-03-08 18:43:545227TEST_F(HostResolverManagerDnsTest, CancelWithOneTransactionActiveOnePending) {
[email protected]daae1322013-09-05 18:26:505228 CreateSerialResolver();
[email protected]daae1322013-09-05 18:26:505229 ChangeDnsConfig(CreateValidDnsConfig());
5230
Eric Orth117e1992019-04-17 00:24:155231 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555232 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:525233 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:005234 EXPECT_EQ(1u, num_running_dispatcher_jobs());
5235
5236 response.CancelRequest();
5237 base::RunLoop().RunUntilIdle();
5238 EXPECT_FALSE(response.complete());
5239
5240 // Dispatcher state checked in TearDown.
5241}
5242
[email protected]daae1322013-09-05 18:26:505243// Cancel a request with two DNS transactions active.
Eric Orth960e7062019-03-08 18:43:545244TEST_F(HostResolverManagerDnsTest, CancelWithTwoTransactionsActive) {
[email protected]daae1322013-09-05 18:26:505245 ChangeDnsConfig(CreateValidDnsConfig());
5246
Eric Orth117e1992019-04-17 00:24:155247 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555248 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:525249 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:005250 EXPECT_EQ(2u, num_running_dispatcher_jobs());
5251
5252 response.CancelRequest();
5253 base::RunLoop().RunUntilIdle();
5254 EXPECT_FALSE(response.complete());
5255
5256 // Dispatcher state checked in TearDown.
5257}
5258
[email protected]daae1322013-09-05 18:26:505259// Delete a resolver with some active requests and some queued requests.
Eric Orth960e7062019-03-08 18:43:545260TEST_F(HostResolverManagerDnsTest, DeleteWithActiveTransactions) {
[email protected]daae1322013-09-05 18:26:505261 // At most 10 Jobs active at once.
Eric Orth70992982018-07-24 00:25:005262 CreateResolverWithLimitsAndParams(10u, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:325263 true /* ipv6_reachable */,
5264 true /* check_ipv6_on_wifi */);
[email protected]daae1322013-09-05 18:26:505265
[email protected]daae1322013-09-05 18:26:505266 ChangeDnsConfig(CreateValidDnsConfig());
5267
Eric Orth70992982018-07-24 00:25:005268 // Add 12 DNS lookups (creating well more than 10 transaction).
5269 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
5270 for (int i = 0; i < 12; ++i) {
5271 std::string hostname = base::StringPrintf("ok%i", i);
Eric Orth117e1992019-04-17 00:24:155272 responses.emplace_back(
5273 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555274 HostPortPair(hostname, 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:525275 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:505276 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:005277 }
5278 EXPECT_EQ(10u, num_running_dispatcher_jobs());
5279
Eric Orth37b18192019-04-22 19:09:285280 DestroyResolver();
Eric Orth70992982018-07-24 00:25:005281
5282 base::RunLoop().RunUntilIdle();
5283 for (auto& response : responses) {
5284 EXPECT_FALSE(response->complete());
5285 }
5286}
5287
dalykc682ba3c2019-08-21 17:16:235288TEST_F(HostResolverManagerDnsTest, DeleteWithSecureTransactions) {
5289 ChangeDnsConfig(CreateValidDnsConfig());
5290 DnsConfigOverrides overrides;
Eric Ortha093b092020-09-24 23:13:025291 overrides.secure_dns_mode = SecureDnsMode::kSecure;
dalykc682ba3c2019-08-21 17:16:235292 resolver_->SetDnsConfigOverrides(overrides);
5293
5294 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555295 HostPortPair("secure", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:525296 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
dalykc682ba3c2019-08-21 17:16:235297
5298 DestroyResolver();
5299
5300 base::RunLoop().RunUntilIdle();
5301 EXPECT_FALSE(response.complete());
5302}
5303
Eric Orth5233c3a2019-04-08 17:01:145304TEST_F(HostResolverManagerDnsTest, DeleteWithCompletedRequests) {
5305 ChangeDnsConfig(CreateValidDnsConfig());
5306
Eric Orth117e1992019-04-17 00:24:155307 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555308 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:525309 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth5233c3a2019-04-08 17:01:145310
5311 EXPECT_THAT(response.result_error(), IsOk());
5312 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
5313 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
5314 CreateExpected("::1", 80)));
5315
Eric Orth37b18192019-04-22 19:09:285316 DestroyResolver();
Eric Orth5233c3a2019-04-08 17:01:145317
5318 // Completed requests should be unaffected by manager destruction.
5319 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
5320 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
5321 CreateExpected("::1", 80)));
5322}
5323
5324TEST_F(HostResolverManagerDnsTest, ExplicitCancel) {
5325 ChangeDnsConfig(CreateValidDnsConfig());
5326
5327 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555328 HostPortPair("4slow_4ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:525329 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth5233c3a2019-04-08 17:01:145330
5331 response.request()->Cancel();
5332 dns_client_->CompleteDelayedTransactions();
5333
5334 base::RunLoop().RunUntilIdle();
5335 EXPECT_FALSE(response.complete());
5336}
5337
Eric Orth314e8b42019-11-12 00:32:215338TEST_F(HostResolverManagerDnsTest, ExplicitCancel_AfterManagerDestruction) {
5339 ChangeDnsConfig(CreateValidDnsConfig());
5340
5341 ResolveHostResponseHelper response(resolver_->CreateRequest(
5342 HostPortPair("4slow_4ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:525343 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth314e8b42019-11-12 00:32:215344
5345 DestroyResolver();
5346 response.request()->Cancel();
5347}
5348
Eric Orth5233c3a2019-04-08 17:01:145349TEST_F(HostResolverManagerDnsTest, ExplicitCancel_Completed) {
5350 ChangeDnsConfig(CreateValidDnsConfig());
5351
Eric Orth117e1992019-04-17 00:24:155352 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555353 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:525354 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth5233c3a2019-04-08 17:01:145355
5356 EXPECT_THAT(response.result_error(), IsOk());
5357 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
5358 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
5359 CreateExpected("::1", 80)));
5360
5361 response.request()->Cancel();
5362
5363 // Completed requests should be unaffected by cancellation.
5364 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
5365 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
5366 CreateExpected("::1", 80)));
5367}
5368
[email protected]daae1322013-09-05 18:26:505369// Cancel a request with only the IPv6 transaction active.
Eric Orth960e7062019-03-08 18:43:545370TEST_F(HostResolverManagerDnsTest, CancelWithIPv6TransactionActive) {
[email protected]daae1322013-09-05 18:26:505371 ChangeDnsConfig(CreateValidDnsConfig());
5372
Eric Orth117e1992019-04-17 00:24:155373 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555374 HostPortPair("6slow_ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:525375 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:005376 EXPECT_EQ(2u, num_running_dispatcher_jobs());
5377
5378 // The IPv4 request should complete, the IPv6 request is still pending.
5379 base::RunLoop().RunUntilIdle();
5380 EXPECT_EQ(1u, num_running_dispatcher_jobs());
5381
5382 response.CancelRequest();
5383 base::RunLoop().RunUntilIdle();
5384 EXPECT_FALSE(response.complete());
5385
5386 // Dispatcher state checked in TearDown.
5387}
5388
[email protected]daae1322013-09-05 18:26:505389// Cancel a request with only the IPv4 transaction pending.
Eric Orth960e7062019-03-08 18:43:545390TEST_F(HostResolverManagerDnsTest, CancelWithIPv4TransactionPending) {
Eric Orth60931742018-11-05 23:40:575391 set_allow_fallback_to_proctask(false);
[email protected]daae1322013-09-05 18:26:505392 ChangeDnsConfig(CreateValidDnsConfig());
5393
Eric Orth117e1992019-04-17 00:24:155394 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555395 HostPortPair("4slow_ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:525396 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:005397 EXPECT_EQ(2u, num_running_dispatcher_jobs());
5398
5399 // The IPv6 request should complete, the IPv4 request is still pending.
5400 base::RunLoop().RunUntilIdle();
5401 EXPECT_EQ(1u, num_running_dispatcher_jobs());
5402
5403 response.CancelRequest();
5404 base::RunLoop().RunUntilIdle();
5405 EXPECT_FALSE(response.complete());
5406}
5407
dalyk4f4ac712019-05-31 16:33:135408TEST_F(HostResolverManagerDnsTest, CancelWithAutomaticModeTransactionPending) {
5409 MockDnsClientRuleList rules;
Peter Kastingd039b772021-08-18 00:06:205410 rules.emplace_back(
5411 "secure_6slow_6nx_insecure_6slow_ok", dns_protocol::kTypeA,
5412 true /* secure */,
5413 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
5414 false /* delay */);
5415 rules.emplace_back(
5416 "secure_6slow_6nx_insecure_6slow_ok", dns_protocol::kTypeAAAA,
5417 true /* secure */,
5418 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kFail),
5419 true /* delay */);
5420 rules.emplace_back(
5421 "secure_6slow_6nx_insecure_6slow_ok", dns_protocol::kTypeA,
5422 false /* secure */,
5423 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
5424 false /* delay */);
5425 rules.emplace_back(
5426 "secure_6slow_6nx_insecure_6slow_ok", dns_protocol::kTypeAAAA,
5427 false /* secure */,
5428 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
5429 true /* delay */);
dalyk4f4ac712019-05-31 16:33:135430 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
5431
5432 DnsConfigOverrides overrides;
Eric Ortha093b092020-09-24 23:13:025433 overrides.secure_dns_mode = SecureDnsMode::kAutomatic;
dalyk4f4ac712019-05-31 16:33:135434 resolver_->SetDnsConfigOverrides(overrides);
5435
5436 ResolveHostResponseHelper response0(resolver_->CreateRequest(
5437 HostPortPair("secure_6slow_6nx_insecure_6slow_ok", 80),
Anton Bikineev068d2912021-05-15 20:43:525438 NetworkIsolationKey(), NetLogWithSource(), absl::nullopt,
Eric Orthaf82b49a2020-02-01 01:48:505439 resolve_context_.get(), resolve_context_->host_cache()));
dalykc682ba3c2019-08-21 17:16:235440 EXPECT_EQ(0u, num_running_dispatcher_jobs());
dalyk4f4ac712019-05-31 16:33:135441
5442 // The secure IPv4 request should complete, the secure IPv6 request is still
5443 // pending.
5444 base::RunLoop().RunUntilIdle();
dalykc682ba3c2019-08-21 17:16:235445 EXPECT_EQ(0u, num_running_dispatcher_jobs());
dalyk4f4ac712019-05-31 16:33:135446
5447 response0.CancelRequest();
5448 base::RunLoop().RunUntilIdle();
5449 EXPECT_FALSE(response0.complete());
5450 EXPECT_EQ(0u, num_running_dispatcher_jobs());
5451
5452 ResolveHostResponseHelper response1(resolver_->CreateRequest(
5453 HostPortPair("secure_6slow_6nx_insecure_6slow_ok", 80),
Anton Bikineev068d2912021-05-15 20:43:525454 NetworkIsolationKey(), NetLogWithSource(), absl::nullopt,
Eric Orthaf82b49a2020-02-01 01:48:505455 resolve_context_.get(), resolve_context_->host_cache()));
dalykc682ba3c2019-08-21 17:16:235456 EXPECT_EQ(0u, num_running_dispatcher_jobs());
dalyk4f4ac712019-05-31 16:33:135457
5458 // The secure IPv4 request should complete, the secure IPv6 request is still
5459 // pending.
5460 base::RunLoop().RunUntilIdle();
dalykc682ba3c2019-08-21 17:16:235461 EXPECT_EQ(0u, num_running_dispatcher_jobs());
dalyk4f4ac712019-05-31 16:33:135462
5463 // Let the secure IPv6 request complete and start the insecure requests.
5464 dns_client_->CompleteDelayedTransactions();
5465 EXPECT_EQ(2u, num_running_dispatcher_jobs());
5466
5467 // The insecure IPv4 request should complete, the insecure IPv6 request is
5468 // still pending.
5469 base::RunLoop().RunUntilIdle();
5470 EXPECT_EQ(1u, num_running_dispatcher_jobs());
5471
5472 response1.CancelRequest();
5473 base::RunLoop().RunUntilIdle();
5474 EXPECT_FALSE(response1.complete());
5475
5476 // Dispatcher state checked in TearDown.
5477}
5478
[email protected]daae1322013-09-05 18:26:505479// Test cases where AAAA completes first.
Eric Orth960e7062019-03-08 18:43:545480TEST_F(HostResolverManagerDnsTest, AAAACompletesFirst) {
Eric Orth60931742018-11-05 23:40:575481 set_allow_fallback_to_proctask(false);
[email protected]daae1322013-09-05 18:26:505482 ChangeDnsConfig(CreateValidDnsConfig());
5483
Eric Orth70992982018-07-24 00:25:005484 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:155485 responses.emplace_back(
5486 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555487 HostPortPair("4slow_ok", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:525488 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:505489 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:005490 responses.emplace_back(
5491 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555492 HostPortPair("4slow_4ok", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:525493 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:505494 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:005495 responses.emplace_back(
5496 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555497 HostPortPair("4slow_4timeout", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:525498 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:505499 resolve_context_->host_cache())));
Eric Orth6f1c5172019-04-16 17:08:275500 responses.emplace_back(
5501 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555502 HostPortPair("4slow_6timeout", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:525503 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:505504 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:005505
5506 base::RunLoop().RunUntilIdle();
5507 EXPECT_FALSE(responses[0]->complete());
5508 EXPECT_FALSE(responses[1]->complete());
5509 EXPECT_FALSE(responses[2]->complete());
5510 // The IPv6 of request 3 should have failed and resulted in cancelling the
5511 // IPv4 request.
5512 EXPECT_THAT(responses[3]->result_error(), IsError(ERR_DNS_TIMED_OUT));
5513 EXPECT_EQ(3u, num_running_dispatcher_jobs());
5514
5515 dns_client_->CompleteDelayedTransactions();
5516 EXPECT_THAT(responses[0]->result_error(), IsOk());
5517 EXPECT_THAT(responses[0]->request()->GetAddressResults().value().endpoints(),
5518 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
5519 CreateExpected("::1", 80)));
5520
5521 EXPECT_THAT(responses[1]->result_error(), IsOk());
5522 EXPECT_THAT(responses[1]->request()->GetAddressResults().value().endpoints(),
5523 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
5524
5525 EXPECT_THAT(responses[2]->result_error(), IsError(ERR_DNS_TIMED_OUT));
5526}
5527
dalyk4f4ac712019-05-31 16:33:135528TEST_F(HostResolverManagerDnsTest, AAAACompletesFirst_AutomaticMode) {
dalyk48b20a992019-02-25 16:10:265529 MockDnsClientRuleList rules;
Peter Kastingd039b772021-08-18 00:06:205530 rules.emplace_back(
5531 "secure_slow_nx_insecure_4slow_ok", dns_protocol::kTypeA,
5532 true /* secure */,
5533 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kFail),
5534 true /* delay */);
5535 rules.emplace_back(
5536 "secure_slow_nx_insecure_4slow_ok", dns_protocol::kTypeAAAA,
5537 true /* secure */,
5538 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kFail),
5539 true /* delay */);
5540 rules.emplace_back(
5541 "secure_slow_nx_insecure_4slow_ok", dns_protocol::kTypeA,
5542 false /* secure */,
5543 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
5544 true /* delay */);
5545 rules.emplace_back(
5546 "secure_slow_nx_insecure_4slow_ok", dns_protocol::kTypeAAAA,
5547 false /* secure */,
5548 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kEmpty),
5549 false /* delay */);
dalyk48b20a992019-02-25 16:10:265550 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
dalyk4f4ac712019-05-31 16:33:135551 DnsConfigOverrides overrides;
Eric Ortha093b092020-09-24 23:13:025552 overrides.secure_dns_mode = SecureDnsMode::kAutomatic;
dalyk4f4ac712019-05-31 16:33:135553 resolver_->SetDnsConfigOverrides(overrides);
dalyk48b20a992019-02-25 16:10:265554
dalyk4f4ac712019-05-31 16:33:135555 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555556 HostPortPair("secure_slow_nx_insecure_4slow_ok", 80),
Anton Bikineev068d2912021-05-15 20:43:525557 NetworkIsolationKey(), NetLogWithSource(), absl::nullopt,
Eric Orthaf82b49a2020-02-01 01:48:505558 resolve_context_.get(), resolve_context_->host_cache()));
dalyk48b20a992019-02-25 16:10:265559 base::RunLoop().RunUntilIdle();
dalyk4f4ac712019-05-31 16:33:135560 EXPECT_FALSE(response.complete());
5561 // Complete the secure transactions.
dalyk48b20a992019-02-25 16:10:265562 dns_client_->CompleteDelayedTransactions();
dalyk4f4ac712019-05-31 16:33:135563 base::RunLoop().RunUntilIdle();
5564 EXPECT_FALSE(response.complete());
5565 // Complete the insecure transactions.
5566 dns_client_->CompleteDelayedTransactions();
5567 ASSERT_THAT(response.result_error(), IsOk());
5568 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
5569 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
Matt Menke7b4a32f2019-10-25 22:13:465570 HostCache::Key insecure_key =
5571 HostCache::Key("secure_slow_nx_insecure_4slow_ok",
5572 DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
5573 HostResolverSource::ANY, NetworkIsolationKey());
dalyk4f4ac712019-05-31 16:33:135574 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result =
5575 GetCacheHit(insecure_key);
5576 EXPECT_TRUE(!!cache_result);
5577}
5578
5579TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Automatic) {
5580 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.100");
5581 set_allow_fallback_to_proctask(true);
5582
5583 ChangeDnsConfig(CreateValidDnsConfig());
5584 DnsConfigOverrides overrides;
Eric Ortha093b092020-09-24 23:13:025585 overrides.secure_dns_mode = SecureDnsMode::kAutomatic;
dalyk4f4ac712019-05-31 16:33:135586 resolver_->SetDnsConfigOverrides(overrides);
dalyk48b20a992019-02-25 16:10:265587 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result;
5588
dalyk4f4ac712019-05-31 16:33:135589 // A successful DoH request should result in a secure cache entry.
5590 ResolveHostResponseHelper response_secure(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555591 HostPortPair("automatic", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:525592 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
dalyk4f4ac712019-05-31 16:33:135593 ASSERT_THAT(response_secure.result_error(), IsOk());
dalyk59cba642020-01-02 21:39:265594 EXPECT_FALSE(
5595 response_secure.request()->GetResolveErrorInfo().is_secure_network_error);
dalyk4f4ac712019-05-31 16:33:135596 EXPECT_THAT(
5597 response_secure.request()->GetAddressResults().value().endpoints(),
5598 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
5599 CreateExpected("::1", 80)));
Matt Menke7b4a32f2019-10-25 22:13:465600 HostCache::Key secure_key = HostCache::Key(
5601 "automatic", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
5602 HostResolverSource::ANY, NetworkIsolationKey());
dalyk4f4ac712019-05-31 16:33:135603 secure_key.secure = true;
5604 cache_result = GetCacheHit(secure_key);
5605 EXPECT_TRUE(!!cache_result);
5606
5607 // A successful plaintext DNS request should result in an insecure cache
5608 // entry.
5609 ResolveHostResponseHelper response_insecure(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555610 HostPortPair("insecure_automatic", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:525611 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:505612 resolve_context_->host_cache()));
dalyk4f4ac712019-05-31 16:33:135613 ASSERT_THAT(response_insecure.result_error(), IsOk());
dalyk59cba642020-01-02 21:39:265614 EXPECT_FALSE(response_insecure.request()
5615 ->GetResolveErrorInfo()
5616 .is_secure_network_error);
dalyk4f4ac712019-05-31 16:33:135617 EXPECT_THAT(
5618 response_insecure.request()->GetAddressResults().value().endpoints(),
5619 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
5620 CreateExpected("::1", 80)));
5621 HostCache::Key insecure_key =
5622 HostCache::Key("insecure_automatic", DnsQueryType::UNSPECIFIED,
Matt Menke7b4a32f2019-10-25 22:13:465623 0 /* host_resolver_flags */, HostResolverSource::ANY,
5624 NetworkIsolationKey());
dalyk4f4ac712019-05-31 16:33:135625 cache_result = GetCacheHit(insecure_key);
5626 EXPECT_TRUE(!!cache_result);
5627
5628 // Fallback to ProcTask allowed in AUTOMATIC mode.
5629 ResolveHostResponseHelper response_proc(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555630 HostPortPair("nx_succeed", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:525631 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
dalyk4f4ac712019-05-31 16:33:135632 proc_->SignalMultiple(1u);
5633 EXPECT_THAT(response_proc.result_error(), IsOk());
5634 EXPECT_THAT(response_proc.request()->GetAddressResults().value().endpoints(),
5635 testing::ElementsAre(CreateExpected("192.168.1.100", 80)));
5636}
5637
dalyke966a1832019-06-05 20:53:135638TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Automatic_SecureCache) {
5639 ChangeDnsConfig(CreateValidDnsConfig());
5640 DnsConfigOverrides overrides;
Eric Ortha093b092020-09-24 23:13:025641 overrides.secure_dns_mode = SecureDnsMode::kAutomatic;
dalyke966a1832019-06-05 20:53:135642 resolver_->SetDnsConfigOverrides(overrides);
5643
5644 // Populate cache with a secure entry.
5645 HostCache::Key cached_secure_key =
5646 HostCache::Key("automatic_cached", DnsQueryType::UNSPECIFIED,
Matt Menke7b4a32f2019-10-25 22:13:465647 0 /* host_resolver_flags */, HostResolverSource::ANY,
5648 NetworkIsolationKey());
dalyke966a1832019-06-05 20:53:135649 cached_secure_key.secure = true;
5650 IPEndPoint kExpectedSecureIP = CreateExpected("192.168.1.102", 80);
5651 PopulateCache(cached_secure_key, kExpectedSecureIP);
5652
5653 // The secure cache should be checked prior to any DoH request being sent.
5654 ResolveHostResponseHelper response_secure_cached(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555655 HostPortPair("automatic_cached", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:525656 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:505657 resolve_context_->host_cache()));
dalyke966a1832019-06-05 20:53:135658 EXPECT_THAT(response_secure_cached.result_error(), IsOk());
dalyk59cba642020-01-02 21:39:265659 EXPECT_FALSE(response_secure_cached.request()
5660 ->GetResolveErrorInfo()
5661 .is_secure_network_error);
dalyke966a1832019-06-05 20:53:135662 EXPECT_THAT(
5663 response_secure_cached.request()->GetAddressResults().value().endpoints(),
5664 testing::ElementsAre(kExpectedSecureIP));
5665 EXPECT_FALSE(
5666 response_secure_cached.request()->GetStaleInfo().value().is_stale());
5667}
5668
5669TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Automatic_InsecureCache) {
5670 ChangeDnsConfig(CreateValidDnsConfig());
5671 DnsConfigOverrides overrides;
Eric Ortha093b092020-09-24 23:13:025672 overrides.secure_dns_mode = SecureDnsMode::kAutomatic;
dalyke966a1832019-06-05 20:53:135673 resolver_->SetDnsConfigOverrides(overrides);
5674
5675 // Populate cache with an insecure entry.
5676 HostCache::Key cached_insecure_key =
5677 HostCache::Key("insecure_automatic_cached", DnsQueryType::UNSPECIFIED,
Matt Menke7b4a32f2019-10-25 22:13:465678 0 /* host_resolver_flags */, HostResolverSource::ANY,
5679 NetworkIsolationKey());
dalyke966a1832019-06-05 20:53:135680 IPEndPoint kExpectedInsecureIP = CreateExpected("192.168.1.103", 80);
5681 PopulateCache(cached_insecure_key, kExpectedInsecureIP);
5682
5683 // The insecure cache should be checked after DoH requests fail.
5684 ResolveHostResponseHelper response_insecure_cached(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555685 HostPortPair("insecure_automatic_cached", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:525686 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:505687 resolve_context_->host_cache()));
dalyke966a1832019-06-05 20:53:135688 EXPECT_THAT(response_insecure_cached.result_error(), IsOk());
dalyk59cba642020-01-02 21:39:265689 EXPECT_FALSE(response_insecure_cached.request()
5690 ->GetResolveErrorInfo()
5691 .is_secure_network_error);
dalyke966a1832019-06-05 20:53:135692 EXPECT_THAT(response_insecure_cached.request()
5693 ->GetAddressResults()
5694 .value()
5695 .endpoints(),
5696 testing::ElementsAre(kExpectedInsecureIP));
5697 EXPECT_FALSE(
5698 response_insecure_cached.request()->GetStaleInfo().value().is_stale());
5699}
5700
dalyk4f4ac712019-05-31 16:33:135701TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Automatic_Downgrade) {
5702 ChangeDnsConfig(CreateValidDnsConfig());
5703 // Remove all DoH servers from the config so there is no DoH server available.
5704 DnsConfigOverrides overrides;
Eric Orthc63cf502020-04-03 21:21:275705 std::vector<DnsOverHttpsServerConfig> doh_servers;
dalyk4f4ac712019-05-31 16:33:135706 overrides.dns_over_https_servers = doh_servers;
Eric Ortha093b092020-09-24 23:13:025707 overrides.secure_dns_mode = SecureDnsMode::kAutomatic;
dalyk4f4ac712019-05-31 16:33:135708 resolver_->SetDnsConfigOverrides(overrides);
5709 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result;
5710
dalyke966a1832019-06-05 20:53:135711 // Populate cache with both secure and insecure entries.
5712 HostCache::Key cached_secure_key =
5713 HostCache::Key("automatic_cached", DnsQueryType::UNSPECIFIED,
Matt Menke7b4a32f2019-10-25 22:13:465714 0 /* host_resolver_flags */, HostResolverSource::ANY,
5715 NetworkIsolationKey());
dalyke966a1832019-06-05 20:53:135716 cached_secure_key.secure = true;
5717 IPEndPoint kExpectedSecureIP = CreateExpected("192.168.1.102", 80);
5718 PopulateCache(cached_secure_key, kExpectedSecureIP);
5719 HostCache::Key cached_insecure_key =
5720 HostCache::Key("insecure_automatic_cached", DnsQueryType::UNSPECIFIED,
Matt Menke7b4a32f2019-10-25 22:13:465721 0 /* host_resolver_flags */, HostResolverSource::ANY,
5722 NetworkIsolationKey());
dalyke966a1832019-06-05 20:53:135723 IPEndPoint kExpectedInsecureIP = CreateExpected("192.168.1.103", 80);
5724 PopulateCache(cached_insecure_key, kExpectedInsecureIP);
5725
5726 // The secure cache should still be checked first.
5727 ResolveHostResponseHelper response_cached(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555728 HostPortPair("automatic_cached", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:525729 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:505730 resolve_context_->host_cache()));
dalyke966a1832019-06-05 20:53:135731 EXPECT_THAT(response_cached.result_error(), IsOk());
5732 EXPECT_THAT(
5733 response_cached.request()->GetAddressResults().value().endpoints(),
5734 testing::ElementsAre(kExpectedSecureIP));
5735
5736 // The insecure cache should be checked before any insecure requests are sent.
5737 ResolveHostResponseHelper insecure_response_cached(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555738 HostPortPair("insecure_automatic_cached", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:525739 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:505740 resolve_context_->host_cache()));
dalyke966a1832019-06-05 20:53:135741 EXPECT_THAT(insecure_response_cached.result_error(), IsOk());
5742 EXPECT_THAT(insecure_response_cached.request()
5743 ->GetAddressResults()
5744 .value()
5745 .endpoints(),
5746 testing::ElementsAre(kExpectedInsecureIP));
5747
dalyk4f4ac712019-05-31 16:33:135748 // The DnsConfig doesn't contain DoH servers so AUTOMATIC mode will be
5749 // downgraded to OFF. A successful plaintext DNS request should result in an
5750 // insecure cache entry.
5751 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555752 HostPortPair("automatic", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:525753 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
dalyk4f4ac712019-05-31 16:33:135754 ASSERT_THAT(response.result_error(), IsOk());
5755 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
dalyk48b20a992019-02-25 16:10:265756 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
5757 CreateExpected("::1", 80)));
Matt Menke7b4a32f2019-10-25 22:13:465758 HostCache::Key key = HostCache::Key(
5759 "automatic", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
5760 HostResolverSource::ANY, NetworkIsolationKey());
dalyk48b20a992019-02-25 16:10:265761 cache_result = GetCacheHit(key);
5762 EXPECT_TRUE(!!cache_result);
dalyk4f4ac712019-05-31 16:33:135763}
dalyk48b20a992019-02-25 16:10:265764
dalykc2adf182019-09-02 14:31:225765TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Automatic_Unavailable) {
5766 ChangeDnsConfig(CreateValidDnsConfig());
5767 DnsConfigOverrides overrides;
Eric Ortha093b092020-09-24 23:13:025768 overrides.secure_dns_mode = SecureDnsMode::kAutomatic;
dalykc2adf182019-09-02 14:31:225769 resolver_->SetDnsConfigOverrides(overrides);
Eric Orth7dc18e92020-02-13 20:27:565770 dns_client_->SetForceDohServerAvailable(false);
dalykc2adf182019-09-02 14:31:225771
5772 // DoH requests should be skipped when there are no available DoH servers
5773 // in automatic mode. The cached result should be in the insecure cache.
5774 ResolveHostResponseHelper response_automatic(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555775 HostPortPair("automatic", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:525776 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
dalykc2adf182019-09-02 14:31:225777 ASSERT_THAT(response_automatic.result_error(), IsOk());
dalyk59cba642020-01-02 21:39:265778 EXPECT_FALSE(response_automatic.request()
5779 ->GetResolveErrorInfo()
5780 .is_secure_network_error);
dalykc2adf182019-09-02 14:31:225781 EXPECT_THAT(
5782 response_automatic.request()->GetAddressResults().value().endpoints(),
5783 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
5784 CreateExpected("::1", 80)));
Matt Menke7b4a32f2019-10-25 22:13:465785 HostCache::Key secure_key = HostCache::Key(
5786 "automatic", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
5787 HostResolverSource::ANY, NetworkIsolationKey());
dalykc2adf182019-09-02 14:31:225788 secure_key.secure = true;
5789 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result =
5790 GetCacheHit(secure_key);
5791 EXPECT_FALSE(!!cache_result);
5792
Matt Menke7b4a32f2019-10-25 22:13:465793 HostCache::Key insecure_key = HostCache::Key(
5794 "automatic", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
5795 HostResolverSource::ANY, NetworkIsolationKey());
dalykc2adf182019-09-02 14:31:225796 cache_result = GetCacheHit(insecure_key);
5797 EXPECT_TRUE(!!cache_result);
5798}
5799
5800TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Automatic_Unavailable_Fail) {
5801 set_allow_fallback_to_proctask(false);
5802 ChangeDnsConfig(CreateValidDnsConfig());
5803 DnsConfigOverrides overrides;
Eric Ortha093b092020-09-24 23:13:025804 overrides.secure_dns_mode = SecureDnsMode::kAutomatic;
dalykc2adf182019-09-02 14:31:225805 resolver_->SetDnsConfigOverrides(overrides);
Eric Orth7dc18e92020-02-13 20:27:565806 dns_client_->SetForceDohServerAvailable(false);
dalykc2adf182019-09-02 14:31:225807
5808 // Insecure requests that fail should not be cached.
5809 ResolveHostResponseHelper response_secure(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555810 HostPortPair("secure", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:525811 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
dalykc2adf182019-09-02 14:31:225812 ASSERT_THAT(response_secure.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
dalyk59cba642020-01-02 21:39:265813 EXPECT_FALSE(
5814 response_secure.request()->GetResolveErrorInfo().is_secure_network_error);
dalykc2adf182019-09-02 14:31:225815
Matt Menke7b4a32f2019-10-25 22:13:465816 HostCache::Key secure_key = HostCache::Key(
5817 "secure", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
5818 HostResolverSource::ANY, NetworkIsolationKey());
dalykc2adf182019-09-02 14:31:225819 secure_key.secure = true;
5820 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result =
5821 GetCacheHit(secure_key);
5822 EXPECT_FALSE(!!cache_result);
5823
Matt Menke7b4a32f2019-10-25 22:13:465824 HostCache::Key insecure_key = HostCache::Key(
5825 "secure", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
5826 HostResolverSource::ANY, NetworkIsolationKey());
dalykc2adf182019-09-02 14:31:225827 cache_result = GetCacheHit(insecure_key);
5828 EXPECT_FALSE(!!cache_result);
5829}
5830
Eric Orth7dc18e92020-02-13 20:27:565831// Test that DoH server availability is respected per-context.
5832TEST_F(HostResolverManagerDnsTest,
5833 SecureDnsMode_Automatic_UnavailableByContext) {
5834 // Create and register two separate contexts.
5835 TestURLRequestContext request_context1;
5836 TestURLRequestContext request_context2;
5837 ResolveContext resolve_context1(&request_context1,
5838 false /* enable_caching */);
5839 ResolveContext resolve_context2(&request_context2,
5840 false /* enable_caching */);
5841 resolver_->RegisterResolveContext(&resolve_context1);
5842 resolver_->RegisterResolveContext(&resolve_context2);
5843
5844 // Configure the resolver and underlying mock to attempt a secure query iff
5845 // the context has marked a DoH server available and otherwise attempt a
5846 // non-secure query.
5847 set_allow_fallback_to_proctask(false);
5848 ChangeDnsConfig(CreateValidDnsConfig());
5849 DnsConfigOverrides overrides;
Eric Ortha093b092020-09-24 23:13:025850 overrides.secure_dns_mode = SecureDnsMode::kAutomatic;
Eric Orth7dc18e92020-02-13 20:27:565851 resolver_->SetDnsConfigOverrides(overrides);
5852 dns_client_->SetForceDohServerAvailable(false);
5853
5854 // Mark a DoH server successful only for |resolve_context2|. Note that this
5855 // must come after the resolver's configuration is set because this relies on
5856 // the specific configuration containing a DoH server.
Eric Orthafa35442020-02-28 22:09:525857 resolve_context2.RecordServerSuccess(0u /* server_index */,
5858 true /* is_doh_server */,
5859 dns_client_->GetCurrentSession());
Eric Orth7dc18e92020-02-13 20:27:565860
5861 // No available DoH servers for |resolve_context1|, so expect a non-secure
5862 // request. Non-secure requests for "secure" will fail with
5863 // ERR_NAME_NOT_RESOLVED.
5864 ResolveHostResponseHelper response_secure(resolver_->CreateRequest(
5865 HostPortPair("secure", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:525866 absl::nullopt, &resolve_context1, resolve_context_->host_cache()));
Eric Orth7dc18e92020-02-13 20:27:565867 ASSERT_THAT(response_secure.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
5868
5869 // One available DoH server for |resolve_context2|, so expect a secure
5870 // request. Secure requests for "secure" will succeed.
5871 ResolveHostResponseHelper response_secure2(resolver_->CreateRequest(
5872 HostPortPair("secure", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:525873 absl::nullopt, &resolve_context2, nullptr /* host_cache */));
Eric Orth7dc18e92020-02-13 20:27:565874 ASSERT_THAT(response_secure2.result_error(), IsOk());
5875
5876 resolver_->DeregisterResolveContext(&resolve_context1);
5877 resolver_->DeregisterResolveContext(&resolve_context2);
5878}
5879
dalyke966a1832019-06-05 20:53:135880TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Automatic_Stale) {
5881 ChangeDnsConfig(CreateValidDnsConfig());
5882 DnsConfigOverrides overrides;
Eric Ortha093b092020-09-24 23:13:025883 overrides.secure_dns_mode = SecureDnsMode::kAutomatic;
dalyke966a1832019-06-05 20:53:135884 resolver_->SetDnsConfigOverrides(overrides);
5885
5886 // Populate cache with insecure entry.
Matt Menke7b4a32f2019-10-25 22:13:465887 HostCache::Key cached_stale_key = HostCache::Key(
5888 "automatic_stale", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
5889 HostResolverSource::ANY, NetworkIsolationKey());
dalyke966a1832019-06-05 20:53:135890 IPEndPoint kExpectedStaleIP = CreateExpected("192.168.1.102", 80);
5891 PopulateCache(cached_stale_key, kExpectedStaleIP);
5892 MakeCacheStale();
5893
5894 HostResolver::ResolveHostParameters stale_allowed_parameters;
5895 stale_allowed_parameters.cache_usage =
5896 HostResolver::ResolveHostParameters::CacheUsage::STALE_ALLOWED;
5897
5898 // The insecure cache should be checked before secure requests are made since
5899 // stale results are allowed.
5900 ResolveHostResponseHelper response_stale(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555901 HostPortPair("automatic_stale", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:245902 NetLogWithSource(), stale_allowed_parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:505903 resolve_context_->host_cache()));
dalyke966a1832019-06-05 20:53:135904 EXPECT_THAT(response_stale.result_error(), IsOk());
dalyk59cba642020-01-02 21:39:265905 EXPECT_FALSE(
5906 response_stale.request()->GetResolveErrorInfo().is_secure_network_error);
dalyke966a1832019-06-05 20:53:135907 EXPECT_THAT(response_stale.request()->GetAddressResults().value().endpoints(),
5908 testing::ElementsAre(kExpectedStaleIP));
5909 EXPECT_TRUE(response_stale.request()->GetStaleInfo()->is_stale());
5910}
5911
dalykc27699a2019-07-29 20:53:295912TEST_F(HostResolverManagerDnsTest,
5913 SecureDnsMode_Automatic_InsecureAsyncDisabled) {
5914 proc_->AddRuleForAllFamilies("insecure_automatic", "192.168.1.100");
5915 ChangeDnsConfig(CreateValidDnsConfig());
Eric Orth09746312021-05-05 15:44:585916 resolver_->SetInsecureDnsClientEnabled(
5917 /*enabled=*/false,
5918 /*additional_dns_types_enabled=*/false);
dalykc27699a2019-07-29 20:53:295919 DnsConfigOverrides overrides;
Eric Ortha093b092020-09-24 23:13:025920 overrides.secure_dns_mode = SecureDnsMode::kAutomatic;
dalykc27699a2019-07-29 20:53:295921 resolver_->SetDnsConfigOverrides(overrides);
5922
5923 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result;
5924
5925 // The secure part of the dns client should be enabled.
5926 ResolveHostResponseHelper response_secure(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555927 HostPortPair("automatic", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:525928 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
dalykc27699a2019-07-29 20:53:295929 ASSERT_THAT(response_secure.result_error(), IsOk());
5930 EXPECT_THAT(
5931 response_secure.request()->GetAddressResults().value().endpoints(),
5932 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
5933 CreateExpected("::1", 80)));
Matt Menke7b4a32f2019-10-25 22:13:465934 HostCache::Key secure_key = HostCache::Key(
5935 "automatic", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
5936 HostResolverSource::ANY, NetworkIsolationKey());
dalykc27699a2019-07-29 20:53:295937 secure_key.secure = true;
5938 cache_result = GetCacheHit(secure_key);
5939 EXPECT_TRUE(!!cache_result);
5940
5941 // The insecure part of the dns client is disabled so insecure requests
5942 // should be skipped.
5943 ResolveHostResponseHelper response_insecure(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555944 HostPortPair("insecure_automatic", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:525945 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:505946 resolve_context_->host_cache()));
dalykc27699a2019-07-29 20:53:295947 proc_->SignalMultiple(1u);
5948 ASSERT_THAT(response_insecure.result_error(), IsOk());
5949 EXPECT_THAT(
5950 response_insecure.request()->GetAddressResults().value().endpoints(),
5951 testing::ElementsAre(CreateExpected("192.168.1.100", 80)));
5952 HostCache::Key insecure_key =
5953 HostCache::Key("insecure_automatic", DnsQueryType::UNSPECIFIED,
Matt Menke7b4a32f2019-10-25 22:13:465954 0 /* host_resolver_flags */, HostResolverSource::ANY,
5955 NetworkIsolationKey());
dalykc27699a2019-07-29 20:53:295956 cache_result = GetCacheHit(insecure_key);
5957 EXPECT_TRUE(!!cache_result);
5958
5959 HostCache::Key cached_insecure_key =
5960 HostCache::Key("insecure_automatic_cached", DnsQueryType::UNSPECIFIED,
Matt Menke7b4a32f2019-10-25 22:13:465961 0 /* host_resolver_flags */, HostResolverSource::ANY,
5962 NetworkIsolationKey());
dalykc27699a2019-07-29 20:53:295963 IPEndPoint kExpectedInsecureIP = CreateExpected("192.168.1.101", 80);
5964 PopulateCache(cached_insecure_key, kExpectedInsecureIP);
5965
5966 // The insecure cache should still be checked even if the insecure part of
5967 // the dns client is disabled.
5968 ResolveHostResponseHelper response_insecure_cached(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555969 HostPortPair("insecure_automatic_cached", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:525970 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:505971 resolve_context_->host_cache()));
dalykc27699a2019-07-29 20:53:295972 EXPECT_THAT(response_insecure_cached.result_error(), IsOk());
5973 EXPECT_THAT(response_insecure_cached.request()
5974 ->GetAddressResults()
5975 .value()
5976 .endpoints(),
5977 testing::ElementsAre(kExpectedInsecureIP));
5978}
5979
dalyk6d7d8ead2019-08-15 03:30:085980TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Automatic_DotActive) {
5981 proc_->AddRuleForAllFamilies("insecure_automatic", "192.168.1.100");
5982 DnsConfig config = CreateValidDnsConfig();
5983 config.dns_over_tls_active = true;
5984 ChangeDnsConfig(config);
5985 DnsConfigOverrides overrides;
Eric Ortha093b092020-09-24 23:13:025986 overrides.secure_dns_mode = SecureDnsMode::kAutomatic;
dalyk6d7d8ead2019-08-15 03:30:085987 resolver_->SetDnsConfigOverrides(overrides);
5988
5989 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result;
5990
5991 // The secure part of the dns client should be enabled.
5992 ResolveHostResponseHelper response_secure(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555993 HostPortPair("automatic", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:525994 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
dalyk6d7d8ead2019-08-15 03:30:085995 ASSERT_THAT(response_secure.result_error(), IsOk());
5996 EXPECT_THAT(
5997 response_secure.request()->GetAddressResults().value().endpoints(),
5998 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
5999 CreateExpected("::1", 80)));
Matt Menke7b4a32f2019-10-25 22:13:466000 HostCache::Key secure_key = HostCache::Key(
6001 "automatic", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
6002 HostResolverSource::ANY, NetworkIsolationKey());
dalyk6d7d8ead2019-08-15 03:30:086003 secure_key.secure = true;
6004 cache_result = GetCacheHit(secure_key);
6005 EXPECT_TRUE(!!cache_result);
6006
6007 // Insecure async requests should be skipped since the system resolver
6008 // requests will be secure.
6009 ResolveHostResponseHelper response_insecure(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556010 HostPortPair("insecure_automatic", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:526011 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:506012 resolve_context_->host_cache()));
dalyk6d7d8ead2019-08-15 03:30:086013 proc_->SignalMultiple(1u);
6014 ASSERT_THAT(response_insecure.result_error(), IsOk());
dalyk59cba642020-01-02 21:39:266015 EXPECT_FALSE(response_insecure.request()
6016 ->GetResolveErrorInfo()
6017 .is_secure_network_error);
dalyk6d7d8ead2019-08-15 03:30:086018 EXPECT_THAT(
6019 response_insecure.request()->GetAddressResults().value().endpoints(),
6020 testing::ElementsAre(CreateExpected("192.168.1.100", 80)));
6021 HostCache::Key insecure_key =
6022 HostCache::Key("insecure_automatic", DnsQueryType::UNSPECIFIED,
Matt Menke7b4a32f2019-10-25 22:13:466023 0 /* host_resolver_flags */, HostResolverSource::ANY,
6024 NetworkIsolationKey());
dalyk6d7d8ead2019-08-15 03:30:086025 cache_result = GetCacheHit(insecure_key);
6026 EXPECT_TRUE(!!cache_result);
6027
6028 HostCache::Key cached_insecure_key =
6029 HostCache::Key("insecure_automatic_cached", DnsQueryType::UNSPECIFIED,
Matt Menke7b4a32f2019-10-25 22:13:466030 0 /* host_resolver_flags */, HostResolverSource::ANY,
6031 NetworkIsolationKey());
dalyk6d7d8ead2019-08-15 03:30:086032 IPEndPoint kExpectedInsecureIP = CreateExpected("192.168.1.101", 80);
6033 PopulateCache(cached_insecure_key, kExpectedInsecureIP);
6034
6035 // The insecure cache should still be checked.
6036 ResolveHostResponseHelper response_insecure_cached(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556037 HostPortPair("insecure_automatic_cached", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:526038 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:506039 resolve_context_->host_cache()));
dalyk6d7d8ead2019-08-15 03:30:086040 EXPECT_THAT(response_insecure_cached.result_error(), IsOk());
dalyk59cba642020-01-02 21:39:266041 EXPECT_FALSE(response_insecure_cached.request()
6042 ->GetResolveErrorInfo()
6043 .is_secure_network_error);
dalyk6d7d8ead2019-08-15 03:30:086044 EXPECT_THAT(response_insecure_cached.request()
6045 ->GetAddressResults()
6046 .value()
6047 .endpoints(),
6048 testing::ElementsAre(kExpectedInsecureIP));
6049}
6050
dalyk4f4ac712019-05-31 16:33:136051TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Secure) {
6052 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.100");
6053 set_allow_fallback_to_proctask(true);
6054
dalykc27699a2019-07-29 20:53:296055 ChangeDnsConfig(CreateValidDnsConfig());
dalyk4f4ac712019-05-31 16:33:136056 DnsConfigOverrides overrides;
Eric Ortha093b092020-09-24 23:13:026057 overrides.secure_dns_mode = SecureDnsMode::kSecure;
dalyk4f4ac712019-05-31 16:33:136058 resolver_->SetDnsConfigOverrides(overrides);
6059 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result;
6060
6061 ResolveHostResponseHelper response_secure(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556062 HostPortPair("secure", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:526063 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
dalyk4f4ac712019-05-31 16:33:136064 ASSERT_THAT(response_secure.result_error(), IsOk());
dalyk59cba642020-01-02 21:39:266065 EXPECT_FALSE(
6066 response_secure.request()->GetResolveErrorInfo().is_secure_network_error);
Matt Menke7b4a32f2019-10-25 22:13:466067 HostCache::Key secure_key = HostCache::Key(
6068 "secure", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
6069 HostResolverSource::ANY, NetworkIsolationKey());
dalyk4f4ac712019-05-31 16:33:136070 secure_key.secure = true;
6071 cache_result = GetCacheHit(secure_key);
dalyk48b20a992019-02-25 16:10:266072 EXPECT_TRUE(!!cache_result);
6073
dalyk4f4ac712019-05-31 16:33:136074 ResolveHostResponseHelper response_insecure(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556075 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:526076 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
dalyk4f4ac712019-05-31 16:33:136077 ASSERT_THAT(response_insecure.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
dalyk59cba642020-01-02 21:39:266078 EXPECT_TRUE(response_insecure.request()
6079 ->GetResolveErrorInfo()
6080 .is_secure_network_error);
Matt Menke7b4a32f2019-10-25 22:13:466081 HostCache::Key insecure_key = HostCache::Key(
6082 "ok", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
6083 HostResolverSource::ANY, NetworkIsolationKey());
dalyk4f4ac712019-05-31 16:33:136084 cache_result = GetCacheHit(insecure_key);
6085 EXPECT_FALSE(!!cache_result);
dalyk48b20a992019-02-25 16:10:266086
dalyk4f4ac712019-05-31 16:33:136087 // Fallback to ProcTask not allowed in SECURE mode.
6088 ResolveHostResponseHelper response_proc(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556089 HostPortPair("nx_succeed", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:526090 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
dalyk4f4ac712019-05-31 16:33:136091 proc_->SignalMultiple(1u);
6092 EXPECT_THAT(response_proc.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
dalyk59cba642020-01-02 21:39:266093 EXPECT_TRUE(
6094 response_proc.request()->GetResolveErrorInfo().is_secure_network_error);
dalyk48b20a992019-02-25 16:10:266095}
6096
dalykc27699a2019-07-29 20:53:296097TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Secure_InsecureAsyncDisabled) {
6098 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.100");
6099 set_allow_fallback_to_proctask(true);
Eric Orth09746312021-05-05 15:44:586100 resolver_->SetInsecureDnsClientEnabled(
6101 /*enabled=*/false,
6102 /*additional_dns_types_enabled=*/false);
dalykc27699a2019-07-29 20:53:296103
6104 ChangeDnsConfig(CreateValidDnsConfig());
6105 DnsConfigOverrides overrides;
Eric Ortha093b092020-09-24 23:13:026106 overrides.secure_dns_mode = SecureDnsMode::kSecure;
dalykc27699a2019-07-29 20:53:296107 resolver_->SetDnsConfigOverrides(overrides);
6108 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result;
6109
6110 // The secure part of the dns client should be enabled.
6111 ResolveHostResponseHelper response_secure(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556112 HostPortPair("secure", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:526113 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
dalykc27699a2019-07-29 20:53:296114 ASSERT_THAT(response_secure.result_error(), IsOk());
Matt Menke7b4a32f2019-10-25 22:13:466115 HostCache::Key secure_key = HostCache::Key(
6116 "secure", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
6117 HostResolverSource::ANY, NetworkIsolationKey());
dalykc27699a2019-07-29 20:53:296118 secure_key.secure = true;
6119 cache_result = GetCacheHit(secure_key);
6120 EXPECT_TRUE(!!cache_result);
6121}
6122
dalyk6f7f7ce62019-08-15 23:18:236123TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Secure_Local_CacheMiss) {
6124 ChangeDnsConfig(CreateValidDnsConfig());
6125 DnsConfigOverrides overrides;
Eric Ortha093b092020-09-24 23:13:026126 overrides.secure_dns_mode = SecureDnsMode::kSecure;
dalyk6f7f7ce62019-08-15 23:18:236127 resolver_->SetDnsConfigOverrides(overrides);
6128
6129 HostResolver::ResolveHostParameters source_none_parameters;
6130 source_none_parameters.source = HostResolverSource::LOCAL_ONLY;
6131
6132 // Populate cache with an insecure entry.
Matt Menke7b4a32f2019-10-25 22:13:466133 HostCache::Key cached_insecure_key = HostCache::Key(
6134 "automatic", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
6135 HostResolverSource::ANY, NetworkIsolationKey());
dalyk6f7f7ce62019-08-15 23:18:236136 IPEndPoint kExpectedInsecureIP = CreateExpected("192.168.1.102", 80);
6137 PopulateCache(cached_insecure_key, kExpectedInsecureIP);
6138
6139 // NONE query expected to complete synchronously with a cache miss since
6140 // the insecure cache should not be checked.
6141 ResolveHostResponseHelper cache_miss_request(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556142 HostPortPair("automatic", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:506143 source_none_parameters, resolve_context_.get(),
6144 resolve_context_->host_cache()));
dalyk6f7f7ce62019-08-15 23:18:236145 EXPECT_TRUE(cache_miss_request.complete());
6146 EXPECT_THAT(cache_miss_request.result_error(), IsError(ERR_DNS_CACHE_MISS));
dalyk59cba642020-01-02 21:39:266147 EXPECT_FALSE(cache_miss_request.request()
6148 ->GetResolveErrorInfo()
6149 .is_secure_network_error);
dalyk6f7f7ce62019-08-15 23:18:236150 EXPECT_FALSE(cache_miss_request.request()->GetAddressResults());
6151 EXPECT_FALSE(cache_miss_request.request()->GetStaleInfo());
6152}
6153
6154TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Secure_Local_CacheHit) {
6155 ChangeDnsConfig(CreateValidDnsConfig());
6156 DnsConfigOverrides overrides;
Eric Ortha093b092020-09-24 23:13:026157 overrides.secure_dns_mode = SecureDnsMode::kSecure;
dalyk6f7f7ce62019-08-15 23:18:236158 resolver_->SetDnsConfigOverrides(overrides);
6159
6160 HostResolver::ResolveHostParameters source_none_parameters;
6161 source_none_parameters.source = HostResolverSource::LOCAL_ONLY;
6162
6163 // Populate cache with a secure entry.
Matt Menke7b4a32f2019-10-25 22:13:466164 HostCache::Key cached_secure_key = HostCache::Key(
6165 "secure", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
6166 HostResolverSource::ANY, NetworkIsolationKey());
dalyk6f7f7ce62019-08-15 23:18:236167 cached_secure_key.secure = true;
6168 IPEndPoint kExpectedSecureIP = CreateExpected("192.168.1.103", 80);
6169 PopulateCache(cached_secure_key, kExpectedSecureIP);
6170
6171 // NONE query expected to complete synchronously with a cache hit from the
6172 // secure cache.
6173 ResolveHostResponseHelper response_cached(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556174 HostPortPair("secure", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:526175 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
dalyk6f7f7ce62019-08-15 23:18:236176 EXPECT_TRUE(response_cached.complete());
6177 EXPECT_THAT(response_cached.result_error(), IsOk());
dalyk59cba642020-01-02 21:39:266178 EXPECT_FALSE(
6179 response_cached.request()->GetResolveErrorInfo().is_secure_network_error);
dalyk6f7f7ce62019-08-15 23:18:236180 EXPECT_THAT(
6181 response_cached.request()->GetAddressResults().value().endpoints(),
6182 testing::ElementsAre(kExpectedSecureIP));
6183}
6184
Eric Orth89726dd2020-10-13 20:19:536185// Test for a resolve with a transaction that takes longer than usual to
6186// complete. With the typical behavior of using fast timeouts, this is expected
6187// to timeout and fallback to the system resolver.
6188TEST_F(HostResolverManagerDnsTest, SlowResolve) {
6189 // Add a successful fallback result.
6190 proc_->AddRuleForAllFamilies("slow_succeed", "192.168.1.211");
6191
6192 MockDnsClientRuleList rules = CreateDefaultDnsRules();
Peter Kastingd039b772021-08-18 00:06:206193 AddDnsRule(&rules, "slow_fail", dns_protocol::kTypeA,
6194 MockDnsClientRule::ResultType::kSlow, false /* delay */);
Eric Orth89726dd2020-10-13 20:19:536195 AddDnsRule(&rules, "slow_fail", dns_protocol::kTypeAAAA,
Peter Kastingd039b772021-08-18 00:06:206196 MockDnsClientRule::ResultType::kSlow, false /* delay */);
Eric Orth89726dd2020-10-13 20:19:536197 AddDnsRule(&rules, "slow_succeed", dns_protocol::kTypeA,
Peter Kastingd039b772021-08-18 00:06:206198 MockDnsClientRule::ResultType::kSlow, false /* delay */);
Eric Orth89726dd2020-10-13 20:19:536199 AddDnsRule(&rules, "slow_succeed", dns_protocol::kTypeAAAA,
Peter Kastingd039b772021-08-18 00:06:206200 MockDnsClientRule::ResultType::kSlow, false /* delay */);
Eric Orth89726dd2020-10-13 20:19:536201 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6202
6203 ResolveHostResponseHelper response0(resolver_->CreateRequest(
6204 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:526205 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth89726dd2020-10-13 20:19:536206 ResolveHostResponseHelper response1(resolver_->CreateRequest(
6207 HostPortPair("slow_fail", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:526208 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth89726dd2020-10-13 20:19:536209 ResolveHostResponseHelper response2(resolver_->CreateRequest(
6210 HostPortPair("slow_succeed", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:526211 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orth89726dd2020-10-13 20:19:536212 resolve_context_->host_cache()));
6213 proc_->SignalMultiple(3u);
6214
6215 EXPECT_THAT(response0.result_error(), IsOk());
6216 EXPECT_THAT(response0.request()->GetAddressResults().value().endpoints(),
6217 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
6218 CreateExpected("::1", 80)));
6219 EXPECT_THAT(response1.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
6220 EXPECT_THAT(response2.result_error(), IsOk());
6221 EXPECT_THAT(response2.request()->GetAddressResults().value().endpoints(),
6222 testing::ElementsAre(CreateExpected("192.168.1.211", 80)));
6223}
6224
6225// Test for a resolve with a secure transaction that takes longer than usual to
6226// complete. In automatic mode, because fallback to insecure is available, the
6227// secure transaction is expected to quickly timeout and fallback to insecure.
6228TEST_F(HostResolverManagerDnsTest, SlowSecureResolve_AutomaticMode) {
6229 set_allow_fallback_to_proctask(false);
6230
6231 MockDnsClientRuleList rules = CreateDefaultDnsRules();
6232 AddSecureDnsRule(&rules, "slow_fail", dns_protocol::kTypeA,
Peter Kastingd039b772021-08-18 00:06:206233 MockDnsClientRule::ResultType::kSlow, false /* delay */);
Eric Orth89726dd2020-10-13 20:19:536234 AddSecureDnsRule(&rules, "slow_fail", dns_protocol::kTypeAAAA,
Peter Kastingd039b772021-08-18 00:06:206235 MockDnsClientRule::ResultType::kSlow, false /* delay */);
Eric Orth89726dd2020-10-13 20:19:536236 AddSecureDnsRule(&rules, "slow_succeed", dns_protocol::kTypeA,
Peter Kastingd039b772021-08-18 00:06:206237 MockDnsClientRule::ResultType::kSlow, false /* delay */);
Eric Orth89726dd2020-10-13 20:19:536238 AddSecureDnsRule(&rules, "slow_succeed", dns_protocol::kTypeAAAA,
Peter Kastingd039b772021-08-18 00:06:206239 MockDnsClientRule::ResultType::kSlow, false /* delay */);
Eric Orth89726dd2020-10-13 20:19:536240 AddDnsRule(&rules, "slow_succeed", dns_protocol::kTypeA,
6241 IPAddress(111, 222, 112, 223), false /* delay */);
6242 AddDnsRule(&rules, "slow_succeed", dns_protocol::kTypeAAAA,
Peter Kastingd039b772021-08-18 00:06:206243 MockDnsClientRule::ResultType::kEmpty, false /* delay */);
Eric Orth89726dd2020-10-13 20:19:536244 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6245
6246 DnsConfigOverrides overrides;
6247 overrides.secure_dns_mode = SecureDnsMode::kAutomatic;
6248 resolver_->SetDnsConfigOverrides(overrides);
6249
6250 ResolveHostResponseHelper response0(resolver_->CreateRequest(
6251 HostPortPair("secure", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:526252 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth89726dd2020-10-13 20:19:536253 ResolveHostResponseHelper response1(resolver_->CreateRequest(
6254 HostPortPair("slow_fail", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:526255 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth89726dd2020-10-13 20:19:536256 ResolveHostResponseHelper response2(resolver_->CreateRequest(
6257 HostPortPair("slow_succeed", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:526258 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orth89726dd2020-10-13 20:19:536259 resolve_context_->host_cache()));
6260
6261 EXPECT_THAT(response0.result_error(), IsOk());
6262 EXPECT_THAT(response0.request()->GetAddressResults().value().endpoints(),
6263 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
6264 CreateExpected("::1", 80)));
6265 EXPECT_THAT(response1.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
6266 EXPECT_THAT(response2.result_error(), IsOk());
6267 EXPECT_THAT(response2.request()->GetAddressResults().value().endpoints(),
6268 testing::ElementsAre(CreateExpected("111.222.112.223", 80)));
6269}
6270
6271// Test for a resolve with a secure transaction that takes longer than usual to
6272// complete. In secure mode, because no fallback is available, this is expected
6273// to wait longer before timeout and complete successfully.
6274TEST_F(HostResolverManagerDnsTest, SlowSecureResolve_SecureMode) {
6275 MockDnsClientRuleList rules = CreateDefaultDnsRules();
6276 AddSecureDnsRule(&rules, "slow", dns_protocol::kTypeA,
Peter Kastingd039b772021-08-18 00:06:206277 MockDnsClientRule::ResultType::kSlow, false /* delay */);
Eric Orth89726dd2020-10-13 20:19:536278 AddSecureDnsRule(&rules, "slow", dns_protocol::kTypeAAAA,
Peter Kastingd039b772021-08-18 00:06:206279 MockDnsClientRule::ResultType::kSlow, false /* delay */);
Eric Orth89726dd2020-10-13 20:19:536280 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6281
6282 DnsConfigOverrides overrides;
6283 overrides.secure_dns_mode = SecureDnsMode::kSecure;
6284 resolver_->SetDnsConfigOverrides(overrides);
6285
6286 ResolveHostResponseHelper response0(resolver_->CreateRequest(
6287 HostPortPair("secure", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:526288 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth89726dd2020-10-13 20:19:536289 ResolveHostResponseHelper response1(resolver_->CreateRequest(
6290 HostPortPair("slow", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:526291 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth89726dd2020-10-13 20:19:536292
6293 EXPECT_THAT(response0.result_error(), IsOk());
6294 EXPECT_THAT(response1.result_error(), IsOk());
6295}
6296
[email protected]daae1322013-09-05 18:26:506297// Test the case where only a single transaction slot is available.
Eric Orth960e7062019-03-08 18:43:546298TEST_F(HostResolverManagerDnsTest, SerialResolver) {
[email protected]daae1322013-09-05 18:26:506299 CreateSerialResolver();
Eric Orth60931742018-11-05 23:40:576300 set_allow_fallback_to_proctask(false);
[email protected]daae1322013-09-05 18:26:506301 ChangeDnsConfig(CreateValidDnsConfig());
6302
Eric Orth117e1992019-04-17 00:24:156303 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556304 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:526305 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:006306 EXPECT_FALSE(response.complete());
6307 EXPECT_EQ(1u, num_running_dispatcher_jobs());
6308
6309 base::RunLoop().RunUntilIdle();
6310 EXPECT_TRUE(response.complete());
6311 EXPECT_THAT(response.result_error(), IsOk());
6312 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
6313 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
6314 CreateExpected("::1", 80)));
6315}
6316
Eric Orth70992982018-07-24 00:25:006317// Test the case where subsequent transactions are handled on transaction
6318// completion when only part of a multi-transaction request could be initially
6319// started.
Eric Orth960e7062019-03-08 18:43:546320TEST_F(HostResolverManagerDnsTest, AAAAStartsAfterOtherJobFinishes) {
Eric Orth70992982018-07-24 00:25:006321 CreateResolverWithLimitsAndParams(3u, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:326322 true /* ipv6_reachable */,
6323 true /* check_ipv6_on_wifi */);
Eric Orth60931742018-11-05 23:40:576324 set_allow_fallback_to_proctask(false);
Eric Orth70992982018-07-24 00:25:006325 ChangeDnsConfig(CreateValidDnsConfig());
6326
Eric Orth117e1992019-04-17 00:24:156327 ResolveHostResponseHelper response0(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556328 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:526329 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:006330 EXPECT_EQ(2u, num_running_dispatcher_jobs());
Eric Orth117e1992019-04-17 00:24:156331 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556332 HostPortPair("4slow_ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:526333 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:006334 EXPECT_EQ(3u, num_running_dispatcher_jobs());
6335
6336 // Request 0's transactions should complete, starting Request 1's second
6337 // transaction, which should also complete.
6338 base::RunLoop().RunUntilIdle();
6339 EXPECT_EQ(1u, num_running_dispatcher_jobs());
6340 EXPECT_TRUE(response0.complete());
6341 EXPECT_FALSE(response1.complete());
6342
6343 dns_client_->CompleteDelayedTransactions();
6344 EXPECT_THAT(response1.result_error(), IsOk());
6345 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
6346 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
6347 CreateExpected("::1", 80)));
6348}
6349
[email protected]daae1322013-09-05 18:26:506350// Tests the case that a Job with a single transaction receives an empty address
6351// list, triggering fallback to ProcTask.
Eric Orth960e7062019-03-08 18:43:546352TEST_F(HostResolverManagerDnsTest, IPv4EmptyFallback) {
Eric Orth70992982018-07-24 00:25:006353 // Disable ipv6 to ensure we'll only try a single transaction for the host.
6354 CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:326355 false /* ipv6_reachable */,
6356 true /* check_ipv6_on_wifi */);
Eric Orth70992982018-07-24 00:25:006357 DnsConfig config = CreateValidDnsConfig();
6358 config.use_local_ipv6 = false;
6359 ChangeDnsConfig(config);
6360
Eric Orth322af3e42018-08-20 18:12:596361 proc_->AddRuleForAllFamilies("empty_fallback", "192.168.0.1",
6362 HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6);
Eric Orth70992982018-07-24 00:25:006363 proc_->SignalMultiple(1u);
6364
6365 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556366 HostPortPair("empty_fallback", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:526367 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:506368 resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:006369 EXPECT_THAT(response.result_error(), IsOk());
6370 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
6371 testing::ElementsAre(CreateExpected("192.168.0.1", 80)));
6372}
6373
[email protected]daae1322013-09-05 18:26:506374// Tests the case that a Job with two transactions receives two empty address
6375// lists, triggering fallback to ProcTask.
Eric Orth960e7062019-03-08 18:43:546376TEST_F(HostResolverManagerDnsTest, UnspecEmptyFallback) {
[email protected]daae1322013-09-05 18:26:506377 ChangeDnsConfig(CreateValidDnsConfig());
6378 proc_->AddRuleForAllFamilies("empty_fallback", "192.168.0.1");
6379 proc_->SignalMultiple(1u);
Eric Orth70992982018-07-24 00:25:006380
6381 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556382 HostPortPair("empty_fallback", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:526383 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:506384 resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:006385
6386 EXPECT_THAT(response.result_error(), IsOk());
6387 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
6388 testing::ElementsAre(CreateExpected("192.168.0.1", 80)));
6389}
6390
[email protected]daae1322013-09-05 18:26:506391// Tests getting a new invalid DnsConfig while there are active DnsTasks.
Eric Orth960e7062019-03-08 18:43:546392TEST_F(HostResolverManagerDnsTest, InvalidDnsConfigWithPendingRequests) {
Eric Orth70992982018-07-24 00:25:006393 // At most 3 jobs active at once. This number is important, since we want
Eric Orth960e7062019-03-08 18:43:546394 // to make sure that aborting the first HostResolverManager::Job does not
Eric Orth70992982018-07-24 00:25:006395 // trigger another DnsTransaction on the second Job when it releases its
6396 // second prioritized dispatcher slot.
6397 CreateResolverWithLimitsAndParams(3u, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:326398 true /* ipv6_reachable */,
6399 true /* check_ipv6_on_wifi */);
Eric Orth70992982018-07-24 00:25:006400
6401 ChangeDnsConfig(CreateValidDnsConfig());
6402
6403 proc_->AddRuleForAllFamilies("slow_nx1", "192.168.0.1");
6404 proc_->AddRuleForAllFamilies("slow_nx2", "192.168.0.2");
6405 proc_->AddRuleForAllFamilies("ok", "192.168.0.3");
6406
6407 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
6408 // First active job gets two slots.
Eric Orth117e1992019-04-17 00:24:156409 responses.emplace_back(
6410 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556411 HostPortPair("slow_nx1", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:526412 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:506413 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:006414 // Next job gets one slot, and waits on another.
Eric Orth117e1992019-04-17 00:24:156415 responses.emplace_back(
6416 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556417 HostPortPair("slow_nx2", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:526418 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:506419 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:156420 responses.emplace_back(
6421 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556422 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:526423 absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:506424 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:006425
6426 EXPECT_EQ(3u, num_running_dispatcher_jobs());
6427 for (auto& response : responses) {
6428 EXPECT_FALSE(response->complete());
6429 }
6430
dalyk4f4ac712019-05-31 16:33:136431 // Clear DNS config. Fully in-progress, partially in-progress, and queued
6432 // requests should all be aborted.
Eric Orthfe6d5482019-09-03 18:27:576433 InvalidateDnsConfig();
dalyk4f4ac712019-05-31 16:33:136434 for (auto& response : responses) {
6435 EXPECT_THAT(response->result_error(), IsError(ERR_NETWORK_CHANGED));
6436 }
Eric Orth70992982018-07-24 00:25:006437}
6438
Eric Orth70992982018-07-24 00:25:006439// Test that initial DNS config read signals do not abort pending requests
6440// when using DnsClient.
Eric Orth960e7062019-03-08 18:43:546441TEST_F(HostResolverManagerDnsTest, DontAbortOnInitialDNSConfigRead) {
Eric Orth70992982018-07-24 00:25:006442 // DnsClient is enabled, but there's no DnsConfig, so the request should start
6443 // using ProcTask.
Eric Orth117e1992019-04-17 00:24:156444 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556445 HostPortPair("host1", 70), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:526446 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:006447 EXPECT_FALSE(response.complete());
6448
6449 EXPECT_TRUE(proc_->WaitFor(1u));
6450 // Send the initial config read signal, with a valid config.
6451 SetInitialDnsConfig(CreateValidDnsConfig());
6452 proc_->SignalAll();
6453
6454 EXPECT_THAT(response.result_error(), IsOk());
6455}
6456
dalykc27699a2019-07-29 20:53:296457// Tests the case that the insecure part of the DnsClient is automatically
6458// disabled due to failures while there are active DnsTasks.
Eric Orth960e7062019-03-08 18:43:546459TEST_F(HostResolverManagerDnsTest,
dalykc27699a2019-07-29 20:53:296460 AutomaticallyDisableInsecureDnsClientWithPendingRequests) {
[email protected]daae1322013-09-05 18:26:506461 // Trying different limits is important for this test: Different limits
6462 // result in different behavior when aborting in-progress DnsTasks. Having
6463 // a DnsTask that has one job active and one in the queue when another job
6464 // occupying two slots has its DnsTask aborted is the case most likely to run
Eric Orth60931742018-11-05 23:40:576465 // into problems. Try limits between [1, 2 * # of non failure requests].
6466 for (size_t limit = 1u; limit < 10u; ++limit) {
Eric Orth70992982018-07-24 00:25:006467 CreateResolverWithLimitsAndParams(limit, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:326468 true /* ipv6_reachable */,
6469 true /* check_ipv6_on_wifi */);
Eric Orth70992982018-07-24 00:25:006470
Ben Schwartz432ce032021-05-05 21:49:246471 // Set the resolver in automatic-secure mode.
6472 net::DnsConfig config = CreateValidDnsConfig();
6473 config.secure_dns_mode = SecureDnsMode::kAutomatic;
6474 ChangeDnsConfig(config);
6475
6476 // Start with request parameters that disable Secure DNS.
6477 HostResolver::ResolveHostParameters parameters;
6478 parameters.secure_dns_policy = SecureDnsPolicy::kDisable;
Eric Orth70992982018-07-24 00:25:006479
dalykc27699a2019-07-29 20:53:296480 // Queue up enough failures to disable insecure DnsTasks. These will all
6481 // fall back to ProcTasks, and succeed there.
Eric Orth70992982018-07-24 00:25:006482 std::vector<std::unique_ptr<ResolveHostResponseHelper>> failure_responses;
dalykc27699a2019-07-29 20:53:296483 for (unsigned i = 0u; i < maximum_insecure_dns_task_failures(); ++i) {
Eric Orth70992982018-07-24 00:25:006484 std::string host = base::StringPrintf("nx%u", i);
6485 proc_->AddRuleForAllFamilies(host, "192.168.0.1");
6486 failure_responses.emplace_back(
6487 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556488 HostPortPair(host, 80), NetworkIsolationKey(), NetLogWithSource(),
Ben Schwartz432ce032021-05-05 21:49:246489 parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:506490 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:006491 EXPECT_FALSE(failure_responses[i]->complete());
6492 }
6493
dalykc27699a2019-07-29 20:53:296494 // These requests should all bypass insecure DnsTasks, due to the above
6495 // failures, so should end up using ProcTasks.
Eric Orth70992982018-07-24 00:25:006496 proc_->AddRuleForAllFamilies("slow_ok1", "192.168.0.2");
6497 ResolveHostResponseHelper response0(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556498 HostPortPair("slow_ok1", 80), NetworkIsolationKey(), NetLogWithSource(),
Ben Schwartz432ce032021-05-05 21:49:246499 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:006500 EXPECT_FALSE(response0.complete());
6501 proc_->AddRuleForAllFamilies("slow_ok2", "192.168.0.3");
6502 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556503 HostPortPair("slow_ok2", 80), NetworkIsolationKey(), NetLogWithSource(),
Ben Schwartz432ce032021-05-05 21:49:246504 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:006505 EXPECT_FALSE(response1.complete());
6506 proc_->AddRuleForAllFamilies("slow_ok3", "192.168.0.4");
6507 ResolveHostResponseHelper response2(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556508 HostPortPair("slow_ok3", 80), NetworkIsolationKey(), NetLogWithSource(),
Ben Schwartz432ce032021-05-05 21:49:246509 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:006510 EXPECT_FALSE(response2.complete());
6511
Eric Orth60931742018-11-05 23:40:576512 // Requests specifying DNS source cannot fallback to ProcTask, so they
6513 // should be unaffected.
Eric Orth60931742018-11-05 23:40:576514 parameters.source = HostResolverSource::DNS;
6515 ResolveHostResponseHelper response_dns(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556516 HostPortPair("4slow_ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:506517 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth60931742018-11-05 23:40:576518 EXPECT_FALSE(response_dns.complete());
6519
6520 // Requests specifying SYSTEM source should be unaffected by disabling
6521 // DnsClient.
6522 proc_->AddRuleForAllFamilies("nx_ok", "192.168.0.5");
6523 parameters.source = HostResolverSource::SYSTEM;
Eric Orth117e1992019-04-17 00:24:156524 ResolveHostResponseHelper response_system(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556525 HostPortPair("nx_ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:506526 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth60931742018-11-05 23:40:576527 EXPECT_FALSE(response_system.complete());
6528
dalykc27699a2019-07-29 20:53:296529 // Secure DnsTasks should not be affected.
dalykc27699a2019-07-29 20:53:296530 ResolveHostResponseHelper response_secure(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556531 HostPortPair("automatic", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:526532 NetLogWithSource(), /* optional_parameters=*/absl::nullopt,
Ben Schwartz432ce032021-05-05 21:49:246533 resolve_context_.get(), resolve_context_->host_cache()));
dalykc27699a2019-07-29 20:53:296534 EXPECT_FALSE(response_secure.complete());
Eric Orth70992982018-07-24 00:25:006535
Eric Orth394db1732019-08-27 20:09:396536 proc_->SignalMultiple(maximum_insecure_dns_task_failures() + 4);
dalykc27699a2019-07-29 20:53:296537
6538 for (size_t i = 0u; i < maximum_insecure_dns_task_failures(); ++i) {
Eric Orth70992982018-07-24 00:25:006539 EXPECT_THAT(failure_responses[i]->result_error(), IsOk());
6540 EXPECT_THAT(failure_responses[i]
6541 ->request()
6542 ->GetAddressResults()
6543 .value()
6544 .endpoints(),
6545 testing::ElementsAre(CreateExpected("192.168.0.1", 80)));
6546 }
6547
6548 EXPECT_THAT(response0.result_error(), IsOk());
6549 EXPECT_THAT(response0.request()->GetAddressResults().value().endpoints(),
6550 testing::ElementsAre(CreateExpected("192.168.0.2", 80)));
6551 EXPECT_THAT(response1.result_error(), IsOk());
6552 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
6553 testing::ElementsAre(CreateExpected("192.168.0.3", 80)));
6554 EXPECT_THAT(response2.result_error(), IsOk());
6555 EXPECT_THAT(response2.request()->GetAddressResults().value().endpoints(),
6556 testing::ElementsAre(CreateExpected("192.168.0.4", 80)));
Eric Orth60931742018-11-05 23:40:576557
6558 dns_client_->CompleteDelayedTransactions();
6559 EXPECT_THAT(response_dns.result_error(), IsOk());
6560
6561 EXPECT_THAT(response_system.result_error(), IsOk());
6562 EXPECT_THAT(
6563 response_system.request()->GetAddressResults().value().endpoints(),
6564 testing::ElementsAre(CreateExpected("192.168.0.5", 80)));
dalykc27699a2019-07-29 20:53:296565
6566 EXPECT_THAT(response_secure.result_error(), IsOk());
Eric Orth70992982018-07-24 00:25:006567 }
6568}
6569
[email protected]daae1322013-09-05 18:26:506570// Tests a call to SetDnsClient while there are active DnsTasks.
Eric Orth960e7062019-03-08 18:43:546571TEST_F(HostResolverManagerDnsTest,
6572 ManuallyDisableDnsClientWithPendingRequests) {
[email protected]daae1322013-09-05 18:26:506573 // At most 3 jobs active at once. This number is important, since we want to
Eric Orth960e7062019-03-08 18:43:546574 // make sure that aborting the first HostResolverManager::Job does not trigger
[email protected]daae1322013-09-05 18:26:506575 // another DnsTransaction on the second Job when it releases its second
6576 // prioritized dispatcher slot.
Eric Orth70992982018-07-24 00:25:006577 CreateResolverWithLimitsAndParams(3u, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:326578 true /* ipv6_reachable */,
6579 true /* check_ipv6_on_wifi */);
[email protected]daae1322013-09-05 18:26:506580
[email protected]daae1322013-09-05 18:26:506581 ChangeDnsConfig(CreateValidDnsConfig());
6582
6583 proc_->AddRuleForAllFamilies("slow_ok1", "192.168.0.1");
6584 proc_->AddRuleForAllFamilies("slow_ok2", "192.168.0.2");
6585 proc_->AddRuleForAllFamilies("ok", "192.168.0.3");
6586
Eric Orth70992982018-07-24 00:25:006587 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
6588 // First active job gets two slots.
Eric Orth117e1992019-04-17 00:24:156589 responses.emplace_back(
6590 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556591 HostPortPair("slow_ok1", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:526592 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:506593 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:006594 EXPECT_FALSE(responses[0]->complete());
6595 // Next job gets one slot, and waits on another.
Eric Orth117e1992019-04-17 00:24:156596 responses.emplace_back(
6597 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556598 HostPortPair("slow_ok2", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:526599 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:506600 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:006601 EXPECT_FALSE(responses[1]->complete());
6602 // Next one is queued.
Eric Orth117e1992019-04-17 00:24:156603 responses.emplace_back(
6604 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556605 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:526606 absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:506607 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:006608 EXPECT_FALSE(responses[2]->complete());
6609
6610 EXPECT_EQ(3u, num_running_dispatcher_jobs());
6611
6612 // Clear DnsClient. The two in-progress jobs should fall back to a ProcTask,
6613 // and the next one should be started with a ProcTask.
Eric Orth09746312021-05-05 15:44:586614 resolver_->SetInsecureDnsClientEnabled(
6615 /*enabled=*/false,
6616 /*additional_dns_types_enabled=*/false);
Eric Orth70992982018-07-24 00:25:006617
6618 // All three in-progress requests should now be running a ProcTask.
6619 EXPECT_EQ(3u, num_running_dispatcher_jobs());
6620 proc_->SignalMultiple(3u);
6621
6622 for (auto& response : responses) {
6623 EXPECT_THAT(response->result_error(), IsOk());
6624 }
6625 EXPECT_THAT(responses[0]->request()->GetAddressResults().value().endpoints(),
6626 testing::ElementsAre(CreateExpected("192.168.0.1", 80)));
6627 EXPECT_THAT(responses[1]->request()->GetAddressResults().value().endpoints(),
6628 testing::ElementsAre(CreateExpected("192.168.0.2", 80)));
6629 EXPECT_THAT(responses[2]->request()->GetAddressResults().value().endpoints(),
6630 testing::ElementsAre(CreateExpected("192.168.0.3", 80)));
6631}
6632
Eric Orth04aad982019-05-06 22:41:046633// When explicitly requesting source=DNS, no fallback allowed, so doing so with
6634// DnsClient disabled should result in an error.
6635TEST_F(HostResolverManagerDnsTest, DnsCallsWithDisabledDnsClient) {
Eric Orth4e55b362019-05-07 22:00:036636 ChangeDnsConfig(CreateValidDnsConfig());
Eric Orth09746312021-05-05 15:44:586637 resolver_->SetInsecureDnsClientEnabled(
6638 /*enabled=*/false,
6639 /*additional_dns_types_enabled=*/false);
Eric Orth04aad982019-05-06 22:41:046640
6641 HostResolver::ResolveHostParameters params;
6642 params.source = HostResolverSource::DNS;
6643 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556644 HostPortPair("host", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:506645 params, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth04aad982019-05-06 22:41:046646
dalykc27699a2019-07-29 20:53:296647 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_CACHE_MISS));
Eric Orth04aad982019-05-06 22:41:046648}
6649
Eric Orth4e55b362019-05-07 22:00:036650TEST_F(HostResolverManagerDnsTest,
6651 DnsCallsWithDisabledDnsClient_DisabledAtConstruction) {
6652 HostResolver::ManagerOptions options = DefaultOptions();
dalykc27699a2019-07-29 20:53:296653 options.insecure_dns_client_enabled = false;
Eric Orth4e55b362019-05-07 22:00:036654 CreateResolverWithOptionsAndParams(std::move(options),
6655 DefaultParams(proc_.get()),
6656 true /* ipv6_reachable */);
6657 ChangeDnsConfig(CreateValidDnsConfig());
6658
6659 HostResolver::ResolveHostParameters params;
6660 params.source = HostResolverSource::DNS;
6661 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556662 HostPortPair("host", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:506663 params, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth4e55b362019-05-07 22:00:036664
dalykc27699a2019-07-29 20:53:296665 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_CACHE_MISS));
Eric Orth4e55b362019-05-07 22:00:036666}
6667
6668// Same as DnsClient disabled, requests with source=DNS and no usable DnsConfig
6669// should result in an error.
6670TEST_F(HostResolverManagerDnsTest, DnsCallsWithNoDnsConfig) {
Eric Orthfe6d5482019-09-03 18:27:576671 InvalidateDnsConfig();
Eric Orth4e55b362019-05-07 22:00:036672
6673 HostResolver::ResolveHostParameters params;
6674 params.source = HostResolverSource::DNS;
6675 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556676 HostPortPair("host", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:506677 params, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth4e55b362019-05-07 22:00:036678
dalykc27699a2019-07-29 20:53:296679 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_CACHE_MISS));
Eric Orth4e55b362019-05-07 22:00:036680}
6681
Eric Orth607b6d82019-05-08 16:43:326682TEST_F(HostResolverManagerDnsTest, NoCheckIpv6OnWifi) {
rchce64e6732017-06-05 17:41:576683 // CreateSerialResolver will destroy the current resolver_ which will attempt
6684 // to remove itself from the NetworkChangeNotifier. If this happens after a
6685 // new NetworkChangeNotifier is active, then it will not remove itself from
6686 // the old NetworkChangeNotifier which is a potential use-after-free.
Eric Orth37b18192019-04-22 19:09:286687 DestroyResolver();
mgershaf9a9232017-04-13 20:19:036688 test::ScopedMockNetworkChangeNotifier notifier;
Eric Orth607b6d82019-05-08 16:43:326689 // Serial resolver to guarantee order of resolutions.
6690 CreateSerialResolver(false /* check_ipv6_on_wifi */);
mgershaf9a9232017-04-13 20:19:036691
6692 notifier.mock_network_change_notifier()->SetConnectionType(
6693 NetworkChangeNotifier::CONNECTION_WIFI);
6694 // Needed so IPv6 availability check isn't skipped.
6695 ChangeDnsConfig(CreateValidDnsConfig());
6696
6697 proc_->AddRule("h1", ADDRESS_FAMILY_UNSPECIFIED, "::3");
6698 proc_->AddRule("h1", ADDRESS_FAMILY_IPV4, "1.0.0.1");
Eric Orth322af3e42018-08-20 18:12:596699 proc_->AddRule("h1", ADDRESS_FAMILY_IPV4, "1.0.0.1",
6700 HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6);
mgershaf9a9232017-04-13 20:19:036701 proc_->AddRule("h1", ADDRESS_FAMILY_IPV6, "::2");
6702
Eric Orth117e1992019-04-17 00:24:156703 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556704 HostPortPair("h1", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:526705 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth00fe5a62018-08-15 22:20:006706 HostResolver::ResolveHostParameters parameters;
Eric Orth192e3bb2018-11-14 19:30:326707 parameters.dns_query_type = DnsQueryType::A;
Eric Orth117e1992019-04-17 00:24:156708 ResolveHostResponseHelper v4_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556709 HostPortPair("h1", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:506710 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth192e3bb2018-11-14 19:30:326711 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth117e1992019-04-17 00:24:156712 ResolveHostResponseHelper v6_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556713 HostPortPair("h1", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:506714 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:006715
Eric Orth00fe5a62018-08-15 22:20:006716 proc_->SignalMultiple(3u);
Eric Orth70992982018-07-24 00:25:006717
6718 // Should revert to only IPV4 request.
6719 EXPECT_THAT(response.result_error(), IsOk());
6720 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
6721 testing::ElementsAre(CreateExpected("1.0.0.1", 80)));
6722
Eric Orth00fe5a62018-08-15 22:20:006723 EXPECT_THAT(v4_response.result_error(), IsOk());
6724 EXPECT_THAT(v4_response.request()->GetAddressResults().value().endpoints(),
6725 testing::ElementsAre(CreateExpected("1.0.0.1", 80)));
6726 EXPECT_THAT(v6_response.result_error(), IsOk());
6727 EXPECT_THAT(v6_response.request()->GetAddressResults().value().endpoints(),
6728 testing::ElementsAre(CreateExpected("::2", 80)));
6729
Eric Orth70992982018-07-24 00:25:006730 // Now repeat the test on non-wifi to check that IPv6 is used as normal
6731 // after the network changes.
6732 notifier.mock_network_change_notifier()->SetConnectionType(
6733 NetworkChangeNotifier::CONNECTION_4G);
6734 base::RunLoop().RunUntilIdle(); // Wait for NetworkChangeNotifier.
6735
Eric Orth117e1992019-04-17 00:24:156736 ResolveHostResponseHelper no_wifi_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556737 HostPortPair("h1", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:526738 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth192e3bb2018-11-14 19:30:326739 parameters.dns_query_type = DnsQueryType::A;
Eric Orth117e1992019-04-17 00:24:156740 ResolveHostResponseHelper no_wifi_v4_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556741 HostPortPair("h1", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:506742 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth192e3bb2018-11-14 19:30:326743 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth117e1992019-04-17 00:24:156744 ResolveHostResponseHelper no_wifi_v6_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556745 HostPortPair("h1", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:506746 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:006747
Eric Orth00fe5a62018-08-15 22:20:006748 proc_->SignalMultiple(3u);
Eric Orth70992982018-07-24 00:25:006749
6750 // IPV6 should be available.
6751 EXPECT_THAT(no_wifi_response.result_error(), IsOk());
6752 EXPECT_THAT(
6753 no_wifi_response.request()->GetAddressResults().value().endpoints(),
6754 testing::ElementsAre(CreateExpected("::3", 80)));
Eric Orth00fe5a62018-08-15 22:20:006755
6756 EXPECT_THAT(no_wifi_v4_response.result_error(), IsOk());
6757 EXPECT_THAT(
6758 no_wifi_v4_response.request()->GetAddressResults().value().endpoints(),
6759 testing::ElementsAre(CreateExpected("1.0.0.1", 80)));
6760 EXPECT_THAT(no_wifi_v6_response.result_error(), IsOk());
6761 EXPECT_THAT(
6762 no_wifi_v6_response.request()->GetAddressResults().value().endpoints(),
6763 testing::ElementsAre(CreateExpected("::2", 80)));
Eric Orth70992982018-07-24 00:25:006764}
6765
Eric Orth960e7062019-03-08 18:43:546766TEST_F(HostResolverManagerDnsTest, NotFoundTTL) {
Brad Lassey2e8f185d2018-05-21 22:25:216767 CreateResolver();
Eric Orth60931742018-11-05 23:40:576768 set_allow_fallback_to_proctask(false);
Brad Lassey2e8f185d2018-05-21 22:25:216769 ChangeDnsConfig(CreateValidDnsConfig());
Eric Orth70992982018-07-24 00:25:006770
6771 // NODATA
Eric Orth117e1992019-04-17 00:24:156772 ResolveHostResponseHelper no_data_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556773 HostPortPair("empty", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:526774 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:006775 EXPECT_THAT(no_data_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
6776 EXPECT_FALSE(no_data_response.request()->GetAddressResults());
Eric Orth192e3bb2018-11-14 19:30:326777 HostCache::Key key("empty", DnsQueryType::UNSPECIFIED, 0,
Matt Menke7b4a32f2019-10-25 22:13:466778 HostResolverSource::ANY, NetworkIsolationKey());
Eric Orth70992982018-07-24 00:25:006779 HostCache::EntryStaleness staleness;
dalyk48b20a992019-02-25 16:10:266780 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result =
Eric Orthaf82b49a2020-02-01 01:48:506781 resolve_context_->host_cache()->Lookup(key, base::TimeTicks::Now(),
6782 false /* ignore_secure */);
dalyk48b20a992019-02-25 16:10:266783 EXPECT_TRUE(!!cache_result);
6784 EXPECT_TRUE(cache_result->second.has_ttl());
Peter Kastinge5a38ed2021-10-02 03:06:356785 EXPECT_THAT(cache_result->second.ttl(), base::Seconds(86400));
Eric Orth70992982018-07-24 00:25:006786
6787 // NXDOMAIN
Eric Orth117e1992019-04-17 00:24:156788 ResolveHostResponseHelper no_domain_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556789 HostPortPair("nodomain", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:526790 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:006791 EXPECT_THAT(no_domain_response.result_error(),
6792 IsError(ERR_NAME_NOT_RESOLVED));
6793 EXPECT_FALSE(no_domain_response.request()->GetAddressResults());
Eric Orth192e3bb2018-11-14 19:30:326794 HostCache::Key nxkey("nodomain", DnsQueryType::UNSPECIFIED, 0,
Matt Menke7b4a32f2019-10-25 22:13:466795 HostResolverSource::ANY, NetworkIsolationKey());
Eric Orthaf82b49a2020-02-01 01:48:506796 cache_result = resolve_context_->host_cache()->Lookup(
6797 nxkey, base::TimeTicks::Now(), false /* ignore_secure */);
dalyk48b20a992019-02-25 16:10:266798 EXPECT_TRUE(!!cache_result);
6799 EXPECT_TRUE(cache_result->second.has_ttl());
Peter Kastinge5a38ed2021-10-02 03:06:356800 EXPECT_THAT(cache_result->second.ttl(), base::Seconds(86400));
Eric Orth70992982018-07-24 00:25:006801}
6802
Eric Orth960e7062019-03-08 18:43:546803TEST_F(HostResolverManagerDnsTest, CachedError) {
dalyk4f4ac712019-05-31 16:33:136804 proc_->AddRuleForAllFamilies(std::string(),
Eric Roman862ae4b22019-08-22 20:25:446805 "0.0.0.1"); // Default to failures.
dalyk4f4ac712019-05-31 16:33:136806 proc_->SignalMultiple(1u);
6807
Eric Ortheb332862019-01-26 00:52:386808 CreateResolver();
dalyk4f4ac712019-05-31 16:33:136809 set_allow_fallback_to_proctask(true);
Eric Ortheb332862019-01-26 00:52:386810 ChangeDnsConfig(CreateValidDnsConfig());
6811
6812 HostResolver::ResolveHostParameters cache_only_parameters;
6813 cache_only_parameters.source = HostResolverSource::LOCAL_ONLY;
6814
6815 // Expect cache initially empty.
dalyk4f4ac712019-05-31 16:33:136816 ResolveHostResponseHelper cache_miss_response0(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556817 HostPortPair("nodomain", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:506818 cache_only_parameters, resolve_context_.get(),
6819 resolve_context_->host_cache()));
dalyk4f4ac712019-05-31 16:33:136820 EXPECT_THAT(cache_miss_response0.result_error(), IsError(ERR_DNS_CACHE_MISS));
6821 EXPECT_FALSE(cache_miss_response0.request()->GetStaleInfo());
6822
6823 // The cache should not be populate with an error because fallback to ProcTask
6824 // was available.
6825 ResolveHostResponseHelper no_domain_response_with_fallback(
Matt Menkef4023312019-11-01 18:24:556826 resolver_->CreateRequest(HostPortPair("nodomain", 80),
6827 NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:526828 absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:506829 resolve_context_->host_cache()));
dalyk4f4ac712019-05-31 16:33:136830 EXPECT_THAT(no_domain_response_with_fallback.result_error(),
6831 IsError(ERR_NAME_NOT_RESOLVED));
6832
6833 // Expect cache still empty.
6834 ResolveHostResponseHelper cache_miss_response1(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556835 HostPortPair("nodomain", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:506836 cache_only_parameters, resolve_context_.get(),
6837 resolve_context_->host_cache()));
dalyk4f4ac712019-05-31 16:33:136838 EXPECT_THAT(cache_miss_response1.result_error(), IsError(ERR_DNS_CACHE_MISS));
6839 EXPECT_FALSE(cache_miss_response1.request()->GetStaleInfo());
6840
6841 // Disable fallback to proctask
6842 set_allow_fallback_to_proctask(false);
Eric Ortheb332862019-01-26 00:52:386843
6844 // Populate cache with an error.
Eric Orth117e1992019-04-17 00:24:156845 ResolveHostResponseHelper no_domain_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556846 HostPortPair("nodomain", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:526847 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Ortheb332862019-01-26 00:52:386848 EXPECT_THAT(no_domain_response.result_error(),
6849 IsError(ERR_NAME_NOT_RESOLVED));
6850
6851 // Expect the error result can be resolved from the cache.
Eric Orth117e1992019-04-17 00:24:156852 ResolveHostResponseHelper cache_hit_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556853 HostPortPair("nodomain", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:506854 cache_only_parameters, resolve_context_.get(),
6855 resolve_context_->host_cache()));
Eric Ortheb332862019-01-26 00:52:386856 EXPECT_THAT(cache_hit_response.result_error(),
6857 IsError(ERR_NAME_NOT_RESOLVED));
6858 EXPECT_FALSE(cache_hit_response.request()->GetStaleInfo().value().is_stale());
6859}
6860
dalyk4f4ac712019-05-31 16:33:136861TEST_F(HostResolverManagerDnsTest, CachedError_AutomaticMode) {
6862 CreateResolver();
6863 set_allow_fallback_to_proctask(false);
6864 ChangeDnsConfig(CreateValidDnsConfig());
6865
6866 // Switch to automatic mode.
6867 DnsConfigOverrides overrides;
Eric Ortha093b092020-09-24 23:13:026868 overrides.secure_dns_mode = SecureDnsMode::kAutomatic;
dalyk4f4ac712019-05-31 16:33:136869 resolver_->SetDnsConfigOverrides(overrides);
6870
6871 HostCache::Key insecure_key =
6872 HostCache::Key("automatic_nodomain", DnsQueryType::UNSPECIFIED,
Matt Menke7b4a32f2019-10-25 22:13:466873 0 /* host_resolver_flags */, HostResolverSource::ANY,
6874 NetworkIsolationKey());
dalyk4f4ac712019-05-31 16:33:136875 HostCache::Key secure_key =
6876 HostCache::Key("automatic_nodomain", DnsQueryType::UNSPECIFIED,
Matt Menke7b4a32f2019-10-25 22:13:466877 0 /* host_resolver_flags */, HostResolverSource::ANY,
6878 NetworkIsolationKey());
dalyk4f4ac712019-05-31 16:33:136879 secure_key.secure = true;
6880
6881 // Expect cache initially empty.
6882 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result;
6883 cache_result = GetCacheHit(secure_key);
6884 EXPECT_FALSE(!!cache_result);
6885 cache_result = GetCacheHit(insecure_key);
6886 EXPECT_FALSE(!!cache_result);
6887
6888 // Populate both secure and insecure caches with an error.
6889 ResolveHostResponseHelper no_domain_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556890 HostPortPair("automatic_nodomain", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:526891 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:506892 resolve_context_->host_cache()));
dalyk4f4ac712019-05-31 16:33:136893 EXPECT_THAT(no_domain_response.result_error(),
6894 IsError(ERR_NAME_NOT_RESOLVED));
6895
6896 // Expect both secure and insecure caches to have the error result.
6897 cache_result = GetCacheHit(secure_key);
6898 EXPECT_TRUE(!!cache_result);
6899 cache_result = GetCacheHit(insecure_key);
6900 EXPECT_TRUE(!!cache_result);
6901}
6902
6903TEST_F(HostResolverManagerDnsTest, CachedError_SecureMode) {
6904 CreateResolver();
6905 set_allow_fallback_to_proctask(false);
6906 ChangeDnsConfig(CreateValidDnsConfig());
6907
6908 // Switch to secure mode.
6909 DnsConfigOverrides overrides;
Eric Ortha093b092020-09-24 23:13:026910 overrides.secure_dns_mode = SecureDnsMode::kSecure;
dalyk4f4ac712019-05-31 16:33:136911 resolver_->SetDnsConfigOverrides(overrides);
6912
6913 HostCache::Key insecure_key =
6914 HostCache::Key("automatic_nodomain", DnsQueryType::UNSPECIFIED,
Matt Menke7b4a32f2019-10-25 22:13:466915 0 /* host_resolver_flags */, HostResolverSource::ANY,
6916 NetworkIsolationKey());
dalyk4f4ac712019-05-31 16:33:136917 HostCache::Key secure_key =
6918 HostCache::Key("automatic_nodomain", DnsQueryType::UNSPECIFIED,
Matt Menke7b4a32f2019-10-25 22:13:466919 0 /* host_resolver_flags */, HostResolverSource::ANY,
6920 NetworkIsolationKey());
dalyk4f4ac712019-05-31 16:33:136921 secure_key.secure = true;
6922
6923 // Expect cache initially empty.
6924 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result;
6925 cache_result = GetCacheHit(secure_key);
6926 EXPECT_FALSE(!!cache_result);
6927 cache_result = GetCacheHit(insecure_key);
6928 EXPECT_FALSE(!!cache_result);
6929
6930 // Populate secure cache with an error.
6931 ResolveHostResponseHelper no_domain_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556932 HostPortPair("automatic_nodomain", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:526933 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:506934 resolve_context_->host_cache()));
dalyk4f4ac712019-05-31 16:33:136935 EXPECT_THAT(no_domain_response.result_error(),
6936 IsError(ERR_NAME_NOT_RESOLVED));
6937
6938 // Expect only the secure cache to have the error result.
6939 cache_result = GetCacheHit(secure_key);
6940 EXPECT_TRUE(!!cache_result);
6941 cache_result = GetCacheHit(insecure_key);
6942 EXPECT_FALSE(!!cache_result);
6943}
6944
Eric Orth90ce0212020-10-02 16:17:476945// Test that if one of A and AAAA completes successfully and the other fails,
6946// the failure is not cached.
6947TEST_F(HostResolverManagerDnsTest, TtlNotSharedBetweenQtypes) {
6948 CreateResolver();
6949 set_allow_fallback_to_proctask(false);
6950 ChangeDnsConfig(CreateValidDnsConfig());
6951
6952 ResolveHostResponseHelper response(resolver_->CreateRequest(
6953 HostPortPair("4slow_4timeout", 80), NetworkIsolationKey(),
Anton Bikineev068d2912021-05-15 20:43:526954 NetLogWithSource(), absl::nullopt /* optional_parameters */,
Eric Orth90ce0212020-10-02 16:17:476955 resolve_context_.get(), resolve_context_->host_cache()));
6956
6957 // Ensure success completes before the timeout result.
6958 base::RunLoop().RunUntilIdle();
6959 EXPECT_FALSE(response.complete());
6960
6961 dns_client_->CompleteDelayedTransactions();
6962 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_TIMED_OUT));
6963
6964 // Expect failure not cached.
6965 EXPECT_EQ(resolve_context_->host_cache()->size(), 0u);
6966}
6967
Eric Orth960e7062019-03-08 18:43:546968TEST_F(HostResolverManagerDnsTest, NoCanonicalName) {
Eric Orth828bd3ae2018-12-12 17:30:366969 MockDnsClientRuleList rules;
6970 AddDnsRule(&rules, "alias", dns_protocol::kTypeA, IPAddress::IPv4Localhost(),
dalyk48b20a992019-02-25 16:10:266971 "canonical", false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:366972 AddDnsRule(&rules, "alias", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:266973 IPAddress::IPv6Localhost(), "canonical", false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:366974
Asanka Herath2d0226c2018-10-24 14:35:556975 CreateResolver();
Eric Orth828bd3ae2018-12-12 17:30:366976 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
Eric Orth60931742018-11-05 23:40:576977 set_allow_fallback_to_proctask(false);
Eric Orth828bd3ae2018-12-12 17:30:366978
Eric Orth117e1992019-04-17 00:24:156979 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556980 HostPortPair("alias", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:526981 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Asanka Herath2d0226c2018-10-24 14:35:556982 ASSERT_THAT(response.result_error(), IsOk());
6983
Matt Menkec35d1632018-11-29 12:43:496984 // HostResolver may still give name, but if so, it must be correct.
6985 std::string result_name =
Cammie Smith Barnes78c07782020-12-07 23:27:046986 response.request()->GetAddressResults().value().GetCanonicalName();
Matt Menkec35d1632018-11-29 12:43:496987 EXPECT_TRUE(result_name.empty() || result_name == "canonical");
Asanka Herath2d0226c2018-10-24 14:35:556988}
6989
Eric Orth960e7062019-03-08 18:43:546990TEST_F(HostResolverManagerDnsTest, CanonicalName) {
Eric Orth828bd3ae2018-12-12 17:30:366991 MockDnsClientRuleList rules;
6992 AddDnsRule(&rules, "alias", dns_protocol::kTypeA, IPAddress::IPv4Localhost(),
dalyk48b20a992019-02-25 16:10:266993 "canonical", false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:366994 AddDnsRule(&rules, "alias", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:266995 IPAddress::IPv6Localhost(), "canonical", false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:366996
Asanka Herath2d0226c2018-10-24 14:35:556997 CreateResolver();
Eric Orth828bd3ae2018-12-12 17:30:366998 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
Eric Orth60931742018-11-05 23:40:576999 set_allow_fallback_to_proctask(false);
Eric Orth828bd3ae2018-12-12 17:30:367000
Asanka Herath2d0226c2018-10-24 14:35:557001 HostResolver::ResolveHostParameters params;
Asanka Herath2d0226c2018-10-24 14:35:557002 params.include_canonical_name = true;
Eric Orth541a90c2019-01-17 20:11:467003 params.source = HostResolverSource::DNS;
Eric Orth117e1992019-04-17 00:24:157004 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557005 HostPortPair("alias", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:507006 params, resolve_context_.get(), resolve_context_->host_cache()));
Asanka Herath2d0226c2018-10-24 14:35:557007 ASSERT_THAT(response.result_error(), IsOk());
7008
Cammie Smith Barnes78c07782020-12-07 23:27:047009 EXPECT_EQ(response.request()->GetAddressResults().value().GetCanonicalName(),
Asanka Herath2d0226c2018-10-24 14:35:557010 "canonical");
7011}
7012
Eric Orth960e7062019-03-08 18:43:547013TEST_F(HostResolverManagerDnsTest, CanonicalName_PreferV6) {
Eric Orth828bd3ae2018-12-12 17:30:367014 MockDnsClientRuleList rules;
7015 AddDnsRule(&rules, "alias", dns_protocol::kTypeA, IPAddress::IPv4Localhost(),
dalyk48b20a992019-02-25 16:10:267016 "wrong", false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:367017 AddDnsRule(&rules, "alias", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:267018 IPAddress::IPv6Localhost(), "correct", true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:367019
Asanka Herath2d0226c2018-10-24 14:35:557020 CreateResolver();
Eric Orth828bd3ae2018-12-12 17:30:367021 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
Eric Orth60931742018-11-05 23:40:577022 set_allow_fallback_to_proctask(false);
Eric Orth828bd3ae2018-12-12 17:30:367023
Asanka Herath2d0226c2018-10-24 14:35:557024 HostResolver::ResolveHostParameters params;
Asanka Herath2d0226c2018-10-24 14:35:557025 params.include_canonical_name = true;
Eric Orth541a90c2019-01-17 20:11:467026 params.source = HostResolverSource::DNS;
Eric Orth117e1992019-04-17 00:24:157027 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557028 HostPortPair("alias", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:507029 params, resolve_context_.get(), resolve_context_->host_cache()));
Asanka Herath2d0226c2018-10-24 14:35:557030 ASSERT_FALSE(response.complete());
7031 base::RunLoop().RunUntilIdle();
7032 dns_client_->CompleteDelayedTransactions();
7033 ASSERT_THAT(response.result_error(), IsOk());
Cammie Smith Barnes78c07782020-12-07 23:27:047034 EXPECT_EQ(response.request()->GetAddressResults().value().GetCanonicalName(),
Asanka Herath2d0226c2018-10-24 14:35:557035 "correct");
7036}
7037
Eric Orth960e7062019-03-08 18:43:547038TEST_F(HostResolverManagerDnsTest, CanonicalName_V4Only) {
Eric Orth828bd3ae2018-12-12 17:30:367039 MockDnsClientRuleList rules;
7040 AddDnsRule(&rules, "alias", dns_protocol::kTypeA, IPAddress::IPv4Localhost(),
dalyk48b20a992019-02-25 16:10:267041 "correct", false /* delay */);
Asanka Herath2d0226c2018-10-24 14:35:557042 CreateResolver();
Eric Orth828bd3ae2018-12-12 17:30:367043 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
Eric Orth60931742018-11-05 23:40:577044 set_allow_fallback_to_proctask(false);
Eric Orth828bd3ae2018-12-12 17:30:367045
Asanka Herath2d0226c2018-10-24 14:35:557046 HostResolver::ResolveHostParameters params;
Eric Orth192e3bb2018-11-14 19:30:327047 params.dns_query_type = DnsQueryType::A;
Asanka Herath2d0226c2018-10-24 14:35:557048 params.include_canonical_name = true;
Eric Orth541a90c2019-01-17 20:11:467049 params.source = HostResolverSource::DNS;
Eric Orth117e1992019-04-17 00:24:157050 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557051 HostPortPair("alias", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:507052 params, resolve_context_.get(), resolve_context_->host_cache()));
Asanka Herath2d0226c2018-10-24 14:35:557053 ASSERT_THAT(response.result_error(), IsOk());
Cammie Smith Barnes78c07782020-12-07 23:27:047054 EXPECT_EQ(response.request()->GetAddressResults().value().GetCanonicalName(),
Asanka Herath2d0226c2018-10-24 14:35:557055 "correct");
7056}
7057
Eric Orthdb225d522021-09-24 20:26:557058// Test that responses containing CNAME records but no address results are fine
7059// and treated as normal NODATA responses.
7060TEST_F(HostResolverManagerDnsTest, CanonicalNameWithoutResults) {
7061 MockDnsClientRuleList rules;
7062
7063 DnsResponse a_response =
7064 BuildTestDnsResponse("a.test", dns_protocol::kTypeA,
7065 {BuildTestCnameRecord("c.test", "d.test"),
7066 BuildTestCnameRecord("b.test", "c.test"),
7067 BuildTestCnameRecord("a.test", "b.test")});
7068 AddDnsRule(&rules, "a.test", dns_protocol::kTypeA, std::move(a_response),
7069 /*delay=*/false);
7070
7071 DnsResponse aaaa_response =
7072 BuildTestDnsResponse("a.test", dns_protocol::kTypeAAAA,
7073 {BuildTestCnameRecord("c.test", "d.test"),
7074 BuildTestCnameRecord("b.test", "c.test"),
7075 BuildTestCnameRecord("a.test", "b.test")});
7076 AddDnsRule(&rules, "a.test", dns_protocol::kTypeAAAA,
7077 std::move(aaaa_response), /*delay=*/false);
7078
7079 CreateResolver();
7080 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7081 set_allow_fallback_to_proctask(false);
7082
7083 ResolveHostResponseHelper response(resolver_->CreateRequest(
7084 HostPortPair("a.test", 80), NetworkIsolationKey(), NetLogWithSource(),
7085 /*optional_parameters=*/absl::nullopt, resolve_context_.get(),
7086 resolve_context_->host_cache()));
7087
7088 ASSERT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
7089
7090 // Underlying error should be the typical no-results error
7091 // (ERR_NAME_NOT_RESOLVED), not anything more exotic like
7092 // ERR_DNS_MALFORMED_RESPONSE.
7093 EXPECT_EQ(response.request()->GetResolveErrorInfo().error,
7094 ERR_NAME_NOT_RESOLVED);
7095}
7096
7097// Test that if the response for one address family contains CNAME records but
7098// no address results, it doesn't interfere with the other address family
7099// receiving address results (as would happen if such a response were
7100// incorrectly treated as a malformed response error).
7101TEST_F(HostResolverManagerDnsTest, CanonicalNameWithResultsForOnlyOneFamily) {
7102 MockDnsClientRuleList rules;
7103
7104 DnsResponse a_response =
7105 BuildTestDnsResponse("a.test", dns_protocol::kTypeA,
7106 {BuildTestCnameRecord("c.test", "d.test"),
7107 BuildTestCnameRecord("b.test", "c.test"),
7108 BuildTestCnameRecord("a.test", "b.test")});
7109 AddDnsRule(&rules, "a.test", dns_protocol::kTypeA, std::move(a_response),
7110 /*delay=*/false);
7111
7112 DnsResponse aaaa_response = BuildTestDnsResponse(
7113 "a.test", dns_protocol::kTypeAAAA,
7114 {BuildTestAddressRecord("d.test", IPAddress::IPv6Localhost()),
7115 BuildTestCnameRecord("c.test", "d.test"),
7116 BuildTestCnameRecord("b.test", "c.test"),
7117 BuildTestCnameRecord("a.test", "b.test")});
7118 AddDnsRule(&rules, "a.test", dns_protocol::kTypeAAAA,
7119 std::move(aaaa_response), /*delay=*/false);
7120
7121 CreateResolver();
7122 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7123
7124 ResolveHostResponseHelper response(resolver_->CreateRequest(
7125 HostPortPair("a.test", 80), NetworkIsolationKey(), NetLogWithSource(),
7126 /*optional_parameters=*/absl::nullopt, resolve_context_.get(),
7127 resolve_context_->host_cache()));
7128
7129 ASSERT_THAT(response.result_error(), IsOk());
7130
7131 ASSERT_TRUE(response.request()->GetAddressResults());
7132 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
7133 testing::ElementsAre(IPEndPoint(IPAddress::IPv6Localhost(), 80)));
7134}
7135
Eric Orth541a90c2019-01-17 20:11:467136// Test that without specifying source, a request that would otherwise be
7137// handled by DNS is sent to the system resolver if cannonname is requested.
Eric Orth960e7062019-03-08 18:43:547138TEST_F(HostResolverManagerDnsTest, CanonicalNameForcesProc) {
Eric Orth541a90c2019-01-17 20:11:467139 // Disable fallback to ensure system resolver is used directly, not via
7140 // fallback.
7141 set_allow_fallback_to_proctask(false);
7142
7143 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.102",
7144 HOST_RESOLVER_CANONNAME, "canonical");
7145 proc_->SignalMultiple(1u);
7146
7147 ChangeDnsConfig(CreateValidDnsConfig());
7148
7149 HostResolver::ResolveHostParameters params;
7150 params.include_canonical_name = true;
7151 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557152 HostPortPair("nx_succeed", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:507153 params, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth541a90c2019-01-17 20:11:467154 ASSERT_THAT(response.result_error(), IsOk());
7155
Cammie Smith Barnes78c07782020-12-07 23:27:047156 EXPECT_EQ(response.request()->GetAddressResults().value().GetCanonicalName(),
Eric Orth541a90c2019-01-17 20:11:467157 "canonical");
7158}
7159
Cammie Smith Barnes78c07782020-12-07 23:27:047160TEST_F(HostResolverManagerDnsTest, DnsAliases) {
7161 MockDnsClientRuleList rules;
7162
7163 DnsResponse expected_A_response = BuildTestDnsResponse(
7164 "first.test", dns_protocol::kTypeA,
7165 {BuildTestAddressRecord("fourth.test", IPAddress::IPv4Localhost()),
Cammie Smith Barnes78c07782020-12-07 23:27:047166 BuildTestCnameRecord("third.test", "fourth.test"),
7167 BuildTestCnameRecord("second.test", "third.test"),
7168 BuildTestCnameRecord("first.test", "second.test")});
7169
7170 AddDnsRule(&rules, "first.test", dns_protocol::kTypeA,
7171 std::move(expected_A_response), false /* delay */);
7172
7173 DnsResponse expected_AAAA_response = BuildTestDnsResponse(
7174 "first.test", dns_protocol::kTypeAAAA,
7175 {BuildTestAddressRecord("fourth.test", IPAddress::IPv6Localhost()),
7176 BuildTestCnameRecord("third.test", "fourth.test"),
7177 BuildTestCnameRecord("second.test", "third.test"),
7178 BuildTestCnameRecord("first.test", "second.test")});
7179
7180 AddDnsRule(&rules, "first.test", dns_protocol::kTypeAAAA,
7181 std::move(expected_AAAA_response), false /* delay */);
7182
7183 CreateResolver();
7184 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7185 set_allow_fallback_to_proctask(false);
7186 HostResolver::ResolveHostParameters params;
7187 params.include_canonical_name = true;
7188 params.source = HostResolverSource::DNS;
7189
7190 ResolveHostResponseHelper response(resolver_->CreateRequest(
7191 HostPortPair("first.test", 80), NetworkIsolationKey(), NetLogWithSource(),
7192 params, resolve_context_.get(), resolve_context_->host_cache()));
7193
7194 ASSERT_THAT(response.result_error(), IsOk());
7195 ASSERT_TRUE(response.request()->GetAddressResults());
7196 EXPECT_EQ(response.request()->GetAddressResults().value().GetCanonicalName(),
7197 "fourth.test");
7198 EXPECT_THAT(response.request()->GetAddressResults().value().dns_aliases(),
7199 testing::ElementsAre("fourth.test", "third.test", "second.test",
7200 "first.test"));
Cammie Smith Barnes958c7f32020-12-17 16:43:117201
7202 EXPECT_THAT(response.request()->GetDnsAliasResults(),
7203 testing::Optional(testing::ElementsAre(
7204 "fourth.test", "third.test", "second.test", "first.test")));
7205}
7206
7207TEST_F(HostResolverManagerDnsTest, DnsAliasesAreSanitized) {
7208 MockDnsClientRuleList rules;
7209
7210 DnsResponse expected_A_response = BuildTestDnsResponse(
7211 "host.test", dns_protocol::kTypeA,
7212 {BuildTestAddressRecord("localhost", IPAddress::IPv4Localhost()),
7213 BuildTestCnameRecord("host.test", "localhost")});
7214
7215 AddDnsRule(&rules, "host.test", dns_protocol::kTypeA,
7216 std::move(expected_A_response), false /* delay */);
7217
7218 DnsResponse expected_AAAA_response = BuildTestDnsResponse(
7219 "host.test", dns_protocol::kTypeAAAA,
7220 {BuildTestAddressRecord("localhost", IPAddress::IPv6Localhost()),
7221 BuildTestCnameRecord("host.test", "localhost")});
7222
7223 AddDnsRule(&rules, "host.test", dns_protocol::kTypeAAAA,
7224 std::move(expected_AAAA_response), false /* delay */);
7225
7226 CreateResolver();
7227 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7228 set_allow_fallback_to_proctask(false);
7229 HostResolver::ResolveHostParameters params;
7230 params.include_canonical_name = true;
7231 params.source = HostResolverSource::DNS;
7232
7233 ResolveHostResponseHelper response(resolver_->CreateRequest(
7234 HostPortPair("host.test", 80), NetworkIsolationKey(), NetLogWithSource(),
7235 params, resolve_context_.get(), resolve_context_->host_cache()));
7236
7237 // Verify that, while the AddressResults contain the full unsanitized alias
7238 // list (which has "localhost" has first element and canonical name i.e.
7239 // address record name), the call to ResolveHostRequest::GetDnsAliasResults
7240 // returns a sanitized list.
7241 ASSERT_THAT(response.result_error(), IsOk());
7242 ASSERT_TRUE(response.request()->GetAddressResults());
7243 EXPECT_EQ(response.request()->GetAddressResults().value().GetCanonicalName(),
7244 "localhost");
7245 EXPECT_THAT(response.request()->GetAddressResults().value().dns_aliases(),
7246 testing::ElementsAre("localhost", "host.test"));
7247 EXPECT_THAT(response.request()->GetDnsAliasResults(),
7248 testing::Optional(testing::ElementsAre("host.test")));
7249}
7250
7251TEST_F(HostResolverManagerDnsTest, NoAdditionalDnsAliases) {
7252 MockDnsClientRuleList rules;
7253
7254 AddDnsRule(&rules, "first.test", dns_protocol::kTypeA,
7255 IPAddress::IPv4Localhost(), false /* delay */);
7256
7257 AddDnsRule(&rules, "first.test", dns_protocol::kTypeAAAA,
7258 IPAddress::IPv6Localhost(), false /* delay */);
7259
7260 CreateResolver();
7261 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7262 set_allow_fallback_to_proctask(false);
7263 HostResolver::ResolveHostParameters params;
7264 params.include_canonical_name = true;
7265 params.source = HostResolverSource::DNS;
7266
7267 ResolveHostResponseHelper response(resolver_->CreateRequest(
7268 HostPortPair("first.test", 80), NetworkIsolationKey(), NetLogWithSource(),
7269 params, resolve_context_.get(), resolve_context_->host_cache()));
7270
7271 ASSERT_THAT(response.result_error(), IsOk());
7272 ASSERT_TRUE(response.request()->GetAddressResults());
7273 EXPECT_EQ(response.request()->GetAddressResults().value().GetCanonicalName(),
7274 "first.test");
7275 EXPECT_THAT(response.request()->GetAddressResults().value().dns_aliases(),
7276 testing::ElementsAre("first.test"));
7277 EXPECT_THAT(response.request()->GetDnsAliasResults(),
7278 testing::Optional(testing::ElementsAre("first.test")));
Cammie Smith Barnes78c07782020-12-07 23:27:047279}
7280
David Van Cleve34c74c72019-10-31 19:58:017281TEST_F(HostResolverManagerDnsTest, SortsAndDeduplicatesAddresses) {
7282 MockDnsClientRuleList rules;
7283
7284 {
7285 std::vector<DnsResourceRecord> answers(
7286 3, BuildTestAddressRecord("duplicate", IPAddress::IPv4Localhost()));
7287 std::string dns_name;
7288 CHECK(DNSDomainFromDot("duplicate", &dns_name));
Anton Bikineev068d2912021-05-15 20:43:527289 absl::optional<DnsQuery> query(absl::in_place, 0, dns_name,
David Van Cleve34c74c72019-10-31 19:58:017290 dns_protocol::kTypeA);
7291
7292 rules.emplace_back(
7293 "duplicate", dns_protocol::kTypeA, false /* secure */,
Eric Ortha97f0f72020-10-16 16:10:327294 MockDnsClientRule::Result(DnsResponse(
David Van Cleve34c74c72019-10-31 19:58:017295 0, false, std::move(answers),
7296 std::vector<DnsResourceRecord>() /* authority_records */,
7297 std::vector<DnsResourceRecord>() /* additional_records */, query)),
7298 false /* delay */);
7299 }
7300
7301 {
7302 std::vector<DnsResourceRecord> answers(
7303 3, BuildTestAddressRecord("duplicate", IPAddress::IPv6Localhost()));
7304 std::string dns_name;
7305 CHECK(DNSDomainFromDot("duplicate", &dns_name));
Anton Bikineev068d2912021-05-15 20:43:527306 absl::optional<DnsQuery> query(absl::in_place, 0, dns_name,
David Van Cleve34c74c72019-10-31 19:58:017307 dns_protocol::kTypeAAAA);
7308
7309 rules.emplace_back(
7310 "duplicate", dns_protocol::kTypeAAAA, false /* secure */,
Eric Ortha97f0f72020-10-16 16:10:327311 MockDnsClientRule::Result(DnsResponse(
David Van Cleve34c74c72019-10-31 19:58:017312 0, false, std::move(answers),
7313 std::vector<DnsResourceRecord>() /* authority_records */,
7314 std::vector<DnsResourceRecord>() /* additional_records */, query)),
7315 false /* delay */);
7316 }
7317
7318 CreateResolver();
7319 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7320
7321 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557322 HostPortPair("duplicate", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:527323 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
David Van Cleve34c74c72019-10-31 19:58:017324 ASSERT_THAT(response.result_error(), IsOk());
7325
7326 EXPECT_THAT(
7327 response.request()->GetAddressResults(),
7328 testing::Optional(testing::Property(
7329 &AddressList::endpoints,
7330 testing::ElementsAre(IPEndPoint(IPAddress::IPv6Localhost(), 80),
7331 IPEndPoint(IPAddress::IPv4Localhost(), 80)))));
7332}
7333
Eric Orth960e7062019-03-08 18:43:547334TEST_F(HostResolverManagerTest, ResolveLocalHostname) {
tfarina9ed7f8c52016-02-19 17:50:187335 AddressList addresses;
7336
7337 TestBothLoopbackIPs("localhost");
7338 TestBothLoopbackIPs("localhoST");
7339 TestBothLoopbackIPs("localhost.");
7340 TestBothLoopbackIPs("localhoST.");
tfarina9ed7f8c52016-02-19 17:50:187341 TestBothLoopbackIPs("foo.localhost");
7342 TestBothLoopbackIPs("foo.localhOSt");
7343 TestBothLoopbackIPs("foo.localhost.");
7344 TestBothLoopbackIPs("foo.localhOSt.");
7345
Frédéric Wang71698e62020-12-10 06:13:527346 // Legacy localhost names.
Frédéric Wang144a82e62020-12-18 12:19:367347 EXPECT_FALSE(ResolveLocalHostname("localhost.localdomain", &addresses));
7348 EXPECT_FALSE(ResolveLocalHostname("localhost.localdomAIn", &addresses));
7349 EXPECT_FALSE(ResolveLocalHostname("localhost.localdomain.", &addresses));
7350 EXPECT_FALSE(ResolveLocalHostname("localhost.localdomAIn.", &addresses));
Frédéric Wang71698e62020-12-10 06:13:527351 EXPECT_FALSE(ResolveLocalHostname("localhost6", &addresses));
7352 EXPECT_FALSE(ResolveLocalHostname("localhoST6", &addresses));
7353 EXPECT_FALSE(ResolveLocalHostname("localhost6.", &addresses));
7354 EXPECT_FALSE(ResolveLocalHostname("localhost6.localdomain6", &addresses));
7355 EXPECT_FALSE(ResolveLocalHostname("localhost6.localdomain6.", &addresses));
tfarina9ed7f8c52016-02-19 17:50:187356
Matt Menkec35d1632018-11-29 12:43:497357 EXPECT_FALSE(ResolveLocalHostname("127.0.0.1", &addresses));
7358 EXPECT_FALSE(ResolveLocalHostname("::1", &addresses));
7359 EXPECT_FALSE(ResolveLocalHostname("0:0:0:0:0:0:0:1", &addresses));
7360 EXPECT_FALSE(ResolveLocalHostname("localhostx", &addresses));
7361 EXPECT_FALSE(ResolveLocalHostname("localhost.x", &addresses));
7362 EXPECT_FALSE(ResolveLocalHostname("foo.localdomain", &addresses));
7363 EXPECT_FALSE(ResolveLocalHostname("foo.localdomain.x", &addresses));
7364 EXPECT_FALSE(ResolveLocalHostname("localhost6x", &addresses));
7365 EXPECT_FALSE(ResolveLocalHostname("localhost.localdomain6", &addresses));
7366 EXPECT_FALSE(ResolveLocalHostname("localhost6.localdomain", &addresses));
7367 EXPECT_FALSE(ResolveLocalHostname("127.0.0.1.1", &addresses));
7368 EXPECT_FALSE(ResolveLocalHostname(".127.0.0.255", &addresses));
7369 EXPECT_FALSE(ResolveLocalHostname("::2", &addresses));
7370 EXPECT_FALSE(ResolveLocalHostname("::1:1", &addresses));
7371 EXPECT_FALSE(ResolveLocalHostname("0:0:0:0:1:0:0:1", &addresses));
7372 EXPECT_FALSE(ResolveLocalHostname("::1:1", &addresses));
7373 EXPECT_FALSE(ResolveLocalHostname("0:0:0:0:0:0:0:0:1", &addresses));
7374 EXPECT_FALSE(ResolveLocalHostname("foo.localhost.com", &addresses));
7375 EXPECT_FALSE(ResolveLocalHostname("foo.localhoste", &addresses));
tfarina9ed7f8c52016-02-19 17:50:187376}
7377
Eric Orth960e7062019-03-08 18:43:547378TEST_F(HostResolverManagerDnsTest, AddDnsOverHttpsServerAfterConfig) {
Eric Orth37b18192019-04-22 19:09:287379 DestroyResolver();
Brad Lassey786929ad2018-02-21 20:54:277380 test::ScopedMockNetworkChangeNotifier notifier;
7381 CreateSerialResolver(); // To guarantee order of resolutions.
7382 notifier.mock_network_change_notifier()->SetConnectionType(
7383 NetworkChangeNotifier::CONNECTION_WIFI);
7384 ChangeDnsConfig(CreateValidDnsConfig());
7385
dalykb34631f2018-08-24 19:59:487386 std::string server("https://dnsserver.example.net/dns-query{?dns}");
Eric Orthc1eb1292018-10-09 22:07:077387 DnsConfigOverrides overrides;
7388 overrides.dns_over_https_servers.emplace(
Eric Orthc63cf502020-04-03 21:21:277389 {DnsOverHttpsServerConfig(server, true)});
Eric Ortha093b092020-09-24 23:13:027390 overrides.secure_dns_mode = SecureDnsMode::kAutomatic;
Eric Orthc1eb1292018-10-09 22:07:077391 resolver_->SetDnsConfigOverrides(overrides);
Panos Astithas8aa1ec82020-08-31 18:37:417392 base::Value config = resolver_->GetDnsConfigAsValue();
7393 base::Value* doh_servers = config.FindListKey("doh_servers");
Brad Lassey786929ad2018-02-21 20:54:277394 EXPECT_TRUE(doh_servers);
7395 if (!doh_servers)
7396 return;
Panos Astithas8aa1ec82020-08-31 18:37:417397 EXPECT_EQ(doh_servers->GetList().size(), 1u);
7398 base::Value& server_method = doh_servers->GetList()[0];
7399 EXPECT_TRUE(server_method.is_dict());
Anton Bikineev068d2912021-05-15 20:43:527400 absl::optional<bool> use_post = server_method.FindBoolKey("use_post");
Brad Lassey786929ad2018-02-21 20:54:277401 EXPECT_TRUE(use_post);
Panos Astithas8aa1ec82020-08-31 18:37:417402 const std::string* server_template =
7403 server_method.FindStringKey("server_template");
7404 EXPECT_TRUE(server_template);
7405 EXPECT_EQ(*server_template, server);
7406 EXPECT_EQ(config.FindKey("secure_dns_mode")->GetInt(),
Eric Ortha093b092020-09-24 23:13:027407 static_cast<int>(SecureDnsMode::kAutomatic));
Brad Lassey786929ad2018-02-21 20:54:277408}
7409
Eric Orth960e7062019-03-08 18:43:547410TEST_F(HostResolverManagerDnsTest, AddDnsOverHttpsServerBeforeConfig) {
Eric Orth37b18192019-04-22 19:09:287411 DestroyResolver();
Brad Lassey786929ad2018-02-21 20:54:277412 test::ScopedMockNetworkChangeNotifier notifier;
7413 CreateSerialResolver(); // To guarantee order of resolutions.
dalykb34631f2018-08-24 19:59:487414 std::string server("https://dnsserver.example.net/dns-query{?dns}");
Eric Orthc1eb1292018-10-09 22:07:077415 DnsConfigOverrides overrides;
7416 overrides.dns_over_https_servers.emplace(
Eric Orthc63cf502020-04-03 21:21:277417 {DnsOverHttpsServerConfig(server, true)});
Eric Ortha093b092020-09-24 23:13:027418 overrides.secure_dns_mode = SecureDnsMode::kAutomatic;
Eric Orthc1eb1292018-10-09 22:07:077419 resolver_->SetDnsConfigOverrides(overrides);
Brad Lassey786929ad2018-02-21 20:54:277420
7421 notifier.mock_network_change_notifier()->SetConnectionType(
7422 NetworkChangeNotifier::CONNECTION_WIFI);
7423 ChangeDnsConfig(CreateValidDnsConfig());
7424
Panos Astithas8aa1ec82020-08-31 18:37:417425 base::Value config = resolver_->GetDnsConfigAsValue();
7426 base::Value* doh_servers = config.FindListKey("doh_servers");
Brad Lassey786929ad2018-02-21 20:54:277427 EXPECT_TRUE(doh_servers);
7428 if (!doh_servers)
7429 return;
Panos Astithas8aa1ec82020-08-31 18:37:417430 EXPECT_EQ(doh_servers->GetList().size(), 1u);
7431 base::Value& server_method = doh_servers->GetList()[0];
7432 EXPECT_TRUE(server_method.is_dict());
Anton Bikineev068d2912021-05-15 20:43:527433 absl::optional<bool> use_post = server_method.FindBoolKey("use_post");
Brad Lassey786929ad2018-02-21 20:54:277434 EXPECT_TRUE(use_post);
Panos Astithas8aa1ec82020-08-31 18:37:417435 const std::string* server_template =
7436 server_method.FindStringKey("server_template");
7437 EXPECT_TRUE(server_template);
7438 EXPECT_EQ(*server_template, server);
7439 EXPECT_EQ(config.FindKey("secure_dns_mode")->GetInt(),
Eric Ortha093b092020-09-24 23:13:027440 static_cast<int>(SecureDnsMode::kAutomatic));
Brad Lassey786929ad2018-02-21 20:54:277441}
7442
Eric Orth960e7062019-03-08 18:43:547443TEST_F(HostResolverManagerDnsTest, AddDnsOverHttpsServerBeforeClient) {
Eric Orth37b18192019-04-22 19:09:287444 DestroyResolver();
Brad Lassey786929ad2018-02-21 20:54:277445 test::ScopedMockNetworkChangeNotifier notifier;
7446 CreateSerialResolver(); // To guarantee order of resolutions.
dalykb34631f2018-08-24 19:59:487447 std::string server("https://dnsserver.example.net/dns-query{?dns}");
Eric Orthc1eb1292018-10-09 22:07:077448 DnsConfigOverrides overrides;
7449 overrides.dns_over_https_servers.emplace(
Eric Orthc63cf502020-04-03 21:21:277450 {DnsOverHttpsServerConfig(server, true)});
Eric Ortha093b092020-09-24 23:13:027451 overrides.secure_dns_mode = SecureDnsMode::kAutomatic;
Eric Orthc1eb1292018-10-09 22:07:077452 resolver_->SetDnsConfigOverrides(overrides);
Brad Lassey786929ad2018-02-21 20:54:277453
7454 notifier.mock_network_change_notifier()->SetConnectionType(
7455 NetworkChangeNotifier::CONNECTION_WIFI);
7456 ChangeDnsConfig(CreateValidDnsConfig());
7457
Panos Astithas8aa1ec82020-08-31 18:37:417458 base::Value config = resolver_->GetDnsConfigAsValue();
7459 base::Value* doh_servers = config.FindListKey("doh_servers");
Brad Lassey786929ad2018-02-21 20:54:277460 EXPECT_TRUE(doh_servers);
7461 if (!doh_servers)
7462 return;
Panos Astithas8aa1ec82020-08-31 18:37:417463 EXPECT_EQ(doh_servers->GetList().size(), 1u);
7464 base::Value& server_method = doh_servers->GetList()[0];
7465 EXPECT_TRUE(server_method.is_dict());
Anton Bikineev068d2912021-05-15 20:43:527466 absl::optional<bool> use_post = server_method.FindBoolKey("use_post");
Brad Lassey786929ad2018-02-21 20:54:277467 EXPECT_TRUE(use_post);
Panos Astithas8aa1ec82020-08-31 18:37:417468 const std::string* server_template =
7469 server_method.FindStringKey("server_template");
7470 EXPECT_TRUE(server_template);
7471 EXPECT_EQ(*server_template, server);
7472 EXPECT_EQ(config.FindKey("secure_dns_mode")->GetInt(),
Eric Ortha093b092020-09-24 23:13:027473 static_cast<int>(SecureDnsMode::kAutomatic));
Brad Lassey786929ad2018-02-21 20:54:277474}
7475
Eric Orth960e7062019-03-08 18:43:547476TEST_F(HostResolverManagerDnsTest, AddDnsOverHttpsServerAndThenRemove) {
Eric Orth37b18192019-04-22 19:09:287477 DestroyResolver();
Brad Lassey786929ad2018-02-21 20:54:277478 test::ScopedMockNetworkChangeNotifier notifier;
7479 CreateSerialResolver(); // To guarantee order of resolutions.
dalykb34631f2018-08-24 19:59:487480 std::string server("https://dns.example.com/");
Eric Orthc1eb1292018-10-09 22:07:077481 DnsConfigOverrides overrides;
7482 overrides.dns_over_https_servers.emplace(
Eric Orthc63cf502020-04-03 21:21:277483 {DnsOverHttpsServerConfig(server, true)});
Eric Ortha093b092020-09-24 23:13:027484 overrides.secure_dns_mode = SecureDnsMode::kAutomatic;
Eric Orthc1eb1292018-10-09 22:07:077485 resolver_->SetDnsConfigOverrides(overrides);
Brad Lassey786929ad2018-02-21 20:54:277486
7487 notifier.mock_network_change_notifier()->SetConnectionType(
7488 NetworkChangeNotifier::CONNECTION_WIFI);
dalyk4f4ac712019-05-31 16:33:137489 DnsConfig network_dns_config = CreateValidDnsConfig();
7490 network_dns_config.dns_over_https_servers.clear();
7491 ChangeDnsConfig(network_dns_config);
Brad Lassey786929ad2018-02-21 20:54:277492
Panos Astithas8aa1ec82020-08-31 18:37:417493 base::Value config = resolver_->GetDnsConfigAsValue();
7494 base::Value* doh_servers = config.FindListKey("doh_servers");
Brad Lassey786929ad2018-02-21 20:54:277495 EXPECT_TRUE(doh_servers);
7496 if (!doh_servers)
7497 return;
Panos Astithas8aa1ec82020-08-31 18:37:417498 EXPECT_EQ(doh_servers->GetList().size(), 1u);
7499 base::Value& server_method = doh_servers->GetList()[0];
7500 EXPECT_TRUE(server_method.is_dict());
Anton Bikineev068d2912021-05-15 20:43:527501 absl::optional<bool> use_post = server_method.FindBoolKey("use_post");
Brad Lassey786929ad2018-02-21 20:54:277502 EXPECT_TRUE(use_post);
Panos Astithas8aa1ec82020-08-31 18:37:417503 const std::string* server_template =
7504 server_method.FindStringKey("server_template");
7505 EXPECT_TRUE(server_template);
7506 EXPECT_EQ(*server_template, server);
7507 EXPECT_EQ(config.FindKey("secure_dns_mode")->GetInt(),
Eric Ortha093b092020-09-24 23:13:027508 static_cast<int>(SecureDnsMode::kAutomatic));
Brad Lassey786929ad2018-02-21 20:54:277509
Eric Orthc1eb1292018-10-09 22:07:077510 resolver_->SetDnsConfigOverrides(DnsConfigOverrides());
Panos Astithas8aa1ec82020-08-31 18:37:417511 config = resolver_->GetDnsConfigAsValue();
7512 doh_servers = config.FindListKey("doh_servers");
Brad Lassey786929ad2018-02-21 20:54:277513 EXPECT_TRUE(doh_servers);
7514 if (!doh_servers)
7515 return;
Panos Astithas8aa1ec82020-08-31 18:37:417516 EXPECT_EQ(doh_servers->GetList().size(), 0u);
7517 EXPECT_EQ(config.FindKey("secure_dns_mode")->GetInt(),
Eric Ortha093b092020-09-24 23:13:027518 static_cast<int>(SecureDnsMode::kOff));
Brad Lassey786929ad2018-02-21 20:54:277519}
7520
Eric Orth394db1732019-08-27 20:09:397521// Basic test socket factory that allows creation of UDP sockets, but those
7522// sockets are mocks with no data and are not expected to be usable.
7523class AlwaysFailSocketFactory : public MockClientSocketFactory {
7524 public:
7525 std::unique_ptr<DatagramClientSocket> CreateDatagramClientSocket(
7526 DatagramSocket::BindType bind_type,
7527 NetLog* net_log,
7528 const NetLogSource& source) override {
7529 return std::make_unique<MockUDPClientSocket>();
7530 }
7531};
7532
Eric Ortha3559ca2019-09-05 23:40:547533class TestDnsObserver : public NetworkChangeNotifier::DNSObserver {
7534 public:
7535 void OnDNSChanged() override { ++dns_changed_calls_; }
7536
Eric Ortha3559ca2019-09-05 23:40:547537 int dns_changed_calls() const { return dns_changed_calls_; }
7538
7539 private:
7540 int dns_changed_calls_ = 0;
7541};
7542
Eric Orth394db1732019-08-27 20:09:397543// Built-in client and config overrides not available on iOS.
7544#if !defined(OS_IOS)
Eric Orth960e7062019-03-08 18:43:547545TEST_F(HostResolverManagerDnsTest, SetDnsConfigOverrides) {
Eric Ortha3559ca2019-09-05 23:40:547546 test::ScopedMockNetworkChangeNotifier mock_network_change_notifier;
7547 TestDnsObserver config_observer;
7548 NetworkChangeNotifier::AddDNSObserver(&config_observer);
7549
Eric Orth394db1732019-08-27 20:09:397550 // Use a real DnsClient to test config-handling behavior.
7551 AlwaysFailSocketFactory socket_factory;
Anna Malovaf817b39b62020-03-02 18:38:007552 auto client =
7553 DnsClient::CreateClientForTesting(nullptr /* net_log */, &socket_factory,
7554 base::BindRepeating(&base::RandInt));
Eric Orth394db1732019-08-27 20:09:397555 DnsClient* client_ptr = client.get();
7556 resolver_->SetDnsClientForTesting(std::move(client));
7557
Eric Orthc1eb1292018-10-09 22:07:077558 DnsConfig original_config = CreateValidDnsConfig();
Eric Orth9c3e1e02020-09-25 17:23:087559 original_config.hosts = {
7560 {DnsHostsKey("host", ADDRESS_FAMILY_IPV4), IPAddress(192, 168, 1, 1)}};
Eric Orthc1eb1292018-10-09 22:07:077561 ChangeDnsConfig(original_config);
7562
7563 // Confirm pre-override state.
Eric Orth394db1732019-08-27 20:09:397564 ASSERT_EQ(original_config, *client_ptr->GetEffectiveConfig());
Eric Orthc1eb1292018-10-09 22:07:077565
7566 DnsConfigOverrides overrides;
7567 const std::vector<IPEndPoint> nameservers = {
7568 CreateExpected("192.168.0.1", 92)};
7569 overrides.nameservers = nameservers;
7570 const std::vector<std::string> search = {"str"};
7571 overrides.search = search;
Eric Orthc1eb1292018-10-09 22:07:077572 overrides.append_to_multi_label_name = false;
Eric Orthc1eb1292018-10-09 22:07:077573 const int ndots = 5;
7574 overrides.ndots = ndots;
Peter Kastinge5a38ed2021-10-02 03:06:357575 const base::TimeDelta fallback_period = base::Seconds(10);
Eric Orthb22f6b42020-10-05 20:44:047576 overrides.fallback_period = fallback_period;
Eric Orthc1eb1292018-10-09 22:07:077577 const int attempts = 20;
7578 overrides.attempts = attempts;
Steven Bingler382d7d42020-03-13 00:02:047579 const int doh_attempts = 19;
7580 overrides.doh_attempts = doh_attempts;
Eric Orthc1eb1292018-10-09 22:07:077581 overrides.rotate = true;
7582 overrides.use_local_ipv6 = true;
Eric Orthc63cf502020-04-03 21:21:277583 const std::vector<DnsOverHttpsServerConfig> dns_over_https_servers = {
7584 DnsOverHttpsServerConfig("dns.example.com", true)};
Eric Orthc1eb1292018-10-09 22:07:077585 overrides.dns_over_https_servers = dns_over_https_servers;
Eric Ortha093b092020-09-24 23:13:027586 const SecureDnsMode secure_dns_mode = SecureDnsMode::kSecure;
dalykbd726ee2019-05-30 01:44:067587 overrides.secure_dns_mode = secure_dns_mode;
dalykf93a48e372019-09-04 02:57:597588 overrides.allow_dns_over_https_upgrade = true;
7589 const std::vector<std::string> disabled_upgrade_providers = {"provider_name"};
7590 overrides.disabled_upgrade_providers = disabled_upgrade_providers;
Eric Orth9c3e1e02020-09-25 17:23:087591 overrides.clear_hosts = true;
Eric Orthc1eb1292018-10-09 22:07:077592
Eric Orthc823a23d2018-10-30 22:12:487593 // This test is expected to test overriding all fields.
7594 EXPECT_TRUE(overrides.OverridesEverything());
7595
Eric Ortha3559ca2019-09-05 23:40:547596 EXPECT_EQ(0, config_observer.dns_changed_calls());
7597
Eric Orthc1eb1292018-10-09 22:07:077598 resolver_->SetDnsConfigOverrides(overrides);
7599
Eric Orth394db1732019-08-27 20:09:397600 const DnsConfig* overridden_config = client_ptr->GetEffectiveConfig();
7601 ASSERT_TRUE(overridden_config);
Eric Orthc1eb1292018-10-09 22:07:077602 EXPECT_EQ(nameservers, overridden_config->nameservers);
7603 EXPECT_EQ(search, overridden_config->search);
Eric Orthc1eb1292018-10-09 22:07:077604 EXPECT_FALSE(overridden_config->append_to_multi_label_name);
Eric Orthc1eb1292018-10-09 22:07:077605 EXPECT_EQ(ndots, overridden_config->ndots);
Eric Orthb22f6b42020-10-05 20:44:047606 EXPECT_EQ(fallback_period, overridden_config->fallback_period);
Eric Orthc1eb1292018-10-09 22:07:077607 EXPECT_EQ(attempts, overridden_config->attempts);
Steven Bingler382d7d42020-03-13 00:02:047608 EXPECT_EQ(doh_attempts, overridden_config->doh_attempts);
Eric Orthc1eb1292018-10-09 22:07:077609 EXPECT_TRUE(overridden_config->rotate);
7610 EXPECT_TRUE(overridden_config->use_local_ipv6);
7611 EXPECT_EQ(dns_over_https_servers, overridden_config->dns_over_https_servers);
dalykbd726ee2019-05-30 01:44:067612 EXPECT_EQ(secure_dns_mode, overridden_config->secure_dns_mode);
dalykf93a48e372019-09-04 02:57:597613 EXPECT_TRUE(overridden_config->allow_dns_over_https_upgrade);
7614 EXPECT_EQ(disabled_upgrade_providers,
7615 overridden_config->disabled_upgrade_providers);
Eric Orth9c3e1e02020-09-25 17:23:087616 EXPECT_THAT(overridden_config->hosts, testing::IsEmpty());
Eric Ortha3559ca2019-09-05 23:40:547617
7618 base::RunLoop().RunUntilIdle(); // Notifications are async.
7619 EXPECT_EQ(1, config_observer.dns_changed_calls());
7620
7621 NetworkChangeNotifier::RemoveDNSObserver(&config_observer);
Eric Orthc1eb1292018-10-09 22:07:077622}
7623
Eric Orth960e7062019-03-08 18:43:547624TEST_F(HostResolverManagerDnsTest,
Eric Orthc823a23d2018-10-30 22:12:487625 SetDnsConfigOverrides_OverrideEverythingCreation) {
Eric Orth394db1732019-08-27 20:09:397626 // Use a real DnsClient to test config-handling behavior.
7627 AlwaysFailSocketFactory socket_factory;
Anna Malovaf817b39b62020-03-02 18:38:007628 auto client =
7629 DnsClient::CreateClientForTesting(nullptr /* net_log */, &socket_factory,
7630 base::BindRepeating(&base::RandInt));
Eric Orth394db1732019-08-27 20:09:397631 DnsClient* client_ptr = client.get();
7632 resolver_->SetDnsClientForTesting(std::move(client));
7633
Eric Orthc823a23d2018-10-30 22:12:487634 DnsConfig original_config = CreateValidDnsConfig();
7635 ChangeDnsConfig(original_config);
7636
7637 // Confirm pre-override state.
Eric Orth394db1732019-08-27 20:09:397638 ASSERT_EQ(original_config, *client_ptr->GetEffectiveConfig());
Eric Orthc823a23d2018-10-30 22:12:487639 ASSERT_FALSE(original_config.Equals(DnsConfig()));
7640
7641 DnsConfigOverrides overrides =
7642 DnsConfigOverrides::CreateOverridingEverythingWithDefaults();
7643 EXPECT_TRUE(overrides.OverridesEverything());
7644
7645 // Ensure config is valid by setting a nameserver.
7646 std::vector<IPEndPoint> nameservers = {CreateExpected("1.2.3.4", 50)};
7647 overrides.nameservers = nameservers;
7648 EXPECT_TRUE(overrides.OverridesEverything());
7649
7650 resolver_->SetDnsConfigOverrides(overrides);
7651
7652 DnsConfig expected;
7653 expected.nameservers = nameservers;
Eric Orth394db1732019-08-27 20:09:397654 EXPECT_THAT(client_ptr->GetEffectiveConfig(), testing::Pointee(expected));
Eric Orthc823a23d2018-10-30 22:12:487655}
7656
Eric Orth960e7062019-03-08 18:43:547657TEST_F(HostResolverManagerDnsTest, SetDnsConfigOverrides_PartialOverride) {
Eric Orth394db1732019-08-27 20:09:397658 // Use a real DnsClient to test config-handling behavior.
7659 AlwaysFailSocketFactory socket_factory;
Anna Malovaf817b39b62020-03-02 18:38:007660 auto client =
7661 DnsClient::CreateClientForTesting(nullptr /* net_log */, &socket_factory,
7662 base::BindRepeating(&base::RandInt));
Eric Orth394db1732019-08-27 20:09:397663 DnsClient* client_ptr = client.get();
7664 resolver_->SetDnsClientForTesting(std::move(client));
7665
Eric Orthc1eb1292018-10-09 22:07:077666 DnsConfig original_config = CreateValidDnsConfig();
7667 ChangeDnsConfig(original_config);
7668
7669 // Confirm pre-override state.
Eric Orth394db1732019-08-27 20:09:397670 ASSERT_EQ(original_config, *client_ptr->GetEffectiveConfig());
Eric Orthc1eb1292018-10-09 22:07:077671
7672 DnsConfigOverrides overrides;
7673 const std::vector<IPEndPoint> nameservers = {
7674 CreateExpected("192.168.0.2", 192)};
7675 overrides.nameservers = nameservers;
7676 overrides.rotate = true;
Eric Orthc823a23d2018-10-30 22:12:487677 EXPECT_FALSE(overrides.OverridesEverything());
Eric Orthc1eb1292018-10-09 22:07:077678
7679 resolver_->SetDnsConfigOverrides(overrides);
7680
Eric Orth394db1732019-08-27 20:09:397681 const DnsConfig* overridden_config = client_ptr->GetEffectiveConfig();
7682 ASSERT_TRUE(overridden_config);
Eric Orthc1eb1292018-10-09 22:07:077683 EXPECT_EQ(nameservers, overridden_config->nameservers);
7684 EXPECT_EQ(original_config.search, overridden_config->search);
7685 EXPECT_EQ(original_config.hosts, overridden_config->hosts);
7686 EXPECT_TRUE(overridden_config->append_to_multi_label_name);
Eric Orthc1eb1292018-10-09 22:07:077687 EXPECT_EQ(original_config.ndots, overridden_config->ndots);
Eric Orthb22f6b42020-10-05 20:44:047688 EXPECT_EQ(original_config.fallback_period,
7689 overridden_config->fallback_period);
Eric Orthc1eb1292018-10-09 22:07:077690 EXPECT_EQ(original_config.attempts, overridden_config->attempts);
7691 EXPECT_TRUE(overridden_config->rotate);
7692 EXPECT_FALSE(overridden_config->use_local_ipv6);
7693 EXPECT_EQ(original_config.dns_over_https_servers,
7694 overridden_config->dns_over_https_servers);
dalykbd726ee2019-05-30 01:44:067695 EXPECT_EQ(original_config.secure_dns_mode,
7696 overridden_config->secure_dns_mode);
Eric Orthc1eb1292018-10-09 22:07:077697}
7698
7699// Test that overridden configs are reapplied over a changed underlying system
7700// config.
Eric Orth960e7062019-03-08 18:43:547701TEST_F(HostResolverManagerDnsTest, SetDnsConfigOverrides_NewConfig) {
Eric Orth394db1732019-08-27 20:09:397702 // Use a real DnsClient to test config-handling behavior.
7703 AlwaysFailSocketFactory socket_factory;
Anna Malovaf817b39b62020-03-02 18:38:007704 auto client =
7705 DnsClient::CreateClientForTesting(nullptr /* net_log */, &socket_factory,
7706 base::BindRepeating(&base::RandInt));
Eric Orth394db1732019-08-27 20:09:397707 DnsClient* client_ptr = client.get();
7708 resolver_->SetDnsClientForTesting(std::move(client));
7709
Eric Orthc1eb1292018-10-09 22:07:077710 DnsConfig original_config = CreateValidDnsConfig();
7711 ChangeDnsConfig(original_config);
7712
7713 // Confirm pre-override state.
Eric Orth394db1732019-08-27 20:09:397714 ASSERT_EQ(original_config, *client_ptr->GetEffectiveConfig());
Eric Orthc1eb1292018-10-09 22:07:077715
7716 DnsConfigOverrides overrides;
7717 const std::vector<IPEndPoint> nameservers = {
7718 CreateExpected("192.168.0.2", 192)};
7719 overrides.nameservers = nameservers;
7720
7721 resolver_->SetDnsConfigOverrides(overrides);
Eric Orth394db1732019-08-27 20:09:397722 ASSERT_TRUE(client_ptr->GetEffectiveConfig());
7723 ASSERT_EQ(nameservers, client_ptr->GetEffectiveConfig()->nameservers);
Eric Orthc1eb1292018-10-09 22:07:077724
7725 DnsConfig new_config = original_config;
7726 new_config.attempts = 103;
7727 ASSERT_NE(nameservers, new_config.nameservers);
7728 ChangeDnsConfig(new_config);
7729
Eric Orth394db1732019-08-27 20:09:397730 const DnsConfig* overridden_config = client_ptr->GetEffectiveConfig();
7731 ASSERT_TRUE(overridden_config);
Eric Orthc1eb1292018-10-09 22:07:077732 EXPECT_EQ(nameservers, overridden_config->nameservers);
7733 EXPECT_EQ(new_config.attempts, overridden_config->attempts);
7734}
7735
Eric Orth960e7062019-03-08 18:43:547736TEST_F(HostResolverManagerDnsTest, SetDnsConfigOverrides_ClearOverrides) {
Eric Orth394db1732019-08-27 20:09:397737 // Use a real DnsClient to test config-handling behavior.
7738 AlwaysFailSocketFactory socket_factory;
Anna Malovaf817b39b62020-03-02 18:38:007739 auto client =
7740 DnsClient::CreateClientForTesting(nullptr /* net_log */, &socket_factory,
7741 base::BindRepeating(&base::RandInt));
Eric Orth394db1732019-08-27 20:09:397742 DnsClient* client_ptr = client.get();
7743 resolver_->SetDnsClientForTesting(std::move(client));
7744
Eric Orthc1eb1292018-10-09 22:07:077745 DnsConfig original_config = CreateValidDnsConfig();
7746 ChangeDnsConfig(original_config);
7747
7748 DnsConfigOverrides overrides;
7749 overrides.attempts = 245;
7750 resolver_->SetDnsConfigOverrides(overrides);
7751
Eric Orth394db1732019-08-27 20:09:397752 ASSERT_THAT(client_ptr->GetEffectiveConfig(),
7753 testing::Not(testing::Pointee(original_config)));
Eric Orthc1eb1292018-10-09 22:07:077754
7755 resolver_->SetDnsConfigOverrides(DnsConfigOverrides());
Eric Orth394db1732019-08-27 20:09:397756 EXPECT_THAT(client_ptr->GetEffectiveConfig(),
7757 testing::Pointee(original_config));
Eric Orthc1eb1292018-10-09 22:07:077758}
dalykf93a48e372019-09-04 02:57:597759
Eric Ortha3559ca2019-09-05 23:40:547760TEST_F(HostResolverManagerDnsTest, SetDnsConfigOverrides_NoChange) {
7761 test::ScopedMockNetworkChangeNotifier mock_network_change_notifier;
7762 TestDnsObserver config_observer;
7763 NetworkChangeNotifier::AddDNSObserver(&config_observer);
7764
7765 // Use a real DnsClient to test config-handling behavior.
7766 AlwaysFailSocketFactory socket_factory;
Anna Malovaf817b39b62020-03-02 18:38:007767 auto client =
7768 DnsClient::CreateClientForTesting(nullptr /* net_log */, &socket_factory,
7769 base::BindRepeating(&base::RandInt));
Eric Ortha3559ca2019-09-05 23:40:547770 DnsClient* client_ptr = client.get();
7771 resolver_->SetDnsClientForTesting(std::move(client));
7772
7773 DnsConfig original_config = CreateValidDnsConfig();
7774 ChangeDnsConfig(original_config);
7775
7776 // Confirm pre-override state.
7777 ASSERT_EQ(original_config, *client_ptr->GetEffectiveConfig());
7778
7779 DnsConfigOverrides overrides;
7780 overrides.nameservers = original_config.nameservers;
7781
7782 EXPECT_EQ(0, config_observer.dns_changed_calls());
7783
7784 resolver_->SetDnsConfigOverrides(overrides);
7785 EXPECT_THAT(client_ptr->GetEffectiveConfig(),
7786 testing::Pointee(original_config));
7787
7788 base::RunLoop().RunUntilIdle(); // Notifications are async.
7789 EXPECT_EQ(0,
7790 config_observer.dns_changed_calls()); // No expected notification
7791
7792 NetworkChangeNotifier::RemoveDNSObserver(&config_observer);
7793}
7794
7795// No effect or notifications expected using partial overrides without a base
7796// system config.
7797TEST_F(HostResolverManagerDnsTest, NoBaseConfig_PartialOverrides) {
7798 test::ScopedMockNetworkChangeNotifier mock_network_change_notifier;
7799 TestDnsObserver config_observer;
7800 NetworkChangeNotifier::AddDNSObserver(&config_observer);
7801
7802 // Use a real DnsClient to test config-handling behavior.
7803 AlwaysFailSocketFactory socket_factory;
Anna Malovaf817b39b62020-03-02 18:38:007804 auto client =
7805 DnsClient::CreateClientForTesting(nullptr /* net_log */, &socket_factory,
7806 base::BindRepeating(&base::RandInt));
Eric Ortha3559ca2019-09-05 23:40:547807 DnsClient* client_ptr = client.get();
7808 resolver_->SetDnsClientForTesting(std::move(client));
7809
Anton Bikineev068d2912021-05-15 20:43:527810 client_ptr->SetSystemConfig(absl::nullopt);
Eric Ortha3559ca2019-09-05 23:40:547811
7812 DnsConfigOverrides overrides;
7813 overrides.nameservers.emplace({CreateExpected("192.168.0.3", 193)});
7814 resolver_->SetDnsConfigOverrides(overrides);
7815 base::RunLoop().RunUntilIdle(); // Potential notifications are async.
7816
7817 EXPECT_FALSE(client_ptr->GetEffectiveConfig());
7818 EXPECT_EQ(0, config_observer.dns_changed_calls());
7819
7820 NetworkChangeNotifier::RemoveDNSObserver(&config_observer);
7821}
7822
7823TEST_F(HostResolverManagerDnsTest, NoBaseConfig_OverridesEverything) {
7824 test::ScopedMockNetworkChangeNotifier mock_network_change_notifier;
7825 TestDnsObserver config_observer;
7826 NetworkChangeNotifier::AddDNSObserver(&config_observer);
7827
7828 // Use a real DnsClient to test config-handling behavior.
7829 AlwaysFailSocketFactory socket_factory;
Anna Malovaf817b39b62020-03-02 18:38:007830 auto client =
7831 DnsClient::CreateClientForTesting(nullptr /* net_log */, &socket_factory,
7832 base::BindRepeating(&base::RandInt));
Eric Ortha3559ca2019-09-05 23:40:547833 DnsClient* client_ptr = client.get();
7834 resolver_->SetDnsClientForTesting(std::move(client));
7835
Anton Bikineev068d2912021-05-15 20:43:527836 client_ptr->SetSystemConfig(absl::nullopt);
Eric Ortha3559ca2019-09-05 23:40:547837
7838 DnsConfigOverrides overrides =
7839 DnsConfigOverrides::CreateOverridingEverythingWithDefaults();
7840 const std::vector<IPEndPoint> nameservers = {
7841 CreateExpected("192.168.0.4", 194)};
7842 overrides.nameservers = nameservers;
7843 resolver_->SetDnsConfigOverrides(overrides);
7844 base::RunLoop().RunUntilIdle(); // Notifications are async.
7845
7846 DnsConfig expected;
7847 expected.nameservers = nameservers;
7848
7849 EXPECT_THAT(client_ptr->GetEffectiveConfig(), testing::Pointee(expected));
7850 EXPECT_EQ(1, config_observer.dns_changed_calls());
7851
7852 NetworkChangeNotifier::RemoveDNSObserver(&config_observer);
7853}
7854
dalykf93a48e372019-09-04 02:57:597855TEST_F(HostResolverManagerDnsTest, DohMapping) {
7856 // Use a real DnsClient to test config-handling behavior.
7857 AlwaysFailSocketFactory socket_factory;
Anna Malovaf817b39b62020-03-02 18:38:007858 auto client =
7859 DnsClient::CreateClientForTesting(nullptr /* net_log */, &socket_factory,
7860 base::BindRepeating(&base::RandInt));
dalykf93a48e372019-09-04 02:57:597861 DnsClient* client_ptr = client.get();
7862 resolver_->SetDnsClientForTesting(std::move(client));
7863
7864 // Create a DnsConfig containing IP addresses associated with Cloudflare,
7865 // SafeBrowsing family filter, SafeBrowsing security filter, and other IPs
7866 // not associated with hardcoded DoH services.
7867 DnsConfig original_config = CreateUpgradableDnsConfig();
7868 ChangeDnsConfig(original_config);
7869
7870 const DnsConfig* fetched_config = client_ptr->GetEffectiveConfig();
7871 EXPECT_EQ(original_config.nameservers, fetched_config->nameservers);
Eric Orthc63cf502020-04-03 21:21:277872 std::vector<DnsOverHttpsServerConfig> expected_doh_servers = {
dalykf93a48e372019-09-04 02:57:597873 {"https://chrome.cloudflare-dns.com/dns-query", true /* use-post */},
7874 {"https://doh.cleanbrowsing.org/doh/family-filter{?dns}",
7875 false /* use_post */},
7876 {"https://doh.cleanbrowsing.org/doh/security-filter{?dns}",
7877 false /* use_post */}};
7878 EXPECT_EQ(expected_doh_servers, fetched_config->dns_over_https_servers);
7879}
7880
7881TEST_F(HostResolverManagerDnsTest, DohMappingDisabled) {
7882 // Use a real DnsClient to test config-handling behavior.
7883 AlwaysFailSocketFactory socket_factory;
Anna Malovaf817b39b62020-03-02 18:38:007884 auto client =
7885 DnsClient::CreateClientForTesting(nullptr /* net_log */, &socket_factory,
7886 base::BindRepeating(&base::RandInt));
dalykf93a48e372019-09-04 02:57:597887 DnsClient* client_ptr = client.get();
7888 resolver_->SetDnsClientForTesting(std::move(client));
7889
7890 // Create a DnsConfig containing IP addresses associated with Cloudflare,
7891 // SafeBrowsing family filter, SafeBrowsing security filter, and other IPs
7892 // not associated with hardcoded DoH services.
7893 DnsConfig original_config = CreateUpgradableDnsConfig();
7894 original_config.allow_dns_over_https_upgrade = false;
7895 ChangeDnsConfig(original_config);
7896
7897 const DnsConfig* fetched_config = client_ptr->GetEffectiveConfig();
7898 EXPECT_EQ(original_config.nameservers, fetched_config->nameservers);
Eric Orthc63cf502020-04-03 21:21:277899 std::vector<DnsOverHttpsServerConfig> expected_doh_servers = {};
dalykf93a48e372019-09-04 02:57:597900 EXPECT_EQ(expected_doh_servers, fetched_config->dns_over_https_servers);
7901}
7902
7903TEST_F(HostResolverManagerDnsTest, DohMappingModeIneligibleForUpgrade) {
7904 // Use a real DnsClient to test config-handling behavior.
7905 AlwaysFailSocketFactory socket_factory;
Anna Malovaf817b39b62020-03-02 18:38:007906 auto client =
7907 DnsClient::CreateClientForTesting(nullptr /* net_log */, &socket_factory,
7908 base::BindRepeating(&base::RandInt));
dalykf93a48e372019-09-04 02:57:597909 DnsClient* client_ptr = client.get();
7910 resolver_->SetDnsClientForTesting(std::move(client));
7911
7912 // Create a DnsConfig containing IP addresses associated with Cloudflare,
7913 // SafeBrowsing family filter, SafeBrowsing security filter, and other IPs
7914 // not associated with hardcoded DoH services.
7915 DnsConfig original_config = CreateUpgradableDnsConfig();
Eric Ortha093b092020-09-24 23:13:027916 original_config.secure_dns_mode = SecureDnsMode::kSecure;
dalykf93a48e372019-09-04 02:57:597917 ChangeDnsConfig(original_config);
7918
7919 const DnsConfig* fetched_config = client_ptr->GetEffectiveConfig();
7920 EXPECT_EQ(original_config.nameservers, fetched_config->nameservers);
Eric Orthc63cf502020-04-03 21:21:277921 std::vector<DnsOverHttpsServerConfig> expected_doh_servers = {};
dalykf93a48e372019-09-04 02:57:597922 EXPECT_EQ(expected_doh_servers, fetched_config->dns_over_https_servers);
7923}
7924
dalykab129e52020-03-11 23:31:327925TEST_F(HostResolverManagerDnsTest,
7926 DohMappingUnhandledOptionsIneligibleForUpgrade) {
7927 // Use a real DnsClient to test config-handling behavior.
7928 AlwaysFailSocketFactory socket_factory;
7929 auto client =
7930 DnsClient::CreateClientForTesting(nullptr /* net_log */, &socket_factory,
7931 base::BindRepeating(&base::RandInt));
7932 DnsClient* client_ptr = client.get();
7933 resolver_->SetDnsClientForTesting(std::move(client));
7934
7935 // Create a DnsConfig containing IP addresses associated with Cloudflare,
7936 // SafeBrowsing family filter, SafeBrowsing security filter, and other IPs
7937 // not associated with hardcoded DoH services.
7938 DnsConfig original_config = CreateUpgradableDnsConfig();
7939 original_config.unhandled_options = true;
7940 ChangeDnsConfig(original_config);
7941
7942 EXPECT_FALSE(client_ptr->GetEffectiveConfig());
7943}
7944
dalykf93a48e372019-09-04 02:57:597945TEST_F(HostResolverManagerDnsTest, DohMappingWithExclusion) {
7946 // Use a real DnsClient to test config-handling behavior.
7947 AlwaysFailSocketFactory socket_factory;
Anna Malovaf817b39b62020-03-02 18:38:007948 auto client =
7949 DnsClient::CreateClientForTesting(nullptr /* net_log */, &socket_factory,
7950 base::BindRepeating(&base::RandInt));
dalykf93a48e372019-09-04 02:57:597951 DnsClient* client_ptr = client.get();
7952 resolver_->SetDnsClientForTesting(std::move(client));
7953
7954 // Create a DnsConfig containing IP addresses associated with Cloudflare,
7955 // SafeBrowsing family filter, SafeBrowsing security filter, and other IPs
7956 // not associated with hardcoded DoH services.
7957 DnsConfig original_config = CreateUpgradableDnsConfig();
7958 original_config.disabled_upgrade_providers = {"CleanBrowsingSecure",
7959 "Cloudflare", "Unexpected"};
7960 ChangeDnsConfig(original_config);
7961
7962 // A DoH upgrade should be attempted on the DNS servers in the config, but
7963 // only for permitted providers.
7964 const DnsConfig* fetched_config = client_ptr->GetEffectiveConfig();
7965 EXPECT_EQ(original_config.nameservers, fetched_config->nameservers);
Eric Orthc63cf502020-04-03 21:21:277966 std::vector<DnsOverHttpsServerConfig> expected_doh_servers = {
dalykf93a48e372019-09-04 02:57:597967 {"https://doh.cleanbrowsing.org/doh/family-filter{?dns}",
7968 false /* use_post */}};
7969 EXPECT_EQ(expected_doh_servers, fetched_config->dns_over_https_servers);
7970}
7971
7972TEST_F(HostResolverManagerDnsTest, DohMappingIgnoredIfTemplateSpecified) {
7973 // Use a real DnsClient to test config-handling behavior.
7974 AlwaysFailSocketFactory socket_factory;
Anna Malovaf817b39b62020-03-02 18:38:007975 auto client =
7976 DnsClient::CreateClientForTesting(nullptr /* net_log */, &socket_factory,
7977 base::BindRepeating(&base::RandInt));
dalykf93a48e372019-09-04 02:57:597978 DnsClient* client_ptr = client.get();
7979 resolver_->SetDnsClientForTesting(std::move(client));
7980
7981 // Create a DnsConfig containing IP addresses associated with Cloudflare,
7982 // SafeBrowsing family filter, SafeBrowsing security filter, and other IPs
7983 // not associated with hardcoded DoH services.
7984 DnsConfig original_config = CreateUpgradableDnsConfig();
7985 ChangeDnsConfig(original_config);
7986
7987 // If the overrides contains DoH servers, no DoH upgrade should be attempted.
7988 DnsConfigOverrides overrides;
Eric Orthc63cf502020-04-03 21:21:277989 const std::vector<DnsOverHttpsServerConfig> dns_over_https_servers_overrides =
7990 {DnsOverHttpsServerConfig("doh.server.override.com", true)};
dalykf93a48e372019-09-04 02:57:597991 overrides.dns_over_https_servers = dns_over_https_servers_overrides;
7992 resolver_->SetDnsConfigOverrides(overrides);
7993 const DnsConfig* fetched_config = client_ptr->GetEffectiveConfig();
7994 EXPECT_EQ(original_config.nameservers, fetched_config->nameservers);
7995 EXPECT_EQ(dns_over_https_servers_overrides,
7996 fetched_config->dns_over_https_servers);
7997}
7998
dalykab129e52020-03-11 23:31:327999TEST_F(HostResolverManagerDnsTest,
8000 DohMappingUnhandledOptionsAndTemplateSpecified) {
8001 // Use a real DnsClient to test config-handling behavior.
8002 AlwaysFailSocketFactory socket_factory;
8003 auto client =
8004 DnsClient::CreateClientForTesting(nullptr /* net_log */, &socket_factory,
8005 base::BindRepeating(&base::RandInt));
8006 DnsClient* client_ptr = client.get();
8007 resolver_->SetDnsClientForTesting(std::move(client));
8008
8009 // Create a DnsConfig containing IP addresses associated with Cloudflare,
8010 // SafeBrowsing family filter, SafeBrowsing security filter, and other IPs
8011 // not associated with hardcoded DoH services.
8012 DnsConfig original_config = CreateUpgradableDnsConfig();
8013 original_config.unhandled_options = true;
8014 ChangeDnsConfig(original_config);
8015
8016 // If the overrides contains DoH servers, no DoH upgrade should be attempted.
8017 DnsConfigOverrides overrides;
Eric Orthc63cf502020-04-03 21:21:278018 const std::vector<DnsOverHttpsServerConfig> dns_over_https_servers_overrides =
8019 {DnsOverHttpsServerConfig("doh.server.override.com", true)};
dalykab129e52020-03-11 23:31:328020 overrides.dns_over_https_servers = dns_over_https_servers_overrides;
8021 resolver_->SetDnsConfigOverrides(overrides);
8022 const DnsConfig* fetched_config = client_ptr->GetEffectiveConfig();
8023 EXPECT_TRUE(fetched_config->nameservers.empty());
8024 EXPECT_FALSE(client_ptr->CanUseInsecureDnsTransactions());
8025 EXPECT_EQ(dns_over_https_servers_overrides,
8026 fetched_config->dns_over_https_servers);
8027 EXPECT_TRUE(client_ptr->CanUseSecureDnsTransactions());
8028}
8029
dalykf93a48e372019-09-04 02:57:598030TEST_F(HostResolverManagerDnsTest, DohMappingWithAutomaticDot) {
8031 // Use a real DnsClient to test config-handling behavior.
8032 AlwaysFailSocketFactory socket_factory;
Anna Malovaf817b39b62020-03-02 18:38:008033 auto client =
8034 DnsClient::CreateClientForTesting(nullptr /* net_log */, &socket_factory,
8035 base::BindRepeating(&base::RandInt));
dalykf93a48e372019-09-04 02:57:598036 DnsClient* client_ptr = client.get();
8037 resolver_->SetDnsClientForTesting(std::move(client));
8038
8039 // Create a DnsConfig containing IP addresses associated with Cloudflare,
8040 // SafeBrowsing family filter, SafeBrowsing security filter, and other IPs
8041 // not associated with hardcoded DoH services.
8042 DnsConfig original_config = CreateUpgradableDnsConfig();
8043 original_config.dns_over_tls_active = true;
8044 ChangeDnsConfig(original_config);
8045
8046 const DnsConfig* fetched_config = client_ptr->GetEffectiveConfig();
8047 EXPECT_EQ(original_config.nameservers, fetched_config->nameservers);
Eric Orthc63cf502020-04-03 21:21:278048 std::vector<DnsOverHttpsServerConfig> expected_doh_servers = {
dalykf93a48e372019-09-04 02:57:598049 {"https://chrome.cloudflare-dns.com/dns-query", true /* use-post */},
8050 {"https://doh.cleanbrowsing.org/doh/family-filter{?dns}",
8051 false /* use_post */},
8052 {"https://doh.cleanbrowsing.org/doh/security-filter{?dns}",
8053 false /* use_post */}};
8054 EXPECT_EQ(expected_doh_servers, fetched_config->dns_over_https_servers);
8055}
8056
8057TEST_F(HostResolverManagerDnsTest, DohMappingWithStrictDot) {
8058 // Use a real DnsClient to test config-handling behavior.
8059 AlwaysFailSocketFactory socket_factory;
Anna Malovaf817b39b62020-03-02 18:38:008060 auto client =
8061 DnsClient::CreateClientForTesting(nullptr /* net_log */, &socket_factory,
8062 base::BindRepeating(&base::RandInt));
dalykf93a48e372019-09-04 02:57:598063 DnsClient* client_ptr = client.get();
8064 resolver_->SetDnsClientForTesting(std::move(client));
8065
8066 // Create a DnsConfig containing IP addresses associated with Cloudflare,
8067 // SafeBrowsing family filter, SafeBrowsing security filter, and other IPs
8068 // not associated with hardcoded DoH services.
8069 DnsConfig original_config = CreateUpgradableDnsConfig();
Eric Ortha093b092020-09-24 23:13:028070 original_config.secure_dns_mode = SecureDnsMode::kAutomatic;
dalykf93a48e372019-09-04 02:57:598071 original_config.dns_over_tls_active = true;
8072
8073 // Google DoT hostname
8074 original_config.dns_over_tls_hostname = "dns.google";
8075 ChangeDnsConfig(original_config);
8076 const DnsConfig* fetched_config = client_ptr->GetEffectiveConfig();
8077 EXPECT_EQ(original_config.nameservers, fetched_config->nameservers);
Eric Orthc63cf502020-04-03 21:21:278078 std::vector<DnsOverHttpsServerConfig> expected_doh_servers = {
dalykf93a48e372019-09-04 02:57:598079 {"https://dns.google/dns-query{?dns}", false /* use_post */}};
8080 EXPECT_EQ(expected_doh_servers, fetched_config->dns_over_https_servers);
8081}
8082
Eric Orth394db1732019-08-27 20:09:398083#endif // !defined(OS_IOS)
Eric Orthc1eb1292018-10-09 22:07:078084
Eric Orth37b18192019-04-22 19:09:288085TEST_F(HostResolverManagerDnsTest, FlushCacheOnDnsConfigOverridesChange) {
8086 ChangeDnsConfig(CreateValidDnsConfig());
8087
8088 HostResolver::ResolveHostParameters local_source_parameters;
8089 local_source_parameters.source = HostResolverSource::LOCAL_ONLY;
8090
8091 // Populate cache.
8092 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558093 HostPortPair("ok", 70), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:528094 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth37b18192019-04-22 19:09:288095 EXPECT_THAT(initial_response.result_error(), IsOk());
8096
8097 // Confirm result now cached.
8098 ResolveHostResponseHelper cached_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558099 HostPortPair("ok", 75), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:508100 local_source_parameters, resolve_context_.get(),
8101 resolve_context_->host_cache()));
Eric Orth37b18192019-04-22 19:09:288102 ASSERT_THAT(cached_response.result_error(), IsOk());
8103 ASSERT_TRUE(cached_response.request()->GetStaleInfo());
8104
8105 // Flush cache by triggering a DnsConfigOverrides change.
8106 DnsConfigOverrides overrides;
8107 overrides.attempts = 4;
8108 resolver_->SetDnsConfigOverrides(overrides);
8109
8110 // Expect no longer cached
8111 ResolveHostResponseHelper flushed_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558112 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:508113 local_source_parameters, resolve_context_.get(),
8114 resolve_context_->host_cache()));
Eric Orth37b18192019-04-22 19:09:288115 EXPECT_THAT(flushed_response.result_error(), IsError(ERR_DNS_CACHE_MISS));
8116}
8117
Eric Orthaf82b49a2020-02-01 01:48:508118TEST_F(HostResolverManagerDnsTest,
8119 FlushContextSessionDataOnDnsConfigOverridesChange) {
8120 ChangeDnsConfig(CreateValidDnsConfig());
8121
8122 DnsSession* session_before = dns_client_->GetCurrentSession();
Eric Orthafa35442020-02-28 22:09:528123 resolve_context_->RecordServerSuccess(
8124 0u /* server_index */, true /* is_doh_server */, session_before);
Eric Orthaf82b49a2020-02-01 01:48:508125 ASSERT_TRUE(resolve_context_->GetDohServerAvailability(0u, session_before));
8126
8127 // Flush data by triggering a DnsConfigOverrides change.
8128 DnsConfigOverrides overrides;
8129 overrides.attempts = 4;
8130 resolver_->SetDnsConfigOverrides(overrides);
8131
8132 DnsSession* session_after = dns_client_->GetCurrentSession();
8133 EXPECT_NE(session_before, session_after);
8134
8135 EXPECT_FALSE(resolve_context_->GetDohServerAvailability(0u, session_after));
8136
8137 // Confirm new session is in use.
Eric Orthafa35442020-02-28 22:09:528138 resolve_context_->RecordServerSuccess(
8139 0u /* server_index */, true /* is_doh_server */, session_after);
Eric Orthaf82b49a2020-02-01 01:48:508140 EXPECT_TRUE(resolve_context_->GetDohServerAvailability(0u, session_after));
8141}
8142
Eric Orthc823a23d2018-10-30 22:12:488143// Test that even when using config overrides, a change to the base system
8144// config cancels pending requests.
Eric Orth960e7062019-03-08 18:43:548145TEST_F(HostResolverManagerDnsTest, CancellationOnBaseConfigChange) {
Eric Orthc823a23d2018-10-30 22:12:488146 DnsConfig original_config = CreateValidDnsConfig();
8147 ChangeDnsConfig(original_config);
8148
8149 DnsConfigOverrides overrides;
8150 overrides.nameservers.emplace({CreateExpected("123.123.123.123", 80)});
8151 ASSERT_FALSE(overrides.OverridesEverything());
8152 resolver_->SetDnsConfigOverrides(overrides);
8153
Eric Orth117e1992019-04-17 00:24:158154 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558155 HostPortPair("4slow_ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:528156 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthc823a23d2018-10-30 22:12:488157 ASSERT_FALSE(response.complete());
8158
8159 DnsConfig new_config = original_config;
8160 new_config.attempts = 103;
8161 ChangeDnsConfig(new_config);
8162
8163 EXPECT_THAT(response.result_error(), IsError(ERR_NETWORK_CHANGED));
8164}
8165
8166// Test that when all configuration is overridden, system configuration changes
8167// do not cancel requests.
Eric Orth960e7062019-03-08 18:43:548168TEST_F(HostResolverManagerDnsTest,
Eric Orthc823a23d2018-10-30 22:12:488169 CancellationOnBaseConfigChange_OverridesEverything) {
8170 DnsConfig original_config = CreateValidDnsConfig();
8171 ChangeDnsConfig(original_config);
8172
8173 DnsConfigOverrides overrides =
8174 DnsConfigOverrides::CreateOverridingEverythingWithDefaults();
8175 overrides.nameservers.emplace({CreateExpected("123.123.123.123", 80)});
8176 ASSERT_TRUE(overrides.OverridesEverything());
8177 resolver_->SetDnsConfigOverrides(overrides);
8178
Eric Orth117e1992019-04-17 00:24:158179 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558180 HostPortPair("4slow_ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:528181 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthc823a23d2018-10-30 22:12:488182 ASSERT_FALSE(response.complete());
8183
8184 DnsConfig new_config = original_config;
8185 new_config.attempts = 103;
8186 ChangeDnsConfig(new_config);
8187
8188 dns_client_->CompleteDelayedTransactions();
8189 EXPECT_THAT(response.result_error(), IsOk());
8190}
8191
Eric Orthc1eb1292018-10-09 22:07:078192// Test that in-progress queries are cancelled on applying new DNS config
8193// overrides, same as receiving a new DnsConfig from the system.
Eric Orth960e7062019-03-08 18:43:548194TEST_F(HostResolverManagerDnsTest, CancelQueriesOnSettingOverrides) {
Eric Orthc1eb1292018-10-09 22:07:078195 ChangeDnsConfig(CreateValidDnsConfig());
Eric Orth117e1992019-04-17 00:24:158196 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558197 HostPortPair("4slow_ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:528198 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthc1eb1292018-10-09 22:07:078199 ASSERT_FALSE(response.complete());
8200
8201 DnsConfigOverrides overrides;
8202 overrides.attempts = 123;
8203 resolver_->SetDnsConfigOverrides(overrides);
8204
8205 EXPECT_THAT(response.result_error(), IsError(ERR_NETWORK_CHANGED));
8206}
8207
8208// Queries should not be cancelled if equal overrides are set.
Eric Orth960e7062019-03-08 18:43:548209TEST_F(HostResolverManagerDnsTest,
8210 CancelQueriesOnSettingOverrides_SameOverrides) {
Eric Orthc1eb1292018-10-09 22:07:078211 ChangeDnsConfig(CreateValidDnsConfig());
8212 DnsConfigOverrides overrides;
8213 overrides.attempts = 123;
8214 resolver_->SetDnsConfigOverrides(overrides);
8215
Eric Orth117e1992019-04-17 00:24:158216 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558217 HostPortPair("4slow_ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:528218 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthc1eb1292018-10-09 22:07:078219 ASSERT_FALSE(response.complete());
8220
8221 resolver_->SetDnsConfigOverrides(overrides);
8222
Eric Orthc823a23d2018-10-30 22:12:488223 dns_client_->CompleteDelayedTransactions();
Eric Orthc1eb1292018-10-09 22:07:078224 EXPECT_THAT(response.result_error(), IsOk());
8225}
8226
8227// Test that in-progress queries are cancelled on clearing DNS config overrides,
8228// same as receiving a new DnsConfig from the system.
Eric Orth960e7062019-03-08 18:43:548229TEST_F(HostResolverManagerDnsTest, CancelQueriesOnClearingOverrides) {
Eric Orthc1eb1292018-10-09 22:07:078230 ChangeDnsConfig(CreateValidDnsConfig());
8231 DnsConfigOverrides overrides;
8232 overrides.attempts = 123;
8233 resolver_->SetDnsConfigOverrides(overrides);
8234
Eric Orth117e1992019-04-17 00:24:158235 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558236 HostPortPair("4slow_ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:528237 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthc1eb1292018-10-09 22:07:078238 ASSERT_FALSE(response.complete());
8239
8240 resolver_->SetDnsConfigOverrides(DnsConfigOverrides());
8241
8242 EXPECT_THAT(response.result_error(), IsError(ERR_NETWORK_CHANGED));
8243}
8244
8245// Queries should not be cancelled on clearing overrides if there were not any
8246// overrides.
Eric Orth960e7062019-03-08 18:43:548247TEST_F(HostResolverManagerDnsTest,
8248 CancelQueriesOnClearingOverrides_NoOverrides) {
Eric Orthc1eb1292018-10-09 22:07:078249 ChangeDnsConfig(CreateValidDnsConfig());
Eric Orth117e1992019-04-17 00:24:158250 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558251 HostPortPair("4slow_ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:528252 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthc1eb1292018-10-09 22:07:078253 ASSERT_FALSE(response.complete());
8254
8255 resolver_->SetDnsConfigOverrides(DnsConfigOverrides());
8256
Eric Orthc823a23d2018-10-30 22:12:488257 dns_client_->CompleteDelayedTransactions();
Eric Orthc1eb1292018-10-09 22:07:078258 EXPECT_THAT(response.result_error(), IsOk());
8259}
8260
Eric Orthaf82b49a2020-02-01 01:48:508261TEST_F(HostResolverManagerDnsTest,
8262 FlushContextSessionDataOnSystemConfigChange) {
8263 DnsConfig original_config = CreateValidDnsConfig();
8264 ChangeDnsConfig(original_config);
8265
8266 DnsSession* session_before = dns_client_->GetCurrentSession();
Eric Orthafa35442020-02-28 22:09:528267 resolve_context_->RecordServerSuccess(
8268 0u /* server_index */, true /* is_doh_server */, session_before);
Eric Orthaf82b49a2020-02-01 01:48:508269 ASSERT_TRUE(resolve_context_->GetDohServerAvailability(0u, session_before));
8270
8271 // Flush data by triggering a config change.
8272 DnsConfig new_config = original_config;
8273 new_config.attempts = 103;
8274 ChangeDnsConfig(new_config);
8275
8276 DnsSession* session_after = dns_client_->GetCurrentSession();
8277 EXPECT_NE(session_before, session_after);
8278
8279 EXPECT_FALSE(resolve_context_->GetDohServerAvailability(0u, session_after));
8280
8281 // Confirm new session is in use.
Eric Orthafa35442020-02-28 22:09:528282 resolve_context_->RecordServerSuccess(
8283 0u /* server_index */, true /* is_doh_server */, session_after);
Eric Orthaf82b49a2020-02-01 01:48:508284 EXPECT_TRUE(resolve_context_->GetDohServerAvailability(0u, session_after));
8285}
8286
Eric Orth960e7062019-03-08 18:43:548287TEST_F(HostResolverManagerDnsTest, TxtQuery) {
Eric Orth828bd3ae2018-12-12 17:30:368288 // Simulate two separate DNS records, each with multiple strings.
8289 std::vector<std::string> foo_records = {"foo1", "foo2", "foo3"};
8290 std::vector<std::string> bar_records = {"bar1", "bar2"};
8291 std::vector<std::vector<std::string>> text_records = {foo_records,
8292 bar_records};
8293
8294 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:138295 rules.emplace_back("host", dns_protocol::kTypeTXT, false /* secure */,
dalykc0ab0722019-03-14 17:00:588296 MockDnsClientRule::Result(BuildTestDnsTextResponse(
8297 "host", std::move(text_records))),
Eric Orth828bd3ae2018-12-12 17:30:368298 false /* delay */);
8299
8300 CreateResolver();
8301 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8302
Eric Orth55d10c62020-10-05 22:31:248303 EXPECT_EQ(resolve_context_->host_cache()->size(), 0u);
8304
Eric Orth828bd3ae2018-12-12 17:30:368305 HostResolver::ResolveHostParameters parameters;
8306 parameters.dns_query_type = DnsQueryType::TXT;
8307
Eric Orth117e1992019-04-17 00:24:158308 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558309 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:508310 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth828bd3ae2018-12-12 17:30:368311 EXPECT_THAT(response.result_error(), IsOk());
8312 EXPECT_FALSE(response.request()->GetAddressResults());
8313 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth7139e0552020-11-04 02:41:118314 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Eric Orth828bd3ae2018-12-12 17:30:368315
8316 // Order between separate DNS records is undefined, but each record should
8317 // stay in order as that order may be meaningful.
8318 ASSERT_THAT(response.request()->GetTextResults(),
8319 testing::Optional(testing::UnorderedElementsAre(
8320 "foo1", "foo2", "foo3", "bar1", "bar2")));
8321 std::vector<std::string> results =
8322 response.request()->GetTextResults().value();
8323 EXPECT_NE(results.end(), std::search(results.begin(), results.end(),
8324 foo_records.begin(), foo_records.end()));
8325 EXPECT_NE(results.end(), std::search(results.begin(), results.end(),
8326 bar_records.begin(), bar_records.end()));
Eric Orth55d10c62020-10-05 22:31:248327
8328 // Expect result to be cached.
8329 EXPECT_EQ(resolve_context_->host_cache()->size(), 1u);
8330 parameters.source = HostResolverSource::LOCAL_ONLY;
8331 ResolveHostResponseHelper cached_response(resolver_->CreateRequest(
8332 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
8333 parameters, resolve_context_.get(), resolve_context_->host_cache()));
8334 EXPECT_THAT(cached_response.result_error(), IsOk());
8335 ASSERT_THAT(cached_response.request()->GetTextResults(),
8336 testing::Optional(testing::UnorderedElementsAre(
8337 "foo1", "foo2", "foo3", "bar1", "bar2")));
8338 results = cached_response.request()->GetTextResults().value();
8339 EXPECT_NE(results.end(), std::search(results.begin(), results.end(),
8340 foo_records.begin(), foo_records.end()));
8341 EXPECT_NE(results.end(), std::search(results.begin(), results.end(),
8342 bar_records.begin(), bar_records.end()));
Eric Orth828bd3ae2018-12-12 17:30:368343}
8344
Eric Orth03e29cc2021-07-13 18:18:258345TEST_F(HostResolverManagerDnsTest, TxtQueryRejectsIpLiteral) {
8346 MockDnsClientRuleList rules;
8347
8348 // Entry that would resolve if DNS is mistakenly queried to ensure that does
8349 // not happen.
8350 rules.emplace_back("8.8.8.8", dns_protocol::kTypeTXT, /*secure=*/false,
8351 MockDnsClientRule::Result(
8352 BuildTestDnsTextResponse("8.8.8.8", {{"text"}})),
8353 /*delay=*/false);
8354
8355 CreateResolver();
8356 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8357
8358 HostResolver::ResolveHostParameters parameters;
8359 parameters.dns_query_type = DnsQueryType::TXT;
8360
8361 ResolveHostResponseHelper response(resolver_->CreateRequest(
8362 HostPortPair("8.8.8.8", 108), NetworkIsolationKey(), NetLogWithSource(),
8363 parameters, resolve_context_.get(), resolve_context_->host_cache()));
8364 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
8365 EXPECT_FALSE(response.request()->GetAddressResults());
8366 EXPECT_FALSE(response.request()->GetTextResults());
8367 EXPECT_FALSE(response.request()->GetHostnameResults());
8368 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
8369}
8370
Eric Orth3b26e3ba2020-11-12 22:43:138371// Test that TXT records can be extracted from a response that also contains
8372// unrecognized record types.
8373TEST_F(HostResolverManagerDnsTest, TxtQuery_MixedWithUnrecognizedType) {
8374 std::vector<std::string> text_strings = {"foo"};
8375
8376 MockDnsClientRuleList rules;
8377 rules.emplace_back(
8378 "host", dns_protocol::kTypeTXT, false /* secure */,
8379 MockDnsClientRule::Result(BuildTestDnsResponse(
8380 "host", dns_protocol::kTypeTXT,
8381 {BuildTestDnsRecord("host", 3u /* type */, "fake rdata 1"),
8382 BuildTestTextRecord("host", std::move(text_strings)),
8383 BuildTestDnsRecord("host", 3u /* type */, "fake rdata 2")})),
8384 false /* delay */);
8385
8386 CreateResolver();
8387 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8388
8389 HostResolver::ResolveHostParameters parameters;
8390 parameters.dns_query_type = DnsQueryType::TXT;
8391
8392 ResolveHostResponseHelper response(resolver_->CreateRequest(
8393 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
8394 parameters, resolve_context_.get(), resolve_context_->host_cache()));
8395 EXPECT_THAT(response.result_error(), IsOk());
8396 EXPECT_FALSE(response.request()->GetAddressResults());
8397 EXPECT_FALSE(response.request()->GetHostnameResults());
8398 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
8399
8400 EXPECT_THAT(response.request()->GetTextResults(),
8401 testing::Optional(testing::ElementsAre("foo")));
8402}
8403
dalykc27699a2019-07-29 20:53:298404TEST_F(HostResolverManagerDnsTest, TxtQuery_InvalidConfig) {
8405 set_allow_fallback_to_proctask(false);
8406 // Set empty DnsConfig.
Eric Orthfe6d5482019-09-03 18:27:578407 InvalidateDnsConfig();
dalykc27699a2019-07-29 20:53:298408
8409 HostResolver::ResolveHostParameters parameters;
8410 parameters.dns_query_type = DnsQueryType::TXT;
8411
8412 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558413 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:508414 parameters, resolve_context_.get(), resolve_context_->host_cache()));
dalykc27699a2019-07-29 20:53:298415 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_CACHE_MISS));
8416}
8417
Eric Orth960e7062019-03-08 18:43:548418TEST_F(HostResolverManagerDnsTest, TxtQuery_NonexistentDomain) {
Eric Orth828bd3ae2018-12-12 17:30:368419 // Setup fallback to confirm it is not used for non-address results.
8420 set_allow_fallback_to_proctask(true);
8421 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
8422 proc_->SignalMultiple(1u);
8423
8424 MockDnsClientRuleList rules;
Peter Kastingd039b772021-08-18 00:06:208425 rules.emplace_back(
8426 "host", dns_protocol::kTypeTXT, false /* secure */,
8427 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kNoDomain),
8428 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:368429
8430 CreateResolver();
8431 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8432
Eric Orth55d10c62020-10-05 22:31:248433 EXPECT_EQ(resolve_context_->host_cache()->size(), 0u);
8434
Eric Orth828bd3ae2018-12-12 17:30:368435 HostResolver::ResolveHostParameters parameters;
8436 parameters.dns_query_type = DnsQueryType::TXT;
8437
Eric Orth117e1992019-04-17 00:24:158438 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558439 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:508440 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth828bd3ae2018-12-12 17:30:368441 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
8442 EXPECT_FALSE(response.request()->GetAddressResults());
8443 EXPECT_FALSE(response.request()->GetTextResults());
8444 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth7139e0552020-11-04 02:41:118445 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Eric Orth55d10c62020-10-05 22:31:248446
8447 // Expect result to be cached.
8448 EXPECT_EQ(resolve_context_->host_cache()->size(), 1u);
8449 parameters.source = HostResolverSource::LOCAL_ONLY;
8450 ResolveHostResponseHelper cached_response(resolver_->CreateRequest(
8451 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
8452 parameters, resolve_context_.get(), resolve_context_->host_cache()));
8453 EXPECT_THAT(cached_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
8454 EXPECT_FALSE(cached_response.request()->GetAddressResults());
8455 EXPECT_FALSE(cached_response.request()->GetTextResults());
8456 EXPECT_FALSE(cached_response.request()->GetHostnameResults());
Eric Orth7139e0552020-11-04 02:41:118457 EXPECT_FALSE(cached_response.request()->GetExperimentalResultsForTesting());
Eric Orth828bd3ae2018-12-12 17:30:368458}
8459
Eric Orth960e7062019-03-08 18:43:548460TEST_F(HostResolverManagerDnsTest, TxtQuery_Failure) {
Eric Orth828bd3ae2018-12-12 17:30:368461 // Setup fallback to confirm it is not used for non-address results.
8462 set_allow_fallback_to_proctask(true);
8463 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
8464 proc_->SignalMultiple(1u);
8465
8466 MockDnsClientRuleList rules;
Peter Kastingd039b772021-08-18 00:06:208467 rules.emplace_back(
8468 "host", dns_protocol::kTypeTXT, false /* secure */,
8469 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kFail),
8470 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:368471
8472 CreateResolver();
8473 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8474
8475 HostResolver::ResolveHostParameters parameters;
8476 parameters.dns_query_type = DnsQueryType::TXT;
8477
Eric Orth117e1992019-04-17 00:24:158478 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558479 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:508480 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth828bd3ae2018-12-12 17:30:368481 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
8482 EXPECT_FALSE(response.request()->GetAddressResults());
8483 EXPECT_FALSE(response.request()->GetTextResults());
8484 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth7139e0552020-11-04 02:41:118485 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Eric Orth55d10c62020-10-05 22:31:248486
8487 // Expect result not cached.
8488 EXPECT_EQ(resolve_context_->host_cache()->size(), 0u);
Eric Orth828bd3ae2018-12-12 17:30:368489}
8490
Eric Orth960e7062019-03-08 18:43:548491TEST_F(HostResolverManagerDnsTest, TxtQuery_Timeout) {
Eric Orth828bd3ae2018-12-12 17:30:368492 // Setup fallback to confirm it is not used for non-address results.
8493 set_allow_fallback_to_proctask(true);
8494 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
8495 proc_->SignalMultiple(1u);
8496
8497 MockDnsClientRuleList rules;
Peter Kastingd039b772021-08-18 00:06:208498 rules.emplace_back(
8499 "host", dns_protocol::kTypeTXT, false /* secure */,
8500 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kTimeout),
8501 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:368502
8503 CreateResolver();
8504 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8505
8506 HostResolver::ResolveHostParameters parameters;
8507 parameters.dns_query_type = DnsQueryType::TXT;
8508
Eric Orth117e1992019-04-17 00:24:158509 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558510 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:508511 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth828bd3ae2018-12-12 17:30:368512 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_TIMED_OUT));
8513 EXPECT_FALSE(response.request()->GetAddressResults());
8514 EXPECT_FALSE(response.request()->GetTextResults());
8515 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth7139e0552020-11-04 02:41:118516 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Eric Orth55d10c62020-10-05 22:31:248517
8518 // Expect result not cached.
8519 EXPECT_EQ(resolve_context_->host_cache()->size(), 0u);
Eric Orth828bd3ae2018-12-12 17:30:368520}
8521
Eric Orth960e7062019-03-08 18:43:548522TEST_F(HostResolverManagerDnsTest, TxtQuery_Empty) {
Eric Orth828bd3ae2018-12-12 17:30:368523 // Setup fallback to confirm it is not used for non-address results.
8524 set_allow_fallback_to_proctask(true);
8525 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
8526 proc_->SignalMultiple(1u);
8527
8528 MockDnsClientRuleList rules;
Peter Kastingd039b772021-08-18 00:06:208529 rules.emplace_back(
8530 "host", dns_protocol::kTypeTXT, false /* secure */,
8531 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kEmpty),
8532 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:368533
8534 CreateResolver();
8535 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8536
Eric Orth55d10c62020-10-05 22:31:248537 EXPECT_EQ(resolve_context_->host_cache()->size(), 0u);
8538
Eric Orth828bd3ae2018-12-12 17:30:368539 HostResolver::ResolveHostParameters parameters;
8540 parameters.dns_query_type = DnsQueryType::TXT;
8541
Eric Orth117e1992019-04-17 00:24:158542 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558543 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:508544 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth828bd3ae2018-12-12 17:30:368545 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
8546 EXPECT_FALSE(response.request()->GetAddressResults());
8547 EXPECT_FALSE(response.request()->GetTextResults());
8548 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth7139e0552020-11-04 02:41:118549 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Eric Orth55d10c62020-10-05 22:31:248550
8551 // Expect result to be cached.
8552 EXPECT_EQ(resolve_context_->host_cache()->size(), 1u);
8553 parameters.source = HostResolverSource::LOCAL_ONLY;
8554 ResolveHostResponseHelper cached_response(resolver_->CreateRequest(
8555 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
8556 parameters, resolve_context_.get(), resolve_context_->host_cache()));
8557 EXPECT_THAT(cached_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
8558 EXPECT_FALSE(cached_response.request()->GetAddressResults());
8559 EXPECT_FALSE(cached_response.request()->GetTextResults());
8560 EXPECT_FALSE(cached_response.request()->GetHostnameResults());
Eric Orth7139e0552020-11-04 02:41:118561 EXPECT_FALSE(cached_response.request()->GetExperimentalResultsForTesting());
Eric Orth828bd3ae2018-12-12 17:30:368562}
8563
Eric Orth960e7062019-03-08 18:43:548564TEST_F(HostResolverManagerDnsTest, TxtQuery_Malformed) {
Eric Orth828bd3ae2018-12-12 17:30:368565 // Setup fallback to confirm it is not used for non-address results.
8566 set_allow_fallback_to_proctask(true);
8567 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
8568 proc_->SignalMultiple(1u);
8569
8570 MockDnsClientRuleList rules;
Peter Kastingd039b772021-08-18 00:06:208571 rules.emplace_back(
8572 "host", dns_protocol::kTypeTXT, false /* secure */,
8573 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kMalformed),
8574 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:368575
8576 CreateResolver();
8577 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8578
8579 HostResolver::ResolveHostParameters parameters;
8580 parameters.dns_query_type = DnsQueryType::TXT;
8581
Eric Orth117e1992019-04-17 00:24:158582 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558583 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:508584 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth828bd3ae2018-12-12 17:30:368585 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE));
8586 EXPECT_FALSE(response.request()->GetAddressResults());
8587 EXPECT_FALSE(response.request()->GetTextResults());
8588 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth7139e0552020-11-04 02:41:118589 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Eric Orth55d10c62020-10-05 22:31:248590
8591 // Expect result not cached.
8592 EXPECT_EQ(resolve_context_->host_cache()->size(), 0u);
Eric Orth828bd3ae2018-12-12 17:30:368593}
8594
Eric Orth960e7062019-03-08 18:43:548595TEST_F(HostResolverManagerDnsTest, TxtQuery_MismatchedName) {
Eric Orth828bd3ae2018-12-12 17:30:368596 std::vector<std::vector<std::string>> text_records = {{"text"}};
8597 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:138598 rules.emplace_back("host", dns_protocol::kTypeTXT, false /* secure */,
dalykc0ab0722019-03-14 17:00:588599 MockDnsClientRule::Result(BuildTestDnsTextResponse(
Eric Orth828bd3ae2018-12-12 17:30:368600 "host", std::move(text_records), "not.host")),
8601 false /* delay */);
8602
8603 CreateResolver();
8604 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8605
8606 HostResolver::ResolveHostParameters parameters;
8607 parameters.dns_query_type = DnsQueryType::TXT;
8608
Eric Orth117e1992019-04-17 00:24:158609 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558610 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:508611 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth828bd3ae2018-12-12 17:30:368612 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE));
8613 EXPECT_FALSE(response.request()->GetAddressResults());
8614 EXPECT_FALSE(response.request()->GetTextResults());
8615 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth7139e0552020-11-04 02:41:118616 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Eric Orth55d10c62020-10-05 22:31:248617
8618 // Expect result not cached.
8619 EXPECT_EQ(resolve_context_->host_cache()->size(), 0u);
Eric Orth828bd3ae2018-12-12 17:30:368620}
8621
Eric Orth960e7062019-03-08 18:43:548622TEST_F(HostResolverManagerDnsTest, TxtQuery_WrongType) {
Eric Orth828bd3ae2018-12-12 17:30:368623 // Respond to a TXT query with an A response.
8624 MockDnsClientRuleList rules;
Eric Orth7139e0552020-11-04 02:41:118625 rules.emplace_back(
8626 "host", dns_protocol::kTypeTXT, false /* secure */,
8627 MockDnsClientRule::Result(BuildTestDnsResponse(
8628 "host", dns_protocol::kTypeTXT,
8629 {BuildTestAddressRecord("host", IPAddress(1, 2, 3, 4))})),
8630 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:368631
8632 CreateResolver();
8633 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8634
8635 HostResolver::ResolveHostParameters parameters;
8636 parameters.dns_query_type = DnsQueryType::TXT;
8637
8638 // Responses for the wrong type should be ignored.
Eric Orth117e1992019-04-17 00:24:158639 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth7139e0552020-11-04 02:41:118640 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:508641 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth828bd3ae2018-12-12 17:30:368642 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
8643 EXPECT_FALSE(response.request()->GetAddressResults());
8644 EXPECT_FALSE(response.request()->GetTextResults());
8645 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth7139e0552020-11-04 02:41:118646 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Eric Orth55d10c62020-10-05 22:31:248647
8648 // Expect result not cached.
8649 EXPECT_EQ(resolve_context_->host_cache()->size(), 0u);
Eric Orth828bd3ae2018-12-12 17:30:368650}
8651
Eric Orth09746312021-05-05 15:44:588652TEST_F(HostResolverManagerDnsTest,
8653 TxtInsecureQueryDisallowedWhenAdditionalTypesDisallowed) {
8654 const std::string kName = "txt.test";
8655
8656 ChangeDnsConfig(CreateValidDnsConfig());
8657 DnsConfigOverrides overrides;
8658 overrides.secure_dns_mode = SecureDnsMode::kOff;
8659 resolver_->SetDnsConfigOverrides(overrides);
8660 resolver_->SetInsecureDnsClientEnabled(
8661 /*enabled=*/true,
8662 /*additional_dns_types_enabled=*/false);
8663
8664 HostResolver::ResolveHostParameters parameters;
8665 parameters.dns_query_type = DnsQueryType::TXT;
8666
8667 ResolveHostResponseHelper response(resolver_->CreateRequest(
8668 HostPortPair(kName, 108), NetworkIsolationKey(), NetLogWithSource(),
8669 parameters, resolve_context_.get(), resolve_context_->host_cache()));
8670 // No non-local work is done, so ERR_DNS_CACHE_MISS is the result.
8671 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_CACHE_MISS));
8672 EXPECT_FALSE(response.request()->GetAddressResults());
8673 EXPECT_FALSE(response.request()->GetHostnameResults());
8674 EXPECT_FALSE(response.request()->GetTextResults());
8675 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
8676}
8677
Eric Ortha625b042019-01-16 01:14:458678// Same as TxtQuery except we specify DNS HostResolverSource instead of relying
8679// on automatic determination. Expect same results since DNS should be what we
8680// automatically determine, but some slightly different logic paths are
8681// involved.
Eric Orth960e7062019-03-08 18:43:548682TEST_F(HostResolverManagerDnsTest, TxtDnsQuery) {
Eric Orth828bd3ae2018-12-12 17:30:368683 // Simulate two separate DNS records, each with multiple strings.
8684 std::vector<std::string> foo_records = {"foo1", "foo2", "foo3"};
8685 std::vector<std::string> bar_records = {"bar1", "bar2"};
8686 std::vector<std::vector<std::string>> text_records = {foo_records,
8687 bar_records};
8688
8689 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:138690 rules.emplace_back("host", dns_protocol::kTypeTXT, false /* secure */,
dalykc0ab0722019-03-14 17:00:588691 MockDnsClientRule::Result(BuildTestDnsTextResponse(
8692 "host", std::move(text_records))),
Eric Orth828bd3ae2018-12-12 17:30:368693 false /* delay */);
8694
8695 CreateResolver();
8696 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8697
Eric Orth55d10c62020-10-05 22:31:248698 EXPECT_EQ(resolve_context_->host_cache()->size(), 0u);
8699
Eric Orth828bd3ae2018-12-12 17:30:368700 HostResolver::ResolveHostParameters parameters;
8701 parameters.source = HostResolverSource::DNS;
8702 parameters.dns_query_type = DnsQueryType::TXT;
8703
Eric Orth117e1992019-04-17 00:24:158704 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558705 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:508706 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth828bd3ae2018-12-12 17:30:368707 EXPECT_THAT(response.result_error(), IsOk());
8708 EXPECT_FALSE(response.request()->GetAddressResults());
8709 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth7139e0552020-11-04 02:41:118710 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Eric Orth828bd3ae2018-12-12 17:30:368711
8712 // Order between separate DNS records is undefined, but each record should
8713 // stay in order as that order may be meaningful.
8714 ASSERT_THAT(response.request()->GetTextResults(),
8715 testing::Optional(testing::UnorderedElementsAre(
8716 "foo1", "foo2", "foo3", "bar1", "bar2")));
8717 std::vector<std::string> results =
8718 response.request()->GetTextResults().value();
8719 EXPECT_NE(results.end(), std::search(results.begin(), results.end(),
8720 foo_records.begin(), foo_records.end()));
8721 EXPECT_NE(results.end(), std::search(results.begin(), results.end(),
8722 bar_records.begin(), bar_records.end()));
Eric Orth55d10c62020-10-05 22:31:248723
8724 // Expect result to be cached.
8725 EXPECT_EQ(resolve_context_->host_cache()->size(), 1u);
8726 ResolveHostResponseHelper cached_response(resolver_->CreateRequest(
8727 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
8728 parameters, resolve_context_.get(), resolve_context_->host_cache()));
8729 EXPECT_THAT(cached_response.result_error(), IsOk());
8730 EXPECT_TRUE(cached_response.request()->GetStaleInfo());
8731 ASSERT_THAT(cached_response.request()->GetTextResults(),
8732 testing::Optional(testing::UnorderedElementsAre(
8733 "foo1", "foo2", "foo3", "bar1", "bar2")));
8734 results = cached_response.request()->GetTextResults().value();
8735 EXPECT_NE(results.end(), std::search(results.begin(), results.end(),
8736 foo_records.begin(), foo_records.end()));
8737 EXPECT_NE(results.end(), std::search(results.begin(), results.end(),
8738 bar_records.begin(), bar_records.end()));
Eric Orth828bd3ae2018-12-12 17:30:368739}
8740
Eric Orth960e7062019-03-08 18:43:548741TEST_F(HostResolverManagerDnsTest, PtrQuery) {
Eric Orthe9db8d232019-01-14 21:24:458742 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:138743 rules.emplace_back("host", dns_protocol::kTypePTR, false /* secure */,
Eric Orthe9db8d232019-01-14 21:24:458744 MockDnsClientRule::Result(BuildTestDnsPointerResponse(
8745 "host", {"foo.com", "bar.com"})),
8746 false /* delay */);
8747
8748 CreateResolver();
8749 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8750
8751 HostResolver::ResolveHostParameters parameters;
8752 parameters.dns_query_type = DnsQueryType::PTR;
8753
Eric Orth117e1992019-04-17 00:24:158754 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558755 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:508756 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthe9db8d232019-01-14 21:24:458757 EXPECT_THAT(response.result_error(), IsOk());
8758 EXPECT_FALSE(response.request()->GetAddressResults());
8759 EXPECT_FALSE(response.request()->GetTextResults());
Eric Orth7139e0552020-11-04 02:41:118760 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Eric Orthe9db8d232019-01-14 21:24:458761
8762 // Order between separate records is undefined.
8763 EXPECT_THAT(response.request()->GetHostnameResults(),
8764 testing::Optional(testing::UnorderedElementsAre(
8765 HostPortPair("foo.com", 108), HostPortPair("bar.com", 108))));
8766}
8767
Eric Orth03e29cc2021-07-13 18:18:258768TEST_F(HostResolverManagerDnsTest, PtrQueryRejectsIpLiteral) {
Eric Orthe9db8d232019-01-14 21:24:458769 MockDnsClientRuleList rules;
Eric Orth03e29cc2021-07-13 18:18:258770
8771 // Entry that would resolve if DNS is mistakenly queried to ensure that does
8772 // not happen.
8773 rules.emplace_back("8.8.8.8", dns_protocol::kTypePTR, /*secure=*/false,
Eric Orthe9db8d232019-01-14 21:24:458774 MockDnsClientRule::Result(BuildTestDnsPointerResponse(
8775 "8.8.8.8", {"foo.com", "bar.com"})),
Eric Orth03e29cc2021-07-13 18:18:258776 /*delay=*/false);
Eric Orthe9db8d232019-01-14 21:24:458777
8778 CreateResolver();
8779 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8780
8781 HostResolver::ResolveHostParameters parameters;
8782 parameters.dns_query_type = DnsQueryType::PTR;
8783
Eric Orth117e1992019-04-17 00:24:158784 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558785 HostPortPair("8.8.8.8", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:508786 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth03e29cc2021-07-13 18:18:258787 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
8788 EXPECT_FALSE(response.request()->GetAddressResults());
8789 EXPECT_FALSE(response.request()->GetTextResults());
8790 EXPECT_FALSE(response.request()->GetHostnameResults());
8791 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
8792}
8793
8794TEST_F(HostResolverManagerDnsTest, PtrQueryHandlesReverseIpLookup) {
8795 const char kHostname[] = "8.8.8.8.in-addr.arpa";
8796
8797 MockDnsClientRuleList rules;
8798 rules.emplace_back(kHostname, dns_protocol::kTypePTR, /*secure=*/false,
8799 MockDnsClientRule::Result(BuildTestDnsPointerResponse(
8800 kHostname, {"dns.google.test", "foo.test"})),
8801 /*delay=*/false);
8802
8803 CreateResolver();
8804 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8805
8806 HostResolver::ResolveHostParameters parameters;
8807 parameters.dns_query_type = DnsQueryType::PTR;
8808
8809 ResolveHostResponseHelper response(resolver_->CreateRequest(
8810 HostPortPair(kHostname, 108), NetworkIsolationKey(), NetLogWithSource(),
8811 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthe9db8d232019-01-14 21:24:458812 EXPECT_THAT(response.result_error(), IsOk());
8813 EXPECT_FALSE(response.request()->GetAddressResults());
8814 EXPECT_FALSE(response.request()->GetTextResults());
Eric Orth7139e0552020-11-04 02:41:118815 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Eric Orthe9db8d232019-01-14 21:24:458816
8817 // Order between separate records is undefined.
8818 EXPECT_THAT(response.request()->GetHostnameResults(),
8819 testing::Optional(testing::UnorderedElementsAre(
Eric Orth03e29cc2021-07-13 18:18:258820 HostPortPair("dns.google.test", 108),
8821 HostPortPair("foo.test", 108))));
Eric Orthe9db8d232019-01-14 21:24:458822}
8823
Eric Orth960e7062019-03-08 18:43:548824TEST_F(HostResolverManagerDnsTest, PtrQuery_NonexistentDomain) {
Eric Orthe9db8d232019-01-14 21:24:458825 // Setup fallback to confirm it is not used for non-address results.
8826 set_allow_fallback_to_proctask(true);
8827 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
8828 proc_->SignalMultiple(1u);
8829
8830 MockDnsClientRuleList rules;
Peter Kastingd039b772021-08-18 00:06:208831 rules.emplace_back(
8832 "host", dns_protocol::kTypePTR, false /* secure */,
8833 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kNoDomain),
8834 false /* delay */);
Eric Orthe9db8d232019-01-14 21:24:458835
8836 CreateResolver();
8837 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8838
8839 HostResolver::ResolveHostParameters parameters;
8840 parameters.dns_query_type = DnsQueryType::PTR;
8841
Eric Orth117e1992019-04-17 00:24:158842 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558843 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:508844 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthe9db8d232019-01-14 21:24:458845 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
8846 EXPECT_FALSE(response.request()->GetAddressResults());
8847 EXPECT_FALSE(response.request()->GetTextResults());
8848 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth7139e0552020-11-04 02:41:118849 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Eric Orthe9db8d232019-01-14 21:24:458850}
8851
Eric Orth960e7062019-03-08 18:43:548852TEST_F(HostResolverManagerDnsTest, PtrQuery_Failure) {
Eric Orthe9db8d232019-01-14 21:24:458853 // Setup fallback to confirm it is not used for non-address results.
8854 set_allow_fallback_to_proctask(true);
8855 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
8856 proc_->SignalMultiple(1u);
8857
8858 MockDnsClientRuleList rules;
Peter Kastingd039b772021-08-18 00:06:208859 rules.emplace_back(
8860 "host", dns_protocol::kTypePTR, false /* secure */,
8861 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kFail),
8862 false /* delay */);
Eric Orthe9db8d232019-01-14 21:24:458863
8864 CreateResolver();
8865 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8866
8867 HostResolver::ResolveHostParameters parameters;
8868 parameters.dns_query_type = DnsQueryType::PTR;
8869
Eric Orth117e1992019-04-17 00:24:158870 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558871 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:508872 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthe9db8d232019-01-14 21:24:458873 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
8874 EXPECT_FALSE(response.request()->GetAddressResults());
8875 EXPECT_FALSE(response.request()->GetTextResults());
8876 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth7139e0552020-11-04 02:41:118877 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Eric Orthe9db8d232019-01-14 21:24:458878}
8879
Eric Orth960e7062019-03-08 18:43:548880TEST_F(HostResolverManagerDnsTest, PtrQuery_Timeout) {
Eric Orthe9db8d232019-01-14 21:24:458881 // Setup fallback to confirm it is not used for non-address results.
8882 set_allow_fallback_to_proctask(true);
8883 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
8884 proc_->SignalMultiple(1u);
8885
8886 MockDnsClientRuleList rules;
Peter Kastingd039b772021-08-18 00:06:208887 rules.emplace_back(
8888 "host", dns_protocol::kTypePTR, false /* secure */,
8889 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kTimeout),
8890 false /* delay */);
Eric Orthe9db8d232019-01-14 21:24:458891
8892 CreateResolver();
8893 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8894
8895 HostResolver::ResolveHostParameters parameters;
8896 parameters.dns_query_type = DnsQueryType::PTR;
8897
Eric Orth117e1992019-04-17 00:24:158898 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558899 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:508900 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthe9db8d232019-01-14 21:24:458901 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_TIMED_OUT));
8902 EXPECT_FALSE(response.request()->GetAddressResults());
8903 EXPECT_FALSE(response.request()->GetTextResults());
8904 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth7139e0552020-11-04 02:41:118905 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Eric Orthe9db8d232019-01-14 21:24:458906}
8907
Eric Orth960e7062019-03-08 18:43:548908TEST_F(HostResolverManagerDnsTest, PtrQuery_Empty) {
Eric Orthe9db8d232019-01-14 21:24:458909 // Setup fallback to confirm it is not used for non-address results.
8910 set_allow_fallback_to_proctask(true);
8911 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
8912 proc_->SignalMultiple(1u);
8913
8914 MockDnsClientRuleList rules;
Peter Kastingd039b772021-08-18 00:06:208915 rules.emplace_back(
8916 "host", dns_protocol::kTypePTR, false /* secure */,
8917 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kEmpty),
8918 false /* delay */);
Eric Orthe9db8d232019-01-14 21:24:458919
8920 CreateResolver();
8921 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8922
8923 HostResolver::ResolveHostParameters parameters;
8924 parameters.dns_query_type = DnsQueryType::PTR;
8925
Eric Orth117e1992019-04-17 00:24:158926 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558927 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:508928 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthe9db8d232019-01-14 21:24:458929 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
8930 EXPECT_FALSE(response.request()->GetAddressResults());
8931 EXPECT_FALSE(response.request()->GetTextResults());
8932 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth7139e0552020-11-04 02:41:118933 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Eric Orthe9db8d232019-01-14 21:24:458934}
8935
Eric Orth960e7062019-03-08 18:43:548936TEST_F(HostResolverManagerDnsTest, PtrQuery_Malformed) {
Eric Orthe9db8d232019-01-14 21:24:458937 // Setup fallback to confirm it is not used for non-address results.
8938 set_allow_fallback_to_proctask(true);
8939 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
8940 proc_->SignalMultiple(1u);
8941
8942 MockDnsClientRuleList rules;
Peter Kastingd039b772021-08-18 00:06:208943 rules.emplace_back(
8944 "host", dns_protocol::kTypePTR, false /* secure */,
8945 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kMalformed),
8946 false /* delay */);
Eric Orthe9db8d232019-01-14 21:24:458947
8948 CreateResolver();
8949 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8950
8951 HostResolver::ResolveHostParameters parameters;
8952 parameters.dns_query_type = DnsQueryType::PTR;
8953
Eric Orth117e1992019-04-17 00:24:158954 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558955 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:508956 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthe9db8d232019-01-14 21:24:458957 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE));
8958 EXPECT_FALSE(response.request()->GetAddressResults());
8959 EXPECT_FALSE(response.request()->GetTextResults());
8960 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth7139e0552020-11-04 02:41:118961 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Eric Orthe9db8d232019-01-14 21:24:458962}
8963
Eric Orth960e7062019-03-08 18:43:548964TEST_F(HostResolverManagerDnsTest, PtrQuery_MismatchedName) {
Eric Orthe9db8d232019-01-14 21:24:458965 std::vector<std::string> ptr_records = {{"foo.com"}};
8966 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:138967 rules.emplace_back("host", dns_protocol::kTypePTR, false /* secure */,
Eric Orthe9db8d232019-01-14 21:24:458968 MockDnsClientRule::Result(BuildTestDnsPointerResponse(
8969 "host", std::move(ptr_records), "not.host")),
8970 false /* delay */);
8971
8972 CreateResolver();
8973 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8974
8975 HostResolver::ResolveHostParameters parameters;
8976 parameters.dns_query_type = DnsQueryType::PTR;
8977
Eric Orth117e1992019-04-17 00:24:158978 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558979 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:508980 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthe9db8d232019-01-14 21:24:458981 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE));
8982 EXPECT_FALSE(response.request()->GetAddressResults());
8983 EXPECT_FALSE(response.request()->GetTextResults());
8984 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth7139e0552020-11-04 02:41:118985 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Eric Orthe9db8d232019-01-14 21:24:458986}
8987
Eric Orth960e7062019-03-08 18:43:548988TEST_F(HostResolverManagerDnsTest, PtrQuery_WrongType) {
Eric Orthe9db8d232019-01-14 21:24:458989 // Respond to a TXT query with an A response.
8990 MockDnsClientRuleList rules;
Eric Orth7139e0552020-11-04 02:41:118991 rules.emplace_back(
8992 "host", dns_protocol::kTypePTR, false /* secure */,
8993 MockDnsClientRule::Result(BuildTestDnsResponse(
8994 "host", dns_protocol::kTypePTR,
8995 {BuildTestAddressRecord("host", IPAddress(1, 2, 3, 4))})),
8996 false /* delay */);
Eric Orthe9db8d232019-01-14 21:24:458997
8998 CreateResolver();
8999 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
9000
9001 HostResolver::ResolveHostParameters parameters;
9002 parameters.dns_query_type = DnsQueryType::PTR;
9003
9004 // Responses for the wrong type should be ignored.
Eric Orth117e1992019-04-17 00:24:159005 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth7139e0552020-11-04 02:41:119006 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:509007 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthe9db8d232019-01-14 21:24:459008 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
9009 EXPECT_FALSE(response.request()->GetAddressResults());
9010 EXPECT_FALSE(response.request()->GetTextResults());
9011 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth7139e0552020-11-04 02:41:119012 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Eric Orthe9db8d232019-01-14 21:24:459013}
9014
Eric Orth09746312021-05-05 15:44:589015TEST_F(HostResolverManagerDnsTest,
9016 PtrInsecureQueryDisallowedWhenAdditionalTypesDisallowed) {
9017 const std::string kName = "ptr.test";
9018
9019 ChangeDnsConfig(CreateValidDnsConfig());
9020 DnsConfigOverrides overrides;
9021 overrides.secure_dns_mode = SecureDnsMode::kOff;
9022 resolver_->SetDnsConfigOverrides(overrides);
9023 resolver_->SetInsecureDnsClientEnabled(
9024 /*enabled=*/true,
9025 /*additional_dns_types_enabled=*/false);
9026
9027 HostResolver::ResolveHostParameters parameters;
9028 parameters.dns_query_type = DnsQueryType::PTR;
9029
9030 ResolveHostResponseHelper response(resolver_->CreateRequest(
9031 HostPortPair(kName, 108), NetworkIsolationKey(), NetLogWithSource(),
9032 parameters, resolve_context_.get(), resolve_context_->host_cache()));
9033 // No non-local work is done, so ERR_DNS_CACHE_MISS is the result.
9034 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_CACHE_MISS));
9035 EXPECT_FALSE(response.request()->GetAddressResults());
9036 EXPECT_FALSE(response.request()->GetHostnameResults());
9037 EXPECT_FALSE(response.request()->GetTextResults());
9038 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
9039}
9040
Eric Ortha625b042019-01-16 01:14:459041// Same as PtrQuery except we specify DNS HostResolverSource instead of relying
9042// on automatic determination. Expect same results since DNS should be what we
9043// automatically determine, but some slightly different logic paths are
9044// involved.
Eric Orth960e7062019-03-08 18:43:549045TEST_F(HostResolverManagerDnsTest, PtrDnsQuery) {
Eric Orthe9db8d232019-01-14 21:24:459046 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:139047 rules.emplace_back("host", dns_protocol::kTypePTR, false /* secure */,
Eric Orthe9db8d232019-01-14 21:24:459048 MockDnsClientRule::Result(BuildTestDnsPointerResponse(
9049 "host", {"foo.com", "bar.com"})),
9050 false /* delay */);
9051
9052 CreateResolver();
9053 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
9054
9055 HostResolver::ResolveHostParameters parameters;
9056 parameters.source = HostResolverSource::DNS;
9057 parameters.dns_query_type = DnsQueryType::PTR;
9058
Eric Orth117e1992019-04-17 00:24:159059 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:559060 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:509061 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthe9db8d232019-01-14 21:24:459062 EXPECT_THAT(response.result_error(), IsOk());
9063 EXPECT_FALSE(response.request()->GetAddressResults());
9064 EXPECT_FALSE(response.request()->GetTextResults());
Eric Orth7139e0552020-11-04 02:41:119065 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Eric Orthe9db8d232019-01-14 21:24:459066
9067 // Order between separate records is undefined.
9068 EXPECT_THAT(response.request()->GetHostnameResults(),
9069 testing::Optional(testing::UnorderedElementsAre(
9070 HostPortPair("foo.com", 108), HostPortPair("bar.com", 108))));
9071}
9072
Eric Orth960e7062019-03-08 18:43:549073TEST_F(HostResolverManagerDnsTest, SrvQuery) {
Eric Ortha625b042019-01-16 01:14:459074 const TestServiceRecord kRecord1 = {2, 3, 1223, "foo.com"};
9075 const TestServiceRecord kRecord2 = {5, 10, 80, "bar.com"};
9076 const TestServiceRecord kRecord3 = {5, 1, 5, "google.com"};
9077 const TestServiceRecord kRecord4 = {2, 100, 12345, "chromium.org"};
9078 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:139079 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
dalykc0ab0722019-03-14 17:00:589080 MockDnsClientRule::Result(BuildTestDnsServiceResponse(
Eric Ortha625b042019-01-16 01:14:459081 "host", {kRecord1, kRecord2, kRecord3, kRecord4})),
9082 false /* delay */);
9083
9084 CreateResolver();
9085 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
9086
9087 HostResolver::ResolveHostParameters parameters;
9088 parameters.dns_query_type = DnsQueryType::SRV;
9089
Eric Orth117e1992019-04-17 00:24:159090 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:559091 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:509092 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Ortha625b042019-01-16 01:14:459093 EXPECT_THAT(response.result_error(), IsOk());
9094 EXPECT_FALSE(response.request()->GetAddressResults());
9095 EXPECT_FALSE(response.request()->GetTextResults());
Eric Orth7139e0552020-11-04 02:41:119096 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Eric Ortha625b042019-01-16 01:14:459097
9098 // Expect ordered by priority, and random within a priority.
Anton Bikineev068d2912021-05-15 20:43:529099 absl::optional<std::vector<HostPortPair>> results =
Eric Ortha625b042019-01-16 01:14:459100 response.request()->GetHostnameResults();
9101 ASSERT_THAT(
9102 results,
9103 testing::Optional(testing::UnorderedElementsAre(
9104 HostPortPair("foo.com", 1223), HostPortPair("bar.com", 80),
9105 HostPortPair("google.com", 5), HostPortPair("chromium.org", 12345))));
9106 auto priority2 = std::vector<HostPortPair>(results.value().begin(),
9107 results.value().begin() + 2);
9108 EXPECT_THAT(priority2, testing::UnorderedElementsAre(
9109 HostPortPair("foo.com", 1223),
9110 HostPortPair("chromium.org", 12345)));
9111 auto priority5 = std::vector<HostPortPair>(results.value().begin() + 2,
9112 results.value().end());
9113 EXPECT_THAT(priority5,
9114 testing::UnorderedElementsAre(HostPortPair("bar.com", 80),
9115 HostPortPair("google.com", 5)));
9116}
9117
Eric Orth03e29cc2021-07-13 18:18:259118TEST_F(HostResolverManagerDnsTest, SrvQueryRejectsIpLiteral) {
9119 MockDnsClientRuleList rules;
9120
9121 // Entry that would resolve if DNS is mistakenly queried to ensure that does
9122 // not happen.
9123 rules.emplace_back("8.8.8.8", dns_protocol::kTypeSRV, /*secure=*/false,
9124 MockDnsClientRule::Result(BuildTestDnsServiceResponse(
9125 "8.8.8.8", {{/*priority=*/4, /*weight=*/0, /*port=*/90,
9126 /*target=*/"google.test"}})),
9127 /*delay=*/false);
9128
9129 CreateResolver();
9130 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
9131
9132 HostResolver::ResolveHostParameters parameters;
9133 parameters.dns_query_type = DnsQueryType::SRV;
9134
9135 ResolveHostResponseHelper response(resolver_->CreateRequest(
9136 HostPortPair("8.8.8.8", 108), NetworkIsolationKey(), NetLogWithSource(),
9137 parameters, resolve_context_.get(), resolve_context_->host_cache()));
9138 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
9139 EXPECT_FALSE(response.request()->GetAddressResults());
9140 EXPECT_FALSE(response.request()->GetTextResults());
9141 EXPECT_FALSE(response.request()->GetHostnameResults());
9142 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
9143}
9144
Eric Ortha625b042019-01-16 01:14:459145// 0-weight services are allowed. Ensure that we can handle such records,
9146// especially the case where all entries have weight 0.
Eric Orth960e7062019-03-08 18:43:549147TEST_F(HostResolverManagerDnsTest, SrvQuery_ZeroWeight) {
Eric Ortha625b042019-01-16 01:14:459148 const TestServiceRecord kRecord1 = {5, 0, 80, "bar.com"};
9149 const TestServiceRecord kRecord2 = {5, 0, 5, "google.com"};
9150 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:139151 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
dalykc0ab0722019-03-14 17:00:589152 MockDnsClientRule::Result(BuildTestDnsServiceResponse(
9153 "host", {kRecord1, kRecord2})),
Eric Ortha625b042019-01-16 01:14:459154 false /* delay */);
9155
9156 CreateResolver();
9157 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
9158
9159 HostResolver::ResolveHostParameters parameters;
9160 parameters.dns_query_type = DnsQueryType::SRV;
9161
Eric Orth117e1992019-04-17 00:24:159162 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:559163 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:509164 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Ortha625b042019-01-16 01:14:459165 EXPECT_THAT(response.result_error(), IsOk());
9166 EXPECT_FALSE(response.request()->GetAddressResults());
9167 EXPECT_FALSE(response.request()->GetTextResults());
Eric Orth7139e0552020-11-04 02:41:119168 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Eric Ortha625b042019-01-16 01:14:459169
9170 // Expect ordered by priority, and random within a priority.
9171 EXPECT_THAT(response.request()->GetHostnameResults(),
9172 testing::Optional(testing::UnorderedElementsAre(
9173 HostPortPair("bar.com", 80), HostPortPair("google.com", 5))));
9174}
9175
Eric Orth960e7062019-03-08 18:43:549176TEST_F(HostResolverManagerDnsTest, SrvQuery_NonexistentDomain) {
Eric Ortha625b042019-01-16 01:14:459177 // Setup fallback to confirm it is not used for non-address results.
9178 set_allow_fallback_to_proctask(true);
9179 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
9180 proc_->SignalMultiple(1u);
9181
9182 MockDnsClientRuleList rules;
Peter Kastingd039b772021-08-18 00:06:209183 rules.emplace_back(
9184 "host", dns_protocol::kTypeSRV, false /* secure */,
9185 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kNoDomain),
9186 false /* delay */);
Eric Ortha625b042019-01-16 01:14:459187
9188 CreateResolver();
9189 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
9190
9191 HostResolver::ResolveHostParameters parameters;
9192 parameters.dns_query_type = DnsQueryType::SRV;
9193
Eric Orth117e1992019-04-17 00:24:159194 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:559195 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:509196 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Ortha625b042019-01-16 01:14:459197 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
9198 EXPECT_FALSE(response.request()->GetAddressResults());
9199 EXPECT_FALSE(response.request()->GetTextResults());
9200 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth7139e0552020-11-04 02:41:119201 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Eric Ortha625b042019-01-16 01:14:459202}
9203
Eric Orth960e7062019-03-08 18:43:549204TEST_F(HostResolverManagerDnsTest, SrvQuery_Failure) {
Eric Ortha625b042019-01-16 01:14:459205 // Setup fallback to confirm it is not used for non-address results.
9206 set_allow_fallback_to_proctask(true);
9207 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
9208 proc_->SignalMultiple(1u);
9209
9210 MockDnsClientRuleList rules;
Peter Kastingd039b772021-08-18 00:06:209211 rules.emplace_back(
9212 "host", dns_protocol::kTypeSRV, false /* secure */,
9213 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kFail),
9214 false /* delay */);
Eric Ortha625b042019-01-16 01:14:459215
9216 CreateResolver();
9217 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
9218
9219 HostResolver::ResolveHostParameters parameters;
9220 parameters.dns_query_type = DnsQueryType::SRV;
9221
Eric Orth117e1992019-04-17 00:24:159222 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:559223 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:509224 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Ortha625b042019-01-16 01:14:459225 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
9226 EXPECT_FALSE(response.request()->GetAddressResults());
9227 EXPECT_FALSE(response.request()->GetTextResults());
9228 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth7139e0552020-11-04 02:41:119229 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Eric Ortha625b042019-01-16 01:14:459230}
9231
Eric Orth960e7062019-03-08 18:43:549232TEST_F(HostResolverManagerDnsTest, SrvQuery_Timeout) {
Eric Ortha625b042019-01-16 01:14:459233 // Setup fallback to confirm it is not used for non-address results.
9234 set_allow_fallback_to_proctask(true);
9235 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
9236 proc_->SignalMultiple(1u);
9237
9238 MockDnsClientRuleList rules;
Peter Kastingd039b772021-08-18 00:06:209239 rules.emplace_back(
9240 "host", dns_protocol::kTypeSRV, false /* secure */,
9241 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kTimeout),
9242 false /* delay */);
Eric Ortha625b042019-01-16 01:14:459243
9244 CreateResolver();
9245 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
9246
9247 HostResolver::ResolveHostParameters parameters;
9248 parameters.dns_query_type = DnsQueryType::SRV;
9249
Eric Orth117e1992019-04-17 00:24:159250 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:559251 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:509252 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Ortha625b042019-01-16 01:14:459253 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_TIMED_OUT));
9254 EXPECT_FALSE(response.request()->GetAddressResults());
9255 EXPECT_FALSE(response.request()->GetTextResults());
9256 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth7139e0552020-11-04 02:41:119257 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Eric Ortha625b042019-01-16 01:14:459258}
9259
Eric Orth960e7062019-03-08 18:43:549260TEST_F(HostResolverManagerDnsTest, SrvQuery_Empty) {
Eric Ortha625b042019-01-16 01:14:459261 // Setup fallback to confirm it is not used for non-address results.
9262 set_allow_fallback_to_proctask(true);
9263 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
9264 proc_->SignalMultiple(1u);
9265
9266 MockDnsClientRuleList rules;
Peter Kastingd039b772021-08-18 00:06:209267 rules.emplace_back(
9268 "host", dns_protocol::kTypeSRV, false /* secure */,
9269 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kEmpty),
9270 false /* delay */);
Eric Ortha625b042019-01-16 01:14:459271
9272 CreateResolver();
9273 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
9274
9275 HostResolver::ResolveHostParameters parameters;
9276 parameters.dns_query_type = DnsQueryType::SRV;
9277
Eric Orth117e1992019-04-17 00:24:159278 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:559279 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:509280 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Ortha625b042019-01-16 01:14:459281 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
9282 EXPECT_FALSE(response.request()->GetAddressResults());
9283 EXPECT_FALSE(response.request()->GetTextResults());
9284 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth7139e0552020-11-04 02:41:119285 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Eric Ortha625b042019-01-16 01:14:459286}
9287
Eric Orth960e7062019-03-08 18:43:549288TEST_F(HostResolverManagerDnsTest, SrvQuery_Malformed) {
Eric Ortha625b042019-01-16 01:14:459289 // Setup fallback to confirm it is not used for non-address results.
9290 set_allow_fallback_to_proctask(true);
9291 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
9292 proc_->SignalMultiple(1u);
9293
9294 MockDnsClientRuleList rules;
Peter Kastingd039b772021-08-18 00:06:209295 rules.emplace_back(
9296 "host", dns_protocol::kTypeSRV, false /* secure */,
9297 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kMalformed),
9298 false /* delay */);
Eric Ortha625b042019-01-16 01:14:459299
9300 CreateResolver();
9301 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
9302
9303 HostResolver::ResolveHostParameters parameters;
9304 parameters.dns_query_type = DnsQueryType::SRV;
9305
Eric Orth117e1992019-04-17 00:24:159306 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:559307 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:509308 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Ortha625b042019-01-16 01:14:459309 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE));
9310 EXPECT_FALSE(response.request()->GetAddressResults());
9311 EXPECT_FALSE(response.request()->GetTextResults());
9312 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth7139e0552020-11-04 02:41:119313 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Eric Ortha625b042019-01-16 01:14:459314}
9315
Eric Orth960e7062019-03-08 18:43:549316TEST_F(HostResolverManagerDnsTest, SrvQuery_MismatchedName) {
Eric Ortha625b042019-01-16 01:14:459317 std::vector<TestServiceRecord> srv_records = {{1, 2, 3, "foo.com"}};
9318 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:139319 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
dalykc0ab0722019-03-14 17:00:589320 MockDnsClientRule::Result(BuildTestDnsServiceResponse(
Eric Ortha625b042019-01-16 01:14:459321 "host", std::move(srv_records), "not.host")),
9322 false /* delay */);
9323
9324 CreateResolver();
9325 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
9326
9327 HostResolver::ResolveHostParameters parameters;
9328 parameters.dns_query_type = DnsQueryType::SRV;
9329
Eric Orth117e1992019-04-17 00:24:159330 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:559331 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:509332 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Ortha625b042019-01-16 01:14:459333 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE));
9334 EXPECT_FALSE(response.request()->GetAddressResults());
9335 EXPECT_FALSE(response.request()->GetTextResults());
9336 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth7139e0552020-11-04 02:41:119337 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Eric Ortha625b042019-01-16 01:14:459338}
9339
Eric Orth960e7062019-03-08 18:43:549340TEST_F(HostResolverManagerDnsTest, SrvQuery_WrongType) {
Eric Ortha625b042019-01-16 01:14:459341 // Respond to a SRV query with an A response.
9342 MockDnsClientRuleList rules;
Eric Orth7139e0552020-11-04 02:41:119343 rules.emplace_back(
9344 "host", dns_protocol::kTypeSRV, false /* secure */,
9345 MockDnsClientRule::Result(BuildTestDnsResponse(
9346 "host", dns_protocol::kTypeSRV,
9347 {BuildTestAddressRecord("host", IPAddress(1, 2, 3, 4))})),
9348 false /* delay */);
Eric Ortha625b042019-01-16 01:14:459349
9350 CreateResolver();
9351 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
9352
9353 HostResolver::ResolveHostParameters parameters;
9354 parameters.dns_query_type = DnsQueryType::SRV;
9355
9356 // Responses for the wrong type should be ignored.
Eric Orth117e1992019-04-17 00:24:159357 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth7139e0552020-11-04 02:41:119358 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:509359 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Ortha625b042019-01-16 01:14:459360 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
9361 EXPECT_FALSE(response.request()->GetAddressResults());
9362 EXPECT_FALSE(response.request()->GetTextResults());
9363 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth7139e0552020-11-04 02:41:119364 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Eric Ortha625b042019-01-16 01:14:459365}
9366
Eric Orth09746312021-05-05 15:44:589367TEST_F(HostResolverManagerDnsTest,
9368 SrvInsecureQueryDisallowedWhenAdditionalTypesDisallowed) {
9369 const std::string kName = "srv.test";
9370
9371 ChangeDnsConfig(CreateValidDnsConfig());
9372 DnsConfigOverrides overrides;
9373 overrides.secure_dns_mode = SecureDnsMode::kOff;
9374 resolver_->SetDnsConfigOverrides(overrides);
9375 resolver_->SetInsecureDnsClientEnabled(
9376 /*enabled=*/true,
9377 /*additional_dns_types_enabled=*/false);
9378
9379 HostResolver::ResolveHostParameters parameters;
9380 parameters.dns_query_type = DnsQueryType::SRV;
9381
9382 ResolveHostResponseHelper response(resolver_->CreateRequest(
9383 HostPortPair(kName, 108), NetworkIsolationKey(), NetLogWithSource(),
9384 parameters, resolve_context_.get(), resolve_context_->host_cache()));
9385 // No non-local work is done, so ERR_DNS_CACHE_MISS is the result.
9386 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_CACHE_MISS));
9387 EXPECT_FALSE(response.request()->GetAddressResults());
9388 EXPECT_FALSE(response.request()->GetHostnameResults());
9389 EXPECT_FALSE(response.request()->GetTextResults());
9390 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
9391}
9392
Eric Ortha625b042019-01-16 01:14:459393// Same as SrvQuery except we specify DNS HostResolverSource instead of relying
9394// on automatic determination. Expect same results since DNS should be what we
9395// automatically determine, but some slightly different logic paths are
9396// involved.
Eric Orth960e7062019-03-08 18:43:549397TEST_F(HostResolverManagerDnsTest, SrvDnsQuery) {
Eric Ortha625b042019-01-16 01:14:459398 const TestServiceRecord kRecord1 = {2, 3, 1223, "foo.com"};
9399 const TestServiceRecord kRecord2 = {5, 10, 80, "bar.com"};
9400 const TestServiceRecord kRecord3 = {5, 1, 5, "google.com"};
9401 const TestServiceRecord kRecord4 = {2, 100, 12345, "chromium.org"};
9402 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:139403 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
dalykc0ab0722019-03-14 17:00:589404 MockDnsClientRule::Result(BuildTestDnsServiceResponse(
Eric Ortha625b042019-01-16 01:14:459405 "host", {kRecord1, kRecord2, kRecord3, kRecord4})),
9406 false /* delay */);
9407
9408 CreateResolver();
9409 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
9410
9411 HostResolver::ResolveHostParameters parameters;
9412 parameters.source = HostResolverSource::DNS;
9413 parameters.dns_query_type = DnsQueryType::SRV;
9414
Eric Orth117e1992019-04-17 00:24:159415 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:559416 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:509417 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Ortha625b042019-01-16 01:14:459418 EXPECT_THAT(response.result_error(), IsOk());
9419 EXPECT_FALSE(response.request()->GetAddressResults());
9420 EXPECT_FALSE(response.request()->GetTextResults());
Eric Orth7139e0552020-11-04 02:41:119421 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Eric Ortha625b042019-01-16 01:14:459422
9423 // Expect ordered by priority, and random within a priority.
Anton Bikineev068d2912021-05-15 20:43:529424 absl::optional<std::vector<HostPortPair>> results =
Eric Ortha625b042019-01-16 01:14:459425 response.request()->GetHostnameResults();
9426 ASSERT_THAT(
9427 results,
9428 testing::Optional(testing::UnorderedElementsAre(
9429 HostPortPair("foo.com", 1223), HostPortPair("bar.com", 80),
9430 HostPortPair("google.com", 5), HostPortPair("chromium.org", 12345))));
9431 auto priority2 = std::vector<HostPortPair>(results.value().begin(),
9432 results.value().begin() + 2);
9433 EXPECT_THAT(priority2, testing::UnorderedElementsAre(
9434 HostPortPair("foo.com", 1223),
9435 HostPortPair("chromium.org", 12345)));
9436 auto priority5 = std::vector<HostPortPair>(results.value().begin() + 2,
9437 results.value().end());
9438 EXPECT_THAT(priority5,
9439 testing::UnorderedElementsAre(HostPortPair("bar.com", 80),
9440 HostPortPair("google.com", 5)));
9441}
9442
Eric Orth5d21f152020-10-21 19:15:439443TEST_F(HostResolverManagerDnsTest, HttpsQuery) {
9444 const std::string kName = "https.test";
9445
9446 MockDnsClientRuleList rules;
Eric Orth7139e0552020-11-04 02:41:119447 std::vector<DnsResourceRecord> records = {
9448 BuildTestHttpsAliasRecord(kName, "alias.test")};
Eric Orthcf8e00f2021-07-24 00:41:249449 rules.emplace_back(kName, dns_protocol::kTypeHttps, /*secure=*/false,
9450 MockDnsClientRule::Result(BuildTestDnsResponse(
9451 kName, dns_protocol::kTypeHttps, records)),
9452 /*delay=*/false);
9453
9454 CreateResolver();
9455 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
9456
9457 HostResolver::ResolveHostParameters parameters;
9458 parameters.dns_query_type = DnsQueryType::HTTPS;
9459
9460 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth815e90b2021-07-30 22:57:229461 url::SchemeHostPort(url::kHttpsScheme, kName, 443), NetworkIsolationKey(),
9462 NetLogWithSource(), parameters, resolve_context_.get(),
9463 resolve_context_->host_cache()));
9464 EXPECT_THAT(response.result_error(), IsOk());
9465 EXPECT_FALSE(response.request()->GetAddressResults());
9466 EXPECT_FALSE(response.request()->GetHostnameResults());
9467 EXPECT_FALSE(response.request()->GetTextResults());
9468 // TODO(crbug.com/1225776): Check non-experimental HTTPS output once
9469 // available.
9470 EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(),
9471 testing::Optional(testing::ElementsAre(true)));
9472}
9473
9474TEST_F(HostResolverManagerDnsTest, HttpsQueryForNonStandardPort) {
9475 const std::string kName = "https.test";
9476 const std::string kExpectedQueryName = "_1111._https." + kName;
9477
9478 MockDnsClientRuleList rules;
9479 std::vector<DnsResourceRecord> records = {
9480 BuildTestHttpsAliasRecord(kExpectedQueryName, "alias.test")};
9481 rules.emplace_back(
9482 kExpectedQueryName, dns_protocol::kTypeHttps,
9483 /*secure=*/false,
9484 MockDnsClientRule::Result(BuildTestDnsResponse(
9485 kExpectedQueryName, dns_protocol::kTypeHttps, records)),
9486 /*delay=*/false);
9487
9488 CreateResolver();
9489 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
9490
9491 HostResolver::ResolveHostParameters parameters;
9492 parameters.dns_query_type = DnsQueryType::HTTPS;
9493
9494 ResolveHostResponseHelper response(resolver_->CreateRequest(
9495 url::SchemeHostPort(url::kHttpsScheme, kName, 1111),
9496 NetworkIsolationKey(), NetLogWithSource(), parameters,
9497 resolve_context_.get(), resolve_context_->host_cache()));
9498 EXPECT_THAT(response.result_error(), IsOk());
9499 EXPECT_FALSE(response.request()->GetAddressResults());
9500 EXPECT_FALSE(response.request()->GetHostnameResults());
9501 EXPECT_FALSE(response.request()->GetTextResults());
9502 // TODO(crbug.com/1225776): Check non-experimental HTTPS output once
9503 // available.
9504 EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(),
9505 testing::Optional(testing::ElementsAre(true)));
9506}
9507
9508TEST_F(HostResolverManagerDnsTest, HttpsQueryForHttpUpgrade) {
9509 const std::string kName = "https.test";
9510
9511 MockDnsClientRuleList rules;
9512 std::vector<DnsResourceRecord> records = {
9513 BuildTestHttpsAliasRecord(kName, "alias.test")};
9514 rules.emplace_back(kName, dns_protocol::kTypeHttps, /*secure=*/false,
9515 MockDnsClientRule::Result(BuildTestDnsResponse(
9516 kName, dns_protocol::kTypeHttps, records)),
9517 /*delay=*/false);
9518
9519 CreateResolver();
9520 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
9521
9522 HostResolver::ResolveHostParameters parameters;
9523 parameters.dns_query_type = DnsQueryType::HTTPS;
9524
9525 ResolveHostResponseHelper response(resolver_->CreateRequest(
9526 url::SchemeHostPort(url::kHttpScheme, kName, 80), NetworkIsolationKey(),
9527 NetLogWithSource(), parameters, resolve_context_.get(),
9528 resolve_context_->host_cache()));
9529 EXPECT_THAT(response.result_error(), IsOk());
9530 EXPECT_FALSE(response.request()->GetAddressResults());
9531 EXPECT_FALSE(response.request()->GetHostnameResults());
9532 EXPECT_FALSE(response.request()->GetTextResults());
9533 // TODO(crbug.com/1225776): Check non-experimental HTTPS output once
9534 // available.
9535 EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(),
9536 testing::Optional(testing::ElementsAre(true)));
9537}
9538
9539// Test that HTTPS requests for an http host with port 443 will result in a
9540// transaction hostname without prepending port and scheme, despite not having
9541// the default port for an http host. The request host ("http://https.test:443")
9542// will be mapped to the equivalent https upgrade host
9543// ("https://https.test:443") at port 443, which is the default port for an
9544// https host, so port and scheme are not prefixed.
9545TEST_F(HostResolverManagerDnsTest, HttpsQueryForHttpUpgradeFromHttpsPort) {
9546 const std::string kName = "https.test";
9547
9548 MockDnsClientRuleList rules;
9549 std::vector<DnsResourceRecord> records = {
9550 BuildTestHttpsAliasRecord(kName, "alias.test")};
9551 rules.emplace_back(kName, dns_protocol::kTypeHttps, /*secure=*/false,
9552 MockDnsClientRule::Result(BuildTestDnsResponse(
9553 kName, dns_protocol::kTypeHttps, records)),
9554 /*delay=*/false);
9555
9556 CreateResolver();
9557 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
9558
9559 HostResolver::ResolveHostParameters parameters;
9560 parameters.dns_query_type = DnsQueryType::HTTPS;
9561
9562 ResolveHostResponseHelper response(resolver_->CreateRequest(
9563 url::SchemeHostPort(url::kHttpScheme, kName, 443), NetworkIsolationKey(),
9564 NetLogWithSource(), parameters, resolve_context_.get(),
9565 resolve_context_->host_cache()));
9566 EXPECT_THAT(response.result_error(), IsOk());
9567 EXPECT_FALSE(response.request()->GetAddressResults());
9568 EXPECT_FALSE(response.request()->GetHostnameResults());
9569 EXPECT_FALSE(response.request()->GetTextResults());
9570 // TODO(crbug.com/1225776): Check non-experimental HTTPS output once
9571 // available.
9572 EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(),
9573 testing::Optional(testing::ElementsAre(true)));
9574}
9575
9576TEST_F(HostResolverManagerDnsTest,
9577 HttpsQueryForHttpUpgradeWithNonStandardPort) {
9578 const std::string kName = "https.test";
9579 const std::string kExpectedQueryName = "_1111._https." + kName;
9580
9581 MockDnsClientRuleList rules;
9582 std::vector<DnsResourceRecord> records = {
9583 BuildTestHttpsAliasRecord(kExpectedQueryName, "alias.test")};
9584 rules.emplace_back(
9585 kExpectedQueryName, dns_protocol::kTypeHttps,
9586 /*secure=*/false,
9587 MockDnsClientRule::Result(BuildTestDnsResponse(
9588 kExpectedQueryName, dns_protocol::kTypeHttps, records)),
9589 /*delay=*/false);
9590
9591 CreateResolver();
9592 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
9593
9594 HostResolver::ResolveHostParameters parameters;
9595 parameters.dns_query_type = DnsQueryType::HTTPS;
9596
9597 ResolveHostResponseHelper response(resolver_->CreateRequest(
9598 url::SchemeHostPort(url::kHttpScheme, kName, 1111), NetworkIsolationKey(),
9599 NetLogWithSource(), parameters, resolve_context_.get(),
9600 resolve_context_->host_cache()));
Eric Orth1a81b6d22021-07-26 17:39:109601 EXPECT_THAT(response.result_error(), IsOk());
Eric Orthcf8e00f2021-07-24 00:41:249602 EXPECT_FALSE(response.request()->GetAddressResults());
9603 EXPECT_FALSE(response.request()->GetHostnameResults());
9604 EXPECT_FALSE(response.request()->GetTextResults());
Eric Orth1a81b6d22021-07-26 17:39:109605 // TODO(crbug.com/1225776): Check non-experimental HTTPS output once
9606 // available.
9607 EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(),
9608 testing::Optional(testing::ElementsAre(true)));
Eric Orthcf8e00f2021-07-24 00:41:249609}
9610
9611TEST_F(HostResolverManagerDnsTest, ExperimentalHttpsQuery) {
9612 const std::string kName = "https.test";
9613
9614 MockDnsClientRuleList rules;
9615 std::vector<DnsResourceRecord> records = {
9616 BuildTestHttpsAliasRecord(kName, "alias.test")};
Eric Orth5d21f152020-10-21 19:15:439617 rules.emplace_back(kName, dns_protocol::kTypeHttps, false /* secure */,
9618 MockDnsClientRule::Result(BuildTestDnsResponse(
9619 kName, dns_protocol::kTypeHttps, records)),
9620 false /* delay */);
9621
9622 CreateResolver();
9623 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
9624
9625 HostResolver::ResolveHostParameters parameters;
Eric Orthcf8e00f2021-07-24 00:41:249626 parameters.dns_query_type = DnsQueryType::HTTPS_EXPERIMENTAL;
Eric Orth5d21f152020-10-21 19:15:439627
9628 ResolveHostResponseHelper response(resolver_->CreateRequest(
9629 HostPortPair(kName, 108), NetworkIsolationKey(), NetLogWithSource(),
9630 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth1a81b6d22021-07-26 17:39:109631 EXPECT_THAT(response.result_error(), IsOk());
Eric Orth5d21f152020-10-21 19:15:439632 EXPECT_FALSE(response.request()->GetAddressResults());
9633 EXPECT_FALSE(response.request()->GetHostnameResults());
9634 EXPECT_FALSE(response.request()->GetTextResults());
Eric Orth1a81b6d22021-07-26 17:39:109635 EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(),
9636 testing::Optional(testing::ElementsAre(true)));
Eric Orth7139e0552020-11-04 02:41:119637}
9638
Eric Orthcf8e00f2021-07-24 00:41:249639TEST_F(HostResolverManagerDnsTest, ExperimentalHttpsQueryRejectsIpLiteral) {
Eric Orth03e29cc2021-07-13 18:18:259640 MockDnsClientRuleList rules;
9641
9642 // Entry that would resolve if DNS is mistakenly queried to ensure that does
9643 // not happen.
9644 rules.emplace_back("8.8.8.8", dns_protocol::kTypeHttps, /*secure=*/false,
9645 MockDnsClientRule::Result(BuildTestDnsResponse(
9646 "8.8.8.8", dns_protocol::kTypeHttps,
9647 {BuildTestHttpsAliasRecord("8.8.8.8", "alias.test")})),
9648 /*delay=*/false);
9649
9650 CreateResolver();
9651 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
9652
9653 HostResolver::ResolveHostParameters parameters;
9654 parameters.dns_query_type = DnsQueryType::HTTPS;
9655
9656 ResolveHostResponseHelper response(resolver_->CreateRequest(
9657 url::SchemeHostPort(url::kHttpsScheme, "8.8.8.8", 443),
9658 NetworkIsolationKey(), NetLogWithSource(), parameters,
9659 resolve_context_.get(), resolve_context_->host_cache()));
9660 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
9661 EXPECT_FALSE(response.request()->GetAddressResults());
9662 EXPECT_FALSE(response.request()->GetTextResults());
9663 EXPECT_FALSE(response.request()->GetHostnameResults());
9664 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
9665}
9666
Eric Orth09746312021-05-05 15:44:589667TEST_F(HostResolverManagerDnsTest,
Eric Orthcf8e00f2021-07-24 00:41:249668 ExperimentalHttpsInsecureQueryDisallowedWhenAdditionalTypesDisallowed) {
Eric Orth09746312021-05-05 15:44:589669 const std::string kName = "https.test";
9670
9671 ChangeDnsConfig(CreateValidDnsConfig());
9672 DnsConfigOverrides overrides;
9673 overrides.secure_dns_mode = SecureDnsMode::kOff;
9674 resolver_->SetDnsConfigOverrides(overrides);
9675 resolver_->SetInsecureDnsClientEnabled(
9676 /*enabled=*/true,
9677 /*additional_dns_types_enabled=*/false);
9678
9679 HostResolver::ResolveHostParameters parameters;
Eric Orthcf8e00f2021-07-24 00:41:249680 parameters.dns_query_type = DnsQueryType::HTTPS_EXPERIMENTAL;
Eric Orth09746312021-05-05 15:44:589681
9682 ResolveHostResponseHelper response(resolver_->CreateRequest(
9683 HostPortPair(kName, 108), NetworkIsolationKey(), NetLogWithSource(),
9684 parameters, resolve_context_.get(), resolve_context_->host_cache()));
9685 // No non-local work is done, so ERR_DNS_CACHE_MISS is the result.
9686 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_CACHE_MISS));
9687 EXPECT_FALSE(response.request()->GetAddressResults());
9688 EXPECT_FALSE(response.request()->GetHostnameResults());
9689 EXPECT_FALSE(response.request()->GetTextResults());
9690 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
9691}
9692
9693TEST_F(HostResolverManagerDnsTest,
Eric Orthcf8e00f2021-07-24 00:41:249694 ExperimentalHttpsSecureQueryAllowedWhenAdditionalTypesDisallowed) {
Eric Orth09746312021-05-05 15:44:589695 const std::string kName = "https.test";
9696
9697 MockDnsClientRuleList rules;
9698 std::vector<DnsResourceRecord> records = {
9699 BuildTestHttpsAliasRecord(kName, "alias.test")};
9700 rules.emplace_back(kName, dns_protocol::kTypeHttps, /*secure=*/true,
9701 MockDnsClientRule::Result(BuildTestDnsResponse(
9702 kName, dns_protocol::kTypeHttps, records)),
9703 /*delay=*/false);
9704
9705 CreateResolver();
9706 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
9707 DnsConfigOverrides overrides;
9708 overrides.secure_dns_mode = SecureDnsMode::kSecure;
9709 resolver_->SetDnsConfigOverrides(overrides);
9710 resolver_->SetInsecureDnsClientEnabled(
9711 /*enabled=*/true,
9712 /*additional_dns_types_enabled=*/false);
9713
9714 HostResolver::ResolveHostParameters parameters;
Eric Orthcf8e00f2021-07-24 00:41:249715 parameters.dns_query_type = DnsQueryType::HTTPS_EXPERIMENTAL;
Eric Orth09746312021-05-05 15:44:589716
9717 ResolveHostResponseHelper response(resolver_->CreateRequest(
9718 HostPortPair(kName, 108), NetworkIsolationKey(), NetLogWithSource(),
9719 parameters, resolve_context_.get(), resolve_context_->host_cache()));
9720 // Experimental type, so does not affect overall result.
Eric Orth1a81b6d22021-07-26 17:39:109721 EXPECT_THAT(response.result_error(), IsOk());
Eric Orth09746312021-05-05 15:44:589722 EXPECT_FALSE(response.request()->GetAddressResults());
9723 EXPECT_FALSE(response.request()->GetHostnameResults());
9724 EXPECT_FALSE(response.request()->GetTextResults());
Eric Orth1a81b6d22021-07-26 17:39:109725 EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(),
9726 testing::Optional(testing::ElementsAre(true)));
Eric Orth09746312021-05-05 15:44:589727}
9728
9729TEST_F(HostResolverManagerDnsTest,
Eric Orthcf8e00f2021-07-24 00:41:249730 ExperimentalHttpsFallbackQueryDisallowedWhenAdditionalTypesDisallowed) {
Eric Orth09746312021-05-05 15:44:589731 const char kName[] = "https.test";
9732
9733 MockDnsClientRuleList rules;
Peter Kastingd039b772021-08-18 00:06:209734 rules.emplace_back(
9735 kName, dns_protocol::kTypeHttps, /*secure=*/true,
9736 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kFail),
9737 /*delay=*/false);
Eric Orth09746312021-05-05 15:44:589738 // No expected HTTPS request in insecure mode.
9739
9740 CreateResolver();
9741 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
9742 DnsConfigOverrides overrides;
9743 overrides.secure_dns_mode = SecureDnsMode::kAutomatic;
9744 resolver_->SetDnsConfigOverrides(overrides);
9745 resolver_->SetInsecureDnsClientEnabled(
9746 /*enabled=*/true,
9747 /*additional_dns_types_enabled=*/false);
9748
9749 HostResolver::ResolveHostParameters parameters;
Eric Orthcf8e00f2021-07-24 00:41:249750 parameters.dns_query_type = DnsQueryType::HTTPS_EXPERIMENTAL;
Eric Orth09746312021-05-05 15:44:589751
9752 ResolveHostResponseHelper response(resolver_->CreateRequest(
9753 HostPortPair(kName, 108), NetworkIsolationKey(), NetLogWithSource(),
9754 parameters, resolve_context_.get(), resolve_context_->host_cache()));
9755
9756 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
9757 EXPECT_FALSE(response.request()->GetAddressResults());
9758 EXPECT_FALSE(response.request()->GetHostnameResults());
9759 EXPECT_FALSE(response.request()->GetTextResults());
9760 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
9761}
9762
Eric Orth3b26e3ba2020-11-12 22:43:139763// Test that HTTPS records can be extracted from a response that also contains
9764// unrecognized record types.
Eric Orthcf8e00f2021-07-24 00:41:249765TEST_F(HostResolverManagerDnsTest,
9766 ExperimentalHttpsQuery_MixedWithUnrecognizedType) {
Eric Orth3b26e3ba2020-11-12 22:43:139767 const std::string kName = "https.test";
9768
9769 MockDnsClientRuleList rules;
9770 std::vector<DnsResourceRecord> records = {
9771 BuildTestDnsRecord(kName, 3u /* type */, "fake rdata 1"),
9772 BuildTestHttpsAliasRecord(kName, "alias.test"),
9773 BuildTestDnsRecord(kName, 3u /* type */, "fake rdata 2")};
9774 rules.emplace_back(kName, dns_protocol::kTypeHttps, false /* secure */,
9775 MockDnsClientRule::Result(BuildTestDnsResponse(
9776 kName, dns_protocol::kTypeHttps, records)),
9777 false /* delay */);
9778
9779 CreateResolver();
9780 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
9781
9782 HostResolver::ResolveHostParameters parameters;
Eric Orthcf8e00f2021-07-24 00:41:249783 parameters.dns_query_type = DnsQueryType::HTTPS_EXPERIMENTAL;
Eric Orth3b26e3ba2020-11-12 22:43:139784
9785 ResolveHostResponseHelper response(resolver_->CreateRequest(
9786 HostPortPair(kName, 108), NetworkIsolationKey(), NetLogWithSource(),
9787 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth1a81b6d22021-07-26 17:39:109788 EXPECT_THAT(response.result_error(), IsOk());
Eric Orth3b26e3ba2020-11-12 22:43:139789 EXPECT_FALSE(response.request()->GetAddressResults());
9790 EXPECT_FALSE(response.request()->GetHostnameResults());
9791 EXPECT_FALSE(response.request()->GetTextResults());
Eric Orth1a81b6d22021-07-26 17:39:109792 EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(),
9793 testing::Optional(testing::ElementsAre(true)));
Eric Orth3b26e3ba2020-11-12 22:43:139794}
9795
Eric Orthcf8e00f2021-07-24 00:41:249796TEST_F(HostResolverManagerDnsTest, ExperimentalHttpsQuery_MultipleResults) {
Eric Orth7139e0552020-11-04 02:41:119797 const std::string kName = "https.test";
9798
9799 MockDnsClientRuleList rules;
9800 std::vector<DnsResourceRecord> records = {
9801 BuildTestHttpsAliasRecord(kName, "alias.test"),
9802 BuildTestHttpsAliasRecord(kName, "another-alias.test")};
9803 rules.emplace_back(kName, dns_protocol::kTypeHttps, false /* secure */,
9804 MockDnsClientRule::Result(BuildTestDnsResponse(
9805 kName, dns_protocol::kTypeHttps, records)),
9806 false /* delay */);
9807
9808 CreateResolver();
9809 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
9810
9811 HostResolver::ResolveHostParameters parameters;
Eric Orthcf8e00f2021-07-24 00:41:249812 parameters.dns_query_type = DnsQueryType::HTTPS_EXPERIMENTAL;
Eric Orth7139e0552020-11-04 02:41:119813
9814 ResolveHostResponseHelper response(resolver_->CreateRequest(
9815 HostPortPair(kName, 108), NetworkIsolationKey(), NetLogWithSource(),
9816 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth1a81b6d22021-07-26 17:39:109817 EXPECT_THAT(response.result_error(), IsOk());
Eric Orth7139e0552020-11-04 02:41:119818 EXPECT_FALSE(response.request()->GetAddressResults());
9819 EXPECT_FALSE(response.request()->GetHostnameResults());
9820 EXPECT_FALSE(response.request()->GetTextResults());
Eric Orth1a81b6d22021-07-26 17:39:109821 EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(),
9822 testing::Optional(testing::ElementsAre(true, true)));
Eric Orth5d21f152020-10-21 19:15:439823}
9824
Eric Orthcf8e00f2021-07-24 00:41:249825TEST_F(HostResolverManagerDnsTest, ExperimentalHttpsQuery_InvalidConfig) {
Eric Orth5d21f152020-10-21 19:15:439826 set_allow_fallback_to_proctask(false);
9827 // Set empty DnsConfig.
9828 InvalidateDnsConfig();
9829
9830 HostResolver::ResolveHostParameters parameters;
Eric Orthcf8e00f2021-07-24 00:41:249831 parameters.dns_query_type = DnsQueryType::HTTPS_EXPERIMENTAL;
Eric Orth5d21f152020-10-21 19:15:439832
9833 ResolveHostResponseHelper response(resolver_->CreateRequest(
9834 HostPortPair("https.test", 108), NetworkIsolationKey(),
9835 NetLogWithSource(), parameters, resolve_context_.get(),
9836 resolve_context_->host_cache()));
9837 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_CACHE_MISS));
9838}
9839
Eric Orthcf8e00f2021-07-24 00:41:249840TEST_F(HostResolverManagerDnsTest, ExperimentalHttpsQuery_NonexistentDomain) {
Eric Orth5d21f152020-10-21 19:15:439841 const std::string kName = "https.test";
9842
9843 // Setup fallback to confirm it is not used for non-address results.
9844 set_allow_fallback_to_proctask(true);
9845 proc_->AddRuleForAllFamilies(kName, "192.168.1.102");
9846 proc_->SignalMultiple(1u);
9847
9848 MockDnsClientRuleList rules;
Peter Kastingd039b772021-08-18 00:06:209849 rules.emplace_back(
9850 kName, dns_protocol::kTypeHttps, false /* secure */,
9851 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kNoDomain),
9852 false /* delay */);
Eric Orth5d21f152020-10-21 19:15:439853
9854 CreateResolver();
9855 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
9856
9857 HostResolver::ResolveHostParameters parameters;
Eric Orthcf8e00f2021-07-24 00:41:249858 parameters.dns_query_type = DnsQueryType::HTTPS_EXPERIMENTAL;
Eric Orth5d21f152020-10-21 19:15:439859
9860 ResolveHostResponseHelper response(resolver_->CreateRequest(
9861 HostPortPair(kName, 108), NetworkIsolationKey(), NetLogWithSource(),
9862 parameters, resolve_context_.get(), resolve_context_->host_cache()));
9863 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
9864 EXPECT_FALSE(response.request()->GetAddressResults());
9865 EXPECT_FALSE(response.request()->GetTextResults());
9866 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth7139e0552020-11-04 02:41:119867 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Eric Orth5d21f152020-10-21 19:15:439868}
9869
Eric Orthcf8e00f2021-07-24 00:41:249870TEST_F(HostResolverManagerDnsTest, ExperimentalHttpsQuery_Failure) {
Eric Orth5d21f152020-10-21 19:15:439871 const std::string kName = "https.test";
9872
9873 // Setup fallback to confirm it is not used for non-address results.
9874 set_allow_fallback_to_proctask(true);
9875 proc_->AddRuleForAllFamilies(kName, "192.168.1.102");
9876 proc_->SignalMultiple(1u);
9877
9878 MockDnsClientRuleList rules;
Peter Kastingd039b772021-08-18 00:06:209879 rules.emplace_back(
9880 kName, dns_protocol::kTypeHttps, false /* secure */,
9881 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kFail),
9882 false /* delay */);
Eric Orth5d21f152020-10-21 19:15:439883
9884 CreateResolver();
9885 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
9886
9887 HostResolver::ResolveHostParameters parameters;
Eric Orthcf8e00f2021-07-24 00:41:249888 parameters.dns_query_type = DnsQueryType::HTTPS_EXPERIMENTAL;
Eric Orth5d21f152020-10-21 19:15:439889
9890 ResolveHostResponseHelper response(resolver_->CreateRequest(
9891 HostPortPair(kName, 108), NetworkIsolationKey(), NetLogWithSource(),
9892 parameters, resolve_context_.get(), resolve_context_->host_cache()));
9893 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
9894 EXPECT_FALSE(response.request()->GetAddressResults());
9895 EXPECT_FALSE(response.request()->GetTextResults());
9896 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth7139e0552020-11-04 02:41:119897 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Eric Orth5d21f152020-10-21 19:15:439898
9899 // Expect result not cached.
9900 EXPECT_EQ(resolve_context_->host_cache()->size(), 0u);
9901}
9902
Eric Orthcf8e00f2021-07-24 00:41:249903TEST_F(HostResolverManagerDnsTest, ExperimentalHttpsQuery_Timeout) {
Eric Orth5d21f152020-10-21 19:15:439904 const std::string kName = "https.test";
9905
9906 // Setup fallback to confirm it is not used for non-address results.
9907 set_allow_fallback_to_proctask(true);
9908 proc_->AddRuleForAllFamilies(kName, "192.168.1.102");
9909 proc_->SignalMultiple(1u);
9910
9911 MockDnsClientRuleList rules;
Peter Kastingd039b772021-08-18 00:06:209912 rules.emplace_back(
9913 kName, dns_protocol::kTypeHttps, false /* secure */,
9914 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kTimeout),
9915 false /* delay */);
Eric Orth5d21f152020-10-21 19:15:439916
9917 CreateResolver();
9918 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
9919
9920 HostResolver::ResolveHostParameters parameters;
Eric Orthcf8e00f2021-07-24 00:41:249921 parameters.dns_query_type = DnsQueryType::HTTPS_EXPERIMENTAL;
Eric Orth5d21f152020-10-21 19:15:439922
9923 ResolveHostResponseHelper response(resolver_->CreateRequest(
9924 HostPortPair(kName, 108), NetworkIsolationKey(), NetLogWithSource(),
9925 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth5d21f152020-10-21 19:15:439926 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
9927 EXPECT_FALSE(response.request()->GetAddressResults());
9928 EXPECT_FALSE(response.request()->GetTextResults());
9929 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth7139e0552020-11-04 02:41:119930 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Eric Orth5d21f152020-10-21 19:15:439931
9932 // Expect result not cached.
9933 EXPECT_EQ(resolve_context_->host_cache()->size(), 0u);
9934}
9935
Eric Orthcf8e00f2021-07-24 00:41:249936TEST_F(HostResolverManagerDnsTest, ExperimentalHttpsQuery_Empty) {
Eric Orth5d21f152020-10-21 19:15:439937 const std::string kName = "https.test";
9938
9939 // Setup fallback to confirm it is not used for non-address results.
9940 set_allow_fallback_to_proctask(true);
9941 proc_->AddRuleForAllFamilies(kName, "192.168.1.102");
9942 proc_->SignalMultiple(1u);
9943
9944 MockDnsClientRuleList rules;
Peter Kastingd039b772021-08-18 00:06:209945 rules.emplace_back(
9946 kName, dns_protocol::kTypeHttps, false /* secure */,
9947 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kEmpty),
9948 false /* delay */);
Eric Orth5d21f152020-10-21 19:15:439949
9950 CreateResolver();
9951 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
9952
9953 HostResolver::ResolveHostParameters parameters;
Eric Orthcf8e00f2021-07-24 00:41:249954 parameters.dns_query_type = DnsQueryType::HTTPS_EXPERIMENTAL;
Eric Orth5d21f152020-10-21 19:15:439955
9956 ResolveHostResponseHelper response(resolver_->CreateRequest(
9957 HostPortPair(kName, 108), NetworkIsolationKey(), NetLogWithSource(),
9958 parameters, resolve_context_.get(), resolve_context_->host_cache()));
9959 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
9960 EXPECT_FALSE(response.request()->GetAddressResults());
9961 EXPECT_FALSE(response.request()->GetTextResults());
9962 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth7139e0552020-11-04 02:41:119963 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Eric Orth5d21f152020-10-21 19:15:439964}
9965
Eric Orthcf8e00f2021-07-24 00:41:249966TEST_F(HostResolverManagerDnsTest, ExperimentalHttpsQuery_Malformed) {
Eric Orth5d21f152020-10-21 19:15:439967 const std::string kName = "https.test";
9968
9969 // Setup fallback to confirm it is not used for non-address results.
9970 set_allow_fallback_to_proctask(true);
9971 proc_->AddRuleForAllFamilies(kName, "192.168.1.102");
9972 proc_->SignalMultiple(1u);
9973
9974 MockDnsClientRuleList rules;
Peter Kastingd039b772021-08-18 00:06:209975 rules.emplace_back(
9976 kName, dns_protocol::kTypeHttps, false /* secure */,
9977 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kMalformed),
9978 false /* delay */);
Eric Orth5d21f152020-10-21 19:15:439979
9980 CreateResolver();
9981 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
9982
9983 HostResolver::ResolveHostParameters parameters;
Eric Orthcf8e00f2021-07-24 00:41:249984 parameters.dns_query_type = DnsQueryType::HTTPS_EXPERIMENTAL;
Eric Orth5d21f152020-10-21 19:15:439985
9986 ResolveHostResponseHelper response(resolver_->CreateRequest(
9987 HostPortPair(kName, 108), NetworkIsolationKey(), NetLogWithSource(),
9988 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth5d21f152020-10-21 19:15:439989 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
9990 EXPECT_FALSE(response.request()->GetAddressResults());
Eric Orth5d21f152020-10-21 19:15:439991 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth7139e0552020-11-04 02:41:119992 EXPECT_FALSE(response.request()->GetTextResults());
Eric Orth7139e0552020-11-04 02:41:119993 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Eric Orth5d21f152020-10-21 19:15:439994
9995 // Expect result not cached.
9996 EXPECT_EQ(resolve_context_->host_cache()->size(), 0u);
9997}
9998
Eric Orthcf8e00f2021-07-24 00:41:249999TEST_F(HostResolverManagerDnsTest, ExperimentalHttpsQuery_MismatchedName) {
Eric Orth5d21f152020-10-21 19:15:4310000 const std::string kName = "https.test";
10001
10002 MockDnsClientRuleList rules;
Eric Orth7139e0552020-11-04 02:41:1110003 std::vector<DnsResourceRecord> records = {
10004 BuildTestHttpsAliasRecord("different.test", "alias.test")};
Eric Orth5d21f152020-10-21 19:15:4310005 rules.emplace_back(kName, dns_protocol::kTypeHttps, false /* secure */,
10006 MockDnsClientRule::Result(BuildTestDnsResponse(
10007 kName, dns_protocol::kTypeHttps, records)),
10008 false /* delay */);
10009
10010 CreateResolver();
10011 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
10012
10013 HostResolver::ResolveHostParameters parameters;
Eric Orthcf8e00f2021-07-24 00:41:2410014 parameters.dns_query_type = DnsQueryType::HTTPS_EXPERIMENTAL;
Eric Orth5d21f152020-10-21 19:15:4310015
10016 ResolveHostResponseHelper response(resolver_->CreateRequest(
10017 HostPortPair(kName, 108), NetworkIsolationKey(), NetLogWithSource(),
10018 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth5d21f152020-10-21 19:15:4310019 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
10020 EXPECT_FALSE(response.request()->GetAddressResults());
Eric Orth5d21f152020-10-21 19:15:4310021 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth7139e0552020-11-04 02:41:1110022 EXPECT_FALSE(response.request()->GetTextResults());
Eric Orth7139e0552020-11-04 02:41:1110023 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Eric Orth5d21f152020-10-21 19:15:4310024
10025 // Expect result not cached.
10026 EXPECT_EQ(resolve_context_->host_cache()->size(), 0u);
10027}
10028
Eric Orthcf8e00f2021-07-24 00:41:2410029TEST_F(HostResolverManagerDnsTest, ExperimentalHttpsQuery_AdditionalRecords) {
Eric Orth69c25992020-11-10 16:55:1210030 const std::string kName = "https.test";
10031
10032 MockDnsClientRuleList rules;
10033 std::vector<DnsResourceRecord> records = {
10034 BuildTestHttpsAliasRecord(kName, "alias.test")};
10035 std::vector<DnsResourceRecord> additional = {
10036 BuildTestHttpsServiceRecord(kName, 3u, "service1.test", {}),
10037 BuildTestHttpsServiceRecord(kName, 2u, "service2.test", {})};
10038 rules.emplace_back(kName, dns_protocol::kTypeHttps, false /* secure */,
10039 MockDnsClientRule::Result(BuildTestDnsResponse(
10040 kName, dns_protocol::kTypeHttps, records,
10041 {} /* authority */, additional)),
10042 false /* delay */);
10043
10044 CreateResolver();
10045 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
10046
10047 HostResolver::ResolveHostParameters parameters;
Eric Orthcf8e00f2021-07-24 00:41:2410048 parameters.dns_query_type = DnsQueryType::HTTPS_EXPERIMENTAL;
Eric Orth69c25992020-11-10 16:55:1210049
10050 ResolveHostResponseHelper response(resolver_->CreateRequest(
10051 HostPortPair(kName, 108), NetworkIsolationKey(), NetLogWithSource(),
10052 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth1a81b6d22021-07-26 17:39:1010053 EXPECT_THAT(response.result_error(), IsOk());
Eric Orth69c25992020-11-10 16:55:1210054 EXPECT_FALSE(response.request()->GetAddressResults());
10055 EXPECT_FALSE(response.request()->GetHostnameResults());
10056 EXPECT_FALSE(response.request()->GetTextResults());
Eric Orth1a81b6d22021-07-26 17:39:1010057 // Additional records aren't currently used in results.
10058 EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(),
10059 testing::Optional(testing::ElementsAre(true)));
Eric Orth69c25992020-11-10 16:55:1210060}
10061
Eric Orthcf8e00f2021-07-24 00:41:2410062TEST_F(HostResolverManagerDnsTest, ExperimentalHttpsQuery_WrongType) {
Eric Orth5d21f152020-10-21 19:15:4310063 const std::string kName = "https.test";
10064
10065 // Respond to an HTTPS query with an A response.
10066 MockDnsClientRuleList rules;
Eric Orth7139e0552020-11-04 02:41:1110067 rules.emplace_back(
10068 kName, dns_protocol::kTypeHttps, false /* secure */,
10069 MockDnsClientRule::Result(BuildTestDnsResponse(
10070 kName, dns_protocol::kTypeHttps,
10071 {BuildTestAddressRecord(kName, IPAddress(1, 2, 3, 4))})),
10072 false /* delay */);
Eric Orth5d21f152020-10-21 19:15:4310073
10074 CreateResolver();
10075 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
10076
10077 HostResolver::ResolveHostParameters parameters;
Eric Orthcf8e00f2021-07-24 00:41:2410078 parameters.dns_query_type = DnsQueryType::HTTPS_EXPERIMENTAL;
Eric Orth5d21f152020-10-21 19:15:4310079
10080 // Responses for the wrong type should be ignored.
10081 ResolveHostResponseHelper response(resolver_->CreateRequest(
10082 HostPortPair(kName, 108), NetworkIsolationKey(), NetLogWithSource(),
10083 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth5d21f152020-10-21 19:15:4310084 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
10085 EXPECT_FALSE(response.request()->GetAddressResults());
Eric Orth5d21f152020-10-21 19:15:4310086 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth7139e0552020-11-04 02:41:1110087 EXPECT_FALSE(response.request()->GetTextResults());
Eric Orth7139e0552020-11-04 02:41:1110088 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Eric Orth5d21f152020-10-21 19:15:4310089
10090 // Expect result not cached.
10091 EXPECT_EQ(resolve_context_->host_cache()->size(), 0u);
10092}
10093
Eric Orthcf8e00f2021-07-24 00:41:2410094// Same as ExperimentalHttpsQuery except we specify DNS HostResolverSource
10095// instead of relying on automatic determination. Expect same results since DNS
10096// should be what we automatically determine, but some slightly different logic
10097// paths are involved.
10098TEST_F(HostResolverManagerDnsTest, ExperimentalHttpsDnsQuery) {
Eric Orth5d21f152020-10-21 19:15:4310099 const std::string kName = "https.test";
10100
10101 MockDnsClientRuleList rules;
Eric Orth7139e0552020-11-04 02:41:1110102 std::vector<DnsResourceRecord> records = {
10103 BuildTestHttpsAliasRecord(kName, "alias.test")};
Eric Orth5d21f152020-10-21 19:15:4310104 rules.emplace_back(kName, dns_protocol::kTypeHttps, false /* secure */,
10105 MockDnsClientRule::Result(BuildTestDnsResponse(
10106 kName, dns_protocol::kTypeHttps, records)),
10107 false /* delay */);
10108
10109 CreateResolver();
10110 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
10111
10112 HostResolver::ResolveHostParameters parameters;
10113 parameters.source = HostResolverSource::DNS;
Eric Orthcf8e00f2021-07-24 00:41:2410114 parameters.dns_query_type = DnsQueryType::HTTPS_EXPERIMENTAL;
Eric Orth5d21f152020-10-21 19:15:4310115
10116 ResolveHostResponseHelper response(resolver_->CreateRequest(
10117 HostPortPair(kName, 108), NetworkIsolationKey(), NetLogWithSource(),
10118 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth1a81b6d22021-07-26 17:39:1010119 EXPECT_THAT(response.result_error(), IsOk());
Eric Orth5d21f152020-10-21 19:15:4310120 EXPECT_FALSE(response.request()->GetAddressResults());
Eric Orth5d21f152020-10-21 19:15:4310121 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth7139e0552020-11-04 02:41:1110122 EXPECT_FALSE(response.request()->GetTextResults());
Eric Orth1a81b6d22021-07-26 17:39:1010123 EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(),
10124 testing::Optional(testing::ElementsAre(true)));
Eric Orth5d21f152020-10-21 19:15:4310125}
10126
Eric Orthcf8e00f2021-07-24 00:41:2410127// Same as ExperimentalHttpsInsecureQueryDisallowedWhenAdditionalTypesDisallowed
10128// except we specify DNS HostResolverSource instead of relying on automatic
10129// determination. Expect same results since DNS should be what we automatically
10130// determine, but some slightly different logic paths are involved.
10131TEST_F(
10132 HostResolverManagerDnsTest,
10133 ExperimentalHttpsDnsInsecureQueryDisallowedWhenAdditionalTypesDisallowed) {
Eric Orth09746312021-05-05 15:44:5810134 const std::string kName = "https.test";
10135
10136 DnsConfigOverrides overrides;
10137 overrides.secure_dns_mode = SecureDnsMode::kOff;
10138 resolver_->SetDnsConfigOverrides(overrides);
10139 resolver_->SetInsecureDnsClientEnabled(
10140 /*enabled=*/true,
10141 /*additional_dns_types_enabled=*/false);
10142
10143 HostResolver::ResolveHostParameters parameters;
10144 parameters.source = HostResolverSource::DNS;
Eric Orthcf8e00f2021-07-24 00:41:2410145 parameters.dns_query_type = DnsQueryType::HTTPS_EXPERIMENTAL;
Eric Orth09746312021-05-05 15:44:5810146
10147 ResolveHostResponseHelper response(resolver_->CreateRequest(
10148 HostPortPair(kName, 108), NetworkIsolationKey(), NetLogWithSource(),
10149 parameters, resolve_context_.get(), resolve_context_->host_cache()));
10150 // No non-local work is done, so ERR_DNS_CACHE_MISS is the result.
10151 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_CACHE_MISS));
10152 EXPECT_FALSE(response.request()->GetAddressResults());
10153 EXPECT_FALSE(response.request()->GetHostnameResults());
10154 EXPECT_FALSE(response.request()->GetTextResults());
10155 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
10156}
10157
Eric Orth5d21f152020-10-21 19:15:4310158TEST_F(HostResolverManagerDnsTest, HttpsInAddressQuery) {
Eric Orthcf8e00f2021-07-24 00:41:2410159 const char kName[] = "name.test";
10160
10161 base::test::ScopedFeatureList features(features::kUseDnsHttpsSvcb);
10162
10163 MockDnsClientRuleList rules;
10164 std::vector<DnsResourceRecord> records = {
10165 BuildTestHttpsAliasRecord(kName, "alias.test")};
10166 rules.emplace_back(kName, dns_protocol::kTypeHttps, /*secure=*/true,
10167 MockDnsClientRule::Result(BuildTestDnsResponse(
10168 kName, dns_protocol::kTypeHttps, records)),
10169 /*delay=*/false);
Peter Kastingd039b772021-08-18 00:06:2010170 rules.emplace_back(
10171 kName, dns_protocol::kTypeA, /*secure=*/true,
10172 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
10173 /*delay=*/false);
10174 rules.emplace_back(
10175 kName, dns_protocol::kTypeAAAA, /*secure=*/true,
10176 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
10177 /*delay=*/false);
Eric Orthcf8e00f2021-07-24 00:41:2410178
10179 CreateResolver();
10180 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
10181 DnsConfigOverrides overrides;
10182 overrides.secure_dns_mode = SecureDnsMode::kSecure;
10183 resolver_->SetDnsConfigOverrides(overrides);
10184
10185 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth815e90b2021-07-30 22:57:2210186 url::SchemeHostPort(url::kHttpsScheme, kName, 443), NetworkIsolationKey(),
10187 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
10188 resolve_context_->host_cache()));
10189 EXPECT_THAT(response.result_error(), IsOk());
10190 EXPECT_TRUE(response.request()->GetAddressResults());
10191 EXPECT_FALSE(response.request()->GetTextResults());
10192 EXPECT_FALSE(response.request()->GetHostnameResults());
10193 EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(),
10194 testing::Optional(testing::ElementsAre(true)));
10195}
10196
10197TEST_F(HostResolverManagerDnsTest, HttpsInAddressQueryWithNonstandardPort) {
10198 const char kName[] = "name.test";
10199 const char kExpectedHttpsQueryName[] = "_108._https.name.test";
10200
10201 base::test::ScopedFeatureList features(features::kUseDnsHttpsSvcb);
10202
10203 MockDnsClientRuleList rules;
10204 std::vector<DnsResourceRecord> records = {
10205 BuildTestHttpsAliasRecord(kExpectedHttpsQueryName, "alias.test")};
10206 rules.emplace_back(
10207 kExpectedHttpsQueryName, dns_protocol::kTypeHttps,
10208 /*secure=*/true,
10209 MockDnsClientRule::Result(BuildTestDnsResponse(
10210 kExpectedHttpsQueryName, dns_protocol::kTypeHttps, records)),
10211 /*delay=*/false);
Peter Kastingd039b772021-08-18 00:06:2010212 rules.emplace_back(
10213 kName, dns_protocol::kTypeA, /*secure=*/true,
10214 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
10215 /*delay=*/false);
10216 rules.emplace_back(
10217 kName, dns_protocol::kTypeAAAA, /*secure=*/true,
10218 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
10219 /*delay=*/false);
Eric Orth815e90b2021-07-30 22:57:2210220
10221 CreateResolver();
10222 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
10223 DnsConfigOverrides overrides;
10224 overrides.secure_dns_mode = SecureDnsMode::kSecure;
10225 resolver_->SetDnsConfigOverrides(overrides);
10226
10227 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orthcf8e00f2021-07-24 00:41:2410228 url::SchemeHostPort(url::kHttpsScheme, kName, 108), NetworkIsolationKey(),
10229 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
10230 resolve_context_->host_cache()));
10231 EXPECT_THAT(response.result_error(), IsOk());
10232 EXPECT_TRUE(response.request()->GetAddressResults());
10233 EXPECT_FALSE(response.request()->GetTextResults());
10234 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orthac9aafb2021-07-29 23:03:4310235 EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(),
10236 testing::Optional(testing::ElementsAre(true)));
10237}
10238
10239TEST_F(HostResolverManagerDnsTest, HttpsInAddressQueryWithoutAddresses) {
10240 const char kName[] = "name.test";
10241
10242 base::test::ScopedFeatureList features(features::kUseDnsHttpsSvcb);
10243
10244 MockDnsClientRuleList rules;
10245 std::vector<DnsResourceRecord> records = {
10246 BuildTestHttpsAliasRecord(kName, "alias.test")};
10247 rules.emplace_back(kName, dns_protocol::kTypeHttps, /*secure=*/true,
10248 MockDnsClientRule::Result(BuildTestDnsResponse(
10249 kName, dns_protocol::kTypeHttps, records)),
10250 /*delay=*/false);
Peter Kastingd039b772021-08-18 00:06:2010251 rules.emplace_back(
10252 kName, dns_protocol::kTypeA, /*secure=*/true,
10253 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kEmpty),
10254 /*delay=*/false);
10255 rules.emplace_back(
10256 kName, dns_protocol::kTypeAAAA, /*secure=*/true,
10257 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kEmpty),
10258 /*delay=*/false);
Eric Orthac9aafb2021-07-29 23:03:4310259
10260 CreateResolver();
10261 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
10262 DnsConfigOverrides overrides;
10263 overrides.secure_dns_mode = SecureDnsMode::kSecure;
10264 resolver_->SetDnsConfigOverrides(overrides);
10265
10266 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth815e90b2021-07-30 22:57:2210267 url::SchemeHostPort(url::kHttpsScheme, kName, 443), NetworkIsolationKey(),
Eric Orthac9aafb2021-07-29 23:03:4310268 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
10269 resolve_context_->host_cache()));
10270 // No address results overrides overall result.
10271 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
10272 EXPECT_FALSE(response.request()->GetAddressResults());
10273 EXPECT_FALSE(response.request()->GetTextResults());
10274 EXPECT_FALSE(response.request()->GetHostnameResults());
10275 // No results maintained when overall error is ERR_NAME_NOT_RESOLVED.
Eric Orthcf8e00f2021-07-24 00:41:2410276 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Eric Orthac9aafb2021-07-29 23:03:4310277}
10278
10279TEST_F(HostResolverManagerDnsTest, HttpsQueriedInAddressQueryButNoResults) {
10280 const char kName[] = "name.test";
10281
10282 base::test::ScopedFeatureList features(features::kUseDnsHttpsSvcb);
10283
10284 MockDnsClientRuleList rules;
Peter Kastingd039b772021-08-18 00:06:2010285 rules.emplace_back(
10286 kName, dns_protocol::kTypeHttps, /*secure=*/true,
10287 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kEmpty),
10288 /*delay=*/false);
10289 rules.emplace_back(
10290 kName, dns_protocol::kTypeA, /*secure=*/true,
10291 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
10292 /*delay=*/false);
10293 rules.emplace_back(
10294 kName, dns_protocol::kTypeAAAA, /*secure=*/true,
10295 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
10296 /*delay=*/false);
Eric Orthac9aafb2021-07-29 23:03:4310297
10298 CreateResolver();
10299 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
10300 DnsConfigOverrides overrides;
10301 overrides.secure_dns_mode = SecureDnsMode::kSecure;
10302 resolver_->SetDnsConfigOverrides(overrides);
10303
10304 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth815e90b2021-07-30 22:57:2210305 url::SchemeHostPort(url::kHttpsScheme, kName, 443), NetworkIsolationKey(),
Eric Orthac9aafb2021-07-29 23:03:4310306 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
10307 resolve_context_->host_cache()));
10308 EXPECT_THAT(response.result_error(), IsOk());
10309 EXPECT_TRUE(response.request()->GetAddressResults());
10310 EXPECT_FALSE(response.request()->GetTextResults());
10311 EXPECT_FALSE(response.request()->GetHostnameResults());
10312 EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(),
10313 testing::Optional(testing::IsEmpty()));
10314}
10315
10316// For a response where DnsTransaction can at least do its basic parsing and
10317// return a DnsResponse object to HostResolverManager. See
10318// `UnparsableHttpsInAddressRequestIsFatal` for a response so unparsable that
10319// DnsTransaction couldn't do that.
10320TEST_F(HostResolverManagerDnsTest,
10321 MalformedHttpsInResponseInAddressRequestIsIgnored) {
10322 const char kName[] = "name.test";
10323
10324 base::test::ScopedFeatureList features;
10325 features.InitAndEnableFeatureWithParameters(
10326 features::kUseDnsHttpsSvcb,
10327 {{"UseDnsHttpsSvcbEnforceSecureResponse", "true"}});
10328
10329 MockDnsClientRuleList rules;
Peter Kastingd039b772021-08-18 00:06:2010330 rules.emplace_back(
10331 kName, dns_protocol::kTypeHttps, /*secure=*/true,
10332 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kMalformed),
10333 /*delay=*/false);
10334 rules.emplace_back(
10335 kName, dns_protocol::kTypeA, /*secure=*/true,
10336 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
10337 /*delay=*/false);
10338 rules.emplace_back(
10339 kName, dns_protocol::kTypeAAAA, /*secure=*/true,
10340 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
10341 /*delay=*/false);
Eric Orthac9aafb2021-07-29 23:03:4310342
10343 CreateResolver();
10344 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
10345 DnsConfigOverrides overrides;
10346 overrides.secure_dns_mode = SecureDnsMode::kSecure;
10347 resolver_->SetDnsConfigOverrides(overrides);
10348
10349 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth815e90b2021-07-30 22:57:2210350 url::SchemeHostPort(url::kHttpsScheme, kName, 443), NetworkIsolationKey(),
Eric Orthac9aafb2021-07-29 23:03:4310351 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
10352 resolve_context_->host_cache()));
10353 EXPECT_THAT(response.result_error(), IsOk());
10354 EXPECT_TRUE(response.request()->GetAddressResults());
10355 EXPECT_FALSE(response.request()->GetTextResults());
10356 EXPECT_FALSE(response.request()->GetHostnameResults());
10357 EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(),
10358 testing::Optional(testing::IsEmpty()));
10359}
10360
10361TEST_F(HostResolverManagerDnsTest,
10362 MalformedHttpsRdataInAddressRequestIsIgnored) {
10363 const char kName[] = "name.test";
10364
10365 base::test::ScopedFeatureList features;
10366 features.InitAndEnableFeatureWithParameters(
10367 features::kUseDnsHttpsSvcb,
10368 {{"UseDnsHttpsSvcbEnforceSecureResponse", "true"}});
10369
10370 MockDnsClientRuleList rules;
10371 rules.emplace_back(kName, dns_protocol::kTypeHttps, /*secure=*/true,
10372 MockDnsClientRule::Result(BuildTestDnsResponse(
10373 kName, dns_protocol::kTypeHttps, /*answers=*/
10374 {BuildTestDnsRecord(kName, dns_protocol::kTypeHttps,
10375 /*rdata=*/"malformed rdata")})),
10376 /*delay=*/false);
Peter Kastingd039b772021-08-18 00:06:2010377 rules.emplace_back(
10378 kName, dns_protocol::kTypeA, /*secure=*/true,
10379 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
10380 /*delay=*/false);
10381 rules.emplace_back(
10382 kName, dns_protocol::kTypeAAAA, /*secure=*/true,
10383 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
10384 /*delay=*/false);
Eric Orthac9aafb2021-07-29 23:03:4310385
10386 CreateResolver();
10387 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
10388 DnsConfigOverrides overrides;
10389 overrides.secure_dns_mode = SecureDnsMode::kSecure;
10390 resolver_->SetDnsConfigOverrides(overrides);
10391
10392 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth815e90b2021-07-30 22:57:2210393 url::SchemeHostPort(url::kHttpsScheme, kName, 443), NetworkIsolationKey(),
Eric Orthac9aafb2021-07-29 23:03:4310394 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
10395 resolve_context_->host_cache()));
10396 EXPECT_THAT(response.result_error(), IsOk());
10397 EXPECT_TRUE(response.request()->GetAddressResults());
10398 EXPECT_FALSE(response.request()->GetTextResults());
10399 EXPECT_FALSE(response.request()->GetHostnameResults());
10400 EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(),
10401 testing::Optional(testing::IsEmpty()));
10402}
10403
10404TEST_F(HostResolverManagerDnsTest,
10405 FailedHttpsInAddressRequestIsFatalWhenFeatureEnabled) {
10406 const char kName[] = "name.test";
10407
10408 base::test::ScopedFeatureList features;
10409 features.InitAndEnableFeatureWithParameters(
10410 features::kUseDnsHttpsSvcb,
10411 {{"UseDnsHttpsSvcbEnforceSecureResponse", "true"}});
10412
10413 MockDnsClientRuleList rules;
Peter Kastingd039b772021-08-18 00:06:2010414 rules.emplace_back(
10415 kName, dns_protocol::kTypeHttps, /*secure=*/true,
10416 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kFail),
10417 /*delay=*/false);
10418 rules.emplace_back(
10419 kName, dns_protocol::kTypeA, /*secure=*/true,
10420 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
10421 /*delay=*/false);
10422 rules.emplace_back(
10423 kName, dns_protocol::kTypeAAAA, /*secure=*/true,
10424 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
10425 /*delay=*/false);
Eric Orthac9aafb2021-07-29 23:03:4310426
10427 CreateResolver();
10428 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
10429 DnsConfigOverrides overrides;
10430 overrides.secure_dns_mode = SecureDnsMode::kSecure;
10431 resolver_->SetDnsConfigOverrides(overrides);
10432
10433 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth815e90b2021-07-30 22:57:2210434 url::SchemeHostPort(url::kHttpsScheme, kName, 443), NetworkIsolationKey(),
Eric Orthac9aafb2021-07-29 23:03:4310435 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
10436 resolve_context_->host_cache()));
10437 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
10438 EXPECT_FALSE(response.request()->GetAddressResults());
10439 EXPECT_FALSE(response.request()->GetTextResults());
10440 EXPECT_FALSE(response.request()->GetHostnameResults());
10441 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
10442
10443 // Expect result not cached.
10444 EXPECT_EQ(resolve_context_->host_cache()->size(), 0u);
10445}
10446
10447TEST_F(HostResolverManagerDnsTest,
10448 FailedHttpsInAddressRequestIgnoredWhenFeatureDisabled) {
10449 const char kName[] = "name.test";
10450
10451 base::test::ScopedFeatureList features;
10452 features.InitAndEnableFeatureWithParameters(
10453 features::kUseDnsHttpsSvcb,
10454 {{"UseDnsHttpsSvcbEnforceSecureResponse", "false"}});
10455
10456 MockDnsClientRuleList rules;
Peter Kastingd039b772021-08-18 00:06:2010457 rules.emplace_back(
10458 kName, dns_protocol::kTypeHttps, /*secure=*/true,
10459 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kFail),
10460 /*delay=*/false);
10461 rules.emplace_back(
10462 kName, dns_protocol::kTypeA, /*secure=*/true,
10463 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
10464 /*delay=*/false);
10465 rules.emplace_back(
10466 kName, dns_protocol::kTypeAAAA, /*secure=*/true,
10467 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
10468 /*delay=*/false);
Eric Orthac9aafb2021-07-29 23:03:4310469
10470 CreateResolver();
10471 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
10472 DnsConfigOverrides overrides;
10473 overrides.secure_dns_mode = SecureDnsMode::kSecure;
10474 resolver_->SetDnsConfigOverrides(overrides);
10475
10476 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth815e90b2021-07-30 22:57:2210477 url::SchemeHostPort(url::kHttpsScheme, kName, 443), NetworkIsolationKey(),
Eric Orthac9aafb2021-07-29 23:03:4310478 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
10479 resolve_context_->host_cache()));
10480 EXPECT_THAT(response.result_error(), IsOk());
10481 EXPECT_TRUE(response.request()->GetAddressResults());
10482 EXPECT_FALSE(response.request()->GetTextResults());
10483 EXPECT_FALSE(response.request()->GetHostnameResults());
10484 EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(),
10485 testing::Optional(testing::IsEmpty()));
10486}
10487
10488TEST_F(HostResolverManagerDnsTest, TimeoutHttpsInAddressRequestIsFatal) {
10489 const char kName[] = "name.test";
10490
10491 base::test::ScopedFeatureList features;
10492 features.InitAndEnableFeatureWithParameters(
10493 features::kUseDnsHttpsSvcb,
10494 {{"UseDnsHttpsSvcbEnforceSecureResponse", "true"}});
10495
10496 MockDnsClientRuleList rules;
Peter Kastingd039b772021-08-18 00:06:2010497 rules.emplace_back(
10498 kName, dns_protocol::kTypeHttps, /*secure=*/true,
10499 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kTimeout),
10500 /*delay=*/false);
10501 rules.emplace_back(
10502 kName, dns_protocol::kTypeA, /*secure=*/true,
10503 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
10504 /*delay=*/false);
10505 rules.emplace_back(
10506 kName, dns_protocol::kTypeAAAA, /*secure=*/true,
10507 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
10508 /*delay=*/false);
Eric Orthac9aafb2021-07-29 23:03:4310509
10510 CreateResolver();
10511 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
10512 DnsConfigOverrides overrides;
10513 overrides.secure_dns_mode = SecureDnsMode::kSecure;
10514 resolver_->SetDnsConfigOverrides(overrides);
10515
10516 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth815e90b2021-07-30 22:57:2210517 url::SchemeHostPort(url::kHttpsScheme, kName, 443), NetworkIsolationKey(),
Eric Orthac9aafb2021-07-29 23:03:4310518 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
10519 resolve_context_->host_cache()));
10520 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_TIMED_OUT));
10521 EXPECT_FALSE(response.request()->GetAddressResults());
10522 EXPECT_FALSE(response.request()->GetTextResults());
10523 EXPECT_FALSE(response.request()->GetHostnameResults());
10524 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
10525
10526 // Expect result not cached.
10527 EXPECT_EQ(resolve_context_->host_cache()->size(), 0u);
10528}
10529
10530TEST_F(HostResolverManagerDnsTest, ServfailHttpsInAddressRequestIsFatal) {
10531 const char kName[] = "name.test";
10532
10533 base::test::ScopedFeatureList features;
10534 features.InitAndEnableFeatureWithParameters(
10535 features::kUseDnsHttpsSvcb,
10536 {{"UseDnsHttpsSvcbEnforceSecureResponse", "true"}});
10537
10538 MockDnsClientRuleList rules;
10539 rules.emplace_back(
10540 kName, dns_protocol::kTypeHttps, /*secure=*/true,
10541 MockDnsClientRule::Result(
Peter Kastingd039b772021-08-18 00:06:2010542 MockDnsClientRule::ResultType::kFail,
Eric Orthac9aafb2021-07-29 23:03:4310543 BuildTestDnsResponse(kName, dns_protocol::kTypeHttps, /*answers=*/{},
10544 /*authority=*/{}, /*additional=*/{},
10545 dns_protocol::kRcodeSERVFAIL),
10546 ERR_DNS_SERVER_FAILED),
10547 /*delay=*/false);
Peter Kastingd039b772021-08-18 00:06:2010548 rules.emplace_back(
10549 kName, dns_protocol::kTypeA, /*secure=*/true,
10550 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
10551 /*delay=*/false);
10552 rules.emplace_back(
10553 kName, dns_protocol::kTypeAAAA, /*secure=*/true,
10554 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
10555 /*delay=*/false);
Eric Orthac9aafb2021-07-29 23:03:4310556
10557 CreateResolver();
10558 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
10559 DnsConfigOverrides overrides;
10560 overrides.secure_dns_mode = SecureDnsMode::kSecure;
10561 resolver_->SetDnsConfigOverrides(overrides);
10562
10563 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth815e90b2021-07-30 22:57:2210564 url::SchemeHostPort(url::kHttpsScheme, kName, 443), NetworkIsolationKey(),
Eric Orthac9aafb2021-07-29 23:03:4310565 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
10566 resolve_context_->host_cache()));
10567 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_SERVER_FAILED));
10568 EXPECT_FALSE(response.request()->GetAddressResults());
10569 EXPECT_FALSE(response.request()->GetTextResults());
10570 EXPECT_FALSE(response.request()->GetHostnameResults());
10571 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
10572
10573 // Expect result not cached.
10574 EXPECT_EQ(resolve_context_->host_cache()->size(), 0u);
10575}
10576
10577// For a response so malformed that DnsTransaction can't do its basic parsing to
10578// determine an RCODE and return a DnsResponse object to HostResolverManager.
10579// Essentially equivalent to a network error. See
10580// `MalformedHttpsInResponseInAddressRequestIsFatal` for a malformed response
10581// that can at least send a DnsResponse to HostResolverManager.
10582TEST_F(HostResolverManagerDnsTest, UnparsableHttpsInAddressRequestIsFatal) {
10583 const char kName[] = "name.test";
10584
10585 base::test::ScopedFeatureList features;
10586 features.InitAndEnableFeatureWithParameters(
10587 features::kUseDnsHttpsSvcb,
10588 {{"UseDnsHttpsSvcbEnforceSecureResponse", "true"}});
10589
10590 MockDnsClientRuleList rules;
Peter Kastingd039b772021-08-18 00:06:2010591 rules.emplace_back(
10592 kName, dns_protocol::kTypeHttps, /*secure=*/true,
10593 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kFail,
10594 /*response=*/absl::nullopt,
10595 ERR_DNS_MALFORMED_RESPONSE),
10596 /*delay=*/false);
10597 rules.emplace_back(
10598 kName, dns_protocol::kTypeA, /*secure=*/true,
10599 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
10600 /*delay=*/false);
10601 rules.emplace_back(
10602 kName, dns_protocol::kTypeAAAA, /*secure=*/true,
10603 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
10604 /*delay=*/false);
Eric Orthac9aafb2021-07-29 23:03:4310605
10606 CreateResolver();
10607 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
10608 DnsConfigOverrides overrides;
10609 overrides.secure_dns_mode = SecureDnsMode::kSecure;
10610 resolver_->SetDnsConfigOverrides(overrides);
10611
10612 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth815e90b2021-07-30 22:57:2210613 url::SchemeHostPort(url::kHttpsScheme, kName, 443), NetworkIsolationKey(),
Eric Orthac9aafb2021-07-29 23:03:4310614 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
10615 resolve_context_->host_cache()));
10616 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE));
10617 EXPECT_FALSE(response.request()->GetAddressResults());
10618 EXPECT_FALSE(response.request()->GetTextResults());
10619 EXPECT_FALSE(response.request()->GetHostnameResults());
10620 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
10621
10622 // Expect result not cached.
10623 EXPECT_EQ(resolve_context_->host_cache()->size(), 0u);
10624}
10625
10626TEST_F(HostResolverManagerDnsTest, RefusedHttpsInAddressRequestIsIgnored) {
10627 const char kName[] = "name.test";
10628
10629 base::test::ScopedFeatureList features;
10630 features.InitAndEnableFeatureWithParameters(
10631 features::kUseDnsHttpsSvcb,
10632 {{"UseDnsHttpsSvcbEnforceSecureResponse", "true"}});
10633
10634 MockDnsClientRuleList rules;
10635 rules.emplace_back(
10636 kName, dns_protocol::kTypeHttps, /*secure=*/true,
10637 MockDnsClientRule::Result(
Peter Kastingd039b772021-08-18 00:06:2010638 MockDnsClientRule::ResultType::kFail,
Eric Orthac9aafb2021-07-29 23:03:4310639 BuildTestDnsResponse(kName, dns_protocol::kTypeHttps, /*answers=*/{},
10640 /*authority=*/{}, /*additional=*/{},
10641 dns_protocol::kRcodeREFUSED),
10642 ERR_DNS_SERVER_FAILED),
10643 /*delay=*/false);
Peter Kastingd039b772021-08-18 00:06:2010644 rules.emplace_back(
10645 kName, dns_protocol::kTypeA, /*secure=*/true,
10646 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
10647 /*delay=*/false);
10648 rules.emplace_back(
10649 kName, dns_protocol::kTypeAAAA, /*secure=*/true,
10650 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
10651 /*delay=*/false);
Eric Orthac9aafb2021-07-29 23:03:4310652
10653 CreateResolver();
10654 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
10655 DnsConfigOverrides overrides;
10656 overrides.secure_dns_mode = SecureDnsMode::kSecure;
10657 resolver_->SetDnsConfigOverrides(overrides);
10658
10659 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth815e90b2021-07-30 22:57:2210660 url::SchemeHostPort(url::kHttpsScheme, kName, 443), NetworkIsolationKey(),
Eric Orthac9aafb2021-07-29 23:03:4310661 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
10662 resolve_context_->host_cache()));
10663 EXPECT_THAT(response.result_error(), IsOk());
10664 EXPECT_TRUE(response.request()->GetAddressResults());
10665 EXPECT_FALSE(response.request()->GetTextResults());
10666 EXPECT_FALSE(response.request()->GetHostnameResults());
10667 EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(),
10668 testing::Optional(testing::IsEmpty()));
Eric Orthcf8e00f2021-07-24 00:41:2410669}
10670
10671TEST_F(HostResolverManagerDnsTest, HttpsInAddressQueryForWssScheme) {
10672 const char kName[] = "name.test";
10673
10674 base::test::ScopedFeatureList features(features::kUseDnsHttpsSvcb);
10675
10676 MockDnsClientRuleList rules;
10677 std::vector<DnsResourceRecord> records = {
10678 BuildTestHttpsAliasRecord(kName, "alias.test")};
10679 rules.emplace_back(kName, dns_protocol::kTypeHttps, /*secure=*/true,
10680 MockDnsClientRule::Result(BuildTestDnsResponse(
10681 kName, dns_protocol::kTypeHttps, records)),
10682 /*delay=*/false);
Peter Kastingd039b772021-08-18 00:06:2010683 rules.emplace_back(
10684 kName, dns_protocol::kTypeA, /*secure=*/true,
10685 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
10686 /*delay=*/false);
10687 rules.emplace_back(
10688 kName, dns_protocol::kTypeAAAA, /*secure=*/true,
10689 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
10690 /*delay=*/false);
Eric Orthcf8e00f2021-07-24 00:41:2410691
10692 CreateResolver();
10693 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
10694 DnsConfigOverrides overrides;
10695 overrides.secure_dns_mode = SecureDnsMode::kSecure;
10696 resolver_->SetDnsConfigOverrides(overrides);
10697
10698 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth815e90b2021-07-30 22:57:2210699 url::SchemeHostPort(url::kWssScheme, kName, 443), NetworkIsolationKey(),
Eric Orthcf8e00f2021-07-24 00:41:2410700 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
10701 resolve_context_->host_cache()));
10702 EXPECT_THAT(response.result_error(), IsOk());
10703 EXPECT_TRUE(response.request()->GetAddressResults());
10704 EXPECT_FALSE(response.request()->GetTextResults());
10705 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orthac9aafb2021-07-29 23:03:4310706 EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(),
10707 testing::Optional(testing::ElementsAre(true)));
Eric Orthcf8e00f2021-07-24 00:41:2410708}
10709
10710TEST_F(HostResolverManagerDnsTest, NoHttpsInAddressQueryWithoutScheme) {
10711 const char kName[] = "name.test";
10712
10713 base::test::ScopedFeatureList features(features::kUseDnsHttpsSvcb);
10714
10715 MockDnsClientRuleList rules;
10716 std::vector<DnsResourceRecord> records = {
10717 BuildTestHttpsAliasRecord(kName, "alias.test")};
Peter Kastingd039b772021-08-18 00:06:2010718 rules.emplace_back(
10719 kName, dns_protocol::kTypeA, /*secure=*/true,
10720 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
10721 /*delay=*/false);
10722 rules.emplace_back(
10723 kName, dns_protocol::kTypeAAAA, /*secure=*/true,
10724 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
10725 /*delay=*/false);
Eric Orthcf8e00f2021-07-24 00:41:2410726 // Should not be queried.
Peter Kastingd039b772021-08-18 00:06:2010727 rules.emplace_back(
10728 kName, dns_protocol::kTypeHttps, /*secure=*/true,
10729 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kUnexpected),
10730 /*delay=*/false);
Eric Orthcf8e00f2021-07-24 00:41:2410731
10732 CreateResolver();
10733 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
10734 DnsConfigOverrides overrides;
10735 overrides.secure_dns_mode = SecureDnsMode::kSecure;
10736 resolver_->SetDnsConfigOverrides(overrides);
10737
10738 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth815e90b2021-07-30 22:57:2210739 HostPortPair(kName, 443), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthcf8e00f2021-07-24 00:41:2410740 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
10741 EXPECT_THAT(response.result_error(), IsOk());
10742 EXPECT_TRUE(response.request()->GetAddressResults());
10743 EXPECT_FALSE(response.request()->GetTextResults());
10744 EXPECT_FALSE(response.request()->GetHostnameResults());
10745 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
10746}
10747
10748TEST_F(HostResolverManagerDnsTest, NoHttpsInAddressQueryForNonHttpScheme) {
10749 const char kName[] = "name.test";
10750
10751 base::test::ScopedFeatureList features(features::kUseDnsHttpsSvcb);
10752
10753 MockDnsClientRuleList rules;
10754 std::vector<DnsResourceRecord> records = {
10755 BuildTestHttpsAliasRecord(kName, "alias.test")};
Peter Kastingd039b772021-08-18 00:06:2010756 rules.emplace_back(
10757 kName, dns_protocol::kTypeA, /*secure=*/true,
10758 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
10759 /*delay=*/false);
10760 rules.emplace_back(
10761 kName, dns_protocol::kTypeAAAA, /*secure=*/true,
10762 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
10763 /*delay=*/false);
Eric Orthcf8e00f2021-07-24 00:41:2410764 // Should not be queried.
Peter Kastingd039b772021-08-18 00:06:2010765 rules.emplace_back(
10766 kName, dns_protocol::kTypeHttps, /*secure=*/true,
10767 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kUnexpected),
10768 /*delay=*/false);
Eric Orthcf8e00f2021-07-24 00:41:2410769
10770 CreateResolver();
10771 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
10772 DnsConfigOverrides overrides;
10773 overrides.secure_dns_mode = SecureDnsMode::kSecure;
10774 resolver_->SetDnsConfigOverrides(overrides);
10775
10776 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth815e90b2021-07-30 22:57:2210777 url::SchemeHostPort(url::kFtpScheme, kName, 443), NetworkIsolationKey(),
Eric Orthcf8e00f2021-07-24 00:41:2410778 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
10779 resolve_context_->host_cache()));
10780 EXPECT_THAT(response.result_error(), IsOk());
10781 EXPECT_TRUE(response.request()->GetAddressResults());
10782 EXPECT_FALSE(response.request()->GetTextResults());
10783 EXPECT_FALSE(response.request()->GetHostnameResults());
10784 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
10785}
10786
10787TEST_F(HostResolverManagerDnsTest,
10788 HttpsInAddressQueryForHttpSchemeWhenUpgradeDisabled) {
10789 const char kName[] = "name.test";
10790
10791 base::test::ScopedFeatureList features;
10792 features.InitAndEnableFeatureWithParameters(
10793 features::kUseDnsHttpsSvcb, {{"UseDnsHttpsSvcbHttpUpgrade", "false"}});
10794
10795 MockDnsClientRuleList rules;
10796 std::vector<DnsResourceRecord> records = {
Eric Orthac9aafb2021-07-29 23:03:4310797 BuildTestHttpsServiceRecord(kName, /*priority=*/1, /*service_name=*/".",
10798 /*params=*/{})};
Eric Orthcf8e00f2021-07-24 00:41:2410799 rules.emplace_back(kName, dns_protocol::kTypeHttps, /*secure=*/true,
10800 MockDnsClientRule::Result(BuildTestDnsResponse(
10801 kName, dns_protocol::kTypeHttps, records)),
10802 /*delay=*/false);
Peter Kastingd039b772021-08-18 00:06:2010803 rules.emplace_back(
10804 kName, dns_protocol::kTypeA, /*secure=*/true,
10805 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
10806 /*delay=*/false);
10807 rules.emplace_back(
10808 kName, dns_protocol::kTypeAAAA, /*secure=*/true,
10809 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
10810 /*delay=*/false);
Eric Orthcf8e00f2021-07-24 00:41:2410811
10812 CreateResolver();
10813 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
10814 DnsConfigOverrides overrides;
10815 overrides.secure_dns_mode = SecureDnsMode::kSecure;
10816 resolver_->SetDnsConfigOverrides(overrides);
10817
10818 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth815e90b2021-07-30 22:57:2210819 url::SchemeHostPort(url::kHttpScheme, kName, 80), NetworkIsolationKey(),
Eric Orthcf8e00f2021-07-24 00:41:2410820 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
10821 resolve_context_->host_cache()));
10822
10823 // With the param disabled, expect the HTTPS record to have no effect on
Eric Orthac9aafb2021-07-29 23:03:4310824 // results (except GetExperimentalResultsForTesting()).
Eric Orthcf8e00f2021-07-24 00:41:2410825 EXPECT_THAT(response.result_error(), IsOk());
10826 EXPECT_TRUE(response.request()->GetAddressResults());
10827 EXPECT_FALSE(response.request()->GetTextResults());
10828 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orthac9aafb2021-07-29 23:03:4310829 EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(),
10830 testing::Optional(testing::ElementsAre(true)));
10831}
10832
10833TEST_F(HostResolverManagerDnsTest,
10834 HttpsInAddressQueryForHttpSchemeWhenUpgradeEnabled) {
10835 const char kName[] = "name.test";
10836
10837 base::test::ScopedFeatureList features;
10838 features.InitAndEnableFeatureWithParameters(
10839 features::kUseDnsHttpsSvcb, {{"UseDnsHttpsSvcbHttpUpgrade", "true"}});
10840
10841 MockDnsClientRuleList rules;
10842 std::vector<DnsResourceRecord> records = {
10843 BuildTestHttpsServiceRecord(kName, /*priority=*/1, /*service_name=*/".",
10844 /*params=*/{})};
10845 rules.emplace_back(kName, dns_protocol::kTypeHttps, /*secure=*/true,
10846 MockDnsClientRule::Result(BuildTestDnsResponse(
10847 kName, dns_protocol::kTypeHttps, records)),
10848 /*delay=*/false);
Peter Kastingd039b772021-08-18 00:06:2010849 rules.emplace_back(
10850 kName, dns_protocol::kTypeA, /*secure=*/true,
10851 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
10852 /*delay=*/false);
10853 rules.emplace_back(
10854 kName, dns_protocol::kTypeAAAA, /*secure=*/true,
10855 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
10856 /*delay=*/false);
Eric Orthac9aafb2021-07-29 23:03:4310857
10858 CreateResolver();
10859 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
10860 DnsConfigOverrides overrides;
10861 overrides.secure_dns_mode = SecureDnsMode::kSecure;
10862 resolver_->SetDnsConfigOverrides(overrides);
10863
10864 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth815e90b2021-07-30 22:57:2210865 url::SchemeHostPort(url::kHttpScheme, kName, 80), NetworkIsolationKey(),
Eric Orthac9aafb2021-07-29 23:03:4310866 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
10867 resolve_context_->host_cache()));
10868
10869 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_NAME_HTTPS_ONLY));
10870 EXPECT_FALSE(response.request()->GetAddressResults());
10871 EXPECT_FALSE(response.request()->GetTextResults());
10872 EXPECT_FALSE(response.request()->GetHostnameResults());
10873 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
10874}
10875
10876// Even if no addresses are received for a request, finding an HTTPS record
10877// should still force an HTTP->HTTPS upgrade.
10878TEST_F(HostResolverManagerDnsTest,
10879 HttpsInAddressQueryForHttpSchemeWhenUpgradeEnabledWithoutAddresses) {
10880 const char kName[] = "name.test";
10881
10882 base::test::ScopedFeatureList features;
10883 features.InitAndEnableFeatureWithParameters(
10884 features::kUseDnsHttpsSvcb, {{"UseDnsHttpsSvcbHttpUpgrade", "true"}});
10885
10886 MockDnsClientRuleList rules;
10887 std::vector<DnsResourceRecord> records = {
10888 BuildTestHttpsServiceRecord(kName, /*priority=*/1, /*service_name=*/".",
10889 /*params=*/{})};
10890 rules.emplace_back(kName, dns_protocol::kTypeHttps, /*secure=*/true,
10891 MockDnsClientRule::Result(BuildTestDnsResponse(
10892 kName, dns_protocol::kTypeHttps, records)),
10893 /*delay=*/false);
Peter Kastingd039b772021-08-18 00:06:2010894 rules.emplace_back(
10895 kName, dns_protocol::kTypeA, /*secure=*/true,
10896 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kEmpty),
10897 /*delay=*/false);
10898 rules.emplace_back(
10899 kName, dns_protocol::kTypeAAAA, /*secure=*/true,
10900 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kEmpty),
10901 /*delay=*/false);
Eric Orthac9aafb2021-07-29 23:03:4310902
10903 CreateResolver();
10904 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
10905 DnsConfigOverrides overrides;
10906 overrides.secure_dns_mode = SecureDnsMode::kSecure;
10907 resolver_->SetDnsConfigOverrides(overrides);
10908
10909 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth815e90b2021-07-30 22:57:2210910 url::SchemeHostPort(url::kHttpScheme, kName, 80), NetworkIsolationKey(),
Eric Orthac9aafb2021-07-29 23:03:4310911 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
10912 resolve_context_->host_cache()));
10913
10914 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_NAME_HTTPS_ONLY));
10915 EXPECT_FALSE(response.request()->GetAddressResults());
10916 EXPECT_FALSE(response.request()->GetTextResults());
10917 EXPECT_FALSE(response.request()->GetHostnameResults());
10918 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Eric Orthcf8e00f2021-07-24 00:41:2410919}
10920
10921TEST_F(HostResolverManagerDnsTest, HttpsInInsecureAddressQuery) {
10922 const char kName[] = "name.test";
10923
10924 base::test::ScopedFeatureList features;
10925 features.InitAndEnableFeatureWithParameters(
10926 features::kUseDnsHttpsSvcb, {{"UseDnsHttpsSvcbEnableInsecure", "true"}});
10927
10928 MockDnsClientRuleList rules;
10929 std::vector<DnsResourceRecord> records = {
10930 BuildTestHttpsAliasRecord(kName, "alias.test")};
10931 rules.emplace_back(kName, dns_protocol::kTypeHttps, /*secure=*/false,
10932 MockDnsClientRule::Result(BuildTestDnsResponse(
10933 kName, dns_protocol::kTypeHttps, records)),
10934 /*delay=*/false);
Peter Kastingd039b772021-08-18 00:06:2010935 rules.emplace_back(
10936 kName, dns_protocol::kTypeA, /*secure=*/false,
10937 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
10938 /*delay=*/false);
10939 rules.emplace_back(
10940 kName, dns_protocol::kTypeAAAA, /*secure=*/false,
10941 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
10942 /*delay=*/false);
Eric Orthcf8e00f2021-07-24 00:41:2410943
10944 CreateResolver();
10945 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
10946
10947 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth815e90b2021-07-30 22:57:2210948 url::SchemeHostPort(url::kHttpsScheme, kName, 443), NetworkIsolationKey(),
Eric Orthcf8e00f2021-07-24 00:41:2410949 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
10950 resolve_context_->host_cache()));
10951
10952 EXPECT_THAT(response.result_error(), IsOk());
10953 EXPECT_TRUE(response.request()->GetAddressResults());
10954 EXPECT_FALSE(response.request()->GetTextResults());
10955 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orthac9aafb2021-07-29 23:03:4310956 EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(),
10957 testing::Optional(testing::ElementsAre(true)));
10958}
10959
10960TEST_F(HostResolverManagerDnsTest, FailedHttpsInInsecureAddressRequestIgnored) {
10961 const char kName[] = "name.test";
10962
10963 base::test::ScopedFeatureList features;
10964 features.InitAndEnableFeatureWithParameters(
10965 features::kUseDnsHttpsSvcb, {{"UseDnsHttpsSvcbEnableInsecure", "true"}});
10966
10967 MockDnsClientRuleList rules;
Peter Kastingd039b772021-08-18 00:06:2010968 rules.emplace_back(
10969 kName, dns_protocol::kTypeHttps, /*secure=*/false,
10970 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kFail),
10971 /*delay=*/false);
10972 rules.emplace_back(
10973 kName, dns_protocol::kTypeA, /*secure=*/false,
10974 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
10975 /*delay=*/false);
10976 rules.emplace_back(
10977 kName, dns_protocol::kTypeAAAA, /*secure=*/false,
10978 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
10979 /*delay=*/false);
Eric Orthac9aafb2021-07-29 23:03:4310980
10981 CreateResolver();
10982 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
10983
10984 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth815e90b2021-07-30 22:57:2210985 url::SchemeHostPort(url::kHttpsScheme, kName, 443), NetworkIsolationKey(),
Eric Orthac9aafb2021-07-29 23:03:4310986 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
10987 resolve_context_->host_cache()));
10988 EXPECT_THAT(response.result_error(), IsOk());
10989 EXPECT_TRUE(response.request()->GetAddressResults());
10990 EXPECT_FALSE(response.request()->GetTextResults());
10991 EXPECT_FALSE(response.request()->GetHostnameResults());
10992 EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(),
10993 testing::Optional(testing::IsEmpty()));
10994}
10995
10996TEST_F(HostResolverManagerDnsTest,
10997 TimeoutHttpsInInsecureAddressRequestIgnored) {
10998 const char kName[] = "name.test";
10999
11000 base::test::ScopedFeatureList features;
11001 features.InitAndEnableFeatureWithParameters(
11002 features::kUseDnsHttpsSvcb, {{"UseDnsHttpsSvcbEnableInsecure", "true"}});
11003
11004 MockDnsClientRuleList rules;
Peter Kastingd039b772021-08-18 00:06:2011005 rules.emplace_back(
11006 kName, dns_protocol::kTypeHttps, /*secure=*/false,
11007 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kTimeout),
11008 /*delay=*/false);
11009 rules.emplace_back(
11010 kName, dns_protocol::kTypeA, /*secure=*/false,
11011 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
11012 /*delay=*/false);
11013 rules.emplace_back(
11014 kName, dns_protocol::kTypeAAAA, /*secure=*/false,
11015 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
11016 /*delay=*/false);
Eric Orthac9aafb2021-07-29 23:03:4311017
11018 CreateResolver();
11019 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
11020
11021 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth815e90b2021-07-30 22:57:2211022 url::SchemeHostPort(url::kHttpsScheme, kName, 443), NetworkIsolationKey(),
Eric Orthac9aafb2021-07-29 23:03:4311023 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
11024 resolve_context_->host_cache()));
11025 EXPECT_THAT(response.result_error(), IsOk());
11026 EXPECT_TRUE(response.request()->GetAddressResults());
11027 EXPECT_FALSE(response.request()->GetTextResults());
11028 EXPECT_FALSE(response.request()->GetHostnameResults());
11029 EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(),
11030 testing::Optional(testing::IsEmpty()));
11031}
11032
11033TEST_F(HostResolverManagerDnsTest,
11034 ServfailHttpsInInsecureAddressRequestIgnored) {
11035 const char kName[] = "name.test";
11036
11037 base::test::ScopedFeatureList features;
11038 features.InitAndEnableFeatureWithParameters(
11039 features::kUseDnsHttpsSvcb, {{"UseDnsHttpsSvcbEnableInsecure", "true"}});
11040
11041 MockDnsClientRuleList rules;
11042 rules.emplace_back(
11043 kName, dns_protocol::kTypeHttps, /*secure=*/false,
11044 MockDnsClientRule::Result(
Peter Kastingd039b772021-08-18 00:06:2011045 MockDnsClientRule::ResultType::kFail,
Eric Orthac9aafb2021-07-29 23:03:4311046 BuildTestDnsResponse(kName, dns_protocol::kTypeHttps, /*answers=*/{},
11047 /*authority=*/{}, /*additional=*/{},
11048 dns_protocol::kRcodeSERVFAIL),
11049 ERR_DNS_SERVER_FAILED),
11050 /*delay=*/false);
Peter Kastingd039b772021-08-18 00:06:2011051 rules.emplace_back(
11052 kName, dns_protocol::kTypeA, /*secure=*/false,
11053 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
11054 /*delay=*/false);
11055 rules.emplace_back(
11056 kName, dns_protocol::kTypeAAAA, /*secure=*/false,
11057 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
11058 /*delay=*/false);
Eric Orthac9aafb2021-07-29 23:03:4311059
11060 CreateResolver();
11061 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
11062
11063 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth815e90b2021-07-30 22:57:2211064 url::SchemeHostPort(url::kHttpsScheme, kName, 443), NetworkIsolationKey(),
Eric Orthac9aafb2021-07-29 23:03:4311065 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
11066 resolve_context_->host_cache()));
11067 EXPECT_THAT(response.result_error(), IsOk());
11068 EXPECT_TRUE(response.request()->GetAddressResults());
11069 EXPECT_FALSE(response.request()->GetTextResults());
11070 EXPECT_FALSE(response.request()->GetHostnameResults());
11071 EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(),
11072 testing::Optional(testing::IsEmpty()));
11073}
11074
11075TEST_F(HostResolverManagerDnsTest,
11076 UnparsableHttpsInInsecureAddressRequestIgnored) {
11077 const char kName[] = "name.test";
11078
11079 base::test::ScopedFeatureList features;
11080 features.InitAndEnableFeatureWithParameters(
11081 features::kUseDnsHttpsSvcb, {{"UseDnsHttpsSvcbEnableInsecure", "true"}});
11082
11083 MockDnsClientRuleList rules;
Peter Kastingd039b772021-08-18 00:06:2011084 rules.emplace_back(
11085 kName, dns_protocol::kTypeHttps, /*secure=*/false,
11086 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kFail,
11087 /*response=*/absl::nullopt,
11088 ERR_DNS_MALFORMED_RESPONSE),
11089 /*delay=*/false);
11090 rules.emplace_back(
11091 kName, dns_protocol::kTypeA, /*secure=*/false,
11092 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
11093 /*delay=*/false);
11094 rules.emplace_back(
11095 kName, dns_protocol::kTypeAAAA, /*secure=*/false,
11096 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
11097 /*delay=*/false);
Eric Orthac9aafb2021-07-29 23:03:4311098
11099 CreateResolver();
11100 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
11101
11102 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth815e90b2021-07-30 22:57:2211103 url::SchemeHostPort(url::kHttpsScheme, kName, 443), NetworkIsolationKey(),
Eric Orthac9aafb2021-07-29 23:03:4311104 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
11105 resolve_context_->host_cache()));
11106 EXPECT_THAT(response.result_error(), IsOk());
11107 EXPECT_TRUE(response.request()->GetAddressResults());
11108 EXPECT_FALSE(response.request()->GetTextResults());
11109 EXPECT_FALSE(response.request()->GetHostnameResults());
11110 EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(),
11111 testing::Optional(testing::IsEmpty()));
Eric Orthcf8e00f2021-07-24 00:41:2411112}
11113
11114TEST_F(HostResolverManagerDnsTest,
11115 NoHttpsInInsecureAddressQueryWhenInsecureHttpsDisabled) {
11116 const char kName[] = "name.test";
11117
11118 base::test::ScopedFeatureList features;
11119 features.InitAndEnableFeatureWithParameters(
11120 features::kUseDnsHttpsSvcb, {{"UseDnsHttpsSvcbEnableInsecure", "false"}});
11121
11122 MockDnsClientRuleList rules;
11123 std::vector<DnsResourceRecord> records = {
11124 BuildTestHttpsAliasRecord(kName, "alias.test")};
Peter Kastingd039b772021-08-18 00:06:2011125 rules.emplace_back(
11126 kName, dns_protocol::kTypeA, /*secure=*/false,
11127 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
11128 /*delay=*/false);
11129 rules.emplace_back(
11130 kName, dns_protocol::kTypeAAAA, /*secure=*/false,
11131 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
11132 /*delay=*/false);
Eric Orthcf8e00f2021-07-24 00:41:2411133 // Should not be queried.
Peter Kastingd039b772021-08-18 00:06:2011134 rules.emplace_back(
11135 kName, dns_protocol::kTypeHttps, /*secure=*/false,
11136 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kUnexpected),
11137 /*delay=*/false);
Eric Orthcf8e00f2021-07-24 00:41:2411138
11139 CreateResolver();
11140 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
11141
11142 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth815e90b2021-07-30 22:57:2211143 url::SchemeHostPort(url::kHttpsScheme, kName, 443), NetworkIsolationKey(),
Eric Orthcf8e00f2021-07-24 00:41:2411144 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
11145 resolve_context_->host_cache()));
11146
11147 EXPECT_THAT(response.result_error(), IsOk());
11148 EXPECT_TRUE(response.request()->GetAddressResults());
11149 EXPECT_FALSE(response.request()->GetTextResults());
11150 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orthac9aafb2021-07-29 23:03:4311151 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Eric Orthcf8e00f2021-07-24 00:41:2411152}
11153
Eric Orth359fb312021-08-27 19:51:5111154// Test that when additional HTTPS timeout Feature params are disabled, the task
11155// does not timeout until the transactions themselves timeout.
11156TEST_F(HostResolverManagerDnsTest,
11157 HttpsInAddressQueryWaitsWithoutAdditionalTimeout) {
11158 const char kName[] = "name.test";
11159
11160 base::test::ScopedFeatureList features;
11161 features.InitAndEnableFeatureWithParameters(
11162 features::kUseDnsHttpsSvcb, {{"UseDnsHttpsSvcbExtraTimeAbsolute", "0"},
11163 {"UseDnsHttpsSvcbExtraTimePercent", "0"}});
11164
11165 MockDnsClientRuleList rules;
11166 rules.emplace_back(
11167 kName, dns_protocol::kTypeHttps, /*secure=*/true,
11168 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kTimeout),
11169 /*delay=*/true);
11170 rules.emplace_back(
11171 kName, dns_protocol::kTypeA, /*secure=*/true,
11172 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
11173 /*delay=*/false);
11174 rules.emplace_back(
11175 kName, dns_protocol::kTypeAAAA, /*secure=*/true,
11176 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
11177 /*delay=*/false);
11178
11179 CreateResolver();
11180 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
11181 DnsConfigOverrides overrides;
11182 overrides.secure_dns_mode = SecureDnsMode::kSecure;
11183 resolver_->SetDnsConfigOverrides(overrides);
11184
11185 ResolveHostResponseHelper response(resolver_->CreateRequest(
11186 url::SchemeHostPort(url::kHttpsScheme, kName, 443), NetworkIsolationKey(),
11187 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
11188 resolve_context_->host_cache()));
11189 RunUntilIdle();
11190 EXPECT_FALSE(response.complete());
11191
11192 // Wait an absurd amount of time (1 hour) and expect the request to not
11193 // complete because it is waiting on the transaction, where the mock is
11194 // delaying completion.
Peter Kastinge5a38ed2021-10-02 03:06:3511195 FastForwardBy(base::Hours(1));
Eric Orth359fb312021-08-27 19:51:5111196 RunUntilIdle();
11197 EXPECT_FALSE(response.complete());
11198
11199 dns_client_->CompleteDelayedTransactions();
11200 EXPECT_THAT(response.result_error(), IsOk());
11201 EXPECT_TRUE(response.request()->GetAddressResults());
11202 EXPECT_FALSE(response.request()->GetTextResults());
11203 EXPECT_FALSE(response.request()->GetHostnameResults());
11204 EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(),
11205 testing::Optional(testing::IsEmpty()));
11206}
11207
11208TEST_F(HostResolverManagerDnsTest, HttpsInAddressQueryWithAbsoluteTimeout) {
11209 const char kName[] = "name.test";
11210
11211 // Set an absolute timeout of 10 minutes.
11212 base::test::ScopedFeatureList features;
11213 features.InitAndEnableFeatureWithParameters(
11214 features::kUseDnsHttpsSvcb, {{"UseDnsHttpsSvcbExtraTimeAbsolute", "10m"},
11215 {"UseDnsHttpsSvcbExtraTimePercent", "0"}});
11216
11217 MockDnsClientRuleList rules;
11218 std::vector<DnsResourceRecord> records = {
11219 BuildTestHttpsAliasRecord(kName, "alias.test")};
11220 rules.emplace_back(kName, dns_protocol::kTypeHttps, /*secure=*/true,
11221 MockDnsClientRule::Result(BuildTestDnsResponse(
11222 kName, dns_protocol::kTypeHttps, records)),
11223 /*delay=*/true);
11224 rules.emplace_back(
11225 kName, dns_protocol::kTypeA, /*secure=*/true,
11226 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
11227 /*delay=*/false);
11228 rules.emplace_back(
11229 kName, dns_protocol::kTypeAAAA, /*secure=*/true,
11230 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
11231 /*delay=*/false);
11232
11233 CreateResolver();
11234 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
11235 DnsConfigOverrides overrides;
11236 overrides.secure_dns_mode = SecureDnsMode::kSecure;
11237 resolver_->SetDnsConfigOverrides(overrides);
11238
11239 ResolveHostResponseHelper response(resolver_->CreateRequest(
11240 url::SchemeHostPort(url::kHttpsScheme, kName, 443), NetworkIsolationKey(),
11241 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
11242 resolve_context_->host_cache()));
11243 RunUntilIdle();
11244 EXPECT_FALSE(response.complete());
11245
11246 // Wait until 1 second before expected timeout.
Peter Kastinge5a38ed2021-10-02 03:06:3511247 FastForwardBy(base::Minutes(10) - base::Seconds(1));
Eric Orth359fb312021-08-27 19:51:5111248 RunUntilIdle();
11249 EXPECT_FALSE(response.complete());
11250
11251 // Exceed expected timeout.
Peter Kastinge5a38ed2021-10-02 03:06:3511252 FastForwardBy(base::Seconds(2));
Eric Orth359fb312021-08-27 19:51:5111253
11254 EXPECT_THAT(response.result_error(), IsOk());
11255 EXPECT_TRUE(response.request()->GetAddressResults());
11256 EXPECT_FALSE(response.request()->GetTextResults());
11257 EXPECT_FALSE(response.request()->GetHostnameResults());
11258 // No experimental results if transaction did not complete.
11259 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
11260}
11261
11262TEST_F(HostResolverManagerDnsTest, HttpsInAddressQueryWithRelativeTimeout) {
11263 const char kName[] = "name.test";
11264
11265 // Set a relative timeout of 10%.
11266 base::test::ScopedFeatureList features;
11267 features.InitAndEnableFeatureWithParameters(
11268 features::kUseDnsHttpsSvcb, {{"UseDnsHttpsSvcbExtraTimeAbsolute", "0"},
11269 {"UseDnsHttpsSvcbExtraTimePercent", "10"}});
11270
11271 MockDnsClientRuleList rules;
11272 std::vector<DnsResourceRecord> records = {
11273 BuildTestHttpsAliasRecord(kName, "alias.test")};
11274 rules.emplace_back(kName, dns_protocol::kTypeHttps, /*secure=*/true,
11275 MockDnsClientRule::Result(BuildTestDnsResponse(
11276 kName, dns_protocol::kTypeHttps, records)),
11277 /*delay=*/true);
11278 rules.emplace_back(
11279 kName, dns_protocol::kTypeA, /*secure=*/true,
11280 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
11281 /*delay=*/true);
11282 rules.emplace_back(
11283 kName, dns_protocol::kTypeAAAA, /*secure=*/true,
11284 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
11285 /*delay=*/true);
11286
11287 CreateResolver();
11288 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
11289 DnsConfigOverrides overrides;
11290 overrides.secure_dns_mode = SecureDnsMode::kSecure;
11291 resolver_->SetDnsConfigOverrides(overrides);
11292
11293 ResolveHostResponseHelper response(resolver_->CreateRequest(
11294 url::SchemeHostPort(url::kHttpsScheme, kName, 443), NetworkIsolationKey(),
11295 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
11296 resolve_context_->host_cache()));
11297 RunUntilIdle();
11298 EXPECT_FALSE(response.complete());
11299
11300 // Complete final address transaction after 100 seconds total.
Peter Kastinge5a38ed2021-10-02 03:06:3511301 FastForwardBy(base::Seconds(50));
Eric Orth359fb312021-08-27 19:51:5111302 ASSERT_TRUE(
11303 dns_client_->CompleteOneDelayedTransactionOfType(DnsQueryType::A));
Peter Kastinge5a38ed2021-10-02 03:06:3511304 FastForwardBy(base::Seconds(50));
Eric Orth359fb312021-08-27 19:51:5111305 ASSERT_TRUE(
11306 dns_client_->CompleteOneDelayedTransactionOfType(DnsQueryType::AAAA));
11307 RunUntilIdle();
11308 EXPECT_FALSE(response.complete());
11309
11310 // Expect timeout at additional 10 seconds.
Peter Kastinge5a38ed2021-10-02 03:06:3511311 FastForwardBy(base::Seconds(9));
Eric Orth359fb312021-08-27 19:51:5111312 RunUntilIdle();
11313 EXPECT_FALSE(response.complete());
11314
Peter Kastinge5a38ed2021-10-02 03:06:3511315 FastForwardBy(base::Seconds(2));
Eric Orth359fb312021-08-27 19:51:5111316 EXPECT_THAT(response.result_error(), IsOk());
11317 EXPECT_TRUE(response.request()->GetAddressResults());
11318 EXPECT_FALSE(response.request()->GetTextResults());
11319 EXPECT_FALSE(response.request()->GetHostnameResults());
11320 // No experimental results if transaction did not complete.
11321 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
11322}
11323
11324TEST_F(HostResolverManagerDnsTest,
11325 HttpsInAddressQueryWithAbsoluteTimeoutFirst) {
11326 const char kName[] = "name.test";
11327
11328 // Set an absolute timeout of 30s and a relative timeout of 100%.
11329 base::test::ScopedFeatureList features;
11330 features.InitAndEnableFeatureWithParameters(
11331 features::kUseDnsHttpsSvcb, {{"UseDnsHttpsSvcbExtraTimeAbsolute", "30s"},
11332 {"UseDnsHttpsSvcbExtraTimePercent", "100"}});
11333
11334 MockDnsClientRuleList rules;
11335 std::vector<DnsResourceRecord> records = {
11336 BuildTestHttpsAliasRecord(kName, "alias.test")};
11337 rules.emplace_back(kName, dns_protocol::kTypeHttps, /*secure=*/true,
11338 MockDnsClientRule::Result(BuildTestDnsResponse(
11339 kName, dns_protocol::kTypeHttps, records)),
11340 /*delay=*/true);
11341 rules.emplace_back(
11342 kName, dns_protocol::kTypeA, /*secure=*/true,
11343 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
11344 /*delay=*/true);
11345 rules.emplace_back(
11346 kName, dns_protocol::kTypeAAAA, /*secure=*/true,
11347 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
11348 /*delay=*/true);
11349
11350 CreateResolver();
11351 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
11352 DnsConfigOverrides overrides;
11353 overrides.secure_dns_mode = SecureDnsMode::kSecure;
11354 resolver_->SetDnsConfigOverrides(overrides);
11355
11356 ResolveHostResponseHelper response(resolver_->CreateRequest(
11357 url::SchemeHostPort(url::kHttpsScheme, kName, 443), NetworkIsolationKey(),
11358 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
11359 resolve_context_->host_cache()));
11360 RunUntilIdle();
11361 EXPECT_FALSE(response.complete());
11362
11363 // Complete final address transaction after 4 minutes total.
Peter Kastinge5a38ed2021-10-02 03:06:3511364 FastForwardBy(base::Minutes(2));
Eric Orth359fb312021-08-27 19:51:5111365 ASSERT_TRUE(
11366 dns_client_->CompleteOneDelayedTransactionOfType(DnsQueryType::A));
Peter Kastinge5a38ed2021-10-02 03:06:3511367 FastForwardBy(base::Minutes(2));
Eric Orth359fb312021-08-27 19:51:5111368 ASSERT_TRUE(
11369 dns_client_->CompleteOneDelayedTransactionOfType(DnsQueryType::AAAA));
11370 RunUntilIdle();
11371 EXPECT_FALSE(response.complete());
11372
11373 // Wait until 1 second before expected timeout (from the absolute timeout).
Peter Kastinge5a38ed2021-10-02 03:06:3511374 FastForwardBy(base::Seconds(29));
Eric Orth359fb312021-08-27 19:51:5111375 RunUntilIdle();
11376 EXPECT_FALSE(response.complete());
11377
11378 // Exceed expected timeout.
Peter Kastinge5a38ed2021-10-02 03:06:3511379 FastForwardBy(base::Seconds(2));
Eric Orth359fb312021-08-27 19:51:5111380
11381 EXPECT_THAT(response.result_error(), IsOk());
11382 EXPECT_TRUE(response.request()->GetAddressResults());
11383 EXPECT_FALSE(response.request()->GetTextResults());
11384 EXPECT_FALSE(response.request()->GetHostnameResults());
11385 // No experimental results if transaction did not complete.
11386 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
11387}
11388
11389TEST_F(HostResolverManagerDnsTest,
11390 HttpsInAddressQueryWithRelativeTimeoutFirst) {
11391 const char kName[] = "name.test";
11392
11393 // Set an absolute timeout of 20 minutes and a relative timeout of 10%.
11394 base::test::ScopedFeatureList features;
11395 features.InitAndEnableFeatureWithParameters(
11396 features::kUseDnsHttpsSvcb, {{"UseDnsHttpsSvcbExtraTimeAbsolute", "20m"},
11397 {"UseDnsHttpsSvcbExtraTimePercent", "10"}});
11398
11399 MockDnsClientRuleList rules;
11400 std::vector<DnsResourceRecord> records = {
11401 BuildTestHttpsAliasRecord(kName, "alias.test")};
11402 rules.emplace_back(kName, dns_protocol::kTypeHttps, /*secure=*/true,
11403 MockDnsClientRule::Result(BuildTestDnsResponse(
11404 kName, dns_protocol::kTypeHttps, records)),
11405 /*delay=*/true);
11406 rules.emplace_back(
11407 kName, dns_protocol::kTypeA, /*secure=*/true,
11408 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
11409 /*delay=*/true);
11410 rules.emplace_back(
11411 kName, dns_protocol::kTypeAAAA, /*secure=*/true,
11412 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
11413 /*delay=*/true);
11414
11415 CreateResolver();
11416 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
11417 DnsConfigOverrides overrides;
11418 overrides.secure_dns_mode = SecureDnsMode::kSecure;
11419 resolver_->SetDnsConfigOverrides(overrides);
11420
11421 ResolveHostResponseHelper response(resolver_->CreateRequest(
11422 url::SchemeHostPort(url::kHttpsScheme, kName, 443), NetworkIsolationKey(),
11423 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
11424 resolve_context_->host_cache()));
11425 RunUntilIdle();
11426 EXPECT_FALSE(response.complete());
11427
11428 // Complete final address transaction after 100 seconds total.
Peter Kastinge5a38ed2021-10-02 03:06:3511429 FastForwardBy(base::Seconds(50));
Eric Orth359fb312021-08-27 19:51:5111430 ASSERT_TRUE(
11431 dns_client_->CompleteOneDelayedTransactionOfType(DnsQueryType::A));
Peter Kastinge5a38ed2021-10-02 03:06:3511432 FastForwardBy(base::Seconds(50));
Eric Orth359fb312021-08-27 19:51:5111433 ASSERT_TRUE(
11434 dns_client_->CompleteOneDelayedTransactionOfType(DnsQueryType::AAAA));
11435 RunUntilIdle();
11436 EXPECT_FALSE(response.complete());
11437
11438 // Expect timeout at additional 10 seconds (from the relative timeout).
Peter Kastinge5a38ed2021-10-02 03:06:3511439 FastForwardBy(base::Seconds(9));
Eric Orth359fb312021-08-27 19:51:5111440 RunUntilIdle();
11441 EXPECT_FALSE(response.complete());
11442
Peter Kastinge5a38ed2021-10-02 03:06:3511443 FastForwardBy(base::Seconds(2));
Eric Orth359fb312021-08-27 19:51:5111444 EXPECT_THAT(response.result_error(), IsOk());
11445 EXPECT_TRUE(response.request()->GetAddressResults());
11446 EXPECT_FALSE(response.request()->GetTextResults());
11447 EXPECT_FALSE(response.request()->GetHostnameResults());
11448 // No experimental results if transaction did not complete.
11449 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
11450}
11451
11452// Test that HTTPS timeouts are not used when fatal for the request.
11453TEST_F(HostResolverManagerDnsTest,
11454 HttpsInAddressQueryWaitsWithoutTimeoutIfFatal) {
11455 const char kName[] = "name.test";
11456
11457 // Set timeouts but also enforce secure responses.
11458 base::test::ScopedFeatureList features;
11459 features.InitAndEnableFeatureWithParameters(
11460 features::kUseDnsHttpsSvcb,
11461 {{"UseDnsHttpsSvcbExtraTimeAbsolute", "20m"},
11462 {"UseDnsHttpsSvcbExtraTimePercent", "0"},
11463 {"UseDnsHttpsSvcbEnforceSecureResponse", "true"}});
11464
11465 MockDnsClientRuleList rules;
11466 std::vector<DnsResourceRecord> records = {
11467 BuildTestHttpsAliasRecord(kName, "alias.test")};
11468 rules.emplace_back(kName, dns_protocol::kTypeHttps, /*secure=*/true,
11469 MockDnsClientRule::Result(BuildTestDnsResponse(
11470 kName, dns_protocol::kTypeHttps, records)),
11471 /*delay=*/true);
11472 rules.emplace_back(
11473 kName, dns_protocol::kTypeA, /*secure=*/true,
11474 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
11475 /*delay=*/false);
11476 rules.emplace_back(
11477 kName, dns_protocol::kTypeAAAA, /*secure=*/true,
11478 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
11479 /*delay=*/false);
11480
11481 CreateResolver();
11482 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
11483 DnsConfigOverrides overrides;
11484 overrides.secure_dns_mode = SecureDnsMode::kSecure;
11485 resolver_->SetDnsConfigOverrides(overrides);
11486
11487 ResolveHostResponseHelper response(resolver_->CreateRequest(
11488 url::SchemeHostPort(url::kHttpsScheme, kName, 443), NetworkIsolationKey(),
11489 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
11490 resolve_context_->host_cache()));
11491 RunUntilIdle();
11492 EXPECT_FALSE(response.complete());
11493
11494 // Wait an absurd amount of time (1 hour) and expect the request to not
11495 // complete because it is waiting on the transaction, where the mock is
11496 // delaying completion.
Peter Kastinge5a38ed2021-10-02 03:06:3511497 FastForwardBy(base::Hours(1));
Eric Orth359fb312021-08-27 19:51:5111498 RunUntilIdle();
11499 EXPECT_FALSE(response.complete());
11500
11501 dns_client_->CompleteDelayedTransactions();
11502 EXPECT_THAT(response.result_error(), IsOk());
11503 EXPECT_TRUE(response.request()->GetAddressResults());
11504 EXPECT_FALSE(response.request()->GetTextResults());
11505 EXPECT_FALSE(response.request()->GetHostnameResults());
11506 EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(),
11507 testing::Optional(testing::ElementsAre(true)));
11508}
11509
11510// Test that HTTPS timeouts are always respected for insecure requests.
11511TEST_F(HostResolverManagerDnsTest,
11512 HttpsInAddressQueryAlwaysRespectsTimeoutsForInsecure) {
11513 const char kName[] = "name.test";
11514
11515 // Set timeouts but also enforce secure responses.
11516 base::test::ScopedFeatureList features;
11517 features.InitAndEnableFeatureWithParameters(
11518 features::kUseDnsHttpsSvcb,
11519 {{"UseDnsHttpsSvcbExtraTimeAbsolute", "20m"},
11520 {"UseDnsHttpsSvcbExtraTimePercent", "0"},
11521 {"UseDnsHttpsSvcbEnforceSecureResponse", "true"},
11522 {"UseDnsHttpsSvcbEnableInsecure", "true"}});
11523
11524 MockDnsClientRuleList rules;
11525 std::vector<DnsResourceRecord> records = {
11526 BuildTestHttpsAliasRecord(kName, "alias.test")};
11527 rules.emplace_back(kName, dns_protocol::kTypeHttps, /*secure=*/false,
11528 MockDnsClientRule::Result(BuildTestDnsResponse(
11529 kName, dns_protocol::kTypeHttps, records)),
11530 /*delay=*/true);
11531 rules.emplace_back(
11532 kName, dns_protocol::kTypeA, /*secure=*/false,
11533 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
11534 /*delay=*/false);
11535 rules.emplace_back(
11536 kName, dns_protocol::kTypeAAAA, /*secure=*/false,
11537 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
11538 /*delay=*/false);
11539
11540 CreateResolver();
11541 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
11542
11543 ResolveHostResponseHelper response(resolver_->CreateRequest(
11544 url::SchemeHostPort(url::kHttpsScheme, kName, 443), NetworkIsolationKey(),
11545 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
11546 resolve_context_->host_cache()));
11547 RunUntilIdle();
11548 EXPECT_FALSE(response.complete());
11549
11550 // Wait until 1s before expected timeout.
Peter Kastinge5a38ed2021-10-02 03:06:3511551 FastForwardBy(base::Minutes(20) - base::Seconds(1));
Eric Orth359fb312021-08-27 19:51:5111552 RunUntilIdle();
11553 EXPECT_FALSE(response.complete());
11554
Peter Kastinge5a38ed2021-10-02 03:06:3511555 FastForwardBy(base::Seconds(2));
Eric Orth359fb312021-08-27 19:51:5111556 EXPECT_THAT(response.result_error(), IsOk());
11557 EXPECT_TRUE(response.request()->GetAddressResults());
11558 EXPECT_FALSE(response.request()->GetTextResults());
11559 EXPECT_FALSE(response.request()->GetHostnameResults());
11560 // No experimental results if transaction did not complete.
11561 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
11562}
11563
Eric Orthcf8e00f2021-07-24 00:41:2411564TEST_F(HostResolverManagerDnsTest, ExperimentalHttpsInAddressQuery) {
Eric Orth5d21f152020-10-21 19:15:4311565 const char kName[] = "combined.test";
11566
11567 base::test::ScopedFeatureList features;
11568 features.InitAndEnableFeatureWithParameters(
11569 features::kDnsHttpssvc, {{"DnsHttpssvcUseHttpssvc", "true"},
11570 {"DnsHttpssvcExperimentDomains", kName}});
11571
11572 MockDnsClientRuleList rules;
Eric Orth7139e0552020-11-04 02:41:1111573 std::vector<DnsResourceRecord> records = {
11574 BuildTestHttpsAliasRecord(kName, "alias.test")};
Eric Orth5d21f152020-10-21 19:15:4311575 rules.emplace_back(kName, dns_protocol::kTypeHttps, true /* secure */,
11576 MockDnsClientRule::Result(BuildTestDnsResponse(
11577 kName, dns_protocol::kTypeHttps, records)),
11578 false /* delay */);
Peter Kastingd039b772021-08-18 00:06:2011579 rules.emplace_back(
11580 kName, dns_protocol::kTypeA, true /* secure */,
11581 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
11582 false /* delay */);
11583 rules.emplace_back(
11584 kName, dns_protocol::kTypeAAAA, true /* secure */,
11585 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
11586 false /* delay */);
Eric Orth5d21f152020-10-21 19:15:4311587
11588 CreateResolver();
11589 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
11590 DnsConfigOverrides overrides;
11591 overrides.secure_dns_mode = SecureDnsMode::kSecure;
11592 resolver_->SetDnsConfigOverrides(overrides);
11593
11594 ResolveHostResponseHelper response(resolver_->CreateRequest(
11595 HostPortPair(kName, 108), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:5211596 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth5d21f152020-10-21 19:15:4311597 EXPECT_THAT(response.result_error(), IsOk());
11598 EXPECT_TRUE(response.request()->GetAddressResults());
11599 EXPECT_FALSE(response.request()->GetTextResults());
11600 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth7139e0552020-11-04 02:41:1111601 EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(),
11602 testing::Optional(testing::ElementsAre(true)));
11603}
11604
Eric Orthcf8e00f2021-07-24 00:41:2411605TEST_F(HostResolverManagerDnsTest,
11606 ExperimentalHttpsInAddressQuery_MultipleResults) {
Eric Orth7139e0552020-11-04 02:41:1111607 const char kName[] = "combined.test";
11608
11609 base::test::ScopedFeatureList features;
11610 features.InitAndEnableFeatureWithParameters(
11611 features::kDnsHttpssvc, {{"DnsHttpssvcUseHttpssvc", "true"},
11612 {"DnsHttpssvcExperimentDomains", kName}});
11613
11614 MockDnsClientRuleList rules;
11615 std::vector<DnsResourceRecord> records = {
11616 BuildTestHttpsAliasRecord(kName, "alias.test"),
11617 BuildTestHttpsAliasRecord(kName, "another-alias.test"),
11618 BuildTestDnsRecord(kName, dns_protocol::kTypeHttps,
11619 "malformed rdata" /* rdata */)};
11620 rules.emplace_back(kName, dns_protocol::kTypeHttps, true /* secure */,
11621 MockDnsClientRule::Result(BuildTestDnsResponse(
11622 kName, dns_protocol::kTypeHttps, records)),
11623 false /* delay */);
Peter Kastingd039b772021-08-18 00:06:2011624 rules.emplace_back(
11625 kName, dns_protocol::kTypeA, true /* secure */,
11626 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
11627 false /* delay */);
11628 rules.emplace_back(
11629 kName, dns_protocol::kTypeAAAA, true /* secure */,
11630 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
11631 false /* delay */);
Eric Orth7139e0552020-11-04 02:41:1111632
11633 CreateResolver();
11634 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
11635 DnsConfigOverrides overrides;
11636 overrides.secure_dns_mode = SecureDnsMode::kSecure;
11637 resolver_->SetDnsConfigOverrides(overrides);
11638
11639 ResolveHostResponseHelper response(resolver_->CreateRequest(
11640 HostPortPair(kName, 108), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:5211641 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth7139e0552020-11-04 02:41:1111642 EXPECT_THAT(response.result_error(), IsOk());
11643 EXPECT_TRUE(response.request()->GetAddressResults());
11644 EXPECT_FALSE(response.request()->GetTextResults());
11645 EXPECT_FALSE(response.request()->GetHostnameResults());
11646 EXPECT_THAT(
11647 response.request()->GetExperimentalResultsForTesting(),
11648 testing::Optional(testing::UnorderedElementsAre(true, true, false)));
Eric Orth5d21f152020-10-21 19:15:4311649}
11650
Eric Orthcf8e00f2021-07-24 00:41:2411651TEST_F(HostResolverManagerDnsTest,
11652 ExperimentalHttpsInAddressQuery_AddressesOnly) {
Eric Orth5d21f152020-10-21 19:15:4311653 const char kName[] = "combined.test";
11654
11655 base::test::ScopedFeatureList features;
11656 features.InitAndEnableFeatureWithParameters(
11657 features::kDnsHttpssvc, {{"DnsHttpssvcUseHttpssvc", "true"},
11658 {"DnsHttpssvcExperimentDomains", kName}});
11659
11660 MockDnsClientRuleList rules;
Peter Kastingd039b772021-08-18 00:06:2011661 rules.emplace_back(
11662 kName, dns_protocol::kTypeHttps, true /* secure */,
11663 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kEmpty),
11664 false /* delay */);
11665 rules.emplace_back(
11666 kName, dns_protocol::kTypeA, true /* secure */,
11667 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
11668 false /* delay */);
11669 rules.emplace_back(
11670 kName, dns_protocol::kTypeAAAA, true /* secure */,
11671 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
11672 false /* delay */);
Eric Orth5d21f152020-10-21 19:15:4311673
11674 CreateResolver();
11675 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
11676 DnsConfigOverrides overrides;
11677 overrides.secure_dns_mode = SecureDnsMode::kSecure;
11678 resolver_->SetDnsConfigOverrides(overrides);
11679
11680 ResolveHostResponseHelper response(resolver_->CreateRequest(
11681 HostPortPair(kName, 108), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:5211682 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth5d21f152020-10-21 19:15:4311683 EXPECT_THAT(response.result_error(), IsOk());
11684 EXPECT_TRUE(response.request()->GetAddressResults());
11685 EXPECT_FALSE(response.request()->GetTextResults());
11686 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth7139e0552020-11-04 02:41:1111687 EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(),
11688 testing::Optional(testing::IsEmpty()));
Eric Orth5d21f152020-10-21 19:15:4311689}
11690
Eric Orthcf8e00f2021-07-24 00:41:2411691TEST_F(HostResolverManagerDnsTest, ExperimentalHttpsInAddressQuery_HttpsOnly) {
Eric Orth5d21f152020-10-21 19:15:4311692 const char kName[] = "combined.test";
11693
11694 base::test::ScopedFeatureList features;
11695 features.InitAndEnableFeatureWithParameters(
11696 features::kDnsHttpssvc, {{"DnsHttpssvcUseHttpssvc", "true"},
11697 {"DnsHttpssvcExperimentDomains", kName}});
11698
11699 MockDnsClientRuleList rules;
Eric Orth7139e0552020-11-04 02:41:1111700 std::vector<DnsResourceRecord> records = {
11701 BuildTestHttpsAliasRecord(kName, "alias.test")};
Eric Orth5d21f152020-10-21 19:15:4311702 rules.emplace_back(kName, dns_protocol::kTypeHttps, true /* secure */,
11703 MockDnsClientRule::Result(BuildTestDnsResponse(
11704 kName, dns_protocol::kTypeHttps, records)),
11705 false /* delay */);
Peter Kastingd039b772021-08-18 00:06:2011706 rules.emplace_back(
11707 kName, dns_protocol::kTypeA, true /* secure */,
11708 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kEmpty),
11709 false /* delay */);
11710 rules.emplace_back(
11711 kName, dns_protocol::kTypeAAAA, true /* secure */,
11712 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kEmpty),
11713 false /* delay */);
Eric Orth5d21f152020-10-21 19:15:4311714
11715 CreateResolver();
11716 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
11717 DnsConfigOverrides overrides;
11718 overrides.secure_dns_mode = SecureDnsMode::kSecure;
11719 resolver_->SetDnsConfigOverrides(overrides);
11720
11721 ResolveHostResponseHelper response(resolver_->CreateRequest(
11722 HostPortPair(kName, 108), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:5211723 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth5d21f152020-10-21 19:15:4311724 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
11725 EXPECT_FALSE(response.request()->GetAddressResults());
Eric Orth5d21f152020-10-21 19:15:4311726 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth7139e0552020-11-04 02:41:1111727 EXPECT_FALSE(response.request()->GetTextResults());
11728 // Results never saved when overall result not OK.
11729 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Eric Orth5d21f152020-10-21 19:15:4311730}
11731
Eric Orthcf8e00f2021-07-24 00:41:2411732TEST_F(HostResolverManagerDnsTest,
11733 ExperimentalHttpsInAddressQuery_AddressError) {
Eric Orth5d21f152020-10-21 19:15:4311734 const char kName[] = "combined.test";
11735
11736 base::test::ScopedFeatureList features;
11737 features.InitAndEnableFeatureWithParameters(
11738 features::kDnsHttpssvc, {{"DnsHttpssvcUseHttpssvc", "true"},
11739 {"DnsHttpssvcExperimentDomains", kName}});
11740
11741 MockDnsClientRuleList rules;
Eric Orth7139e0552020-11-04 02:41:1111742 std::vector<DnsResourceRecord> records = {
11743 BuildTestHttpsAliasRecord(kName, "alias.test")};
Eric Orth5d21f152020-10-21 19:15:4311744 rules.emplace_back(kName, dns_protocol::kTypeHttps, true /* secure */,
11745 MockDnsClientRule::Result(BuildTestDnsResponse(
11746 kName, dns_protocol::kTypeHttps, records)),
11747 false /* delay */);
Peter Kastingd039b772021-08-18 00:06:2011748 rules.emplace_back(
11749 kName, dns_protocol::kTypeA, true /* secure */,
11750 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kFail),
11751 false /* delay */);
11752 rules.emplace_back(
11753 kName, dns_protocol::kTypeAAAA, true /* secure */,
11754 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kFail),
11755 false /* delay */);
Eric Orth5d21f152020-10-21 19:15:4311756
11757 CreateResolver();
11758 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
11759 DnsConfigOverrides overrides;
11760 overrides.secure_dns_mode = SecureDnsMode::kSecure;
11761 resolver_->SetDnsConfigOverrides(overrides);
11762
11763 ResolveHostResponseHelper response(resolver_->CreateRequest(
11764 HostPortPair(kName, 108), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:5211765 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth5d21f152020-10-21 19:15:4311766 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
11767 EXPECT_FALSE(response.request()->GetAddressResults());
11768 EXPECT_FALSE(response.request()->GetTextResults());
11769 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth7139e0552020-11-04 02:41:1111770 // Results never saved when overall result not OK.
11771 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Eric Orth5d21f152020-10-21 19:15:4311772}
11773
Eric Orthcf8e00f2021-07-24 00:41:2411774TEST_F(HostResolverManagerDnsTest, ExperimentalHttpsInAddressQuery_HttpsError) {
Eric Orth5d21f152020-10-21 19:15:4311775 const char kName[] = "combined.test";
11776
11777 base::test::ScopedFeatureList features;
11778 features.InitAndEnableFeatureWithParameters(
11779 features::kDnsHttpssvc, {{"DnsHttpssvcUseHttpssvc", "true"},
11780 {"DnsHttpssvcExperimentDomains", kName}});
11781
11782 MockDnsClientRuleList rules;
Peter Kastingd039b772021-08-18 00:06:2011783 rules.emplace_back(
11784 kName, dns_protocol::kTypeHttps, true /* secure */,
11785 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kFail),
11786 false /* delay */);
11787 rules.emplace_back(
11788 kName, dns_protocol::kTypeA, true /* secure */,
11789 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
11790 false /* delay */);
11791 rules.emplace_back(
11792 kName, dns_protocol::kTypeAAAA, true /* secure */,
11793 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
11794 false /* delay */);
Eric Orth5d21f152020-10-21 19:15:4311795
11796 CreateResolver();
11797 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
11798 DnsConfigOverrides overrides;
11799 overrides.secure_dns_mode = SecureDnsMode::kSecure;
11800 resolver_->SetDnsConfigOverrides(overrides);
11801
11802 ResolveHostResponseHelper response(resolver_->CreateRequest(
11803 HostPortPair(kName, 108), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:5211804 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth5d21f152020-10-21 19:15:4311805 EXPECT_THAT(response.result_error(), IsOk());
11806 EXPECT_TRUE(response.request()->GetAddressResults());
11807 EXPECT_FALSE(response.request()->GetTextResults());
11808 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth7139e0552020-11-04 02:41:1111809 EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(),
11810 testing::Optional(testing::IsEmpty()));
Eric Orth5d21f152020-10-21 19:15:4311811}
11812
Eric Orthac9aafb2021-07-29 23:03:4311813TEST_F(HostResolverManagerDnsTest,
11814 MalformedExperimentalHttpsResponseInAddressRequestIsIgnored) {
11815 const char kName[] = "name.test";
11816
11817 base::test::ScopedFeatureList features;
11818 features.InitAndEnableFeatureWithParameters(
11819 features::kDnsHttpssvc, {{"DnsHttpssvcUseHttpssvc", "true"},
11820 {"DnsHttpssvcExperimentDomains", kName}});
11821
11822 MockDnsClientRuleList rules;
Peter Kastingd039b772021-08-18 00:06:2011823 rules.emplace_back(
11824 kName, dns_protocol::kTypeHttps, /*secure=*/true,
11825 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kMalformed),
11826 /*delay=*/false);
11827 rules.emplace_back(
11828 kName, dns_protocol::kTypeA, /*secure=*/true,
11829 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
11830 /*delay=*/false);
11831 rules.emplace_back(
11832 kName, dns_protocol::kTypeAAAA, /*secure=*/true,
11833 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
11834 /*delay=*/false);
Eric Orthac9aafb2021-07-29 23:03:4311835
11836 CreateResolver();
11837 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
11838 DnsConfigOverrides overrides;
11839 overrides.secure_dns_mode = SecureDnsMode::kSecure;
11840 resolver_->SetDnsConfigOverrides(overrides);
11841
11842 ResolveHostResponseHelper response(resolver_->CreateRequest(
11843 url::SchemeHostPort(url::kHttpsScheme, kName, 108), NetworkIsolationKey(),
11844 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
11845 resolve_context_->host_cache()));
11846 EXPECT_THAT(response.result_error(), IsOk());
11847 EXPECT_TRUE(response.request()->GetAddressResults());
11848 EXPECT_FALSE(response.request()->GetTextResults());
11849 EXPECT_FALSE(response.request()->GetHostnameResults());
11850 EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(),
11851 testing::Optional(testing::IsEmpty()));
11852}
11853
11854TEST_F(HostResolverManagerDnsTest,
11855 MalformedExperimentalHttpsRecordInAddressRequestIsIgnored) {
11856 const char kName[] = "name.test";
11857
11858 base::test::ScopedFeatureList features;
11859 features.InitAndEnableFeatureWithParameters(
11860 features::kDnsHttpssvc, {{"DnsHttpssvcUseHttpssvc", "true"},
11861 {"DnsHttpssvcExperimentDomains", kName}});
11862
11863 MockDnsClientRuleList rules;
11864 rules.emplace_back(kName, dns_protocol::kTypeHttps, /*secure=*/true,
11865 MockDnsClientRule::Result(BuildTestDnsResponse(
11866 kName, dns_protocol::kTypeHttps, /*answers=*/
11867 {BuildTestDnsRecord(kName, dns_protocol::kTypeHttps,
11868 /*rdata=*/"malformed rdata")})),
11869 /*delay=*/false);
Peter Kastingd039b772021-08-18 00:06:2011870 rules.emplace_back(
11871 kName, dns_protocol::kTypeA, /*secure=*/true,
11872 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
11873 /*delay=*/false);
11874 rules.emplace_back(
11875 kName, dns_protocol::kTypeAAAA, /*secure=*/true,
11876 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
11877 /*delay=*/false);
Eric Orthac9aafb2021-07-29 23:03:4311878
11879 CreateResolver();
11880 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
11881 DnsConfigOverrides overrides;
11882 overrides.secure_dns_mode = SecureDnsMode::kSecure;
11883 resolver_->SetDnsConfigOverrides(overrides);
11884
11885 ResolveHostResponseHelper response(resolver_->CreateRequest(
11886 url::SchemeHostPort(url::kHttpsScheme, kName, 108), NetworkIsolationKey(),
11887 NetLogWithSource(), absl::nullopt, resolve_context_.get(),
11888 resolve_context_->host_cache()));
11889 EXPECT_THAT(response.result_error(), IsOk());
11890 EXPECT_TRUE(response.request()->GetAddressResults());
11891 EXPECT_FALSE(response.request()->GetTextResults());
11892 EXPECT_FALSE(response.request()->GetHostnameResults());
11893 EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(),
11894 testing::Optional(testing::ElementsAre(false)));
11895}
11896
Eric Orthcf8e00f2021-07-24 00:41:2411897TEST_F(HostResolverManagerDnsTest, ExperimentalHttpsInAddressQuery_NoData) {
Eric Orth5d21f152020-10-21 19:15:4311898 const char kName[] = "combined.test";
11899
11900 base::test::ScopedFeatureList features;
11901 features.InitAndEnableFeatureWithParameters(
11902 features::kDnsHttpssvc, {{"DnsHttpssvcUseHttpssvc", "true"},
11903 {"DnsHttpssvcExperimentDomains", kName}});
11904
11905 MockDnsClientRuleList rules;
Peter Kastingd039b772021-08-18 00:06:2011906 rules.emplace_back(
11907 kName, dns_protocol::kTypeHttps, true /* secure */,
11908 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kEmpty),
11909 false /* delay */);
11910 rules.emplace_back(
11911 kName, dns_protocol::kTypeA, true /* secure */,
11912 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kEmpty),
11913 false /* delay */);
11914 rules.emplace_back(
11915 kName, dns_protocol::kTypeAAAA, true /* secure */,
11916 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kEmpty),
11917 false /* delay */);
Eric Orth5d21f152020-10-21 19:15:4311918
11919 CreateResolver();
11920 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
11921 DnsConfigOverrides overrides;
11922 overrides.secure_dns_mode = SecureDnsMode::kSecure;
11923 resolver_->SetDnsConfigOverrides(overrides);
11924
11925 ResolveHostResponseHelper response(resolver_->CreateRequest(
11926 HostPortPair(kName, 108), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:5211927 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth5d21f152020-10-21 19:15:4311928 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
11929 EXPECT_FALSE(response.request()->GetAddressResults());
11930 EXPECT_FALSE(response.request()->GetTextResults());
11931 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth7139e0552020-11-04 02:41:1111932 // Results never saved when overall result not OK.
11933 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Eric Orth5d21f152020-10-21 19:15:4311934}
11935
Eric Orthcf8e00f2021-07-24 00:41:2411936TEST_F(HostResolverManagerDnsTest, ExperimentalHttpsInAddressQuery_HttpsLast) {
Eric Orth5d21f152020-10-21 19:15:4311937 const char kName[] = "combined.test";
11938
11939 base::test::ScopedFeatureList features;
11940 features.InitAndEnableFeatureWithParameters(
11941 features::kDnsHttpssvc, {{"DnsHttpssvcUseHttpssvc", "true"},
11942 {"DnsHttpssvcExperimentDomains", kName}});
11943
11944 MockDnsClientRuleList rules;
Eric Orth7139e0552020-11-04 02:41:1111945 std::vector<DnsResourceRecord> records = {
11946 BuildTestHttpsAliasRecord(kName, "alias.test")};
Eric Orth5d21f152020-10-21 19:15:4311947 rules.emplace_back(kName, dns_protocol::kTypeHttps, true /* secure */,
11948 MockDnsClientRule::Result(BuildTestDnsResponse(
11949 kName, dns_protocol::kTypeHttps, records)),
11950 true /* delay */);
Peter Kastingd039b772021-08-18 00:06:2011951 rules.emplace_back(
11952 kName, dns_protocol::kTypeA, true /* secure */,
11953 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
11954 false /* delay */);
11955 rules.emplace_back(
11956 kName, dns_protocol::kTypeAAAA, true /* secure */,
11957 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
11958 false /* delay */);
Eric Orth5d21f152020-10-21 19:15:4311959
11960 CreateResolver();
11961 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
11962 DnsConfigOverrides overrides;
11963 overrides.secure_dns_mode = SecureDnsMode::kSecure;
11964 resolver_->SetDnsConfigOverrides(overrides);
11965
11966 ResolveHostResponseHelper response(resolver_->CreateRequest(
11967 HostPortPair(kName, 108), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:5211968 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth5d21f152020-10-21 19:15:4311969
11970 base::RunLoop().RunUntilIdle();
11971 ASSERT_FALSE(response.complete());
11972
Eric Orthcf8e00f2021-07-24 00:41:2411973 ASSERT_TRUE(dns_client_->CompleteOneDelayedTransactionOfType(
11974 DnsQueryType::HTTPS_EXPERIMENTAL));
Eric Orth5d21f152020-10-21 19:15:4311975
11976 EXPECT_THAT(response.result_error(), IsOk());
11977 EXPECT_TRUE(response.request()->GetAddressResults());
11978 EXPECT_FALSE(response.request()->GetTextResults());
11979 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth7139e0552020-11-04 02:41:1111980 EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(),
11981 testing::Optional(testing::ElementsAre(true)));
Eric Orth5d21f152020-10-21 19:15:4311982}
11983
Eric Orthcf8e00f2021-07-24 00:41:2411984TEST_F(HostResolverManagerDnsTest,
11985 ExperimentalHttpsInAddressQuery_AddressesLast) {
Eric Orth5d21f152020-10-21 19:15:4311986 const char kName[] = "combined.test";
11987
11988 base::test::ScopedFeatureList features;
11989 features.InitAndEnableFeatureWithParameters(
11990 features::kDnsHttpssvc, {{"DnsHttpssvcUseHttpssvc", "true"},
11991 {"DnsHttpssvcExperimentDomains", kName}});
11992
11993 MockDnsClientRuleList rules;
Eric Orth7139e0552020-11-04 02:41:1111994 std::vector<DnsResourceRecord> records = {
11995 BuildTestHttpsAliasRecord(kName, "alias.test")};
Eric Orth5d21f152020-10-21 19:15:4311996 rules.emplace_back(kName, dns_protocol::kTypeHttps, true /* secure */,
11997 MockDnsClientRule::Result(BuildTestDnsResponse(
11998 kName, dns_protocol::kTypeHttps, records)),
11999 false /* delay */);
Peter Kastingd039b772021-08-18 00:06:2012000 rules.emplace_back(
12001 kName, dns_protocol::kTypeA, true /* secure */,
12002 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
12003 true /* delay */);
12004 rules.emplace_back(
12005 kName, dns_protocol::kTypeAAAA, true /* secure */,
12006 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
12007 true /* delay */);
Eric Orth5d21f152020-10-21 19:15:4312008
12009 CreateResolver();
12010 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
12011 DnsConfigOverrides overrides;
12012 overrides.secure_dns_mode = SecureDnsMode::kSecure;
12013 resolver_->SetDnsConfigOverrides(overrides);
12014
12015 ResolveHostResponseHelper response(resolver_->CreateRequest(
12016 HostPortPair(kName, 108), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:5212017 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth5d21f152020-10-21 19:15:4312018
12019 base::RunLoop().RunUntilIdle();
12020 ASSERT_FALSE(response.complete());
12021
12022 ASSERT_TRUE(
12023 dns_client_->CompleteOneDelayedTransactionOfType(DnsQueryType::A));
12024 ASSERT_TRUE(
12025 dns_client_->CompleteOneDelayedTransactionOfType(DnsQueryType::AAAA));
12026
12027 EXPECT_THAT(response.result_error(), IsOk());
12028 EXPECT_TRUE(response.request()->GetAddressResults());
12029 EXPECT_FALSE(response.request()->GetTextResults());
12030 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth7139e0552020-11-04 02:41:1112031 EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(),
12032 testing::Optional(testing::ElementsAre(true)));
Eric Orth5d21f152020-10-21 19:15:4312033}
12034
Eric Orth09746312021-05-05 15:44:5812035TEST_F(HostResolverManagerDnsTest,
Eric Orthcf8e00f2021-07-24 00:41:2412036 ExperimentalHttpsInInsecureAddressQueryDisallowedWhenParamDisabled) {
Eric Orth5d21f152020-10-21 19:15:4312037 const char kName[] = "combined.test";
12038
12039 base::test::ScopedFeatureList features;
12040 features.InitAndEnableFeatureWithParameters(
Eric Orth09746312021-05-05 15:44:5812041 features::kDnsHttpssvc,
12042 {{"DnsHttpssvcUseHttpssvc", "true"},
12043 {"DnsHttpssvcExperimentDomains", kName},
12044 {"DnsHttpssvcEnableQueryOverInsecure", "false"}});
Eric Orth5d21f152020-10-21 19:15:4312045
12046 MockDnsClientRuleList rules;
12047 // No expected HTTPS request in insecure mode.
Peter Kastingd039b772021-08-18 00:06:2012048 rules.emplace_back(
12049 kName, dns_protocol::kTypeA, /*secure=*/false,
12050 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
12051 /*delay=*/false);
12052 rules.emplace_back(
12053 kName, dns_protocol::kTypeAAAA, /*secure=*/false,
12054 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
12055 /*delay=*/false);
Eric Orth5d21f152020-10-21 19:15:4312056
12057 CreateResolver();
12058 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
12059 DnsConfigOverrides overrides;
12060 overrides.secure_dns_mode = SecureDnsMode::kOff;
12061 resolver_->SetDnsConfigOverrides(overrides);
12062
12063 ResolveHostResponseHelper response(resolver_->CreateRequest(
12064 HostPortPair(kName, 108), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:5212065 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth5d21f152020-10-21 19:15:4312066
12067 EXPECT_THAT(response.result_error(), IsOk());
12068 EXPECT_TRUE(response.request()->GetAddressResults());
12069 EXPECT_FALSE(response.request()->GetTextResults());
12070 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth7139e0552020-11-04 02:41:1112071 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Eric Orth5d21f152020-10-21 19:15:4312072}
12073
Eric Orthcf8e00f2021-07-24 00:41:2412074TEST_F(
12075 HostResolverManagerDnsTest,
12076 ExperimentalHttpsInInsecureAddressQueryAllowedWhenInsecureFeatureEnabled) {
Eric Orth09746312021-05-05 15:44:5812077 const char kName[] = "combined.test";
12078
12079 base::test::ScopedFeatureList features;
12080 features.InitAndEnableFeatureWithParameters(
12081 features::kDnsHttpssvc, {{"DnsHttpssvcUseHttpssvc", "true"},
12082 {"DnsHttpssvcExperimentDomains", kName},
12083 {"DnsHttpssvcEnableQueryOverInsecure", "true"}});
12084
12085 MockDnsClientRuleList rules;
12086 std::vector<DnsResourceRecord> records = {
12087 BuildTestHttpsAliasRecord(kName, "alias.test")};
12088 rules.emplace_back(kName, dns_protocol::kTypeHttps, /*secure=*/false,
12089 MockDnsClientRule::Result(BuildTestDnsResponse(
12090 kName, dns_protocol::kTypeHttps, records)),
12091 /*delay=*/false);
Peter Kastingd039b772021-08-18 00:06:2012092 rules.emplace_back(
12093 kName, dns_protocol::kTypeA, /*secure=*/false,
12094 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
12095 /*delay=*/false);
12096 rules.emplace_back(
12097 kName, dns_protocol::kTypeAAAA, /*secure=*/false,
12098 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
12099 /*delay=*/false);
Eric Orth09746312021-05-05 15:44:5812100
12101 CreateResolver();
12102 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
12103 DnsConfigOverrides overrides;
12104 overrides.secure_dns_mode = SecureDnsMode::kOff;
12105 resolver_->SetDnsConfigOverrides(overrides);
12106
12107 ResolveHostResponseHelper response(resolver_->CreateRequest(
12108 HostPortPair(kName, 108), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:5212109 /*optional_parameters=*/absl::nullopt, resolve_context_.get(),
Eric Orth09746312021-05-05 15:44:5812110 resolve_context_->host_cache()));
12111
12112 EXPECT_THAT(response.result_error(), IsOk());
12113 EXPECT_TRUE(response.request()->GetAddressResults());
12114 EXPECT_FALSE(response.request()->GetTextResults());
12115 EXPECT_FALSE(response.request()->GetHostnameResults());
12116 EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(),
12117 testing::Optional(testing::ElementsAre(true)));
12118}
12119
Eric Orthcf8e00f2021-07-24 00:41:2412120TEST_F(
12121 HostResolverManagerDnsTest,
12122 ExperimentalHttpsInInsecureAddressQueryDisallowedWithoutAdditionalTypes) {
Eric Orth09746312021-05-05 15:44:5812123 const char kName[] = "combined.test";
12124
12125 base::test::ScopedFeatureList features;
12126 features.InitAndEnableFeatureWithParameters(
12127 features::kDnsHttpssvc, {{"DnsHttpssvcUseHttpssvc", "true"},
12128 {"DnsHttpssvcExperimentDomains", kName},
12129 {"DnsHttpssvcEnableQueryOverInsecure", "true"}});
12130
12131 MockDnsClientRuleList rules;
12132 // Use a delayed rule to hang if an unexpected HTTPS query is made. Allows the
12133 // test to fail on unexpected query whether or not HTTPS query errors are
12134 // ignored.
Peter Kastingd039b772021-08-18 00:06:2012135 rules.emplace_back(
12136 kName, dns_protocol::kTypeHttps, /*secure=*/false,
12137 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kFail),
12138 /*delay=*/true);
12139 rules.emplace_back(
12140 kName, dns_protocol::kTypeA, /*secure=*/false,
12141 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
12142 /*delay=*/false);
12143 rules.emplace_back(
12144 kName, dns_protocol::kTypeAAAA, /*secure=*/false,
12145 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
12146 /*delay=*/false);
Eric Orth09746312021-05-05 15:44:5812147
12148 CreateResolver();
12149 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
12150 DnsConfigOverrides overrides;
12151 overrides.secure_dns_mode = SecureDnsMode::kOff;
12152 resolver_->SetDnsConfigOverrides(overrides);
12153
12154 resolver_->SetInsecureDnsClientEnabled(
12155 /*enabled=*/true,
12156 /*additional_dns_types_enabled=*/false);
12157
12158 ResolveHostResponseHelper response(resolver_->CreateRequest(
12159 HostPortPair(kName, 108), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:5212160 /*optional_parameters=*/absl::nullopt, resolve_context_.get(),
Eric Orth09746312021-05-05 15:44:5812161 resolve_context_->host_cache()));
12162
12163 EXPECT_THAT(response.result_error(), IsOk());
12164 EXPECT_TRUE(response.request()->GetAddressResults());
12165 EXPECT_FALSE(response.request()->GetTextResults());
12166 EXPECT_FALSE(response.request()->GetHostnameResults());
12167 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
12168}
12169
12170TEST_F(HostResolverManagerDnsTest,
Eric Orthcf8e00f2021-07-24 00:41:2412171 ExperimentalHttpsInSecureAddressQueryAllowedWithoutAdditionalTypes) {
Eric Orth09746312021-05-05 15:44:5812172 const char kName[] = "combined.test";
12173
12174 base::test::ScopedFeatureList features;
12175 features.InitAndEnableFeatureWithParameters(
12176 features::kDnsHttpssvc, {{"DnsHttpssvcUseHttpssvc", "true"},
12177 {"DnsHttpssvcExperimentDomains", kName},
12178 {"DnsHttpssvcEnableQueryOverInsecure", "true"}});
12179
12180 MockDnsClientRuleList rules;
12181 std::vector<DnsResourceRecord> records = {
12182 BuildTestHttpsAliasRecord(kName, "alias.test")};
12183 rules.emplace_back(kName, dns_protocol::kTypeHttps, /*secure=*/true,
12184 MockDnsClientRule::Result(BuildTestDnsResponse(
12185 kName, dns_protocol::kTypeHttps, records)),
12186 /*delay=*/false);
Peter Kastingd039b772021-08-18 00:06:2012187 rules.emplace_back(
12188 kName, dns_protocol::kTypeA, /*secure=*/true,
12189 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
12190 /*delay=*/false);
12191 rules.emplace_back(
12192 kName, dns_protocol::kTypeAAAA, /*secure=*/true,
12193 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
12194 /*delay=*/false);
Eric Orth09746312021-05-05 15:44:5812195
12196 CreateResolver();
12197 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
12198 DnsConfigOverrides overrides;
12199 overrides.secure_dns_mode = SecureDnsMode::kSecure;
12200 resolver_->SetDnsConfigOverrides(overrides);
12201
12202 resolver_->SetInsecureDnsClientEnabled(
12203 /*enabled=*/true,
12204 /*additional_dns_types_enabled=*/false);
12205
12206 ResolveHostResponseHelper response(resolver_->CreateRequest(
12207 HostPortPair(kName, 108), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:5212208 /*optional_parameters=*/absl::nullopt, resolve_context_.get(),
Eric Orth09746312021-05-05 15:44:5812209 resolve_context_->host_cache()));
12210
12211 EXPECT_THAT(response.result_error(), IsOk());
12212 EXPECT_TRUE(response.request()->GetAddressResults());
12213 EXPECT_FALSE(response.request()->GetTextResults());
12214 EXPECT_FALSE(response.request()->GetHostnameResults());
12215 EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(),
12216 testing::Optional(testing::ElementsAre(true)));
12217}
12218
12219TEST_F(HostResolverManagerDnsTest,
Eric Orthcf8e00f2021-07-24 00:41:2412220 ExperimentalHttpsInAddressFallbackDisallowedWithoutAdditionalTypes) {
Eric Orth09746312021-05-05 15:44:5812221 const char kName[] = "combined.test";
12222
12223 base::test::ScopedFeatureList features;
12224 features.InitAndEnableFeatureWithParameters(
12225 features::kDnsHttpssvc, {{"DnsHttpssvcUseHttpssvc", "true"},
12226 {"DnsHttpssvcExperimentDomains", kName},
12227 {"DnsHttpssvcEnableQueryOverInsecure", "true"}});
12228
12229 MockDnsClientRuleList rules;
Peter Kastingd039b772021-08-18 00:06:2012230 rules.emplace_back(
12231 kName, dns_protocol::kTypeHttps, /*secure=*/true,
12232 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kFail),
12233 /*delay=*/false);
12234 rules.emplace_back(
12235 kName, dns_protocol::kTypeA, /*secure=*/true,
12236 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kFail),
12237 /*delay=*/false);
12238 rules.emplace_back(
12239 kName, dns_protocol::kTypeAAAA, /*secure=*/true,
12240 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kFail),
12241 /*delay=*/false);
Eric Orth09746312021-05-05 15:44:5812242 // Use a delayed rule to hang if an unexpected HTTPS query is made. Allows the
12243 // test to fail on unexpected query whether or not HTTPS query errors are
12244 // ignored.
Peter Kastingd039b772021-08-18 00:06:2012245 rules.emplace_back(
12246 kName, dns_protocol::kTypeHttps, /*secure=*/false,
12247 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kFail),
12248 /*delay=*/true);
12249 rules.emplace_back(
12250 kName, dns_protocol::kTypeA, /*secure=*/false,
12251 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
12252 /*delay=*/false);
12253 rules.emplace_back(
12254 kName, dns_protocol::kTypeAAAA, /*secure=*/false,
12255 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
12256 /*delay=*/false);
Eric Orth09746312021-05-05 15:44:5812257
12258 CreateResolver();
12259 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
12260 DnsConfigOverrides overrides;
12261 overrides.secure_dns_mode = SecureDnsMode::kAutomatic;
12262 resolver_->SetDnsConfigOverrides(overrides);
12263
12264 resolver_->SetInsecureDnsClientEnabled(
12265 /*enabled=*/true,
12266 /*additional_dns_types_enabled=*/false);
12267
12268 ResolveHostResponseHelper response(resolver_->CreateRequest(
12269 HostPortPair(kName, 108), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:5212270 /*optional_parameters=*/absl::nullopt, resolve_context_.get(),
Eric Orth09746312021-05-05 15:44:5812271 resolve_context_->host_cache()));
12272
12273 EXPECT_THAT(response.result_error(), IsOk());
12274 EXPECT_TRUE(response.request()->GetAddressResults());
12275 EXPECT_FALSE(response.request()->GetTextResults());
12276 EXPECT_FALSE(response.request()->GetHostnameResults());
12277 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
12278}
12279
Eric Orthcf8e00f2021-07-24 00:41:2412280TEST_F(HostResolverManagerDnsTest,
12281 ExperimentalHttpsInAddressQuery_ExperimentalTimeout) {
Eric Orth5d21f152020-10-21 19:15:4312282 const char kName[] = "combined.test";
Peter Kastinge5a38ed2021-10-02 03:06:3512283 const base::TimeDelta kTimeout = base::Seconds(2);
Eric Orth5d21f152020-10-21 19:15:4312284
12285 base::test::ScopedFeatureList features;
12286 features.InitAndEnableFeatureWithParameters(
12287 features::kDnsHttpssvc,
12288 {{"DnsHttpssvcUseHttpssvc", "true"},
12289 {"DnsHttpssvcExperimentDomains", kName},
12290 {"DnsHttpssvcExtraTimeMs",
12291 base::NumberToString(kTimeout.InMilliseconds())}});
12292
12293 MockDnsClientRuleList rules;
Peter Kastingd039b772021-08-18 00:06:2012294 rules.emplace_back(
12295 kName, dns_protocol::kTypeHttps, true /* secure */,
12296 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kFail),
12297 true /* delay */);
12298 rules.emplace_back(
12299 kName, dns_protocol::kTypeA, true /* secure */,
12300 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
12301 false /* delay */);
12302 rules.emplace_back(
12303 kName, dns_protocol::kTypeAAAA, true /* secure */,
12304 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
12305 false /* delay */);
Eric Orth5d21f152020-10-21 19:15:4312306
12307 CreateResolver();
12308 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
12309 DnsConfigOverrides overrides;
12310 overrides.secure_dns_mode = SecureDnsMode::kSecure;
12311 resolver_->SetDnsConfigOverrides(overrides);
12312
12313 ResolveHostResponseHelper response(resolver_->CreateRequest(
12314 HostPortPair(kName, 108), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:5212315 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth5d21f152020-10-21 19:15:4312316
12317 base::RunLoop().RunUntilIdle();
12318 EXPECT_FALSE(response.complete());
12319
12320 FastForwardBy(kTimeout);
12321 EXPECT_TRUE(response.complete());
12322
12323 EXPECT_THAT(response.result_error(), IsOk());
12324 EXPECT_TRUE(response.request()->GetAddressResults());
12325 EXPECT_FALSE(response.request()->GetTextResults());
12326 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth7139e0552020-11-04 02:41:1112327 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Eric Orth5d21f152020-10-21 19:15:4312328}
12329
12330TEST_F(HostResolverManagerDnsTest, MultipleExperimentalQueries) {
12331 const char kName[] = "combined.test";
12332
12333 base::test::ScopedFeatureList features;
12334 features.InitAndEnableFeatureWithParameters(
12335 features::kDnsHttpssvc, {{"DnsHttpssvcUseHttpssvc", "true"},
12336 {"DnsHttpssvcUseIntegrity", "true"},
12337 {"DnsHttpssvcExperimentDomains", kName}});
12338
12339 MockDnsClientRuleList rules;
Peter Kastingd039b772021-08-18 00:06:2012340 rules.emplace_back(
12341 kName, dns_protocol::kTypeHttps, true /* secure */,
12342 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kEmpty),
12343 false /* delay */);
Eric Orth5d21f152020-10-21 19:15:4312344 rules.emplace_back(
12345 kName, dns_protocol::kExperimentalTypeIntegrity, true /* secure */,
Peter Kastingd039b772021-08-18 00:06:2012346 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kEmpty),
12347 false /* delay */);
12348 rules.emplace_back(
12349 kName, dns_protocol::kTypeA, true /* secure */,
12350 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
12351 false /* delay */);
12352 rules.emplace_back(
12353 kName, dns_protocol::kTypeAAAA, true /* secure */,
12354 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
12355 false /* delay */);
Eric Orth5d21f152020-10-21 19:15:4312356
12357 CreateResolver();
12358 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
12359 DnsConfigOverrides overrides;
12360 overrides.secure_dns_mode = SecureDnsMode::kSecure;
12361 resolver_->SetDnsConfigOverrides(overrides);
12362
12363 ResolveHostResponseHelper response(resolver_->CreateRequest(
12364 HostPortPair(kName, 108), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:5212365 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth5d21f152020-10-21 19:15:4312366 EXPECT_THAT(response.result_error(), IsOk());
12367 EXPECT_TRUE(response.request()->GetAddressResults());
12368 EXPECT_FALSE(response.request()->GetTextResults());
12369 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth7139e0552020-11-04 02:41:1112370 EXPECT_THAT(response.request()->GetExperimentalResultsForTesting(),
12371 testing::Optional(testing::IsEmpty()));
Eric Orth5d21f152020-10-21 19:15:4312372}
12373
12374TEST_F(HostResolverManagerDnsTest, MultipleExperimentalQueries_Timeout) {
12375 const char kName[] = "combined.test";
Peter Kastinge5a38ed2021-10-02 03:06:3512376 const base::TimeDelta kTimeout = base::Seconds(2);
Eric Orth5d21f152020-10-21 19:15:4312377
12378 base::test::ScopedFeatureList features;
12379 features.InitAndEnableFeatureWithParameters(
12380 features::kDnsHttpssvc,
12381 {{"DnsHttpssvcUseHttpssvc", "true"},
12382 {"DnsHttpssvcUseIntegrity", "true"},
12383 {"DnsHttpssvcExperimentDomains", kName},
12384 {"DnsHttpssvcExtraTimeMs",
12385 base::NumberToString(kTimeout.InMilliseconds())}});
12386
12387 MockDnsClientRuleList rules;
Peter Kastingd039b772021-08-18 00:06:2012388 rules.emplace_back(
12389 kName, dns_protocol::kTypeHttps, true /* secure */,
12390 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kEmpty),
12391 true /* delay */);
Eric Orth5d21f152020-10-21 19:15:4312392 rules.emplace_back(
12393 kName, dns_protocol::kExperimentalTypeIntegrity, true /* secure */,
Peter Kastingd039b772021-08-18 00:06:2012394 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kEmpty),
12395 true /* delay */);
12396 rules.emplace_back(
12397 kName, dns_protocol::kTypeA, true /* secure */,
12398 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
12399 false /* delay */);
12400 rules.emplace_back(
12401 kName, dns_protocol::kTypeAAAA, true /* secure */,
12402 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
12403 false /* delay */);
Eric Orth5d21f152020-10-21 19:15:4312404
12405 CreateResolver();
12406 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
12407 DnsConfigOverrides overrides;
12408 overrides.secure_dns_mode = SecureDnsMode::kSecure;
12409 resolver_->SetDnsConfigOverrides(overrides);
12410
12411 ResolveHostResponseHelper response(resolver_->CreateRequest(
12412 HostPortPair(kName, 108), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:5212413 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth5d21f152020-10-21 19:15:4312414
12415 base::RunLoop().RunUntilIdle();
12416 EXPECT_FALSE(response.complete());
12417
12418 FastForwardBy(kTimeout);
12419 EXPECT_TRUE(response.complete());
12420
12421 EXPECT_THAT(response.result_error(), IsOk());
12422 EXPECT_TRUE(response.request()->GetAddressResults());
12423 EXPECT_FALSE(response.request()->GetTextResults());
12424 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth7139e0552020-11-04 02:41:1112425 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
Eric Orth5d21f152020-10-21 19:15:4312426}
12427
Eric Orth69c25992020-11-10 16:55:1212428TEST_F(HostResolverManagerDnsTest, UnsolicitedHttps) {
12429 const char kName[] = "unsolicited.test";
12430
12431 MockDnsClientRuleList rules;
12432 std::vector<DnsResourceRecord> records = {
12433 BuildTestAddressRecord(kName, IPAddress(1, 2, 3, 4))};
12434 std::vector<DnsResourceRecord> additional = {
12435 BuildTestHttpsAliasRecord(kName, "alias.test")};
12436 rules.emplace_back(kName, dns_protocol::kTypeA, true /* secure */,
12437 MockDnsClientRule::Result(BuildTestDnsResponse(
12438 kName, dns_protocol::kTypeA, records,
12439 {} /* authority */, additional)),
12440 false /* delay */);
Peter Kastingd039b772021-08-18 00:06:2012441 rules.emplace_back(
12442 kName, dns_protocol::kTypeAAAA, true /* secure */,
12443 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
12444 false /* delay */);
Eric Orth69c25992020-11-10 16:55:1212445
12446 CreateResolver();
12447 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
12448 DnsConfigOverrides overrides;
12449 overrides.secure_dns_mode = SecureDnsMode::kSecure;
12450 resolver_->SetDnsConfigOverrides(overrides);
12451
12452 ResolveHostResponseHelper response(resolver_->CreateRequest(
12453 HostPortPair(kName, 108), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:5212454 absl::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth69c25992020-11-10 16:55:1212455 EXPECT_THAT(response.result_error(), IsOk());
12456 EXPECT_TRUE(response.request()->GetAddressResults());
12457 EXPECT_FALSE(response.request()->GetTextResults());
12458 EXPECT_FALSE(response.request()->GetHostnameResults());
12459 // Unsolicited records not included in results.
12460 EXPECT_FALSE(response.request()->GetExperimentalResultsForTesting());
12461}
12462
Daniel McArdle2daa3ec2020-06-03 16:05:4812463class HostResolverManagerDnsTestIntegrity : public HostResolverManagerDnsTest {
12464 public:
12465 HostResolverManagerDnsTestIntegrity()
12466 : HostResolverManagerDnsTest(
12467 base::test::TaskEnvironment::TimeSource::MOCK_TIME) {
12468 const base::FieldTrialParams params = {
12469 {"DnsHttpssvcUseIntegrity", "true"},
12470 {"DnsHttpssvcExperimentDomains", "host"},
12471 {"DnsHttpssvcControlDomains", ""},
12472 {"DnsHttpssvcEnableQueryOverInsecure", "false"},
12473 };
12474 scoped_feature_list_.InitAndEnableFeatureWithParameters(
12475 features::kDnsHttpssvc, params);
12476 }
12477
12478 protected:
12479 struct IntegrityAddRulesOptions {
12480 bool add_a = true;
12481 bool add_aaaa = true;
12482 bool add_integrity = true;
12483 bool integrity_mangled = false;
12484
12485 bool secure_a = true;
12486 bool secure_aaaa = true;
12487 bool secure_integrity = true;
12488
12489 bool delay_a = false;
12490 bool delay_aaaa = false;
12491 bool delay_integrity = false;
12492 };
12493
12494 std::vector<uint8_t> GetValidIntegrityRdata() {
12495 const IntegrityRecordRdata kValidRecord({'f', 'o', 'o'});
Anton Bikineev068d2912021-05-15 20:43:5212496 absl::optional<std::vector<uint8_t>> valid_serialized =
Daniel McArdle2daa3ec2020-06-03 16:05:4812497 kValidRecord.Serialize();
12498 CHECK(valid_serialized);
12499 return *valid_serialized;
12500 }
12501
12502 std::vector<uint8_t> GetMangledIntegrityRdata() {
12503 std::vector<uint8_t> rdata = GetValidIntegrityRdata();
12504 constexpr size_t kOffset = 2u;
12505 CHECK_GT(rdata.size(), kOffset);
12506 // Create a mangled version of |kValidRecord| by erasing a byte.
12507 rdata.erase(rdata.begin() + kOffset);
12508 return rdata;
12509 }
12510
12511 void AddRules(MockDnsClientRuleList rules,
12512 const IntegrityAddRulesOptions& options) {
12513 if (options.add_a) {
Peter Kastingd039b772021-08-18 00:06:2012514 rules.emplace_back(
12515 "host", dns_protocol::kTypeA, options.secure_a,
12516 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
12517 options.delay_a);
Daniel McArdle2daa3ec2020-06-03 16:05:4812518 }
12519
12520 if (options.add_aaaa) {
Peter Kastingd039b772021-08-18 00:06:2012521 rules.emplace_back(
12522 "host", dns_protocol::kTypeAAAA, options.secure_aaaa,
12523 MockDnsClientRule::Result(MockDnsClientRule::ResultType::kOk),
12524 options.delay_aaaa);
Daniel McArdle2daa3ec2020-06-03 16:05:4812525 }
12526
12527 if (options.add_integrity) {
12528 std::vector<uint8_t> integrity_rdata = options.integrity_mangled
12529 ? GetMangledIntegrityRdata()
12530 : GetValidIntegrityRdata();
Eric Orth8539e492020-10-19 20:09:5512531 std::string integrity_rdata_str(integrity_rdata.begin(),
12532 integrity_rdata.end());
12533 std::vector<DnsResourceRecord> answers{
12534 BuildTestDnsRecord("host", dns_protocol::kExperimentalTypeIntegrity,
12535 std::move(integrity_rdata_str))};
12536 DnsResponse response = BuildTestDnsResponse(
12537 "host", dns_protocol::kExperimentalTypeIntegrity, answers);
12538
12539 rules.emplace_back("host", dns_protocol::kExperimentalTypeIntegrity,
12540 options.secure_integrity,
12541 MockDnsClientRule::Result(std::move(response)),
12542 options.delay_integrity);
Daniel McArdle2daa3ec2020-06-03 16:05:4812543 }
12544
12545 CreateResolver();
12546 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
12547 }
12548
12549 std::unique_ptr<ResolveHostResponseHelper> DoIntegrityQuery(bool use_secure) {
12550 if (use_secure) {
12551 DnsConfigOverrides overrides;
Eric Ortha093b092020-09-24 23:13:0212552 overrides.secure_dns_mode = SecureDnsMode::kSecure;
Daniel McArdle2daa3ec2020-06-03 16:05:4812553 resolver_->SetDnsConfigOverrides(overrides);
12554 }
12555
12556 return std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
12557 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
12558 HostResolver::ResolveHostParameters(), resolve_context_.get(),
12559 resolve_context_->host_cache()));
12560 }
12561
12562 base::test::ScopedFeatureList scoped_feature_list_;
12563};
12564
12565TEST_F(HostResolverManagerDnsTestIntegrity, IntegrityQuery) {
12566 AddRules(CreateDefaultDnsRules(), IntegrityAddRulesOptions());
12567
12568 std::unique_ptr<ResolveHostResponseHelper> response =
12569 DoIntegrityQuery(true /* use_secure */);
12570
12571 EXPECT_THAT(response->result_error(), IsOk());
Anton Bikineev068d2912021-05-15 20:43:5212572 absl::optional<std::vector<bool>> results =
Eric Orth7139e0552020-11-04 02:41:1112573 response->request()->GetExperimentalResultsForTesting();
Daniel McArdle2daa3ec2020-06-03 16:05:4812574
12575 EXPECT_TRUE(response->request()->GetAddressResults());
12576 EXPECT_FALSE(response->request()->GetTextResults());
12577 EXPECT_THAT(results, Optional(UnorderedElementsAre(true)));
12578}
12579
12580TEST_F(HostResolverManagerDnsTestIntegrity, IntegrityQueryMangled) {
12581 IntegrityAddRulesOptions options;
12582 options.integrity_mangled = true;
12583 AddRules(CreateDefaultDnsRules(), options);
12584
12585 std::unique_ptr<ResolveHostResponseHelper> response =
12586 DoIntegrityQuery(true /* use_secure */);
12587
12588 EXPECT_THAT(response->result_error(), IsOk());
Anton Bikineev068d2912021-05-15 20:43:5212589 absl::optional<std::vector<bool>> results =
Eric Orth7139e0552020-11-04 02:41:1112590 response->request()->GetExperimentalResultsForTesting();
Daniel McArdle2daa3ec2020-06-03 16:05:4812591
12592 EXPECT_TRUE(response->request()->GetAddressResults());
12593 EXPECT_FALSE(response->request()->GetTextResults());
Eric Orth7139e0552020-11-04 02:41:1112594 EXPECT_THAT(response->request()->GetExperimentalResultsForTesting(),
Daniel McArdle2daa3ec2020-06-03 16:05:4812595 Optional(UnorderedElementsAre(false)));
12596}
12597
12598TEST_F(HostResolverManagerDnsTestIntegrity, IntegrityQueryOnlyOverSecure) {
12599 IntegrityAddRulesOptions rules_options;
12600 rules_options.secure_a = false;
12601 rules_options.secure_aaaa = false;
12602 rules_options.secure_integrity = false;
12603
12604 AddRules(CreateDefaultDnsRules(), rules_options);
12605 std::unique_ptr<ResolveHostResponseHelper> response =
12606 DoIntegrityQuery(false /* use_secure */);
12607
12608 EXPECT_THAT(response->result_error(), IsOk());
Anton Bikineev068d2912021-05-15 20:43:5212609 absl::optional<std::vector<bool>> results =
Eric Orth7139e0552020-11-04 02:41:1112610 response->request()->GetExperimentalResultsForTesting();
Daniel McArdle2daa3ec2020-06-03 16:05:4812611
12612 EXPECT_FALSE(results);
12613}
12614
12615// Ensure that the address results are preserved, even when the INTEGRITY query
12616// completes last.
12617TEST_F(HostResolverManagerDnsTestIntegrity, IntegrityQueryCompletesLast) {
12618 IntegrityAddRulesOptions rules_options;
12619 rules_options.delay_a = true;
12620 rules_options.delay_aaaa = true;
12621 rules_options.delay_integrity = true;
12622
12623 AddRules(CreateDefaultDnsRules(), rules_options);
12624 std::unique_ptr<ResolveHostResponseHelper> response =
12625 DoIntegrityQuery(true /* use_secure */);
12626
Peter Kastinge5a38ed2021-10-02 03:06:3512627 constexpr base::TimeDelta kQuantum = base::Milliseconds(1);
Daniel McArdle2daa3ec2020-06-03 16:05:4812628
Daniel McArdle4afc68b2020-06-03 16:48:2812629 FastForwardBy(100 * kQuantum);
Daniel McArdle2daa3ec2020-06-03 16:05:4812630
12631 ASSERT_TRUE(
12632 dns_client_->CompleteOneDelayedTransactionOfType(DnsQueryType::A));
12633 ASSERT_TRUE(
12634 dns_client_->CompleteOneDelayedTransactionOfType(DnsQueryType::AAAA));
12635
12636 FastForwardBy(kQuantum);
12637
12638 ASSERT_TRUE(dns_client_->CompleteOneDelayedTransactionOfType(
12639 DnsQueryType::INTEGRITY));
12640
Daniel McArdle4afc68b2020-06-03 16:48:2812641 // Above, the A/AAAA queries took 100 time units. We only fast forward by 1
12642 // time unit (1%) before answering the INTEGRITY query, to avoid triggering
12643 // the timeout logic. This should work, assuming
12644 // (1) the relative timeout is > 1% and
12645 // (2) the absolute timeout is < (101 * kQuantum).
Daniel McArdle2daa3ec2020-06-03 16:05:4812646 FastForwardBy(kQuantum);
12647
12648 ASSERT_THAT(response->result_error(), IsOk());
12649 ASSERT_TRUE(response->request()->GetAddressResults());
12650 EXPECT_THAT(response->request()->GetAddressResults()->endpoints(),
12651 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 108),
12652 CreateExpected("::1", 108)));
Daniel McArdle4afc68b2020-06-03 16:48:2812653 // If this expectation fails, the INTEGRITY query was probably timed out.
12654 // Check the |kDnsHttpssvcExtraTimeMs| and |kDnsHttpssvcExtraTimePercent|
12655 // feature params in relation to this test's FastForward steps.
Eric Orth7139e0552020-11-04 02:41:1112656 EXPECT_THAT(response->request()->GetExperimentalResultsForTesting(),
Daniel McArdle2daa3ec2020-06-03 16:05:4812657 Optional(UnorderedElementsAre(true)));
12658}
12659
Dan McArdlef0529d92020-10-12 16:34:2712660// Ensure that a successful INTEGRITY query cannot mask the appropriate
12661// ERR_NAME_NOT_RESOLVED of A/AAAA responses with empty bodies.
12662TEST_F(HostResolverManagerDnsTestIntegrity,
12663 IntegrityQueryCannotMaskAddressNodata) {
12664 net::MockDnsClientRuleList rules;
12665 AddSecureDnsRule(&rules, "host", dns_protocol::kTypeA,
Peter Kastingd039b772021-08-18 00:06:2012666 MockDnsClientRule::ResultType::kEmpty, true /* delay */);
Dan McArdlef0529d92020-10-12 16:34:2712667 AddSecureDnsRule(&rules, "host", dns_protocol::kTypeAAAA,
Peter Kastingd039b772021-08-18 00:06:2012668 MockDnsClientRule::ResultType::kEmpty, true /* delay */);
Dan McArdlef0529d92020-10-12 16:34:2712669
12670 IntegrityAddRulesOptions rules_options;
12671 rules_options.add_a = false;
12672 rules_options.add_aaaa = false;
12673 rules_options.add_integrity = true;
12674 rules_options.delay_integrity = true;
12675
12676 AddRules(std::move(rules), rules_options);
12677
12678 std::unique_ptr<ResolveHostResponseHelper> response =
12679 DoIntegrityQuery(true /* use_secure */);
12680
12681 ASSERT_TRUE(dns_client_->CompleteOneDelayedTransactionOfType(
12682 DnsQueryType::INTEGRITY));
12683 ASSERT_TRUE(
12684 dns_client_->CompleteOneDelayedTransactionOfType(DnsQueryType::A));
12685 ASSERT_TRUE(
12686 dns_client_->CompleteOneDelayedTransactionOfType(DnsQueryType::AAAA));
12687
12688 ASSERT_EQ(response->result_error(), net::ERR_NAME_NOT_RESOLVED);
12689}
12690
12691// Ensure that a successful INTEGRITY query cannot mask the appropriate
12692// ERR_NAME_NOT_RESOLVED of A/AAAA queries that fail.
12693TEST_F(HostResolverManagerDnsTestIntegrity,
12694 IntegrityQueryCannotMaskAddressFail) {
12695 net::MockDnsClientRuleList rules;
12696 AddSecureDnsRule(&rules, "host", dns_protocol::kTypeA,
Peter Kastingd039b772021-08-18 00:06:2012697 MockDnsClientRule::ResultType::kFail, true /* delay */);
Dan McArdlef0529d92020-10-12 16:34:2712698 AddSecureDnsRule(&rules, "host", dns_protocol::kTypeAAAA,
Peter Kastingd039b772021-08-18 00:06:2012699 MockDnsClientRule::ResultType::kFail, true /* delay */);
Dan McArdlef0529d92020-10-12 16:34:2712700
12701 IntegrityAddRulesOptions rules_options;
12702 rules_options.add_a = false;
12703 rules_options.add_aaaa = false;
12704 rules_options.add_integrity = true;
12705 rules_options.delay_integrity = true;
12706
12707 AddRules(std::move(rules), rules_options);
12708
12709 std::unique_ptr<ResolveHostResponseHelper> response =
12710 DoIntegrityQuery(true /* use_secure */);
12711
12712 ASSERT_TRUE(dns_client_->CompleteOneDelayedTransactionOfType(
12713 DnsQueryType::INTEGRITY));
12714 ASSERT_TRUE(
12715 dns_client_->CompleteOneDelayedTransactionOfType(DnsQueryType::A));
12716 // After the A query fails, the pending AAAA query is cleared.
12717 ASSERT_FALSE(
12718 dns_client_->CompleteOneDelayedTransactionOfType(DnsQueryType::AAAA));
12719
12720 ASSERT_EQ(response->result_error(), net::ERR_NAME_NOT_RESOLVED);
12721}
12722
Daniel McArdle2daa3ec2020-06-03 16:05:4812723// For symmetry with |IntegrityQueryCompletesLast|, test the case where the
12724// INTEGRITY query completes first.
12725TEST_F(HostResolverManagerDnsTestIntegrity, IntegrityQueryCompletesFirst) {
12726 IntegrityAddRulesOptions rules_options;
12727 rules_options.delay_a = true;
12728 rules_options.delay_aaaa = true;
12729 rules_options.delay_integrity = true;
12730
12731 AddRules(CreateDefaultDnsRules(), rules_options);
12732 std::unique_ptr<ResolveHostResponseHelper> response =
12733 DoIntegrityQuery(true /* use_secure */);
12734
Peter Kastinge5a38ed2021-10-02 03:06:3512735 constexpr base::TimeDelta kQuantum = base::Milliseconds(10);
Daniel McArdle2daa3ec2020-06-03 16:05:4812736
12737 FastForwardBy(kQuantum);
12738
12739 ASSERT_TRUE(dns_client_->CompleteOneDelayedTransactionOfType(
12740 DnsQueryType::INTEGRITY));
12741
12742 FastForwardBy(kQuantum);
12743
12744 ASSERT_TRUE(
12745 dns_client_->CompleteOneDelayedTransactionOfType(DnsQueryType::A));
12746 ASSERT_TRUE(
12747 dns_client_->CompleteOneDelayedTransactionOfType(DnsQueryType::AAAA));
12748
12749 FastForwardBy(kQuantum);
12750
12751 ASSERT_THAT(response->result_error(), IsOk());
Eric Orth7139e0552020-11-04 02:41:1112752 EXPECT_THAT(response->request()->GetExperimentalResultsForTesting(),
Daniel McArdle2daa3ec2020-06-03 16:05:4812753 Optional(UnorderedElementsAre(true)));
12754 ASSERT_TRUE(response->request()->GetAddressResults());
12755 EXPECT_THAT(response->request()->GetAddressResults()->endpoints(),
12756 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 108),
12757 CreateExpected("::1", 108)));
12758}
12759
12760// Ensure that the address results are preserved, even when the INTEGRITY query
12761// completes last and fails.
12762TEST_F(HostResolverManagerDnsTestIntegrity,
12763 IntegrityQueryCompletesLastWithError) {
12764 IntegrityAddRulesOptions rules_options;
12765 rules_options.add_a = true;
12766 rules_options.add_aaaa = true;
12767 rules_options.add_integrity = false;
12768
12769 rules_options.delay_a = true;
12770 rules_options.delay_aaaa = true;
12771 rules_options.delay_integrity = true;
12772
12773 AddRules(CreateDefaultDnsRules(), rules_options);
12774 std::unique_ptr<ResolveHostResponseHelper> response =
12775 DoIntegrityQuery(true /* use_secure */);
12776
Peter Kastinge5a38ed2021-10-02 03:06:3512777 constexpr base::TimeDelta kQuantum = base::Milliseconds(1);
Daniel McArdle2daa3ec2020-06-03 16:05:4812778
Daniel McArdle4afc68b2020-06-03 16:48:2812779 FastForwardBy(100 * kQuantum);
Daniel McArdle2daa3ec2020-06-03 16:05:4812780
12781 ASSERT_TRUE(
12782 dns_client_->CompleteOneDelayedTransactionOfType(DnsQueryType::A));
12783 ASSERT_TRUE(
12784 dns_client_->CompleteOneDelayedTransactionOfType(DnsQueryType::AAAA));
12785
12786 FastForwardBy(kQuantum);
12787
12788 ASSERT_FALSE(dns_client_->CompleteOneDelayedTransactionOfType(
12789 DnsQueryType::INTEGRITY));
12790
12791 FastForwardBy(kQuantum);
12792
12793 ASSERT_THAT(response->result_error(), IsOk());
12794 ASSERT_TRUE(response->request()->GetAddressResults());
12795 EXPECT_THAT(response->request()->GetAddressResults()->endpoints(),
12796 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 108),
12797 CreateExpected("::1", 108)));
Eric Orth7139e0552020-11-04 02:41:1112798 EXPECT_THAT(response->request()->GetExperimentalResultsForTesting(),
Daniel McArdle2daa3ec2020-06-03 16:05:4812799 Optional(IsEmpty()));
12800}
12801
12802// Ensure that the address results are preserved, even when the INTEGRITY query
12803// completes first and fails.
12804TEST_F(HostResolverManagerDnsTestIntegrity,
12805 IntegrityQueryCompletesFirstWithError) {
12806 IntegrityAddRulesOptions rules_options;
12807 rules_options.add_a = true;
12808 rules_options.add_aaaa = true;
12809 rules_options.add_integrity = false;
12810
12811 rules_options.delay_a = true;
12812 rules_options.delay_aaaa = true;
12813 rules_options.delay_integrity = true;
12814
12815 AddRules(CreateDefaultDnsRules(), rules_options);
12816 std::unique_ptr<ResolveHostResponseHelper> response =
12817 DoIntegrityQuery(true /* use_secure */);
12818
Peter Kastinge5a38ed2021-10-02 03:06:3512819 constexpr base::TimeDelta kQuantum = base::Milliseconds(10);
Daniel McArdle2daa3ec2020-06-03 16:05:4812820
12821 FastForwardBy(kQuantum);
12822
12823 // This fails because there is no rule for the INTEGRITY query.
12824 ASSERT_FALSE(dns_client_->CompleteOneDelayedTransactionOfType(
12825 DnsQueryType::INTEGRITY));
12826
12827 FastForwardBy(kQuantum);
12828
12829 ASSERT_TRUE(
12830 dns_client_->CompleteOneDelayedTransactionOfType(DnsQueryType::A));
12831 ASSERT_TRUE(
12832 dns_client_->CompleteOneDelayedTransactionOfType(DnsQueryType::AAAA));
12833
12834 FastForwardBy(kQuantum);
12835
12836 ASSERT_THAT(response->result_error(), IsOk());
Eric Orth7139e0552020-11-04 02:41:1112837 EXPECT_THAT(response->request()->GetExperimentalResultsForTesting(),
Daniel McArdle2daa3ec2020-06-03 16:05:4812838 Optional(IsEmpty()));
12839 ASSERT_TRUE(response->request()->GetAddressResults());
12840 EXPECT_THAT(response->request()->GetAddressResults()->endpoints(),
12841 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 108),
12842 CreateExpected("::1", 108)));
12843}
12844
12845TEST_F(HostResolverManagerDnsTestIntegrity,
12846 IntegrityQueryCompletesLastMangled) {
12847 IntegrityAddRulesOptions rules_options;
12848 rules_options.integrity_mangled = true;
12849
12850 rules_options.delay_a = true;
12851 rules_options.delay_aaaa = true;
12852 rules_options.delay_integrity = true;
12853
12854 AddRules(CreateDefaultDnsRules(), rules_options);
12855 std::unique_ptr<ResolveHostResponseHelper> response =
12856 DoIntegrityQuery(true /* use_secure */);
12857
Peter Kastinge5a38ed2021-10-02 03:06:3512858 constexpr base::TimeDelta kQuantum = base::Milliseconds(1);
Daniel McArdle2daa3ec2020-06-03 16:05:4812859
Daniel McArdle4afc68b2020-06-03 16:48:2812860 FastForwardBy(100 * kQuantum);
Daniel McArdle2daa3ec2020-06-03 16:05:4812861
12862 ASSERT_TRUE(
12863 dns_client_->CompleteOneDelayedTransactionOfType(DnsQueryType::A));
12864 ASSERT_TRUE(
12865 dns_client_->CompleteOneDelayedTransactionOfType(DnsQueryType::AAAA));
12866
12867 FastForwardBy(kQuantum);
12868
12869 ASSERT_TRUE(dns_client_->CompleteOneDelayedTransactionOfType(
12870 DnsQueryType::INTEGRITY));
12871
12872 FastForwardBy(kQuantum);
12873
12874 ASSERT_THAT(response->result_error(), IsOk());
12875 ASSERT_TRUE(response->request()->GetAddressResults());
12876 EXPECT_THAT(response->request()->GetAddressResults()->endpoints(),
12877 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 108),
12878 CreateExpected("::1", 108)));
Eric Orth7139e0552020-11-04 02:41:1112879 EXPECT_THAT(response->request()->GetExperimentalResultsForTesting(),
Daniel McArdle2daa3ec2020-06-03 16:05:4812880 Optional(UnorderedElementsAre(false)));
12881}
12882
12883TEST_F(HostResolverManagerDnsTestIntegrity,
12884 IntegrityQueryCompletesFirstMangled) {
12885 IntegrityAddRulesOptions rules_options;
12886 rules_options.integrity_mangled = true;
12887
12888 rules_options.delay_a = true;
12889 rules_options.delay_aaaa = true;
12890 rules_options.delay_integrity = true;
12891
12892 AddRules(CreateDefaultDnsRules(), rules_options);
12893 std::unique_ptr<ResolveHostResponseHelper> response =
12894 DoIntegrityQuery(true /* use_secure */);
12895
Peter Kastinge5a38ed2021-10-02 03:06:3512896 constexpr base::TimeDelta kQuantum = base::Milliseconds(10);
Daniel McArdle2daa3ec2020-06-03 16:05:4812897
12898 FastForwardBy(kQuantum);
12899
12900 ASSERT_TRUE(dns_client_->CompleteOneDelayedTransactionOfType(
12901 DnsQueryType::INTEGRITY));
12902
12903 FastForwardBy(kQuantum);
12904
12905 ASSERT_TRUE(
12906 dns_client_->CompleteOneDelayedTransactionOfType(DnsQueryType::A));
12907 ASSERT_TRUE(
12908 dns_client_->CompleteOneDelayedTransactionOfType(DnsQueryType::AAAA));
12909
12910 FastForwardBy(kQuantum);
12911
12912 ASSERT_THAT(response->result_error(), IsOk());
Eric Orth7139e0552020-11-04 02:41:1112913 EXPECT_THAT(response->request()->GetExperimentalResultsForTesting(),
Daniel McArdle2daa3ec2020-06-03 16:05:4812914 Optional(UnorderedElementsAre(false)));
12915 ASSERT_TRUE(response->request()->GetAddressResults());
12916 EXPECT_THAT(response->request()->GetAddressResults()->endpoints(),
12917 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 108),
12918 CreateExpected("::1", 108)));
12919}
12920
Daniel McArdle4afc68b2020-06-03 16:48:2812921// Make sure that INTEGRITY queries don't get cancelled *before* the configured
12922// timeout, but do get cancelled after it, in the case where the absolute
12923// timeout dominates.
12924TEST_F(HostResolverManagerDnsTestIntegrity, RespectsAbsoluteTimeout) {
12925 IntegrityAddRulesOptions rules_options;
12926 rules_options.delay_a = true;
12927 rules_options.delay_aaaa = true;
12928 rules_options.delay_integrity = true;
12929
12930 AddRules(CreateDefaultDnsRules(), rules_options);
12931
12932 std::unique_ptr<ResolveHostResponseHelper> response =
12933 DoIntegrityQuery(true /* use_secure */);
12934
12935 // relative_timeout
12936 // ┌────────────────────────────────┤
12937 // │
12938 // │ absolute_timeout
12939 // ├────────────────────┤
12940 // a_aaaa_elapsed │ time
12941 // ├────────────────────┼─────────────────────────────────────────────────>
12942 // Now â”” (moment when A and AAAA complete)
12943 //
12944 // When the A and AAAA queries complete, and only INTEGRITY remains, we start
12945 // running the INTEGRITY timeout clock. This moment is |Now + a_aaaa_elapsed|,
12946 // or just |a_aaaa_elapsed| if we let Now = 0. The INTEGRITY query is
12947 // cancelled at the moment that |absolute_timeout| or |relative_timeout| runs
12948 // out.
12949 //
12950 // The TimeDelta values of |absolute_timeout| and |relative_timeout| are
12951 // computed from feature params.
12952 //
12953 // absolute_timeout = a_aaaa_elapsed + ExtraMs.
12954 //
12955 // relative_timeout = a_aaaa_elapsed * (1 + (ExtraPercent/100)).
12956 //
12957 // Assume ExtraMs > 0 and 0 < ExtraPercent < 100.
12958 //
12959 // For this test, we want the absolute timeout to happen *before* the relative
12960 // timeout. Compute a value for a_aaaa_elapsed such that absolute_timeout
12961 // comes before relative_timeout.
12962 //
12963 // Assuming ExtraPercent is not zero, we know that these two lines intersect
12964 // for some value of a_aaaa_elapsed. Let's find it.
12965 //
12966 // Assume absolute_timeout = relative_timeout.
12967 // a_aaaa_elapsed + ExtraMs = a_aaaa_elapsed * (1 + (ExtraPercent / 100)).
12968 // ExtraMs = a_aaaa_elapsed * (1 + (ExtraPercent / 100)) - a_aaaa_elapsed.
12969 // ExtraMs = a_aaaa_elapsed * ((1 + (ExtraPercent / 100)) - 1).
12970 // ExtraMs / ((1 + (ExtraPercent / 100)) - 1) = a_aaaa_elapsed.
12971 // Simplified:
12972 // a_aaaa_elapsed = 100 * ExtraMs / ExtraPercent.
12973 //
12974 // For values of a_aaaa_elapsed < 100 * ExtraMs / ExtraPercent,
12975 // relative_timeout < absolute_timeout. For larger values, absolute_timeout >
12976 // relative_timeout.
12977
Peter Kastinge5a38ed2021-10-02 03:06:3512978 base::TimeDelta absolute_timeout =
12979 base::Milliseconds(features::kDnsHttpssvcExtraTimeMs.Get());
Daniel McArdle4afc68b2020-06-03 16:48:2812980 base::TimeDelta intersection =
12981 100 * absolute_timeout / features::kDnsHttpssvcExtraTimePercent.Get();
12982
12983 // Let enough time pass during the A and AAAA transactions that the
12984 // absolute timeout will be less than the relative timeout.
12985 base::TimeDelta a_aaaa_elapsed = 50 * intersection;
12986
12987 FastForwardBy(a_aaaa_elapsed);
12988 ASSERT_TRUE(
12989 dns_client_->CompleteOneDelayedTransactionOfType(DnsQueryType::A));
12990 ASSERT_TRUE(
12991 dns_client_->CompleteOneDelayedTransactionOfType(DnsQueryType::AAAA));
12992
12993 // Since the A and AAAA queries have only just completed, we shouldn't
12994 // have timed out the INTEGRITY query.
12995 EXPECT_FALSE(response->complete());
12996
12997 // After half of the absolute timeout, the query should still be alive.
12998 FastForwardBy(absolute_timeout / 2);
12999
13000 // Since the absolute timeout has not yet elapsed, and it is shorter by
13001 // design than the relative timeout, we shouldn't
13002 // have timed out the INTEGRITY transaction.
13003 EXPECT_FALSE(response->complete());
13004
13005 // After (more than) the timeout has passed, we should have cancelled
13006 // the INTEGRITY transaction.
13007 FastForwardBy(absolute_timeout);
13008 ASSERT_THAT(response->result_error(), IsOk());
13009
13010 // Since we cancelled the transaction, we shouldn't have any INTEGRITY
13011 // results.
Eric Orth7139e0552020-11-04 02:41:1113012 EXPECT_FALSE(response->request()->GetExperimentalResultsForTesting());
Daniel McArdle4afc68b2020-06-03 16:48:2813013
13014 // Out of paranoia, pass some more time to ensure no crashes occur.
Peter Kastinge5a38ed2021-10-02 03:06:3513015 FastForwardBy(base::Milliseconds(100));
Daniel McArdle4afc68b2020-06-03 16:48:2813016}
13017
13018TEST_F(HostResolverManagerDnsTestIntegrity, RespectsRelativeTimeout) {
13019 IntegrityAddRulesOptions rules_options;
13020 rules_options.delay_a = false;
13021 rules_options.delay_aaaa = true;
13022 rules_options.delay_integrity = true;
13023
13024 AddRules(CreateDefaultDnsRules(), rules_options);
13025
13026 std::unique_ptr<ResolveHostResponseHelper> response =
13027 DoIntegrityQuery(true /* use_secure */);
13028
Peter Kastinge5a38ed2021-10-02 03:06:3513029 base::TimeDelta absolute_timeout =
13030 base::Milliseconds(features::kDnsHttpssvcExtraTimeMs.Get());
Daniel McArdle4afc68b2020-06-03 16:48:2813031 base::TimeDelta intersection =
13032 100 * absolute_timeout / features::kDnsHttpssvcExtraTimePercent.Get();
13033
13034 // Let little enough time pass during the A and AAAA transactions that the
13035 // relative timeout will be less than the absolute timeout.
13036 base::TimeDelta a_aaaa_elapsed = 0.05 * intersection;
13037
13038 // Since the A and AAAA queries haven't both completed yet, we shouldn't time
13039 // out the INTEGRITY query.
13040 FastForwardBy(a_aaaa_elapsed);
13041
13042 // Upon completing the AAAA transaction, the INTEGRITY timer should start
13043 ASSERT_TRUE(
13044 dns_client_->CompleteOneDelayedTransactionOfType(DnsQueryType::AAAA));
13045
13046 base::TimeDelta relative_timeout =
13047 a_aaaa_elapsed * features::kDnsHttpssvcExtraTimePercent.Get() / 100;
13048
13049 // After *less* than the relative timeout, the query shouldn't have concluded.
13050 FastForwardBy(relative_timeout * 0.5);
13051
13052 EXPECT_FALSE(response->complete());
13053
13054 // After more than the relative timeout, the query should conclude by aborting
13055 // the INTEGRITY query.
13056 FastForwardBy(relative_timeout);
13057
13058 // The task should have completed with a cancelled INTEGRITY query.
13059 ASSERT_THAT(response->result_error(), IsOk());
Eric Orth7139e0552020-11-04 02:41:1113060 EXPECT_FALSE(response->request()->GetExperimentalResultsForTesting());
Daniel McArdle4afc68b2020-06-03 16:48:2813061 ASSERT_TRUE(response->request()->GetAddressResults());
13062 EXPECT_THAT(response->request()->GetAddressResults()->endpoints(),
13063 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 108),
13064 CreateExpected("::1", 108)));
13065
13066 // Out of paranoia, pass some more time to ensure no crashes occur.
Peter Kastinge5a38ed2021-10-02 03:06:3513067 FastForwardBy(base::Milliseconds(100));
Daniel McArdle4afc68b2020-06-03 16:48:2813068}
13069
Eric Orth314e8b42019-11-12 00:32:2113070TEST_F(HostResolverManagerDnsTest, DohProbeRequest) {
13071 ChangeDnsConfig(CreateValidDnsConfig());
13072
13073 EXPECT_FALSE(dns_client_->factory()->doh_probes_running());
13074
13075 std::unique_ptr<HostResolverManager::CancellableProbeRequest> request =
Eric Orth069a3c6e2020-01-31 23:14:2413076 resolver_->CreateDohProbeRequest(resolve_context_.get());
Eric Orth314e8b42019-11-12 00:32:2113077 EXPECT_THAT(request->Start(), IsError(ERR_IO_PENDING));
13078
13079 EXPECT_TRUE(dns_client_->factory()->doh_probes_running());
13080
13081 request.reset();
13082
13083 EXPECT_FALSE(dns_client_->factory()->doh_probes_running());
13084}
13085
13086TEST_F(HostResolverManagerDnsTest, DohProbeRequest_ExplicitCancel) {
13087 ChangeDnsConfig(CreateValidDnsConfig());
13088
13089 std::unique_ptr<HostResolverManager::CancellableProbeRequest> request =
Eric Orth069a3c6e2020-01-31 23:14:2413090 resolver_->CreateDohProbeRequest(resolve_context_.get());
Eric Orth314e8b42019-11-12 00:32:2113091 EXPECT_THAT(request->Start(), IsError(ERR_IO_PENDING));
13092 ASSERT_TRUE(dns_client_->factory()->doh_probes_running());
13093
13094 request->Cancel();
13095
13096 EXPECT_FALSE(dns_client_->factory()->doh_probes_running());
13097}
13098
13099TEST_F(HostResolverManagerDnsTest, DohProbeRequest_ExplicitCancel_NotStarted) {
13100 ChangeDnsConfig(CreateValidDnsConfig());
13101
13102 std::unique_ptr<HostResolverManager::CancellableProbeRequest> request =
Eric Orth069a3c6e2020-01-31 23:14:2413103 resolver_->CreateDohProbeRequest(resolve_context_.get());
Eric Orth314e8b42019-11-12 00:32:2113104
13105 request->Cancel();
13106
13107 EXPECT_FALSE(dns_client_->factory()->doh_probes_running());
13108}
13109
13110TEST_F(HostResolverManagerDnsTest,
13111 DohProbeRequest_ExplicitCancel_AfterManagerDestruction) {
13112 ChangeDnsConfig(CreateValidDnsConfig());
13113
13114 std::unique_ptr<HostResolverManager::CancellableProbeRequest> request =
Eric Orth069a3c6e2020-01-31 23:14:2413115 resolver_->CreateDohProbeRequest(resolve_context_.get());
Eric Orth314e8b42019-11-12 00:32:2113116 EXPECT_THAT(request->Start(), IsError(ERR_IO_PENDING));
13117 ASSERT_TRUE(dns_client_->factory()->doh_probes_running());
13118
13119 DestroyResolver();
13120 request->Cancel();
13121}
13122
Eric Orth23935862020-01-10 00:42:2413123TEST_F(HostResolverManagerDnsTest, DohProbeRequest_BeforeConfig) {
13124 InvalidateDnsConfig();
13125
13126 std::unique_ptr<HostResolverManager::CancellableProbeRequest> request =
Eric Orth069a3c6e2020-01-31 23:14:2413127 resolver_->CreateDohProbeRequest(resolve_context_.get());
Eric Orth23935862020-01-10 00:42:2413128 EXPECT_THAT(request->Start(), IsError(ERR_IO_PENDING));
13129 EXPECT_FALSE(dns_client_->factory()->doh_probes_running());
13130
13131 ChangeDnsConfig(CreateValidDnsConfig());
13132 EXPECT_TRUE(dns_client_->factory()->doh_probes_running());
13133}
13134
13135TEST_F(HostResolverManagerDnsTest, DohProbeRequest_InvalidateConfig) {
13136 ChangeDnsConfig(CreateValidDnsConfig());
13137
13138 std::unique_ptr<HostResolverManager::CancellableProbeRequest> request =
Eric Orth069a3c6e2020-01-31 23:14:2413139 resolver_->CreateDohProbeRequest(resolve_context_.get());
Eric Orth23935862020-01-10 00:42:2413140 EXPECT_THAT(request->Start(), IsError(ERR_IO_PENDING));
13141 ASSERT_TRUE(dns_client_->factory()->doh_probes_running());
13142
13143 InvalidateDnsConfig();
13144
13145 EXPECT_FALSE(dns_client_->factory()->doh_probes_running());
13146}
13147
13148TEST_F(HostResolverManagerDnsTest, DohProbeRequest_CancelBeforeConfig) {
13149 InvalidateDnsConfig();
13150
13151 std::unique_ptr<HostResolverManager::CancellableProbeRequest> request =
Eric Orth069a3c6e2020-01-31 23:14:2413152 resolver_->CreateDohProbeRequest(resolve_context_.get());
Eric Orth23935862020-01-10 00:42:2413153 EXPECT_THAT(request->Start(), IsError(ERR_IO_PENDING));
13154 EXPECT_FALSE(dns_client_->factory()->doh_probes_running());
13155
13156 request->Cancel();
13157
13158 ChangeDnsConfig(CreateValidDnsConfig());
13159 EXPECT_FALSE(dns_client_->factory()->doh_probes_running());
13160}
13161
13162TEST_F(HostResolverManagerDnsTest, DohProbeRequest_RestartOnConnectionChange) {
13163 DestroyResolver();
13164 test::ScopedMockNetworkChangeNotifier notifier;
13165 CreateSerialResolver();
13166 notifier.mock_network_change_notifier()->SetConnectionType(
13167 NetworkChangeNotifier::CONNECTION_NONE);
13168 ChangeDnsConfig(CreateValidDnsConfig());
13169
13170 std::unique_ptr<HostResolverManager::CancellableProbeRequest> request =
Eric Orth069a3c6e2020-01-31 23:14:2413171 resolver_->CreateDohProbeRequest(resolve_context_.get());
Eric Orth23935862020-01-10 00:42:2413172 EXPECT_THAT(request->Start(), IsError(ERR_IO_PENDING));
Eric Orth23935862020-01-10 00:42:2413173 EXPECT_TRUE(dns_client_->factory()->doh_probes_running());
Eric Orth020e5fe2020-03-12 17:43:4313174 dns_client_->factory()->CompleteDohProbeRuners();
13175 ASSERT_FALSE(dns_client_->factory()->doh_probes_running());
Eric Orth23935862020-01-10 00:42:2413176
13177 notifier.mock_network_change_notifier()->SetConnectionTypeAndNotifyObservers(
13178 NetworkChangeNotifier::CONNECTION_NONE);
13179
Eric Orth020e5fe2020-03-12 17:43:4313180 EXPECT_TRUE(dns_client_->factory()->doh_probes_running());
Eric Orth23935862020-01-10 00:42:2413181}
13182
Eric Orth3d1e6542020-01-10 19:31:5713183TEST_F(HostResolverManagerDnsTest, MultipleDohProbeRequests) {
13184 ChangeDnsConfig(CreateValidDnsConfig());
13185
13186 EXPECT_FALSE(dns_client_->factory()->doh_probes_running());
13187
13188 std::unique_ptr<HostResolverManager::CancellableProbeRequest> request1 =
Eric Orth069a3c6e2020-01-31 23:14:2413189 resolver_->CreateDohProbeRequest(resolve_context_.get());
Eric Orth3d1e6542020-01-10 19:31:5713190 EXPECT_THAT(request1->Start(), IsError(ERR_IO_PENDING));
13191 std::unique_ptr<HostResolverManager::CancellableProbeRequest> request2 =
Eric Orth069a3c6e2020-01-31 23:14:2413192 resolver_->CreateDohProbeRequest(resolve_context_.get());
Eric Orth3d1e6542020-01-10 19:31:5713193 EXPECT_THAT(request2->Start(), IsError(ERR_IO_PENDING));
13194
13195 EXPECT_TRUE(dns_client_->factory()->doh_probes_running());
13196
13197 request1.reset();
13198 EXPECT_TRUE(dns_client_->factory()->doh_probes_running());
13199
13200 request2.reset();
13201 EXPECT_FALSE(dns_client_->factory()->doh_probes_running());
13202}
13203
Eric Orthedc8e235b2020-02-27 22:59:5413204// Test that a newly-registered ResolveContext is immediately usable with a DNS
13205// configuration loaded before the context registration.
13206TEST_F(HostResolverManagerDnsTest,
13207 NewlyRegisteredContext_ConfigBeforeRegistration) {
13208 ResolveContext context(nullptr /* url_request_context */,
13209 true /* enable_caching */);
13210 set_allow_fallback_to_proctask(false);
13211 ChangeDnsConfig(CreateValidDnsConfig());
13212 DnsConfigOverrides overrides;
Eric Ortha093b092020-09-24 23:13:0213213 overrides.secure_dns_mode = SecureDnsMode::kSecure;
Eric Orthedc8e235b2020-02-27 22:59:5413214 resolver_->SetDnsConfigOverrides(overrides);
13215
13216 ASSERT_TRUE(dns_client_->GetCurrentSession());
13217
13218 resolver_->RegisterResolveContext(&context);
13219 EXPECT_EQ(context.current_session_for_testing(),
13220 dns_client_->GetCurrentSession());
13221
13222 // Test a SECURE-mode DoH request with SetForceDohServerAvailable(false).
13223 // Should only succeed if a DoH server is marked available in the
13224 // ResolveContext. MockDnsClient skips most other interaction with
13225 // ResolveContext.
13226 dns_client_->SetForceDohServerAvailable(false);
Eric Orthafa35442020-02-28 22:09:5213227 context.RecordServerSuccess(0u /* server_index */, true /* is_doh_server */,
13228 dns_client_->GetCurrentSession());
Eric Orthedc8e235b2020-02-27 22:59:5413229 ResolveHostResponseHelper response(resolver_->CreateRequest(
13230 HostPortPair("secure", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:5213231 absl::nullopt, &context, context.host_cache()));
Eric Orthedc8e235b2020-02-27 22:59:5413232 EXPECT_THAT(response.result_error(), IsOk());
13233
13234 resolver_->DeregisterResolveContext(&context);
13235}
13236
13237// Test interaction with a ResolveContext registered before a DNS config is
13238// ready.
13239TEST_F(HostResolverManagerDnsTest,
13240 NewlyRegisteredContext_NoConfigAtRegistration) {
13241 ResolveContext context(nullptr /* url_request_context */,
13242 true /* enable_caching */);
13243 set_allow_fallback_to_proctask(false);
13244 InvalidateDnsConfig();
13245 DnsConfigOverrides overrides;
Eric Ortha093b092020-09-24 23:13:0213246 overrides.secure_dns_mode = SecureDnsMode::kSecure;
Eric Orthedc8e235b2020-02-27 22:59:5413247 resolver_->SetDnsConfigOverrides(overrides);
13248
13249 ASSERT_FALSE(dns_client_->GetCurrentSession());
13250
13251 // Register context before loading a DNS config.
13252 resolver_->RegisterResolveContext(&context);
13253 EXPECT_FALSE(context.current_session_for_testing());
13254
13255 // Load DNS config and expect the session to be loaded into the ResolveContext
13256 ChangeDnsConfig(CreateValidDnsConfig());
13257 ASSERT_TRUE(dns_client_->GetCurrentSession());
13258 EXPECT_EQ(context.current_session_for_testing(),
13259 dns_client_->GetCurrentSession());
13260
13261 // Test a SECURE-mode DoH request with SetForceDohServerAvailable(false).
13262 // Should only succeed if a DoH server is marked available in the
13263 // ResolveContext. MockDnsClient skips most other interaction with
13264 // ResolveContext.
13265 dns_client_->SetForceDohServerAvailable(false);
Eric Orthafa35442020-02-28 22:09:5213266 context.RecordServerSuccess(0u /* server_index */, true /* is_doh_server */,
13267 dns_client_->GetCurrentSession());
Eric Orthedc8e235b2020-02-27 22:59:5413268 ResolveHostResponseHelper response(resolver_->CreateRequest(
13269 HostPortPair("secure", 80), NetworkIsolationKey(), NetLogWithSource(),
Anton Bikineev068d2912021-05-15 20:43:5213270 absl::nullopt, &context, context.host_cache()));
Eric Orthedc8e235b2020-02-27 22:59:5413271 EXPECT_THAT(response.result_error(), IsOk());
13272
13273 resolver_->DeregisterResolveContext(&context);
13274}
13275
Eric Orth2bc48c72021-02-22 21:37:1113276// `HostResolver::ResolveHostParameters::avoid_multicast_resolution` not
13277// currently supported to do anything except with the system resolver. So with
13278// DnsTask, expect it to be ignored.
13279TEST_F(HostResolverManagerDnsTest, AvoidMulticastIgnoredWithDnsTask) {
13280 ChangeDnsConfig(CreateValidDnsConfig());
13281
13282 HostResolver::ResolveHostParameters parameters;
13283 parameters.avoid_multicast_resolution = true;
13284
13285 ResolveHostResponseHelper response(resolver_->CreateRequest(
13286 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
13287 parameters, resolve_context_.get(), resolve_context_->host_cache()));
13288 EXPECT_THAT(response.result_error(), IsOk());
13289}
13290
[email protected]259aefa2009-08-20 22:45:0013291} // namespace net