blob: 1c1057f2d38133d887f333621743e7cca24e8662 [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>
[email protected]471822ca2009-01-29 11:32:268#include <string>
jsbellcea42a52015-11-30 23:50:259#include <tuple>
Eric Orth70992982018-07-24 00:25:0010#include <utility>
olli.raula9cdf9d72015-12-10 14:24:2911#include <vector>
[email protected]471822ca2009-01-29 11:32:2612
Weza03bae02018-07-13 17:17:3313#include "base/auto_reset.h"
[email protected]aa22b242011-11-16 18:58:2914#include "base/bind.h"
15#include "base/bind_helpers.h"
skyostil4891b25b2015-06-11 11:43:4516#include "base/location.h"
Avi Drissman13fc8932015-12-20 04:40:4617#include "base/macros.h"
[email protected]3b63f8f42011-03-28 01:54:1518#include "base/memory/ref_counted.h"
[email protected]daae1322013-09-05 18:26:5019#include "base/run_loop.h"
skyostil4891b25b2015-06-11 11:43:4520#include "base/single_thread_task_runner.h"
tripta.gdda72022017-06-19 05:16:2321#include "base/stl_util.h"
[email protected]be528af2013-06-11 07:39:4822#include "base/strings/string_util.h"
23#include "base/strings/stringprintf.h"
[email protected]189163e2011-05-11 01:48:5424#include "base/synchronization/condition_variable.h"
25#include "base/synchronization/lock.h"
Eric Orth70992982018-07-24 00:25:0026#include "base/test/bind_test_util.h"
Eric Orth026776a2019-01-18 00:13:2827#include "base/test/simple_test_clock.h"
Eric Orth9a037562018-07-03 21:24:3828#include "base/test/test_mock_time_task_runner.h"
[email protected]57a48d32012-03-03 00:04:5529#include "base/test/test_timeouts.h"
Francois Doraya2d01ba2017-09-25 19:17:4030#include "base/threading/thread_restrictions.h"
gabf767595f2016-05-11 18:50:3531#include "base/threading/thread_task_runner_handle.h"
[email protected]66e96c42013-06-28 15:20:3132#include "base/time/time.h"
Eric Orth026776a2019-01-18 00:13:2833#include "base/timer/mock_timer.h"
Miriam Gershenson48857a352018-03-22 21:14:0334#include "base/values.h"
jdoerriedfede5ad2019-02-11 13:06:5735#include "build/build_config.h"
[email protected]ecfa71c2008-09-09 13:28:3636#include "net/base/address_list.h"
Eric Orth026776a2019-01-18 00:13:2837#include "net/base/host_port_pair.h"
martijna23c8962016-03-04 18:18:5138#include "net/base/ip_address.h"
Eric Orth026776a2019-01-18 00:13:2839#include "net/base/ip_endpoint.h"
mgershaf9a9232017-04-13 20:19:0340#include "net/base/mock_network_change_notifier.h"
[email protected]471822ca2009-01-29 11:32:2641#include "net/base/net_errors.h"
[email protected]78eac2a2012-03-14 19:09:2742#include "net/dns/dns_client.h"
Eric Orthc1eb1292018-10-09 22:07:0743#include "net/dns/dns_config.h"
[email protected]78eac2a2012-03-14 19:09:2744#include "net/dns/dns_test_util.h"
Eric Orth192e3bb2018-11-14 19:30:3245#include "net/dns/dns_util.h"
[email protected]f2cb3cf2013-03-21 01:40:5346#include "net/dns/mock_host_resolver.h"
Eric Orth9871aafa2018-10-02 19:59:1847#include "net/dns/mock_mdns_client.h"
48#include "net/dns/mock_mdns_socket_factory.h"
mikecirone8b85c432016-09-08 19:11:0049#include "net/log/net_log_event_type.h"
50#include "net/log/net_log_source_type.h"
mikecironef22f9812016-10-04 03:40:1951#include "net/log/net_log_with_source.h"
sergeyub8cdc212015-05-14 18:50:3752#include "net/log/test_net_log.h"
robpercival214763f2016-07-01 23:27:0153#include "net/test/gtest_util.h"
Bence Béky98447b12018-05-08 03:14:0154#include "net/test/test_with_scoped_task_environment.h"
Eric Orth6f1c5172019-04-16 17:08:2755#include "net/url_request/url_request_context.h"
56#include "net/url_request/url_request_test_util.h"
robpercival214763f2016-07-01 23:27:0157#include "testing/gmock/include/gmock/gmock.h"
[email protected]ecfa71c2008-09-09 13:28:3658#include "testing/gtest/include/gtest/gtest.h"
[email protected]212d1492008-09-05 19:38:5459
Eric Orth026776a2019-01-18 00:13:2860#if BUILDFLAG(ENABLE_MDNS)
61#include "net/dns/mdns_client_impl.h"
62#endif // BUILDFLAG(ENABLE_MDNS)
63
robpercival214763f2016-07-01 23:27:0164using net::test::IsError;
65using net::test::IsOk;
Eric Orth9871aafa2018-10-02 19:59:1866using ::testing::_;
67using ::testing::Between;
68using ::testing::ByMove;
Rob Percival94f21ad2017-11-14 10:20:2469using ::testing::NotNull;
Eric Orth9871aafa2018-10-02 19:59:1870using ::testing::Return;
robpercival214763f2016-07-01 23:27:0171
[email protected]259aefa2009-08-20 22:45:0072namespace net {
[email protected]68ad3ee2010-01-30 03:45:3973
[email protected]38b50d92012-04-19 21:07:5274namespace {
[email protected]112bd462009-12-10 07:23:4075
[email protected]78eac2a2012-03-14 19:09:2776const size_t kMaxJobs = 10u;
77const size_t kMaxRetryAttempts = 4u;
[email protected]68ad3ee2010-01-30 03:45:3978
Eric Orth59066222019-03-07 23:52:2779ProcTaskParams DefaultParams(HostResolverProc* resolver_proc) {
80 return ProcTaskParams(resolver_proc, kMaxRetryAttempts);
[email protected]0f292de02012-02-01 22:28:2081}
82
[email protected]38b50d92012-04-19 21:07:5283// A HostResolverProc that pushes each host mapped into a list and allows
84// waiting for a specific number of requests. Unlike RuleBasedHostResolverProc
[email protected]1ee9afa12013-04-16 14:18:0685// it never calls SystemHostResolverCall. By default resolves all hostnames to
[email protected]38b50d92012-04-19 21:07:5286// "127.0.0.1". After AddRule(), it resolves only names explicitly specified.
87class MockHostResolverProc : public HostResolverProc {
[email protected]57a48d32012-03-03 00:04:5588 public:
[email protected]38b50d92012-04-19 21:07:5289 struct ResolveKey {
Eric Orth322af3e42018-08-20 18:12:5990 ResolveKey(const std::string& hostname,
91 AddressFamily address_family,
92 HostResolverFlags flags)
93 : hostname(hostname), address_family(address_family), flags(flags) {}
[email protected]38b50d92012-04-19 21:07:5294 bool operator<(const ResolveKey& other) const {
Eric Orth322af3e42018-08-20 18:12:5995 return std::tie(address_family, hostname, flags) <
96 std::tie(other.address_family, other.hostname, other.flags);
[email protected]38b50d92012-04-19 21:07:5297 }
[email protected]137af622010-02-05 02:14:3598 std::string hostname;
99 AddressFamily address_family;
Eric Orth322af3e42018-08-20 18:12:59100 HostResolverFlags flags;
[email protected]137af622010-02-05 02:14:35101 };
102
[email protected]38b50d92012-04-19 21:07:52103 typedef std::vector<ResolveKey> CaptureList;
[email protected]137af622010-02-05 02:14:35104
[email protected]38b50d92012-04-19 21:07:52105 MockHostResolverProc()
Raul Tambre94493c652019-03-11 17:18:35106 : HostResolverProc(nullptr),
[email protected]57a48d32012-03-03 00:04:55107 num_requests_waiting_(0),
108 num_slots_available_(0),
109 requests_waiting_(&lock_),
Eric Orth960e7062019-03-08 18:43:54110 slots_available_(&lock_) {}
[email protected]57a48d32012-03-03 00:04:55111
112 // Waits until |count| calls to |Resolve| are blocked. Returns false when
113 // timed out.
114 bool WaitFor(unsigned count) {
115 base::AutoLock lock(lock_);
116 base::Time start_time = base::Time::Now();
117 while (num_requests_waiting_ < count) {
118 requests_waiting_.TimedWait(TestTimeouts::action_timeout());
119 if (base::Time::Now() > start_time + TestTimeouts::action_timeout())
120 return false;
121 }
122 return true;
123 }
124
125 // Signals |count| waiting calls to |Resolve|. First come first served.
126 void SignalMultiple(unsigned count) {
127 base::AutoLock lock(lock_);
128 num_slots_available_ += count;
129 slots_available_.Broadcast();
130 }
131
132 // Signals all waiting calls to |Resolve|. Beware of races.
133 void SignalAll() {
134 base::AutoLock lock(lock_);
[email protected]38b50d92012-04-19 21:07:52135 num_slots_available_ = num_requests_waiting_;
[email protected]57a48d32012-03-03 00:04:55136 slots_available_.Broadcast();
137 }
138
Eric Orth322af3e42018-08-20 18:12:59139 void AddRule(const std::string& hostname,
140 AddressFamily family,
141 const AddressList& result,
142 HostResolverFlags flags = 0) {
[email protected]38b50d92012-04-19 21:07:52143 base::AutoLock lock(lock_);
Eric Orth322af3e42018-08-20 18:12:59144 rules_[ResolveKey(hostname, family, flags)] = result;
[email protected]57a48d32012-03-03 00:04:55145 }
146
Eric Orth322af3e42018-08-20 18:12:59147 void AddRule(const std::string& hostname,
148 AddressFamily family,
149 const std::string& ip_list,
150 HostResolverFlags flags = 0,
151 const std::string& canonical_name = "") {
[email protected]38b50d92012-04-19 21:07:52152 AddressList result;
Eric Orth322af3e42018-08-20 18:12:59153 int rv = ParseAddressList(ip_list, canonical_name, &result);
[email protected]38b50d92012-04-19 21:07:52154 DCHECK_EQ(OK, rv);
Eric Orth322af3e42018-08-20 18:12:59155 AddRule(hostname, family, result, flags);
[email protected]38b50d92012-04-19 21:07:52156 }
[email protected]57a48d32012-03-03 00:04:55157
[email protected]38b50d92012-04-19 21:07:52158 void AddRuleForAllFamilies(const std::string& hostname,
Eric Orth322af3e42018-08-20 18:12:59159 const std::string& ip_list,
160 HostResolverFlags flags = 0,
161 const std::string& canonical_name = "") {
[email protected]38b50d92012-04-19 21:07:52162 AddressList result;
Eric Orth322af3e42018-08-20 18:12:59163 int rv = ParseAddressList(ip_list, canonical_name, &result);
[email protected]38b50d92012-04-19 21:07:52164 DCHECK_EQ(OK, rv);
Eric Orth322af3e42018-08-20 18:12:59165 AddRule(hostname, ADDRESS_FAMILY_UNSPECIFIED, result, flags);
166 AddRule(hostname, ADDRESS_FAMILY_IPV4, result, flags);
167 AddRule(hostname, ADDRESS_FAMILY_IPV6, result, flags);
[email protected]38b50d92012-04-19 21:07:52168 }
[email protected]137af622010-02-05 02:14:35169
dchengb03027d2014-10-21 12:00:20170 int Resolve(const std::string& hostname,
171 AddressFamily address_family,
172 HostResolverFlags host_resolver_flags,
173 AddressList* addrlist,
174 int* os_error) override {
[email protected]38b50d92012-04-19 21:07:52175 base::AutoLock lock(lock_);
Eric Orth322af3e42018-08-20 18:12:59176 capture_list_.push_back(
177 ResolveKey(hostname, address_family, host_resolver_flags));
[email protected]38b50d92012-04-19 21:07:52178 ++num_requests_waiting_;
179 requests_waiting_.Broadcast();
Francois Doraya2d01ba2017-09-25 19:17:40180 {
181 base::ScopedAllowBaseSyncPrimitivesForTesting
182 scoped_allow_base_sync_primitives;
183 while (!num_slots_available_)
184 slots_available_.Wait();
185 }
[email protected]38b50d92012-04-19 21:07:52186 DCHECK_GT(num_requests_waiting_, 0u);
187 --num_slots_available_;
188 --num_requests_waiting_;
189 if (rules_.empty()) {
[email protected]007b3f82013-04-09 08:46:45190 int rv = ParseAddressList("127.0.0.1", std::string(), addrlist);
[email protected]38b50d92012-04-19 21:07:52191 DCHECK_EQ(OK, rv);
192 return OK;
193 }
Eric Orth60931742018-11-05 23:40:57194 // Ignore HOST_RESOLVER_SYSTEM_ONLY, since it should have no impact on
195 // whether a rule matches. It should only affect cache lookups.
196 ResolveKey key(hostname, address_family,
197 host_resolver_flags & ~HOST_RESOLVER_SYSTEM_ONLY);
[email protected]38b50d92012-04-19 21:07:52198 if (rules_.count(key) == 0)
199 return ERR_NAME_NOT_RESOLVED;
200 *addrlist = rules_[key];
201 return OK;
[email protected]137af622010-02-05 02:14:35202 }
[email protected]38b50d92012-04-19 21:07:52203
204 CaptureList GetCaptureList() const {
205 CaptureList copy;
206 {
207 base::AutoLock lock(lock_);
208 copy = capture_list_;
209 }
210 return copy;
211 }
212
213 bool HasBlockedRequests() const {
214 base::AutoLock lock(lock_);
215 return num_requests_waiting_ > num_slots_available_;
216 }
217
[email protected]a9813302012-04-28 09:29:28218 protected:
Chris Watkins68b15032017-12-01 03:07:13219 ~MockHostResolverProc() override = default;
[email protected]38b50d92012-04-19 21:07:52220
[email protected]a9813302012-04-28 09:29:28221 private:
[email protected]38b50d92012-04-19 21:07:52222 mutable base::Lock lock_;
223 std::map<ResolveKey, AddressList> rules_;
224 CaptureList capture_list_;
225 unsigned num_requests_waiting_;
226 unsigned num_slots_available_;
227 base::ConditionVariable requests_waiting_;
228 base::ConditionVariable slots_available_;
229
230 DISALLOW_COPY_AND_ASSIGN(MockHostResolverProc);
231};
232
Eric Orth70992982018-07-24 00:25:00233class ResolveHostResponseHelper {
234 public:
235 using Callback =
236 base::OnceCallback<void(CompletionOnceCallback completion_callback,
237 int error)>;
238
239 ResolveHostResponseHelper() {}
240 explicit ResolveHostResponseHelper(
Eric Orth5233c3a2019-04-08 17:01:14241 std::unique_ptr<HostResolverManager::CancellableRequest> request)
Eric Orth70992982018-07-24 00:25:00242 : request_(std::move(request)) {
243 result_error_ = request_->Start(base::BindOnce(
244 &ResolveHostResponseHelper::OnComplete, base::Unretained(this)));
245 }
246 ResolveHostResponseHelper(
Eric Orth5233c3a2019-04-08 17:01:14247 std::unique_ptr<HostResolverManager::CancellableRequest> request,
Eric Orth70992982018-07-24 00:25:00248 Callback custom_callback)
249 : request_(std::move(request)) {
250 result_error_ = request_->Start(
251 base::BindOnce(std::move(custom_callback),
252 base::BindOnce(&ResolveHostResponseHelper::OnComplete,
253 base::Unretained(this))));
254 }
255
256 bool complete() const { return result_error_ != ERR_IO_PENDING; }
257 int result_error() {
258 WaitForCompletion();
259 return result_error_;
260 }
261
Eric Orth5233c3a2019-04-08 17:01:14262 HostResolverManager::CancellableRequest* request() { return request_.get(); }
Eric Orth70992982018-07-24 00:25:00263
264 void CancelRequest() {
265 DCHECK(request_);
266 DCHECK(!complete());
267
268 request_ = nullptr;
269 }
270
271 void OnComplete(int error) {
272 DCHECK(!complete());
273 result_error_ = error;
274
275 run_loop_.Quit();
276 }
277
278 private:
279 void WaitForCompletion() {
280 DCHECK(request_);
281 if (complete()) {
282 return;
283 }
284 run_loop_.Run();
285 DCHECK(complete());
286 }
287
Eric Orth5233c3a2019-04-08 17:01:14288 std::unique_ptr<HostResolverManager::CancellableRequest> request_;
Eric Orth70992982018-07-24 00:25:00289 int result_error_ = ERR_IO_PENDING;
290 base::RunLoop run_loop_;
291
292 DISALLOW_COPY_AND_ASSIGN(ResolveHostResponseHelper);
293};
294
[email protected]189163e2011-05-11 01:48:54295// Using LookupAttemptHostResolverProc simulate very long lookups, and control
296// which attempt resolves the host.
297class LookupAttemptHostResolverProc : public HostResolverProc {
298 public:
299 LookupAttemptHostResolverProc(HostResolverProc* previous,
300 int attempt_number_to_resolve,
301 int total_attempts)
302 : HostResolverProc(previous),
303 attempt_number_to_resolve_(attempt_number_to_resolve),
304 current_attempt_number_(0),
305 total_attempts_(total_attempts),
306 total_attempts_resolved_(0),
307 resolved_attempt_number_(0),
Eric Orth9a037562018-07-03 21:24:38308 num_attempts_waiting_(0),
309 all_done_(&lock_),
310 blocked_attempt_signal_(&lock_) {}
[email protected]189163e2011-05-11 01:48:54311
312 // Test harness will wait for all attempts to finish before checking the
313 // results.
Eric Orth9a037562018-07-03 21:24:38314 void WaitForAllAttemptsToFinish() {
315 base::AutoLock auto_lock(lock_);
316 while (total_attempts_resolved_ != total_attempts_) {
317 all_done_.Wait();
318 }
319 }
320
321 void WaitForNAttemptsToBeBlocked(int n) {
322 base::AutoLock auto_lock(lock_);
323 while (num_attempts_waiting_ < n) {
324 blocked_attempt_signal_.Wait();
[email protected]189163e2011-05-11 01:48:54325 }
326 }
327
328 // All attempts will wait for an attempt to resolve the host.
329 void WaitForAnAttemptToComplete() {
[email protected]189163e2011-05-11 01:48:54330 {
331 base::AutoLock auto_lock(lock_);
Francois Doraya2d01ba2017-09-25 19:17:40332 base::ScopedAllowBaseSyncPrimitivesForTesting
333 scoped_allow_base_sync_primitives;
Eric Orth9a037562018-07-03 21:24:38334 while (resolved_attempt_number_ == 0)
335 all_done_.Wait();
[email protected]189163e2011-05-11 01:48:54336 }
337 all_done_.Broadcast(); // Tell all waiting attempts to proceed.
338 }
339
340 // Returns the number of attempts that have finished the Resolve() method.
341 int total_attempts_resolved() { return total_attempts_resolved_; }
342
343 // Returns the first attempt that that has resolved the host.
344 int resolved_attempt_number() { return resolved_attempt_number_; }
345
Eric Orth9a037562018-07-03 21:24:38346 // Returns the current number of blocked attempts.
347 int num_attempts_waiting() { return num_attempts_waiting_; }
348
[email protected]189163e2011-05-11 01:48:54349 // HostResolverProc methods.
dchengb03027d2014-10-21 12:00:20350 int Resolve(const std::string& host,
351 AddressFamily address_family,
352 HostResolverFlags host_resolver_flags,
353 AddressList* addrlist,
354 int* os_error) override {
[email protected]189163e2011-05-11 01:48:54355 bool wait_for_right_attempt_to_complete = true;
356 {
357 base::AutoLock auto_lock(lock_);
358 ++current_attempt_number_;
Eric Orth9a037562018-07-03 21:24:38359 ++num_attempts_waiting_;
[email protected]189163e2011-05-11 01:48:54360 if (current_attempt_number_ == attempt_number_to_resolve_) {
361 resolved_attempt_number_ = current_attempt_number_;
362 wait_for_right_attempt_to_complete = false;
363 }
364 }
365
Eric Orth9a037562018-07-03 21:24:38366 blocked_attempt_signal_.Broadcast();
367
[email protected]189163e2011-05-11 01:48:54368 if (wait_for_right_attempt_to_complete)
369 // Wait for the attempt_number_to_resolve_ attempt to resolve.
370 WaitForAnAttemptToComplete();
371
372 int result = ResolveUsingPrevious(host, address_family, host_resolver_flags,
373 addrlist, os_error);
374
375 {
376 base::AutoLock auto_lock(lock_);
377 ++total_attempts_resolved_;
Eric Orth9a037562018-07-03 21:24:38378 --num_attempts_waiting_;
[email protected]189163e2011-05-11 01:48:54379 }
380
381 all_done_.Broadcast(); // Tell all attempts to proceed.
382
383 // Since any negative number is considered a network error, with -1 having
384 // special meaning (ERR_IO_PENDING). We could return the attempt that has
385 // resolved the host as a negative number. For example, if attempt number 3
386 // resolves the host, then this method returns -4.
387 if (result == OK)
388 return -1 - resolved_attempt_number_;
389 else
390 return result;
391 }
392
[email protected]a9813302012-04-28 09:29:28393 protected:
Chris Watkins68b15032017-12-01 03:07:13394 ~LookupAttemptHostResolverProc() override = default;
[email protected]189163e2011-05-11 01:48:54395
[email protected]a9813302012-04-28 09:29:28396 private:
[email protected]189163e2011-05-11 01:48:54397 int attempt_number_to_resolve_;
398 int current_attempt_number_; // Incremented whenever Resolve is called.
399 int total_attempts_;
400 int total_attempts_resolved_;
401 int resolved_attempt_number_;
Eric Orth9a037562018-07-03 21:24:38402 int num_attempts_waiting_;
[email protected]189163e2011-05-11 01:48:54403
404 // All attempts wait for right attempt to be resolve.
405 base::Lock lock_;
406 base::ConditionVariable all_done_;
Eric Orth9a037562018-07-03 21:24:38407 base::ConditionVariable blocked_attempt_signal_;
[email protected]189163e2011-05-11 01:48:54408};
409
Eric Orth960e7062019-03-08 18:43:54410// TestHostResolverManager's sole purpose is to mock the IPv6 reachability test.
cbentzel1906f872015-06-05 16:25:25411// By default, this pretends that IPv6 is globally reachable.
412// This class is necessary so unit tests run the same on dual-stack machines as
413// well as IPv4 only machines.
Eric Orth960e7062019-03-08 18:43:54414class TestHostResolverManager : public HostResolverManager {
cbentzel1906f872015-06-05 16:25:25415 public:
Eric Orth4d635c12019-04-24 22:53:04416 TestHostResolverManager(const HostResolver::ManagerOptions& options,
417 NetLog* net_log)
Eric Orth960e7062019-03-08 18:43:54418 : TestHostResolverManager(options, net_log, true) {}
cbentzel1906f872015-06-05 16:25:25419
Eric Orth4e55b362019-05-07 22:00:03420 TestHostResolverManager(
421 const HostResolver::ManagerOptions& options,
422 NetLog* net_log,
423 bool ipv6_reachable,
424 DnsClientFactory dns_client_factory_for_testing = base::NullCallback())
425 : HostResolverManager(options, net_log, dns_client_factory_for_testing),
Eric Orth960e7062019-03-08 18:43:54426 ipv6_reachable_(ipv6_reachable) {}
cbentzel1906f872015-06-05 16:25:25427
Eric Orth960e7062019-03-08 18:43:54428 ~TestHostResolverManager() override = default;
cbentzel1906f872015-06-05 16:25:25429
430 private:
431 const bool ipv6_reachable_;
432
mgershaf9a9232017-04-13 20:19:03433 bool IsGloballyReachable(const IPAddress& dest,
434 const NetLogWithSource& net_log) override {
cbentzel1906f872015-06-05 16:25:25435 return ipv6_reachable_;
436 }
437};
438
Matt Menkec35d1632018-11-29 12:43:49439bool HasAddress(const IPAddress& search_address, const AddressList& addresses) {
tfarina9ed7f8c52016-02-19 17:50:18440 for (const auto& address : addresses) {
Matt Menkec35d1632018-11-29 12:43:49441 if (search_address == address.address())
tfarina9ed7f8c52016-02-19 17:50:18442 return true;
443 }
444 return false;
445}
446
447void TestBothLoopbackIPs(const std::string& host) {
tfarina9ed7f8c52016-02-19 17:50:18448 AddressList addresses;
Matt Menkec35d1632018-11-29 12:43:49449 EXPECT_TRUE(ResolveLocalHostname(host, &addresses));
tfarina9ed7f8c52016-02-19 17:50:18450 EXPECT_EQ(2u, addresses.size());
Matt Menkec35d1632018-11-29 12:43:49451 EXPECT_TRUE(HasAddress(IPAddress::IPv4Localhost(), addresses));
452 EXPECT_TRUE(HasAddress(IPAddress::IPv6Localhost(), addresses));
tfarina9ed7f8c52016-02-19 17:50:18453}
454
455void TestIPv6LoopbackOnly(const std::string& host) {
tfarina9ed7f8c52016-02-19 17:50:18456 AddressList addresses;
Matt Menkec35d1632018-11-29 12:43:49457 EXPECT_TRUE(ResolveLocalHostname(host, &addresses));
tfarina9ed7f8c52016-02-19 17:50:18458 EXPECT_EQ(1u, addresses.size());
Matt Menkec35d1632018-11-29 12:43:49459 EXPECT_TRUE(HasAddress(IPAddress::IPv6Localhost(), addresses));
tfarina9ed7f8c52016-02-19 17:50:18460}
461
[email protected]38b50d92012-04-19 21:07:52462} // namespace
[email protected]8a00f00a2009-06-12 00:49:38463
Eric Orth960e7062019-03-08 18:43:54464class HostResolverManagerTest : public TestWithScopedTaskEnvironment {
[email protected]471822ca2009-01-29 11:32:26465 public:
[email protected]38b50d92012-04-19 21:07:52466 static const int kDefaultPort = 80;
467
Eric Orth960e7062019-03-08 18:43:54468 HostResolverManagerTest() : proc_(new MockHostResolverProc()) {}
[email protected]471822ca2009-01-29 11:32:26469
Eric Orth607b6d82019-05-08 16:43:32470 void CreateResolver(bool check_ipv6_on_wifi = true) {
Eric Orth70992982018-07-24 00:25:00471 CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:32472 true /* ipv6_reachable */,
473 check_ipv6_on_wifi);
[email protected]daae1322013-09-05 18:26:50474 }
475
Eric Orth37b18192019-04-22 19:09:28476 void DestroyResolver() {
477 if (!resolver_)
478 return;
479
480 if (host_cache_)
481 resolver_->RemoveHostCacheInvalidator(host_cache_->invalidator());
482 resolver_ = nullptr;
483 }
484
Eric Orth960e7062019-03-08 18:43:54485 // This HostResolverManager will only allow 1 outstanding resolve at a time
486 // and perform no retries.
Eric Orth607b6d82019-05-08 16:43:32487 void CreateSerialResolver(bool check_ipv6_on_wifi = true) {
Eric Orth59066222019-03-07 23:52:27488 ProcTaskParams params = DefaultParams(proc_.get());
[email protected]daae1322013-09-05 18:26:50489 params.max_retry_attempts = 0u;
Eric Orth607b6d82019-05-08 16:43:32490 CreateResolverWithLimitsAndParams(1u, params, true /* ipv6_reachable */,
491 check_ipv6_on_wifi);
[email protected]daae1322013-09-05 18:26:50492 }
493
[email protected]471822ca2009-01-29 11:32:26494 protected:
[email protected]daae1322013-09-05 18:26:50495 // testing::Test implementation:
Eric Orth6f1c5172019-04-16 17:08:27496 void SetUp() override {
Eric Orth37b18192019-04-22 19:09:28497 host_cache_ = HostCache::CreateDefaultCache();
Eric Orth6f1c5172019-04-16 17:08:27498 CreateResolver();
499 request_context_ = std::make_unique<TestURLRequestContext>();
500 }
[email protected]70c04ab2013-08-22 16:05:12501
dcheng67be2b1f2014-10-27 21:47:29502 void TearDown() override {
Eric Orth37b18192019-04-22 19:09:28503 if (resolver_) {
[email protected]daae1322013-09-05 18:26:50504 EXPECT_EQ(0u, resolver_->num_running_dispatcher_jobs_for_tests());
Eric Orth37b18192019-04-22 19:09:28505 if (host_cache_)
506 resolver_->RemoveHostCacheInvalidator(host_cache_->invalidator());
507 }
[email protected]daae1322013-09-05 18:26:50508 EXPECT_FALSE(proc_->HasBlockedRequests());
509 }
510
Eric Orth4e55b362019-05-07 22:00:03511 void CreateResolverWithLimitsAndParams(size_t max_concurrent_resolves,
512 const ProcTaskParams& params,
Eric Orth607b6d82019-05-08 16:43:32513 bool ipv6_reachable,
514 bool check_ipv6_on_wifi) {
Eric Orth4d635c12019-04-24 22:53:04515 HostResolver::ManagerOptions options = DefaultOptions();
[email protected]106ccd2c2014-06-17 09:21:00516 options.max_concurrent_resolves = max_concurrent_resolves;
Eric Orth607b6d82019-05-08 16:43:32517 options.check_ipv6_on_wifi = check_ipv6_on_wifi;
Eric Orth4e55b362019-05-07 22:00:03518
519 CreateResolverWithOptionsAndParams(std::move(options), params,
520 ipv6_reachable);
521 }
522
523 virtual HostResolver::ManagerOptions DefaultOptions() {
524 HostResolver::ManagerOptions options;
525 options.max_concurrent_resolves = kMaxJobs;
526 options.max_system_retry_attempts = kMaxRetryAttempts;
527 return options;
528 }
529
530 virtual void CreateResolverWithOptionsAndParams(
531 HostResolver::ManagerOptions options,
532 const ProcTaskParams& params,
533 bool ipv6_reachable) {
534 // Use HostResolverManagerDnsTest if enabling DNS client.
535 DCHECK(!options.dns_client_enabled);
536
537 DestroyResolver();
538
539 resolver_ = std::make_unique<TestHostResolverManager>(
540 options, nullptr /* net_log */, ipv6_reachable);
[email protected]106ccd2c2014-06-17 09:21:00541 resolver_->set_proc_params_for_test(params);
Eric Orth37b18192019-04-22 19:09:28542
543 if (host_cache_)
544 resolver_->AddHostCacheInvalidator(host_cache_->invalidator());
[email protected]471822ca2009-01-29 11:32:26545 }
[email protected]aa22b242011-11-16 18:58:29546
[email protected]38b50d92012-04-19 21:07:52547 // Friendship is not inherited, so use proxies to access those.
[email protected]daae1322013-09-05 18:26:50548 size_t num_running_dispatcher_jobs() const {
[email protected]38b50d92012-04-19 21:07:52549 DCHECK(resolver_.get());
[email protected]daae1322013-09-05 18:26:50550 return resolver_->num_running_dispatcher_jobs_for_tests();
[email protected]38b50d92012-04-19 21:07:52551 }
552
Eric Orth60931742018-11-05 23:40:57553 void set_allow_fallback_to_proctask(bool allow_fallback_to_proctask) {
[email protected]16c2bd72013-06-28 01:19:22554 DCHECK(resolver_.get());
Eric Orth60931742018-11-05 23:40:57555 resolver_->allow_fallback_to_proctask_ = allow_fallback_to_proctask;
[email protected]16c2bd72013-06-28 01:19:22556 }
557
[email protected]daae1322013-09-05 18:26:50558 static unsigned maximum_dns_failures() {
Eric Orth960e7062019-03-08 18:43:54559 return HostResolverManager::kMaximumDnsFailures;
[email protected]daae1322013-09-05 18:26:50560 }
561
tfarina428341112016-09-22 13:38:20562 bool IsIPv6Reachable(const NetLogWithSource& net_log) {
sergeyub8cdc212015-05-14 18:50:37563 return resolver_->IsIPv6Reachable(net_log);
564 }
565
dalyk48b20a992019-02-25 16:10:26566 const std::pair<const HostCache::Key, HostCache::Entry>* GetCacheHit(
567 const HostCache::Key& key) {
Eric Orth37b18192019-04-22 19:09:28568 DCHECK(host_cache_);
569 return host_cache_->LookupStale(key, base::TimeTicks(), nullptr,
570 false /* ignore_secure */);
Rob Percival94f21ad2017-11-14 10:20:24571 }
572
juliatuttle9fb7aeb2016-06-06 20:16:33573 void MakeCacheStale() {
Eric Orth37b18192019-04-22 19:09:28574 DCHECK(host_cache_);
575 host_cache_->Invalidate();
juliatuttle9fb7aeb2016-06-06 20:16:33576 }
577
Eric Orth70992982018-07-24 00:25:00578 IPEndPoint CreateExpected(const std::string& ip_literal, uint16_t port) {
579 IPAddress ip;
580 bool result = ip.AssignFromIPLiteral(ip_literal);
581 DCHECK(result);
582 return IPEndPoint(ip, port);
583 }
584
[email protected]38b50d92012-04-19 21:07:52585 scoped_refptr<MockHostResolverProc> proc_;
Eric Orth960e7062019-03-08 18:43:54586 std::unique_ptr<HostResolverManager> resolver_;
Eric Orth6f1c5172019-04-16 17:08:27587 std::unique_ptr<URLRequestContext> request_context_;
Eric Orth117e1992019-04-17 00:24:15588 std::unique_ptr<HostCache> host_cache_;
[email protected]471822ca2009-01-29 11:32:26589};
590
Eric Orth960e7062019-03-08 18:43:54591TEST_F(HostResolverManagerTest, AsynchronousLookup) {
[email protected]38b50d92012-04-19 21:07:52592 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42");
593 proc_->SignalMultiple(1u);
[email protected]471822ca2009-01-29 11:32:26594
Eric Orth70992982018-07-24 00:25:00595 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:27596 HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:15597 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:00598
599 EXPECT_THAT(response.result_error(), IsOk());
600 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
601 testing::ElementsAre(CreateExpected("192.168.1.42", 80)));
Eric Ortheb332862019-01-26 00:52:38602 EXPECT_FALSE(response.request()->GetStaleInfo());
Eric Orth70992982018-07-24 00:25:00603
604 EXPECT_EQ("just.testing", proc_->GetCaptureList()[0].hostname);
Eric Orth26fa08e2019-02-22 01:28:37605
dalyk48b20a992019-02-25 16:10:26606 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result =
607 GetCacheHit(HostCache::Key("just.testing", DnsQueryType::UNSPECIFIED,
608 0 /* host_resolver_flags */,
609 HostResolverSource::ANY));
610 EXPECT_TRUE(cache_result);
Eric Orth70992982018-07-24 00:25:00611}
612
Eric Orth6f1c5172019-04-16 17:08:27613TEST_F(HostResolverManagerTest, JobsClearedOnCompletion) {
614 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42");
615 proc_->SignalMultiple(1u);
616
617 ResolveHostResponseHelper response(resolver_->CreateRequest(
618 HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:15619 request_context_.get(), host_cache_.get()));
Eric Orth6f1c5172019-04-16 17:08:27620 EXPECT_EQ(1u, resolver_->num_jobs_for_testing());
621
622 EXPECT_THAT(response.result_error(), IsOk());
623 EXPECT_EQ(0u, resolver_->num_jobs_for_testing());
624}
625
626TEST_F(HostResolverManagerTest, JobsClearedOnCompletion_MultipleRequests) {
627 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42");
628 proc_->SignalMultiple(1u);
629
630 ResolveHostResponseHelper response1(resolver_->CreateRequest(
631 HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:15632 request_context_.get(), host_cache_.get()));
Eric Orth6f1c5172019-04-16 17:08:27633 ResolveHostResponseHelper response2(resolver_->CreateRequest(
634 HostPortPair("just.testing", 85), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:15635 request_context_.get(), host_cache_.get()));
Eric Orth6f1c5172019-04-16 17:08:27636 EXPECT_EQ(1u, resolver_->num_jobs_for_testing());
637
638 EXPECT_THAT(response1.result_error(), IsOk());
639 EXPECT_THAT(response2.result_error(), IsOk());
640 EXPECT_EQ(0u, resolver_->num_jobs_for_testing());
641}
642
643TEST_F(HostResolverManagerTest, JobsClearedOnCompletion_Failure) {
644 proc_->AddRuleForAllFamilies(std::string(),
645 "0.0.0.0"); // Default to failures.
646 proc_->SignalMultiple(1u);
647
648 ResolveHostResponseHelper response(resolver_->CreateRequest(
649 HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:15650 request_context_.get(), host_cache_.get()));
Eric Orth6f1c5172019-04-16 17:08:27651 EXPECT_EQ(1u, resolver_->num_jobs_for_testing());
652
653 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
654 EXPECT_EQ(0u, resolver_->num_jobs_for_testing());
655}
656
657TEST_F(HostResolverManagerTest, JobsClearedOnCompletion_Abort) {
658 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42");
659
660 ResolveHostResponseHelper response(resolver_->CreateRequest(
661 HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:15662 request_context_.get(), host_cache_.get()));
Eric Orth6f1c5172019-04-16 17:08:27663 EXPECT_EQ(1u, resolver_->num_jobs_for_testing());
664
665 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
666 proc_->SignalMultiple(1u);
667
668 EXPECT_THAT(response.result_error(), IsError(ERR_NETWORK_CHANGED));
669 EXPECT_EQ(0u, resolver_->num_jobs_for_testing());
670}
671
Eric Orth960e7062019-03-08 18:43:54672TEST_F(HostResolverManagerTest, DnsQueryType) {
Eric Orth00fe5a62018-08-15 22:20:00673 proc_->AddRule("host", ADDRESS_FAMILY_IPV4, "192.168.1.20");
674 proc_->AddRule("host", ADDRESS_FAMILY_IPV6, "::5");
675
676 HostResolver::ResolveHostParameters parameters;
677
Eric Orth192e3bb2018-11-14 19:30:32678 parameters.dns_query_type = DnsQueryType::A;
Eric Orth117e1992019-04-17 00:24:15679 ResolveHostResponseHelper v4_response(resolver_->CreateRequest(
680 HostPortPair("host", 80), NetLogWithSource(), parameters,
681 request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:00682
Eric Orth192e3bb2018-11-14 19:30:32683 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth117e1992019-04-17 00:24:15684 ResolveHostResponseHelper v6_response(resolver_->CreateRequest(
685 HostPortPair("host", 80), NetLogWithSource(), parameters,
686 request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:00687
688 proc_->SignalMultiple(2u);
689
690 EXPECT_THAT(v4_response.result_error(), IsOk());
691 EXPECT_THAT(v4_response.request()->GetAddressResults().value().endpoints(),
692 testing::ElementsAre(CreateExpected("192.168.1.20", 80)));
693
694 EXPECT_THAT(v6_response.result_error(), IsOk());
695 EXPECT_THAT(v6_response.request()->GetAddressResults().value().endpoints(),
696 testing::ElementsAre(CreateExpected("::5", 80)));
697}
698
Eric Orth960e7062019-03-08 18:43:54699TEST_F(HostResolverManagerTest, LocalhostIPV4IPV6Lookup) {
Eric Orth00fe5a62018-08-15 22:20:00700 HostResolver::ResolveHostParameters parameters;
701
Eric Orth192e3bb2018-11-14 19:30:32702 parameters.dns_query_type = DnsQueryType::A;
Eric Orth00fe5a62018-08-15 22:20:00703 ResolveHostResponseHelper v6_v4_response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:27704 HostPortPair("localhost6", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:15705 request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:00706 EXPECT_THAT(v6_v4_response.result_error(), IsOk());
707 EXPECT_THAT(v6_v4_response.request()->GetAddressResults().value().endpoints(),
708 testing::IsEmpty());
709
Eric Orth192e3bb2018-11-14 19:30:32710 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth00fe5a62018-08-15 22:20:00711 ResolveHostResponseHelper v6_v6_response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:27712 HostPortPair("localhost6", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:15713 request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:00714 EXPECT_THAT(v6_v6_response.result_error(), IsOk());
715 EXPECT_THAT(v6_v6_response.request()->GetAddressResults().value().endpoints(),
716 testing::ElementsAre(CreateExpected("::1", 80)));
717
718 ResolveHostResponseHelper v6_unsp_response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:27719 HostPortPair("localhost6", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:15720 request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:00721 EXPECT_THAT(v6_unsp_response.result_error(), IsOk());
722 EXPECT_THAT(
723 v6_unsp_response.request()->GetAddressResults().value().endpoints(),
724 testing::ElementsAre(CreateExpected("::1", 80)));
725
Eric Orth192e3bb2018-11-14 19:30:32726 parameters.dns_query_type = DnsQueryType::A;
Eric Orth00fe5a62018-08-15 22:20:00727 ResolveHostResponseHelper v4_v4_response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:27728 HostPortPair("localhost", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:15729 request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:00730 EXPECT_THAT(v4_v4_response.result_error(), IsOk());
731 EXPECT_THAT(v4_v4_response.request()->GetAddressResults().value().endpoints(),
732 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
733
Eric Orth192e3bb2018-11-14 19:30:32734 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth00fe5a62018-08-15 22:20:00735 ResolveHostResponseHelper v4_v6_response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:27736 HostPortPair("localhost", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:15737 request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:00738 EXPECT_THAT(v4_v6_response.result_error(), IsOk());
739 EXPECT_THAT(v4_v6_response.request()->GetAddressResults().value().endpoints(),
740 testing::ElementsAre(CreateExpected("::1", 80)));
741
742 ResolveHostResponseHelper v4_unsp_response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:27743 HostPortPair("localhost", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:15744 request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:00745 EXPECT_THAT(v4_unsp_response.result_error(), IsOk());
746 EXPECT_THAT(
747 v4_unsp_response.request()->GetAddressResults().value().endpoints(),
748 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
749 CreateExpected("::1", 80)));
750}
751
Eric Orth960e7062019-03-08 18:43:54752TEST_F(HostResolverManagerTest, ResolveIPLiteralWithHostResolverSystemOnly) {
eroman368a1002016-03-04 21:52:55753 const char kIpLiteral[] = "178.78.32.1";
754 // Add a mapping to tell if the resolver proc was called (if it was called,
755 // then the result will be the remapped value. Otherwise it will be the IP
756 // literal).
757 proc_->AddRuleForAllFamilies(kIpLiteral, "183.45.32.1");
758
Eric Orthdc35748e2018-08-23 22:41:48759 HostResolver::ResolveHostParameters parameters;
760 parameters.source = HostResolverSource::SYSTEM;
Eric Orth117e1992019-04-17 00:24:15761 ResolveHostResponseHelper response(resolver_->CreateRequest(
762 HostPortPair(kIpLiteral, 80), NetLogWithSource(), parameters,
763 request_context_.get(), host_cache_.get()));
Eric Orthdc35748e2018-08-23 22:41:48764
765 // IP literal resolution is expected to take precedence over source, so the
766 // result is expected to be the input IP, not the result IP from the proc rule
767 EXPECT_THAT(response.result_error(), IsOk());
768 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
769 testing::ElementsAre(CreateExpected(kIpLiteral, 80)));
Eric Ortheb332862019-01-26 00:52:38770 EXPECT_FALSE(response.request()->GetStaleInfo());
Eric Orthdc35748e2018-08-23 22:41:48771}
772
Eric Orth960e7062019-03-08 18:43:54773TEST_F(HostResolverManagerTest, EmptyListMeansNameNotResolved) {
[email protected]49b70b222013-05-07 21:24:23774 proc_->AddRuleForAllFamilies("just.testing", "");
775 proc_->SignalMultiple(1u);
776
Eric Orth70992982018-07-24 00:25:00777 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:27778 HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:15779 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:00780
781 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
782 EXPECT_FALSE(response.request()->GetAddressResults());
Eric Ortheb332862019-01-26 00:52:38783 EXPECT_FALSE(response.request()->GetStaleInfo());
Eric Orth70992982018-07-24 00:25:00784
785 EXPECT_EQ("just.testing", proc_->GetCaptureList()[0].hostname);
786}
787
Eric Orth960e7062019-03-08 18:43:54788TEST_F(HostResolverManagerTest, FailedAsynchronousLookup) {
[email protected]007b3f82013-04-09 08:46:45789 proc_->AddRuleForAllFamilies(std::string(),
790 "0.0.0.0"); // Default to failures.
[email protected]38b50d92012-04-19 21:07:52791 proc_->SignalMultiple(1u);
[email protected]a33347c2012-01-09 18:27:01792
Eric Orth70992982018-07-24 00:25:00793 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:27794 HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:15795 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:00796 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
797 EXPECT_FALSE(response.request()->GetAddressResults());
Eric Ortheb332862019-01-26 00:52:38798 EXPECT_FALSE(response.request()->GetStaleInfo());
Eric Orth70992982018-07-24 00:25:00799
800 EXPECT_EQ("just.testing", proc_->GetCaptureList()[0].hostname);
801
802 // Also test that the error is not cached.
dalyk48b20a992019-02-25 16:10:26803 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result =
804 GetCacheHit(HostCache::Key("just.testing", DnsQueryType::UNSPECIFIED,
805 0 /* host_resolver_flags */,
806 HostResolverSource::ANY));
807 EXPECT_FALSE(cache_result);
Eric Orth70992982018-07-24 00:25:00808}
809
Eric Orth960e7062019-03-08 18:43:54810TEST_F(HostResolverManagerTest, AbortedAsynchronousLookup) {
Eric Orth70992982018-07-24 00:25:00811 ResolveHostResponseHelper response0(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:27812 HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:15813 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:00814 ASSERT_FALSE(response0.complete());
815 ASSERT_TRUE(proc_->WaitFor(1u));
816
817 // Resolver is destroyed while job is running on WorkerPool.
Eric Orth37b18192019-04-22 19:09:28818 DestroyResolver();
Eric Orth70992982018-07-24 00:25:00819
820 proc_->SignalAll();
821
822 // To ensure there was no spurious callback, complete with a new resolver.
823 CreateResolver();
824 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:27825 HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:15826 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:00827
828 proc_->SignalMultiple(2u);
829
830 EXPECT_THAT(response1.result_error(), IsOk());
831
832 // This request was canceled.
833 EXPECT_FALSE(response0.complete());
834}
835
Eric Orth960e7062019-03-08 18:43:54836TEST_F(HostResolverManagerTest, NumericIPv4Address) {
Eric Orth70992982018-07-24 00:25:00837 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:27838 HostPortPair("127.1.2.3", 5555), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:15839 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:00840
841 EXPECT_THAT(response.result_error(), IsOk());
842 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
843 testing::ElementsAre(CreateExpected("127.1.2.3", 5555)));
844}
845
Eric Orth960e7062019-03-08 18:43:54846TEST_F(HostResolverManagerTest, NumericIPv6Address) {
[email protected]dbcff96272009-05-07 00:23:44847 // Resolve a plain IPv6 address. Don't worry about [brackets], because
848 // the caller should have removed them.
Eric Orth70992982018-07-24 00:25:00849 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:27850 HostPortPair("2001:db8::1", 5555), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:15851 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:00852
853 EXPECT_THAT(response.result_error(), IsOk());
854 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
855 testing::ElementsAre(CreateExpected("2001:db8::1", 5555)));
856}
857
Eric Orth960e7062019-03-08 18:43:54858TEST_F(HostResolverManagerTest, EmptyHost) {
Eric Orth70992982018-07-24 00:25:00859 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:27860 HostPortPair(std::string(), 5555), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:15861 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:00862
863 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
864 EXPECT_FALSE(response.request()->GetAddressResults());
865}
866
Eric Orth960e7062019-03-08 18:43:54867TEST_F(HostResolverManagerTest, EmptyDotsHost) {
[email protected]e806cd72013-05-17 02:08:43868 for (int i = 0; i < 16; ++i) {
Eric Orth6f1c5172019-04-16 17:08:27869 ResolveHostResponseHelper response(resolver_->CreateRequest(
870 HostPortPair(std::string(i, '.'), 5555), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:15871 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:00872
873 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
874 EXPECT_FALSE(response.request()->GetAddressResults());
875 }
876}
877
Eric Orth960e7062019-03-08 18:43:54878TEST_F(HostResolverManagerTest, LongHost) {
Eric Orth6f1c5172019-04-16 17:08:27879 ResolveHostResponseHelper response(resolver_->CreateRequest(
880 HostPortPair(std::string(4097, 'a'), 5555), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:15881 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:00882
883 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
884 EXPECT_FALSE(response.request()->GetAddressResults());
885}
886
Eric Orth960e7062019-03-08 18:43:54887TEST_F(HostResolverManagerTest, DeDupeRequests) {
[email protected]b59ff372009-07-15 22:04:32888 // Start 5 requests, duplicating hosts "a" and "b". Since the resolver_proc is
[email protected]8a00f00a2009-06-12 00:49:38889 // blocked, these should all pile up until we signal it.
Eric Orth70992982018-07-24 00:25:00890 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:15891 responses.emplace_back(
892 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
893 HostPortPair("a", 80), NetLogWithSource(), base::nullopt,
894 request_context_.get(), host_cache_.get())));
895 responses.emplace_back(
896 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
897 HostPortPair("b", 80), NetLogWithSource(), base::nullopt,
898 request_context_.get(), host_cache_.get())));
899 responses.emplace_back(
900 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
901 HostPortPair("b", 81), NetLogWithSource(), base::nullopt,
902 request_context_.get(), host_cache_.get())));
903 responses.emplace_back(
904 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
905 HostPortPair("a", 82), NetLogWithSource(), base::nullopt,
906 request_context_.get(), host_cache_.get())));
907 responses.emplace_back(
908 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
909 HostPortPair("b", 83), NetLogWithSource(), base::nullopt,
910 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:00911
912 for (auto& response : responses) {
913 ASSERT_FALSE(response->complete());
914 }
915
916 proc_->SignalMultiple(2u); // One for "a", one for "b".
917
918 for (auto& response : responses) {
919 EXPECT_THAT(response->result_error(), IsOk());
920 }
921}
922
Eric Orth960e7062019-03-08 18:43:54923TEST_F(HostResolverManagerTest, CancelMultipleRequests) {
Eric Orth70992982018-07-24 00:25:00924 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:15925 responses.emplace_back(
926 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
927 HostPortPair("a", 80), NetLogWithSource(), base::nullopt,
928 request_context_.get(), host_cache_.get())));
929 responses.emplace_back(
930 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
931 HostPortPair("b", 80), NetLogWithSource(), base::nullopt,
932 request_context_.get(), host_cache_.get())));
933 responses.emplace_back(
934 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
935 HostPortPair("b", 81), NetLogWithSource(), base::nullopt,
936 request_context_.get(), host_cache_.get())));
937 responses.emplace_back(
938 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
939 HostPortPair("a", 82), NetLogWithSource(), base::nullopt,
940 request_context_.get(), host_cache_.get())));
941 responses.emplace_back(
942 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
943 HostPortPair("b", 83), NetLogWithSource(), base::nullopt,
944 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:00945
946 for (auto& response : responses) {
947 ASSERT_FALSE(response->complete());
948 }
949
950 // Cancel everything except request for requests[3] ("a", 82).
951 responses[0]->CancelRequest();
952 responses[1]->CancelRequest();
953 responses[2]->CancelRequest();
954 responses[4]->CancelRequest();
955
956 proc_->SignalMultiple(2u); // One for "a", one for "b".
957
958 EXPECT_THAT(responses[3]->result_error(), IsOk());
959
960 EXPECT_FALSE(responses[0]->complete());
961 EXPECT_FALSE(responses[1]->complete());
962 EXPECT_FALSE(responses[2]->complete());
963 EXPECT_FALSE(responses[4]->complete());
964}
965
Eric Orth960e7062019-03-08 18:43:54966TEST_F(HostResolverManagerTest, CanceledRequestsReleaseJobSlots) {
Eric Orth70992982018-07-24 00:25:00967 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
968
969 // Fill up the dispatcher and queue.
970 for (unsigned i = 0; i < kMaxJobs + 1; ++i) {
971 std::string hostname = "a_";
972 hostname[1] = 'a' + i;
973
Eric Orth117e1992019-04-17 00:24:15974 responses.emplace_back(
975 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
976 HostPortPair(hostname, 80), NetLogWithSource(), base::nullopt,
977 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:00978 ASSERT_FALSE(responses.back()->complete());
979
Eric Orth117e1992019-04-17 00:24:15980 responses.emplace_back(
981 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
982 HostPortPair(hostname, 81), NetLogWithSource(), base::nullopt,
983 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:00984 ASSERT_FALSE(responses.back()->complete());
985 }
986
987 ASSERT_TRUE(proc_->WaitFor(kMaxJobs));
988
989 // Cancel all but last two.
990 for (unsigned i = 0; i < responses.size() - 2; ++i) {
991 responses[i]->CancelRequest();
992 }
993
994 ASSERT_TRUE(proc_->WaitFor(kMaxJobs + 1));
995
996 proc_->SignalAll();
997
998 size_t num_requests = responses.size();
999 EXPECT_THAT(responses[num_requests - 1]->result_error(), IsOk());
1000 EXPECT_THAT(responses[num_requests - 2]->result_error(), IsOk());
1001 for (unsigned i = 0; i < num_requests - 2; ++i) {
1002 EXPECT_FALSE(responses[i]->complete());
1003 }
1004}
1005
Eric Orth960e7062019-03-08 18:43:541006TEST_F(HostResolverManagerTest, CancelWithinCallback) {
Eric Orth70992982018-07-24 00:25:001007 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
1008 auto custom_callback = base::BindLambdaForTesting(
1009 [&](CompletionOnceCallback completion_callback, int error) {
1010 for (auto& response : responses) {
1011 // Cancelling request is required to complete first, so that it can
1012 // attempt to cancel the others. This test assumes all jobs are
1013 // completed in order.
1014 DCHECK(!response->complete());
1015
1016 response->CancelRequest();
1017 }
1018 std::move(completion_callback).Run(error);
1019 });
1020
1021 ResolveHostResponseHelper cancelling_response(
Eric Orth00fe5a62018-08-15 22:20:001022 resolver_->CreateRequest(HostPortPair("a", 80), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:151023 base::nullopt, request_context_.get(),
1024 host_cache_.get()),
Eric Orth70992982018-07-24 00:25:001025 std::move(custom_callback));
1026
Eric Orth117e1992019-04-17 00:24:151027 responses.emplace_back(
1028 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1029 HostPortPair("a", 81), NetLogWithSource(), base::nullopt,
1030 request_context_.get(), host_cache_.get())));
1031 responses.emplace_back(
1032 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1033 HostPortPair("a", 82), NetLogWithSource(), base::nullopt,
1034 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:001035
1036 proc_->SignalMultiple(2u); // One for "a". One for "finalrequest".
1037
1038 EXPECT_THAT(cancelling_response.result_error(), IsOk());
1039
1040 ResolveHostResponseHelper final_response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:271041 HostPortPair("finalrequest", 70), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:151042 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:001043 EXPECT_THAT(final_response.result_error(), IsOk());
1044
1045 for (auto& response : responses) {
1046 EXPECT_FALSE(response->complete());
1047 }
1048}
1049
Eric Orth960e7062019-03-08 18:43:541050TEST_F(HostResolverManagerTest, DeleteWithinCallback) {
Eric Orth70992982018-07-24 00:25:001051 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
1052 auto custom_callback = base::BindLambdaForTesting(
1053 [&](CompletionOnceCallback completion_callback, int error) {
1054 for (auto& response : responses) {
1055 // Deleting request is required to be first, so the other requests
1056 // will still be running to be deleted. This test assumes that the
1057 // Jobs will be Aborted in order and the requests in order within the
1058 // jobs.
1059 DCHECK(!response->complete());
1060 }
1061
Eric Orth37b18192019-04-22 19:09:281062 DestroyResolver();
Eric Orth70992982018-07-24 00:25:001063 std::move(completion_callback).Run(error);
1064 });
1065
1066 ResolveHostResponseHelper deleting_response(
Eric Orth00fe5a62018-08-15 22:20:001067 resolver_->CreateRequest(HostPortPair("a", 80), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:151068 base::nullopt, request_context_.get(),
1069 host_cache_.get()),
Eric Orth70992982018-07-24 00:25:001070 std::move(custom_callback));
1071
1072 // Start additional requests to be cancelled as part of the first's deletion.
1073 // Assumes all requests for a job are handled in order so that the deleting
1074 // request will run first and cancel the rest.
Eric Orth117e1992019-04-17 00:24:151075 responses.emplace_back(
1076 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1077 HostPortPair("a", 81), NetLogWithSource(), base::nullopt,
1078 request_context_.get(), host_cache_.get())));
1079 responses.emplace_back(
1080 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1081 HostPortPair("a", 82), NetLogWithSource(), base::nullopt,
1082 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:001083
1084 proc_->SignalMultiple(3u);
1085
1086 EXPECT_THAT(deleting_response.result_error(), IsOk());
1087
1088 base::RunLoop().RunUntilIdle();
1089 for (auto& response : responses) {
1090 EXPECT_FALSE(response->complete());
1091 }
1092}
1093
jdoerriedfede5ad2019-02-11 13:06:571094// Flaky on Fuchsia and Linux ASAN. crbug.com/930483
1095#if defined(OS_FUCHSIA) || defined(OS_LINUX)
Eric Orth26fa08e2019-02-22 01:28:371096#define MAYBE_DeleteWithinAbortedCallback DISABLED_DeleteWithinAbortedCallback
jdoerriedfede5ad2019-02-11 13:06:571097#else
Eric Orth26fa08e2019-02-22 01:28:371098#define MAYBE_DeleteWithinAbortedCallback DeleteWithinAbortedCallback
jdoerriedfede5ad2019-02-11 13:06:571099#endif
Eric Orth960e7062019-03-08 18:43:541100TEST_F(HostResolverManagerTest, MAYBE_DeleteWithinAbortedCallback) {
Eric Orth70992982018-07-24 00:25:001101 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
1102 ResolveHostResponseHelper::Callback custom_callback =
1103 base::BindLambdaForTesting(
1104 [&](CompletionOnceCallback completion_callback, int error) {
1105 for (auto& response : responses) {
1106 // Deleting request is required to be first, so the other requests
1107 // will still be running to be deleted. This test assumes that the
1108 // Jobs will be Aborted in order and the requests in order within
1109 // the jobs.
1110 DCHECK(!response->complete());
1111 }
Eric Orth37b18192019-04-22 19:09:281112 DestroyResolver();
Eric Orth70992982018-07-24 00:25:001113 std::move(completion_callback).Run(error);
1114 });
1115
1116 ResolveHostResponseHelper deleting_response(
Eric Orth00fe5a62018-08-15 22:20:001117 resolver_->CreateRequest(HostPortPair("a", 80), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:151118 base::nullopt, request_context_.get(),
1119 host_cache_.get()),
Eric Orth70992982018-07-24 00:25:001120 std::move(custom_callback));
1121
Eric Orth117e1992019-04-17 00:24:151122 responses.emplace_back(
1123 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1124 HostPortPair("a", 81), NetLogWithSource(), base::nullopt,
1125 request_context_.get(), host_cache_.get())));
1126 responses.emplace_back(
1127 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1128 HostPortPair("b", 82), NetLogWithSource(), base::nullopt,
1129 request_context_.get(), host_cache_.get())));
1130 responses.emplace_back(
1131 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1132 HostPortPair("b", 83), NetLogWithSource(), base::nullopt,
1133 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:001134
1135 // Wait for all calls to queue up, trigger abort via IP address change, then
1136 // signal all the queued requests to let them all try to finish.
1137 EXPECT_TRUE(proc_->WaitFor(2u));
Paul Jensenf47bbab2018-09-14 16:34:041138 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
Eric Orth70992982018-07-24 00:25:001139 proc_->SignalAll();
1140
1141 EXPECT_THAT(deleting_response.result_error(), IsError(ERR_NETWORK_CHANGED));
1142 base::RunLoop().RunUntilIdle();
1143 for (auto& response : responses) {
1144 EXPECT_FALSE(response->complete());
1145 }
1146}
1147
Eric Orth960e7062019-03-08 18:43:541148TEST_F(HostResolverManagerTest, StartWithinCallback) {
Eric Orth70992982018-07-24 00:25:001149 std::unique_ptr<ResolveHostResponseHelper> new_response;
1150 auto custom_callback = base::BindLambdaForTesting(
1151 [&](CompletionOnceCallback completion_callback, int error) {
1152 new_response = std::make_unique<ResolveHostResponseHelper>(
Eric Orth117e1992019-04-17 00:24:151153 resolver_->CreateRequest(
1154 HostPortPair("new", 70), NetLogWithSource(), base::nullopt,
1155 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:001156 std::move(completion_callback).Run(error);
1157 });
1158
1159 ResolveHostResponseHelper starting_response(
Eric Orth00fe5a62018-08-15 22:20:001160 resolver_->CreateRequest(HostPortPair("a", 80), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:151161 base::nullopt, request_context_.get(),
1162 host_cache_.get()),
Eric Orth70992982018-07-24 00:25:001163 std::move(custom_callback));
1164
1165 proc_->SignalMultiple(2u); // One for "a". One for "new".
1166
1167 EXPECT_THAT(starting_response.result_error(), IsOk());
1168 EXPECT_THAT(new_response->result_error(), IsOk());
1169}
1170
Eric Orth3bd9e512019-03-29 15:33:351171TEST_F(HostResolverManagerTest, StartWithinEvictionCallback) {
1172 CreateSerialResolver();
1173 resolver_->SetMaxQueuedJobsForTesting(2);
1174
1175 std::unique_ptr<ResolveHostResponseHelper> new_response;
1176 auto custom_callback = base::BindLambdaForTesting(
1177 [&](CompletionOnceCallback completion_callback, int error) {
1178 new_response = std::make_unique<ResolveHostResponseHelper>(
Eric Orth117e1992019-04-17 00:24:151179 resolver_->CreateRequest(
1180 HostPortPair("new", 70), NetLogWithSource(), base::nullopt,
1181 request_context_.get(), host_cache_.get()));
Eric Orth3bd9e512019-03-29 15:33:351182 std::move(completion_callback).Run(error);
1183 });
1184
Eric Orth117e1992019-04-17 00:24:151185 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
1186 HostPortPair("initial", 80), NetLogWithSource(), base::nullopt,
1187 request_context_.get(), host_cache_.get()));
Eric Orth3bd9e512019-03-29 15:33:351188 ResolveHostResponseHelper evictee1_response(
1189 resolver_->CreateRequest(HostPortPair("evictee1", 80), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:151190 base::nullopt, request_context_.get(),
1191 host_cache_.get()),
Eric Orth3bd9e512019-03-29 15:33:351192 std::move(custom_callback));
Eric Orth117e1992019-04-17 00:24:151193 ResolveHostResponseHelper evictee2_response(resolver_->CreateRequest(
1194 HostPortPair("evictee2", 80), NetLogWithSource(), base::nullopt,
1195 request_context_.get(), host_cache_.get()));
Eric Orth3bd9e512019-03-29 15:33:351196
1197 // Now one running request ("initial") and two queued requests ("evictee1" and
1198 // "evictee2"). Any further requests will cause evictions.
Eric Orth117e1992019-04-17 00:24:151199 ResolveHostResponseHelper evictor_response(resolver_->CreateRequest(
1200 HostPortPair("evictor", 80), NetLogWithSource(), base::nullopt,
1201 request_context_.get(), host_cache_.get()));
Eric Orth3bd9e512019-03-29 15:33:351202 EXPECT_THAT(evictee1_response.result_error(),
1203 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
1204
1205 // "new" should evict "evictee2"
1206 EXPECT_THAT(evictee2_response.result_error(),
1207 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
1208
1209 proc_->SignalMultiple(3u);
1210
1211 EXPECT_THAT(initial_response.result_error(), IsOk());
1212 EXPECT_THAT(evictor_response.result_error(), IsOk());
1213 EXPECT_THAT(new_response->result_error(), IsOk());
1214}
1215
1216// Test where we start a new request within an eviction callback that itself
1217// evicts the first evictor.
1218TEST_F(HostResolverManagerTest, StartWithinEvictionCallback_DoubleEviction) {
1219 CreateSerialResolver();
1220 resolver_->SetMaxQueuedJobsForTesting(1);
1221
1222 std::unique_ptr<ResolveHostResponseHelper> new_response;
1223 auto custom_callback = base::BindLambdaForTesting(
1224 [&](CompletionOnceCallback completion_callback, int error) {
1225 new_response = std::make_unique<ResolveHostResponseHelper>(
Eric Orth117e1992019-04-17 00:24:151226 resolver_->CreateRequest(
1227 HostPortPair("new", 70), NetLogWithSource(), base::nullopt,
1228 request_context_.get(), host_cache_.get()));
Eric Orth3bd9e512019-03-29 15:33:351229 std::move(completion_callback).Run(error);
1230 });
1231
Eric Orth117e1992019-04-17 00:24:151232 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
1233 HostPortPair("initial", 80), NetLogWithSource(), base::nullopt,
1234 request_context_.get(), host_cache_.get()));
Eric Orth3bd9e512019-03-29 15:33:351235 ResolveHostResponseHelper evictee_response(
1236 resolver_->CreateRequest(HostPortPair("evictee", 80), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:151237 base::nullopt, request_context_.get(),
1238 host_cache_.get()),
Eric Orth3bd9e512019-03-29 15:33:351239 std::move(custom_callback));
1240
1241 // Now one running request ("initial") and one queued requests ("evictee").
1242 // Any further requests will cause evictions.
Eric Orth117e1992019-04-17 00:24:151243 ResolveHostResponseHelper evictor_response(resolver_->CreateRequest(
1244 HostPortPair("evictor", 80), NetLogWithSource(), base::nullopt,
1245 request_context_.get(), host_cache_.get()));
Eric Orth3bd9e512019-03-29 15:33:351246 EXPECT_THAT(evictee_response.result_error(),
1247 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
1248
1249 // "new" should evict "evictor"
1250 EXPECT_THAT(evictor_response.result_error(),
1251 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
1252
1253 proc_->SignalMultiple(2u);
1254
1255 EXPECT_THAT(initial_response.result_error(), IsOk());
1256 EXPECT_THAT(new_response->result_error(), IsOk());
1257}
1258
1259TEST_F(HostResolverManagerTest, StartWithinEvictionCallback_SameRequest) {
1260 CreateSerialResolver();
1261 resolver_->SetMaxQueuedJobsForTesting(2);
1262
1263 std::unique_ptr<ResolveHostResponseHelper> new_response;
1264 auto custom_callback = base::BindLambdaForTesting(
1265 [&](CompletionOnceCallback completion_callback, int error) {
1266 new_response = std::make_unique<ResolveHostResponseHelper>(
Eric Orth117e1992019-04-17 00:24:151267 resolver_->CreateRequest(
1268 HostPortPair("evictor", 70), NetLogWithSource(), base::nullopt,
1269 request_context_.get(), host_cache_.get()));
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(
1274 HostPortPair("initial", 80), NetLogWithSource(), base::nullopt,
1275 request_context_.get(), host_cache_.get()));
Eric Orth3bd9e512019-03-29 15:33:351276 ResolveHostResponseHelper evictee_response(
1277 resolver_->CreateRequest(HostPortPair("evictee", 80), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:151278 base::nullopt, request_context_.get(),
1279 host_cache_.get()),
Eric Orth3bd9e512019-03-29 15:33:351280 std::move(custom_callback));
1281 ResolveHostResponseHelper additional_response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:271282 HostPortPair("additional", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:151283 request_context_.get(), host_cache_.get()));
Eric Orth3bd9e512019-03-29 15:33:351284
1285 // Now one running request ("initial") and two queued requests ("evictee" and
1286 // "additional"). Any further requests will cause evictions.
Eric Orth117e1992019-04-17 00:24:151287 ResolveHostResponseHelper evictor_response(resolver_->CreateRequest(
1288 HostPortPair("evictor", 80), NetLogWithSource(), base::nullopt,
1289 request_context_.get(), host_cache_.get()));
Eric Orth3bd9e512019-03-29 15:33:351290 EXPECT_THAT(evictee_response.result_error(),
1291 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
1292
1293 // Second "evictor" should be joined with the first and not evict "additional"
1294
1295 // Only 3 proc requests because both "evictor" requests are combined.
1296 proc_->SignalMultiple(3u);
1297
1298 EXPECT_THAT(initial_response.result_error(), IsOk());
1299 EXPECT_THAT(additional_response.result_error(), IsOk());
1300 EXPECT_THAT(evictor_response.result_error(), IsOk());
1301 EXPECT_THAT(new_response->result_error(), IsOk());
1302}
1303
Eric Orth960e7062019-03-08 18:43:541304TEST_F(HostResolverManagerTest, BypassCache) {
Eric Orthdc35748e2018-08-23 22:41:481305 proc_->SignalMultiple(2u);
1306
Eric Orth117e1992019-04-17 00:24:151307 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
1308 HostPortPair("a", 80), NetLogWithSource(), base::nullopt,
1309 request_context_.get(), host_cache_.get()));
Eric Orthdc35748e2018-08-23 22:41:481310 EXPECT_THAT(initial_response.result_error(), IsOk());
1311 EXPECT_EQ(1u, proc_->GetCaptureList().size());
1312
Eric Orth117e1992019-04-17 00:24:151313 ResolveHostResponseHelper cached_response(resolver_->CreateRequest(
1314 HostPortPair("a", 80), NetLogWithSource(), base::nullopt,
1315 request_context_.get(), host_cache_.get()));
Eric Orthdc35748e2018-08-23 22:41:481316 EXPECT_THAT(cached_response.result_error(), IsOk());
1317 // Expect no increase to calls to |proc_| because result was cached.
1318 EXPECT_EQ(1u, proc_->GetCaptureList().size());
1319
1320 HostResolver::ResolveHostParameters parameters;
Eric Ortheb332862019-01-26 00:52:381321 parameters.cache_usage =
1322 HostResolver::ResolveHostParameters::CacheUsage::DISALLOWED;
Eric Orth117e1992019-04-17 00:24:151323 ResolveHostResponseHelper cache_bypassed_response(resolver_->CreateRequest(
1324 HostPortPair("a", 80), NetLogWithSource(), parameters,
1325 request_context_.get(), host_cache_.get()));
Eric Orthdc35748e2018-08-23 22:41:481326 EXPECT_THAT(cache_bypassed_response.result_error(), IsOk());
1327 // Expect call to |proc_| because cache was bypassed.
1328 EXPECT_EQ(2u, proc_->GetCaptureList().size());
1329}
1330
Paul Jensenf47bbab2018-09-14 16:34:041331// Test that IP address changes flush the cache but initial DNS config reads
Eric Orth70992982018-07-24 00:25:001332// do not.
Eric Orth960e7062019-03-08 18:43:541333TEST_F(HostResolverManagerTest, FlushCacheOnIPAddressChange) {
Eric Orth70992982018-07-24 00:25:001334 proc_->SignalMultiple(2u); // One before the flush, one after.
1335
Eric Orth117e1992019-04-17 00:24:151336 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
1337 HostPortPair("host1", 70), NetLogWithSource(), base::nullopt,
1338 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:001339 EXPECT_THAT(initial_response.result_error(), IsOk());
1340 EXPECT_EQ(1u, proc_->GetCaptureList().size());
1341
Eric Orth117e1992019-04-17 00:24:151342 ResolveHostResponseHelper cached_response(resolver_->CreateRequest(
1343 HostPortPair("host1", 75), NetLogWithSource(), base::nullopt,
1344 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:001345 EXPECT_THAT(cached_response.result_error(), IsOk());
1346 EXPECT_EQ(1u, proc_->GetCaptureList().size()); // No expected increase.
1347
1348 // Verify initial DNS config read does not flush cache.
1349 NetworkChangeNotifier::NotifyObserversOfInitialDNSConfigReadForTests();
Eric Orth117e1992019-04-17 00:24:151350 ResolveHostResponseHelper unflushed_response(resolver_->CreateRequest(
1351 HostPortPair("host1", 75), NetLogWithSource(), base::nullopt,
1352 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:001353 EXPECT_THAT(unflushed_response.result_error(), IsOk());
1354 EXPECT_EQ(1u, proc_->GetCaptureList().size()); // No expected increase.
1355
Paul Jensenf47bbab2018-09-14 16:34:041356 // Flush cache by triggering an IP address change.
1357 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
Eric Orth70992982018-07-24 00:25:001358 base::RunLoop().RunUntilIdle(); // Notification happens async.
1359
1360 // Resolve "host1" again -- this time it won't be served from cache, so it
1361 // will complete asynchronously.
Eric Orth117e1992019-04-17 00:24:151362 ResolveHostResponseHelper flushed_response(resolver_->CreateRequest(
1363 HostPortPair("host1", 80), NetLogWithSource(), base::nullopt,
1364 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:001365 EXPECT_THAT(flushed_response.result_error(), IsOk());
1366 EXPECT_EQ(2u, proc_->GetCaptureList().size()); // Expected increase.
1367}
1368
Eric Orth37b18192019-04-22 19:09:281369TEST_F(HostResolverManagerTest, FlushCacheOnDnsConfigChange) {
1370 proc_->SignalMultiple(2u); // One before the flush, one after.
1371
1372 // Resolve to load cache.
1373 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
1374 HostPortPair("host1", 70), NetLogWithSource(), base::nullopt,
1375 request_context_.get(), host_cache_.get()));
1376 EXPECT_THAT(initial_response.result_error(), IsOk());
1377 EXPECT_EQ(1u, proc_->GetCaptureList().size());
1378
1379 // Result expected to come from the cache.
1380 ResolveHostResponseHelper cached_response(resolver_->CreateRequest(
1381 HostPortPair("host1", 75), NetLogWithSource(), base::nullopt,
1382 request_context_.get(), host_cache_.get()));
1383 EXPECT_THAT(cached_response.result_error(), IsOk());
1384 EXPECT_EQ(1u, proc_->GetCaptureList().size()); // No expected increase.
1385
1386 // Flush cache by triggering a DNS config change.
1387 NetworkChangeNotifier::NotifyObserversOfDNSChangeForTests();
1388 base::RunLoop().RunUntilIdle(); // Notification happens async.
1389
1390 // Expect flushed from cache and therefore served from |proc_|.
1391 ResolveHostResponseHelper flushed_response(resolver_->CreateRequest(
1392 HostPortPair("host1", 80), NetLogWithSource(), base::nullopt,
1393 request_context_.get(), host_cache_.get()));
1394 EXPECT_THAT(flushed_response.result_error(), IsOk());
1395 EXPECT_EQ(2u, proc_->GetCaptureList().size()); // Expected increase.
1396}
1397
Paul Jensenf47bbab2018-09-14 16:34:041398// Test that IP address changes send ERR_NETWORK_CHANGED to pending requests.
Eric Orth960e7062019-03-08 18:43:541399TEST_F(HostResolverManagerTest, AbortOnIPAddressChanged) {
Eric Orth117e1992019-04-17 00:24:151400 ResolveHostResponseHelper response(resolver_->CreateRequest(
1401 HostPortPair("host1", 70), NetLogWithSource(), base::nullopt,
1402 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:001403
1404 ASSERT_FALSE(response.complete());
1405 ASSERT_TRUE(proc_->WaitFor(1u));
1406
Paul Jensenf47bbab2018-09-14 16:34:041407 // Triggering an IP address change.
1408 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
Eric Orth70992982018-07-24 00:25:001409 base::RunLoop().RunUntilIdle(); // Notification happens async.
1410 proc_->SignalAll();
1411
1412 EXPECT_THAT(response.result_error(), IsError(ERR_NETWORK_CHANGED));
1413 EXPECT_FALSE(response.request()->GetAddressResults());
Eric Orth37b18192019-04-22 19:09:281414 EXPECT_EQ(0u, host_cache_->size());
Eric Orth70992982018-07-24 00:25:001415}
1416
pauljensen101ed372015-04-17 00:11:421417// Test that initial DNS config read signals do not abort pending requests.
Eric Orth960e7062019-03-08 18:43:541418TEST_F(HostResolverManagerTest, DontAbortOnInitialDNSConfigRead) {
Eric Orth117e1992019-04-17 00:24:151419 ResolveHostResponseHelper response(resolver_->CreateRequest(
1420 HostPortPair("host1", 70), NetLogWithSource(), base::nullopt,
1421 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:001422
1423 ASSERT_FALSE(response.complete());
1424 ASSERT_TRUE(proc_->WaitFor(1u));
1425
1426 // Triggering initial DNS config read signal.
1427 NetworkChangeNotifier::NotifyObserversOfInitialDNSConfigReadForTests();
1428 base::RunLoop().RunUntilIdle(); // Notification happens async.
1429 proc_->SignalAll();
1430
1431 EXPECT_THAT(response.result_error(), IsOk());
1432 EXPECT_TRUE(response.request()->GetAddressResults());
1433}
1434
Paul Jensenf47bbab2018-09-14 16:34:041435// Obey pool constraints after IP address has changed.
Eric Orth960e7062019-03-08 18:43:541436TEST_F(HostResolverManagerTest, ObeyPoolConstraintsAfterIPAddressChange) {
[email protected]38b50d92012-04-19 21:07:521437 // Runs at most one job at a time.
1438 CreateSerialResolver();
Eric Orth70992982018-07-24 00:25:001439
1440 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:151441 responses.emplace_back(
1442 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1443 HostPortPair("a", 80), NetLogWithSource(), base::nullopt,
1444 request_context_.get(), host_cache_.get())));
1445 responses.emplace_back(
1446 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1447 HostPortPair("b", 80), NetLogWithSource(), base::nullopt,
1448 request_context_.get(), host_cache_.get())));
1449 responses.emplace_back(
1450 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1451 HostPortPair("c", 80), NetLogWithSource(), base::nullopt,
1452 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:001453
1454 for (auto& response : responses) {
1455 ASSERT_FALSE(response->complete());
1456 }
1457 ASSERT_TRUE(proc_->WaitFor(1u));
1458
Paul Jensenf47bbab2018-09-14 16:34:041459 // Triggering an IP address change.
1460 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
Eric Orth70992982018-07-24 00:25:001461 base::RunLoop().RunUntilIdle(); // Notification happens async.
1462 proc_->SignalMultiple(3u); // Let the false-start go so that we can catch it.
1463
1464 // Requests should complete one at a time, with the first failing.
1465 EXPECT_THAT(responses[0]->result_error(), IsError(ERR_NETWORK_CHANGED));
1466 EXPECT_EQ(1u, num_running_dispatcher_jobs());
1467 EXPECT_FALSE(responses[1]->complete());
1468 EXPECT_FALSE(responses[2]->complete());
1469
1470 EXPECT_THAT(responses[1]->result_error(), IsOk());
1471 EXPECT_EQ(1u, num_running_dispatcher_jobs());
1472 EXPECT_FALSE(responses[2]->complete());
1473
1474 EXPECT_THAT(responses[2]->result_error(), IsOk());
1475}
1476
[email protected]b3601bc22012-02-21 21:23:201477// Tests that a new Request made from the callback of a previously aborted one
1478// will not be aborted.
Eric Orth960e7062019-03-08 18:43:541479TEST_F(HostResolverManagerTest, AbortOnlyExistingRequestsOnIPAddressChange) {
Eric Orth70992982018-07-24 00:25:001480 auto custom_callback_template = base::BindLambdaForTesting(
1481 [&](const HostPortPair& next_host,
1482 std::unique_ptr<ResolveHostResponseHelper>* next_response,
1483 CompletionOnceCallback completion_callback, int error) {
1484 *next_response = std::make_unique<ResolveHostResponseHelper>(
Eric Orth00fe5a62018-08-15 22:20:001485 resolver_->CreateRequest(next_host, NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:151486 base::nullopt, request_context_.get(),
1487 host_cache_.get()));
Eric Orth70992982018-07-24 00:25:001488 std::move(completion_callback).Run(error);
1489 });
1490
1491 std::vector<std::unique_ptr<ResolveHostResponseHelper>> next_responses(3);
1492
1493 ResolveHostResponseHelper response0(
Eric Orth00fe5a62018-08-15 22:20:001494 resolver_->CreateRequest(HostPortPair("bbb", 80), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:151495 base::nullopt, request_context_.get(),
1496 host_cache_.get()),
Eric Orth70992982018-07-24 00:25:001497 base::BindOnce(custom_callback_template, HostPortPair("zzz", 80),
1498 &next_responses[0]));
1499
1500 ResolveHostResponseHelper response1(
Eric Orth00fe5a62018-08-15 22:20:001501 resolver_->CreateRequest(HostPortPair("eee", 80), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:151502 base::nullopt, request_context_.get(),
1503 host_cache_.get()),
Eric Orth70992982018-07-24 00:25:001504 base::BindOnce(custom_callback_template, HostPortPair("aaa", 80),
1505 &next_responses[1]));
1506
1507 ResolveHostResponseHelper response2(
Eric Orth00fe5a62018-08-15 22:20:001508 resolver_->CreateRequest(HostPortPair("ccc", 80), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:151509 base::nullopt, request_context_.get(),
1510 host_cache_.get()),
Eric Orth70992982018-07-24 00:25:001511 base::BindOnce(custom_callback_template, HostPortPair("eee", 80),
1512 &next_responses[2]));
1513
1514 // Wait until all are blocked;
1515 ASSERT_TRUE(proc_->WaitFor(3u));
Paul Jensenf47bbab2018-09-14 16:34:041516 // Trigger an IP address change.
1517 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
Eric Orth70992982018-07-24 00:25:001518 // This should abort all running jobs.
1519 base::RunLoop().RunUntilIdle();
1520
1521 EXPECT_THAT(response0.result_error(), IsError(ERR_NETWORK_CHANGED));
1522 EXPECT_THAT(response1.result_error(), IsError(ERR_NETWORK_CHANGED));
1523 EXPECT_THAT(response2.result_error(), IsError(ERR_NETWORK_CHANGED));
1524
1525 EXPECT_FALSE(next_responses[0]->complete());
1526 EXPECT_FALSE(next_responses[1]->complete());
1527 EXPECT_FALSE(next_responses[2]->complete());
1528
1529 // Unblock all calls to proc.
1530 proc_->SignalMultiple(6u);
1531
1532 // Run until the re-started requests finish.
1533 EXPECT_THAT(next_responses[0]->result_error(), IsOk());
1534 EXPECT_THAT(next_responses[1]->result_error(), IsOk());
1535 EXPECT_THAT(next_responses[2]->result_error(), IsOk());
1536
1537 // Verify that results of aborted Jobs were not cached.
1538 EXPECT_EQ(6u, proc_->GetCaptureList().size());
Eric Orth37b18192019-04-22 19:09:281539 EXPECT_EQ(3u, host_cache_->size());
Eric Orth70992982018-07-24 00:25:001540}
1541
[email protected]68ad3ee2010-01-30 03:45:391542// Tests that when the maximum threads is set to 1, requests are dequeued
1543// in order of priority.
Eric Orth960e7062019-03-08 18:43:541544TEST_F(HostResolverManagerTest, HigherPriorityRequestsStartedFirst) {
[email protected]38b50d92012-04-19 21:07:521545 CreateSerialResolver();
[email protected]68ad3ee2010-01-30 03:45:391546
Eric Orth00fe5a62018-08-15 22:20:001547 HostResolver::ResolveHostParameters low_priority;
1548 low_priority.initial_priority = LOW;
1549 HostResolver::ResolveHostParameters medium_priority;
1550 medium_priority.initial_priority = MEDIUM;
1551 HostResolver::ResolveHostParameters highest_priority;
1552 highest_priority.initial_priority = HIGHEST;
1553
1554 // Note that at this point the MockHostResolverProc is blocked, so any
1555 // requests we make will not complete.
1556
1557 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:151558 responses.emplace_back(
1559 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1560 HostPortPair("req0", 80), NetLogWithSource(), low_priority,
1561 request_context_.get(), host_cache_.get())));
1562 responses.emplace_back(
1563 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1564 HostPortPair("req1", 80), NetLogWithSource(), medium_priority,
1565 request_context_.get(), host_cache_.get())));
1566 responses.emplace_back(
1567 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1568 HostPortPair("req2", 80), NetLogWithSource(), medium_priority,
1569 request_context_.get(), host_cache_.get())));
1570 responses.emplace_back(
1571 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1572 HostPortPair("req3", 80), NetLogWithSource(), low_priority,
1573 request_context_.get(), host_cache_.get())));
1574 responses.emplace_back(
1575 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1576 HostPortPair("req4", 80), NetLogWithSource(), highest_priority,
1577 request_context_.get(), host_cache_.get())));
1578 responses.emplace_back(
1579 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1580 HostPortPair("req5", 80), NetLogWithSource(), low_priority,
1581 request_context_.get(), host_cache_.get())));
1582 responses.emplace_back(
1583 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1584 HostPortPair("req6", 80), NetLogWithSource(), low_priority,
1585 request_context_.get(), host_cache_.get())));
1586 responses.emplace_back(
1587 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1588 HostPortPair("req5", 80), NetLogWithSource(), highest_priority,
1589 request_context_.get(), host_cache_.get())));
Eric Orth00fe5a62018-08-15 22:20:001590
1591 for (const auto& response : responses) {
1592 ASSERT_FALSE(response->complete());
1593 }
1594
1595 // Unblock the resolver thread so the requests can run.
1596 proc_->SignalMultiple(responses.size()); // More than needed.
1597
1598 // Wait for all the requests to complete successfully.
1599 for (auto& response : responses) {
1600 EXPECT_THAT(response->result_error(), IsOk());
1601 }
1602
1603 // Since we have restricted to a single concurrent thread in the jobpool,
1604 // the requests should complete in order of priority (with the exception
1605 // of the first request, which gets started right away, since there is
1606 // nothing outstanding).
1607 MockHostResolverProc::CaptureList capture_list = proc_->GetCaptureList();
1608 ASSERT_EQ(7u, capture_list.size());
1609
1610 EXPECT_EQ("req0", capture_list[0].hostname);
1611 EXPECT_EQ("req4", capture_list[1].hostname);
1612 EXPECT_EQ("req5", capture_list[2].hostname);
1613 EXPECT_EQ("req1", capture_list[3].hostname);
1614 EXPECT_EQ("req2", capture_list[4].hostname);
1615 EXPECT_EQ("req3", capture_list[5].hostname);
1616 EXPECT_EQ("req6", capture_list[6].hostname);
1617}
1618
juliatuttlec53b19a72016-05-05 13:51:311619// Test that changing a job's priority affects the dequeueing order.
Eric Orth960e7062019-03-08 18:43:541620TEST_F(HostResolverManagerTest, ChangePriority) {
juliatuttlec53b19a72016-05-05 13:51:311621 CreateSerialResolver();
1622
Eric Orth26fa08e2019-02-22 01:28:371623 HostResolver::ResolveHostParameters lowest_priority;
1624 lowest_priority.initial_priority = LOWEST;
1625 HostResolver::ResolveHostParameters low_priority;
1626 low_priority.initial_priority = LOW;
1627 HostResolver::ResolveHostParameters medium_priority;
1628 medium_priority.initial_priority = MEDIUM;
juliatuttlec53b19a72016-05-05 13:51:311629
Eric Orth26fa08e2019-02-22 01:28:371630 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:151631 responses.emplace_back(
1632 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1633 HostPortPair("req0", 80), NetLogWithSource(), medium_priority,
1634 request_context_.get(), host_cache_.get())));
1635 responses.emplace_back(
1636 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1637 HostPortPair("req1", 80), NetLogWithSource(), low_priority,
1638 request_context_.get(), host_cache_.get())));
1639 responses.emplace_back(
1640 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1641 HostPortPair("req2", 80), NetLogWithSource(), lowest_priority,
1642 request_context_.get(), host_cache_.get())));
juliatuttlec53b19a72016-05-05 13:51:311643
1644 // req0 starts immediately; without ChangePriority, req1 and then req2 should
1645 // run.
Eric Orth26fa08e2019-02-22 01:28:371646 for (const auto& response : responses) {
1647 ASSERT_FALSE(response->complete());
1648 }
juliatuttlec53b19a72016-05-05 13:51:311649
Eric Orth26fa08e2019-02-22 01:28:371650 // Changing req2 to HIGHEST should make it run before req1.
juliatuttlec53b19a72016-05-05 13:51:311651 // (It can't run before req0, since req0 started immediately.)
Eric Orth26fa08e2019-02-22 01:28:371652 responses[2]->request()->ChangeRequestPriority(HIGHEST);
juliatuttlec53b19a72016-05-05 13:51:311653
1654 // Let all 3 requests finish.
1655 proc_->SignalMultiple(3u);
1656
Eric Orth26fa08e2019-02-22 01:28:371657 for (auto& response : responses) {
1658 EXPECT_THAT(response->result_error(), IsOk());
1659 }
juliatuttlec53b19a72016-05-05 13:51:311660
1661 MockHostResolverProc::CaptureList capture_list = proc_->GetCaptureList();
1662 ASSERT_EQ(3u, capture_list.size());
1663
1664 EXPECT_EQ("req0", capture_list[0].hostname);
1665 EXPECT_EQ("req2", capture_list[1].hostname);
1666 EXPECT_EQ("req1", capture_list[2].hostname);
1667}
1668
[email protected]38b50d92012-04-19 21:07:521669// Try cancelling a job which has not started yet.
Eric Orth960e7062019-03-08 18:43:541670TEST_F(HostResolverManagerTest, CancelPendingRequest) {
[email protected]38b50d92012-04-19 21:07:521671 CreateSerialResolver();
[email protected]68ad3ee2010-01-30 03:45:391672
Eric Orth00fe5a62018-08-15 22:20:001673 HostResolver::ResolveHostParameters lowest_priority;
1674 lowest_priority.initial_priority = LOWEST;
1675 HostResolver::ResolveHostParameters low_priority;
1676 low_priority.initial_priority = LOW;
1677 HostResolver::ResolveHostParameters medium_priority;
1678 medium_priority.initial_priority = MEDIUM;
1679 HostResolver::ResolveHostParameters highest_priority;
1680 highest_priority.initial_priority = HIGHEST;
1681
Eric Orth70992982018-07-24 00:25:001682 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:151683 responses.emplace_back(
1684 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1685 HostPortPair("req0", 80), NetLogWithSource(), lowest_priority,
1686 request_context_.get(), host_cache_.get())));
1687 responses.emplace_back(
1688 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1689 HostPortPair("req1", 80), NetLogWithSource(), highest_priority,
1690 request_context_.get(), host_cache_.get())));
1691 responses.emplace_back(
1692 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1693 HostPortPair("req2", 80), NetLogWithSource(), medium_priority,
1694 request_context_.get(), host_cache_.get())));
1695 responses.emplace_back(
1696 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1697 HostPortPair("req3", 80), NetLogWithSource(), low_priority,
1698 request_context_.get(), host_cache_.get())));
1699 responses.emplace_back(
1700 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1701 HostPortPair("req4", 80), NetLogWithSource(), highest_priority,
1702 request_context_.get(), host_cache_.get())));
1703 responses.emplace_back(
1704 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1705 HostPortPair("req5", 80), NetLogWithSource(), lowest_priority,
1706 request_context_.get(), host_cache_.get())));
1707 responses.emplace_back(
1708 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1709 HostPortPair("req6", 80), NetLogWithSource(), medium_priority,
1710 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:001711
1712 // Cancel some requests
1713 responses[1]->CancelRequest();
1714 responses[4]->CancelRequest();
1715 responses[5]->CancelRequest();
1716
1717 // Unblock the resolver thread so the requests can run.
1718 proc_->SignalMultiple(responses.size()); // More than needed.
1719
1720 // Let everything try to finish.
1721 base::RunLoop().RunUntilIdle();
1722
1723 // Wait for all the requests to complete succesfully.
1724 EXPECT_THAT(responses[0]->result_error(), IsOk());
1725 EXPECT_THAT(responses[2]->result_error(), IsOk());
1726 EXPECT_THAT(responses[3]->result_error(), IsOk());
1727 EXPECT_THAT(responses[6]->result_error(), IsOk());
1728
1729 // Cancelled requests shouldn't complete.
1730 EXPECT_FALSE(responses[1]->complete());
1731 EXPECT_FALSE(responses[4]->complete());
1732 EXPECT_FALSE(responses[5]->complete());
1733
1734 // Verify that they called out the the resolver proc (which runs on the
1735 // resolver thread) in the expected order.
1736 MockHostResolverProc::CaptureList capture_list = proc_->GetCaptureList();
1737 ASSERT_EQ(4u, capture_list.size());
1738
1739 EXPECT_EQ("req0", capture_list[0].hostname);
1740 EXPECT_EQ("req2", capture_list[1].hostname);
Eric Orth00fe5a62018-08-15 22:20:001741 EXPECT_EQ("req6", capture_list[2].hostname);
1742 EXPECT_EQ("req3", capture_list[3].hostname);
Eric Orth70992982018-07-24 00:25:001743}
1744
[email protected]68ad3ee2010-01-30 03:45:391745// Test that when too many requests are enqueued, old ones start to be aborted.
Eric Orth960e7062019-03-08 18:43:541746TEST_F(HostResolverManagerTest, QueueOverflow) {
[email protected]38b50d92012-04-19 21:07:521747 CreateSerialResolver();
[email protected]68ad3ee2010-01-30 03:45:391748
[email protected]0f292de02012-02-01 22:28:201749 // Allow only 3 queued jobs.
1750 const size_t kMaxPendingJobs = 3u;
Eric Orth70992982018-07-24 00:25:001751 resolver_->SetMaxQueuedJobsForTesting(kMaxPendingJobs);
[email protected]68ad3ee2010-01-30 03:45:391752
Eric Orth00fe5a62018-08-15 22:20:001753 HostResolver::ResolveHostParameters lowest_priority;
1754 lowest_priority.initial_priority = LOWEST;
1755 HostResolver::ResolveHostParameters low_priority;
1756 low_priority.initial_priority = LOW;
1757 HostResolver::ResolveHostParameters medium_priority;
1758 medium_priority.initial_priority = MEDIUM;
1759 HostResolver::ResolveHostParameters highest_priority;
1760 highest_priority.initial_priority = HIGHEST;
1761
Eric Orth70992982018-07-24 00:25:001762 // Note that at this point the MockHostResolverProc is blocked, so any
1763 // requests we make will not complete.
1764
1765 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:151766 responses.emplace_back(
1767 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1768 HostPortPair("req0", 80), NetLogWithSource(), lowest_priority,
1769 request_context_.get(), host_cache_.get())));
1770 responses.emplace_back(
1771 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1772 HostPortPair("req1", 80), NetLogWithSource(), highest_priority,
1773 request_context_.get(), host_cache_.get())));
1774 responses.emplace_back(
1775 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1776 HostPortPair("req2", 80), NetLogWithSource(), medium_priority,
1777 request_context_.get(), host_cache_.get())));
1778 responses.emplace_back(
1779 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1780 HostPortPair("req3", 80), NetLogWithSource(), medium_priority,
1781 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:001782
1783 // At this point, there are 3 enqueued jobs (and one "running" job).
1784 // Insertion of subsequent requests will cause evictions.
1785
Eric Orth117e1992019-04-17 00:24:151786 responses.emplace_back(
1787 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1788 HostPortPair("req4", 80), NetLogWithSource(), low_priority,
1789 request_context_.get(), host_cache_.get())));
Eric Orth00fe5a62018-08-15 22:20:001790 EXPECT_THAT(responses[4]->result_error(),
1791 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE)); // Evicts self.
1792 EXPECT_FALSE(responses[4]->request()->GetAddressResults());
Eric Orth70992982018-07-24 00:25:001793
Eric Orth117e1992019-04-17 00:24:151794 responses.emplace_back(
1795 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1796 HostPortPair("req5", 80), NetLogWithSource(), medium_priority,
1797 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:001798 EXPECT_THAT(responses[2]->result_error(),
1799 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
1800 EXPECT_FALSE(responses[2]->request()->GetAddressResults());
1801
Eric Orth117e1992019-04-17 00:24:151802 responses.emplace_back(
1803 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1804 HostPortPair("req6", 80), NetLogWithSource(), highest_priority,
1805 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:001806 EXPECT_THAT(responses[3]->result_error(),
1807 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
1808 EXPECT_FALSE(responses[3]->request()->GetAddressResults());
1809
Eric Orth117e1992019-04-17 00:24:151810 responses.emplace_back(
1811 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1812 HostPortPair("req7", 80), NetLogWithSource(), medium_priority,
1813 request_context_.get(), host_cache_.get())));
Eric Orth00fe5a62018-08-15 22:20:001814 EXPECT_THAT(responses[5]->result_error(),
Eric Orth70992982018-07-24 00:25:001815 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
Eric Orth00fe5a62018-08-15 22:20:001816 EXPECT_FALSE(responses[5]->request()->GetAddressResults());
Eric Orth70992982018-07-24 00:25:001817
1818 // Unblock the resolver thread so the requests can run.
1819 proc_->SignalMultiple(4u);
1820
1821 // The rest should succeed.
1822 EXPECT_THAT(responses[0]->result_error(), IsOk());
1823 EXPECT_TRUE(responses[0]->request()->GetAddressResults());
Eric Orth00fe5a62018-08-15 22:20:001824 EXPECT_THAT(responses[1]->result_error(), IsOk());
1825 EXPECT_TRUE(responses[1]->request()->GetAddressResults());
Eric Orth70992982018-07-24 00:25:001826 EXPECT_THAT(responses[6]->result_error(), IsOk());
1827 EXPECT_TRUE(responses[6]->request()->GetAddressResults());
1828 EXPECT_THAT(responses[7]->result_error(), IsOk());
1829 EXPECT_TRUE(responses[7]->request()->GetAddressResults());
1830
1831 // Verify that they called out the the resolver proc (which runs on the
1832 // resolver thread) in the expected order.
1833 MockHostResolverProc::CaptureList capture_list = proc_->GetCaptureList();
1834 ASSERT_EQ(4u, capture_list.size());
1835
1836 EXPECT_EQ("req0", capture_list[0].hostname);
Eric Orth00fe5a62018-08-15 22:20:001837 EXPECT_EQ("req1", capture_list[1].hostname);
Eric Orth70992982018-07-24 00:25:001838 EXPECT_EQ("req6", capture_list[2].hostname);
1839 EXPECT_EQ("req7", capture_list[3].hostname);
1840
1841 // Verify that the evicted (incomplete) requests were not cached.
Eric Orth37b18192019-04-22 19:09:281842 EXPECT_EQ(4u, host_cache_->size());
Eric Orth70992982018-07-24 00:25:001843
1844 for (size_t i = 0; i < responses.size(); ++i) {
1845 EXPECT_TRUE(responses[i]->complete()) << i;
1846 }
1847}
1848
1849// Tests that jobs can self-evict by setting the max queue to 0.
Eric Orth960e7062019-03-08 18:43:541850TEST_F(HostResolverManagerTest, QueueOverflow_SelfEvict) {
Eric Orth70992982018-07-24 00:25:001851 CreateSerialResolver();
1852 resolver_->SetMaxQueuedJobsForTesting(0);
1853
1854 // Note that at this point the MockHostResolverProc is blocked, so any
1855 // requests we make will not complete.
1856
Eric Orth117e1992019-04-17 00:24:151857 ResolveHostResponseHelper run_response(resolver_->CreateRequest(
1858 HostPortPair("run", 80), NetLogWithSource(), base::nullopt,
1859 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:001860
Eric Orth117e1992019-04-17 00:24:151861 ResolveHostResponseHelper evict_response(resolver_->CreateRequest(
1862 HostPortPair("req1", 80), NetLogWithSource(), base::nullopt,
1863 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:001864 EXPECT_THAT(evict_response.result_error(),
1865 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
1866 EXPECT_FALSE(evict_response.request()->GetAddressResults());
1867
1868 proc_->SignalMultiple(1u);
1869
1870 EXPECT_THAT(run_response.result_error(), IsOk());
1871 EXPECT_TRUE(run_response.request()->GetAddressResults());
1872}
1873
Eric Orth00fe5a62018-08-15 22:20:001874// Make sure that the dns query type parameter is respected when raw IPs are
1875// passed in.
Eric Orth960e7062019-03-08 18:43:541876TEST_F(HostResolverManagerTest, AddressFamilyWithRawIPs) {
Eric Orth00fe5a62018-08-15 22:20:001877 HostResolver::ResolveHostParameters v4_parameters;
Eric Orth192e3bb2018-11-14 19:30:321878 v4_parameters.dns_query_type = DnsQueryType::A;
Eric Orth00fe5a62018-08-15 22:20:001879
1880 HostResolver::ResolveHostParameters v6_parameters;
Eric Orth192e3bb2018-11-14 19:30:321881 v6_parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth00fe5a62018-08-15 22:20:001882
1883 ResolveHostResponseHelper v4_v4_request(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:271884 HostPortPair("127.0.0.1", 80), NetLogWithSource(), v4_parameters,
Eric Orth117e1992019-04-17 00:24:151885 request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:001886 EXPECT_THAT(v4_v4_request.result_error(), IsOk());
1887 EXPECT_THAT(v4_v4_request.request()->GetAddressResults().value().endpoints(),
1888 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
1889
1890 ResolveHostResponseHelper v4_v6_request(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:271891 HostPortPair("127.0.0.1", 80), NetLogWithSource(), v6_parameters,
Eric Orth117e1992019-04-17 00:24:151892 request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:001893 EXPECT_THAT(v4_v6_request.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
1894
1895 ResolveHostResponseHelper v4_unsp_request(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:271896 HostPortPair("127.0.0.1", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:151897 request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:001898 EXPECT_THAT(v4_unsp_request.result_error(), IsOk());
1899 EXPECT_THAT(
1900 v4_unsp_request.request()->GetAddressResults().value().endpoints(),
1901 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
1902
Eric Orth117e1992019-04-17 00:24:151903 ResolveHostResponseHelper v6_v4_request(resolver_->CreateRequest(
1904 HostPortPair("::1", 80), NetLogWithSource(), v4_parameters,
1905 request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:001906 EXPECT_THAT(v6_v4_request.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
1907
Eric Orth117e1992019-04-17 00:24:151908 ResolveHostResponseHelper v6_v6_request(resolver_->CreateRequest(
1909 HostPortPair("::1", 80), NetLogWithSource(), v6_parameters,
1910 request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:001911 EXPECT_THAT(v6_v6_request.result_error(), IsOk());
1912 EXPECT_THAT(v6_v6_request.request()->GetAddressResults().value().endpoints(),
1913 testing::ElementsAre(CreateExpected("::1", 80)));
1914
Eric Orth117e1992019-04-17 00:24:151915 ResolveHostResponseHelper v6_unsp_request(resolver_->CreateRequest(
1916 HostPortPair("::1", 80), NetLogWithSource(), base::nullopt,
1917 request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:001918 EXPECT_THAT(v6_unsp_request.result_error(), IsOk());
1919 EXPECT_THAT(
1920 v6_unsp_request.request()->GetAddressResults().value().endpoints(),
1921 testing::ElementsAre(CreateExpected("::1", 80)));
1922}
1923
Eric Orth960e7062019-03-08 18:43:541924TEST_F(HostResolverManagerTest, LocalOnly_FromCache) {
Eric Ortheb332862019-01-26 00:52:381925 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42");
1926 proc_->SignalMultiple(1u); // Need only one.
1927
1928 HostResolver::ResolveHostParameters source_none_parameters;
1929 source_none_parameters.source = HostResolverSource::LOCAL_ONLY;
1930
1931 // First NONE query expected to complete synchronously with a cache miss.
Eric Orth6f1c5172019-04-16 17:08:271932 ResolveHostResponseHelper cache_miss_request(resolver_->CreateRequest(
1933 HostPortPair("just.testing", 80), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:151934 source_none_parameters, request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:381935 EXPECT_TRUE(cache_miss_request.complete());
1936 EXPECT_THAT(cache_miss_request.result_error(), IsError(ERR_DNS_CACHE_MISS));
1937 EXPECT_FALSE(cache_miss_request.request()->GetAddressResults());
1938 EXPECT_FALSE(cache_miss_request.request()->GetStaleInfo());
1939
1940 // Normal query to populate the cache.
1941 ResolveHostResponseHelper normal_request(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:271942 HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:151943 request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:381944 EXPECT_THAT(normal_request.result_error(), IsOk());
1945 EXPECT_FALSE(normal_request.request()->GetStaleInfo());
1946
1947 // Second NONE query expected to complete synchronously with cache hit.
Eric Orth6f1c5172019-04-16 17:08:271948 ResolveHostResponseHelper cache_hit_request(resolver_->CreateRequest(
1949 HostPortPair("just.testing", 80), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:151950 source_none_parameters, request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:381951 EXPECT_TRUE(cache_hit_request.complete());
1952 EXPECT_THAT(cache_hit_request.result_error(), IsOk());
1953 EXPECT_THAT(
1954 cache_hit_request.request()->GetAddressResults().value().endpoints(),
1955 testing::ElementsAre(CreateExpected("192.168.1.42", 80)));
1956 EXPECT_FALSE(cache_hit_request.request()->GetStaleInfo().value().is_stale());
1957}
1958
Eric Orth960e7062019-03-08 18:43:541959TEST_F(HostResolverManagerTest, LocalOnly_StaleEntry) {
Eric Ortheb332862019-01-26 00:52:381960 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42");
1961 proc_->SignalMultiple(1u); // Need only one.
1962
1963 HostResolver::ResolveHostParameters source_none_parameters;
1964 source_none_parameters.source = HostResolverSource::LOCAL_ONLY;
1965
1966 // First NONE query expected to complete synchronously with a cache miss.
Eric Orth6f1c5172019-04-16 17:08:271967 ResolveHostResponseHelper cache_miss_request(resolver_->CreateRequest(
1968 HostPortPair("just.testing", 80), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:151969 source_none_parameters, request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:381970 EXPECT_TRUE(cache_miss_request.complete());
1971 EXPECT_THAT(cache_miss_request.result_error(), IsError(ERR_DNS_CACHE_MISS));
1972 EXPECT_FALSE(cache_miss_request.request()->GetAddressResults());
1973 EXPECT_FALSE(cache_miss_request.request()->GetStaleInfo());
1974
1975 // Normal query to populate the cache.
1976 ResolveHostResponseHelper normal_request(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:271977 HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:151978 request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:381979 EXPECT_THAT(normal_request.result_error(), IsOk());
1980 EXPECT_FALSE(normal_request.request()->GetStaleInfo());
1981
1982 MakeCacheStale();
1983
1984 // Second NONE query still expected to complete synchronously with cache miss.
Eric Orth6f1c5172019-04-16 17:08:271985 ResolveHostResponseHelper stale_request(resolver_->CreateRequest(
1986 HostPortPair("just.testing", 80), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:151987 source_none_parameters, request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:381988 EXPECT_TRUE(stale_request.complete());
1989 EXPECT_THAT(stale_request.result_error(), IsError(ERR_DNS_CACHE_MISS));
1990 EXPECT_FALSE(stale_request.request()->GetAddressResults());
1991 EXPECT_FALSE(stale_request.request()->GetStaleInfo());
1992}
1993
Eric Orth960e7062019-03-08 18:43:541994TEST_F(HostResolverManagerTest, LocalOnly_FromIp) {
Eric Ortheb332862019-01-26 00:52:381995 HostResolver::ResolveHostParameters source_none_parameters;
1996 source_none_parameters.source = HostResolverSource::LOCAL_ONLY;
1997
Eric Orth117e1992019-04-17 00:24:151998 ResolveHostResponseHelper response(resolver_->CreateRequest(
1999 HostPortPair("1.2.3.4", 56), NetLogWithSource(), source_none_parameters,
2000 request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:382001
2002 // Expected to resolve synchronously.
2003 EXPECT_TRUE(response.complete());
2004 EXPECT_THAT(response.result_error(), IsOk());
2005 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
2006 testing::ElementsAre(CreateExpected("1.2.3.4", 56)));
2007 EXPECT_FALSE(response.request()->GetStaleInfo());
2008}
2009
Eric Orth960e7062019-03-08 18:43:542010TEST_F(HostResolverManagerTest, LocalOnly_InvalidName) {
Eric Ortheb332862019-01-26 00:52:382011 proc_->AddRuleForAllFamilies("foo,bar.com", "192.168.1.42");
2012
2013 HostResolver::ResolveHostParameters source_none_parameters;
2014 source_none_parameters.source = HostResolverSource::LOCAL_ONLY;
2015
Eric Orth6f1c5172019-04-16 17:08:272016 ResolveHostResponseHelper response(resolver_->CreateRequest(
2017 HostPortPair("foo,bar.com", 57), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:152018 source_none_parameters, request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:382019
2020 // Expected to fail synchronously.
2021 EXPECT_TRUE(response.complete());
2022 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
2023 EXPECT_FALSE(response.request()->GetAddressResults());
2024 EXPECT_FALSE(response.request()->GetStaleInfo());
2025}
2026
Eric Orth960e7062019-03-08 18:43:542027TEST_F(HostResolverManagerTest, LocalOnly_InvalidLocalhost) {
Eric Ortheb332862019-01-26 00:52:382028 HostResolver::ResolveHostParameters source_none_parameters;
2029 source_none_parameters.source = HostResolverSource::LOCAL_ONLY;
2030
Eric Orth6f1c5172019-04-16 17:08:272031 ResolveHostResponseHelper response(resolver_->CreateRequest(
2032 HostPortPair("foo,bar.localhost", 58), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:152033 source_none_parameters, request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:382034
2035 // Expected to fail synchronously.
2036 EXPECT_TRUE(response.complete());
2037 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
2038 EXPECT_FALSE(response.request()->GetAddressResults());
2039 EXPECT_FALSE(response.request()->GetStaleInfo());
2040}
2041
Eric Orth960e7062019-03-08 18:43:542042TEST_F(HostResolverManagerTest, StaleAllowed) {
Eric Ortheb332862019-01-26 00:52:382043 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42");
2044 proc_->SignalMultiple(1u); // Need only one.
2045
2046 HostResolver::ResolveHostParameters stale_allowed_parameters;
2047 stale_allowed_parameters.source = HostResolverSource::LOCAL_ONLY;
2048 stale_allowed_parameters.cache_usage =
2049 HostResolver::ResolveHostParameters::CacheUsage::STALE_ALLOWED;
2050
2051 // First query expected to complete synchronously as a cache miss.
Eric Orth6f1c5172019-04-16 17:08:272052 ResolveHostResponseHelper cache_miss_request(resolver_->CreateRequest(
2053 HostPortPair("just.testing", 80), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:152054 stale_allowed_parameters, request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:382055 EXPECT_TRUE(cache_miss_request.complete());
2056 EXPECT_THAT(cache_miss_request.result_error(), IsError(ERR_DNS_CACHE_MISS));
2057 EXPECT_FALSE(cache_miss_request.request()->GetAddressResults());
2058 EXPECT_FALSE(cache_miss_request.request()->GetStaleInfo());
2059
2060 // Normal query to populate cache
2061 ResolveHostResponseHelper normal_request(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272062 HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:152063 request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:382064 EXPECT_THAT(normal_request.result_error(), IsOk());
2065 EXPECT_FALSE(normal_request.request()->GetStaleInfo());
2066
2067 MakeCacheStale();
2068
2069 // Second NONE query expected to get a stale cache hit.
Eric Orth6f1c5172019-04-16 17:08:272070 ResolveHostResponseHelper stale_request(resolver_->CreateRequest(
2071 HostPortPair("just.testing", 84), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:152072 stale_allowed_parameters, request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:382073 EXPECT_TRUE(stale_request.complete());
2074 EXPECT_THAT(stale_request.result_error(), IsOk());
2075 EXPECT_THAT(stale_request.request()->GetAddressResults().value().endpoints(),
2076 testing::ElementsAre(CreateExpected("192.168.1.42", 84)));
2077 EXPECT_TRUE(stale_request.request()->GetStaleInfo().value().is_stale());
2078}
2079
Eric Orth960e7062019-03-08 18:43:542080TEST_F(HostResolverManagerTest, StaleAllowed_NonLocal) {
Eric Ortheb332862019-01-26 00:52:382081 proc_->AddRuleForAllFamilies("just.testing", "192.168.2.42");
2082 proc_->SignalMultiple(1u); // Need only one.
2083
2084 HostResolver::ResolveHostParameters stale_allowed_parameters;
2085 stale_allowed_parameters.cache_usage =
2086 HostResolver::ResolveHostParameters::CacheUsage::STALE_ALLOWED;
2087
2088 // Normal non-local resolves should still work normally with the STALE_ALLOWED
2089 // parameter, and there should be no stale info.
Eric Orth6f1c5172019-04-16 17:08:272090 ResolveHostResponseHelper response(resolver_->CreateRequest(
2091 HostPortPair("just.testing", 85), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:152092 stale_allowed_parameters, request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:382093 EXPECT_THAT(response.result_error(), IsOk());
2094 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
2095 testing::ElementsAre(CreateExpected("192.168.2.42", 85)));
2096 EXPECT_FALSE(response.request()->GetStaleInfo());
2097}
2098
Eric Orth960e7062019-03-08 18:43:542099TEST_F(HostResolverManagerTest, StaleAllowed_FromIp) {
Eric Ortheb332862019-01-26 00:52:382100 HostResolver::ResolveHostParameters stale_allowed_parameters;
2101 stale_allowed_parameters.cache_usage =
2102 HostResolver::ResolveHostParameters::CacheUsage::STALE_ALLOWED;
2103
Eric Orth6f1c5172019-04-16 17:08:272104 ResolveHostResponseHelper response(resolver_->CreateRequest(
2105 HostPortPair("1.2.3.4", 57), NetLogWithSource(), stale_allowed_parameters,
Eric Orth117e1992019-04-17 00:24:152106 request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:382107
2108 // Expected to resolve synchronously without stale info.
2109 EXPECT_TRUE(response.complete());
2110 EXPECT_THAT(response.result_error(), IsOk());
2111 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
2112 testing::ElementsAre(CreateExpected("1.2.3.4", 57)));
2113 EXPECT_FALSE(response.request()->GetStaleInfo());
2114}
2115
Miriam Gershensone3bc63022017-10-09 19:57:052116// TODO(mgersh): add a test case for errors with positive TTL after
2117// https://crbug.com/115051 is fixed.
2118
[email protected]189163e2011-05-11 01:48:542119// Test the retry attempts simulating host resolver proc that takes too long.
Eric Orth960e7062019-03-08 18:43:542120TEST_F(HostResolverManagerTest, MultipleAttempts) {
[email protected]189163e2011-05-11 01:48:542121 // Total number of attempts would be 3 and we want the 3rd attempt to resolve
Eric Orth9a037562018-07-03 21:24:382122 // the host. First and second attempt will be forced to wait until they get
[email protected]189163e2011-05-11 01:48:542123 // word that a resolution has completed. The 3rd resolution attempt will try
Eric Orth9a037562018-07-03 21:24:382124 // to get done ASAP, and won't wait.
[email protected]189163e2011-05-11 01:48:542125 int kAttemptNumberToResolve = 3;
2126 int kTotalAttempts = 3;
2127
Eric Orth9a037562018-07-03 21:24:382128 // Add a little bit of extra fudge to the delay to allow reasonable
2129 // flexibility for time > vs >= etc. We don't need to fail the test if we
2130 // retry at t=6001 instead of t=6000.
2131 base::TimeDelta kSleepFudgeFactor = base::TimeDelta::FromMilliseconds(1);
2132
[email protected]189163e2011-05-11 01:48:542133 scoped_refptr<LookupAttemptHostResolverProc> resolver_proc(
Raul Tambre94493c652019-03-11 17:18:352134 new LookupAttemptHostResolverProc(nullptr, kAttemptNumberToResolve,
Eric Orth70992982018-07-24 00:25:002135 kTotalAttempts));
2136
Eric Orth59066222019-03-07 23:52:272137 ProcTaskParams params = DefaultParams(resolver_proc.get());
Eric Orth70992982018-07-24 00:25:002138 base::TimeDelta unresponsive_delay = params.unresponsive_delay;
2139 int retry_factor = params.retry_factor;
2140
Eric Orth607b6d82019-05-08 16:43:322141 CreateResolverWithLimitsAndParams(kMaxJobs, params, true /* ipv6_reachable */,
2142 true /* check_ipv6_on_wifi */);
Eric Orth70992982018-07-24 00:25:002143
2144 // Override the current thread task runner, so we can simulate the passage of
2145 // time and avoid any actual sleeps.
2146 auto test_task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
2147 base::ScopedClosureRunner task_runner_override_scoped_cleanup =
2148 base::ThreadTaskRunnerHandle::OverrideForTesting(test_task_runner);
2149
2150 // Resolve "host1".
Eric Orth117e1992019-04-17 00:24:152151 ResolveHostResponseHelper response(resolver_->CreateRequest(
2152 HostPortPair("host1", 70), NetLogWithSource(), base::nullopt,
2153 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:002154 EXPECT_FALSE(response.complete());
2155
2156 resolver_proc->WaitForNAttemptsToBeBlocked(1);
2157 EXPECT_FALSE(response.complete());
2158
2159 test_task_runner->FastForwardBy(unresponsive_delay + kSleepFudgeFactor);
2160 resolver_proc->WaitForNAttemptsToBeBlocked(2);
2161 EXPECT_FALSE(response.complete());
2162
2163 test_task_runner->FastForwardBy(unresponsive_delay * retry_factor +
2164 kSleepFudgeFactor);
2165
2166 resolver_proc->WaitForAllAttemptsToFinish();
2167 test_task_runner->RunUntilIdle();
2168
2169 // Resolve returns -4 to indicate that 3rd attempt has resolved the host.
2170 // Since we're using a TestMockTimeTaskRunner, the RunLoop stuff in
2171 // result_error() will fail if it actually has to wait, but unless there's an
2172 // error, the result should be immediately ready by this point.
2173 EXPECT_EQ(-4, response.result_error());
2174
2175 // We should be done with retries, but make sure none erroneously happen.
2176 test_task_runner->FastForwardUntilNoTasksRemain();
2177
2178 EXPECT_EQ(resolver_proc->total_attempts_resolved(), kTotalAttempts);
2179 EXPECT_EQ(resolver_proc->resolved_attempt_number(), kAttemptNumberToResolve);
2180}
2181
eroman91dd3602015-03-26 03:46:332182// If a host resolves to a list that includes 127.0.53.53, this is treated as
2183// an error. 127.0.53.53 is a localhost address, however it has been given a
eroman1efc237c2016-12-14 00:00:452184// special significance by ICANN to help surface name collision resulting from
eroman91dd3602015-03-26 03:46:332185// the new gTLDs.
Eric Orth960e7062019-03-08 18:43:542186TEST_F(HostResolverManagerTest, NameCollisionIcann) {
eroman91dd3602015-03-26 03:46:332187 proc_->AddRuleForAllFamilies("single", "127.0.53.53");
2188 proc_->AddRuleForAllFamilies("multiple", "127.0.0.1,127.0.53.53");
2189 proc_->AddRuleForAllFamilies("ipv6", "::127.0.53.53");
2190 proc_->AddRuleForAllFamilies("not_reserved1", "53.53.0.127");
2191 proc_->AddRuleForAllFamilies("not_reserved2", "127.0.53.54");
2192 proc_->AddRuleForAllFamilies("not_reserved3", "10.0.53.53");
2193 proc_->SignalMultiple(6u);
2194
Eric Orth117e1992019-04-17 00:24:152195 ResolveHostResponseHelper single_response(resolver_->CreateRequest(
2196 HostPortPair("single", 80), NetLogWithSource(), base::nullopt,
2197 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:002198 EXPECT_THAT(single_response.result_error(),
2199 IsError(ERR_ICANN_NAME_COLLISION));
2200 EXPECT_FALSE(single_response.request()->GetAddressResults());
2201
2202 // ERR_ICANN_NAME_COLLISION is cached like any other error, using a fixed TTL
2203 // for failed entries from proc-based resolver. That said, the fixed TTL is 0,
2204 // so it should never be cached.
dalyk48b20a992019-02-25 16:10:262205 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result =
2206 GetCacheHit(HostCache::Key("single", DnsQueryType::UNSPECIFIED,
2207 0 /* host_resolver_flags */,
2208 HostResolverSource::ANY));
2209 EXPECT_FALSE(cache_result);
Eric Orth70992982018-07-24 00:25:002210
Eric Orth117e1992019-04-17 00:24:152211 ResolveHostResponseHelper multiple_response(resolver_->CreateRequest(
2212 HostPortPair("multiple", 80), NetLogWithSource(), base::nullopt,
2213 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:002214 EXPECT_THAT(multiple_response.result_error(),
2215 IsError(ERR_ICANN_NAME_COLLISION));
2216
2217 // Resolving an IP literal of 127.0.53.53 however is allowed.
2218 ResolveHostResponseHelper literal_response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272219 HostPortPair("127.0.53.53", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:152220 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:002221 EXPECT_THAT(literal_response.result_error(), IsOk());
2222
2223 // Moreover the address should not be recognized when embedded in an IPv6
2224 // address.
2225 ResolveHostResponseHelper ipv6_response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272226 HostPortPair("127.0.53.53", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:152227 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:002228 EXPECT_THAT(ipv6_response.result_error(), IsOk());
2229
2230 // Try some other IPs which are similar, but NOT an exact match on
2231 // 127.0.53.53.
2232 ResolveHostResponseHelper similar_response1(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272233 HostPortPair("not_reserved1", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:152234 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:002235 EXPECT_THAT(similar_response1.result_error(), IsOk());
2236
2237 ResolveHostResponseHelper similar_response2(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272238 HostPortPair("not_reserved2", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:152239 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:002240 EXPECT_THAT(similar_response2.result_error(), IsOk());
2241
2242 ResolveHostResponseHelper similar_response3(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272243 HostPortPair("not_reserved3", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:152244 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:002245 EXPECT_THAT(similar_response3.result_error(), IsOk());
2246}
2247
Eric Orth960e7062019-03-08 18:43:542248TEST_F(HostResolverManagerTest, IsIPv6Reachable) {
2249 // The real HostResolverManager is needed since TestHostResolverManager will
cbentzel1906f872015-06-05 16:25:252250 // bypass the IPv6 reachability tests.
Eric Orth37b18192019-04-22 19:09:282251 DestroyResolver();
2252 host_cache_ = nullptr;
2253 resolver_ = std::make_unique<HostResolverManager>(DefaultOptions(), nullptr);
cbentzel1906f872015-06-05 16:25:252254
sergeyub8cdc212015-05-14 18:50:372255 // Verify that two consecutive calls return the same value.
tfarina428341112016-09-22 13:38:202256 TestNetLog test_net_log;
2257 NetLogWithSource net_log =
2258 NetLogWithSource::Make(&test_net_log, NetLogSourceType::NONE);
2259 bool result1 = IsIPv6Reachable(net_log);
2260 bool result2 = IsIPv6Reachable(net_log);
sergeyub8cdc212015-05-14 18:50:372261 EXPECT_EQ(result1, result2);
2262
2263 // Filter reachability check events and verify that there are two of them.
2264 TestNetLogEntry::List event_list;
tfarina428341112016-09-22 13:38:202265 test_net_log.GetEntries(&event_list);
sergeyub8cdc212015-05-14 18:50:372266 TestNetLogEntry::List probe_event_list;
2267 for (const auto& event : event_list) {
mikecirone8b85c432016-09-08 19:11:002268 if (event.type ==
2269 NetLogEventType::HOST_RESOLVER_IMPL_IPV6_REACHABILITY_CHECK) {
sergeyub8cdc212015-05-14 18:50:372270 probe_event_list.push_back(event);
2271 }
2272 }
2273 ASSERT_EQ(2U, probe_event_list.size());
2274
2275 // Verify that the first request was not cached and the second one was.
2276 bool cached;
2277 EXPECT_TRUE(probe_event_list[0].GetBooleanValue("cached", &cached));
2278 EXPECT_FALSE(cached);
2279 EXPECT_TRUE(probe_event_list[1].GetBooleanValue("cached", &cached));
2280 EXPECT_TRUE(cached);
2281}
2282
Eric Orth960e7062019-03-08 18:43:542283TEST_F(HostResolverManagerTest, IncludeCanonicalName) {
Eric Orth322af3e42018-08-20 18:12:592284 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42",
2285 HOST_RESOLVER_CANONNAME, "canon.name");
2286 proc_->SignalMultiple(2u);
2287
2288 HostResolver::ResolveHostParameters parameters;
2289 parameters.include_canonical_name = true;
2290 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272291 HostPortPair("just.testing", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:152292 request_context_.get(), host_cache_.get()));
Eric Orth322af3e42018-08-20 18:12:592293 ResolveHostResponseHelper response_no_flag(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272294 HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:152295 request_context_.get(), host_cache_.get()));
Eric Orth322af3e42018-08-20 18:12:592296
2297 EXPECT_THAT(response.result_error(), IsOk());
2298 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
2299 testing::ElementsAre(CreateExpected("192.168.1.42", 80)));
2300 EXPECT_EQ("canon.name",
2301 response.request()->GetAddressResults().value().canonical_name());
2302
2303 EXPECT_THAT(response_no_flag.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
2304}
2305
Eric Orth960e7062019-03-08 18:43:542306TEST_F(HostResolverManagerTest, LoopbackOnly) {
Eric Orth322af3e42018-08-20 18:12:592307 proc_->AddRuleForAllFamilies("otherlocal", "127.0.0.1",
2308 HOST_RESOLVER_LOOPBACK_ONLY);
2309 proc_->SignalMultiple(2u);
2310
2311 HostResolver::ResolveHostParameters parameters;
2312 parameters.loopback_only = true;
2313 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272314 HostPortPair("otherlocal", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:152315 request_context_.get(), host_cache_.get()));
Eric Orth322af3e42018-08-20 18:12:592316 ResolveHostResponseHelper response_no_flag(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272317 HostPortPair("otherlocal", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:152318 request_context_.get(), host_cache_.get()));
Eric Orth322af3e42018-08-20 18:12:592319
2320 EXPECT_THAT(response.result_error(), IsOk());
2321 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
2322 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
2323
2324 EXPECT_THAT(response_no_flag.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
2325}
2326
Eric Orth960e7062019-03-08 18:43:542327TEST_F(HostResolverManagerTest, IsSpeculative) {
Eric Orthb30bc172018-08-17 21:09:572328 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42");
2329 proc_->SignalMultiple(1u);
2330
2331 HostResolver::ResolveHostParameters parameters;
2332 parameters.is_speculative = true;
2333
2334 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272335 HostPortPair("just.testing", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:152336 request_context_.get(), host_cache_.get()));
Eric Orthb30bc172018-08-17 21:09:572337
2338 EXPECT_THAT(response.result_error(), IsOk());
2339 EXPECT_FALSE(response.request()->GetAddressResults());
2340
2341 ASSERT_EQ(1u, proc_->GetCaptureList().size());
2342 EXPECT_EQ("just.testing", proc_->GetCaptureList()[0].hostname);
2343
2344 // Reresolve without the |is_speculative| flag should immediately return from
2345 // cache.
2346 ResolveHostResponseHelper response2(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272347 HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:152348 request_context_.get(), host_cache_.get()));
Eric Orthb30bc172018-08-17 21:09:572349
2350 EXPECT_THAT(response2.result_error(), IsOk());
2351 EXPECT_THAT(response2.request()->GetAddressResults().value().endpoints(),
2352 testing::ElementsAre(CreateExpected("192.168.1.42", 80)));
2353
2354 EXPECT_EQ("just.testing", proc_->GetCaptureList()[0].hostname);
2355 EXPECT_EQ(1u, proc_->GetCaptureList().size()); // No increase.
2356}
2357
Eric Orth37b18192019-04-22 19:09:282358// Test that if a Job with multiple requests, each with its own different
2359// HostCache, completes, the result is cached in all request HostCaches.
2360TEST_F(HostResolverManagerTest, MultipleCachesForMultipleRequests) {
2361 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42");
2362
2363 std::unique_ptr<HostCache> cache2 = HostCache::CreateDefaultCache();
2364 resolver_->AddHostCacheInvalidator(cache2->invalidator());
2365
2366 ResolveHostResponseHelper response1(resolver_->CreateRequest(
2367 HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt,
2368 request_context_.get(), host_cache_.get()));
2369 ResolveHostResponseHelper response2(resolver_->CreateRequest(
2370 HostPortPair("just.testing", 85), NetLogWithSource(), base::nullopt,
2371 request_context_.get(), cache2.get()));
2372 ASSERT_EQ(1u, resolver_->num_jobs_for_testing());
2373
2374 proc_->SignalMultiple(1u);
2375 EXPECT_THAT(response1.result_error(), IsOk());
2376 EXPECT_THAT(response2.result_error(), IsOk());
2377
2378 HostResolver::ResolveHostParameters local_resolve_parameters;
2379 local_resolve_parameters.source = HostResolverSource::LOCAL_ONLY;
2380
2381 // Confirm |host_cache_| contains the result.
2382 ResolveHostResponseHelper cached_response1(resolver_->CreateRequest(
2383 HostPortPair("just.testing", 81), NetLogWithSource(),
2384 local_resolve_parameters, request_context_.get(), host_cache_.get()));
2385 EXPECT_THAT(cached_response1.result_error(), IsOk());
2386 EXPECT_THAT(
2387 cached_response1.request()->GetAddressResults().value().endpoints(),
2388 testing::ElementsAre(CreateExpected("192.168.1.42", 81)));
2389 EXPECT_TRUE(cached_response1.request()->GetStaleInfo());
2390
2391 // Confirm |cache2| contains the result.
2392 ResolveHostResponseHelper cached_response2(resolver_->CreateRequest(
2393 HostPortPair("just.testing", 82), NetLogWithSource(),
2394 local_resolve_parameters, request_context_.get(), cache2.get()));
2395 EXPECT_THAT(cached_response2.result_error(), IsOk());
2396 EXPECT_THAT(
2397 cached_response2.request()->GetAddressResults().value().endpoints(),
2398 testing::ElementsAre(CreateExpected("192.168.1.42", 82)));
2399 EXPECT_TRUE(cached_response2.request()->GetStaleInfo());
2400
2401 resolver_->RemoveHostCacheInvalidator(cache2->invalidator());
2402}
2403
Eric Orth9871aafa2018-10-02 19:59:182404#if BUILDFLAG(ENABLE_MDNS)
2405const uint8_t kMdnsResponseA[] = {
2406 // Header
2407 0x00, 0x00, // ID is zeroed out
2408 0x81, 0x80, // Standard query response, RA, no error
2409 0x00, 0x00, // No questions (for simplicity)
2410 0x00, 0x01, // 1 RR (answers)
2411 0x00, 0x00, // 0 authority RRs
2412 0x00, 0x00, // 0 additional RRs
2413
2414 // "myhello.local."
2415 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2416 0x00,
2417
2418 0x00, 0x01, // TYPE is A.
2419 0x00, 0x01, // CLASS is IN.
2420 0x00, 0x00, 0x00, 0x10, // TTL is 16 (seconds)
2421 0x00, 0x04, // RDLENGTH is 4 bytes.
2422 0x01, 0x02, 0x03, 0x04, // 1.2.3.4
2423};
2424
Eric Orth026776a2019-01-18 00:13:282425const uint8_t kMdnsResponseA2[] = {
2426 // Header
2427 0x00, 0x00, // ID is zeroed out
2428 0x81, 0x80, // Standard query response, RA, no error
2429 0x00, 0x00, // No questions (for simplicity)
2430 0x00, 0x01, // 1 RR (answers)
2431 0x00, 0x00, // 0 authority RRs
2432 0x00, 0x00, // 0 additional RRs
2433
2434 // "myhello.local."
2435 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2436 0x00,
2437
2438 0x00, 0x01, // TYPE is A.
2439 0x00, 0x01, // CLASS is IN.
2440 0x00, 0x00, 0x00, 0x10, // TTL is 16 (seconds)
2441 0x00, 0x04, // RDLENGTH is 4 bytes.
2442 0x05, 0x06, 0x07, 0x08, // 5.6.7.8
2443};
2444
2445const uint8_t kMdnsResponseA2Goodbye[] = {
2446 // Header
2447 0x00, 0x00, // ID is zeroed out
2448 0x81, 0x80, // Standard query response, RA, no error
2449 0x00, 0x00, // No questions (for simplicity)
2450 0x00, 0x01, // 1 RR (answers)
2451 0x00, 0x00, // 0 authority RRs
2452 0x00, 0x00, // 0 additional RRs
2453
2454 // "myhello.local."
2455 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2456 0x00,
2457
2458 0x00, 0x01, // TYPE is A.
2459 0x00, 0x01, // CLASS is IN.
2460 0x00, 0x00, 0x00, 0x00, // TTL is 0 (signaling "goodbye" removal of result)
2461 0x00, 0x04, // RDLENGTH is 4 bytes.
2462 0x05, 0x06, 0x07, 0x08, // 5.6.7.8
2463};
2464
Eric Orth9871aafa2018-10-02 19:59:182465const uint8_t kMdnsResponseAAAA[] = {
2466 // Header
2467 0x00, 0x00, // ID is zeroed out
2468 0x81, 0x80, // Standard query response, RA, no error
2469 0x00, 0x00, // No questions (for simplicity)
2470 0x00, 0x01, // 1 RR (answers)
2471 0x00, 0x00, // 0 authority RRs
2472 0x00, 0x00, // 0 additional RRs
2473
2474 // "myhello.local."
2475 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2476 0x00,
2477
2478 0x00, 0x1C, // TYPE is AAAA.
2479 0x00, 0x01, // CLASS is IN.
2480 0x00, 0x00, 0x00, 0x10, // TTL is 16 (seconds)
2481 0x00, 0x10, // RDLENGTH is 16 bytes.
2482
2483 // 000a:0000:0000:0000:0001:0002:0003:0004
2484 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02,
Eric Orth960e7062019-03-08 18:43:542485 0x00, 0x03, 0x00, 0x04};
Eric Orth9871aafa2018-10-02 19:59:182486
2487// An MDNS response indicating that the responder owns the hostname, but the
2488// specific requested type (AAAA) does not exist because the responder only has
2489// A addresses.
2490const uint8_t kMdnsResponseNsec[] = {
2491 // Header
2492 0x00, 0x00, // ID is zeroed out
2493 0x81, 0x80, // Standard query response, RA, no error
2494 0x00, 0x00, // No questions (for simplicity)
2495 0x00, 0x01, // 1 RR (answers)
2496 0x00, 0x00, // 0 authority RRs
2497 0x00, 0x00, // 0 additional RRs
2498
2499 // "myhello.local."
2500 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2501 0x00,
2502
2503 0x00, 0x2f, // TYPE is NSEC.
2504 0x00, 0x01, // CLASS is IN.
2505 0x00, 0x00, 0x00, 0x10, // TTL is 16 (seconds)
2506 0x00, 0x06, // RDLENGTH is 6 bytes.
2507 0xc0, 0x0c, // Next Domain Name (always pointer back to name in MDNS)
2508 0x00, // Bitmap block number (always 0 in MDNS)
2509 0x02, // Bitmap length is 2
2510 0x00, 0x08 // A type only
2511};
2512
Eric Orth828bd3ae2018-12-12 17:30:362513const uint8_t kMdnsResponseTxt[] = {
2514 // Header
2515 0x00, 0x00, // ID is zeroed out
2516 0x81, 0x80, // Standard query response, RA, no error
2517 0x00, 0x00, // No questions (for simplicity)
2518 0x00, 0x01, // 1 RR (answers)
2519 0x00, 0x00, // 0 authority RRs
2520 0x00, 0x00, // 0 additional RRs
2521
2522 // "myhello.local."
2523 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2524 0x00,
2525
2526 0x00, 0x10, // TYPE is TXT.
2527 0x00, 0x01, // CLASS is IN.
2528 0x00, 0x00, 0x00, 0x11, // TTL is 17 (seconds)
2529 0x00, 0x08, // RDLENGTH is 8 bytes.
2530
2531 // "foo"
2532 0x03, 0x66, 0x6f, 0x6f,
2533 // "bar"
Eric Orth960e7062019-03-08 18:43:542534 0x03, 0x62, 0x61, 0x72};
Eric Orth828bd3ae2018-12-12 17:30:362535
Eric Orthe9db8d232019-01-14 21:24:452536const uint8_t kMdnsResponsePtr[] = {
2537 // Header
2538 0x00, 0x00, // ID is zeroed out
2539 0x81, 0x80, // Standard query response, RA, no error
2540 0x00, 0x00, // No questions (for simplicity)
2541 0x00, 0x01, // 1 RR (answers)
2542 0x00, 0x00, // 0 authority RRs
2543 0x00, 0x00, // 0 additional RRs
2544
2545 // "myhello.local."
2546 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2547 0x00,
2548
2549 0x00, 0x0c, // TYPE is PTR.
2550 0x00, 0x01, // CLASS is IN.
2551 0x00, 0x00, 0x00, 0x12, // TTL is 18 (seconds)
2552 0x00, 0x09, // RDLENGTH is 9 bytes.
2553
2554 // "foo.com."
2555 0x03, 'f', 'o', 'o', 0x03, 'c', 'o', 'm', 0x00};
2556
Eric Orth026776a2019-01-18 00:13:282557const uint8_t kMdnsResponsePtrRoot[] = {
2558 // Header
2559 0x00, 0x00, // ID is zeroed out
2560 0x81, 0x80, // Standard query response, RA, no error
2561 0x00, 0x00, // No questions (for simplicity)
2562 0x00, 0x01, // 1 RR (answers)
2563 0x00, 0x00, // 0 authority RRs
2564 0x00, 0x00, // 0 additional RRs
2565
2566 // "myhello.local."
2567 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2568 0x00,
2569
2570 0x00, 0x0c, // TYPE is PTR.
2571 0x00, 0x01, // CLASS is IN.
2572 0x00, 0x00, 0x00, 0x13, // TTL is 19 (seconds)
2573 0x00, 0x01, // RDLENGTH is 1 byte.
2574
2575 // "." (the root domain)
2576 0x00};
2577
Eric Ortha625b042019-01-16 01:14:452578const uint8_t kMdnsResponseSrv[] = {
2579 // Header
2580 0x00, 0x00, // ID is zeroed out
2581 0x81, 0x80, // Standard query response, RA, no error
2582 0x00, 0x00, // No questions (for simplicity)
2583 0x00, 0x01, // 1 RR (answers)
2584 0x00, 0x00, // 0 authority RRs
2585 0x00, 0x00, // 0 additional RRs
2586
2587 // "myhello.local."
2588 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2589 0x00,
2590
2591 0x00, 0x21, // TYPE is SRV.
2592 0x00, 0x01, // CLASS is IN.
2593 0x00, 0x00, 0x00, 0x13, // TTL is 19 (seconds)
2594 0x00, 0x0f, // RDLENGTH is 15 bytes.
2595
2596 0x00, 0x05, // Priority 5
2597 0x00, 0x01, // Weight 1
2598 0x20, 0x49, // Port 8265
2599
2600 // "foo.com."
2601 0x03, 'f', 'o', 'o', 0x03, 'c', 'o', 'm', 0x00};
2602
Bailey Berroe70f06c2019-03-11 22:22:462603const uint8_t kMdnsResponseSrvUnrestricted[] = {
2604 // Header
2605 0x00, 0x00, // ID is zeroed out
2606 0x81, 0x80, // Standard query response, RA, no error
2607 0x00, 0x00, // No questions (for simplicity)
2608 0x00, 0x01, // 1 RR (answers)
2609 0x00, 0x00, // 0 authority RRs
2610 0x00, 0x00, // 0 additional RRs
2611
2612 // "foo bar(A1B2)._ipps._tcp.local"
2613 0x0d, 'f', 'o', 'o', ' ', 'b', 'a', 'r', '(', 'A', '1', 'B', '2', ')', 0x05,
2614 '_', 'i', 'p', 'p', 's', 0x04, '_', 't', 'c', 'p', 0x05, 'l', 'o', 'c', 'a',
2615 'l', 0x00,
2616
2617 0x00, 0x21, // TYPE is SRV.
2618 0x00, 0x01, // CLASS is IN.
2619 0x00, 0x00, 0x00, 0x13, // TTL is 19 (seconds)
2620 0x00, 0x0f, // RDLENGTH is 15 bytes.
2621
2622 0x00, 0x05, // Priority 5
2623 0x00, 0x01, // Weight 1
2624 0x20, 0x49, // Port 8265
2625
2626 // "foo.com."
2627 0x03, 'f', 'o', 'o', 0x03, 'c', 'o', 'm', 0x00};
2628
2629const uint8_t kMdnsResponseSrvUnrestrictedResult[] = {
2630 // Header
2631 0x00, 0x00, // ID is zeroed out
2632 0x81, 0x80, // Standard query response, RA, no error
2633 0x00, 0x00, // No questions (for simplicity)
2634 0x00, 0x01, // 1 RR (answers)
2635 0x00, 0x00, // 0 authority RRs
2636 0x00, 0x00, // 0 additional RRs
2637
2638 // "myhello.local."
2639 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2640 0x00,
2641
2642 0x00, 0x21, // TYPE is SRV.
2643 0x00, 0x01, // CLASS is IN.
2644 0x00, 0x00, 0x00, 0x13, // TTL is 19 (seconds)
2645 0x00, 0x15, // RDLENGTH is 21 bytes.
2646
2647 0x00, 0x05, // Priority 5
2648 0x00, 0x01, // Weight 1
2649 0x20, 0x49, // Port 8265
2650
2651 // "foo bar.local"
2652 0x07, 'f', 'o', 'o', ' ', 'b', 'a', 'r', 0x05, 'l', 'o', 'c', 'a', 'l',
2653 0x00};
2654
Eric Orth960e7062019-03-08 18:43:542655TEST_F(HostResolverManagerTest, Mdns) {
Eric Orth9871aafa2018-10-02 19:59:182656 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2657 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2658 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2659 // 2 socket creations for every transaction.
2660 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(4);
2661
2662 HostResolver::ResolveHostParameters parameters;
2663 parameters.source = HostResolverSource::MULTICAST_DNS;
2664
2665 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272666 HostPortPair("myhello.local", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:152667 request_context_.get(), host_cache_.get()));
Eric Orth9871aafa2018-10-02 19:59:182668
2669 socket_factory_ptr->SimulateReceive(kMdnsResponseA, sizeof(kMdnsResponseA));
2670 socket_factory_ptr->SimulateReceive(kMdnsResponseAAAA,
2671 sizeof(kMdnsResponseAAAA));
2672
2673 EXPECT_THAT(response.result_error(), IsOk());
2674 EXPECT_THAT(
2675 response.request()->GetAddressResults().value().endpoints(),
2676 testing::UnorderedElementsAre(
2677 CreateExpected("1.2.3.4", 80),
2678 CreateExpected("000a:0000:0000:0000:0001:0002:0003:0004", 80)));
Eric Orth828bd3ae2018-12-12 17:30:362679 EXPECT_FALSE(response.request()->GetTextResults());
2680 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth9871aafa2018-10-02 19:59:182681}
2682
Eric Orth960e7062019-03-08 18:43:542683TEST_F(HostResolverManagerTest, Mdns_AaaaOnly) {
Eric Orth9871aafa2018-10-02 19:59:182684 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2685 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2686 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2687 // 2 socket creations for every transaction.
2688 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(2);
2689
2690 HostResolver::ResolveHostParameters parameters;
Eric Orth192e3bb2018-11-14 19:30:322691 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth9871aafa2018-10-02 19:59:182692 parameters.source = HostResolverSource::MULTICAST_DNS;
2693
2694 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272695 HostPortPair("myhello.local", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:152696 request_context_.get(), host_cache_.get()));
Eric Orth9871aafa2018-10-02 19:59:182697
2698 socket_factory_ptr->SimulateReceive(kMdnsResponseAAAA,
2699 sizeof(kMdnsResponseAAAA));
2700
2701 EXPECT_THAT(response.result_error(), IsOk());
2702 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
2703 testing::ElementsAre(CreateExpected(
2704 "000a:0000:0000:0000:0001:0002:0003:0004", 80)));
2705}
2706
Eric Orth960e7062019-03-08 18:43:542707TEST_F(HostResolverManagerTest, Mdns_Txt) {
Eric Orth828bd3ae2018-12-12 17:30:362708 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2709 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2710 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2711 // 2 socket creations for every transaction.
2712 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(2);
2713
2714 HostResolver::ResolveHostParameters parameters;
2715 parameters.dns_query_type = DnsQueryType::TXT;
2716 parameters.source = HostResolverSource::MULTICAST_DNS;
2717
2718 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272719 HostPortPair("myhello.local", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:152720 request_context_.get(), host_cache_.get()));
Eric Orth828bd3ae2018-12-12 17:30:362721
2722 socket_factory_ptr->SimulateReceive(kMdnsResponseTxt,
2723 sizeof(kMdnsResponseTxt));
2724
2725 EXPECT_THAT(response.result_error(), IsOk());
2726 EXPECT_FALSE(response.request()->GetAddressResults());
2727 EXPECT_THAT(response.request()->GetTextResults(),
2728 testing::Optional(testing::ElementsAre("foo", "bar")));
2729 EXPECT_FALSE(response.request()->GetHostnameResults());
2730}
2731
Eric Orth960e7062019-03-08 18:43:542732TEST_F(HostResolverManagerTest, Mdns_Ptr) {
Eric Orthe9db8d232019-01-14 21:24:452733 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2734 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2735 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2736 // 2 socket creations for every transaction.
2737 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(2);
2738
2739 HostResolver::ResolveHostParameters parameters;
2740 parameters.dns_query_type = DnsQueryType::PTR;
2741 parameters.source = HostResolverSource::MULTICAST_DNS;
2742
2743 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272744 HostPortPair("myhello.local", 83), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:152745 request_context_.get(), host_cache_.get()));
Eric Orthe9db8d232019-01-14 21:24:452746
2747 socket_factory_ptr->SimulateReceive(kMdnsResponsePtr,
2748 sizeof(kMdnsResponsePtr));
2749
2750 EXPECT_THAT(response.result_error(), IsOk());
2751 EXPECT_FALSE(response.request()->GetAddressResults());
2752 EXPECT_FALSE(response.request()->GetTextResults());
2753 EXPECT_THAT(
2754 response.request()->GetHostnameResults(),
2755 testing::Optional(testing::ElementsAre(HostPortPair("foo.com", 83))));
2756}
2757
Eric Orth960e7062019-03-08 18:43:542758TEST_F(HostResolverManagerTest, Mdns_Srv) {
Eric Ortha625b042019-01-16 01:14:452759 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2760 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2761 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2762 // 2 socket creations for every transaction.
2763 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(2);
2764
2765 HostResolver::ResolveHostParameters parameters;
2766 parameters.dns_query_type = DnsQueryType::SRV;
2767 parameters.source = HostResolverSource::MULTICAST_DNS;
2768
2769 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272770 HostPortPair("myhello.local", 83), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:152771 request_context_.get(), host_cache_.get()));
Eric Ortha625b042019-01-16 01:14:452772
2773 socket_factory_ptr->SimulateReceive(kMdnsResponseSrv,
2774 sizeof(kMdnsResponseSrv));
2775
2776 EXPECT_THAT(response.result_error(), IsOk());
2777 EXPECT_FALSE(response.request()->GetAddressResults());
2778 EXPECT_FALSE(response.request()->GetTextResults());
2779 EXPECT_THAT(
2780 response.request()->GetHostnameResults(),
2781 testing::Optional(testing::ElementsAre(HostPortPair("foo.com", 8265))));
2782}
2783
Bailey Berroe70f06c2019-03-11 22:22:462784// Test that we are able to create multicast DNS requests that contain
2785// characters not permitted in the DNS spec such as spaces and parenthesis.
2786TEST_F(HostResolverManagerTest, Mdns_Srv_Unrestricted) {
2787 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2788 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2789 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2790
2791 HostResolver::ResolveHostParameters parameters;
2792 parameters.dns_query_type = DnsQueryType::SRV;
2793 parameters.source = HostResolverSource::MULTICAST_DNS;
2794
2795 ResolveHostResponseHelper response(resolver_->CreateRequest(
2796 HostPortPair("foo bar(A1B2)._ipps._tcp.local", 83), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:152797 parameters, request_context_.get(), host_cache_.get()));
Bailey Berroe70f06c2019-03-11 22:22:462798
2799 socket_factory_ptr->SimulateReceive(kMdnsResponseSrvUnrestricted,
2800 sizeof(kMdnsResponseSrvUnrestricted));
2801
2802 EXPECT_THAT(response.result_error(), IsOk());
2803 EXPECT_FALSE(response.request()->GetAddressResults());
2804 EXPECT_FALSE(response.request()->GetTextResults());
2805 EXPECT_THAT(
2806 response.request()->GetHostnameResults(),
2807 testing::Optional(testing::ElementsAre(HostPortPair("foo.com", 8265))));
2808}
2809
2810// Test that we are able to create multicast DNS requests that contain
2811// characters not permitted in the DNS spec such as spaces and parenthesis.
2812TEST_F(HostResolverManagerTest, Mdns_Srv_Result_Unrestricted) {
2813 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2814 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2815 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2816
2817 HostResolver::ResolveHostParameters parameters;
2818 parameters.dns_query_type = DnsQueryType::SRV;
2819 parameters.source = HostResolverSource::MULTICAST_DNS;
2820
2821 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272822 HostPortPair("myhello.local", 83), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:152823 request_context_.get(), host_cache_.get()));
Bailey Berroe70f06c2019-03-11 22:22:462824
2825 socket_factory_ptr->SimulateReceive(
2826 kMdnsResponseSrvUnrestrictedResult,
2827 sizeof(kMdnsResponseSrvUnrestrictedResult));
2828
2829 EXPECT_THAT(response.result_error(), IsOk());
2830 EXPECT_FALSE(response.request()->GetAddressResults());
2831 EXPECT_FALSE(response.request()->GetTextResults());
2832 EXPECT_THAT(response.request()->GetHostnameResults(),
2833 testing::Optional(
2834 testing::ElementsAre(HostPortPair("foo bar.local", 8265))));
2835}
2836
Eric Orth9871aafa2018-10-02 19:59:182837// Test multicast DNS handling of NSEC responses (used for explicit negative
2838// response).
Eric Orth960e7062019-03-08 18:43:542839TEST_F(HostResolverManagerTest, Mdns_Nsec) {
Eric Orth9871aafa2018-10-02 19:59:182840 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2841 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2842 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2843 // 2 socket creations for every transaction.
2844 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(2);
2845
2846 HostResolver::ResolveHostParameters parameters;
Eric Orth192e3bb2018-11-14 19:30:322847 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth9871aafa2018-10-02 19:59:182848 parameters.source = HostResolverSource::MULTICAST_DNS;
2849
2850 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272851 HostPortPair("myhello.local", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:152852 request_context_.get(), host_cache_.get()));
Eric Orth9871aafa2018-10-02 19:59:182853
2854 socket_factory_ptr->SimulateReceive(kMdnsResponseNsec,
2855 sizeof(kMdnsResponseNsec));
2856
2857 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
2858 EXPECT_FALSE(response.request()->GetAddressResults());
2859}
2860
Eric Orth960e7062019-03-08 18:43:542861TEST_F(HostResolverManagerTest, Mdns_NoResponse) {
Eric Orth9871aafa2018-10-02 19:59:182862 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2863 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2864 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2865 // 2 socket creations for every transaction.
2866 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(4);
2867
2868 // Add a little bit of extra fudge to the delay to allow reasonable
2869 // flexibility for time > vs >= etc. We don't need to fail the test if we
2870 // timeout at t=6001 instead of t=6000.
2871 base::TimeDelta kSleepFudgeFactor = base::TimeDelta::FromMilliseconds(1);
2872
2873 // Override the current thread task runner, so we can simulate the passage of
2874 // time to trigger the timeout.
2875 auto test_task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
2876 base::ScopedClosureRunner task_runner_override_scoped_cleanup =
2877 base::ThreadTaskRunnerHandle::OverrideForTesting(test_task_runner);
2878
2879 HostResolver::ResolveHostParameters parameters;
2880 parameters.source = HostResolverSource::MULTICAST_DNS;
2881
2882 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272883 HostPortPair("myhello.local", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:152884 request_context_.get(), host_cache_.get()));
Eric Orth9871aafa2018-10-02 19:59:182885
2886 ASSERT_TRUE(test_task_runner->HasPendingTask());
2887 test_task_runner->FastForwardBy(MDnsTransaction::kTransactionTimeout +
2888 kSleepFudgeFactor);
2889
2890 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
2891 EXPECT_FALSE(response.request()->GetAddressResults());
Eric Orth828bd3ae2018-12-12 17:30:362892 EXPECT_FALSE(response.request()->GetTextResults());
2893 EXPECT_FALSE(response.request()->GetHostnameResults());
2894
2895 test_task_runner->FastForwardUntilNoTasksRemain();
2896}
2897
Eric Orth960e7062019-03-08 18:43:542898TEST_F(HostResolverManagerTest, Mdns_WrongType) {
Eric Orth828bd3ae2018-12-12 17:30:362899 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2900 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2901 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2902 // 2 socket creations for every transaction.
2903 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(2);
2904
2905 // Add a little bit of extra fudge to the delay to allow reasonable
2906 // flexibility for time > vs >= etc. We don't need to fail the test if we
2907 // timeout at t=6001 instead of t=6000.
2908 base::TimeDelta kSleepFudgeFactor = base::TimeDelta::FromMilliseconds(1);
2909
2910 // Override the current thread task runner, so we can simulate the passage of
2911 // time to trigger the timeout.
2912 auto test_task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
2913 base::ScopedClosureRunner task_runner_override_scoped_cleanup =
2914 base::ThreadTaskRunnerHandle::OverrideForTesting(test_task_runner);
2915
2916 HostResolver::ResolveHostParameters parameters;
2917 parameters.dns_query_type = DnsQueryType::A;
2918 parameters.source = HostResolverSource::MULTICAST_DNS;
2919
2920 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272921 HostPortPair("myhello.local", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:152922 request_context_.get(), host_cache_.get()));
Eric Orth828bd3ae2018-12-12 17:30:362923
2924 // Not the requested type. Should be ignored.
2925 socket_factory_ptr->SimulateReceive(kMdnsResponseTxt,
2926 sizeof(kMdnsResponseTxt));
2927
2928 ASSERT_TRUE(test_task_runner->HasPendingTask());
2929 test_task_runner->FastForwardBy(MDnsTransaction::kTransactionTimeout +
2930 kSleepFudgeFactor);
2931
2932 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
2933 EXPECT_FALSE(response.request()->GetAddressResults());
2934 EXPECT_FALSE(response.request()->GetTextResults());
2935 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth9871aafa2018-10-02 19:59:182936
2937 test_task_runner->FastForwardUntilNoTasksRemain();
2938}
2939
2940// Test for a request for both A and AAAA results where results only exist for
2941// one type.
Eric Orth960e7062019-03-08 18:43:542942TEST_F(HostResolverManagerTest, Mdns_PartialResults) {
Eric Orth9871aafa2018-10-02 19:59:182943 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2944 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2945 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2946 // 2 socket creations for every transaction.
2947 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(4);
2948
2949 // Add a little bit of extra fudge to the delay to allow reasonable
2950 // flexibility for time > vs >= etc. We don't need to fail the test if we
2951 // timeout at t=6001 instead of t=6000.
2952 base::TimeDelta kSleepFudgeFactor = base::TimeDelta::FromMilliseconds(1);
2953
2954 // Override the current thread task runner, so we can simulate the passage of
2955 // time to trigger the timeout.
2956 auto test_task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
2957 base::ScopedClosureRunner task_runner_override_scoped_cleanup =
2958 base::ThreadTaskRunnerHandle::OverrideForTesting(test_task_runner);
2959
2960 HostResolver::ResolveHostParameters parameters;
2961 parameters.source = HostResolverSource::MULTICAST_DNS;
2962
2963 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272964 HostPortPair("myhello.local", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:152965 request_context_.get(), host_cache_.get()));
Eric Orth9871aafa2018-10-02 19:59:182966
2967 ASSERT_TRUE(test_task_runner->HasPendingTask());
2968
2969 socket_factory_ptr->SimulateReceive(kMdnsResponseA, sizeof(kMdnsResponseA));
2970 test_task_runner->FastForwardBy(MDnsTransaction::kTransactionTimeout +
2971 kSleepFudgeFactor);
2972
2973 EXPECT_THAT(response.result_error(), IsOk());
2974 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
2975 testing::ElementsAre(CreateExpected("1.2.3.4", 80)));
2976
2977 test_task_runner->FastForwardUntilNoTasksRemain();
2978}
2979
Eric Orth960e7062019-03-08 18:43:542980TEST_F(HostResolverManagerTest, Mdns_Cancel) {
Eric Orth9871aafa2018-10-02 19:59:182981 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2982 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2983 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2984 // 2 socket creations for every transaction.
2985 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(4);
2986
2987 HostResolver::ResolveHostParameters parameters;
2988 parameters.source = HostResolverSource::MULTICAST_DNS;
2989
2990 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272991 HostPortPair("myhello.local", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:152992 request_context_.get(), host_cache_.get()));
Eric Orth9871aafa2018-10-02 19:59:182993
2994 response.CancelRequest();
2995
2996 socket_factory_ptr->SimulateReceive(kMdnsResponseA, sizeof(kMdnsResponseA));
2997 socket_factory_ptr->SimulateReceive(kMdnsResponseAAAA,
2998 sizeof(kMdnsResponseAAAA));
2999
3000 base::RunLoop().RunUntilIdle();
3001 EXPECT_FALSE(response.complete());
3002}
3003
3004// Test for a two-transaction query where the first fails to start. The second
3005// should be cancelled.
Eric Orth960e7062019-03-08 18:43:543006TEST_F(HostResolverManagerTest, Mdns_PartialFailure) {
Eric Orth9871aafa2018-10-02 19:59:183007 // Setup a mock MDnsClient where the first transaction will always return
3008 // |false| immediately on Start(). Second transaction may or may not be
3009 // created, but if it is, Start() not expected to be called because the
3010 // overall request should immediately fail.
3011 auto transaction1 = std::make_unique<MockMDnsTransaction>();
3012 EXPECT_CALL(*transaction1, Start()).WillOnce(Return(false));
3013 auto transaction2 = std::make_unique<MockMDnsTransaction>();
3014 EXPECT_CALL(*transaction2, Start()).Times(0);
3015
3016 auto client = std::make_unique<MockMDnsClient>();
3017 EXPECT_CALL(*client, CreateTransaction(_, _, _, _))
3018 .Times(Between(1, 2)) // Second transaction optionally created.
3019 .WillOnce(Return(ByMove(std::move(transaction1))))
3020 .WillOnce(Return(ByMove(std::move(transaction2))));
3021 EXPECT_CALL(*client, IsListening()).WillRepeatedly(Return(true));
3022 resolver_->SetMdnsClientForTesting(std::move(client));
3023
3024 HostResolver::ResolveHostParameters parameters;
3025 parameters.source = HostResolverSource::MULTICAST_DNS;
3026
3027 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:273028 HostPortPair("myhello.local", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:153029 request_context_.get(), host_cache_.get()));
Eric Orth9871aafa2018-10-02 19:59:183030
3031 EXPECT_THAT(response.result_error(), IsError(ERR_FAILED));
3032 EXPECT_FALSE(response.request()->GetAddressResults());
3033}
Eric Orth026776a2019-01-18 00:13:283034
Eric Orthe857ebb2019-03-13 23:02:073035TEST_F(HostResolverManagerTest, Mdns_ListenFailure) {
3036 // Inject an MdnsClient mock that will always fail to start listening.
3037 auto client = std::make_unique<MockMDnsClient>();
3038 EXPECT_CALL(*client, StartListening(_)).WillOnce(Return(ERR_FAILED));
3039 EXPECT_CALL(*client, IsListening()).WillRepeatedly(Return(false));
3040 resolver_->SetMdnsClientForTesting(std::move(client));
3041
3042 HostResolver::ResolveHostParameters parameters;
3043 parameters.source = HostResolverSource::MULTICAST_DNS;
3044
3045 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:273046 HostPortPair("myhello.local", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:153047 request_context_.get(), host_cache_.get()));
Eric Orthe857ebb2019-03-13 23:02:073048
3049 EXPECT_THAT(response.result_error(), IsError(ERR_FAILED));
3050 EXPECT_FALSE(response.request()->GetAddressResults());
3051}
3052
Eric Orth026776a2019-01-18 00:13:283053// Implementation of HostResolver::MdnsListenerDelegate that records all
3054// received results in maps.
3055class TestMdnsListenerDelegate : public HostResolver::MdnsListener::Delegate {
3056 public:
3057 using UpdateKey =
3058 std::pair<HostResolver::MdnsListener::Delegate::UpdateType, DnsQueryType>;
3059
3060 void OnAddressResult(
3061 HostResolver::MdnsListener::Delegate::UpdateType update_type,
3062 DnsQueryType result_type,
3063 IPEndPoint address) override {
3064 address_results_.insert({{update_type, result_type}, std::move(address)});
3065 }
3066
3067 void OnTextResult(
3068 HostResolver::MdnsListener::Delegate::UpdateType update_type,
3069 DnsQueryType result_type,
3070 std::vector<std::string> text_records) override {
3071 for (auto& text_record : text_records) {
3072 text_results_.insert(
3073 {{update_type, result_type}, std::move(text_record)});
3074 }
3075 }
3076
3077 void OnHostnameResult(
3078 HostResolver::MdnsListener::Delegate::UpdateType update_type,
3079 DnsQueryType result_type,
3080 HostPortPair host) override {
3081 hostname_results_.insert({{update_type, result_type}, std::move(host)});
3082 }
3083
3084 void OnUnhandledResult(
3085 HostResolver::MdnsListener::Delegate::UpdateType update_type,
3086 DnsQueryType result_type) override {
3087 unhandled_results_.insert({update_type, result_type});
3088 }
3089
3090 const std::multimap<UpdateKey, IPEndPoint>& address_results() {
3091 return address_results_;
3092 }
3093
3094 const std::multimap<UpdateKey, std::string>& text_results() {
3095 return text_results_;
3096 }
3097
3098 const std::multimap<UpdateKey, HostPortPair>& hostname_results() {
3099 return hostname_results_;
3100 }
3101
3102 const std::multiset<UpdateKey>& unhandled_results() {
3103 return unhandled_results_;
3104 }
3105
3106 template <typename T>
3107 static std::pair<UpdateKey, T> CreateExpectedResult(
3108 HostResolver::MdnsListener::Delegate::UpdateType update_type,
3109 DnsQueryType query_type,
3110 T result) {
3111 return std::make_pair(std::make_pair(update_type, query_type), result);
3112 }
3113
3114 private:
3115 std::multimap<UpdateKey, IPEndPoint> address_results_;
3116 std::multimap<UpdateKey, std::string> text_results_;
3117 std::multimap<UpdateKey, HostPortPair> hostname_results_;
3118 std::multiset<UpdateKey> unhandled_results_;
3119};
3120
Eric Orth960e7062019-03-08 18:43:543121TEST_F(HostResolverManagerTest, MdnsListener) {
Eric Orth026776a2019-01-18 00:13:283122 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3123 base::SimpleTestClock clock;
3124 clock.SetNow(base::Time::Now());
3125 auto cache_cleanup_timer = std::make_unique<base::MockOneShotTimer>();
3126 auto* cache_cleanup_timer_ptr = cache_cleanup_timer.get();
3127 auto mdns_client =
3128 std::make_unique<MDnsClientImpl>(&clock, std::move(cache_cleanup_timer));
Eric Orthe857ebb2019-03-13 23:02:073129 ASSERT_THAT(mdns_client->StartListening(socket_factory.get()), IsOk());
Eric Orth026776a2019-01-18 00:13:283130 resolver_->SetMdnsClientForTesting(std::move(mdns_client));
3131
3132 std::unique_ptr<HostResolver::MdnsListener> listener =
3133 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 80),
3134 DnsQueryType::A);
3135
3136 TestMdnsListenerDelegate delegate;
3137 ASSERT_THAT(listener->Start(&delegate), IsOk());
3138 ASSERT_THAT(delegate.address_results(), testing::IsEmpty());
3139
3140 socket_factory->SimulateReceive(kMdnsResponseA, sizeof(kMdnsResponseA));
3141 socket_factory->SimulateReceive(kMdnsResponseA2, sizeof(kMdnsResponseA2));
3142 socket_factory->SimulateReceive(kMdnsResponseA2Goodbye,
3143 sizeof(kMdnsResponseA2Goodbye));
3144
3145 // Per RFC6762 section 10.1, removals take effect 1 second after receiving the
3146 // goodbye message.
3147 clock.Advance(base::TimeDelta::FromSeconds(1));
3148 cache_cleanup_timer_ptr->Fire();
3149
3150 // Expect 1 record adding "1.2.3.4", another changing to "5.6.7.8", and a
3151 // final removing "5.6.7.8".
3152 EXPECT_THAT(delegate.address_results(),
3153 testing::ElementsAre(
3154 TestMdnsListenerDelegate::CreateExpectedResult(
3155 HostResolver::MdnsListener::Delegate::UpdateType::ADDED,
3156 DnsQueryType::A, CreateExpected("1.2.3.4", 80)),
3157 TestMdnsListenerDelegate::CreateExpectedResult(
3158 HostResolver::MdnsListener::Delegate::UpdateType::CHANGED,
3159 DnsQueryType::A, CreateExpected("5.6.7.8", 80)),
3160 TestMdnsListenerDelegate::CreateExpectedResult(
3161 HostResolver::MdnsListener::Delegate::UpdateType::REMOVED,
3162 DnsQueryType::A, CreateExpected("5.6.7.8", 80))));
3163
3164 EXPECT_THAT(delegate.text_results(), testing::IsEmpty());
3165 EXPECT_THAT(delegate.hostname_results(), testing::IsEmpty());
3166 EXPECT_THAT(delegate.unhandled_results(), testing::IsEmpty());
3167}
3168
Eric Orthe857ebb2019-03-13 23:02:073169TEST_F(HostResolverManagerTest, MdnsListener_StartListenFailure) {
3170 // Inject an MdnsClient mock that will always fail to start listening.
3171 auto client = std::make_unique<MockMDnsClient>();
3172 EXPECT_CALL(*client, StartListening(_)).WillOnce(Return(ERR_TIMED_OUT));
3173 EXPECT_CALL(*client, IsListening()).WillRepeatedly(Return(false));
3174 resolver_->SetMdnsClientForTesting(std::move(client));
3175
3176 std::unique_ptr<HostResolver::MdnsListener> listener =
3177 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 80),
3178 DnsQueryType::A);
3179 TestMdnsListenerDelegate delegate;
3180 EXPECT_THAT(listener->Start(&delegate), IsError(ERR_TIMED_OUT));
3181 EXPECT_THAT(delegate.address_results(), testing::IsEmpty());
3182}
3183
Eric Orth026776a2019-01-18 00:13:283184// Test that removal notifications are sent on natural expiration of MDNS
3185// records.
Eric Orth960e7062019-03-08 18:43:543186TEST_F(HostResolverManagerTest, MdnsListener_Expiration) {
Eric Orth026776a2019-01-18 00:13:283187 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3188 base::SimpleTestClock clock;
3189 clock.SetNow(base::Time::Now());
3190 auto cache_cleanup_timer = std::make_unique<base::MockOneShotTimer>();
3191 auto* cache_cleanup_timer_ptr = cache_cleanup_timer.get();
3192 auto mdns_client =
3193 std::make_unique<MDnsClientImpl>(&clock, std::move(cache_cleanup_timer));
Eric Orthe857ebb2019-03-13 23:02:073194 ASSERT_THAT(mdns_client->StartListening(socket_factory.get()), IsOk());
Eric Orth026776a2019-01-18 00:13:283195 resolver_->SetMdnsClientForTesting(std::move(mdns_client));
3196
3197 std::unique_ptr<HostResolver::MdnsListener> listener =
3198 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 100),
3199 DnsQueryType::A);
3200
3201 TestMdnsListenerDelegate delegate;
3202 ASSERT_THAT(listener->Start(&delegate), IsOk());
3203 ASSERT_THAT(delegate.address_results(), testing::IsEmpty());
3204
3205 socket_factory->SimulateReceive(kMdnsResponseA, sizeof(kMdnsResponseA));
3206
3207 EXPECT_THAT(
3208 delegate.address_results(),
3209 testing::ElementsAre(TestMdnsListenerDelegate::CreateExpectedResult(
3210 HostResolver::MdnsListener::Delegate::UpdateType::ADDED,
3211 DnsQueryType::A, CreateExpected("1.2.3.4", 100))));
3212
3213 clock.Advance(base::TimeDelta::FromSeconds(16));
3214 cache_cleanup_timer_ptr->Fire();
3215
3216 EXPECT_THAT(delegate.address_results(),
3217 testing::ElementsAre(
3218 TestMdnsListenerDelegate::CreateExpectedResult(
3219 HostResolver::MdnsListener::Delegate::UpdateType::ADDED,
3220 DnsQueryType::A, CreateExpected("1.2.3.4", 100)),
3221 TestMdnsListenerDelegate::CreateExpectedResult(
3222 HostResolver::MdnsListener::Delegate::UpdateType::REMOVED,
3223 DnsQueryType::A, CreateExpected("1.2.3.4", 100))));
3224
3225 EXPECT_THAT(delegate.text_results(), testing::IsEmpty());
3226 EXPECT_THAT(delegate.hostname_results(), testing::IsEmpty());
3227 EXPECT_THAT(delegate.unhandled_results(), testing::IsEmpty());
3228}
3229
Eric Orth960e7062019-03-08 18:43:543230TEST_F(HostResolverManagerTest, MdnsListener_Txt) {
Eric Orth026776a2019-01-18 00:13:283231 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3232 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
3233 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
3234
3235 std::unique_ptr<HostResolver::MdnsListener> listener =
3236 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 12),
3237 DnsQueryType::TXT);
3238
3239 TestMdnsListenerDelegate delegate;
3240 ASSERT_THAT(listener->Start(&delegate), IsOk());
3241 ASSERT_THAT(delegate.text_results(), testing::IsEmpty());
3242
3243 socket_factory_ptr->SimulateReceive(kMdnsResponseTxt,
3244 sizeof(kMdnsResponseTxt));
3245
3246 EXPECT_THAT(delegate.text_results(),
3247 testing::ElementsAre(
3248 TestMdnsListenerDelegate::CreateExpectedResult(
3249 HostResolver::MdnsListener::Delegate::UpdateType::ADDED,
3250 DnsQueryType::TXT, "foo"),
3251 TestMdnsListenerDelegate::CreateExpectedResult(
3252 HostResolver::MdnsListener::Delegate::UpdateType::ADDED,
3253 DnsQueryType::TXT, "bar")));
3254
3255 EXPECT_THAT(delegate.address_results(), testing::IsEmpty());
3256 EXPECT_THAT(delegate.hostname_results(), testing::IsEmpty());
3257 EXPECT_THAT(delegate.unhandled_results(), testing::IsEmpty());
3258}
3259
Eric Orth960e7062019-03-08 18:43:543260TEST_F(HostResolverManagerTest, MdnsListener_Ptr) {
Eric Orth026776a2019-01-18 00:13:283261 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3262 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
3263 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
3264
3265 std::unique_ptr<HostResolver::MdnsListener> listener =
3266 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 13),
3267 DnsQueryType::PTR);
3268
3269 TestMdnsListenerDelegate delegate;
3270 ASSERT_THAT(listener->Start(&delegate), IsOk());
3271 ASSERT_THAT(delegate.text_results(), testing::IsEmpty());
3272
3273 socket_factory_ptr->SimulateReceive(kMdnsResponsePtr,
3274 sizeof(kMdnsResponsePtr));
3275
3276 EXPECT_THAT(
3277 delegate.hostname_results(),
3278 testing::ElementsAre(TestMdnsListenerDelegate::CreateExpectedResult(
3279 HostResolver::MdnsListener::Delegate::UpdateType::ADDED,
3280 DnsQueryType::PTR, HostPortPair("foo.com", 13))));
3281
3282 EXPECT_THAT(delegate.address_results(), testing::IsEmpty());
3283 EXPECT_THAT(delegate.text_results(), testing::IsEmpty());
3284 EXPECT_THAT(delegate.unhandled_results(), testing::IsEmpty());
3285}
3286
Eric Orth960e7062019-03-08 18:43:543287TEST_F(HostResolverManagerTest, MdnsListener_Srv) {
Eric Orth026776a2019-01-18 00:13:283288 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3289 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
3290 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
3291
3292 std::unique_ptr<HostResolver::MdnsListener> listener =
3293 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 14),
3294 DnsQueryType::SRV);
3295
3296 TestMdnsListenerDelegate delegate;
3297 ASSERT_THAT(listener->Start(&delegate), IsOk());
3298 ASSERT_THAT(delegate.text_results(), testing::IsEmpty());
3299
3300 socket_factory_ptr->SimulateReceive(kMdnsResponseSrv,
3301 sizeof(kMdnsResponseSrv));
3302
3303 EXPECT_THAT(
3304 delegate.hostname_results(),
3305 testing::ElementsAre(TestMdnsListenerDelegate::CreateExpectedResult(
3306 HostResolver::MdnsListener::Delegate::UpdateType::ADDED,
3307 DnsQueryType::SRV, HostPortPair("foo.com", 8265))));
3308
3309 EXPECT_THAT(delegate.address_results(), testing::IsEmpty());
3310 EXPECT_THAT(delegate.text_results(), testing::IsEmpty());
3311 EXPECT_THAT(delegate.unhandled_results(), testing::IsEmpty());
3312}
3313
3314// Ensure query types we are not listening for do not affect MdnsListener.
Eric Orth960e7062019-03-08 18:43:543315TEST_F(HostResolverManagerTest, MdnsListener_NonListeningTypes) {
Eric Orth026776a2019-01-18 00:13:283316 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3317 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
3318 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
3319
3320 std::unique_ptr<HostResolver::MdnsListener> listener =
3321 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 41),
3322 DnsQueryType::A);
3323
3324 TestMdnsListenerDelegate delegate;
3325 ASSERT_THAT(listener->Start(&delegate), IsOk());
3326
3327 socket_factory_ptr->SimulateReceive(kMdnsResponseAAAA,
3328 sizeof(kMdnsResponseAAAA));
3329
3330 EXPECT_THAT(delegate.address_results(), testing::IsEmpty());
3331 EXPECT_THAT(delegate.text_results(), testing::IsEmpty());
3332 EXPECT_THAT(delegate.hostname_results(), testing::IsEmpty());
3333 EXPECT_THAT(delegate.unhandled_results(), testing::IsEmpty());
3334}
3335
Eric Orth960e7062019-03-08 18:43:543336TEST_F(HostResolverManagerTest, MdnsListener_RootDomain) {
Eric Orth026776a2019-01-18 00:13:283337 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3338 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
3339 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
3340
3341 std::unique_ptr<HostResolver::MdnsListener> listener =
3342 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 5),
3343 DnsQueryType::PTR);
3344
3345 TestMdnsListenerDelegate delegate;
3346 ASSERT_THAT(listener->Start(&delegate), IsOk());
3347
3348 socket_factory_ptr->SimulateReceive(kMdnsResponsePtrRoot,
3349 sizeof(kMdnsResponsePtrRoot));
3350
3351 EXPECT_THAT(delegate.unhandled_results(),
3352 testing::ElementsAre(std::make_pair(
3353 HostResolver::MdnsListener::Delegate::UpdateType::ADDED,
3354 DnsQueryType::PTR)));
3355
3356 EXPECT_THAT(delegate.address_results(), testing::IsEmpty());
3357 EXPECT_THAT(delegate.text_results(), testing::IsEmpty());
3358 EXPECT_THAT(delegate.hostname_results(), testing::IsEmpty());
3359}
Eric Orth9871aafa2018-10-02 19:59:183360#endif // BUILDFLAG(ENABLE_MDNS)
3361
[email protected]78eac2a2012-03-14 19:09:273362DnsConfig CreateValidDnsConfig() {
martijna23c8962016-03-04 18:18:513363 IPAddress dns_ip(192, 168, 1, 0);
[email protected]78eac2a2012-03-14 19:09:273364 DnsConfig config;
[email protected]38b50d92012-04-19 21:07:523365 config.nameservers.push_back(IPEndPoint(dns_ip, dns_protocol::kDefaultPort));
dalyk4f4ac712019-05-31 16:33:133366 config.dns_over_https_servers.push_back({DnsConfig::DnsOverHttpsServerConfig(
3367 "https://dns.example.com/", true /* use_post */)});
3368 config.secure_dns_mode = DnsConfig::SecureDnsMode::OFF;
[email protected]78eac2a2012-03-14 19:09:273369 EXPECT_TRUE(config.IsValid());
3370 return config;
3371}
3372
[email protected]1d932852012-06-19 19:40:333373// Specialized fixture for tests of DnsTask.
Eric Orth960e7062019-03-08 18:43:543374class HostResolverManagerDnsTest : public HostResolverManagerTest {
[email protected]daae1322013-09-05 18:26:503375 public:
Raul Tambre94493c652019-03-11 17:18:353376 HostResolverManagerDnsTest() : dns_client_(nullptr) {}
[email protected]daae1322013-09-05 18:26:503377
[email protected]1d932852012-06-19 19:40:333378 protected:
Miriam Gershenson17acdf092017-08-23 19:43:083379 void TearDown() override {
Eric Orth960e7062019-03-08 18:43:543380 HostResolverManagerTest::TearDown();
Miriam Gershenson17acdf092017-08-23 19:43:083381 ChangeDnsConfig(DnsConfig());
3382 }
3383
Eric Orth960e7062019-03-08 18:43:543384 // HostResolverManagerTest implementation:
Eric Orth4e55b362019-05-07 22:00:033385 HostResolver::ManagerOptions DefaultOptions() override {
3386 HostResolver::ManagerOptions options =
3387 HostResolverManagerTest::DefaultOptions();
3388 options.dns_client_enabled = true;
3389 return options;
3390 }
3391
3392 // Implements HostResolverManager::DnsClientFactory to create a MockDnsClient
3393 // with empty config and default rules.
3394 std::unique_ptr<DnsClient> CreateMockClient(NetLog* net_log) {
3395 auto dns_client =
3396 std::make_unique<MockDnsClient>(DnsConfig(), CreateDefaultDnsRules());
3397 dns_client_ = dns_client.get();
3398 return dns_client;
3399 }
3400
3401 void CreateResolverWithOptionsAndParams(HostResolver::ManagerOptions options,
3402 const ProcTaskParams& params,
3403 bool ipv6_reachable) override {
Eric Orth37b18192019-04-22 19:09:283404 DestroyResolver();
3405
Eric Orth4e55b362019-05-07 22:00:033406 resolver_ = std::make_unique<TestHostResolverManager>(
3407 options, nullptr /* net_log */, ipv6_reachable,
3408 base::BindRepeating(&HostResolverManagerDnsTest::CreateMockClient,
3409 base::Unretained(this)));
[email protected]106ccd2c2014-06-17 09:21:003410 resolver_->set_proc_params_for_test(params);
Eric Orth37b18192019-04-22 19:09:283411
3412 if (host_cache_)
3413 resolver_->AddHostCacheInvalidator(host_cache_->invalidator());
[email protected]1d932852012-06-19 19:40:333414 }
3415
Eric Orth828bd3ae2018-12-12 17:30:363416 // Call after CreateResolver() to update the resolver with a new MockDnsClient
3417 // using |config| and |rules|.
3418 void UseMockDnsClient(const DnsConfig& config, MockDnsClientRuleList rules) {
3419 // HostResolver expects DnsConfig to get set after setting DnsClient, so
3420 // create first with an empty config and then update the config.
3421 auto dns_client =
3422 std::make_unique<MockDnsClient>(DnsConfig(), std::move(rules));
3423 dns_client_ = dns_client.get();
Eric Orth4e55b362019-05-07 22:00:033424 resolver_->SetDnsClientForTesting(std::move(dns_client));
Eric Orth828bd3ae2018-12-12 17:30:363425 if (!config.Equals(DnsConfig()))
3426 ChangeDnsConfig(config);
eroman1efc237c2016-12-14 00:00:453427 }
3428
Eric Orth828bd3ae2018-12-12 17:30:363429 static MockDnsClientRuleList CreateDefaultDnsRules() {
3430 MockDnsClientRuleList rules;
3431
3432 AddDnsRule(&rules, "nodomain", dns_protocol::kTypeA,
dalyk48b20a992019-02-25 16:10:263433 MockDnsClientRule::NODOMAIN, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363434 AddDnsRule(&rules, "nodomain", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:263435 MockDnsClientRule::NODOMAIN, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363436 AddDnsRule(&rules, "nx", dns_protocol::kTypeA, MockDnsClientRule::FAIL,
dalyk48b20a992019-02-25 16:10:263437 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363438 AddDnsRule(&rules, "nx", dns_protocol::kTypeAAAA, MockDnsClientRule::FAIL,
dalyk48b20a992019-02-25 16:10:263439 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363440 AddDnsRule(&rules, "ok", dns_protocol::kTypeA, MockDnsClientRule::OK,
dalyk48b20a992019-02-25 16:10:263441 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363442 AddDnsRule(&rules, "ok", dns_protocol::kTypeAAAA, MockDnsClientRule::OK,
dalyk48b20a992019-02-25 16:10:263443 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363444 AddDnsRule(&rules, "4ok", dns_protocol::kTypeA, MockDnsClientRule::OK,
dalyk48b20a992019-02-25 16:10:263445 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363446 AddDnsRule(&rules, "4ok", dns_protocol::kTypeAAAA, MockDnsClientRule::EMPTY,
dalyk48b20a992019-02-25 16:10:263447 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363448 AddDnsRule(&rules, "6ok", dns_protocol::kTypeA, MockDnsClientRule::EMPTY,
dalyk48b20a992019-02-25 16:10:263449 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363450 AddDnsRule(&rules, "6ok", dns_protocol::kTypeAAAA, MockDnsClientRule::OK,
dalyk48b20a992019-02-25 16:10:263451 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363452 AddDnsRule(&rules, "4nx", dns_protocol::kTypeA, MockDnsClientRule::OK,
dalyk48b20a992019-02-25 16:10:263453 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363454 AddDnsRule(&rules, "4nx", dns_protocol::kTypeAAAA, MockDnsClientRule::FAIL,
dalyk48b20a992019-02-25 16:10:263455 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363456 AddDnsRule(&rules, "empty", dns_protocol::kTypeA, MockDnsClientRule::EMPTY,
dalyk48b20a992019-02-25 16:10:263457 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363458 AddDnsRule(&rules, "empty", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:263459 MockDnsClientRule::EMPTY, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363460
3461 AddDnsRule(&rules, "slow_nx", dns_protocol::kTypeA, MockDnsClientRule::FAIL,
dalyk48b20a992019-02-25 16:10:263462 true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363463 AddDnsRule(&rules, "slow_nx", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:263464 MockDnsClientRule::FAIL, true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363465
3466 AddDnsRule(&rules, "4slow_ok", dns_protocol::kTypeA, MockDnsClientRule::OK,
dalyk48b20a992019-02-25 16:10:263467 true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363468 AddDnsRule(&rules, "4slow_ok", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:263469 MockDnsClientRule::OK, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363470 AddDnsRule(&rules, "6slow_ok", dns_protocol::kTypeA, MockDnsClientRule::OK,
dalyk48b20a992019-02-25 16:10:263471 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363472 AddDnsRule(&rules, "6slow_ok", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:263473 MockDnsClientRule::OK, true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363474 AddDnsRule(&rules, "4slow_4ok", dns_protocol::kTypeA, MockDnsClientRule::OK,
dalyk48b20a992019-02-25 16:10:263475 true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363476 AddDnsRule(&rules, "4slow_4ok", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:263477 MockDnsClientRule::EMPTY, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363478 AddDnsRule(&rules, "4slow_4timeout", dns_protocol::kTypeA,
dalyk48b20a992019-02-25 16:10:263479 MockDnsClientRule::TIMEOUT, true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363480 AddDnsRule(&rules, "4slow_4timeout", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:263481 MockDnsClientRule::OK, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363482 AddDnsRule(&rules, "4slow_6timeout", dns_protocol::kTypeA,
dalyk48b20a992019-02-25 16:10:263483 MockDnsClientRule::OK, true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363484 AddDnsRule(&rules, "4slow_6timeout", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:263485 MockDnsClientRule::TIMEOUT, false /* delay */);
3486
Eric Orth828bd3ae2018-12-12 17:30:363487 AddDnsRule(&rules, "4collision", dns_protocol::kTypeA,
dalyk48b20a992019-02-25 16:10:263488 IPAddress(127, 0, 53, 53), false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363489 AddDnsRule(&rules, "4collision", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:263490 MockDnsClientRule::EMPTY, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363491 AddDnsRule(&rules, "6collision", dns_protocol::kTypeA,
dalyk48b20a992019-02-25 16:10:263492 MockDnsClientRule::EMPTY, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363493 // This isn't the expected IP for collisions (but looks close to it).
3494 AddDnsRule(&rules, "6collision", dns_protocol::kTypeAAAA,
3495 IPAddress(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 0, 53, 53),
dalyk48b20a992019-02-25 16:10:263496 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363497
dalyk4f4ac712019-05-31 16:33:133498 AddSecureDnsRule(&rules, "automatic_nodomain", dns_protocol::kTypeA,
3499 MockDnsClientRule::NODOMAIN, false /* delay */);
3500 AddSecureDnsRule(&rules, "automatic_nodomain", dns_protocol::kTypeAAAA,
3501 MockDnsClientRule::NODOMAIN, false /* delay */);
3502 AddDnsRule(&rules, "automatic_nodomain", dns_protocol::kTypeA,
3503 MockDnsClientRule::NODOMAIN, false /* delay */);
3504 AddDnsRule(&rules, "automatic_nodomain", dns_protocol::kTypeAAAA,
3505 MockDnsClientRule::NODOMAIN, false /* delay */);
3506 AddSecureDnsRule(&rules, "automatic", dns_protocol::kTypeA,
3507 MockDnsClientRule::OK, false /* delay */);
3508 AddSecureDnsRule(&rules, "automatic", dns_protocol::kTypeAAAA,
3509 MockDnsClientRule::OK, false /* delay */);
3510 AddDnsRule(&rules, "automatic", dns_protocol::kTypeA, MockDnsClientRule::OK,
3511 false /* delay */);
3512 AddDnsRule(&rules, "automatic", dns_protocol::kTypeAAAA,
3513 MockDnsClientRule::OK, false /* delay */);
3514 AddDnsRule(&rules, "insecure_automatic", dns_protocol::kTypeA,
3515 MockDnsClientRule::OK, false /* delay */);
3516 AddDnsRule(&rules, "insecure_automatic", dns_protocol::kTypeAAAA,
3517 MockDnsClientRule::OK, false /* delay */);
3518
Eric Orth828bd3ae2018-12-12 17:30:363519 return rules;
eroman1efc237c2016-12-14 00:00:453520 }
3521
Eric Orth828bd3ae2018-12-12 17:30:363522 // Adds a rule to |rules|.
3523 static void AddDnsRule(MockDnsClientRuleList* rules,
3524 const std::string& prefix,
3525 uint16_t qtype,
3526 MockDnsClientRule::ResultType result_type,
3527 bool delay) {
dalyk4f4ac712019-05-31 16:33:133528 rules->emplace_back(prefix, qtype, false /* secure */,
dalykad3f6c32019-03-06 13:38:333529 MockDnsClientRule::Result(result_type), delay);
Eric Orth828bd3ae2018-12-12 17:30:363530 }
3531
3532 static void AddDnsRule(MockDnsClientRuleList* rules,
3533 const std::string& prefix,
3534 uint16_t qtype,
3535 const IPAddress& result_ip,
3536 bool delay) {
dalyk4f4ac712019-05-31 16:33:133537 rules->emplace_back(prefix, qtype, false /* secure */,
Eric Orth828bd3ae2018-12-12 17:30:363538 MockDnsClientRule::Result(
3539 BuildTestDnsResponse(prefix, std::move(result_ip))),
3540 delay);
3541 }
3542
3543 static void AddDnsRule(MockDnsClientRuleList* rules,
3544 const std::string& prefix,
3545 uint16_t qtype,
3546 IPAddress result_ip,
3547 std::string cannonname,
3548 bool delay) {
3549 rules->emplace_back(
dalyk4f4ac712019-05-31 16:33:133550 prefix, qtype, false /* secure */,
dalykc0ab0722019-03-14 17:00:583551 MockDnsClientRule::Result(BuildTestDnsResponseWithCname(
Eric Orth828bd3ae2018-12-12 17:30:363552 prefix, std::move(result_ip), std::move(cannonname))),
3553 delay);
[email protected]0adcb2b2012-08-15 21:30:463554 }
3555
dalyk48b20a992019-02-25 16:10:263556 static void AddSecureDnsRule(MockDnsClientRuleList* rules,
3557 const std::string& prefix,
3558 uint16_t qtype,
3559 MockDnsClientRule::ResultType result_type,
3560 bool delay) {
dalyk4f4ac712019-05-31 16:33:133561 rules->emplace_back(prefix, qtype, true /* secure */,
3562 MockDnsClientRule::Result(result_type), delay);
dalyk48b20a992019-02-25 16:10:263563 }
3564
[email protected]1d932852012-06-19 19:40:333565 void ChangeDnsConfig(const DnsConfig& config) {
[email protected]bb0e34542012-08-31 19:52:403566 NetworkChangeNotifier::SetDnsConfig(config);
3567 // Notification is delivered asynchronously.
fdoray5eeb7642016-06-22 16:11:283568 base::RunLoop().RunUntilIdle();
[email protected]1d932852012-06-19 19:40:333569 }
3570
Miriam Gershenson44aafc122017-10-18 19:29:253571 void SetInitialDnsConfig(const DnsConfig& config) {
John Abd-El-Malek1842b8c2018-05-16 14:53:223572 NetworkChangeNotifier::ClearDnsConfigForTesting();
3573 NetworkChangeNotifier::SetDnsConfig(config);
Miriam Gershenson44aafc122017-10-18 19:29:253574 // Notification is delivered asynchronously.
3575 base::RunLoop().RunUntilIdle();
3576 }
3577
[email protected]daae1322013-09-05 18:26:503578 // Owned by |resolver_|.
3579 MockDnsClient* dns_client_;
[email protected]1d932852012-06-19 19:40:333580};
3581
Eric Orth4e55b362019-05-07 22:00:033582TEST_F(HostResolverManagerDnsTest, DisableAndEnableDnsClient) {
3583 // Disable fallback to allow testing how requests are initially handled.
3584 set_allow_fallback_to_proctask(false);
3585
3586 ChangeDnsConfig(CreateValidDnsConfig());
3587 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.2.47");
3588 proc_->SignalMultiple(1u);
3589
3590 resolver_->SetDnsClientEnabled(false);
3591 ResolveHostResponseHelper response_proc(resolver_->CreateRequest(
3592 HostPortPair("nx_succeed", 1212), NetLogWithSource(), base::nullopt,
3593 request_context_.get(), host_cache_.get()));
3594 EXPECT_THAT(response_proc.result_error(), IsOk());
3595 EXPECT_THAT(response_proc.request()->GetAddressResults().value().endpoints(),
3596 testing::ElementsAre(CreateExpected("192.168.2.47", 1212)));
3597
3598 resolver_->SetDnsClientEnabled(true);
3599 ResolveHostResponseHelper response_dns_client(resolver_->CreateRequest(
3600 HostPortPair("ok_fail", 1212), NetLogWithSource(), base::nullopt,
3601 request_context_.get(), host_cache_.get()));
3602 EXPECT_THAT(response_dns_client.result_error(), IsOk());
3603 EXPECT_THAT(
3604 response_dns_client.request()->GetAddressResults().value().endpoints(),
3605 testing::UnorderedElementsAre(CreateExpected("::1", 1212),
3606 CreateExpected("127.0.0.1", 1212)));
3607}
3608
Mike Westda1c690e2017-08-12 05:57:163609// RFC 6761 localhost names should always resolve to loopback.
Eric Orth960e7062019-03-08 18:43:543610TEST_F(HostResolverManagerDnsTest, LocalhostLookup) {
Mike Westda1c690e2017-08-12 05:57:163611 // Add a rule resolving localhost names to a non-loopback IP and test
3612 // that they still resolves to loopback.
3613 proc_->AddRuleForAllFamilies("foo.localhost", "192.168.1.42");
3614 proc_->AddRuleForAllFamilies("localhost", "192.168.1.42");
3615 proc_->AddRuleForAllFamilies("localhost.", "192.168.1.42");
3616
Eric Orth70992982018-07-24 00:25:003617 ResolveHostResponseHelper response0(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:273618 HostPortPair("foo.localhost", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:153619 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:003620 EXPECT_THAT(response0.result_error(), IsOk());
3621 EXPECT_THAT(response0.request()->GetAddressResults().value().endpoints(),
3622 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
3623 CreateExpected("::1", 80)));
3624
3625 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:273626 HostPortPair("localhost", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:153627 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:003628 EXPECT_THAT(response1.result_error(), IsOk());
3629 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
3630 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
3631 CreateExpected("::1", 80)));
3632
3633 ResolveHostResponseHelper response2(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:273634 HostPortPair("localhost.", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:153635 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:003636 EXPECT_THAT(response2.result_error(), IsOk());
3637 EXPECT_THAT(response2.request()->GetAddressResults().value().endpoints(),
3638 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
3639 CreateExpected("::1", 80)));
3640}
3641
Mike Westda1c690e2017-08-12 05:57:163642// RFC 6761 localhost names should always resolve to loopback, even if a HOSTS
3643// file is active.
Eric Orth960e7062019-03-08 18:43:543644TEST_F(HostResolverManagerDnsTest, LocalhostLookupWithHosts) {
Mike Westda1c690e2017-08-12 05:57:163645 DnsHosts hosts;
3646 hosts[DnsHostsKey("localhost", ADDRESS_FAMILY_IPV4)] =
3647 IPAddress({192, 168, 1, 1});
3648 hosts[DnsHostsKey("foo.localhost", ADDRESS_FAMILY_IPV4)] =
3649 IPAddress({192, 168, 1, 2});
3650
3651 DnsConfig config = CreateValidDnsConfig();
3652 config.hosts = hosts;
3653 ChangeDnsConfig(config);
3654
Eric Orth70992982018-07-24 00:25:003655 ResolveHostResponseHelper response0(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:273656 HostPortPair("localhost", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:153657 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:003658 EXPECT_THAT(response0.result_error(), IsOk());
3659 EXPECT_THAT(response0.request()->GetAddressResults().value().endpoints(),
3660 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
3661 CreateExpected("::1", 80)));
3662
3663 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:273664 HostPortPair("foo.localhost", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:153665 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:003666 EXPECT_THAT(response1.result_error(), IsOk());
3667 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
3668 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
3669 CreateExpected("::1", 80)));
3670}
3671
Eric Orth960e7062019-03-08 18:43:543672// Test successful and fallback resolutions in HostResolverManager::DnsTask.
3673TEST_F(HostResolverManagerDnsTest, DnsTask) {
[email protected]38b50d92012-04-19 21:07:523674 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.102");
3675 // All other hostnames will fail in proc_.
[email protected]78eac2a2012-03-14 19:09:273676
3677 // Initially there is no config, so client should not be invoked.
Eric Orth117e1992019-04-17 00:24:153678 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
3679 HostPortPair("ok_fail", 80), NetLogWithSource(), base::nullopt,
3680 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:003681 EXPECT_FALSE(initial_response.complete());
3682
3683 proc_->SignalMultiple(1u);
3684
3685 EXPECT_THAT(initial_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
3686
3687 ChangeDnsConfig(CreateValidDnsConfig());
3688
Eric Orth117e1992019-04-17 00:24:153689 ResolveHostResponseHelper response0(resolver_->CreateRequest(
3690 HostPortPair("ok_fail", 80), NetLogWithSource(), base::nullopt,
3691 request_context_.get(), host_cache_.get()));
3692 ResolveHostResponseHelper response1(resolver_->CreateRequest(
3693 HostPortPair("nx_fail", 80), NetLogWithSource(), base::nullopt,
3694 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:003695 ResolveHostResponseHelper response2(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:273696 HostPortPair("nx_succeed", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:153697 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:003698
3699 proc_->SignalMultiple(4u);
3700
3701 // Resolved by MockDnsClient.
3702 EXPECT_THAT(response0.result_error(), IsOk());
3703 EXPECT_THAT(response0.request()->GetAddressResults().value().endpoints(),
3704 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
3705 CreateExpected("::1", 80)));
3706
3707 // Fallback to ProcTask.
3708 EXPECT_THAT(response1.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
3709 EXPECT_THAT(response2.result_error(), IsOk());
3710 EXPECT_THAT(response2.request()->GetAddressResults().value().endpoints(),
3711 testing::ElementsAre(CreateExpected("192.168.1.102", 80)));
3712}
3713
Eric Orth960e7062019-03-08 18:43:543714// Test successful and failing resolutions in HostResolverManager::DnsTask when
[email protected]16c2bd72013-06-28 01:19:223715// fallback to ProcTask is disabled.
Eric Orth960e7062019-03-08 18:43:543716TEST_F(HostResolverManagerDnsTest, NoFallbackToProcTask) {
Eric Orth60931742018-11-05 23:40:573717 set_allow_fallback_to_proctask(false);
[email protected]16c2bd72013-06-28 01:19:223718
[email protected]16c2bd72013-06-28 01:19:223719 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.102");
3720 // All other hostnames will fail in proc_.
3721
3722 // Set empty DnsConfig.
3723 ChangeDnsConfig(DnsConfig());
3724 // Initially there is no config, so client should not be invoked.
Eric Orth117e1992019-04-17 00:24:153725 ResolveHostResponseHelper initial_response0(resolver_->CreateRequest(
3726 HostPortPair("ok_fail", 80), NetLogWithSource(), base::nullopt,
3727 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:003728 ResolveHostResponseHelper initial_response1(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:273729 HostPortPair("nx_succeed", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:153730 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:003731 proc_->SignalMultiple(2u);
3732
3733 EXPECT_THAT(initial_response0.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
3734 EXPECT_THAT(initial_response1.result_error(), IsOk());
3735 EXPECT_THAT(
3736 initial_response1.request()->GetAddressResults().value().endpoints(),
3737 testing::ElementsAre(CreateExpected("192.168.1.102", 80)));
3738
3739 ChangeDnsConfig(CreateValidDnsConfig());
3740
Eric Orth117e1992019-04-17 00:24:153741 ResolveHostResponseHelper abort_response0(resolver_->CreateRequest(
3742 HostPortPair("ok_abort", 80), NetLogWithSource(), base::nullopt,
3743 request_context_.get(), host_cache_.get()));
3744 ResolveHostResponseHelper abort_response1(resolver_->CreateRequest(
3745 HostPortPair("nx_abort", 80), NetLogWithSource(), base::nullopt,
3746 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:003747
3748 // Simulate the case when the preference or policy has disabled the DNS
3749 // client causing AbortDnsTasks.
Eric Orth828bd3ae2018-12-12 17:30:363750 UseMockDnsClient(CreateValidDnsConfig(), CreateDefaultDnsRules());
Eric Orth70992982018-07-24 00:25:003751
3752 // First request is resolved by MockDnsClient, others should fail due to
3753 // disabled fallback to ProcTask.
Eric Orth117e1992019-04-17 00:24:153754 ResolveHostResponseHelper response0(resolver_->CreateRequest(
3755 HostPortPair("ok_fail", 80), NetLogWithSource(), base::nullopt,
3756 request_context_.get(), host_cache_.get()));
3757 ResolveHostResponseHelper response1(resolver_->CreateRequest(
3758 HostPortPair("nx_fail", 80), NetLogWithSource(), base::nullopt,
3759 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:003760 proc_->SignalMultiple(6u);
3761
3762 // Aborted due to Network Change.
3763 EXPECT_THAT(abort_response0.result_error(), IsError(ERR_NETWORK_CHANGED));
3764 EXPECT_THAT(abort_response1.result_error(), IsError(ERR_NETWORK_CHANGED));
3765 // Resolved by MockDnsClient.
3766 EXPECT_THAT(response0.result_error(), IsOk());
3767 EXPECT_THAT(response0.request()->GetAddressResults().value().endpoints(),
3768 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
3769 CreateExpected("::1", 80)));
3770 // Fallback to ProcTask is disabled.
3771 EXPECT_THAT(response1.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
3772}
3773
[email protected]16c2bd72013-06-28 01:19:223774// Test behavior of OnDnsTaskFailure when Job is aborted.
Eric Orth960e7062019-03-08 18:43:543775TEST_F(HostResolverManagerDnsTest, OnDnsTaskFailureAbortedJob) {
[email protected]16c2bd72013-06-28 01:19:223776 ChangeDnsConfig(CreateValidDnsConfig());
Eric Orth117e1992019-04-17 00:24:153777 ResolveHostResponseHelper response(resolver_->CreateRequest(
3778 HostPortPair("nx_abort", 80), NetLogWithSource(), base::nullopt,
3779 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:003780 // Abort all jobs here.
3781 CreateResolver();
3782 proc_->SignalMultiple(1u);
3783 // Run to completion.
3784 base::RunLoop().RunUntilIdle(); // Notification happens async.
3785 // It shouldn't crash during OnDnsTaskFailure callbacks.
3786 EXPECT_FALSE(response.complete());
3787
3788 // Repeat test with Fallback to ProcTask disabled
Eric Orth60931742018-11-05 23:40:573789 set_allow_fallback_to_proctask(false);
Eric Orth70992982018-07-24 00:25:003790 ChangeDnsConfig(CreateValidDnsConfig());
Eric Orth117e1992019-04-17 00:24:153791 ResolveHostResponseHelper no_fallback_response(resolver_->CreateRequest(
3792 HostPortPair("nx_abort", 80), NetLogWithSource(), base::nullopt,
3793 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:003794 // Abort all jobs here.
3795 CreateResolver();
3796 proc_->SignalMultiple(2u);
3797 // Run to completion.
3798 base::RunLoop().RunUntilIdle(); // Notification happens async.
3799 // It shouldn't crash during OnDnsTaskFailure callbacks.
3800 EXPECT_FALSE(no_fallback_response.complete());
3801}
3802
Eric Orth60931742018-11-05 23:40:573803// Fallback to proc allowed with ANY source.
Eric Orth960e7062019-03-08 18:43:543804TEST_F(HostResolverManagerDnsTest, FallbackBySource_Any) {
Eric Orth60931742018-11-05 23:40:573805 // Ensure fallback is otherwise allowed by resolver settings.
3806 set_allow_fallback_to_proctask(true);
3807
3808 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.102");
3809 // All other hostnames will fail in proc_.
3810
3811 ChangeDnsConfig(CreateValidDnsConfig());
3812
Eric Orth117e1992019-04-17 00:24:153813 ResolveHostResponseHelper response0(resolver_->CreateRequest(
3814 HostPortPair("nx_fail", 80), NetLogWithSource(), base::nullopt,
3815 request_context_.get(), host_cache_.get()));
Eric Orth60931742018-11-05 23:40:573816 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:273817 HostPortPair("nx_succeed", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:153818 request_context_.get(), host_cache_.get()));
Eric Orth60931742018-11-05 23:40:573819 proc_->SignalMultiple(2u);
3820
3821 EXPECT_THAT(response0.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
3822 EXPECT_THAT(response1.result_error(), IsOk());
3823 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
3824 testing::ElementsAre(CreateExpected("192.168.1.102", 80)));
3825}
3826
3827// Fallback to proc not allowed with DNS source.
Eric Orth960e7062019-03-08 18:43:543828TEST_F(HostResolverManagerDnsTest, FallbackBySource_Dns) {
Eric Orth60931742018-11-05 23:40:573829 // Ensure fallback is otherwise allowed by resolver settings.
3830 set_allow_fallback_to_proctask(true);
3831
3832 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.102");
3833 // All other hostnames will fail in proc_.
3834
3835 ChangeDnsConfig(CreateValidDnsConfig());
3836
3837 HostResolver::ResolveHostParameters parameters;
3838 parameters.source = HostResolverSource::DNS;
Eric Orth117e1992019-04-17 00:24:153839 ResolveHostResponseHelper response0(resolver_->CreateRequest(
3840 HostPortPair("nx_fail", 80), NetLogWithSource(), parameters,
3841 request_context_.get(), host_cache_.get()));
Eric Orth60931742018-11-05 23:40:573842 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:273843 HostPortPair("nx_succeed", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:153844 request_context_.get(), host_cache_.get()));
Eric Orth60931742018-11-05 23:40:573845 // Nothing should reach |proc_| on success, but let failures through to fail
3846 // instead of hanging.
3847 proc_->SignalMultiple(2u);
3848
3849 EXPECT_THAT(response0.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
3850 EXPECT_THAT(response1.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
3851}
3852
3853// Fallback to proc on DnsClient change allowed with ANY source.
Eric Orth960e7062019-03-08 18:43:543854TEST_F(HostResolverManagerDnsTest, FallbackOnAbortBySource_Any) {
Eric Orth60931742018-11-05 23:40:573855 // Ensure fallback is otherwise allowed by resolver settings.
3856 set_allow_fallback_to_proctask(true);
3857
3858 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.102");
3859 // All other hostnames will fail in proc_.
3860
3861 ChangeDnsConfig(CreateValidDnsConfig());
3862
Eric Orth117e1992019-04-17 00:24:153863 ResolveHostResponseHelper response0(resolver_->CreateRequest(
3864 HostPortPair("ok_fail", 80), NetLogWithSource(), base::nullopt,
3865 request_context_.get(), host_cache_.get()));
Eric Orth60931742018-11-05 23:40:573866 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:273867 HostPortPair("nx_succeed", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:153868 request_context_.get(), host_cache_.get()));
Eric Orth60931742018-11-05 23:40:573869 proc_->SignalMultiple(2u);
3870
3871 // Simulate the case when the preference or policy has disabled the DNS client
3872 // causing AbortDnsTasks.
Eric Orth4e55b362019-05-07 22:00:033873 resolver_->SetDnsClientEnabled(false);
Eric Orth60931742018-11-05 23:40:573874
3875 // All requests should fallback to proc resolver.
3876 EXPECT_THAT(response0.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
3877 EXPECT_THAT(response1.result_error(), IsOk());
3878 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
3879 testing::ElementsAre(CreateExpected("192.168.1.102", 80)));
3880}
3881
3882// Fallback to proc on DnsClient change not allowed with DNS source.
Eric Orth960e7062019-03-08 18:43:543883TEST_F(HostResolverManagerDnsTest, FallbackOnAbortBySource_Dns) {
Eric Orth60931742018-11-05 23:40:573884 // Ensure fallback is otherwise allowed by resolver settings.
3885 set_allow_fallback_to_proctask(true);
3886
3887 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.102");
3888 // All other hostnames will fail in proc_.
3889
3890 ChangeDnsConfig(CreateValidDnsConfig());
3891
3892 HostResolver::ResolveHostParameters parameters;
3893 parameters.source = HostResolverSource::DNS;
Eric Orth117e1992019-04-17 00:24:153894 ResolveHostResponseHelper response0(resolver_->CreateRequest(
3895 HostPortPair("ok_fail", 80), NetLogWithSource(), parameters,
3896 request_context_.get(), host_cache_.get()));
Eric Orth60931742018-11-05 23:40:573897 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:273898 HostPortPair("nx_succeed", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:153899 request_context_.get(), host_cache_.get()));
Eric Orth60931742018-11-05 23:40:573900 // Nothing should reach |proc_| on success, but let failures through to fail
3901 // instead of hanging.
3902 proc_->SignalMultiple(2u);
3903
3904 // Simulate the case when the preference or policy has disabled the DNS client
3905 // causing AbortDnsTasks.
Eric Orth4e55b362019-05-07 22:00:033906 resolver_->SetDnsClientEnabled(false);
Eric Orth60931742018-11-05 23:40:573907
3908 // No fallback expected. All requests should fail.
3909 EXPECT_THAT(response0.result_error(), IsError(ERR_NETWORK_CHANGED));
3910 EXPECT_THAT(response1.result_error(), IsError(ERR_NETWORK_CHANGED));
3911}
3912
Eric Orth960e7062019-03-08 18:43:543913TEST_F(HostResolverManagerDnsTest, DnsTaskUnspec) {
[email protected]0adcb2b2012-08-15 21:30:463914 ChangeDnsConfig(CreateValidDnsConfig());
3915
3916 proc_->AddRuleForAllFamilies("4nx", "192.168.1.101");
3917 // All other hostnames will fail in proc_.
3918
Eric Orth70992982018-07-24 00:25:003919 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:153920 responses.emplace_back(
3921 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
3922 HostPortPair("ok", 80), NetLogWithSource(), base::nullopt,
3923 request_context_.get(), host_cache_.get())));
3924 responses.emplace_back(
3925 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
3926 HostPortPair("4ok", 80), NetLogWithSource(), base::nullopt,
3927 request_context_.get(), host_cache_.get())));
3928 responses.emplace_back(
3929 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
3930 HostPortPair("6ok", 80), NetLogWithSource(), base::nullopt,
3931 request_context_.get(), host_cache_.get())));
3932 responses.emplace_back(
3933 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
3934 HostPortPair("4nx", 80), NetLogWithSource(), base::nullopt,
3935 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:003936
3937 proc_->SignalMultiple(4u);
3938
3939 for (auto& response : responses) {
3940 EXPECT_THAT(response->result_error(), IsOk());
3941 }
3942
3943 EXPECT_THAT(responses[0]->request()->GetAddressResults().value().endpoints(),
3944 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
3945 CreateExpected("::1", 80)));
3946 EXPECT_THAT(responses[1]->request()->GetAddressResults().value().endpoints(),
3947 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
3948 EXPECT_THAT(responses[2]->request()->GetAddressResults().value().endpoints(),
3949 testing::ElementsAre(CreateExpected("::1", 80)));
3950 EXPECT_THAT(responses[3]->request()->GetAddressResults().value().endpoints(),
3951 testing::ElementsAre(CreateExpected("192.168.1.101", 80)));
3952}
3953
Eric Orth960e7062019-03-08 18:43:543954TEST_F(HostResolverManagerDnsTest, NameCollisionIcann) {
eroman1efc237c2016-12-14 00:00:453955 ChangeDnsConfig(CreateValidDnsConfig());
3956
Eric Orth70992982018-07-24 00:25:003957 // When the resolver returns an A record with 127.0.53.53 it should be
3958 // mapped to a special error.
3959 ResolveHostResponseHelper response_ipv4(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:273960 HostPortPair("4collision", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:153961 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:003962 EXPECT_THAT(response_ipv4.result_error(), IsError(ERR_ICANN_NAME_COLLISION));
3963 EXPECT_FALSE(response_ipv4.request()->GetAddressResults());
3964
3965 // When the resolver returns an AAAA record with ::127.0.53.53 it should
3966 // work just like any other IP. (Despite having the same suffix, it is not
3967 // considered special)
3968 ResolveHostResponseHelper response_ipv6(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:273969 HostPortPair("6collision", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:153970 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:003971 EXPECT_THAT(response_ipv6.result_error(), IsOk());
3972 EXPECT_THAT(response_ipv6.request()->GetAddressResults().value().endpoints(),
3973 testing::ElementsAre(CreateExpected("::127.0.53.53", 80)));
3974}
3975
Eric Orth960e7062019-03-08 18:43:543976TEST_F(HostResolverManagerDnsTest, ServeFromHosts) {
[email protected]d7b9a2b2012-05-31 22:31:193977 // Initially, use empty HOSTS file.
[email protected]bb0e34542012-08-31 19:52:403978 DnsConfig config = CreateValidDnsConfig();
3979 ChangeDnsConfig(config);
[email protected]d7b9a2b2012-05-31 22:31:193980
[email protected]007b3f82013-04-09 08:46:453981 proc_->AddRuleForAllFamilies(std::string(),
3982 std::string()); // Default to failures.
[email protected]38b50d92012-04-19 21:07:523983 proc_->SignalMultiple(1u); // For the first request which misses.
[email protected]78eac2a2012-03-14 19:09:273984
Eric Orth117e1992019-04-17 00:24:153985 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
3986 HostPortPair("nx_ipv4", 80), NetLogWithSource(), base::nullopt,
3987 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:003988 EXPECT_THAT(initial_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
3989
3990 IPAddress local_ipv4 = IPAddress::IPv4Localhost();
3991 IPAddress local_ipv6 = IPAddress::IPv6Localhost();
3992
3993 DnsHosts hosts;
3994 hosts[DnsHostsKey("nx_ipv4", ADDRESS_FAMILY_IPV4)] = local_ipv4;
3995 hosts[DnsHostsKey("nx_ipv6", ADDRESS_FAMILY_IPV6)] = local_ipv6;
3996 hosts[DnsHostsKey("nx_both", ADDRESS_FAMILY_IPV4)] = local_ipv4;
3997 hosts[DnsHostsKey("nx_both", ADDRESS_FAMILY_IPV6)] = local_ipv6;
3998
3999 // Update HOSTS file.
4000 config.hosts = hosts;
4001 ChangeDnsConfig(config);
4002
Eric Orth117e1992019-04-17 00:24:154003 ResolveHostResponseHelper response_ipv4(resolver_->CreateRequest(
4004 HostPortPair("nx_ipv4", 80), NetLogWithSource(), base::nullopt,
4005 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004006 EXPECT_THAT(response_ipv4.result_error(), IsOk());
4007 EXPECT_THAT(response_ipv4.request()->GetAddressResults().value().endpoints(),
4008 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
4009
Eric Orth117e1992019-04-17 00:24:154010 ResolveHostResponseHelper response_ipv6(resolver_->CreateRequest(
4011 HostPortPair("nx_ipv6", 80), NetLogWithSource(), base::nullopt,
4012 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004013 EXPECT_THAT(response_ipv6.result_error(), IsOk());
4014 EXPECT_THAT(response_ipv6.request()->GetAddressResults().value().endpoints(),
4015 testing::ElementsAre(CreateExpected("::1", 80)));
4016
Eric Orth117e1992019-04-17 00:24:154017 ResolveHostResponseHelper response_both(resolver_->CreateRequest(
4018 HostPortPair("nx_both", 80), NetLogWithSource(), base::nullopt,
4019 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004020 EXPECT_THAT(response_both.result_error(), IsOk());
4021 EXPECT_THAT(response_both.request()->GetAddressResults().value().endpoints(),
4022 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4023 CreateExpected("::1", 80)));
4024
Eric Orth00fe5a62018-08-15 22:20:004025 // Requests with specified DNS query type.
4026 HostResolver::ResolveHostParameters parameters;
4027
Eric Orth192e3bb2018-11-14 19:30:324028 parameters.dns_query_type = DnsQueryType::A;
Eric Orth117e1992019-04-17 00:24:154029 ResolveHostResponseHelper response_specified_ipv4(resolver_->CreateRequest(
4030 HostPortPair("nx_ipv4", 80), NetLogWithSource(), parameters,
4031 request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:004032 EXPECT_THAT(response_specified_ipv4.result_error(), IsOk());
4033 EXPECT_THAT(response_specified_ipv4.request()
4034 ->GetAddressResults()
4035 .value()
4036 .endpoints(),
4037 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
4038
Eric Orth192e3bb2018-11-14 19:30:324039 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth117e1992019-04-17 00:24:154040 ResolveHostResponseHelper response_specified_ipv6(resolver_->CreateRequest(
4041 HostPortPair("nx_ipv6", 80), NetLogWithSource(), parameters,
4042 request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:004043 EXPECT_THAT(response_specified_ipv6.result_error(), IsOk());
4044 EXPECT_THAT(response_specified_ipv6.request()
4045 ->GetAddressResults()
4046 .value()
4047 .endpoints(),
4048 testing::ElementsAre(CreateExpected("::1", 80)));
4049
Eric Orth70992982018-07-24 00:25:004050 // Request with upper case.
Eric Orth117e1992019-04-17 00:24:154051 ResolveHostResponseHelper response_upper(resolver_->CreateRequest(
4052 HostPortPair("nx_IPV4", 80), NetLogWithSource(), base::nullopt,
4053 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004054 EXPECT_THAT(response_upper.result_error(), IsOk());
4055 EXPECT_THAT(response_upper.request()->GetAddressResults().value().endpoints(),
4056 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
4057}
4058
Eric Orthdc35748e2018-08-23 22:41:484059// Test that hosts ending in ".local" or ".local." are resolved using the system
4060// resolver.
Eric Orth960e7062019-03-08 18:43:544061TEST_F(HostResolverManagerDnsTest, BypassDnsTask) {
Eric Orth70992982018-07-24 00:25:004062 ChangeDnsConfig(CreateValidDnsConfig());
4063
4064 proc_->AddRuleForAllFamilies(std::string(),
4065 std::string()); // Default to failures.
4066
4067 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
4068
Eric Orth117e1992019-04-17 00:24:154069 responses.emplace_back(
4070 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
4071 HostPortPair("ok.local", 80), NetLogWithSource(), base::nullopt,
4072 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:004073 responses.emplace_back(
4074 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:274075 HostPortPair("ok.local.", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:154076 request_context_.get(), host_cache_.get())));
4077 responses.emplace_back(
4078 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
4079 HostPortPair("oklocal", 80), NetLogWithSource(), base::nullopt,
4080 request_context_.get(), host_cache_.get())));
4081 responses.emplace_back(
4082 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
4083 HostPortPair("oklocal.", 80), NetLogWithSource(), base::nullopt,
4084 request_context_.get(), host_cache_.get())));
4085 responses.emplace_back(
4086 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
4087 HostPortPair("ok", 80), NetLogWithSource(), base::nullopt,
4088 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:004089
4090 proc_->SignalMultiple(5u);
4091
4092 for (size_t i = 0; i < 2; ++i)
4093 EXPECT_THAT(responses[i]->result_error(), IsError(ERR_NAME_NOT_RESOLVED));
4094
4095 for (size_t i = 2; i < responses.size(); ++i)
4096 EXPECT_THAT(responses[i]->result_error(), IsOk());
4097}
4098
Eric Orth828bd3ae2018-12-12 17:30:364099#if BUILDFLAG(ENABLE_MDNS)
4100// Test that non-address queries for hosts ending in ".local" are resolved using
4101// the MDNS resolver.
Eric Orth960e7062019-03-08 18:43:544102TEST_F(HostResolverManagerDnsTest, BypassDnsToMdnsWithNonAddress) {
Eric Orth828bd3ae2018-12-12 17:30:364103 // Ensure DNS task and system (proc) requests will fail.
4104 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:134105 rules.emplace_back(
4106 "myhello.local", dns_protocol::kTypeTXT, false /* secure */,
4107 MockDnsClientRule::Result(MockDnsClientRule::FAIL), false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:364108 CreateResolver();
4109 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
4110 proc_->AddRuleForAllFamilies(std::string(), std::string());
4111
4112 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
4113 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
4114 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
4115 // 2 socket creations for every transaction.
4116 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(2);
4117
4118 HostResolver::ResolveHostParameters dns_parameters;
4119 dns_parameters.dns_query_type = DnsQueryType::TXT;
4120
4121 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:274122 HostPortPair("myhello.local", 80), NetLogWithSource(), dns_parameters,
Eric Orth117e1992019-04-17 00:24:154123 request_context_.get(), host_cache_.get()));
Eric Orth828bd3ae2018-12-12 17:30:364124
4125 socket_factory_ptr->SimulateReceive(kMdnsResponseTxt,
4126 sizeof(kMdnsResponseTxt));
4127 proc_->SignalMultiple(1u);
4128
4129 EXPECT_THAT(response.result_error(), IsOk());
4130 EXPECT_THAT(response.request()->GetTextResults(),
4131 testing::Optional(testing::ElementsAre("foo", "bar")));
4132}
4133#endif // BUILDFLAG(ENABLE_MDNS)
4134
Eric Orthdc35748e2018-08-23 22:41:484135// Test that DNS task is always used when explicitly requested as the source,
4136// even with a case that would normally bypass it eg hosts ending in ".local".
Eric Orth960e7062019-03-08 18:43:544137TEST_F(HostResolverManagerDnsTest, DnsNotBypassedWhenDnsSource) {
Eric Orthdc35748e2018-08-23 22:41:484138 // Ensure DNS task requests will succeed and system (proc) requests will fail.
4139 ChangeDnsConfig(CreateValidDnsConfig());
4140 proc_->AddRuleForAllFamilies(std::string(), std::string());
4141
4142 HostResolver::ResolveHostParameters dns_parameters;
4143 dns_parameters.source = HostResolverSource::DNS;
4144
Eric Orth117e1992019-04-17 00:24:154145 ResolveHostResponseHelper dns_response(resolver_->CreateRequest(
4146 HostPortPair("ok", 80), NetLogWithSource(), dns_parameters,
4147 request_context_.get(), host_cache_.get()));
4148 ResolveHostResponseHelper dns_local_response(resolver_->CreateRequest(
4149 HostPortPair("ok.local", 80), NetLogWithSource(), dns_parameters,
4150 request_context_.get(), host_cache_.get()));
4151 ResolveHostResponseHelper normal_local_response(resolver_->CreateRequest(
4152 HostPortPair("ok.local", 80), NetLogWithSource(), base::nullopt,
4153 request_context_.get(), host_cache_.get()));
Eric Orthdc35748e2018-08-23 22:41:484154
4155 proc_->SignalMultiple(3u);
4156
4157 EXPECT_THAT(dns_response.result_error(), IsOk());
4158 EXPECT_THAT(dns_local_response.result_error(), IsOk());
4159 EXPECT_THAT(normal_local_response.result_error(),
4160 IsError(ERR_NAME_NOT_RESOLVED));
4161}
4162
Eric Orth960e7062019-03-08 18:43:544163TEST_F(HostResolverManagerDnsTest, SystemOnlyBypassesDnsTask) {
Eric Orthdc35748e2018-08-23 22:41:484164 // Ensure DNS task requests will succeed and system (proc) requests will fail.
4165 ChangeDnsConfig(CreateValidDnsConfig());
4166 proc_->AddRuleForAllFamilies(std::string(), std::string());
4167
Eric Orth117e1992019-04-17 00:24:154168 ResolveHostResponseHelper dns_response(resolver_->CreateRequest(
4169 HostPortPair("ok", 80), NetLogWithSource(), base::nullopt,
4170 request_context_.get(), host_cache_.get()));
Eric Orthdc35748e2018-08-23 22:41:484171
4172 HostResolver::ResolveHostParameters parameters;
4173 parameters.source = HostResolverSource::SYSTEM;
Eric Orth117e1992019-04-17 00:24:154174 ResolveHostResponseHelper system_response(resolver_->CreateRequest(
4175 HostPortPair("ok", 80), NetLogWithSource(), parameters,
4176 request_context_.get(), host_cache_.get()));
Eric Orthdc35748e2018-08-23 22:41:484177
4178 proc_->SignalMultiple(2u);
4179
4180 EXPECT_THAT(dns_response.result_error(), IsOk());
4181 EXPECT_THAT(system_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
4182}
4183
Eric Orth960e7062019-03-08 18:43:544184TEST_F(HostResolverManagerDnsTest, DisableDnsClientOnPersistentFailure) {
[email protected]f0f602bd2012-11-15 18:01:024185 ChangeDnsConfig(CreateValidDnsConfig());
4186
[email protected]007b3f82013-04-09 08:46:454187 proc_->AddRuleForAllFamilies(std::string(),
4188 std::string()); // Default to failures.
[email protected]f0f602bd2012-11-15 18:01:024189
4190 // Check that DnsTask works.
Eric Orth117e1992019-04-17 00:24:154191 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
4192 HostPortPair("ok_1", 80), NetLogWithSource(), base::nullopt,
4193 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004194 EXPECT_THAT(initial_response.result_error(), IsOk());
4195
4196 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
4197 for (unsigned i = 0; i < maximum_dns_failures(); ++i) {
4198 // Use custom names to require separate Jobs.
4199 std::string hostname = base::StringPrintf("nx_%u", i);
4200 // Ensure fallback to ProcTask succeeds.
4201 proc_->AddRuleForAllFamilies(hostname, "192.168.1.101");
Eric Orth117e1992019-04-17 00:24:154202 responses.emplace_back(
4203 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
4204 HostPortPair(hostname, 80), NetLogWithSource(), base::nullopt,
4205 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:004206 }
4207
4208 proc_->SignalMultiple(responses.size());
4209
4210 for (size_t i = 0; i < responses.size(); ++i)
4211 EXPECT_THAT(responses[i]->result_error(), IsOk());
4212
4213 ASSERT_FALSE(proc_->HasBlockedRequests());
4214
Eric Orth60931742018-11-05 23:40:574215 // DnsTask should be disabled by now unless explictly requested via |source|.
Eric Orth117e1992019-04-17 00:24:154216 ResolveHostResponseHelper fail_response(resolver_->CreateRequest(
4217 HostPortPair("ok_2", 80), NetLogWithSource(), base::nullopt,
4218 request_context_.get(), host_cache_.get()));
Eric Orth60931742018-11-05 23:40:574219 HostResolver::ResolveHostParameters parameters;
4220 parameters.source = HostResolverSource::DNS;
Eric Orth117e1992019-04-17 00:24:154221 ResolveHostResponseHelper dns_response(resolver_->CreateRequest(
4222 HostPortPair("ok_2", 80), NetLogWithSource(), parameters,
4223 request_context_.get(), host_cache_.get()));
Eric Orth60931742018-11-05 23:40:574224 proc_->SignalMultiple(2u);
Eric Orth70992982018-07-24 00:25:004225 EXPECT_THAT(fail_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
Eric Orth60931742018-11-05 23:40:574226 EXPECT_THAT(dns_response.result_error(), IsOk());
Eric Orth70992982018-07-24 00:25:004227
4228 // Check that it is re-enabled after DNS change.
4229 ChangeDnsConfig(CreateValidDnsConfig());
Eric Orth117e1992019-04-17 00:24:154230 ResolveHostResponseHelper reenabled_response(resolver_->CreateRequest(
4231 HostPortPair("ok_3", 80), NetLogWithSource(), base::nullopt,
4232 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004233 EXPECT_THAT(reenabled_response.result_error(), IsOk());
4234}
4235
Eric Orth960e7062019-03-08 18:43:544236TEST_F(HostResolverManagerDnsTest, DontDisableDnsClientOnSporadicFailure) {
[email protected]f0f602bd2012-11-15 18:01:024237 ChangeDnsConfig(CreateValidDnsConfig());
4238
4239 // |proc_| defaults to successes.
4240
4241 // 20 failures interleaved with 20 successes.
Eric Orth70992982018-07-24 00:25:004242 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
4243 for (unsigned i = 0; i < 40; ++i) {
4244 // Use custom names to require separate Jobs.
4245 std::string hostname = (i % 2) == 0 ? base::StringPrintf("nx_%u", i)
4246 : base::StringPrintf("ok_%u", i);
Eric Orth117e1992019-04-17 00:24:154247 responses.emplace_back(
4248 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
4249 HostPortPair(hostname, 80), NetLogWithSource(), base::nullopt,
4250 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:004251 }
4252
4253 proc_->SignalMultiple(40u);
4254
Eric Orth26fa08e2019-02-22 01:28:374255 for (const auto& response : responses)
4256 EXPECT_THAT(response->result_error(), IsOk());
Eric Orth70992982018-07-24 00:25:004257
4258 // Make |proc_| default to failures.
4259 proc_->AddRuleForAllFamilies(std::string(), std::string());
4260
4261 // DnsTask should still be enabled.
Eric Orth117e1992019-04-17 00:24:154262 ResolveHostResponseHelper final_response(resolver_->CreateRequest(
4263 HostPortPair("ok_last", 80), NetLogWithSource(), base::nullopt,
4264 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004265 EXPECT_THAT(final_response.result_error(), IsOk());
4266}
4267
[email protected]ec666ab22013-04-17 20:05:594268// Confirm that resolving "localhost" is unrestricted even if there are no
4269// global IPv6 address. See SystemHostResolverCall for rationale.
4270// Test both the DnsClient and system host resolver paths.
Eric Orth960e7062019-03-08 18:43:544271TEST_F(HostResolverManagerDnsTest, DualFamilyLocalhost) {
Eric Orth70992982018-07-24 00:25:004272 CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:324273 false /* ipv6_reachable */,
4274 true /* check_ipv6_on_wifi */);
Eric Orth70992982018-07-24 00:25:004275
4276 // Make request fail if we actually get to the system resolver.
4277 proc_->AddRuleForAllFamilies(std::string(), std::string());
4278
4279 // Try without DnsClient.
Eric Orth4e55b362019-05-07 22:00:034280 resolver_->SetDnsClientEnabled(false);
Eric Orth70992982018-07-24 00:25:004281 ResolveHostResponseHelper system_response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:274282 HostPortPair("localhost", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:154283 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004284 EXPECT_THAT(system_response.result_error(), IsOk());
4285 EXPECT_THAT(
4286 system_response.request()->GetAddressResults().value().endpoints(),
4287 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4288 CreateExpected("::1", 80)));
4289
4290 // With DnsClient
Eric Orth828bd3ae2018-12-12 17:30:364291 UseMockDnsClient(CreateValidDnsConfig(), CreateDefaultDnsRules());
Eric Orth70992982018-07-24 00:25:004292 ResolveHostResponseHelper builtin_response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:274293 HostPortPair("localhost", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:154294 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004295 EXPECT_THAT(builtin_response.result_error(), IsOk());
4296 EXPECT_THAT(
4297 builtin_response.request()->GetAddressResults().value().endpoints(),
4298 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4299 CreateExpected("::1", 80)));
4300
4301 // DnsClient configured without ipv6 (but ipv6 should still work for
4302 // localhost).
4303 DnsConfig config = CreateValidDnsConfig();
4304 config.use_local_ipv6 = false;
4305 ChangeDnsConfig(config);
4306 ResolveHostResponseHelper ipv6_disabled_response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:274307 HostPortPair("localhost", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:154308 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004309 EXPECT_THAT(ipv6_disabled_response.result_error(), IsOk());
4310 EXPECT_THAT(
4311 ipv6_disabled_response.request()->GetAddressResults().value().endpoints(),
4312 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4313 CreateExpected("::1", 80)));
4314}
4315
[email protected]daae1322013-09-05 18:26:504316// Cancel a request with a single DNS transaction active.
Eric Orth960e7062019-03-08 18:43:544317TEST_F(HostResolverManagerDnsTest, CancelWithOneTransactionActive) {
Eric Orth70992982018-07-24 00:25:004318 // Disable ipv6 to ensure we'll only try a single transaction for the host.
4319 CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:324320 false /* ipv6_reachable */,
4321 true /* check_ipv6_on_wifi */);
Eric Orth70992982018-07-24 00:25:004322 DnsConfig config = CreateValidDnsConfig();
4323 config.use_local_ipv6 = false;
4324 ChangeDnsConfig(config);
4325
Eric Orth117e1992019-04-17 00:24:154326 ResolveHostResponseHelper response(resolver_->CreateRequest(
4327 HostPortPair("ok", 80), NetLogWithSource(), base::nullopt,
4328 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004329 ASSERT_FALSE(response.complete());
4330 ASSERT_EQ(1u, num_running_dispatcher_jobs());
4331
4332 response.CancelRequest();
4333 base::RunLoop().RunUntilIdle();
4334 EXPECT_FALSE(response.complete());
4335
4336 // Dispatcher state checked in TearDown.
4337}
4338
[email protected]daae1322013-09-05 18:26:504339// Cancel a request with a single DNS transaction active and another pending.
Eric Orth960e7062019-03-08 18:43:544340TEST_F(HostResolverManagerDnsTest, CancelWithOneTransactionActiveOnePending) {
[email protected]daae1322013-09-05 18:26:504341 CreateSerialResolver();
[email protected]daae1322013-09-05 18:26:504342 ChangeDnsConfig(CreateValidDnsConfig());
4343
Eric Orth117e1992019-04-17 00:24:154344 ResolveHostResponseHelper response(resolver_->CreateRequest(
4345 HostPortPair("ok", 80), NetLogWithSource(), base::nullopt,
4346 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004347 EXPECT_EQ(1u, num_running_dispatcher_jobs());
4348
4349 response.CancelRequest();
4350 base::RunLoop().RunUntilIdle();
4351 EXPECT_FALSE(response.complete());
4352
4353 // Dispatcher state checked in TearDown.
4354}
4355
[email protected]daae1322013-09-05 18:26:504356// Cancel a request with two DNS transactions active.
Eric Orth960e7062019-03-08 18:43:544357TEST_F(HostResolverManagerDnsTest, CancelWithTwoTransactionsActive) {
[email protected]daae1322013-09-05 18:26:504358 ChangeDnsConfig(CreateValidDnsConfig());
4359
Eric Orth117e1992019-04-17 00:24:154360 ResolveHostResponseHelper response(resolver_->CreateRequest(
4361 HostPortPair("ok", 80), NetLogWithSource(), base::nullopt,
4362 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004363 EXPECT_EQ(2u, num_running_dispatcher_jobs());
4364
4365 response.CancelRequest();
4366 base::RunLoop().RunUntilIdle();
4367 EXPECT_FALSE(response.complete());
4368
4369 // Dispatcher state checked in TearDown.
4370}
4371
[email protected]daae1322013-09-05 18:26:504372// Delete a resolver with some active requests and some queued requests.
Eric Orth960e7062019-03-08 18:43:544373TEST_F(HostResolverManagerDnsTest, DeleteWithActiveTransactions) {
[email protected]daae1322013-09-05 18:26:504374 // At most 10 Jobs active at once.
Eric Orth70992982018-07-24 00:25:004375 CreateResolverWithLimitsAndParams(10u, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:324376 true /* ipv6_reachable */,
4377 true /* check_ipv6_on_wifi */);
[email protected]daae1322013-09-05 18:26:504378
[email protected]daae1322013-09-05 18:26:504379 ChangeDnsConfig(CreateValidDnsConfig());
4380
Eric Orth70992982018-07-24 00:25:004381 // Add 12 DNS lookups (creating well more than 10 transaction).
4382 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
4383 for (int i = 0; i < 12; ++i) {
4384 std::string hostname = base::StringPrintf("ok%i", i);
Eric Orth117e1992019-04-17 00:24:154385 responses.emplace_back(
4386 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
4387 HostPortPair(hostname, 80), NetLogWithSource(), base::nullopt,
4388 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:004389 }
4390 EXPECT_EQ(10u, num_running_dispatcher_jobs());
4391
Eric Orth37b18192019-04-22 19:09:284392 DestroyResolver();
Eric Orth70992982018-07-24 00:25:004393
4394 base::RunLoop().RunUntilIdle();
4395 for (auto& response : responses) {
4396 EXPECT_FALSE(response->complete());
4397 }
4398}
4399
Eric Orth5233c3a2019-04-08 17:01:144400TEST_F(HostResolverManagerDnsTest, DeleteWithCompletedRequests) {
4401 ChangeDnsConfig(CreateValidDnsConfig());
4402
Eric Orth117e1992019-04-17 00:24:154403 ResolveHostResponseHelper response(resolver_->CreateRequest(
4404 HostPortPair("ok", 80), NetLogWithSource(), base::nullopt,
4405 request_context_.get(), host_cache_.get()));
Eric Orth5233c3a2019-04-08 17:01:144406
4407 EXPECT_THAT(response.result_error(), IsOk());
4408 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
4409 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4410 CreateExpected("::1", 80)));
4411
Eric Orth37b18192019-04-22 19:09:284412 DestroyResolver();
Eric Orth5233c3a2019-04-08 17:01:144413
4414 // Completed requests should be unaffected by manager destruction.
4415 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
4416 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4417 CreateExpected("::1", 80)));
4418}
4419
4420TEST_F(HostResolverManagerDnsTest, ExplicitCancel) {
4421 ChangeDnsConfig(CreateValidDnsConfig());
4422
4423 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:274424 HostPortPair("4slow_4ok", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:154425 request_context_.get(), host_cache_.get()));
Eric Orth5233c3a2019-04-08 17:01:144426
4427 response.request()->Cancel();
4428 dns_client_->CompleteDelayedTransactions();
4429
4430 base::RunLoop().RunUntilIdle();
4431 EXPECT_FALSE(response.complete());
4432}
4433
4434TEST_F(HostResolverManagerDnsTest, ExplicitCancel_Completed) {
4435 ChangeDnsConfig(CreateValidDnsConfig());
4436
Eric Orth117e1992019-04-17 00:24:154437 ResolveHostResponseHelper response(resolver_->CreateRequest(
4438 HostPortPair("ok", 80), NetLogWithSource(), base::nullopt,
4439 request_context_.get(), host_cache_.get()));
Eric Orth5233c3a2019-04-08 17:01:144440
4441 EXPECT_THAT(response.result_error(), IsOk());
4442 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
4443 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4444 CreateExpected("::1", 80)));
4445
4446 response.request()->Cancel();
4447
4448 // Completed requests should be unaffected by cancellation.
4449 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
4450 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4451 CreateExpected("::1", 80)));
4452}
4453
[email protected]daae1322013-09-05 18:26:504454// Cancel a request with only the IPv6 transaction active.
Eric Orth960e7062019-03-08 18:43:544455TEST_F(HostResolverManagerDnsTest, CancelWithIPv6TransactionActive) {
[email protected]daae1322013-09-05 18:26:504456 ChangeDnsConfig(CreateValidDnsConfig());
4457
Eric Orth117e1992019-04-17 00:24:154458 ResolveHostResponseHelper response(resolver_->CreateRequest(
4459 HostPortPair("6slow_ok", 80), NetLogWithSource(), base::nullopt,
4460 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004461 EXPECT_EQ(2u, num_running_dispatcher_jobs());
4462
4463 // The IPv4 request should complete, the IPv6 request is still pending.
4464 base::RunLoop().RunUntilIdle();
4465 EXPECT_EQ(1u, num_running_dispatcher_jobs());
4466
4467 response.CancelRequest();
4468 base::RunLoop().RunUntilIdle();
4469 EXPECT_FALSE(response.complete());
4470
4471 // Dispatcher state checked in TearDown.
4472}
4473
[email protected]daae1322013-09-05 18:26:504474// Cancel a request with only the IPv4 transaction pending.
Eric Orth960e7062019-03-08 18:43:544475TEST_F(HostResolverManagerDnsTest, CancelWithIPv4TransactionPending) {
Eric Orth60931742018-11-05 23:40:574476 set_allow_fallback_to_proctask(false);
[email protected]daae1322013-09-05 18:26:504477 ChangeDnsConfig(CreateValidDnsConfig());
4478
Eric Orth117e1992019-04-17 00:24:154479 ResolveHostResponseHelper response(resolver_->CreateRequest(
4480 HostPortPair("4slow_ok", 80), NetLogWithSource(), base::nullopt,
4481 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004482 EXPECT_EQ(2u, num_running_dispatcher_jobs());
4483
4484 // The IPv6 request should complete, the IPv4 request is still pending.
4485 base::RunLoop().RunUntilIdle();
4486 EXPECT_EQ(1u, num_running_dispatcher_jobs());
4487
4488 response.CancelRequest();
4489 base::RunLoop().RunUntilIdle();
4490 EXPECT_FALSE(response.complete());
4491}
4492
dalyk4f4ac712019-05-31 16:33:134493TEST_F(HostResolverManagerDnsTest, CancelWithAutomaticModeTransactionPending) {
4494 MockDnsClientRuleList rules;
4495 rules.emplace_back("secure_6slow_6nx_insecure_6slow_ok", dns_protocol::kTypeA,
4496 true /* secure */,
4497 MockDnsClientRule::Result(MockDnsClientRule::OK),
4498 false /* delay */);
4499 rules.emplace_back("secure_6slow_6nx_insecure_6slow_ok",
4500 dns_protocol::kTypeAAAA, true /* secure */,
4501 MockDnsClientRule::Result(MockDnsClientRule::FAIL),
4502 true /* delay */);
4503 rules.emplace_back("secure_6slow_6nx_insecure_6slow_ok", dns_protocol::kTypeA,
4504 false /* secure */,
4505 MockDnsClientRule::Result(MockDnsClientRule::OK),
4506 false /* delay */);
4507 rules.emplace_back("secure_6slow_6nx_insecure_6slow_ok",
4508 dns_protocol::kTypeAAAA, false /* secure */,
4509 MockDnsClientRule::Result(MockDnsClientRule::OK),
4510 true /* delay */);
4511 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
4512
4513 DnsConfigOverrides overrides;
4514 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
4515 resolver_->SetDnsConfigOverrides(overrides);
4516
4517 ResolveHostResponseHelper response0(resolver_->CreateRequest(
4518 HostPortPair("secure_6slow_6nx_insecure_6slow_ok", 80),
4519 NetLogWithSource(), base::nullopt, request_context_.get(),
4520 host_cache_.get()));
4521 EXPECT_EQ(2u, num_running_dispatcher_jobs());
4522
4523 // The secure IPv4 request should complete, the secure IPv6 request is still
4524 // pending.
4525 base::RunLoop().RunUntilIdle();
4526 EXPECT_EQ(1u, num_running_dispatcher_jobs());
4527
4528 response0.CancelRequest();
4529 base::RunLoop().RunUntilIdle();
4530 EXPECT_FALSE(response0.complete());
4531 EXPECT_EQ(0u, num_running_dispatcher_jobs());
4532
4533 ResolveHostResponseHelper response1(resolver_->CreateRequest(
4534 HostPortPair("secure_6slow_6nx_insecure_6slow_ok", 80),
4535 NetLogWithSource(), base::nullopt, request_context_.get(),
4536 host_cache_.get()));
4537 EXPECT_EQ(2u, num_running_dispatcher_jobs());
4538
4539 // The secure IPv4 request should complete, the secure IPv6 request is still
4540 // pending.
4541 base::RunLoop().RunUntilIdle();
4542 EXPECT_EQ(1u, num_running_dispatcher_jobs());
4543
4544 // Let the secure IPv6 request complete and start the insecure requests.
4545 dns_client_->CompleteDelayedTransactions();
4546 EXPECT_EQ(2u, num_running_dispatcher_jobs());
4547
4548 // The insecure IPv4 request should complete, the insecure IPv6 request is
4549 // still pending.
4550 base::RunLoop().RunUntilIdle();
4551 EXPECT_EQ(1u, num_running_dispatcher_jobs());
4552
4553 response1.CancelRequest();
4554 base::RunLoop().RunUntilIdle();
4555 EXPECT_FALSE(response1.complete());
4556
4557 // Dispatcher state checked in TearDown.
4558}
4559
[email protected]daae1322013-09-05 18:26:504560// Test cases where AAAA completes first.
Eric Orth960e7062019-03-08 18:43:544561TEST_F(HostResolverManagerDnsTest, AAAACompletesFirst) {
Eric Orth60931742018-11-05 23:40:574562 set_allow_fallback_to_proctask(false);
[email protected]daae1322013-09-05 18:26:504563 ChangeDnsConfig(CreateValidDnsConfig());
4564
Eric Orth70992982018-07-24 00:25:004565 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:154566 responses.emplace_back(
4567 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
4568 HostPortPair("4slow_ok", 80), NetLogWithSource(), base::nullopt,
4569 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:004570 responses.emplace_back(
4571 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:274572 HostPortPair("4slow_4ok", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:154573 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:004574 responses.emplace_back(
4575 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:274576 HostPortPair("4slow_4timeout", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:154577 request_context_.get(), host_cache_.get())));
Eric Orth6f1c5172019-04-16 17:08:274578 responses.emplace_back(
4579 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
4580 HostPortPair("4slow_6timeout", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:154581 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:004582
4583 base::RunLoop().RunUntilIdle();
4584 EXPECT_FALSE(responses[0]->complete());
4585 EXPECT_FALSE(responses[1]->complete());
4586 EXPECT_FALSE(responses[2]->complete());
4587 // The IPv6 of request 3 should have failed and resulted in cancelling the
4588 // IPv4 request.
4589 EXPECT_THAT(responses[3]->result_error(), IsError(ERR_DNS_TIMED_OUT));
4590 EXPECT_EQ(3u, num_running_dispatcher_jobs());
4591
4592 dns_client_->CompleteDelayedTransactions();
4593 EXPECT_THAT(responses[0]->result_error(), IsOk());
4594 EXPECT_THAT(responses[0]->request()->GetAddressResults().value().endpoints(),
4595 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4596 CreateExpected("::1", 80)));
4597
4598 EXPECT_THAT(responses[1]->result_error(), IsOk());
4599 EXPECT_THAT(responses[1]->request()->GetAddressResults().value().endpoints(),
4600 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
4601
4602 EXPECT_THAT(responses[2]->result_error(), IsError(ERR_DNS_TIMED_OUT));
4603}
4604
dalyk4f4ac712019-05-31 16:33:134605TEST_F(HostResolverManagerDnsTest, AAAACompletesFirst_AutomaticMode) {
dalyk48b20a992019-02-25 16:10:264606 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:134607 rules.emplace_back("secure_slow_nx_insecure_4slow_ok", dns_protocol::kTypeA,
4608 true /* secure */,
4609 MockDnsClientRule::Result(MockDnsClientRule::FAIL),
4610 true /* delay */);
4611 rules.emplace_back("secure_slow_nx_insecure_4slow_ok",
4612 dns_protocol::kTypeAAAA, true /* secure */,
4613 MockDnsClientRule::Result(MockDnsClientRule::FAIL),
4614 true /* delay */);
4615 rules.emplace_back("secure_slow_nx_insecure_4slow_ok", dns_protocol::kTypeA,
4616 false /* secure */,
4617 MockDnsClientRule::Result(MockDnsClientRule::OK),
4618 true /* delay */);
4619 rules.emplace_back("secure_slow_nx_insecure_4slow_ok",
4620 dns_protocol::kTypeAAAA, false /* secure */,
4621 MockDnsClientRule::Result(MockDnsClientRule::EMPTY),
4622 false /* delay */);
dalyk48b20a992019-02-25 16:10:264623 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
dalyk4f4ac712019-05-31 16:33:134624 DnsConfigOverrides overrides;
4625 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
4626 resolver_->SetDnsConfigOverrides(overrides);
dalyk48b20a992019-02-25 16:10:264627
dalyk4f4ac712019-05-31 16:33:134628 ResolveHostResponseHelper response(resolver_->CreateRequest(
4629 HostPortPair("secure_slow_nx_insecure_4slow_ok", 80), NetLogWithSource(),
4630 base::nullopt, request_context_.get(), host_cache_.get()));
dalyk48b20a992019-02-25 16:10:264631 base::RunLoop().RunUntilIdle();
dalyk4f4ac712019-05-31 16:33:134632 EXPECT_FALSE(response.complete());
4633 // Complete the secure transactions.
dalyk48b20a992019-02-25 16:10:264634 dns_client_->CompleteDelayedTransactions();
dalyk4f4ac712019-05-31 16:33:134635 base::RunLoop().RunUntilIdle();
4636 EXPECT_FALSE(response.complete());
4637 // Complete the insecure transactions.
4638 dns_client_->CompleteDelayedTransactions();
4639 ASSERT_THAT(response.result_error(), IsOk());
4640 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
4641 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
4642 HostCache::Key insecure_key = HostCache::Key(
4643 "secure_slow_nx_insecure_4slow_ok", DnsQueryType::UNSPECIFIED,
4644 0 /* host_resolver_flags */, HostResolverSource::ANY);
4645 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result =
4646 GetCacheHit(insecure_key);
4647 EXPECT_TRUE(!!cache_result);
4648}
4649
4650TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Automatic) {
4651 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.100");
4652 set_allow_fallback_to_proctask(true);
4653
4654 ChangeDnsConfig(CreateValidDnsConfig());
4655 DnsConfigOverrides overrides;
4656 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
4657 resolver_->SetDnsConfigOverrides(overrides);
dalyk48b20a992019-02-25 16:10:264658 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result;
4659
dalyk4f4ac712019-05-31 16:33:134660 // A successful DoH request should result in a secure cache entry.
4661 ResolveHostResponseHelper response_secure(resolver_->CreateRequest(
4662 HostPortPair("automatic", 80), NetLogWithSource(), base::nullopt,
4663 request_context_.get(), host_cache_.get()));
4664 ASSERT_THAT(response_secure.result_error(), IsOk());
4665 EXPECT_THAT(
4666 response_secure.request()->GetAddressResults().value().endpoints(),
4667 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4668 CreateExpected("::1", 80)));
4669 HostCache::Key secure_key =
4670 HostCache::Key("automatic", DnsQueryType::UNSPECIFIED,
4671 0 /* host_resolver_flags */, HostResolverSource::ANY);
4672 secure_key.secure = true;
4673 cache_result = GetCacheHit(secure_key);
4674 EXPECT_TRUE(!!cache_result);
4675
4676 // A successful plaintext DNS request should result in an insecure cache
4677 // entry.
4678 ResolveHostResponseHelper response_insecure(resolver_->CreateRequest(
4679 HostPortPair("insecure_automatic", 80), NetLogWithSource(), base::nullopt,
4680 request_context_.get(), host_cache_.get()));
4681 ASSERT_THAT(response_insecure.result_error(), IsOk());
4682 EXPECT_THAT(
4683 response_insecure.request()->GetAddressResults().value().endpoints(),
4684 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4685 CreateExpected("::1", 80)));
4686 HostCache::Key insecure_key =
4687 HostCache::Key("insecure_automatic", DnsQueryType::UNSPECIFIED,
4688 0 /* host_resolver_flags */, HostResolverSource::ANY);
4689 cache_result = GetCacheHit(insecure_key);
4690 EXPECT_TRUE(!!cache_result);
4691
4692 // Fallback to ProcTask allowed in AUTOMATIC mode.
4693 ResolveHostResponseHelper response_proc(resolver_->CreateRequest(
4694 HostPortPair("nx_succeed", 80), NetLogWithSource(), base::nullopt,
4695 request_context_.get(), host_cache_.get()));
4696 proc_->SignalMultiple(1u);
4697 EXPECT_THAT(response_proc.result_error(), IsOk());
4698 EXPECT_THAT(response_proc.request()->GetAddressResults().value().endpoints(),
4699 testing::ElementsAre(CreateExpected("192.168.1.100", 80)));
4700}
4701
4702TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Automatic_Downgrade) {
4703 ChangeDnsConfig(CreateValidDnsConfig());
4704 // Remove all DoH servers from the config so there is no DoH server available.
4705 DnsConfigOverrides overrides;
4706 std::vector<DnsConfig::DnsOverHttpsServerConfig> doh_servers;
4707 overrides.dns_over_https_servers = doh_servers;
4708 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
4709 resolver_->SetDnsConfigOverrides(overrides);
4710 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result;
4711
4712 // The DnsConfig doesn't contain DoH servers so AUTOMATIC mode will be
4713 // downgraded to OFF. A successful plaintext DNS request should result in an
4714 // insecure cache entry.
4715 ResolveHostResponseHelper response(resolver_->CreateRequest(
4716 HostPortPair("automatic", 80), NetLogWithSource(), base::nullopt,
4717 request_context_.get(), host_cache_.get()));
4718 ASSERT_THAT(response.result_error(), IsOk());
4719 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
dalyk48b20a992019-02-25 16:10:264720 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4721 CreateExpected("::1", 80)));
4722 HostCache::Key key =
dalyk4f4ac712019-05-31 16:33:134723 HostCache::Key("automatic", DnsQueryType::UNSPECIFIED,
dalyk48b20a992019-02-25 16:10:264724 0 /* host_resolver_flags */, HostResolverSource::ANY);
dalyk48b20a992019-02-25 16:10:264725 cache_result = GetCacheHit(key);
4726 EXPECT_TRUE(!!cache_result);
dalyk4f4ac712019-05-31 16:33:134727}
dalyk48b20a992019-02-25 16:10:264728
dalyk4f4ac712019-05-31 16:33:134729TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Secure) {
4730 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.100");
4731 set_allow_fallback_to_proctask(true);
4732
4733 MockDnsClientRuleList rules;
4734 rules.emplace_back("secure", dns_protocol::kTypeA, true /* secure */,
4735 MockDnsClientRule::Result(MockDnsClientRule::OK),
4736 false /* delay */);
4737 rules.emplace_back("secure", dns_protocol::kTypeAAAA, true /* secure */,
4738 MockDnsClientRule::Result(MockDnsClientRule::OK),
4739 false /* delay */);
4740 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
4741 DnsConfigOverrides overrides;
4742 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::SECURE;
4743 resolver_->SetDnsConfigOverrides(overrides);
4744 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result;
4745
4746 ResolveHostResponseHelper response_secure(resolver_->CreateRequest(
4747 HostPortPair("secure", 80), NetLogWithSource(), base::nullopt,
4748 request_context_.get(), host_cache_.get()));
4749 ASSERT_THAT(response_secure.result_error(), IsOk());
4750 HostCache::Key secure_key =
4751 HostCache::Key("secure", DnsQueryType::UNSPECIFIED,
4752 0 /* host_resolver_flags */, HostResolverSource::ANY);
4753 secure_key.secure = true;
4754 cache_result = GetCacheHit(secure_key);
dalyk48b20a992019-02-25 16:10:264755 EXPECT_TRUE(!!cache_result);
4756
dalyk4f4ac712019-05-31 16:33:134757 ResolveHostResponseHelper response_insecure(resolver_->CreateRequest(
4758 HostPortPair("ok", 80), NetLogWithSource(), base::nullopt,
4759 request_context_.get(), host_cache_.get()));
4760 ASSERT_THAT(response_insecure.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
4761 HostCache::Key insecure_key =
4762 HostCache::Key("ok", DnsQueryType::UNSPECIFIED,
4763 0 /* host_resolver_flags */, HostResolverSource::ANY);
4764 cache_result = GetCacheHit(insecure_key);
4765 EXPECT_FALSE(!!cache_result);
dalyk48b20a992019-02-25 16:10:264766
dalyk4f4ac712019-05-31 16:33:134767 // Fallback to ProcTask not allowed in SECURE mode.
4768 ResolveHostResponseHelper response_proc(resolver_->CreateRequest(
4769 HostPortPair("nx_succeed", 80), NetLogWithSource(), base::nullopt,
4770 request_context_.get(), host_cache_.get()));
4771 proc_->SignalMultiple(1u);
4772 EXPECT_THAT(response_proc.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
dalyk48b20a992019-02-25 16:10:264773}
4774
[email protected]daae1322013-09-05 18:26:504775// Test the case where only a single transaction slot is available.
Eric Orth960e7062019-03-08 18:43:544776TEST_F(HostResolverManagerDnsTest, SerialResolver) {
[email protected]daae1322013-09-05 18:26:504777 CreateSerialResolver();
Eric Orth60931742018-11-05 23:40:574778 set_allow_fallback_to_proctask(false);
[email protected]daae1322013-09-05 18:26:504779 ChangeDnsConfig(CreateValidDnsConfig());
4780
Eric Orth117e1992019-04-17 00:24:154781 ResolveHostResponseHelper response(resolver_->CreateRequest(
4782 HostPortPair("ok", 80), NetLogWithSource(), base::nullopt,
4783 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004784 EXPECT_FALSE(response.complete());
4785 EXPECT_EQ(1u, num_running_dispatcher_jobs());
4786
4787 base::RunLoop().RunUntilIdle();
4788 EXPECT_TRUE(response.complete());
4789 EXPECT_THAT(response.result_error(), IsOk());
4790 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
4791 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4792 CreateExpected("::1", 80)));
4793}
4794
dalyk4f4ac712019-05-31 16:33:134795TEST_F(HostResolverManagerDnsTest, SerialResolver_AutomaticMode) {
4796 CreateSerialResolver();
4797 ChangeDnsConfig(CreateValidDnsConfig());
4798 DnsConfigOverrides overrides;
4799 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
4800 resolver_->SetDnsConfigOverrides(overrides);
4801
4802 ResolveHostResponseHelper response(resolver_->CreateRequest(
4803 HostPortPair("insecure_automatic", 80), NetLogWithSource(), base::nullopt,
4804 request_context_.get(), host_cache_.get()));
4805 EXPECT_FALSE(response.complete());
4806 EXPECT_EQ(1u, num_running_dispatcher_jobs());
4807
4808 base::RunLoop().RunUntilIdle();
4809 EXPECT_TRUE(response.complete());
4810 EXPECT_THAT(response.result_error(), IsOk());
4811 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
4812 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4813 CreateExpected("::1", 80)));
4814 HostCache::Key insecure_key =
4815 HostCache::Key("insecure_automatic", DnsQueryType::UNSPECIFIED,
4816 0 /* host_resolver_flags */, HostResolverSource::ANY);
4817 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result =
4818 GetCacheHit(insecure_key);
4819 EXPECT_TRUE(!!cache_result);
4820}
4821
Eric Orth70992982018-07-24 00:25:004822// Test the case where subsequent transactions are handled on transaction
4823// completion when only part of a multi-transaction request could be initially
4824// started.
Eric Orth960e7062019-03-08 18:43:544825TEST_F(HostResolverManagerDnsTest, AAAAStartsAfterOtherJobFinishes) {
Eric Orth70992982018-07-24 00:25:004826 CreateResolverWithLimitsAndParams(3u, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:324827 true /* ipv6_reachable */,
4828 true /* check_ipv6_on_wifi */);
Eric Orth60931742018-11-05 23:40:574829 set_allow_fallback_to_proctask(false);
Eric Orth70992982018-07-24 00:25:004830 ChangeDnsConfig(CreateValidDnsConfig());
4831
Eric Orth117e1992019-04-17 00:24:154832 ResolveHostResponseHelper response0(resolver_->CreateRequest(
4833 HostPortPair("ok", 80), NetLogWithSource(), base::nullopt,
4834 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004835 EXPECT_EQ(2u, num_running_dispatcher_jobs());
Eric Orth117e1992019-04-17 00:24:154836 ResolveHostResponseHelper response1(resolver_->CreateRequest(
4837 HostPortPair("4slow_ok", 80), NetLogWithSource(), base::nullopt,
4838 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004839 EXPECT_EQ(3u, num_running_dispatcher_jobs());
4840
4841 // Request 0's transactions should complete, starting Request 1's second
4842 // transaction, which should also complete.
4843 base::RunLoop().RunUntilIdle();
4844 EXPECT_EQ(1u, num_running_dispatcher_jobs());
4845 EXPECT_TRUE(response0.complete());
4846 EXPECT_FALSE(response1.complete());
4847
4848 dns_client_->CompleteDelayedTransactions();
4849 EXPECT_THAT(response1.result_error(), IsOk());
4850 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
4851 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4852 CreateExpected("::1", 80)));
4853}
4854
[email protected]daae1322013-09-05 18:26:504855// Tests the case that a Job with a single transaction receives an empty address
4856// list, triggering fallback to ProcTask.
Eric Orth960e7062019-03-08 18:43:544857TEST_F(HostResolverManagerDnsTest, IPv4EmptyFallback) {
Eric Orth70992982018-07-24 00:25:004858 // Disable ipv6 to ensure we'll only try a single transaction for the host.
4859 CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:324860 false /* ipv6_reachable */,
4861 true /* check_ipv6_on_wifi */);
Eric Orth70992982018-07-24 00:25:004862 DnsConfig config = CreateValidDnsConfig();
4863 config.use_local_ipv6 = false;
4864 ChangeDnsConfig(config);
4865
Eric Orth322af3e42018-08-20 18:12:594866 proc_->AddRuleForAllFamilies("empty_fallback", "192.168.0.1",
4867 HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6);
Eric Orth70992982018-07-24 00:25:004868 proc_->SignalMultiple(1u);
4869
4870 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:274871 HostPortPair("empty_fallback", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:154872 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004873 EXPECT_THAT(response.result_error(), IsOk());
4874 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
4875 testing::ElementsAre(CreateExpected("192.168.0.1", 80)));
4876}
4877
[email protected]daae1322013-09-05 18:26:504878// Tests the case that a Job with two transactions receives two empty address
4879// lists, triggering fallback to ProcTask.
Eric Orth960e7062019-03-08 18:43:544880TEST_F(HostResolverManagerDnsTest, UnspecEmptyFallback) {
[email protected]daae1322013-09-05 18:26:504881 ChangeDnsConfig(CreateValidDnsConfig());
4882 proc_->AddRuleForAllFamilies("empty_fallback", "192.168.0.1");
4883 proc_->SignalMultiple(1u);
Eric Orth70992982018-07-24 00:25:004884
4885 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:274886 HostPortPair("empty_fallback", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:154887 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004888
4889 EXPECT_THAT(response.result_error(), IsOk());
4890 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
4891 testing::ElementsAre(CreateExpected("192.168.0.1", 80)));
4892}
4893
[email protected]daae1322013-09-05 18:26:504894// Tests getting a new invalid DnsConfig while there are active DnsTasks.
Eric Orth960e7062019-03-08 18:43:544895TEST_F(HostResolverManagerDnsTest, InvalidDnsConfigWithPendingRequests) {
Eric Orth70992982018-07-24 00:25:004896 // At most 3 jobs active at once. This number is important, since we want
Eric Orth960e7062019-03-08 18:43:544897 // to make sure that aborting the first HostResolverManager::Job does not
Eric Orth70992982018-07-24 00:25:004898 // trigger another DnsTransaction on the second Job when it releases its
4899 // second prioritized dispatcher slot.
4900 CreateResolverWithLimitsAndParams(3u, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:324901 true /* ipv6_reachable */,
4902 true /* check_ipv6_on_wifi */);
Eric Orth70992982018-07-24 00:25:004903
4904 ChangeDnsConfig(CreateValidDnsConfig());
4905
4906 proc_->AddRuleForAllFamilies("slow_nx1", "192.168.0.1");
4907 proc_->AddRuleForAllFamilies("slow_nx2", "192.168.0.2");
4908 proc_->AddRuleForAllFamilies("ok", "192.168.0.3");
4909
4910 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
4911 // First active job gets two slots.
Eric Orth117e1992019-04-17 00:24:154912 responses.emplace_back(
4913 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
4914 HostPortPair("slow_nx1", 80), NetLogWithSource(), base::nullopt,
4915 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:004916 // Next job gets one slot, and waits on another.
Eric Orth117e1992019-04-17 00:24:154917 responses.emplace_back(
4918 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
4919 HostPortPair("slow_nx2", 80), NetLogWithSource(), base::nullopt,
4920 request_context_.get(), host_cache_.get())));
4921 responses.emplace_back(
4922 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
4923 HostPortPair("ok", 80), NetLogWithSource(), base::nullopt,
4924 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:004925
4926 EXPECT_EQ(3u, num_running_dispatcher_jobs());
4927 for (auto& response : responses) {
4928 EXPECT_FALSE(response->complete());
4929 }
4930
dalyk4f4ac712019-05-31 16:33:134931 // Clear DNS config. Fully in-progress, partially in-progress, and queued
4932 // requests should all be aborted.
Eric Orth70992982018-07-24 00:25:004933 ChangeDnsConfig(DnsConfig());
dalyk4f4ac712019-05-31 16:33:134934 for (auto& response : responses) {
4935 EXPECT_THAT(response->result_error(), IsError(ERR_NETWORK_CHANGED));
4936 }
Eric Orth70992982018-07-24 00:25:004937}
4938
Eric Orth70992982018-07-24 00:25:004939// Test that initial DNS config read signals do not abort pending requests
4940// when using DnsClient.
Eric Orth960e7062019-03-08 18:43:544941TEST_F(HostResolverManagerDnsTest, DontAbortOnInitialDNSConfigRead) {
Eric Orth70992982018-07-24 00:25:004942 // DnsClient is enabled, but there's no DnsConfig, so the request should start
4943 // using ProcTask.
Eric Orth117e1992019-04-17 00:24:154944 ResolveHostResponseHelper response(resolver_->CreateRequest(
4945 HostPortPair("host1", 70), NetLogWithSource(), base::nullopt,
4946 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004947 EXPECT_FALSE(response.complete());
4948
4949 EXPECT_TRUE(proc_->WaitFor(1u));
4950 // Send the initial config read signal, with a valid config.
4951 SetInitialDnsConfig(CreateValidDnsConfig());
4952 proc_->SignalAll();
4953
4954 EXPECT_THAT(response.result_error(), IsOk());
4955}
4956
[email protected]daae1322013-09-05 18:26:504957// Tests the case that DnsClient is automatically disabled due to failures
4958// while there are active DnsTasks.
Eric Orth960e7062019-03-08 18:43:544959TEST_F(HostResolverManagerDnsTest,
[email protected]daae1322013-09-05 18:26:504960 AutomaticallyDisableDnsClientWithPendingRequests) {
4961 // Trying different limits is important for this test: Different limits
4962 // result in different behavior when aborting in-progress DnsTasks. Having
4963 // a DnsTask that has one job active and one in the queue when another job
4964 // occupying two slots has its DnsTask aborted is the case most likely to run
Eric Orth60931742018-11-05 23:40:574965 // into problems. Try limits between [1, 2 * # of non failure requests].
4966 for (size_t limit = 1u; limit < 10u; ++limit) {
Eric Orth70992982018-07-24 00:25:004967 CreateResolverWithLimitsAndParams(limit, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:324968 true /* ipv6_reachable */,
4969 true /* check_ipv6_on_wifi */);
Eric Orth70992982018-07-24 00:25:004970
4971 ChangeDnsConfig(CreateValidDnsConfig());
4972
4973 // Queue up enough failures to disable DnsTasks. These will all fall back
4974 // to ProcTasks, and succeed there.
4975 std::vector<std::unique_ptr<ResolveHostResponseHelper>> failure_responses;
4976 for (unsigned i = 0u; i < maximum_dns_failures(); ++i) {
4977 std::string host = base::StringPrintf("nx%u", i);
4978 proc_->AddRuleForAllFamilies(host, "192.168.0.1");
4979 failure_responses.emplace_back(
4980 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:274981 HostPortPair(host, 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:154982 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:004983 EXPECT_FALSE(failure_responses[i]->complete());
4984 }
4985
4986 // These requests should all bypass DnsTasks, due to the above failures,
4987 // so should end up using ProcTasks.
4988 proc_->AddRuleForAllFamilies("slow_ok1", "192.168.0.2");
4989 ResolveHostResponseHelper response0(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:274990 HostPortPair("slow_ok1", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:154991 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004992 EXPECT_FALSE(response0.complete());
4993 proc_->AddRuleForAllFamilies("slow_ok2", "192.168.0.3");
4994 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:274995 HostPortPair("slow_ok2", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:154996 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004997 EXPECT_FALSE(response1.complete());
4998 proc_->AddRuleForAllFamilies("slow_ok3", "192.168.0.4");
4999 ResolveHostResponseHelper response2(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:275000 HostPortPair("slow_ok3", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:155001 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:005002 EXPECT_FALSE(response2.complete());
5003
Eric Orth60931742018-11-05 23:40:575004 // Requests specifying DNS source cannot fallback to ProcTask, so they
5005 // should be unaffected.
5006 HostResolver::ResolveHostParameters parameters;
5007 parameters.source = HostResolverSource::DNS;
5008 ResolveHostResponseHelper response_dns(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:275009 HostPortPair("4slow_ok", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:155010 request_context_.get(), host_cache_.get()));
Eric Orth60931742018-11-05 23:40:575011 EXPECT_FALSE(response_dns.complete());
5012
5013 // Requests specifying SYSTEM source should be unaffected by disabling
5014 // DnsClient.
5015 proc_->AddRuleForAllFamilies("nx_ok", "192.168.0.5");
5016 parameters.source = HostResolverSource::SYSTEM;
Eric Orth117e1992019-04-17 00:24:155017 ResolveHostResponseHelper response_system(resolver_->CreateRequest(
5018 HostPortPair("nx_ok", 80), NetLogWithSource(), parameters,
5019 request_context_.get(), host_cache_.get()));
Eric Orth60931742018-11-05 23:40:575020 EXPECT_FALSE(response_system.complete());
5021
5022 proc_->SignalMultiple(maximum_dns_failures() + 5);
Eric Orth70992982018-07-24 00:25:005023
5024 for (size_t i = 0u; i < maximum_dns_failures(); ++i) {
5025 EXPECT_THAT(failure_responses[i]->result_error(), IsOk());
5026 EXPECT_THAT(failure_responses[i]
5027 ->request()
5028 ->GetAddressResults()
5029 .value()
5030 .endpoints(),
5031 testing::ElementsAre(CreateExpected("192.168.0.1", 80)));
5032 }
5033
5034 EXPECT_THAT(response0.result_error(), IsOk());
5035 EXPECT_THAT(response0.request()->GetAddressResults().value().endpoints(),
5036 testing::ElementsAre(CreateExpected("192.168.0.2", 80)));
5037 EXPECT_THAT(response1.result_error(), IsOk());
5038 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
5039 testing::ElementsAre(CreateExpected("192.168.0.3", 80)));
5040 EXPECT_THAT(response2.result_error(), IsOk());
5041 EXPECT_THAT(response2.request()->GetAddressResults().value().endpoints(),
5042 testing::ElementsAre(CreateExpected("192.168.0.4", 80)));
Eric Orth60931742018-11-05 23:40:575043
5044 dns_client_->CompleteDelayedTransactions();
5045 EXPECT_THAT(response_dns.result_error(), IsOk());
5046
5047 EXPECT_THAT(response_system.result_error(), IsOk());
5048 EXPECT_THAT(
5049 response_system.request()->GetAddressResults().value().endpoints(),
5050 testing::ElementsAre(CreateExpected("192.168.0.5", 80)));
Eric Orth70992982018-07-24 00:25:005051 }
5052}
5053
[email protected]daae1322013-09-05 18:26:505054// Tests a call to SetDnsClient while there are active DnsTasks.
Eric Orth960e7062019-03-08 18:43:545055TEST_F(HostResolverManagerDnsTest,
5056 ManuallyDisableDnsClientWithPendingRequests) {
[email protected]daae1322013-09-05 18:26:505057 // At most 3 jobs active at once. This number is important, since we want to
Eric Orth960e7062019-03-08 18:43:545058 // make sure that aborting the first HostResolverManager::Job does not trigger
[email protected]daae1322013-09-05 18:26:505059 // another DnsTransaction on the second Job when it releases its second
5060 // prioritized dispatcher slot.
Eric Orth70992982018-07-24 00:25:005061 CreateResolverWithLimitsAndParams(3u, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:325062 true /* ipv6_reachable */,
5063 true /* check_ipv6_on_wifi */);
[email protected]daae1322013-09-05 18:26:505064
[email protected]daae1322013-09-05 18:26:505065 ChangeDnsConfig(CreateValidDnsConfig());
5066
5067 proc_->AddRuleForAllFamilies("slow_ok1", "192.168.0.1");
5068 proc_->AddRuleForAllFamilies("slow_ok2", "192.168.0.2");
5069 proc_->AddRuleForAllFamilies("ok", "192.168.0.3");
5070
Eric Orth70992982018-07-24 00:25:005071 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
5072 // First active job gets two slots.
Eric Orth117e1992019-04-17 00:24:155073 responses.emplace_back(
5074 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
5075 HostPortPair("slow_ok1", 80), NetLogWithSource(), base::nullopt,
5076 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:005077 EXPECT_FALSE(responses[0]->complete());
5078 // Next job gets one slot, and waits on another.
Eric Orth117e1992019-04-17 00:24:155079 responses.emplace_back(
5080 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
5081 HostPortPair("slow_ok2", 80), NetLogWithSource(), base::nullopt,
5082 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:005083 EXPECT_FALSE(responses[1]->complete());
5084 // Next one is queued.
Eric Orth117e1992019-04-17 00:24:155085 responses.emplace_back(
5086 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
5087 HostPortPair("ok", 80), NetLogWithSource(), base::nullopt,
5088 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:005089 EXPECT_FALSE(responses[2]->complete());
5090
5091 EXPECT_EQ(3u, num_running_dispatcher_jobs());
5092
5093 // Clear DnsClient. The two in-progress jobs should fall back to a ProcTask,
5094 // and the next one should be started with a ProcTask.
Eric Orth4e55b362019-05-07 22:00:035095 resolver_->SetDnsClientEnabled(false);
Eric Orth70992982018-07-24 00:25:005096
5097 // All three in-progress requests should now be running a ProcTask.
5098 EXPECT_EQ(3u, num_running_dispatcher_jobs());
5099 proc_->SignalMultiple(3u);
5100
5101 for (auto& response : responses) {
5102 EXPECT_THAT(response->result_error(), IsOk());
5103 }
5104 EXPECT_THAT(responses[0]->request()->GetAddressResults().value().endpoints(),
5105 testing::ElementsAre(CreateExpected("192.168.0.1", 80)));
5106 EXPECT_THAT(responses[1]->request()->GetAddressResults().value().endpoints(),
5107 testing::ElementsAre(CreateExpected("192.168.0.2", 80)));
5108 EXPECT_THAT(responses[2]->request()->GetAddressResults().value().endpoints(),
5109 testing::ElementsAre(CreateExpected("192.168.0.3", 80)));
5110}
5111
Eric Orth04aad982019-05-06 22:41:045112// When explicitly requesting source=DNS, no fallback allowed, so doing so with
5113// DnsClient disabled should result in an error.
5114TEST_F(HostResolverManagerDnsTest, DnsCallsWithDisabledDnsClient) {
Eric Orth4e55b362019-05-07 22:00:035115 ChangeDnsConfig(CreateValidDnsConfig());
Eric Orth04aad982019-05-06 22:41:045116 resolver_->SetDnsClientEnabled(false);
5117
5118 HostResolver::ResolveHostParameters params;
5119 params.source = HostResolverSource::DNS;
5120 ResolveHostResponseHelper response(resolver_->CreateRequest(
5121 HostPortPair("host", 80), NetLogWithSource(), params,
5122 request_context_.get(), host_cache_.get()));
5123
5124 EXPECT_THAT(response.result_error(), IsError(ERR_FAILED));
5125}
5126
Eric Orth4e55b362019-05-07 22:00:035127TEST_F(HostResolverManagerDnsTest,
5128 DnsCallsWithDisabledDnsClient_DisabledAtConstruction) {
5129 HostResolver::ManagerOptions options = DefaultOptions();
5130 options.dns_client_enabled = false;
5131 CreateResolverWithOptionsAndParams(std::move(options),
5132 DefaultParams(proc_.get()),
5133 true /* ipv6_reachable */);
5134 ChangeDnsConfig(CreateValidDnsConfig());
5135
5136 HostResolver::ResolveHostParameters params;
5137 params.source = HostResolverSource::DNS;
5138 ResolveHostResponseHelper response(resolver_->CreateRequest(
5139 HostPortPair("host", 80), NetLogWithSource(), params,
5140 request_context_.get(), host_cache_.get()));
5141
5142 EXPECT_THAT(response.result_error(), IsError(ERR_FAILED));
5143}
5144
5145// Same as DnsClient disabled, requests with source=DNS and no usable DnsConfig
5146// should result in an error.
5147TEST_F(HostResolverManagerDnsTest, DnsCallsWithNoDnsConfig) {
5148 ChangeDnsConfig(DnsConfig());
5149
5150 HostResolver::ResolveHostParameters params;
5151 params.source = HostResolverSource::DNS;
5152 ResolveHostResponseHelper response(resolver_->CreateRequest(
5153 HostPortPair("host", 80), NetLogWithSource(), params,
5154 request_context_.get(), host_cache_.get()));
5155
5156 EXPECT_THAT(response.result_error(), IsError(ERR_FAILED));
5157}
5158
Eric Orth607b6d82019-05-08 16:43:325159TEST_F(HostResolverManagerDnsTest, NoCheckIpv6OnWifi) {
rchce64e6732017-06-05 17:41:575160 // CreateSerialResolver will destroy the current resolver_ which will attempt
5161 // to remove itself from the NetworkChangeNotifier. If this happens after a
5162 // new NetworkChangeNotifier is active, then it will not remove itself from
5163 // the old NetworkChangeNotifier which is a potential use-after-free.
Eric Orth37b18192019-04-22 19:09:285164 DestroyResolver();
mgershaf9a9232017-04-13 20:19:035165 test::ScopedMockNetworkChangeNotifier notifier;
Eric Orth607b6d82019-05-08 16:43:325166 // Serial resolver to guarantee order of resolutions.
5167 CreateSerialResolver(false /* check_ipv6_on_wifi */);
mgershaf9a9232017-04-13 20:19:035168
5169 notifier.mock_network_change_notifier()->SetConnectionType(
5170 NetworkChangeNotifier::CONNECTION_WIFI);
5171 // Needed so IPv6 availability check isn't skipped.
5172 ChangeDnsConfig(CreateValidDnsConfig());
5173
5174 proc_->AddRule("h1", ADDRESS_FAMILY_UNSPECIFIED, "::3");
5175 proc_->AddRule("h1", ADDRESS_FAMILY_IPV4, "1.0.0.1");
Eric Orth322af3e42018-08-20 18:12:595176 proc_->AddRule("h1", ADDRESS_FAMILY_IPV4, "1.0.0.1",
5177 HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6);
mgershaf9a9232017-04-13 20:19:035178 proc_->AddRule("h1", ADDRESS_FAMILY_IPV6, "::2");
5179
Eric Orth117e1992019-04-17 00:24:155180 ResolveHostResponseHelper response(resolver_->CreateRequest(
5181 HostPortPair("h1", 80), NetLogWithSource(), base::nullopt,
5182 request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:005183 HostResolver::ResolveHostParameters parameters;
Eric Orth192e3bb2018-11-14 19:30:325184 parameters.dns_query_type = DnsQueryType::A;
Eric Orth117e1992019-04-17 00:24:155185 ResolveHostResponseHelper v4_response(resolver_->CreateRequest(
5186 HostPortPair("h1", 80), NetLogWithSource(), parameters,
5187 request_context_.get(), host_cache_.get()));
Eric Orth192e3bb2018-11-14 19:30:325188 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth117e1992019-04-17 00:24:155189 ResolveHostResponseHelper v6_response(resolver_->CreateRequest(
5190 HostPortPair("h1", 80), NetLogWithSource(), parameters,
5191 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:005192
Eric Orth00fe5a62018-08-15 22:20:005193 proc_->SignalMultiple(3u);
Eric Orth70992982018-07-24 00:25:005194
5195 // Should revert to only IPV4 request.
5196 EXPECT_THAT(response.result_error(), IsOk());
5197 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
5198 testing::ElementsAre(CreateExpected("1.0.0.1", 80)));
5199
Eric Orth00fe5a62018-08-15 22:20:005200 EXPECT_THAT(v4_response.result_error(), IsOk());
5201 EXPECT_THAT(v4_response.request()->GetAddressResults().value().endpoints(),
5202 testing::ElementsAre(CreateExpected("1.0.0.1", 80)));
5203 EXPECT_THAT(v6_response.result_error(), IsOk());
5204 EXPECT_THAT(v6_response.request()->GetAddressResults().value().endpoints(),
5205 testing::ElementsAre(CreateExpected("::2", 80)));
5206
Eric Orth70992982018-07-24 00:25:005207 // Now repeat the test on non-wifi to check that IPv6 is used as normal
5208 // after the network changes.
5209 notifier.mock_network_change_notifier()->SetConnectionType(
5210 NetworkChangeNotifier::CONNECTION_4G);
5211 base::RunLoop().RunUntilIdle(); // Wait for NetworkChangeNotifier.
5212
Eric Orth117e1992019-04-17 00:24:155213 ResolveHostResponseHelper no_wifi_response(resolver_->CreateRequest(
5214 HostPortPair("h1", 80), NetLogWithSource(), base::nullopt,
5215 request_context_.get(), host_cache_.get()));
Eric Orth192e3bb2018-11-14 19:30:325216 parameters.dns_query_type = DnsQueryType::A;
Eric Orth117e1992019-04-17 00:24:155217 ResolveHostResponseHelper no_wifi_v4_response(resolver_->CreateRequest(
5218 HostPortPair("h1", 80), NetLogWithSource(), parameters,
5219 request_context_.get(), host_cache_.get()));
Eric Orth192e3bb2018-11-14 19:30:325220 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth117e1992019-04-17 00:24:155221 ResolveHostResponseHelper no_wifi_v6_response(resolver_->CreateRequest(
5222 HostPortPair("h1", 80), NetLogWithSource(), parameters,
5223 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:005224
Eric Orth00fe5a62018-08-15 22:20:005225 proc_->SignalMultiple(3u);
Eric Orth70992982018-07-24 00:25:005226
5227 // IPV6 should be available.
5228 EXPECT_THAT(no_wifi_response.result_error(), IsOk());
5229 EXPECT_THAT(
5230 no_wifi_response.request()->GetAddressResults().value().endpoints(),
5231 testing::ElementsAre(CreateExpected("::3", 80)));
Eric Orth00fe5a62018-08-15 22:20:005232
5233 EXPECT_THAT(no_wifi_v4_response.result_error(), IsOk());
5234 EXPECT_THAT(
5235 no_wifi_v4_response.request()->GetAddressResults().value().endpoints(),
5236 testing::ElementsAre(CreateExpected("1.0.0.1", 80)));
5237 EXPECT_THAT(no_wifi_v6_response.result_error(), IsOk());
5238 EXPECT_THAT(
5239 no_wifi_v6_response.request()->GetAddressResults().value().endpoints(),
5240 testing::ElementsAre(CreateExpected("::2", 80)));
Eric Orth70992982018-07-24 00:25:005241}
5242
Eric Orth960e7062019-03-08 18:43:545243TEST_F(HostResolverManagerDnsTest, NotFoundTTL) {
Brad Lassey2e8f185d2018-05-21 22:25:215244 CreateResolver();
Eric Orth60931742018-11-05 23:40:575245 set_allow_fallback_to_proctask(false);
Brad Lassey2e8f185d2018-05-21 22:25:215246 ChangeDnsConfig(CreateValidDnsConfig());
Eric Orth70992982018-07-24 00:25:005247
5248 // NODATA
Eric Orth117e1992019-04-17 00:24:155249 ResolveHostResponseHelper no_data_response(resolver_->CreateRequest(
5250 HostPortPair("empty", 80), NetLogWithSource(), base::nullopt,
5251 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:005252 EXPECT_THAT(no_data_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
5253 EXPECT_FALSE(no_data_response.request()->GetAddressResults());
Eric Orth192e3bb2018-11-14 19:30:325254 HostCache::Key key("empty", DnsQueryType::UNSPECIFIED, 0,
5255 HostResolverSource::ANY);
Eric Orth70992982018-07-24 00:25:005256 HostCache::EntryStaleness staleness;
dalyk48b20a992019-02-25 16:10:265257 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result =
Eric Orth37b18192019-04-22 19:09:285258 host_cache_->Lookup(key, base::TimeTicks::Now(),
5259 false /* ignore_secure */);
dalyk48b20a992019-02-25 16:10:265260 EXPECT_TRUE(!!cache_result);
5261 EXPECT_TRUE(cache_result->second.has_ttl());
5262 EXPECT_THAT(cache_result->second.ttl(), base::TimeDelta::FromSeconds(86400));
Eric Orth70992982018-07-24 00:25:005263
5264 // NXDOMAIN
Eric Orth117e1992019-04-17 00:24:155265 ResolveHostResponseHelper no_domain_response(resolver_->CreateRequest(
5266 HostPortPair("nodomain", 80), NetLogWithSource(), base::nullopt,
5267 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:005268 EXPECT_THAT(no_domain_response.result_error(),
5269 IsError(ERR_NAME_NOT_RESOLVED));
5270 EXPECT_FALSE(no_domain_response.request()->GetAddressResults());
Eric Orth192e3bb2018-11-14 19:30:325271 HostCache::Key nxkey("nodomain", DnsQueryType::UNSPECIFIED, 0,
5272 HostResolverSource::ANY);
Eric Orth37b18192019-04-22 19:09:285273 cache_result = host_cache_->Lookup(nxkey, base::TimeTicks::Now(),
5274 false /* ignore_secure */);
dalyk48b20a992019-02-25 16:10:265275 EXPECT_TRUE(!!cache_result);
5276 EXPECT_TRUE(cache_result->second.has_ttl());
5277 EXPECT_THAT(cache_result->second.ttl(), base::TimeDelta::FromSeconds(86400));
Eric Orth70992982018-07-24 00:25:005278}
5279
Eric Orth960e7062019-03-08 18:43:545280TEST_F(HostResolverManagerDnsTest, CachedError) {
dalyk4f4ac712019-05-31 16:33:135281 proc_->AddRuleForAllFamilies(std::string(),
5282 "0.0.0.0"); // Default to failures.
5283 proc_->SignalMultiple(1u);
5284
Eric Ortheb332862019-01-26 00:52:385285 CreateResolver();
dalyk4f4ac712019-05-31 16:33:135286 set_allow_fallback_to_proctask(true);
Eric Ortheb332862019-01-26 00:52:385287 ChangeDnsConfig(CreateValidDnsConfig());
5288
5289 HostResolver::ResolveHostParameters cache_only_parameters;
5290 cache_only_parameters.source = HostResolverSource::LOCAL_ONLY;
5291
5292 // Expect cache initially empty.
dalyk4f4ac712019-05-31 16:33:135293 ResolveHostResponseHelper cache_miss_response0(resolver_->CreateRequest(
Eric Orth117e1992019-04-17 00:24:155294 HostPortPair("nodomain", 80), NetLogWithSource(), cache_only_parameters,
5295 request_context_.get(), host_cache_.get()));
dalyk4f4ac712019-05-31 16:33:135296 EXPECT_THAT(cache_miss_response0.result_error(), IsError(ERR_DNS_CACHE_MISS));
5297 EXPECT_FALSE(cache_miss_response0.request()->GetStaleInfo());
5298
5299 // The cache should not be populate with an error because fallback to ProcTask
5300 // was available.
5301 ResolveHostResponseHelper no_domain_response_with_fallback(
5302 resolver_->CreateRequest(HostPortPair("nodomain", 80), NetLogWithSource(),
5303 base::nullopt, request_context_.get(),
5304 host_cache_.get()));
5305 EXPECT_THAT(no_domain_response_with_fallback.result_error(),
5306 IsError(ERR_NAME_NOT_RESOLVED));
5307
5308 // Expect cache still empty.
5309 ResolveHostResponseHelper cache_miss_response1(resolver_->CreateRequest(
5310 HostPortPair("nodomain", 80), NetLogWithSource(), cache_only_parameters,
5311 request_context_.get(), host_cache_.get()));
5312 EXPECT_THAT(cache_miss_response1.result_error(), IsError(ERR_DNS_CACHE_MISS));
5313 EXPECT_FALSE(cache_miss_response1.request()->GetStaleInfo());
5314
5315 // Disable fallback to proctask
5316 set_allow_fallback_to_proctask(false);
Eric Ortheb332862019-01-26 00:52:385317
5318 // Populate cache with an error.
Eric Orth117e1992019-04-17 00:24:155319 ResolveHostResponseHelper no_domain_response(resolver_->CreateRequest(
5320 HostPortPair("nodomain", 80), NetLogWithSource(), base::nullopt,
5321 request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:385322 EXPECT_THAT(no_domain_response.result_error(),
5323 IsError(ERR_NAME_NOT_RESOLVED));
5324
5325 // Expect the error result can be resolved from the cache.
Eric Orth117e1992019-04-17 00:24:155326 ResolveHostResponseHelper cache_hit_response(resolver_->CreateRequest(
5327 HostPortPair("nodomain", 80), NetLogWithSource(), cache_only_parameters,
5328 request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:385329 EXPECT_THAT(cache_hit_response.result_error(),
5330 IsError(ERR_NAME_NOT_RESOLVED));
5331 EXPECT_FALSE(cache_hit_response.request()->GetStaleInfo().value().is_stale());
5332}
5333
dalyk4f4ac712019-05-31 16:33:135334TEST_F(HostResolverManagerDnsTest, CachedError_AutomaticMode) {
5335 CreateResolver();
5336 set_allow_fallback_to_proctask(false);
5337 ChangeDnsConfig(CreateValidDnsConfig());
5338
5339 // Switch to automatic mode.
5340 DnsConfigOverrides overrides;
5341 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
5342 resolver_->SetDnsConfigOverrides(overrides);
5343
5344 HostCache::Key insecure_key =
5345 HostCache::Key("automatic_nodomain", DnsQueryType::UNSPECIFIED,
5346 0 /* host_resolver_flags */, HostResolverSource::ANY);
5347 HostCache::Key secure_key =
5348 HostCache::Key("automatic_nodomain", DnsQueryType::UNSPECIFIED,
5349 0 /* host_resolver_flags */, HostResolverSource::ANY);
5350 secure_key.secure = true;
5351
5352 // Expect cache initially empty.
5353 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result;
5354 cache_result = GetCacheHit(secure_key);
5355 EXPECT_FALSE(!!cache_result);
5356 cache_result = GetCacheHit(insecure_key);
5357 EXPECT_FALSE(!!cache_result);
5358
5359 // Populate both secure and insecure caches with an error.
5360 ResolveHostResponseHelper no_domain_response(resolver_->CreateRequest(
5361 HostPortPair("automatic_nodomain", 80), NetLogWithSource(), base::nullopt,
5362 request_context_.get(), host_cache_.get()));
5363 EXPECT_THAT(no_domain_response.result_error(),
5364 IsError(ERR_NAME_NOT_RESOLVED));
5365
5366 // Expect both secure and insecure caches to have the error result.
5367 cache_result = GetCacheHit(secure_key);
5368 EXPECT_TRUE(!!cache_result);
5369 cache_result = GetCacheHit(insecure_key);
5370 EXPECT_TRUE(!!cache_result);
5371}
5372
5373TEST_F(HostResolverManagerDnsTest, CachedError_SecureMode) {
5374 CreateResolver();
5375 set_allow_fallback_to_proctask(false);
5376 ChangeDnsConfig(CreateValidDnsConfig());
5377
5378 // Switch to secure mode.
5379 DnsConfigOverrides overrides;
5380 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::SECURE;
5381 resolver_->SetDnsConfigOverrides(overrides);
5382
5383 HostCache::Key insecure_key =
5384 HostCache::Key("automatic_nodomain", DnsQueryType::UNSPECIFIED,
5385 0 /* host_resolver_flags */, HostResolverSource::ANY);
5386 HostCache::Key secure_key =
5387 HostCache::Key("automatic_nodomain", DnsQueryType::UNSPECIFIED,
5388 0 /* host_resolver_flags */, HostResolverSource::ANY);
5389 secure_key.secure = true;
5390
5391 // Expect cache initially empty.
5392 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result;
5393 cache_result = GetCacheHit(secure_key);
5394 EXPECT_FALSE(!!cache_result);
5395 cache_result = GetCacheHit(insecure_key);
5396 EXPECT_FALSE(!!cache_result);
5397
5398 // Populate secure cache with an error.
5399 ResolveHostResponseHelper no_domain_response(resolver_->CreateRequest(
5400 HostPortPair("automatic_nodomain", 80), NetLogWithSource(), base::nullopt,
5401 request_context_.get(), host_cache_.get()));
5402 EXPECT_THAT(no_domain_response.result_error(),
5403 IsError(ERR_NAME_NOT_RESOLVED));
5404
5405 // Expect only the secure cache to have the error result.
5406 cache_result = GetCacheHit(secure_key);
5407 EXPECT_TRUE(!!cache_result);
5408 cache_result = GetCacheHit(insecure_key);
5409 EXPECT_FALSE(!!cache_result);
5410}
5411
Eric Orth960e7062019-03-08 18:43:545412TEST_F(HostResolverManagerDnsTest, NoCanonicalName) {
Eric Orth828bd3ae2018-12-12 17:30:365413 MockDnsClientRuleList rules;
5414 AddDnsRule(&rules, "alias", dns_protocol::kTypeA, IPAddress::IPv4Localhost(),
dalyk48b20a992019-02-25 16:10:265415 "canonical", false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:365416 AddDnsRule(&rules, "alias", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:265417 IPAddress::IPv6Localhost(), "canonical", false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:365418
Asanka Herath2d0226c2018-10-24 14:35:555419 CreateResolver();
Eric Orth828bd3ae2018-12-12 17:30:365420 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
Eric Orth60931742018-11-05 23:40:575421 set_allow_fallback_to_proctask(false);
Eric Orth828bd3ae2018-12-12 17:30:365422
Eric Orth117e1992019-04-17 00:24:155423 ResolveHostResponseHelper response(resolver_->CreateRequest(
5424 HostPortPair("alias", 80), NetLogWithSource(), base::nullopt,
5425 request_context_.get(), host_cache_.get()));
Asanka Herath2d0226c2018-10-24 14:35:555426 ASSERT_THAT(response.result_error(), IsOk());
5427
Matt Menkec35d1632018-11-29 12:43:495428 // HostResolver may still give name, but if so, it must be correct.
5429 std::string result_name =
5430 response.request()->GetAddressResults().value().canonical_name();
5431 EXPECT_TRUE(result_name.empty() || result_name == "canonical");
Asanka Herath2d0226c2018-10-24 14:35:555432}
5433
Eric Orth960e7062019-03-08 18:43:545434TEST_F(HostResolverManagerDnsTest, CanonicalName) {
Eric Orth828bd3ae2018-12-12 17:30:365435 MockDnsClientRuleList rules;
5436 AddDnsRule(&rules, "alias", dns_protocol::kTypeA, IPAddress::IPv4Localhost(),
dalyk48b20a992019-02-25 16:10:265437 "canonical", false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:365438 AddDnsRule(&rules, "alias", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:265439 IPAddress::IPv6Localhost(), "canonical", false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:365440
Asanka Herath2d0226c2018-10-24 14:35:555441 CreateResolver();
Eric Orth828bd3ae2018-12-12 17:30:365442 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
Eric Orth60931742018-11-05 23:40:575443 set_allow_fallback_to_proctask(false);
Eric Orth828bd3ae2018-12-12 17:30:365444
Asanka Herath2d0226c2018-10-24 14:35:555445 HostResolver::ResolveHostParameters params;
Asanka Herath2d0226c2018-10-24 14:35:555446 params.include_canonical_name = true;
Eric Orth541a90c2019-01-17 20:11:465447 params.source = HostResolverSource::DNS;
Eric Orth117e1992019-04-17 00:24:155448 ResolveHostResponseHelper response(resolver_->CreateRequest(
5449 HostPortPair("alias", 80), NetLogWithSource(), params,
5450 request_context_.get(), host_cache_.get()));
Asanka Herath2d0226c2018-10-24 14:35:555451 ASSERT_THAT(response.result_error(), IsOk());
5452
5453 EXPECT_EQ(response.request()->GetAddressResults().value().canonical_name(),
5454 "canonical");
5455}
5456
Eric Orth960e7062019-03-08 18:43:545457TEST_F(HostResolverManagerDnsTest, CanonicalName_PreferV6) {
Eric Orth828bd3ae2018-12-12 17:30:365458 MockDnsClientRuleList rules;
5459 AddDnsRule(&rules, "alias", dns_protocol::kTypeA, IPAddress::IPv4Localhost(),
dalyk48b20a992019-02-25 16:10:265460 "wrong", false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:365461 AddDnsRule(&rules, "alias", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:265462 IPAddress::IPv6Localhost(), "correct", true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:365463
Asanka Herath2d0226c2018-10-24 14:35:555464 CreateResolver();
Eric Orth828bd3ae2018-12-12 17:30:365465 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
Eric Orth60931742018-11-05 23:40:575466 set_allow_fallback_to_proctask(false);
Eric Orth828bd3ae2018-12-12 17:30:365467
Asanka Herath2d0226c2018-10-24 14:35:555468 HostResolver::ResolveHostParameters params;
Asanka Herath2d0226c2018-10-24 14:35:555469 params.include_canonical_name = true;
Eric Orth541a90c2019-01-17 20:11:465470 params.source = HostResolverSource::DNS;
Eric Orth117e1992019-04-17 00:24:155471 ResolveHostResponseHelper response(resolver_->CreateRequest(
5472 HostPortPair("alias", 80), NetLogWithSource(), params,
5473 request_context_.get(), host_cache_.get()));
Asanka Herath2d0226c2018-10-24 14:35:555474 ASSERT_FALSE(response.complete());
5475 base::RunLoop().RunUntilIdle();
5476 dns_client_->CompleteDelayedTransactions();
5477 ASSERT_THAT(response.result_error(), IsOk());
5478 EXPECT_EQ(response.request()->GetAddressResults().value().canonical_name(),
5479 "correct");
5480}
5481
Eric Orth960e7062019-03-08 18:43:545482TEST_F(HostResolverManagerDnsTest, CanonicalName_V4Only) {
Eric Orth828bd3ae2018-12-12 17:30:365483 MockDnsClientRuleList rules;
5484 AddDnsRule(&rules, "alias", dns_protocol::kTypeA, IPAddress::IPv4Localhost(),
dalyk48b20a992019-02-25 16:10:265485 "correct", false /* delay */);
Asanka Herath2d0226c2018-10-24 14:35:555486 CreateResolver();
Eric Orth828bd3ae2018-12-12 17:30:365487 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
Eric Orth60931742018-11-05 23:40:575488 set_allow_fallback_to_proctask(false);
Eric Orth828bd3ae2018-12-12 17:30:365489
Asanka Herath2d0226c2018-10-24 14:35:555490 HostResolver::ResolveHostParameters params;
Eric Orth192e3bb2018-11-14 19:30:325491 params.dns_query_type = DnsQueryType::A;
Asanka Herath2d0226c2018-10-24 14:35:555492 params.include_canonical_name = true;
Eric Orth541a90c2019-01-17 20:11:465493 params.source = HostResolverSource::DNS;
Eric Orth117e1992019-04-17 00:24:155494 ResolveHostResponseHelper response(resolver_->CreateRequest(
5495 HostPortPair("alias", 80), NetLogWithSource(), params,
5496 request_context_.get(), host_cache_.get()));
Asanka Herath2d0226c2018-10-24 14:35:555497 ASSERT_THAT(response.result_error(), IsOk());
5498 EXPECT_EQ(response.request()->GetAddressResults().value().canonical_name(),
5499 "correct");
5500}
5501
Eric Orth541a90c2019-01-17 20:11:465502// Test that without specifying source, a request that would otherwise be
5503// handled by DNS is sent to the system resolver if cannonname is requested.
Eric Orth960e7062019-03-08 18:43:545504TEST_F(HostResolverManagerDnsTest, CanonicalNameForcesProc) {
Eric Orth541a90c2019-01-17 20:11:465505 // Disable fallback to ensure system resolver is used directly, not via
5506 // fallback.
5507 set_allow_fallback_to_proctask(false);
5508
5509 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.102",
5510 HOST_RESOLVER_CANONNAME, "canonical");
5511 proc_->SignalMultiple(1u);
5512
5513 ChangeDnsConfig(CreateValidDnsConfig());
5514
5515 HostResolver::ResolveHostParameters params;
5516 params.include_canonical_name = true;
5517 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:275518 HostPortPair("nx_succeed", 80), NetLogWithSource(), params,
Eric Orth117e1992019-04-17 00:24:155519 request_context_.get(), host_cache_.get()));
Eric Orth541a90c2019-01-17 20:11:465520 ASSERT_THAT(response.result_error(), IsOk());
5521
5522 EXPECT_EQ(response.request()->GetAddressResults().value().canonical_name(),
5523 "canonical");
5524}
5525
Eric Orth960e7062019-03-08 18:43:545526TEST_F(HostResolverManagerTest, ResolveLocalHostname) {
tfarina9ed7f8c52016-02-19 17:50:185527 AddressList addresses;
5528
5529 TestBothLoopbackIPs("localhost");
5530 TestBothLoopbackIPs("localhoST");
5531 TestBothLoopbackIPs("localhost.");
5532 TestBothLoopbackIPs("localhoST.");
5533 TestBothLoopbackIPs("localhost.localdomain");
5534 TestBothLoopbackIPs("localhost.localdomAIn");
5535 TestBothLoopbackIPs("localhost.localdomain.");
5536 TestBothLoopbackIPs("localhost.localdomAIn.");
5537 TestBothLoopbackIPs("foo.localhost");
5538 TestBothLoopbackIPs("foo.localhOSt");
5539 TestBothLoopbackIPs("foo.localhost.");
5540 TestBothLoopbackIPs("foo.localhOSt.");
5541
5542 TestIPv6LoopbackOnly("localhost6");
5543 TestIPv6LoopbackOnly("localhoST6");
5544 TestIPv6LoopbackOnly("localhost6.");
5545 TestIPv6LoopbackOnly("localhost6.localdomain6");
5546 TestIPv6LoopbackOnly("localhost6.localdomain6.");
5547
Matt Menkec35d1632018-11-29 12:43:495548 EXPECT_FALSE(ResolveLocalHostname("127.0.0.1", &addresses));
5549 EXPECT_FALSE(ResolveLocalHostname("::1", &addresses));
5550 EXPECT_FALSE(ResolveLocalHostname("0:0:0:0:0:0:0:1", &addresses));
5551 EXPECT_FALSE(ResolveLocalHostname("localhostx", &addresses));
5552 EXPECT_FALSE(ResolveLocalHostname("localhost.x", &addresses));
5553 EXPECT_FALSE(ResolveLocalHostname("foo.localdomain", &addresses));
5554 EXPECT_FALSE(ResolveLocalHostname("foo.localdomain.x", &addresses));
5555 EXPECT_FALSE(ResolveLocalHostname("localhost6x", &addresses));
5556 EXPECT_FALSE(ResolveLocalHostname("localhost.localdomain6", &addresses));
5557 EXPECT_FALSE(ResolveLocalHostname("localhost6.localdomain", &addresses));
5558 EXPECT_FALSE(ResolveLocalHostname("127.0.0.1.1", &addresses));
5559 EXPECT_FALSE(ResolveLocalHostname(".127.0.0.255", &addresses));
5560 EXPECT_FALSE(ResolveLocalHostname("::2", &addresses));
5561 EXPECT_FALSE(ResolveLocalHostname("::1:1", &addresses));
5562 EXPECT_FALSE(ResolveLocalHostname("0:0:0:0:1:0:0:1", &addresses));
5563 EXPECT_FALSE(ResolveLocalHostname("::1:1", &addresses));
5564 EXPECT_FALSE(ResolveLocalHostname("0:0:0:0:0:0:0:0:1", &addresses));
5565 EXPECT_FALSE(ResolveLocalHostname("foo.localhost.com", &addresses));
5566 EXPECT_FALSE(ResolveLocalHostname("foo.localhoste", &addresses));
tfarina9ed7f8c52016-02-19 17:50:185567}
5568
dalyk40dcab152019-03-15 21:03:155569TEST_F(HostResolverManagerDnsTest, ResolveDnsOverHttpsServerName) {
5570 MockDnsClientRuleList rules;
5571 rules.emplace_back(
dalyk4f4ac712019-05-31 16:33:135572 "dns.example2.com", dns_protocol::kTypeA, false /* secure */,
dalyk40dcab152019-03-15 21:03:155573 MockDnsClientRule::Result(MockDnsClientRule::OK), false /* delay */);
dalyk4f4ac712019-05-31 16:33:135574 rules.emplace_back(
5575 "dns.example2.com", dns_protocol::kTypeAAAA, false /* secure */,
5576 MockDnsClientRule::Result(MockDnsClientRule::OK), false /* delay */);
dalyk40dcab152019-03-15 21:03:155577 CreateResolver();
5578 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
5579
5580 DnsConfigOverrides overrides;
dalyk4f4ac712019-05-31 16:33:135581 std::vector<DnsConfig::DnsOverHttpsServerConfig> doh_servers = {
5582 DnsConfig::DnsOverHttpsServerConfig("https://dns.example.com/",
5583 true /* use_post */),
5584 DnsConfig::DnsOverHttpsServerConfig(
5585 "https://dns.example2.com/dns-query{?dns}", false /* use_post */)};
5586 overrides.dns_over_https_servers = doh_servers;
5587 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::SECURE;
dalyk40dcab152019-03-15 21:03:155588 resolver_->SetDnsConfigOverrides(overrides);
5589
5590 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:275591 HostPortPair("dns.example2.com", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:155592 request_context_.get(), host_cache_.get()));
dalyk40dcab152019-03-15 21:03:155593 ASSERT_THAT(response.result_error(), IsOk());
5594}
5595
Eric Orth960e7062019-03-08 18:43:545596TEST_F(HostResolverManagerDnsTest, AddDnsOverHttpsServerAfterConfig) {
Eric Orth37b18192019-04-22 19:09:285597 DestroyResolver();
Brad Lassey786929ad2018-02-21 20:54:275598 test::ScopedMockNetworkChangeNotifier notifier;
5599 CreateSerialResolver(); // To guarantee order of resolutions.
5600 notifier.mock_network_change_notifier()->SetConnectionType(
5601 NetworkChangeNotifier::CONNECTION_WIFI);
5602 ChangeDnsConfig(CreateValidDnsConfig());
5603
dalykb34631f2018-08-24 19:59:485604 std::string server("https://dnsserver.example.net/dns-query{?dns}");
Eric Orthc1eb1292018-10-09 22:07:075605 DnsConfigOverrides overrides;
5606 overrides.dns_over_https_servers.emplace(
5607 {DnsConfig::DnsOverHttpsServerConfig(server, true)});
5608 resolver_->SetDnsConfigOverrides(overrides);
Brad Lassey786929ad2018-02-21 20:54:275609 base::DictionaryValue* config;
5610
5611 auto value = resolver_->GetDnsConfigAsValue();
5612 EXPECT_TRUE(value);
5613 if (!value)
5614 return;
5615 value->GetAsDictionary(&config);
5616 base::ListValue* doh_servers;
5617 config->GetListWithoutPathExpansion("doh_servers", &doh_servers);
5618 EXPECT_TRUE(doh_servers);
5619 if (!doh_servers)
5620 return;
5621 EXPECT_EQ(doh_servers->GetSize(), 1u);
5622 base::DictionaryValue* server_method;
5623 EXPECT_TRUE(doh_servers->GetDictionary(0, &server_method));
5624 bool use_post;
5625 EXPECT_TRUE(server_method->GetBoolean("use_post", &use_post));
5626 EXPECT_TRUE(use_post);
dalykb34631f2018-08-24 19:59:485627 std::string server_template;
5628 EXPECT_TRUE(server_method->GetString("server_template", &server_template));
5629 EXPECT_EQ(server_template, server);
Brad Lassey786929ad2018-02-21 20:54:275630}
5631
Eric Orth960e7062019-03-08 18:43:545632TEST_F(HostResolverManagerDnsTest, AddDnsOverHttpsServerBeforeConfig) {
Eric Orth37b18192019-04-22 19:09:285633 DestroyResolver();
Brad Lassey786929ad2018-02-21 20:54:275634 test::ScopedMockNetworkChangeNotifier notifier;
5635 CreateSerialResolver(); // To guarantee order of resolutions.
dalykb34631f2018-08-24 19:59:485636 std::string server("https://dnsserver.example.net/dns-query{?dns}");
Eric Orthc1eb1292018-10-09 22:07:075637 DnsConfigOverrides overrides;
5638 overrides.dns_over_https_servers.emplace(
5639 {DnsConfig::DnsOverHttpsServerConfig(server, true)});
5640 resolver_->SetDnsConfigOverrides(overrides);
Brad Lassey786929ad2018-02-21 20:54:275641
5642 notifier.mock_network_change_notifier()->SetConnectionType(
5643 NetworkChangeNotifier::CONNECTION_WIFI);
5644 ChangeDnsConfig(CreateValidDnsConfig());
5645
5646 base::DictionaryValue* config;
5647 auto value = resolver_->GetDnsConfigAsValue();
5648 EXPECT_TRUE(value);
5649 if (!value)
5650 return;
5651 value->GetAsDictionary(&config);
5652 base::ListValue* doh_servers;
5653 config->GetListWithoutPathExpansion("doh_servers", &doh_servers);
5654 EXPECT_TRUE(doh_servers);
5655 if (!doh_servers)
5656 return;
5657 EXPECT_EQ(doh_servers->GetSize(), 1u);
5658 base::DictionaryValue* server_method;
5659 EXPECT_TRUE(doh_servers->GetDictionary(0, &server_method));
5660 bool use_post;
5661 EXPECT_TRUE(server_method->GetBoolean("use_post", &use_post));
5662 EXPECT_TRUE(use_post);
dalykb34631f2018-08-24 19:59:485663 std::string server_template;
5664 EXPECT_TRUE(server_method->GetString("server_template", &server_template));
5665 EXPECT_EQ(server_template, server);
Brad Lassey786929ad2018-02-21 20:54:275666}
5667
Eric Orth960e7062019-03-08 18:43:545668TEST_F(HostResolverManagerDnsTest, AddDnsOverHttpsServerBeforeClient) {
Eric Orth37b18192019-04-22 19:09:285669 DestroyResolver();
Brad Lassey786929ad2018-02-21 20:54:275670 test::ScopedMockNetworkChangeNotifier notifier;
5671 CreateSerialResolver(); // To guarantee order of resolutions.
dalykb34631f2018-08-24 19:59:485672 std::string server("https://dnsserver.example.net/dns-query{?dns}");
Eric Orthc1eb1292018-10-09 22:07:075673 DnsConfigOverrides overrides;
5674 overrides.dns_over_https_servers.emplace(
5675 {DnsConfig::DnsOverHttpsServerConfig(server, true)});
5676 resolver_->SetDnsConfigOverrides(overrides);
Brad Lassey786929ad2018-02-21 20:54:275677
5678 notifier.mock_network_change_notifier()->SetConnectionType(
5679 NetworkChangeNotifier::CONNECTION_WIFI);
5680 ChangeDnsConfig(CreateValidDnsConfig());
5681
Brad Lassey786929ad2018-02-21 20:54:275682 base::DictionaryValue* config;
5683 auto value = resolver_->GetDnsConfigAsValue();
5684 EXPECT_TRUE(value);
5685 if (!value)
5686 return;
5687 value->GetAsDictionary(&config);
5688 base::ListValue* doh_servers;
5689 config->GetListWithoutPathExpansion("doh_servers", &doh_servers);
5690 EXPECT_TRUE(doh_servers);
5691 if (!doh_servers)
5692 return;
5693 EXPECT_EQ(doh_servers->GetSize(), 1u);
5694 base::DictionaryValue* server_method;
5695 EXPECT_TRUE(doh_servers->GetDictionary(0, &server_method));
5696 bool use_post;
5697 EXPECT_TRUE(server_method->GetBoolean("use_post", &use_post));
5698 EXPECT_TRUE(use_post);
dalykb34631f2018-08-24 19:59:485699 std::string server_template;
5700 EXPECT_TRUE(server_method->GetString("server_template", &server_template));
5701 EXPECT_EQ(server_template, server);
Brad Lassey786929ad2018-02-21 20:54:275702}
5703
Eric Orth960e7062019-03-08 18:43:545704TEST_F(HostResolverManagerDnsTest, AddDnsOverHttpsServerAndThenRemove) {
Eric Orth37b18192019-04-22 19:09:285705 DestroyResolver();
Brad Lassey786929ad2018-02-21 20:54:275706 test::ScopedMockNetworkChangeNotifier notifier;
5707 CreateSerialResolver(); // To guarantee order of resolutions.
dalykb34631f2018-08-24 19:59:485708 std::string server("https://dns.example.com/");
Eric Orthc1eb1292018-10-09 22:07:075709 DnsConfigOverrides overrides;
5710 overrides.dns_over_https_servers.emplace(
5711 {DnsConfig::DnsOverHttpsServerConfig(server, true)});
5712 resolver_->SetDnsConfigOverrides(overrides);
Brad Lassey786929ad2018-02-21 20:54:275713
5714 notifier.mock_network_change_notifier()->SetConnectionType(
5715 NetworkChangeNotifier::CONNECTION_WIFI);
dalyk4f4ac712019-05-31 16:33:135716 DnsConfig network_dns_config = CreateValidDnsConfig();
5717 network_dns_config.dns_over_https_servers.clear();
5718 ChangeDnsConfig(network_dns_config);
Brad Lassey786929ad2018-02-21 20:54:275719
5720 base::DictionaryValue* config;
5721 auto value = resolver_->GetDnsConfigAsValue();
5722 EXPECT_TRUE(value);
5723 if (!value)
5724 return;
5725 value->GetAsDictionary(&config);
5726 base::ListValue* doh_servers;
5727 config->GetListWithoutPathExpansion("doh_servers", &doh_servers);
5728 EXPECT_TRUE(doh_servers);
5729 if (!doh_servers)
5730 return;
5731 EXPECT_EQ(doh_servers->GetSize(), 1u);
5732 base::DictionaryValue* server_method;
5733 EXPECT_TRUE(doh_servers->GetDictionary(0, &server_method));
5734 bool use_post;
5735 EXPECT_TRUE(server_method->GetBoolean("use_post", &use_post));
5736 EXPECT_TRUE(use_post);
dalykb34631f2018-08-24 19:59:485737 std::string server_template;
5738 EXPECT_TRUE(server_method->GetString("server_template", &server_template));
5739 EXPECT_EQ(server_template, server);
Brad Lassey786929ad2018-02-21 20:54:275740
Eric Orthc1eb1292018-10-09 22:07:075741 resolver_->SetDnsConfigOverrides(DnsConfigOverrides());
Brad Lassey786929ad2018-02-21 20:54:275742 value = resolver_->GetDnsConfigAsValue();
5743 EXPECT_TRUE(value);
5744 if (!value)
5745 return;
5746 value->GetAsDictionary(&config);
5747 config->GetListWithoutPathExpansion("doh_servers", &doh_servers);
5748 EXPECT_TRUE(doh_servers);
5749 if (!doh_servers)
5750 return;
5751 EXPECT_EQ(doh_servers->GetSize(), 0u);
5752}
5753
Eric Orth960e7062019-03-08 18:43:545754TEST_F(HostResolverManagerDnsTest, SetDnsConfigOverrides) {
Eric Orthc1eb1292018-10-09 22:07:075755 DnsConfig original_config = CreateValidDnsConfig();
5756 ChangeDnsConfig(original_config);
5757
5758 // Confirm pre-override state.
5759 ASSERT_TRUE(original_config.Equals(*dns_client_->GetConfig()));
5760
5761 DnsConfigOverrides overrides;
5762 const std::vector<IPEndPoint> nameservers = {
5763 CreateExpected("192.168.0.1", 92)};
5764 overrides.nameservers = nameservers;
5765 const std::vector<std::string> search = {"str"};
5766 overrides.search = search;
5767 const DnsHosts hosts = {
5768 {DnsHostsKey("host", ADDRESS_FAMILY_IPV4), IPAddress(192, 168, 1, 1)}};
5769 overrides.hosts = hosts;
5770 overrides.append_to_multi_label_name = false;
5771 overrides.randomize_ports = true;
5772 const int ndots = 5;
5773 overrides.ndots = ndots;
5774 const base::TimeDelta timeout = base::TimeDelta::FromSeconds(10);
5775 overrides.timeout = timeout;
5776 const int attempts = 20;
5777 overrides.attempts = attempts;
5778 overrides.rotate = true;
5779 overrides.use_local_ipv6 = true;
5780 const std::vector<DnsConfig::DnsOverHttpsServerConfig>
5781 dns_over_https_servers = {
5782 DnsConfig::DnsOverHttpsServerConfig("dns.example.com", true)};
5783 overrides.dns_over_https_servers = dns_over_https_servers;
dalykbd726ee2019-05-30 01:44:065784 const DnsConfig::SecureDnsMode secure_dns_mode =
5785 DnsConfig::SecureDnsMode::SECURE;
5786 overrides.secure_dns_mode = secure_dns_mode;
Eric Orthc1eb1292018-10-09 22:07:075787
Eric Orthc823a23d2018-10-30 22:12:485788 // This test is expected to test overriding all fields.
5789 EXPECT_TRUE(overrides.OverridesEverything());
5790
Eric Orthc1eb1292018-10-09 22:07:075791 resolver_->SetDnsConfigOverrides(overrides);
5792
5793 const DnsConfig* overridden_config = dns_client_->GetConfig();
5794 EXPECT_EQ(nameservers, overridden_config->nameservers);
5795 EXPECT_EQ(search, overridden_config->search);
5796 EXPECT_EQ(hosts, overridden_config->hosts);
5797 EXPECT_FALSE(overridden_config->append_to_multi_label_name);
5798 EXPECT_TRUE(overridden_config->randomize_ports);
5799 EXPECT_EQ(ndots, overridden_config->ndots);
5800 EXPECT_EQ(timeout, overridden_config->timeout);
5801 EXPECT_EQ(attempts, overridden_config->attempts);
5802 EXPECT_TRUE(overridden_config->rotate);
5803 EXPECT_TRUE(overridden_config->use_local_ipv6);
5804 EXPECT_EQ(dns_over_https_servers, overridden_config->dns_over_https_servers);
dalykbd726ee2019-05-30 01:44:065805 EXPECT_EQ(secure_dns_mode, overridden_config->secure_dns_mode);
Eric Orthc1eb1292018-10-09 22:07:075806}
5807
Eric Orth960e7062019-03-08 18:43:545808TEST_F(HostResolverManagerDnsTest,
Eric Orthc823a23d2018-10-30 22:12:485809 SetDnsConfigOverrides_OverrideEverythingCreation) {
5810 DnsConfig original_config = CreateValidDnsConfig();
5811 ChangeDnsConfig(original_config);
5812
5813 // Confirm pre-override state.
5814 ASSERT_TRUE(original_config.Equals(*dns_client_->GetConfig()));
5815 ASSERT_FALSE(original_config.Equals(DnsConfig()));
5816
5817 DnsConfigOverrides overrides =
5818 DnsConfigOverrides::CreateOverridingEverythingWithDefaults();
5819 EXPECT_TRUE(overrides.OverridesEverything());
5820
5821 // Ensure config is valid by setting a nameserver.
5822 std::vector<IPEndPoint> nameservers = {CreateExpected("1.2.3.4", 50)};
5823 overrides.nameservers = nameservers;
5824 EXPECT_TRUE(overrides.OverridesEverything());
5825
5826 resolver_->SetDnsConfigOverrides(overrides);
5827
5828 DnsConfig expected;
5829 expected.nameservers = nameservers;
5830 EXPECT_TRUE(dns_client_->GetConfig()->Equals(DnsConfig(expected)));
5831}
5832
Eric Orth960e7062019-03-08 18:43:545833TEST_F(HostResolverManagerDnsTest, SetDnsConfigOverrides_PartialOverride) {
Eric Orthc1eb1292018-10-09 22:07:075834 DnsConfig original_config = CreateValidDnsConfig();
5835 ChangeDnsConfig(original_config);
5836
5837 // Confirm pre-override state.
5838 ASSERT_TRUE(original_config.Equals(*dns_client_->GetConfig()));
5839
5840 DnsConfigOverrides overrides;
5841 const std::vector<IPEndPoint> nameservers = {
5842 CreateExpected("192.168.0.2", 192)};
5843 overrides.nameservers = nameservers;
5844 overrides.rotate = true;
Eric Orthc823a23d2018-10-30 22:12:485845 EXPECT_FALSE(overrides.OverridesEverything());
Eric Orthc1eb1292018-10-09 22:07:075846
5847 resolver_->SetDnsConfigOverrides(overrides);
5848
5849 const DnsConfig* overridden_config = dns_client_->GetConfig();
5850 EXPECT_EQ(nameservers, overridden_config->nameservers);
5851 EXPECT_EQ(original_config.search, overridden_config->search);
5852 EXPECT_EQ(original_config.hosts, overridden_config->hosts);
5853 EXPECT_TRUE(overridden_config->append_to_multi_label_name);
5854 EXPECT_FALSE(overridden_config->randomize_ports);
5855 EXPECT_EQ(original_config.ndots, overridden_config->ndots);
5856 EXPECT_EQ(original_config.timeout, overridden_config->timeout);
5857 EXPECT_EQ(original_config.attempts, overridden_config->attempts);
5858 EXPECT_TRUE(overridden_config->rotate);
5859 EXPECT_FALSE(overridden_config->use_local_ipv6);
5860 EXPECT_EQ(original_config.dns_over_https_servers,
5861 overridden_config->dns_over_https_servers);
dalykbd726ee2019-05-30 01:44:065862 EXPECT_EQ(original_config.secure_dns_mode,
5863 overridden_config->secure_dns_mode);
Eric Orthc1eb1292018-10-09 22:07:075864}
5865
5866// Test that overridden configs are reapplied over a changed underlying system
5867// config.
Eric Orth960e7062019-03-08 18:43:545868TEST_F(HostResolverManagerDnsTest, SetDnsConfigOverrides_NewConfig) {
Eric Orthc1eb1292018-10-09 22:07:075869 DnsConfig original_config = CreateValidDnsConfig();
5870 ChangeDnsConfig(original_config);
5871
5872 // Confirm pre-override state.
5873 ASSERT_TRUE(original_config.Equals(*dns_client_->GetConfig()));
5874
5875 DnsConfigOverrides overrides;
5876 const std::vector<IPEndPoint> nameservers = {
5877 CreateExpected("192.168.0.2", 192)};
5878 overrides.nameservers = nameservers;
5879
5880 resolver_->SetDnsConfigOverrides(overrides);
5881 ASSERT_EQ(nameservers, dns_client_->GetConfig()->nameservers);
5882
5883 DnsConfig new_config = original_config;
5884 new_config.attempts = 103;
5885 ASSERT_NE(nameservers, new_config.nameservers);
5886 ChangeDnsConfig(new_config);
5887
5888 const DnsConfig* overridden_config = dns_client_->GetConfig();
5889 EXPECT_EQ(nameservers, overridden_config->nameservers);
5890 EXPECT_EQ(new_config.attempts, overridden_config->attempts);
5891}
5892
Eric Orth960e7062019-03-08 18:43:545893TEST_F(HostResolverManagerDnsTest, SetDnsConfigOverrides_ClearOverrides) {
Eric Orthc1eb1292018-10-09 22:07:075894 DnsConfig original_config = CreateValidDnsConfig();
5895 ChangeDnsConfig(original_config);
5896
5897 DnsConfigOverrides overrides;
5898 overrides.attempts = 245;
5899 resolver_->SetDnsConfigOverrides(overrides);
5900
5901 ASSERT_FALSE(original_config.Equals(*dns_client_->GetConfig()));
5902
5903 resolver_->SetDnsConfigOverrides(DnsConfigOverrides());
5904 EXPECT_TRUE(original_config.Equals(*dns_client_->GetConfig()));
5905}
5906
Eric Orth37b18192019-04-22 19:09:285907TEST_F(HostResolverManagerDnsTest, FlushCacheOnDnsConfigOverridesChange) {
5908 ChangeDnsConfig(CreateValidDnsConfig());
5909
5910 HostResolver::ResolveHostParameters local_source_parameters;
5911 local_source_parameters.source = HostResolverSource::LOCAL_ONLY;
5912
5913 // Populate cache.
5914 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
5915 HostPortPair("ok", 70), NetLogWithSource(), base::nullopt,
5916 request_context_.get(), host_cache_.get()));
5917 EXPECT_THAT(initial_response.result_error(), IsOk());
5918
5919 // Confirm result now cached.
5920 ResolveHostResponseHelper cached_response(resolver_->CreateRequest(
5921 HostPortPair("ok", 75), NetLogWithSource(), local_source_parameters,
5922 request_context_.get(), host_cache_.get()));
5923 ASSERT_THAT(cached_response.result_error(), IsOk());
5924 ASSERT_TRUE(cached_response.request()->GetStaleInfo());
5925
5926 // Flush cache by triggering a DnsConfigOverrides change.
5927 DnsConfigOverrides overrides;
5928 overrides.attempts = 4;
5929 resolver_->SetDnsConfigOverrides(overrides);
5930
5931 // Expect no longer cached
5932 ResolveHostResponseHelper flushed_response(resolver_->CreateRequest(
5933 HostPortPair("ok", 80), NetLogWithSource(), local_source_parameters,
5934 request_context_.get(), host_cache_.get()));
5935 EXPECT_THAT(flushed_response.result_error(), IsError(ERR_DNS_CACHE_MISS));
5936}
5937
Eric Orthc823a23d2018-10-30 22:12:485938// Test that even when using config overrides, a change to the base system
5939// config cancels pending requests.
Eric Orth960e7062019-03-08 18:43:545940TEST_F(HostResolverManagerDnsTest, CancellationOnBaseConfigChange) {
Eric Orthc823a23d2018-10-30 22:12:485941 DnsConfig original_config = CreateValidDnsConfig();
5942 ChangeDnsConfig(original_config);
5943
5944 DnsConfigOverrides overrides;
5945 overrides.nameservers.emplace({CreateExpected("123.123.123.123", 80)});
5946 ASSERT_FALSE(overrides.OverridesEverything());
5947 resolver_->SetDnsConfigOverrides(overrides);
5948
Eric Orth117e1992019-04-17 00:24:155949 ResolveHostResponseHelper response(resolver_->CreateRequest(
5950 HostPortPair("4slow_ok", 80), NetLogWithSource(), base::nullopt,
5951 request_context_.get(), host_cache_.get()));
Eric Orthc823a23d2018-10-30 22:12:485952 ASSERT_FALSE(response.complete());
5953
5954 DnsConfig new_config = original_config;
5955 new_config.attempts = 103;
5956 ChangeDnsConfig(new_config);
5957
5958 EXPECT_THAT(response.result_error(), IsError(ERR_NETWORK_CHANGED));
5959}
5960
5961// Test that when all configuration is overridden, system configuration changes
5962// do not cancel requests.
Eric Orth960e7062019-03-08 18:43:545963TEST_F(HostResolverManagerDnsTest,
Eric Orthc823a23d2018-10-30 22:12:485964 CancellationOnBaseConfigChange_OverridesEverything) {
5965 DnsConfig original_config = CreateValidDnsConfig();
5966 ChangeDnsConfig(original_config);
5967
5968 DnsConfigOverrides overrides =
5969 DnsConfigOverrides::CreateOverridingEverythingWithDefaults();
5970 overrides.nameservers.emplace({CreateExpected("123.123.123.123", 80)});
5971 ASSERT_TRUE(overrides.OverridesEverything());
5972 resolver_->SetDnsConfigOverrides(overrides);
5973
Eric Orth117e1992019-04-17 00:24:155974 ResolveHostResponseHelper response(resolver_->CreateRequest(
5975 HostPortPair("4slow_ok", 80), NetLogWithSource(), base::nullopt,
5976 request_context_.get(), host_cache_.get()));
Eric Orthc823a23d2018-10-30 22:12:485977 ASSERT_FALSE(response.complete());
5978
5979 DnsConfig new_config = original_config;
5980 new_config.attempts = 103;
5981 ChangeDnsConfig(new_config);
5982
5983 dns_client_->CompleteDelayedTransactions();
5984 EXPECT_THAT(response.result_error(), IsOk());
5985}
5986
Eric Orthc1eb1292018-10-09 22:07:075987// Test that in-progress queries are cancelled on applying new DNS config
5988// overrides, same as receiving a new DnsConfig from the system.
Eric Orth960e7062019-03-08 18:43:545989TEST_F(HostResolverManagerDnsTest, CancelQueriesOnSettingOverrides) {
Eric Orthc1eb1292018-10-09 22:07:075990 ChangeDnsConfig(CreateValidDnsConfig());
Eric Orth117e1992019-04-17 00:24:155991 ResolveHostResponseHelper response(resolver_->CreateRequest(
5992 HostPortPair("4slow_ok", 80), NetLogWithSource(), base::nullopt,
5993 request_context_.get(), host_cache_.get()));
Eric Orthc1eb1292018-10-09 22:07:075994 ASSERT_FALSE(response.complete());
5995
5996 DnsConfigOverrides overrides;
5997 overrides.attempts = 123;
5998 resolver_->SetDnsConfigOverrides(overrides);
5999
6000 EXPECT_THAT(response.result_error(), IsError(ERR_NETWORK_CHANGED));
6001}
6002
6003// Queries should not be cancelled if equal overrides are set.
Eric Orth960e7062019-03-08 18:43:546004TEST_F(HostResolverManagerDnsTest,
6005 CancelQueriesOnSettingOverrides_SameOverrides) {
Eric Orthc1eb1292018-10-09 22:07:076006 ChangeDnsConfig(CreateValidDnsConfig());
6007 DnsConfigOverrides overrides;
6008 overrides.attempts = 123;
6009 resolver_->SetDnsConfigOverrides(overrides);
6010
Eric Orth117e1992019-04-17 00:24:156011 ResolveHostResponseHelper response(resolver_->CreateRequest(
6012 HostPortPair("4slow_ok", 80), NetLogWithSource(), base::nullopt,
6013 request_context_.get(), host_cache_.get()));
Eric Orthc1eb1292018-10-09 22:07:076014 ASSERT_FALSE(response.complete());
6015
6016 resolver_->SetDnsConfigOverrides(overrides);
6017
Eric Orthc823a23d2018-10-30 22:12:486018 dns_client_->CompleteDelayedTransactions();
Eric Orthc1eb1292018-10-09 22:07:076019 EXPECT_THAT(response.result_error(), IsOk());
6020}
6021
6022// Test that in-progress queries are cancelled on clearing DNS config overrides,
6023// same as receiving a new DnsConfig from the system.
Eric Orth960e7062019-03-08 18:43:546024TEST_F(HostResolverManagerDnsTest, CancelQueriesOnClearingOverrides) {
Eric Orthc1eb1292018-10-09 22:07:076025 ChangeDnsConfig(CreateValidDnsConfig());
6026 DnsConfigOverrides overrides;
6027 overrides.attempts = 123;
6028 resolver_->SetDnsConfigOverrides(overrides);
6029
Eric Orth117e1992019-04-17 00:24:156030 ResolveHostResponseHelper response(resolver_->CreateRequest(
6031 HostPortPair("4slow_ok", 80), NetLogWithSource(), base::nullopt,
6032 request_context_.get(), host_cache_.get()));
Eric Orthc1eb1292018-10-09 22:07:076033 ASSERT_FALSE(response.complete());
6034
6035 resolver_->SetDnsConfigOverrides(DnsConfigOverrides());
6036
6037 EXPECT_THAT(response.result_error(), IsError(ERR_NETWORK_CHANGED));
6038}
6039
6040// Queries should not be cancelled on clearing overrides if there were not any
6041// overrides.
Eric Orth960e7062019-03-08 18:43:546042TEST_F(HostResolverManagerDnsTest,
6043 CancelQueriesOnClearingOverrides_NoOverrides) {
Eric Orthc1eb1292018-10-09 22:07:076044 ChangeDnsConfig(CreateValidDnsConfig());
Eric Orth117e1992019-04-17 00:24:156045 ResolveHostResponseHelper response(resolver_->CreateRequest(
6046 HostPortPair("4slow_ok", 80), NetLogWithSource(), base::nullopt,
6047 request_context_.get(), host_cache_.get()));
Eric Orthc1eb1292018-10-09 22:07:076048 ASSERT_FALSE(response.complete());
6049
6050 resolver_->SetDnsConfigOverrides(DnsConfigOverrides());
6051
Eric Orthc823a23d2018-10-30 22:12:486052 dns_client_->CompleteDelayedTransactions();
Eric Orthc1eb1292018-10-09 22:07:076053 EXPECT_THAT(response.result_error(), IsOk());
6054}
6055
Eric Orth960e7062019-03-08 18:43:546056// Test HostResolverManager::UpdateModeForHistogram.
6057TEST_F(HostResolverManagerDnsTest, ModeForHistogram) {
Paul Jensen41dc3e9f2018-11-06 22:10:106058 // Test Async resolver is detected.
6059 ChangeDnsConfig(CreateValidDnsConfig());
6060 EXPECT_EQ(resolver_->mode_for_histogram_,
Eric Orth960e7062019-03-08 18:43:546061 HostResolverManager::MODE_FOR_HISTOGRAM_ASYNC_DNS);
Paul Jensen41dc3e9f2018-11-06 22:10:106062
6063 // Test upgradability is detected for async DNS.
Eric Orth192e3bb2018-11-14 19:30:326064 static const std::vector<const char*> upgradable_servers(
Paul Jensen41dc3e9f2018-11-06 22:10:106065 {// Google Public DNS
6066 "8.8.8.8", "8.8.4.4", "2001:4860:4860::8888", "2001:4860:4860::8844",
6067 // Cloudflare DNS
6068 "1.1.1.1", "1.0.0.1", "2606:4700:4700::1111", "2606:4700:4700::1001",
6069 // Quad9 DNS
6070 "9.9.9.9", "149.112.112.112", "2620:fe::fe", "2620:fe::9"});
6071 for (const char* upgradable_server : upgradable_servers) {
6072 IPAddress ip_address;
6073 ASSERT_TRUE(ip_address.AssignFromIPLiteral(upgradable_server));
6074 DnsConfig dns_config;
6075 dns_config.nameservers.push_back(
6076 IPEndPoint(ip_address, dns_protocol::kDefaultPort));
6077 ChangeDnsConfig(dns_config);
6078 EXPECT_EQ(
6079 resolver_->mode_for_histogram_,
Eric Orth960e7062019-03-08 18:43:546080 HostResolverManager::MODE_FOR_HISTOGRAM_ASYNC_DNS_PRIVATE_SUPPORTS_DOH);
Paul Jensen41dc3e9f2018-11-06 22:10:106081 }
6082
6083 // Test system resolver is detected.
Eric Orth4e55b362019-05-07 22:00:036084 resolver_->SetDnsClientEnabled(false);
Paul Jensen41dc3e9f2018-11-06 22:10:106085 ChangeDnsConfig(CreateValidDnsConfig());
6086 EXPECT_EQ(resolver_->mode_for_histogram_,
Eric Orth960e7062019-03-08 18:43:546087 HostResolverManager::MODE_FOR_HISTOGRAM_SYSTEM);
Paul Jensen41dc3e9f2018-11-06 22:10:106088
6089 // Test upgradability is detected for system resolver.
6090 for (const char* upgradable_server : upgradable_servers) {
6091 IPAddress ip_address;
6092 ASSERT_TRUE(ip_address.AssignFromIPLiteral(upgradable_server));
6093 DnsConfig dns_config;
6094 dns_config.nameservers.push_back(
6095 IPEndPoint(ip_address, dns_protocol::kDefaultPort));
6096 ChangeDnsConfig(dns_config);
6097 EXPECT_EQ(resolver_->mode_for_histogram_,
Eric Orth960e7062019-03-08 18:43:546098 HostResolverManager::MODE_FOR_HISTOGRAM_SYSTEM_SUPPORTS_DOH);
Paul Jensen41dc3e9f2018-11-06 22:10:106099 }
6100}
6101
Eric Orth960e7062019-03-08 18:43:546102TEST_F(HostResolverManagerDnsTest, TxtQuery) {
Eric Orth828bd3ae2018-12-12 17:30:366103 // Simulate two separate DNS records, each with multiple strings.
6104 std::vector<std::string> foo_records = {"foo1", "foo2", "foo3"};
6105 std::vector<std::string> bar_records = {"bar1", "bar2"};
6106 std::vector<std::vector<std::string>> text_records = {foo_records,
6107 bar_records};
6108
6109 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136110 rules.emplace_back("host", dns_protocol::kTypeTXT, false /* secure */,
dalykc0ab0722019-03-14 17:00:586111 MockDnsClientRule::Result(BuildTestDnsTextResponse(
6112 "host", std::move(text_records))),
Eric Orth828bd3ae2018-12-12 17:30:366113 false /* delay */);
6114
6115 CreateResolver();
6116 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6117
6118 HostResolver::ResolveHostParameters parameters;
6119 parameters.dns_query_type = DnsQueryType::TXT;
6120
Eric Orth117e1992019-04-17 00:24:156121 ResolveHostResponseHelper response(resolver_->CreateRequest(
6122 HostPortPair("host", 108), NetLogWithSource(), parameters,
6123 request_context_.get(), host_cache_.get()));
Eric Orth828bd3ae2018-12-12 17:30:366124 EXPECT_THAT(response.result_error(), IsOk());
6125 EXPECT_FALSE(response.request()->GetAddressResults());
6126 EXPECT_FALSE(response.request()->GetHostnameResults());
6127
6128 // Order between separate DNS records is undefined, but each record should
6129 // stay in order as that order may be meaningful.
6130 ASSERT_THAT(response.request()->GetTextResults(),
6131 testing::Optional(testing::UnorderedElementsAre(
6132 "foo1", "foo2", "foo3", "bar1", "bar2")));
6133 std::vector<std::string> results =
6134 response.request()->GetTextResults().value();
6135 EXPECT_NE(results.end(), std::search(results.begin(), results.end(),
6136 foo_records.begin(), foo_records.end()));
6137 EXPECT_NE(results.end(), std::search(results.begin(), results.end(),
6138 bar_records.begin(), bar_records.end()));
6139}
6140
Eric Orth960e7062019-03-08 18:43:546141TEST_F(HostResolverManagerDnsTest, TxtQuery_NonexistentDomain) {
Eric Orth828bd3ae2018-12-12 17:30:366142 // Setup fallback to confirm it is not used for non-address results.
6143 set_allow_fallback_to_proctask(true);
6144 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
6145 proc_->SignalMultiple(1u);
6146
6147 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136148 rules.emplace_back("host", dns_protocol::kTypeTXT, false /* secure */,
Eric Orth828bd3ae2018-12-12 17:30:366149 MockDnsClientRule::Result(MockDnsClientRule::NODOMAIN),
6150 false /* delay */);
6151
6152 CreateResolver();
6153 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6154
6155 HostResolver::ResolveHostParameters parameters;
6156 parameters.dns_query_type = DnsQueryType::TXT;
6157
Eric Orth117e1992019-04-17 00:24:156158 ResolveHostResponseHelper response(resolver_->CreateRequest(
6159 HostPortPair("host", 108), NetLogWithSource(), parameters,
6160 request_context_.get(), host_cache_.get()));
Eric Orth828bd3ae2018-12-12 17:30:366161 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
6162 EXPECT_FALSE(response.request()->GetAddressResults());
6163 EXPECT_FALSE(response.request()->GetTextResults());
6164 EXPECT_FALSE(response.request()->GetHostnameResults());
6165}
6166
Eric Orth960e7062019-03-08 18:43:546167TEST_F(HostResolverManagerDnsTest, TxtQuery_Failure) {
Eric Orth828bd3ae2018-12-12 17:30:366168 // Setup fallback to confirm it is not used for non-address results.
6169 set_allow_fallback_to_proctask(true);
6170 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
6171 proc_->SignalMultiple(1u);
6172
6173 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136174 rules.emplace_back("host", dns_protocol::kTypeTXT, false /* secure */,
6175 MockDnsClientRule::Result(MockDnsClientRule::FAIL),
6176 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:366177
6178 CreateResolver();
6179 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6180
6181 HostResolver::ResolveHostParameters parameters;
6182 parameters.dns_query_type = DnsQueryType::TXT;
6183
Eric Orth117e1992019-04-17 00:24:156184 ResolveHostResponseHelper response(resolver_->CreateRequest(
6185 HostPortPair("host", 108), NetLogWithSource(), parameters,
6186 request_context_.get(), host_cache_.get()));
Eric Orth828bd3ae2018-12-12 17:30:366187 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
6188 EXPECT_FALSE(response.request()->GetAddressResults());
6189 EXPECT_FALSE(response.request()->GetTextResults());
6190 EXPECT_FALSE(response.request()->GetHostnameResults());
6191}
6192
Eric Orth960e7062019-03-08 18:43:546193TEST_F(HostResolverManagerDnsTest, TxtQuery_Timeout) {
Eric Orth828bd3ae2018-12-12 17:30:366194 // Setup fallback to confirm it is not used for non-address results.
6195 set_allow_fallback_to_proctask(true);
6196 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
6197 proc_->SignalMultiple(1u);
6198
6199 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136200 rules.emplace_back("host", dns_protocol::kTypeTXT, false /* secure */,
6201 MockDnsClientRule::Result(MockDnsClientRule::TIMEOUT),
6202 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:366203
6204 CreateResolver();
6205 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6206
6207 HostResolver::ResolveHostParameters parameters;
6208 parameters.dns_query_type = DnsQueryType::TXT;
6209
Eric Orth117e1992019-04-17 00:24:156210 ResolveHostResponseHelper response(resolver_->CreateRequest(
6211 HostPortPair("host", 108), NetLogWithSource(), parameters,
6212 request_context_.get(), host_cache_.get()));
Eric Orth828bd3ae2018-12-12 17:30:366213 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_TIMED_OUT));
6214 EXPECT_FALSE(response.request()->GetAddressResults());
6215 EXPECT_FALSE(response.request()->GetTextResults());
6216 EXPECT_FALSE(response.request()->GetHostnameResults());
6217}
6218
Eric Orth960e7062019-03-08 18:43:546219TEST_F(HostResolverManagerDnsTest, TxtQuery_Empty) {
Eric Orth828bd3ae2018-12-12 17:30:366220 // Setup fallback to confirm it is not used for non-address results.
6221 set_allow_fallback_to_proctask(true);
6222 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
6223 proc_->SignalMultiple(1u);
6224
6225 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136226 rules.emplace_back("host", dns_protocol::kTypeTXT, false /* secure */,
6227 MockDnsClientRule::Result(MockDnsClientRule::EMPTY),
6228 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:366229
6230 CreateResolver();
6231 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6232
6233 HostResolver::ResolveHostParameters parameters;
6234 parameters.dns_query_type = DnsQueryType::TXT;
6235
Eric Orth117e1992019-04-17 00:24:156236 ResolveHostResponseHelper response(resolver_->CreateRequest(
6237 HostPortPair("host", 108), NetLogWithSource(), parameters,
6238 request_context_.get(), host_cache_.get()));
Eric Orth828bd3ae2018-12-12 17:30:366239 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
6240 EXPECT_FALSE(response.request()->GetAddressResults());
6241 EXPECT_FALSE(response.request()->GetTextResults());
6242 EXPECT_FALSE(response.request()->GetHostnameResults());
6243}
6244
Eric Orth960e7062019-03-08 18:43:546245TEST_F(HostResolverManagerDnsTest, TxtQuery_Malformed) {
Eric Orth828bd3ae2018-12-12 17:30:366246 // Setup fallback to confirm it is not used for non-address results.
6247 set_allow_fallback_to_proctask(true);
6248 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
6249 proc_->SignalMultiple(1u);
6250
6251 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136252 rules.emplace_back("host", dns_protocol::kTypeTXT, false /* secure */,
Eric Orth828bd3ae2018-12-12 17:30:366253 MockDnsClientRule::Result(MockDnsClientRule::MALFORMED),
6254 false /* delay */);
6255
6256 CreateResolver();
6257 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6258
6259 HostResolver::ResolveHostParameters parameters;
6260 parameters.dns_query_type = DnsQueryType::TXT;
6261
Eric Orth117e1992019-04-17 00:24:156262 ResolveHostResponseHelper response(resolver_->CreateRequest(
6263 HostPortPair("host", 108), NetLogWithSource(), parameters,
6264 request_context_.get(), host_cache_.get()));
Eric Orth828bd3ae2018-12-12 17:30:366265 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE));
6266 EXPECT_FALSE(response.request()->GetAddressResults());
6267 EXPECT_FALSE(response.request()->GetTextResults());
6268 EXPECT_FALSE(response.request()->GetHostnameResults());
6269}
6270
Eric Orth960e7062019-03-08 18:43:546271TEST_F(HostResolverManagerDnsTest, TxtQuery_MismatchedName) {
Eric Orth828bd3ae2018-12-12 17:30:366272 std::vector<std::vector<std::string>> text_records = {{"text"}};
6273 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136274 rules.emplace_back("host", dns_protocol::kTypeTXT, false /* secure */,
dalykc0ab0722019-03-14 17:00:586275 MockDnsClientRule::Result(BuildTestDnsTextResponse(
Eric Orth828bd3ae2018-12-12 17:30:366276 "host", std::move(text_records), "not.host")),
6277 false /* delay */);
6278
6279 CreateResolver();
6280 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6281
6282 HostResolver::ResolveHostParameters parameters;
6283 parameters.dns_query_type = DnsQueryType::TXT;
6284
Eric Orth117e1992019-04-17 00:24:156285 ResolveHostResponseHelper response(resolver_->CreateRequest(
6286 HostPortPair("host", 108), NetLogWithSource(), parameters,
6287 request_context_.get(), host_cache_.get()));
Eric Orth828bd3ae2018-12-12 17:30:366288 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE));
6289 EXPECT_FALSE(response.request()->GetAddressResults());
6290 EXPECT_FALSE(response.request()->GetTextResults());
6291 EXPECT_FALSE(response.request()->GetHostnameResults());
6292}
6293
Eric Orth960e7062019-03-08 18:43:546294TEST_F(HostResolverManagerDnsTest, TxtQuery_WrongType) {
Eric Orth828bd3ae2018-12-12 17:30:366295 // Respond to a TXT query with an A response.
6296 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136297 rules.emplace_back("host", dns_protocol::kTypeTXT, false /* secure */,
Eric Orth828bd3ae2018-12-12 17:30:366298 MockDnsClientRule::Result(
6299 BuildTestDnsResponse("host", IPAddress(1, 2, 3, 4))),
6300 false /* delay */);
6301
6302 CreateResolver();
6303 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6304
6305 HostResolver::ResolveHostParameters parameters;
6306 parameters.dns_query_type = DnsQueryType::TXT;
6307
6308 // Responses for the wrong type should be ignored.
Eric Orth117e1992019-04-17 00:24:156309 ResolveHostResponseHelper response(resolver_->CreateRequest(
6310 HostPortPair("ok", 108), NetLogWithSource(), parameters,
6311 request_context_.get(), host_cache_.get()));
Eric Orth828bd3ae2018-12-12 17:30:366312 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
6313 EXPECT_FALSE(response.request()->GetAddressResults());
6314 EXPECT_FALSE(response.request()->GetTextResults());
6315 EXPECT_FALSE(response.request()->GetHostnameResults());
6316}
6317
Eric Ortha625b042019-01-16 01:14:456318// Same as TxtQuery except we specify DNS HostResolverSource instead of relying
6319// on automatic determination. Expect same results since DNS should be what we
6320// automatically determine, but some slightly different logic paths are
6321// involved.
Eric Orth960e7062019-03-08 18:43:546322TEST_F(HostResolverManagerDnsTest, TxtDnsQuery) {
Eric Orth828bd3ae2018-12-12 17:30:366323 // Simulate two separate DNS records, each with multiple strings.
6324 std::vector<std::string> foo_records = {"foo1", "foo2", "foo3"};
6325 std::vector<std::string> bar_records = {"bar1", "bar2"};
6326 std::vector<std::vector<std::string>> text_records = {foo_records,
6327 bar_records};
6328
6329 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136330 rules.emplace_back("host", dns_protocol::kTypeTXT, false /* secure */,
dalykc0ab0722019-03-14 17:00:586331 MockDnsClientRule::Result(BuildTestDnsTextResponse(
6332 "host", std::move(text_records))),
Eric Orth828bd3ae2018-12-12 17:30:366333 false /* delay */);
6334
6335 CreateResolver();
6336 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6337
6338 HostResolver::ResolveHostParameters parameters;
6339 parameters.source = HostResolverSource::DNS;
6340 parameters.dns_query_type = DnsQueryType::TXT;
6341
Eric Orth117e1992019-04-17 00:24:156342 ResolveHostResponseHelper response(resolver_->CreateRequest(
6343 HostPortPair("host", 108), NetLogWithSource(), parameters,
6344 request_context_.get(), host_cache_.get()));
Eric Orth828bd3ae2018-12-12 17:30:366345 EXPECT_THAT(response.result_error(), IsOk());
6346 EXPECT_FALSE(response.request()->GetAddressResults());
6347 EXPECT_FALSE(response.request()->GetHostnameResults());
6348
6349 // Order between separate DNS records is undefined, but each record should
6350 // stay in order as that order may be meaningful.
6351 ASSERT_THAT(response.request()->GetTextResults(),
6352 testing::Optional(testing::UnorderedElementsAre(
6353 "foo1", "foo2", "foo3", "bar1", "bar2")));
6354 std::vector<std::string> results =
6355 response.request()->GetTextResults().value();
6356 EXPECT_NE(results.end(), std::search(results.begin(), results.end(),
6357 foo_records.begin(), foo_records.end()));
6358 EXPECT_NE(results.end(), std::search(results.begin(), results.end(),
6359 bar_records.begin(), bar_records.end()));
6360}
6361
Eric Orth960e7062019-03-08 18:43:546362TEST_F(HostResolverManagerDnsTest, PtrQuery) {
Eric Orthe9db8d232019-01-14 21:24:456363 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136364 rules.emplace_back("host", dns_protocol::kTypePTR, false /* secure */,
Eric Orthe9db8d232019-01-14 21:24:456365 MockDnsClientRule::Result(BuildTestDnsPointerResponse(
6366 "host", {"foo.com", "bar.com"})),
6367 false /* delay */);
6368
6369 CreateResolver();
6370 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6371
6372 HostResolver::ResolveHostParameters parameters;
6373 parameters.dns_query_type = DnsQueryType::PTR;
6374
Eric Orth117e1992019-04-17 00:24:156375 ResolveHostResponseHelper response(resolver_->CreateRequest(
6376 HostPortPair("host", 108), NetLogWithSource(), parameters,
6377 request_context_.get(), host_cache_.get()));
Eric Orthe9db8d232019-01-14 21:24:456378 EXPECT_THAT(response.result_error(), IsOk());
6379 EXPECT_FALSE(response.request()->GetAddressResults());
6380 EXPECT_FALSE(response.request()->GetTextResults());
6381
6382 // Order between separate records is undefined.
6383 EXPECT_THAT(response.request()->GetHostnameResults(),
6384 testing::Optional(testing::UnorderedElementsAre(
6385 HostPortPair("foo.com", 108), HostPortPair("bar.com", 108))));
6386}
6387
Eric Orth960e7062019-03-08 18:43:546388TEST_F(HostResolverManagerDnsTest, PtrQuery_Ip) {
Eric Orthe9db8d232019-01-14 21:24:456389 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136390 rules.emplace_back("8.8.8.8", dns_protocol::kTypePTR, false /* secure */,
Eric Orthe9db8d232019-01-14 21:24:456391 MockDnsClientRule::Result(BuildTestDnsPointerResponse(
6392 "8.8.8.8", {"foo.com", "bar.com"})),
6393 false /* delay */);
6394
6395 CreateResolver();
6396 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6397
6398 HostResolver::ResolveHostParameters parameters;
6399 parameters.dns_query_type = DnsQueryType::PTR;
6400
Eric Orth117e1992019-04-17 00:24:156401 ResolveHostResponseHelper response(resolver_->CreateRequest(
6402 HostPortPair("8.8.8.8", 108), NetLogWithSource(), parameters,
6403 request_context_.get(), host_cache_.get()));
Eric Orthe9db8d232019-01-14 21:24:456404 EXPECT_THAT(response.result_error(), IsOk());
6405 EXPECT_FALSE(response.request()->GetAddressResults());
6406 EXPECT_FALSE(response.request()->GetTextResults());
6407
6408 // Order between separate records is undefined.
6409 EXPECT_THAT(response.request()->GetHostnameResults(),
6410 testing::Optional(testing::UnorderedElementsAre(
6411 HostPortPair("foo.com", 108), HostPortPair("bar.com", 108))));
6412}
6413
Eric Orth960e7062019-03-08 18:43:546414TEST_F(HostResolverManagerDnsTest, PtrQuery_NonexistentDomain) {
Eric Orthe9db8d232019-01-14 21:24:456415 // Setup fallback to confirm it is not used for non-address results.
6416 set_allow_fallback_to_proctask(true);
6417 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
6418 proc_->SignalMultiple(1u);
6419
6420 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136421 rules.emplace_back("host", dns_protocol::kTypePTR, false /* secure */,
Eric Orthe9db8d232019-01-14 21:24:456422 MockDnsClientRule::Result(MockDnsClientRule::NODOMAIN),
6423 false /* delay */);
6424
6425 CreateResolver();
6426 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6427
6428 HostResolver::ResolveHostParameters parameters;
6429 parameters.dns_query_type = DnsQueryType::PTR;
6430
Eric Orth117e1992019-04-17 00:24:156431 ResolveHostResponseHelper response(resolver_->CreateRequest(
6432 HostPortPair("host", 108), NetLogWithSource(), parameters,
6433 request_context_.get(), host_cache_.get()));
Eric Orthe9db8d232019-01-14 21:24:456434 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
6435 EXPECT_FALSE(response.request()->GetAddressResults());
6436 EXPECT_FALSE(response.request()->GetTextResults());
6437 EXPECT_FALSE(response.request()->GetHostnameResults());
6438}
6439
Eric Orth960e7062019-03-08 18:43:546440TEST_F(HostResolverManagerDnsTest, PtrQuery_Failure) {
Eric Orthe9db8d232019-01-14 21:24:456441 // Setup fallback to confirm it is not used for non-address results.
6442 set_allow_fallback_to_proctask(true);
6443 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
6444 proc_->SignalMultiple(1u);
6445
6446 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136447 rules.emplace_back("host", dns_protocol::kTypePTR, false /* secure */,
6448 MockDnsClientRule::Result(MockDnsClientRule::FAIL),
6449 false /* delay */);
Eric Orthe9db8d232019-01-14 21:24:456450
6451 CreateResolver();
6452 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6453
6454 HostResolver::ResolveHostParameters parameters;
6455 parameters.dns_query_type = DnsQueryType::PTR;
6456
Eric Orth117e1992019-04-17 00:24:156457 ResolveHostResponseHelper response(resolver_->CreateRequest(
6458 HostPortPair("host", 108), NetLogWithSource(), parameters,
6459 request_context_.get(), host_cache_.get()));
Eric Orthe9db8d232019-01-14 21:24:456460 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
6461 EXPECT_FALSE(response.request()->GetAddressResults());
6462 EXPECT_FALSE(response.request()->GetTextResults());
6463 EXPECT_FALSE(response.request()->GetHostnameResults());
6464}
6465
Eric Orth960e7062019-03-08 18:43:546466TEST_F(HostResolverManagerDnsTest, PtrQuery_Timeout) {
Eric Orthe9db8d232019-01-14 21:24:456467 // Setup fallback to confirm it is not used for non-address results.
6468 set_allow_fallback_to_proctask(true);
6469 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
6470 proc_->SignalMultiple(1u);
6471
6472 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136473 rules.emplace_back("host", dns_protocol::kTypePTR, false /* secure */,
6474 MockDnsClientRule::Result(MockDnsClientRule::TIMEOUT),
6475 false /* delay */);
Eric Orthe9db8d232019-01-14 21:24:456476
6477 CreateResolver();
6478 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6479
6480 HostResolver::ResolveHostParameters parameters;
6481 parameters.dns_query_type = DnsQueryType::PTR;
6482
Eric Orth117e1992019-04-17 00:24:156483 ResolveHostResponseHelper response(resolver_->CreateRequest(
6484 HostPortPair("host", 108), NetLogWithSource(), parameters,
6485 request_context_.get(), host_cache_.get()));
Eric Orthe9db8d232019-01-14 21:24:456486 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_TIMED_OUT));
6487 EXPECT_FALSE(response.request()->GetAddressResults());
6488 EXPECT_FALSE(response.request()->GetTextResults());
6489 EXPECT_FALSE(response.request()->GetHostnameResults());
6490}
6491
Eric Orth960e7062019-03-08 18:43:546492TEST_F(HostResolverManagerDnsTest, PtrQuery_Empty) {
Eric Orthe9db8d232019-01-14 21:24:456493 // Setup fallback to confirm it is not used for non-address results.
6494 set_allow_fallback_to_proctask(true);
6495 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
6496 proc_->SignalMultiple(1u);
6497
6498 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136499 rules.emplace_back("host", dns_protocol::kTypePTR, false /* secure */,
6500 MockDnsClientRule::Result(MockDnsClientRule::EMPTY),
6501 false /* delay */);
Eric Orthe9db8d232019-01-14 21:24:456502
6503 CreateResolver();
6504 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6505
6506 HostResolver::ResolveHostParameters parameters;
6507 parameters.dns_query_type = DnsQueryType::PTR;
6508
Eric Orth117e1992019-04-17 00:24:156509 ResolveHostResponseHelper response(resolver_->CreateRequest(
6510 HostPortPair("host", 108), NetLogWithSource(), parameters,
6511 request_context_.get(), host_cache_.get()));
Eric Orthe9db8d232019-01-14 21:24:456512 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
6513 EXPECT_FALSE(response.request()->GetAddressResults());
6514 EXPECT_FALSE(response.request()->GetTextResults());
6515 EXPECT_FALSE(response.request()->GetHostnameResults());
6516}
6517
Eric Orth960e7062019-03-08 18:43:546518TEST_F(HostResolverManagerDnsTest, PtrQuery_Malformed) {
Eric Orthe9db8d232019-01-14 21:24:456519 // Setup fallback to confirm it is not used for non-address results.
6520 set_allow_fallback_to_proctask(true);
6521 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
6522 proc_->SignalMultiple(1u);
6523
6524 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136525 rules.emplace_back("host", dns_protocol::kTypePTR, false /* secure */,
Eric Orthe9db8d232019-01-14 21:24:456526 MockDnsClientRule::Result(MockDnsClientRule::MALFORMED),
6527 false /* delay */);
6528
6529 CreateResolver();
6530 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6531
6532 HostResolver::ResolveHostParameters parameters;
6533 parameters.dns_query_type = DnsQueryType::PTR;
6534
Eric Orth117e1992019-04-17 00:24:156535 ResolveHostResponseHelper response(resolver_->CreateRequest(
6536 HostPortPair("host", 108), NetLogWithSource(), parameters,
6537 request_context_.get(), host_cache_.get()));
Eric Orthe9db8d232019-01-14 21:24:456538 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE));
6539 EXPECT_FALSE(response.request()->GetAddressResults());
6540 EXPECT_FALSE(response.request()->GetTextResults());
6541 EXPECT_FALSE(response.request()->GetHostnameResults());
6542}
6543
Eric Orth960e7062019-03-08 18:43:546544TEST_F(HostResolverManagerDnsTest, PtrQuery_MismatchedName) {
Eric Orthe9db8d232019-01-14 21:24:456545 std::vector<std::string> ptr_records = {{"foo.com"}};
6546 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136547 rules.emplace_back("host", dns_protocol::kTypePTR, false /* secure */,
Eric Orthe9db8d232019-01-14 21:24:456548 MockDnsClientRule::Result(BuildTestDnsPointerResponse(
6549 "host", std::move(ptr_records), "not.host")),
6550 false /* delay */);
6551
6552 CreateResolver();
6553 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6554
6555 HostResolver::ResolveHostParameters parameters;
6556 parameters.dns_query_type = DnsQueryType::PTR;
6557
Eric Orth117e1992019-04-17 00:24:156558 ResolveHostResponseHelper response(resolver_->CreateRequest(
6559 HostPortPair("host", 108), NetLogWithSource(), parameters,
6560 request_context_.get(), host_cache_.get()));
Eric Orthe9db8d232019-01-14 21:24:456561 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE));
6562 EXPECT_FALSE(response.request()->GetAddressResults());
6563 EXPECT_FALSE(response.request()->GetTextResults());
6564 EXPECT_FALSE(response.request()->GetHostnameResults());
6565}
6566
Eric Orth960e7062019-03-08 18:43:546567TEST_F(HostResolverManagerDnsTest, PtrQuery_WrongType) {
Eric Orthe9db8d232019-01-14 21:24:456568 // Respond to a TXT query with an A response.
6569 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136570 rules.emplace_back("host", dns_protocol::kTypePTR, false /* secure */,
Eric Orthe9db8d232019-01-14 21:24:456571 MockDnsClientRule::Result(
6572 BuildTestDnsResponse("host", IPAddress(1, 2, 3, 4))),
6573 false /* delay */);
6574
6575 CreateResolver();
6576 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6577
6578 HostResolver::ResolveHostParameters parameters;
6579 parameters.dns_query_type = DnsQueryType::PTR;
6580
6581 // Responses for the wrong type should be ignored.
Eric Orth117e1992019-04-17 00:24:156582 ResolveHostResponseHelper response(resolver_->CreateRequest(
6583 HostPortPair("ok", 108), NetLogWithSource(), parameters,
6584 request_context_.get(), host_cache_.get()));
Eric Orthe9db8d232019-01-14 21:24:456585 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
6586 EXPECT_FALSE(response.request()->GetAddressResults());
6587 EXPECT_FALSE(response.request()->GetTextResults());
6588 EXPECT_FALSE(response.request()->GetHostnameResults());
6589}
6590
Eric Ortha625b042019-01-16 01:14:456591// Same as PtrQuery except we specify DNS HostResolverSource instead of relying
6592// on automatic determination. Expect same results since DNS should be what we
6593// automatically determine, but some slightly different logic paths are
6594// involved.
Eric Orth960e7062019-03-08 18:43:546595TEST_F(HostResolverManagerDnsTest, PtrDnsQuery) {
Eric Orthe9db8d232019-01-14 21:24:456596 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136597 rules.emplace_back("host", dns_protocol::kTypePTR, false /* secure */,
Eric Orthe9db8d232019-01-14 21:24:456598 MockDnsClientRule::Result(BuildTestDnsPointerResponse(
6599 "host", {"foo.com", "bar.com"})),
6600 false /* delay */);
6601
6602 CreateResolver();
6603 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6604
6605 HostResolver::ResolveHostParameters parameters;
6606 parameters.source = HostResolverSource::DNS;
6607 parameters.dns_query_type = DnsQueryType::PTR;
6608
Eric Orth117e1992019-04-17 00:24:156609 ResolveHostResponseHelper response(resolver_->CreateRequest(
6610 HostPortPair("host", 108), NetLogWithSource(), parameters,
6611 request_context_.get(), host_cache_.get()));
Eric Orthe9db8d232019-01-14 21:24:456612 EXPECT_THAT(response.result_error(), IsOk());
6613 EXPECT_FALSE(response.request()->GetAddressResults());
6614 EXPECT_FALSE(response.request()->GetTextResults());
6615
6616 // Order between separate records is undefined.
6617 EXPECT_THAT(response.request()->GetHostnameResults(),
6618 testing::Optional(testing::UnorderedElementsAre(
6619 HostPortPair("foo.com", 108), HostPortPair("bar.com", 108))));
6620}
6621
Eric Orth960e7062019-03-08 18:43:546622TEST_F(HostResolverManagerDnsTest, SrvQuery) {
Eric Ortha625b042019-01-16 01:14:456623 const TestServiceRecord kRecord1 = {2, 3, 1223, "foo.com"};
6624 const TestServiceRecord kRecord2 = {5, 10, 80, "bar.com"};
6625 const TestServiceRecord kRecord3 = {5, 1, 5, "google.com"};
6626 const TestServiceRecord kRecord4 = {2, 100, 12345, "chromium.org"};
6627 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136628 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
dalykc0ab0722019-03-14 17:00:586629 MockDnsClientRule::Result(BuildTestDnsServiceResponse(
Eric Ortha625b042019-01-16 01:14:456630 "host", {kRecord1, kRecord2, kRecord3, kRecord4})),
6631 false /* delay */);
6632
6633 CreateResolver();
6634 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6635
6636 HostResolver::ResolveHostParameters parameters;
6637 parameters.dns_query_type = DnsQueryType::SRV;
6638
Eric Orth117e1992019-04-17 00:24:156639 ResolveHostResponseHelper response(resolver_->CreateRequest(
6640 HostPortPair("host", 108), NetLogWithSource(), parameters,
6641 request_context_.get(), host_cache_.get()));
Eric Ortha625b042019-01-16 01:14:456642 EXPECT_THAT(response.result_error(), IsOk());
6643 EXPECT_FALSE(response.request()->GetAddressResults());
6644 EXPECT_FALSE(response.request()->GetTextResults());
6645
6646 // Expect ordered by priority, and random within a priority.
6647 base::Optional<std::vector<HostPortPair>> results =
6648 response.request()->GetHostnameResults();
6649 ASSERT_THAT(
6650 results,
6651 testing::Optional(testing::UnorderedElementsAre(
6652 HostPortPair("foo.com", 1223), HostPortPair("bar.com", 80),
6653 HostPortPair("google.com", 5), HostPortPair("chromium.org", 12345))));
6654 auto priority2 = std::vector<HostPortPair>(results.value().begin(),
6655 results.value().begin() + 2);
6656 EXPECT_THAT(priority2, testing::UnorderedElementsAre(
6657 HostPortPair("foo.com", 1223),
6658 HostPortPair("chromium.org", 12345)));
6659 auto priority5 = std::vector<HostPortPair>(results.value().begin() + 2,
6660 results.value().end());
6661 EXPECT_THAT(priority5,
6662 testing::UnorderedElementsAre(HostPortPair("bar.com", 80),
6663 HostPortPair("google.com", 5)));
6664}
6665
6666// 0-weight services are allowed. Ensure that we can handle such records,
6667// especially the case where all entries have weight 0.
Eric Orth960e7062019-03-08 18:43:546668TEST_F(HostResolverManagerDnsTest, SrvQuery_ZeroWeight) {
Eric Ortha625b042019-01-16 01:14:456669 const TestServiceRecord kRecord1 = {5, 0, 80, "bar.com"};
6670 const TestServiceRecord kRecord2 = {5, 0, 5, "google.com"};
6671 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136672 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
dalykc0ab0722019-03-14 17:00:586673 MockDnsClientRule::Result(BuildTestDnsServiceResponse(
6674 "host", {kRecord1, kRecord2})),
Eric Ortha625b042019-01-16 01:14:456675 false /* delay */);
6676
6677 CreateResolver();
6678 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6679
6680 HostResolver::ResolveHostParameters parameters;
6681 parameters.dns_query_type = DnsQueryType::SRV;
6682
Eric Orth117e1992019-04-17 00:24:156683 ResolveHostResponseHelper response(resolver_->CreateRequest(
6684 HostPortPair("host", 108), NetLogWithSource(), parameters,
6685 request_context_.get(), host_cache_.get()));
Eric Ortha625b042019-01-16 01:14:456686 EXPECT_THAT(response.result_error(), IsOk());
6687 EXPECT_FALSE(response.request()->GetAddressResults());
6688 EXPECT_FALSE(response.request()->GetTextResults());
6689
6690 // Expect ordered by priority, and random within a priority.
6691 EXPECT_THAT(response.request()->GetHostnameResults(),
6692 testing::Optional(testing::UnorderedElementsAre(
6693 HostPortPair("bar.com", 80), HostPortPair("google.com", 5))));
6694}
6695
Eric Orth960e7062019-03-08 18:43:546696TEST_F(HostResolverManagerDnsTest, SrvQuery_NonexistentDomain) {
Eric Ortha625b042019-01-16 01:14:456697 // Setup fallback to confirm it is not used for non-address results.
6698 set_allow_fallback_to_proctask(true);
6699 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
6700 proc_->SignalMultiple(1u);
6701
6702 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136703 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
Eric Ortha625b042019-01-16 01:14:456704 MockDnsClientRule::Result(MockDnsClientRule::NODOMAIN),
6705 false /* delay */);
6706
6707 CreateResolver();
6708 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6709
6710 HostResolver::ResolveHostParameters parameters;
6711 parameters.dns_query_type = DnsQueryType::SRV;
6712
Eric Orth117e1992019-04-17 00:24:156713 ResolveHostResponseHelper response(resolver_->CreateRequest(
6714 HostPortPair("host", 108), NetLogWithSource(), parameters,
6715 request_context_.get(), host_cache_.get()));
Eric Ortha625b042019-01-16 01:14:456716 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
6717 EXPECT_FALSE(response.request()->GetAddressResults());
6718 EXPECT_FALSE(response.request()->GetTextResults());
6719 EXPECT_FALSE(response.request()->GetHostnameResults());
6720}
6721
Eric Orth960e7062019-03-08 18:43:546722TEST_F(HostResolverManagerDnsTest, SrvQuery_Failure) {
Eric Ortha625b042019-01-16 01:14:456723 // Setup fallback to confirm it is not used for non-address results.
6724 set_allow_fallback_to_proctask(true);
6725 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
6726 proc_->SignalMultiple(1u);
6727
6728 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136729 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
6730 MockDnsClientRule::Result(MockDnsClientRule::FAIL),
6731 false /* delay */);
Eric Ortha625b042019-01-16 01:14:456732
6733 CreateResolver();
6734 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6735
6736 HostResolver::ResolveHostParameters parameters;
6737 parameters.dns_query_type = DnsQueryType::SRV;
6738
Eric Orth117e1992019-04-17 00:24:156739 ResolveHostResponseHelper response(resolver_->CreateRequest(
6740 HostPortPair("host", 108), NetLogWithSource(), parameters,
6741 request_context_.get(), host_cache_.get()));
Eric Ortha625b042019-01-16 01:14:456742 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
6743 EXPECT_FALSE(response.request()->GetAddressResults());
6744 EXPECT_FALSE(response.request()->GetTextResults());
6745 EXPECT_FALSE(response.request()->GetHostnameResults());
6746}
6747
Eric Orth960e7062019-03-08 18:43:546748TEST_F(HostResolverManagerDnsTest, SrvQuery_Timeout) {
Eric Ortha625b042019-01-16 01:14:456749 // Setup fallback to confirm it is not used for non-address results.
6750 set_allow_fallback_to_proctask(true);
6751 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
6752 proc_->SignalMultiple(1u);
6753
6754 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136755 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
6756 MockDnsClientRule::Result(MockDnsClientRule::TIMEOUT),
6757 false /* delay */);
Eric Ortha625b042019-01-16 01:14:456758
6759 CreateResolver();
6760 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6761
6762 HostResolver::ResolveHostParameters parameters;
6763 parameters.dns_query_type = DnsQueryType::SRV;
6764
Eric Orth117e1992019-04-17 00:24:156765 ResolveHostResponseHelper response(resolver_->CreateRequest(
6766 HostPortPair("host", 108), NetLogWithSource(), parameters,
6767 request_context_.get(), host_cache_.get()));
Eric Ortha625b042019-01-16 01:14:456768 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_TIMED_OUT));
6769 EXPECT_FALSE(response.request()->GetAddressResults());
6770 EXPECT_FALSE(response.request()->GetTextResults());
6771 EXPECT_FALSE(response.request()->GetHostnameResults());
6772}
6773
Eric Orth960e7062019-03-08 18:43:546774TEST_F(HostResolverManagerDnsTest, SrvQuery_Empty) {
Eric Ortha625b042019-01-16 01:14:456775 // Setup fallback to confirm it is not used for non-address results.
6776 set_allow_fallback_to_proctask(true);
6777 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
6778 proc_->SignalMultiple(1u);
6779
6780 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136781 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
6782 MockDnsClientRule::Result(MockDnsClientRule::EMPTY),
6783 false /* delay */);
Eric Ortha625b042019-01-16 01:14:456784
6785 CreateResolver();
6786 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6787
6788 HostResolver::ResolveHostParameters parameters;
6789 parameters.dns_query_type = DnsQueryType::SRV;
6790
Eric Orth117e1992019-04-17 00:24:156791 ResolveHostResponseHelper response(resolver_->CreateRequest(
6792 HostPortPair("host", 108), NetLogWithSource(), parameters,
6793 request_context_.get(), host_cache_.get()));
Eric Ortha625b042019-01-16 01:14:456794 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
6795 EXPECT_FALSE(response.request()->GetAddressResults());
6796 EXPECT_FALSE(response.request()->GetTextResults());
6797 EXPECT_FALSE(response.request()->GetHostnameResults());
6798}
6799
Eric Orth960e7062019-03-08 18:43:546800TEST_F(HostResolverManagerDnsTest, SrvQuery_Malformed) {
Eric Ortha625b042019-01-16 01:14:456801 // Setup fallback to confirm it is not used for non-address results.
6802 set_allow_fallback_to_proctask(true);
6803 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
6804 proc_->SignalMultiple(1u);
6805
6806 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136807 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
Eric Ortha625b042019-01-16 01:14:456808 MockDnsClientRule::Result(MockDnsClientRule::MALFORMED),
6809 false /* delay */);
6810
6811 CreateResolver();
6812 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6813
6814 HostResolver::ResolveHostParameters parameters;
6815 parameters.dns_query_type = DnsQueryType::SRV;
6816
Eric Orth117e1992019-04-17 00:24:156817 ResolveHostResponseHelper response(resolver_->CreateRequest(
6818 HostPortPair("host", 108), NetLogWithSource(), parameters,
6819 request_context_.get(), host_cache_.get()));
Eric Ortha625b042019-01-16 01:14:456820 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE));
6821 EXPECT_FALSE(response.request()->GetAddressResults());
6822 EXPECT_FALSE(response.request()->GetTextResults());
6823 EXPECT_FALSE(response.request()->GetHostnameResults());
6824}
6825
Eric Orth960e7062019-03-08 18:43:546826TEST_F(HostResolverManagerDnsTest, SrvQuery_MismatchedName) {
Eric Ortha625b042019-01-16 01:14:456827 std::vector<TestServiceRecord> srv_records = {{1, 2, 3, "foo.com"}};
6828 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136829 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
dalykc0ab0722019-03-14 17:00:586830 MockDnsClientRule::Result(BuildTestDnsServiceResponse(
Eric Ortha625b042019-01-16 01:14:456831 "host", std::move(srv_records), "not.host")),
6832 false /* delay */);
6833
6834 CreateResolver();
6835 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6836
6837 HostResolver::ResolveHostParameters parameters;
6838 parameters.dns_query_type = DnsQueryType::SRV;
6839
Eric Orth117e1992019-04-17 00:24:156840 ResolveHostResponseHelper response(resolver_->CreateRequest(
6841 HostPortPair("host", 108), NetLogWithSource(), parameters,
6842 request_context_.get(), host_cache_.get()));
Eric Ortha625b042019-01-16 01:14:456843 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE));
6844 EXPECT_FALSE(response.request()->GetAddressResults());
6845 EXPECT_FALSE(response.request()->GetTextResults());
6846 EXPECT_FALSE(response.request()->GetHostnameResults());
6847}
6848
Eric Orth960e7062019-03-08 18:43:546849TEST_F(HostResolverManagerDnsTest, SrvQuery_WrongType) {
Eric Ortha625b042019-01-16 01:14:456850 // Respond to a SRV query with an A response.
6851 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136852 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
Eric Ortha625b042019-01-16 01:14:456853 MockDnsClientRule::Result(
6854 BuildTestDnsResponse("host", IPAddress(1, 2, 3, 4))),
6855 false /* delay */);
6856
6857 CreateResolver();
6858 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6859
6860 HostResolver::ResolveHostParameters parameters;
6861 parameters.dns_query_type = DnsQueryType::SRV;
6862
6863 // Responses for the wrong type should be ignored.
Eric Orth117e1992019-04-17 00:24:156864 ResolveHostResponseHelper response(resolver_->CreateRequest(
6865 HostPortPair("ok", 108), NetLogWithSource(), parameters,
6866 request_context_.get(), host_cache_.get()));
Eric Ortha625b042019-01-16 01:14:456867 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
6868 EXPECT_FALSE(response.request()->GetAddressResults());
6869 EXPECT_FALSE(response.request()->GetTextResults());
6870 EXPECT_FALSE(response.request()->GetHostnameResults());
6871}
6872
6873// Same as SrvQuery except we specify DNS HostResolverSource instead of relying
6874// on automatic determination. Expect same results since DNS should be what we
6875// automatically determine, but some slightly different logic paths are
6876// involved.
Eric Orth960e7062019-03-08 18:43:546877TEST_F(HostResolverManagerDnsTest, SrvDnsQuery) {
Eric Ortha625b042019-01-16 01:14:456878 const TestServiceRecord kRecord1 = {2, 3, 1223, "foo.com"};
6879 const TestServiceRecord kRecord2 = {5, 10, 80, "bar.com"};
6880 const TestServiceRecord kRecord3 = {5, 1, 5, "google.com"};
6881 const TestServiceRecord kRecord4 = {2, 100, 12345, "chromium.org"};
6882 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136883 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
dalykc0ab0722019-03-14 17:00:586884 MockDnsClientRule::Result(BuildTestDnsServiceResponse(
Eric Ortha625b042019-01-16 01:14:456885 "host", {kRecord1, kRecord2, kRecord3, kRecord4})),
6886 false /* delay */);
6887
6888 CreateResolver();
6889 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6890
6891 HostResolver::ResolveHostParameters parameters;
6892 parameters.source = HostResolverSource::DNS;
6893 parameters.dns_query_type = DnsQueryType::SRV;
6894
Eric Orth117e1992019-04-17 00:24:156895 ResolveHostResponseHelper response(resolver_->CreateRequest(
6896 HostPortPair("host", 108), NetLogWithSource(), parameters,
6897 request_context_.get(), host_cache_.get()));
Eric Ortha625b042019-01-16 01:14:456898 EXPECT_THAT(response.result_error(), IsOk());
6899 EXPECT_FALSE(response.request()->GetAddressResults());
6900 EXPECT_FALSE(response.request()->GetTextResults());
6901
6902 // Expect ordered by priority, and random within a priority.
6903 base::Optional<std::vector<HostPortPair>> results =
6904 response.request()->GetHostnameResults();
6905 ASSERT_THAT(
6906 results,
6907 testing::Optional(testing::UnorderedElementsAre(
6908 HostPortPair("foo.com", 1223), HostPortPair("bar.com", 80),
6909 HostPortPair("google.com", 5), HostPortPair("chromium.org", 12345))));
6910 auto priority2 = std::vector<HostPortPair>(results.value().begin(),
6911 results.value().begin() + 2);
6912 EXPECT_THAT(priority2, testing::UnorderedElementsAre(
6913 HostPortPair("foo.com", 1223),
6914 HostPortPair("chromium.org", 12345)));
6915 auto priority5 = std::vector<HostPortPair>(results.value().begin() + 2,
6916 results.value().end());
6917 EXPECT_THAT(priority5,
6918 testing::UnorderedElementsAre(HostPortPair("bar.com", 80),
6919 HostPortPair("google.com", 5)));
6920}
6921
[email protected]259aefa2009-08-20 22:45:006922} // namespace net