blob: e097464e21b67fcbf61b175669bcddccd42dfacb [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"
16#include "base/bind_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"
tripta.gdda72022017-06-19 05:16:2325#include "base/stl_util.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"
Eric Orth70992982018-07-24 00:25:0032#include "base/test/bind_test_util.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"
[email protected]ecfa71c2008-09-09 13:28:3644#include "net/base/address_list.h"
Matt Menkef4023312019-11-01 18:24:5545#include "net/base/features.h"
Eric Orth026776a2019-01-18 00:13:2846#include "net/base/host_port_pair.h"
martijna23c8962016-03-04 18:18:5147#include "net/base/ip_address.h"
Eric Orth026776a2019-01-18 00:13:2848#include "net/base/ip_endpoint.h"
mgershaf9a9232017-04-13 20:19:0349#include "net/base/mock_network_change_notifier.h"
[email protected]471822ca2009-01-29 11:32:2650#include "net/base/net_errors.h"
Matt Menkef4023312019-11-01 18:24:5551#include "net/base/network_isolation_key.h"
[email protected]78eac2a2012-03-14 19:09:2752#include "net/dns/dns_client.h"
Eric Orthc1eb1292018-10-09 22:07:0753#include "net/dns/dns_config.h"
[email protected]78eac2a2012-03-14 19:09:2754#include "net/dns/dns_test_util.h"
Eric Orth192e3bb2018-11-14 19:30:3255#include "net/dns/dns_util.h"
David Van Cleveb1f45bd2019-11-14 07:36:4956#include "net/dns/host_resolver_histograms.h"
[email protected]f2cb3cf2013-03-21 01:40:5357#include "net/dns/mock_host_resolver.h"
Eric Orth9871aafa2018-10-02 19:59:1858#include "net/dns/mock_mdns_client.h"
59#include "net/dns/mock_mdns_socket_factory.h"
Katharine Daly886eef72019-11-22 02:56:0360#include "net/dns/public/resolve_error_info.h"
Eric Orth069a3c6e2020-01-31 23:14:2461#include "net/dns/resolve_context.h"
Eric Orthfe6d5482019-09-03 18:27:5762#include "net/dns/test_dns_config_service.h"
mikecirone8b85c432016-09-08 19:11:0063#include "net/log/net_log_event_type.h"
64#include "net/log/net_log_source_type.h"
mikecironef22f9812016-10-04 03:40:1965#include "net/log/net_log_with_source.h"
sergeyub8cdc212015-05-14 18:50:3766#include "net/log/test_net_log.h"
Eric Roman79cc7552019-07-19 02:17:5467#include "net/log/test_net_log_util.h"
Eric Orth394db1732019-08-27 20:09:3968#include "net/socket/socket_test_util.h"
robpercival214763f2016-07-01 23:27:0169#include "net/test/gtest_util.h"
Gabriel Charettec7108742019-08-23 03:31:4070#include "net/test/test_with_task_environment.h"
Eric Orth6f1c5172019-04-16 17:08:2771#include "net/url_request/url_request_context.h"
72#include "net/url_request/url_request_test_util.h"
robpercival214763f2016-07-01 23:27:0173#include "testing/gmock/include/gmock/gmock.h"
[email protected]ecfa71c2008-09-09 13:28:3674#include "testing/gtest/include/gtest/gtest.h"
Matt Menkef4023312019-11-01 18:24:5575#include "url/gurl.h"
76#include "url/origin.h"
[email protected]212d1492008-09-05 19:38:5477
Eric Orth026776a2019-01-18 00:13:2878#if BUILDFLAG(ENABLE_MDNS)
79#include "net/dns/mdns_client_impl.h"
80#endif // BUILDFLAG(ENABLE_MDNS)
81
robpercival214763f2016-07-01 23:27:0182using net::test::IsError;
83using net::test::IsOk;
Eric Orth9871aafa2018-10-02 19:59:1884using ::testing::_;
David Van Clevec719c882019-11-04 15:47:4085using ::testing::AllOf;
Eric Orth9871aafa2018-10-02 19:59:1886using ::testing::Between;
87using ::testing::ByMove;
David Van Clevec719c882019-11-04 15:47:4088using ::testing::Eq;
89using ::testing::Optional;
90using ::testing::Pair;
91using ::testing::Property;
Eric Orth9871aafa2018-10-02 19:59:1892using ::testing::Return;
David Van Clevec719c882019-11-04 15:47:4093using ::testing::UnorderedElementsAre;
robpercival214763f2016-07-01 23:27:0194
[email protected]259aefa2009-08-20 22:45:0095namespace net {
[email protected]68ad3ee2010-01-30 03:45:3996
[email protected]38b50d92012-04-19 21:07:5297namespace {
[email protected]112bd462009-12-10 07:23:4098
[email protected]78eac2a2012-03-14 19:09:2799const size_t kMaxJobs = 10u;
100const size_t kMaxRetryAttempts = 4u;
[email protected]68ad3ee2010-01-30 03:45:39101
Eric Orth59066222019-03-07 23:52:27102ProcTaskParams DefaultParams(HostResolverProc* resolver_proc) {
103 return ProcTaskParams(resolver_proc, kMaxRetryAttempts);
[email protected]0f292de02012-02-01 22:28:20104}
105
[email protected]38b50d92012-04-19 21:07:52106// A HostResolverProc that pushes each host mapped into a list and allows
107// waiting for a specific number of requests. Unlike RuleBasedHostResolverProc
[email protected]1ee9afa12013-04-16 14:18:06108// it never calls SystemHostResolverCall. By default resolves all hostnames to
[email protected]38b50d92012-04-19 21:07:52109// "127.0.0.1". After AddRule(), it resolves only names explicitly specified.
110class MockHostResolverProc : public HostResolverProc {
[email protected]57a48d32012-03-03 00:04:55111 public:
[email protected]38b50d92012-04-19 21:07:52112 struct ResolveKey {
Eric Orth322af3e42018-08-20 18:12:59113 ResolveKey(const std::string& hostname,
114 AddressFamily address_family,
115 HostResolverFlags flags)
116 : hostname(hostname), address_family(address_family), flags(flags) {}
[email protected]38b50d92012-04-19 21:07:52117 bool operator<(const ResolveKey& other) const {
Eric Orth322af3e42018-08-20 18:12:59118 return std::tie(address_family, hostname, flags) <
119 std::tie(other.address_family, other.hostname, other.flags);
[email protected]38b50d92012-04-19 21:07:52120 }
[email protected]137af622010-02-05 02:14:35121 std::string hostname;
122 AddressFamily address_family;
Eric Orth322af3e42018-08-20 18:12:59123 HostResolverFlags flags;
[email protected]137af622010-02-05 02:14:35124 };
125
[email protected]38b50d92012-04-19 21:07:52126 typedef std::vector<ResolveKey> CaptureList;
[email protected]137af622010-02-05 02:14:35127
[email protected]38b50d92012-04-19 21:07:52128 MockHostResolverProc()
Raul Tambre94493c652019-03-11 17:18:35129 : HostResolverProc(nullptr),
[email protected]57a48d32012-03-03 00:04:55130 num_requests_waiting_(0),
131 num_slots_available_(0),
132 requests_waiting_(&lock_),
Eric Orth960e7062019-03-08 18:43:54133 slots_available_(&lock_) {}
[email protected]57a48d32012-03-03 00:04:55134
135 // Waits until |count| calls to |Resolve| are blocked. Returns false when
136 // timed out.
137 bool WaitFor(unsigned count) {
138 base::AutoLock lock(lock_);
139 base::Time start_time = base::Time::Now();
140 while (num_requests_waiting_ < count) {
141 requests_waiting_.TimedWait(TestTimeouts::action_timeout());
142 if (base::Time::Now() > start_time + TestTimeouts::action_timeout())
143 return false;
144 }
145 return true;
146 }
147
148 // Signals |count| waiting calls to |Resolve|. First come first served.
149 void SignalMultiple(unsigned count) {
150 base::AutoLock lock(lock_);
151 num_slots_available_ += count;
152 slots_available_.Broadcast();
153 }
154
155 // Signals all waiting calls to |Resolve|. Beware of races.
156 void SignalAll() {
157 base::AutoLock lock(lock_);
[email protected]38b50d92012-04-19 21:07:52158 num_slots_available_ = num_requests_waiting_;
[email protected]57a48d32012-03-03 00:04:55159 slots_available_.Broadcast();
160 }
161
Eric Orth322af3e42018-08-20 18:12:59162 void AddRule(const std::string& hostname,
163 AddressFamily family,
164 const AddressList& result,
165 HostResolverFlags flags = 0) {
[email protected]38b50d92012-04-19 21:07:52166 base::AutoLock lock(lock_);
Eric Orth322af3e42018-08-20 18:12:59167 rules_[ResolveKey(hostname, family, flags)] = result;
[email protected]57a48d32012-03-03 00:04:55168 }
169
Eric Orth322af3e42018-08-20 18:12:59170 void AddRule(const std::string& hostname,
171 AddressFamily family,
172 const std::string& ip_list,
173 HostResolverFlags flags = 0,
174 const std::string& canonical_name = "") {
[email protected]38b50d92012-04-19 21:07:52175 AddressList result;
Eric Orth322af3e42018-08-20 18:12:59176 int rv = ParseAddressList(ip_list, canonical_name, &result);
[email protected]38b50d92012-04-19 21:07:52177 DCHECK_EQ(OK, rv);
Eric Orth322af3e42018-08-20 18:12:59178 AddRule(hostname, family, result, flags);
[email protected]38b50d92012-04-19 21:07:52179 }
[email protected]57a48d32012-03-03 00:04:55180
[email protected]38b50d92012-04-19 21:07:52181 void AddRuleForAllFamilies(const std::string& hostname,
Eric Orth322af3e42018-08-20 18:12:59182 const std::string& ip_list,
183 HostResolverFlags flags = 0,
184 const std::string& canonical_name = "") {
[email protected]38b50d92012-04-19 21:07:52185 AddressList result;
Eric Orth322af3e42018-08-20 18:12:59186 int rv = ParseAddressList(ip_list, canonical_name, &result);
[email protected]38b50d92012-04-19 21:07:52187 DCHECK_EQ(OK, rv);
Eric Orth322af3e42018-08-20 18:12:59188 AddRule(hostname, ADDRESS_FAMILY_UNSPECIFIED, result, flags);
189 AddRule(hostname, ADDRESS_FAMILY_IPV4, result, flags);
190 AddRule(hostname, ADDRESS_FAMILY_IPV6, result, flags);
[email protected]38b50d92012-04-19 21:07:52191 }
[email protected]137af622010-02-05 02:14:35192
dchengb03027d2014-10-21 12:00:20193 int Resolve(const std::string& hostname,
194 AddressFamily address_family,
195 HostResolverFlags host_resolver_flags,
196 AddressList* addrlist,
197 int* os_error) override {
[email protected]38b50d92012-04-19 21:07:52198 base::AutoLock lock(lock_);
Eric Orth322af3e42018-08-20 18:12:59199 capture_list_.push_back(
200 ResolveKey(hostname, address_family, host_resolver_flags));
[email protected]38b50d92012-04-19 21:07:52201 ++num_requests_waiting_;
202 requests_waiting_.Broadcast();
Francois Doraya2d01ba2017-09-25 19:17:40203 {
204 base::ScopedAllowBaseSyncPrimitivesForTesting
205 scoped_allow_base_sync_primitives;
206 while (!num_slots_available_)
207 slots_available_.Wait();
208 }
[email protected]38b50d92012-04-19 21:07:52209 DCHECK_GT(num_requests_waiting_, 0u);
210 --num_slots_available_;
211 --num_requests_waiting_;
212 if (rules_.empty()) {
[email protected]007b3f82013-04-09 08:46:45213 int rv = ParseAddressList("127.0.0.1", std::string(), addrlist);
[email protected]38b50d92012-04-19 21:07:52214 DCHECK_EQ(OK, rv);
215 return OK;
216 }
Eric Orth60931742018-11-05 23:40:57217 // Ignore HOST_RESOLVER_SYSTEM_ONLY, since it should have no impact on
218 // whether a rule matches. It should only affect cache lookups.
219 ResolveKey key(hostname, address_family,
220 host_resolver_flags & ~HOST_RESOLVER_SYSTEM_ONLY);
[email protected]38b50d92012-04-19 21:07:52221 if (rules_.count(key) == 0)
222 return ERR_NAME_NOT_RESOLVED;
223 *addrlist = rules_[key];
224 return OK;
[email protected]137af622010-02-05 02:14:35225 }
[email protected]38b50d92012-04-19 21:07:52226
227 CaptureList GetCaptureList() const {
228 CaptureList copy;
229 {
230 base::AutoLock lock(lock_);
231 copy = capture_list_;
232 }
233 return copy;
234 }
235
Matt Menkef4023312019-11-01 18:24:55236 void ClearCaptureList() {
237 base::AutoLock lock(lock_);
238 capture_list_.clear();
239 }
240
[email protected]38b50d92012-04-19 21:07:52241 bool HasBlockedRequests() const {
242 base::AutoLock lock(lock_);
243 return num_requests_waiting_ > num_slots_available_;
244 }
245
[email protected]a9813302012-04-28 09:29:28246 protected:
Chris Watkins68b15032017-12-01 03:07:13247 ~MockHostResolverProc() override = default;
[email protected]38b50d92012-04-19 21:07:52248
[email protected]a9813302012-04-28 09:29:28249 private:
[email protected]38b50d92012-04-19 21:07:52250 mutable base::Lock lock_;
251 std::map<ResolveKey, AddressList> rules_;
252 CaptureList capture_list_;
253 unsigned num_requests_waiting_;
254 unsigned num_slots_available_;
255 base::ConditionVariable requests_waiting_;
256 base::ConditionVariable slots_available_;
257
258 DISALLOW_COPY_AND_ASSIGN(MockHostResolverProc);
259};
260
Eric Orth70992982018-07-24 00:25:00261class ResolveHostResponseHelper {
262 public:
263 using Callback =
264 base::OnceCallback<void(CompletionOnceCallback completion_callback,
265 int error)>;
266
David Van Cleve1fb5e8c2019-11-04 16:45:16267 ResolveHostResponseHelper() = default;
Eric Orth70992982018-07-24 00:25:00268 explicit ResolveHostResponseHelper(
Eric Orth314e8b42019-11-12 00:32:21269 std::unique_ptr<HostResolverManager::CancellableResolveHostRequest>
270 request)
Eric Orth70992982018-07-24 00:25:00271 : request_(std::move(request)) {
Katharine Daly886eef72019-11-22 02:56:03272 top_level_result_error_ = request_->Start(base::BindOnce(
Eric Orth70992982018-07-24 00:25:00273 &ResolveHostResponseHelper::OnComplete, base::Unretained(this)));
274 }
275 ResolveHostResponseHelper(
Eric Orth314e8b42019-11-12 00:32:21276 std::unique_ptr<HostResolverManager::CancellableResolveHostRequest>
277 request,
Eric Orth70992982018-07-24 00:25:00278 Callback custom_callback)
279 : request_(std::move(request)) {
Katharine Daly886eef72019-11-22 02:56:03280 top_level_result_error_ = request_->Start(
Eric Orth70992982018-07-24 00:25:00281 base::BindOnce(std::move(custom_callback),
282 base::BindOnce(&ResolveHostResponseHelper::OnComplete,
283 base::Unretained(this))));
284 }
285
Katharine Daly886eef72019-11-22 02:56:03286 bool complete() const { return top_level_result_error_ != ERR_IO_PENDING; }
287
288 int top_level_result_error() {
289 WaitForCompletion();
290 return top_level_result_error_;
291 }
292
Eric Orth70992982018-07-24 00:25:00293 int result_error() {
294 WaitForCompletion();
Katharine Daly886eef72019-11-22 02:56:03295 return request_->GetResolveErrorInfo().error;
Eric Orth70992982018-07-24 00:25:00296 }
297
Eric Orth314e8b42019-11-12 00:32:21298 HostResolverManager::CancellableResolveHostRequest* request() {
299 return request_.get();
300 }
Eric Orth70992982018-07-24 00:25:00301
302 void CancelRequest() {
303 DCHECK(request_);
304 DCHECK(!complete());
305
306 request_ = nullptr;
307 }
308
309 void OnComplete(int error) {
310 DCHECK(!complete());
Katharine Daly886eef72019-11-22 02:56:03311 top_level_result_error_ = error;
Eric Orth70992982018-07-24 00:25:00312
313 run_loop_.Quit();
314 }
315
316 private:
317 void WaitForCompletion() {
318 DCHECK(request_);
319 if (complete()) {
320 return;
321 }
322 run_loop_.Run();
323 DCHECK(complete());
324 }
325
Eric Orth314e8b42019-11-12 00:32:21326 std::unique_ptr<HostResolverManager::CancellableResolveHostRequest> request_;
Katharine Daly886eef72019-11-22 02:56:03327 int top_level_result_error_ = ERR_IO_PENDING;
Eric Orth70992982018-07-24 00:25:00328 base::RunLoop run_loop_;
329
330 DISALLOW_COPY_AND_ASSIGN(ResolveHostResponseHelper);
331};
332
[email protected]189163e2011-05-11 01:48:54333// Using LookupAttemptHostResolverProc simulate very long lookups, and control
334// which attempt resolves the host.
335class LookupAttemptHostResolverProc : public HostResolverProc {
336 public:
337 LookupAttemptHostResolverProc(HostResolverProc* previous,
338 int attempt_number_to_resolve,
339 int total_attempts)
340 : HostResolverProc(previous),
341 attempt_number_to_resolve_(attempt_number_to_resolve),
342 current_attempt_number_(0),
343 total_attempts_(total_attempts),
344 total_attempts_resolved_(0),
345 resolved_attempt_number_(0),
Eric Orth9a037562018-07-03 21:24:38346 num_attempts_waiting_(0),
347 all_done_(&lock_),
348 blocked_attempt_signal_(&lock_) {}
[email protected]189163e2011-05-11 01:48:54349
350 // Test harness will wait for all attempts to finish before checking the
351 // results.
Eric Orth9a037562018-07-03 21:24:38352 void WaitForAllAttemptsToFinish() {
353 base::AutoLock auto_lock(lock_);
354 while (total_attempts_resolved_ != total_attempts_) {
355 all_done_.Wait();
356 }
357 }
358
359 void WaitForNAttemptsToBeBlocked(int n) {
360 base::AutoLock auto_lock(lock_);
361 while (num_attempts_waiting_ < n) {
362 blocked_attempt_signal_.Wait();
[email protected]189163e2011-05-11 01:48:54363 }
364 }
365
366 // All attempts will wait for an attempt to resolve the host.
367 void WaitForAnAttemptToComplete() {
[email protected]189163e2011-05-11 01:48:54368 {
369 base::AutoLock auto_lock(lock_);
Francois Doraya2d01ba2017-09-25 19:17:40370 base::ScopedAllowBaseSyncPrimitivesForTesting
371 scoped_allow_base_sync_primitives;
Eric Orth9a037562018-07-03 21:24:38372 while (resolved_attempt_number_ == 0)
373 all_done_.Wait();
[email protected]189163e2011-05-11 01:48:54374 }
375 all_done_.Broadcast(); // Tell all waiting attempts to proceed.
376 }
377
378 // Returns the number of attempts that have finished the Resolve() method.
Eric Roman21b39232019-06-28 21:28:21379 int GetTotalAttemptsResolved() {
380 base::AutoLock auto_lock(lock_);
381 return total_attempts_resolved_;
382 }
[email protected]189163e2011-05-11 01:48:54383
Eric Roman21b39232019-06-28 21:28:21384 // Sets the resolved attempt number and unblocks waiting
385 // attempts.
386 void SetResolvedAttemptNumber(int n) {
387 base::AutoLock auto_lock(lock_);
388 EXPECT_EQ(0, resolved_attempt_number_);
389 resolved_attempt_number_ = n;
390 all_done_.Broadcast();
391 }
Eric Orth9a037562018-07-03 21:24:38392
[email protected]189163e2011-05-11 01:48:54393 // HostResolverProc methods.
dchengb03027d2014-10-21 12:00:20394 int Resolve(const std::string& host,
395 AddressFamily address_family,
396 HostResolverFlags host_resolver_flags,
397 AddressList* addrlist,
398 int* os_error) override {
[email protected]189163e2011-05-11 01:48:54399 bool wait_for_right_attempt_to_complete = true;
400 {
401 base::AutoLock auto_lock(lock_);
402 ++current_attempt_number_;
Eric Orth9a037562018-07-03 21:24:38403 ++num_attempts_waiting_;
[email protected]189163e2011-05-11 01:48:54404 if (current_attempt_number_ == attempt_number_to_resolve_) {
405 resolved_attempt_number_ = current_attempt_number_;
406 wait_for_right_attempt_to_complete = false;
407 }
408 }
409
Eric Orth9a037562018-07-03 21:24:38410 blocked_attempt_signal_.Broadcast();
411
[email protected]189163e2011-05-11 01:48:54412 if (wait_for_right_attempt_to_complete)
413 // Wait for the attempt_number_to_resolve_ attempt to resolve.
414 WaitForAnAttemptToComplete();
415
416 int result = ResolveUsingPrevious(host, address_family, host_resolver_flags,
417 addrlist, os_error);
418
419 {
420 base::AutoLock auto_lock(lock_);
421 ++total_attempts_resolved_;
Eric Orth9a037562018-07-03 21:24:38422 --num_attempts_waiting_;
[email protected]189163e2011-05-11 01:48:54423 }
424
425 all_done_.Broadcast(); // Tell all attempts to proceed.
426
427 // Since any negative number is considered a network error, with -1 having
428 // special meaning (ERR_IO_PENDING). We could return the attempt that has
429 // resolved the host as a negative number. For example, if attempt number 3
430 // resolves the host, then this method returns -4.
431 if (result == OK)
432 return -1 - resolved_attempt_number_;
433 else
434 return result;
435 }
436
[email protected]a9813302012-04-28 09:29:28437 protected:
Chris Watkins68b15032017-12-01 03:07:13438 ~LookupAttemptHostResolverProc() override = default;
[email protected]189163e2011-05-11 01:48:54439
[email protected]a9813302012-04-28 09:29:28440 private:
[email protected]189163e2011-05-11 01:48:54441 int attempt_number_to_resolve_;
442 int current_attempt_number_; // Incremented whenever Resolve is called.
443 int total_attempts_;
444 int total_attempts_resolved_;
445 int resolved_attempt_number_;
Eric Orth9a037562018-07-03 21:24:38446 int num_attempts_waiting_;
[email protected]189163e2011-05-11 01:48:54447
448 // All attempts wait for right attempt to be resolve.
449 base::Lock lock_;
450 base::ConditionVariable all_done_;
Eric Orth9a037562018-07-03 21:24:38451 base::ConditionVariable blocked_attempt_signal_;
[email protected]189163e2011-05-11 01:48:54452};
453
Eric Orth960e7062019-03-08 18:43:54454// TestHostResolverManager's sole purpose is to mock the IPv6 reachability test.
cbentzel1906f872015-06-05 16:25:25455// By default, this pretends that IPv6 is globally reachable.
456// This class is necessary so unit tests run the same on dual-stack machines as
457// well as IPv4 only machines.
Eric Orth960e7062019-03-08 18:43:54458class TestHostResolverManager : public HostResolverManager {
cbentzel1906f872015-06-05 16:25:25459 public:
Eric Orth4d635c12019-04-24 22:53:04460 TestHostResolverManager(const HostResolver::ManagerOptions& options,
Eric Orthfe6d5482019-09-03 18:27:57461 SystemDnsConfigChangeNotifier* notifier,
dalykc27699a2019-07-29 20:53:29462 NetLog* net_log,
Eric Orthfe6d5482019-09-03 18:27:57463 bool ipv6_reachable = true)
464 : HostResolverManager(options, notifier, net_log),
Eric Orth960e7062019-03-08 18:43:54465 ipv6_reachable_(ipv6_reachable) {}
cbentzel1906f872015-06-05 16:25:25466
Eric Orth960e7062019-03-08 18:43:54467 ~TestHostResolverManager() override = default;
cbentzel1906f872015-06-05 16:25:25468
469 private:
470 const bool ipv6_reachable_;
471
mgershaf9a9232017-04-13 20:19:03472 bool IsGloballyReachable(const IPAddress& dest,
473 const NetLogWithSource& net_log) override {
cbentzel1906f872015-06-05 16:25:25474 return ipv6_reachable_;
475 }
476};
477
Matt Menkec35d1632018-11-29 12:43:49478bool HasAddress(const IPAddress& search_address, const AddressList& addresses) {
tfarina9ed7f8c52016-02-19 17:50:18479 for (const auto& address : addresses) {
Matt Menkec35d1632018-11-29 12:43:49480 if (search_address == address.address())
tfarina9ed7f8c52016-02-19 17:50:18481 return true;
482 }
483 return false;
484}
485
486void TestBothLoopbackIPs(const std::string& host) {
tfarina9ed7f8c52016-02-19 17:50:18487 AddressList addresses;
Matt Menkec35d1632018-11-29 12:43:49488 EXPECT_TRUE(ResolveLocalHostname(host, &addresses));
tfarina9ed7f8c52016-02-19 17:50:18489 EXPECT_EQ(2u, addresses.size());
Matt Menkec35d1632018-11-29 12:43:49490 EXPECT_TRUE(HasAddress(IPAddress::IPv4Localhost(), addresses));
491 EXPECT_TRUE(HasAddress(IPAddress::IPv6Localhost(), addresses));
tfarina9ed7f8c52016-02-19 17:50:18492}
493
494void TestIPv6LoopbackOnly(const std::string& host) {
tfarina9ed7f8c52016-02-19 17:50:18495 AddressList addresses;
Matt Menkec35d1632018-11-29 12:43:49496 EXPECT_TRUE(ResolveLocalHostname(host, &addresses));
tfarina9ed7f8c52016-02-19 17:50:18497 EXPECT_EQ(1u, addresses.size());
Matt Menkec35d1632018-11-29 12:43:49498 EXPECT_TRUE(HasAddress(IPAddress::IPv6Localhost(), addresses));
tfarina9ed7f8c52016-02-19 17:50:18499}
500
[email protected]38b50d92012-04-19 21:07:52501} // namespace
[email protected]8a00f00a2009-06-12 00:49:38502
Gabriel Charette694c3c332019-08-19 14:53:05503class HostResolverManagerTest : public TestWithTaskEnvironment {
[email protected]471822ca2009-01-29 11:32:26504 public:
[email protected]38b50d92012-04-19 21:07:52505 static const int kDefaultPort = 80;
506
David Van Cleve1fb5e8c2019-11-04 16:45:16507 explicit HostResolverManagerTest(
508 base::test::TaskEnvironment::TimeSource time_source =
509 base::test::TaskEnvironment::TimeSource::SYSTEM_TIME)
510 : TestWithTaskEnvironment(time_source),
511 proc_(new MockHostResolverProc()) {}
[email protected]471822ca2009-01-29 11:32:26512
Eric Orth607b6d82019-05-08 16:43:32513 void CreateResolver(bool check_ipv6_on_wifi = true) {
Eric Orth70992982018-07-24 00:25:00514 CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:32515 true /* ipv6_reachable */,
516 check_ipv6_on_wifi);
[email protected]daae1322013-09-05 18:26:50517 }
518
Eric Orth37b18192019-04-22 19:09:28519 void DestroyResolver() {
520 if (!resolver_)
521 return;
522
Eric Orthaf82b49a2020-02-01 01:48:50523 resolver_->DeregisterResolveContext(resolve_context_.get());
Eric Orth37b18192019-04-22 19:09:28524 resolver_ = nullptr;
525 }
526
Eric Orth960e7062019-03-08 18:43:54527 // This HostResolverManager will only allow 1 outstanding resolve at a time
528 // and perform no retries.
Eric Orth607b6d82019-05-08 16:43:32529 void CreateSerialResolver(bool check_ipv6_on_wifi = true) {
Eric Orth59066222019-03-07 23:52:27530 ProcTaskParams params = DefaultParams(proc_.get());
[email protected]daae1322013-09-05 18:26:50531 params.max_retry_attempts = 0u;
Eric Orth607b6d82019-05-08 16:43:32532 CreateResolverWithLimitsAndParams(1u, params, true /* ipv6_reachable */,
533 check_ipv6_on_wifi);
[email protected]daae1322013-09-05 18:26:50534 }
535
[email protected]471822ca2009-01-29 11:32:26536 protected:
[email protected]daae1322013-09-05 18:26:50537 // testing::Test implementation:
Eric Orth6f1c5172019-04-16 17:08:27538 void SetUp() override {
Eric Orth6f1c5172019-04-16 17:08:27539 request_context_ = std::make_unique<TestURLRequestContext>();
Eric Orthaf82b49a2020-02-01 01:48:50540 resolve_context_ = std::make_unique<ResolveContext>(
541 request_context_.get(), true /* enable_caching */);
542 CreateResolver();
Eric Orth6f1c5172019-04-16 17:08:27543 }
[email protected]70c04ab2013-08-22 16:05:12544
dcheng67be2b1f2014-10-27 21:47:29545 void TearDown() override {
Eric Orth37b18192019-04-22 19:09:28546 if (resolver_) {
[email protected]daae1322013-09-05 18:26:50547 EXPECT_EQ(0u, resolver_->num_running_dispatcher_jobs_for_tests());
Eric Orth37b18192019-04-22 19:09:28548 }
Eric Orthaf82b49a2020-02-01 01:48:50549 DestroyResolver();
[email protected]daae1322013-09-05 18:26:50550 EXPECT_FALSE(proc_->HasBlockedRequests());
551 }
552
Eric Orth4e55b362019-05-07 22:00:03553 void CreateResolverWithLimitsAndParams(size_t max_concurrent_resolves,
554 const ProcTaskParams& params,
Eric Orth607b6d82019-05-08 16:43:32555 bool ipv6_reachable,
556 bool check_ipv6_on_wifi) {
Eric Orth4d635c12019-04-24 22:53:04557 HostResolver::ManagerOptions options = DefaultOptions();
[email protected]106ccd2c2014-06-17 09:21:00558 options.max_concurrent_resolves = max_concurrent_resolves;
Eric Orth607b6d82019-05-08 16:43:32559 options.check_ipv6_on_wifi = check_ipv6_on_wifi;
Eric Orth4e55b362019-05-07 22:00:03560
561 CreateResolverWithOptionsAndParams(std::move(options), params,
562 ipv6_reachable);
563 }
564
565 virtual HostResolver::ManagerOptions DefaultOptions() {
566 HostResolver::ManagerOptions options;
567 options.max_concurrent_resolves = kMaxJobs;
568 options.max_system_retry_attempts = kMaxRetryAttempts;
569 return options;
570 }
571
572 virtual void CreateResolverWithOptionsAndParams(
573 HostResolver::ManagerOptions options,
574 const ProcTaskParams& params,
575 bool ipv6_reachable) {
576 // Use HostResolverManagerDnsTest if enabling DNS client.
dalykc27699a2019-07-29 20:53:29577 DCHECK(!options.insecure_dns_client_enabled);
Eric Orth4e55b362019-05-07 22:00:03578
579 DestroyResolver();
580
581 resolver_ = std::make_unique<TestHostResolverManager>(
Eric Orthfe6d5482019-09-03 18:27:57582 options, nullptr /* notifier */, nullptr /* net_log */, ipv6_reachable);
[email protected]106ccd2c2014-06-17 09:21:00583 resolver_->set_proc_params_for_test(params);
Eric Orth37b18192019-04-22 19:09:28584
Eric Orthaf82b49a2020-02-01 01:48:50585 resolver_->RegisterResolveContext(resolve_context_.get());
[email protected]471822ca2009-01-29 11:32:26586 }
[email protected]aa22b242011-11-16 18:58:29587
[email protected]38b50d92012-04-19 21:07:52588 // Friendship is not inherited, so use proxies to access those.
[email protected]daae1322013-09-05 18:26:50589 size_t num_running_dispatcher_jobs() const {
[email protected]38b50d92012-04-19 21:07:52590 DCHECK(resolver_.get());
[email protected]daae1322013-09-05 18:26:50591 return resolver_->num_running_dispatcher_jobs_for_tests();
[email protected]38b50d92012-04-19 21:07:52592 }
593
Eric Orth60931742018-11-05 23:40:57594 void set_allow_fallback_to_proctask(bool allow_fallback_to_proctask) {
[email protected]16c2bd72013-06-28 01:19:22595 DCHECK(resolver_.get());
Eric Orth60931742018-11-05 23:40:57596 resolver_->allow_fallback_to_proctask_ = allow_fallback_to_proctask;
[email protected]16c2bd72013-06-28 01:19:22597 }
598
dalykc27699a2019-07-29 20:53:29599 static unsigned maximum_insecure_dns_task_failures() {
Eric Orth394db1732019-08-27 20:09:39600 return DnsClient::kMaxInsecureFallbackFailures;
[email protected]daae1322013-09-05 18:26:50601 }
602
tfarina42834112016-09-22 13:38:20603 bool IsIPv6Reachable(const NetLogWithSource& net_log) {
sergeyub8cdc212015-05-14 18:50:37604 return resolver_->IsIPv6Reachable(net_log);
605 }
606
Eric Orth394db1732019-08-27 20:09:39607 void PopulateCache(const HostCache::Key& key, IPEndPoint endpoint) {
Eric Orthaf82b49a2020-02-01 01:48:50608 resolver_->CacheResult(resolve_context_->host_cache(), key,
dalyke966a1832019-06-05 20:53:13609 HostCache::Entry(OK, AddressList(endpoint),
610 HostCache::Entry::SOURCE_UNKNOWN),
611 base::TimeDelta::FromSeconds(1));
612 }
613
dalyk48b20a992019-02-25 16:10:26614 const std::pair<const HostCache::Key, HostCache::Entry>* GetCacheHit(
615 const HostCache::Key& key) {
Eric Orthaf82b49a2020-02-01 01:48:50616 DCHECK(resolve_context_->host_cache());
617 return resolve_context_->host_cache()->LookupStale(
618 key, base::TimeTicks(), nullptr, false /* ignore_secure */);
Rob Percival94f21ad2017-11-14 10:20:24619 }
620
juliatuttle9fb7aeb2016-06-06 20:16:33621 void MakeCacheStale() {
Eric Orthaf82b49a2020-02-01 01:48:50622 DCHECK(resolve_context_->host_cache());
623 resolve_context_->host_cache()->Invalidate();
juliatuttle9fb7aeb2016-06-06 20:16:33624 }
625
Eric Orth70992982018-07-24 00:25:00626 IPEndPoint CreateExpected(const std::string& ip_literal, uint16_t port) {
627 IPAddress ip;
628 bool result = ip.AssignFromIPLiteral(ip_literal);
629 DCHECK(result);
630 return IPEndPoint(ip, port);
631 }
632
[email protected]38b50d92012-04-19 21:07:52633 scoped_refptr<MockHostResolverProc> proc_;
Eric Orth960e7062019-03-08 18:43:54634 std::unique_ptr<HostResolverManager> resolver_;
Eric Orth6f1c5172019-04-16 17:08:27635 std::unique_ptr<URLRequestContext> request_context_;
Eric Orth069a3c6e2020-01-31 23:14:24636 std::unique_ptr<ResolveContext> resolve_context_;
[email protected]471822ca2009-01-29 11:32:26637};
638
Eric Orth960e7062019-03-08 18:43:54639TEST_F(HostResolverManagerTest, AsynchronousLookup) {
[email protected]38b50d92012-04-19 21:07:52640 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42");
641 proc_->SignalMultiple(1u);
[email protected]471822ca2009-01-29 11:32:26642
Eric Orth70992982018-07-24 00:25:00643 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55644 HostPortPair("just.testing", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:24645 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:50646 resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:00647
648 EXPECT_THAT(response.result_error(), IsOk());
Katharine Daly886eef72019-11-22 02:56:03649 EXPECT_THAT(response.top_level_result_error(), IsOk());
Eric Orth70992982018-07-24 00:25:00650 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
651 testing::ElementsAre(CreateExpected("192.168.1.42", 80)));
Eric Ortheb332862019-01-26 00:52:38652 EXPECT_FALSE(response.request()->GetStaleInfo());
Eric Orth70992982018-07-24 00:25:00653
654 EXPECT_EQ("just.testing", proc_->GetCaptureList()[0].hostname);
Eric Orth26fa08e2019-02-22 01:28:37655
dalyk48b20a992019-02-25 16:10:26656 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result =
657 GetCacheHit(HostCache::Key("just.testing", DnsQueryType::UNSPECIFIED,
658 0 /* host_resolver_flags */,
Matt Menke7b4a32f2019-10-25 22:13:46659 HostResolverSource::ANY,
660 NetworkIsolationKey()));
dalyk48b20a992019-02-25 16:10:26661 EXPECT_TRUE(cache_result);
Eric Orth70992982018-07-24 00:25:00662}
663
Eric Orth6f1c5172019-04-16 17:08:27664TEST_F(HostResolverManagerTest, JobsClearedOnCompletion) {
665 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42");
666 proc_->SignalMultiple(1u);
667
668 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55669 HostPortPair("just.testing", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:24670 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:50671 resolve_context_->host_cache()));
Eric Orth6f1c5172019-04-16 17:08:27672 EXPECT_EQ(1u, resolver_->num_jobs_for_testing());
673
674 EXPECT_THAT(response.result_error(), IsOk());
675 EXPECT_EQ(0u, resolver_->num_jobs_for_testing());
676}
677
678TEST_F(HostResolverManagerTest, JobsClearedOnCompletion_MultipleRequests) {
679 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42");
680 proc_->SignalMultiple(1u);
681
682 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55683 HostPortPair("just.testing", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:24684 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:50685 resolve_context_->host_cache()));
Eric Orth6f1c5172019-04-16 17:08:27686 ResolveHostResponseHelper response2(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55687 HostPortPair("just.testing", 85), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:24688 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:50689 resolve_context_->host_cache()));
Eric Orth6f1c5172019-04-16 17:08:27690 EXPECT_EQ(1u, resolver_->num_jobs_for_testing());
691
692 EXPECT_THAT(response1.result_error(), IsOk());
693 EXPECT_THAT(response2.result_error(), IsOk());
694 EXPECT_EQ(0u, resolver_->num_jobs_for_testing());
695}
696
697TEST_F(HostResolverManagerTest, JobsClearedOnCompletion_Failure) {
698 proc_->AddRuleForAllFamilies(std::string(),
Eric Roman862ae4b22019-08-22 20:25:44699 "0.0.0.1"); // Default to failures.
Eric Orth6f1c5172019-04-16 17:08:27700 proc_->SignalMultiple(1u);
701
702 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55703 HostPortPair("just.testing", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:24704 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:50705 resolve_context_->host_cache()));
Eric Orth6f1c5172019-04-16 17:08:27706 EXPECT_EQ(1u, resolver_->num_jobs_for_testing());
707
708 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
709 EXPECT_EQ(0u, resolver_->num_jobs_for_testing());
710}
711
712TEST_F(HostResolverManagerTest, JobsClearedOnCompletion_Abort) {
713 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42");
714
715 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55716 HostPortPair("just.testing", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:24717 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:50718 resolve_context_->host_cache()));
Eric Orth6f1c5172019-04-16 17:08:27719 EXPECT_EQ(1u, resolver_->num_jobs_for_testing());
720
721 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
722 proc_->SignalMultiple(1u);
723
724 EXPECT_THAT(response.result_error(), IsError(ERR_NETWORK_CHANGED));
725 EXPECT_EQ(0u, resolver_->num_jobs_for_testing());
726}
727
Eric Orth960e7062019-03-08 18:43:54728TEST_F(HostResolverManagerTest, DnsQueryType) {
Eric Orth00fe5a62018-08-15 22:20:00729 proc_->AddRule("host", ADDRESS_FAMILY_IPV4, "192.168.1.20");
730 proc_->AddRule("host", ADDRESS_FAMILY_IPV6, "::5");
731
732 HostResolver::ResolveHostParameters parameters;
733
Eric Orth192e3bb2018-11-14 19:30:32734 parameters.dns_query_type = DnsQueryType::A;
Eric Orth117e1992019-04-17 00:24:15735 ResolveHostResponseHelper v4_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55736 HostPortPair("host", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:50737 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth00fe5a62018-08-15 22:20:00738
Eric Orth192e3bb2018-11-14 19:30:32739 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth117e1992019-04-17 00:24:15740 ResolveHostResponseHelper v6_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55741 HostPortPair("host", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:50742 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth00fe5a62018-08-15 22:20:00743
744 proc_->SignalMultiple(2u);
745
746 EXPECT_THAT(v4_response.result_error(), IsOk());
747 EXPECT_THAT(v4_response.request()->GetAddressResults().value().endpoints(),
748 testing::ElementsAre(CreateExpected("192.168.1.20", 80)));
749
750 EXPECT_THAT(v6_response.result_error(), IsOk());
751 EXPECT_THAT(v6_response.request()->GetAddressResults().value().endpoints(),
752 testing::ElementsAre(CreateExpected("::5", 80)));
753}
754
Eric Orth960e7062019-03-08 18:43:54755TEST_F(HostResolverManagerTest, LocalhostIPV4IPV6Lookup) {
Eric Orth00fe5a62018-08-15 22:20:00756 HostResolver::ResolveHostParameters parameters;
757
Eric Orth192e3bb2018-11-14 19:30:32758 parameters.dns_query_type = DnsQueryType::A;
Eric Orth00fe5a62018-08-15 22:20:00759 ResolveHostResponseHelper v6_v4_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55760 HostPortPair("localhost6", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:50761 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth00fe5a62018-08-15 22:20:00762 EXPECT_THAT(v6_v4_response.result_error(), IsOk());
763 EXPECT_THAT(v6_v4_response.request()->GetAddressResults().value().endpoints(),
764 testing::IsEmpty());
765
Eric Orth192e3bb2018-11-14 19:30:32766 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth00fe5a62018-08-15 22:20:00767 ResolveHostResponseHelper v6_v6_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55768 HostPortPair("localhost6", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:50769 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth00fe5a62018-08-15 22:20:00770 EXPECT_THAT(v6_v6_response.result_error(), IsOk());
771 EXPECT_THAT(v6_v6_response.request()->GetAddressResults().value().endpoints(),
772 testing::ElementsAre(CreateExpected("::1", 80)));
773
774 ResolveHostResponseHelper v6_unsp_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55775 HostPortPair("localhost6", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:50776 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth00fe5a62018-08-15 22:20:00777 EXPECT_THAT(v6_unsp_response.result_error(), IsOk());
778 EXPECT_THAT(
779 v6_unsp_response.request()->GetAddressResults().value().endpoints(),
780 testing::ElementsAre(CreateExpected("::1", 80)));
781
Eric Orth192e3bb2018-11-14 19:30:32782 parameters.dns_query_type = DnsQueryType::A;
Eric Orth00fe5a62018-08-15 22:20:00783 ResolveHostResponseHelper v4_v4_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55784 HostPortPair("localhost", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:50785 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth00fe5a62018-08-15 22:20:00786 EXPECT_THAT(v4_v4_response.result_error(), IsOk());
787 EXPECT_THAT(v4_v4_response.request()->GetAddressResults().value().endpoints(),
788 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
789
Eric Orth192e3bb2018-11-14 19:30:32790 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth00fe5a62018-08-15 22:20:00791 ResolveHostResponseHelper v4_v6_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55792 HostPortPair("localhost", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:50793 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth00fe5a62018-08-15 22:20:00794 EXPECT_THAT(v4_v6_response.result_error(), IsOk());
795 EXPECT_THAT(v4_v6_response.request()->GetAddressResults().value().endpoints(),
796 testing::ElementsAre(CreateExpected("::1", 80)));
797
798 ResolveHostResponseHelper v4_unsp_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55799 HostPortPair("localhost", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:50800 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth00fe5a62018-08-15 22:20:00801 EXPECT_THAT(v4_unsp_response.result_error(), IsOk());
802 EXPECT_THAT(
803 v4_unsp_response.request()->GetAddressResults().value().endpoints(),
804 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
805 CreateExpected("::1", 80)));
806}
807
Eric Orth960e7062019-03-08 18:43:54808TEST_F(HostResolverManagerTest, ResolveIPLiteralWithHostResolverSystemOnly) {
eroman368a1002016-03-04 21:52:55809 const char kIpLiteral[] = "178.78.32.1";
810 // Add a mapping to tell if the resolver proc was called (if it was called,
811 // then the result will be the remapped value. Otherwise it will be the IP
812 // literal).
813 proc_->AddRuleForAllFamilies(kIpLiteral, "183.45.32.1");
814
Eric Orthdc35748e2018-08-23 22:41:48815 HostResolver::ResolveHostParameters parameters;
816 parameters.source = HostResolverSource::SYSTEM;
Eric Orth117e1992019-04-17 00:24:15817 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55818 HostPortPair(kIpLiteral, 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:50819 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthdc35748e2018-08-23 22:41:48820
821 // IP literal resolution is expected to take precedence over source, so the
822 // result is expected to be the input IP, not the result IP from the proc rule
823 EXPECT_THAT(response.result_error(), IsOk());
824 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
825 testing::ElementsAre(CreateExpected(kIpLiteral, 80)));
Eric Ortheb332862019-01-26 00:52:38826 EXPECT_FALSE(response.request()->GetStaleInfo());
Eric Orthdc35748e2018-08-23 22:41:48827}
828
Eric Orth960e7062019-03-08 18:43:54829TEST_F(HostResolverManagerTest, EmptyListMeansNameNotResolved) {
[email protected]49b70b222013-05-07 21:24:23830 proc_->AddRuleForAllFamilies("just.testing", "");
831 proc_->SignalMultiple(1u);
832
Eric Orth70992982018-07-24 00:25:00833 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55834 HostPortPair("just.testing", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:24835 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:50836 resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:00837
838 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
839 EXPECT_FALSE(response.request()->GetAddressResults());
Eric Ortheb332862019-01-26 00:52:38840 EXPECT_FALSE(response.request()->GetStaleInfo());
Eric Orth70992982018-07-24 00:25:00841
842 EXPECT_EQ("just.testing", proc_->GetCaptureList()[0].hostname);
843}
844
Eric Orth960e7062019-03-08 18:43:54845TEST_F(HostResolverManagerTest, FailedAsynchronousLookup) {
[email protected]007b3f82013-04-09 08:46:45846 proc_->AddRuleForAllFamilies(std::string(),
Eric Roman862ae4b22019-08-22 20:25:44847 "0.0.0.1"); // Default to failures.
[email protected]38b50d92012-04-19 21:07:52848 proc_->SignalMultiple(1u);
[email protected]a33347c2012-01-09 18:27:01849
Eric Orth70992982018-07-24 00:25:00850 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55851 HostPortPair("just.testing", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:24852 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:50853 resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:00854 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
Katharine Daly886eef72019-11-22 02:56:03855 EXPECT_THAT(response.top_level_result_error(),
856 IsError(ERR_NAME_NOT_RESOLVED));
Eric Orth70992982018-07-24 00:25:00857 EXPECT_FALSE(response.request()->GetAddressResults());
Eric Ortheb332862019-01-26 00:52:38858 EXPECT_FALSE(response.request()->GetStaleInfo());
Eric Orth70992982018-07-24 00:25:00859
860 EXPECT_EQ("just.testing", proc_->GetCaptureList()[0].hostname);
861
862 // Also test that the error is not cached.
dalyk48b20a992019-02-25 16:10:26863 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result =
864 GetCacheHit(HostCache::Key("just.testing", DnsQueryType::UNSPECIFIED,
865 0 /* host_resolver_flags */,
Matt Menke7b4a32f2019-10-25 22:13:46866 HostResolverSource::ANY,
867 NetworkIsolationKey()));
dalyk48b20a992019-02-25 16:10:26868 EXPECT_FALSE(cache_result);
Eric Orth70992982018-07-24 00:25:00869}
870
Eric Orth960e7062019-03-08 18:43:54871TEST_F(HostResolverManagerTest, AbortedAsynchronousLookup) {
Eric Orth70992982018-07-24 00:25:00872 ResolveHostResponseHelper response0(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55873 HostPortPair("just.testing", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:24874 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:50875 resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:00876 ASSERT_FALSE(response0.complete());
877 ASSERT_TRUE(proc_->WaitFor(1u));
878
879 // Resolver is destroyed while job is running on WorkerPool.
Eric Orth37b18192019-04-22 19:09:28880 DestroyResolver();
Eric Orth70992982018-07-24 00:25:00881
882 proc_->SignalAll();
883
884 // To ensure there was no spurious callback, complete with a new resolver.
885 CreateResolver();
886 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55887 HostPortPair("just.testing", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:24888 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:50889 resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:00890
891 proc_->SignalMultiple(2u);
892
893 EXPECT_THAT(response1.result_error(), IsOk());
894
895 // This request was canceled.
896 EXPECT_FALSE(response0.complete());
897}
898
Eric Orth960e7062019-03-08 18:43:54899TEST_F(HostResolverManagerTest, NumericIPv4Address) {
Eric Orth70992982018-07-24 00:25:00900 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55901 HostPortPair("127.1.2.3", 5555), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:24902 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:50903 resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:00904
905 EXPECT_THAT(response.result_error(), IsOk());
906 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
907 testing::ElementsAre(CreateExpected("127.1.2.3", 5555)));
908}
909
Eric Orth960e7062019-03-08 18:43:54910TEST_F(HostResolverManagerTest, NumericIPv6Address) {
[email protected]dbcff96272009-05-07 00:23:44911 // Resolve a plain IPv6 address. Don't worry about [brackets], because
912 // the caller should have removed them.
Eric Orth70992982018-07-24 00:25:00913 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55914 HostPortPair("2001:db8::1", 5555), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:24915 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:50916 resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:00917
918 EXPECT_THAT(response.result_error(), IsOk());
919 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
920 testing::ElementsAre(CreateExpected("2001:db8::1", 5555)));
921}
922
Eric Orth960e7062019-03-08 18:43:54923TEST_F(HostResolverManagerTest, EmptyHost) {
Eric Orth70992982018-07-24 00:25:00924 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55925 HostPortPair(std::string(), 5555), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:24926 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:50927 resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:00928
929 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
930 EXPECT_FALSE(response.request()->GetAddressResults());
931}
932
Eric Orth960e7062019-03-08 18:43:54933TEST_F(HostResolverManagerTest, EmptyDotsHost) {
[email protected]e806cd72013-05-17 02:08:43934 for (int i = 0; i < 16; ++i) {
Eric Orth6f1c5172019-04-16 17:08:27935 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55936 HostPortPair(std::string(i, '.'), 5555), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:24937 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:50938 resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:00939
940 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
941 EXPECT_FALSE(response.request()->GetAddressResults());
942 }
943}
944
Eric Orth960e7062019-03-08 18:43:54945TEST_F(HostResolverManagerTest, LongHost) {
Eric Orth6f1c5172019-04-16 17:08:27946 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55947 HostPortPair(std::string(4097, 'a'), 5555), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:24948 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:50949 resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:00950
951 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
952 EXPECT_FALSE(response.request()->GetAddressResults());
953}
954
Eric Orth960e7062019-03-08 18:43:54955TEST_F(HostResolverManagerTest, DeDupeRequests) {
[email protected]b59ff372009-07-15 22:04:32956 // Start 5 requests, duplicating hosts "a" and "b". Since the resolver_proc is
[email protected]8a00f00a2009-06-12 00:49:38957 // blocked, these should all pile up until we signal it.
Eric Orth70992982018-07-24 00:25:00958 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:15959 responses.emplace_back(
960 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55961 HostPortPair("a", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:50962 base::nullopt, resolve_context_.get(),
963 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:15964 responses.emplace_back(
965 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55966 HostPortPair("b", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:50967 base::nullopt, resolve_context_.get(),
968 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:15969 responses.emplace_back(
970 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55971 HostPortPair("b", 81), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:50972 base::nullopt, resolve_context_.get(),
973 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:15974 responses.emplace_back(
975 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55976 HostPortPair("a", 82), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:50977 base::nullopt, resolve_context_.get(),
978 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:15979 responses.emplace_back(
980 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55981 HostPortPair("b", 83), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:50982 base::nullopt, resolve_context_.get(),
983 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:00984
985 for (auto& response : responses) {
986 ASSERT_FALSE(response->complete());
987 }
988
989 proc_->SignalMultiple(2u); // One for "a", one for "b".
990
991 for (auto& response : responses) {
992 EXPECT_THAT(response->result_error(), IsOk());
993 }
994}
995
Eric Orth960e7062019-03-08 18:43:54996TEST_F(HostResolverManagerTest, CancelMultipleRequests) {
Eric Orth70992982018-07-24 00:25:00997 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:15998 responses.emplace_back(
999 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551000 HostPortPair("a", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501001 base::nullopt, resolve_context_.get(),
1002 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151003 responses.emplace_back(
1004 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551005 HostPortPair("b", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501006 base::nullopt, resolve_context_.get(),
1007 resolve_context_->host_cache())));
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("b", 81), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501011 base::nullopt, resolve_context_.get(),
1012 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("a", 82), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501016 base::nullopt, resolve_context_.get(),
1017 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151018 responses.emplace_back(
1019 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551020 HostPortPair("b", 83), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501021 base::nullopt, resolve_context_.get(),
1022 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:001023
1024 for (auto& response : responses) {
1025 ASSERT_FALSE(response->complete());
1026 }
1027
1028 // Cancel everything except request for requests[3] ("a", 82).
1029 responses[0]->CancelRequest();
1030 responses[1]->CancelRequest();
1031 responses[2]->CancelRequest();
1032 responses[4]->CancelRequest();
1033
1034 proc_->SignalMultiple(2u); // One for "a", one for "b".
1035
1036 EXPECT_THAT(responses[3]->result_error(), IsOk());
1037
1038 EXPECT_FALSE(responses[0]->complete());
1039 EXPECT_FALSE(responses[1]->complete());
1040 EXPECT_FALSE(responses[2]->complete());
1041 EXPECT_FALSE(responses[4]->complete());
1042}
1043
Eric Orth960e7062019-03-08 18:43:541044TEST_F(HostResolverManagerTest, CanceledRequestsReleaseJobSlots) {
Eric Orth70992982018-07-24 00:25:001045 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
1046
1047 // Fill up the dispatcher and queue.
1048 for (unsigned i = 0; i < kMaxJobs + 1; ++i) {
1049 std::string hostname = "a_";
1050 hostname[1] = 'a' + i;
1051
Eric Orth117e1992019-04-17 00:24:151052 responses.emplace_back(
1053 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551054 HostPortPair(hostname, 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:241055 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:501056 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:001057 ASSERT_FALSE(responses.back()->complete());
1058
Eric Orth117e1992019-04-17 00:24:151059 responses.emplace_back(
1060 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551061 HostPortPair(hostname, 81), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:241062 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:501063 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:001064 ASSERT_FALSE(responses.back()->complete());
1065 }
1066
1067 ASSERT_TRUE(proc_->WaitFor(kMaxJobs));
1068
1069 // Cancel all but last two.
1070 for (unsigned i = 0; i < responses.size() - 2; ++i) {
1071 responses[i]->CancelRequest();
1072 }
1073
1074 ASSERT_TRUE(proc_->WaitFor(kMaxJobs + 1));
1075
1076 proc_->SignalAll();
1077
1078 size_t num_requests = responses.size();
1079 EXPECT_THAT(responses[num_requests - 1]->result_error(), IsOk());
1080 EXPECT_THAT(responses[num_requests - 2]->result_error(), IsOk());
1081 for (unsigned i = 0; i < num_requests - 2; ++i) {
1082 EXPECT_FALSE(responses[i]->complete());
1083 }
1084}
1085
Eric Orth960e7062019-03-08 18:43:541086TEST_F(HostResolverManagerTest, CancelWithinCallback) {
Eric Orth70992982018-07-24 00:25:001087 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
1088 auto custom_callback = base::BindLambdaForTesting(
1089 [&](CompletionOnceCallback completion_callback, int error) {
1090 for (auto& response : responses) {
1091 // Cancelling request is required to complete first, so that it can
1092 // attempt to cancel the others. This test assumes all jobs are
1093 // completed in order.
1094 DCHECK(!response->complete());
1095
1096 response->CancelRequest();
1097 }
1098 std::move(completion_callback).Run(error);
1099 });
1100
1101 ResolveHostResponseHelper cancelling_response(
Matt Menkef4023312019-11-01 18:24:551102 resolver_->CreateRequest(HostPortPair("a", 80), NetworkIsolationKey(),
1103 NetLogWithSource(), base::nullopt,
Eric Orthaf82b49a2020-02-01 01:48:501104 resolve_context_.get(),
1105 resolve_context_->host_cache()),
Eric Orth70992982018-07-24 00:25:001106 std::move(custom_callback));
1107
Eric Orth117e1992019-04-17 00:24:151108 responses.emplace_back(
1109 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551110 HostPortPair("a", 81), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501111 base::nullopt, resolve_context_.get(),
1112 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151113 responses.emplace_back(
1114 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551115 HostPortPair("a", 82), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501116 base::nullopt, resolve_context_.get(),
1117 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:001118
1119 proc_->SignalMultiple(2u); // One for "a". One for "finalrequest".
1120
1121 EXPECT_THAT(cancelling_response.result_error(), IsOk());
1122
1123 ResolveHostResponseHelper final_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551124 HostPortPair("finalrequest", 70), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:241125 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:501126 resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:001127 EXPECT_THAT(final_response.result_error(), IsOk());
1128
1129 for (auto& response : responses) {
1130 EXPECT_FALSE(response->complete());
1131 }
1132}
1133
Eric Orth960e7062019-03-08 18:43:541134TEST_F(HostResolverManagerTest, DeleteWithinCallback) {
Eric Orth70992982018-07-24 00:25:001135 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
1136 auto custom_callback = base::BindLambdaForTesting(
1137 [&](CompletionOnceCallback completion_callback, int error) {
1138 for (auto& response : responses) {
1139 // Deleting request is required to be first, so the other requests
1140 // will still be running to be deleted. This test assumes that the
1141 // Jobs will be Aborted in order and the requests in order within the
1142 // jobs.
1143 DCHECK(!response->complete());
1144 }
1145
Eric Orth37b18192019-04-22 19:09:281146 DestroyResolver();
Eric Orth70992982018-07-24 00:25:001147 std::move(completion_callback).Run(error);
1148 });
1149
1150 ResolveHostResponseHelper deleting_response(
Matt Menkef4023312019-11-01 18:24:551151 resolver_->CreateRequest(HostPortPair("a", 80), NetworkIsolationKey(),
1152 NetLogWithSource(), base::nullopt,
Eric Orthaf82b49a2020-02-01 01:48:501153 resolve_context_.get(),
1154 resolve_context_->host_cache()),
Eric Orth70992982018-07-24 00:25:001155 std::move(custom_callback));
1156
1157 // Start additional requests to be cancelled as part of the first's deletion.
1158 // Assumes all requests for a job are handled in order so that the deleting
1159 // request will run first and cancel the rest.
Eric Orth117e1992019-04-17 00:24:151160 responses.emplace_back(
1161 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551162 HostPortPair("a", 81), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501163 base::nullopt, resolve_context_.get(),
1164 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151165 responses.emplace_back(
1166 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551167 HostPortPair("a", 82), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501168 base::nullopt, resolve_context_.get(),
1169 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:001170
1171 proc_->SignalMultiple(3u);
1172
1173 EXPECT_THAT(deleting_response.result_error(), IsOk());
1174
1175 base::RunLoop().RunUntilIdle();
1176 for (auto& response : responses) {
1177 EXPECT_FALSE(response->complete());
1178 }
1179}
1180
Francois Doray4a0a6f12019-08-19 15:25:221181TEST_F(HostResolverManagerTest, DeleteWithinAbortedCallback) {
Eric Orth70992982018-07-24 00:25:001182 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
1183 ResolveHostResponseHelper::Callback custom_callback =
1184 base::BindLambdaForTesting(
1185 [&](CompletionOnceCallback completion_callback, int error) {
1186 for (auto& response : responses) {
1187 // Deleting request is required to be first, so the other requests
1188 // will still be running to be deleted. This test assumes that the
1189 // Jobs will be Aborted in order and the requests in order within
1190 // the jobs.
1191 DCHECK(!response->complete());
1192 }
Eric Orth37b18192019-04-22 19:09:281193 DestroyResolver();
Eric Orth70992982018-07-24 00:25:001194 std::move(completion_callback).Run(error);
1195 });
1196
1197 ResolveHostResponseHelper deleting_response(
Matt Menkef4023312019-11-01 18:24:551198 resolver_->CreateRequest(HostPortPair("a", 80), NetworkIsolationKey(),
1199 NetLogWithSource(), base::nullopt,
Eric Orthaf82b49a2020-02-01 01:48:501200 resolve_context_.get(),
1201 resolve_context_->host_cache()),
Eric Orth70992982018-07-24 00:25:001202 std::move(custom_callback));
1203
Eric Orth117e1992019-04-17 00:24:151204 responses.emplace_back(
1205 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551206 HostPortPair("a", 81), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501207 base::nullopt, resolve_context_.get(),
1208 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151209 responses.emplace_back(
1210 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551211 HostPortPair("b", 82), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501212 base::nullopt, resolve_context_.get(),
1213 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151214 responses.emplace_back(
1215 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551216 HostPortPair("b", 83), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501217 base::nullopt, resolve_context_.get(),
1218 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:001219
1220 // Wait for all calls to queue up, trigger abort via IP address change, then
1221 // signal all the queued requests to let them all try to finish.
1222 EXPECT_TRUE(proc_->WaitFor(2u));
Paul Jensenf47bbab2018-09-14 16:34:041223 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
Eric Orth70992982018-07-24 00:25:001224 proc_->SignalAll();
1225
1226 EXPECT_THAT(deleting_response.result_error(), IsError(ERR_NETWORK_CHANGED));
1227 base::RunLoop().RunUntilIdle();
1228 for (auto& response : responses) {
1229 EXPECT_FALSE(response->complete());
1230 }
1231}
1232
Eric Orth960e7062019-03-08 18:43:541233TEST_F(HostResolverManagerTest, StartWithinCallback) {
Eric Orth70992982018-07-24 00:25:001234 std::unique_ptr<ResolveHostResponseHelper> new_response;
1235 auto custom_callback = base::BindLambdaForTesting(
1236 [&](CompletionOnceCallback completion_callback, int error) {
1237 new_response = std::make_unique<ResolveHostResponseHelper>(
Matt Menkef4023312019-11-01 18:24:551238 resolver_->CreateRequest(HostPortPair("new", 70),
1239 NetworkIsolationKey(), NetLogWithSource(),
Eric Orth069a3c6e2020-01-31 23:14:241240 base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:501241 resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:001242 std::move(completion_callback).Run(error);
1243 });
1244
1245 ResolveHostResponseHelper starting_response(
Matt Menkef4023312019-11-01 18:24:551246 resolver_->CreateRequest(HostPortPair("a", 80), NetworkIsolationKey(),
1247 NetLogWithSource(), base::nullopt,
Eric Orthaf82b49a2020-02-01 01:48:501248 resolve_context_.get(),
1249 resolve_context_->host_cache()),
Eric Orth70992982018-07-24 00:25:001250 std::move(custom_callback));
1251
1252 proc_->SignalMultiple(2u); // One for "a". One for "new".
1253
1254 EXPECT_THAT(starting_response.result_error(), IsOk());
1255 EXPECT_THAT(new_response->result_error(), IsOk());
1256}
1257
Eric Orth3bd9e512019-03-29 15:33:351258TEST_F(HostResolverManagerTest, StartWithinEvictionCallback) {
1259 CreateSerialResolver();
1260 resolver_->SetMaxQueuedJobsForTesting(2);
1261
1262 std::unique_ptr<ResolveHostResponseHelper> new_response;
1263 auto custom_callback = base::BindLambdaForTesting(
1264 [&](CompletionOnceCallback completion_callback, int error) {
1265 new_response = std::make_unique<ResolveHostResponseHelper>(
Matt Menkef4023312019-11-01 18:24:551266 resolver_->CreateRequest(HostPortPair("new", 70),
1267 NetworkIsolationKey(), NetLogWithSource(),
Eric Orth069a3c6e2020-01-31 23:14:241268 base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:501269 resolve_context_->host_cache()));
Eric Orth3bd9e512019-03-29 15:33:351270 std::move(completion_callback).Run(error);
1271 });
1272
Eric Orth117e1992019-04-17 00:24:151273 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551274 HostPortPair("initial", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501275 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth3bd9e512019-03-29 15:33:351276 ResolveHostResponseHelper evictee1_response(
Matt Menkef4023312019-11-01 18:24:551277 resolver_->CreateRequest(HostPortPair("evictee1", 80),
1278 NetworkIsolationKey(), NetLogWithSource(),
Eric Orth069a3c6e2020-01-31 23:14:241279 base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:501280 resolve_context_->host_cache()),
Eric Orth3bd9e512019-03-29 15:33:351281 std::move(custom_callback));
Eric Orth117e1992019-04-17 00:24:151282 ResolveHostResponseHelper evictee2_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551283 HostPortPair("evictee2", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501284 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth3bd9e512019-03-29 15:33:351285
1286 // Now one running request ("initial") and two queued requests ("evictee1" and
1287 // "evictee2"). Any further requests will cause evictions.
Eric Orth117e1992019-04-17 00:24:151288 ResolveHostResponseHelper evictor_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551289 HostPortPair("evictor", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501290 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth3bd9e512019-03-29 15:33:351291 EXPECT_THAT(evictee1_response.result_error(),
1292 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
1293
1294 // "new" should evict "evictee2"
1295 EXPECT_THAT(evictee2_response.result_error(),
1296 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
1297
1298 proc_->SignalMultiple(3u);
1299
1300 EXPECT_THAT(initial_response.result_error(), IsOk());
1301 EXPECT_THAT(evictor_response.result_error(), IsOk());
1302 EXPECT_THAT(new_response->result_error(), IsOk());
1303}
1304
1305// Test where we start a new request within an eviction callback that itself
1306// evicts the first evictor.
1307TEST_F(HostResolverManagerTest, StartWithinEvictionCallback_DoubleEviction) {
1308 CreateSerialResolver();
1309 resolver_->SetMaxQueuedJobsForTesting(1);
1310
1311 std::unique_ptr<ResolveHostResponseHelper> new_response;
1312 auto custom_callback = base::BindLambdaForTesting(
1313 [&](CompletionOnceCallback completion_callback, int error) {
1314 new_response = std::make_unique<ResolveHostResponseHelper>(
Matt Menkef4023312019-11-01 18:24:551315 resolver_->CreateRequest(HostPortPair("new", 70),
1316 NetworkIsolationKey(), NetLogWithSource(),
Eric Orth069a3c6e2020-01-31 23:14:241317 base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:501318 resolve_context_->host_cache()));
Eric Orth3bd9e512019-03-29 15:33:351319 std::move(completion_callback).Run(error);
1320 });
1321
Eric Orth117e1992019-04-17 00:24:151322 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551323 HostPortPair("initial", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501324 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth3bd9e512019-03-29 15:33:351325 ResolveHostResponseHelper evictee_response(
Matt Menkef4023312019-11-01 18:24:551326 resolver_->CreateRequest(HostPortPair("evictee", 80),
1327 NetworkIsolationKey(), NetLogWithSource(),
Eric Orth069a3c6e2020-01-31 23:14:241328 base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:501329 resolve_context_->host_cache()),
Eric Orth3bd9e512019-03-29 15:33:351330 std::move(custom_callback));
1331
1332 // Now one running request ("initial") and one queued requests ("evictee").
1333 // Any further requests will cause evictions.
Eric Orth117e1992019-04-17 00:24:151334 ResolveHostResponseHelper evictor_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551335 HostPortPair("evictor", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501336 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth3bd9e512019-03-29 15:33:351337 EXPECT_THAT(evictee_response.result_error(),
1338 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
1339
1340 // "new" should evict "evictor"
1341 EXPECT_THAT(evictor_response.result_error(),
1342 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
1343
1344 proc_->SignalMultiple(2u);
1345
1346 EXPECT_THAT(initial_response.result_error(), IsOk());
1347 EXPECT_THAT(new_response->result_error(), IsOk());
1348}
1349
1350TEST_F(HostResolverManagerTest, StartWithinEvictionCallback_SameRequest) {
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("evictor", 70),
1359 NetworkIsolationKey(), NetLogWithSource(),
Eric Orth069a3c6e2020-01-31 23:14:241360 base::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(),
Eric Orthaf82b49a2020-02-01 01:48:501367 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth3bd9e512019-03-29 15:33:351368 ResolveHostResponseHelper evictee_response(
Matt Menkef4023312019-11-01 18:24:551369 resolver_->CreateRequest(HostPortPair("evictee", 80),
1370 NetworkIsolationKey(), NetLogWithSource(),
Eric Orth069a3c6e2020-01-31 23:14:241371 base::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));
1374 ResolveHostResponseHelper additional_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551375 HostPortPair("additional", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501376 base::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 ("evictee" and
1379 // "additional"). 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(),
Eric Orthaf82b49a2020-02-01 01:48:501382 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth3bd9e512019-03-29 15:33:351383 EXPECT_THAT(evictee_response.result_error(),
1384 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
1385
1386 // Second "evictor" should be joined with the first and not evict "additional"
1387
1388 // Only 3 proc requests because both "evictor" requests are combined.
1389 proc_->SignalMultiple(3u);
1390
1391 EXPECT_THAT(initial_response.result_error(), IsOk());
1392 EXPECT_THAT(additional_response.result_error(), IsOk());
1393 EXPECT_THAT(evictor_response.result_error(), IsOk());
1394 EXPECT_THAT(new_response->result_error(), IsOk());
1395}
1396
Eric Orth960e7062019-03-08 18:43:541397TEST_F(HostResolverManagerTest, BypassCache) {
Eric Orthdc35748e2018-08-23 22:41:481398 proc_->SignalMultiple(2u);
1399
Eric Orth117e1992019-04-17 00:24:151400 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551401 HostPortPair("a", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501402 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthdc35748e2018-08-23 22:41:481403 EXPECT_THAT(initial_response.result_error(), IsOk());
1404 EXPECT_EQ(1u, proc_->GetCaptureList().size());
1405
Eric Orth117e1992019-04-17 00:24:151406 ResolveHostResponseHelper cached_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551407 HostPortPair("a", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501408 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthdc35748e2018-08-23 22:41:481409 EXPECT_THAT(cached_response.result_error(), IsOk());
1410 // Expect no increase to calls to |proc_| because result was cached.
1411 EXPECT_EQ(1u, proc_->GetCaptureList().size());
1412
1413 HostResolver::ResolveHostParameters parameters;
Eric Ortheb332862019-01-26 00:52:381414 parameters.cache_usage =
1415 HostResolver::ResolveHostParameters::CacheUsage::DISALLOWED;
Eric Orth117e1992019-04-17 00:24:151416 ResolveHostResponseHelper cache_bypassed_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551417 HostPortPair("a", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501418 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthdc35748e2018-08-23 22:41:481419 EXPECT_THAT(cache_bypassed_response.result_error(), IsOk());
1420 // Expect call to |proc_| because cache was bypassed.
1421 EXPECT_EQ(2u, proc_->GetCaptureList().size());
1422}
1423
Paul Jensenf47bbab2018-09-14 16:34:041424// Test that IP address changes flush the cache but initial DNS config reads
Eric Orth70992982018-07-24 00:25:001425// do not.
Eric Orth960e7062019-03-08 18:43:541426TEST_F(HostResolverManagerTest, FlushCacheOnIPAddressChange) {
Eric Orth70992982018-07-24 00:25:001427 proc_->SignalMultiple(2u); // One before the flush, one after.
1428
Eric Orth117e1992019-04-17 00:24:151429 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551430 HostPortPair("host1", 70), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501431 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:001432 EXPECT_THAT(initial_response.result_error(), IsOk());
1433 EXPECT_EQ(1u, proc_->GetCaptureList().size());
1434
Eric Orth117e1992019-04-17 00:24:151435 ResolveHostResponseHelper cached_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551436 HostPortPair("host1", 75), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501437 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:001438 EXPECT_THAT(cached_response.result_error(), IsOk());
1439 EXPECT_EQ(1u, proc_->GetCaptureList().size()); // No expected increase.
1440
Paul Jensenf47bbab2018-09-14 16:34:041441 // Flush cache by triggering an IP address change.
1442 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
Eric Orth70992982018-07-24 00:25:001443 base::RunLoop().RunUntilIdle(); // Notification happens async.
1444
1445 // Resolve "host1" again -- this time it won't be served from cache, so it
1446 // will complete asynchronously.
Eric Orth117e1992019-04-17 00:24:151447 ResolveHostResponseHelper flushed_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551448 HostPortPair("host1", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501449 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:001450 EXPECT_THAT(flushed_response.result_error(), IsOk());
1451 EXPECT_EQ(2u, proc_->GetCaptureList().size()); // Expected increase.
1452}
1453
Paul Jensenf47bbab2018-09-14 16:34:041454// Test that IP address changes send ERR_NETWORK_CHANGED to pending requests.
Eric Orth960e7062019-03-08 18:43:541455TEST_F(HostResolverManagerTest, AbortOnIPAddressChanged) {
Eric Orth117e1992019-04-17 00:24:151456 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551457 HostPortPair("host1", 70), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501458 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:001459
1460 ASSERT_FALSE(response.complete());
1461 ASSERT_TRUE(proc_->WaitFor(1u));
1462
Paul Jensenf47bbab2018-09-14 16:34:041463 // Triggering an IP address change.
1464 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
Eric Orth70992982018-07-24 00:25:001465 base::RunLoop().RunUntilIdle(); // Notification happens async.
1466 proc_->SignalAll();
1467
1468 EXPECT_THAT(response.result_error(), IsError(ERR_NETWORK_CHANGED));
1469 EXPECT_FALSE(response.request()->GetAddressResults());
Eric Orthaf82b49a2020-02-01 01:48:501470 EXPECT_EQ(0u, resolve_context_->host_cache()->size());
Eric Orth70992982018-07-24 00:25:001471}
1472
Paul Jensenf47bbab2018-09-14 16:34:041473// Obey pool constraints after IP address has changed.
Eric Orth960e7062019-03-08 18:43:541474TEST_F(HostResolverManagerTest, ObeyPoolConstraintsAfterIPAddressChange) {
[email protected]38b50d92012-04-19 21:07:521475 // Runs at most one job at a time.
1476 CreateSerialResolver();
Eric Orth70992982018-07-24 00:25:001477
1478 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:151479 responses.emplace_back(
1480 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551481 HostPortPair("a", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501482 base::nullopt, resolve_context_.get(),
1483 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151484 responses.emplace_back(
1485 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551486 HostPortPair("b", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501487 base::nullopt, resolve_context_.get(),
1488 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151489 responses.emplace_back(
1490 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551491 HostPortPair("c", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501492 base::nullopt, resolve_context_.get(),
1493 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:001494
1495 for (auto& response : responses) {
1496 ASSERT_FALSE(response->complete());
1497 }
1498 ASSERT_TRUE(proc_->WaitFor(1u));
1499
Paul Jensenf47bbab2018-09-14 16:34:041500 // Triggering an IP address change.
1501 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
Eric Orth70992982018-07-24 00:25:001502 base::RunLoop().RunUntilIdle(); // Notification happens async.
1503 proc_->SignalMultiple(3u); // Let the false-start go so that we can catch it.
1504
1505 // Requests should complete one at a time, with the first failing.
1506 EXPECT_THAT(responses[0]->result_error(), IsError(ERR_NETWORK_CHANGED));
1507 EXPECT_EQ(1u, num_running_dispatcher_jobs());
1508 EXPECT_FALSE(responses[1]->complete());
1509 EXPECT_FALSE(responses[2]->complete());
1510
1511 EXPECT_THAT(responses[1]->result_error(), IsOk());
1512 EXPECT_EQ(1u, num_running_dispatcher_jobs());
1513 EXPECT_FALSE(responses[2]->complete());
1514
1515 EXPECT_THAT(responses[2]->result_error(), IsOk());
1516}
1517
[email protected]b3601bc22012-02-21 21:23:201518// Tests that a new Request made from the callback of a previously aborted one
1519// will not be aborted.
Eric Orth960e7062019-03-08 18:43:541520TEST_F(HostResolverManagerTest, AbortOnlyExistingRequestsOnIPAddressChange) {
Eric Orth70992982018-07-24 00:25:001521 auto custom_callback_template = base::BindLambdaForTesting(
1522 [&](const HostPortPair& next_host,
1523 std::unique_ptr<ResolveHostResponseHelper>* next_response,
1524 CompletionOnceCallback completion_callback, int error) {
1525 *next_response = std::make_unique<ResolveHostResponseHelper>(
Eric Orthaf82b49a2020-02-01 01:48:501526 resolver_->CreateRequest(next_host, NetworkIsolationKey(),
1527 NetLogWithSource(), base::nullopt,
1528 resolve_context_.get(),
1529 resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:001530 std::move(completion_callback).Run(error);
1531 });
1532
1533 std::vector<std::unique_ptr<ResolveHostResponseHelper>> next_responses(3);
1534
1535 ResolveHostResponseHelper response0(
Matt Menkef4023312019-11-01 18:24:551536 resolver_->CreateRequest(HostPortPair("bbb", 80), NetworkIsolationKey(),
1537 NetLogWithSource(), base::nullopt,
Eric Orthaf82b49a2020-02-01 01:48:501538 resolve_context_.get(),
1539 resolve_context_->host_cache()),
Eric Orth70992982018-07-24 00:25:001540 base::BindOnce(custom_callback_template, HostPortPair("zzz", 80),
1541 &next_responses[0]));
1542
1543 ResolveHostResponseHelper response1(
Matt Menkef4023312019-11-01 18:24:551544 resolver_->CreateRequest(HostPortPair("eee", 80), NetworkIsolationKey(),
1545 NetLogWithSource(), base::nullopt,
Eric Orthaf82b49a2020-02-01 01:48:501546 resolve_context_.get(),
1547 resolve_context_->host_cache()),
Eric Orth70992982018-07-24 00:25:001548 base::BindOnce(custom_callback_template, HostPortPair("aaa", 80),
1549 &next_responses[1]));
1550
1551 ResolveHostResponseHelper response2(
Matt Menkef4023312019-11-01 18:24:551552 resolver_->CreateRequest(HostPortPair("ccc", 80), NetworkIsolationKey(),
1553 NetLogWithSource(), base::nullopt,
Eric Orthaf82b49a2020-02-01 01:48:501554 resolve_context_.get(),
1555 resolve_context_->host_cache()),
Eric Orth70992982018-07-24 00:25:001556 base::BindOnce(custom_callback_template, HostPortPair("eee", 80),
1557 &next_responses[2]));
1558
1559 // Wait until all are blocked;
1560 ASSERT_TRUE(proc_->WaitFor(3u));
Paul Jensenf47bbab2018-09-14 16:34:041561 // Trigger an IP address change.
1562 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
Eric Orth70992982018-07-24 00:25:001563 // This should abort all running jobs.
1564 base::RunLoop().RunUntilIdle();
1565
1566 EXPECT_THAT(response0.result_error(), IsError(ERR_NETWORK_CHANGED));
1567 EXPECT_THAT(response1.result_error(), IsError(ERR_NETWORK_CHANGED));
1568 EXPECT_THAT(response2.result_error(), IsError(ERR_NETWORK_CHANGED));
1569
1570 EXPECT_FALSE(next_responses[0]->complete());
1571 EXPECT_FALSE(next_responses[1]->complete());
1572 EXPECT_FALSE(next_responses[2]->complete());
1573
1574 // Unblock all calls to proc.
1575 proc_->SignalMultiple(6u);
1576
1577 // Run until the re-started requests finish.
1578 EXPECT_THAT(next_responses[0]->result_error(), IsOk());
1579 EXPECT_THAT(next_responses[1]->result_error(), IsOk());
1580 EXPECT_THAT(next_responses[2]->result_error(), IsOk());
1581
1582 // Verify that results of aborted Jobs were not cached.
1583 EXPECT_EQ(6u, proc_->GetCaptureList().size());
Eric Orthaf82b49a2020-02-01 01:48:501584 EXPECT_EQ(3u, resolve_context_->host_cache()->size());
Eric Orth70992982018-07-24 00:25:001585}
1586
[email protected]68ad3ee2010-01-30 03:45:391587// Tests that when the maximum threads is set to 1, requests are dequeued
1588// in order of priority.
Eric Orth960e7062019-03-08 18:43:541589TEST_F(HostResolverManagerTest, HigherPriorityRequestsStartedFirst) {
[email protected]38b50d92012-04-19 21:07:521590 CreateSerialResolver();
[email protected]68ad3ee2010-01-30 03:45:391591
Eric Orth00fe5a62018-08-15 22:20:001592 HostResolver::ResolveHostParameters low_priority;
1593 low_priority.initial_priority = LOW;
1594 HostResolver::ResolveHostParameters medium_priority;
1595 medium_priority.initial_priority = MEDIUM;
1596 HostResolver::ResolveHostParameters highest_priority;
1597 highest_priority.initial_priority = HIGHEST;
1598
1599 // Note that at this point the MockHostResolverProc is blocked, so any
1600 // requests we make will not complete.
1601
1602 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:151603 responses.emplace_back(
1604 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551605 HostPortPair("req0", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501606 low_priority, resolve_context_.get(),
1607 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151608 responses.emplace_back(
1609 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551610 HostPortPair("req1", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501611 medium_priority, resolve_context_.get(),
1612 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151613 responses.emplace_back(
1614 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551615 HostPortPair("req2", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501616 medium_priority, resolve_context_.get(),
1617 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151618 responses.emplace_back(
1619 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551620 HostPortPair("req3", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501621 low_priority, resolve_context_.get(),
1622 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151623 responses.emplace_back(
1624 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551625 HostPortPair("req4", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501626 highest_priority, resolve_context_.get(),
1627 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151628 responses.emplace_back(
1629 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551630 HostPortPair("req5", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501631 low_priority, resolve_context_.get(),
1632 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151633 responses.emplace_back(
1634 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551635 HostPortPair("req6", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501636 low_priority, resolve_context_.get(),
1637 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151638 responses.emplace_back(
1639 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551640 HostPortPair("req5", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501641 highest_priority, resolve_context_.get(),
1642 resolve_context_->host_cache())));
Eric Orth00fe5a62018-08-15 22:20:001643
1644 for (const auto& response : responses) {
1645 ASSERT_FALSE(response->complete());
1646 }
1647
1648 // Unblock the resolver thread so the requests can run.
1649 proc_->SignalMultiple(responses.size()); // More than needed.
1650
1651 // Wait for all the requests to complete successfully.
1652 for (auto& response : responses) {
1653 EXPECT_THAT(response->result_error(), IsOk());
1654 }
1655
1656 // Since we have restricted to a single concurrent thread in the jobpool,
1657 // the requests should complete in order of priority (with the exception
1658 // of the first request, which gets started right away, since there is
1659 // nothing outstanding).
1660 MockHostResolverProc::CaptureList capture_list = proc_->GetCaptureList();
1661 ASSERT_EQ(7u, capture_list.size());
1662
1663 EXPECT_EQ("req0", capture_list[0].hostname);
1664 EXPECT_EQ("req4", capture_list[1].hostname);
1665 EXPECT_EQ("req5", capture_list[2].hostname);
1666 EXPECT_EQ("req1", capture_list[3].hostname);
1667 EXPECT_EQ("req2", capture_list[4].hostname);
1668 EXPECT_EQ("req3", capture_list[5].hostname);
1669 EXPECT_EQ("req6", capture_list[6].hostname);
1670}
1671
juliatuttlec53b19a72016-05-05 13:51:311672// Test that changing a job's priority affects the dequeueing order.
Eric Orth960e7062019-03-08 18:43:541673TEST_F(HostResolverManagerTest, ChangePriority) {
juliatuttlec53b19a72016-05-05 13:51:311674 CreateSerialResolver();
1675
Eric Orth26fa08e2019-02-22 01:28:371676 HostResolver::ResolveHostParameters lowest_priority;
1677 lowest_priority.initial_priority = LOWEST;
1678 HostResolver::ResolveHostParameters low_priority;
1679 low_priority.initial_priority = LOW;
1680 HostResolver::ResolveHostParameters medium_priority;
1681 medium_priority.initial_priority = MEDIUM;
juliatuttlec53b19a72016-05-05 13:51:311682
Eric Orth26fa08e2019-02-22 01:28:371683 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:151684 responses.emplace_back(
1685 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551686 HostPortPair("req0", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501687 medium_priority, resolve_context_.get(),
1688 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151689 responses.emplace_back(
1690 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551691 HostPortPair("req1", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501692 low_priority, resolve_context_.get(),
1693 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151694 responses.emplace_back(
1695 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551696 HostPortPair("req2", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501697 lowest_priority, resolve_context_.get(),
1698 resolve_context_->host_cache())));
juliatuttlec53b19a72016-05-05 13:51:311699
1700 // req0 starts immediately; without ChangePriority, req1 and then req2 should
1701 // run.
Eric Orth26fa08e2019-02-22 01:28:371702 for (const auto& response : responses) {
1703 ASSERT_FALSE(response->complete());
1704 }
juliatuttlec53b19a72016-05-05 13:51:311705
Eric Orth26fa08e2019-02-22 01:28:371706 // Changing req2 to HIGHEST should make it run before req1.
juliatuttlec53b19a72016-05-05 13:51:311707 // (It can't run before req0, since req0 started immediately.)
Eric Orth26fa08e2019-02-22 01:28:371708 responses[2]->request()->ChangeRequestPriority(HIGHEST);
juliatuttlec53b19a72016-05-05 13:51:311709
1710 // Let all 3 requests finish.
1711 proc_->SignalMultiple(3u);
1712
Eric Orth26fa08e2019-02-22 01:28:371713 for (auto& response : responses) {
1714 EXPECT_THAT(response->result_error(), IsOk());
1715 }
juliatuttlec53b19a72016-05-05 13:51:311716
1717 MockHostResolverProc::CaptureList capture_list = proc_->GetCaptureList();
1718 ASSERT_EQ(3u, capture_list.size());
1719
1720 EXPECT_EQ("req0", capture_list[0].hostname);
1721 EXPECT_EQ("req2", capture_list[1].hostname);
1722 EXPECT_EQ("req1", capture_list[2].hostname);
1723}
1724
[email protected]38b50d92012-04-19 21:07:521725// Try cancelling a job which has not started yet.
Eric Orth960e7062019-03-08 18:43:541726TEST_F(HostResolverManagerTest, CancelPendingRequest) {
[email protected]38b50d92012-04-19 21:07:521727 CreateSerialResolver();
[email protected]68ad3ee2010-01-30 03:45:391728
Eric Orth00fe5a62018-08-15 22:20:001729 HostResolver::ResolveHostParameters lowest_priority;
1730 lowest_priority.initial_priority = LOWEST;
1731 HostResolver::ResolveHostParameters low_priority;
1732 low_priority.initial_priority = LOW;
1733 HostResolver::ResolveHostParameters medium_priority;
1734 medium_priority.initial_priority = MEDIUM;
1735 HostResolver::ResolveHostParameters highest_priority;
1736 highest_priority.initial_priority = HIGHEST;
1737
Eric Orth70992982018-07-24 00:25:001738 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:151739 responses.emplace_back(
1740 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551741 HostPortPair("req0", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501742 lowest_priority, resolve_context_.get(),
1743 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151744 responses.emplace_back(
1745 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551746 HostPortPair("req1", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501747 highest_priority, resolve_context_.get(),
1748 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151749 responses.emplace_back(
1750 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551751 HostPortPair("req2", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501752 medium_priority, resolve_context_.get(),
1753 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151754 responses.emplace_back(
1755 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551756 HostPortPair("req3", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501757 low_priority, resolve_context_.get(),
1758 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151759 responses.emplace_back(
1760 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551761 HostPortPair("req4", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501762 highest_priority, resolve_context_.get(),
1763 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151764 responses.emplace_back(
1765 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551766 HostPortPair("req5", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501767 lowest_priority, resolve_context_.get(),
1768 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151769 responses.emplace_back(
1770 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551771 HostPortPair("req6", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501772 medium_priority, resolve_context_.get(),
1773 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:001774
1775 // Cancel some requests
1776 responses[1]->CancelRequest();
1777 responses[4]->CancelRequest();
1778 responses[5]->CancelRequest();
1779
1780 // Unblock the resolver thread so the requests can run.
1781 proc_->SignalMultiple(responses.size()); // More than needed.
1782
1783 // Let everything try to finish.
1784 base::RunLoop().RunUntilIdle();
1785
1786 // Wait for all the requests to complete succesfully.
1787 EXPECT_THAT(responses[0]->result_error(), IsOk());
1788 EXPECT_THAT(responses[2]->result_error(), IsOk());
1789 EXPECT_THAT(responses[3]->result_error(), IsOk());
1790 EXPECT_THAT(responses[6]->result_error(), IsOk());
1791
1792 // Cancelled requests shouldn't complete.
1793 EXPECT_FALSE(responses[1]->complete());
1794 EXPECT_FALSE(responses[4]->complete());
1795 EXPECT_FALSE(responses[5]->complete());
1796
1797 // Verify that they called out the the resolver proc (which runs on the
1798 // resolver thread) in the expected order.
1799 MockHostResolverProc::CaptureList capture_list = proc_->GetCaptureList();
1800 ASSERT_EQ(4u, capture_list.size());
1801
1802 EXPECT_EQ("req0", capture_list[0].hostname);
1803 EXPECT_EQ("req2", capture_list[1].hostname);
Eric Orth00fe5a62018-08-15 22:20:001804 EXPECT_EQ("req6", capture_list[2].hostname);
1805 EXPECT_EQ("req3", capture_list[3].hostname);
Eric Orth70992982018-07-24 00:25:001806}
1807
[email protected]68ad3ee2010-01-30 03:45:391808// Test that when too many requests are enqueued, old ones start to be aborted.
Eric Orth960e7062019-03-08 18:43:541809TEST_F(HostResolverManagerTest, QueueOverflow) {
[email protected]38b50d92012-04-19 21:07:521810 CreateSerialResolver();
[email protected]68ad3ee2010-01-30 03:45:391811
[email protected]0f292de02012-02-01 22:28:201812 // Allow only 3 queued jobs.
1813 const size_t kMaxPendingJobs = 3u;
Eric Orth70992982018-07-24 00:25:001814 resolver_->SetMaxQueuedJobsForTesting(kMaxPendingJobs);
[email protected]68ad3ee2010-01-30 03:45:391815
Eric Orth00fe5a62018-08-15 22:20:001816 HostResolver::ResolveHostParameters lowest_priority;
1817 lowest_priority.initial_priority = LOWEST;
1818 HostResolver::ResolveHostParameters low_priority;
1819 low_priority.initial_priority = LOW;
1820 HostResolver::ResolveHostParameters medium_priority;
1821 medium_priority.initial_priority = MEDIUM;
1822 HostResolver::ResolveHostParameters highest_priority;
1823 highest_priority.initial_priority = HIGHEST;
1824
Eric Orth70992982018-07-24 00:25:001825 // Note that at this point the MockHostResolverProc is blocked, so any
1826 // requests we make will not complete.
1827
1828 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:151829 responses.emplace_back(
1830 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551831 HostPortPair("req0", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501832 lowest_priority, resolve_context_.get(),
1833 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151834 responses.emplace_back(
1835 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551836 HostPortPair("req1", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501837 highest_priority, resolve_context_.get(),
1838 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151839 responses.emplace_back(
1840 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551841 HostPortPair("req2", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501842 medium_priority, resolve_context_.get(),
1843 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:151844 responses.emplace_back(
1845 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551846 HostPortPair("req3", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501847 medium_priority, resolve_context_.get(),
1848 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:001849
1850 // At this point, there are 3 enqueued jobs (and one "running" job).
1851 // Insertion of subsequent requests will cause evictions.
1852
Eric Orth117e1992019-04-17 00:24:151853 responses.emplace_back(
1854 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551855 HostPortPair("req4", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501856 low_priority, resolve_context_.get(),
1857 resolve_context_->host_cache())));
Eric Orth00fe5a62018-08-15 22:20:001858 EXPECT_THAT(responses[4]->result_error(),
1859 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE)); // Evicts self.
1860 EXPECT_FALSE(responses[4]->request()->GetAddressResults());
Eric Orth70992982018-07-24 00:25:001861
Eric Orth117e1992019-04-17 00:24:151862 responses.emplace_back(
1863 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551864 HostPortPair("req5", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501865 medium_priority, resolve_context_.get(),
1866 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:001867 EXPECT_THAT(responses[2]->result_error(),
1868 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
1869 EXPECT_FALSE(responses[2]->request()->GetAddressResults());
1870
Eric Orth117e1992019-04-17 00:24:151871 responses.emplace_back(
1872 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551873 HostPortPair("req6", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501874 highest_priority, resolve_context_.get(),
1875 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:001876 EXPECT_THAT(responses[3]->result_error(),
1877 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
1878 EXPECT_FALSE(responses[3]->request()->GetAddressResults());
1879
Eric Orth117e1992019-04-17 00:24:151880 responses.emplace_back(
1881 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551882 HostPortPair("req7", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501883 medium_priority, resolve_context_.get(),
1884 resolve_context_->host_cache())));
Eric Orth00fe5a62018-08-15 22:20:001885 EXPECT_THAT(responses[5]->result_error(),
Eric Orth70992982018-07-24 00:25:001886 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
Eric Orth00fe5a62018-08-15 22:20:001887 EXPECT_FALSE(responses[5]->request()->GetAddressResults());
Eric Orth70992982018-07-24 00:25:001888
1889 // Unblock the resolver thread so the requests can run.
1890 proc_->SignalMultiple(4u);
1891
1892 // The rest should succeed.
1893 EXPECT_THAT(responses[0]->result_error(), IsOk());
1894 EXPECT_TRUE(responses[0]->request()->GetAddressResults());
Eric Orth00fe5a62018-08-15 22:20:001895 EXPECT_THAT(responses[1]->result_error(), IsOk());
1896 EXPECT_TRUE(responses[1]->request()->GetAddressResults());
Eric Orth70992982018-07-24 00:25:001897 EXPECT_THAT(responses[6]->result_error(), IsOk());
1898 EXPECT_TRUE(responses[6]->request()->GetAddressResults());
1899 EXPECT_THAT(responses[7]->result_error(), IsOk());
1900 EXPECT_TRUE(responses[7]->request()->GetAddressResults());
1901
1902 // Verify that they called out the the resolver proc (which runs on the
1903 // resolver thread) in the expected order.
1904 MockHostResolverProc::CaptureList capture_list = proc_->GetCaptureList();
1905 ASSERT_EQ(4u, capture_list.size());
1906
1907 EXPECT_EQ("req0", capture_list[0].hostname);
Eric Orth00fe5a62018-08-15 22:20:001908 EXPECT_EQ("req1", capture_list[1].hostname);
Eric Orth70992982018-07-24 00:25:001909 EXPECT_EQ("req6", capture_list[2].hostname);
1910 EXPECT_EQ("req7", capture_list[3].hostname);
1911
1912 // Verify that the evicted (incomplete) requests were not cached.
Eric Orthaf82b49a2020-02-01 01:48:501913 EXPECT_EQ(4u, resolve_context_->host_cache()->size());
Eric Orth70992982018-07-24 00:25:001914
1915 for (size_t i = 0; i < responses.size(); ++i) {
1916 EXPECT_TRUE(responses[i]->complete()) << i;
1917 }
1918}
1919
1920// Tests that jobs can self-evict by setting the max queue to 0.
Eric Orth960e7062019-03-08 18:43:541921TEST_F(HostResolverManagerTest, QueueOverflow_SelfEvict) {
Eric Orth70992982018-07-24 00:25:001922 CreateSerialResolver();
1923 resolver_->SetMaxQueuedJobsForTesting(0);
1924
1925 // Note that at this point the MockHostResolverProc is blocked, so any
1926 // requests we make will not complete.
1927
Eric Orth117e1992019-04-17 00:24:151928 ResolveHostResponseHelper run_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551929 HostPortPair("run", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501930 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:001931
Eric Orth117e1992019-04-17 00:24:151932 ResolveHostResponseHelper evict_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551933 HostPortPair("req1", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501934 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:001935 EXPECT_THAT(evict_response.result_error(),
1936 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
1937 EXPECT_FALSE(evict_response.request()->GetAddressResults());
1938
1939 proc_->SignalMultiple(1u);
1940
1941 EXPECT_THAT(run_response.result_error(), IsOk());
1942 EXPECT_TRUE(run_response.request()->GetAddressResults());
1943}
1944
Eric Orth00fe5a62018-08-15 22:20:001945// Make sure that the dns query type parameter is respected when raw IPs are
1946// passed in.
Eric Orth960e7062019-03-08 18:43:541947TEST_F(HostResolverManagerTest, AddressFamilyWithRawIPs) {
Eric Orth00fe5a62018-08-15 22:20:001948 HostResolver::ResolveHostParameters v4_parameters;
Eric Orth192e3bb2018-11-14 19:30:321949 v4_parameters.dns_query_type = DnsQueryType::A;
Eric Orth00fe5a62018-08-15 22:20:001950
1951 HostResolver::ResolveHostParameters v6_parameters;
Eric Orth192e3bb2018-11-14 19:30:321952 v6_parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth00fe5a62018-08-15 22:20:001953
1954 ResolveHostResponseHelper v4_v4_request(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551955 HostPortPair("127.0.0.1", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501956 v4_parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth00fe5a62018-08-15 22:20:001957 EXPECT_THAT(v4_v4_request.result_error(), IsOk());
1958 EXPECT_THAT(v4_v4_request.request()->GetAddressResults().value().endpoints(),
1959 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
1960
1961 ResolveHostResponseHelper v4_v6_request(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551962 HostPortPair("127.0.0.1", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501963 v6_parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth00fe5a62018-08-15 22:20:001964 EXPECT_THAT(v4_v6_request.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
1965
1966 ResolveHostResponseHelper v4_unsp_request(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551967 HostPortPair("127.0.0.1", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501968 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth00fe5a62018-08-15 22:20:001969 EXPECT_THAT(v4_unsp_request.result_error(), IsOk());
1970 EXPECT_THAT(
1971 v4_unsp_request.request()->GetAddressResults().value().endpoints(),
1972 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
1973
Eric Orth117e1992019-04-17 00:24:151974 ResolveHostResponseHelper v6_v4_request(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551975 HostPortPair("::1", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501976 v4_parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth00fe5a62018-08-15 22:20:001977 EXPECT_THAT(v6_v4_request.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
1978
Eric Orth117e1992019-04-17 00:24:151979 ResolveHostResponseHelper v6_v6_request(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551980 HostPortPair("::1", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501981 v6_parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth00fe5a62018-08-15 22:20:001982 EXPECT_THAT(v6_v6_request.result_error(), IsOk());
1983 EXPECT_THAT(v6_v6_request.request()->GetAddressResults().value().endpoints(),
1984 testing::ElementsAre(CreateExpected("::1", 80)));
1985
Eric Orth117e1992019-04-17 00:24:151986 ResolveHostResponseHelper v6_unsp_request(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551987 HostPortPair("::1", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:501988 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth00fe5a62018-08-15 22:20:001989 EXPECT_THAT(v6_unsp_request.result_error(), IsOk());
1990 EXPECT_THAT(
1991 v6_unsp_request.request()->GetAddressResults().value().endpoints(),
1992 testing::ElementsAre(CreateExpected("::1", 80)));
1993}
1994
Eric Orth960e7062019-03-08 18:43:541995TEST_F(HostResolverManagerTest, LocalOnly_FromCache) {
Eric Ortheb332862019-01-26 00:52:381996 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42");
1997 proc_->SignalMultiple(1u); // Need only one.
1998
1999 HostResolver::ResolveHostParameters source_none_parameters;
2000 source_none_parameters.source = HostResolverSource::LOCAL_ONLY;
2001
2002 // First NONE query expected to complete synchronously with a cache miss.
Eric Orth6f1c5172019-04-16 17:08:272003 ResolveHostResponseHelper cache_miss_request(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552004 HostPortPair("just.testing", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:242005 NetLogWithSource(), source_none_parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502006 resolve_context_->host_cache()));
Eric Ortheb332862019-01-26 00:52:382007 EXPECT_TRUE(cache_miss_request.complete());
2008 EXPECT_THAT(cache_miss_request.result_error(), IsError(ERR_DNS_CACHE_MISS));
2009 EXPECT_FALSE(cache_miss_request.request()->GetAddressResults());
2010 EXPECT_FALSE(cache_miss_request.request()->GetStaleInfo());
2011
2012 // Normal query to populate the cache.
2013 ResolveHostResponseHelper normal_request(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552014 HostPortPair("just.testing", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:242015 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502016 resolve_context_->host_cache()));
Eric Ortheb332862019-01-26 00:52:382017 EXPECT_THAT(normal_request.result_error(), IsOk());
2018 EXPECT_FALSE(normal_request.request()->GetStaleInfo());
2019
2020 // Second NONE query expected to complete synchronously with cache hit.
Eric Orth6f1c5172019-04-16 17:08:272021 ResolveHostResponseHelper cache_hit_request(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552022 HostPortPair("just.testing", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:242023 NetLogWithSource(), source_none_parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502024 resolve_context_->host_cache()));
Eric Ortheb332862019-01-26 00:52:382025 EXPECT_TRUE(cache_hit_request.complete());
2026 EXPECT_THAT(cache_hit_request.result_error(), IsOk());
2027 EXPECT_THAT(
2028 cache_hit_request.request()->GetAddressResults().value().endpoints(),
2029 testing::ElementsAre(CreateExpected("192.168.1.42", 80)));
2030 EXPECT_FALSE(cache_hit_request.request()->GetStaleInfo().value().is_stale());
2031}
2032
Eric Orth960e7062019-03-08 18:43:542033TEST_F(HostResolverManagerTest, LocalOnly_StaleEntry) {
Eric Ortheb332862019-01-26 00:52:382034 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42");
2035 proc_->SignalMultiple(1u); // Need only one.
2036
2037 HostResolver::ResolveHostParameters source_none_parameters;
2038 source_none_parameters.source = HostResolverSource::LOCAL_ONLY;
2039
2040 // First NONE query expected to complete synchronously with a cache miss.
Eric Orth6f1c5172019-04-16 17:08:272041 ResolveHostResponseHelper cache_miss_request(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552042 HostPortPair("just.testing", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:242043 NetLogWithSource(), source_none_parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502044 resolve_context_->host_cache()));
Eric Ortheb332862019-01-26 00:52:382045 EXPECT_TRUE(cache_miss_request.complete());
2046 EXPECT_THAT(cache_miss_request.result_error(), IsError(ERR_DNS_CACHE_MISS));
2047 EXPECT_FALSE(cache_miss_request.request()->GetAddressResults());
2048 EXPECT_FALSE(cache_miss_request.request()->GetStaleInfo());
2049
2050 // Normal query to populate the cache.
2051 ResolveHostResponseHelper normal_request(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552052 HostPortPair("just.testing", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:242053 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502054 resolve_context_->host_cache()));
Eric Ortheb332862019-01-26 00:52:382055 EXPECT_THAT(normal_request.result_error(), IsOk());
2056 EXPECT_FALSE(normal_request.request()->GetStaleInfo());
2057
2058 MakeCacheStale();
2059
2060 // Second NONE query still expected to complete synchronously with cache miss.
Eric Orth6f1c5172019-04-16 17:08:272061 ResolveHostResponseHelper stale_request(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552062 HostPortPair("just.testing", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:242063 NetLogWithSource(), source_none_parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502064 resolve_context_->host_cache()));
Eric Ortheb332862019-01-26 00:52:382065 EXPECT_TRUE(stale_request.complete());
2066 EXPECT_THAT(stale_request.result_error(), IsError(ERR_DNS_CACHE_MISS));
2067 EXPECT_FALSE(stale_request.request()->GetAddressResults());
2068 EXPECT_FALSE(stale_request.request()->GetStaleInfo());
2069}
2070
Eric Orth960e7062019-03-08 18:43:542071TEST_F(HostResolverManagerTest, LocalOnly_FromIp) {
Eric Ortheb332862019-01-26 00:52:382072 HostResolver::ResolveHostParameters source_none_parameters;
2073 source_none_parameters.source = HostResolverSource::LOCAL_ONLY;
2074
Eric Orth117e1992019-04-17 00:24:152075 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552076 HostPortPair("1.2.3.4", 56), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:502077 source_none_parameters, resolve_context_.get(),
2078 resolve_context_->host_cache()));
Eric Ortheb332862019-01-26 00:52:382079
2080 // Expected to resolve synchronously.
2081 EXPECT_TRUE(response.complete());
2082 EXPECT_THAT(response.result_error(), IsOk());
2083 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
2084 testing::ElementsAre(CreateExpected("1.2.3.4", 56)));
2085 EXPECT_FALSE(response.request()->GetStaleInfo());
2086}
2087
Eric Orth960e7062019-03-08 18:43:542088TEST_F(HostResolverManagerTest, LocalOnly_InvalidName) {
Eric Ortheb332862019-01-26 00:52:382089 proc_->AddRuleForAllFamilies("foo,bar.com", "192.168.1.42");
2090
2091 HostResolver::ResolveHostParameters source_none_parameters;
2092 source_none_parameters.source = HostResolverSource::LOCAL_ONLY;
2093
Eric Orth6f1c5172019-04-16 17:08:272094 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552095 HostPortPair("foo,bar.com", 57), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:242096 NetLogWithSource(), source_none_parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502097 resolve_context_->host_cache()));
Eric Ortheb332862019-01-26 00:52:382098
2099 // Expected to fail synchronously.
2100 EXPECT_TRUE(response.complete());
2101 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
2102 EXPECT_FALSE(response.request()->GetAddressResults());
2103 EXPECT_FALSE(response.request()->GetStaleInfo());
2104}
2105
Eric Orth960e7062019-03-08 18:43:542106TEST_F(HostResolverManagerTest, LocalOnly_InvalidLocalhost) {
Eric Ortheb332862019-01-26 00:52:382107 HostResolver::ResolveHostParameters source_none_parameters;
2108 source_none_parameters.source = HostResolverSource::LOCAL_ONLY;
2109
Eric Orth6f1c5172019-04-16 17:08:272110 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552111 HostPortPair("foo,bar.localhost", 58), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:242112 NetLogWithSource(), source_none_parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502113 resolve_context_->host_cache()));
Eric Ortheb332862019-01-26 00:52:382114
2115 // Expected to fail synchronously.
2116 EXPECT_TRUE(response.complete());
2117 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
2118 EXPECT_FALSE(response.request()->GetAddressResults());
2119 EXPECT_FALSE(response.request()->GetStaleInfo());
2120}
2121
Eric Orth960e7062019-03-08 18:43:542122TEST_F(HostResolverManagerTest, StaleAllowed) {
Eric Ortheb332862019-01-26 00:52:382123 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42");
2124 proc_->SignalMultiple(1u); // Need only one.
2125
2126 HostResolver::ResolveHostParameters stale_allowed_parameters;
2127 stale_allowed_parameters.source = HostResolverSource::LOCAL_ONLY;
2128 stale_allowed_parameters.cache_usage =
2129 HostResolver::ResolveHostParameters::CacheUsage::STALE_ALLOWED;
2130
2131 // First query expected to complete synchronously as a cache miss.
Eric Orth6f1c5172019-04-16 17:08:272132 ResolveHostResponseHelper cache_miss_request(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552133 HostPortPair("just.testing", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:242134 NetLogWithSource(), stale_allowed_parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502135 resolve_context_->host_cache()));
Eric Ortheb332862019-01-26 00:52:382136 EXPECT_TRUE(cache_miss_request.complete());
2137 EXPECT_THAT(cache_miss_request.result_error(), IsError(ERR_DNS_CACHE_MISS));
2138 EXPECT_FALSE(cache_miss_request.request()->GetAddressResults());
2139 EXPECT_FALSE(cache_miss_request.request()->GetStaleInfo());
2140
2141 // Normal query to populate cache
2142 ResolveHostResponseHelper normal_request(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552143 HostPortPair("just.testing", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:242144 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502145 resolve_context_->host_cache()));
Eric Ortheb332862019-01-26 00:52:382146 EXPECT_THAT(normal_request.result_error(), IsOk());
2147 EXPECT_FALSE(normal_request.request()->GetStaleInfo());
2148
2149 MakeCacheStale();
2150
2151 // Second NONE query expected to get a stale cache hit.
Eric Orth6f1c5172019-04-16 17:08:272152 ResolveHostResponseHelper stale_request(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552153 HostPortPair("just.testing", 84), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:242154 NetLogWithSource(), stale_allowed_parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502155 resolve_context_->host_cache()));
Eric Ortheb332862019-01-26 00:52:382156 EXPECT_TRUE(stale_request.complete());
2157 EXPECT_THAT(stale_request.result_error(), IsOk());
2158 EXPECT_THAT(stale_request.request()->GetAddressResults().value().endpoints(),
2159 testing::ElementsAre(CreateExpected("192.168.1.42", 84)));
2160 EXPECT_TRUE(stale_request.request()->GetStaleInfo().value().is_stale());
2161}
2162
Eric Orth960e7062019-03-08 18:43:542163TEST_F(HostResolverManagerTest, StaleAllowed_NonLocal) {
Eric Ortheb332862019-01-26 00:52:382164 proc_->AddRuleForAllFamilies("just.testing", "192.168.2.42");
2165 proc_->SignalMultiple(1u); // Need only one.
2166
2167 HostResolver::ResolveHostParameters stale_allowed_parameters;
2168 stale_allowed_parameters.cache_usage =
2169 HostResolver::ResolveHostParameters::CacheUsage::STALE_ALLOWED;
2170
2171 // Normal non-local resolves should still work normally with the STALE_ALLOWED
2172 // parameter, and there should be no stale info.
Eric Orth6f1c5172019-04-16 17:08:272173 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552174 HostPortPair("just.testing", 85), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:242175 NetLogWithSource(), stale_allowed_parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502176 resolve_context_->host_cache()));
Eric Ortheb332862019-01-26 00:52:382177 EXPECT_THAT(response.result_error(), IsOk());
2178 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
2179 testing::ElementsAre(CreateExpected("192.168.2.42", 85)));
2180 EXPECT_FALSE(response.request()->GetStaleInfo());
2181}
2182
Eric Orth960e7062019-03-08 18:43:542183TEST_F(HostResolverManagerTest, StaleAllowed_FromIp) {
Eric Ortheb332862019-01-26 00:52:382184 HostResolver::ResolveHostParameters stale_allowed_parameters;
2185 stale_allowed_parameters.cache_usage =
2186 HostResolver::ResolveHostParameters::CacheUsage::STALE_ALLOWED;
2187
Eric Orth6f1c5172019-04-16 17:08:272188 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552189 HostPortPair("1.2.3.4", 57), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:502190 stale_allowed_parameters, resolve_context_.get(),
2191 resolve_context_->host_cache()));
Eric Ortheb332862019-01-26 00:52:382192
2193 // Expected to resolve synchronously without stale info.
2194 EXPECT_TRUE(response.complete());
2195 EXPECT_THAT(response.result_error(), IsOk());
2196 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
2197 testing::ElementsAre(CreateExpected("1.2.3.4", 57)));
2198 EXPECT_FALSE(response.request()->GetStaleInfo());
2199}
2200
Miriam Gershensone3bc63022017-10-09 19:57:052201// TODO(mgersh): add a test case for errors with positive TTL after
2202// https://crbug.com/115051 is fixed.
2203
[email protected]189163e2011-05-11 01:48:542204// Test the retry attempts simulating host resolver proc that takes too long.
Eric Orth960e7062019-03-08 18:43:542205TEST_F(HostResolverManagerTest, MultipleAttempts) {
[email protected]189163e2011-05-11 01:48:542206 // Total number of attempts would be 3 and we want the 3rd attempt to resolve
Eric Orth9a037562018-07-03 21:24:382207 // the host. First and second attempt will be forced to wait until they get
[email protected]189163e2011-05-11 01:48:542208 // word that a resolution has completed. The 3rd resolution attempt will try
Eric Orth9a037562018-07-03 21:24:382209 // to get done ASAP, and won't wait.
[email protected]189163e2011-05-11 01:48:542210 int kAttemptNumberToResolve = 3;
2211 int kTotalAttempts = 3;
2212
Eric Orth9a037562018-07-03 21:24:382213 // Add a little bit of extra fudge to the delay to allow reasonable
2214 // flexibility for time > vs >= etc. We don't need to fail the test if we
2215 // retry at t=6001 instead of t=6000.
2216 base::TimeDelta kSleepFudgeFactor = base::TimeDelta::FromMilliseconds(1);
2217
[email protected]189163e2011-05-11 01:48:542218 scoped_refptr<LookupAttemptHostResolverProc> resolver_proc(
Raul Tambre94493c652019-03-11 17:18:352219 new LookupAttemptHostResolverProc(nullptr, kAttemptNumberToResolve,
Eric Orth70992982018-07-24 00:25:002220 kTotalAttempts));
2221
Eric Orth59066222019-03-07 23:52:272222 ProcTaskParams params = DefaultParams(resolver_proc.get());
Eric Orth70992982018-07-24 00:25:002223 base::TimeDelta unresponsive_delay = params.unresponsive_delay;
2224 int retry_factor = params.retry_factor;
2225
Eric Orth607b6d82019-05-08 16:43:322226 CreateResolverWithLimitsAndParams(kMaxJobs, params, true /* ipv6_reachable */,
2227 true /* check_ipv6_on_wifi */);
Eric Orth70992982018-07-24 00:25:002228
2229 // Override the current thread task runner, so we can simulate the passage of
2230 // time and avoid any actual sleeps.
2231 auto test_task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
2232 base::ScopedClosureRunner task_runner_override_scoped_cleanup =
2233 base::ThreadTaskRunnerHandle::OverrideForTesting(test_task_runner);
2234
2235 // Resolve "host1".
Eric Orth117e1992019-04-17 00:24:152236 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552237 HostPortPair("host1", 70), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:502238 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:002239 EXPECT_FALSE(response.complete());
2240
2241 resolver_proc->WaitForNAttemptsToBeBlocked(1);
2242 EXPECT_FALSE(response.complete());
2243
2244 test_task_runner->FastForwardBy(unresponsive_delay + kSleepFudgeFactor);
2245 resolver_proc->WaitForNAttemptsToBeBlocked(2);
2246 EXPECT_FALSE(response.complete());
2247
2248 test_task_runner->FastForwardBy(unresponsive_delay * retry_factor +
2249 kSleepFudgeFactor);
2250
2251 resolver_proc->WaitForAllAttemptsToFinish();
2252 test_task_runner->RunUntilIdle();
2253
2254 // Resolve returns -4 to indicate that 3rd attempt has resolved the host.
2255 // Since we're using a TestMockTimeTaskRunner, the RunLoop stuff in
2256 // result_error() will fail if it actually has to wait, but unless there's an
2257 // error, the result should be immediately ready by this point.
2258 EXPECT_EQ(-4, response.result_error());
2259
2260 // We should be done with retries, but make sure none erroneously happen.
2261 test_task_runner->FastForwardUntilNoTasksRemain();
2262
Eric Roman21b39232019-06-28 21:28:212263 EXPECT_EQ(resolver_proc->GetTotalAttemptsResolved(), kTotalAttempts);
2264}
2265
2266// Regression test for https://crbug.com/976948.
2267//
2268// Tests that when the maximum number of retries is set to
2269// |HostResolver::ManagerOptions::kDefaultRetryAttempts| the
2270// number of retries used is 4 rather than something higher.
2271TEST_F(HostResolverManagerTest, DefaultMaxRetryAttempts) {
2272 auto test_task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
2273 base::ScopedClosureRunner task_runner_override_scoped_cleanup =
2274 base::ThreadTaskRunnerHandle::OverrideForTesting(test_task_runner);
2275
2276 // Instantiate a ResolverProc that will block all incoming requests.
2277 auto resolver_proc = base::MakeRefCounted<LookupAttemptHostResolverProc>(
2278 nullptr, std::numeric_limits<size_t>::max(),
2279 std::numeric_limits<size_t>::max());
2280
2281 // This corresponds to kDefaultMaxRetryAttempts in
2282 // ProcTaskParams::ProcTaskParams(). The correspondence is verified below,
2283 // since that symbol is not exported.
2284 const size_t expected_max_retries = 4;
2285
2286 // Use the special value |ManagerOptions::kDefaultRetryAttempts|, which is
2287 // expected to translate into |expected_num_retries|.
2288 ASSERT_NE(HostResolver::ManagerOptions::kDefaultRetryAttempts,
2289 expected_max_retries);
2290 ProcTaskParams params(resolver_proc.get(),
2291 HostResolver::ManagerOptions::kDefaultRetryAttempts);
2292 ASSERT_EQ(params.max_retry_attempts, expected_max_retries);
2293
2294 CreateResolverWithLimitsAndParams(kMaxJobs, params,
2295 false /* ipv6_reachable */,
2296 false /* check_ipv6_on_wifi */);
2297
2298 // Resolve "host1". The resolver proc will hang all requests so this
2299 // resolution should remain stalled until calling SetResolvedAttemptNumber().
2300 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552301 HostPortPair("host1", 70), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:502302 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Roman21b39232019-06-28 21:28:212303 EXPECT_FALSE(response.complete());
2304
2305 // Simulate running the main thread (network task runner) for a long
2306 // time. Because none of the attempts posted to worker pool can complete, this
2307 // should cause all of the retry attempts to get posted, according to the
2308 // exponential backoff schedule.
2309 test_task_runner->FastForwardBy(base::TimeDelta::FromMinutes(20));
2310
2311 // Unblock the resolver proc, then wait for all the worker pool and main
2312 // thread tasks to complete. Note that the call to SetResolvedAttemptNumber(1)
2313 // will cause all the blocked resolver procs tasks fail with -2.
2314 resolver_proc->SetResolvedAttemptNumber(1);
2315 const int kExpectedError = -2;
2316 base::ThreadPoolInstance::Get()->FlushForTesting();
2317 test_task_runner->RunUntilIdle();
2318
2319 ASSERT_TRUE(response.complete());
2320 EXPECT_EQ(kExpectedError, response.result_error());
2321
2322 // Ensure that the original attempt was executed on the worker pool, as well
2323 // as the maximum number of allowed retries, and no more.
2324 EXPECT_EQ(static_cast<int>(expected_max_retries + 1),
2325 resolver_proc->GetTotalAttemptsResolved());
Eric Orth70992982018-07-24 00:25:002326}
2327
eroman91dd3602015-03-26 03:46:332328// If a host resolves to a list that includes 127.0.53.53, this is treated as
2329// an error. 127.0.53.53 is a localhost address, however it has been given a
eroman1efc237c2016-12-14 00:00:452330// special significance by ICANN to help surface name collision resulting from
eroman91dd3602015-03-26 03:46:332331// the new gTLDs.
Eric Orth960e7062019-03-08 18:43:542332TEST_F(HostResolverManagerTest, NameCollisionIcann) {
eroman91dd3602015-03-26 03:46:332333 proc_->AddRuleForAllFamilies("single", "127.0.53.53");
2334 proc_->AddRuleForAllFamilies("multiple", "127.0.0.1,127.0.53.53");
2335 proc_->AddRuleForAllFamilies("ipv6", "::127.0.53.53");
2336 proc_->AddRuleForAllFamilies("not_reserved1", "53.53.0.127");
2337 proc_->AddRuleForAllFamilies("not_reserved2", "127.0.53.54");
2338 proc_->AddRuleForAllFamilies("not_reserved3", "10.0.53.53");
2339 proc_->SignalMultiple(6u);
2340
Eric Orth117e1992019-04-17 00:24:152341 ResolveHostResponseHelper single_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552342 HostPortPair("single", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:502343 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:002344 EXPECT_THAT(single_response.result_error(),
2345 IsError(ERR_ICANN_NAME_COLLISION));
2346 EXPECT_FALSE(single_response.request()->GetAddressResults());
2347
2348 // ERR_ICANN_NAME_COLLISION is cached like any other error, using a fixed TTL
2349 // for failed entries from proc-based resolver. That said, the fixed TTL is 0,
2350 // so it should never be cached.
dalyk48b20a992019-02-25 16:10:262351 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result =
Matt Menke7b4a32f2019-10-25 22:13:462352 GetCacheHit(HostCache::Key(
2353 "single", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
2354 HostResolverSource::ANY, NetworkIsolationKey()));
dalyk48b20a992019-02-25 16:10:262355 EXPECT_FALSE(cache_result);
Eric Orth70992982018-07-24 00:25:002356
Eric Orth117e1992019-04-17 00:24:152357 ResolveHostResponseHelper multiple_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552358 HostPortPair("multiple", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:502359 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:002360 EXPECT_THAT(multiple_response.result_error(),
2361 IsError(ERR_ICANN_NAME_COLLISION));
2362
2363 // Resolving an IP literal of 127.0.53.53 however is allowed.
2364 ResolveHostResponseHelper literal_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552365 HostPortPair("127.0.53.53", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:242366 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502367 resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:002368 EXPECT_THAT(literal_response.result_error(), IsOk());
2369
2370 // Moreover the address should not be recognized when embedded in an IPv6
2371 // address.
2372 ResolveHostResponseHelper ipv6_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552373 HostPortPair("127.0.53.53", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:242374 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502375 resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:002376 EXPECT_THAT(ipv6_response.result_error(), IsOk());
2377
2378 // Try some other IPs which are similar, but NOT an exact match on
2379 // 127.0.53.53.
2380 ResolveHostResponseHelper similar_response1(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552381 HostPortPair("not_reserved1", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:242382 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502383 resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:002384 EXPECT_THAT(similar_response1.result_error(), IsOk());
2385
2386 ResolveHostResponseHelper similar_response2(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552387 HostPortPair("not_reserved2", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:242388 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502389 resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:002390 EXPECT_THAT(similar_response2.result_error(), IsOk());
2391
2392 ResolveHostResponseHelper similar_response3(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552393 HostPortPair("not_reserved3", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:242394 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502395 resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:002396 EXPECT_THAT(similar_response3.result_error(), IsOk());
2397}
2398
Eric Orth960e7062019-03-08 18:43:542399TEST_F(HostResolverManagerTest, IsIPv6Reachable) {
2400 // The real HostResolverManager is needed since TestHostResolverManager will
cbentzel1906f872015-06-05 16:25:252401 // bypass the IPv6 reachability tests.
Eric Orth37b18192019-04-22 19:09:282402 DestroyResolver();
Eric Orthfe6d5482019-09-03 18:27:572403 resolver_ = std::make_unique<HostResolverManager>(
2404 DefaultOptions(), nullptr /* system_dns_config_notifier */,
2405 nullptr /* net_log */);
cbentzel1906f872015-06-05 16:25:252406
sergeyub8cdc212015-05-14 18:50:372407 // Verify that two consecutive calls return the same value.
Matt Muellerd9342e3a2019-11-26 01:41:142408 RecordingTestNetLog test_net_log;
tfarina42834112016-09-22 13:38:202409 NetLogWithSource net_log =
2410 NetLogWithSource::Make(&test_net_log, NetLogSourceType::NONE);
2411 bool result1 = IsIPv6Reachable(net_log);
2412 bool result2 = IsIPv6Reachable(net_log);
sergeyub8cdc212015-05-14 18:50:372413 EXPECT_EQ(result1, result2);
2414
2415 // Filter reachability check events and verify that there are two of them.
Eric Roman79cc7552019-07-19 02:17:542416 auto probe_event_list = test_net_log.GetEntriesWithType(
2417 NetLogEventType::HOST_RESOLVER_IMPL_IPV6_REACHABILITY_CHECK);
sergeyub8cdc212015-05-14 18:50:372418 ASSERT_EQ(2U, probe_event_list.size());
2419
2420 // Verify that the first request was not cached and the second one was.
Eric Roman79cc7552019-07-19 02:17:542421 EXPECT_FALSE(GetBooleanValueFromParams(probe_event_list[0], "cached"));
2422 EXPECT_TRUE(GetBooleanValueFromParams(probe_event_list[1], "cached"));
sergeyub8cdc212015-05-14 18:50:372423}
2424
Eric Orth960e7062019-03-08 18:43:542425TEST_F(HostResolverManagerTest, IncludeCanonicalName) {
Eric Orth322af3e42018-08-20 18:12:592426 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42",
2427 HOST_RESOLVER_CANONNAME, "canon.name");
2428 proc_->SignalMultiple(2u);
2429
2430 HostResolver::ResolveHostParameters parameters;
2431 parameters.include_canonical_name = true;
2432 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552433 HostPortPair("just.testing", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:242434 NetLogWithSource(), parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502435 resolve_context_->host_cache()));
Eric Orth322af3e42018-08-20 18:12:592436 ResolveHostResponseHelper response_no_flag(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552437 HostPortPair("just.testing", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:242438 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502439 resolve_context_->host_cache()));
Eric Orth322af3e42018-08-20 18:12:592440
2441 EXPECT_THAT(response.result_error(), IsOk());
2442 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
2443 testing::ElementsAre(CreateExpected("192.168.1.42", 80)));
2444 EXPECT_EQ("canon.name",
2445 response.request()->GetAddressResults().value().canonical_name());
2446
2447 EXPECT_THAT(response_no_flag.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
2448}
2449
Eric Orth960e7062019-03-08 18:43:542450TEST_F(HostResolverManagerTest, LoopbackOnly) {
Eric Orth322af3e42018-08-20 18:12:592451 proc_->AddRuleForAllFamilies("otherlocal", "127.0.0.1",
2452 HOST_RESOLVER_LOOPBACK_ONLY);
2453 proc_->SignalMultiple(2u);
2454
2455 HostResolver::ResolveHostParameters parameters;
2456 parameters.loopback_only = true;
2457 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552458 HostPortPair("otherlocal", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:502459 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth322af3e42018-08-20 18:12:592460 ResolveHostResponseHelper response_no_flag(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552461 HostPortPair("otherlocal", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:502462 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth322af3e42018-08-20 18:12:592463
2464 EXPECT_THAT(response.result_error(), IsOk());
2465 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
2466 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
2467
2468 EXPECT_THAT(response_no_flag.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
2469}
2470
Eric Orth960e7062019-03-08 18:43:542471TEST_F(HostResolverManagerTest, IsSpeculative) {
Eric Orthb30bc172018-08-17 21:09:572472 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42");
2473 proc_->SignalMultiple(1u);
2474
2475 HostResolver::ResolveHostParameters parameters;
2476 parameters.is_speculative = true;
2477
2478 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552479 HostPortPair("just.testing", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:242480 NetLogWithSource(), parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502481 resolve_context_->host_cache()));
Eric Orthb30bc172018-08-17 21:09:572482
2483 EXPECT_THAT(response.result_error(), IsOk());
2484 EXPECT_FALSE(response.request()->GetAddressResults());
2485
2486 ASSERT_EQ(1u, proc_->GetCaptureList().size());
2487 EXPECT_EQ("just.testing", proc_->GetCaptureList()[0].hostname);
2488
2489 // Reresolve without the |is_speculative| flag should immediately return from
2490 // cache.
2491 ResolveHostResponseHelper response2(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552492 HostPortPair("just.testing", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:242493 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502494 resolve_context_->host_cache()));
Eric Orthb30bc172018-08-17 21:09:572495
2496 EXPECT_THAT(response2.result_error(), IsOk());
2497 EXPECT_THAT(response2.request()->GetAddressResults().value().endpoints(),
2498 testing::ElementsAre(CreateExpected("192.168.1.42", 80)));
2499
2500 EXPECT_EQ("just.testing", proc_->GetCaptureList()[0].hostname);
2501 EXPECT_EQ(1u, proc_->GetCaptureList().size()); // No increase.
2502}
2503
Eric Orth9871aafa2018-10-02 19:59:182504#if BUILDFLAG(ENABLE_MDNS)
2505const uint8_t kMdnsResponseA[] = {
2506 // Header
2507 0x00, 0x00, // ID is zeroed out
2508 0x81, 0x80, // Standard query response, RA, no error
2509 0x00, 0x00, // No questions (for simplicity)
2510 0x00, 0x01, // 1 RR (answers)
2511 0x00, 0x00, // 0 authority RRs
2512 0x00, 0x00, // 0 additional RRs
2513
2514 // "myhello.local."
2515 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2516 0x00,
2517
2518 0x00, 0x01, // TYPE is A.
2519 0x00, 0x01, // CLASS is IN.
2520 0x00, 0x00, 0x00, 0x10, // TTL is 16 (seconds)
2521 0x00, 0x04, // RDLENGTH is 4 bytes.
2522 0x01, 0x02, 0x03, 0x04, // 1.2.3.4
2523};
2524
Eric Orth026776a2019-01-18 00:13:282525const uint8_t kMdnsResponseA2[] = {
2526 // Header
2527 0x00, 0x00, // ID is zeroed out
2528 0x81, 0x80, // Standard query response, RA, no error
2529 0x00, 0x00, // No questions (for simplicity)
2530 0x00, 0x01, // 1 RR (answers)
2531 0x00, 0x00, // 0 authority RRs
2532 0x00, 0x00, // 0 additional RRs
2533
2534 // "myhello.local."
2535 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2536 0x00,
2537
2538 0x00, 0x01, // TYPE is A.
2539 0x00, 0x01, // CLASS is IN.
2540 0x00, 0x00, 0x00, 0x10, // TTL is 16 (seconds)
2541 0x00, 0x04, // RDLENGTH is 4 bytes.
2542 0x05, 0x06, 0x07, 0x08, // 5.6.7.8
2543};
2544
2545const uint8_t kMdnsResponseA2Goodbye[] = {
2546 // Header
2547 0x00, 0x00, // ID is zeroed out
2548 0x81, 0x80, // Standard query response, RA, no error
2549 0x00, 0x00, // No questions (for simplicity)
2550 0x00, 0x01, // 1 RR (answers)
2551 0x00, 0x00, // 0 authority RRs
2552 0x00, 0x00, // 0 additional RRs
2553
2554 // "myhello.local."
2555 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2556 0x00,
2557
2558 0x00, 0x01, // TYPE is A.
2559 0x00, 0x01, // CLASS is IN.
2560 0x00, 0x00, 0x00, 0x00, // TTL is 0 (signaling "goodbye" removal of result)
2561 0x00, 0x04, // RDLENGTH is 4 bytes.
2562 0x05, 0x06, 0x07, 0x08, // 5.6.7.8
2563};
2564
Eric Orth9871aafa2018-10-02 19:59:182565const uint8_t kMdnsResponseAAAA[] = {
2566 // Header
2567 0x00, 0x00, // ID is zeroed out
2568 0x81, 0x80, // Standard query response, RA, no error
2569 0x00, 0x00, // No questions (for simplicity)
2570 0x00, 0x01, // 1 RR (answers)
2571 0x00, 0x00, // 0 authority RRs
2572 0x00, 0x00, // 0 additional RRs
2573
2574 // "myhello.local."
2575 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2576 0x00,
2577
2578 0x00, 0x1C, // TYPE is AAAA.
2579 0x00, 0x01, // CLASS is IN.
2580 0x00, 0x00, 0x00, 0x10, // TTL is 16 (seconds)
2581 0x00, 0x10, // RDLENGTH is 16 bytes.
2582
2583 // 000a:0000:0000:0000:0001:0002:0003:0004
2584 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02,
Eric Orth960e7062019-03-08 18:43:542585 0x00, 0x03, 0x00, 0x04};
Eric Orth9871aafa2018-10-02 19:59:182586
2587// An MDNS response indicating that the responder owns the hostname, but the
2588// specific requested type (AAAA) does not exist because the responder only has
2589// A addresses.
2590const uint8_t kMdnsResponseNsec[] = {
2591 // Header
2592 0x00, 0x00, // ID is zeroed out
2593 0x81, 0x80, // Standard query response, RA, no error
2594 0x00, 0x00, // No questions (for simplicity)
2595 0x00, 0x01, // 1 RR (answers)
2596 0x00, 0x00, // 0 authority RRs
2597 0x00, 0x00, // 0 additional RRs
2598
2599 // "myhello.local."
2600 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2601 0x00,
2602
2603 0x00, 0x2f, // TYPE is NSEC.
2604 0x00, 0x01, // CLASS is IN.
2605 0x00, 0x00, 0x00, 0x10, // TTL is 16 (seconds)
2606 0x00, 0x06, // RDLENGTH is 6 bytes.
2607 0xc0, 0x0c, // Next Domain Name (always pointer back to name in MDNS)
2608 0x00, // Bitmap block number (always 0 in MDNS)
2609 0x02, // Bitmap length is 2
2610 0x00, 0x08 // A type only
2611};
2612
Eric Orth828bd3ae2018-12-12 17:30:362613const uint8_t kMdnsResponseTxt[] = {
2614 // Header
2615 0x00, 0x00, // ID is zeroed out
2616 0x81, 0x80, // Standard query response, RA, no error
2617 0x00, 0x00, // No questions (for simplicity)
2618 0x00, 0x01, // 1 RR (answers)
2619 0x00, 0x00, // 0 authority RRs
2620 0x00, 0x00, // 0 additional RRs
2621
2622 // "myhello.local."
2623 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2624 0x00,
2625
2626 0x00, 0x10, // TYPE is TXT.
2627 0x00, 0x01, // CLASS is IN.
2628 0x00, 0x00, 0x00, 0x11, // TTL is 17 (seconds)
2629 0x00, 0x08, // RDLENGTH is 8 bytes.
2630
2631 // "foo"
2632 0x03, 0x66, 0x6f, 0x6f,
2633 // "bar"
Eric Orth960e7062019-03-08 18:43:542634 0x03, 0x62, 0x61, 0x72};
Eric Orth828bd3ae2018-12-12 17:30:362635
Eric Orthe9db8d232019-01-14 21:24:452636const uint8_t kMdnsResponsePtr[] = {
2637 // Header
2638 0x00, 0x00, // ID is zeroed out
2639 0x81, 0x80, // Standard query response, RA, no error
2640 0x00, 0x00, // No questions (for simplicity)
2641 0x00, 0x01, // 1 RR (answers)
2642 0x00, 0x00, // 0 authority RRs
2643 0x00, 0x00, // 0 additional RRs
2644
2645 // "myhello.local."
2646 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2647 0x00,
2648
2649 0x00, 0x0c, // TYPE is PTR.
2650 0x00, 0x01, // CLASS is IN.
2651 0x00, 0x00, 0x00, 0x12, // TTL is 18 (seconds)
2652 0x00, 0x09, // RDLENGTH is 9 bytes.
2653
2654 // "foo.com."
2655 0x03, 'f', 'o', 'o', 0x03, 'c', 'o', 'm', 0x00};
2656
Eric Orth026776a2019-01-18 00:13:282657const uint8_t kMdnsResponsePtrRoot[] = {
2658 // Header
2659 0x00, 0x00, // ID is zeroed out
2660 0x81, 0x80, // Standard query response, RA, no error
2661 0x00, 0x00, // No questions (for simplicity)
2662 0x00, 0x01, // 1 RR (answers)
2663 0x00, 0x00, // 0 authority RRs
2664 0x00, 0x00, // 0 additional RRs
2665
2666 // "myhello.local."
2667 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2668 0x00,
2669
2670 0x00, 0x0c, // TYPE is PTR.
2671 0x00, 0x01, // CLASS is IN.
2672 0x00, 0x00, 0x00, 0x13, // TTL is 19 (seconds)
2673 0x00, 0x01, // RDLENGTH is 1 byte.
2674
2675 // "." (the root domain)
2676 0x00};
2677
Eric Ortha625b042019-01-16 01:14:452678const uint8_t kMdnsResponseSrv[] = {
2679 // Header
2680 0x00, 0x00, // ID is zeroed out
2681 0x81, 0x80, // Standard query response, RA, no error
2682 0x00, 0x00, // No questions (for simplicity)
2683 0x00, 0x01, // 1 RR (answers)
2684 0x00, 0x00, // 0 authority RRs
2685 0x00, 0x00, // 0 additional RRs
2686
2687 // "myhello.local."
2688 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2689 0x00,
2690
2691 0x00, 0x21, // TYPE is SRV.
2692 0x00, 0x01, // CLASS is IN.
2693 0x00, 0x00, 0x00, 0x13, // TTL is 19 (seconds)
2694 0x00, 0x0f, // RDLENGTH is 15 bytes.
2695
2696 0x00, 0x05, // Priority 5
2697 0x00, 0x01, // Weight 1
2698 0x20, 0x49, // Port 8265
2699
2700 // "foo.com."
2701 0x03, 'f', 'o', 'o', 0x03, 'c', 'o', 'm', 0x00};
2702
Bailey Berroe70f06c2019-03-11 22:22:462703const uint8_t kMdnsResponseSrvUnrestricted[] = {
2704 // Header
2705 0x00, 0x00, // ID is zeroed out
2706 0x81, 0x80, // Standard query response, RA, no error
2707 0x00, 0x00, // No questions (for simplicity)
2708 0x00, 0x01, // 1 RR (answers)
2709 0x00, 0x00, // 0 authority RRs
2710 0x00, 0x00, // 0 additional RRs
2711
2712 // "foo bar(A1B2)._ipps._tcp.local"
2713 0x0d, 'f', 'o', 'o', ' ', 'b', 'a', 'r', '(', 'A', '1', 'B', '2', ')', 0x05,
2714 '_', 'i', 'p', 'p', 's', 0x04, '_', 't', 'c', 'p', 0x05, 'l', 'o', 'c', 'a',
2715 'l', 0x00,
2716
2717 0x00, 0x21, // TYPE is SRV.
2718 0x00, 0x01, // CLASS is IN.
2719 0x00, 0x00, 0x00, 0x13, // TTL is 19 (seconds)
2720 0x00, 0x0f, // RDLENGTH is 15 bytes.
2721
2722 0x00, 0x05, // Priority 5
2723 0x00, 0x01, // Weight 1
2724 0x20, 0x49, // Port 8265
2725
2726 // "foo.com."
2727 0x03, 'f', 'o', 'o', 0x03, 'c', 'o', 'm', 0x00};
2728
2729const uint8_t kMdnsResponseSrvUnrestrictedResult[] = {
2730 // Header
2731 0x00, 0x00, // ID is zeroed out
2732 0x81, 0x80, // Standard query response, RA, no error
2733 0x00, 0x00, // No questions (for simplicity)
2734 0x00, 0x01, // 1 RR (answers)
2735 0x00, 0x00, // 0 authority RRs
2736 0x00, 0x00, // 0 additional RRs
2737
2738 // "myhello.local."
2739 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2740 0x00,
2741
2742 0x00, 0x21, // TYPE is SRV.
2743 0x00, 0x01, // CLASS is IN.
2744 0x00, 0x00, 0x00, 0x13, // TTL is 19 (seconds)
2745 0x00, 0x15, // RDLENGTH is 21 bytes.
2746
2747 0x00, 0x05, // Priority 5
2748 0x00, 0x01, // Weight 1
2749 0x20, 0x49, // Port 8265
2750
2751 // "foo bar.local"
2752 0x07, 'f', 'o', 'o', ' ', 'b', 'a', 'r', 0x05, 'l', 'o', 'c', 'a', 'l',
2753 0x00};
2754
Eric Orth960e7062019-03-08 18:43:542755TEST_F(HostResolverManagerTest, Mdns) {
Eric Orth9871aafa2018-10-02 19:59:182756 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2757 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2758 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2759 // 2 socket creations for every transaction.
2760 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(4);
2761
2762 HostResolver::ResolveHostParameters parameters;
2763 parameters.source = HostResolverSource::MULTICAST_DNS;
2764
2765 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552766 HostPortPair("myhello.local", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:242767 NetLogWithSource(), parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502768 resolve_context_->host_cache()));
Eric Orth9871aafa2018-10-02 19:59:182769
2770 socket_factory_ptr->SimulateReceive(kMdnsResponseA, sizeof(kMdnsResponseA));
2771 socket_factory_ptr->SimulateReceive(kMdnsResponseAAAA,
2772 sizeof(kMdnsResponseAAAA));
2773
2774 EXPECT_THAT(response.result_error(), IsOk());
2775 EXPECT_THAT(
2776 response.request()->GetAddressResults().value().endpoints(),
2777 testing::UnorderedElementsAre(
2778 CreateExpected("1.2.3.4", 80),
2779 CreateExpected("000a:0000:0000:0000:0001:0002:0003:0004", 80)));
Eric Orth828bd3ae2018-12-12 17:30:362780 EXPECT_FALSE(response.request()->GetTextResults());
2781 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:402782 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Orth9871aafa2018-10-02 19:59:182783}
2784
Eric Orth960e7062019-03-08 18:43:542785TEST_F(HostResolverManagerTest, Mdns_AaaaOnly) {
Eric Orth9871aafa2018-10-02 19:59:182786 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2787 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2788 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2789 // 2 socket creations for every transaction.
2790 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(2);
2791
2792 HostResolver::ResolveHostParameters parameters;
Eric Orth192e3bb2018-11-14 19:30:322793 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth9871aafa2018-10-02 19:59:182794 parameters.source = HostResolverSource::MULTICAST_DNS;
2795
2796 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552797 HostPortPair("myhello.local", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:242798 NetLogWithSource(), parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502799 resolve_context_->host_cache()));
Eric Orth9871aafa2018-10-02 19:59:182800
2801 socket_factory_ptr->SimulateReceive(kMdnsResponseAAAA,
2802 sizeof(kMdnsResponseAAAA));
2803
2804 EXPECT_THAT(response.result_error(), IsOk());
2805 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
2806 testing::ElementsAre(CreateExpected(
2807 "000a:0000:0000:0000:0001:0002:0003:0004", 80)));
2808}
2809
Eric Orth960e7062019-03-08 18:43:542810TEST_F(HostResolverManagerTest, Mdns_Txt) {
Eric Orth828bd3ae2018-12-12 17:30:362811 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2812 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2813 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2814 // 2 socket creations for every transaction.
2815 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(2);
2816
2817 HostResolver::ResolveHostParameters parameters;
2818 parameters.dns_query_type = DnsQueryType::TXT;
2819 parameters.source = HostResolverSource::MULTICAST_DNS;
2820
2821 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552822 HostPortPair("myhello.local", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:242823 NetLogWithSource(), parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502824 resolve_context_->host_cache()));
Eric Orth828bd3ae2018-12-12 17:30:362825
2826 socket_factory_ptr->SimulateReceive(kMdnsResponseTxt,
2827 sizeof(kMdnsResponseTxt));
2828
2829 EXPECT_THAT(response.result_error(), IsOk());
2830 EXPECT_FALSE(response.request()->GetAddressResults());
2831 EXPECT_THAT(response.request()->GetTextResults(),
2832 testing::Optional(testing::ElementsAre("foo", "bar")));
2833 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:402834 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Orth828bd3ae2018-12-12 17:30:362835}
2836
Eric Orth960e7062019-03-08 18:43:542837TEST_F(HostResolverManagerTest, Mdns_Ptr) {
Eric Orthe9db8d232019-01-14 21:24:452838 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2839 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2840 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2841 // 2 socket creations for every transaction.
2842 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(2);
2843
2844 HostResolver::ResolveHostParameters parameters;
2845 parameters.dns_query_type = DnsQueryType::PTR;
2846 parameters.source = HostResolverSource::MULTICAST_DNS;
2847
2848 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552849 HostPortPair("myhello.local", 83), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:242850 NetLogWithSource(), parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502851 resolve_context_->host_cache()));
Eric Orthe9db8d232019-01-14 21:24:452852
2853 socket_factory_ptr->SimulateReceive(kMdnsResponsePtr,
2854 sizeof(kMdnsResponsePtr));
2855
2856 EXPECT_THAT(response.result_error(), IsOk());
2857 EXPECT_FALSE(response.request()->GetAddressResults());
2858 EXPECT_FALSE(response.request()->GetTextResults());
David Van Clevec719c882019-11-04 15:47:402859 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Orthe9db8d232019-01-14 21:24:452860 EXPECT_THAT(
2861 response.request()->GetHostnameResults(),
2862 testing::Optional(testing::ElementsAre(HostPortPair("foo.com", 83))));
2863}
2864
Eric Orth960e7062019-03-08 18:43:542865TEST_F(HostResolverManagerTest, Mdns_Srv) {
Eric Ortha625b042019-01-16 01:14:452866 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2867 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2868 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2869 // 2 socket creations for every transaction.
2870 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(2);
2871
2872 HostResolver::ResolveHostParameters parameters;
2873 parameters.dns_query_type = DnsQueryType::SRV;
2874 parameters.source = HostResolverSource::MULTICAST_DNS;
2875
2876 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552877 HostPortPair("myhello.local", 83), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:242878 NetLogWithSource(), parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502879 resolve_context_->host_cache()));
Eric Ortha625b042019-01-16 01:14:452880
2881 socket_factory_ptr->SimulateReceive(kMdnsResponseSrv,
2882 sizeof(kMdnsResponseSrv));
2883
2884 EXPECT_THAT(response.result_error(), IsOk());
2885 EXPECT_FALSE(response.request()->GetAddressResults());
2886 EXPECT_FALSE(response.request()->GetTextResults());
David Van Clevec719c882019-11-04 15:47:402887 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Ortha625b042019-01-16 01:14:452888 EXPECT_THAT(
2889 response.request()->GetHostnameResults(),
2890 testing::Optional(testing::ElementsAre(HostPortPair("foo.com", 8265))));
2891}
2892
Bailey Berroe70f06c2019-03-11 22:22:462893// Test that we are able to create multicast DNS requests that contain
2894// characters not permitted in the DNS spec such as spaces and parenthesis.
2895TEST_F(HostResolverManagerTest, Mdns_Srv_Unrestricted) {
2896 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2897 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2898 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2899
2900 HostResolver::ResolveHostParameters parameters;
2901 parameters.dns_query_type = DnsQueryType::SRV;
2902 parameters.source = HostResolverSource::MULTICAST_DNS;
2903
2904 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552905 HostPortPair("foo bar(A1B2)._ipps._tcp.local", 83), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:242906 NetLogWithSource(), parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502907 resolve_context_->host_cache()));
Bailey Berroe70f06c2019-03-11 22:22:462908
2909 socket_factory_ptr->SimulateReceive(kMdnsResponseSrvUnrestricted,
2910 sizeof(kMdnsResponseSrvUnrestricted));
2911
2912 EXPECT_THAT(response.result_error(), IsOk());
2913 EXPECT_FALSE(response.request()->GetAddressResults());
2914 EXPECT_FALSE(response.request()->GetTextResults());
David Van Clevec719c882019-11-04 15:47:402915 EXPECT_FALSE(response.request()->GetEsniResults());
Bailey Berroe70f06c2019-03-11 22:22:462916 EXPECT_THAT(
2917 response.request()->GetHostnameResults(),
2918 testing::Optional(testing::ElementsAre(HostPortPair("foo.com", 8265))));
2919}
2920
2921// Test that we are able to create multicast DNS requests that contain
2922// characters not permitted in the DNS spec such as spaces and parenthesis.
2923TEST_F(HostResolverManagerTest, Mdns_Srv_Result_Unrestricted) {
2924 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2925 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2926 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2927
2928 HostResolver::ResolveHostParameters parameters;
2929 parameters.dns_query_type = DnsQueryType::SRV;
2930 parameters.source = HostResolverSource::MULTICAST_DNS;
2931
2932 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552933 HostPortPair("myhello.local", 83), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:242934 NetLogWithSource(), parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502935 resolve_context_->host_cache()));
Bailey Berroe70f06c2019-03-11 22:22:462936
2937 socket_factory_ptr->SimulateReceive(
2938 kMdnsResponseSrvUnrestrictedResult,
2939 sizeof(kMdnsResponseSrvUnrestrictedResult));
2940
2941 EXPECT_THAT(response.result_error(), IsOk());
2942 EXPECT_FALSE(response.request()->GetAddressResults());
2943 EXPECT_FALSE(response.request()->GetTextResults());
David Van Clevec719c882019-11-04 15:47:402944 EXPECT_FALSE(response.request()->GetEsniResults());
Bailey Berroe70f06c2019-03-11 22:22:462945 EXPECT_THAT(response.request()->GetHostnameResults(),
2946 testing::Optional(
2947 testing::ElementsAre(HostPortPair("foo bar.local", 8265))));
2948}
2949
Eric Orth9871aafa2018-10-02 19:59:182950// Test multicast DNS handling of NSEC responses (used for explicit negative
2951// response).
Eric Orth960e7062019-03-08 18:43:542952TEST_F(HostResolverManagerTest, Mdns_Nsec) {
Eric Orth9871aafa2018-10-02 19:59:182953 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;
Eric Orth192e3bb2018-11-14 19:30:322960 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth9871aafa2018-10-02 19:59:182961 parameters.source = HostResolverSource::MULTICAST_DNS;
2962
2963 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552964 HostPortPair("myhello.local", 80), 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 Orth9871aafa2018-10-02 19:59:182967
2968 socket_factory_ptr->SimulateReceive(kMdnsResponseNsec,
2969 sizeof(kMdnsResponseNsec));
2970
2971 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
2972 EXPECT_FALSE(response.request()->GetAddressResults());
2973}
2974
Eric Orth960e7062019-03-08 18:43:542975TEST_F(HostResolverManagerTest, Mdns_NoResponse) {
Eric Orth9871aafa2018-10-02 19:59:182976 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2977 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2978 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2979 // 2 socket creations for every transaction.
2980 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(4);
2981
2982 // Add a little bit of extra fudge to the delay to allow reasonable
2983 // flexibility for time > vs >= etc. We don't need to fail the test if we
2984 // timeout at t=6001 instead of t=6000.
2985 base::TimeDelta kSleepFudgeFactor = base::TimeDelta::FromMilliseconds(1);
2986
2987 // Override the current thread task runner, so we can simulate the passage of
2988 // time to trigger the timeout.
2989 auto test_task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
2990 base::ScopedClosureRunner task_runner_override_scoped_cleanup =
2991 base::ThreadTaskRunnerHandle::OverrideForTesting(test_task_runner);
2992
2993 HostResolver::ResolveHostParameters parameters;
2994 parameters.source = HostResolverSource::MULTICAST_DNS;
2995
2996 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552997 HostPortPair("myhello.local", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:242998 NetLogWithSource(), parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:502999 resolve_context_->host_cache()));
Eric Orth9871aafa2018-10-02 19:59:183000
3001 ASSERT_TRUE(test_task_runner->HasPendingTask());
3002 test_task_runner->FastForwardBy(MDnsTransaction::kTransactionTimeout +
3003 kSleepFudgeFactor);
3004
3005 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
3006 EXPECT_FALSE(response.request()->GetAddressResults());
Eric Orth828bd3ae2018-12-12 17:30:363007 EXPECT_FALSE(response.request()->GetTextResults());
3008 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:403009 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Orth828bd3ae2018-12-12 17:30:363010
3011 test_task_runner->FastForwardUntilNoTasksRemain();
3012}
3013
Eric Orth960e7062019-03-08 18:43:543014TEST_F(HostResolverManagerTest, Mdns_WrongType) {
Eric Orth828bd3ae2018-12-12 17:30:363015 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3016 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
3017 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
3018 // 2 socket creations for every transaction.
3019 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(2);
3020
3021 // Add a little bit of extra fudge to the delay to allow reasonable
3022 // flexibility for time > vs >= etc. We don't need to fail the test if we
3023 // timeout at t=6001 instead of t=6000.
3024 base::TimeDelta kSleepFudgeFactor = base::TimeDelta::FromMilliseconds(1);
3025
3026 // Override the current thread task runner, so we can simulate the passage of
3027 // time to trigger the timeout.
3028 auto test_task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
3029 base::ScopedClosureRunner task_runner_override_scoped_cleanup =
3030 base::ThreadTaskRunnerHandle::OverrideForTesting(test_task_runner);
3031
3032 HostResolver::ResolveHostParameters parameters;
3033 parameters.dns_query_type = DnsQueryType::A;
3034 parameters.source = HostResolverSource::MULTICAST_DNS;
3035
3036 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:553037 HostPortPair("myhello.local", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:243038 NetLogWithSource(), parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:503039 resolve_context_->host_cache()));
Eric Orth828bd3ae2018-12-12 17:30:363040
3041 // Not the requested type. Should be ignored.
3042 socket_factory_ptr->SimulateReceive(kMdnsResponseTxt,
3043 sizeof(kMdnsResponseTxt));
3044
3045 ASSERT_TRUE(test_task_runner->HasPendingTask());
3046 test_task_runner->FastForwardBy(MDnsTransaction::kTransactionTimeout +
3047 kSleepFudgeFactor);
3048
3049 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
3050 EXPECT_FALSE(response.request()->GetAddressResults());
3051 EXPECT_FALSE(response.request()->GetTextResults());
3052 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:403053 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Orth9871aafa2018-10-02 19:59:183054
3055 test_task_runner->FastForwardUntilNoTasksRemain();
3056}
3057
3058// Test for a request for both A and AAAA results where results only exist for
3059// one type.
Eric Orth960e7062019-03-08 18:43:543060TEST_F(HostResolverManagerTest, Mdns_PartialResults) {
Eric Orth9871aafa2018-10-02 19:59:183061 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3062 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
3063 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
3064 // 2 socket creations for every transaction.
3065 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(4);
3066
3067 // Add a little bit of extra fudge to the delay to allow reasonable
3068 // flexibility for time > vs >= etc. We don't need to fail the test if we
3069 // timeout at t=6001 instead of t=6000.
3070 base::TimeDelta kSleepFudgeFactor = base::TimeDelta::FromMilliseconds(1);
3071
3072 // Override the current thread task runner, so we can simulate the passage of
3073 // time to trigger the timeout.
3074 auto test_task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
3075 base::ScopedClosureRunner task_runner_override_scoped_cleanup =
3076 base::ThreadTaskRunnerHandle::OverrideForTesting(test_task_runner);
3077
3078 HostResolver::ResolveHostParameters parameters;
3079 parameters.source = HostResolverSource::MULTICAST_DNS;
3080
3081 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:553082 HostPortPair("myhello.local", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:243083 NetLogWithSource(), parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:503084 resolve_context_->host_cache()));
Eric Orth9871aafa2018-10-02 19:59:183085
3086 ASSERT_TRUE(test_task_runner->HasPendingTask());
3087
3088 socket_factory_ptr->SimulateReceive(kMdnsResponseA, sizeof(kMdnsResponseA));
3089 test_task_runner->FastForwardBy(MDnsTransaction::kTransactionTimeout +
3090 kSleepFudgeFactor);
3091
3092 EXPECT_THAT(response.result_error(), IsOk());
3093 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
3094 testing::ElementsAre(CreateExpected("1.2.3.4", 80)));
3095
3096 test_task_runner->FastForwardUntilNoTasksRemain();
3097}
3098
Eric Orth960e7062019-03-08 18:43:543099TEST_F(HostResolverManagerTest, Mdns_Cancel) {
Eric Orth9871aafa2018-10-02 19:59:183100 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3101 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
3102 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
3103 // 2 socket creations for every transaction.
3104 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(4);
3105
3106 HostResolver::ResolveHostParameters parameters;
3107 parameters.source = HostResolverSource::MULTICAST_DNS;
3108
3109 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:553110 HostPortPair("myhello.local", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:243111 NetLogWithSource(), parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:503112 resolve_context_->host_cache()));
Eric Orth9871aafa2018-10-02 19:59:183113
3114 response.CancelRequest();
3115
3116 socket_factory_ptr->SimulateReceive(kMdnsResponseA, sizeof(kMdnsResponseA));
3117 socket_factory_ptr->SimulateReceive(kMdnsResponseAAAA,
3118 sizeof(kMdnsResponseAAAA));
3119
3120 base::RunLoop().RunUntilIdle();
3121 EXPECT_FALSE(response.complete());
3122}
3123
3124// Test for a two-transaction query where the first fails to start. The second
3125// should be cancelled.
Eric Orth960e7062019-03-08 18:43:543126TEST_F(HostResolverManagerTest, Mdns_PartialFailure) {
Eric Orth9871aafa2018-10-02 19:59:183127 // Setup a mock MDnsClient where the first transaction will always return
3128 // |false| immediately on Start(). Second transaction may or may not be
3129 // created, but if it is, Start() not expected to be called because the
3130 // overall request should immediately fail.
3131 auto transaction1 = std::make_unique<MockMDnsTransaction>();
3132 EXPECT_CALL(*transaction1, Start()).WillOnce(Return(false));
3133 auto transaction2 = std::make_unique<MockMDnsTransaction>();
3134 EXPECT_CALL(*transaction2, Start()).Times(0);
3135
3136 auto client = std::make_unique<MockMDnsClient>();
3137 EXPECT_CALL(*client, CreateTransaction(_, _, _, _))
3138 .Times(Between(1, 2)) // Second transaction optionally created.
3139 .WillOnce(Return(ByMove(std::move(transaction1))))
3140 .WillOnce(Return(ByMove(std::move(transaction2))));
3141 EXPECT_CALL(*client, IsListening()).WillRepeatedly(Return(true));
3142 resolver_->SetMdnsClientForTesting(std::move(client));
3143
3144 HostResolver::ResolveHostParameters parameters;
3145 parameters.source = HostResolverSource::MULTICAST_DNS;
3146
3147 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:553148 HostPortPair("myhello.local", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:243149 NetLogWithSource(), parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:503150 resolve_context_->host_cache()));
Eric Orth9871aafa2018-10-02 19:59:183151
3152 EXPECT_THAT(response.result_error(), IsError(ERR_FAILED));
3153 EXPECT_FALSE(response.request()->GetAddressResults());
3154}
Eric Orth026776a2019-01-18 00:13:283155
Eric Orthe857ebb2019-03-13 23:02:073156TEST_F(HostResolverManagerTest, Mdns_ListenFailure) {
3157 // Inject an MdnsClient mock that will always fail to start listening.
3158 auto client = std::make_unique<MockMDnsClient>();
3159 EXPECT_CALL(*client, StartListening(_)).WillOnce(Return(ERR_FAILED));
3160 EXPECT_CALL(*client, IsListening()).WillRepeatedly(Return(false));
3161 resolver_->SetMdnsClientForTesting(std::move(client));
3162
3163 HostResolver::ResolveHostParameters parameters;
3164 parameters.source = HostResolverSource::MULTICAST_DNS;
3165
3166 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:553167 HostPortPair("myhello.local", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:243168 NetLogWithSource(), parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:503169 resolve_context_->host_cache()));
Eric Orthe857ebb2019-03-13 23:02:073170
3171 EXPECT_THAT(response.result_error(), IsError(ERR_FAILED));
3172 EXPECT_FALSE(response.request()->GetAddressResults());
3173}
3174
Eric Orth026776a2019-01-18 00:13:283175// Implementation of HostResolver::MdnsListenerDelegate that records all
3176// received results in maps.
3177class TestMdnsListenerDelegate : public HostResolver::MdnsListener::Delegate {
3178 public:
3179 using UpdateKey =
3180 std::pair<HostResolver::MdnsListener::Delegate::UpdateType, DnsQueryType>;
3181
3182 void OnAddressResult(
3183 HostResolver::MdnsListener::Delegate::UpdateType update_type,
3184 DnsQueryType result_type,
3185 IPEndPoint address) override {
David Van Cleveac020732019-10-29 00:27:093186 address_results_.insert({{update_type, result_type}, address});
Eric Orth026776a2019-01-18 00:13:283187 }
3188
3189 void OnTextResult(
3190 HostResolver::MdnsListener::Delegate::UpdateType update_type,
3191 DnsQueryType result_type,
3192 std::vector<std::string> text_records) override {
3193 for (auto& text_record : text_records) {
3194 text_results_.insert(
3195 {{update_type, result_type}, std::move(text_record)});
3196 }
3197 }
3198
3199 void OnHostnameResult(
3200 HostResolver::MdnsListener::Delegate::UpdateType update_type,
3201 DnsQueryType result_type,
3202 HostPortPair host) override {
3203 hostname_results_.insert({{update_type, result_type}, std::move(host)});
3204 }
3205
3206 void OnUnhandledResult(
3207 HostResolver::MdnsListener::Delegate::UpdateType update_type,
3208 DnsQueryType result_type) override {
3209 unhandled_results_.insert({update_type, result_type});
3210 }
3211
3212 const std::multimap<UpdateKey, IPEndPoint>& address_results() {
3213 return address_results_;
3214 }
3215
3216 const std::multimap<UpdateKey, std::string>& text_results() {
3217 return text_results_;
3218 }
3219
3220 const std::multimap<UpdateKey, HostPortPair>& hostname_results() {
3221 return hostname_results_;
3222 }
3223
3224 const std::multiset<UpdateKey>& unhandled_results() {
3225 return unhandled_results_;
3226 }
3227
3228 template <typename T>
3229 static std::pair<UpdateKey, T> CreateExpectedResult(
3230 HostResolver::MdnsListener::Delegate::UpdateType update_type,
3231 DnsQueryType query_type,
3232 T result) {
3233 return std::make_pair(std::make_pair(update_type, query_type), result);
3234 }
3235
3236 private:
3237 std::multimap<UpdateKey, IPEndPoint> address_results_;
3238 std::multimap<UpdateKey, std::string> text_results_;
3239 std::multimap<UpdateKey, HostPortPair> hostname_results_;
3240 std::multiset<UpdateKey> unhandled_results_;
3241};
3242
Eric Orth960e7062019-03-08 18:43:543243TEST_F(HostResolverManagerTest, MdnsListener) {
Eric Orth026776a2019-01-18 00:13:283244 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3245 base::SimpleTestClock clock;
3246 clock.SetNow(base::Time::Now());
3247 auto cache_cleanup_timer = std::make_unique<base::MockOneShotTimer>();
3248 auto* cache_cleanup_timer_ptr = cache_cleanup_timer.get();
3249 auto mdns_client =
3250 std::make_unique<MDnsClientImpl>(&clock, std::move(cache_cleanup_timer));
Eric Orthe857ebb2019-03-13 23:02:073251 ASSERT_THAT(mdns_client->StartListening(socket_factory.get()), IsOk());
Eric Orth026776a2019-01-18 00:13:283252 resolver_->SetMdnsClientForTesting(std::move(mdns_client));
3253
3254 std::unique_ptr<HostResolver::MdnsListener> listener =
3255 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 80),
3256 DnsQueryType::A);
3257
3258 TestMdnsListenerDelegate delegate;
3259 ASSERT_THAT(listener->Start(&delegate), IsOk());
3260 ASSERT_THAT(delegate.address_results(), testing::IsEmpty());
3261
3262 socket_factory->SimulateReceive(kMdnsResponseA, sizeof(kMdnsResponseA));
3263 socket_factory->SimulateReceive(kMdnsResponseA2, sizeof(kMdnsResponseA2));
3264 socket_factory->SimulateReceive(kMdnsResponseA2Goodbye,
3265 sizeof(kMdnsResponseA2Goodbye));
3266
3267 // Per RFC6762 section 10.1, removals take effect 1 second after receiving the
3268 // goodbye message.
3269 clock.Advance(base::TimeDelta::FromSeconds(1));
3270 cache_cleanup_timer_ptr->Fire();
3271
3272 // Expect 1 record adding "1.2.3.4", another changing to "5.6.7.8", and a
3273 // final removing "5.6.7.8".
3274 EXPECT_THAT(delegate.address_results(),
3275 testing::ElementsAre(
3276 TestMdnsListenerDelegate::CreateExpectedResult(
3277 HostResolver::MdnsListener::Delegate::UpdateType::ADDED,
3278 DnsQueryType::A, CreateExpected("1.2.3.4", 80)),
3279 TestMdnsListenerDelegate::CreateExpectedResult(
3280 HostResolver::MdnsListener::Delegate::UpdateType::CHANGED,
3281 DnsQueryType::A, CreateExpected("5.6.7.8", 80)),
3282 TestMdnsListenerDelegate::CreateExpectedResult(
3283 HostResolver::MdnsListener::Delegate::UpdateType::REMOVED,
3284 DnsQueryType::A, CreateExpected("5.6.7.8", 80))));
3285
3286 EXPECT_THAT(delegate.text_results(), testing::IsEmpty());
3287 EXPECT_THAT(delegate.hostname_results(), testing::IsEmpty());
3288 EXPECT_THAT(delegate.unhandled_results(), testing::IsEmpty());
3289}
3290
Eric Orthe857ebb2019-03-13 23:02:073291TEST_F(HostResolverManagerTest, MdnsListener_StartListenFailure) {
3292 // Inject an MdnsClient mock that will always fail to start listening.
3293 auto client = std::make_unique<MockMDnsClient>();
3294 EXPECT_CALL(*client, StartListening(_)).WillOnce(Return(ERR_TIMED_OUT));
3295 EXPECT_CALL(*client, IsListening()).WillRepeatedly(Return(false));
3296 resolver_->SetMdnsClientForTesting(std::move(client));
3297
3298 std::unique_ptr<HostResolver::MdnsListener> listener =
3299 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 80),
3300 DnsQueryType::A);
3301 TestMdnsListenerDelegate delegate;
3302 EXPECT_THAT(listener->Start(&delegate), IsError(ERR_TIMED_OUT));
3303 EXPECT_THAT(delegate.address_results(), testing::IsEmpty());
3304}
3305
Eric Orth026776a2019-01-18 00:13:283306// Test that removal notifications are sent on natural expiration of MDNS
3307// records.
Eric Orth960e7062019-03-08 18:43:543308TEST_F(HostResolverManagerTest, MdnsListener_Expiration) {
Eric Orth026776a2019-01-18 00:13:283309 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3310 base::SimpleTestClock clock;
3311 clock.SetNow(base::Time::Now());
3312 auto cache_cleanup_timer = std::make_unique<base::MockOneShotTimer>();
3313 auto* cache_cleanup_timer_ptr = cache_cleanup_timer.get();
3314 auto mdns_client =
3315 std::make_unique<MDnsClientImpl>(&clock, std::move(cache_cleanup_timer));
Eric Orthe857ebb2019-03-13 23:02:073316 ASSERT_THAT(mdns_client->StartListening(socket_factory.get()), IsOk());
Eric Orth026776a2019-01-18 00:13:283317 resolver_->SetMdnsClientForTesting(std::move(mdns_client));
3318
3319 std::unique_ptr<HostResolver::MdnsListener> listener =
3320 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 100),
3321 DnsQueryType::A);
3322
3323 TestMdnsListenerDelegate delegate;
3324 ASSERT_THAT(listener->Start(&delegate), IsOk());
3325 ASSERT_THAT(delegate.address_results(), testing::IsEmpty());
3326
3327 socket_factory->SimulateReceive(kMdnsResponseA, sizeof(kMdnsResponseA));
3328
3329 EXPECT_THAT(
3330 delegate.address_results(),
3331 testing::ElementsAre(TestMdnsListenerDelegate::CreateExpectedResult(
3332 HostResolver::MdnsListener::Delegate::UpdateType::ADDED,
3333 DnsQueryType::A, CreateExpected("1.2.3.4", 100))));
3334
3335 clock.Advance(base::TimeDelta::FromSeconds(16));
3336 cache_cleanup_timer_ptr->Fire();
3337
3338 EXPECT_THAT(delegate.address_results(),
3339 testing::ElementsAre(
3340 TestMdnsListenerDelegate::CreateExpectedResult(
3341 HostResolver::MdnsListener::Delegate::UpdateType::ADDED,
3342 DnsQueryType::A, CreateExpected("1.2.3.4", 100)),
3343 TestMdnsListenerDelegate::CreateExpectedResult(
3344 HostResolver::MdnsListener::Delegate::UpdateType::REMOVED,
3345 DnsQueryType::A, CreateExpected("1.2.3.4", 100))));
3346
3347 EXPECT_THAT(delegate.text_results(), testing::IsEmpty());
3348 EXPECT_THAT(delegate.hostname_results(), testing::IsEmpty());
3349 EXPECT_THAT(delegate.unhandled_results(), testing::IsEmpty());
3350}
3351
Eric Orth960e7062019-03-08 18:43:543352TEST_F(HostResolverManagerTest, MdnsListener_Txt) {
Eric Orth026776a2019-01-18 00:13:283353 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3354 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
3355 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
3356
3357 std::unique_ptr<HostResolver::MdnsListener> listener =
3358 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 12),
3359 DnsQueryType::TXT);
3360
3361 TestMdnsListenerDelegate delegate;
3362 ASSERT_THAT(listener->Start(&delegate), IsOk());
3363 ASSERT_THAT(delegate.text_results(), testing::IsEmpty());
3364
3365 socket_factory_ptr->SimulateReceive(kMdnsResponseTxt,
3366 sizeof(kMdnsResponseTxt));
3367
3368 EXPECT_THAT(delegate.text_results(),
3369 testing::ElementsAre(
3370 TestMdnsListenerDelegate::CreateExpectedResult(
3371 HostResolver::MdnsListener::Delegate::UpdateType::ADDED,
3372 DnsQueryType::TXT, "foo"),
3373 TestMdnsListenerDelegate::CreateExpectedResult(
3374 HostResolver::MdnsListener::Delegate::UpdateType::ADDED,
3375 DnsQueryType::TXT, "bar")));
3376
3377 EXPECT_THAT(delegate.address_results(), testing::IsEmpty());
3378 EXPECT_THAT(delegate.hostname_results(), testing::IsEmpty());
3379 EXPECT_THAT(delegate.unhandled_results(), testing::IsEmpty());
3380}
3381
Eric Orth960e7062019-03-08 18:43:543382TEST_F(HostResolverManagerTest, MdnsListener_Ptr) {
Eric Orth026776a2019-01-18 00:13:283383 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3384 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
3385 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
3386
3387 std::unique_ptr<HostResolver::MdnsListener> listener =
3388 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 13),
3389 DnsQueryType::PTR);
3390
3391 TestMdnsListenerDelegate delegate;
3392 ASSERT_THAT(listener->Start(&delegate), IsOk());
3393 ASSERT_THAT(delegate.text_results(), testing::IsEmpty());
3394
3395 socket_factory_ptr->SimulateReceive(kMdnsResponsePtr,
3396 sizeof(kMdnsResponsePtr));
3397
3398 EXPECT_THAT(
3399 delegate.hostname_results(),
3400 testing::ElementsAre(TestMdnsListenerDelegate::CreateExpectedResult(
3401 HostResolver::MdnsListener::Delegate::UpdateType::ADDED,
3402 DnsQueryType::PTR, HostPortPair("foo.com", 13))));
3403
3404 EXPECT_THAT(delegate.address_results(), testing::IsEmpty());
3405 EXPECT_THAT(delegate.text_results(), testing::IsEmpty());
3406 EXPECT_THAT(delegate.unhandled_results(), testing::IsEmpty());
3407}
3408
Eric Orth960e7062019-03-08 18:43:543409TEST_F(HostResolverManagerTest, MdnsListener_Srv) {
Eric Orth026776a2019-01-18 00:13:283410 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3411 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
3412 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
3413
3414 std::unique_ptr<HostResolver::MdnsListener> listener =
3415 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 14),
3416 DnsQueryType::SRV);
3417
3418 TestMdnsListenerDelegate delegate;
3419 ASSERT_THAT(listener->Start(&delegate), IsOk());
3420 ASSERT_THAT(delegate.text_results(), testing::IsEmpty());
3421
3422 socket_factory_ptr->SimulateReceive(kMdnsResponseSrv,
3423 sizeof(kMdnsResponseSrv));
3424
3425 EXPECT_THAT(
3426 delegate.hostname_results(),
3427 testing::ElementsAre(TestMdnsListenerDelegate::CreateExpectedResult(
3428 HostResolver::MdnsListener::Delegate::UpdateType::ADDED,
3429 DnsQueryType::SRV, HostPortPair("foo.com", 8265))));
3430
3431 EXPECT_THAT(delegate.address_results(), testing::IsEmpty());
3432 EXPECT_THAT(delegate.text_results(), testing::IsEmpty());
3433 EXPECT_THAT(delegate.unhandled_results(), testing::IsEmpty());
3434}
3435
3436// Ensure query types we are not listening for do not affect MdnsListener.
Eric Orth960e7062019-03-08 18:43:543437TEST_F(HostResolverManagerTest, MdnsListener_NonListeningTypes) {
Eric Orth026776a2019-01-18 00:13:283438 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3439 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
3440 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
3441
3442 std::unique_ptr<HostResolver::MdnsListener> listener =
3443 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 41),
3444 DnsQueryType::A);
3445
3446 TestMdnsListenerDelegate delegate;
3447 ASSERT_THAT(listener->Start(&delegate), IsOk());
3448
3449 socket_factory_ptr->SimulateReceive(kMdnsResponseAAAA,
3450 sizeof(kMdnsResponseAAAA));
3451
3452 EXPECT_THAT(delegate.address_results(), testing::IsEmpty());
3453 EXPECT_THAT(delegate.text_results(), testing::IsEmpty());
3454 EXPECT_THAT(delegate.hostname_results(), testing::IsEmpty());
3455 EXPECT_THAT(delegate.unhandled_results(), testing::IsEmpty());
3456}
3457
Eric Orth960e7062019-03-08 18:43:543458TEST_F(HostResolverManagerTest, MdnsListener_RootDomain) {
Eric Orth026776a2019-01-18 00:13:283459 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3460 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
3461 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
3462
3463 std::unique_ptr<HostResolver::MdnsListener> listener =
3464 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 5),
3465 DnsQueryType::PTR);
3466
3467 TestMdnsListenerDelegate delegate;
3468 ASSERT_THAT(listener->Start(&delegate), IsOk());
3469
3470 socket_factory_ptr->SimulateReceive(kMdnsResponsePtrRoot,
3471 sizeof(kMdnsResponsePtrRoot));
3472
3473 EXPECT_THAT(delegate.unhandled_results(),
3474 testing::ElementsAre(std::make_pair(
3475 HostResolver::MdnsListener::Delegate::UpdateType::ADDED,
3476 DnsQueryType::PTR)));
3477
3478 EXPECT_THAT(delegate.address_results(), testing::IsEmpty());
3479 EXPECT_THAT(delegate.text_results(), testing::IsEmpty());
3480 EXPECT_THAT(delegate.hostname_results(), testing::IsEmpty());
3481}
Eric Orth9871aafa2018-10-02 19:59:183482#endif // BUILDFLAG(ENABLE_MDNS)
3483
[email protected]78eac2a2012-03-14 19:09:273484DnsConfig CreateValidDnsConfig() {
martijna23c8962016-03-04 18:18:513485 IPAddress dns_ip(192, 168, 1, 0);
[email protected]78eac2a2012-03-14 19:09:273486 DnsConfig config;
[email protected]38b50d92012-04-19 21:07:523487 config.nameservers.push_back(IPEndPoint(dns_ip, dns_protocol::kDefaultPort));
dalyk4f4ac712019-05-31 16:33:133488 config.dns_over_https_servers.push_back({DnsConfig::DnsOverHttpsServerConfig(
3489 "https://dns.example.com/", true /* use_post */)});
3490 config.secure_dns_mode = DnsConfig::SecureDnsMode::OFF;
[email protected]78eac2a2012-03-14 19:09:273491 EXPECT_TRUE(config.IsValid());
3492 return config;
3493}
3494
dalykf93a48e372019-09-04 02:57:593495DnsConfig CreateUpgradableDnsConfig() {
3496 DnsConfig config;
3497 config.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
3498 config.allow_dns_over_https_upgrade = true;
3499 // Cloudflare upgradeable IPs
3500 IPAddress dns_ip0(1, 0, 0, 1);
3501 IPAddress dns_ip1;
3502 EXPECT_TRUE(dns_ip1.AssignFromIPLiteral("2606:4700:4700::1111"));
3503 // SafeBrowsing family filter upgradeable IP
3504 IPAddress dns_ip2;
3505 EXPECT_TRUE(dns_ip2.AssignFromIPLiteral("2a0d:2a00:2::"));
3506 // SafeBrowsing security filter upgradeable IP
3507 IPAddress dns_ip3(185, 228, 169, 9);
3508 // Non-upgradeable IP
3509 IPAddress dns_ip4(1, 2, 3, 4);
3510
3511 config.nameservers.push_back(IPEndPoint(dns_ip0, dns_protocol::kDefaultPort));
3512 config.nameservers.push_back(IPEndPoint(dns_ip1, dns_protocol::kDefaultPort));
3513 config.nameservers.push_back(IPEndPoint(dns_ip2, 54));
3514 config.nameservers.push_back(IPEndPoint(dns_ip3, dns_protocol::kDefaultPort));
3515 config.nameservers.push_back(IPEndPoint(dns_ip4, dns_protocol::kDefaultPort));
3516 EXPECT_TRUE(config.IsValid());
3517 return config;
3518}
3519
Matt Menkef4023312019-11-01 18:24:553520// Check that entries are written to the cache with the right NIK.
3521TEST_F(HostResolverManagerTest, NetworkIsolationKeyWriteToHostCache) {
3522 const url::Origin kOrigin1 =
3523 url::Origin::Create(GURL("https://origin1.test/"));
3524 const url::Origin kOrigin2 =
3525 url::Origin::Create(GURL("https://origin2.test/"));
3526 const NetworkIsolationKey kNetworkIsolationKey1(kOrigin1, kOrigin1);
3527 const NetworkIsolationKey kNetworkIsolationKey2(kOrigin2, kOrigin2);
3528
3529 const char kFirstDnsResult[] = "192.168.1.42";
3530 const char kSecondDnsResult[] = "192.168.1.43";
3531
3532 for (bool split_cache_by_network_isolation_key : {false, true}) {
3533 base::test::ScopedFeatureList feature_list;
3534 if (split_cache_by_network_isolation_key) {
3535 feature_list.InitAndEnableFeature(
3536 features::kSplitHostCacheByNetworkIsolationKey);
3537 } else {
3538 feature_list.InitAndDisableFeature(
3539 features::kSplitHostCacheByNetworkIsolationKey);
3540 }
3541 proc_->AddRuleForAllFamilies("just.testing", kFirstDnsResult);
3542 proc_->SignalMultiple(1u);
3543
3544 // Resolve a host using kNetworkIsolationKey1.
3545 ResolveHostResponseHelper response1(resolver_->CreateRequest(
3546 HostPortPair("just.testing", 80), kNetworkIsolationKey1,
Eric Orth069a3c6e2020-01-31 23:14:243547 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:503548 resolve_context_->host_cache()));
Matt Menkef4023312019-11-01 18:24:553549 EXPECT_THAT(response1.result_error(), IsOk());
3550 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
3551 testing::ElementsAre(CreateExpected(kFirstDnsResult, 80)));
3552 EXPECT_FALSE(response1.request()->GetStaleInfo());
3553 EXPECT_EQ(1u, proc_->GetCaptureList().size());
3554
3555 // If the host cache is being split by NetworkIsolationKeys, there should be
3556 // an entry in the HostCache with kNetworkIsolationKey1. Otherwise, there
3557 // should be an entry with the empy NIK.
3558 if (split_cache_by_network_isolation_key) {
3559 EXPECT_TRUE(GetCacheHit(
3560 HostCache::Key("just.testing", DnsQueryType::UNSPECIFIED,
3561 0 /* host_resolver_flags */, HostResolverSource::ANY,
3562 kNetworkIsolationKey1)));
3563
3564 EXPECT_FALSE(GetCacheHit(
3565 HostCache::Key("just.testing", DnsQueryType::UNSPECIFIED,
3566 0 /* host_resolver_flags */, HostResolverSource::ANY,
3567 NetworkIsolationKey())));
3568 } else {
3569 EXPECT_FALSE(GetCacheHit(
3570 HostCache::Key("just.testing", DnsQueryType::UNSPECIFIED,
3571 0 /* host_resolver_flags */, HostResolverSource::ANY,
3572 kNetworkIsolationKey1)));
3573
3574 EXPECT_TRUE(GetCacheHit(
3575 HostCache::Key("just.testing", DnsQueryType::UNSPECIFIED,
3576 0 /* host_resolver_flags */, HostResolverSource::ANY,
3577 NetworkIsolationKey())));
3578 }
3579
3580 // There should be no entry using kNetworkIsolationKey2 in either case.
3581 EXPECT_FALSE(GetCacheHit(HostCache::Key(
3582 "just.testing", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
3583 HostResolverSource::ANY, kNetworkIsolationKey2)));
3584
3585 // A request using kNetworkIsolationKey2 should only be served out of the
3586 // cache of the cache if |split_cache_by_network_isolation_key| is false. If
3587 // it's not served over the network, it is provided a different result.
3588 if (split_cache_by_network_isolation_key) {
3589 proc_->AddRuleForAllFamilies("just.testing", kSecondDnsResult);
3590 proc_->SignalMultiple(1u);
3591 }
3592 ResolveHostResponseHelper response2(resolver_->CreateRequest(
3593 HostPortPair("just.testing", 80), kNetworkIsolationKey2,
Eric Orth069a3c6e2020-01-31 23:14:243594 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:503595 resolve_context_->host_cache()));
Matt Menkef4023312019-11-01 18:24:553596 EXPECT_THAT(response2.result_error(), IsOk());
3597 if (split_cache_by_network_isolation_key) {
3598 EXPECT_THAT(response2.request()->GetAddressResults().value().endpoints(),
3599 testing::ElementsAre(CreateExpected(kSecondDnsResult, 80)));
3600 EXPECT_FALSE(response2.request()->GetStaleInfo());
3601 EXPECT_EQ(2u, proc_->GetCaptureList().size());
3602 EXPECT_TRUE(GetCacheHit(
3603 HostCache::Key("just.testing", DnsQueryType::UNSPECIFIED,
3604 0 /* host_resolver_flags */, HostResolverSource::ANY,
3605 kNetworkIsolationKey2)));
3606 } else {
3607 EXPECT_THAT(response2.request()->GetAddressResults().value().endpoints(),
3608 testing::ElementsAre(CreateExpected(kFirstDnsResult, 80)));
3609 EXPECT_TRUE(response2.request()->GetStaleInfo());
3610 EXPECT_EQ(1u, proc_->GetCaptureList().size());
3611 EXPECT_FALSE(GetCacheHit(
3612 HostCache::Key("just.testing", DnsQueryType::UNSPECIFIED,
3613 0 /* host_resolver_flags */, HostResolverSource::ANY,
3614 kNetworkIsolationKey2)));
3615 }
3616
Eric Orthaf82b49a2020-02-01 01:48:503617 resolve_context_->host_cache()->clear();
Matt Menkef4023312019-11-01 18:24:553618 proc_->ClearCaptureList();
3619 }
3620}
3621
3622// Check that entries are read to the cache with the right NIK.
3623TEST_F(HostResolverManagerTest, NetworkIsolationKeyReadFromHostCache) {
3624 const url::Origin kOrigin1 =
3625 url::Origin::Create(GURL("https://origin1.test/"));
3626 const url::Origin kOrigin2 =
3627 url::Origin::Create(GURL("https://origin2.test/"));
3628 const NetworkIsolationKey kNetworkIsolationKey1(kOrigin1, kOrigin1);
3629 const NetworkIsolationKey kNetworkIsolationKey2(kOrigin2, kOrigin2);
3630
3631 struct CacheEntry {
3632 NetworkIsolationKey network_isolation_key;
3633 const char* cached_ip_address;
3634 };
3635
3636 const CacheEntry kCacheEntries[] = {
3637 {NetworkIsolationKey(), "192.168.1.42"},
3638 {kNetworkIsolationKey1, "192.168.1.43"},
3639 {kNetworkIsolationKey2, "192.168.1.44"},
3640 };
3641
3642 // Add entries to cache for the empty NIK, NIK1, and NIK2. Only the
3643 // HostResolverManager obeys features::kSplitHostCacheByNetworkIsolationKey,
3644 // so this is fine to do regardless of the feature value.
3645 for (const auto& cache_entry : kCacheEntries) {
3646 HostCache::Key key("just.testing", DnsQueryType::UNSPECIFIED, 0,
3647 HostResolverSource::ANY,
3648 cache_entry.network_isolation_key);
3649 IPAddress address;
3650 ASSERT_TRUE(address.AssignFromIPLiteral(cache_entry.cached_ip_address));
3651 HostCache::Entry entry =
3652 HostCache::Entry(OK, AddressList::CreateFromIPAddress(address, 80),
3653 HostCache::Entry::SOURCE_UNKNOWN);
Eric Orthaf82b49a2020-02-01 01:48:503654 resolve_context_->host_cache()->Set(key, entry, base::TimeTicks::Now(),
3655 base::TimeDelta::FromDays(1));
Matt Menkef4023312019-11-01 18:24:553656 }
3657
3658 for (bool split_cache_by_network_isolation_key : {false, true}) {
3659 base::test::ScopedFeatureList feature_list;
3660 if (split_cache_by_network_isolation_key) {
3661 feature_list.InitAndEnableFeature(
3662 features::kSplitHostCacheByNetworkIsolationKey);
3663 } else {
3664 feature_list.InitAndDisableFeature(
3665 features::kSplitHostCacheByNetworkIsolationKey);
3666 }
3667
3668 // A request that uses kNetworkIsolationKey1 will return cache entry 1 if
3669 // the NetworkIsolationKeys are being used, and cache entry 0 otherwise.
3670 ResolveHostResponseHelper response1(resolver_->CreateRequest(
3671 HostPortPair("just.testing", 80), kNetworkIsolationKey1,
Eric Orth069a3c6e2020-01-31 23:14:243672 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:503673 resolve_context_->host_cache()));
Matt Menkef4023312019-11-01 18:24:553674 EXPECT_THAT(response1.result_error(), IsOk());
3675 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
3676 testing::ElementsAre(CreateExpected(
3677 kCacheEntries[split_cache_by_network_isolation_key ? 1 : 0]
3678 .cached_ip_address,
3679 80)));
3680 EXPECT_TRUE(response1.request()->GetStaleInfo());
3681
3682 // A request that uses kNetworkIsolationKey2 will return cache entry 2 if
3683 // the NetworkIsolationKeys are being used, and cache entry 0 otherwise.
3684 ResolveHostResponseHelper response2(resolver_->CreateRequest(
3685 HostPortPair("just.testing", 80), kNetworkIsolationKey2,
Eric Orth069a3c6e2020-01-31 23:14:243686 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:503687 resolve_context_->host_cache()));
Matt Menkef4023312019-11-01 18:24:553688 EXPECT_THAT(response2.result_error(), IsOk());
3689 EXPECT_THAT(response2.request()->GetAddressResults().value().endpoints(),
3690 testing::ElementsAre(CreateExpected(
3691 kCacheEntries[split_cache_by_network_isolation_key ? 2 : 0]
3692 .cached_ip_address,
3693 80)));
3694 EXPECT_TRUE(response2.request()->GetStaleInfo());
3695 }
3696}
3697
3698// Test that two requests made with different NetworkIsolationKeys are not
3699// merged if |features::kSplitHostCacheByNetworkIsolationKey| is enabled.
3700TEST_F(HostResolverManagerTest, NetworkIsolationKeyTwoRequestsAtOnce) {
3701 const url::Origin kOrigin1 =
3702 url::Origin::Create(GURL("https://origin1.test/"));
3703 const url::Origin kOrigin2 =
3704 url::Origin::Create(GURL("https://origin2.test/"));
3705 const NetworkIsolationKey kNetworkIsolationKey1(kOrigin1, kOrigin1);
3706 const NetworkIsolationKey kNetworkIsolationKey2(kOrigin2, kOrigin2);
3707
3708 const char kDnsResult[] = "192.168.1.42";
3709
3710 for (bool split_cache_by_network_isolation_key : {false, true}) {
3711 base::test::ScopedFeatureList feature_list;
3712 if (split_cache_by_network_isolation_key) {
3713 feature_list.InitAndEnableFeature(
3714 features::kSplitHostCacheByNetworkIsolationKey);
3715 } else {
3716 feature_list.InitAndDisableFeature(
3717 features::kSplitHostCacheByNetworkIsolationKey);
3718 }
3719 proc_->AddRuleForAllFamilies("just.testing", kDnsResult);
3720
3721 // Start resolving a host using kNetworkIsolationKey1.
3722 ResolveHostResponseHelper response1(resolver_->CreateRequest(
3723 HostPortPair("just.testing", 80), kNetworkIsolationKey1,
Eric Orth069a3c6e2020-01-31 23:14:243724 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:503725 resolve_context_->host_cache()));
Matt Menkef4023312019-11-01 18:24:553726 EXPECT_FALSE(response1.complete());
3727
3728 // Start resolving the same host using kNetworkIsolationKey2.
3729 ResolveHostResponseHelper response2(resolver_->CreateRequest(
3730 HostPortPair("just.testing", 80), kNetworkIsolationKey2,
Eric Orth069a3c6e2020-01-31 23:14:243731 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:503732 resolve_context_->host_cache()));
Matt Menkef4023312019-11-01 18:24:553733 EXPECT_FALSE(response2.complete());
3734
3735 // Wait for and complete the expected number of over-the-wire DNS
3736 // resolutions.
3737 if (split_cache_by_network_isolation_key) {
3738 proc_->WaitFor(2);
3739 EXPECT_EQ(2u, proc_->GetCaptureList().size());
3740 proc_->SignalMultiple(2u);
3741 } else {
3742 proc_->WaitFor(1);
3743 EXPECT_EQ(1u, proc_->GetCaptureList().size());
3744 proc_->SignalMultiple(1u);
3745 }
3746
3747 // Both requests should have completed successfully, with neither served out
3748 // of the cache.
3749
3750 EXPECT_THAT(response1.result_error(), IsOk());
3751 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
3752 testing::ElementsAre(CreateExpected(kDnsResult, 80)));
3753 EXPECT_FALSE(response1.request()->GetStaleInfo());
3754
3755 EXPECT_THAT(response2.result_error(), IsOk());
3756 EXPECT_THAT(response2.request()->GetAddressResults().value().endpoints(),
3757 testing::ElementsAre(CreateExpected(kDnsResult, 80)));
3758 EXPECT_FALSE(response2.request()->GetStaleInfo());
3759
Eric Orthaf82b49a2020-02-01 01:48:503760 resolve_context_->host_cache()->clear();
Matt Menkef4023312019-11-01 18:24:553761 proc_->ClearCaptureList();
3762 }
3763}
3764
Eric Orth069a3c6e2020-01-31 23:14:243765// Test that two otherwise-identical requests with different ResolveContexts are
3766// not merged.
3767TEST_F(HostResolverManagerTest, ContextsNotMerged) {
3768 const char kDnsResult[] = "192.168.1.42";
3769
3770 proc_->AddRuleForAllFamilies("just.testing", kDnsResult);
3771
3772 // Start resolving a host using |resolve_context_|.
3773 ResolveHostResponseHelper response1(resolver_->CreateRequest(
3774 HostPortPair("just.testing", 80), NetworkIsolationKey(),
3775 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:503776 resolve_context_->host_cache()));
Eric Orth069a3c6e2020-01-31 23:14:243777 EXPECT_FALSE(response1.complete());
3778
3779 // Start resolving the same host using another ResolveContext and cache.
Eric Orthaf82b49a2020-02-01 01:48:503780 ResolveContext resolve_context2(resolve_context_->url_request_context(),
3781 true /* enable_caching */);
3782 resolver_->RegisterResolveContext(&resolve_context2);
Eric Orth069a3c6e2020-01-31 23:14:243783 ResolveHostResponseHelper response2(resolver_->CreateRequest(
3784 HostPortPair("just.testing", 80), NetworkIsolationKey(),
Eric Orthaf82b49a2020-02-01 01:48:503785 NetLogWithSource(), base::nullopt, &resolve_context2,
3786 resolve_context2.host_cache()));
Eric Orth069a3c6e2020-01-31 23:14:243787 EXPECT_FALSE(response2.complete());
3788
3789 EXPECT_EQ(2u, resolver_->num_jobs_for_testing());
3790
3791 // Wait for and complete the 2 over-the-wire DNS resolutions.
3792 proc_->WaitFor(2);
3793 EXPECT_EQ(2u, proc_->GetCaptureList().size());
3794 proc_->SignalMultiple(2u);
3795
3796 // Both requests should have completed successfully, with neither served out
3797 // of the cache.
3798
3799 EXPECT_THAT(response1.result_error(), IsOk());
3800 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
3801 testing::ElementsAre(CreateExpected(kDnsResult, 80)));
3802 EXPECT_FALSE(response1.request()->GetStaleInfo());
3803
3804 EXPECT_THAT(response2.result_error(), IsOk());
3805 EXPECT_THAT(response2.request()->GetAddressResults().value().endpoints(),
3806 testing::ElementsAre(CreateExpected(kDnsResult, 80)));
3807 EXPECT_FALSE(response2.request()->GetStaleInfo());
3808
Eric Orthaf82b49a2020-02-01 01:48:503809 EXPECT_EQ(1u, resolve_context_->host_cache()->size());
3810 EXPECT_EQ(1u, resolve_context2.host_cache()->size());
Eric Orth069a3c6e2020-01-31 23:14:243811
Eric Orthaf82b49a2020-02-01 01:48:503812 resolver_->DeregisterResolveContext(&resolve_context2);
Eric Orth069a3c6e2020-01-31 23:14:243813}
3814
[email protected]1d932852012-06-19 19:40:333815// Specialized fixture for tests of DnsTask.
Eric Orth960e7062019-03-08 18:43:543816class HostResolverManagerDnsTest : public HostResolverManagerTest {
[email protected]daae1322013-09-05 18:26:503817 public:
David Van Cleve1fb5e8c2019-11-04 16:45:163818 explicit HostResolverManagerDnsTest(
3819 base::test::TaskEnvironment::TimeSource time_source =
3820 base::test::TaskEnvironment::TimeSource::SYSTEM_TIME)
3821 : HostResolverManagerTest(time_source),
Eric Orth23935862020-01-10 00:42:243822 notifier_task_runner_(
3823 base::MakeRefCounted<base::TestMockTimeTaskRunner>()),
Eric Orthfe6d5482019-09-03 18:27:573824 dns_client_(nullptr) {
3825 auto config_service = std::make_unique<TestDnsConfigService>();
3826 config_service_ = config_service.get();
3827 notifier_ = std::make_unique<SystemDnsConfigChangeNotifier>(
3828 notifier_task_runner_, std::move(config_service));
3829 }
[email protected]daae1322013-09-05 18:26:503830
[email protected]1d932852012-06-19 19:40:333831 protected:
Miriam Gershenson17acdf092017-08-23 19:43:083832 void TearDown() override {
Eric Orth960e7062019-03-08 18:43:543833 HostResolverManagerTest::TearDown();
Eric Orthfe6d5482019-09-03 18:27:573834 InvalidateDnsConfig();
Eric Orth23935862020-01-10 00:42:243835
3836 // Ensure |notifier_| is fully cleaned up before test shutdown.
3837 notifier_.reset();
3838 notifier_task_runner_->RunUntilIdle();
Miriam Gershenson17acdf092017-08-23 19:43:083839 }
3840
Eric Orth960e7062019-03-08 18:43:543841 // HostResolverManagerTest implementation:
Eric Orth4e55b362019-05-07 22:00:033842 HostResolver::ManagerOptions DefaultOptions() override {
3843 HostResolver::ManagerOptions options =
3844 HostResolverManagerTest::DefaultOptions();
dalykc27699a2019-07-29 20:53:293845 options.insecure_dns_client_enabled = true;
Eric Orth4e55b362019-05-07 22:00:033846 return options;
3847 }
3848
Eric Orth4e55b362019-05-07 22:00:033849 void CreateResolverWithOptionsAndParams(HostResolver::ManagerOptions options,
3850 const ProcTaskParams& params,
3851 bool ipv6_reachable) override {
Eric Orth37b18192019-04-22 19:09:283852 DestroyResolver();
3853
Eric Orth4e55b362019-05-07 22:00:033854 resolver_ = std::make_unique<TestHostResolverManager>(
Eric Orthfe6d5482019-09-03 18:27:573855 options, notifier_.get(), nullptr /* net_log */, ipv6_reachable);
dalykc27699a2019-07-29 20:53:293856 auto dns_client =
3857 std::make_unique<MockDnsClient>(DnsConfig(), CreateDefaultDnsRules());
3858 dns_client_ = dns_client.get();
3859 resolver_->SetDnsClientForTesting(std::move(dns_client));
Eric Orth394db1732019-08-27 20:09:393860 resolver_->SetInsecureDnsClientEnabled(options.insecure_dns_client_enabled);
[email protected]106ccd2c2014-06-17 09:21:003861 resolver_->set_proc_params_for_test(params);
Eric Orth37b18192019-04-22 19:09:283862
Eric Orthaf82b49a2020-02-01 01:48:503863 resolver_->RegisterResolveContext(resolve_context_.get());
[email protected]1d932852012-06-19 19:40:333864 }
3865
Eric Orth828bd3ae2018-12-12 17:30:363866 // Call after CreateResolver() to update the resolver with a new MockDnsClient
3867 // using |config| and |rules|.
3868 void UseMockDnsClient(const DnsConfig& config, MockDnsClientRuleList rules) {
3869 // HostResolver expects DnsConfig to get set after setting DnsClient, so
3870 // create first with an empty config and then update the config.
3871 auto dns_client =
3872 std::make_unique<MockDnsClient>(DnsConfig(), std::move(rules));
3873 dns_client_ = dns_client.get();
Eric Orth4e55b362019-05-07 22:00:033874 resolver_->SetDnsClientForTesting(std::move(dns_client));
dalykc27699a2019-07-29 20:53:293875 resolver_->SetInsecureDnsClientEnabled(true);
Eric Orth828bd3ae2018-12-12 17:30:363876 if (!config.Equals(DnsConfig()))
3877 ChangeDnsConfig(config);
eroman1efc237c2016-12-14 00:00:453878 }
3879
Eric Orth828bd3ae2018-12-12 17:30:363880 static MockDnsClientRuleList CreateDefaultDnsRules() {
3881 MockDnsClientRuleList rules;
3882
3883 AddDnsRule(&rules, "nodomain", dns_protocol::kTypeA,
dalyk48b20a992019-02-25 16:10:263884 MockDnsClientRule::NODOMAIN, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363885 AddDnsRule(&rules, "nodomain", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:263886 MockDnsClientRule::NODOMAIN, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363887 AddDnsRule(&rules, "nx", dns_protocol::kTypeA, MockDnsClientRule::FAIL,
dalyk48b20a992019-02-25 16:10:263888 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363889 AddDnsRule(&rules, "nx", dns_protocol::kTypeAAAA, MockDnsClientRule::FAIL,
dalyk48b20a992019-02-25 16:10:263890 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363891 AddDnsRule(&rules, "ok", dns_protocol::kTypeA, MockDnsClientRule::OK,
dalyk48b20a992019-02-25 16:10:263892 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363893 AddDnsRule(&rules, "ok", dns_protocol::kTypeAAAA, MockDnsClientRule::OK,
dalyk48b20a992019-02-25 16:10:263894 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363895 AddDnsRule(&rules, "4ok", dns_protocol::kTypeA, MockDnsClientRule::OK,
dalyk48b20a992019-02-25 16:10:263896 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363897 AddDnsRule(&rules, "4ok", dns_protocol::kTypeAAAA, MockDnsClientRule::EMPTY,
dalyk48b20a992019-02-25 16:10:263898 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363899 AddDnsRule(&rules, "6ok", dns_protocol::kTypeA, MockDnsClientRule::EMPTY,
dalyk48b20a992019-02-25 16:10:263900 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363901 AddDnsRule(&rules, "6ok", dns_protocol::kTypeAAAA, MockDnsClientRule::OK,
dalyk48b20a992019-02-25 16:10:263902 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363903 AddDnsRule(&rules, "4nx", dns_protocol::kTypeA, MockDnsClientRule::OK,
dalyk48b20a992019-02-25 16:10:263904 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363905 AddDnsRule(&rules, "4nx", dns_protocol::kTypeAAAA, MockDnsClientRule::FAIL,
dalyk48b20a992019-02-25 16:10:263906 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363907 AddDnsRule(&rules, "empty", dns_protocol::kTypeA, MockDnsClientRule::EMPTY,
dalyk48b20a992019-02-25 16:10:263908 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363909 AddDnsRule(&rules, "empty", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:263910 MockDnsClientRule::EMPTY, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363911
3912 AddDnsRule(&rules, "slow_nx", dns_protocol::kTypeA, MockDnsClientRule::FAIL,
dalyk48b20a992019-02-25 16:10:263913 true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363914 AddDnsRule(&rules, "slow_nx", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:263915 MockDnsClientRule::FAIL, true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363916
3917 AddDnsRule(&rules, "4slow_ok", dns_protocol::kTypeA, MockDnsClientRule::OK,
dalyk48b20a992019-02-25 16:10:263918 true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363919 AddDnsRule(&rules, "4slow_ok", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:263920 MockDnsClientRule::OK, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363921 AddDnsRule(&rules, "6slow_ok", dns_protocol::kTypeA, MockDnsClientRule::OK,
dalyk48b20a992019-02-25 16:10:263922 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363923 AddDnsRule(&rules, "6slow_ok", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:263924 MockDnsClientRule::OK, true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363925 AddDnsRule(&rules, "4slow_4ok", dns_protocol::kTypeA, MockDnsClientRule::OK,
dalyk48b20a992019-02-25 16:10:263926 true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363927 AddDnsRule(&rules, "4slow_4ok", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:263928 MockDnsClientRule::EMPTY, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363929 AddDnsRule(&rules, "4slow_4timeout", dns_protocol::kTypeA,
dalyk48b20a992019-02-25 16:10:263930 MockDnsClientRule::TIMEOUT, true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363931 AddDnsRule(&rules, "4slow_4timeout", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:263932 MockDnsClientRule::OK, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363933 AddDnsRule(&rules, "4slow_6timeout", dns_protocol::kTypeA,
dalyk48b20a992019-02-25 16:10:263934 MockDnsClientRule::OK, true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363935 AddDnsRule(&rules, "4slow_6timeout", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:263936 MockDnsClientRule::TIMEOUT, false /* delay */);
3937
Eric Orth828bd3ae2018-12-12 17:30:363938 AddDnsRule(&rules, "4collision", dns_protocol::kTypeA,
dalyk48b20a992019-02-25 16:10:263939 IPAddress(127, 0, 53, 53), false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363940 AddDnsRule(&rules, "4collision", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:263941 MockDnsClientRule::EMPTY, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363942 AddDnsRule(&rules, "6collision", dns_protocol::kTypeA,
dalyk48b20a992019-02-25 16:10:263943 MockDnsClientRule::EMPTY, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363944 // This isn't the expected IP for collisions (but looks close to it).
3945 AddDnsRule(&rules, "6collision", dns_protocol::kTypeAAAA,
3946 IPAddress(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 0, 53, 53),
dalyk48b20a992019-02-25 16:10:263947 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363948
dalyk4f4ac712019-05-31 16:33:133949 AddSecureDnsRule(&rules, "automatic_nodomain", dns_protocol::kTypeA,
3950 MockDnsClientRule::NODOMAIN, false /* delay */);
3951 AddSecureDnsRule(&rules, "automatic_nodomain", dns_protocol::kTypeAAAA,
3952 MockDnsClientRule::NODOMAIN, false /* delay */);
3953 AddDnsRule(&rules, "automatic_nodomain", dns_protocol::kTypeA,
3954 MockDnsClientRule::NODOMAIN, false /* delay */);
3955 AddDnsRule(&rules, "automatic_nodomain", dns_protocol::kTypeAAAA,
3956 MockDnsClientRule::NODOMAIN, false /* delay */);
3957 AddSecureDnsRule(&rules, "automatic", dns_protocol::kTypeA,
3958 MockDnsClientRule::OK, false /* delay */);
3959 AddSecureDnsRule(&rules, "automatic", dns_protocol::kTypeAAAA,
3960 MockDnsClientRule::OK, false /* delay */);
3961 AddDnsRule(&rules, "automatic", dns_protocol::kTypeA, MockDnsClientRule::OK,
3962 false /* delay */);
3963 AddDnsRule(&rules, "automatic", dns_protocol::kTypeAAAA,
3964 MockDnsClientRule::OK, false /* delay */);
3965 AddDnsRule(&rules, "insecure_automatic", dns_protocol::kTypeA,
3966 MockDnsClientRule::OK, false /* delay */);
3967 AddDnsRule(&rules, "insecure_automatic", dns_protocol::kTypeAAAA,
3968 MockDnsClientRule::OK, false /* delay */);
3969
dalykc27699a2019-07-29 20:53:293970 AddSecureDnsRule(&rules, "secure", dns_protocol::kTypeA,
3971 MockDnsClientRule::OK, false /* delay */);
3972 AddSecureDnsRule(&rules, "secure", dns_protocol::kTypeAAAA,
3973 MockDnsClientRule::OK, false /* delay */);
3974
Eric Orth828bd3ae2018-12-12 17:30:363975 return rules;
eroman1efc237c2016-12-14 00:00:453976 }
3977
Eric Orth828bd3ae2018-12-12 17:30:363978 // Adds a rule to |rules|.
3979 static void AddDnsRule(MockDnsClientRuleList* rules,
3980 const std::string& prefix,
3981 uint16_t qtype,
3982 MockDnsClientRule::ResultType result_type,
3983 bool delay) {
dalyk4f4ac712019-05-31 16:33:133984 rules->emplace_back(prefix, qtype, false /* secure */,
dalykad3f6c32019-03-06 13:38:333985 MockDnsClientRule::Result(result_type), delay);
Eric Orth828bd3ae2018-12-12 17:30:363986 }
3987
3988 static void AddDnsRule(MockDnsClientRuleList* rules,
3989 const std::string& prefix,
3990 uint16_t qtype,
3991 const IPAddress& result_ip,
3992 bool delay) {
David Van Cleveac020732019-10-29 00:27:093993 rules->emplace_back(
3994 prefix, qtype, false /* secure */,
3995 MockDnsClientRule::Result(BuildTestDnsResponse(prefix, result_ip)),
3996 delay);
Eric Orth828bd3ae2018-12-12 17:30:363997 }
3998
3999 static void AddDnsRule(MockDnsClientRuleList* rules,
4000 const std::string& prefix,
4001 uint16_t qtype,
4002 IPAddress result_ip,
4003 std::string cannonname,
4004 bool delay) {
David Van Cleveac020732019-10-29 00:27:094005 rules->emplace_back(prefix, qtype, false /* secure */,
4006 MockDnsClientRule::Result(BuildTestDnsResponseWithCname(
4007 prefix, result_ip, std::move(cannonname))),
4008 delay);
[email protected]0adcb2b2012-08-15 21:30:464009 }
4010
dalyk48b20a992019-02-25 16:10:264011 static void AddSecureDnsRule(MockDnsClientRuleList* rules,
4012 const std::string& prefix,
4013 uint16_t qtype,
4014 MockDnsClientRule::ResultType result_type,
4015 bool delay) {
dalyk4f4ac712019-05-31 16:33:134016 rules->emplace_back(prefix, qtype, true /* secure */,
4017 MockDnsClientRule::Result(result_type), delay);
dalyk48b20a992019-02-25 16:10:264018 }
4019
[email protected]1d932852012-06-19 19:40:334020 void ChangeDnsConfig(const DnsConfig& config) {
Eric Orthfe6d5482019-09-03 18:27:574021 DCHECK(config.IsValid());
4022
4023 notifier_task_runner_->PostTask(
4024 FROM_HERE,
4025 base::BindOnce(&TestDnsConfigService::OnHostsRead,
4026 base::Unretained(config_service_), config.hosts));
4027 notifier_task_runner_->PostTask(
4028 FROM_HERE, base::BindOnce(&TestDnsConfigService::OnConfigRead,
4029 base::Unretained(config_service_), config));
4030
Eric Orth23935862020-01-10 00:42:244031 notifier_task_runner_->RunUntilIdle();
4032 base::RunLoop().RunUntilIdle();
Eric Orthfe6d5482019-09-03 18:27:574033 }
4034
4035 void InvalidateDnsConfig() {
4036 notifier_task_runner_->PostTask(
4037 FROM_HERE,
4038 base::BindOnce(&TestDnsConfigService::OnHostsRead,
4039 base::Unretained(config_service_), DnsHosts()));
4040 notifier_task_runner_->PostTask(
4041 FROM_HERE, base::BindOnce(&TestDnsConfigService::InvalidateConfig,
4042 base::Unretained(config_service_)));
4043
Eric Orth23935862020-01-10 00:42:244044 notifier_task_runner_->FastForwardBy(
4045 DnsConfigService::kInvalidationTimeout);
4046 base::RunLoop().RunUntilIdle();
[email protected]1d932852012-06-19 19:40:334047 }
4048
Miriam Gershenson44aafc122017-10-18 19:29:254049 void SetInitialDnsConfig(const DnsConfig& config) {
Eric Orthfe6d5482019-09-03 18:27:574050 InvalidateDnsConfig();
4051 ChangeDnsConfig(config);
Miriam Gershenson44aafc122017-10-18 19:29:254052 }
4053
Eric Orth23935862020-01-10 00:42:244054 scoped_refptr<base::TestMockTimeTaskRunner> notifier_task_runner_;
Eric Orthfe6d5482019-09-03 18:27:574055 TestDnsConfigService* config_service_;
4056 std::unique_ptr<SystemDnsConfigChangeNotifier> notifier_;
4057
[email protected]daae1322013-09-05 18:26:504058 // Owned by |resolver_|.
4059 MockDnsClient* dns_client_;
[email protected]1d932852012-06-19 19:40:334060};
4061
Eric Orthfe6d5482019-09-03 18:27:574062TEST_F(HostResolverManagerDnsTest, FlushCacheOnDnsConfigChange) {
4063 proc_->SignalMultiple(2u); // One before the flush, one after.
4064
4065 // Resolve to populate the cache.
4066 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554067 HostPortPair("host1", 70), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504068 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthfe6d5482019-09-03 18:27:574069 EXPECT_THAT(initial_response.result_error(), IsOk());
4070 EXPECT_EQ(1u, proc_->GetCaptureList().size());
4071
4072 // Result expected to come from the cache.
4073 ResolveHostResponseHelper cached_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554074 HostPortPair("host1", 75), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504075 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthfe6d5482019-09-03 18:27:574076 EXPECT_THAT(cached_response.result_error(), IsOk());
4077 EXPECT_EQ(1u, proc_->GetCaptureList().size()); // No expected increase.
4078
4079 // Flush cache by triggering a DNS config change.
4080 ChangeDnsConfig(CreateValidDnsConfig());
4081
4082 // Expect flushed from cache and therefore served from |proc_|.
4083 ResolveHostResponseHelper flushed_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554084 HostPortPair("host1", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504085 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthfe6d5482019-09-03 18:27:574086 EXPECT_THAT(flushed_response.result_error(), IsOk());
4087 EXPECT_EQ(2u, proc_->GetCaptureList().size()); // Expected increase.
4088}
4089
dalykc27699a2019-07-29 20:53:294090TEST_F(HostResolverManagerDnsTest, DisableAndEnableInsecureDnsClient) {
Eric Orth4e55b362019-05-07 22:00:034091 // Disable fallback to allow testing how requests are initially handled.
4092 set_allow_fallback_to_proctask(false);
4093
4094 ChangeDnsConfig(CreateValidDnsConfig());
4095 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.2.47");
4096 proc_->SignalMultiple(1u);
4097
dalykc27699a2019-07-29 20:53:294098 resolver_->SetInsecureDnsClientEnabled(false);
Eric Orth4e55b362019-05-07 22:00:034099 ResolveHostResponseHelper response_proc(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554100 HostPortPair("nx_succeed", 1212), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:244101 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:504102 resolve_context_->host_cache()));
Eric Orth4e55b362019-05-07 22:00:034103 EXPECT_THAT(response_proc.result_error(), IsOk());
4104 EXPECT_THAT(response_proc.request()->GetAddressResults().value().endpoints(),
4105 testing::ElementsAre(CreateExpected("192.168.2.47", 1212)));
4106
dalykc27699a2019-07-29 20:53:294107 resolver_->SetInsecureDnsClientEnabled(true);
Eric Orth4e55b362019-05-07 22:00:034108 ResolveHostResponseHelper response_dns_client(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554109 HostPortPair("ok_fail", 1212), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504110 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth4e55b362019-05-07 22:00:034111 EXPECT_THAT(response_dns_client.result_error(), IsOk());
4112 EXPECT_THAT(
4113 response_dns_client.request()->GetAddressResults().value().endpoints(),
4114 testing::UnorderedElementsAre(CreateExpected("::1", 1212),
4115 CreateExpected("127.0.0.1", 1212)));
4116}
4117
dalyk6d7d8ead2019-08-15 03:30:084118TEST_F(HostResolverManagerDnsTest, UseProcTaskWhenPrivateDnsActive) {
4119 // Disable fallback to allow testing how requests are initially handled.
4120 set_allow_fallback_to_proctask(false);
4121 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.2.47");
4122 proc_->SignalMultiple(1u);
4123
4124 DnsConfig config = CreateValidDnsConfig();
4125 config.dns_over_tls_active = true;
4126 ChangeDnsConfig(config);
4127 ResolveHostResponseHelper response_proc(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554128 HostPortPair("nx_succeed", 1212), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:244129 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:504130 resolve_context_->host_cache()));
dalyk6d7d8ead2019-08-15 03:30:084131 EXPECT_THAT(response_proc.result_error(), IsOk());
4132 EXPECT_THAT(response_proc.request()->GetAddressResults().value().endpoints(),
4133 testing::ElementsAre(CreateExpected("192.168.2.47", 1212)));
4134}
4135
Mike Westda1c690e2017-08-12 05:57:164136// RFC 6761 localhost names should always resolve to loopback.
Eric Orth960e7062019-03-08 18:43:544137TEST_F(HostResolverManagerDnsTest, LocalhostLookup) {
Mike Westda1c690e2017-08-12 05:57:164138 // Add a rule resolving localhost names to a non-loopback IP and test
4139 // that they still resolves to loopback.
4140 proc_->AddRuleForAllFamilies("foo.localhost", "192.168.1.42");
4141 proc_->AddRuleForAllFamilies("localhost", "192.168.1.42");
4142 proc_->AddRuleForAllFamilies("localhost.", "192.168.1.42");
4143
Eric Orth70992982018-07-24 00:25:004144 ResolveHostResponseHelper response0(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554145 HostPortPair("foo.localhost", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:244146 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:504147 resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:004148 EXPECT_THAT(response0.result_error(), IsOk());
4149 EXPECT_THAT(response0.request()->GetAddressResults().value().endpoints(),
4150 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4151 CreateExpected("::1", 80)));
4152
4153 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554154 HostPortPair("localhost", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504155 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:004156 EXPECT_THAT(response1.result_error(), IsOk());
4157 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
4158 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4159 CreateExpected("::1", 80)));
4160
4161 ResolveHostResponseHelper response2(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554162 HostPortPair("localhost.", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504163 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:004164 EXPECT_THAT(response2.result_error(), IsOk());
4165 EXPECT_THAT(response2.request()->GetAddressResults().value().endpoints(),
4166 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4167 CreateExpected("::1", 80)));
4168}
4169
Mike Westda1c690e2017-08-12 05:57:164170// RFC 6761 localhost names should always resolve to loopback, even if a HOSTS
4171// file is active.
Eric Orth960e7062019-03-08 18:43:544172TEST_F(HostResolverManagerDnsTest, LocalhostLookupWithHosts) {
Mike Westda1c690e2017-08-12 05:57:164173 DnsHosts hosts;
4174 hosts[DnsHostsKey("localhost", ADDRESS_FAMILY_IPV4)] =
4175 IPAddress({192, 168, 1, 1});
4176 hosts[DnsHostsKey("foo.localhost", ADDRESS_FAMILY_IPV4)] =
4177 IPAddress({192, 168, 1, 2});
4178
4179 DnsConfig config = CreateValidDnsConfig();
4180 config.hosts = hosts;
4181 ChangeDnsConfig(config);
4182
Eric Orth70992982018-07-24 00:25:004183 ResolveHostResponseHelper response0(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554184 HostPortPair("localhost", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504185 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:004186 EXPECT_THAT(response0.result_error(), IsOk());
4187 EXPECT_THAT(response0.request()->GetAddressResults().value().endpoints(),
4188 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4189 CreateExpected("::1", 80)));
4190
4191 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554192 HostPortPair("foo.localhost", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:244193 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:504194 resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:004195 EXPECT_THAT(response1.result_error(), IsOk());
4196 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
4197 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4198 CreateExpected("::1", 80)));
4199}
4200
Eric Orth960e7062019-03-08 18:43:544201// Test successful and fallback resolutions in HostResolverManager::DnsTask.
4202TEST_F(HostResolverManagerDnsTest, DnsTask) {
[email protected]38b50d92012-04-19 21:07:524203 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.102");
4204 // All other hostnames will fail in proc_.
[email protected]78eac2a2012-03-14 19:09:274205
4206 // Initially there is no config, so client should not be invoked.
Eric Orth117e1992019-04-17 00:24:154207 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554208 HostPortPair("ok_fail", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504209 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:004210 EXPECT_FALSE(initial_response.complete());
4211
4212 proc_->SignalMultiple(1u);
4213
4214 EXPECT_THAT(initial_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
4215
4216 ChangeDnsConfig(CreateValidDnsConfig());
4217
Eric Orth117e1992019-04-17 00:24:154218 ResolveHostResponseHelper response0(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554219 HostPortPair("ok_fail", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504220 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth117e1992019-04-17 00:24:154221 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554222 HostPortPair("nx_fail", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504223 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:004224 ResolveHostResponseHelper response2(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554225 HostPortPair("nx_succeed", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504226 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:004227
4228 proc_->SignalMultiple(4u);
4229
4230 // Resolved by MockDnsClient.
4231 EXPECT_THAT(response0.result_error(), IsOk());
4232 EXPECT_THAT(response0.request()->GetAddressResults().value().endpoints(),
4233 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4234 CreateExpected("::1", 80)));
4235
4236 // Fallback to ProcTask.
4237 EXPECT_THAT(response1.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
4238 EXPECT_THAT(response2.result_error(), IsOk());
4239 EXPECT_THAT(response2.request()->GetAddressResults().value().endpoints(),
4240 testing::ElementsAre(CreateExpected("192.168.1.102", 80)));
4241}
4242
Eric Orth960e7062019-03-08 18:43:544243// Test successful and failing resolutions in HostResolverManager::DnsTask when
[email protected]16c2bd72013-06-28 01:19:224244// fallback to ProcTask is disabled.
Eric Orth960e7062019-03-08 18:43:544245TEST_F(HostResolverManagerDnsTest, NoFallbackToProcTask) {
Eric Orth60931742018-11-05 23:40:574246 set_allow_fallback_to_proctask(false);
[email protected]16c2bd72013-06-28 01:19:224247
[email protected]16c2bd72013-06-28 01:19:224248 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.102");
4249 // All other hostnames will fail in proc_.
4250
4251 // Set empty DnsConfig.
Eric Orthfe6d5482019-09-03 18:27:574252 InvalidateDnsConfig();
[email protected]16c2bd72013-06-28 01:19:224253 // Initially there is no config, so client should not be invoked.
Eric Orth117e1992019-04-17 00:24:154254 ResolveHostResponseHelper initial_response0(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554255 HostPortPair("ok_fail", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504256 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:004257 ResolveHostResponseHelper initial_response1(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554258 HostPortPair("nx_succeed", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504259 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:004260 proc_->SignalMultiple(2u);
4261
4262 EXPECT_THAT(initial_response0.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
4263 EXPECT_THAT(initial_response1.result_error(), IsOk());
4264 EXPECT_THAT(
4265 initial_response1.request()->GetAddressResults().value().endpoints(),
4266 testing::ElementsAre(CreateExpected("192.168.1.102", 80)));
4267
dalykc27699a2019-07-29 20:53:294268 // Switch to a valid config.
Eric Orth70992982018-07-24 00:25:004269 ChangeDnsConfig(CreateValidDnsConfig());
Eric Orth70992982018-07-24 00:25:004270 // First request is resolved by MockDnsClient, others should fail due to
4271 // disabled fallback to ProcTask.
Eric Orth117e1992019-04-17 00:24:154272 ResolveHostResponseHelper response0(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554273 HostPortPair("ok_fail", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504274 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth117e1992019-04-17 00:24:154275 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554276 HostPortPair("nx_succeed", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504277 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:004278 proc_->SignalMultiple(6u);
4279
Eric Orth70992982018-07-24 00:25:004280 // Resolved by MockDnsClient.
4281 EXPECT_THAT(response0.result_error(), IsOk());
4282 EXPECT_THAT(response0.request()->GetAddressResults().value().endpoints(),
4283 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4284 CreateExpected("::1", 80)));
4285 // Fallback to ProcTask is disabled.
4286 EXPECT_THAT(response1.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
4287}
4288
[email protected]16c2bd72013-06-28 01:19:224289// Test behavior of OnDnsTaskFailure when Job is aborted.
Eric Orth960e7062019-03-08 18:43:544290TEST_F(HostResolverManagerDnsTest, OnDnsTaskFailureAbortedJob) {
[email protected]16c2bd72013-06-28 01:19:224291 ChangeDnsConfig(CreateValidDnsConfig());
Eric Orth117e1992019-04-17 00:24:154292 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554293 HostPortPair("nx_abort", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504294 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:004295 // Abort all jobs here.
4296 CreateResolver();
4297 proc_->SignalMultiple(1u);
4298 // Run to completion.
4299 base::RunLoop().RunUntilIdle(); // Notification happens async.
4300 // It shouldn't crash during OnDnsTaskFailure callbacks.
4301 EXPECT_FALSE(response.complete());
4302
4303 // Repeat test with Fallback to ProcTask disabled
Eric Orth60931742018-11-05 23:40:574304 set_allow_fallback_to_proctask(false);
Eric Orth70992982018-07-24 00:25:004305 ChangeDnsConfig(CreateValidDnsConfig());
Eric Orth117e1992019-04-17 00:24:154306 ResolveHostResponseHelper no_fallback_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554307 HostPortPair("nx_abort", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504308 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:004309 // Abort all jobs here.
4310 CreateResolver();
4311 proc_->SignalMultiple(2u);
4312 // Run to completion.
4313 base::RunLoop().RunUntilIdle(); // Notification happens async.
4314 // It shouldn't crash during OnDnsTaskFailure callbacks.
4315 EXPECT_FALSE(no_fallback_response.complete());
4316}
4317
Eric Orth60931742018-11-05 23:40:574318// Fallback to proc allowed with ANY source.
Eric Orth960e7062019-03-08 18:43:544319TEST_F(HostResolverManagerDnsTest, FallbackBySource_Any) {
Eric Orth60931742018-11-05 23:40:574320 // Ensure fallback is otherwise allowed by resolver settings.
4321 set_allow_fallback_to_proctask(true);
4322
4323 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.102");
4324 // All other hostnames will fail in proc_.
4325
4326 ChangeDnsConfig(CreateValidDnsConfig());
4327
Eric Orth117e1992019-04-17 00:24:154328 ResolveHostResponseHelper response0(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554329 HostPortPair("nx_fail", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504330 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth60931742018-11-05 23:40:574331 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554332 HostPortPair("nx_succeed", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504333 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth60931742018-11-05 23:40:574334 proc_->SignalMultiple(2u);
4335
4336 EXPECT_THAT(response0.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
4337 EXPECT_THAT(response1.result_error(), IsOk());
4338 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
4339 testing::ElementsAre(CreateExpected("192.168.1.102", 80)));
4340}
4341
4342// Fallback to proc not allowed with DNS source.
Eric Orth960e7062019-03-08 18:43:544343TEST_F(HostResolverManagerDnsTest, FallbackBySource_Dns) {
Eric Orth60931742018-11-05 23:40:574344 // Ensure fallback is otherwise allowed by resolver settings.
4345 set_allow_fallback_to_proctask(true);
4346
4347 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.102");
4348 // All other hostnames will fail in proc_.
4349
4350 ChangeDnsConfig(CreateValidDnsConfig());
4351
4352 HostResolver::ResolveHostParameters parameters;
4353 parameters.source = HostResolverSource::DNS;
Eric Orth117e1992019-04-17 00:24:154354 ResolveHostResponseHelper response0(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554355 HostPortPair("nx_fail", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504356 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth60931742018-11-05 23:40:574357 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554358 HostPortPair("nx_succeed", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504359 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth60931742018-11-05 23:40:574360 // Nothing should reach |proc_| on success, but let failures through to fail
4361 // instead of hanging.
4362 proc_->SignalMultiple(2u);
4363
4364 EXPECT_THAT(response0.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
4365 EXPECT_THAT(response1.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
4366}
4367
4368// Fallback to proc on DnsClient change allowed with ANY source.
Eric Orth960e7062019-03-08 18:43:544369TEST_F(HostResolverManagerDnsTest, FallbackOnAbortBySource_Any) {
Eric Orth60931742018-11-05 23:40:574370 // Ensure fallback is otherwise allowed by resolver settings.
4371 set_allow_fallback_to_proctask(true);
4372
4373 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.102");
4374 // All other hostnames will fail in proc_.
4375
4376 ChangeDnsConfig(CreateValidDnsConfig());
4377
Eric Orth117e1992019-04-17 00:24:154378 ResolveHostResponseHelper response0(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554379 HostPortPair("ok_fail", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504380 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth60931742018-11-05 23:40:574381 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554382 HostPortPair("nx_succeed", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504383 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth60931742018-11-05 23:40:574384 proc_->SignalMultiple(2u);
4385
dalykc27699a2019-07-29 20:53:294386 // Simulate the case when the preference or policy has disabled the insecure
4387 // DNS client causing AbortInsecureDnsTasks.
4388 resolver_->SetInsecureDnsClientEnabled(false);
Eric Orth60931742018-11-05 23:40:574389
4390 // All requests should fallback to proc resolver.
4391 EXPECT_THAT(response0.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
4392 EXPECT_THAT(response1.result_error(), IsOk());
4393 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
4394 testing::ElementsAre(CreateExpected("192.168.1.102", 80)));
4395}
4396
4397// Fallback to proc on DnsClient change not allowed with DNS source.
Eric Orth960e7062019-03-08 18:43:544398TEST_F(HostResolverManagerDnsTest, FallbackOnAbortBySource_Dns) {
Eric Orth60931742018-11-05 23:40:574399 // Ensure fallback is otherwise allowed by resolver settings.
4400 set_allow_fallback_to_proctask(true);
4401
4402 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.102");
4403 // All other hostnames will fail in proc_.
4404
4405 ChangeDnsConfig(CreateValidDnsConfig());
4406
4407 HostResolver::ResolveHostParameters parameters;
4408 parameters.source = HostResolverSource::DNS;
Eric Orth117e1992019-04-17 00:24:154409 ResolveHostResponseHelper response0(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554410 HostPortPair("ok_fail", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504411 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth60931742018-11-05 23:40:574412 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554413 HostPortPair("nx_succeed", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504414 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth60931742018-11-05 23:40:574415 // Nothing should reach |proc_| on success, but let failures through to fail
4416 // instead of hanging.
4417 proc_->SignalMultiple(2u);
4418
dalykc27699a2019-07-29 20:53:294419 // Simulate the case when the preference or policy has disabled the insecure
4420 // DNS client causing AbortInsecureDnsTasks.
4421 resolver_->SetInsecureDnsClientEnabled(false);
Eric Orth60931742018-11-05 23:40:574422
4423 // No fallback expected. All requests should fail.
4424 EXPECT_THAT(response0.result_error(), IsError(ERR_NETWORK_CHANGED));
4425 EXPECT_THAT(response1.result_error(), IsError(ERR_NETWORK_CHANGED));
4426}
4427
dalykc27699a2019-07-29 20:53:294428// Insecure DnsClient change shouldn't affect secure DnsTasks.
4429TEST_F(HostResolverManagerDnsTest,
4430 DisableInsecureDnsClient_SecureDnsTasksUnaffected) {
4431 // Ensure fallback is otherwise allowed by resolver settings.
4432 set_allow_fallback_to_proctask(true);
4433
4434 proc_->AddRuleForAllFamilies("automatic", "192.168.1.102");
4435 // All other hostnames will fail in proc_.
4436
4437 ChangeDnsConfig(CreateValidDnsConfig());
4438
4439 HostResolver::ResolveHostParameters secure_parameters;
4440 secure_parameters.secure_dns_mode_override =
4441 DnsConfig::SecureDnsMode::AUTOMATIC;
4442 ResolveHostResponseHelper response_secure(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554443 HostPortPair("automatic", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504444 secure_parameters, resolve_context_.get(),
4445 resolve_context_->host_cache()));
dalykc27699a2019-07-29 20:53:294446 EXPECT_FALSE(response_secure.complete());
4447
4448 // Simulate the case when the preference or policy has disabled the insecure
4449 // DNS client causing AbortInsecureDnsTasks.
4450 resolver_->SetInsecureDnsClientEnabled(false);
4451
4452 EXPECT_THAT(response_secure.result_error(), IsOk());
4453 EXPECT_THAT(
4454 response_secure.request()->GetAddressResults().value().endpoints(),
4455 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4456 CreateExpected("::1", 80)));
4457}
4458
Eric Orth960e7062019-03-08 18:43:544459TEST_F(HostResolverManagerDnsTest, DnsTaskUnspec) {
[email protected]0adcb2b2012-08-15 21:30:464460 ChangeDnsConfig(CreateValidDnsConfig());
4461
4462 proc_->AddRuleForAllFamilies("4nx", "192.168.1.101");
4463 // All other hostnames will fail in proc_.
4464
Eric Orth70992982018-07-24 00:25:004465 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:154466 responses.emplace_back(
4467 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554468 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504469 base::nullopt, resolve_context_.get(),
4470 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:154471 responses.emplace_back(
4472 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554473 HostPortPair("4ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504474 base::nullopt, resolve_context_.get(),
4475 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:154476 responses.emplace_back(
4477 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554478 HostPortPair("6ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504479 base::nullopt, resolve_context_.get(),
4480 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:154481 responses.emplace_back(
4482 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554483 HostPortPair("4nx", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504484 base::nullopt, resolve_context_.get(),
4485 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:004486
4487 proc_->SignalMultiple(4u);
4488
4489 for (auto& response : responses) {
4490 EXPECT_THAT(response->result_error(), IsOk());
4491 }
4492
4493 EXPECT_THAT(responses[0]->request()->GetAddressResults().value().endpoints(),
4494 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4495 CreateExpected("::1", 80)));
4496 EXPECT_THAT(responses[1]->request()->GetAddressResults().value().endpoints(),
4497 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
4498 EXPECT_THAT(responses[2]->request()->GetAddressResults().value().endpoints(),
4499 testing::ElementsAre(CreateExpected("::1", 80)));
4500 EXPECT_THAT(responses[3]->request()->GetAddressResults().value().endpoints(),
4501 testing::ElementsAre(CreateExpected("192.168.1.101", 80)));
4502}
4503
Eric Orth960e7062019-03-08 18:43:544504TEST_F(HostResolverManagerDnsTest, NameCollisionIcann) {
eroman1efc237c2016-12-14 00:00:454505 ChangeDnsConfig(CreateValidDnsConfig());
4506
Eric Orth70992982018-07-24 00:25:004507 // When the resolver returns an A record with 127.0.53.53 it should be
4508 // mapped to a special error.
4509 ResolveHostResponseHelper response_ipv4(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554510 HostPortPair("4collision", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504511 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:004512 EXPECT_THAT(response_ipv4.result_error(), IsError(ERR_ICANN_NAME_COLLISION));
4513 EXPECT_FALSE(response_ipv4.request()->GetAddressResults());
4514
4515 // When the resolver returns an AAAA record with ::127.0.53.53 it should
4516 // work just like any other IP. (Despite having the same suffix, it is not
4517 // considered special)
4518 ResolveHostResponseHelper response_ipv6(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554519 HostPortPair("6collision", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504520 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:004521 EXPECT_THAT(response_ipv6.result_error(), IsOk());
4522 EXPECT_THAT(response_ipv6.request()->GetAddressResults().value().endpoints(),
4523 testing::ElementsAre(CreateExpected("::127.0.53.53", 80)));
4524}
4525
Eric Orth960e7062019-03-08 18:43:544526TEST_F(HostResolverManagerDnsTest, ServeFromHosts) {
[email protected]d7b9a2b2012-05-31 22:31:194527 // Initially, use empty HOSTS file.
[email protected]bb0e34542012-08-31 19:52:404528 DnsConfig config = CreateValidDnsConfig();
4529 ChangeDnsConfig(config);
[email protected]d7b9a2b2012-05-31 22:31:194530
[email protected]007b3f82013-04-09 08:46:454531 proc_->AddRuleForAllFamilies(std::string(),
4532 std::string()); // Default to failures.
[email protected]38b50d92012-04-19 21:07:524533 proc_->SignalMultiple(1u); // For the first request which misses.
[email protected]78eac2a2012-03-14 19:09:274534
Eric Orth117e1992019-04-17 00:24:154535 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554536 HostPortPair("nx_ipv4", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504537 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:004538 EXPECT_THAT(initial_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
4539
4540 IPAddress local_ipv4 = IPAddress::IPv4Localhost();
4541 IPAddress local_ipv6 = IPAddress::IPv6Localhost();
4542
4543 DnsHosts hosts;
4544 hosts[DnsHostsKey("nx_ipv4", ADDRESS_FAMILY_IPV4)] = local_ipv4;
4545 hosts[DnsHostsKey("nx_ipv6", ADDRESS_FAMILY_IPV6)] = local_ipv6;
4546 hosts[DnsHostsKey("nx_both", ADDRESS_FAMILY_IPV4)] = local_ipv4;
4547 hosts[DnsHostsKey("nx_both", ADDRESS_FAMILY_IPV6)] = local_ipv6;
4548
4549 // Update HOSTS file.
4550 config.hosts = hosts;
4551 ChangeDnsConfig(config);
4552
Eric Orth117e1992019-04-17 00:24:154553 ResolveHostResponseHelper response_ipv4(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554554 HostPortPair("nx_ipv4", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504555 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:004556 EXPECT_THAT(response_ipv4.result_error(), IsOk());
4557 EXPECT_THAT(response_ipv4.request()->GetAddressResults().value().endpoints(),
4558 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
4559
Eric Orth117e1992019-04-17 00:24:154560 ResolveHostResponseHelper response_ipv6(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554561 HostPortPair("nx_ipv6", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504562 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:004563 EXPECT_THAT(response_ipv6.result_error(), IsOk());
4564 EXPECT_THAT(response_ipv6.request()->GetAddressResults().value().endpoints(),
4565 testing::ElementsAre(CreateExpected("::1", 80)));
4566
Eric Orth117e1992019-04-17 00:24:154567 ResolveHostResponseHelper response_both(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554568 HostPortPair("nx_both", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504569 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:004570 EXPECT_THAT(response_both.result_error(), IsOk());
4571 EXPECT_THAT(response_both.request()->GetAddressResults().value().endpoints(),
4572 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4573 CreateExpected("::1", 80)));
4574
Eric Orth00fe5a62018-08-15 22:20:004575 // Requests with specified DNS query type.
4576 HostResolver::ResolveHostParameters parameters;
4577
Eric Orth192e3bb2018-11-14 19:30:324578 parameters.dns_query_type = DnsQueryType::A;
Eric Orth117e1992019-04-17 00:24:154579 ResolveHostResponseHelper response_specified_ipv4(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554580 HostPortPair("nx_ipv4", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504581 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth00fe5a62018-08-15 22:20:004582 EXPECT_THAT(response_specified_ipv4.result_error(), IsOk());
4583 EXPECT_THAT(response_specified_ipv4.request()
4584 ->GetAddressResults()
4585 .value()
4586 .endpoints(),
4587 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
4588
Eric Orth192e3bb2018-11-14 19:30:324589 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth117e1992019-04-17 00:24:154590 ResolveHostResponseHelper response_specified_ipv6(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554591 HostPortPair("nx_ipv6", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504592 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth00fe5a62018-08-15 22:20:004593 EXPECT_THAT(response_specified_ipv6.result_error(), IsOk());
4594 EXPECT_THAT(response_specified_ipv6.request()
4595 ->GetAddressResults()
4596 .value()
4597 .endpoints(),
4598 testing::ElementsAre(CreateExpected("::1", 80)));
4599
Eric Orth70992982018-07-24 00:25:004600 // Request with upper case.
Eric Orth117e1992019-04-17 00:24:154601 ResolveHostResponseHelper response_upper(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554602 HostPortPair("nx_IPV4", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504603 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:004604 EXPECT_THAT(response_upper.result_error(), IsOk());
4605 EXPECT_THAT(response_upper.request()->GetAddressResults().value().endpoints(),
4606 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
4607}
4608
dalykc27699a2019-07-29 20:53:294609TEST_F(HostResolverManagerDnsTest, SkipHostsWithUpcomingProcTask) {
4610 // Disable the DnsClient.
4611 resolver_->SetInsecureDnsClientEnabled(false);
4612
4613 proc_->AddRuleForAllFamilies(std::string(),
4614 std::string()); // Default to failures.
4615 proc_->SignalMultiple(1u); // For the first request which misses.
4616
4617 DnsConfig config = CreateValidDnsConfig();
4618 DnsHosts hosts;
4619 hosts[DnsHostsKey("hosts", ADDRESS_FAMILY_IPV4)] = IPAddress::IPv4Localhost();
4620
4621 // Update HOSTS file.
4622 config.hosts = hosts;
4623 ChangeDnsConfig(config);
4624
4625 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554626 HostPortPair("hosts", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504627 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
dalykc27699a2019-07-29 20:53:294628 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
4629}
4630
Eric Orthdc35748e2018-08-23 22:41:484631// Test that hosts ending in ".local" or ".local." are resolved using the system
4632// resolver.
Eric Orth960e7062019-03-08 18:43:544633TEST_F(HostResolverManagerDnsTest, BypassDnsTask) {
Eric Orth70992982018-07-24 00:25:004634 ChangeDnsConfig(CreateValidDnsConfig());
4635
4636 proc_->AddRuleForAllFamilies(std::string(),
4637 std::string()); // Default to failures.
4638
4639 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
4640
Eric Orth117e1992019-04-17 00:24:154641 responses.emplace_back(
4642 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554643 HostPortPair("ok.local", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:244644 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:504645 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:004646 responses.emplace_back(
4647 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554648 HostPortPair("ok.local.", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:244649 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:504650 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:154651 responses.emplace_back(
4652 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554653 HostPortPair("oklocal", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:244654 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:504655 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:154656 responses.emplace_back(
4657 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554658 HostPortPair("oklocal.", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:244659 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:504660 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:154661 responses.emplace_back(
4662 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554663 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504664 base::nullopt, resolve_context_.get(),
4665 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:004666
4667 proc_->SignalMultiple(5u);
4668
4669 for (size_t i = 0; i < 2; ++i)
4670 EXPECT_THAT(responses[i]->result_error(), IsError(ERR_NAME_NOT_RESOLVED));
4671
4672 for (size_t i = 2; i < responses.size(); ++i)
4673 EXPECT_THAT(responses[i]->result_error(), IsOk());
4674}
4675
Eric Orth828bd3ae2018-12-12 17:30:364676#if BUILDFLAG(ENABLE_MDNS)
4677// Test that non-address queries for hosts ending in ".local" are resolved using
4678// the MDNS resolver.
Eric Orth960e7062019-03-08 18:43:544679TEST_F(HostResolverManagerDnsTest, BypassDnsToMdnsWithNonAddress) {
Eric Orth828bd3ae2018-12-12 17:30:364680 // Ensure DNS task and system (proc) requests will fail.
4681 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:134682 rules.emplace_back(
4683 "myhello.local", dns_protocol::kTypeTXT, false /* secure */,
4684 MockDnsClientRule::Result(MockDnsClientRule::FAIL), false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:364685 CreateResolver();
4686 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
4687 proc_->AddRuleForAllFamilies(std::string(), std::string());
4688
4689 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
4690 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
4691 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
4692 // 2 socket creations for every transaction.
4693 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(2);
4694
4695 HostResolver::ResolveHostParameters dns_parameters;
4696 dns_parameters.dns_query_type = DnsQueryType::TXT;
4697
4698 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554699 HostPortPair("myhello.local", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:244700 NetLogWithSource(), dns_parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:504701 resolve_context_->host_cache()));
Eric Orth828bd3ae2018-12-12 17:30:364702
4703 socket_factory_ptr->SimulateReceive(kMdnsResponseTxt,
4704 sizeof(kMdnsResponseTxt));
4705 proc_->SignalMultiple(1u);
4706
4707 EXPECT_THAT(response.result_error(), IsOk());
4708 EXPECT_THAT(response.request()->GetTextResults(),
4709 testing::Optional(testing::ElementsAre("foo", "bar")));
4710}
4711#endif // BUILDFLAG(ENABLE_MDNS)
4712
Eric Orthdc35748e2018-08-23 22:41:484713// Test that DNS task is always used when explicitly requested as the source,
4714// even with a case that would normally bypass it eg hosts ending in ".local".
Eric Orth960e7062019-03-08 18:43:544715TEST_F(HostResolverManagerDnsTest, DnsNotBypassedWhenDnsSource) {
Eric Orthdc35748e2018-08-23 22:41:484716 // Ensure DNS task requests will succeed and system (proc) requests will fail.
4717 ChangeDnsConfig(CreateValidDnsConfig());
4718 proc_->AddRuleForAllFamilies(std::string(), std::string());
4719
4720 HostResolver::ResolveHostParameters dns_parameters;
4721 dns_parameters.source = HostResolverSource::DNS;
4722
Eric Orth117e1992019-04-17 00:24:154723 ResolveHostResponseHelper dns_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554724 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504725 dns_parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth117e1992019-04-17 00:24:154726 ResolveHostResponseHelper dns_local_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554727 HostPortPair("ok.local", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504728 dns_parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth117e1992019-04-17 00:24:154729 ResolveHostResponseHelper normal_local_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554730 HostPortPair("ok.local", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504731 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthdc35748e2018-08-23 22:41:484732
4733 proc_->SignalMultiple(3u);
4734
4735 EXPECT_THAT(dns_response.result_error(), IsOk());
4736 EXPECT_THAT(dns_local_response.result_error(), IsOk());
4737 EXPECT_THAT(normal_local_response.result_error(),
4738 IsError(ERR_NAME_NOT_RESOLVED));
4739}
4740
Eric Orth960e7062019-03-08 18:43:544741TEST_F(HostResolverManagerDnsTest, SystemOnlyBypassesDnsTask) {
Eric Orthdc35748e2018-08-23 22:41:484742 // Ensure DNS task requests will succeed and system (proc) requests will fail.
4743 ChangeDnsConfig(CreateValidDnsConfig());
4744 proc_->AddRuleForAllFamilies(std::string(), std::string());
4745
Eric Orth117e1992019-04-17 00:24:154746 ResolveHostResponseHelper dns_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554747 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504748 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthdc35748e2018-08-23 22:41:484749
4750 HostResolver::ResolveHostParameters parameters;
4751 parameters.source = HostResolverSource::SYSTEM;
Eric Orth117e1992019-04-17 00:24:154752 ResolveHostResponseHelper system_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554753 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504754 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthdc35748e2018-08-23 22:41:484755
4756 proc_->SignalMultiple(2u);
4757
4758 EXPECT_THAT(dns_response.result_error(), IsOk());
4759 EXPECT_THAT(system_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
4760}
4761
dalykc27699a2019-07-29 20:53:294762TEST_F(HostResolverManagerDnsTest,
4763 DisableInsecureDnsClientOnPersistentFailure) {
[email protected]f0f602bd2012-11-15 18:01:024764 ChangeDnsConfig(CreateValidDnsConfig());
4765
[email protected]007b3f82013-04-09 08:46:454766 proc_->AddRuleForAllFamilies(std::string(),
4767 std::string()); // Default to failures.
[email protected]f0f602bd2012-11-15 18:01:024768
4769 // Check that DnsTask works.
Eric Orth117e1992019-04-17 00:24:154770 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554771 HostPortPair("ok_1", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504772 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:004773 EXPECT_THAT(initial_response.result_error(), IsOk());
4774
4775 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
dalykc27699a2019-07-29 20:53:294776 for (unsigned i = 0; i < maximum_insecure_dns_task_failures(); ++i) {
Eric Orth70992982018-07-24 00:25:004777 // Use custom names to require separate Jobs.
4778 std::string hostname = base::StringPrintf("nx_%u", i);
4779 // Ensure fallback to ProcTask succeeds.
4780 proc_->AddRuleForAllFamilies(hostname, "192.168.1.101");
Eric Orth117e1992019-04-17 00:24:154781 responses.emplace_back(
4782 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554783 HostPortPair(hostname, 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:244784 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:504785 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:004786 }
4787
4788 proc_->SignalMultiple(responses.size());
4789
4790 for (size_t i = 0; i < responses.size(); ++i)
4791 EXPECT_THAT(responses[i]->result_error(), IsOk());
4792
4793 ASSERT_FALSE(proc_->HasBlockedRequests());
4794
dalykc27699a2019-07-29 20:53:294795 // Insecure DnsTasks should be disabled by now unless explicitly requested via
4796 // |source|.
Eric Orth117e1992019-04-17 00:24:154797 ResolveHostResponseHelper fail_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554798 HostPortPair("ok_2", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504799 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth60931742018-11-05 23:40:574800 HostResolver::ResolveHostParameters parameters;
4801 parameters.source = HostResolverSource::DNS;
Eric Orth117e1992019-04-17 00:24:154802 ResolveHostResponseHelper dns_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554803 HostPortPair("ok_2", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504804 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth60931742018-11-05 23:40:574805 proc_->SignalMultiple(2u);
Eric Orth70992982018-07-24 00:25:004806 EXPECT_THAT(fail_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
Eric Orth60931742018-11-05 23:40:574807 EXPECT_THAT(dns_response.result_error(), IsOk());
Eric Orth70992982018-07-24 00:25:004808
dalykc27699a2019-07-29 20:53:294809 // Secure DnsTasks should not be affected.
4810 HostResolver::ResolveHostParameters secure_parameters;
4811 secure_parameters.secure_dns_mode_override =
4812 DnsConfig::SecureDnsMode::AUTOMATIC;
4813 ResolveHostResponseHelper secure_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554814 HostPortPair("automatic", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504815 secure_parameters, resolve_context_.get(),
4816 resolve_context_->host_cache()));
dalykc27699a2019-07-29 20:53:294817 EXPECT_THAT(secure_response.result_error(), IsOk());
4818
Eric Orth70992982018-07-24 00:25:004819 // Check that it is re-enabled after DNS change.
4820 ChangeDnsConfig(CreateValidDnsConfig());
Eric Orth117e1992019-04-17 00:24:154821 ResolveHostResponseHelper reenabled_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554822 HostPortPair("ok_3", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504823 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:004824 EXPECT_THAT(reenabled_response.result_error(), IsOk());
4825}
4826
Eric Orth960e7062019-03-08 18:43:544827TEST_F(HostResolverManagerDnsTest, DontDisableDnsClientOnSporadicFailure) {
[email protected]f0f602bd2012-11-15 18:01:024828 ChangeDnsConfig(CreateValidDnsConfig());
4829
4830 // |proc_| defaults to successes.
4831
4832 // 20 failures interleaved with 20 successes.
Eric Orth70992982018-07-24 00:25:004833 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
4834 for (unsigned i = 0; i < 40; ++i) {
4835 // Use custom names to require separate Jobs.
4836 std::string hostname = (i % 2) == 0 ? base::StringPrintf("nx_%u", i)
4837 : base::StringPrintf("ok_%u", i);
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(hostname, 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:244841 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:504842 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:004843 }
4844
4845 proc_->SignalMultiple(40u);
4846
Eric Orth26fa08e2019-02-22 01:28:374847 for (const auto& response : responses)
4848 EXPECT_THAT(response->result_error(), IsOk());
Eric Orth70992982018-07-24 00:25:004849
4850 // Make |proc_| default to failures.
4851 proc_->AddRuleForAllFamilies(std::string(), std::string());
4852
4853 // DnsTask should still be enabled.
Eric Orth117e1992019-04-17 00:24:154854 ResolveHostResponseHelper final_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554855 HostPortPair("ok_last", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504856 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:004857 EXPECT_THAT(final_response.result_error(), IsOk());
4858}
4859
Eric Orth394db1732019-08-27 20:09:394860TEST_F(HostResolverManagerDnsTest, Ipv6Unreachable) {
4861 CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_.get()),
4862 false /* ipv6_reachable */,
4863 true /* check_ipv6_on_wifi */);
4864 ChangeDnsConfig(CreateValidDnsConfig());
4865
4866 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554867 HostPortPair("ok", 500), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504868 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth394db1732019-08-27 20:09:394869 EXPECT_THAT(response.result_error(), IsOk());
4870
4871 // Only expect IPv4 results.
4872 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
4873 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 500)));
4874}
4875
4876// Without a valid DnsConfig, assume IPv6 is needed and ignore prober.
4877TEST_F(HostResolverManagerDnsTest, Ipv6Unreachable_InvalidConfig) {
4878 CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_.get()),
4879 false /* ipv6_reachable */,
4880 true /* check_ipv6_on_wifi */);
4881
4882 proc_->AddRule("example.com", ADDRESS_FAMILY_UNSPECIFIED, "1.2.3.4,::5");
4883 proc_->SignalMultiple(1u);
4884
4885 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554886 HostPortPair("example.com", 500), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:244887 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:504888 resolve_context_->host_cache()));
Eric Orth394db1732019-08-27 20:09:394889 EXPECT_THAT(response.result_error(), IsOk());
4890 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
4891 testing::UnorderedElementsAre(CreateExpected("1.2.3.4", 500),
4892 CreateExpected("::5", 500)));
4893}
4894
4895TEST_F(HostResolverManagerDnsTest, Ipv6Unreachable_UseLocalIpv6) {
4896 CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_.get()),
4897 false /* ipv6_reachable */,
4898 true /* check_ipv6_on_wifi */);
4899
4900 DnsConfig config = CreateValidDnsConfig();
4901 config.use_local_ipv6 = true;
4902 ChangeDnsConfig(config);
4903
4904 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554905 HostPortPair("ok", 500), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504906 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth394db1732019-08-27 20:09:394907 EXPECT_THAT(response1.result_error(), IsOk());
4908 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
4909 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 500),
4910 CreateExpected("::1", 500)));
4911
4912 // Set |use_local_ipv6| to false. Expect only IPv4 results.
4913 config.use_local_ipv6 = false;
4914 ChangeDnsConfig(config);
4915
4916 ResolveHostResponseHelper response2(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554917 HostPortPair("ok", 500), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504918 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth394db1732019-08-27 20:09:394919 EXPECT_THAT(response2.result_error(), IsOk());
4920 EXPECT_THAT(response2.request()->GetAddressResults().value().endpoints(),
4921 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 500)));
4922}
4923
[email protected]ec666ab22013-04-17 20:05:594924// Confirm that resolving "localhost" is unrestricted even if there are no
4925// global IPv6 address. See SystemHostResolverCall for rationale.
4926// Test both the DnsClient and system host resolver paths.
Eric Orth394db1732019-08-27 20:09:394927TEST_F(HostResolverManagerDnsTest, Ipv6Unreachable_Localhost) {
Eric Orth70992982018-07-24 00:25:004928 CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:324929 false /* ipv6_reachable */,
4930 true /* check_ipv6_on_wifi */);
Eric Orth70992982018-07-24 00:25:004931
4932 // Make request fail if we actually get to the system resolver.
4933 proc_->AddRuleForAllFamilies(std::string(), std::string());
4934
4935 // Try without DnsClient.
dalykc27699a2019-07-29 20:53:294936 resolver_->SetInsecureDnsClientEnabled(false);
Eric Orth70992982018-07-24 00:25:004937 ResolveHostResponseHelper system_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554938 HostPortPair("localhost", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504939 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:004940 EXPECT_THAT(system_response.result_error(), IsOk());
4941 EXPECT_THAT(
4942 system_response.request()->GetAddressResults().value().endpoints(),
4943 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4944 CreateExpected("::1", 80)));
4945
4946 // With DnsClient
Eric Orth828bd3ae2018-12-12 17:30:364947 UseMockDnsClient(CreateValidDnsConfig(), CreateDefaultDnsRules());
Eric Orth70992982018-07-24 00:25:004948 ResolveHostResponseHelper builtin_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554949 HostPortPair("localhost", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504950 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:004951 EXPECT_THAT(builtin_response.result_error(), IsOk());
4952 EXPECT_THAT(
4953 builtin_response.request()->GetAddressResults().value().endpoints(),
4954 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4955 CreateExpected("::1", 80)));
4956
4957 // DnsClient configured without ipv6 (but ipv6 should still work for
4958 // localhost).
4959 DnsConfig config = CreateValidDnsConfig();
4960 config.use_local_ipv6 = false;
4961 ChangeDnsConfig(config);
4962 ResolveHostResponseHelper ipv6_disabled_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554963 HostPortPair("localhost", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504964 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:004965 EXPECT_THAT(ipv6_disabled_response.result_error(), IsOk());
4966 EXPECT_THAT(
4967 ipv6_disabled_response.request()->GetAddressResults().value().endpoints(),
4968 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4969 CreateExpected("::1", 80)));
4970}
4971
dalykc27699a2019-07-29 20:53:294972TEST_F(HostResolverManagerDnsTest, SeparateJobsBySecureDnsMode) {
4973 MockDnsClientRuleList rules;
4974 rules.emplace_back("a", dns_protocol::kTypeA, true /* secure */,
4975 MockDnsClientRule::Result(MockDnsClientRule::FAIL),
4976 true /* delay */);
4977 rules.emplace_back("a", dns_protocol::kTypeAAAA, true /* secure */,
4978 MockDnsClientRule::Result(MockDnsClientRule::FAIL),
4979 true /* delay */);
4980 rules.emplace_back("a", dns_protocol::kTypeA, false /* secure */,
4981 MockDnsClientRule::Result(MockDnsClientRule::OK),
4982 false /* delay */);
4983 rules.emplace_back("a", dns_protocol::kTypeAAAA, false /* secure */,
4984 MockDnsClientRule::Result(MockDnsClientRule::OK),
4985 false /* delay */);
4986 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
4987 DnsConfigOverrides overrides;
4988 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
4989 resolver_->SetDnsConfigOverrides(overrides);
4990
4991 // Create three requests. One with a SECURE mode override, one with no
4992 // mode override, and one with an AUTOMATIC mode override (which is a no-op
4993 // since the DnsConfig uses AUTOMATIC).
4994 HostResolver::ResolveHostParameters parameters_secure_override;
4995 parameters_secure_override.secure_dns_mode_override =
4996 DnsConfig::SecureDnsMode::SECURE;
4997 ResolveHostResponseHelper secure_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554998 HostPortPair("a", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:504999 parameters_secure_override, resolve_context_.get(),
5000 resolve_context_->host_cache()));
dalykc27699a2019-07-29 20:53:295001 EXPECT_EQ(1u, resolver_->num_jobs_for_testing());
5002
5003 ResolveHostResponseHelper automatic_response0(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555004 HostPortPair("a", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:505005 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
dalykc27699a2019-07-29 20:53:295006 EXPECT_EQ(2u, resolver_->num_jobs_for_testing());
5007
5008 HostResolver::ResolveHostParameters parameters_automatic_override;
5009 parameters_automatic_override.secure_dns_mode_override =
5010 DnsConfig::SecureDnsMode::AUTOMATIC;
5011 ResolveHostResponseHelper automatic_response1(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555012 HostPortPair("a", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orth069a3c6e2020-01-31 23:14:245013 parameters_automatic_override, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:505014 resolve_context_->host_cache()));
dalykc27699a2019-07-29 20:53:295015 // The AUTOMATIC mode requests should be joined into the same job.
5016 EXPECT_EQ(2u, resolver_->num_jobs_for_testing());
5017
5018 // All requests should be blocked on the secure transactions.
5019 base::RunLoop().RunUntilIdle();
5020 EXPECT_FALSE(secure_response.complete());
5021 EXPECT_FALSE(automatic_response0.complete());
5022 EXPECT_FALSE(automatic_response1.complete());
5023
5024 // Complete secure transactions.
5025 dns_client_->CompleteDelayedTransactions();
5026 EXPECT_THAT(secure_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
5027 EXPECT_THAT(automatic_response0.result_error(), IsOk());
5028 EXPECT_THAT(automatic_response1.result_error(), IsOk());
5029}
5030
[email protected]daae1322013-09-05 18:26:505031// Cancel a request with a single DNS transaction active.
Eric Orth960e7062019-03-08 18:43:545032TEST_F(HostResolverManagerDnsTest, CancelWithOneTransactionActive) {
Eric Orth70992982018-07-24 00:25:005033 // Disable ipv6 to ensure we'll only try a single transaction for the host.
5034 CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:325035 false /* ipv6_reachable */,
5036 true /* check_ipv6_on_wifi */);
Eric Orth70992982018-07-24 00:25:005037 DnsConfig config = CreateValidDnsConfig();
5038 config.use_local_ipv6 = false;
5039 ChangeDnsConfig(config);
5040
Eric Orth117e1992019-04-17 00:24:155041 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555042 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:505043 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:005044 ASSERT_FALSE(response.complete());
5045 ASSERT_EQ(1u, num_running_dispatcher_jobs());
5046
5047 response.CancelRequest();
5048 base::RunLoop().RunUntilIdle();
5049 EXPECT_FALSE(response.complete());
5050
5051 // Dispatcher state checked in TearDown.
5052}
5053
[email protected]daae1322013-09-05 18:26:505054// Cancel a request with a single DNS transaction active and another pending.
Eric Orth960e7062019-03-08 18:43:545055TEST_F(HostResolverManagerDnsTest, CancelWithOneTransactionActiveOnePending) {
[email protected]daae1322013-09-05 18:26:505056 CreateSerialResolver();
[email protected]daae1322013-09-05 18:26:505057 ChangeDnsConfig(CreateValidDnsConfig());
5058
Eric Orth117e1992019-04-17 00:24:155059 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555060 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:505061 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:005062 EXPECT_EQ(1u, num_running_dispatcher_jobs());
5063
5064 response.CancelRequest();
5065 base::RunLoop().RunUntilIdle();
5066 EXPECT_FALSE(response.complete());
5067
5068 // Dispatcher state checked in TearDown.
5069}
5070
[email protected]daae1322013-09-05 18:26:505071// Cancel a request with two DNS transactions active.
Eric Orth960e7062019-03-08 18:43:545072TEST_F(HostResolverManagerDnsTest, CancelWithTwoTransactionsActive) {
[email protected]daae1322013-09-05 18:26:505073 ChangeDnsConfig(CreateValidDnsConfig());
5074
Eric Orth117e1992019-04-17 00:24:155075 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555076 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:505077 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:005078 EXPECT_EQ(2u, num_running_dispatcher_jobs());
5079
5080 response.CancelRequest();
5081 base::RunLoop().RunUntilIdle();
5082 EXPECT_FALSE(response.complete());
5083
5084 // Dispatcher state checked in TearDown.
5085}
5086
[email protected]daae1322013-09-05 18:26:505087// Delete a resolver with some active requests and some queued requests.
Eric Orth960e7062019-03-08 18:43:545088TEST_F(HostResolverManagerDnsTest, DeleteWithActiveTransactions) {
[email protected]daae1322013-09-05 18:26:505089 // At most 10 Jobs active at once.
Eric Orth70992982018-07-24 00:25:005090 CreateResolverWithLimitsAndParams(10u, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:325091 true /* ipv6_reachable */,
5092 true /* check_ipv6_on_wifi */);
[email protected]daae1322013-09-05 18:26:505093
[email protected]daae1322013-09-05 18:26:505094 ChangeDnsConfig(CreateValidDnsConfig());
5095
Eric Orth70992982018-07-24 00:25:005096 // Add 12 DNS lookups (creating well more than 10 transaction).
5097 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
5098 for (int i = 0; i < 12; ++i) {
5099 std::string hostname = base::StringPrintf("ok%i", i);
Eric Orth117e1992019-04-17 00:24:155100 responses.emplace_back(
5101 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555102 HostPortPair(hostname, 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:245103 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:505104 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:005105 }
5106 EXPECT_EQ(10u, num_running_dispatcher_jobs());
5107
Eric Orth37b18192019-04-22 19:09:285108 DestroyResolver();
Eric Orth70992982018-07-24 00:25:005109
5110 base::RunLoop().RunUntilIdle();
5111 for (auto& response : responses) {
5112 EXPECT_FALSE(response->complete());
5113 }
5114}
5115
dalykc682ba3c2019-08-21 17:16:235116TEST_F(HostResolverManagerDnsTest, DeleteWithSecureTransactions) {
5117 ChangeDnsConfig(CreateValidDnsConfig());
5118 DnsConfigOverrides overrides;
5119 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::SECURE;
5120 resolver_->SetDnsConfigOverrides(overrides);
5121
5122 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555123 HostPortPair("secure", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:505124 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
dalykc682ba3c2019-08-21 17:16:235125
5126 DestroyResolver();
5127
5128 base::RunLoop().RunUntilIdle();
5129 EXPECT_FALSE(response.complete());
5130}
5131
Eric Orth5233c3a2019-04-08 17:01:145132TEST_F(HostResolverManagerDnsTest, DeleteWithCompletedRequests) {
5133 ChangeDnsConfig(CreateValidDnsConfig());
5134
Eric Orth117e1992019-04-17 00:24:155135 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555136 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:505137 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth5233c3a2019-04-08 17:01:145138
5139 EXPECT_THAT(response.result_error(), IsOk());
5140 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
5141 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
5142 CreateExpected("::1", 80)));
5143
Eric Orth37b18192019-04-22 19:09:285144 DestroyResolver();
Eric Orth5233c3a2019-04-08 17:01:145145
5146 // Completed requests should be unaffected by manager destruction.
5147 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
5148 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
5149 CreateExpected("::1", 80)));
5150}
5151
5152TEST_F(HostResolverManagerDnsTest, ExplicitCancel) {
5153 ChangeDnsConfig(CreateValidDnsConfig());
5154
5155 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555156 HostPortPair("4slow_4ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:505157 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth5233c3a2019-04-08 17:01:145158
5159 response.request()->Cancel();
5160 dns_client_->CompleteDelayedTransactions();
5161
5162 base::RunLoop().RunUntilIdle();
5163 EXPECT_FALSE(response.complete());
5164}
5165
Eric Orth314e8b42019-11-12 00:32:215166TEST_F(HostResolverManagerDnsTest, ExplicitCancel_AfterManagerDestruction) {
5167 ChangeDnsConfig(CreateValidDnsConfig());
5168
5169 ResolveHostResponseHelper response(resolver_->CreateRequest(
5170 HostPortPair("4slow_4ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:505171 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth314e8b42019-11-12 00:32:215172
5173 DestroyResolver();
5174 response.request()->Cancel();
5175}
5176
Eric Orth5233c3a2019-04-08 17:01:145177TEST_F(HostResolverManagerDnsTest, ExplicitCancel_Completed) {
5178 ChangeDnsConfig(CreateValidDnsConfig());
5179
Eric Orth117e1992019-04-17 00:24:155180 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555181 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:505182 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth5233c3a2019-04-08 17:01:145183
5184 EXPECT_THAT(response.result_error(), IsOk());
5185 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
5186 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
5187 CreateExpected("::1", 80)));
5188
5189 response.request()->Cancel();
5190
5191 // Completed requests should be unaffected by cancellation.
5192 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
5193 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
5194 CreateExpected("::1", 80)));
5195}
5196
[email protected]daae1322013-09-05 18:26:505197// Cancel a request with only the IPv6 transaction active.
Eric Orth960e7062019-03-08 18:43:545198TEST_F(HostResolverManagerDnsTest, CancelWithIPv6TransactionActive) {
[email protected]daae1322013-09-05 18:26:505199 ChangeDnsConfig(CreateValidDnsConfig());
5200
Eric Orth117e1992019-04-17 00:24:155201 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555202 HostPortPair("6slow_ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:505203 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:005204 EXPECT_EQ(2u, num_running_dispatcher_jobs());
5205
5206 // The IPv4 request should complete, the IPv6 request is still pending.
5207 base::RunLoop().RunUntilIdle();
5208 EXPECT_EQ(1u, num_running_dispatcher_jobs());
5209
5210 response.CancelRequest();
5211 base::RunLoop().RunUntilIdle();
5212 EXPECT_FALSE(response.complete());
5213
5214 // Dispatcher state checked in TearDown.
5215}
5216
[email protected]daae1322013-09-05 18:26:505217// Cancel a request with only the IPv4 transaction pending.
Eric Orth960e7062019-03-08 18:43:545218TEST_F(HostResolverManagerDnsTest, CancelWithIPv4TransactionPending) {
Eric Orth60931742018-11-05 23:40:575219 set_allow_fallback_to_proctask(false);
[email protected]daae1322013-09-05 18:26:505220 ChangeDnsConfig(CreateValidDnsConfig());
5221
Eric Orth117e1992019-04-17 00:24:155222 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555223 HostPortPair("4slow_ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:505224 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:005225 EXPECT_EQ(2u, num_running_dispatcher_jobs());
5226
5227 // The IPv6 request should complete, the IPv4 request is still pending.
5228 base::RunLoop().RunUntilIdle();
5229 EXPECT_EQ(1u, num_running_dispatcher_jobs());
5230
5231 response.CancelRequest();
5232 base::RunLoop().RunUntilIdle();
5233 EXPECT_FALSE(response.complete());
5234}
5235
dalyk4f4ac712019-05-31 16:33:135236TEST_F(HostResolverManagerDnsTest, CancelWithAutomaticModeTransactionPending) {
5237 MockDnsClientRuleList rules;
5238 rules.emplace_back("secure_6slow_6nx_insecure_6slow_ok", dns_protocol::kTypeA,
5239 true /* secure */,
5240 MockDnsClientRule::Result(MockDnsClientRule::OK),
5241 false /* delay */);
5242 rules.emplace_back("secure_6slow_6nx_insecure_6slow_ok",
5243 dns_protocol::kTypeAAAA, true /* secure */,
5244 MockDnsClientRule::Result(MockDnsClientRule::FAIL),
5245 true /* delay */);
5246 rules.emplace_back("secure_6slow_6nx_insecure_6slow_ok", dns_protocol::kTypeA,
5247 false /* secure */,
5248 MockDnsClientRule::Result(MockDnsClientRule::OK),
5249 false /* delay */);
5250 rules.emplace_back("secure_6slow_6nx_insecure_6slow_ok",
5251 dns_protocol::kTypeAAAA, false /* secure */,
5252 MockDnsClientRule::Result(MockDnsClientRule::OK),
5253 true /* delay */);
5254 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
5255
5256 DnsConfigOverrides overrides;
5257 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
5258 resolver_->SetDnsConfigOverrides(overrides);
5259
5260 ResolveHostResponseHelper response0(resolver_->CreateRequest(
5261 HostPortPair("secure_6slow_6nx_insecure_6slow_ok", 80),
Matt Menkef4023312019-11-01 18:24:555262 NetworkIsolationKey(), NetLogWithSource(), base::nullopt,
Eric Orthaf82b49a2020-02-01 01:48:505263 resolve_context_.get(), resolve_context_->host_cache()));
dalykc682ba3c2019-08-21 17:16:235264 EXPECT_EQ(0u, num_running_dispatcher_jobs());
dalyk4f4ac712019-05-31 16:33:135265
5266 // The secure IPv4 request should complete, the secure IPv6 request is still
5267 // pending.
5268 base::RunLoop().RunUntilIdle();
dalykc682ba3c2019-08-21 17:16:235269 EXPECT_EQ(0u, num_running_dispatcher_jobs());
dalyk4f4ac712019-05-31 16:33:135270
5271 response0.CancelRequest();
5272 base::RunLoop().RunUntilIdle();
5273 EXPECT_FALSE(response0.complete());
5274 EXPECT_EQ(0u, num_running_dispatcher_jobs());
5275
5276 ResolveHostResponseHelper response1(resolver_->CreateRequest(
5277 HostPortPair("secure_6slow_6nx_insecure_6slow_ok", 80),
Matt Menkef4023312019-11-01 18:24:555278 NetworkIsolationKey(), NetLogWithSource(), base::nullopt,
Eric Orthaf82b49a2020-02-01 01:48:505279 resolve_context_.get(), resolve_context_->host_cache()));
dalykc682ba3c2019-08-21 17:16:235280 EXPECT_EQ(0u, num_running_dispatcher_jobs());
dalyk4f4ac712019-05-31 16:33:135281
5282 // The secure IPv4 request should complete, the secure IPv6 request is still
5283 // pending.
5284 base::RunLoop().RunUntilIdle();
dalykc682ba3c2019-08-21 17:16:235285 EXPECT_EQ(0u, num_running_dispatcher_jobs());
dalyk4f4ac712019-05-31 16:33:135286
5287 // Let the secure IPv6 request complete and start the insecure requests.
5288 dns_client_->CompleteDelayedTransactions();
5289 EXPECT_EQ(2u, num_running_dispatcher_jobs());
5290
5291 // The insecure IPv4 request should complete, the insecure IPv6 request is
5292 // still pending.
5293 base::RunLoop().RunUntilIdle();
5294 EXPECT_EQ(1u, num_running_dispatcher_jobs());
5295
5296 response1.CancelRequest();
5297 base::RunLoop().RunUntilIdle();
5298 EXPECT_FALSE(response1.complete());
5299
5300 // Dispatcher state checked in TearDown.
5301}
5302
[email protected]daae1322013-09-05 18:26:505303// Test cases where AAAA completes first.
Eric Orth960e7062019-03-08 18:43:545304TEST_F(HostResolverManagerDnsTest, AAAACompletesFirst) {
Eric Orth60931742018-11-05 23:40:575305 set_allow_fallback_to_proctask(false);
[email protected]daae1322013-09-05 18:26:505306 ChangeDnsConfig(CreateValidDnsConfig());
5307
Eric Orth70992982018-07-24 00:25:005308 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:155309 responses.emplace_back(
5310 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555311 HostPortPair("4slow_ok", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:245312 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:505313 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:005314 responses.emplace_back(
5315 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555316 HostPortPair("4slow_4ok", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:245317 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:505318 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:005319 responses.emplace_back(
5320 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555321 HostPortPair("4slow_4timeout", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:245322 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:505323 resolve_context_->host_cache())));
Eric Orth6f1c5172019-04-16 17:08:275324 responses.emplace_back(
5325 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555326 HostPortPair("4slow_6timeout", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:245327 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:505328 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:005329
5330 base::RunLoop().RunUntilIdle();
5331 EXPECT_FALSE(responses[0]->complete());
5332 EXPECT_FALSE(responses[1]->complete());
5333 EXPECT_FALSE(responses[2]->complete());
5334 // The IPv6 of request 3 should have failed and resulted in cancelling the
5335 // IPv4 request.
5336 EXPECT_THAT(responses[3]->result_error(), IsError(ERR_DNS_TIMED_OUT));
5337 EXPECT_EQ(3u, num_running_dispatcher_jobs());
5338
5339 dns_client_->CompleteDelayedTransactions();
5340 EXPECT_THAT(responses[0]->result_error(), IsOk());
5341 EXPECT_THAT(responses[0]->request()->GetAddressResults().value().endpoints(),
5342 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
5343 CreateExpected("::1", 80)));
5344
5345 EXPECT_THAT(responses[1]->result_error(), IsOk());
5346 EXPECT_THAT(responses[1]->request()->GetAddressResults().value().endpoints(),
5347 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
5348
5349 EXPECT_THAT(responses[2]->result_error(), IsError(ERR_DNS_TIMED_OUT));
5350}
5351
dalyk4f4ac712019-05-31 16:33:135352TEST_F(HostResolverManagerDnsTest, AAAACompletesFirst_AutomaticMode) {
dalyk48b20a992019-02-25 16:10:265353 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:135354 rules.emplace_back("secure_slow_nx_insecure_4slow_ok", dns_protocol::kTypeA,
5355 true /* secure */,
5356 MockDnsClientRule::Result(MockDnsClientRule::FAIL),
5357 true /* delay */);
5358 rules.emplace_back("secure_slow_nx_insecure_4slow_ok",
5359 dns_protocol::kTypeAAAA, true /* secure */,
5360 MockDnsClientRule::Result(MockDnsClientRule::FAIL),
5361 true /* delay */);
5362 rules.emplace_back("secure_slow_nx_insecure_4slow_ok", dns_protocol::kTypeA,
5363 false /* secure */,
5364 MockDnsClientRule::Result(MockDnsClientRule::OK),
5365 true /* delay */);
5366 rules.emplace_back("secure_slow_nx_insecure_4slow_ok",
5367 dns_protocol::kTypeAAAA, false /* secure */,
5368 MockDnsClientRule::Result(MockDnsClientRule::EMPTY),
5369 false /* delay */);
dalyk48b20a992019-02-25 16:10:265370 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
dalyk4f4ac712019-05-31 16:33:135371 DnsConfigOverrides overrides;
5372 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
5373 resolver_->SetDnsConfigOverrides(overrides);
dalyk48b20a992019-02-25 16:10:265374
dalyk4f4ac712019-05-31 16:33:135375 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555376 HostPortPair("secure_slow_nx_insecure_4slow_ok", 80),
5377 NetworkIsolationKey(), NetLogWithSource(), base::nullopt,
Eric Orthaf82b49a2020-02-01 01:48:505378 resolve_context_.get(), resolve_context_->host_cache()));
dalyk48b20a992019-02-25 16:10:265379 base::RunLoop().RunUntilIdle();
dalyk4f4ac712019-05-31 16:33:135380 EXPECT_FALSE(response.complete());
5381 // Complete the secure transactions.
dalyk48b20a992019-02-25 16:10:265382 dns_client_->CompleteDelayedTransactions();
dalyk4f4ac712019-05-31 16:33:135383 base::RunLoop().RunUntilIdle();
5384 EXPECT_FALSE(response.complete());
5385 // Complete the insecure transactions.
5386 dns_client_->CompleteDelayedTransactions();
5387 ASSERT_THAT(response.result_error(), IsOk());
5388 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
5389 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
Matt Menke7b4a32f2019-10-25 22:13:465390 HostCache::Key insecure_key =
5391 HostCache::Key("secure_slow_nx_insecure_4slow_ok",
5392 DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
5393 HostResolverSource::ANY, NetworkIsolationKey());
dalyk4f4ac712019-05-31 16:33:135394 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result =
5395 GetCacheHit(insecure_key);
5396 EXPECT_TRUE(!!cache_result);
5397}
5398
5399TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Automatic) {
5400 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.100");
5401 set_allow_fallback_to_proctask(true);
5402
5403 ChangeDnsConfig(CreateValidDnsConfig());
5404 DnsConfigOverrides overrides;
5405 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
5406 resolver_->SetDnsConfigOverrides(overrides);
dalyk48b20a992019-02-25 16:10:265407 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result;
5408
dalyk4f4ac712019-05-31 16:33:135409 // A successful DoH request should result in a secure cache entry.
5410 ResolveHostResponseHelper response_secure(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555411 HostPortPair("automatic", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:505412 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
dalyk4f4ac712019-05-31 16:33:135413 ASSERT_THAT(response_secure.result_error(), IsOk());
dalyk59cba642020-01-02 21:39:265414 EXPECT_FALSE(
5415 response_secure.request()->GetResolveErrorInfo().is_secure_network_error);
dalyk4f4ac712019-05-31 16:33:135416 EXPECT_THAT(
5417 response_secure.request()->GetAddressResults().value().endpoints(),
5418 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
5419 CreateExpected("::1", 80)));
Matt Menke7b4a32f2019-10-25 22:13:465420 HostCache::Key secure_key = HostCache::Key(
5421 "automatic", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
5422 HostResolverSource::ANY, NetworkIsolationKey());
dalyk4f4ac712019-05-31 16:33:135423 secure_key.secure = true;
5424 cache_result = GetCacheHit(secure_key);
5425 EXPECT_TRUE(!!cache_result);
5426
5427 // A successful plaintext DNS request should result in an insecure cache
5428 // entry.
5429 ResolveHostResponseHelper response_insecure(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555430 HostPortPair("insecure_automatic", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:245431 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:505432 resolve_context_->host_cache()));
dalyk4f4ac712019-05-31 16:33:135433 ASSERT_THAT(response_insecure.result_error(), IsOk());
dalyk59cba642020-01-02 21:39:265434 EXPECT_FALSE(response_insecure.request()
5435 ->GetResolveErrorInfo()
5436 .is_secure_network_error);
dalyk4f4ac712019-05-31 16:33:135437 EXPECT_THAT(
5438 response_insecure.request()->GetAddressResults().value().endpoints(),
5439 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
5440 CreateExpected("::1", 80)));
5441 HostCache::Key insecure_key =
5442 HostCache::Key("insecure_automatic", DnsQueryType::UNSPECIFIED,
Matt Menke7b4a32f2019-10-25 22:13:465443 0 /* host_resolver_flags */, HostResolverSource::ANY,
5444 NetworkIsolationKey());
dalyk4f4ac712019-05-31 16:33:135445 cache_result = GetCacheHit(insecure_key);
5446 EXPECT_TRUE(!!cache_result);
5447
5448 // Fallback to ProcTask allowed in AUTOMATIC mode.
5449 ResolveHostResponseHelper response_proc(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555450 HostPortPair("nx_succeed", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:505451 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
dalyk4f4ac712019-05-31 16:33:135452 proc_->SignalMultiple(1u);
5453 EXPECT_THAT(response_proc.result_error(), IsOk());
5454 EXPECT_THAT(response_proc.request()->GetAddressResults().value().endpoints(),
5455 testing::ElementsAre(CreateExpected("192.168.1.100", 80)));
5456}
5457
dalyke966a1832019-06-05 20:53:135458TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Automatic_SecureCache) {
5459 ChangeDnsConfig(CreateValidDnsConfig());
5460 DnsConfigOverrides overrides;
5461 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
5462 resolver_->SetDnsConfigOverrides(overrides);
5463
5464 // Populate cache with a secure entry.
5465 HostCache::Key cached_secure_key =
5466 HostCache::Key("automatic_cached", DnsQueryType::UNSPECIFIED,
Matt Menke7b4a32f2019-10-25 22:13:465467 0 /* host_resolver_flags */, HostResolverSource::ANY,
5468 NetworkIsolationKey());
dalyke966a1832019-06-05 20:53:135469 cached_secure_key.secure = true;
5470 IPEndPoint kExpectedSecureIP = CreateExpected("192.168.1.102", 80);
5471 PopulateCache(cached_secure_key, kExpectedSecureIP);
5472
5473 // The secure cache should be checked prior to any DoH request being sent.
5474 ResolveHostResponseHelper response_secure_cached(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555475 HostPortPair("automatic_cached", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:245476 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:505477 resolve_context_->host_cache()));
dalyke966a1832019-06-05 20:53:135478 EXPECT_THAT(response_secure_cached.result_error(), IsOk());
dalyk59cba642020-01-02 21:39:265479 EXPECT_FALSE(response_secure_cached.request()
5480 ->GetResolveErrorInfo()
5481 .is_secure_network_error);
dalyke966a1832019-06-05 20:53:135482 EXPECT_THAT(
5483 response_secure_cached.request()->GetAddressResults().value().endpoints(),
5484 testing::ElementsAre(kExpectedSecureIP));
5485 EXPECT_FALSE(
5486 response_secure_cached.request()->GetStaleInfo().value().is_stale());
5487}
5488
5489TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Automatic_InsecureCache) {
5490 ChangeDnsConfig(CreateValidDnsConfig());
5491 DnsConfigOverrides overrides;
5492 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
5493 resolver_->SetDnsConfigOverrides(overrides);
5494
5495 // Populate cache with an insecure entry.
5496 HostCache::Key cached_insecure_key =
5497 HostCache::Key("insecure_automatic_cached", DnsQueryType::UNSPECIFIED,
Matt Menke7b4a32f2019-10-25 22:13:465498 0 /* host_resolver_flags */, HostResolverSource::ANY,
5499 NetworkIsolationKey());
dalyke966a1832019-06-05 20:53:135500 IPEndPoint kExpectedInsecureIP = CreateExpected("192.168.1.103", 80);
5501 PopulateCache(cached_insecure_key, kExpectedInsecureIP);
5502
5503 // The insecure cache should be checked after DoH requests fail.
5504 ResolveHostResponseHelper response_insecure_cached(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555505 HostPortPair("insecure_automatic_cached", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:245506 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:505507 resolve_context_->host_cache()));
dalyke966a1832019-06-05 20:53:135508 EXPECT_THAT(response_insecure_cached.result_error(), IsOk());
dalyk59cba642020-01-02 21:39:265509 EXPECT_FALSE(response_insecure_cached.request()
5510 ->GetResolveErrorInfo()
5511 .is_secure_network_error);
dalyke966a1832019-06-05 20:53:135512 EXPECT_THAT(response_insecure_cached.request()
5513 ->GetAddressResults()
5514 .value()
5515 .endpoints(),
5516 testing::ElementsAre(kExpectedInsecureIP));
5517 EXPECT_FALSE(
5518 response_insecure_cached.request()->GetStaleInfo().value().is_stale());
5519}
5520
dalyk4f4ac712019-05-31 16:33:135521TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Automatic_Downgrade) {
5522 ChangeDnsConfig(CreateValidDnsConfig());
5523 // Remove all DoH servers from the config so there is no DoH server available.
5524 DnsConfigOverrides overrides;
5525 std::vector<DnsConfig::DnsOverHttpsServerConfig> doh_servers;
5526 overrides.dns_over_https_servers = doh_servers;
5527 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
5528 resolver_->SetDnsConfigOverrides(overrides);
5529 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result;
5530
dalyke966a1832019-06-05 20:53:135531 // Populate cache with both secure and insecure entries.
5532 HostCache::Key cached_secure_key =
5533 HostCache::Key("automatic_cached", DnsQueryType::UNSPECIFIED,
Matt Menke7b4a32f2019-10-25 22:13:465534 0 /* host_resolver_flags */, HostResolverSource::ANY,
5535 NetworkIsolationKey());
dalyke966a1832019-06-05 20:53:135536 cached_secure_key.secure = true;
5537 IPEndPoint kExpectedSecureIP = CreateExpected("192.168.1.102", 80);
5538 PopulateCache(cached_secure_key, kExpectedSecureIP);
5539 HostCache::Key cached_insecure_key =
5540 HostCache::Key("insecure_automatic_cached", DnsQueryType::UNSPECIFIED,
Matt Menke7b4a32f2019-10-25 22:13:465541 0 /* host_resolver_flags */, HostResolverSource::ANY,
5542 NetworkIsolationKey());
dalyke966a1832019-06-05 20:53:135543 IPEndPoint kExpectedInsecureIP = CreateExpected("192.168.1.103", 80);
5544 PopulateCache(cached_insecure_key, kExpectedInsecureIP);
5545
5546 // The secure cache should still be checked first.
5547 ResolveHostResponseHelper response_cached(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555548 HostPortPair("automatic_cached", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:245549 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:505550 resolve_context_->host_cache()));
dalyke966a1832019-06-05 20:53:135551 EXPECT_THAT(response_cached.result_error(), IsOk());
5552 EXPECT_THAT(
5553 response_cached.request()->GetAddressResults().value().endpoints(),
5554 testing::ElementsAre(kExpectedSecureIP));
5555
5556 // The insecure cache should be checked before any insecure requests are sent.
5557 ResolveHostResponseHelper insecure_response_cached(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555558 HostPortPair("insecure_automatic_cached", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:245559 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:505560 resolve_context_->host_cache()));
dalyke966a1832019-06-05 20:53:135561 EXPECT_THAT(insecure_response_cached.result_error(), IsOk());
5562 EXPECT_THAT(insecure_response_cached.request()
5563 ->GetAddressResults()
5564 .value()
5565 .endpoints(),
5566 testing::ElementsAre(kExpectedInsecureIP));
5567
dalyk4f4ac712019-05-31 16:33:135568 // The DnsConfig doesn't contain DoH servers so AUTOMATIC mode will be
5569 // downgraded to OFF. A successful plaintext DNS request should result in an
5570 // insecure cache entry.
5571 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555572 HostPortPair("automatic", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:505573 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
dalyk4f4ac712019-05-31 16:33:135574 ASSERT_THAT(response.result_error(), IsOk());
5575 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
dalyk48b20a992019-02-25 16:10:265576 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
5577 CreateExpected("::1", 80)));
Matt Menke7b4a32f2019-10-25 22:13:465578 HostCache::Key key = HostCache::Key(
5579 "automatic", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
5580 HostResolverSource::ANY, NetworkIsolationKey());
dalyk48b20a992019-02-25 16:10:265581 cache_result = GetCacheHit(key);
5582 EXPECT_TRUE(!!cache_result);
dalyk4f4ac712019-05-31 16:33:135583}
dalyk48b20a992019-02-25 16:10:265584
dalykc2adf182019-09-02 14:31:225585TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Automatic_Unavailable) {
5586 ChangeDnsConfig(CreateValidDnsConfig());
5587 DnsConfigOverrides overrides;
5588 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
5589 resolver_->SetDnsConfigOverrides(overrides);
Eric Orth7dc18e92020-02-13 20:27:565590 dns_client_->SetForceDohServerAvailable(false);
dalykc2adf182019-09-02 14:31:225591
5592 // DoH requests should be skipped when there are no available DoH servers
5593 // in automatic mode. The cached result should be in the insecure cache.
5594 ResolveHostResponseHelper response_automatic(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555595 HostPortPair("automatic", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:505596 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
dalykc2adf182019-09-02 14:31:225597 ASSERT_THAT(response_automatic.result_error(), IsOk());
dalyk59cba642020-01-02 21:39:265598 EXPECT_FALSE(response_automatic.request()
5599 ->GetResolveErrorInfo()
5600 .is_secure_network_error);
dalykc2adf182019-09-02 14:31:225601 EXPECT_THAT(
5602 response_automatic.request()->GetAddressResults().value().endpoints(),
5603 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
5604 CreateExpected("::1", 80)));
Matt Menke7b4a32f2019-10-25 22:13:465605 HostCache::Key secure_key = HostCache::Key(
5606 "automatic", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
5607 HostResolverSource::ANY, NetworkIsolationKey());
dalykc2adf182019-09-02 14:31:225608 secure_key.secure = true;
5609 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result =
5610 GetCacheHit(secure_key);
5611 EXPECT_FALSE(!!cache_result);
5612
Matt Menke7b4a32f2019-10-25 22:13:465613 HostCache::Key insecure_key = HostCache::Key(
5614 "automatic", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
5615 HostResolverSource::ANY, NetworkIsolationKey());
dalykc2adf182019-09-02 14:31:225616 cache_result = GetCacheHit(insecure_key);
5617 EXPECT_TRUE(!!cache_result);
5618}
5619
5620TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Automatic_Unavailable_Fail) {
5621 set_allow_fallback_to_proctask(false);
5622 ChangeDnsConfig(CreateValidDnsConfig());
5623 DnsConfigOverrides overrides;
5624 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
5625 resolver_->SetDnsConfigOverrides(overrides);
Eric Orth7dc18e92020-02-13 20:27:565626 dns_client_->SetForceDohServerAvailable(false);
dalykc2adf182019-09-02 14:31:225627
5628 // Insecure requests that fail should not be cached.
5629 ResolveHostResponseHelper response_secure(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555630 HostPortPair("secure", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:505631 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
dalykc2adf182019-09-02 14:31:225632 ASSERT_THAT(response_secure.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
dalyk59cba642020-01-02 21:39:265633 EXPECT_FALSE(
5634 response_secure.request()->GetResolveErrorInfo().is_secure_network_error);
dalykc2adf182019-09-02 14:31:225635
Matt Menke7b4a32f2019-10-25 22:13:465636 HostCache::Key secure_key = HostCache::Key(
5637 "secure", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
5638 HostResolverSource::ANY, NetworkIsolationKey());
dalykc2adf182019-09-02 14:31:225639 secure_key.secure = true;
5640 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result =
5641 GetCacheHit(secure_key);
5642 EXPECT_FALSE(!!cache_result);
5643
Matt Menke7b4a32f2019-10-25 22:13:465644 HostCache::Key insecure_key = HostCache::Key(
5645 "secure", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
5646 HostResolverSource::ANY, NetworkIsolationKey());
dalykc2adf182019-09-02 14:31:225647 cache_result = GetCacheHit(insecure_key);
5648 EXPECT_FALSE(!!cache_result);
5649}
5650
Eric Orth7dc18e92020-02-13 20:27:565651// Test that DoH server availability is respected per-context.
5652TEST_F(HostResolverManagerDnsTest,
5653 SecureDnsMode_Automatic_UnavailableByContext) {
5654 // Create and register two separate contexts.
5655 TestURLRequestContext request_context1;
5656 TestURLRequestContext request_context2;
5657 ResolveContext resolve_context1(&request_context1,
5658 false /* enable_caching */);
5659 ResolveContext resolve_context2(&request_context2,
5660 false /* enable_caching */);
5661 resolver_->RegisterResolveContext(&resolve_context1);
5662 resolver_->RegisterResolveContext(&resolve_context2);
5663
5664 // Configure the resolver and underlying mock to attempt a secure query iff
5665 // the context has marked a DoH server available and otherwise attempt a
5666 // non-secure query.
5667 set_allow_fallback_to_proctask(false);
5668 ChangeDnsConfig(CreateValidDnsConfig());
5669 DnsConfigOverrides overrides;
5670 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
5671 resolver_->SetDnsConfigOverrides(overrides);
5672 dns_client_->SetForceDohServerAvailable(false);
5673
5674 // Mark a DoH server successful only for |resolve_context2|. Note that this
5675 // must come after the resolver's configuration is set because this relies on
5676 // the specific configuration containing a DoH server.
5677 resolve_context2.SetProbeSuccess(0u, true /* success */,
5678 dns_client_->GetCurrentSession());
5679
5680 // No available DoH servers for |resolve_context1|, so expect a non-secure
5681 // request. Non-secure requests for "secure" will fail with
5682 // ERR_NAME_NOT_RESOLVED.
5683 ResolveHostResponseHelper response_secure(resolver_->CreateRequest(
5684 HostPortPair("secure", 80), NetworkIsolationKey(), NetLogWithSource(),
5685 base::nullopt, &resolve_context1, resolve_context_->host_cache()));
5686 ASSERT_THAT(response_secure.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
5687
5688 // One available DoH server for |resolve_context2|, so expect a secure
5689 // request. Secure requests for "secure" will succeed.
5690 ResolveHostResponseHelper response_secure2(resolver_->CreateRequest(
5691 HostPortPair("secure", 80), NetworkIsolationKey(), NetLogWithSource(),
5692 base::nullopt, &resolve_context2, nullptr /* host_cache */));
5693 ASSERT_THAT(response_secure2.result_error(), IsOk());
5694
5695 resolver_->DeregisterResolveContext(&resolve_context1);
5696 resolver_->DeregisterResolveContext(&resolve_context2);
5697}
5698
dalyke966a1832019-06-05 20:53:135699TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Automatic_Stale) {
5700 ChangeDnsConfig(CreateValidDnsConfig());
5701 DnsConfigOverrides overrides;
5702 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
5703 resolver_->SetDnsConfigOverrides(overrides);
5704
5705 // Populate cache with insecure entry.
Matt Menke7b4a32f2019-10-25 22:13:465706 HostCache::Key cached_stale_key = HostCache::Key(
5707 "automatic_stale", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
5708 HostResolverSource::ANY, NetworkIsolationKey());
dalyke966a1832019-06-05 20:53:135709 IPEndPoint kExpectedStaleIP = CreateExpected("192.168.1.102", 80);
5710 PopulateCache(cached_stale_key, kExpectedStaleIP);
5711 MakeCacheStale();
5712
5713 HostResolver::ResolveHostParameters stale_allowed_parameters;
5714 stale_allowed_parameters.cache_usage =
5715 HostResolver::ResolveHostParameters::CacheUsage::STALE_ALLOWED;
5716
5717 // The insecure cache should be checked before secure requests are made since
5718 // stale results are allowed.
5719 ResolveHostResponseHelper response_stale(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555720 HostPortPair("automatic_stale", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:245721 NetLogWithSource(), stale_allowed_parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:505722 resolve_context_->host_cache()));
dalyke966a1832019-06-05 20:53:135723 EXPECT_THAT(response_stale.result_error(), IsOk());
dalyk59cba642020-01-02 21:39:265724 EXPECT_FALSE(
5725 response_stale.request()->GetResolveErrorInfo().is_secure_network_error);
dalyke966a1832019-06-05 20:53:135726 EXPECT_THAT(response_stale.request()->GetAddressResults().value().endpoints(),
5727 testing::ElementsAre(kExpectedStaleIP));
5728 EXPECT_TRUE(response_stale.request()->GetStaleInfo()->is_stale());
5729}
5730
dalykc27699a2019-07-29 20:53:295731TEST_F(HostResolverManagerDnsTest,
5732 SecureDnsMode_Automatic_InsecureAsyncDisabled) {
5733 proc_->AddRuleForAllFamilies("insecure_automatic", "192.168.1.100");
5734 ChangeDnsConfig(CreateValidDnsConfig());
5735 resolver_->SetInsecureDnsClientEnabled(false);
5736 DnsConfigOverrides overrides;
5737 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
5738 resolver_->SetDnsConfigOverrides(overrides);
5739
5740 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result;
5741
5742 // The secure part of the dns client should be enabled.
5743 ResolveHostResponseHelper response_secure(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555744 HostPortPair("automatic", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:505745 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
dalykc27699a2019-07-29 20:53:295746 ASSERT_THAT(response_secure.result_error(), IsOk());
5747 EXPECT_THAT(
5748 response_secure.request()->GetAddressResults().value().endpoints(),
5749 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
5750 CreateExpected("::1", 80)));
Matt Menke7b4a32f2019-10-25 22:13:465751 HostCache::Key secure_key = HostCache::Key(
5752 "automatic", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
5753 HostResolverSource::ANY, NetworkIsolationKey());
dalykc27699a2019-07-29 20:53:295754 secure_key.secure = true;
5755 cache_result = GetCacheHit(secure_key);
5756 EXPECT_TRUE(!!cache_result);
5757
5758 // The insecure part of the dns client is disabled so insecure requests
5759 // should be skipped.
5760 ResolveHostResponseHelper response_insecure(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555761 HostPortPair("insecure_automatic", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:245762 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:505763 resolve_context_->host_cache()));
dalykc27699a2019-07-29 20:53:295764 proc_->SignalMultiple(1u);
5765 ASSERT_THAT(response_insecure.result_error(), IsOk());
5766 EXPECT_THAT(
5767 response_insecure.request()->GetAddressResults().value().endpoints(),
5768 testing::ElementsAre(CreateExpected("192.168.1.100", 80)));
5769 HostCache::Key insecure_key =
5770 HostCache::Key("insecure_automatic", DnsQueryType::UNSPECIFIED,
Matt Menke7b4a32f2019-10-25 22:13:465771 0 /* host_resolver_flags */, HostResolverSource::ANY,
5772 NetworkIsolationKey());
dalykc27699a2019-07-29 20:53:295773 cache_result = GetCacheHit(insecure_key);
5774 EXPECT_TRUE(!!cache_result);
5775
5776 HostCache::Key cached_insecure_key =
5777 HostCache::Key("insecure_automatic_cached", DnsQueryType::UNSPECIFIED,
Matt Menke7b4a32f2019-10-25 22:13:465778 0 /* host_resolver_flags */, HostResolverSource::ANY,
5779 NetworkIsolationKey());
dalykc27699a2019-07-29 20:53:295780 IPEndPoint kExpectedInsecureIP = CreateExpected("192.168.1.101", 80);
5781 PopulateCache(cached_insecure_key, kExpectedInsecureIP);
5782
5783 // The insecure cache should still be checked even if the insecure part of
5784 // the dns client is disabled.
5785 ResolveHostResponseHelper response_insecure_cached(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555786 HostPortPair("insecure_automatic_cached", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:245787 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:505788 resolve_context_->host_cache()));
dalykc27699a2019-07-29 20:53:295789 EXPECT_THAT(response_insecure_cached.result_error(), IsOk());
5790 EXPECT_THAT(response_insecure_cached.request()
5791 ->GetAddressResults()
5792 .value()
5793 .endpoints(),
5794 testing::ElementsAre(kExpectedInsecureIP));
5795}
5796
dalyk6d7d8ead2019-08-15 03:30:085797TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Automatic_DotActive) {
5798 proc_->AddRuleForAllFamilies("insecure_automatic", "192.168.1.100");
5799 DnsConfig config = CreateValidDnsConfig();
5800 config.dns_over_tls_active = true;
5801 ChangeDnsConfig(config);
5802 DnsConfigOverrides overrides;
5803 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
5804 resolver_->SetDnsConfigOverrides(overrides);
5805
5806 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result;
5807
5808 // The secure part of the dns client should be enabled.
5809 ResolveHostResponseHelper response_secure(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555810 HostPortPair("automatic", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:505811 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
dalyk6d7d8ead2019-08-15 03:30:085812 ASSERT_THAT(response_secure.result_error(), IsOk());
5813 EXPECT_THAT(
5814 response_secure.request()->GetAddressResults().value().endpoints(),
5815 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
5816 CreateExpected("::1", 80)));
Matt Menke7b4a32f2019-10-25 22:13:465817 HostCache::Key secure_key = HostCache::Key(
5818 "automatic", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
5819 HostResolverSource::ANY, NetworkIsolationKey());
dalyk6d7d8ead2019-08-15 03:30:085820 secure_key.secure = true;
5821 cache_result = GetCacheHit(secure_key);
5822 EXPECT_TRUE(!!cache_result);
5823
5824 // Insecure async requests should be skipped since the system resolver
5825 // requests will be secure.
5826 ResolveHostResponseHelper response_insecure(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555827 HostPortPair("insecure_automatic", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:245828 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:505829 resolve_context_->host_cache()));
dalyk6d7d8ead2019-08-15 03:30:085830 proc_->SignalMultiple(1u);
5831 ASSERT_THAT(response_insecure.result_error(), IsOk());
dalyk59cba642020-01-02 21:39:265832 EXPECT_FALSE(response_insecure.request()
5833 ->GetResolveErrorInfo()
5834 .is_secure_network_error);
dalyk6d7d8ead2019-08-15 03:30:085835 EXPECT_THAT(
5836 response_insecure.request()->GetAddressResults().value().endpoints(),
5837 testing::ElementsAre(CreateExpected("192.168.1.100", 80)));
5838 HostCache::Key insecure_key =
5839 HostCache::Key("insecure_automatic", DnsQueryType::UNSPECIFIED,
Matt Menke7b4a32f2019-10-25 22:13:465840 0 /* host_resolver_flags */, HostResolverSource::ANY,
5841 NetworkIsolationKey());
dalyk6d7d8ead2019-08-15 03:30:085842 cache_result = GetCacheHit(insecure_key);
5843 EXPECT_TRUE(!!cache_result);
5844
5845 HostCache::Key cached_insecure_key =
5846 HostCache::Key("insecure_automatic_cached", DnsQueryType::UNSPECIFIED,
Matt Menke7b4a32f2019-10-25 22:13:465847 0 /* host_resolver_flags */, HostResolverSource::ANY,
5848 NetworkIsolationKey());
dalyk6d7d8ead2019-08-15 03:30:085849 IPEndPoint kExpectedInsecureIP = CreateExpected("192.168.1.101", 80);
5850 PopulateCache(cached_insecure_key, kExpectedInsecureIP);
5851
5852 // The insecure cache should still be checked.
5853 ResolveHostResponseHelper response_insecure_cached(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555854 HostPortPair("insecure_automatic_cached", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:245855 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:505856 resolve_context_->host_cache()));
dalyk6d7d8ead2019-08-15 03:30:085857 EXPECT_THAT(response_insecure_cached.result_error(), IsOk());
dalyk59cba642020-01-02 21:39:265858 EXPECT_FALSE(response_insecure_cached.request()
5859 ->GetResolveErrorInfo()
5860 .is_secure_network_error);
dalyk6d7d8ead2019-08-15 03:30:085861 EXPECT_THAT(response_insecure_cached.request()
5862 ->GetAddressResults()
5863 .value()
5864 .endpoints(),
5865 testing::ElementsAre(kExpectedInsecureIP));
5866}
5867
dalyk4f4ac712019-05-31 16:33:135868TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Secure) {
5869 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.100");
5870 set_allow_fallback_to_proctask(true);
5871
dalykc27699a2019-07-29 20:53:295872 ChangeDnsConfig(CreateValidDnsConfig());
dalyk4f4ac712019-05-31 16:33:135873 DnsConfigOverrides overrides;
5874 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::SECURE;
5875 resolver_->SetDnsConfigOverrides(overrides);
5876 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result;
5877
5878 ResolveHostResponseHelper response_secure(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555879 HostPortPair("secure", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:505880 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
dalyk4f4ac712019-05-31 16:33:135881 ASSERT_THAT(response_secure.result_error(), IsOk());
dalyk59cba642020-01-02 21:39:265882 EXPECT_FALSE(
5883 response_secure.request()->GetResolveErrorInfo().is_secure_network_error);
Matt Menke7b4a32f2019-10-25 22:13:465884 HostCache::Key secure_key = HostCache::Key(
5885 "secure", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
5886 HostResolverSource::ANY, NetworkIsolationKey());
dalyk4f4ac712019-05-31 16:33:135887 secure_key.secure = true;
5888 cache_result = GetCacheHit(secure_key);
dalyk48b20a992019-02-25 16:10:265889 EXPECT_TRUE(!!cache_result);
5890
dalyk4f4ac712019-05-31 16:33:135891 ResolveHostResponseHelper response_insecure(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555892 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:505893 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
dalyk4f4ac712019-05-31 16:33:135894 ASSERT_THAT(response_insecure.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
dalyk59cba642020-01-02 21:39:265895 EXPECT_TRUE(response_insecure.request()
5896 ->GetResolveErrorInfo()
5897 .is_secure_network_error);
Matt Menke7b4a32f2019-10-25 22:13:465898 HostCache::Key insecure_key = HostCache::Key(
5899 "ok", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
5900 HostResolverSource::ANY, NetworkIsolationKey());
dalyk4f4ac712019-05-31 16:33:135901 cache_result = GetCacheHit(insecure_key);
5902 EXPECT_FALSE(!!cache_result);
dalyk48b20a992019-02-25 16:10:265903
dalyk4f4ac712019-05-31 16:33:135904 // Fallback to ProcTask not allowed in SECURE mode.
5905 ResolveHostResponseHelper response_proc(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555906 HostPortPair("nx_succeed", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:505907 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
dalyk4f4ac712019-05-31 16:33:135908 proc_->SignalMultiple(1u);
5909 EXPECT_THAT(response_proc.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
dalyk59cba642020-01-02 21:39:265910 EXPECT_TRUE(
5911 response_proc.request()->GetResolveErrorInfo().is_secure_network_error);
dalyk48b20a992019-02-25 16:10:265912}
5913
dalykc27699a2019-07-29 20:53:295914TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Secure_InsecureAsyncDisabled) {
5915 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.100");
5916 set_allow_fallback_to_proctask(true);
5917 resolver_->SetInsecureDnsClientEnabled(false);
5918
5919 ChangeDnsConfig(CreateValidDnsConfig());
5920 DnsConfigOverrides overrides;
5921 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::SECURE;
5922 resolver_->SetDnsConfigOverrides(overrides);
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("secure", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:505928 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
dalykc27699a2019-07-29 20:53:295929 ASSERT_THAT(response_secure.result_error(), IsOk());
Matt Menke7b4a32f2019-10-25 22:13:465930 HostCache::Key secure_key = HostCache::Key(
5931 "secure", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
5932 HostResolverSource::ANY, NetworkIsolationKey());
dalykc27699a2019-07-29 20:53:295933 secure_key.secure = true;
5934 cache_result = GetCacheHit(secure_key);
5935 EXPECT_TRUE(!!cache_result);
5936}
5937
dalyk6f7f7ce62019-08-15 23:18:235938TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Secure_Local_CacheMiss) {
5939 ChangeDnsConfig(CreateValidDnsConfig());
5940 DnsConfigOverrides overrides;
5941 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::SECURE;
5942 resolver_->SetDnsConfigOverrides(overrides);
5943
5944 HostResolver::ResolveHostParameters source_none_parameters;
5945 source_none_parameters.source = HostResolverSource::LOCAL_ONLY;
5946
5947 // Populate cache with an insecure entry.
Matt Menke7b4a32f2019-10-25 22:13:465948 HostCache::Key cached_insecure_key = HostCache::Key(
5949 "automatic", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
5950 HostResolverSource::ANY, NetworkIsolationKey());
dalyk6f7f7ce62019-08-15 23:18:235951 IPEndPoint kExpectedInsecureIP = CreateExpected("192.168.1.102", 80);
5952 PopulateCache(cached_insecure_key, kExpectedInsecureIP);
5953
5954 // NONE query expected to complete synchronously with a cache miss since
5955 // the insecure cache should not be checked.
5956 ResolveHostResponseHelper cache_miss_request(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555957 HostPortPair("automatic", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:505958 source_none_parameters, resolve_context_.get(),
5959 resolve_context_->host_cache()));
dalyk6f7f7ce62019-08-15 23:18:235960 EXPECT_TRUE(cache_miss_request.complete());
5961 EXPECT_THAT(cache_miss_request.result_error(), IsError(ERR_DNS_CACHE_MISS));
dalyk59cba642020-01-02 21:39:265962 EXPECT_FALSE(cache_miss_request.request()
5963 ->GetResolveErrorInfo()
5964 .is_secure_network_error);
dalyk6f7f7ce62019-08-15 23:18:235965 EXPECT_FALSE(cache_miss_request.request()->GetAddressResults());
5966 EXPECT_FALSE(cache_miss_request.request()->GetStaleInfo());
5967}
5968
5969TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Secure_Local_CacheHit) {
5970 ChangeDnsConfig(CreateValidDnsConfig());
5971 DnsConfigOverrides overrides;
5972 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::SECURE;
5973 resolver_->SetDnsConfigOverrides(overrides);
5974
5975 HostResolver::ResolveHostParameters source_none_parameters;
5976 source_none_parameters.source = HostResolverSource::LOCAL_ONLY;
5977
5978 // Populate cache with a secure entry.
Matt Menke7b4a32f2019-10-25 22:13:465979 HostCache::Key cached_secure_key = HostCache::Key(
5980 "secure", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
5981 HostResolverSource::ANY, NetworkIsolationKey());
dalyk6f7f7ce62019-08-15 23:18:235982 cached_secure_key.secure = true;
5983 IPEndPoint kExpectedSecureIP = CreateExpected("192.168.1.103", 80);
5984 PopulateCache(cached_secure_key, kExpectedSecureIP);
5985
5986 // NONE query expected to complete synchronously with a cache hit from the
5987 // secure cache.
5988 ResolveHostResponseHelper response_cached(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555989 HostPortPair("secure", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:505990 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
dalyk6f7f7ce62019-08-15 23:18:235991 EXPECT_TRUE(response_cached.complete());
5992 EXPECT_THAT(response_cached.result_error(), IsOk());
dalyk59cba642020-01-02 21:39:265993 EXPECT_FALSE(
5994 response_cached.request()->GetResolveErrorInfo().is_secure_network_error);
dalyk6f7f7ce62019-08-15 23:18:235995 EXPECT_THAT(
5996 response_cached.request()->GetAddressResults().value().endpoints(),
5997 testing::ElementsAre(kExpectedSecureIP));
5998}
5999
[email protected]daae1322013-09-05 18:26:506000// Test the case where only a single transaction slot is available.
Eric Orth960e7062019-03-08 18:43:546001TEST_F(HostResolverManagerDnsTest, SerialResolver) {
[email protected]daae1322013-09-05 18:26:506002 CreateSerialResolver();
Eric Orth60931742018-11-05 23:40:576003 set_allow_fallback_to_proctask(false);
[email protected]daae1322013-09-05 18:26:506004 ChangeDnsConfig(CreateValidDnsConfig());
6005
Eric Orth117e1992019-04-17 00:24:156006 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556007 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:506008 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:006009 EXPECT_FALSE(response.complete());
6010 EXPECT_EQ(1u, num_running_dispatcher_jobs());
6011
6012 base::RunLoop().RunUntilIdle();
6013 EXPECT_TRUE(response.complete());
6014 EXPECT_THAT(response.result_error(), IsOk());
6015 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
6016 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
6017 CreateExpected("::1", 80)));
6018}
6019
Eric Orth70992982018-07-24 00:25:006020// Test the case where subsequent transactions are handled on transaction
6021// completion when only part of a multi-transaction request could be initially
6022// started.
Eric Orth960e7062019-03-08 18:43:546023TEST_F(HostResolverManagerDnsTest, AAAAStartsAfterOtherJobFinishes) {
Eric Orth70992982018-07-24 00:25:006024 CreateResolverWithLimitsAndParams(3u, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:326025 true /* ipv6_reachable */,
6026 true /* check_ipv6_on_wifi */);
Eric Orth60931742018-11-05 23:40:576027 set_allow_fallback_to_proctask(false);
Eric Orth70992982018-07-24 00:25:006028 ChangeDnsConfig(CreateValidDnsConfig());
6029
Eric Orth117e1992019-04-17 00:24:156030 ResolveHostResponseHelper response0(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556031 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:506032 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:006033 EXPECT_EQ(2u, num_running_dispatcher_jobs());
Eric Orth117e1992019-04-17 00:24:156034 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556035 HostPortPair("4slow_ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:506036 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:006037 EXPECT_EQ(3u, num_running_dispatcher_jobs());
6038
6039 // Request 0's transactions should complete, starting Request 1's second
6040 // transaction, which should also complete.
6041 base::RunLoop().RunUntilIdle();
6042 EXPECT_EQ(1u, num_running_dispatcher_jobs());
6043 EXPECT_TRUE(response0.complete());
6044 EXPECT_FALSE(response1.complete());
6045
6046 dns_client_->CompleteDelayedTransactions();
6047 EXPECT_THAT(response1.result_error(), IsOk());
6048 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
6049 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
6050 CreateExpected("::1", 80)));
6051}
6052
[email protected]daae1322013-09-05 18:26:506053// Tests the case that a Job with a single transaction receives an empty address
6054// list, triggering fallback to ProcTask.
Eric Orth960e7062019-03-08 18:43:546055TEST_F(HostResolverManagerDnsTest, IPv4EmptyFallback) {
Eric Orth70992982018-07-24 00:25:006056 // Disable ipv6 to ensure we'll only try a single transaction for the host.
6057 CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:326058 false /* ipv6_reachable */,
6059 true /* check_ipv6_on_wifi */);
Eric Orth70992982018-07-24 00:25:006060 DnsConfig config = CreateValidDnsConfig();
6061 config.use_local_ipv6 = false;
6062 ChangeDnsConfig(config);
6063
Eric Orth322af3e42018-08-20 18:12:596064 proc_->AddRuleForAllFamilies("empty_fallback", "192.168.0.1",
6065 HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6);
Eric Orth70992982018-07-24 00:25:006066 proc_->SignalMultiple(1u);
6067
6068 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556069 HostPortPair("empty_fallback", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:246070 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:506071 resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:006072 EXPECT_THAT(response.result_error(), IsOk());
6073 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
6074 testing::ElementsAre(CreateExpected("192.168.0.1", 80)));
6075}
6076
[email protected]daae1322013-09-05 18:26:506077// Tests the case that a Job with two transactions receives two empty address
6078// lists, triggering fallback to ProcTask.
Eric Orth960e7062019-03-08 18:43:546079TEST_F(HostResolverManagerDnsTest, UnspecEmptyFallback) {
[email protected]daae1322013-09-05 18:26:506080 ChangeDnsConfig(CreateValidDnsConfig());
6081 proc_->AddRuleForAllFamilies("empty_fallback", "192.168.0.1");
6082 proc_->SignalMultiple(1u);
Eric Orth70992982018-07-24 00:25:006083
6084 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556085 HostPortPair("empty_fallback", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:246086 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:506087 resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:006088
6089 EXPECT_THAT(response.result_error(), IsOk());
6090 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
6091 testing::ElementsAre(CreateExpected("192.168.0.1", 80)));
6092}
6093
[email protected]daae1322013-09-05 18:26:506094// Tests getting a new invalid DnsConfig while there are active DnsTasks.
Eric Orth960e7062019-03-08 18:43:546095TEST_F(HostResolverManagerDnsTest, InvalidDnsConfigWithPendingRequests) {
Eric Orth70992982018-07-24 00:25:006096 // At most 3 jobs active at once. This number is important, since we want
Eric Orth960e7062019-03-08 18:43:546097 // to make sure that aborting the first HostResolverManager::Job does not
Eric Orth70992982018-07-24 00:25:006098 // trigger another DnsTransaction on the second Job when it releases its
6099 // second prioritized dispatcher slot.
6100 CreateResolverWithLimitsAndParams(3u, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:326101 true /* ipv6_reachable */,
6102 true /* check_ipv6_on_wifi */);
Eric Orth70992982018-07-24 00:25:006103
6104 ChangeDnsConfig(CreateValidDnsConfig());
6105
6106 proc_->AddRuleForAllFamilies("slow_nx1", "192.168.0.1");
6107 proc_->AddRuleForAllFamilies("slow_nx2", "192.168.0.2");
6108 proc_->AddRuleForAllFamilies("ok", "192.168.0.3");
6109
6110 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
6111 // First active job gets two slots.
Eric Orth117e1992019-04-17 00:24:156112 responses.emplace_back(
6113 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556114 HostPortPair("slow_nx1", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:246115 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:506116 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:006117 // Next job gets one slot, and waits on another.
Eric Orth117e1992019-04-17 00:24:156118 responses.emplace_back(
6119 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556120 HostPortPair("slow_nx2", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:246121 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:506122 resolve_context_->host_cache())));
Eric Orth117e1992019-04-17 00:24:156123 responses.emplace_back(
6124 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556125 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:506126 base::nullopt, resolve_context_.get(),
6127 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:006128
6129 EXPECT_EQ(3u, num_running_dispatcher_jobs());
6130 for (auto& response : responses) {
6131 EXPECT_FALSE(response->complete());
6132 }
6133
dalyk4f4ac712019-05-31 16:33:136134 // Clear DNS config. Fully in-progress, partially in-progress, and queued
6135 // requests should all be aborted.
Eric Orthfe6d5482019-09-03 18:27:576136 InvalidateDnsConfig();
dalyk4f4ac712019-05-31 16:33:136137 for (auto& response : responses) {
6138 EXPECT_THAT(response->result_error(), IsError(ERR_NETWORK_CHANGED));
6139 }
Eric Orth70992982018-07-24 00:25:006140}
6141
Eric Orth70992982018-07-24 00:25:006142// Test that initial DNS config read signals do not abort pending requests
6143// when using DnsClient.
Eric Orth960e7062019-03-08 18:43:546144TEST_F(HostResolverManagerDnsTest, DontAbortOnInitialDNSConfigRead) {
Eric Orth70992982018-07-24 00:25:006145 // DnsClient is enabled, but there's no DnsConfig, so the request should start
6146 // using ProcTask.
Eric Orth117e1992019-04-17 00:24:156147 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556148 HostPortPair("host1", 70), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:506149 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:006150 EXPECT_FALSE(response.complete());
6151
6152 EXPECT_TRUE(proc_->WaitFor(1u));
6153 // Send the initial config read signal, with a valid config.
6154 SetInitialDnsConfig(CreateValidDnsConfig());
6155 proc_->SignalAll();
6156
6157 EXPECT_THAT(response.result_error(), IsOk());
6158}
6159
dalykc27699a2019-07-29 20:53:296160// Tests the case that the insecure part of the DnsClient is automatically
6161// disabled due to failures while there are active DnsTasks.
Eric Orth960e7062019-03-08 18:43:546162TEST_F(HostResolverManagerDnsTest,
dalykc27699a2019-07-29 20:53:296163 AutomaticallyDisableInsecureDnsClientWithPendingRequests) {
[email protected]daae1322013-09-05 18:26:506164 // Trying different limits is important for this test: Different limits
6165 // result in different behavior when aborting in-progress DnsTasks. Having
6166 // a DnsTask that has one job active and one in the queue when another job
6167 // occupying two slots has its DnsTask aborted is the case most likely to run
Eric Orth60931742018-11-05 23:40:576168 // into problems. Try limits between [1, 2 * # of non failure requests].
6169 for (size_t limit = 1u; limit < 10u; ++limit) {
Eric Orth70992982018-07-24 00:25:006170 CreateResolverWithLimitsAndParams(limit, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:326171 true /* ipv6_reachable */,
6172 true /* check_ipv6_on_wifi */);
Eric Orth70992982018-07-24 00:25:006173
6174 ChangeDnsConfig(CreateValidDnsConfig());
6175
dalykc27699a2019-07-29 20:53:296176 // Queue up enough failures to disable insecure DnsTasks. These will all
6177 // fall back to ProcTasks, and succeed there.
Eric Orth70992982018-07-24 00:25:006178 std::vector<std::unique_ptr<ResolveHostResponseHelper>> failure_responses;
dalykc27699a2019-07-29 20:53:296179 for (unsigned i = 0u; i < maximum_insecure_dns_task_failures(); ++i) {
Eric Orth70992982018-07-24 00:25:006180 std::string host = base::StringPrintf("nx%u", i);
6181 proc_->AddRuleForAllFamilies(host, "192.168.0.1");
6182 failure_responses.emplace_back(
6183 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556184 HostPortPair(host, 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:506185 base::nullopt, resolve_context_.get(),
6186 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:006187 EXPECT_FALSE(failure_responses[i]->complete());
6188 }
6189
dalykc27699a2019-07-29 20:53:296190 // These requests should all bypass insecure DnsTasks, due to the above
6191 // failures, so should end up using ProcTasks.
Eric Orth70992982018-07-24 00:25:006192 proc_->AddRuleForAllFamilies("slow_ok1", "192.168.0.2");
6193 ResolveHostResponseHelper response0(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556194 HostPortPair("slow_ok1", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:506195 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:006196 EXPECT_FALSE(response0.complete());
6197 proc_->AddRuleForAllFamilies("slow_ok2", "192.168.0.3");
6198 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556199 HostPortPair("slow_ok2", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:506200 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:006201 EXPECT_FALSE(response1.complete());
6202 proc_->AddRuleForAllFamilies("slow_ok3", "192.168.0.4");
6203 ResolveHostResponseHelper response2(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556204 HostPortPair("slow_ok3", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:506205 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:006206 EXPECT_FALSE(response2.complete());
6207
Eric Orth60931742018-11-05 23:40:576208 // Requests specifying DNS source cannot fallback to ProcTask, so they
6209 // should be unaffected.
6210 HostResolver::ResolveHostParameters parameters;
6211 parameters.source = HostResolverSource::DNS;
6212 ResolveHostResponseHelper response_dns(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556213 HostPortPair("4slow_ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:506214 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth60931742018-11-05 23:40:576215 EXPECT_FALSE(response_dns.complete());
6216
6217 // Requests specifying SYSTEM source should be unaffected by disabling
6218 // DnsClient.
6219 proc_->AddRuleForAllFamilies("nx_ok", "192.168.0.5");
6220 parameters.source = HostResolverSource::SYSTEM;
Eric Orth117e1992019-04-17 00:24:156221 ResolveHostResponseHelper response_system(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556222 HostPortPair("nx_ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:506223 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth60931742018-11-05 23:40:576224 EXPECT_FALSE(response_system.complete());
6225
dalykc27699a2019-07-29 20:53:296226 // Secure DnsTasks should not be affected.
6227 HostResolver::ResolveHostParameters secure_parameters;
6228 secure_parameters.secure_dns_mode_override =
6229 DnsConfig::SecureDnsMode::AUTOMATIC;
6230 ResolveHostResponseHelper response_secure(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556231 HostPortPair("automatic", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:246232 NetLogWithSource(), secure_parameters, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:506233 resolve_context_->host_cache()));
dalykc27699a2019-07-29 20:53:296234 EXPECT_FALSE(response_secure.complete());
Eric Orth70992982018-07-24 00:25:006235
Eric Orth394db1732019-08-27 20:09:396236 proc_->SignalMultiple(maximum_insecure_dns_task_failures() + 4);
dalykc27699a2019-07-29 20:53:296237
6238 for (size_t i = 0u; i < maximum_insecure_dns_task_failures(); ++i) {
Eric Orth70992982018-07-24 00:25:006239 EXPECT_THAT(failure_responses[i]->result_error(), IsOk());
6240 EXPECT_THAT(failure_responses[i]
6241 ->request()
6242 ->GetAddressResults()
6243 .value()
6244 .endpoints(),
6245 testing::ElementsAre(CreateExpected("192.168.0.1", 80)));
6246 }
6247
6248 EXPECT_THAT(response0.result_error(), IsOk());
6249 EXPECT_THAT(response0.request()->GetAddressResults().value().endpoints(),
6250 testing::ElementsAre(CreateExpected("192.168.0.2", 80)));
6251 EXPECT_THAT(response1.result_error(), IsOk());
6252 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
6253 testing::ElementsAre(CreateExpected("192.168.0.3", 80)));
6254 EXPECT_THAT(response2.result_error(), IsOk());
6255 EXPECT_THAT(response2.request()->GetAddressResults().value().endpoints(),
6256 testing::ElementsAre(CreateExpected("192.168.0.4", 80)));
Eric Orth60931742018-11-05 23:40:576257
6258 dns_client_->CompleteDelayedTransactions();
6259 EXPECT_THAT(response_dns.result_error(), IsOk());
6260
6261 EXPECT_THAT(response_system.result_error(), IsOk());
6262 EXPECT_THAT(
6263 response_system.request()->GetAddressResults().value().endpoints(),
6264 testing::ElementsAre(CreateExpected("192.168.0.5", 80)));
dalykc27699a2019-07-29 20:53:296265
6266 EXPECT_THAT(response_secure.result_error(), IsOk());
Eric Orth70992982018-07-24 00:25:006267 }
6268}
6269
[email protected]daae1322013-09-05 18:26:506270// Tests a call to SetDnsClient while there are active DnsTasks.
Eric Orth960e7062019-03-08 18:43:546271TEST_F(HostResolverManagerDnsTest,
6272 ManuallyDisableDnsClientWithPendingRequests) {
[email protected]daae1322013-09-05 18:26:506273 // At most 3 jobs active at once. This number is important, since we want to
Eric Orth960e7062019-03-08 18:43:546274 // make sure that aborting the first HostResolverManager::Job does not trigger
[email protected]daae1322013-09-05 18:26:506275 // another DnsTransaction on the second Job when it releases its second
6276 // prioritized dispatcher slot.
Eric Orth70992982018-07-24 00:25:006277 CreateResolverWithLimitsAndParams(3u, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:326278 true /* ipv6_reachable */,
6279 true /* check_ipv6_on_wifi */);
[email protected]daae1322013-09-05 18:26:506280
[email protected]daae1322013-09-05 18:26:506281 ChangeDnsConfig(CreateValidDnsConfig());
6282
6283 proc_->AddRuleForAllFamilies("slow_ok1", "192.168.0.1");
6284 proc_->AddRuleForAllFamilies("slow_ok2", "192.168.0.2");
6285 proc_->AddRuleForAllFamilies("ok", "192.168.0.3");
6286
Eric Orth70992982018-07-24 00:25:006287 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
6288 // First active job gets two slots.
Eric Orth117e1992019-04-17 00:24:156289 responses.emplace_back(
6290 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556291 HostPortPair("slow_ok1", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:246292 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:506293 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:006294 EXPECT_FALSE(responses[0]->complete());
6295 // Next job gets one slot, and waits on another.
Eric Orth117e1992019-04-17 00:24:156296 responses.emplace_back(
6297 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556298 HostPortPair("slow_ok2", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:246299 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:506300 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:006301 EXPECT_FALSE(responses[1]->complete());
6302 // Next one is queued.
Eric Orth117e1992019-04-17 00:24:156303 responses.emplace_back(
6304 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556305 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:506306 base::nullopt, resolve_context_.get(),
6307 resolve_context_->host_cache())));
Eric Orth70992982018-07-24 00:25:006308 EXPECT_FALSE(responses[2]->complete());
6309
6310 EXPECT_EQ(3u, num_running_dispatcher_jobs());
6311
6312 // Clear DnsClient. The two in-progress jobs should fall back to a ProcTask,
6313 // and the next one should be started with a ProcTask.
dalykc27699a2019-07-29 20:53:296314 resolver_->SetInsecureDnsClientEnabled(false);
Eric Orth70992982018-07-24 00:25:006315
6316 // All three in-progress requests should now be running a ProcTask.
6317 EXPECT_EQ(3u, num_running_dispatcher_jobs());
6318 proc_->SignalMultiple(3u);
6319
6320 for (auto& response : responses) {
6321 EXPECT_THAT(response->result_error(), IsOk());
6322 }
6323 EXPECT_THAT(responses[0]->request()->GetAddressResults().value().endpoints(),
6324 testing::ElementsAre(CreateExpected("192.168.0.1", 80)));
6325 EXPECT_THAT(responses[1]->request()->GetAddressResults().value().endpoints(),
6326 testing::ElementsAre(CreateExpected("192.168.0.2", 80)));
6327 EXPECT_THAT(responses[2]->request()->GetAddressResults().value().endpoints(),
6328 testing::ElementsAre(CreateExpected("192.168.0.3", 80)));
6329}
6330
Eric Orth04aad982019-05-06 22:41:046331// When explicitly requesting source=DNS, no fallback allowed, so doing so with
6332// DnsClient disabled should result in an error.
6333TEST_F(HostResolverManagerDnsTest, DnsCallsWithDisabledDnsClient) {
Eric Orth4e55b362019-05-07 22:00:036334 ChangeDnsConfig(CreateValidDnsConfig());
dalykc27699a2019-07-29 20:53:296335 resolver_->SetInsecureDnsClientEnabled(false);
Eric Orth04aad982019-05-06 22:41:046336
6337 HostResolver::ResolveHostParameters params;
6338 params.source = HostResolverSource::DNS;
6339 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556340 HostPortPair("host", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:506341 params, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth04aad982019-05-06 22:41:046342
dalykc27699a2019-07-29 20:53:296343 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_CACHE_MISS));
Eric Orth04aad982019-05-06 22:41:046344}
6345
Eric Orth4e55b362019-05-07 22:00:036346TEST_F(HostResolverManagerDnsTest,
6347 DnsCallsWithDisabledDnsClient_DisabledAtConstruction) {
6348 HostResolver::ManagerOptions options = DefaultOptions();
dalykc27699a2019-07-29 20:53:296349 options.insecure_dns_client_enabled = false;
Eric Orth4e55b362019-05-07 22:00:036350 CreateResolverWithOptionsAndParams(std::move(options),
6351 DefaultParams(proc_.get()),
6352 true /* ipv6_reachable */);
6353 ChangeDnsConfig(CreateValidDnsConfig());
6354
6355 HostResolver::ResolveHostParameters params;
6356 params.source = HostResolverSource::DNS;
6357 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556358 HostPortPair("host", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:506359 params, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth4e55b362019-05-07 22:00:036360
dalykc27699a2019-07-29 20:53:296361 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_CACHE_MISS));
Eric Orth4e55b362019-05-07 22:00:036362}
6363
6364// Same as DnsClient disabled, requests with source=DNS and no usable DnsConfig
6365// should result in an error.
6366TEST_F(HostResolverManagerDnsTest, DnsCallsWithNoDnsConfig) {
Eric Orthfe6d5482019-09-03 18:27:576367 InvalidateDnsConfig();
Eric Orth4e55b362019-05-07 22:00:036368
6369 HostResolver::ResolveHostParameters params;
6370 params.source = HostResolverSource::DNS;
6371 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556372 HostPortPair("host", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:506373 params, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth4e55b362019-05-07 22:00:036374
dalykc27699a2019-07-29 20:53:296375 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_CACHE_MISS));
Eric Orth4e55b362019-05-07 22:00:036376}
6377
Eric Orth607b6d82019-05-08 16:43:326378TEST_F(HostResolverManagerDnsTest, NoCheckIpv6OnWifi) {
rchce64e6732017-06-05 17:41:576379 // CreateSerialResolver will destroy the current resolver_ which will attempt
6380 // to remove itself from the NetworkChangeNotifier. If this happens after a
6381 // new NetworkChangeNotifier is active, then it will not remove itself from
6382 // the old NetworkChangeNotifier which is a potential use-after-free.
Eric Orth37b18192019-04-22 19:09:286383 DestroyResolver();
mgershaf9a9232017-04-13 20:19:036384 test::ScopedMockNetworkChangeNotifier notifier;
Eric Orth607b6d82019-05-08 16:43:326385 // Serial resolver to guarantee order of resolutions.
6386 CreateSerialResolver(false /* check_ipv6_on_wifi */);
mgershaf9a9232017-04-13 20:19:036387
6388 notifier.mock_network_change_notifier()->SetConnectionType(
6389 NetworkChangeNotifier::CONNECTION_WIFI);
6390 // Needed so IPv6 availability check isn't skipped.
6391 ChangeDnsConfig(CreateValidDnsConfig());
6392
6393 proc_->AddRule("h1", ADDRESS_FAMILY_UNSPECIFIED, "::3");
6394 proc_->AddRule("h1", ADDRESS_FAMILY_IPV4, "1.0.0.1");
Eric Orth322af3e42018-08-20 18:12:596395 proc_->AddRule("h1", ADDRESS_FAMILY_IPV4, "1.0.0.1",
6396 HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6);
mgershaf9a9232017-04-13 20:19:036397 proc_->AddRule("h1", ADDRESS_FAMILY_IPV6, "::2");
6398
Eric Orth117e1992019-04-17 00:24:156399 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556400 HostPortPair("h1", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:506401 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth00fe5a62018-08-15 22:20:006402 HostResolver::ResolveHostParameters parameters;
Eric Orth192e3bb2018-11-14 19:30:326403 parameters.dns_query_type = DnsQueryType::A;
Eric Orth117e1992019-04-17 00:24:156404 ResolveHostResponseHelper v4_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556405 HostPortPair("h1", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:506406 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth192e3bb2018-11-14 19:30:326407 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth117e1992019-04-17 00:24:156408 ResolveHostResponseHelper v6_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556409 HostPortPair("h1", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:506410 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:006411
Eric Orth00fe5a62018-08-15 22:20:006412 proc_->SignalMultiple(3u);
Eric Orth70992982018-07-24 00:25:006413
6414 // Should revert to only IPV4 request.
6415 EXPECT_THAT(response.result_error(), IsOk());
6416 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
6417 testing::ElementsAre(CreateExpected("1.0.0.1", 80)));
6418
Eric Orth00fe5a62018-08-15 22:20:006419 EXPECT_THAT(v4_response.result_error(), IsOk());
6420 EXPECT_THAT(v4_response.request()->GetAddressResults().value().endpoints(),
6421 testing::ElementsAre(CreateExpected("1.0.0.1", 80)));
6422 EXPECT_THAT(v6_response.result_error(), IsOk());
6423 EXPECT_THAT(v6_response.request()->GetAddressResults().value().endpoints(),
6424 testing::ElementsAre(CreateExpected("::2", 80)));
6425
Eric Orth70992982018-07-24 00:25:006426 // Now repeat the test on non-wifi to check that IPv6 is used as normal
6427 // after the network changes.
6428 notifier.mock_network_change_notifier()->SetConnectionType(
6429 NetworkChangeNotifier::CONNECTION_4G);
6430 base::RunLoop().RunUntilIdle(); // Wait for NetworkChangeNotifier.
6431
Eric Orth117e1992019-04-17 00:24:156432 ResolveHostResponseHelper no_wifi_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556433 HostPortPair("h1", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:506434 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth192e3bb2018-11-14 19:30:326435 parameters.dns_query_type = DnsQueryType::A;
Eric Orth117e1992019-04-17 00:24:156436 ResolveHostResponseHelper no_wifi_v4_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556437 HostPortPair("h1", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:506438 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth192e3bb2018-11-14 19:30:326439 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth117e1992019-04-17 00:24:156440 ResolveHostResponseHelper no_wifi_v6_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556441 HostPortPair("h1", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:506442 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:006443
Eric Orth00fe5a62018-08-15 22:20:006444 proc_->SignalMultiple(3u);
Eric Orth70992982018-07-24 00:25:006445
6446 // IPV6 should be available.
6447 EXPECT_THAT(no_wifi_response.result_error(), IsOk());
6448 EXPECT_THAT(
6449 no_wifi_response.request()->GetAddressResults().value().endpoints(),
6450 testing::ElementsAre(CreateExpected("::3", 80)));
Eric Orth00fe5a62018-08-15 22:20:006451
6452 EXPECT_THAT(no_wifi_v4_response.result_error(), IsOk());
6453 EXPECT_THAT(
6454 no_wifi_v4_response.request()->GetAddressResults().value().endpoints(),
6455 testing::ElementsAre(CreateExpected("1.0.0.1", 80)));
6456 EXPECT_THAT(no_wifi_v6_response.result_error(), IsOk());
6457 EXPECT_THAT(
6458 no_wifi_v6_response.request()->GetAddressResults().value().endpoints(),
6459 testing::ElementsAre(CreateExpected("::2", 80)));
Eric Orth70992982018-07-24 00:25:006460}
6461
Eric Orth960e7062019-03-08 18:43:546462TEST_F(HostResolverManagerDnsTest, NotFoundTTL) {
Brad Lassey2e8f185d2018-05-21 22:25:216463 CreateResolver();
Eric Orth60931742018-11-05 23:40:576464 set_allow_fallback_to_proctask(false);
Brad Lassey2e8f185d2018-05-21 22:25:216465 ChangeDnsConfig(CreateValidDnsConfig());
Eric Orth70992982018-07-24 00:25:006466
6467 // NODATA
Eric Orth117e1992019-04-17 00:24:156468 ResolveHostResponseHelper no_data_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556469 HostPortPair("empty", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:506470 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:006471 EXPECT_THAT(no_data_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
6472 EXPECT_FALSE(no_data_response.request()->GetAddressResults());
Eric Orth192e3bb2018-11-14 19:30:326473 HostCache::Key key("empty", DnsQueryType::UNSPECIFIED, 0,
Matt Menke7b4a32f2019-10-25 22:13:466474 HostResolverSource::ANY, NetworkIsolationKey());
Eric Orth70992982018-07-24 00:25:006475 HostCache::EntryStaleness staleness;
dalyk48b20a992019-02-25 16:10:266476 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result =
Eric Orthaf82b49a2020-02-01 01:48:506477 resolve_context_->host_cache()->Lookup(key, base::TimeTicks::Now(),
6478 false /* ignore_secure */);
dalyk48b20a992019-02-25 16:10:266479 EXPECT_TRUE(!!cache_result);
6480 EXPECT_TRUE(cache_result->second.has_ttl());
6481 EXPECT_THAT(cache_result->second.ttl(), base::TimeDelta::FromSeconds(86400));
Eric Orth70992982018-07-24 00:25:006482
6483 // NXDOMAIN
Eric Orth117e1992019-04-17 00:24:156484 ResolveHostResponseHelper no_domain_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556485 HostPortPair("nodomain", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:506486 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth70992982018-07-24 00:25:006487 EXPECT_THAT(no_domain_response.result_error(),
6488 IsError(ERR_NAME_NOT_RESOLVED));
6489 EXPECT_FALSE(no_domain_response.request()->GetAddressResults());
Eric Orth192e3bb2018-11-14 19:30:326490 HostCache::Key nxkey("nodomain", DnsQueryType::UNSPECIFIED, 0,
Matt Menke7b4a32f2019-10-25 22:13:466491 HostResolverSource::ANY, NetworkIsolationKey());
Eric Orthaf82b49a2020-02-01 01:48:506492 cache_result = resolve_context_->host_cache()->Lookup(
6493 nxkey, base::TimeTicks::Now(), false /* ignore_secure */);
dalyk48b20a992019-02-25 16:10:266494 EXPECT_TRUE(!!cache_result);
6495 EXPECT_TRUE(cache_result->second.has_ttl());
6496 EXPECT_THAT(cache_result->second.ttl(), base::TimeDelta::FromSeconds(86400));
Eric Orth70992982018-07-24 00:25:006497}
6498
Eric Orth960e7062019-03-08 18:43:546499TEST_F(HostResolverManagerDnsTest, CachedError) {
dalyk4f4ac712019-05-31 16:33:136500 proc_->AddRuleForAllFamilies(std::string(),
Eric Roman862ae4b22019-08-22 20:25:446501 "0.0.0.1"); // Default to failures.
dalyk4f4ac712019-05-31 16:33:136502 proc_->SignalMultiple(1u);
6503
Eric Ortheb332862019-01-26 00:52:386504 CreateResolver();
dalyk4f4ac712019-05-31 16:33:136505 set_allow_fallback_to_proctask(true);
Eric Ortheb332862019-01-26 00:52:386506 ChangeDnsConfig(CreateValidDnsConfig());
6507
6508 HostResolver::ResolveHostParameters cache_only_parameters;
6509 cache_only_parameters.source = HostResolverSource::LOCAL_ONLY;
6510
6511 // Expect cache initially empty.
dalyk4f4ac712019-05-31 16:33:136512 ResolveHostResponseHelper cache_miss_response0(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556513 HostPortPair("nodomain", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:506514 cache_only_parameters, resolve_context_.get(),
6515 resolve_context_->host_cache()));
dalyk4f4ac712019-05-31 16:33:136516 EXPECT_THAT(cache_miss_response0.result_error(), IsError(ERR_DNS_CACHE_MISS));
6517 EXPECT_FALSE(cache_miss_response0.request()->GetStaleInfo());
6518
6519 // The cache should not be populate with an error because fallback to ProcTask
6520 // was available.
6521 ResolveHostResponseHelper no_domain_response_with_fallback(
Matt Menkef4023312019-11-01 18:24:556522 resolver_->CreateRequest(HostPortPair("nodomain", 80),
6523 NetworkIsolationKey(), NetLogWithSource(),
Eric Orth069a3c6e2020-01-31 23:14:246524 base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:506525 resolve_context_->host_cache()));
dalyk4f4ac712019-05-31 16:33:136526 EXPECT_THAT(no_domain_response_with_fallback.result_error(),
6527 IsError(ERR_NAME_NOT_RESOLVED));
6528
6529 // Expect cache still empty.
6530 ResolveHostResponseHelper cache_miss_response1(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556531 HostPortPair("nodomain", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:506532 cache_only_parameters, resolve_context_.get(),
6533 resolve_context_->host_cache()));
dalyk4f4ac712019-05-31 16:33:136534 EXPECT_THAT(cache_miss_response1.result_error(), IsError(ERR_DNS_CACHE_MISS));
6535 EXPECT_FALSE(cache_miss_response1.request()->GetStaleInfo());
6536
6537 // Disable fallback to proctask
6538 set_allow_fallback_to_proctask(false);
Eric Ortheb332862019-01-26 00:52:386539
6540 // Populate cache with an error.
Eric Orth117e1992019-04-17 00:24:156541 ResolveHostResponseHelper no_domain_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556542 HostPortPair("nodomain", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:506543 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Ortheb332862019-01-26 00:52:386544 EXPECT_THAT(no_domain_response.result_error(),
6545 IsError(ERR_NAME_NOT_RESOLVED));
6546
6547 // Expect the error result can be resolved from the cache.
Eric Orth117e1992019-04-17 00:24:156548 ResolveHostResponseHelper cache_hit_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556549 HostPortPair("nodomain", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:506550 cache_only_parameters, resolve_context_.get(),
6551 resolve_context_->host_cache()));
Eric Ortheb332862019-01-26 00:52:386552 EXPECT_THAT(cache_hit_response.result_error(),
6553 IsError(ERR_NAME_NOT_RESOLVED));
6554 EXPECT_FALSE(cache_hit_response.request()->GetStaleInfo().value().is_stale());
6555}
6556
dalyk4f4ac712019-05-31 16:33:136557TEST_F(HostResolverManagerDnsTest, CachedError_AutomaticMode) {
6558 CreateResolver();
6559 set_allow_fallback_to_proctask(false);
6560 ChangeDnsConfig(CreateValidDnsConfig());
6561
6562 // Switch to automatic mode.
6563 DnsConfigOverrides overrides;
6564 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
6565 resolver_->SetDnsConfigOverrides(overrides);
6566
6567 HostCache::Key insecure_key =
6568 HostCache::Key("automatic_nodomain", DnsQueryType::UNSPECIFIED,
Matt Menke7b4a32f2019-10-25 22:13:466569 0 /* host_resolver_flags */, HostResolverSource::ANY,
6570 NetworkIsolationKey());
dalyk4f4ac712019-05-31 16:33:136571 HostCache::Key secure_key =
6572 HostCache::Key("automatic_nodomain", DnsQueryType::UNSPECIFIED,
Matt Menke7b4a32f2019-10-25 22:13:466573 0 /* host_resolver_flags */, HostResolverSource::ANY,
6574 NetworkIsolationKey());
dalyk4f4ac712019-05-31 16:33:136575 secure_key.secure = true;
6576
6577 // Expect cache initially empty.
6578 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result;
6579 cache_result = GetCacheHit(secure_key);
6580 EXPECT_FALSE(!!cache_result);
6581 cache_result = GetCacheHit(insecure_key);
6582 EXPECT_FALSE(!!cache_result);
6583
6584 // Populate both secure and insecure caches with an error.
6585 ResolveHostResponseHelper no_domain_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556586 HostPortPair("automatic_nodomain", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:246587 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:506588 resolve_context_->host_cache()));
dalyk4f4ac712019-05-31 16:33:136589 EXPECT_THAT(no_domain_response.result_error(),
6590 IsError(ERR_NAME_NOT_RESOLVED));
6591
6592 // Expect both secure and insecure caches to have the error result.
6593 cache_result = GetCacheHit(secure_key);
6594 EXPECT_TRUE(!!cache_result);
6595 cache_result = GetCacheHit(insecure_key);
6596 EXPECT_TRUE(!!cache_result);
6597}
6598
6599TEST_F(HostResolverManagerDnsTest, CachedError_SecureMode) {
6600 CreateResolver();
6601 set_allow_fallback_to_proctask(false);
6602 ChangeDnsConfig(CreateValidDnsConfig());
6603
6604 // Switch to secure mode.
6605 DnsConfigOverrides overrides;
6606 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::SECURE;
6607 resolver_->SetDnsConfigOverrides(overrides);
6608
6609 HostCache::Key insecure_key =
6610 HostCache::Key("automatic_nodomain", DnsQueryType::UNSPECIFIED,
Matt Menke7b4a32f2019-10-25 22:13:466611 0 /* host_resolver_flags */, HostResolverSource::ANY,
6612 NetworkIsolationKey());
dalyk4f4ac712019-05-31 16:33:136613 HostCache::Key secure_key =
6614 HostCache::Key("automatic_nodomain", DnsQueryType::UNSPECIFIED,
Matt Menke7b4a32f2019-10-25 22:13:466615 0 /* host_resolver_flags */, HostResolverSource::ANY,
6616 NetworkIsolationKey());
dalyk4f4ac712019-05-31 16:33:136617 secure_key.secure = true;
6618
6619 // Expect cache initially empty.
6620 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result;
6621 cache_result = GetCacheHit(secure_key);
6622 EXPECT_FALSE(!!cache_result);
6623 cache_result = GetCacheHit(insecure_key);
6624 EXPECT_FALSE(!!cache_result);
6625
6626 // Populate secure cache with an error.
6627 ResolveHostResponseHelper no_domain_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556628 HostPortPair("automatic_nodomain", 80), NetworkIsolationKey(),
Eric Orth069a3c6e2020-01-31 23:14:246629 NetLogWithSource(), base::nullopt, resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:506630 resolve_context_->host_cache()));
dalyk4f4ac712019-05-31 16:33:136631 EXPECT_THAT(no_domain_response.result_error(),
6632 IsError(ERR_NAME_NOT_RESOLVED));
6633
6634 // Expect only the secure cache to have the error result.
6635 cache_result = GetCacheHit(secure_key);
6636 EXPECT_TRUE(!!cache_result);
6637 cache_result = GetCacheHit(insecure_key);
6638 EXPECT_FALSE(!!cache_result);
6639}
6640
Eric Orth960e7062019-03-08 18:43:546641TEST_F(HostResolverManagerDnsTest, NoCanonicalName) {
Eric Orth828bd3ae2018-12-12 17:30:366642 MockDnsClientRuleList rules;
6643 AddDnsRule(&rules, "alias", dns_protocol::kTypeA, IPAddress::IPv4Localhost(),
dalyk48b20a992019-02-25 16:10:266644 "canonical", false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:366645 AddDnsRule(&rules, "alias", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:266646 IPAddress::IPv6Localhost(), "canonical", false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:366647
Asanka Herath2d0226c2018-10-24 14:35:556648 CreateResolver();
Eric Orth828bd3ae2018-12-12 17:30:366649 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
Eric Orth60931742018-11-05 23:40:576650 set_allow_fallback_to_proctask(false);
Eric Orth828bd3ae2018-12-12 17:30:366651
Eric Orth117e1992019-04-17 00:24:156652 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556653 HostPortPair("alias", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:506654 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Asanka Herath2d0226c2018-10-24 14:35:556655 ASSERT_THAT(response.result_error(), IsOk());
6656
Matt Menkec35d1632018-11-29 12:43:496657 // HostResolver may still give name, but if so, it must be correct.
6658 std::string result_name =
6659 response.request()->GetAddressResults().value().canonical_name();
6660 EXPECT_TRUE(result_name.empty() || result_name == "canonical");
Asanka Herath2d0226c2018-10-24 14:35:556661}
6662
Eric Orth960e7062019-03-08 18:43:546663TEST_F(HostResolverManagerDnsTest, CanonicalName) {
Eric Orth828bd3ae2018-12-12 17:30:366664 MockDnsClientRuleList rules;
6665 AddDnsRule(&rules, "alias", dns_protocol::kTypeA, IPAddress::IPv4Localhost(),
dalyk48b20a992019-02-25 16:10:266666 "canonical", false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:366667 AddDnsRule(&rules, "alias", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:266668 IPAddress::IPv6Localhost(), "canonical", false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:366669
Asanka Herath2d0226c2018-10-24 14:35:556670 CreateResolver();
Eric Orth828bd3ae2018-12-12 17:30:366671 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
Eric Orth60931742018-11-05 23:40:576672 set_allow_fallback_to_proctask(false);
Eric Orth828bd3ae2018-12-12 17:30:366673
Asanka Herath2d0226c2018-10-24 14:35:556674 HostResolver::ResolveHostParameters params;
Asanka Herath2d0226c2018-10-24 14:35:556675 params.include_canonical_name = true;
Eric Orth541a90c2019-01-17 20:11:466676 params.source = HostResolverSource::DNS;
Eric Orth117e1992019-04-17 00:24:156677 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556678 HostPortPair("alias", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:506679 params, resolve_context_.get(), resolve_context_->host_cache()));
Asanka Herath2d0226c2018-10-24 14:35:556680 ASSERT_THAT(response.result_error(), IsOk());
6681
6682 EXPECT_EQ(response.request()->GetAddressResults().value().canonical_name(),
6683 "canonical");
6684}
6685
Eric Orth960e7062019-03-08 18:43:546686TEST_F(HostResolverManagerDnsTest, CanonicalName_PreferV6) {
Eric Orth828bd3ae2018-12-12 17:30:366687 MockDnsClientRuleList rules;
6688 AddDnsRule(&rules, "alias", dns_protocol::kTypeA, IPAddress::IPv4Localhost(),
dalyk48b20a992019-02-25 16:10:266689 "wrong", false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:366690 AddDnsRule(&rules, "alias", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:266691 IPAddress::IPv6Localhost(), "correct", true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:366692
Asanka Herath2d0226c2018-10-24 14:35:556693 CreateResolver();
Eric Orth828bd3ae2018-12-12 17:30:366694 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
Eric Orth60931742018-11-05 23:40:576695 set_allow_fallback_to_proctask(false);
Eric Orth828bd3ae2018-12-12 17:30:366696
Asanka Herath2d0226c2018-10-24 14:35:556697 HostResolver::ResolveHostParameters params;
Asanka Herath2d0226c2018-10-24 14:35:556698 params.include_canonical_name = true;
Eric Orth541a90c2019-01-17 20:11:466699 params.source = HostResolverSource::DNS;
Eric Orth117e1992019-04-17 00:24:156700 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556701 HostPortPair("alias", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:506702 params, resolve_context_.get(), resolve_context_->host_cache()));
Asanka Herath2d0226c2018-10-24 14:35:556703 ASSERT_FALSE(response.complete());
6704 base::RunLoop().RunUntilIdle();
6705 dns_client_->CompleteDelayedTransactions();
6706 ASSERT_THAT(response.result_error(), IsOk());
6707 EXPECT_EQ(response.request()->GetAddressResults().value().canonical_name(),
6708 "correct");
6709}
6710
Eric Orth960e7062019-03-08 18:43:546711TEST_F(HostResolverManagerDnsTest, CanonicalName_V4Only) {
Eric Orth828bd3ae2018-12-12 17:30:366712 MockDnsClientRuleList rules;
6713 AddDnsRule(&rules, "alias", dns_protocol::kTypeA, IPAddress::IPv4Localhost(),
dalyk48b20a992019-02-25 16:10:266714 "correct", false /* delay */);
Asanka Herath2d0226c2018-10-24 14:35:556715 CreateResolver();
Eric Orth828bd3ae2018-12-12 17:30:366716 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
Eric Orth60931742018-11-05 23:40:576717 set_allow_fallback_to_proctask(false);
Eric Orth828bd3ae2018-12-12 17:30:366718
Asanka Herath2d0226c2018-10-24 14:35:556719 HostResolver::ResolveHostParameters params;
Eric Orth192e3bb2018-11-14 19:30:326720 params.dns_query_type = DnsQueryType::A;
Asanka Herath2d0226c2018-10-24 14:35:556721 params.include_canonical_name = true;
Eric Orth541a90c2019-01-17 20:11:466722 params.source = HostResolverSource::DNS;
Eric Orth117e1992019-04-17 00:24:156723 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556724 HostPortPair("alias", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:506725 params, resolve_context_.get(), resolve_context_->host_cache()));
Asanka Herath2d0226c2018-10-24 14:35:556726 ASSERT_THAT(response.result_error(), IsOk());
6727 EXPECT_EQ(response.request()->GetAddressResults().value().canonical_name(),
6728 "correct");
6729}
6730
Eric Orth541a90c2019-01-17 20:11:466731// Test that without specifying source, a request that would otherwise be
6732// handled by DNS is sent to the system resolver if cannonname is requested.
Eric Orth960e7062019-03-08 18:43:546733TEST_F(HostResolverManagerDnsTest, CanonicalNameForcesProc) {
Eric Orth541a90c2019-01-17 20:11:466734 // Disable fallback to ensure system resolver is used directly, not via
6735 // fallback.
6736 set_allow_fallback_to_proctask(false);
6737
6738 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.102",
6739 HOST_RESOLVER_CANONNAME, "canonical");
6740 proc_->SignalMultiple(1u);
6741
6742 ChangeDnsConfig(CreateValidDnsConfig());
6743
6744 HostResolver::ResolveHostParameters params;
6745 params.include_canonical_name = true;
6746 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556747 HostPortPair("nx_succeed", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:506748 params, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth541a90c2019-01-17 20:11:466749 ASSERT_THAT(response.result_error(), IsOk());
6750
6751 EXPECT_EQ(response.request()->GetAddressResults().value().canonical_name(),
6752 "canonical");
6753}
6754
David Van Cleve34c74c72019-10-31 19:58:016755TEST_F(HostResolverManagerDnsTest, SortsAndDeduplicatesAddresses) {
6756 MockDnsClientRuleList rules;
6757
6758 {
6759 std::vector<DnsResourceRecord> answers(
6760 3, BuildTestAddressRecord("duplicate", IPAddress::IPv4Localhost()));
6761 std::string dns_name;
6762 CHECK(DNSDomainFromDot("duplicate", &dns_name));
6763 base::Optional<DnsQuery> query(base::in_place, 0, dns_name,
6764 dns_protocol::kTypeA);
6765
6766 rules.emplace_back(
6767 "duplicate", dns_protocol::kTypeA, false /* secure */,
6768 MockDnsClientRule::Result(std::make_unique<DnsResponse>(
6769 0, false, std::move(answers),
6770 std::vector<DnsResourceRecord>() /* authority_records */,
6771 std::vector<DnsResourceRecord>() /* additional_records */, query)),
6772 false /* delay */);
6773 }
6774
6775 {
6776 std::vector<DnsResourceRecord> answers(
6777 3, BuildTestAddressRecord("duplicate", IPAddress::IPv6Localhost()));
6778 std::string dns_name;
6779 CHECK(DNSDomainFromDot("duplicate", &dns_name));
6780 base::Optional<DnsQuery> query(base::in_place, 0, dns_name,
6781 dns_protocol::kTypeAAAA);
6782
6783 rules.emplace_back(
6784 "duplicate", dns_protocol::kTypeAAAA, false /* secure */,
6785 MockDnsClientRule::Result(std::make_unique<DnsResponse>(
6786 0, false, std::move(answers),
6787 std::vector<DnsResourceRecord>() /* authority_records */,
6788 std::vector<DnsResourceRecord>() /* additional_records */, query)),
6789 false /* delay */);
6790 }
6791
6792 CreateResolver();
6793 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6794
6795 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556796 HostPortPair("duplicate", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:506797 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
David Van Cleve34c74c72019-10-31 19:58:016798 ASSERT_THAT(response.result_error(), IsOk());
6799
6800 EXPECT_THAT(
6801 response.request()->GetAddressResults(),
6802 testing::Optional(testing::Property(
6803 &AddressList::endpoints,
6804 testing::ElementsAre(IPEndPoint(IPAddress::IPv6Localhost(), 80),
6805 IPEndPoint(IPAddress::IPv4Localhost(), 80)))));
6806}
6807
Eric Orth960e7062019-03-08 18:43:546808TEST_F(HostResolverManagerTest, ResolveLocalHostname) {
tfarina9ed7f8c52016-02-19 17:50:186809 AddressList addresses;
6810
6811 TestBothLoopbackIPs("localhost");
6812 TestBothLoopbackIPs("localhoST");
6813 TestBothLoopbackIPs("localhost.");
6814 TestBothLoopbackIPs("localhoST.");
6815 TestBothLoopbackIPs("localhost.localdomain");
6816 TestBothLoopbackIPs("localhost.localdomAIn");
6817 TestBothLoopbackIPs("localhost.localdomain.");
6818 TestBothLoopbackIPs("localhost.localdomAIn.");
6819 TestBothLoopbackIPs("foo.localhost");
6820 TestBothLoopbackIPs("foo.localhOSt");
6821 TestBothLoopbackIPs("foo.localhost.");
6822 TestBothLoopbackIPs("foo.localhOSt.");
6823
6824 TestIPv6LoopbackOnly("localhost6");
6825 TestIPv6LoopbackOnly("localhoST6");
6826 TestIPv6LoopbackOnly("localhost6.");
6827 TestIPv6LoopbackOnly("localhost6.localdomain6");
6828 TestIPv6LoopbackOnly("localhost6.localdomain6.");
6829
Matt Menkec35d1632018-11-29 12:43:496830 EXPECT_FALSE(ResolveLocalHostname("127.0.0.1", &addresses));
6831 EXPECT_FALSE(ResolveLocalHostname("::1", &addresses));
6832 EXPECT_FALSE(ResolveLocalHostname("0:0:0:0:0:0:0:1", &addresses));
6833 EXPECT_FALSE(ResolveLocalHostname("localhostx", &addresses));
6834 EXPECT_FALSE(ResolveLocalHostname("localhost.x", &addresses));
6835 EXPECT_FALSE(ResolveLocalHostname("foo.localdomain", &addresses));
6836 EXPECT_FALSE(ResolveLocalHostname("foo.localdomain.x", &addresses));
6837 EXPECT_FALSE(ResolveLocalHostname("localhost6x", &addresses));
6838 EXPECT_FALSE(ResolveLocalHostname("localhost.localdomain6", &addresses));
6839 EXPECT_FALSE(ResolveLocalHostname("localhost6.localdomain", &addresses));
6840 EXPECT_FALSE(ResolveLocalHostname("127.0.0.1.1", &addresses));
6841 EXPECT_FALSE(ResolveLocalHostname(".127.0.0.255", &addresses));
6842 EXPECT_FALSE(ResolveLocalHostname("::2", &addresses));
6843 EXPECT_FALSE(ResolveLocalHostname("::1:1", &addresses));
6844 EXPECT_FALSE(ResolveLocalHostname("0:0:0:0:1:0:0:1", &addresses));
6845 EXPECT_FALSE(ResolveLocalHostname("::1:1", &addresses));
6846 EXPECT_FALSE(ResolveLocalHostname("0:0:0:0:0:0:0:0:1", &addresses));
6847 EXPECT_FALSE(ResolveLocalHostname("foo.localhost.com", &addresses));
6848 EXPECT_FALSE(ResolveLocalHostname("foo.localhoste", &addresses));
tfarina9ed7f8c52016-02-19 17:50:186849}
6850
Eric Orth960e7062019-03-08 18:43:546851TEST_F(HostResolverManagerDnsTest, AddDnsOverHttpsServerAfterConfig) {
Eric Orth37b18192019-04-22 19:09:286852 DestroyResolver();
Brad Lassey786929ad2018-02-21 20:54:276853 test::ScopedMockNetworkChangeNotifier notifier;
6854 CreateSerialResolver(); // To guarantee order of resolutions.
6855 notifier.mock_network_change_notifier()->SetConnectionType(
6856 NetworkChangeNotifier::CONNECTION_WIFI);
6857 ChangeDnsConfig(CreateValidDnsConfig());
6858
dalykb34631f2018-08-24 19:59:486859 std::string server("https://dnsserver.example.net/dns-query{?dns}");
Eric Orthc1eb1292018-10-09 22:07:076860 DnsConfigOverrides overrides;
6861 overrides.dns_over_https_servers.emplace(
6862 {DnsConfig::DnsOverHttpsServerConfig(server, true)});
dalykc27699a2019-07-29 20:53:296863 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
Eric Orthc1eb1292018-10-09 22:07:076864 resolver_->SetDnsConfigOverrides(overrides);
Brad Lassey786929ad2018-02-21 20:54:276865 base::DictionaryValue* config;
6866
6867 auto value = resolver_->GetDnsConfigAsValue();
6868 EXPECT_TRUE(value);
6869 if (!value)
6870 return;
6871 value->GetAsDictionary(&config);
6872 base::ListValue* doh_servers;
6873 config->GetListWithoutPathExpansion("doh_servers", &doh_servers);
6874 EXPECT_TRUE(doh_servers);
6875 if (!doh_servers)
6876 return;
6877 EXPECT_EQ(doh_servers->GetSize(), 1u);
6878 base::DictionaryValue* server_method;
6879 EXPECT_TRUE(doh_servers->GetDictionary(0, &server_method));
6880 bool use_post;
6881 EXPECT_TRUE(server_method->GetBoolean("use_post", &use_post));
6882 EXPECT_TRUE(use_post);
dalykb34631f2018-08-24 19:59:486883 std::string server_template;
6884 EXPECT_TRUE(server_method->GetString("server_template", &server_template));
6885 EXPECT_EQ(server_template, server);
dalykc27699a2019-07-29 20:53:296886 EXPECT_EQ(config->FindKey("secure_dns_mode")->GetInt(),
6887 static_cast<int>(DnsConfig::SecureDnsMode::AUTOMATIC));
Brad Lassey786929ad2018-02-21 20:54:276888}
6889
Eric Orth960e7062019-03-08 18:43:546890TEST_F(HostResolverManagerDnsTest, AddDnsOverHttpsServerBeforeConfig) {
Eric Orth37b18192019-04-22 19:09:286891 DestroyResolver();
Brad Lassey786929ad2018-02-21 20:54:276892 test::ScopedMockNetworkChangeNotifier notifier;
6893 CreateSerialResolver(); // To guarantee order of resolutions.
dalykb34631f2018-08-24 19:59:486894 std::string server("https://dnsserver.example.net/dns-query{?dns}");
Eric Orthc1eb1292018-10-09 22:07:076895 DnsConfigOverrides overrides;
6896 overrides.dns_over_https_servers.emplace(
6897 {DnsConfig::DnsOverHttpsServerConfig(server, true)});
dalykc27699a2019-07-29 20:53:296898 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
Eric Orthc1eb1292018-10-09 22:07:076899 resolver_->SetDnsConfigOverrides(overrides);
Brad Lassey786929ad2018-02-21 20:54:276900
6901 notifier.mock_network_change_notifier()->SetConnectionType(
6902 NetworkChangeNotifier::CONNECTION_WIFI);
6903 ChangeDnsConfig(CreateValidDnsConfig());
6904
6905 base::DictionaryValue* config;
6906 auto value = resolver_->GetDnsConfigAsValue();
6907 EXPECT_TRUE(value);
6908 if (!value)
6909 return;
6910 value->GetAsDictionary(&config);
6911 base::ListValue* doh_servers;
6912 config->GetListWithoutPathExpansion("doh_servers", &doh_servers);
6913 EXPECT_TRUE(doh_servers);
6914 if (!doh_servers)
6915 return;
6916 EXPECT_EQ(doh_servers->GetSize(), 1u);
6917 base::DictionaryValue* server_method;
6918 EXPECT_TRUE(doh_servers->GetDictionary(0, &server_method));
6919 bool use_post;
6920 EXPECT_TRUE(server_method->GetBoolean("use_post", &use_post));
6921 EXPECT_TRUE(use_post);
dalykb34631f2018-08-24 19:59:486922 std::string server_template;
6923 EXPECT_TRUE(server_method->GetString("server_template", &server_template));
6924 EXPECT_EQ(server_template, server);
dalykc27699a2019-07-29 20:53:296925 EXPECT_EQ(config->FindKey("secure_dns_mode")->GetInt(),
6926 static_cast<int>(DnsConfig::SecureDnsMode::AUTOMATIC));
Brad Lassey786929ad2018-02-21 20:54:276927}
6928
Eric Orth960e7062019-03-08 18:43:546929TEST_F(HostResolverManagerDnsTest, AddDnsOverHttpsServerBeforeClient) {
Eric Orth37b18192019-04-22 19:09:286930 DestroyResolver();
Brad Lassey786929ad2018-02-21 20:54:276931 test::ScopedMockNetworkChangeNotifier notifier;
6932 CreateSerialResolver(); // To guarantee order of resolutions.
dalykb34631f2018-08-24 19:59:486933 std::string server("https://dnsserver.example.net/dns-query{?dns}");
Eric Orthc1eb1292018-10-09 22:07:076934 DnsConfigOverrides overrides;
6935 overrides.dns_over_https_servers.emplace(
6936 {DnsConfig::DnsOverHttpsServerConfig(server, true)});
dalykc27699a2019-07-29 20:53:296937 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
Eric Orthc1eb1292018-10-09 22:07:076938 resolver_->SetDnsConfigOverrides(overrides);
Brad Lassey786929ad2018-02-21 20:54:276939
6940 notifier.mock_network_change_notifier()->SetConnectionType(
6941 NetworkChangeNotifier::CONNECTION_WIFI);
6942 ChangeDnsConfig(CreateValidDnsConfig());
6943
Brad Lassey786929ad2018-02-21 20:54:276944 base::DictionaryValue* config;
6945 auto value = resolver_->GetDnsConfigAsValue();
6946 EXPECT_TRUE(value);
6947 if (!value)
6948 return;
6949 value->GetAsDictionary(&config);
6950 base::ListValue* doh_servers;
6951 config->GetListWithoutPathExpansion("doh_servers", &doh_servers);
6952 EXPECT_TRUE(doh_servers);
6953 if (!doh_servers)
6954 return;
6955 EXPECT_EQ(doh_servers->GetSize(), 1u);
6956 base::DictionaryValue* server_method;
6957 EXPECT_TRUE(doh_servers->GetDictionary(0, &server_method));
6958 bool use_post;
6959 EXPECT_TRUE(server_method->GetBoolean("use_post", &use_post));
6960 EXPECT_TRUE(use_post);
dalykb34631f2018-08-24 19:59:486961 std::string server_template;
6962 EXPECT_TRUE(server_method->GetString("server_template", &server_template));
6963 EXPECT_EQ(server_template, server);
dalykc27699a2019-07-29 20:53:296964 EXPECT_EQ(config->FindKey("secure_dns_mode")->GetInt(),
6965 static_cast<int>(DnsConfig::SecureDnsMode::AUTOMATIC));
Brad Lassey786929ad2018-02-21 20:54:276966}
6967
Eric Orth960e7062019-03-08 18:43:546968TEST_F(HostResolverManagerDnsTest, AddDnsOverHttpsServerAndThenRemove) {
Eric Orth37b18192019-04-22 19:09:286969 DestroyResolver();
Brad Lassey786929ad2018-02-21 20:54:276970 test::ScopedMockNetworkChangeNotifier notifier;
6971 CreateSerialResolver(); // To guarantee order of resolutions.
dalykb34631f2018-08-24 19:59:486972 std::string server("https://dns.example.com/");
Eric Orthc1eb1292018-10-09 22:07:076973 DnsConfigOverrides overrides;
6974 overrides.dns_over_https_servers.emplace(
6975 {DnsConfig::DnsOverHttpsServerConfig(server, true)});
dalykc27699a2019-07-29 20:53:296976 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
Eric Orthc1eb1292018-10-09 22:07:076977 resolver_->SetDnsConfigOverrides(overrides);
Brad Lassey786929ad2018-02-21 20:54:276978
6979 notifier.mock_network_change_notifier()->SetConnectionType(
6980 NetworkChangeNotifier::CONNECTION_WIFI);
dalyk4f4ac712019-05-31 16:33:136981 DnsConfig network_dns_config = CreateValidDnsConfig();
6982 network_dns_config.dns_over_https_servers.clear();
6983 ChangeDnsConfig(network_dns_config);
Brad Lassey786929ad2018-02-21 20:54:276984
6985 base::DictionaryValue* config;
6986 auto value = resolver_->GetDnsConfigAsValue();
6987 EXPECT_TRUE(value);
6988 if (!value)
6989 return;
6990 value->GetAsDictionary(&config);
6991 base::ListValue* doh_servers;
6992 config->GetListWithoutPathExpansion("doh_servers", &doh_servers);
6993 EXPECT_TRUE(doh_servers);
6994 if (!doh_servers)
6995 return;
6996 EXPECT_EQ(doh_servers->GetSize(), 1u);
6997 base::DictionaryValue* server_method;
6998 EXPECT_TRUE(doh_servers->GetDictionary(0, &server_method));
6999 bool use_post;
7000 EXPECT_TRUE(server_method->GetBoolean("use_post", &use_post));
7001 EXPECT_TRUE(use_post);
dalykb34631f2018-08-24 19:59:487002 std::string server_template;
7003 EXPECT_TRUE(server_method->GetString("server_template", &server_template));
7004 EXPECT_EQ(server_template, server);
dalykc27699a2019-07-29 20:53:297005 EXPECT_EQ(config->FindKey("secure_dns_mode")->GetInt(),
7006 static_cast<int>(DnsConfig::SecureDnsMode::AUTOMATIC));
Brad Lassey786929ad2018-02-21 20:54:277007
Eric Orthc1eb1292018-10-09 22:07:077008 resolver_->SetDnsConfigOverrides(DnsConfigOverrides());
Brad Lassey786929ad2018-02-21 20:54:277009 value = resolver_->GetDnsConfigAsValue();
7010 EXPECT_TRUE(value);
7011 if (!value)
7012 return;
7013 value->GetAsDictionary(&config);
7014 config->GetListWithoutPathExpansion("doh_servers", &doh_servers);
7015 EXPECT_TRUE(doh_servers);
7016 if (!doh_servers)
7017 return;
7018 EXPECT_EQ(doh_servers->GetSize(), 0u);
dalykc27699a2019-07-29 20:53:297019 EXPECT_EQ(config->FindKey("secure_dns_mode")->GetInt(),
7020 static_cast<int>(DnsConfig::SecureDnsMode::OFF));
Brad Lassey786929ad2018-02-21 20:54:277021}
7022
Eric Orth394db1732019-08-27 20:09:397023// Basic test socket factory that allows creation of UDP sockets, but those
7024// sockets are mocks with no data and are not expected to be usable.
7025class AlwaysFailSocketFactory : public MockClientSocketFactory {
7026 public:
7027 std::unique_ptr<DatagramClientSocket> CreateDatagramClientSocket(
7028 DatagramSocket::BindType bind_type,
7029 NetLog* net_log,
7030 const NetLogSource& source) override {
7031 return std::make_unique<MockUDPClientSocket>();
7032 }
7033};
7034
Eric Ortha3559ca2019-09-05 23:40:547035class TestDnsObserver : public NetworkChangeNotifier::DNSObserver {
7036 public:
7037 void OnDNSChanged() override { ++dns_changed_calls_; }
7038
Eric Ortha3559ca2019-09-05 23:40:547039 int dns_changed_calls() const { return dns_changed_calls_; }
7040
7041 private:
7042 int dns_changed_calls_ = 0;
7043};
7044
Eric Orth394db1732019-08-27 20:09:397045// Built-in client and config overrides not available on iOS.
7046#if !defined(OS_IOS)
Eric Orth960e7062019-03-08 18:43:547047TEST_F(HostResolverManagerDnsTest, SetDnsConfigOverrides) {
Eric Ortha3559ca2019-09-05 23:40:547048 test::ScopedMockNetworkChangeNotifier mock_network_change_notifier;
7049 TestDnsObserver config_observer;
7050 NetworkChangeNotifier::AddDNSObserver(&config_observer);
7051
Eric Orth394db1732019-08-27 20:09:397052 // Use a real DnsClient to test config-handling behavior.
7053 AlwaysFailSocketFactory socket_factory;
7054 auto client = DnsClient::CreateClientForTesting(
7055 nullptr /* net_log */, &socket_factory, base::Bind(&base::RandInt));
7056 DnsClient* client_ptr = client.get();
7057 resolver_->SetDnsClientForTesting(std::move(client));
7058
Eric Orthc1eb1292018-10-09 22:07:077059 DnsConfig original_config = CreateValidDnsConfig();
7060 ChangeDnsConfig(original_config);
7061
7062 // Confirm pre-override state.
Eric Orth394db1732019-08-27 20:09:397063 ASSERT_EQ(original_config, *client_ptr->GetEffectiveConfig());
Eric Orthc1eb1292018-10-09 22:07:077064
7065 DnsConfigOverrides overrides;
7066 const std::vector<IPEndPoint> nameservers = {
7067 CreateExpected("192.168.0.1", 92)};
7068 overrides.nameservers = nameservers;
7069 const std::vector<std::string> search = {"str"};
7070 overrides.search = search;
7071 const DnsHosts hosts = {
7072 {DnsHostsKey("host", ADDRESS_FAMILY_IPV4), IPAddress(192, 168, 1, 1)}};
7073 overrides.hosts = hosts;
7074 overrides.append_to_multi_label_name = false;
7075 overrides.randomize_ports = true;
7076 const int ndots = 5;
7077 overrides.ndots = ndots;
7078 const base::TimeDelta timeout = base::TimeDelta::FromSeconds(10);
7079 overrides.timeout = timeout;
7080 const int attempts = 20;
7081 overrides.attempts = attempts;
7082 overrides.rotate = true;
7083 overrides.use_local_ipv6 = true;
7084 const std::vector<DnsConfig::DnsOverHttpsServerConfig>
7085 dns_over_https_servers = {
7086 DnsConfig::DnsOverHttpsServerConfig("dns.example.com", true)};
7087 overrides.dns_over_https_servers = dns_over_https_servers;
dalykbd726ee2019-05-30 01:44:067088 const DnsConfig::SecureDnsMode secure_dns_mode =
7089 DnsConfig::SecureDnsMode::SECURE;
7090 overrides.secure_dns_mode = secure_dns_mode;
dalykf93a48e372019-09-04 02:57:597091 overrides.allow_dns_over_https_upgrade = true;
7092 const std::vector<std::string> disabled_upgrade_providers = {"provider_name"};
7093 overrides.disabled_upgrade_providers = disabled_upgrade_providers;
Eric Orthc1eb1292018-10-09 22:07:077094
Eric Orthc823a23d2018-10-30 22:12:487095 // This test is expected to test overriding all fields.
7096 EXPECT_TRUE(overrides.OverridesEverything());
7097
Eric Ortha3559ca2019-09-05 23:40:547098 EXPECT_EQ(0, config_observer.dns_changed_calls());
7099
Eric Orthc1eb1292018-10-09 22:07:077100 resolver_->SetDnsConfigOverrides(overrides);
7101
Eric Orth394db1732019-08-27 20:09:397102 const DnsConfig* overridden_config = client_ptr->GetEffectiveConfig();
7103 ASSERT_TRUE(overridden_config);
Eric Orthc1eb1292018-10-09 22:07:077104 EXPECT_EQ(nameservers, overridden_config->nameservers);
7105 EXPECT_EQ(search, overridden_config->search);
7106 EXPECT_EQ(hosts, overridden_config->hosts);
7107 EXPECT_FALSE(overridden_config->append_to_multi_label_name);
7108 EXPECT_TRUE(overridden_config->randomize_ports);
7109 EXPECT_EQ(ndots, overridden_config->ndots);
7110 EXPECT_EQ(timeout, overridden_config->timeout);
7111 EXPECT_EQ(attempts, overridden_config->attempts);
7112 EXPECT_TRUE(overridden_config->rotate);
7113 EXPECT_TRUE(overridden_config->use_local_ipv6);
7114 EXPECT_EQ(dns_over_https_servers, overridden_config->dns_over_https_servers);
dalykbd726ee2019-05-30 01:44:067115 EXPECT_EQ(secure_dns_mode, overridden_config->secure_dns_mode);
dalykf93a48e372019-09-04 02:57:597116 EXPECT_TRUE(overridden_config->allow_dns_over_https_upgrade);
7117 EXPECT_EQ(disabled_upgrade_providers,
7118 overridden_config->disabled_upgrade_providers);
Eric Ortha3559ca2019-09-05 23:40:547119
7120 base::RunLoop().RunUntilIdle(); // Notifications are async.
7121 EXPECT_EQ(1, config_observer.dns_changed_calls());
7122
7123 NetworkChangeNotifier::RemoveDNSObserver(&config_observer);
Eric Orthc1eb1292018-10-09 22:07:077124}
7125
Eric Orth960e7062019-03-08 18:43:547126TEST_F(HostResolverManagerDnsTest,
Eric Orthc823a23d2018-10-30 22:12:487127 SetDnsConfigOverrides_OverrideEverythingCreation) {
Eric Orth394db1732019-08-27 20:09:397128 // Use a real DnsClient to test config-handling behavior.
7129 AlwaysFailSocketFactory socket_factory;
7130 auto client = DnsClient::CreateClientForTesting(
7131 nullptr /* net_log */, &socket_factory, base::Bind(&base::RandInt));
7132 DnsClient* client_ptr = client.get();
7133 resolver_->SetDnsClientForTesting(std::move(client));
7134
Eric Orthc823a23d2018-10-30 22:12:487135 DnsConfig original_config = CreateValidDnsConfig();
7136 ChangeDnsConfig(original_config);
7137
7138 // Confirm pre-override state.
Eric Orth394db1732019-08-27 20:09:397139 ASSERT_EQ(original_config, *client_ptr->GetEffectiveConfig());
Eric Orthc823a23d2018-10-30 22:12:487140 ASSERT_FALSE(original_config.Equals(DnsConfig()));
7141
7142 DnsConfigOverrides overrides =
7143 DnsConfigOverrides::CreateOverridingEverythingWithDefaults();
7144 EXPECT_TRUE(overrides.OverridesEverything());
7145
7146 // Ensure config is valid by setting a nameserver.
7147 std::vector<IPEndPoint> nameservers = {CreateExpected("1.2.3.4", 50)};
7148 overrides.nameservers = nameservers;
7149 EXPECT_TRUE(overrides.OverridesEverything());
7150
7151 resolver_->SetDnsConfigOverrides(overrides);
7152
7153 DnsConfig expected;
7154 expected.nameservers = nameservers;
Eric Orth394db1732019-08-27 20:09:397155 EXPECT_THAT(client_ptr->GetEffectiveConfig(), testing::Pointee(expected));
Eric Orthc823a23d2018-10-30 22:12:487156}
7157
Eric Orth960e7062019-03-08 18:43:547158TEST_F(HostResolverManagerDnsTest, SetDnsConfigOverrides_PartialOverride) {
Eric Orth394db1732019-08-27 20:09:397159 // Use a real DnsClient to test config-handling behavior.
7160 AlwaysFailSocketFactory socket_factory;
7161 auto client = DnsClient::CreateClientForTesting(
7162 nullptr /* net_log */, &socket_factory, base::Bind(&base::RandInt));
7163 DnsClient* client_ptr = client.get();
7164 resolver_->SetDnsClientForTesting(std::move(client));
7165
Eric Orthc1eb1292018-10-09 22:07:077166 DnsConfig original_config = CreateValidDnsConfig();
7167 ChangeDnsConfig(original_config);
7168
7169 // Confirm pre-override state.
Eric Orth394db1732019-08-27 20:09:397170 ASSERT_EQ(original_config, *client_ptr->GetEffectiveConfig());
Eric Orthc1eb1292018-10-09 22:07:077171
7172 DnsConfigOverrides overrides;
7173 const std::vector<IPEndPoint> nameservers = {
7174 CreateExpected("192.168.0.2", 192)};
7175 overrides.nameservers = nameservers;
7176 overrides.rotate = true;
Eric Orthc823a23d2018-10-30 22:12:487177 EXPECT_FALSE(overrides.OverridesEverything());
Eric Orthc1eb1292018-10-09 22:07:077178
7179 resolver_->SetDnsConfigOverrides(overrides);
7180
Eric Orth394db1732019-08-27 20:09:397181 const DnsConfig* overridden_config = client_ptr->GetEffectiveConfig();
7182 ASSERT_TRUE(overridden_config);
Eric Orthc1eb1292018-10-09 22:07:077183 EXPECT_EQ(nameservers, overridden_config->nameservers);
7184 EXPECT_EQ(original_config.search, overridden_config->search);
7185 EXPECT_EQ(original_config.hosts, overridden_config->hosts);
7186 EXPECT_TRUE(overridden_config->append_to_multi_label_name);
7187 EXPECT_FALSE(overridden_config->randomize_ports);
7188 EXPECT_EQ(original_config.ndots, overridden_config->ndots);
7189 EXPECT_EQ(original_config.timeout, overridden_config->timeout);
7190 EXPECT_EQ(original_config.attempts, overridden_config->attempts);
7191 EXPECT_TRUE(overridden_config->rotate);
7192 EXPECT_FALSE(overridden_config->use_local_ipv6);
7193 EXPECT_EQ(original_config.dns_over_https_servers,
7194 overridden_config->dns_over_https_servers);
dalykbd726ee2019-05-30 01:44:067195 EXPECT_EQ(original_config.secure_dns_mode,
7196 overridden_config->secure_dns_mode);
Eric Orthc1eb1292018-10-09 22:07:077197}
7198
7199// Test that overridden configs are reapplied over a changed underlying system
7200// config.
Eric Orth960e7062019-03-08 18:43:547201TEST_F(HostResolverManagerDnsTest, SetDnsConfigOverrides_NewConfig) {
Eric Orth394db1732019-08-27 20:09:397202 // Use a real DnsClient to test config-handling behavior.
7203 AlwaysFailSocketFactory socket_factory;
7204 auto client = DnsClient::CreateClientForTesting(
7205 nullptr /* net_log */, &socket_factory, base::Bind(&base::RandInt));
7206 DnsClient* client_ptr = client.get();
7207 resolver_->SetDnsClientForTesting(std::move(client));
7208
Eric Orthc1eb1292018-10-09 22:07:077209 DnsConfig original_config = CreateValidDnsConfig();
7210 ChangeDnsConfig(original_config);
7211
7212 // Confirm pre-override state.
Eric Orth394db1732019-08-27 20:09:397213 ASSERT_EQ(original_config, *client_ptr->GetEffectiveConfig());
Eric Orthc1eb1292018-10-09 22:07:077214
7215 DnsConfigOverrides overrides;
7216 const std::vector<IPEndPoint> nameservers = {
7217 CreateExpected("192.168.0.2", 192)};
7218 overrides.nameservers = nameservers;
7219
7220 resolver_->SetDnsConfigOverrides(overrides);
Eric Orth394db1732019-08-27 20:09:397221 ASSERT_TRUE(client_ptr->GetEffectiveConfig());
7222 ASSERT_EQ(nameservers, client_ptr->GetEffectiveConfig()->nameservers);
Eric Orthc1eb1292018-10-09 22:07:077223
7224 DnsConfig new_config = original_config;
7225 new_config.attempts = 103;
7226 ASSERT_NE(nameservers, new_config.nameservers);
7227 ChangeDnsConfig(new_config);
7228
Eric Orth394db1732019-08-27 20:09:397229 const DnsConfig* overridden_config = client_ptr->GetEffectiveConfig();
7230 ASSERT_TRUE(overridden_config);
Eric Orthc1eb1292018-10-09 22:07:077231 EXPECT_EQ(nameservers, overridden_config->nameservers);
7232 EXPECT_EQ(new_config.attempts, overridden_config->attempts);
7233}
7234
Eric Orth960e7062019-03-08 18:43:547235TEST_F(HostResolverManagerDnsTest, SetDnsConfigOverrides_ClearOverrides) {
Eric Orth394db1732019-08-27 20:09:397236 // Use a real DnsClient to test config-handling behavior.
7237 AlwaysFailSocketFactory socket_factory;
7238 auto client = DnsClient::CreateClientForTesting(
7239 nullptr /* net_log */, &socket_factory, base::Bind(&base::RandInt));
7240 DnsClient* client_ptr = client.get();
7241 resolver_->SetDnsClientForTesting(std::move(client));
7242
Eric Orthc1eb1292018-10-09 22:07:077243 DnsConfig original_config = CreateValidDnsConfig();
7244 ChangeDnsConfig(original_config);
7245
7246 DnsConfigOverrides overrides;
7247 overrides.attempts = 245;
7248 resolver_->SetDnsConfigOverrides(overrides);
7249
Eric Orth394db1732019-08-27 20:09:397250 ASSERT_THAT(client_ptr->GetEffectiveConfig(),
7251 testing::Not(testing::Pointee(original_config)));
Eric Orthc1eb1292018-10-09 22:07:077252
7253 resolver_->SetDnsConfigOverrides(DnsConfigOverrides());
Eric Orth394db1732019-08-27 20:09:397254 EXPECT_THAT(client_ptr->GetEffectiveConfig(),
7255 testing::Pointee(original_config));
Eric Orthc1eb1292018-10-09 22:07:077256}
dalykf93a48e372019-09-04 02:57:597257
Eric Ortha3559ca2019-09-05 23:40:547258TEST_F(HostResolverManagerDnsTest, SetDnsConfigOverrides_NoChange) {
7259 test::ScopedMockNetworkChangeNotifier mock_network_change_notifier;
7260 TestDnsObserver config_observer;
7261 NetworkChangeNotifier::AddDNSObserver(&config_observer);
7262
7263 // Use a real DnsClient to test config-handling behavior.
7264 AlwaysFailSocketFactory socket_factory;
7265 auto client = DnsClient::CreateClientForTesting(
7266 nullptr /* net_log */, &socket_factory, base::Bind(&base::RandInt));
7267 DnsClient* client_ptr = client.get();
7268 resolver_->SetDnsClientForTesting(std::move(client));
7269
7270 DnsConfig original_config = CreateValidDnsConfig();
7271 ChangeDnsConfig(original_config);
7272
7273 // Confirm pre-override state.
7274 ASSERT_EQ(original_config, *client_ptr->GetEffectiveConfig());
7275
7276 DnsConfigOverrides overrides;
7277 overrides.nameservers = original_config.nameservers;
7278
7279 EXPECT_EQ(0, config_observer.dns_changed_calls());
7280
7281 resolver_->SetDnsConfigOverrides(overrides);
7282 EXPECT_THAT(client_ptr->GetEffectiveConfig(),
7283 testing::Pointee(original_config));
7284
7285 base::RunLoop().RunUntilIdle(); // Notifications are async.
7286 EXPECT_EQ(0,
7287 config_observer.dns_changed_calls()); // No expected notification
7288
7289 NetworkChangeNotifier::RemoveDNSObserver(&config_observer);
7290}
7291
7292// No effect or notifications expected using partial overrides without a base
7293// system config.
7294TEST_F(HostResolverManagerDnsTest, NoBaseConfig_PartialOverrides) {
7295 test::ScopedMockNetworkChangeNotifier mock_network_change_notifier;
7296 TestDnsObserver config_observer;
7297 NetworkChangeNotifier::AddDNSObserver(&config_observer);
7298
7299 // Use a real DnsClient to test config-handling behavior.
7300 AlwaysFailSocketFactory socket_factory;
7301 auto client = DnsClient::CreateClientForTesting(
7302 nullptr /* net_log */, &socket_factory, base::Bind(&base::RandInt));
7303 DnsClient* client_ptr = client.get();
7304 resolver_->SetDnsClientForTesting(std::move(client));
7305
7306 client_ptr->SetSystemConfig(base::nullopt);
7307
7308 DnsConfigOverrides overrides;
7309 overrides.nameservers.emplace({CreateExpected("192.168.0.3", 193)});
7310 resolver_->SetDnsConfigOverrides(overrides);
7311 base::RunLoop().RunUntilIdle(); // Potential notifications are async.
7312
7313 EXPECT_FALSE(client_ptr->GetEffectiveConfig());
7314 EXPECT_EQ(0, config_observer.dns_changed_calls());
7315
7316 NetworkChangeNotifier::RemoveDNSObserver(&config_observer);
7317}
7318
7319TEST_F(HostResolverManagerDnsTest, NoBaseConfig_OverridesEverything) {
7320 test::ScopedMockNetworkChangeNotifier mock_network_change_notifier;
7321 TestDnsObserver config_observer;
7322 NetworkChangeNotifier::AddDNSObserver(&config_observer);
7323
7324 // Use a real DnsClient to test config-handling behavior.
7325 AlwaysFailSocketFactory socket_factory;
7326 auto client = DnsClient::CreateClientForTesting(
7327 nullptr /* net_log */, &socket_factory, base::Bind(&base::RandInt));
7328 DnsClient* client_ptr = client.get();
7329 resolver_->SetDnsClientForTesting(std::move(client));
7330
7331 client_ptr->SetSystemConfig(base::nullopt);
7332
7333 DnsConfigOverrides overrides =
7334 DnsConfigOverrides::CreateOverridingEverythingWithDefaults();
7335 const std::vector<IPEndPoint> nameservers = {
7336 CreateExpected("192.168.0.4", 194)};
7337 overrides.nameservers = nameservers;
7338 resolver_->SetDnsConfigOverrides(overrides);
7339 base::RunLoop().RunUntilIdle(); // Notifications are async.
7340
7341 DnsConfig expected;
7342 expected.nameservers = nameservers;
7343
7344 EXPECT_THAT(client_ptr->GetEffectiveConfig(), testing::Pointee(expected));
7345 EXPECT_EQ(1, config_observer.dns_changed_calls());
7346
7347 NetworkChangeNotifier::RemoveDNSObserver(&config_observer);
7348}
7349
dalykf93a48e372019-09-04 02:57:597350TEST_F(HostResolverManagerDnsTest, DohMapping) {
7351 // Use a real DnsClient to test config-handling behavior.
7352 AlwaysFailSocketFactory socket_factory;
7353 auto client = DnsClient::CreateClientForTesting(
7354 nullptr /* net_log */, &socket_factory, base::Bind(&base::RandInt));
7355 DnsClient* client_ptr = client.get();
7356 resolver_->SetDnsClientForTesting(std::move(client));
7357
7358 // Create a DnsConfig containing IP addresses associated with Cloudflare,
7359 // SafeBrowsing family filter, SafeBrowsing security filter, and other IPs
7360 // not associated with hardcoded DoH services.
7361 DnsConfig original_config = CreateUpgradableDnsConfig();
7362 ChangeDnsConfig(original_config);
7363
7364 const DnsConfig* fetched_config = client_ptr->GetEffectiveConfig();
7365 EXPECT_EQ(original_config.nameservers, fetched_config->nameservers);
7366 std::vector<DnsConfig::DnsOverHttpsServerConfig> expected_doh_servers = {
7367 {"https://chrome.cloudflare-dns.com/dns-query", true /* use-post */},
7368 {"https://doh.cleanbrowsing.org/doh/family-filter{?dns}",
7369 false /* use_post */},
7370 {"https://doh.cleanbrowsing.org/doh/security-filter{?dns}",
7371 false /* use_post */}};
7372 EXPECT_EQ(expected_doh_servers, fetched_config->dns_over_https_servers);
7373}
7374
7375TEST_F(HostResolverManagerDnsTest, DohMappingDisabled) {
7376 // Use a real DnsClient to test config-handling behavior.
7377 AlwaysFailSocketFactory socket_factory;
7378 auto client = DnsClient::CreateClientForTesting(
7379 nullptr /* net_log */, &socket_factory, base::Bind(&base::RandInt));
7380 DnsClient* client_ptr = client.get();
7381 resolver_->SetDnsClientForTesting(std::move(client));
7382
7383 // Create a DnsConfig containing IP addresses associated with Cloudflare,
7384 // SafeBrowsing family filter, SafeBrowsing security filter, and other IPs
7385 // not associated with hardcoded DoH services.
7386 DnsConfig original_config = CreateUpgradableDnsConfig();
7387 original_config.allow_dns_over_https_upgrade = false;
7388 ChangeDnsConfig(original_config);
7389
7390 const DnsConfig* fetched_config = client_ptr->GetEffectiveConfig();
7391 EXPECT_EQ(original_config.nameservers, fetched_config->nameservers);
7392 std::vector<DnsConfig::DnsOverHttpsServerConfig> expected_doh_servers = {};
7393 EXPECT_EQ(expected_doh_servers, fetched_config->dns_over_https_servers);
7394}
7395
7396TEST_F(HostResolverManagerDnsTest, DohMappingModeIneligibleForUpgrade) {
7397 // Use a real DnsClient to test config-handling behavior.
7398 AlwaysFailSocketFactory socket_factory;
7399 auto client = DnsClient::CreateClientForTesting(
7400 nullptr /* net_log */, &socket_factory, base::Bind(&base::RandInt));
7401 DnsClient* client_ptr = client.get();
7402 resolver_->SetDnsClientForTesting(std::move(client));
7403
7404 // Create a DnsConfig containing IP addresses associated with Cloudflare,
7405 // SafeBrowsing family filter, SafeBrowsing security filter, and other IPs
7406 // not associated with hardcoded DoH services.
7407 DnsConfig original_config = CreateUpgradableDnsConfig();
7408 original_config.secure_dns_mode = DnsConfig::SecureDnsMode::SECURE;
7409 ChangeDnsConfig(original_config);
7410
7411 const DnsConfig* fetched_config = client_ptr->GetEffectiveConfig();
7412 EXPECT_EQ(original_config.nameservers, fetched_config->nameservers);
7413 std::vector<DnsConfig::DnsOverHttpsServerConfig> expected_doh_servers = {};
7414 EXPECT_EQ(expected_doh_servers, fetched_config->dns_over_https_servers);
7415}
7416
7417TEST_F(HostResolverManagerDnsTest, DohMappingWithExclusion) {
7418 // Use a real DnsClient to test config-handling behavior.
7419 AlwaysFailSocketFactory socket_factory;
7420 auto client = DnsClient::CreateClientForTesting(
7421 nullptr /* net_log */, &socket_factory, base::Bind(&base::RandInt));
7422 DnsClient* client_ptr = client.get();
7423 resolver_->SetDnsClientForTesting(std::move(client));
7424
7425 // Create a DnsConfig containing IP addresses associated with Cloudflare,
7426 // SafeBrowsing family filter, SafeBrowsing security filter, and other IPs
7427 // not associated with hardcoded DoH services.
7428 DnsConfig original_config = CreateUpgradableDnsConfig();
7429 original_config.disabled_upgrade_providers = {"CleanBrowsingSecure",
7430 "Cloudflare", "Unexpected"};
7431 ChangeDnsConfig(original_config);
7432
7433 // A DoH upgrade should be attempted on the DNS servers in the config, but
7434 // only for permitted providers.
7435 const DnsConfig* fetched_config = client_ptr->GetEffectiveConfig();
7436 EXPECT_EQ(original_config.nameservers, fetched_config->nameservers);
7437 std::vector<DnsConfig::DnsOverHttpsServerConfig> expected_doh_servers = {
7438 {"https://doh.cleanbrowsing.org/doh/family-filter{?dns}",
7439 false /* use_post */}};
7440 EXPECT_EQ(expected_doh_servers, fetched_config->dns_over_https_servers);
7441}
7442
7443TEST_F(HostResolverManagerDnsTest, DohMappingIgnoredIfTemplateSpecified) {
7444 // Use a real DnsClient to test config-handling behavior.
7445 AlwaysFailSocketFactory socket_factory;
7446 auto client = DnsClient::CreateClientForTesting(
7447 nullptr /* net_log */, &socket_factory, base::Bind(&base::RandInt));
7448 DnsClient* client_ptr = client.get();
7449 resolver_->SetDnsClientForTesting(std::move(client));
7450
7451 // Create a DnsConfig containing IP addresses associated with Cloudflare,
7452 // SafeBrowsing family filter, SafeBrowsing security filter, and other IPs
7453 // not associated with hardcoded DoH services.
7454 DnsConfig original_config = CreateUpgradableDnsConfig();
7455 ChangeDnsConfig(original_config);
7456
7457 // If the overrides contains DoH servers, no DoH upgrade should be attempted.
7458 DnsConfigOverrides overrides;
7459 const std::vector<DnsConfig::DnsOverHttpsServerConfig>
7460 dns_over_https_servers_overrides = {
7461 DnsConfig::DnsOverHttpsServerConfig("doh.server.override.com", true)};
7462 overrides.dns_over_https_servers = dns_over_https_servers_overrides;
7463 resolver_->SetDnsConfigOverrides(overrides);
7464 const DnsConfig* fetched_config = client_ptr->GetEffectiveConfig();
7465 EXPECT_EQ(original_config.nameservers, fetched_config->nameservers);
7466 EXPECT_EQ(dns_over_https_servers_overrides,
7467 fetched_config->dns_over_https_servers);
7468}
7469
7470TEST_F(HostResolverManagerDnsTest, DohMappingWithAutomaticDot) {
7471 // Use a real DnsClient to test config-handling behavior.
7472 AlwaysFailSocketFactory socket_factory;
7473 auto client = DnsClient::CreateClientForTesting(
7474 nullptr /* net_log */, &socket_factory, base::Bind(&base::RandInt));
7475 DnsClient* client_ptr = client.get();
7476 resolver_->SetDnsClientForTesting(std::move(client));
7477
7478 // Create a DnsConfig containing IP addresses associated with Cloudflare,
7479 // SafeBrowsing family filter, SafeBrowsing security filter, and other IPs
7480 // not associated with hardcoded DoH services.
7481 DnsConfig original_config = CreateUpgradableDnsConfig();
7482 original_config.dns_over_tls_active = true;
7483 ChangeDnsConfig(original_config);
7484
7485 const DnsConfig* fetched_config = client_ptr->GetEffectiveConfig();
7486 EXPECT_EQ(original_config.nameservers, fetched_config->nameservers);
7487 std::vector<DnsConfig::DnsOverHttpsServerConfig> expected_doh_servers = {
7488 {"https://chrome.cloudflare-dns.com/dns-query", true /* use-post */},
7489 {"https://doh.cleanbrowsing.org/doh/family-filter{?dns}",
7490 false /* use_post */},
7491 {"https://doh.cleanbrowsing.org/doh/security-filter{?dns}",
7492 false /* use_post */}};
7493 EXPECT_EQ(expected_doh_servers, fetched_config->dns_over_https_servers);
7494}
7495
7496TEST_F(HostResolverManagerDnsTest, DohMappingWithStrictDot) {
7497 // Use a real DnsClient to test config-handling behavior.
7498 AlwaysFailSocketFactory socket_factory;
7499 auto client = DnsClient::CreateClientForTesting(
7500 nullptr /* net_log */, &socket_factory, base::Bind(&base::RandInt));
7501 DnsClient* client_ptr = client.get();
7502 resolver_->SetDnsClientForTesting(std::move(client));
7503
7504 // Create a DnsConfig containing IP addresses associated with Cloudflare,
7505 // SafeBrowsing family filter, SafeBrowsing security filter, and other IPs
7506 // not associated with hardcoded DoH services.
7507 DnsConfig original_config = CreateUpgradableDnsConfig();
7508 original_config.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
7509 original_config.dns_over_tls_active = true;
7510
7511 // Google DoT hostname
7512 original_config.dns_over_tls_hostname = "dns.google";
7513 ChangeDnsConfig(original_config);
7514 const DnsConfig* fetched_config = client_ptr->GetEffectiveConfig();
7515 EXPECT_EQ(original_config.nameservers, fetched_config->nameservers);
7516 std::vector<DnsConfig::DnsOverHttpsServerConfig> expected_doh_servers = {
7517 {"https://dns.google/dns-query{?dns}", false /* use_post */}};
7518 EXPECT_EQ(expected_doh_servers, fetched_config->dns_over_https_servers);
7519}
7520
Eric Orth394db1732019-08-27 20:09:397521#endif // !defined(OS_IOS)
Eric Orthc1eb1292018-10-09 22:07:077522
Eric Orth37b18192019-04-22 19:09:287523TEST_F(HostResolverManagerDnsTest, FlushCacheOnDnsConfigOverridesChange) {
7524 ChangeDnsConfig(CreateValidDnsConfig());
7525
7526 HostResolver::ResolveHostParameters local_source_parameters;
7527 local_source_parameters.source = HostResolverSource::LOCAL_ONLY;
7528
7529 // Populate cache.
7530 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557531 HostPortPair("ok", 70), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:507532 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth37b18192019-04-22 19:09:287533 EXPECT_THAT(initial_response.result_error(), IsOk());
7534
7535 // Confirm result now cached.
7536 ResolveHostResponseHelper cached_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557537 HostPortPair("ok", 75), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:507538 local_source_parameters, resolve_context_.get(),
7539 resolve_context_->host_cache()));
Eric Orth37b18192019-04-22 19:09:287540 ASSERT_THAT(cached_response.result_error(), IsOk());
7541 ASSERT_TRUE(cached_response.request()->GetStaleInfo());
7542
7543 // Flush cache by triggering a DnsConfigOverrides change.
7544 DnsConfigOverrides overrides;
7545 overrides.attempts = 4;
7546 resolver_->SetDnsConfigOverrides(overrides);
7547
7548 // Expect no longer cached
7549 ResolveHostResponseHelper flushed_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557550 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:507551 local_source_parameters, resolve_context_.get(),
7552 resolve_context_->host_cache()));
Eric Orth37b18192019-04-22 19:09:287553 EXPECT_THAT(flushed_response.result_error(), IsError(ERR_DNS_CACHE_MISS));
7554}
7555
Eric Orthaf82b49a2020-02-01 01:48:507556TEST_F(HostResolverManagerDnsTest,
7557 FlushContextSessionDataOnDnsConfigOverridesChange) {
7558 ChangeDnsConfig(CreateValidDnsConfig());
7559
7560 DnsSession* session_before = dns_client_->GetCurrentSession();
7561 resolve_context_->SetProbeSuccess(0u, true, session_before);
7562 ASSERT_TRUE(resolve_context_->GetDohServerAvailability(0u, session_before));
7563
7564 // Flush data by triggering a DnsConfigOverrides change.
7565 DnsConfigOverrides overrides;
7566 overrides.attempts = 4;
7567 resolver_->SetDnsConfigOverrides(overrides);
7568
7569 DnsSession* session_after = dns_client_->GetCurrentSession();
7570 EXPECT_NE(session_before, session_after);
7571
7572 EXPECT_FALSE(resolve_context_->GetDohServerAvailability(0u, session_after));
7573
7574 // Confirm new session is in use.
7575 resolve_context_->SetProbeSuccess(0u, true, session_after);
7576 EXPECT_TRUE(resolve_context_->GetDohServerAvailability(0u, session_after));
7577}
7578
Eric Orthc823a23d2018-10-30 22:12:487579// Test that even when using config overrides, a change to the base system
7580// config cancels pending requests.
Eric Orth960e7062019-03-08 18:43:547581TEST_F(HostResolverManagerDnsTest, CancellationOnBaseConfigChange) {
Eric Orthc823a23d2018-10-30 22:12:487582 DnsConfig original_config = CreateValidDnsConfig();
7583 ChangeDnsConfig(original_config);
7584
7585 DnsConfigOverrides overrides;
7586 overrides.nameservers.emplace({CreateExpected("123.123.123.123", 80)});
7587 ASSERT_FALSE(overrides.OverridesEverything());
7588 resolver_->SetDnsConfigOverrides(overrides);
7589
Eric Orth117e1992019-04-17 00:24:157590 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557591 HostPortPair("4slow_ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:507592 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthc823a23d2018-10-30 22:12:487593 ASSERT_FALSE(response.complete());
7594
7595 DnsConfig new_config = original_config;
7596 new_config.attempts = 103;
7597 ChangeDnsConfig(new_config);
7598
7599 EXPECT_THAT(response.result_error(), IsError(ERR_NETWORK_CHANGED));
7600}
7601
7602// Test that when all configuration is overridden, system configuration changes
7603// do not cancel requests.
Eric Orth960e7062019-03-08 18:43:547604TEST_F(HostResolverManagerDnsTest,
Eric Orthc823a23d2018-10-30 22:12:487605 CancellationOnBaseConfigChange_OverridesEverything) {
7606 DnsConfig original_config = CreateValidDnsConfig();
7607 ChangeDnsConfig(original_config);
7608
7609 DnsConfigOverrides overrides =
7610 DnsConfigOverrides::CreateOverridingEverythingWithDefaults();
7611 overrides.nameservers.emplace({CreateExpected("123.123.123.123", 80)});
7612 ASSERT_TRUE(overrides.OverridesEverything());
7613 resolver_->SetDnsConfigOverrides(overrides);
7614
Eric Orth117e1992019-04-17 00:24:157615 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557616 HostPortPair("4slow_ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:507617 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthc823a23d2018-10-30 22:12:487618 ASSERT_FALSE(response.complete());
7619
7620 DnsConfig new_config = original_config;
7621 new_config.attempts = 103;
7622 ChangeDnsConfig(new_config);
7623
7624 dns_client_->CompleteDelayedTransactions();
7625 EXPECT_THAT(response.result_error(), IsOk());
7626}
7627
Eric Orthc1eb1292018-10-09 22:07:077628// Test that in-progress queries are cancelled on applying new DNS config
7629// overrides, same as receiving a new DnsConfig from the system.
Eric Orth960e7062019-03-08 18:43:547630TEST_F(HostResolverManagerDnsTest, CancelQueriesOnSettingOverrides) {
Eric Orthc1eb1292018-10-09 22:07:077631 ChangeDnsConfig(CreateValidDnsConfig());
Eric Orth117e1992019-04-17 00:24:157632 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557633 HostPortPair("4slow_ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:507634 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthc1eb1292018-10-09 22:07:077635 ASSERT_FALSE(response.complete());
7636
7637 DnsConfigOverrides overrides;
7638 overrides.attempts = 123;
7639 resolver_->SetDnsConfigOverrides(overrides);
7640
7641 EXPECT_THAT(response.result_error(), IsError(ERR_NETWORK_CHANGED));
7642}
7643
7644// Queries should not be cancelled if equal overrides are set.
Eric Orth960e7062019-03-08 18:43:547645TEST_F(HostResolverManagerDnsTest,
7646 CancelQueriesOnSettingOverrides_SameOverrides) {
Eric Orthc1eb1292018-10-09 22:07:077647 ChangeDnsConfig(CreateValidDnsConfig());
7648 DnsConfigOverrides overrides;
7649 overrides.attempts = 123;
7650 resolver_->SetDnsConfigOverrides(overrides);
7651
Eric Orth117e1992019-04-17 00:24:157652 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557653 HostPortPair("4slow_ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:507654 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthc1eb1292018-10-09 22:07:077655 ASSERT_FALSE(response.complete());
7656
7657 resolver_->SetDnsConfigOverrides(overrides);
7658
Eric Orthc823a23d2018-10-30 22:12:487659 dns_client_->CompleteDelayedTransactions();
Eric Orthc1eb1292018-10-09 22:07:077660 EXPECT_THAT(response.result_error(), IsOk());
7661}
7662
7663// Test that in-progress queries are cancelled on clearing DNS config overrides,
7664// same as receiving a new DnsConfig from the system.
Eric Orth960e7062019-03-08 18:43:547665TEST_F(HostResolverManagerDnsTest, CancelQueriesOnClearingOverrides) {
Eric Orthc1eb1292018-10-09 22:07:077666 ChangeDnsConfig(CreateValidDnsConfig());
7667 DnsConfigOverrides overrides;
7668 overrides.attempts = 123;
7669 resolver_->SetDnsConfigOverrides(overrides);
7670
Eric Orth117e1992019-04-17 00:24:157671 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557672 HostPortPair("4slow_ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:507673 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthc1eb1292018-10-09 22:07:077674 ASSERT_FALSE(response.complete());
7675
7676 resolver_->SetDnsConfigOverrides(DnsConfigOverrides());
7677
7678 EXPECT_THAT(response.result_error(), IsError(ERR_NETWORK_CHANGED));
7679}
7680
7681// Queries should not be cancelled on clearing overrides if there were not any
7682// overrides.
Eric Orth960e7062019-03-08 18:43:547683TEST_F(HostResolverManagerDnsTest,
7684 CancelQueriesOnClearingOverrides_NoOverrides) {
Eric Orthc1eb1292018-10-09 22:07:077685 ChangeDnsConfig(CreateValidDnsConfig());
Eric Orth117e1992019-04-17 00:24:157686 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557687 HostPortPair("4slow_ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:507688 base::nullopt, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthc1eb1292018-10-09 22:07:077689 ASSERT_FALSE(response.complete());
7690
7691 resolver_->SetDnsConfigOverrides(DnsConfigOverrides());
7692
Eric Orthc823a23d2018-10-30 22:12:487693 dns_client_->CompleteDelayedTransactions();
Eric Orthc1eb1292018-10-09 22:07:077694 EXPECT_THAT(response.result_error(), IsOk());
7695}
7696
Eric Orthaf82b49a2020-02-01 01:48:507697TEST_F(HostResolverManagerDnsTest,
7698 FlushContextSessionDataOnSystemConfigChange) {
7699 DnsConfig original_config = CreateValidDnsConfig();
7700 ChangeDnsConfig(original_config);
7701
7702 DnsSession* session_before = dns_client_->GetCurrentSession();
7703 resolve_context_->SetProbeSuccess(0u, true, session_before);
7704 ASSERT_TRUE(resolve_context_->GetDohServerAvailability(0u, session_before));
7705
7706 // Flush data by triggering a config change.
7707 DnsConfig new_config = original_config;
7708 new_config.attempts = 103;
7709 ChangeDnsConfig(new_config);
7710
7711 DnsSession* session_after = dns_client_->GetCurrentSession();
7712 EXPECT_NE(session_before, session_after);
7713
7714 EXPECT_FALSE(resolve_context_->GetDohServerAvailability(0u, session_after));
7715
7716 // Confirm new session is in use.
7717 resolve_context_->SetProbeSuccess(0u, true, session_after);
7718 EXPECT_TRUE(resolve_context_->GetDohServerAvailability(0u, session_after));
7719}
7720
Eric Orth960e7062019-03-08 18:43:547721TEST_F(HostResolverManagerDnsTest, TxtQuery) {
Eric Orth828bd3ae2018-12-12 17:30:367722 // Simulate two separate DNS records, each with multiple strings.
7723 std::vector<std::string> foo_records = {"foo1", "foo2", "foo3"};
7724 std::vector<std::string> bar_records = {"bar1", "bar2"};
7725 std::vector<std::vector<std::string>> text_records = {foo_records,
7726 bar_records};
7727
7728 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137729 rules.emplace_back("host", dns_protocol::kTypeTXT, false /* secure */,
dalykc0ab0722019-03-14 17:00:587730 MockDnsClientRule::Result(BuildTestDnsTextResponse(
7731 "host", std::move(text_records))),
Eric Orth828bd3ae2018-12-12 17:30:367732 false /* delay */);
7733
7734 CreateResolver();
7735 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7736
7737 HostResolver::ResolveHostParameters parameters;
7738 parameters.dns_query_type = DnsQueryType::TXT;
7739
Eric Orth117e1992019-04-17 00:24:157740 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557741 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:507742 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth828bd3ae2018-12-12 17:30:367743 EXPECT_THAT(response.result_error(), IsOk());
7744 EXPECT_FALSE(response.request()->GetAddressResults());
7745 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:407746 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Orth828bd3ae2018-12-12 17:30:367747
7748 // Order between separate DNS records is undefined, but each record should
7749 // stay in order as that order may be meaningful.
7750 ASSERT_THAT(response.request()->GetTextResults(),
7751 testing::Optional(testing::UnorderedElementsAre(
7752 "foo1", "foo2", "foo3", "bar1", "bar2")));
7753 std::vector<std::string> results =
7754 response.request()->GetTextResults().value();
7755 EXPECT_NE(results.end(), std::search(results.begin(), results.end(),
7756 foo_records.begin(), foo_records.end()));
7757 EXPECT_NE(results.end(), std::search(results.begin(), results.end(),
7758 bar_records.begin(), bar_records.end()));
7759}
7760
dalykc27699a2019-07-29 20:53:297761TEST_F(HostResolverManagerDnsTest, TxtQuery_InvalidConfig) {
7762 set_allow_fallback_to_proctask(false);
7763 // Set empty DnsConfig.
Eric Orthfe6d5482019-09-03 18:27:577764 InvalidateDnsConfig();
dalykc27699a2019-07-29 20:53:297765
7766 HostResolver::ResolveHostParameters parameters;
7767 parameters.dns_query_type = DnsQueryType::TXT;
7768
7769 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557770 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:507771 parameters, resolve_context_.get(), resolve_context_->host_cache()));
dalykc27699a2019-07-29 20:53:297772 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_CACHE_MISS));
7773}
7774
Eric Orth960e7062019-03-08 18:43:547775TEST_F(HostResolverManagerDnsTest, TxtQuery_NonexistentDomain) {
Eric Orth828bd3ae2018-12-12 17:30:367776 // Setup fallback to confirm it is not used for non-address results.
7777 set_allow_fallback_to_proctask(true);
7778 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
7779 proc_->SignalMultiple(1u);
7780
7781 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137782 rules.emplace_back("host", dns_protocol::kTypeTXT, false /* secure */,
Eric Orth828bd3ae2018-12-12 17:30:367783 MockDnsClientRule::Result(MockDnsClientRule::NODOMAIN),
7784 false /* delay */);
7785
7786 CreateResolver();
7787 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7788
7789 HostResolver::ResolveHostParameters parameters;
7790 parameters.dns_query_type = DnsQueryType::TXT;
7791
Eric Orth117e1992019-04-17 00:24:157792 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557793 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:507794 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth828bd3ae2018-12-12 17:30:367795 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
7796 EXPECT_FALSE(response.request()->GetAddressResults());
7797 EXPECT_FALSE(response.request()->GetTextResults());
7798 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:407799 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Orth828bd3ae2018-12-12 17:30:367800}
7801
Eric Orth960e7062019-03-08 18:43:547802TEST_F(HostResolverManagerDnsTest, TxtQuery_Failure) {
Eric Orth828bd3ae2018-12-12 17:30:367803 // Setup fallback to confirm it is not used for non-address results.
7804 set_allow_fallback_to_proctask(true);
7805 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
7806 proc_->SignalMultiple(1u);
7807
7808 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137809 rules.emplace_back("host", dns_protocol::kTypeTXT, false /* secure */,
7810 MockDnsClientRule::Result(MockDnsClientRule::FAIL),
7811 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:367812
7813 CreateResolver();
7814 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7815
7816 HostResolver::ResolveHostParameters parameters;
7817 parameters.dns_query_type = DnsQueryType::TXT;
7818
Eric Orth117e1992019-04-17 00:24:157819 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557820 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:507821 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth828bd3ae2018-12-12 17:30:367822 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
7823 EXPECT_FALSE(response.request()->GetAddressResults());
7824 EXPECT_FALSE(response.request()->GetTextResults());
7825 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:407826 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Orth828bd3ae2018-12-12 17:30:367827}
7828
Eric Orth960e7062019-03-08 18:43:547829TEST_F(HostResolverManagerDnsTest, TxtQuery_Timeout) {
Eric Orth828bd3ae2018-12-12 17:30:367830 // Setup fallback to confirm it is not used for non-address results.
7831 set_allow_fallback_to_proctask(true);
7832 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
7833 proc_->SignalMultiple(1u);
7834
7835 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137836 rules.emplace_back("host", dns_protocol::kTypeTXT, false /* secure */,
7837 MockDnsClientRule::Result(MockDnsClientRule::TIMEOUT),
7838 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:367839
7840 CreateResolver();
7841 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7842
7843 HostResolver::ResolveHostParameters parameters;
7844 parameters.dns_query_type = DnsQueryType::TXT;
7845
Eric Orth117e1992019-04-17 00:24:157846 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557847 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:507848 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth828bd3ae2018-12-12 17:30:367849 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_TIMED_OUT));
7850 EXPECT_FALSE(response.request()->GetAddressResults());
7851 EXPECT_FALSE(response.request()->GetTextResults());
7852 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:407853 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Orth828bd3ae2018-12-12 17:30:367854}
7855
Eric Orth960e7062019-03-08 18:43:547856TEST_F(HostResolverManagerDnsTest, TxtQuery_Empty) {
Eric Orth828bd3ae2018-12-12 17:30:367857 // Setup fallback to confirm it is not used for non-address results.
7858 set_allow_fallback_to_proctask(true);
7859 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
7860 proc_->SignalMultiple(1u);
7861
7862 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137863 rules.emplace_back("host", dns_protocol::kTypeTXT, false /* secure */,
7864 MockDnsClientRule::Result(MockDnsClientRule::EMPTY),
7865 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:367866
7867 CreateResolver();
7868 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7869
7870 HostResolver::ResolveHostParameters parameters;
7871 parameters.dns_query_type = DnsQueryType::TXT;
7872
Eric Orth117e1992019-04-17 00:24:157873 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557874 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:507875 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth828bd3ae2018-12-12 17:30:367876 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
7877 EXPECT_FALSE(response.request()->GetAddressResults());
7878 EXPECT_FALSE(response.request()->GetTextResults());
7879 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:407880 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Orth828bd3ae2018-12-12 17:30:367881}
7882
Eric Orth960e7062019-03-08 18:43:547883TEST_F(HostResolverManagerDnsTest, TxtQuery_Malformed) {
Eric Orth828bd3ae2018-12-12 17:30:367884 // Setup fallback to confirm it is not used for non-address results.
7885 set_allow_fallback_to_proctask(true);
7886 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
7887 proc_->SignalMultiple(1u);
7888
7889 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137890 rules.emplace_back("host", dns_protocol::kTypeTXT, false /* secure */,
Eric Orth828bd3ae2018-12-12 17:30:367891 MockDnsClientRule::Result(MockDnsClientRule::MALFORMED),
7892 false /* delay */);
7893
7894 CreateResolver();
7895 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7896
7897 HostResolver::ResolveHostParameters parameters;
7898 parameters.dns_query_type = DnsQueryType::TXT;
7899
Eric Orth117e1992019-04-17 00:24:157900 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557901 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:507902 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth828bd3ae2018-12-12 17:30:367903 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE));
7904 EXPECT_FALSE(response.request()->GetAddressResults());
7905 EXPECT_FALSE(response.request()->GetTextResults());
7906 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:407907 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Orth828bd3ae2018-12-12 17:30:367908}
7909
Eric Orth960e7062019-03-08 18:43:547910TEST_F(HostResolverManagerDnsTest, TxtQuery_MismatchedName) {
Eric Orth828bd3ae2018-12-12 17:30:367911 std::vector<std::vector<std::string>> text_records = {{"text"}};
7912 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137913 rules.emplace_back("host", dns_protocol::kTypeTXT, false /* secure */,
dalykc0ab0722019-03-14 17:00:587914 MockDnsClientRule::Result(BuildTestDnsTextResponse(
Eric Orth828bd3ae2018-12-12 17:30:367915 "host", std::move(text_records), "not.host")),
7916 false /* delay */);
7917
7918 CreateResolver();
7919 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7920
7921 HostResolver::ResolveHostParameters parameters;
7922 parameters.dns_query_type = DnsQueryType::TXT;
7923
Eric Orth117e1992019-04-17 00:24:157924 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557925 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:507926 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth828bd3ae2018-12-12 17:30:367927 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE));
7928 EXPECT_FALSE(response.request()->GetAddressResults());
7929 EXPECT_FALSE(response.request()->GetTextResults());
7930 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:407931 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Orth828bd3ae2018-12-12 17:30:367932}
7933
Eric Orth960e7062019-03-08 18:43:547934TEST_F(HostResolverManagerDnsTest, TxtQuery_WrongType) {
Eric Orth828bd3ae2018-12-12 17:30:367935 // Respond to a TXT query with an A response.
7936 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137937 rules.emplace_back("host", dns_protocol::kTypeTXT, false /* secure */,
Eric Orth828bd3ae2018-12-12 17:30:367938 MockDnsClientRule::Result(
7939 BuildTestDnsResponse("host", IPAddress(1, 2, 3, 4))),
7940 false /* delay */);
7941
7942 CreateResolver();
7943 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7944
7945 HostResolver::ResolveHostParameters parameters;
7946 parameters.dns_query_type = DnsQueryType::TXT;
7947
7948 // Responses for the wrong type should be ignored.
Eric Orth117e1992019-04-17 00:24:157949 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557950 HostPortPair("ok", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:507951 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth828bd3ae2018-12-12 17:30:367952 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
7953 EXPECT_FALSE(response.request()->GetAddressResults());
7954 EXPECT_FALSE(response.request()->GetTextResults());
7955 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:407956 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Orth828bd3ae2018-12-12 17:30:367957}
7958
Eric Ortha625b042019-01-16 01:14:457959// Same as TxtQuery except we specify DNS HostResolverSource instead of relying
7960// on automatic determination. Expect same results since DNS should be what we
7961// automatically determine, but some slightly different logic paths are
7962// involved.
Eric Orth960e7062019-03-08 18:43:547963TEST_F(HostResolverManagerDnsTest, TxtDnsQuery) {
Eric Orth828bd3ae2018-12-12 17:30:367964 // Simulate two separate DNS records, each with multiple strings.
7965 std::vector<std::string> foo_records = {"foo1", "foo2", "foo3"};
7966 std::vector<std::string> bar_records = {"bar1", "bar2"};
7967 std::vector<std::vector<std::string>> text_records = {foo_records,
7968 bar_records};
7969
7970 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137971 rules.emplace_back("host", dns_protocol::kTypeTXT, false /* secure */,
dalykc0ab0722019-03-14 17:00:587972 MockDnsClientRule::Result(BuildTestDnsTextResponse(
7973 "host", std::move(text_records))),
Eric Orth828bd3ae2018-12-12 17:30:367974 false /* delay */);
7975
7976 CreateResolver();
7977 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7978
7979 HostResolver::ResolveHostParameters parameters;
7980 parameters.source = HostResolverSource::DNS;
7981 parameters.dns_query_type = DnsQueryType::TXT;
7982
Eric Orth117e1992019-04-17 00:24:157983 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557984 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:507985 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orth828bd3ae2018-12-12 17:30:367986 EXPECT_THAT(response.result_error(), IsOk());
7987 EXPECT_FALSE(response.request()->GetAddressResults());
7988 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:407989 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Orth828bd3ae2018-12-12 17:30:367990
7991 // Order between separate DNS records is undefined, but each record should
7992 // stay in order as that order may be meaningful.
7993 ASSERT_THAT(response.request()->GetTextResults(),
7994 testing::Optional(testing::UnorderedElementsAre(
7995 "foo1", "foo2", "foo3", "bar1", "bar2")));
7996 std::vector<std::string> results =
7997 response.request()->GetTextResults().value();
7998 EXPECT_NE(results.end(), std::search(results.begin(), results.end(),
7999 foo_records.begin(), foo_records.end()));
8000 EXPECT_NE(results.end(), std::search(results.begin(), results.end(),
8001 bar_records.begin(), bar_records.end()));
8002}
8003
Eric Orth960e7062019-03-08 18:43:548004TEST_F(HostResolverManagerDnsTest, PtrQuery) {
Eric Orthe9db8d232019-01-14 21:24:458005 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:138006 rules.emplace_back("host", dns_protocol::kTypePTR, false /* secure */,
Eric Orthe9db8d232019-01-14 21:24:458007 MockDnsClientRule::Result(BuildTestDnsPointerResponse(
8008 "host", {"foo.com", "bar.com"})),
8009 false /* delay */);
8010
8011 CreateResolver();
8012 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8013
8014 HostResolver::ResolveHostParameters parameters;
8015 parameters.dns_query_type = DnsQueryType::PTR;
8016
Eric Orth117e1992019-04-17 00:24:158017 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558018 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:508019 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthe9db8d232019-01-14 21:24:458020 EXPECT_THAT(response.result_error(), IsOk());
8021 EXPECT_FALSE(response.request()->GetAddressResults());
8022 EXPECT_FALSE(response.request()->GetTextResults());
David Van Clevec719c882019-11-04 15:47:408023 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Orthe9db8d232019-01-14 21:24:458024
8025 // Order between separate records is undefined.
8026 EXPECT_THAT(response.request()->GetHostnameResults(),
8027 testing::Optional(testing::UnorderedElementsAre(
8028 HostPortPair("foo.com", 108), HostPortPair("bar.com", 108))));
8029}
8030
Eric Orth960e7062019-03-08 18:43:548031TEST_F(HostResolverManagerDnsTest, PtrQuery_Ip) {
Eric Orthe9db8d232019-01-14 21:24:458032 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:138033 rules.emplace_back("8.8.8.8", dns_protocol::kTypePTR, false /* secure */,
Eric Orthe9db8d232019-01-14 21:24:458034 MockDnsClientRule::Result(BuildTestDnsPointerResponse(
8035 "8.8.8.8", {"foo.com", "bar.com"})),
8036 false /* delay */);
8037
8038 CreateResolver();
8039 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8040
8041 HostResolver::ResolveHostParameters parameters;
8042 parameters.dns_query_type = DnsQueryType::PTR;
8043
Eric Orth117e1992019-04-17 00:24:158044 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558045 HostPortPair("8.8.8.8", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:508046 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthe9db8d232019-01-14 21:24:458047 EXPECT_THAT(response.result_error(), IsOk());
8048 EXPECT_FALSE(response.request()->GetAddressResults());
8049 EXPECT_FALSE(response.request()->GetTextResults());
David Van Clevec719c882019-11-04 15:47:408050 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Orthe9db8d232019-01-14 21:24:458051
8052 // Order between separate records is undefined.
8053 EXPECT_THAT(response.request()->GetHostnameResults(),
8054 testing::Optional(testing::UnorderedElementsAre(
8055 HostPortPair("foo.com", 108), HostPortPair("bar.com", 108))));
8056}
8057
Eric Orth960e7062019-03-08 18:43:548058TEST_F(HostResolverManagerDnsTest, PtrQuery_NonexistentDomain) {
Eric Orthe9db8d232019-01-14 21:24:458059 // Setup fallback to confirm it is not used for non-address results.
8060 set_allow_fallback_to_proctask(true);
8061 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
8062 proc_->SignalMultiple(1u);
8063
8064 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:138065 rules.emplace_back("host", dns_protocol::kTypePTR, false /* secure */,
Eric Orthe9db8d232019-01-14 21:24:458066 MockDnsClientRule::Result(MockDnsClientRule::NODOMAIN),
8067 false /* delay */);
8068
8069 CreateResolver();
8070 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8071
8072 HostResolver::ResolveHostParameters parameters;
8073 parameters.dns_query_type = DnsQueryType::PTR;
8074
Eric Orth117e1992019-04-17 00:24:158075 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558076 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:508077 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthe9db8d232019-01-14 21:24:458078 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
8079 EXPECT_FALSE(response.request()->GetAddressResults());
8080 EXPECT_FALSE(response.request()->GetTextResults());
8081 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:408082 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Orthe9db8d232019-01-14 21:24:458083}
8084
Eric Orth960e7062019-03-08 18:43:548085TEST_F(HostResolverManagerDnsTest, PtrQuery_Failure) {
Eric Orthe9db8d232019-01-14 21:24:458086 // Setup fallback to confirm it is not used for non-address results.
8087 set_allow_fallback_to_proctask(true);
8088 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
8089 proc_->SignalMultiple(1u);
8090
8091 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:138092 rules.emplace_back("host", dns_protocol::kTypePTR, false /* secure */,
8093 MockDnsClientRule::Result(MockDnsClientRule::FAIL),
8094 false /* delay */);
Eric Orthe9db8d232019-01-14 21:24:458095
8096 CreateResolver();
8097 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8098
8099 HostResolver::ResolveHostParameters parameters;
8100 parameters.dns_query_type = DnsQueryType::PTR;
8101
Eric Orth117e1992019-04-17 00:24:158102 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558103 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:508104 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthe9db8d232019-01-14 21:24:458105 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
8106 EXPECT_FALSE(response.request()->GetAddressResults());
8107 EXPECT_FALSE(response.request()->GetTextResults());
8108 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:408109 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Orthe9db8d232019-01-14 21:24:458110}
8111
Eric Orth960e7062019-03-08 18:43:548112TEST_F(HostResolverManagerDnsTest, PtrQuery_Timeout) {
Eric Orthe9db8d232019-01-14 21:24:458113 // Setup fallback to confirm it is not used for non-address results.
8114 set_allow_fallback_to_proctask(true);
8115 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
8116 proc_->SignalMultiple(1u);
8117
8118 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:138119 rules.emplace_back("host", dns_protocol::kTypePTR, false /* secure */,
8120 MockDnsClientRule::Result(MockDnsClientRule::TIMEOUT),
8121 false /* delay */);
Eric Orthe9db8d232019-01-14 21:24:458122
8123 CreateResolver();
8124 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8125
8126 HostResolver::ResolveHostParameters parameters;
8127 parameters.dns_query_type = DnsQueryType::PTR;
8128
Eric Orth117e1992019-04-17 00:24:158129 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558130 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:508131 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthe9db8d232019-01-14 21:24:458132 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_TIMED_OUT));
8133 EXPECT_FALSE(response.request()->GetAddressResults());
8134 EXPECT_FALSE(response.request()->GetTextResults());
8135 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:408136 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Orthe9db8d232019-01-14 21:24:458137}
8138
Eric Orth960e7062019-03-08 18:43:548139TEST_F(HostResolverManagerDnsTest, PtrQuery_Empty) {
Eric Orthe9db8d232019-01-14 21:24:458140 // Setup fallback to confirm it is not used for non-address results.
8141 set_allow_fallback_to_proctask(true);
8142 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
8143 proc_->SignalMultiple(1u);
8144
8145 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:138146 rules.emplace_back("host", dns_protocol::kTypePTR, false /* secure */,
8147 MockDnsClientRule::Result(MockDnsClientRule::EMPTY),
8148 false /* delay */);
Eric Orthe9db8d232019-01-14 21:24:458149
8150 CreateResolver();
8151 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8152
8153 HostResolver::ResolveHostParameters parameters;
8154 parameters.dns_query_type = DnsQueryType::PTR;
8155
Eric Orth117e1992019-04-17 00:24:158156 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558157 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:508158 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthe9db8d232019-01-14 21:24:458159 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
8160 EXPECT_FALSE(response.request()->GetAddressResults());
8161 EXPECT_FALSE(response.request()->GetTextResults());
8162 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:408163 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Orthe9db8d232019-01-14 21:24:458164}
8165
Eric Orth960e7062019-03-08 18:43:548166TEST_F(HostResolverManagerDnsTest, PtrQuery_Malformed) {
Eric Orthe9db8d232019-01-14 21:24:458167 // Setup fallback to confirm it is not used for non-address results.
8168 set_allow_fallback_to_proctask(true);
8169 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
8170 proc_->SignalMultiple(1u);
8171
8172 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:138173 rules.emplace_back("host", dns_protocol::kTypePTR, false /* secure */,
Eric Orthe9db8d232019-01-14 21:24:458174 MockDnsClientRule::Result(MockDnsClientRule::MALFORMED),
8175 false /* delay */);
8176
8177 CreateResolver();
8178 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8179
8180 HostResolver::ResolveHostParameters parameters;
8181 parameters.dns_query_type = DnsQueryType::PTR;
8182
Eric Orth117e1992019-04-17 00:24:158183 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558184 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:508185 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthe9db8d232019-01-14 21:24:458186 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE));
8187 EXPECT_FALSE(response.request()->GetAddressResults());
8188 EXPECT_FALSE(response.request()->GetTextResults());
8189 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:408190 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Orthe9db8d232019-01-14 21:24:458191}
8192
Eric Orth960e7062019-03-08 18:43:548193TEST_F(HostResolverManagerDnsTest, PtrQuery_MismatchedName) {
Eric Orthe9db8d232019-01-14 21:24:458194 std::vector<std::string> ptr_records = {{"foo.com"}};
8195 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:138196 rules.emplace_back("host", dns_protocol::kTypePTR, false /* secure */,
Eric Orthe9db8d232019-01-14 21:24:458197 MockDnsClientRule::Result(BuildTestDnsPointerResponse(
8198 "host", std::move(ptr_records), "not.host")),
8199 false /* delay */);
8200
8201 CreateResolver();
8202 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8203
8204 HostResolver::ResolveHostParameters parameters;
8205 parameters.dns_query_type = DnsQueryType::PTR;
8206
Eric Orth117e1992019-04-17 00:24:158207 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558208 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:508209 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthe9db8d232019-01-14 21:24:458210 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE));
8211 EXPECT_FALSE(response.request()->GetAddressResults());
8212 EXPECT_FALSE(response.request()->GetTextResults());
8213 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:408214 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Orthe9db8d232019-01-14 21:24:458215}
8216
Eric Orth960e7062019-03-08 18:43:548217TEST_F(HostResolverManagerDnsTest, PtrQuery_WrongType) {
Eric Orthe9db8d232019-01-14 21:24:458218 // Respond to a TXT query with an A response.
8219 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:138220 rules.emplace_back("host", dns_protocol::kTypePTR, false /* secure */,
Eric Orthe9db8d232019-01-14 21:24:458221 MockDnsClientRule::Result(
8222 BuildTestDnsResponse("host", IPAddress(1, 2, 3, 4))),
8223 false /* delay */);
8224
8225 CreateResolver();
8226 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8227
8228 HostResolver::ResolveHostParameters parameters;
8229 parameters.dns_query_type = DnsQueryType::PTR;
8230
8231 // Responses for the wrong type should be ignored.
Eric Orth117e1992019-04-17 00:24:158232 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558233 HostPortPair("ok", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:508234 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthe9db8d232019-01-14 21:24:458235 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
8236 EXPECT_FALSE(response.request()->GetAddressResults());
8237 EXPECT_FALSE(response.request()->GetTextResults());
8238 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:408239 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Orthe9db8d232019-01-14 21:24:458240}
8241
Eric Ortha625b042019-01-16 01:14:458242// Same as PtrQuery except we specify DNS HostResolverSource instead of relying
8243// on automatic determination. Expect same results since DNS should be what we
8244// automatically determine, but some slightly different logic paths are
8245// involved.
Eric Orth960e7062019-03-08 18:43:548246TEST_F(HostResolverManagerDnsTest, PtrDnsQuery) {
Eric Orthe9db8d232019-01-14 21:24:458247 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:138248 rules.emplace_back("host", dns_protocol::kTypePTR, false /* secure */,
Eric Orthe9db8d232019-01-14 21:24:458249 MockDnsClientRule::Result(BuildTestDnsPointerResponse(
8250 "host", {"foo.com", "bar.com"})),
8251 false /* delay */);
8252
8253 CreateResolver();
8254 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8255
8256 HostResolver::ResolveHostParameters parameters;
8257 parameters.source = HostResolverSource::DNS;
8258 parameters.dns_query_type = DnsQueryType::PTR;
8259
Eric Orth117e1992019-04-17 00:24:158260 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558261 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:508262 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Orthe9db8d232019-01-14 21:24:458263 EXPECT_THAT(response.result_error(), IsOk());
8264 EXPECT_FALSE(response.request()->GetAddressResults());
8265 EXPECT_FALSE(response.request()->GetTextResults());
David Van Clevec719c882019-11-04 15:47:408266 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Orthe9db8d232019-01-14 21:24:458267
8268 // Order between separate records is undefined.
8269 EXPECT_THAT(response.request()->GetHostnameResults(),
8270 testing::Optional(testing::UnorderedElementsAre(
8271 HostPortPair("foo.com", 108), HostPortPair("bar.com", 108))));
8272}
8273
Eric Orth960e7062019-03-08 18:43:548274TEST_F(HostResolverManagerDnsTest, SrvQuery) {
Eric Ortha625b042019-01-16 01:14:458275 const TestServiceRecord kRecord1 = {2, 3, 1223, "foo.com"};
8276 const TestServiceRecord kRecord2 = {5, 10, 80, "bar.com"};
8277 const TestServiceRecord kRecord3 = {5, 1, 5, "google.com"};
8278 const TestServiceRecord kRecord4 = {2, 100, 12345, "chromium.org"};
8279 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:138280 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
dalykc0ab0722019-03-14 17:00:588281 MockDnsClientRule::Result(BuildTestDnsServiceResponse(
Eric Ortha625b042019-01-16 01:14:458282 "host", {kRecord1, kRecord2, kRecord3, kRecord4})),
8283 false /* delay */);
8284
8285 CreateResolver();
8286 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8287
8288 HostResolver::ResolveHostParameters parameters;
8289 parameters.dns_query_type = DnsQueryType::SRV;
8290
Eric Orth117e1992019-04-17 00:24:158291 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558292 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:508293 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Ortha625b042019-01-16 01:14:458294 EXPECT_THAT(response.result_error(), IsOk());
8295 EXPECT_FALSE(response.request()->GetAddressResults());
8296 EXPECT_FALSE(response.request()->GetTextResults());
David Van Clevec719c882019-11-04 15:47:408297 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Ortha625b042019-01-16 01:14:458298
8299 // Expect ordered by priority, and random within a priority.
8300 base::Optional<std::vector<HostPortPair>> results =
8301 response.request()->GetHostnameResults();
8302 ASSERT_THAT(
8303 results,
8304 testing::Optional(testing::UnorderedElementsAre(
8305 HostPortPair("foo.com", 1223), HostPortPair("bar.com", 80),
8306 HostPortPair("google.com", 5), HostPortPair("chromium.org", 12345))));
8307 auto priority2 = std::vector<HostPortPair>(results.value().begin(),
8308 results.value().begin() + 2);
8309 EXPECT_THAT(priority2, testing::UnorderedElementsAre(
8310 HostPortPair("foo.com", 1223),
8311 HostPortPair("chromium.org", 12345)));
8312 auto priority5 = std::vector<HostPortPair>(results.value().begin() + 2,
8313 results.value().end());
8314 EXPECT_THAT(priority5,
8315 testing::UnorderedElementsAre(HostPortPair("bar.com", 80),
8316 HostPortPair("google.com", 5)));
8317}
8318
8319// 0-weight services are allowed. Ensure that we can handle such records,
8320// especially the case where all entries have weight 0.
Eric Orth960e7062019-03-08 18:43:548321TEST_F(HostResolverManagerDnsTest, SrvQuery_ZeroWeight) {
Eric Ortha625b042019-01-16 01:14:458322 const TestServiceRecord kRecord1 = {5, 0, 80, "bar.com"};
8323 const TestServiceRecord kRecord2 = {5, 0, 5, "google.com"};
8324 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:138325 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
dalykc0ab0722019-03-14 17:00:588326 MockDnsClientRule::Result(BuildTestDnsServiceResponse(
8327 "host", {kRecord1, kRecord2})),
Eric Ortha625b042019-01-16 01:14:458328 false /* delay */);
8329
8330 CreateResolver();
8331 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8332
8333 HostResolver::ResolveHostParameters parameters;
8334 parameters.dns_query_type = DnsQueryType::SRV;
8335
Eric Orth117e1992019-04-17 00:24:158336 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558337 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:508338 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Ortha625b042019-01-16 01:14:458339 EXPECT_THAT(response.result_error(), IsOk());
8340 EXPECT_FALSE(response.request()->GetAddressResults());
8341 EXPECT_FALSE(response.request()->GetTextResults());
David Van Clevec719c882019-11-04 15:47:408342 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Ortha625b042019-01-16 01:14:458343
8344 // Expect ordered by priority, and random within a priority.
8345 EXPECT_THAT(response.request()->GetHostnameResults(),
8346 testing::Optional(testing::UnorderedElementsAre(
8347 HostPortPair("bar.com", 80), HostPortPair("google.com", 5))));
8348}
8349
Eric Orth960e7062019-03-08 18:43:548350TEST_F(HostResolverManagerDnsTest, SrvQuery_NonexistentDomain) {
Eric Ortha625b042019-01-16 01:14:458351 // Setup fallback to confirm it is not used for non-address results.
8352 set_allow_fallback_to_proctask(true);
8353 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
8354 proc_->SignalMultiple(1u);
8355
8356 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:138357 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
Eric Ortha625b042019-01-16 01:14:458358 MockDnsClientRule::Result(MockDnsClientRule::NODOMAIN),
8359 false /* delay */);
8360
8361 CreateResolver();
8362 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8363
8364 HostResolver::ResolveHostParameters parameters;
8365 parameters.dns_query_type = DnsQueryType::SRV;
8366
Eric Orth117e1992019-04-17 00:24:158367 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558368 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:508369 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Ortha625b042019-01-16 01:14:458370 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
8371 EXPECT_FALSE(response.request()->GetAddressResults());
8372 EXPECT_FALSE(response.request()->GetTextResults());
8373 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:408374 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Ortha625b042019-01-16 01:14:458375}
8376
Eric Orth960e7062019-03-08 18:43:548377TEST_F(HostResolverManagerDnsTest, SrvQuery_Failure) {
Eric Ortha625b042019-01-16 01:14:458378 // Setup fallback to confirm it is not used for non-address results.
8379 set_allow_fallback_to_proctask(true);
8380 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
8381 proc_->SignalMultiple(1u);
8382
8383 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:138384 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
8385 MockDnsClientRule::Result(MockDnsClientRule::FAIL),
8386 false /* delay */);
Eric Ortha625b042019-01-16 01:14:458387
8388 CreateResolver();
8389 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8390
8391 HostResolver::ResolveHostParameters parameters;
8392 parameters.dns_query_type = DnsQueryType::SRV;
8393
Eric Orth117e1992019-04-17 00:24:158394 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558395 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:508396 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Ortha625b042019-01-16 01:14:458397 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
8398 EXPECT_FALSE(response.request()->GetAddressResults());
8399 EXPECT_FALSE(response.request()->GetTextResults());
8400 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:408401 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Ortha625b042019-01-16 01:14:458402}
8403
Eric Orth960e7062019-03-08 18:43:548404TEST_F(HostResolverManagerDnsTest, SrvQuery_Timeout) {
Eric Ortha625b042019-01-16 01:14:458405 // Setup fallback to confirm it is not used for non-address results.
8406 set_allow_fallback_to_proctask(true);
8407 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
8408 proc_->SignalMultiple(1u);
8409
8410 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:138411 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
8412 MockDnsClientRule::Result(MockDnsClientRule::TIMEOUT),
8413 false /* delay */);
Eric Ortha625b042019-01-16 01:14:458414
8415 CreateResolver();
8416 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8417
8418 HostResolver::ResolveHostParameters parameters;
8419 parameters.dns_query_type = DnsQueryType::SRV;
8420
Eric Orth117e1992019-04-17 00:24:158421 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558422 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:508423 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Ortha625b042019-01-16 01:14:458424 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_TIMED_OUT));
8425 EXPECT_FALSE(response.request()->GetAddressResults());
8426 EXPECT_FALSE(response.request()->GetTextResults());
8427 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:408428 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Ortha625b042019-01-16 01:14:458429}
8430
Eric Orth960e7062019-03-08 18:43:548431TEST_F(HostResolverManagerDnsTest, SrvQuery_Empty) {
Eric Ortha625b042019-01-16 01:14:458432 // Setup fallback to confirm it is not used for non-address results.
8433 set_allow_fallback_to_proctask(true);
8434 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
8435 proc_->SignalMultiple(1u);
8436
8437 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:138438 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
8439 MockDnsClientRule::Result(MockDnsClientRule::EMPTY),
8440 false /* delay */);
Eric Ortha625b042019-01-16 01:14:458441
8442 CreateResolver();
8443 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8444
8445 HostResolver::ResolveHostParameters parameters;
8446 parameters.dns_query_type = DnsQueryType::SRV;
8447
Eric Orth117e1992019-04-17 00:24:158448 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558449 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:508450 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Ortha625b042019-01-16 01:14:458451 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
8452 EXPECT_FALSE(response.request()->GetAddressResults());
8453 EXPECT_FALSE(response.request()->GetTextResults());
8454 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:408455 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Ortha625b042019-01-16 01:14:458456}
8457
Eric Orth960e7062019-03-08 18:43:548458TEST_F(HostResolverManagerDnsTest, SrvQuery_Malformed) {
Eric Ortha625b042019-01-16 01:14:458459 // Setup fallback to confirm it is not used for non-address results.
8460 set_allow_fallback_to_proctask(true);
8461 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
8462 proc_->SignalMultiple(1u);
8463
8464 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:138465 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
Eric Ortha625b042019-01-16 01:14:458466 MockDnsClientRule::Result(MockDnsClientRule::MALFORMED),
8467 false /* delay */);
8468
8469 CreateResolver();
8470 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8471
8472 HostResolver::ResolveHostParameters parameters;
8473 parameters.dns_query_type = DnsQueryType::SRV;
8474
Eric Orth117e1992019-04-17 00:24:158475 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558476 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:508477 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Ortha625b042019-01-16 01:14:458478 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE));
8479 EXPECT_FALSE(response.request()->GetAddressResults());
8480 EXPECT_FALSE(response.request()->GetTextResults());
8481 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:408482 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Ortha625b042019-01-16 01:14:458483}
8484
Eric Orth960e7062019-03-08 18:43:548485TEST_F(HostResolverManagerDnsTest, SrvQuery_MismatchedName) {
Eric Ortha625b042019-01-16 01:14:458486 std::vector<TestServiceRecord> srv_records = {{1, 2, 3, "foo.com"}};
8487 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:138488 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
dalykc0ab0722019-03-14 17:00:588489 MockDnsClientRule::Result(BuildTestDnsServiceResponse(
Eric Ortha625b042019-01-16 01:14:458490 "host", std::move(srv_records), "not.host")),
8491 false /* delay */);
8492
8493 CreateResolver();
8494 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8495
8496 HostResolver::ResolveHostParameters parameters;
8497 parameters.dns_query_type = DnsQueryType::SRV;
8498
Eric Orth117e1992019-04-17 00:24:158499 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558500 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:508501 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Ortha625b042019-01-16 01:14:458502 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE));
8503 EXPECT_FALSE(response.request()->GetAddressResults());
8504 EXPECT_FALSE(response.request()->GetTextResults());
8505 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:408506 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Ortha625b042019-01-16 01:14:458507}
8508
Eric Orth960e7062019-03-08 18:43:548509TEST_F(HostResolverManagerDnsTest, SrvQuery_WrongType) {
Eric Ortha625b042019-01-16 01:14:458510 // Respond to a SRV query with an A response.
8511 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:138512 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
Eric Ortha625b042019-01-16 01:14:458513 MockDnsClientRule::Result(
8514 BuildTestDnsResponse("host", IPAddress(1, 2, 3, 4))),
8515 false /* delay */);
8516
8517 CreateResolver();
8518 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8519
8520 HostResolver::ResolveHostParameters parameters;
8521 parameters.dns_query_type = DnsQueryType::SRV;
8522
8523 // Responses for the wrong type should be ignored.
Eric Orth117e1992019-04-17 00:24:158524 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558525 HostPortPair("ok", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:508526 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Ortha625b042019-01-16 01:14:458527 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
8528 EXPECT_FALSE(response.request()->GetAddressResults());
8529 EXPECT_FALSE(response.request()->GetTextResults());
8530 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:408531 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Ortha625b042019-01-16 01:14:458532}
8533
8534// Same as SrvQuery except we specify DNS HostResolverSource instead of relying
8535// on automatic determination. Expect same results since DNS should be what we
8536// automatically determine, but some slightly different logic paths are
8537// involved.
Eric Orth960e7062019-03-08 18:43:548538TEST_F(HostResolverManagerDnsTest, SrvDnsQuery) {
Eric Ortha625b042019-01-16 01:14:458539 const TestServiceRecord kRecord1 = {2, 3, 1223, "foo.com"};
8540 const TestServiceRecord kRecord2 = {5, 10, 80, "bar.com"};
8541 const TestServiceRecord kRecord3 = {5, 1, 5, "google.com"};
8542 const TestServiceRecord kRecord4 = {2, 100, 12345, "chromium.org"};
8543 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:138544 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
dalykc0ab0722019-03-14 17:00:588545 MockDnsClientRule::Result(BuildTestDnsServiceResponse(
Eric Ortha625b042019-01-16 01:14:458546 "host", {kRecord1, kRecord2, kRecord3, kRecord4})),
8547 false /* delay */);
8548
8549 CreateResolver();
8550 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8551
8552 HostResolver::ResolveHostParameters parameters;
8553 parameters.source = HostResolverSource::DNS;
8554 parameters.dns_query_type = DnsQueryType::SRV;
8555
Eric Orth117e1992019-04-17 00:24:158556 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558557 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:508558 parameters, resolve_context_.get(), resolve_context_->host_cache()));
Eric Ortha625b042019-01-16 01:14:458559 EXPECT_THAT(response.result_error(), IsOk());
8560 EXPECT_FALSE(response.request()->GetAddressResults());
8561 EXPECT_FALSE(response.request()->GetTextResults());
David Van Clevec719c882019-11-04 15:47:408562 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Ortha625b042019-01-16 01:14:458563
8564 // Expect ordered by priority, and random within a priority.
8565 base::Optional<std::vector<HostPortPair>> results =
8566 response.request()->GetHostnameResults();
8567 ASSERT_THAT(
8568 results,
8569 testing::Optional(testing::UnorderedElementsAre(
8570 HostPortPair("foo.com", 1223), HostPortPair("bar.com", 80),
8571 HostPortPair("google.com", 5), HostPortPair("chromium.org", 12345))));
8572 auto priority2 = std::vector<HostPortPair>(results.value().begin(),
8573 results.value().begin() + 2);
8574 EXPECT_THAT(priority2, testing::UnorderedElementsAre(
8575 HostPortPair("foo.com", 1223),
8576 HostPortPair("chromium.org", 12345)));
8577 auto priority5 = std::vector<HostPortPair>(results.value().begin() + 2,
8578 results.value().end());
8579 EXPECT_THAT(priority5,
8580 testing::UnorderedElementsAre(HostPortPair("bar.com", 80),
8581 HostPortPair("google.com", 5)));
8582}
8583
Eric Orth314e8b42019-11-12 00:32:218584TEST_F(HostResolverManagerDnsTest, DohProbeRequest) {
8585 ChangeDnsConfig(CreateValidDnsConfig());
8586
8587 EXPECT_FALSE(dns_client_->factory()->doh_probes_running());
8588
8589 std::unique_ptr<HostResolverManager::CancellableProbeRequest> request =
Eric Orth069a3c6e2020-01-31 23:14:248590 resolver_->CreateDohProbeRequest(resolve_context_.get());
Eric Orth314e8b42019-11-12 00:32:218591 EXPECT_THAT(request->Start(), IsError(ERR_IO_PENDING));
8592
8593 EXPECT_TRUE(dns_client_->factory()->doh_probes_running());
8594
8595 request.reset();
8596
8597 EXPECT_FALSE(dns_client_->factory()->doh_probes_running());
8598}
8599
8600TEST_F(HostResolverManagerDnsTest, DohProbeRequest_ExplicitCancel) {
8601 ChangeDnsConfig(CreateValidDnsConfig());
8602
8603 std::unique_ptr<HostResolverManager::CancellableProbeRequest> request =
Eric Orth069a3c6e2020-01-31 23:14:248604 resolver_->CreateDohProbeRequest(resolve_context_.get());
Eric Orth314e8b42019-11-12 00:32:218605 EXPECT_THAT(request->Start(), IsError(ERR_IO_PENDING));
8606 ASSERT_TRUE(dns_client_->factory()->doh_probes_running());
8607
8608 request->Cancel();
8609
8610 EXPECT_FALSE(dns_client_->factory()->doh_probes_running());
8611}
8612
8613TEST_F(HostResolverManagerDnsTest, DohProbeRequest_ExplicitCancel_NotStarted) {
8614 ChangeDnsConfig(CreateValidDnsConfig());
8615
8616 std::unique_ptr<HostResolverManager::CancellableProbeRequest> request =
Eric Orth069a3c6e2020-01-31 23:14:248617 resolver_->CreateDohProbeRequest(resolve_context_.get());
Eric Orth314e8b42019-11-12 00:32:218618
8619 request->Cancel();
8620
8621 EXPECT_FALSE(dns_client_->factory()->doh_probes_running());
8622}
8623
8624TEST_F(HostResolverManagerDnsTest,
8625 DohProbeRequest_ExplicitCancel_AfterManagerDestruction) {
8626 ChangeDnsConfig(CreateValidDnsConfig());
8627
8628 std::unique_ptr<HostResolverManager::CancellableProbeRequest> request =
Eric Orth069a3c6e2020-01-31 23:14:248629 resolver_->CreateDohProbeRequest(resolve_context_.get());
Eric Orth314e8b42019-11-12 00:32:218630 EXPECT_THAT(request->Start(), IsError(ERR_IO_PENDING));
8631 ASSERT_TRUE(dns_client_->factory()->doh_probes_running());
8632
8633 DestroyResolver();
8634 request->Cancel();
8635}
8636
Eric Orth23935862020-01-10 00:42:248637TEST_F(HostResolverManagerDnsTest, DohProbeRequest_BeforeConfig) {
8638 InvalidateDnsConfig();
8639
8640 std::unique_ptr<HostResolverManager::CancellableProbeRequest> request =
Eric Orth069a3c6e2020-01-31 23:14:248641 resolver_->CreateDohProbeRequest(resolve_context_.get());
Eric Orth23935862020-01-10 00:42:248642 EXPECT_THAT(request->Start(), IsError(ERR_IO_PENDING));
8643 EXPECT_FALSE(dns_client_->factory()->doh_probes_running());
8644
8645 ChangeDnsConfig(CreateValidDnsConfig());
8646 EXPECT_TRUE(dns_client_->factory()->doh_probes_running());
8647}
8648
8649TEST_F(HostResolverManagerDnsTest, DohProbeRequest_InvalidateConfig) {
8650 ChangeDnsConfig(CreateValidDnsConfig());
8651
8652 std::unique_ptr<HostResolverManager::CancellableProbeRequest> request =
Eric Orth069a3c6e2020-01-31 23:14:248653 resolver_->CreateDohProbeRequest(resolve_context_.get());
Eric Orth23935862020-01-10 00:42:248654 EXPECT_THAT(request->Start(), IsError(ERR_IO_PENDING));
8655 ASSERT_TRUE(dns_client_->factory()->doh_probes_running());
8656
8657 InvalidateDnsConfig();
8658
8659 EXPECT_FALSE(dns_client_->factory()->doh_probes_running());
8660}
8661
8662TEST_F(HostResolverManagerDnsTest, DohProbeRequest_CancelBeforeConfig) {
8663 InvalidateDnsConfig();
8664
8665 std::unique_ptr<HostResolverManager::CancellableProbeRequest> request =
Eric Orth069a3c6e2020-01-31 23:14:248666 resolver_->CreateDohProbeRequest(resolve_context_.get());
Eric Orth23935862020-01-10 00:42:248667 EXPECT_THAT(request->Start(), IsError(ERR_IO_PENDING));
8668 EXPECT_FALSE(dns_client_->factory()->doh_probes_running());
8669
8670 request->Cancel();
8671
8672 ChangeDnsConfig(CreateValidDnsConfig());
8673 EXPECT_FALSE(dns_client_->factory()->doh_probes_running());
8674}
8675
8676TEST_F(HostResolverManagerDnsTest, DohProbeRequest_RestartOnConnectionChange) {
8677 DestroyResolver();
8678 test::ScopedMockNetworkChangeNotifier notifier;
8679 CreateSerialResolver();
8680 notifier.mock_network_change_notifier()->SetConnectionType(
8681 NetworkChangeNotifier::CONNECTION_NONE);
8682 ChangeDnsConfig(CreateValidDnsConfig());
8683
8684 std::unique_ptr<HostResolverManager::CancellableProbeRequest> request =
Eric Orth069a3c6e2020-01-31 23:14:248685 resolver_->CreateDohProbeRequest(resolve_context_.get());
Eric Orth23935862020-01-10 00:42:248686 EXPECT_THAT(request->Start(), IsError(ERR_IO_PENDING));
8687 ASSERT_FALSE(dns_client_->factory()->doh_probes_running());
8688
8689 notifier.mock_network_change_notifier()->SetConnectionTypeAndNotifyObservers(
8690 NetworkChangeNotifier::CONNECTION_WIFI);
8691
8692 EXPECT_TRUE(dns_client_->factory()->doh_probes_running());
8693}
8694
8695TEST_F(HostResolverManagerDnsTest, DohProbeRequest_CancelOnConnectionLoss) {
8696 DestroyResolver();
8697 test::ScopedMockNetworkChangeNotifier notifier;
8698 CreateSerialResolver();
8699 notifier.mock_network_change_notifier()->SetConnectionType(
8700 NetworkChangeNotifier::CONNECTION_4G);
8701 ChangeDnsConfig(CreateValidDnsConfig());
8702
8703 std::unique_ptr<HostResolverManager::CancellableProbeRequest> request =
Eric Orth069a3c6e2020-01-31 23:14:248704 resolver_->CreateDohProbeRequest(resolve_context_.get());
Eric Orth23935862020-01-10 00:42:248705 EXPECT_THAT(request->Start(), IsError(ERR_IO_PENDING));
8706 ASSERT_TRUE(dns_client_->factory()->doh_probes_running());
8707
8708 notifier.mock_network_change_notifier()->SetConnectionTypeAndNotifyObservers(
8709 NetworkChangeNotifier::CONNECTION_NONE);
8710
8711 EXPECT_FALSE(dns_client_->factory()->doh_probes_running());
8712}
8713
Eric Orth3d1e6542020-01-10 19:31:578714TEST_F(HostResolverManagerDnsTest, MultipleDohProbeRequests) {
8715 ChangeDnsConfig(CreateValidDnsConfig());
8716
8717 EXPECT_FALSE(dns_client_->factory()->doh_probes_running());
8718
8719 std::unique_ptr<HostResolverManager::CancellableProbeRequest> request1 =
Eric Orth069a3c6e2020-01-31 23:14:248720 resolver_->CreateDohProbeRequest(resolve_context_.get());
Eric Orth3d1e6542020-01-10 19:31:578721 EXPECT_THAT(request1->Start(), IsError(ERR_IO_PENDING));
8722 std::unique_ptr<HostResolverManager::CancellableProbeRequest> request2 =
Eric Orth069a3c6e2020-01-31 23:14:248723 resolver_->CreateDohProbeRequest(resolve_context_.get());
Eric Orth3d1e6542020-01-10 19:31:578724 EXPECT_THAT(request2->Start(), IsError(ERR_IO_PENDING));
8725
8726 EXPECT_TRUE(dns_client_->factory()->doh_probes_running());
8727
8728 request1.reset();
8729 EXPECT_TRUE(dns_client_->factory()->doh_probes_running());
8730
8731 request2.reset();
8732 EXPECT_FALSE(dns_client_->factory()->doh_probes_running());
8733}
8734
David Van Clevec719c882019-11-04 15:47:408735TEST_F(HostResolverManagerDnsTest, EsniQuery) {
8736 EsniContent c1, c2, c3;
8737 IPAddress a1(1, 2, 3, 4), a2(5, 6, 7, 8);
8738 IPAddress a3(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1);
8739
8740 std::string kKey1 = GenerateWellFormedEsniKeys("a");
8741 std::string kKey2 = GenerateWellFormedEsniKeys("b");
8742 std::string kKey3 = GenerateWellFormedEsniKeys("c");
8743
8744 c1.AddKey(kKey1);
8745
8746 c2.AddKeyForAddress(a1, kKey2);
8747 c2.AddKeyForAddress(a2, kKey2);
8748 c2.AddKeyForAddress(a3, kKey2);
8749
8750 c3.AddKeyForAddress(a1, kKey3);
8751
8752 std::vector<EsniContent> esni_records = {c1, c2, c3};
8753
8754 MockDnsClientRuleList rules;
8755 rules.emplace_back("host", dns_protocol::kExperimentalTypeEsniDraft4,
8756 false /* secure */,
8757 MockDnsClientRule::Result(BuildTestDnsEsniResponse(
8758 "host", std::move(esni_records))),
8759 false /* delay */);
8760
8761 CreateResolver();
8762 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8763
8764 HostResolver::ResolveHostParameters parameters;
8765 parameters.dns_query_type = DnsQueryType::ESNI;
8766
8767 ResolveHostResponseHelper response(resolver_->CreateRequest(
8768 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:508769 parameters, resolve_context_.get(), resolve_context_->host_cache()));
David Van Clevec719c882019-11-04 15:47:408770 EXPECT_THAT(response.result_error(), IsOk());
8771
8772 EXPECT_FALSE(response.request()->GetHostnameResults());
8773 EXPECT_FALSE(response.request()->GetTextResults());
8774
8775 // The IPv6 address |a3| should come first, and the other
8776 // addresses should have been deduplicated.
8777 EXPECT_THAT(
8778 response.request()->GetAddressResults(),
8779 Optional(AllOf(Property(&AddressList::endpoints,
8780 UnorderedElementsAre(IPEndPoint(a3, 108),
8781 IPEndPoint(a1, 108),
8782 IPEndPoint(a2, 108))),
8783 Property(&AddressList::front, IPEndPoint(a3, 108)))));
8784
8785 // During aggregation of ESNI query results, we drop ESNI keys
8786 // with no associated addresses, like key 1 here. (This is an implementation
8787 // decision declining a "MAY" behavior from the spec.)
8788 // So, we require that only keys 2 and 3 are surfaced.
8789 //
8790 // The Eq() wrappers are necessary here because keys_for_addresses
8791 // returns a container of StringPieces.
8792 EXPECT_THAT(
8793 response.request()->GetEsniResults(),
8794 Optional(AllOf(
8795 Property(&EsniContent::keys,
8796 UnorderedElementsAre(Eq(kKey2), Eq(kKey3))),
8797 Property(&EsniContent::keys_for_addresses,
8798 UnorderedElementsAre(
8799 Pair(a1, UnorderedElementsAre(Eq(kKey2), Eq(kKey3))),
8800 Pair(a2, UnorderedElementsAre(Eq(kKey2))),
8801 Pair(a3, UnorderedElementsAre(Eq(kKey2))))))));
8802}
8803
8804TEST_F(HostResolverManagerDnsTest, EsniQuery_InvalidConfig) {
8805 set_allow_fallback_to_proctask(false);
8806 // Set empty DnsConfig.
8807 InvalidateDnsConfig();
8808
8809 HostResolver::ResolveHostParameters parameters;
8810 parameters.dns_query_type = DnsQueryType::ESNI;
8811
8812 ResolveHostResponseHelper response(resolver_->CreateRequest(
8813 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:508814 parameters, resolve_context_.get(), resolve_context_->host_cache()));
David Van Clevec719c882019-11-04 15:47:408815 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_CACHE_MISS));
8816}
8817
8818TEST_F(HostResolverManagerDnsTest, EsniQuery_NonexistentDomain) {
8819 // Setup fallback to confirm it is not used for non-address results.
8820 set_allow_fallback_to_proctask(true);
8821 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
8822 proc_->SignalMultiple(1u);
8823
8824 MockDnsClientRuleList rules;
8825 rules.emplace_back("host", dns_protocol::kExperimentalTypeEsniDraft4,
8826 false /* secure */,
8827 MockDnsClientRule::Result(MockDnsClientRule::NODOMAIN),
8828 false /* delay */);
8829
8830 CreateResolver();
8831 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8832
8833 HostResolver::ResolveHostParameters parameters;
8834 parameters.dns_query_type = DnsQueryType::ESNI;
8835
8836 ResolveHostResponseHelper response(resolver_->CreateRequest(
8837 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:508838 parameters, resolve_context_.get(), resolve_context_->host_cache()));
David Van Clevec719c882019-11-04 15:47:408839 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
8840 EXPECT_FALSE(response.request()->GetAddressResults());
8841 EXPECT_FALSE(response.request()->GetTextResults());
8842 EXPECT_FALSE(response.request()->GetHostnameResults());
8843 EXPECT_FALSE(response.request()->GetEsniResults());
8844}
8845
8846TEST_F(HostResolverManagerDnsTest, EsniQuery_Failure) {
8847 // Setup fallback to confirm it is not used for non-address results.
8848 set_allow_fallback_to_proctask(true);
8849 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
8850 proc_->SignalMultiple(1u);
8851
8852 MockDnsClientRuleList rules;
8853 rules.emplace_back(
8854 "host", dns_protocol::kExperimentalTypeEsniDraft4, false /* secure */,
8855 MockDnsClientRule::Result(MockDnsClientRule::FAIL), false /* delay */);
8856
8857 CreateResolver();
8858 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8859
8860 HostResolver::ResolveHostParameters parameters;
8861 parameters.dns_query_type = DnsQueryType::ESNI;
8862
8863 ResolveHostResponseHelper response(resolver_->CreateRequest(
8864 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:508865 parameters, resolve_context_.get(), resolve_context_->host_cache()));
David Van Clevec719c882019-11-04 15:47:408866 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
8867 EXPECT_FALSE(response.request()->GetAddressResults());
8868 EXPECT_FALSE(response.request()->GetTextResults());
8869 EXPECT_FALSE(response.request()->GetHostnameResults());
8870 EXPECT_FALSE(response.request()->GetEsniResults());
8871}
8872
8873TEST_F(HostResolverManagerDnsTest, EsniQuery_Timeout) {
8874 // Setup fallback to confirm it is not used for non-address results.
8875 set_allow_fallback_to_proctask(true);
8876 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
8877 proc_->SignalMultiple(1u);
8878
8879 MockDnsClientRuleList rules;
8880 rules.emplace_back(
8881 "host", dns_protocol::kExperimentalTypeEsniDraft4, false /* secure */,
8882 MockDnsClientRule::Result(MockDnsClientRule::TIMEOUT), false /* delay */);
8883
8884 CreateResolver();
8885 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8886
8887 HostResolver::ResolveHostParameters parameters;
8888 parameters.dns_query_type = DnsQueryType::ESNI;
8889
8890 ResolveHostResponseHelper response(resolver_->CreateRequest(
8891 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:508892 parameters, resolve_context_.get(), resolve_context_->host_cache()));
David Van Clevec719c882019-11-04 15:47:408893 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_TIMED_OUT));
8894 EXPECT_FALSE(response.request()->GetAddressResults());
8895 EXPECT_FALSE(response.request()->GetTextResults());
8896 EXPECT_FALSE(response.request()->GetHostnameResults());
8897 EXPECT_FALSE(response.request()->GetEsniResults());
8898}
8899
8900TEST_F(HostResolverManagerDnsTest, EsniQuery_Empty) {
8901 // Setup fallback to confirm it is not used for non-address results.
8902 set_allow_fallback_to_proctask(true);
8903 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
8904 proc_->SignalMultiple(1u);
8905
8906 MockDnsClientRuleList rules;
8907 rules.emplace_back(
8908 "host", dns_protocol::kExperimentalTypeEsniDraft4, false /* secure */,
8909 MockDnsClientRule::Result(MockDnsClientRule::EMPTY), false /* delay */);
8910
8911 CreateResolver();
8912 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8913
8914 HostResolver::ResolveHostParameters parameters;
8915 parameters.dns_query_type = DnsQueryType::ESNI;
8916
8917 ResolveHostResponseHelper response(resolver_->CreateRequest(
8918 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:508919 parameters, resolve_context_.get(), resolve_context_->host_cache()));
David Van Clevec719c882019-11-04 15:47:408920 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
8921 EXPECT_FALSE(response.request()->GetAddressResults());
8922 EXPECT_FALSE(response.request()->GetTextResults());
8923 EXPECT_FALSE(response.request()->GetHostnameResults());
8924 EXPECT_FALSE(response.request()->GetEsniResults());
8925}
8926
8927TEST_F(HostResolverManagerDnsTest, EsniQuery_Malformed) {
8928 // Setup fallback to confirm it is not used for non-address results.
8929 set_allow_fallback_to_proctask(true);
8930 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
8931 proc_->SignalMultiple(1u);
8932
8933 MockDnsClientRuleList rules;
8934 rules.emplace_back("host", dns_protocol::kExperimentalTypeEsniDraft4,
8935 false /* secure */,
8936 MockDnsClientRule::Result(MockDnsClientRule::MALFORMED),
8937 false /* delay */);
8938
8939 CreateResolver();
8940 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8941
8942 HostResolver::ResolveHostParameters parameters;
8943 parameters.dns_query_type = DnsQueryType::ESNI;
8944
8945 ResolveHostResponseHelper response(resolver_->CreateRequest(
8946 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:508947 parameters, resolve_context_.get(), resolve_context_->host_cache()));
David Van Clevec719c882019-11-04 15:47:408948 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE));
8949 EXPECT_FALSE(response.request()->GetAddressResults());
8950 EXPECT_FALSE(response.request()->GetTextResults());
8951 EXPECT_FALSE(response.request()->GetHostnameResults());
8952 EXPECT_FALSE(response.request()->GetEsniResults());
8953}
8954
8955TEST_F(HostResolverManagerDnsTest, EsniQuery_MismatchedName) {
8956 EsniContent content;
8957 IPAddress address(1, 2, 3, 4);
8958 std::string key = GenerateWellFormedEsniKeys("a");
8959 content.AddKeyForAddress(address, key);
8960
8961 std::vector<EsniContent> esni_records = {content};
8962
8963 MockDnsClientRuleList rules;
8964 rules.emplace_back("host", dns_protocol::kExperimentalTypeEsniDraft4,
8965 false /* secure */,
8966 MockDnsClientRule::Result(BuildTestDnsEsniResponse(
8967 "host", std::move(esni_records), "not.host")),
8968 false /* delay */);
8969
8970 CreateResolver();
8971 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8972
8973 HostResolver::ResolveHostParameters parameters;
8974 parameters.dns_query_type = DnsQueryType::ESNI;
8975
8976 ResolveHostResponseHelper response(resolver_->CreateRequest(
8977 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:508978 parameters, resolve_context_.get(), resolve_context_->host_cache()));
David Van Clevec719c882019-11-04 15:47:408979 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE));
8980 EXPECT_FALSE(response.request()->GetAddressResults());
8981 EXPECT_FALSE(response.request()->GetTextResults());
8982 EXPECT_FALSE(response.request()->GetHostnameResults());
8983 EXPECT_FALSE(response.request()->GetEsniResults());
8984}
8985
8986TEST_F(HostResolverManagerDnsTest, EsniQuery_WrongType) {
8987 // Respond to an ESNI query with an A response.
8988 MockDnsClientRuleList rules;
8989 rules.emplace_back("host", dns_protocol::kExperimentalTypeEsniDraft4,
8990 false /* secure */,
8991 MockDnsClientRule::Result(
8992 BuildTestDnsResponse("host", IPAddress(1, 2, 3, 4))),
8993 false /* delay */);
8994
8995 CreateResolver();
8996 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8997
8998 HostResolver::ResolveHostParameters parameters;
8999 parameters.dns_query_type = DnsQueryType::ESNI;
9000
9001 // Responses for the wrong type should be ignored.
9002 ResolveHostResponseHelper response(resolver_->CreateRequest(
9003 HostPortPair("ok", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:509004 parameters, resolve_context_.get(), resolve_context_->host_cache()));
David Van Clevec719c882019-11-04 15:47:409005 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
9006 EXPECT_FALSE(response.request()->GetAddressResults());
9007 EXPECT_FALSE(response.request()->GetTextResults());
9008 EXPECT_FALSE(response.request()->GetHostnameResults());
9009 EXPECT_FALSE(response.request()->GetEsniResults());
9010}
9011
9012// Same as EsniQuery except we specify DNS HostResolverSource instead of relying
9013// on automatic determination. Expect same results since DNS should be what we
9014// automatically determine, but some slightly different logic paths are
9015// involved.
9016TEST_F(HostResolverManagerDnsTest, EsniDnsQuery) {
9017 EsniContent c1, c2, c3;
9018 IPAddress a1(1, 2, 3, 4), a2(5, 6, 7, 8);
9019
9020 const std::string kKey1 = GenerateWellFormedEsniKeys("a");
9021 const std::string kKey2 = GenerateWellFormedEsniKeys("b");
9022 const std::string kKey3 = GenerateWellFormedEsniKeys("c");
9023
9024 c1.AddKey(kKey1);
9025
9026 c2.AddKeyForAddress(a1, kKey2);
9027 c2.AddKeyForAddress(a2, kKey2);
9028
9029 c3.AddKeyForAddress(a1, kKey3);
9030
9031 std::vector<EsniContent> esni_records = {c1, c2, c3};
9032
9033 MockDnsClientRuleList rules;
9034 rules.emplace_back("host", dns_protocol::kExperimentalTypeEsniDraft4,
9035 false /* secure */,
9036 MockDnsClientRule::Result(BuildTestDnsEsniResponse(
9037 "host", std::move(esni_records))),
9038 false /* delay */);
9039
9040 CreateResolver();
9041 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
9042
9043 HostResolver::ResolveHostParameters parameters;
9044 parameters.source = HostResolverSource::DNS;
9045 parameters.dns_query_type = DnsQueryType::ESNI;
9046
9047 ResolveHostResponseHelper response(resolver_->CreateRequest(
9048 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:509049 parameters, resolve_context_.get(), resolve_context_->host_cache()));
David Van Clevec719c882019-11-04 15:47:409050 EXPECT_THAT(response.result_error(), IsOk());
9051 EXPECT_FALSE(response.request()->GetHostnameResults());
9052 EXPECT_FALSE(response.request()->GetTextResults());
9053
9054 // The multiple ESNI records should have been merged when parsing
9055 // the results.
9056 c1.MergeFrom(c2);
9057 c1.MergeFrom(c3);
9058
9059 // The ESNI records' addresses should have been merged into
9060 // the address list.
9061 ASSERT_TRUE(response.request()->GetAddressResults());
9062 EXPECT_THAT(
9063 response.request()->GetAddressResults()->endpoints(),
9064 testing::UnorderedElementsAre(IPEndPoint(a1, 108), IPEndPoint(a2, 108)));
9065
9066 ASSERT_TRUE(response.request()->GetEsniResults().has_value());
9067
9068 // During aggregation of ESNI query results, we drop ESNI keys
9069 // with no associated addresses, like key 1 here. (This is an implementation
9070 // decision declining a "MAY" behavior from the spec.) So, we require that
9071 // only keys 2 and 3 are surfaced.
9072 EXPECT_THAT(response.request()->GetEsniResults()->keys(),
9073 testing::UnorderedElementsAre(kKey2, kKey3));
9074 EXPECT_EQ(response.request()->GetEsniResults()->keys_for_addresses(),
9075 c1.keys_for_addresses());
9076}
9077
David Van Cleve1fb5e8c2019-11-04 16:45:169078class HostResolverManagerEsniTest : public HostResolverManagerDnsTest {
9079 public:
9080 HostResolverManagerEsniTest()
9081 : HostResolverManagerDnsTest(
9082 base::test::TaskEnvironment::TimeSource::MOCK_TIME) {
9083 scoped_feature_list_.InitAndEnableFeature(features::kRequestEsniDnsRecords);
9084 }
9085
9086 protected:
9087 base::test::ScopedFeatureList scoped_feature_list_;
9088
9089 // Adds a rule returning a collection of ESNI records such that
9090 // - there is a lone key with no associated addresses
9091 // - there is an address associated with multiple keys
9092 // - there is a key associated with multiple addresses
9093 //
9094 // Returns a pair containing:
9095 // (1) a single merged EsniContent object which should be contained in
9096 // the eventual response.
9097 // (2) the collection of IPEndPoints corresponding to the
9098 // ESNI records' contained addresses; these are expected to
9099 // be contained in the eventual response's address list (assuming
9100 // no addresses are pruned by the address sorter, which will
9101 // be the case in the test, because MockAddressSorter no-ops)
9102 struct AddEsniRecordsRuleOptions {
9103 bool secure = true, delay = false;
9104 };
9105 std::pair<EsniContent, std::vector<IPEndPoint>> AddEsniRecordsRule(
9106 base::StringPiece hostname,
9107 AddEsniRecordsRuleOptions options,
9108 MockDnsClientRuleList* rules) {
9109 EsniContent c1, c2, c3;
9110 IPAddress a1(1, 2, 3, 4);
9111 IPAddress a2(5, 6, 7, 8);
9112
9113 const std::string kKey1 = GenerateWellFormedEsniKeys("a");
9114 const std::string kKey2 = GenerateWellFormedEsniKeys("b");
9115 const std::string kKey3 = GenerateWellFormedEsniKeys("c");
9116
9117 c1.AddKey(kKey1);
9118
9119 c2.AddKeyForAddress(a1, kKey2);
9120 c2.AddKeyForAddress(a2, kKey2);
9121
9122 c3.AddKeyForAddress(a1, kKey3);
9123
9124 std::vector<EsniContent> esni_records = {c1, c2, c3};
9125 rules->emplace_back(std::string(hostname),
9126 dns_protocol::kExperimentalTypeEsniDraft4,
9127 options.secure,
9128 MockDnsClientRule::Result(BuildTestDnsEsniResponse(
9129 std::string(hostname), std::move(esni_records))),
9130 options.delay);
9131
9132 // Key 1 will be dropped because it corresponds to no addresses;
9133 // section 4.2.2 of ESNI draft 4 gives implementors the option to associate
9134 // these with all IP addresses received in concurrent A and AAAA responses,
9135 // and we choose not to do this.
9136 c2.MergeFrom(c3);
9137 return std::make_pair(
9138 c2, std::vector<IPEndPoint>{IPEndPoint(a1, 80), IPEndPoint(a2, 80)});
9139 }
9140};
9141
9142// Check that resolving ESNI queries alongside A and AAAA queries
9143// results in a correct aggregation of addresses.
9144TEST_F(HostResolverManagerEsniTest, AggregatesResults) {
9145 MockDnsClientRuleList rules;
9146
9147 EsniContent esni_expectation;
9148 std::vector<IPEndPoint> expected_addresses;
9149 std::tie(esni_expectation, expected_addresses) =
9150 AddEsniRecordsRule("host", AddEsniRecordsRuleOptions(), &rules);
9151
9152 rules.emplace_back("host", dns_protocol::kTypeA, true /* secure */,
9153 MockDnsClientRule::Result(MockDnsClientRule::OK),
9154 false /* delay */);
9155 rules.emplace_back("host", dns_protocol::kTypeAAAA, true /* secure */,
9156 MockDnsClientRule::Result(MockDnsClientRule::OK),
9157 false /* delay */);
9158 // Even though the A and AAAA results' addresses won't have any
9159 // associated ESNI keys, they should still be surfaced in GetAddressResults().
9160 expected_addresses.push_back(CreateExpected("127.0.0.1", 80));
9161 expected_addresses.push_back(CreateExpected("::1", 80));
9162
9163 CreateResolver();
9164 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
9165 DnsConfigOverrides overrides;
9166 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
9167 resolver_->SetDnsConfigOverrides(overrides);
9168
9169 ResolveHostResponseHelper response(resolver_->CreateRequest(
9170 HostPortPair("host", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orth069a3c6e2020-01-31 23:14:249171 HostResolver::ResolveHostParameters(), resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:509172 resolve_context_->host_cache()));
David Van Cleve1fb5e8c2019-11-04 16:45:169173
9174 ASSERT_THAT(response.result_error(), IsOk());
9175 EXPECT_THAT(response.request()->GetEsniResults(),
9176 testing::Optional(testing::Eq(esni_expectation)));
9177 // GetAddressResults() should surface addresses with and without
9178 // associated ESNI keys.
9179 ASSERT_THAT(response.request()->GetAddressResults()->endpoints(),
9180 testing::UnorderedElementsAreArray(expected_addresses));
9181}
9182
9183// Test that addresses with associated ESNI keys are placed
9184// first in the order provided to the address sorter.
9185// (This corresponds to the order of the address list in the results
9186// because MockAddressSorter's sort is a no-op.)
9187TEST_F(HostResolverManagerEsniTest, EsniAddressesFirstInOrder) {
9188 MockDnsClientRuleList rules;
9189
9190 EsniContent esni_expectation;
9191 std::vector<IPEndPoint> esni_addresses;
9192 std::tie(esni_expectation, esni_addresses) =
9193 AddEsniRecordsRule("host", AddEsniRecordsRuleOptions(), &rules);
9194
9195 rules.emplace_back("host", dns_protocol::kTypeA, true /* secure */,
9196 MockDnsClientRule::Result(MockDnsClientRule::OK),
9197 false /* delay */);
9198 rules.emplace_back("host", dns_protocol::kTypeAAAA, true /* secure */,
9199 MockDnsClientRule::Result(MockDnsClientRule::OK),
9200 false /* delay */);
9201
9202 CreateResolver();
9203 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
9204 DnsConfigOverrides overrides;
9205 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
9206 resolver_->SetDnsConfigOverrides(overrides);
9207
9208 HostResolver::ResolveHostParameters parameters;
9209 ResolveHostResponseHelper response(resolver_->CreateRequest(
9210 HostPortPair("host", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:509211 parameters, resolve_context_.get(), resolve_context_->host_cache()));
David Van Cleve1fb5e8c2019-11-04 16:45:169212
9213 // Check that the IP addresses with associated
9214 // ESNI key objects occupy the initial entries of the
9215 // address list returned by the DNS query.
9216 ASSERT_THAT(response.result_error(), IsOk());
9217 ASSERT_TRUE(response.request()->GetAddressResults());
9218 const auto& result_addresses =
9219 response.request()->GetAddressResults()->endpoints();
9220 for (const IPEndPoint& address_with_esni_keys : esni_addresses) {
9221 int index = std::find(result_addresses.begin(), result_addresses.end(),
9222 address_with_esni_keys) -
9223 result_addresses.begin();
9224
9225 // Since this address has associated ESNI keys, it should be in
9226 // the first esni_addresses.size() many entries of the result's
9227 // address list.
9228 ASSERT_TRUE(base::IsValueInRangeForNumericType<size_t>(index));
9229 EXPECT_LT(static_cast<size_t>(index), esni_addresses.size());
9230 }
9231}
9232
9233TEST_F(HostResolverManagerEsniTest, OnlyMakesRequestOverSecureDns) {
9234 // Add some insecurely-accessible ESNI results alongside
9235 // the default (insecurely-accessible) IPv4 and IPv6 results
9236 // for the "ok" hostname.
9237 MockDnsClientRuleList rules = CreateDefaultDnsRules();
9238 AddEsniRecordsRuleOptions options;
9239 options.secure = false;
9240 AddEsniRecordsRule("ok", options, &rules);
9241
9242 CreateResolver();
9243 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
9244
9245 ResolveHostResponseHelper response(resolver_->CreateRequest(
9246 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orth069a3c6e2020-01-31 23:14:249247 HostResolver::ResolveHostParameters(), resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:509248 resolve_context_->host_cache()));
David Van Cleve1fb5e8c2019-11-04 16:45:169249
9250 ASSERT_THAT(response.result_error(), IsOk());
9251
9252 // Since the request wasn't secure, we shouldn't have
9253 // queried for any ESNI results.
9254 ASSERT_FALSE(response.request()->GetEsniResults());
9255}
9256
9257// Make sure that ESNI queries don't get cancelled *before* the
9258// configured timeout, but do get cancelled after it,
9259// in the case where the absolute timeout dominates.
9260TEST_F(HostResolverManagerEsniTest, RespectsAbsoluteTimeout) {
9261 // Add some delayed ESNI, IPv4, and IPv6 results
9262 MockDnsClientRuleList rules = CreateDefaultDnsRules();
9263 AddEsniRecordsRuleOptions options;
9264 options.delay = true;
9265 AddEsniRecordsRule("host", options, &rules);
9266 rules.emplace_back("host", dns_protocol::kTypeA, true /* secure */,
9267 MockDnsClientRule::Result(MockDnsClientRule::OK),
9268 true /* delay */);
9269 rules.emplace_back("host", dns_protocol::kTypeAAAA, true /* secure */,
9270 MockDnsClientRule::Result(MockDnsClientRule::OK),
9271 true /* delay */);
9272
9273 CreateResolver();
9274 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
9275 DnsConfigOverrides overrides;
9276 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
9277 resolver_->SetDnsConfigOverrides(overrides);
9278
9279 ResolveHostResponseHelper response(resolver_->CreateRequest(
9280 HostPortPair("host", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orth069a3c6e2020-01-31 23:14:249281 HostResolver::ResolveHostParameters(), resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:509282 resolve_context_->host_cache()));
David Van Cleve1fb5e8c2019-11-04 16:45:169283
9284 base::TimeDelta absolute_timeout =
9285 features::EsniDnsMaxAbsoluteAdditionalWait();
9286
9287 // Let enough time pass during the A and AAAA transactions that the
9288 // absolute timeout will be less than the relative timeout.
9289 base::TimeDelta a_aaaa_elapsed =
9290 50 * (100.0 / features::kEsniDnsMaxRelativeAdditionalWaitPercent.Get()) *
9291 absolute_timeout;
9292
9293 FastForwardBy(a_aaaa_elapsed);
9294 ASSERT_TRUE(
9295 dns_client_->CompleteOneDelayedTransactionOfType(DnsQueryType::A));
9296 ASSERT_TRUE(
9297 dns_client_->CompleteOneDelayedTransactionOfType(DnsQueryType::AAAA));
9298
9299 // Since the A and AAAA queries have only just completed, we shouldn't
9300 // have timed out the ESNI query.
9301 EXPECT_FALSE(response.complete());
9302
9303 // After half of the absolute timeout, the query should still be alive.
9304 FastForwardBy(0.5 * absolute_timeout);
9305
9306 // Since the absolute timeout has not yet elapsed, and it is shorter by
9307 // design than the relative timeout, we shouldn't
9308 // have timed out the ESNI transaction.
9309 EXPECT_FALSE(response.complete());
9310
9311 // After (more than) the timeout has passed, we should have cancelled
9312 // the ESNI transaction.
9313 FastForwardBy(absolute_timeout);
9314 ASSERT_THAT(response.result_error(), IsOk());
9315
9316 // Since we cancelled the transaction, we shouldn't have any ESNI results.
9317 EXPECT_FALSE(response.request()->GetEsniResults());
9318}
9319
9320// Make sure that ESNI queries don't get cancelled *before* the
9321// configured timeout, but do get cancelled after it,
9322// in the case where the relative timeout dominates.
9323TEST_F(HostResolverManagerEsniTest, RespectsRelativeTimeout) {
9324 // Add some delayed ESNI, IPv4, and IPv6 results
9325 MockDnsClientRuleList rules = CreateDefaultDnsRules();
9326 AddEsniRecordsRuleOptions options;
9327 options.delay = true;
9328 AddEsniRecordsRule("host", options, &rules);
9329 rules.emplace_back("host", dns_protocol::kTypeA, true /* secure */,
9330 MockDnsClientRule::Result(MockDnsClientRule::OK),
9331 false /* delay */);
9332 rules.emplace_back("host", dns_protocol::kTypeAAAA, true /* secure */,
9333 MockDnsClientRule::Result(MockDnsClientRule::OK),
9334 true /* delay */);
9335
9336 CreateResolver();
9337 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
9338 DnsConfigOverrides overrides;
9339 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
9340 resolver_->SetDnsConfigOverrides(overrides);
9341
9342 ResolveHostResponseHelper response(resolver_->CreateRequest(
9343 HostPortPair("host", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orth069a3c6e2020-01-31 23:14:249344 HostResolver::ResolveHostParameters(), resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:509345 resolve_context_->host_cache()));
David Van Cleve1fb5e8c2019-11-04 16:45:169346
9347 // Let little enough time pass during the A and AAAA transactions that the
9348 // relative timeout will be less than the absolute timeout.
9349 base::TimeDelta a_aaaa_elapsed =
9350 0.05 * features::EsniDnsMaxAbsoluteAdditionalWait() *
9351 (100 / features::kEsniDnsMaxRelativeAdditionalWaitPercent.Get());
9352
9353 // Since the A and AAAA queries haven't both completed yet, we shouldn't time
9354 // out the ESNI query.
9355 FastForwardBy(a_aaaa_elapsed);
9356
9357 // Upon completing the AAAA transaction, the ESNI timer should start
9358 ASSERT_TRUE(
9359 dns_client_->CompleteOneDelayedTransactionOfType(DnsQueryType::AAAA));
9360
9361 base::TimeDelta relative_timeout =
9362 0.01 * features::kEsniDnsMaxRelativeAdditionalWaitPercent.Get() *
9363 a_aaaa_elapsed;
9364
9365 // After *less* than the relative timeout, the query shouldn't have concluded.
9366 FastForwardBy(relative_timeout * 0.5);
9367
9368 EXPECT_FALSE(response.complete());
9369
9370 // After more than the relative timeout, the query should conclude by aborting
9371 // the ESNI query.
9372 FastForwardBy(relative_timeout * 0.5);
9373
9374 // The task should have completed with a cancelled ESNI query.
9375 ASSERT_THAT(response.result_error(), IsOk());
9376 EXPECT_FALSE(response.request()->GetEsniResults());
9377 ASSERT_TRUE(response.request()->GetAddressResults());
9378 EXPECT_THAT(response.request()->GetAddressResults()->endpoints(),
9379 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
9380 CreateExpected("::1", 80)));
9381}
9382
9383// Test that we still receive delayed A/AAAA records
9384// that arrive after a successful (non-delayed) ESNI transaction.
9385TEST_F(HostResolverManagerEsniTest, WaitsForSlowAccompanyingQueries) {
9386 MockDnsClientRuleList rules;
9387
9388 EsniContent esni_expectation;
9389 std::vector<IPEndPoint> expected_addresses;
9390 std::tie(esni_expectation, expected_addresses) =
9391 AddEsniRecordsRule("host", AddEsniRecordsRuleOptions(), &rules);
9392
9393 rules.emplace_back("host", dns_protocol::kTypeA, true /* secure */,
9394 MockDnsClientRule::Result(MockDnsClientRule::OK),
9395 true /* delay */);
9396 expected_addresses.push_back(CreateExpected("127.0.0.1", 80));
9397
9398 rules.emplace_back("host", dns_protocol::kTypeAAAA, true /* secure */,
9399 MockDnsClientRule::Result(MockDnsClientRule::OK),
9400 true /* delay */);
9401 expected_addresses.push_back(CreateExpected("::1", 80));
9402
9403 CreateResolver();
9404 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
9405 DnsConfigOverrides overrides;
9406 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
9407 resolver_->SetDnsConfigOverrides(overrides);
9408
9409 ResolveHostResponseHelper response(resolver_->CreateRequest(
9410 HostPortPair("host", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orth069a3c6e2020-01-31 23:14:249411 HostResolver::ResolveHostParameters(), resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:509412 resolve_context_->host_cache()));
David Van Cleve1fb5e8c2019-11-04 16:45:169413
9414 // Wait quite a long time. (If the timer were erroneously to have been
9415 // started, it should expire by the end of this elapsed window.)
9416 FastForwardBy(features::EsniDnsMaxAbsoluteAdditionalWait() * 10);
9417 dns_client_->CompleteDelayedTransactions();
9418
9419 EXPECT_THAT(response.result_error(), IsOk());
9420 EXPECT_THAT(response.request()->GetEsniResults(),
9421 testing::Optional(testing::Eq(esni_expectation)));
9422 ASSERT_TRUE(response.request()->GetAddressResults());
9423 EXPECT_THAT(response.request()->GetAddressResults()->endpoints(),
9424 testing::UnorderedElementsAreArray(expected_addresses));
9425}
9426
David Van Cleveb1f45bd2019-11-14 07:36:499427TEST_F(HostResolverManagerEsniTest, RecordsSuccessMetric) {
9428 MockDnsClientRuleList rules;
9429 rules.emplace_back("host", dns_protocol::kTypeA, true /* secure */,
9430 MockDnsClientRule::Result(MockDnsClientRule::OK),
9431 false /* delay */);
9432 rules.emplace_back("host", dns_protocol::kTypeAAAA, true /* secure */,
9433 MockDnsClientRule::Result(MockDnsClientRule::OK),
9434 false /* delay */);
9435
9436 AddEsniRecordsRule("host", AddEsniRecordsRuleOptions(), &rules);
9437
9438 CreateResolver();
9439 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
9440 DnsConfigOverrides overrides;
9441 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
9442 resolver_->SetDnsConfigOverrides(overrides);
9443
9444 base::HistogramTester histograms;
9445
9446 ResolveHostResponseHelper response(resolver_->CreateRequest(
9447 HostPortPair("host", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orth069a3c6e2020-01-31 23:14:249448 HostResolver::ResolveHostParameters(), resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:509449 resolve_context_->host_cache()));
David Van Cleveb1f45bd2019-11-14 07:36:499450
9451 EXPECT_THAT(response.result_error(), IsOk());
9452
9453 histograms.ExpectTotalCount(dns_histograms::kEsniTransactionSuccessHistogram,
9454 2);
9455 histograms.ExpectBucketCount(
9456 dns_histograms::kEsniTransactionSuccessHistogram,
9457 static_cast<int>(dns_histograms::EsniSuccessOrTimeout::kSuccess), 1);
9458 histograms.ExpectBucketCount(
9459 dns_histograms::kEsniTransactionSuccessHistogram,
9460 static_cast<int>(dns_histograms::EsniSuccessOrTimeout::kStarted), 1);
9461}
9462
9463TEST_F(HostResolverManagerEsniTest, RecordsTimeoutMetric) {
9464 MockDnsClientRuleList rules;
9465 rules.emplace_back("host", dns_protocol::kTypeA, true /* secure */,
9466 MockDnsClientRule::Result(MockDnsClientRule::OK),
9467 false /* delay */);
9468 rules.emplace_back("host", dns_protocol::kTypeAAAA, true /* secure */,
9469 MockDnsClientRule::Result(MockDnsClientRule::OK),
9470 false /* delay */);
9471
9472 // Delay the ESNI record so that it times out.
9473 AddEsniRecordsRuleOptions options;
9474 options.delay = true;
9475 AddEsniRecordsRule("host", options, &rules);
9476
9477 CreateResolver();
9478 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
9479 DnsConfigOverrides overrides;
9480 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
9481 resolver_->SetDnsConfigOverrides(overrides);
9482
9483 base::HistogramTester histograms;
9484
9485 ResolveHostResponseHelper response(resolver_->CreateRequest(
9486 HostPortPair("host", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orth069a3c6e2020-01-31 23:14:249487 HostResolver::ResolveHostParameters(), resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:509488 resolve_context_->host_cache()));
David Van Cleveb1f45bd2019-11-14 07:36:499489
9490 // Give the transaction plenty of time to time out.
9491 FastForwardBy(features::EsniDnsMaxAbsoluteAdditionalWait() * 5);
9492 dns_client_->CompleteDelayedTransactions();
9493
9494 EXPECT_THAT(response.result_error(), IsOk());
9495
9496 histograms.ExpectTotalCount(dns_histograms::kEsniTransactionSuccessHistogram,
9497 2);
9498 histograms.ExpectBucketCount(
9499 dns_histograms::kEsniTransactionSuccessHistogram,
9500 static_cast<int>(dns_histograms::EsniSuccessOrTimeout::kTimeout), 1);
9501 histograms.ExpectBucketCount(
9502 dns_histograms::kEsniTransactionSuccessHistogram,
9503 static_cast<int>(dns_histograms::EsniSuccessOrTimeout::kStarted), 1);
9504}
9505
9506TEST_F(HostResolverManagerEsniTest,
9507 TimesUnspecTransactionsWhenEsniFinishesFirst) {
9508 MockDnsClientRuleList rules;
9509 rules.emplace_back("host", dns_protocol::kTypeA, true /* secure */,
9510 MockDnsClientRule::Result(MockDnsClientRule::OK),
9511 true /* delay */);
9512 rules.emplace_back("host", dns_protocol::kTypeAAAA, true /* secure */,
9513 MockDnsClientRule::Result(MockDnsClientRule::OK),
9514 false /* delay */);
9515
9516 AddEsniRecordsRuleOptions options;
9517 options.delay = true;
9518 AddEsniRecordsRule("host", options, &rules);
9519
9520 CreateResolver();
9521 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
9522 DnsConfigOverrides overrides;
9523 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
9524 resolver_->SetDnsConfigOverrides(overrides);
9525
9526 base::HistogramTester histograms;
9527
9528 ResolveHostResponseHelper response(resolver_->CreateRequest(
9529 HostPortPair("host", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orth069a3c6e2020-01-31 23:14:249530 HostResolver::ResolveHostParameters(), resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:509531 resolve_context_->host_cache()));
David Van Cleveb1f45bd2019-11-14 07:36:499532
9533 FastForwardBy(base::TimeDelta::FromMilliseconds(10));
9534 ASSERT_TRUE(
9535 dns_client_->CompleteOneDelayedTransactionOfType(DnsQueryType::ESNI));
9536 FastForwardBy(base::TimeDelta::FromMilliseconds(10));
9537 dns_client_->CompleteDelayedTransactions();
9538
9539 EXPECT_THAT(response.result_error(), IsOk());
9540
9541 histograms.ExpectTotalCount(dns_histograms::kEsniTimeHistogramForUnspecTasks,
9542 1);
9543 histograms.ExpectTotalCount(dns_histograms::kNonEsniTotalTimeHistogram, 1);
9544
9545 // Expect only a weak inequality because the timer granularity could be coarse
9546 // enough that the results end up in the same bucket.
9547 EXPECT_LE(
9548 histograms.GetAllSamples(dns_histograms::kEsniTimeHistogramForUnspecTasks)
9549 .front()
9550 .min,
9551 histograms.GetAllSamples(dns_histograms::kNonEsniTotalTimeHistogram)
9552 .front()
9553 .min);
9554
9555 // Check that the histograms recording the _difference_ in times were
9556 // updated correctly.
9557 histograms.ExpectTotalCount(
9558 dns_histograms::kEsniVersusNonEsniWithNonEsniLonger, 1);
9559 histograms.ExpectTotalCount(dns_histograms::kEsniVersusNonEsniWithEsniLonger,
9560 0);
9561}
9562
9563TEST_F(HostResolverManagerEsniTest,
9564 TimesUnspecTransactionsWhenEsniFinishesLast) {
9565 MockDnsClientRuleList rules;
9566 rules.emplace_back("host", dns_protocol::kTypeA, true /* secure */,
9567 MockDnsClientRule::Result(MockDnsClientRule::OK),
9568 false /* delay */);
9569 rules.emplace_back("host", dns_protocol::kTypeAAAA, true /* secure */,
9570 MockDnsClientRule::Result(MockDnsClientRule::OK),
9571 true /* delay */);
9572
9573 AddEsniRecordsRuleOptions options;
9574 options.delay = true;
9575 AddEsniRecordsRule("host", options, &rules);
9576
9577 CreateResolver();
9578 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
9579 DnsConfigOverrides overrides;
9580 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
9581 resolver_->SetDnsConfigOverrides(overrides);
9582
9583 base::HistogramTester histograms;
9584
9585 ResolveHostResponseHelper response(resolver_->CreateRequest(
9586 HostPortPair("host", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orth069a3c6e2020-01-31 23:14:249587 HostResolver::ResolveHostParameters(), resolve_context_.get(),
Eric Orthaf82b49a2020-02-01 01:48:509588 resolve_context_->host_cache()));
David Van Cleveb1f45bd2019-11-14 07:36:499589
9590 base::TimeDelta absolute_timeout =
9591 features::EsniDnsMaxAbsoluteAdditionalWait();
9592
9593 // Let enough time pass during the A and AAAA transactions that the
9594 // absolute timeout will be equal to the relative timeout: in particular,
9595 // waiting an additional half of either of the timeouts' durations shouldn't
9596 // lead to the ESNI transaction being cancelled.
9597 base::TimeDelta a_aaaa_elapsed =
9598 (100.0 / features::kEsniDnsMaxRelativeAdditionalWaitPercent.Get()) *
9599 absolute_timeout;
9600
9601 FastForwardBy(a_aaaa_elapsed);
9602 ASSERT_TRUE(
9603 dns_client_->CompleteOneDelayedTransactionOfType(DnsQueryType::AAAA));
9604
9605 // Since the A and AAAA queries have only just completed, we shouldn't
9606 // have timed out the ESNI query.
9607 EXPECT_FALSE(response.complete());
9608
9609 // After half of the absolute timeout, the query should still be alive.
9610 FastForwardBy(0.5 * absolute_timeout);
9611
9612 dns_client_->CompleteDelayedTransactions();
9613
9614 EXPECT_THAT(response.result_error(), IsOk());
9615
9616 histograms.ExpectTotalCount(dns_histograms::kEsniTimeHistogramForUnspecTasks,
9617 1);
9618 histograms.ExpectTotalCount(dns_histograms::kNonEsniTotalTimeHistogram, 1);
9619
9620 // Expect only a weak inequality because the timer granularity could be coarse
9621 // enough that the results end up in the same bucket.
9622 EXPECT_LE(
9623 histograms.GetAllSamples(dns_histograms::kNonEsniTotalTimeHistogram)
9624 .front()
9625 .min,
9626 histograms.GetAllSamples(dns_histograms::kEsniTimeHistogramForUnspecTasks)
9627 .front()
9628 .min);
9629
9630 // Check that the histograms recording the difference in times were
9631 // updated correctly.
9632 histograms.ExpectTotalCount(dns_histograms::kEsniVersusNonEsniWithEsniLonger,
9633 1);
9634 histograms.ExpectTotalCount(
9635 dns_histograms::kEsniVersusNonEsniWithNonEsniLonger, 0);
9636}
9637
9638TEST_F(HostResolverManagerEsniTest, TimesEsniTransactions) {
9639 MockDnsClientRuleList rules;
9640 AddEsniRecordsRule("host", AddEsniRecordsRuleOptions(), &rules);
9641
9642 CreateResolver();
9643 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
9644 DnsConfigOverrides overrides;
9645 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
9646 resolver_->SetDnsConfigOverrides(overrides);
9647
9648 base::HistogramTester histograms;
9649
9650 HostResolver::ResolveHostParameters parameters;
9651 parameters.dns_query_type = DnsQueryType::ESNI;
9652 ResolveHostResponseHelper response(resolver_->CreateRequest(
9653 HostPortPair("host", 80), NetworkIsolationKey(), NetLogWithSource(),
Eric Orthaf82b49a2020-02-01 01:48:509654 parameters, resolve_context_.get(), resolve_context_->host_cache()));
David Van Cleveb1f45bd2019-11-14 07:36:499655
9656 EXPECT_THAT(response.result_error(), IsOk());
9657
9658 histograms.ExpectTotalCount(dns_histograms::kEsniTimeHistogramForEsniTasks,
9659 1);
9660}
9661
[email protected]259aefa2009-08-20 22:45:009662} // namespace net