blob: 2bfba68c6a383d39cff51abaf3210e6895feff9c [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
[email protected]f2cb3cf2013-03-21 01:40:535#include "net/dns/host_resolver_impl.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"
robpercival214763f2016-07-01 23:27:0155#include "testing/gmock/include/gmock/gmock.h"
[email protected]ecfa71c2008-09-09 13:28:3656#include "testing/gtest/include/gtest/gtest.h"
[email protected]212d1492008-09-05 19:38:5457
Eric Orth026776a2019-01-18 00:13:2858#if BUILDFLAG(ENABLE_MDNS)
59#include "net/dns/mdns_client_impl.h"
60#endif // BUILDFLAG(ENABLE_MDNS)
61
robpercival214763f2016-07-01 23:27:0162using net::test::IsError;
63using net::test::IsOk;
Eric Orth9871aafa2018-10-02 19:59:1864using ::testing::_;
65using ::testing::Between;
66using ::testing::ByMove;
Rob Percival94f21ad2017-11-14 10:20:2467using ::testing::NotNull;
Eric Orth9871aafa2018-10-02 19:59:1868using ::testing::Return;
robpercival214763f2016-07-01 23:27:0169
[email protected]259aefa2009-08-20 22:45:0070namespace net {
[email protected]68ad3ee2010-01-30 03:45:3971
[email protected]38b50d92012-04-19 21:07:5272namespace {
[email protected]112bd462009-12-10 07:23:4073
[email protected]78eac2a2012-03-14 19:09:2774const size_t kMaxJobs = 10u;
75const size_t kMaxRetryAttempts = 4u;
[email protected]68ad3ee2010-01-30 03:45:3976
[email protected]106ccd2c2014-06-17 09:21:0077HostResolver::Options DefaultOptions() {
78 HostResolver::Options options;
79 options.max_concurrent_resolves = kMaxJobs;
80 options.max_retry_attempts = kMaxRetryAttempts;
81 options.enable_caching = true;
82 return options;
[email protected]0f292de02012-02-01 22:28:2083}
84
85HostResolverImpl::ProcTaskParams DefaultParams(
86 HostResolverProc* resolver_proc) {
[email protected]38b50d92012-04-19 21:07:5287 return HostResolverImpl::ProcTaskParams(resolver_proc, kMaxRetryAttempts);
[email protected]0f292de02012-02-01 22:28:2088}
89
[email protected]38b50d92012-04-19 21:07:5290// A HostResolverProc that pushes each host mapped into a list and allows
91// waiting for a specific number of requests. Unlike RuleBasedHostResolverProc
[email protected]1ee9afa12013-04-16 14:18:0692// it never calls SystemHostResolverCall. By default resolves all hostnames to
[email protected]38b50d92012-04-19 21:07:5293// "127.0.0.1". After AddRule(), it resolves only names explicitly specified.
94class MockHostResolverProc : public HostResolverProc {
[email protected]57a48d32012-03-03 00:04:5595 public:
[email protected]38b50d92012-04-19 21:07:5296 struct ResolveKey {
Eric Orth322af3e42018-08-20 18:12:5997 ResolveKey(const std::string& hostname,
98 AddressFamily address_family,
99 HostResolverFlags flags)
100 : hostname(hostname), address_family(address_family), flags(flags) {}
[email protected]38b50d92012-04-19 21:07:52101 bool operator<(const ResolveKey& other) const {
Eric Orth322af3e42018-08-20 18:12:59102 return std::tie(address_family, hostname, flags) <
103 std::tie(other.address_family, other.hostname, other.flags);
[email protected]38b50d92012-04-19 21:07:52104 }
[email protected]137af622010-02-05 02:14:35105 std::string hostname;
106 AddressFamily address_family;
Eric Orth322af3e42018-08-20 18:12:59107 HostResolverFlags flags;
[email protected]137af622010-02-05 02:14:35108 };
109
[email protected]38b50d92012-04-19 21:07:52110 typedef std::vector<ResolveKey> CaptureList;
[email protected]137af622010-02-05 02:14:35111
[email protected]38b50d92012-04-19 21:07:52112 MockHostResolverProc()
113 : HostResolverProc(NULL),
[email protected]57a48d32012-03-03 00:04:55114 num_requests_waiting_(0),
115 num_slots_available_(0),
116 requests_waiting_(&lock_),
[email protected]38b50d92012-04-19 21:07:52117 slots_available_(&lock_) {
118 }
[email protected]57a48d32012-03-03 00:04:55119
120 // Waits until |count| calls to |Resolve| are blocked. Returns false when
121 // timed out.
122 bool WaitFor(unsigned count) {
123 base::AutoLock lock(lock_);
124 base::Time start_time = base::Time::Now();
125 while (num_requests_waiting_ < count) {
126 requests_waiting_.TimedWait(TestTimeouts::action_timeout());
127 if (base::Time::Now() > start_time + TestTimeouts::action_timeout())
128 return false;
129 }
130 return true;
131 }
132
133 // Signals |count| waiting calls to |Resolve|. First come first served.
134 void SignalMultiple(unsigned count) {
135 base::AutoLock lock(lock_);
136 num_slots_available_ += count;
137 slots_available_.Broadcast();
138 }
139
140 // Signals all waiting calls to |Resolve|. Beware of races.
141 void SignalAll() {
142 base::AutoLock lock(lock_);
[email protected]38b50d92012-04-19 21:07:52143 num_slots_available_ = num_requests_waiting_;
[email protected]57a48d32012-03-03 00:04:55144 slots_available_.Broadcast();
145 }
146
Eric Orth322af3e42018-08-20 18:12:59147 void AddRule(const std::string& hostname,
148 AddressFamily family,
149 const AddressList& result,
150 HostResolverFlags flags = 0) {
[email protected]38b50d92012-04-19 21:07:52151 base::AutoLock lock(lock_);
Eric Orth322af3e42018-08-20 18:12:59152 rules_[ResolveKey(hostname, family, flags)] = result;
[email protected]57a48d32012-03-03 00:04:55153 }
154
Eric Orth322af3e42018-08-20 18:12:59155 void AddRule(const std::string& hostname,
156 AddressFamily family,
157 const std::string& ip_list,
158 HostResolverFlags flags = 0,
159 const std::string& canonical_name = "") {
[email protected]38b50d92012-04-19 21:07:52160 AddressList result;
Eric Orth322af3e42018-08-20 18:12:59161 int rv = ParseAddressList(ip_list, canonical_name, &result);
[email protected]38b50d92012-04-19 21:07:52162 DCHECK_EQ(OK, rv);
Eric Orth322af3e42018-08-20 18:12:59163 AddRule(hostname, family, result, flags);
[email protected]38b50d92012-04-19 21:07:52164 }
[email protected]57a48d32012-03-03 00:04:55165
[email protected]38b50d92012-04-19 21:07:52166 void AddRuleForAllFamilies(const std::string& hostname,
Eric Orth322af3e42018-08-20 18:12:59167 const std::string& ip_list,
168 HostResolverFlags flags = 0,
169 const std::string& canonical_name = "") {
[email protected]38b50d92012-04-19 21:07:52170 AddressList result;
Eric Orth322af3e42018-08-20 18:12:59171 int rv = ParseAddressList(ip_list, canonical_name, &result);
[email protected]38b50d92012-04-19 21:07:52172 DCHECK_EQ(OK, rv);
Eric Orth322af3e42018-08-20 18:12:59173 AddRule(hostname, ADDRESS_FAMILY_UNSPECIFIED, result, flags);
174 AddRule(hostname, ADDRESS_FAMILY_IPV4, result, flags);
175 AddRule(hostname, ADDRESS_FAMILY_IPV6, result, flags);
[email protected]38b50d92012-04-19 21:07:52176 }
[email protected]137af622010-02-05 02:14:35177
dchengb03027d2014-10-21 12:00:20178 int Resolve(const std::string& hostname,
179 AddressFamily address_family,
180 HostResolverFlags host_resolver_flags,
181 AddressList* addrlist,
182 int* os_error) override {
[email protected]38b50d92012-04-19 21:07:52183 base::AutoLock lock(lock_);
Eric Orth322af3e42018-08-20 18:12:59184 capture_list_.push_back(
185 ResolveKey(hostname, address_family, host_resolver_flags));
[email protected]38b50d92012-04-19 21:07:52186 ++num_requests_waiting_;
187 requests_waiting_.Broadcast();
Francois Doraya2d01ba2017-09-25 19:17:40188 {
189 base::ScopedAllowBaseSyncPrimitivesForTesting
190 scoped_allow_base_sync_primitives;
191 while (!num_slots_available_)
192 slots_available_.Wait();
193 }
[email protected]38b50d92012-04-19 21:07:52194 DCHECK_GT(num_requests_waiting_, 0u);
195 --num_slots_available_;
196 --num_requests_waiting_;
197 if (rules_.empty()) {
[email protected]007b3f82013-04-09 08:46:45198 int rv = ParseAddressList("127.0.0.1", std::string(), addrlist);
[email protected]38b50d92012-04-19 21:07:52199 DCHECK_EQ(OK, rv);
200 return OK;
201 }
Eric Orth60931742018-11-05 23:40:57202 // Ignore HOST_RESOLVER_SYSTEM_ONLY, since it should have no impact on
203 // whether a rule matches. It should only affect cache lookups.
204 ResolveKey key(hostname, address_family,
205 host_resolver_flags & ~HOST_RESOLVER_SYSTEM_ONLY);
[email protected]38b50d92012-04-19 21:07:52206 if (rules_.count(key) == 0)
207 return ERR_NAME_NOT_RESOLVED;
208 *addrlist = rules_[key];
209 return OK;
[email protected]137af622010-02-05 02:14:35210 }
[email protected]38b50d92012-04-19 21:07:52211
212 CaptureList GetCaptureList() const {
213 CaptureList copy;
214 {
215 base::AutoLock lock(lock_);
216 copy = capture_list_;
217 }
218 return copy;
219 }
220
221 bool HasBlockedRequests() const {
222 base::AutoLock lock(lock_);
223 return num_requests_waiting_ > num_slots_available_;
224 }
225
[email protected]a9813302012-04-28 09:29:28226 protected:
Chris Watkins68b15032017-12-01 03:07:13227 ~MockHostResolverProc() override = default;
[email protected]38b50d92012-04-19 21:07:52228
[email protected]a9813302012-04-28 09:29:28229 private:
[email protected]38b50d92012-04-19 21:07:52230 mutable base::Lock lock_;
231 std::map<ResolveKey, AddressList> rules_;
232 CaptureList capture_list_;
233 unsigned num_requests_waiting_;
234 unsigned num_slots_available_;
235 base::ConditionVariable requests_waiting_;
236 base::ConditionVariable slots_available_;
237
238 DISALLOW_COPY_AND_ASSIGN(MockHostResolverProc);
239};
240
Eric Orth70992982018-07-24 00:25:00241class ResolveHostResponseHelper {
242 public:
243 using Callback =
244 base::OnceCallback<void(CompletionOnceCallback completion_callback,
245 int error)>;
246
247 ResolveHostResponseHelper() {}
248 explicit ResolveHostResponseHelper(
249 std::unique_ptr<HostResolver::ResolveHostRequest> request)
250 : request_(std::move(request)) {
251 result_error_ = request_->Start(base::BindOnce(
252 &ResolveHostResponseHelper::OnComplete, base::Unretained(this)));
253 }
254 ResolveHostResponseHelper(
255 std::unique_ptr<HostResolver::ResolveHostRequest> request,
256 Callback custom_callback)
257 : request_(std::move(request)) {
258 result_error_ = request_->Start(
259 base::BindOnce(std::move(custom_callback),
260 base::BindOnce(&ResolveHostResponseHelper::OnComplete,
261 base::Unretained(this))));
262 }
263
264 bool complete() const { return result_error_ != ERR_IO_PENDING; }
265 int result_error() {
266 WaitForCompletion();
267 return result_error_;
268 }
269
270 HostResolver::ResolveHostRequest* request() { return request_.get(); }
271
272 void CancelRequest() {
273 DCHECK(request_);
274 DCHECK(!complete());
275
276 request_ = nullptr;
277 }
278
279 void OnComplete(int error) {
280 DCHECK(!complete());
281 result_error_ = error;
282
283 run_loop_.Quit();
284 }
285
286 private:
287 void WaitForCompletion() {
288 DCHECK(request_);
289 if (complete()) {
290 return;
291 }
292 run_loop_.Run();
293 DCHECK(complete());
294 }
295
296 std::unique_ptr<HostResolver::ResolveHostRequest> request_;
297 int result_error_ = ERR_IO_PENDING;
298 base::RunLoop run_loop_;
299
300 DISALLOW_COPY_AND_ASSIGN(ResolveHostResponseHelper);
301};
302
[email protected]189163e2011-05-11 01:48:54303// Using LookupAttemptHostResolverProc simulate very long lookups, and control
304// which attempt resolves the host.
305class LookupAttemptHostResolverProc : public HostResolverProc {
306 public:
307 LookupAttemptHostResolverProc(HostResolverProc* previous,
308 int attempt_number_to_resolve,
309 int total_attempts)
310 : HostResolverProc(previous),
311 attempt_number_to_resolve_(attempt_number_to_resolve),
312 current_attempt_number_(0),
313 total_attempts_(total_attempts),
314 total_attempts_resolved_(0),
315 resolved_attempt_number_(0),
Eric Orth9a037562018-07-03 21:24:38316 num_attempts_waiting_(0),
317 all_done_(&lock_),
318 blocked_attempt_signal_(&lock_) {}
[email protected]189163e2011-05-11 01:48:54319
320 // Test harness will wait for all attempts to finish before checking the
321 // results.
Eric Orth9a037562018-07-03 21:24:38322 void WaitForAllAttemptsToFinish() {
323 base::AutoLock auto_lock(lock_);
324 while (total_attempts_resolved_ != total_attempts_) {
325 all_done_.Wait();
326 }
327 }
328
329 void WaitForNAttemptsToBeBlocked(int n) {
330 base::AutoLock auto_lock(lock_);
331 while (num_attempts_waiting_ < n) {
332 blocked_attempt_signal_.Wait();
[email protected]189163e2011-05-11 01:48:54333 }
334 }
335
336 // All attempts will wait for an attempt to resolve the host.
337 void WaitForAnAttemptToComplete() {
[email protected]189163e2011-05-11 01:48:54338 {
339 base::AutoLock auto_lock(lock_);
Francois Doraya2d01ba2017-09-25 19:17:40340 base::ScopedAllowBaseSyncPrimitivesForTesting
341 scoped_allow_base_sync_primitives;
Eric Orth9a037562018-07-03 21:24:38342 while (resolved_attempt_number_ == 0)
343 all_done_.Wait();
[email protected]189163e2011-05-11 01:48:54344 }
345 all_done_.Broadcast(); // Tell all waiting attempts to proceed.
346 }
347
348 // Returns the number of attempts that have finished the Resolve() method.
349 int total_attempts_resolved() { return total_attempts_resolved_; }
350
351 // Returns the first attempt that that has resolved the host.
352 int resolved_attempt_number() { return resolved_attempt_number_; }
353
Eric Orth9a037562018-07-03 21:24:38354 // Returns the current number of blocked attempts.
355 int num_attempts_waiting() { return num_attempts_waiting_; }
356
[email protected]189163e2011-05-11 01:48:54357 // HostResolverProc methods.
dchengb03027d2014-10-21 12:00:20358 int Resolve(const std::string& host,
359 AddressFamily address_family,
360 HostResolverFlags host_resolver_flags,
361 AddressList* addrlist,
362 int* os_error) override {
[email protected]189163e2011-05-11 01:48:54363 bool wait_for_right_attempt_to_complete = true;
364 {
365 base::AutoLock auto_lock(lock_);
366 ++current_attempt_number_;
Eric Orth9a037562018-07-03 21:24:38367 ++num_attempts_waiting_;
[email protected]189163e2011-05-11 01:48:54368 if (current_attempt_number_ == attempt_number_to_resolve_) {
369 resolved_attempt_number_ = current_attempt_number_;
370 wait_for_right_attempt_to_complete = false;
371 }
372 }
373
Eric Orth9a037562018-07-03 21:24:38374 blocked_attempt_signal_.Broadcast();
375
[email protected]189163e2011-05-11 01:48:54376 if (wait_for_right_attempt_to_complete)
377 // Wait for the attempt_number_to_resolve_ attempt to resolve.
378 WaitForAnAttemptToComplete();
379
380 int result = ResolveUsingPrevious(host, address_family, host_resolver_flags,
381 addrlist, os_error);
382
383 {
384 base::AutoLock auto_lock(lock_);
385 ++total_attempts_resolved_;
Eric Orth9a037562018-07-03 21:24:38386 --num_attempts_waiting_;
[email protected]189163e2011-05-11 01:48:54387 }
388
389 all_done_.Broadcast(); // Tell all attempts to proceed.
390
391 // Since any negative number is considered a network error, with -1 having
392 // special meaning (ERR_IO_PENDING). We could return the attempt that has
393 // resolved the host as a negative number. For example, if attempt number 3
394 // resolves the host, then this method returns -4.
395 if (result == OK)
396 return -1 - resolved_attempt_number_;
397 else
398 return result;
399 }
400
[email protected]a9813302012-04-28 09:29:28401 protected:
Chris Watkins68b15032017-12-01 03:07:13402 ~LookupAttemptHostResolverProc() override = default;
[email protected]189163e2011-05-11 01:48:54403
[email protected]a9813302012-04-28 09:29:28404 private:
[email protected]189163e2011-05-11 01:48:54405 int attempt_number_to_resolve_;
406 int current_attempt_number_; // Incremented whenever Resolve is called.
407 int total_attempts_;
408 int total_attempts_resolved_;
409 int resolved_attempt_number_;
Eric Orth9a037562018-07-03 21:24:38410 int num_attempts_waiting_;
[email protected]189163e2011-05-11 01:48:54411
412 // All attempts wait for right attempt to be resolve.
413 base::Lock lock_;
414 base::ConditionVariable all_done_;
Eric Orth9a037562018-07-03 21:24:38415 base::ConditionVariable blocked_attempt_signal_;
[email protected]189163e2011-05-11 01:48:54416};
417
cbentzel1906f872015-06-05 16:25:25418// TestHostResolverImpl's sole purpose is to mock the IPv6 reachability test.
419// By default, this pretends that IPv6 is globally reachable.
420// This class is necessary so unit tests run the same on dual-stack machines as
421// well as IPv4 only machines.
422class TestHostResolverImpl : public HostResolverImpl {
423 public:
424 TestHostResolverImpl(const Options& options, NetLog* net_log)
425 : TestHostResolverImpl(options, net_log, true) {}
426
427 TestHostResolverImpl(const Options& options,
428 NetLog* net_log,
429 bool ipv6_reachable)
430 : HostResolverImpl(options, net_log), ipv6_reachable_(ipv6_reachable) {}
431
Chris Watkins68b15032017-12-01 03:07:13432 ~TestHostResolverImpl() override = default;
cbentzel1906f872015-06-05 16:25:25433
434 private:
435 const bool ipv6_reachable_;
436
mgershaf9a9232017-04-13 20:19:03437 bool IsGloballyReachable(const IPAddress& dest,
438 const NetLogWithSource& net_log) override {
cbentzel1906f872015-06-05 16:25:25439 return ipv6_reachable_;
440 }
441};
442
Matt Menkec35d1632018-11-29 12:43:49443bool HasAddress(const IPAddress& search_address, const AddressList& addresses) {
tfarina9ed7f8c52016-02-19 17:50:18444 for (const auto& address : addresses) {
Matt Menkec35d1632018-11-29 12:43:49445 if (search_address == address.address())
tfarina9ed7f8c52016-02-19 17:50:18446 return true;
447 }
448 return false;
449}
450
451void TestBothLoopbackIPs(const std::string& host) {
tfarina9ed7f8c52016-02-19 17:50:18452 AddressList addresses;
Matt Menkec35d1632018-11-29 12:43:49453 EXPECT_TRUE(ResolveLocalHostname(host, &addresses));
tfarina9ed7f8c52016-02-19 17:50:18454 EXPECT_EQ(2u, addresses.size());
Matt Menkec35d1632018-11-29 12:43:49455 EXPECT_TRUE(HasAddress(IPAddress::IPv4Localhost(), addresses));
456 EXPECT_TRUE(HasAddress(IPAddress::IPv6Localhost(), addresses));
tfarina9ed7f8c52016-02-19 17:50:18457}
458
459void TestIPv6LoopbackOnly(const std::string& host) {
tfarina9ed7f8c52016-02-19 17:50:18460 AddressList addresses;
Matt Menkec35d1632018-11-29 12:43:49461 EXPECT_TRUE(ResolveLocalHostname(host, &addresses));
tfarina9ed7f8c52016-02-19 17:50:18462 EXPECT_EQ(1u, addresses.size());
Matt Menkec35d1632018-11-29 12:43:49463 EXPECT_TRUE(HasAddress(IPAddress::IPv6Localhost(), addresses));
tfarina9ed7f8c52016-02-19 17:50:18464}
465
[email protected]38b50d92012-04-19 21:07:52466} // namespace
[email protected]8a00f00a2009-06-12 00:49:38467
Bence Béky98447b12018-05-08 03:14:01468class HostResolverImplTest : public TestWithScopedTaskEnvironment {
[email protected]471822ca2009-01-29 11:32:26469 public:
[email protected]38b50d92012-04-19 21:07:52470 static const int kDefaultPort = 80;
471
[email protected]1d932852012-06-19 19:40:33472 HostResolverImplTest() : proc_(new MockHostResolverProc()) {}
[email protected]471822ca2009-01-29 11:32:26473
[email protected]daae1322013-09-05 18:26:50474 void CreateResolver() {
Eric Orth70992982018-07-24 00:25:00475 CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_.get()),
476 true /* ipv6_reachable */);
[email protected]daae1322013-09-05 18:26:50477 }
478
479 // This HostResolverImpl will only allow 1 outstanding resolve at a time and
480 // perform no retries.
481 void CreateSerialResolver() {
482 HostResolverImpl::ProcTaskParams params = DefaultParams(proc_.get());
483 params.max_retry_attempts = 0u;
Eric Orth70992982018-07-24 00:25:00484 CreateResolverWithLimitsAndParams(1u, params, true /* ipv6_reachable */);
[email protected]daae1322013-09-05 18:26:50485 }
486
[email protected]471822ca2009-01-29 11:32:26487 protected:
[email protected]daae1322013-09-05 18:26:50488 // testing::Test implementation:
dcheng67be2b1f2014-10-27 21:47:29489 void SetUp() override { CreateResolver(); }
[email protected]70c04ab2013-08-22 16:05:12490
dcheng67be2b1f2014-10-27 21:47:29491 void TearDown() override {
[email protected]daae1322013-09-05 18:26:50492 if (resolver_.get())
493 EXPECT_EQ(0u, resolver_->num_running_dispatcher_jobs_for_tests());
494 EXPECT_FALSE(proc_->HasBlockedRequests());
495 }
496
497 virtual void CreateResolverWithLimitsAndParams(
[email protected]106ccd2c2014-06-17 09:21:00498 size_t max_concurrent_resolves,
Eric Orth70992982018-07-24 00:25:00499 const HostResolverImpl::ProcTaskParams& params,
500 bool ipv6_reachable) {
[email protected]106ccd2c2014-06-17 09:21:00501 HostResolverImpl::Options options = DefaultOptions();
502 options.max_concurrent_resolves = max_concurrent_resolves;
Eric Orth70992982018-07-24 00:25:00503 resolver_.reset(new TestHostResolverImpl(options, NULL, ipv6_reachable));
[email protected]106ccd2c2014-06-17 09:21:00504 resolver_->set_proc_params_for_test(params);
[email protected]471822ca2009-01-29 11:32:26505 }
[email protected]aa22b242011-11-16 18:58:29506
[email protected]38b50d92012-04-19 21:07:52507 // Friendship is not inherited, so use proxies to access those.
[email protected]daae1322013-09-05 18:26:50508 size_t num_running_dispatcher_jobs() const {
[email protected]38b50d92012-04-19 21:07:52509 DCHECK(resolver_.get());
[email protected]daae1322013-09-05 18:26:50510 return resolver_->num_running_dispatcher_jobs_for_tests();
[email protected]38b50d92012-04-19 21:07:52511 }
512
Eric Orth60931742018-11-05 23:40:57513 void set_allow_fallback_to_proctask(bool allow_fallback_to_proctask) {
[email protected]16c2bd72013-06-28 01:19:22514 DCHECK(resolver_.get());
Eric Orth60931742018-11-05 23:40:57515 resolver_->allow_fallback_to_proctask_ = allow_fallback_to_proctask;
[email protected]16c2bd72013-06-28 01:19:22516 }
517
[email protected]daae1322013-09-05 18:26:50518 static unsigned maximum_dns_failures() {
519 return HostResolverImpl::kMaximumDnsFailures;
520 }
521
tfarina42834112016-09-22 13:38:20522 bool IsIPv6Reachable(const NetLogWithSource& net_log) {
sergeyub8cdc212015-05-14 18:50:37523 return resolver_->IsIPv6Reachable(net_log);
524 }
525
dalyk48b20a992019-02-25 16:10:26526 const std::pair<const HostCache::Key, HostCache::Entry>* GetCacheHit(
527 const HostCache::Key& key) {
Rob Percival94f21ad2017-11-14 10:20:24528 DCHECK(resolver_.get() && resolver_->GetHostCache());
dalyk48b20a992019-02-25 16:10:26529 return resolver_->GetHostCache()->LookupStale(
530 key, base::TimeTicks(), nullptr, false /* ignore_secure */);
Rob Percival94f21ad2017-11-14 10:20:24531 }
532
juliatuttle9fb7aeb2016-06-06 20:16:33533 void MakeCacheStale() {
534 DCHECK(resolver_.get());
535 resolver_->GetHostCache()->OnNetworkChange();
536 }
537
Eric Orth70992982018-07-24 00:25:00538 IPEndPoint CreateExpected(const std::string& ip_literal, uint16_t port) {
539 IPAddress ip;
540 bool result = ip.AssignFromIPLiteral(ip_literal);
541 DCHECK(result);
542 return IPEndPoint(ip, port);
543 }
544
[email protected]38b50d92012-04-19 21:07:52545 scoped_refptr<MockHostResolverProc> proc_;
danakj22f90e72016-04-16 01:55:40546 std::unique_ptr<HostResolverImpl> resolver_;
[email protected]471822ca2009-01-29 11:32:26547};
548
[email protected]b59ff372009-07-15 22:04:32549TEST_F(HostResolverImplTest, AsynchronousLookup) {
[email protected]38b50d92012-04-19 21:07:52550 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42");
551 proc_->SignalMultiple(1u);
[email protected]471822ca2009-01-29 11:32:26552
Eric Orth70992982018-07-24 00:25:00553 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:00554 HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:00555
556 EXPECT_THAT(response.result_error(), IsOk());
557 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
558 testing::ElementsAre(CreateExpected("192.168.1.42", 80)));
Eric Ortheb332862019-01-26 00:52:38559 EXPECT_FALSE(response.request()->GetStaleInfo());
Eric Orth70992982018-07-24 00:25:00560
561 EXPECT_EQ("just.testing", proc_->GetCaptureList()[0].hostname);
Eric Orth26fa08e2019-02-22 01:28:37562
dalyk48b20a992019-02-25 16:10:26563 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result =
564 GetCacheHit(HostCache::Key("just.testing", DnsQueryType::UNSPECIFIED,
565 0 /* host_resolver_flags */,
566 HostResolverSource::ANY));
567 EXPECT_TRUE(cache_result);
Eric Orth70992982018-07-24 00:25:00568}
569
Eric Orth00fe5a62018-08-15 22:20:00570TEST_F(HostResolverImplTest, DnsQueryType) {
571 proc_->AddRule("host", ADDRESS_FAMILY_IPV4, "192.168.1.20");
572 proc_->AddRule("host", ADDRESS_FAMILY_IPV6, "::5");
573
574 HostResolver::ResolveHostParameters parameters;
575
Eric Orth192e3bb2018-11-14 19:30:32576 parameters.dns_query_type = DnsQueryType::A;
Eric Orth00fe5a62018-08-15 22:20:00577 ResolveHostResponseHelper v4_response(resolver_->CreateRequest(
578 HostPortPair("host", 80), NetLogWithSource(), parameters));
579
Eric Orth192e3bb2018-11-14 19:30:32580 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth00fe5a62018-08-15 22:20:00581 ResolveHostResponseHelper v6_response(resolver_->CreateRequest(
582 HostPortPair("host", 80), NetLogWithSource(), parameters));
583
584 proc_->SignalMultiple(2u);
585
586 EXPECT_THAT(v4_response.result_error(), IsOk());
587 EXPECT_THAT(v4_response.request()->GetAddressResults().value().endpoints(),
588 testing::ElementsAre(CreateExpected("192.168.1.20", 80)));
589
590 EXPECT_THAT(v6_response.result_error(), IsOk());
591 EXPECT_THAT(v6_response.request()->GetAddressResults().value().endpoints(),
592 testing::ElementsAre(CreateExpected("::5", 80)));
593}
594
estarkd1bc206e2015-06-20 00:44:39595TEST_F(HostResolverImplTest, LocalhostIPV4IPV6Lookup) {
Eric Orth00fe5a62018-08-15 22:20:00596 HostResolver::ResolveHostParameters parameters;
597
Eric Orth192e3bb2018-11-14 19:30:32598 parameters.dns_query_type = DnsQueryType::A;
Eric Orth00fe5a62018-08-15 22:20:00599 ResolveHostResponseHelper v6_v4_response(resolver_->CreateRequest(
600 HostPortPair("localhost6", 80), NetLogWithSource(), parameters));
601 EXPECT_THAT(v6_v4_response.result_error(), IsOk());
602 EXPECT_THAT(v6_v4_response.request()->GetAddressResults().value().endpoints(),
603 testing::IsEmpty());
604
Eric Orth192e3bb2018-11-14 19:30:32605 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth00fe5a62018-08-15 22:20:00606 ResolveHostResponseHelper v6_v6_response(resolver_->CreateRequest(
607 HostPortPair("localhost6", 80), NetLogWithSource(), parameters));
608 EXPECT_THAT(v6_v6_response.result_error(), IsOk());
609 EXPECT_THAT(v6_v6_response.request()->GetAddressResults().value().endpoints(),
610 testing::ElementsAre(CreateExpected("::1", 80)));
611
612 ResolveHostResponseHelper v6_unsp_response(resolver_->CreateRequest(
613 HostPortPair("localhost6", 80), NetLogWithSource(), base::nullopt));
614 EXPECT_THAT(v6_unsp_response.result_error(), IsOk());
615 EXPECT_THAT(
616 v6_unsp_response.request()->GetAddressResults().value().endpoints(),
617 testing::ElementsAre(CreateExpected("::1", 80)));
618
Eric Orth192e3bb2018-11-14 19:30:32619 parameters.dns_query_type = DnsQueryType::A;
Eric Orth00fe5a62018-08-15 22:20:00620 ResolveHostResponseHelper v4_v4_response(resolver_->CreateRequest(
621 HostPortPair("localhost", 80), NetLogWithSource(), parameters));
622 EXPECT_THAT(v4_v4_response.result_error(), IsOk());
623 EXPECT_THAT(v4_v4_response.request()->GetAddressResults().value().endpoints(),
624 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
625
Eric Orth192e3bb2018-11-14 19:30:32626 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth00fe5a62018-08-15 22:20:00627 ResolveHostResponseHelper v4_v6_response(resolver_->CreateRequest(
628 HostPortPair("localhost", 80), NetLogWithSource(), parameters));
629 EXPECT_THAT(v4_v6_response.result_error(), IsOk());
630 EXPECT_THAT(v4_v6_response.request()->GetAddressResults().value().endpoints(),
631 testing::ElementsAre(CreateExpected("::1", 80)));
632
633 ResolveHostResponseHelper v4_unsp_response(resolver_->CreateRequest(
634 HostPortPair("localhost", 80), NetLogWithSource(), base::nullopt));
635 EXPECT_THAT(v4_unsp_response.result_error(), IsOk());
636 EXPECT_THAT(
637 v4_unsp_response.request()->GetAddressResults().value().endpoints(),
638 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
639 CreateExpected("::1", 80)));
640}
641
eroman368a1002016-03-04 21:52:55642TEST_F(HostResolverImplTest, ResolveIPLiteralWithHostResolverSystemOnly) {
643 const char kIpLiteral[] = "178.78.32.1";
644 // Add a mapping to tell if the resolver proc was called (if it was called,
645 // then the result will be the remapped value. Otherwise it will be the IP
646 // literal).
647 proc_->AddRuleForAllFamilies(kIpLiteral, "183.45.32.1");
648
Eric Orthdc35748e2018-08-23 22:41:48649 HostResolver::ResolveHostParameters parameters;
650 parameters.source = HostResolverSource::SYSTEM;
651 ResolveHostResponseHelper response(resolver_->CreateRequest(
652 HostPortPair(kIpLiteral, 80), NetLogWithSource(), parameters));
653
654 // IP literal resolution is expected to take precedence over source, so the
655 // result is expected to be the input IP, not the result IP from the proc rule
656 EXPECT_THAT(response.result_error(), IsOk());
657 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
658 testing::ElementsAre(CreateExpected(kIpLiteral, 80)));
Eric Ortheb332862019-01-26 00:52:38659 EXPECT_FALSE(response.request()->GetStaleInfo());
Eric Orthdc35748e2018-08-23 22:41:48660}
661
[email protected]49b70b222013-05-07 21:24:23662TEST_F(HostResolverImplTest, EmptyListMeansNameNotResolved) {
663 proc_->AddRuleForAllFamilies("just.testing", "");
664 proc_->SignalMultiple(1u);
665
Eric Orth70992982018-07-24 00:25:00666 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:00667 HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:00668
669 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
670 EXPECT_FALSE(response.request()->GetAddressResults());
Eric Ortheb332862019-01-26 00:52:38671 EXPECT_FALSE(response.request()->GetStaleInfo());
Eric Orth70992982018-07-24 00:25:00672
673 EXPECT_EQ("just.testing", proc_->GetCaptureList()[0].hostname);
674}
675
[email protected]a33347c2012-01-09 18:27:01676TEST_F(HostResolverImplTest, FailedAsynchronousLookup) {
[email protected]007b3f82013-04-09 08:46:45677 proc_->AddRuleForAllFamilies(std::string(),
678 "0.0.0.0"); // Default to failures.
[email protected]38b50d92012-04-19 21:07:52679 proc_->SignalMultiple(1u);
[email protected]a33347c2012-01-09 18:27:01680
Eric Orth70992982018-07-24 00:25:00681 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:00682 HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:00683 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
684 EXPECT_FALSE(response.request()->GetAddressResults());
Eric Ortheb332862019-01-26 00:52:38685 EXPECT_FALSE(response.request()->GetStaleInfo());
Eric Orth70992982018-07-24 00:25:00686
687 EXPECT_EQ("just.testing", proc_->GetCaptureList()[0].hostname);
688
689 // Also test that the error is not cached.
dalyk48b20a992019-02-25 16:10:26690 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result =
691 GetCacheHit(HostCache::Key("just.testing", DnsQueryType::UNSPECIFIED,
692 0 /* host_resolver_flags */,
693 HostResolverSource::ANY));
694 EXPECT_FALSE(cache_result);
Eric Orth70992982018-07-24 00:25:00695}
696
[email protected]0f292de02012-02-01 22:28:20697TEST_F(HostResolverImplTest, AbortedAsynchronousLookup) {
Eric Orth70992982018-07-24 00:25:00698 ResolveHostResponseHelper response0(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:00699 HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:00700 ASSERT_FALSE(response0.complete());
701 ASSERT_TRUE(proc_->WaitFor(1u));
702
703 // Resolver is destroyed while job is running on WorkerPool.
704 resolver_.reset();
705
706 proc_->SignalAll();
707
708 // To ensure there was no spurious callback, complete with a new resolver.
709 CreateResolver();
710 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:00711 HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:00712
713 proc_->SignalMultiple(2u);
714
715 EXPECT_THAT(response1.result_error(), IsOk());
716
717 // This request was canceled.
718 EXPECT_FALSE(response0.complete());
719}
720
Matt Menkedac3cdf62019-02-01 20:44:14721TEST_F(HostResolverImplTest, NumericIPv4Address) {
Eric Orth70992982018-07-24 00:25:00722 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:00723 HostPortPair("127.1.2.3", 5555), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:00724
725 EXPECT_THAT(response.result_error(), IsOk());
726 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
727 testing::ElementsAre(CreateExpected("127.1.2.3", 5555)));
728}
729
Matt Menkedac3cdf62019-02-01 20:44:14730TEST_F(HostResolverImplTest, NumericIPv6Address) {
[email protected]dbcff96272009-05-07 00:23:44731 // Resolve a plain IPv6 address. Don't worry about [brackets], because
732 // the caller should have removed them.
Eric Orth70992982018-07-24 00:25:00733 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:00734 HostPortPair("2001:db8::1", 5555), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:00735
736 EXPECT_THAT(response.result_error(), IsOk());
737 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
738 testing::ElementsAre(CreateExpected("2001:db8::1", 5555)));
739}
740
Matt Menkedac3cdf62019-02-01 20:44:14741TEST_F(HostResolverImplTest, EmptyHost) {
Eric Orth70992982018-07-24 00:25:00742 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:00743 HostPortPair(std::string(), 5555), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:00744
745 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
746 EXPECT_FALSE(response.request()->GetAddressResults());
747}
748
Matt Menkedac3cdf62019-02-01 20:44:14749TEST_F(HostResolverImplTest, EmptyDotsHost) {
[email protected]e806cd72013-05-17 02:08:43750 for (int i = 0; i < 16; ++i) {
Eric Orth00fe5a62018-08-15 22:20:00751 ResolveHostResponseHelper response(
752 resolver_->CreateRequest(HostPortPair(std::string(i, '.'), 5555),
753 NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:00754
755 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
756 EXPECT_FALSE(response.request()->GetAddressResults());
757 }
758}
759
Matt Menkedac3cdf62019-02-01 20:44:14760TEST_F(HostResolverImplTest, LongHost) {
Eric Orth00fe5a62018-08-15 22:20:00761 ResolveHostResponseHelper response(
762 resolver_->CreateRequest(HostPortPair(std::string(4097, 'a'), 5555),
763 NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:00764
765 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
766 EXPECT_FALSE(response.request()->GetAddressResults());
767}
768
[email protected]b59ff372009-07-15 22:04:32769TEST_F(HostResolverImplTest, DeDupeRequests) {
[email protected]b59ff372009-07-15 22:04:32770 // Start 5 requests, duplicating hosts "a" and "b". Since the resolver_proc is
[email protected]8a00f00a2009-06-12 00:49:38771 // blocked, these should all pile up until we signal it.
Eric Orth70992982018-07-24 00:25:00772 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth00fe5a62018-08-15 22:20:00773 responses.emplace_back(
774 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
775 HostPortPair("a", 80), NetLogWithSource(), base::nullopt)));
776 responses.emplace_back(
777 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
778 HostPortPair("b", 80), NetLogWithSource(), base::nullopt)));
779 responses.emplace_back(
780 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
781 HostPortPair("b", 81), NetLogWithSource(), base::nullopt)));
782 responses.emplace_back(
783 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
784 HostPortPair("a", 82), NetLogWithSource(), base::nullopt)));
785 responses.emplace_back(
786 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
787 HostPortPair("b", 83), NetLogWithSource(), base::nullopt)));
Eric Orth70992982018-07-24 00:25:00788
789 for (auto& response : responses) {
790 ASSERT_FALSE(response->complete());
791 }
792
793 proc_->SignalMultiple(2u); // One for "a", one for "b".
794
795 for (auto& response : responses) {
796 EXPECT_THAT(response->result_error(), IsOk());
797 }
798}
799
[email protected]b59ff372009-07-15 22:04:32800TEST_F(HostResolverImplTest, CancelMultipleRequests) {
Eric Orth70992982018-07-24 00:25:00801 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth00fe5a62018-08-15 22:20:00802 responses.emplace_back(
803 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
804 HostPortPair("a", 80), NetLogWithSource(), base::nullopt)));
805 responses.emplace_back(
806 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
807 HostPortPair("b", 80), NetLogWithSource(), base::nullopt)));
808 responses.emplace_back(
809 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
810 HostPortPair("b", 81), NetLogWithSource(), base::nullopt)));
811 responses.emplace_back(
812 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
813 HostPortPair("a", 82), NetLogWithSource(), base::nullopt)));
814 responses.emplace_back(
815 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
816 HostPortPair("b", 83), NetLogWithSource(), base::nullopt)));
Eric Orth70992982018-07-24 00:25:00817
818 for (auto& response : responses) {
819 ASSERT_FALSE(response->complete());
820 }
821
822 // Cancel everything except request for requests[3] ("a", 82).
823 responses[0]->CancelRequest();
824 responses[1]->CancelRequest();
825 responses[2]->CancelRequest();
826 responses[4]->CancelRequest();
827
828 proc_->SignalMultiple(2u); // One for "a", one for "b".
829
830 EXPECT_THAT(responses[3]->result_error(), IsOk());
831
832 EXPECT_FALSE(responses[0]->complete());
833 EXPECT_FALSE(responses[1]->complete());
834 EXPECT_FALSE(responses[2]->complete());
835 EXPECT_FALSE(responses[4]->complete());
836}
837
[email protected]16ee26d2012-03-08 03:34:35838TEST_F(HostResolverImplTest, CanceledRequestsReleaseJobSlots) {
Eric Orth70992982018-07-24 00:25:00839 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
840
841 // Fill up the dispatcher and queue.
842 for (unsigned i = 0; i < kMaxJobs + 1; ++i) {
843 std::string hostname = "a_";
844 hostname[1] = 'a' + i;
845
846 responses.emplace_back(
847 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:00848 HostPortPair(hostname, 80), NetLogWithSource(), base::nullopt)));
Eric Orth70992982018-07-24 00:25:00849 ASSERT_FALSE(responses.back()->complete());
850
851 responses.emplace_back(
852 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:00853 HostPortPair(hostname, 81), NetLogWithSource(), base::nullopt)));
Eric Orth70992982018-07-24 00:25:00854 ASSERT_FALSE(responses.back()->complete());
855 }
856
857 ASSERT_TRUE(proc_->WaitFor(kMaxJobs));
858
859 // Cancel all but last two.
860 for (unsigned i = 0; i < responses.size() - 2; ++i) {
861 responses[i]->CancelRequest();
862 }
863
864 ASSERT_TRUE(proc_->WaitFor(kMaxJobs + 1));
865
866 proc_->SignalAll();
867
868 size_t num_requests = responses.size();
869 EXPECT_THAT(responses[num_requests - 1]->result_error(), IsOk());
870 EXPECT_THAT(responses[num_requests - 2]->result_error(), IsOk());
871 for (unsigned i = 0; i < num_requests - 2; ++i) {
872 EXPECT_FALSE(responses[i]->complete());
873 }
874}
875
[email protected]b59ff372009-07-15 22:04:32876TEST_F(HostResolverImplTest, CancelWithinCallback) {
Eric Orth70992982018-07-24 00:25:00877 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
878 auto custom_callback = base::BindLambdaForTesting(
879 [&](CompletionOnceCallback completion_callback, int error) {
880 for (auto& response : responses) {
881 // Cancelling request is required to complete first, so that it can
882 // attempt to cancel the others. This test assumes all jobs are
883 // completed in order.
884 DCHECK(!response->complete());
885
886 response->CancelRequest();
887 }
888 std::move(completion_callback).Run(error);
889 });
890
891 ResolveHostResponseHelper cancelling_response(
Eric Orth00fe5a62018-08-15 22:20:00892 resolver_->CreateRequest(HostPortPair("a", 80), NetLogWithSource(),
893 base::nullopt),
Eric Orth70992982018-07-24 00:25:00894 std::move(custom_callback));
895
Eric Orth00fe5a62018-08-15 22:20:00896 responses.emplace_back(
897 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
898 HostPortPair("a", 81), NetLogWithSource(), base::nullopt)));
899 responses.emplace_back(
900 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
901 HostPortPair("a", 82), NetLogWithSource(), base::nullopt)));
Eric Orth70992982018-07-24 00:25:00902
903 proc_->SignalMultiple(2u); // One for "a". One for "finalrequest".
904
905 EXPECT_THAT(cancelling_response.result_error(), IsOk());
906
907 ResolveHostResponseHelper final_response(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:00908 HostPortPair("finalrequest", 70), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:00909 EXPECT_THAT(final_response.result_error(), IsOk());
910
911 for (auto& response : responses) {
912 EXPECT_FALSE(response->complete());
913 }
914}
915
[email protected]b59ff372009-07-15 22:04:32916TEST_F(HostResolverImplTest, DeleteWithinCallback) {
Eric Orth70992982018-07-24 00:25:00917 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
918 auto custom_callback = base::BindLambdaForTesting(
919 [&](CompletionOnceCallback completion_callback, int error) {
920 for (auto& response : responses) {
921 // Deleting request is required to be first, so the other requests
922 // will still be running to be deleted. This test assumes that the
923 // Jobs will be Aborted in order and the requests in order within the
924 // jobs.
925 DCHECK(!response->complete());
926 }
927
928 resolver_.reset();
929 std::move(completion_callback).Run(error);
930 });
931
932 ResolveHostResponseHelper deleting_response(
Eric Orth00fe5a62018-08-15 22:20:00933 resolver_->CreateRequest(HostPortPair("a", 80), NetLogWithSource(),
934 base::nullopt),
Eric Orth70992982018-07-24 00:25:00935 std::move(custom_callback));
936
937 // Start additional requests to be cancelled as part of the first's deletion.
938 // Assumes all requests for a job are handled in order so that the deleting
939 // request will run first and cancel the rest.
Eric Orth00fe5a62018-08-15 22:20:00940 responses.emplace_back(
941 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
942 HostPortPair("a", 81), NetLogWithSource(), base::nullopt)));
943 responses.emplace_back(
944 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
945 HostPortPair("a", 82), NetLogWithSource(), base::nullopt)));
Eric Orth70992982018-07-24 00:25:00946
947 proc_->SignalMultiple(3u);
948
949 EXPECT_THAT(deleting_response.result_error(), IsOk());
950
951 base::RunLoop().RunUntilIdle();
952 for (auto& response : responses) {
953 EXPECT_FALSE(response->complete());
954 }
955}
956
jdoerriedfede5ad2019-02-11 13:06:57957// Flaky on Fuchsia and Linux ASAN. crbug.com/930483
958#if defined(OS_FUCHSIA) || defined(OS_LINUX)
Eric Orth26fa08e2019-02-22 01:28:37959#define MAYBE_DeleteWithinAbortedCallback DISABLED_DeleteWithinAbortedCallback
jdoerriedfede5ad2019-02-11 13:06:57960#else
Eric Orth26fa08e2019-02-22 01:28:37961#define MAYBE_DeleteWithinAbortedCallback DeleteWithinAbortedCallback
jdoerriedfede5ad2019-02-11 13:06:57962#endif
Eric Orth26fa08e2019-02-22 01:28:37963TEST_F(HostResolverImplTest, MAYBE_DeleteWithinAbortedCallback) {
Eric Orth70992982018-07-24 00:25:00964 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
965 ResolveHostResponseHelper::Callback custom_callback =
966 base::BindLambdaForTesting(
967 [&](CompletionOnceCallback completion_callback, int error) {
968 for (auto& response : responses) {
969 // Deleting request is required to be first, so the other requests
970 // will still be running to be deleted. This test assumes that the
971 // Jobs will be Aborted in order and the requests in order within
972 // the jobs.
973 DCHECK(!response->complete());
974 }
975 resolver_.reset();
976 std::move(completion_callback).Run(error);
977 });
978
979 ResolveHostResponseHelper deleting_response(
Eric Orth00fe5a62018-08-15 22:20:00980 resolver_->CreateRequest(HostPortPair("a", 80), NetLogWithSource(),
981 base::nullopt),
Eric Orth70992982018-07-24 00:25:00982 std::move(custom_callback));
983
Eric Orth00fe5a62018-08-15 22:20:00984 responses.emplace_back(
985 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
986 HostPortPair("a", 81), NetLogWithSource(), base::nullopt)));
987 responses.emplace_back(
988 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
989 HostPortPair("b", 82), NetLogWithSource(), base::nullopt)));
990 responses.emplace_back(
991 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
992 HostPortPair("b", 83), NetLogWithSource(), base::nullopt)));
Eric Orth70992982018-07-24 00:25:00993
994 // Wait for all calls to queue up, trigger abort via IP address change, then
995 // signal all the queued requests to let them all try to finish.
996 EXPECT_TRUE(proc_->WaitFor(2u));
Paul Jensenf47bbab2018-09-14 16:34:04997 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
Eric Orth70992982018-07-24 00:25:00998 proc_->SignalAll();
999
1000 EXPECT_THAT(deleting_response.result_error(), IsError(ERR_NETWORK_CHANGED));
1001 base::RunLoop().RunUntilIdle();
1002 for (auto& response : responses) {
1003 EXPECT_FALSE(response->complete());
1004 }
1005}
1006
[email protected]b59ff372009-07-15 22:04:321007TEST_F(HostResolverImplTest, StartWithinCallback) {
Eric Orth70992982018-07-24 00:25:001008 std::unique_ptr<ResolveHostResponseHelper> new_response;
1009 auto custom_callback = base::BindLambdaForTesting(
1010 [&](CompletionOnceCallback completion_callback, int error) {
1011 new_response = std::make_unique<ResolveHostResponseHelper>(
1012 resolver_->CreateRequest(HostPortPair("new", 70),
Eric Orth00fe5a62018-08-15 22:20:001013 NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:001014 std::move(completion_callback).Run(error);
1015 });
1016
1017 ResolveHostResponseHelper starting_response(
Eric Orth00fe5a62018-08-15 22:20:001018 resolver_->CreateRequest(HostPortPair("a", 80), NetLogWithSource(),
1019 base::nullopt),
Eric Orth70992982018-07-24 00:25:001020 std::move(custom_callback));
1021
1022 proc_->SignalMultiple(2u); // One for "a". One for "new".
1023
1024 EXPECT_THAT(starting_response.result_error(), IsOk());
1025 EXPECT_THAT(new_response->result_error(), IsOk());
1026}
1027
[email protected]b59ff372009-07-15 22:04:321028TEST_F(HostResolverImplTest, BypassCache) {
Eric Orthdc35748e2018-08-23 22:41:481029 proc_->SignalMultiple(2u);
1030
1031 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
1032 HostPortPair("a", 80), NetLogWithSource(), base::nullopt));
1033 EXPECT_THAT(initial_response.result_error(), IsOk());
1034 EXPECT_EQ(1u, proc_->GetCaptureList().size());
1035
1036 ResolveHostResponseHelper cached_response(resolver_->CreateRequest(
1037 HostPortPair("a", 80), NetLogWithSource(), base::nullopt));
1038 EXPECT_THAT(cached_response.result_error(), IsOk());
1039 // Expect no increase to calls to |proc_| because result was cached.
1040 EXPECT_EQ(1u, proc_->GetCaptureList().size());
1041
1042 HostResolver::ResolveHostParameters parameters;
Eric Ortheb332862019-01-26 00:52:381043 parameters.cache_usage =
1044 HostResolver::ResolveHostParameters::CacheUsage::DISALLOWED;
Eric Orthdc35748e2018-08-23 22:41:481045 ResolveHostResponseHelper cache_bypassed_response(resolver_->CreateRequest(
1046 HostPortPair("a", 80), NetLogWithSource(), parameters));
1047 EXPECT_THAT(cache_bypassed_response.result_error(), IsOk());
1048 // Expect call to |proc_| because cache was bypassed.
1049 EXPECT_EQ(2u, proc_->GetCaptureList().size());
1050}
1051
Paul Jensenf47bbab2018-09-14 16:34:041052// Test that IP address changes flush the cache but initial DNS config reads
Eric Orth70992982018-07-24 00:25:001053// do not.
Eric Orth26fa08e2019-02-22 01:28:371054TEST_F(HostResolverImplTest, FlushCacheOnIPAddressChange) {
Eric Orth70992982018-07-24 00:25:001055 proc_->SignalMultiple(2u); // One before the flush, one after.
1056
Eric Orth00fe5a62018-08-15 22:20:001057 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
1058 HostPortPair("host1", 70), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:001059 EXPECT_THAT(initial_response.result_error(), IsOk());
1060 EXPECT_EQ(1u, proc_->GetCaptureList().size());
1061
Eric Orth00fe5a62018-08-15 22:20:001062 ResolveHostResponseHelper cached_response(resolver_->CreateRequest(
1063 HostPortPair("host1", 75), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:001064 EXPECT_THAT(cached_response.result_error(), IsOk());
1065 EXPECT_EQ(1u, proc_->GetCaptureList().size()); // No expected increase.
1066
1067 // Verify initial DNS config read does not flush cache.
1068 NetworkChangeNotifier::NotifyObserversOfInitialDNSConfigReadForTests();
Eric Orth00fe5a62018-08-15 22:20:001069 ResolveHostResponseHelper unflushed_response(resolver_->CreateRequest(
1070 HostPortPair("host1", 75), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:001071 EXPECT_THAT(unflushed_response.result_error(), IsOk());
1072 EXPECT_EQ(1u, proc_->GetCaptureList().size()); // No expected increase.
1073
Paul Jensenf47bbab2018-09-14 16:34:041074 // Flush cache by triggering an IP address change.
1075 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
Eric Orth70992982018-07-24 00:25:001076 base::RunLoop().RunUntilIdle(); // Notification happens async.
1077
1078 // Resolve "host1" again -- this time it won't be served from cache, so it
1079 // will complete asynchronously.
Eric Orth00fe5a62018-08-15 22:20:001080 ResolveHostResponseHelper flushed_response(resolver_->CreateRequest(
1081 HostPortPair("host1", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:001082 EXPECT_THAT(flushed_response.result_error(), IsOk());
1083 EXPECT_EQ(2u, proc_->GetCaptureList().size()); // Expected increase.
1084}
1085
Paul Jensenf47bbab2018-09-14 16:34:041086// Test that IP address changes send ERR_NETWORK_CHANGED to pending requests.
1087TEST_F(HostResolverImplTest, AbortOnIPAddressChanged) {
Eric Orth00fe5a62018-08-15 22:20:001088 ResolveHostResponseHelper response(resolver_->CreateRequest(
1089 HostPortPair("host1", 70), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:001090
1091 ASSERT_FALSE(response.complete());
1092 ASSERT_TRUE(proc_->WaitFor(1u));
1093
Paul Jensenf47bbab2018-09-14 16:34:041094 // Triggering an IP address change.
1095 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
Eric Orth70992982018-07-24 00:25:001096 base::RunLoop().RunUntilIdle(); // Notification happens async.
1097 proc_->SignalAll();
1098
1099 EXPECT_THAT(response.result_error(), IsError(ERR_NETWORK_CHANGED));
1100 EXPECT_FALSE(response.request()->GetAddressResults());
1101 EXPECT_EQ(0u, resolver_->GetHostCache()->size());
1102}
1103
pauljensen101ed372015-04-17 00:11:421104// Test that initial DNS config read signals do not abort pending requests.
1105TEST_F(HostResolverImplTest, DontAbortOnInitialDNSConfigRead) {
Eric Orth00fe5a62018-08-15 22:20:001106 ResolveHostResponseHelper response(resolver_->CreateRequest(
1107 HostPortPair("host1", 70), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:001108
1109 ASSERT_FALSE(response.complete());
1110 ASSERT_TRUE(proc_->WaitFor(1u));
1111
1112 // Triggering initial DNS config read signal.
1113 NetworkChangeNotifier::NotifyObserversOfInitialDNSConfigReadForTests();
1114 base::RunLoop().RunUntilIdle(); // Notification happens async.
1115 proc_->SignalAll();
1116
1117 EXPECT_THAT(response.result_error(), IsOk());
1118 EXPECT_TRUE(response.request()->GetAddressResults());
1119}
1120
Paul Jensenf47bbab2018-09-14 16:34:041121// Obey pool constraints after IP address has changed.
1122TEST_F(HostResolverImplTest, ObeyPoolConstraintsAfterIPAddressChange) {
[email protected]38b50d92012-04-19 21:07:521123 // Runs at most one job at a time.
1124 CreateSerialResolver();
Eric Orth70992982018-07-24 00:25:001125
1126 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth00fe5a62018-08-15 22:20:001127 responses.emplace_back(
1128 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1129 HostPortPair("a", 80), NetLogWithSource(), base::nullopt)));
1130 responses.emplace_back(
1131 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1132 HostPortPair("b", 80), NetLogWithSource(), base::nullopt)));
1133 responses.emplace_back(
1134 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1135 HostPortPair("c", 80), NetLogWithSource(), base::nullopt)));
Eric Orth70992982018-07-24 00:25:001136
1137 for (auto& response : responses) {
1138 ASSERT_FALSE(response->complete());
1139 }
1140 ASSERT_TRUE(proc_->WaitFor(1u));
1141
Paul Jensenf47bbab2018-09-14 16:34:041142 // Triggering an IP address change.
1143 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
Eric Orth70992982018-07-24 00:25:001144 base::RunLoop().RunUntilIdle(); // Notification happens async.
1145 proc_->SignalMultiple(3u); // Let the false-start go so that we can catch it.
1146
1147 // Requests should complete one at a time, with the first failing.
1148 EXPECT_THAT(responses[0]->result_error(), IsError(ERR_NETWORK_CHANGED));
1149 EXPECT_EQ(1u, num_running_dispatcher_jobs());
1150 EXPECT_FALSE(responses[1]->complete());
1151 EXPECT_FALSE(responses[2]->complete());
1152
1153 EXPECT_THAT(responses[1]->result_error(), IsOk());
1154 EXPECT_EQ(1u, num_running_dispatcher_jobs());
1155 EXPECT_FALSE(responses[2]->complete());
1156
1157 EXPECT_THAT(responses[2]->result_error(), IsOk());
1158}
1159
[email protected]b3601bc22012-02-21 21:23:201160// Tests that a new Request made from the callback of a previously aborted one
1161// will not be aborted.
Paul Jensenf47bbab2018-09-14 16:34:041162TEST_F(HostResolverImplTest, AbortOnlyExistingRequestsOnIPAddressChange) {
Eric Orth70992982018-07-24 00:25:001163 auto custom_callback_template = base::BindLambdaForTesting(
1164 [&](const HostPortPair& next_host,
1165 std::unique_ptr<ResolveHostResponseHelper>* next_response,
1166 CompletionOnceCallback completion_callback, int error) {
1167 *next_response = std::make_unique<ResolveHostResponseHelper>(
Eric Orth00fe5a62018-08-15 22:20:001168 resolver_->CreateRequest(next_host, NetLogWithSource(),
1169 base::nullopt));
Eric Orth70992982018-07-24 00:25:001170 std::move(completion_callback).Run(error);
1171 });
1172
1173 std::vector<std::unique_ptr<ResolveHostResponseHelper>> next_responses(3);
1174
1175 ResolveHostResponseHelper response0(
Eric Orth00fe5a62018-08-15 22:20:001176 resolver_->CreateRequest(HostPortPair("bbb", 80), NetLogWithSource(),
1177 base::nullopt),
Eric Orth70992982018-07-24 00:25:001178 base::BindOnce(custom_callback_template, HostPortPair("zzz", 80),
1179 &next_responses[0]));
1180
1181 ResolveHostResponseHelper response1(
Eric Orth00fe5a62018-08-15 22:20:001182 resolver_->CreateRequest(HostPortPair("eee", 80), NetLogWithSource(),
1183 base::nullopt),
Eric Orth70992982018-07-24 00:25:001184 base::BindOnce(custom_callback_template, HostPortPair("aaa", 80),
1185 &next_responses[1]));
1186
1187 ResolveHostResponseHelper response2(
Eric Orth00fe5a62018-08-15 22:20:001188 resolver_->CreateRequest(HostPortPair("ccc", 80), NetLogWithSource(),
1189 base::nullopt),
Eric Orth70992982018-07-24 00:25:001190 base::BindOnce(custom_callback_template, HostPortPair("eee", 80),
1191 &next_responses[2]));
1192
1193 // Wait until all are blocked;
1194 ASSERT_TRUE(proc_->WaitFor(3u));
Paul Jensenf47bbab2018-09-14 16:34:041195 // Trigger an IP address change.
1196 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
Eric Orth70992982018-07-24 00:25:001197 // This should abort all running jobs.
1198 base::RunLoop().RunUntilIdle();
1199
1200 EXPECT_THAT(response0.result_error(), IsError(ERR_NETWORK_CHANGED));
1201 EXPECT_THAT(response1.result_error(), IsError(ERR_NETWORK_CHANGED));
1202 EXPECT_THAT(response2.result_error(), IsError(ERR_NETWORK_CHANGED));
1203
1204 EXPECT_FALSE(next_responses[0]->complete());
1205 EXPECT_FALSE(next_responses[1]->complete());
1206 EXPECT_FALSE(next_responses[2]->complete());
1207
1208 // Unblock all calls to proc.
1209 proc_->SignalMultiple(6u);
1210
1211 // Run until the re-started requests finish.
1212 EXPECT_THAT(next_responses[0]->result_error(), IsOk());
1213 EXPECT_THAT(next_responses[1]->result_error(), IsOk());
1214 EXPECT_THAT(next_responses[2]->result_error(), IsOk());
1215
1216 // Verify that results of aborted Jobs were not cached.
1217 EXPECT_EQ(6u, proc_->GetCaptureList().size());
1218 EXPECT_EQ(3u, resolver_->GetHostCache()->size());
1219}
1220
[email protected]68ad3ee2010-01-30 03:45:391221// Tests that when the maximum threads is set to 1, requests are dequeued
1222// in order of priority.
1223TEST_F(HostResolverImplTest, HigherPriorityRequestsStartedFirst) {
[email protected]38b50d92012-04-19 21:07:521224 CreateSerialResolver();
[email protected]68ad3ee2010-01-30 03:45:391225
Eric Orth00fe5a62018-08-15 22:20:001226 HostResolver::ResolveHostParameters low_priority;
1227 low_priority.initial_priority = LOW;
1228 HostResolver::ResolveHostParameters medium_priority;
1229 medium_priority.initial_priority = MEDIUM;
1230 HostResolver::ResolveHostParameters highest_priority;
1231 highest_priority.initial_priority = HIGHEST;
1232
1233 // Note that at this point the MockHostResolverProc is blocked, so any
1234 // requests we make will not complete.
1235
1236 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
1237 responses.emplace_back(
1238 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1239 HostPortPair("req0", 80), NetLogWithSource(), low_priority)));
1240 responses.emplace_back(
1241 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1242 HostPortPair("req1", 80), NetLogWithSource(), medium_priority)));
1243 responses.emplace_back(
1244 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1245 HostPortPair("req2", 80), NetLogWithSource(), medium_priority)));
1246 responses.emplace_back(
1247 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1248 HostPortPair("req3", 80), NetLogWithSource(), low_priority)));
1249 responses.emplace_back(
1250 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1251 HostPortPair("req4", 80), NetLogWithSource(), highest_priority)));
1252 responses.emplace_back(
1253 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1254 HostPortPair("req5", 80), NetLogWithSource(), low_priority)));
1255 responses.emplace_back(
1256 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1257 HostPortPair("req6", 80), NetLogWithSource(), low_priority)));
1258 responses.emplace_back(
1259 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1260 HostPortPair("req5", 80), NetLogWithSource(), highest_priority)));
1261
1262 for (const auto& response : responses) {
1263 ASSERT_FALSE(response->complete());
1264 }
1265
1266 // Unblock the resolver thread so the requests can run.
1267 proc_->SignalMultiple(responses.size()); // More than needed.
1268
1269 // Wait for all the requests to complete successfully.
1270 for (auto& response : responses) {
1271 EXPECT_THAT(response->result_error(), IsOk());
1272 }
1273
1274 // Since we have restricted to a single concurrent thread in the jobpool,
1275 // the requests should complete in order of priority (with the exception
1276 // of the first request, which gets started right away, since there is
1277 // nothing outstanding).
1278 MockHostResolverProc::CaptureList capture_list = proc_->GetCaptureList();
1279 ASSERT_EQ(7u, capture_list.size());
1280
1281 EXPECT_EQ("req0", capture_list[0].hostname);
1282 EXPECT_EQ("req4", capture_list[1].hostname);
1283 EXPECT_EQ("req5", capture_list[2].hostname);
1284 EXPECT_EQ("req1", capture_list[3].hostname);
1285 EXPECT_EQ("req2", capture_list[4].hostname);
1286 EXPECT_EQ("req3", capture_list[5].hostname);
1287 EXPECT_EQ("req6", capture_list[6].hostname);
1288}
1289
juliatuttlec53b19a72016-05-05 13:51:311290// Test that changing a job's priority affects the dequeueing order.
juliatuttlec53b19a72016-05-05 13:51:311291TEST_F(HostResolverImplTest, ChangePriority) {
1292 CreateSerialResolver();
1293
Eric Orth26fa08e2019-02-22 01:28:371294 HostResolver::ResolveHostParameters lowest_priority;
1295 lowest_priority.initial_priority = LOWEST;
1296 HostResolver::ResolveHostParameters low_priority;
1297 low_priority.initial_priority = LOW;
1298 HostResolver::ResolveHostParameters medium_priority;
1299 medium_priority.initial_priority = MEDIUM;
juliatuttlec53b19a72016-05-05 13:51:311300
Eric Orth26fa08e2019-02-22 01:28:371301 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
1302 responses.emplace_back(
1303 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1304 HostPortPair("req0", 80), NetLogWithSource(), medium_priority)));
1305 responses.emplace_back(
1306 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1307 HostPortPair("req1", 80), NetLogWithSource(), low_priority)));
1308 responses.emplace_back(
1309 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1310 HostPortPair("req2", 80), NetLogWithSource(), lowest_priority)));
juliatuttlec53b19a72016-05-05 13:51:311311
1312 // req0 starts immediately; without ChangePriority, req1 and then req2 should
1313 // run.
Eric Orth26fa08e2019-02-22 01:28:371314 for (const auto& response : responses) {
1315 ASSERT_FALSE(response->complete());
1316 }
juliatuttlec53b19a72016-05-05 13:51:311317
Eric Orth26fa08e2019-02-22 01:28:371318 // Changing req2 to HIGHEST should make it run before req1.
juliatuttlec53b19a72016-05-05 13:51:311319 // (It can't run before req0, since req0 started immediately.)
Eric Orth26fa08e2019-02-22 01:28:371320 responses[2]->request()->ChangeRequestPriority(HIGHEST);
juliatuttlec53b19a72016-05-05 13:51:311321
1322 // Let all 3 requests finish.
1323 proc_->SignalMultiple(3u);
1324
Eric Orth26fa08e2019-02-22 01:28:371325 for (auto& response : responses) {
1326 EXPECT_THAT(response->result_error(), IsOk());
1327 }
juliatuttlec53b19a72016-05-05 13:51:311328
1329 MockHostResolverProc::CaptureList capture_list = proc_->GetCaptureList();
1330 ASSERT_EQ(3u, capture_list.size());
1331
1332 EXPECT_EQ("req0", capture_list[0].hostname);
1333 EXPECT_EQ("req2", capture_list[1].hostname);
1334 EXPECT_EQ("req1", capture_list[2].hostname);
1335}
1336
[email protected]38b50d92012-04-19 21:07:521337// Try cancelling a job which has not started yet.
[email protected]68ad3ee2010-01-30 03:45:391338TEST_F(HostResolverImplTest, CancelPendingRequest) {
[email protected]38b50d92012-04-19 21:07:521339 CreateSerialResolver();
[email protected]68ad3ee2010-01-30 03:45:391340
Eric Orth00fe5a62018-08-15 22:20:001341 HostResolver::ResolveHostParameters lowest_priority;
1342 lowest_priority.initial_priority = LOWEST;
1343 HostResolver::ResolveHostParameters low_priority;
1344 low_priority.initial_priority = LOW;
1345 HostResolver::ResolveHostParameters medium_priority;
1346 medium_priority.initial_priority = MEDIUM;
1347 HostResolver::ResolveHostParameters highest_priority;
1348 highest_priority.initial_priority = HIGHEST;
1349
Eric Orth70992982018-07-24 00:25:001350 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth00fe5a62018-08-15 22:20:001351 responses.emplace_back(
1352 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1353 HostPortPair("req0", 80), NetLogWithSource(), lowest_priority)));
1354 responses.emplace_back(
1355 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1356 HostPortPair("req1", 80), NetLogWithSource(), highest_priority)));
1357 responses.emplace_back(
1358 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1359 HostPortPair("req2", 80), NetLogWithSource(), medium_priority)));
1360 responses.emplace_back(
1361 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1362 HostPortPair("req3", 80), NetLogWithSource(), low_priority)));
1363 responses.emplace_back(
1364 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1365 HostPortPair("req4", 80), NetLogWithSource(), highest_priority)));
1366 responses.emplace_back(
1367 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1368 HostPortPair("req5", 80), NetLogWithSource(), lowest_priority)));
1369 responses.emplace_back(
1370 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1371 HostPortPair("req6", 80), NetLogWithSource(), medium_priority)));
Eric Orth70992982018-07-24 00:25:001372
1373 // Cancel some requests
1374 responses[1]->CancelRequest();
1375 responses[4]->CancelRequest();
1376 responses[5]->CancelRequest();
1377
1378 // Unblock the resolver thread so the requests can run.
1379 proc_->SignalMultiple(responses.size()); // More than needed.
1380
1381 // Let everything try to finish.
1382 base::RunLoop().RunUntilIdle();
1383
1384 // Wait for all the requests to complete succesfully.
1385 EXPECT_THAT(responses[0]->result_error(), IsOk());
1386 EXPECT_THAT(responses[2]->result_error(), IsOk());
1387 EXPECT_THAT(responses[3]->result_error(), IsOk());
1388 EXPECT_THAT(responses[6]->result_error(), IsOk());
1389
1390 // Cancelled requests shouldn't complete.
1391 EXPECT_FALSE(responses[1]->complete());
1392 EXPECT_FALSE(responses[4]->complete());
1393 EXPECT_FALSE(responses[5]->complete());
1394
1395 // Verify that they called out the the resolver proc (which runs on the
1396 // resolver thread) in the expected order.
1397 MockHostResolverProc::CaptureList capture_list = proc_->GetCaptureList();
1398 ASSERT_EQ(4u, capture_list.size());
1399
1400 EXPECT_EQ("req0", capture_list[0].hostname);
1401 EXPECT_EQ("req2", capture_list[1].hostname);
Eric Orth00fe5a62018-08-15 22:20:001402 EXPECT_EQ("req6", capture_list[2].hostname);
1403 EXPECT_EQ("req3", capture_list[3].hostname);
Eric Orth70992982018-07-24 00:25:001404}
1405
[email protected]68ad3ee2010-01-30 03:45:391406// Test that when too many requests are enqueued, old ones start to be aborted.
1407TEST_F(HostResolverImplTest, QueueOverflow) {
[email protected]38b50d92012-04-19 21:07:521408 CreateSerialResolver();
[email protected]68ad3ee2010-01-30 03:45:391409
[email protected]0f292de02012-02-01 22:28:201410 // Allow only 3 queued jobs.
1411 const size_t kMaxPendingJobs = 3u;
Eric Orth70992982018-07-24 00:25:001412 resolver_->SetMaxQueuedJobsForTesting(kMaxPendingJobs);
[email protected]68ad3ee2010-01-30 03:45:391413
Eric Orth00fe5a62018-08-15 22:20:001414 HostResolver::ResolveHostParameters lowest_priority;
1415 lowest_priority.initial_priority = LOWEST;
1416 HostResolver::ResolveHostParameters low_priority;
1417 low_priority.initial_priority = LOW;
1418 HostResolver::ResolveHostParameters medium_priority;
1419 medium_priority.initial_priority = MEDIUM;
1420 HostResolver::ResolveHostParameters highest_priority;
1421 highest_priority.initial_priority = HIGHEST;
1422
Eric Orth70992982018-07-24 00:25:001423 // Note that at this point the MockHostResolverProc is blocked, so any
1424 // requests we make will not complete.
1425
1426 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth00fe5a62018-08-15 22:20:001427 responses.emplace_back(
1428 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1429 HostPortPair("req0", 80), NetLogWithSource(), lowest_priority)));
1430 responses.emplace_back(
1431 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1432 HostPortPair("req1", 80), NetLogWithSource(), highest_priority)));
1433 responses.emplace_back(
1434 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1435 HostPortPair("req2", 80), NetLogWithSource(), medium_priority)));
1436 responses.emplace_back(
1437 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1438 HostPortPair("req3", 80), NetLogWithSource(), medium_priority)));
Eric Orth70992982018-07-24 00:25:001439
1440 // At this point, there are 3 enqueued jobs (and one "running" job).
1441 // Insertion of subsequent requests will cause evictions.
1442
Eric Orth00fe5a62018-08-15 22:20:001443 responses.emplace_back(
1444 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1445 HostPortPair("req4", 80), NetLogWithSource(), low_priority)));
1446 EXPECT_THAT(responses[4]->result_error(),
1447 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE)); // Evicts self.
1448 EXPECT_FALSE(responses[4]->request()->GetAddressResults());
Eric Orth70992982018-07-24 00:25:001449
Eric Orth00fe5a62018-08-15 22:20:001450 responses.emplace_back(
1451 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1452 HostPortPair("req5", 80), NetLogWithSource(), medium_priority)));
Eric Orth70992982018-07-24 00:25:001453 EXPECT_THAT(responses[2]->result_error(),
1454 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
1455 EXPECT_FALSE(responses[2]->request()->GetAddressResults());
1456
Eric Orth00fe5a62018-08-15 22:20:001457 responses.emplace_back(
1458 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1459 HostPortPair("req6", 80), NetLogWithSource(), highest_priority)));
Eric Orth70992982018-07-24 00:25:001460 EXPECT_THAT(responses[3]->result_error(),
1461 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
1462 EXPECT_FALSE(responses[3]->request()->GetAddressResults());
1463
Eric Orth00fe5a62018-08-15 22:20:001464 responses.emplace_back(
1465 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1466 HostPortPair("req7", 80), NetLogWithSource(), medium_priority)));
1467 EXPECT_THAT(responses[5]->result_error(),
Eric Orth70992982018-07-24 00:25:001468 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
Eric Orth00fe5a62018-08-15 22:20:001469 EXPECT_FALSE(responses[5]->request()->GetAddressResults());
Eric Orth70992982018-07-24 00:25:001470
1471 // Unblock the resolver thread so the requests can run.
1472 proc_->SignalMultiple(4u);
1473
1474 // The rest should succeed.
1475 EXPECT_THAT(responses[0]->result_error(), IsOk());
1476 EXPECT_TRUE(responses[0]->request()->GetAddressResults());
Eric Orth00fe5a62018-08-15 22:20:001477 EXPECT_THAT(responses[1]->result_error(), IsOk());
1478 EXPECT_TRUE(responses[1]->request()->GetAddressResults());
Eric Orth70992982018-07-24 00:25:001479 EXPECT_THAT(responses[6]->result_error(), IsOk());
1480 EXPECT_TRUE(responses[6]->request()->GetAddressResults());
1481 EXPECT_THAT(responses[7]->result_error(), IsOk());
1482 EXPECT_TRUE(responses[7]->request()->GetAddressResults());
1483
1484 // Verify that they called out the the resolver proc (which runs on the
1485 // resolver thread) in the expected order.
1486 MockHostResolverProc::CaptureList capture_list = proc_->GetCaptureList();
1487 ASSERT_EQ(4u, capture_list.size());
1488
1489 EXPECT_EQ("req0", capture_list[0].hostname);
Eric Orth00fe5a62018-08-15 22:20:001490 EXPECT_EQ("req1", capture_list[1].hostname);
Eric Orth70992982018-07-24 00:25:001491 EXPECT_EQ("req6", capture_list[2].hostname);
1492 EXPECT_EQ("req7", capture_list[3].hostname);
1493
1494 // Verify that the evicted (incomplete) requests were not cached.
1495 EXPECT_EQ(4u, resolver_->GetHostCache()->size());
1496
1497 for (size_t i = 0; i < responses.size(); ++i) {
1498 EXPECT_TRUE(responses[i]->complete()) << i;
1499 }
1500}
1501
1502// Tests that jobs can self-evict by setting the max queue to 0.
Eric Orth26fa08e2019-02-22 01:28:371503TEST_F(HostResolverImplTest, QueueOverflow_SelfEvict) {
Eric Orth70992982018-07-24 00:25:001504 CreateSerialResolver();
1505 resolver_->SetMaxQueuedJobsForTesting(0);
1506
1507 // Note that at this point the MockHostResolverProc is blocked, so any
1508 // requests we make will not complete.
1509
Eric Orth00fe5a62018-08-15 22:20:001510 ResolveHostResponseHelper run_response(resolver_->CreateRequest(
1511 HostPortPair("run", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:001512
Eric Orth00fe5a62018-08-15 22:20:001513 ResolveHostResponseHelper evict_response(resolver_->CreateRequest(
1514 HostPortPair("req1", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:001515 EXPECT_THAT(evict_response.result_error(),
1516 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
1517 EXPECT_FALSE(evict_response.request()->GetAddressResults());
1518
1519 proc_->SignalMultiple(1u);
1520
1521 EXPECT_THAT(run_response.result_error(), IsOk());
1522 EXPECT_TRUE(run_response.request()->GetAddressResults());
1523}
1524
Eric Orth00fe5a62018-08-15 22:20:001525// Make sure that the dns query type parameter is respected when raw IPs are
1526// passed in.
Eric Orth26fa08e2019-02-22 01:28:371527TEST_F(HostResolverImplTest, AddressFamilyWithRawIPs) {
Eric Orth00fe5a62018-08-15 22:20:001528 HostResolver::ResolveHostParameters v4_parameters;
Eric Orth192e3bb2018-11-14 19:30:321529 v4_parameters.dns_query_type = DnsQueryType::A;
Eric Orth00fe5a62018-08-15 22:20:001530
1531 HostResolver::ResolveHostParameters v6_parameters;
Eric Orth192e3bb2018-11-14 19:30:321532 v6_parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth00fe5a62018-08-15 22:20:001533
1534 ResolveHostResponseHelper v4_v4_request(resolver_->CreateRequest(
1535 HostPortPair("127.0.0.1", 80), NetLogWithSource(), v4_parameters));
1536 EXPECT_THAT(v4_v4_request.result_error(), IsOk());
1537 EXPECT_THAT(v4_v4_request.request()->GetAddressResults().value().endpoints(),
1538 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
1539
1540 ResolveHostResponseHelper v4_v6_request(resolver_->CreateRequest(
1541 HostPortPair("127.0.0.1", 80), NetLogWithSource(), v6_parameters));
1542 EXPECT_THAT(v4_v6_request.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
1543
1544 ResolveHostResponseHelper v4_unsp_request(resolver_->CreateRequest(
1545 HostPortPair("127.0.0.1", 80), NetLogWithSource(), base::nullopt));
1546 EXPECT_THAT(v4_unsp_request.result_error(), IsOk());
1547 EXPECT_THAT(
1548 v4_unsp_request.request()->GetAddressResults().value().endpoints(),
1549 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
1550
1551 ResolveHostResponseHelper v6_v4_request(resolver_->CreateRequest(
1552 HostPortPair("::1", 80), NetLogWithSource(), v4_parameters));
1553 EXPECT_THAT(v6_v4_request.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
1554
1555 ResolveHostResponseHelper v6_v6_request(resolver_->CreateRequest(
1556 HostPortPair("::1", 80), NetLogWithSource(), v6_parameters));
1557 EXPECT_THAT(v6_v6_request.result_error(), IsOk());
1558 EXPECT_THAT(v6_v6_request.request()->GetAddressResults().value().endpoints(),
1559 testing::ElementsAre(CreateExpected("::1", 80)));
1560
1561 ResolveHostResponseHelper v6_unsp_request(resolver_->CreateRequest(
1562 HostPortPair("::1", 80), NetLogWithSource(), base::nullopt));
1563 EXPECT_THAT(v6_unsp_request.result_error(), IsOk());
1564 EXPECT_THAT(
1565 v6_unsp_request.request()->GetAddressResults().value().endpoints(),
1566 testing::ElementsAre(CreateExpected("::1", 80)));
1567}
1568
Eric Orth26fa08e2019-02-22 01:28:371569TEST_F(HostResolverImplTest, LocalOnly_FromCache) {
Eric Ortheb332862019-01-26 00:52:381570 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42");
1571 proc_->SignalMultiple(1u); // Need only one.
1572
1573 HostResolver::ResolveHostParameters source_none_parameters;
1574 source_none_parameters.source = HostResolverSource::LOCAL_ONLY;
1575
1576 // First NONE query expected to complete synchronously with a cache miss.
1577 ResolveHostResponseHelper cache_miss_request(
1578 resolver_->CreateRequest(HostPortPair("just.testing", 80),
1579 NetLogWithSource(), source_none_parameters));
1580 EXPECT_TRUE(cache_miss_request.complete());
1581 EXPECT_THAT(cache_miss_request.result_error(), IsError(ERR_DNS_CACHE_MISS));
1582 EXPECT_FALSE(cache_miss_request.request()->GetAddressResults());
1583 EXPECT_FALSE(cache_miss_request.request()->GetStaleInfo());
1584
1585 // Normal query to populate the cache.
1586 ResolveHostResponseHelper normal_request(resolver_->CreateRequest(
1587 HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt));
1588 EXPECT_THAT(normal_request.result_error(), IsOk());
1589 EXPECT_FALSE(normal_request.request()->GetStaleInfo());
1590
1591 // Second NONE query expected to complete synchronously with cache hit.
1592 ResolveHostResponseHelper cache_hit_request(
1593 resolver_->CreateRequest(HostPortPair("just.testing", 80),
1594 NetLogWithSource(), source_none_parameters));
1595 EXPECT_TRUE(cache_hit_request.complete());
1596 EXPECT_THAT(cache_hit_request.result_error(), IsOk());
1597 EXPECT_THAT(
1598 cache_hit_request.request()->GetAddressResults().value().endpoints(),
1599 testing::ElementsAre(CreateExpected("192.168.1.42", 80)));
1600 EXPECT_FALSE(cache_hit_request.request()->GetStaleInfo().value().is_stale());
1601}
1602
Eric Orth26fa08e2019-02-22 01:28:371603TEST_F(HostResolverImplTest, LocalOnly_StaleEntry) {
Eric Ortheb332862019-01-26 00:52:381604 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42");
1605 proc_->SignalMultiple(1u); // Need only one.
1606
1607 HostResolver::ResolveHostParameters source_none_parameters;
1608 source_none_parameters.source = HostResolverSource::LOCAL_ONLY;
1609
1610 // First NONE query expected to complete synchronously with a cache miss.
1611 ResolveHostResponseHelper cache_miss_request(
1612 resolver_->CreateRequest(HostPortPair("just.testing", 80),
1613 NetLogWithSource(), source_none_parameters));
1614 EXPECT_TRUE(cache_miss_request.complete());
1615 EXPECT_THAT(cache_miss_request.result_error(), IsError(ERR_DNS_CACHE_MISS));
1616 EXPECT_FALSE(cache_miss_request.request()->GetAddressResults());
1617 EXPECT_FALSE(cache_miss_request.request()->GetStaleInfo());
1618
1619 // Normal query to populate the cache.
1620 ResolveHostResponseHelper normal_request(resolver_->CreateRequest(
1621 HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt));
1622 EXPECT_THAT(normal_request.result_error(), IsOk());
1623 EXPECT_FALSE(normal_request.request()->GetStaleInfo());
1624
1625 MakeCacheStale();
1626
1627 // Second NONE query still expected to complete synchronously with cache miss.
1628 ResolveHostResponseHelper stale_request(
1629 resolver_->CreateRequest(HostPortPair("just.testing", 80),
1630 NetLogWithSource(), source_none_parameters));
1631 EXPECT_TRUE(stale_request.complete());
1632 EXPECT_THAT(stale_request.result_error(), IsError(ERR_DNS_CACHE_MISS));
1633 EXPECT_FALSE(stale_request.request()->GetAddressResults());
1634 EXPECT_FALSE(stale_request.request()->GetStaleInfo());
1635}
1636
Eric Orth26fa08e2019-02-22 01:28:371637TEST_F(HostResolverImplTest, LocalOnly_FromIp) {
Eric Ortheb332862019-01-26 00:52:381638 HostResolver::ResolveHostParameters source_none_parameters;
1639 source_none_parameters.source = HostResolverSource::LOCAL_ONLY;
1640
1641 ResolveHostResponseHelper response(resolver_->CreateRequest(
1642 HostPortPair("1.2.3.4", 56), NetLogWithSource(), source_none_parameters));
1643
1644 // Expected to resolve synchronously.
1645 EXPECT_TRUE(response.complete());
1646 EXPECT_THAT(response.result_error(), IsOk());
1647 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
1648 testing::ElementsAre(CreateExpected("1.2.3.4", 56)));
1649 EXPECT_FALSE(response.request()->GetStaleInfo());
1650}
1651
Eric Orth26fa08e2019-02-22 01:28:371652TEST_F(HostResolverImplTest, LocalOnly_InvalidName) {
Eric Ortheb332862019-01-26 00:52:381653 proc_->AddRuleForAllFamilies("foo,bar.com", "192.168.1.42");
1654
1655 HostResolver::ResolveHostParameters source_none_parameters;
1656 source_none_parameters.source = HostResolverSource::LOCAL_ONLY;
1657
1658 ResolveHostResponseHelper response(
1659 resolver_->CreateRequest(HostPortPair("foo,bar.com", 57),
1660 NetLogWithSource(), source_none_parameters));
1661
1662 // Expected to fail synchronously.
1663 EXPECT_TRUE(response.complete());
1664 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
1665 EXPECT_FALSE(response.request()->GetAddressResults());
1666 EXPECT_FALSE(response.request()->GetStaleInfo());
1667}
1668
Eric Orth26fa08e2019-02-22 01:28:371669TEST_F(HostResolverImplTest, LocalOnly_InvalidLocalhost) {
Eric Ortheb332862019-01-26 00:52:381670 HostResolver::ResolveHostParameters source_none_parameters;
1671 source_none_parameters.source = HostResolverSource::LOCAL_ONLY;
1672
1673 ResolveHostResponseHelper response(
1674 resolver_->CreateRequest(HostPortPair("foo,bar.localhost", 58),
1675 NetLogWithSource(), source_none_parameters));
1676
1677 // Expected to fail synchronously.
1678 EXPECT_TRUE(response.complete());
1679 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
1680 EXPECT_FALSE(response.request()->GetAddressResults());
1681 EXPECT_FALSE(response.request()->GetStaleInfo());
1682}
1683
Eric Ortheb332862019-01-26 00:52:381684TEST_F(HostResolverImplTest, StaleAllowed) {
1685 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42");
1686 proc_->SignalMultiple(1u); // Need only one.
1687
1688 HostResolver::ResolveHostParameters stale_allowed_parameters;
1689 stale_allowed_parameters.source = HostResolverSource::LOCAL_ONLY;
1690 stale_allowed_parameters.cache_usage =
1691 HostResolver::ResolveHostParameters::CacheUsage::STALE_ALLOWED;
1692
1693 // First query expected to complete synchronously as a cache miss.
1694 ResolveHostResponseHelper cache_miss_request(
1695 resolver_->CreateRequest(HostPortPair("just.testing", 80),
1696 NetLogWithSource(), stale_allowed_parameters));
1697 EXPECT_TRUE(cache_miss_request.complete());
1698 EXPECT_THAT(cache_miss_request.result_error(), IsError(ERR_DNS_CACHE_MISS));
1699 EXPECT_FALSE(cache_miss_request.request()->GetAddressResults());
1700 EXPECT_FALSE(cache_miss_request.request()->GetStaleInfo());
1701
1702 // Normal query to populate cache
1703 ResolveHostResponseHelper normal_request(resolver_->CreateRequest(
1704 HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt));
1705 EXPECT_THAT(normal_request.result_error(), IsOk());
1706 EXPECT_FALSE(normal_request.request()->GetStaleInfo());
1707
1708 MakeCacheStale();
1709
1710 // Second NONE query expected to get a stale cache hit.
1711 ResolveHostResponseHelper stale_request(
1712 resolver_->CreateRequest(HostPortPair("just.testing", 84),
1713 NetLogWithSource(), stale_allowed_parameters));
1714 EXPECT_TRUE(stale_request.complete());
1715 EXPECT_THAT(stale_request.result_error(), IsOk());
1716 EXPECT_THAT(stale_request.request()->GetAddressResults().value().endpoints(),
1717 testing::ElementsAre(CreateExpected("192.168.1.42", 84)));
1718 EXPECT_TRUE(stale_request.request()->GetStaleInfo().value().is_stale());
1719}
1720
1721TEST_F(HostResolverImplTest, StaleAllowed_NonLocal) {
1722 proc_->AddRuleForAllFamilies("just.testing", "192.168.2.42");
1723 proc_->SignalMultiple(1u); // Need only one.
1724
1725 HostResolver::ResolveHostParameters stale_allowed_parameters;
1726 stale_allowed_parameters.cache_usage =
1727 HostResolver::ResolveHostParameters::CacheUsage::STALE_ALLOWED;
1728
1729 // Normal non-local resolves should still work normally with the STALE_ALLOWED
1730 // parameter, and there should be no stale info.
1731 ResolveHostResponseHelper response(
1732 resolver_->CreateRequest(HostPortPair("just.testing", 85),
1733 NetLogWithSource(), stale_allowed_parameters));
1734 EXPECT_THAT(response.result_error(), IsOk());
1735 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
1736 testing::ElementsAre(CreateExpected("192.168.2.42", 85)));
1737 EXPECT_FALSE(response.request()->GetStaleInfo());
1738}
1739
1740TEST_F(HostResolverImplTest, StaleAllowed_FromIp) {
1741 HostResolver::ResolveHostParameters stale_allowed_parameters;
1742 stale_allowed_parameters.cache_usage =
1743 HostResolver::ResolveHostParameters::CacheUsage::STALE_ALLOWED;
1744
1745 ResolveHostResponseHelper response(
1746 resolver_->CreateRequest(HostPortPair("1.2.3.4", 57), NetLogWithSource(),
1747 stale_allowed_parameters));
1748
1749 // Expected to resolve synchronously without stale info.
1750 EXPECT_TRUE(response.complete());
1751 EXPECT_THAT(response.result_error(), IsOk());
1752 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
1753 testing::ElementsAre(CreateExpected("1.2.3.4", 57)));
1754 EXPECT_FALSE(response.request()->GetStaleInfo());
1755}
1756
Miriam Gershensone3bc63022017-10-09 19:57:051757// TODO(mgersh): add a test case for errors with positive TTL after
1758// https://crbug.com/115051 is fixed.
1759
[email protected]189163e2011-05-11 01:48:541760// Test the retry attempts simulating host resolver proc that takes too long.
1761TEST_F(HostResolverImplTest, MultipleAttempts) {
1762 // Total number of attempts would be 3 and we want the 3rd attempt to resolve
Eric Orth9a037562018-07-03 21:24:381763 // the host. First and second attempt will be forced to wait until they get
[email protected]189163e2011-05-11 01:48:541764 // word that a resolution has completed. The 3rd resolution attempt will try
Eric Orth9a037562018-07-03 21:24:381765 // to get done ASAP, and won't wait.
[email protected]189163e2011-05-11 01:48:541766 int kAttemptNumberToResolve = 3;
1767 int kTotalAttempts = 3;
1768
Eric Orth9a037562018-07-03 21:24:381769 // Add a little bit of extra fudge to the delay to allow reasonable
1770 // flexibility for time > vs >= etc. We don't need to fail the test if we
1771 // retry at t=6001 instead of t=6000.
1772 base::TimeDelta kSleepFudgeFactor = base::TimeDelta::FromMilliseconds(1);
1773
[email protected]189163e2011-05-11 01:48:541774 scoped_refptr<LookupAttemptHostResolverProc> resolver_proc(
Eric Orth70992982018-07-24 00:25:001775 new LookupAttemptHostResolverProc(NULL, kAttemptNumberToResolve,
1776 kTotalAttempts));
1777
1778 HostResolverImpl::ProcTaskParams params = DefaultParams(resolver_proc.get());
1779 base::TimeDelta unresponsive_delay = params.unresponsive_delay;
1780 int retry_factor = params.retry_factor;
1781
1782 CreateResolverWithLimitsAndParams(kMaxJobs, params,
1783 true /* ipv6_reachable */);
1784
1785 // Override the current thread task runner, so we can simulate the passage of
1786 // time and avoid any actual sleeps.
1787 auto test_task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
1788 base::ScopedClosureRunner task_runner_override_scoped_cleanup =
1789 base::ThreadTaskRunnerHandle::OverrideForTesting(test_task_runner);
1790
1791 // Resolve "host1".
Eric Orth00fe5a62018-08-15 22:20:001792 ResolveHostResponseHelper response(resolver_->CreateRequest(
1793 HostPortPair("host1", 70), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:001794 EXPECT_FALSE(response.complete());
1795
1796 resolver_proc->WaitForNAttemptsToBeBlocked(1);
1797 EXPECT_FALSE(response.complete());
1798
1799 test_task_runner->FastForwardBy(unresponsive_delay + kSleepFudgeFactor);
1800 resolver_proc->WaitForNAttemptsToBeBlocked(2);
1801 EXPECT_FALSE(response.complete());
1802
1803 test_task_runner->FastForwardBy(unresponsive_delay * retry_factor +
1804 kSleepFudgeFactor);
1805
1806 resolver_proc->WaitForAllAttemptsToFinish();
1807 test_task_runner->RunUntilIdle();
1808
1809 // Resolve returns -4 to indicate that 3rd attempt has resolved the host.
1810 // Since we're using a TestMockTimeTaskRunner, the RunLoop stuff in
1811 // result_error() will fail if it actually has to wait, but unless there's an
1812 // error, the result should be immediately ready by this point.
1813 EXPECT_EQ(-4, response.result_error());
1814
1815 // We should be done with retries, but make sure none erroneously happen.
1816 test_task_runner->FastForwardUntilNoTasksRemain();
1817
1818 EXPECT_EQ(resolver_proc->total_attempts_resolved(), kTotalAttempts);
1819 EXPECT_EQ(resolver_proc->resolved_attempt_number(), kAttemptNumberToResolve);
1820}
1821
eroman91dd3602015-03-26 03:46:331822// If a host resolves to a list that includes 127.0.53.53, this is treated as
1823// an error. 127.0.53.53 is a localhost address, however it has been given a
eroman1efc237c2016-12-14 00:00:451824// special significance by ICANN to help surface name collision resulting from
eroman91dd3602015-03-26 03:46:331825// the new gTLDs.
eroman1efc237c2016-12-14 00:00:451826TEST_F(HostResolverImplTest, NameCollisionIcann) {
eroman91dd3602015-03-26 03:46:331827 proc_->AddRuleForAllFamilies("single", "127.0.53.53");
1828 proc_->AddRuleForAllFamilies("multiple", "127.0.0.1,127.0.53.53");
1829 proc_->AddRuleForAllFamilies("ipv6", "::127.0.53.53");
1830 proc_->AddRuleForAllFamilies("not_reserved1", "53.53.0.127");
1831 proc_->AddRuleForAllFamilies("not_reserved2", "127.0.53.54");
1832 proc_->AddRuleForAllFamilies("not_reserved3", "10.0.53.53");
1833 proc_->SignalMultiple(6u);
1834
Eric Orth00fe5a62018-08-15 22:20:001835 ResolveHostResponseHelper single_response(resolver_->CreateRequest(
1836 HostPortPair("single", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:001837 EXPECT_THAT(single_response.result_error(),
1838 IsError(ERR_ICANN_NAME_COLLISION));
1839 EXPECT_FALSE(single_response.request()->GetAddressResults());
1840
1841 // ERR_ICANN_NAME_COLLISION is cached like any other error, using a fixed TTL
1842 // for failed entries from proc-based resolver. That said, the fixed TTL is 0,
1843 // so it should never be cached.
dalyk48b20a992019-02-25 16:10:261844 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result =
1845 GetCacheHit(HostCache::Key("single", DnsQueryType::UNSPECIFIED,
1846 0 /* host_resolver_flags */,
1847 HostResolverSource::ANY));
1848 EXPECT_FALSE(cache_result);
Eric Orth70992982018-07-24 00:25:001849
1850 ResolveHostResponseHelper multiple_response(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:001851 HostPortPair("multiple", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:001852 EXPECT_THAT(multiple_response.result_error(),
1853 IsError(ERR_ICANN_NAME_COLLISION));
1854
1855 // Resolving an IP literal of 127.0.53.53 however is allowed.
1856 ResolveHostResponseHelper literal_response(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:001857 HostPortPair("127.0.53.53", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:001858 EXPECT_THAT(literal_response.result_error(), IsOk());
1859
1860 // Moreover the address should not be recognized when embedded in an IPv6
1861 // address.
1862 ResolveHostResponseHelper ipv6_response(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:001863 HostPortPair("127.0.53.53", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:001864 EXPECT_THAT(ipv6_response.result_error(), IsOk());
1865
1866 // Try some other IPs which are similar, but NOT an exact match on
1867 // 127.0.53.53.
1868 ResolveHostResponseHelper similar_response1(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:001869 HostPortPair("not_reserved1", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:001870 EXPECT_THAT(similar_response1.result_error(), IsOk());
1871
1872 ResolveHostResponseHelper similar_response2(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:001873 HostPortPair("not_reserved2", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:001874 EXPECT_THAT(similar_response2.result_error(), IsOk());
1875
1876 ResolveHostResponseHelper similar_response3(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:001877 HostPortPair("not_reserved3", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:001878 EXPECT_THAT(similar_response3.result_error(), IsOk());
1879}
1880
sergeyub8cdc212015-05-14 18:50:371881TEST_F(HostResolverImplTest, IsIPv6Reachable) {
cbentzel1906f872015-06-05 16:25:251882 // The real HostResolverImpl is needed since TestHostResolverImpl will
1883 // bypass the IPv6 reachability tests.
1884 resolver_.reset(new HostResolverImpl(DefaultOptions(), nullptr));
1885
sergeyub8cdc212015-05-14 18:50:371886 // Verify that two consecutive calls return the same value.
tfarina42834112016-09-22 13:38:201887 TestNetLog test_net_log;
1888 NetLogWithSource net_log =
1889 NetLogWithSource::Make(&test_net_log, NetLogSourceType::NONE);
1890 bool result1 = IsIPv6Reachable(net_log);
1891 bool result2 = IsIPv6Reachable(net_log);
sergeyub8cdc212015-05-14 18:50:371892 EXPECT_EQ(result1, result2);
1893
1894 // Filter reachability check events and verify that there are two of them.
1895 TestNetLogEntry::List event_list;
tfarina42834112016-09-22 13:38:201896 test_net_log.GetEntries(&event_list);
sergeyub8cdc212015-05-14 18:50:371897 TestNetLogEntry::List probe_event_list;
1898 for (const auto& event : event_list) {
mikecirone8b85c432016-09-08 19:11:001899 if (event.type ==
1900 NetLogEventType::HOST_RESOLVER_IMPL_IPV6_REACHABILITY_CHECK) {
sergeyub8cdc212015-05-14 18:50:371901 probe_event_list.push_back(event);
1902 }
1903 }
1904 ASSERT_EQ(2U, probe_event_list.size());
1905
1906 // Verify that the first request was not cached and the second one was.
1907 bool cached;
1908 EXPECT_TRUE(probe_event_list[0].GetBooleanValue("cached", &cached));
1909 EXPECT_FALSE(cached);
1910 EXPECT_TRUE(probe_event_list[1].GetBooleanValue("cached", &cached));
1911 EXPECT_TRUE(cached);
1912}
1913
Eric Orth322af3e42018-08-20 18:12:591914TEST_F(HostResolverImplTest, IncludeCanonicalName) {
1915 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42",
1916 HOST_RESOLVER_CANONNAME, "canon.name");
1917 proc_->SignalMultiple(2u);
1918
1919 HostResolver::ResolveHostParameters parameters;
1920 parameters.include_canonical_name = true;
1921 ResolveHostResponseHelper response(resolver_->CreateRequest(
1922 HostPortPair("just.testing", 80), NetLogWithSource(), parameters));
1923 ResolveHostResponseHelper response_no_flag(resolver_->CreateRequest(
1924 HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt));
1925
1926 EXPECT_THAT(response.result_error(), IsOk());
1927 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
1928 testing::ElementsAre(CreateExpected("192.168.1.42", 80)));
1929 EXPECT_EQ("canon.name",
1930 response.request()->GetAddressResults().value().canonical_name());
1931
1932 EXPECT_THAT(response_no_flag.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
1933}
1934
1935TEST_F(HostResolverImplTest, LoopbackOnly) {
1936 proc_->AddRuleForAllFamilies("otherlocal", "127.0.0.1",
1937 HOST_RESOLVER_LOOPBACK_ONLY);
1938 proc_->SignalMultiple(2u);
1939
1940 HostResolver::ResolveHostParameters parameters;
1941 parameters.loopback_only = true;
1942 ResolveHostResponseHelper response(resolver_->CreateRequest(
1943 HostPortPair("otherlocal", 80), NetLogWithSource(), parameters));
1944 ResolveHostResponseHelper response_no_flag(resolver_->CreateRequest(
1945 HostPortPair("otherlocal", 80), NetLogWithSource(), base::nullopt));
1946
1947 EXPECT_THAT(response.result_error(), IsOk());
1948 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
1949 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
1950
1951 EXPECT_THAT(response_no_flag.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
1952}
1953
Eric Orth26fa08e2019-02-22 01:28:371954TEST_F(HostResolverImplTest, IsSpeculative) {
Eric Orthb30bc172018-08-17 21:09:571955 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42");
1956 proc_->SignalMultiple(1u);
1957
1958 HostResolver::ResolveHostParameters parameters;
1959 parameters.is_speculative = true;
1960
1961 ResolveHostResponseHelper response(resolver_->CreateRequest(
1962 HostPortPair("just.testing", 80), NetLogWithSource(), parameters));
1963
1964 EXPECT_THAT(response.result_error(), IsOk());
1965 EXPECT_FALSE(response.request()->GetAddressResults());
1966
1967 ASSERT_EQ(1u, proc_->GetCaptureList().size());
1968 EXPECT_EQ("just.testing", proc_->GetCaptureList()[0].hostname);
1969
1970 // Reresolve without the |is_speculative| flag should immediately return from
1971 // cache.
1972 ResolveHostResponseHelper response2(resolver_->CreateRequest(
1973 HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt));
1974
1975 EXPECT_THAT(response2.result_error(), IsOk());
1976 EXPECT_THAT(response2.request()->GetAddressResults().value().endpoints(),
1977 testing::ElementsAre(CreateExpected("192.168.1.42", 80)));
1978
1979 EXPECT_EQ("just.testing", proc_->GetCaptureList()[0].hostname);
1980 EXPECT_EQ(1u, proc_->GetCaptureList().size()); // No increase.
1981}
1982
Eric Orth9871aafa2018-10-02 19:59:181983#if BUILDFLAG(ENABLE_MDNS)
1984const uint8_t kMdnsResponseA[] = {
1985 // Header
1986 0x00, 0x00, // ID is zeroed out
1987 0x81, 0x80, // Standard query response, RA, no error
1988 0x00, 0x00, // No questions (for simplicity)
1989 0x00, 0x01, // 1 RR (answers)
1990 0x00, 0x00, // 0 authority RRs
1991 0x00, 0x00, // 0 additional RRs
1992
1993 // "myhello.local."
1994 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
1995 0x00,
1996
1997 0x00, 0x01, // TYPE is A.
1998 0x00, 0x01, // CLASS is IN.
1999 0x00, 0x00, 0x00, 0x10, // TTL is 16 (seconds)
2000 0x00, 0x04, // RDLENGTH is 4 bytes.
2001 0x01, 0x02, 0x03, 0x04, // 1.2.3.4
2002};
2003
Eric Orth026776a2019-01-18 00:13:282004const uint8_t kMdnsResponseA2[] = {
2005 // Header
2006 0x00, 0x00, // ID is zeroed out
2007 0x81, 0x80, // Standard query response, RA, no error
2008 0x00, 0x00, // No questions (for simplicity)
2009 0x00, 0x01, // 1 RR (answers)
2010 0x00, 0x00, // 0 authority RRs
2011 0x00, 0x00, // 0 additional RRs
2012
2013 // "myhello.local."
2014 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2015 0x00,
2016
2017 0x00, 0x01, // TYPE is A.
2018 0x00, 0x01, // CLASS is IN.
2019 0x00, 0x00, 0x00, 0x10, // TTL is 16 (seconds)
2020 0x00, 0x04, // RDLENGTH is 4 bytes.
2021 0x05, 0x06, 0x07, 0x08, // 5.6.7.8
2022};
2023
2024const uint8_t kMdnsResponseA2Goodbye[] = {
2025 // Header
2026 0x00, 0x00, // ID is zeroed out
2027 0x81, 0x80, // Standard query response, RA, no error
2028 0x00, 0x00, // No questions (for simplicity)
2029 0x00, 0x01, // 1 RR (answers)
2030 0x00, 0x00, // 0 authority RRs
2031 0x00, 0x00, // 0 additional RRs
2032
2033 // "myhello.local."
2034 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2035 0x00,
2036
2037 0x00, 0x01, // TYPE is A.
2038 0x00, 0x01, // CLASS is IN.
2039 0x00, 0x00, 0x00, 0x00, // TTL is 0 (signaling "goodbye" removal of result)
2040 0x00, 0x04, // RDLENGTH is 4 bytes.
2041 0x05, 0x06, 0x07, 0x08, // 5.6.7.8
2042};
2043
Eric Orth9871aafa2018-10-02 19:59:182044const uint8_t kMdnsResponseAAAA[] = {
2045 // Header
2046 0x00, 0x00, // ID is zeroed out
2047 0x81, 0x80, // Standard query response, RA, no error
2048 0x00, 0x00, // No questions (for simplicity)
2049 0x00, 0x01, // 1 RR (answers)
2050 0x00, 0x00, // 0 authority RRs
2051 0x00, 0x00, // 0 additional RRs
2052
2053 // "myhello.local."
2054 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2055 0x00,
2056
2057 0x00, 0x1C, // TYPE is AAAA.
2058 0x00, 0x01, // CLASS is IN.
2059 0x00, 0x00, 0x00, 0x10, // TTL is 16 (seconds)
2060 0x00, 0x10, // RDLENGTH is 16 bytes.
2061
2062 // 000a:0000:0000:0000:0001:0002:0003:0004
2063 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02,
2064 0x00, 0x03, 0x00, 0x04,
2065};
2066
2067// An MDNS response indicating that the responder owns the hostname, but the
2068// specific requested type (AAAA) does not exist because the responder only has
2069// A addresses.
2070const uint8_t kMdnsResponseNsec[] = {
2071 // Header
2072 0x00, 0x00, // ID is zeroed out
2073 0x81, 0x80, // Standard query response, RA, no error
2074 0x00, 0x00, // No questions (for simplicity)
2075 0x00, 0x01, // 1 RR (answers)
2076 0x00, 0x00, // 0 authority RRs
2077 0x00, 0x00, // 0 additional RRs
2078
2079 // "myhello.local."
2080 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2081 0x00,
2082
2083 0x00, 0x2f, // TYPE is NSEC.
2084 0x00, 0x01, // CLASS is IN.
2085 0x00, 0x00, 0x00, 0x10, // TTL is 16 (seconds)
2086 0x00, 0x06, // RDLENGTH is 6 bytes.
2087 0xc0, 0x0c, // Next Domain Name (always pointer back to name in MDNS)
2088 0x00, // Bitmap block number (always 0 in MDNS)
2089 0x02, // Bitmap length is 2
2090 0x00, 0x08 // A type only
2091};
2092
Eric Orth828bd3ae2018-12-12 17:30:362093const uint8_t kMdnsResponseTxt[] = {
2094 // Header
2095 0x00, 0x00, // ID is zeroed out
2096 0x81, 0x80, // Standard query response, RA, no error
2097 0x00, 0x00, // No questions (for simplicity)
2098 0x00, 0x01, // 1 RR (answers)
2099 0x00, 0x00, // 0 authority RRs
2100 0x00, 0x00, // 0 additional RRs
2101
2102 // "myhello.local."
2103 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2104 0x00,
2105
2106 0x00, 0x10, // TYPE is TXT.
2107 0x00, 0x01, // CLASS is IN.
2108 0x00, 0x00, 0x00, 0x11, // TTL is 17 (seconds)
2109 0x00, 0x08, // RDLENGTH is 8 bytes.
2110
2111 // "foo"
2112 0x03, 0x66, 0x6f, 0x6f,
2113 // "bar"
2114 0x03, 0x62, 0x61, 0x72,
2115};
2116
Eric Orthe9db8d232019-01-14 21:24:452117const uint8_t kMdnsResponsePtr[] = {
2118 // Header
2119 0x00, 0x00, // ID is zeroed out
2120 0x81, 0x80, // Standard query response, RA, no error
2121 0x00, 0x00, // No questions (for simplicity)
2122 0x00, 0x01, // 1 RR (answers)
2123 0x00, 0x00, // 0 authority RRs
2124 0x00, 0x00, // 0 additional RRs
2125
2126 // "myhello.local."
2127 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2128 0x00,
2129
2130 0x00, 0x0c, // TYPE is PTR.
2131 0x00, 0x01, // CLASS is IN.
2132 0x00, 0x00, 0x00, 0x12, // TTL is 18 (seconds)
2133 0x00, 0x09, // RDLENGTH is 9 bytes.
2134
2135 // "foo.com."
2136 0x03, 'f', 'o', 'o', 0x03, 'c', 'o', 'm', 0x00};
2137
Eric Orth026776a2019-01-18 00:13:282138const uint8_t kMdnsResponsePtrRoot[] = {
2139 // Header
2140 0x00, 0x00, // ID is zeroed out
2141 0x81, 0x80, // Standard query response, RA, no error
2142 0x00, 0x00, // No questions (for simplicity)
2143 0x00, 0x01, // 1 RR (answers)
2144 0x00, 0x00, // 0 authority RRs
2145 0x00, 0x00, // 0 additional RRs
2146
2147 // "myhello.local."
2148 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2149 0x00,
2150
2151 0x00, 0x0c, // TYPE is PTR.
2152 0x00, 0x01, // CLASS is IN.
2153 0x00, 0x00, 0x00, 0x13, // TTL is 19 (seconds)
2154 0x00, 0x01, // RDLENGTH is 1 byte.
2155
2156 // "." (the root domain)
2157 0x00};
2158
Eric Ortha625b042019-01-16 01:14:452159const uint8_t kMdnsResponseSrv[] = {
2160 // Header
2161 0x00, 0x00, // ID is zeroed out
2162 0x81, 0x80, // Standard query response, RA, no error
2163 0x00, 0x00, // No questions (for simplicity)
2164 0x00, 0x01, // 1 RR (answers)
2165 0x00, 0x00, // 0 authority RRs
2166 0x00, 0x00, // 0 additional RRs
2167
2168 // "myhello.local."
2169 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2170 0x00,
2171
2172 0x00, 0x21, // TYPE is SRV.
2173 0x00, 0x01, // CLASS is IN.
2174 0x00, 0x00, 0x00, 0x13, // TTL is 19 (seconds)
2175 0x00, 0x0f, // RDLENGTH is 15 bytes.
2176
2177 0x00, 0x05, // Priority 5
2178 0x00, 0x01, // Weight 1
2179 0x20, 0x49, // Port 8265
2180
2181 // "foo.com."
2182 0x03, 'f', 'o', 'o', 0x03, 'c', 'o', 'm', 0x00};
2183
Eric Orth9871aafa2018-10-02 19:59:182184TEST_F(HostResolverImplTest, Mdns) {
2185 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2186 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2187 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2188 // 2 socket creations for every transaction.
2189 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(4);
2190
2191 HostResolver::ResolveHostParameters parameters;
2192 parameters.source = HostResolverSource::MULTICAST_DNS;
2193
2194 ResolveHostResponseHelper response(resolver_->CreateRequest(
2195 HostPortPair("myhello.local", 80), NetLogWithSource(), parameters));
2196
2197 socket_factory_ptr->SimulateReceive(kMdnsResponseA, sizeof(kMdnsResponseA));
2198 socket_factory_ptr->SimulateReceive(kMdnsResponseAAAA,
2199 sizeof(kMdnsResponseAAAA));
2200
2201 EXPECT_THAT(response.result_error(), IsOk());
2202 EXPECT_THAT(
2203 response.request()->GetAddressResults().value().endpoints(),
2204 testing::UnorderedElementsAre(
2205 CreateExpected("1.2.3.4", 80),
2206 CreateExpected("000a:0000:0000:0000:0001:0002:0003:0004", 80)));
Eric Orth828bd3ae2018-12-12 17:30:362207 EXPECT_FALSE(response.request()->GetTextResults());
2208 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth9871aafa2018-10-02 19:59:182209}
2210
2211TEST_F(HostResolverImplTest, Mdns_AaaaOnly) {
2212 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2213 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2214 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2215 // 2 socket creations for every transaction.
2216 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(2);
2217
2218 HostResolver::ResolveHostParameters parameters;
Eric Orth192e3bb2018-11-14 19:30:322219 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth9871aafa2018-10-02 19:59:182220 parameters.source = HostResolverSource::MULTICAST_DNS;
2221
2222 ResolveHostResponseHelper response(resolver_->CreateRequest(
2223 HostPortPair("myhello.local", 80), NetLogWithSource(), parameters));
2224
2225 socket_factory_ptr->SimulateReceive(kMdnsResponseAAAA,
2226 sizeof(kMdnsResponseAAAA));
2227
2228 EXPECT_THAT(response.result_error(), IsOk());
2229 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
2230 testing::ElementsAre(CreateExpected(
2231 "000a:0000:0000:0000:0001:0002:0003:0004", 80)));
2232}
2233
Eric Orth828bd3ae2018-12-12 17:30:362234TEST_F(HostResolverImplTest, Mdns_Txt) {
2235 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2236 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2237 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2238 // 2 socket creations for every transaction.
2239 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(2);
2240
2241 HostResolver::ResolveHostParameters parameters;
2242 parameters.dns_query_type = DnsQueryType::TXT;
2243 parameters.source = HostResolverSource::MULTICAST_DNS;
2244
2245 ResolveHostResponseHelper response(resolver_->CreateRequest(
2246 HostPortPair("myhello.local", 80), NetLogWithSource(), parameters));
2247
2248 socket_factory_ptr->SimulateReceive(kMdnsResponseTxt,
2249 sizeof(kMdnsResponseTxt));
2250
2251 EXPECT_THAT(response.result_error(), IsOk());
2252 EXPECT_FALSE(response.request()->GetAddressResults());
2253 EXPECT_THAT(response.request()->GetTextResults(),
2254 testing::Optional(testing::ElementsAre("foo", "bar")));
2255 EXPECT_FALSE(response.request()->GetHostnameResults());
2256}
2257
Eric Orthe9db8d232019-01-14 21:24:452258TEST_F(HostResolverImplTest, Mdns_Ptr) {
2259 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2260 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2261 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2262 // 2 socket creations for every transaction.
2263 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(2);
2264
2265 HostResolver::ResolveHostParameters parameters;
2266 parameters.dns_query_type = DnsQueryType::PTR;
2267 parameters.source = HostResolverSource::MULTICAST_DNS;
2268
2269 ResolveHostResponseHelper response(resolver_->CreateRequest(
2270 HostPortPair("myhello.local", 83), NetLogWithSource(), parameters));
2271
2272 socket_factory_ptr->SimulateReceive(kMdnsResponsePtr,
2273 sizeof(kMdnsResponsePtr));
2274
2275 EXPECT_THAT(response.result_error(), IsOk());
2276 EXPECT_FALSE(response.request()->GetAddressResults());
2277 EXPECT_FALSE(response.request()->GetTextResults());
2278 EXPECT_THAT(
2279 response.request()->GetHostnameResults(),
2280 testing::Optional(testing::ElementsAre(HostPortPair("foo.com", 83))));
2281}
2282
Eric Ortha625b042019-01-16 01:14:452283TEST_F(HostResolverImplTest, Mdns_Srv) {
2284 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2285 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2286 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2287 // 2 socket creations for every transaction.
2288 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(2);
2289
2290 HostResolver::ResolveHostParameters parameters;
2291 parameters.dns_query_type = DnsQueryType::SRV;
2292 parameters.source = HostResolverSource::MULTICAST_DNS;
2293
2294 ResolveHostResponseHelper response(resolver_->CreateRequest(
2295 HostPortPair("myhello.local", 83), NetLogWithSource(), parameters));
2296
2297 socket_factory_ptr->SimulateReceive(kMdnsResponseSrv,
2298 sizeof(kMdnsResponseSrv));
2299
2300 EXPECT_THAT(response.result_error(), IsOk());
2301 EXPECT_FALSE(response.request()->GetAddressResults());
2302 EXPECT_FALSE(response.request()->GetTextResults());
2303 EXPECT_THAT(
2304 response.request()->GetHostnameResults(),
2305 testing::Optional(testing::ElementsAre(HostPortPair("foo.com", 8265))));
2306}
2307
Eric Orth9871aafa2018-10-02 19:59:182308// Test multicast DNS handling of NSEC responses (used for explicit negative
2309// response).
2310TEST_F(HostResolverImplTest, Mdns_Nsec) {
2311 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2312 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2313 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2314 // 2 socket creations for every transaction.
2315 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(2);
2316
2317 HostResolver::ResolveHostParameters parameters;
Eric Orth192e3bb2018-11-14 19:30:322318 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth9871aafa2018-10-02 19:59:182319 parameters.source = HostResolverSource::MULTICAST_DNS;
2320
2321 ResolveHostResponseHelper response(resolver_->CreateRequest(
2322 HostPortPair("myhello.local", 80), NetLogWithSource(), parameters));
2323
2324 socket_factory_ptr->SimulateReceive(kMdnsResponseNsec,
2325 sizeof(kMdnsResponseNsec));
2326
2327 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
2328 EXPECT_FALSE(response.request()->GetAddressResults());
2329}
2330
2331TEST_F(HostResolverImplTest, Mdns_NoResponse) {
2332 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2333 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2334 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2335 // 2 socket creations for every transaction.
2336 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(4);
2337
2338 // Add a little bit of extra fudge to the delay to allow reasonable
2339 // flexibility for time > vs >= etc. We don't need to fail the test if we
2340 // timeout at t=6001 instead of t=6000.
2341 base::TimeDelta kSleepFudgeFactor = base::TimeDelta::FromMilliseconds(1);
2342
2343 // Override the current thread task runner, so we can simulate the passage of
2344 // time to trigger the timeout.
2345 auto test_task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
2346 base::ScopedClosureRunner task_runner_override_scoped_cleanup =
2347 base::ThreadTaskRunnerHandle::OverrideForTesting(test_task_runner);
2348
2349 HostResolver::ResolveHostParameters parameters;
2350 parameters.source = HostResolverSource::MULTICAST_DNS;
2351
2352 ResolveHostResponseHelper response(resolver_->CreateRequest(
2353 HostPortPair("myhello.local", 80), NetLogWithSource(), parameters));
2354
2355 ASSERT_TRUE(test_task_runner->HasPendingTask());
2356 test_task_runner->FastForwardBy(MDnsTransaction::kTransactionTimeout +
2357 kSleepFudgeFactor);
2358
2359 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
2360 EXPECT_FALSE(response.request()->GetAddressResults());
Eric Orth828bd3ae2018-12-12 17:30:362361 EXPECT_FALSE(response.request()->GetTextResults());
2362 EXPECT_FALSE(response.request()->GetHostnameResults());
2363
2364 test_task_runner->FastForwardUntilNoTasksRemain();
2365}
2366
2367TEST_F(HostResolverImplTest, Mdns_WrongType) {
2368 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2369 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2370 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2371 // 2 socket creations for every transaction.
2372 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(2);
2373
2374 // Add a little bit of extra fudge to the delay to allow reasonable
2375 // flexibility for time > vs >= etc. We don't need to fail the test if we
2376 // timeout at t=6001 instead of t=6000.
2377 base::TimeDelta kSleepFudgeFactor = base::TimeDelta::FromMilliseconds(1);
2378
2379 // Override the current thread task runner, so we can simulate the passage of
2380 // time to trigger the timeout.
2381 auto test_task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
2382 base::ScopedClosureRunner task_runner_override_scoped_cleanup =
2383 base::ThreadTaskRunnerHandle::OverrideForTesting(test_task_runner);
2384
2385 HostResolver::ResolveHostParameters parameters;
2386 parameters.dns_query_type = DnsQueryType::A;
2387 parameters.source = HostResolverSource::MULTICAST_DNS;
2388
2389 ResolveHostResponseHelper response(resolver_->CreateRequest(
2390 HostPortPair("myhello.local", 80), NetLogWithSource(), parameters));
2391
2392 // Not the requested type. Should be ignored.
2393 socket_factory_ptr->SimulateReceive(kMdnsResponseTxt,
2394 sizeof(kMdnsResponseTxt));
2395
2396 ASSERT_TRUE(test_task_runner->HasPendingTask());
2397 test_task_runner->FastForwardBy(MDnsTransaction::kTransactionTimeout +
2398 kSleepFudgeFactor);
2399
2400 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
2401 EXPECT_FALSE(response.request()->GetAddressResults());
2402 EXPECT_FALSE(response.request()->GetTextResults());
2403 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth9871aafa2018-10-02 19:59:182404
2405 test_task_runner->FastForwardUntilNoTasksRemain();
2406}
2407
2408// Test for a request for both A and AAAA results where results only exist for
2409// one type.
2410TEST_F(HostResolverImplTest, Mdns_PartialResults) {
2411 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2412 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2413 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2414 // 2 socket creations for every transaction.
2415 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(4);
2416
2417 // Add a little bit of extra fudge to the delay to allow reasonable
2418 // flexibility for time > vs >= etc. We don't need to fail the test if we
2419 // timeout at t=6001 instead of t=6000.
2420 base::TimeDelta kSleepFudgeFactor = base::TimeDelta::FromMilliseconds(1);
2421
2422 // Override the current thread task runner, so we can simulate the passage of
2423 // time to trigger the timeout.
2424 auto test_task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
2425 base::ScopedClosureRunner task_runner_override_scoped_cleanup =
2426 base::ThreadTaskRunnerHandle::OverrideForTesting(test_task_runner);
2427
2428 HostResolver::ResolveHostParameters parameters;
2429 parameters.source = HostResolverSource::MULTICAST_DNS;
2430
2431 ResolveHostResponseHelper response(resolver_->CreateRequest(
2432 HostPortPair("myhello.local", 80), NetLogWithSource(), parameters));
2433
2434 ASSERT_TRUE(test_task_runner->HasPendingTask());
2435
2436 socket_factory_ptr->SimulateReceive(kMdnsResponseA, sizeof(kMdnsResponseA));
2437 test_task_runner->FastForwardBy(MDnsTransaction::kTransactionTimeout +
2438 kSleepFudgeFactor);
2439
2440 EXPECT_THAT(response.result_error(), IsOk());
2441 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
2442 testing::ElementsAre(CreateExpected("1.2.3.4", 80)));
2443
2444 test_task_runner->FastForwardUntilNoTasksRemain();
2445}
2446
2447TEST_F(HostResolverImplTest, Mdns_Cancel) {
2448 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2449 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2450 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2451 // 2 socket creations for every transaction.
2452 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(4);
2453
2454 HostResolver::ResolveHostParameters parameters;
2455 parameters.source = HostResolverSource::MULTICAST_DNS;
2456
2457 ResolveHostResponseHelper response(resolver_->CreateRequest(
2458 HostPortPair("myhello.local", 80), NetLogWithSource(), parameters));
2459
2460 response.CancelRequest();
2461
2462 socket_factory_ptr->SimulateReceive(kMdnsResponseA, sizeof(kMdnsResponseA));
2463 socket_factory_ptr->SimulateReceive(kMdnsResponseAAAA,
2464 sizeof(kMdnsResponseAAAA));
2465
2466 base::RunLoop().RunUntilIdle();
2467 EXPECT_FALSE(response.complete());
2468}
2469
2470// Test for a two-transaction query where the first fails to start. The second
2471// should be cancelled.
2472TEST_F(HostResolverImplTest, Mdns_PartialFailure) {
2473 // Setup a mock MDnsClient where the first transaction will always return
2474 // |false| immediately on Start(). Second transaction may or may not be
2475 // created, but if it is, Start() not expected to be called because the
2476 // overall request should immediately fail.
2477 auto transaction1 = std::make_unique<MockMDnsTransaction>();
2478 EXPECT_CALL(*transaction1, Start()).WillOnce(Return(false));
2479 auto transaction2 = std::make_unique<MockMDnsTransaction>();
2480 EXPECT_CALL(*transaction2, Start()).Times(0);
2481
2482 auto client = std::make_unique<MockMDnsClient>();
2483 EXPECT_CALL(*client, CreateTransaction(_, _, _, _))
2484 .Times(Between(1, 2)) // Second transaction optionally created.
2485 .WillOnce(Return(ByMove(std::move(transaction1))))
2486 .WillOnce(Return(ByMove(std::move(transaction2))));
2487 EXPECT_CALL(*client, IsListening()).WillRepeatedly(Return(true));
2488 resolver_->SetMdnsClientForTesting(std::move(client));
2489
2490 HostResolver::ResolveHostParameters parameters;
2491 parameters.source = HostResolverSource::MULTICAST_DNS;
2492
2493 ResolveHostResponseHelper response(resolver_->CreateRequest(
2494 HostPortPair("myhello.local", 80), NetLogWithSource(), parameters));
2495
2496 EXPECT_THAT(response.result_error(), IsError(ERR_FAILED));
2497 EXPECT_FALSE(response.request()->GetAddressResults());
2498}
Eric Orth026776a2019-01-18 00:13:282499
2500// Implementation of HostResolver::MdnsListenerDelegate that records all
2501// received results in maps.
2502class TestMdnsListenerDelegate : public HostResolver::MdnsListener::Delegate {
2503 public:
2504 using UpdateKey =
2505 std::pair<HostResolver::MdnsListener::Delegate::UpdateType, DnsQueryType>;
2506
2507 void OnAddressResult(
2508 HostResolver::MdnsListener::Delegate::UpdateType update_type,
2509 DnsQueryType result_type,
2510 IPEndPoint address) override {
2511 address_results_.insert({{update_type, result_type}, std::move(address)});
2512 }
2513
2514 void OnTextResult(
2515 HostResolver::MdnsListener::Delegate::UpdateType update_type,
2516 DnsQueryType result_type,
2517 std::vector<std::string> text_records) override {
2518 for (auto& text_record : text_records) {
2519 text_results_.insert(
2520 {{update_type, result_type}, std::move(text_record)});
2521 }
2522 }
2523
2524 void OnHostnameResult(
2525 HostResolver::MdnsListener::Delegate::UpdateType update_type,
2526 DnsQueryType result_type,
2527 HostPortPair host) override {
2528 hostname_results_.insert({{update_type, result_type}, std::move(host)});
2529 }
2530
2531 void OnUnhandledResult(
2532 HostResolver::MdnsListener::Delegate::UpdateType update_type,
2533 DnsQueryType result_type) override {
2534 unhandled_results_.insert({update_type, result_type});
2535 }
2536
2537 const std::multimap<UpdateKey, IPEndPoint>& address_results() {
2538 return address_results_;
2539 }
2540
2541 const std::multimap<UpdateKey, std::string>& text_results() {
2542 return text_results_;
2543 }
2544
2545 const std::multimap<UpdateKey, HostPortPair>& hostname_results() {
2546 return hostname_results_;
2547 }
2548
2549 const std::multiset<UpdateKey>& unhandled_results() {
2550 return unhandled_results_;
2551 }
2552
2553 template <typename T>
2554 static std::pair<UpdateKey, T> CreateExpectedResult(
2555 HostResolver::MdnsListener::Delegate::UpdateType update_type,
2556 DnsQueryType query_type,
2557 T result) {
2558 return std::make_pair(std::make_pair(update_type, query_type), result);
2559 }
2560
2561 private:
2562 std::multimap<UpdateKey, IPEndPoint> address_results_;
2563 std::multimap<UpdateKey, std::string> text_results_;
2564 std::multimap<UpdateKey, HostPortPair> hostname_results_;
2565 std::multiset<UpdateKey> unhandled_results_;
2566};
2567
2568TEST_F(HostResolverImplTest, MdnsListener) {
2569 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2570 base::SimpleTestClock clock;
2571 clock.SetNow(base::Time::Now());
2572 auto cache_cleanup_timer = std::make_unique<base::MockOneShotTimer>();
2573 auto* cache_cleanup_timer_ptr = cache_cleanup_timer.get();
2574 auto mdns_client =
2575 std::make_unique<MDnsClientImpl>(&clock, std::move(cache_cleanup_timer));
2576 mdns_client->StartListening(socket_factory.get());
2577 resolver_->SetMdnsClientForTesting(std::move(mdns_client));
2578
2579 std::unique_ptr<HostResolver::MdnsListener> listener =
2580 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 80),
2581 DnsQueryType::A);
2582
2583 TestMdnsListenerDelegate delegate;
2584 ASSERT_THAT(listener->Start(&delegate), IsOk());
2585 ASSERT_THAT(delegate.address_results(), testing::IsEmpty());
2586
2587 socket_factory->SimulateReceive(kMdnsResponseA, sizeof(kMdnsResponseA));
2588 socket_factory->SimulateReceive(kMdnsResponseA2, sizeof(kMdnsResponseA2));
2589 socket_factory->SimulateReceive(kMdnsResponseA2Goodbye,
2590 sizeof(kMdnsResponseA2Goodbye));
2591
2592 // Per RFC6762 section 10.1, removals take effect 1 second after receiving the
2593 // goodbye message.
2594 clock.Advance(base::TimeDelta::FromSeconds(1));
2595 cache_cleanup_timer_ptr->Fire();
2596
2597 // Expect 1 record adding "1.2.3.4", another changing to "5.6.7.8", and a
2598 // final removing "5.6.7.8".
2599 EXPECT_THAT(delegate.address_results(),
2600 testing::ElementsAre(
2601 TestMdnsListenerDelegate::CreateExpectedResult(
2602 HostResolver::MdnsListener::Delegate::UpdateType::ADDED,
2603 DnsQueryType::A, CreateExpected("1.2.3.4", 80)),
2604 TestMdnsListenerDelegate::CreateExpectedResult(
2605 HostResolver::MdnsListener::Delegate::UpdateType::CHANGED,
2606 DnsQueryType::A, CreateExpected("5.6.7.8", 80)),
2607 TestMdnsListenerDelegate::CreateExpectedResult(
2608 HostResolver::MdnsListener::Delegate::UpdateType::REMOVED,
2609 DnsQueryType::A, CreateExpected("5.6.7.8", 80))));
2610
2611 EXPECT_THAT(delegate.text_results(), testing::IsEmpty());
2612 EXPECT_THAT(delegate.hostname_results(), testing::IsEmpty());
2613 EXPECT_THAT(delegate.unhandled_results(), testing::IsEmpty());
2614}
2615
2616// Test that removal notifications are sent on natural expiration of MDNS
2617// records.
2618TEST_F(HostResolverImplTest, MdnsListener_Expiration) {
2619 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2620 base::SimpleTestClock clock;
2621 clock.SetNow(base::Time::Now());
2622 auto cache_cleanup_timer = std::make_unique<base::MockOneShotTimer>();
2623 auto* cache_cleanup_timer_ptr = cache_cleanup_timer.get();
2624 auto mdns_client =
2625 std::make_unique<MDnsClientImpl>(&clock, std::move(cache_cleanup_timer));
2626 mdns_client->StartListening(socket_factory.get());
2627 resolver_->SetMdnsClientForTesting(std::move(mdns_client));
2628
2629 std::unique_ptr<HostResolver::MdnsListener> listener =
2630 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 100),
2631 DnsQueryType::A);
2632
2633 TestMdnsListenerDelegate delegate;
2634 ASSERT_THAT(listener->Start(&delegate), IsOk());
2635 ASSERT_THAT(delegate.address_results(), testing::IsEmpty());
2636
2637 socket_factory->SimulateReceive(kMdnsResponseA, sizeof(kMdnsResponseA));
2638
2639 EXPECT_THAT(
2640 delegate.address_results(),
2641 testing::ElementsAre(TestMdnsListenerDelegate::CreateExpectedResult(
2642 HostResolver::MdnsListener::Delegate::UpdateType::ADDED,
2643 DnsQueryType::A, CreateExpected("1.2.3.4", 100))));
2644
2645 clock.Advance(base::TimeDelta::FromSeconds(16));
2646 cache_cleanup_timer_ptr->Fire();
2647
2648 EXPECT_THAT(delegate.address_results(),
2649 testing::ElementsAre(
2650 TestMdnsListenerDelegate::CreateExpectedResult(
2651 HostResolver::MdnsListener::Delegate::UpdateType::ADDED,
2652 DnsQueryType::A, CreateExpected("1.2.3.4", 100)),
2653 TestMdnsListenerDelegate::CreateExpectedResult(
2654 HostResolver::MdnsListener::Delegate::UpdateType::REMOVED,
2655 DnsQueryType::A, CreateExpected("1.2.3.4", 100))));
2656
2657 EXPECT_THAT(delegate.text_results(), testing::IsEmpty());
2658 EXPECT_THAT(delegate.hostname_results(), testing::IsEmpty());
2659 EXPECT_THAT(delegate.unhandled_results(), testing::IsEmpty());
2660}
2661
2662TEST_F(HostResolverImplTest, MdnsListener_Txt) {
2663 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2664 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2665 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2666
2667 std::unique_ptr<HostResolver::MdnsListener> listener =
2668 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 12),
2669 DnsQueryType::TXT);
2670
2671 TestMdnsListenerDelegate delegate;
2672 ASSERT_THAT(listener->Start(&delegate), IsOk());
2673 ASSERT_THAT(delegate.text_results(), testing::IsEmpty());
2674
2675 socket_factory_ptr->SimulateReceive(kMdnsResponseTxt,
2676 sizeof(kMdnsResponseTxt));
2677
2678 EXPECT_THAT(delegate.text_results(),
2679 testing::ElementsAre(
2680 TestMdnsListenerDelegate::CreateExpectedResult(
2681 HostResolver::MdnsListener::Delegate::UpdateType::ADDED,
2682 DnsQueryType::TXT, "foo"),
2683 TestMdnsListenerDelegate::CreateExpectedResult(
2684 HostResolver::MdnsListener::Delegate::UpdateType::ADDED,
2685 DnsQueryType::TXT, "bar")));
2686
2687 EXPECT_THAT(delegate.address_results(), testing::IsEmpty());
2688 EXPECT_THAT(delegate.hostname_results(), testing::IsEmpty());
2689 EXPECT_THAT(delegate.unhandled_results(), testing::IsEmpty());
2690}
2691
2692TEST_F(HostResolverImplTest, MdnsListener_Ptr) {
2693 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2694 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2695 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2696
2697 std::unique_ptr<HostResolver::MdnsListener> listener =
2698 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 13),
2699 DnsQueryType::PTR);
2700
2701 TestMdnsListenerDelegate delegate;
2702 ASSERT_THAT(listener->Start(&delegate), IsOk());
2703 ASSERT_THAT(delegate.text_results(), testing::IsEmpty());
2704
2705 socket_factory_ptr->SimulateReceive(kMdnsResponsePtr,
2706 sizeof(kMdnsResponsePtr));
2707
2708 EXPECT_THAT(
2709 delegate.hostname_results(),
2710 testing::ElementsAre(TestMdnsListenerDelegate::CreateExpectedResult(
2711 HostResolver::MdnsListener::Delegate::UpdateType::ADDED,
2712 DnsQueryType::PTR, HostPortPair("foo.com", 13))));
2713
2714 EXPECT_THAT(delegate.address_results(), testing::IsEmpty());
2715 EXPECT_THAT(delegate.text_results(), testing::IsEmpty());
2716 EXPECT_THAT(delegate.unhandled_results(), testing::IsEmpty());
2717}
2718
2719TEST_F(HostResolverImplTest, MdnsListener_Srv) {
2720 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2721 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2722 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2723
2724 std::unique_ptr<HostResolver::MdnsListener> listener =
2725 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 14),
2726 DnsQueryType::SRV);
2727
2728 TestMdnsListenerDelegate delegate;
2729 ASSERT_THAT(listener->Start(&delegate), IsOk());
2730 ASSERT_THAT(delegate.text_results(), testing::IsEmpty());
2731
2732 socket_factory_ptr->SimulateReceive(kMdnsResponseSrv,
2733 sizeof(kMdnsResponseSrv));
2734
2735 EXPECT_THAT(
2736 delegate.hostname_results(),
2737 testing::ElementsAre(TestMdnsListenerDelegate::CreateExpectedResult(
2738 HostResolver::MdnsListener::Delegate::UpdateType::ADDED,
2739 DnsQueryType::SRV, HostPortPair("foo.com", 8265))));
2740
2741 EXPECT_THAT(delegate.address_results(), testing::IsEmpty());
2742 EXPECT_THAT(delegate.text_results(), testing::IsEmpty());
2743 EXPECT_THAT(delegate.unhandled_results(), testing::IsEmpty());
2744}
2745
2746// Ensure query types we are not listening for do not affect MdnsListener.
2747TEST_F(HostResolverImplTest, MdnsListener_NonListeningTypes) {
2748 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2749 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2750 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2751
2752 std::unique_ptr<HostResolver::MdnsListener> listener =
2753 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 41),
2754 DnsQueryType::A);
2755
2756 TestMdnsListenerDelegate delegate;
2757 ASSERT_THAT(listener->Start(&delegate), IsOk());
2758
2759 socket_factory_ptr->SimulateReceive(kMdnsResponseAAAA,
2760 sizeof(kMdnsResponseAAAA));
2761
2762 EXPECT_THAT(delegate.address_results(), testing::IsEmpty());
2763 EXPECT_THAT(delegate.text_results(), testing::IsEmpty());
2764 EXPECT_THAT(delegate.hostname_results(), testing::IsEmpty());
2765 EXPECT_THAT(delegate.unhandled_results(), testing::IsEmpty());
2766}
2767
2768TEST_F(HostResolverImplTest, MdnsListener_RootDomain) {
2769 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2770 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2771 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2772
2773 std::unique_ptr<HostResolver::MdnsListener> listener =
2774 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 5),
2775 DnsQueryType::PTR);
2776
2777 TestMdnsListenerDelegate delegate;
2778 ASSERT_THAT(listener->Start(&delegate), IsOk());
2779
2780 socket_factory_ptr->SimulateReceive(kMdnsResponsePtrRoot,
2781 sizeof(kMdnsResponsePtrRoot));
2782
2783 EXPECT_THAT(delegate.unhandled_results(),
2784 testing::ElementsAre(std::make_pair(
2785 HostResolver::MdnsListener::Delegate::UpdateType::ADDED,
2786 DnsQueryType::PTR)));
2787
2788 EXPECT_THAT(delegate.address_results(), testing::IsEmpty());
2789 EXPECT_THAT(delegate.text_results(), testing::IsEmpty());
2790 EXPECT_THAT(delegate.hostname_results(), testing::IsEmpty());
2791}
Eric Orth9871aafa2018-10-02 19:59:182792#endif // BUILDFLAG(ENABLE_MDNS)
2793
[email protected]78eac2a2012-03-14 19:09:272794DnsConfig CreateValidDnsConfig() {
martijna23c8962016-03-04 18:18:512795 IPAddress dns_ip(192, 168, 1, 0);
[email protected]78eac2a2012-03-14 19:09:272796 DnsConfig config;
[email protected]38b50d92012-04-19 21:07:522797 config.nameservers.push_back(IPEndPoint(dns_ip, dns_protocol::kDefaultPort));
[email protected]78eac2a2012-03-14 19:09:272798 EXPECT_TRUE(config.IsValid());
2799 return config;
2800}
2801
[email protected]1d932852012-06-19 19:40:332802// Specialized fixture for tests of DnsTask.
2803class HostResolverImplDnsTest : public HostResolverImplTest {
[email protected]daae1322013-09-05 18:26:502804 public:
2805 HostResolverImplDnsTest() : dns_client_(NULL) {}
2806
[email protected]1d932852012-06-19 19:40:332807 protected:
[email protected]daae1322013-09-05 18:26:502808 // testing::Test implementation:
dcheng67be2b1f2014-10-27 21:47:292809 void SetUp() override {
[email protected]0adcb2b2012-08-15 21:30:462810 CreateResolver();
2811 }
2812
Miriam Gershenson17acdf092017-08-23 19:43:082813 void TearDown() override {
2814 HostResolverImplTest::TearDown();
2815 ChangeDnsConfig(DnsConfig());
2816 }
2817
[email protected]daae1322013-09-05 18:26:502818 // HostResolverImplTest implementation:
dchengb03027d2014-10-21 12:00:202819 void CreateResolverWithLimitsAndParams(
[email protected]106ccd2c2014-06-17 09:21:002820 size_t max_concurrent_resolves,
Eric Orth70992982018-07-24 00:25:002821 const HostResolverImpl::ProcTaskParams& params,
2822 bool ipv6_reachable) override {
[email protected]106ccd2c2014-06-17 09:21:002823 HostResolverImpl::Options options = DefaultOptions();
2824 options.max_concurrent_resolves = max_concurrent_resolves;
Eric Orth70992982018-07-24 00:25:002825 resolver_.reset(new TestHostResolverImpl(options, NULL, ipv6_reachable));
[email protected]106ccd2c2014-06-17 09:21:002826 resolver_->set_proc_params_for_test(params);
Eric Orth828bd3ae2018-12-12 17:30:362827 UseMockDnsClient(DnsConfig(), CreateDefaultDnsRules());
[email protected]1d932852012-06-19 19:40:332828 }
2829
Eric Orth828bd3ae2018-12-12 17:30:362830 // Call after CreateResolver() to update the resolver with a new MockDnsClient
2831 // using |config| and |rules|.
2832 void UseMockDnsClient(const DnsConfig& config, MockDnsClientRuleList rules) {
2833 // HostResolver expects DnsConfig to get set after setting DnsClient, so
2834 // create first with an empty config and then update the config.
2835 auto dns_client =
2836 std::make_unique<MockDnsClient>(DnsConfig(), std::move(rules));
2837 dns_client_ = dns_client.get();
2838 resolver_->SetDnsClient(std::move(dns_client));
2839 if (!config.Equals(DnsConfig()))
2840 ChangeDnsConfig(config);
eroman1efc237c2016-12-14 00:00:452841 }
2842
Eric Orth828bd3ae2018-12-12 17:30:362843 static MockDnsClientRuleList CreateDefaultDnsRules() {
2844 MockDnsClientRuleList rules;
2845
2846 AddDnsRule(&rules, "nodomain", dns_protocol::kTypeA,
dalyk48b20a992019-02-25 16:10:262847 MockDnsClientRule::NODOMAIN, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:362848 AddDnsRule(&rules, "nodomain", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:262849 MockDnsClientRule::NODOMAIN, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:362850 AddDnsRule(&rules, "nx", dns_protocol::kTypeA, MockDnsClientRule::FAIL,
dalyk48b20a992019-02-25 16:10:262851 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:362852 AddDnsRule(&rules, "nx", dns_protocol::kTypeAAAA, MockDnsClientRule::FAIL,
dalyk48b20a992019-02-25 16:10:262853 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:362854 AddDnsRule(&rules, "ok", dns_protocol::kTypeA, MockDnsClientRule::OK,
dalyk48b20a992019-02-25 16:10:262855 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:362856 AddDnsRule(&rules, "ok", dns_protocol::kTypeAAAA, MockDnsClientRule::OK,
dalyk48b20a992019-02-25 16:10:262857 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:362858 AddDnsRule(&rules, "4ok", dns_protocol::kTypeA, MockDnsClientRule::OK,
dalyk48b20a992019-02-25 16:10:262859 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:362860 AddDnsRule(&rules, "4ok", dns_protocol::kTypeAAAA, MockDnsClientRule::EMPTY,
dalyk48b20a992019-02-25 16:10:262861 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:362862 AddDnsRule(&rules, "6ok", dns_protocol::kTypeA, MockDnsClientRule::EMPTY,
dalyk48b20a992019-02-25 16:10:262863 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:362864 AddDnsRule(&rules, "6ok", dns_protocol::kTypeAAAA, MockDnsClientRule::OK,
dalyk48b20a992019-02-25 16:10:262865 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:362866 AddDnsRule(&rules, "4nx", dns_protocol::kTypeA, MockDnsClientRule::OK,
dalyk48b20a992019-02-25 16:10:262867 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:362868 AddDnsRule(&rules, "4nx", dns_protocol::kTypeAAAA, MockDnsClientRule::FAIL,
dalyk48b20a992019-02-25 16:10:262869 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:362870 AddDnsRule(&rules, "empty", dns_protocol::kTypeA, MockDnsClientRule::EMPTY,
dalyk48b20a992019-02-25 16:10:262871 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:362872 AddDnsRule(&rules, "empty", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:262873 MockDnsClientRule::EMPTY, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:362874
2875 AddDnsRule(&rules, "slow_nx", dns_protocol::kTypeA, MockDnsClientRule::FAIL,
dalyk48b20a992019-02-25 16:10:262876 true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:362877 AddDnsRule(&rules, "slow_nx", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:262878 MockDnsClientRule::FAIL, true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:362879
2880 AddDnsRule(&rules, "4slow_ok", dns_protocol::kTypeA, MockDnsClientRule::OK,
dalyk48b20a992019-02-25 16:10:262881 true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:362882 AddDnsRule(&rules, "4slow_ok", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:262883 MockDnsClientRule::OK, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:362884 AddDnsRule(&rules, "6slow_ok", dns_protocol::kTypeA, MockDnsClientRule::OK,
dalyk48b20a992019-02-25 16:10:262885 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:362886 AddDnsRule(&rules, "6slow_ok", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:262887 MockDnsClientRule::OK, true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:362888 AddDnsRule(&rules, "4slow_4ok", dns_protocol::kTypeA, MockDnsClientRule::OK,
dalyk48b20a992019-02-25 16:10:262889 true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:362890 AddDnsRule(&rules, "4slow_4ok", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:262891 MockDnsClientRule::EMPTY, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:362892 AddDnsRule(&rules, "4slow_4timeout", dns_protocol::kTypeA,
dalyk48b20a992019-02-25 16:10:262893 MockDnsClientRule::TIMEOUT, true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:362894 AddDnsRule(&rules, "4slow_4timeout", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:262895 MockDnsClientRule::OK, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:362896 AddDnsRule(&rules, "4slow_6timeout", dns_protocol::kTypeA,
dalyk48b20a992019-02-25 16:10:262897 MockDnsClientRule::OK, true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:362898 AddDnsRule(&rules, "4slow_6timeout", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:262899 MockDnsClientRule::TIMEOUT, false /* delay */);
2900
Eric Orth828bd3ae2018-12-12 17:30:362901 AddDnsRule(&rules, "4collision", dns_protocol::kTypeA,
dalyk48b20a992019-02-25 16:10:262902 IPAddress(127, 0, 53, 53), false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:362903 AddDnsRule(&rules, "4collision", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:262904 MockDnsClientRule::EMPTY, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:362905 AddDnsRule(&rules, "6collision", dns_protocol::kTypeA,
dalyk48b20a992019-02-25 16:10:262906 MockDnsClientRule::EMPTY, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:362907 // This isn't the expected IP for collisions (but looks close to it).
2908 AddDnsRule(&rules, "6collision", dns_protocol::kTypeAAAA,
2909 IPAddress(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 0, 53, 53),
dalyk48b20a992019-02-25 16:10:262910 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:362911
2912 return rules;
eroman1efc237c2016-12-14 00:00:452913 }
2914
Eric Orth828bd3ae2018-12-12 17:30:362915 // Adds a rule to |rules|.
2916 static void AddDnsRule(MockDnsClientRuleList* rules,
2917 const std::string& prefix,
2918 uint16_t qtype,
2919 MockDnsClientRule::ResultType result_type,
2920 bool delay) {
2921 rules->emplace_back(prefix, qtype, MockDnsClientRule::Result(result_type),
2922 delay);
2923 }
2924
2925 static void AddDnsRule(MockDnsClientRuleList* rules,
2926 const std::string& prefix,
2927 uint16_t qtype,
2928 const IPAddress& result_ip,
2929 bool delay) {
2930 rules->emplace_back(prefix, qtype,
2931 MockDnsClientRule::Result(
2932 BuildTestDnsResponse(prefix, std::move(result_ip))),
2933 delay);
2934 }
2935
2936 static void AddDnsRule(MockDnsClientRuleList* rules,
2937 const std::string& prefix,
2938 uint16_t qtype,
2939 IPAddress result_ip,
2940 std::string cannonname,
2941 bool delay) {
2942 rules->emplace_back(
2943 prefix, qtype,
2944 MockDnsClientRule::Result(BuildTestDnsResponse(
2945 prefix, std::move(result_ip), std::move(cannonname))),
2946 delay);
[email protected]0adcb2b2012-08-15 21:30:462947 }
2948
dalyk48b20a992019-02-25 16:10:262949 static void AddSecureDnsRule(MockDnsClientRuleList* rules,
2950 const std::string& prefix,
2951 uint16_t qtype,
2952 MockDnsClientRule::ResultType result_type,
2953 bool delay) {
2954 MockDnsClientRule::Result result(result_type);
2955 result.secure = true;
2956 rules->emplace_back(prefix, qtype, std::move(result), delay);
2957 }
2958
[email protected]1d932852012-06-19 19:40:332959 void ChangeDnsConfig(const DnsConfig& config) {
[email protected]bb0e34542012-08-31 19:52:402960 NetworkChangeNotifier::SetDnsConfig(config);
2961 // Notification is delivered asynchronously.
fdoray5eeb7642016-06-22 16:11:282962 base::RunLoop().RunUntilIdle();
[email protected]1d932852012-06-19 19:40:332963 }
2964
Miriam Gershenson44aafc122017-10-18 19:29:252965 void SetInitialDnsConfig(const DnsConfig& config) {
John Abd-El-Malek1842b8c2018-05-16 14:53:222966 NetworkChangeNotifier::ClearDnsConfigForTesting();
2967 NetworkChangeNotifier::SetDnsConfig(config);
Miriam Gershenson44aafc122017-10-18 19:29:252968 // Notification is delivered asynchronously.
2969 base::RunLoop().RunUntilIdle();
2970 }
2971
[email protected]daae1322013-09-05 18:26:502972 // Owned by |resolver_|.
2973 MockDnsClient* dns_client_;
[email protected]1d932852012-06-19 19:40:332974};
2975
Mike Westda1c690e2017-08-12 05:57:162976// RFC 6761 localhost names should always resolve to loopback.
2977TEST_F(HostResolverImplDnsTest, LocalhostLookup) {
2978 // Add a rule resolving localhost names to a non-loopback IP and test
2979 // that they still resolves to loopback.
2980 proc_->AddRuleForAllFamilies("foo.localhost", "192.168.1.42");
2981 proc_->AddRuleForAllFamilies("localhost", "192.168.1.42");
2982 proc_->AddRuleForAllFamilies("localhost.", "192.168.1.42");
2983
Eric Orth70992982018-07-24 00:25:002984 ResolveHostResponseHelper response0(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:002985 HostPortPair("foo.localhost", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:002986 EXPECT_THAT(response0.result_error(), IsOk());
2987 EXPECT_THAT(response0.request()->GetAddressResults().value().endpoints(),
2988 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
2989 CreateExpected("::1", 80)));
2990
2991 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:002992 HostPortPair("localhost", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:002993 EXPECT_THAT(response1.result_error(), IsOk());
2994 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
2995 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
2996 CreateExpected("::1", 80)));
2997
2998 ResolveHostResponseHelper response2(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:002999 HostPortPair("localhost.", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:003000 EXPECT_THAT(response2.result_error(), IsOk());
3001 EXPECT_THAT(response2.request()->GetAddressResults().value().endpoints(),
3002 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
3003 CreateExpected("::1", 80)));
3004}
3005
Mike Westda1c690e2017-08-12 05:57:163006// RFC 6761 localhost names should always resolve to loopback, even if a HOSTS
3007// file is active.
3008TEST_F(HostResolverImplDnsTest, LocalhostLookupWithHosts) {
3009 DnsHosts hosts;
3010 hosts[DnsHostsKey("localhost", ADDRESS_FAMILY_IPV4)] =
3011 IPAddress({192, 168, 1, 1});
3012 hosts[DnsHostsKey("foo.localhost", ADDRESS_FAMILY_IPV4)] =
3013 IPAddress({192, 168, 1, 2});
3014
3015 DnsConfig config = CreateValidDnsConfig();
3016 config.hosts = hosts;
3017 ChangeDnsConfig(config);
3018
Eric Orth70992982018-07-24 00:25:003019 ResolveHostResponseHelper response0(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:003020 HostPortPair("localhost", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:003021 EXPECT_THAT(response0.result_error(), IsOk());
3022 EXPECT_THAT(response0.request()->GetAddressResults().value().endpoints(),
3023 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
3024 CreateExpected("::1", 80)));
3025
3026 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:003027 HostPortPair("foo.localhost", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:003028 EXPECT_THAT(response1.result_error(), IsOk());
3029 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
3030 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
3031 CreateExpected("::1", 80)));
3032}
3033
[email protected]78eac2a2012-03-14 19:09:273034// Test successful and fallback resolutions in HostResolverImpl::DnsTask.
[email protected]1d932852012-06-19 19:40:333035TEST_F(HostResolverImplDnsTest, DnsTask) {
[email protected]38b50d92012-04-19 21:07:523036 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.102");
3037 // All other hostnames will fail in proc_.
[email protected]78eac2a2012-03-14 19:09:273038
3039 // Initially there is no config, so client should not be invoked.
Eric Orth70992982018-07-24 00:25:003040 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:003041 HostPortPair("ok_fail", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:003042 EXPECT_FALSE(initial_response.complete());
3043
3044 proc_->SignalMultiple(1u);
3045
3046 EXPECT_THAT(initial_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
3047
3048 ChangeDnsConfig(CreateValidDnsConfig());
3049
3050 ResolveHostResponseHelper response0(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:003051 HostPortPair("ok_fail", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:003052 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:003053 HostPortPair("nx_fail", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:003054 ResolveHostResponseHelper response2(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:003055 HostPortPair("nx_succeed", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:003056
3057 proc_->SignalMultiple(4u);
3058
3059 // Resolved by MockDnsClient.
3060 EXPECT_THAT(response0.result_error(), IsOk());
3061 EXPECT_THAT(response0.request()->GetAddressResults().value().endpoints(),
3062 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
3063 CreateExpected("::1", 80)));
3064
3065 // Fallback to ProcTask.
3066 EXPECT_THAT(response1.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
3067 EXPECT_THAT(response2.result_error(), IsOk());
3068 EXPECT_THAT(response2.request()->GetAddressResults().value().endpoints(),
3069 testing::ElementsAre(CreateExpected("192.168.1.102", 80)));
3070}
3071
[email protected]16c2bd72013-06-28 01:19:223072// Test successful and failing resolutions in HostResolverImpl::DnsTask when
3073// fallback to ProcTask is disabled.
3074TEST_F(HostResolverImplDnsTest, NoFallbackToProcTask) {
Eric Orth60931742018-11-05 23:40:573075 set_allow_fallback_to_proctask(false);
[email protected]16c2bd72013-06-28 01:19:223076
[email protected]16c2bd72013-06-28 01:19:223077 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.102");
3078 // All other hostnames will fail in proc_.
3079
3080 // Set empty DnsConfig.
3081 ChangeDnsConfig(DnsConfig());
3082 // Initially there is no config, so client should not be invoked.
Eric Orth70992982018-07-24 00:25:003083 ResolveHostResponseHelper initial_response0(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:003084 HostPortPair("ok_fail", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:003085 ResolveHostResponseHelper initial_response1(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:003086 HostPortPair("nx_succeed", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:003087 proc_->SignalMultiple(2u);
3088
3089 EXPECT_THAT(initial_response0.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
3090 EXPECT_THAT(initial_response1.result_error(), IsOk());
3091 EXPECT_THAT(
3092 initial_response1.request()->GetAddressResults().value().endpoints(),
3093 testing::ElementsAre(CreateExpected("192.168.1.102", 80)));
3094
3095 ChangeDnsConfig(CreateValidDnsConfig());
3096
3097 ResolveHostResponseHelper abort_response0(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:003098 HostPortPair("ok_abort", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:003099 ResolveHostResponseHelper abort_response1(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:003100 HostPortPair("nx_abort", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:003101
3102 // Simulate the case when the preference or policy has disabled the DNS
3103 // client causing AbortDnsTasks.
Eric Orth828bd3ae2018-12-12 17:30:363104 UseMockDnsClient(CreateValidDnsConfig(), CreateDefaultDnsRules());
Eric Orth70992982018-07-24 00:25:003105
3106 // First request is resolved by MockDnsClient, others should fail due to
3107 // disabled fallback to ProcTask.
3108 ResolveHostResponseHelper response0(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:003109 HostPortPair("ok_fail", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:003110 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:003111 HostPortPair("nx_fail", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:003112 proc_->SignalMultiple(6u);
3113
3114 // Aborted due to Network Change.
3115 EXPECT_THAT(abort_response0.result_error(), IsError(ERR_NETWORK_CHANGED));
3116 EXPECT_THAT(abort_response1.result_error(), IsError(ERR_NETWORK_CHANGED));
3117 // Resolved by MockDnsClient.
3118 EXPECT_THAT(response0.result_error(), IsOk());
3119 EXPECT_THAT(response0.request()->GetAddressResults().value().endpoints(),
3120 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
3121 CreateExpected("::1", 80)));
3122 // Fallback to ProcTask is disabled.
3123 EXPECT_THAT(response1.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
3124}
3125
[email protected]16c2bd72013-06-28 01:19:223126// Test behavior of OnDnsTaskFailure when Job is aborted.
3127TEST_F(HostResolverImplDnsTest, OnDnsTaskFailureAbortedJob) {
[email protected]16c2bd72013-06-28 01:19:223128 ChangeDnsConfig(CreateValidDnsConfig());
Eric Orth70992982018-07-24 00:25:003129 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:003130 HostPortPair("nx_abort", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:003131 // Abort all jobs here.
3132 CreateResolver();
3133 proc_->SignalMultiple(1u);
3134 // Run to completion.
3135 base::RunLoop().RunUntilIdle(); // Notification happens async.
3136 // It shouldn't crash during OnDnsTaskFailure callbacks.
3137 EXPECT_FALSE(response.complete());
3138
3139 // Repeat test with Fallback to ProcTask disabled
Eric Orth60931742018-11-05 23:40:573140 set_allow_fallback_to_proctask(false);
Eric Orth70992982018-07-24 00:25:003141 ChangeDnsConfig(CreateValidDnsConfig());
3142 ResolveHostResponseHelper no_fallback_response(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:003143 HostPortPair("nx_abort", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:003144 // Abort all jobs here.
3145 CreateResolver();
3146 proc_->SignalMultiple(2u);
3147 // Run to completion.
3148 base::RunLoop().RunUntilIdle(); // Notification happens async.
3149 // It shouldn't crash during OnDnsTaskFailure callbacks.
3150 EXPECT_FALSE(no_fallback_response.complete());
3151}
3152
Eric Orth60931742018-11-05 23:40:573153// Fallback to proc allowed with ANY source.
3154TEST_F(HostResolverImplDnsTest, FallbackBySource_Any) {
3155 // Ensure fallback is otherwise allowed by resolver settings.
3156 set_allow_fallback_to_proctask(true);
3157
3158 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.102");
3159 // All other hostnames will fail in proc_.
3160
3161 ChangeDnsConfig(CreateValidDnsConfig());
3162
3163 ResolveHostResponseHelper response0(resolver_->CreateRequest(
3164 HostPortPair("nx_fail", 80), NetLogWithSource(), base::nullopt));
3165 ResolveHostResponseHelper response1(resolver_->CreateRequest(
3166 HostPortPair("nx_succeed", 80), NetLogWithSource(), base::nullopt));
3167 proc_->SignalMultiple(2u);
3168
3169 EXPECT_THAT(response0.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
3170 EXPECT_THAT(response1.result_error(), IsOk());
3171 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
3172 testing::ElementsAre(CreateExpected("192.168.1.102", 80)));
3173}
3174
3175// Fallback to proc not allowed with DNS source.
3176TEST_F(HostResolverImplDnsTest, FallbackBySource_Dns) {
3177 // Ensure fallback is otherwise allowed by resolver settings.
3178 set_allow_fallback_to_proctask(true);
3179
3180 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.102");
3181 // All other hostnames will fail in proc_.
3182
3183 ChangeDnsConfig(CreateValidDnsConfig());
3184
3185 HostResolver::ResolveHostParameters parameters;
3186 parameters.source = HostResolverSource::DNS;
3187 ResolveHostResponseHelper response0(resolver_->CreateRequest(
3188 HostPortPair("nx_fail", 80), NetLogWithSource(), parameters));
3189 ResolveHostResponseHelper response1(resolver_->CreateRequest(
3190 HostPortPair("nx_succeed", 80), NetLogWithSource(), parameters));
3191 // Nothing should reach |proc_| on success, but let failures through to fail
3192 // instead of hanging.
3193 proc_->SignalMultiple(2u);
3194
3195 EXPECT_THAT(response0.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
3196 EXPECT_THAT(response1.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
3197}
3198
3199// Fallback to proc on DnsClient change allowed with ANY source.
3200TEST_F(HostResolverImplDnsTest, FallbackOnAbortBySource_Any) {
3201 // Ensure fallback is otherwise allowed by resolver settings.
3202 set_allow_fallback_to_proctask(true);
3203
3204 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.102");
3205 // All other hostnames will fail in proc_.
3206
3207 ChangeDnsConfig(CreateValidDnsConfig());
3208
3209 ResolveHostResponseHelper response0(resolver_->CreateRequest(
3210 HostPortPair("ok_fail", 80), NetLogWithSource(), base::nullopt));
3211 ResolveHostResponseHelper response1(resolver_->CreateRequest(
3212 HostPortPair("nx_succeed", 80), NetLogWithSource(), base::nullopt));
3213 proc_->SignalMultiple(2u);
3214
3215 // Simulate the case when the preference or policy has disabled the DNS client
3216 // causing AbortDnsTasks.
3217 resolver_->SetDnsClient(nullptr);
3218
3219 // All requests should fallback to proc resolver.
3220 EXPECT_THAT(response0.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
3221 EXPECT_THAT(response1.result_error(), IsOk());
3222 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
3223 testing::ElementsAre(CreateExpected("192.168.1.102", 80)));
3224}
3225
3226// Fallback to proc on DnsClient change not allowed with DNS source.
3227TEST_F(HostResolverImplDnsTest, FallbackOnAbortBySource_Dns) {
3228 // Ensure fallback is otherwise allowed by resolver settings.
3229 set_allow_fallback_to_proctask(true);
3230
3231 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.102");
3232 // All other hostnames will fail in proc_.
3233
3234 ChangeDnsConfig(CreateValidDnsConfig());
3235
3236 HostResolver::ResolveHostParameters parameters;
3237 parameters.source = HostResolverSource::DNS;
3238 ResolveHostResponseHelper response0(resolver_->CreateRequest(
3239 HostPortPair("ok_fail", 80), NetLogWithSource(), parameters));
3240 ResolveHostResponseHelper response1(resolver_->CreateRequest(
3241 HostPortPair("nx_succeed", 80), NetLogWithSource(), parameters));
3242 // Nothing should reach |proc_| on success, but let failures through to fail
3243 // instead of hanging.
3244 proc_->SignalMultiple(2u);
3245
3246 // Simulate the case when the preference or policy has disabled the DNS client
3247 // causing AbortDnsTasks.
3248 resolver_->SetDnsClient(nullptr);
3249
3250 // No fallback expected. All requests should fail.
3251 EXPECT_THAT(response0.result_error(), IsError(ERR_NETWORK_CHANGED));
3252 EXPECT_THAT(response1.result_error(), IsError(ERR_NETWORK_CHANGED));
3253}
3254
[email protected]0adcb2b2012-08-15 21:30:463255TEST_F(HostResolverImplDnsTest, DnsTaskUnspec) {
3256 ChangeDnsConfig(CreateValidDnsConfig());
3257
3258 proc_->AddRuleForAllFamilies("4nx", "192.168.1.101");
3259 // All other hostnames will fail in proc_.
3260
Eric Orth70992982018-07-24 00:25:003261 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth00fe5a62018-08-15 22:20:003262 responses.emplace_back(
3263 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
3264 HostPortPair("ok", 80), NetLogWithSource(), base::nullopt)));
3265 responses.emplace_back(
3266 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
3267 HostPortPair("4ok", 80), NetLogWithSource(), base::nullopt)));
3268 responses.emplace_back(
3269 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
3270 HostPortPair("6ok", 80), NetLogWithSource(), base::nullopt)));
3271 responses.emplace_back(
3272 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
3273 HostPortPair("4nx", 80), NetLogWithSource(), base::nullopt)));
Eric Orth70992982018-07-24 00:25:003274
3275 proc_->SignalMultiple(4u);
3276
3277 for (auto& response : responses) {
3278 EXPECT_THAT(response->result_error(), IsOk());
3279 }
3280
3281 EXPECT_THAT(responses[0]->request()->GetAddressResults().value().endpoints(),
3282 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
3283 CreateExpected("::1", 80)));
3284 EXPECT_THAT(responses[1]->request()->GetAddressResults().value().endpoints(),
3285 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
3286 EXPECT_THAT(responses[2]->request()->GetAddressResults().value().endpoints(),
3287 testing::ElementsAre(CreateExpected("::1", 80)));
3288 EXPECT_THAT(responses[3]->request()->GetAddressResults().value().endpoints(),
3289 testing::ElementsAre(CreateExpected("192.168.1.101", 80)));
3290}
3291
eroman1efc237c2016-12-14 00:00:453292TEST_F(HostResolverImplDnsTest, NameCollisionIcann) {
3293 ChangeDnsConfig(CreateValidDnsConfig());
3294
Eric Orth70992982018-07-24 00:25:003295 // When the resolver returns an A record with 127.0.53.53 it should be
3296 // mapped to a special error.
3297 ResolveHostResponseHelper response_ipv4(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:003298 HostPortPair("4collision", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:003299 EXPECT_THAT(response_ipv4.result_error(), IsError(ERR_ICANN_NAME_COLLISION));
3300 EXPECT_FALSE(response_ipv4.request()->GetAddressResults());
3301
3302 // When the resolver returns an AAAA record with ::127.0.53.53 it should
3303 // work just like any other IP. (Despite having the same suffix, it is not
3304 // considered special)
3305 ResolveHostResponseHelper response_ipv6(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:003306 HostPortPair("6collision", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:003307 EXPECT_THAT(response_ipv6.result_error(), IsOk());
3308 EXPECT_THAT(response_ipv6.request()->GetAddressResults().value().endpoints(),
3309 testing::ElementsAre(CreateExpected("::127.0.53.53", 80)));
3310}
3311
[email protected]1d932852012-06-19 19:40:333312TEST_F(HostResolverImplDnsTest, ServeFromHosts) {
[email protected]d7b9a2b2012-05-31 22:31:193313 // Initially, use empty HOSTS file.
[email protected]bb0e34542012-08-31 19:52:403314 DnsConfig config = CreateValidDnsConfig();
3315 ChangeDnsConfig(config);
[email protected]d7b9a2b2012-05-31 22:31:193316
[email protected]007b3f82013-04-09 08:46:453317 proc_->AddRuleForAllFamilies(std::string(),
3318 std::string()); // Default to failures.
[email protected]38b50d92012-04-19 21:07:523319 proc_->SignalMultiple(1u); // For the first request which misses.
[email protected]78eac2a2012-03-14 19:09:273320
Eric Orth70992982018-07-24 00:25:003321 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:003322 HostPortPair("nx_ipv4", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:003323 EXPECT_THAT(initial_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
3324
3325 IPAddress local_ipv4 = IPAddress::IPv4Localhost();
3326 IPAddress local_ipv6 = IPAddress::IPv6Localhost();
3327
3328 DnsHosts hosts;
3329 hosts[DnsHostsKey("nx_ipv4", ADDRESS_FAMILY_IPV4)] = local_ipv4;
3330 hosts[DnsHostsKey("nx_ipv6", ADDRESS_FAMILY_IPV6)] = local_ipv6;
3331 hosts[DnsHostsKey("nx_both", ADDRESS_FAMILY_IPV4)] = local_ipv4;
3332 hosts[DnsHostsKey("nx_both", ADDRESS_FAMILY_IPV6)] = local_ipv6;
3333
3334 // Update HOSTS file.
3335 config.hosts = hosts;
3336 ChangeDnsConfig(config);
3337
3338 ResolveHostResponseHelper response_ipv4(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:003339 HostPortPair("nx_ipv4", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:003340 EXPECT_THAT(response_ipv4.result_error(), IsOk());
3341 EXPECT_THAT(response_ipv4.request()->GetAddressResults().value().endpoints(),
3342 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
3343
3344 ResolveHostResponseHelper response_ipv6(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:003345 HostPortPair("nx_ipv6", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:003346 EXPECT_THAT(response_ipv6.result_error(), IsOk());
3347 EXPECT_THAT(response_ipv6.request()->GetAddressResults().value().endpoints(),
3348 testing::ElementsAre(CreateExpected("::1", 80)));
3349
3350 ResolveHostResponseHelper response_both(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:003351 HostPortPair("nx_both", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:003352 EXPECT_THAT(response_both.result_error(), IsOk());
3353 EXPECT_THAT(response_both.request()->GetAddressResults().value().endpoints(),
3354 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
3355 CreateExpected("::1", 80)));
3356
Eric Orth00fe5a62018-08-15 22:20:003357 // Requests with specified DNS query type.
3358 HostResolver::ResolveHostParameters parameters;
3359
Eric Orth192e3bb2018-11-14 19:30:323360 parameters.dns_query_type = DnsQueryType::A;
Eric Orth00fe5a62018-08-15 22:20:003361 ResolveHostResponseHelper response_specified_ipv4(resolver_->CreateRequest(
3362 HostPortPair("nx_ipv4", 80), NetLogWithSource(), parameters));
3363 EXPECT_THAT(response_specified_ipv4.result_error(), IsOk());
3364 EXPECT_THAT(response_specified_ipv4.request()
3365 ->GetAddressResults()
3366 .value()
3367 .endpoints(),
3368 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
3369
Eric Orth192e3bb2018-11-14 19:30:323370 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth00fe5a62018-08-15 22:20:003371 ResolveHostResponseHelper response_specified_ipv6(resolver_->CreateRequest(
3372 HostPortPair("nx_ipv6", 80), NetLogWithSource(), parameters));
3373 EXPECT_THAT(response_specified_ipv6.result_error(), IsOk());
3374 EXPECT_THAT(response_specified_ipv6.request()
3375 ->GetAddressResults()
3376 .value()
3377 .endpoints(),
3378 testing::ElementsAre(CreateExpected("::1", 80)));
3379
Eric Orth70992982018-07-24 00:25:003380 // Request with upper case.
3381 ResolveHostResponseHelper response_upper(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:003382 HostPortPair("nx_IPV4", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:003383 EXPECT_THAT(response_upper.result_error(), IsOk());
3384 EXPECT_THAT(response_upper.request()->GetAddressResults().value().endpoints(),
3385 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
3386}
3387
Rob Percival94f21ad2017-11-14 10:20:243388TEST_F(HostResolverImplDnsTest, CacheHostsLookupOnConfigChange) {
3389 // Only allow 1 resolution at a time, so that the second lookup is queued and
3390 // occurs when the DNS config changes.
Eric Orth70992982018-07-24 00:25:003391 CreateResolverWithLimitsAndParams(1u, DefaultParams(proc_.get()),
3392 true /* ipv6_reachable */);
Rob Percival94f21ad2017-11-14 10:20:243393 DnsConfig config = CreateValidDnsConfig();
3394 ChangeDnsConfig(config);
3395
3396 proc_->AddRuleForAllFamilies(std::string(),
3397 std::string()); // Default to failures.
3398 proc_->SignalMultiple(1u); // For the first request which fails.
3399
Eric Orth70992982018-07-24 00:25:003400 ResolveHostResponseHelper failure_response(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:003401 HostPortPair("nx_ipv4", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:003402 ResolveHostResponseHelper queued_response(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:003403 HostPortPair("nx_ipv6", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:003404
3405 DnsHosts hosts;
3406 hosts[DnsHostsKey("nx_ipv4", ADDRESS_FAMILY_IPV4)] =
3407 IPAddress::IPv4Localhost();
3408 hosts[DnsHostsKey("nx_ipv6", ADDRESS_FAMILY_IPV6)] =
3409 IPAddress::IPv6Localhost();
3410
3411 config.hosts = hosts;
3412 ChangeDnsConfig(config);
3413
3414 EXPECT_THAT(failure_response.result_error(), IsError(ERR_NETWORK_CHANGED));
3415 EXPECT_THAT(queued_response.result_error(), IsOk());
3416 EXPECT_THAT(
3417 queued_response.request()->GetAddressResults().value().endpoints(),
3418 testing::ElementsAre(CreateExpected("::1", 80)));
3419
3420 // Resolutions done by consulting the HOSTS file when the DNS config changes
dalyk48b20a992019-02-25 16:10:263421 // should result in a secure cache entry with SOURCE_HOSTS.
3422 HostCache::Key key =
Eric Orth26fa08e2019-02-22 01:28:373423 HostCache::Key("nx_ipv6", DnsQueryType::UNSPECIFIED,
dalyk48b20a992019-02-25 16:10:263424 0 /* host_resolver_flags */, HostResolverSource::ANY);
3425 key.secure = true;
3426 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result =
3427 GetCacheHit(key);
3428 ASSERT_THAT(cache_result, NotNull());
3429 EXPECT_EQ(HostCache::Entry::SOURCE_HOSTS, cache_result->second.source());
Eric Orth70992982018-07-24 00:25:003430}
3431
Eric Orthdc35748e2018-08-23 22:41:483432// Test that hosts ending in ".local" or ".local." are resolved using the system
3433// resolver.
Eric Orth26fa08e2019-02-22 01:28:373434TEST_F(HostResolverImplDnsTest, BypassDnsTask) {
Eric Orth70992982018-07-24 00:25:003435 ChangeDnsConfig(CreateValidDnsConfig());
3436
3437 proc_->AddRuleForAllFamilies(std::string(),
3438 std::string()); // Default to failures.
3439
3440 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
3441
3442 responses.emplace_back(
3443 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:003444 HostPortPair("ok.local", 80), NetLogWithSource(), base::nullopt)));
Eric Orth70992982018-07-24 00:25:003445 responses.emplace_back(
3446 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:003447 HostPortPair("ok.local.", 80), NetLogWithSource(), base::nullopt)));
Eric Orth70992982018-07-24 00:25:003448 responses.emplace_back(
3449 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:003450 HostPortPair("oklocal", 80), NetLogWithSource(), base::nullopt)));
Eric Orth70992982018-07-24 00:25:003451 responses.emplace_back(
3452 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:003453 HostPortPair("oklocal.", 80), NetLogWithSource(), base::nullopt)));
3454 responses.emplace_back(
3455 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
3456 HostPortPair("ok", 80), NetLogWithSource(), base::nullopt)));
Eric Orth70992982018-07-24 00:25:003457
3458 proc_->SignalMultiple(5u);
3459
3460 for (size_t i = 0; i < 2; ++i)
3461 EXPECT_THAT(responses[i]->result_error(), IsError(ERR_NAME_NOT_RESOLVED));
3462
3463 for (size_t i = 2; i < responses.size(); ++i)
3464 EXPECT_THAT(responses[i]->result_error(), IsOk());
3465}
3466
Eric Orth828bd3ae2018-12-12 17:30:363467#if BUILDFLAG(ENABLE_MDNS)
3468// Test that non-address queries for hosts ending in ".local" are resolved using
3469// the MDNS resolver.
3470TEST_F(HostResolverImplDnsTest, BypassDnsToMdnsWithNonAddress) {
3471 // Ensure DNS task and system (proc) requests will fail.
3472 MockDnsClientRuleList rules;
3473 rules.emplace_back("myhello.local", dns_protocol::kTypeTXT,
3474 MockDnsClientRule::Result(MockDnsClientRule::FAIL),
3475 false /* delay */);
3476 CreateResolver();
3477 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
3478 proc_->AddRuleForAllFamilies(std::string(), std::string());
3479
3480 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3481 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
3482 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
3483 // 2 socket creations for every transaction.
3484 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(2);
3485
3486 HostResolver::ResolveHostParameters dns_parameters;
3487 dns_parameters.dns_query_type = DnsQueryType::TXT;
3488
3489 ResolveHostResponseHelper response(resolver_->CreateRequest(
3490 HostPortPair("myhello.local", 80), NetLogWithSource(), dns_parameters));
3491
3492 socket_factory_ptr->SimulateReceive(kMdnsResponseTxt,
3493 sizeof(kMdnsResponseTxt));
3494 proc_->SignalMultiple(1u);
3495
3496 EXPECT_THAT(response.result_error(), IsOk());
3497 EXPECT_THAT(response.request()->GetTextResults(),
3498 testing::Optional(testing::ElementsAre("foo", "bar")));
3499}
3500#endif // BUILDFLAG(ENABLE_MDNS)
3501
Eric Orthdc35748e2018-08-23 22:41:483502// Test that DNS task is always used when explicitly requested as the source,
3503// even with a case that would normally bypass it eg hosts ending in ".local".
3504TEST_F(HostResolverImplDnsTest, DnsNotBypassedWhenDnsSource) {
3505 // Ensure DNS task requests will succeed and system (proc) requests will fail.
3506 ChangeDnsConfig(CreateValidDnsConfig());
3507 proc_->AddRuleForAllFamilies(std::string(), std::string());
3508
3509 HostResolver::ResolveHostParameters dns_parameters;
3510 dns_parameters.source = HostResolverSource::DNS;
3511
3512 ResolveHostResponseHelper dns_response(resolver_->CreateRequest(
3513 HostPortPair("ok", 80), NetLogWithSource(), dns_parameters));
3514 ResolveHostResponseHelper dns_local_response(resolver_->CreateRequest(
3515 HostPortPair("ok.local", 80), NetLogWithSource(), dns_parameters));
3516 ResolveHostResponseHelper normal_local_response(resolver_->CreateRequest(
3517 HostPortPair("ok.local", 80), NetLogWithSource(), base::nullopt));
3518
3519 proc_->SignalMultiple(3u);
3520
3521 EXPECT_THAT(dns_response.result_error(), IsOk());
3522 EXPECT_THAT(dns_local_response.result_error(), IsOk());
3523 EXPECT_THAT(normal_local_response.result_error(),
3524 IsError(ERR_NAME_NOT_RESOLVED));
3525}
3526
[email protected]443714fad2013-09-19 04:52:013527TEST_F(HostResolverImplDnsTest, SystemOnlyBypassesDnsTask) {
Eric Orthdc35748e2018-08-23 22:41:483528 // Ensure DNS task requests will succeed and system (proc) requests will fail.
3529 ChangeDnsConfig(CreateValidDnsConfig());
3530 proc_->AddRuleForAllFamilies(std::string(), std::string());
3531
3532 ResolveHostResponseHelper dns_response(resolver_->CreateRequest(
3533 HostPortPair("ok", 80), NetLogWithSource(), base::nullopt));
3534
3535 HostResolver::ResolveHostParameters parameters;
3536 parameters.source = HostResolverSource::SYSTEM;
3537 ResolveHostResponseHelper system_response(resolver_->CreateRequest(
3538 HostPortPair("ok", 80), NetLogWithSource(), parameters));
3539
3540 proc_->SignalMultiple(2u);
3541
3542 EXPECT_THAT(dns_response.result_error(), IsOk());
3543 EXPECT_THAT(system_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
3544}
3545
[email protected]f0f602bd2012-11-15 18:01:023546TEST_F(HostResolverImplDnsTest, DisableDnsClientOnPersistentFailure) {
3547 ChangeDnsConfig(CreateValidDnsConfig());
3548
[email protected]007b3f82013-04-09 08:46:453549 proc_->AddRuleForAllFamilies(std::string(),
3550 std::string()); // Default to failures.
[email protected]f0f602bd2012-11-15 18:01:023551
3552 // Check that DnsTask works.
Eric Orth00fe5a62018-08-15 22:20:003553 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
3554 HostPortPair("ok_1", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:003555 EXPECT_THAT(initial_response.result_error(), IsOk());
3556
3557 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
3558 for (unsigned i = 0; i < maximum_dns_failures(); ++i) {
3559 // Use custom names to require separate Jobs.
3560 std::string hostname = base::StringPrintf("nx_%u", i);
3561 // Ensure fallback to ProcTask succeeds.
3562 proc_->AddRuleForAllFamilies(hostname, "192.168.1.101");
3563 responses.emplace_back(
3564 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:003565 HostPortPair(hostname, 80), NetLogWithSource(), base::nullopt)));
Eric Orth70992982018-07-24 00:25:003566 }
3567
3568 proc_->SignalMultiple(responses.size());
3569
3570 for (size_t i = 0; i < responses.size(); ++i)
3571 EXPECT_THAT(responses[i]->result_error(), IsOk());
3572
3573 ASSERT_FALSE(proc_->HasBlockedRequests());
3574
Eric Orth60931742018-11-05 23:40:573575 // DnsTask should be disabled by now unless explictly requested via |source|.
Eric Orth00fe5a62018-08-15 22:20:003576 ResolveHostResponseHelper fail_response(resolver_->CreateRequest(
3577 HostPortPair("ok_2", 80), NetLogWithSource(), base::nullopt));
Eric Orth60931742018-11-05 23:40:573578 HostResolver::ResolveHostParameters parameters;
3579 parameters.source = HostResolverSource::DNS;
3580 ResolveHostResponseHelper dns_response(resolver_->CreateRequest(
3581 HostPortPair("ok_2", 80), NetLogWithSource(), parameters));
3582 proc_->SignalMultiple(2u);
Eric Orth70992982018-07-24 00:25:003583 EXPECT_THAT(fail_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
Eric Orth60931742018-11-05 23:40:573584 EXPECT_THAT(dns_response.result_error(), IsOk());
Eric Orth70992982018-07-24 00:25:003585
3586 // Check that it is re-enabled after DNS change.
3587 ChangeDnsConfig(CreateValidDnsConfig());
Eric Orth00fe5a62018-08-15 22:20:003588 ResolveHostResponseHelper reenabled_response(resolver_->CreateRequest(
3589 HostPortPair("ok_3", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:003590 EXPECT_THAT(reenabled_response.result_error(), IsOk());
3591}
3592
[email protected]f0f602bd2012-11-15 18:01:023593TEST_F(HostResolverImplDnsTest, DontDisableDnsClientOnSporadicFailure) {
3594 ChangeDnsConfig(CreateValidDnsConfig());
3595
3596 // |proc_| defaults to successes.
3597
3598 // 20 failures interleaved with 20 successes.
Eric Orth70992982018-07-24 00:25:003599 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
3600 for (unsigned i = 0; i < 40; ++i) {
3601 // Use custom names to require separate Jobs.
3602 std::string hostname = (i % 2) == 0 ? base::StringPrintf("nx_%u", i)
3603 : base::StringPrintf("ok_%u", i);
3604 responses.emplace_back(
3605 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:003606 HostPortPair(hostname, 80), NetLogWithSource(), base::nullopt)));
Eric Orth70992982018-07-24 00:25:003607 }
3608
3609 proc_->SignalMultiple(40u);
3610
Eric Orth26fa08e2019-02-22 01:28:373611 for (const auto& response : responses)
3612 EXPECT_THAT(response->result_error(), IsOk());
Eric Orth70992982018-07-24 00:25:003613
3614 // Make |proc_| default to failures.
3615 proc_->AddRuleForAllFamilies(std::string(), std::string());
3616
3617 // DnsTask should still be enabled.
3618 ResolveHostResponseHelper final_response(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:003619 HostPortPair("ok_last", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:003620 EXPECT_THAT(final_response.result_error(), IsOk());
3621}
3622
[email protected]ec666ab22013-04-17 20:05:593623// Confirm that resolving "localhost" is unrestricted even if there are no
3624// global IPv6 address. See SystemHostResolverCall for rationale.
3625// Test both the DnsClient and system host resolver paths.
3626TEST_F(HostResolverImplDnsTest, DualFamilyLocalhost) {
Eric Orth70992982018-07-24 00:25:003627 CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_.get()),
3628 false /* ipv6_reachable */);
3629
3630 // Make request fail if we actually get to the system resolver.
3631 proc_->AddRuleForAllFamilies(std::string(), std::string());
3632
3633 // Try without DnsClient.
3634 resolver_->SetDnsClient(nullptr);
3635 ResolveHostResponseHelper system_response(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:003636 HostPortPair("localhost", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:003637 EXPECT_THAT(system_response.result_error(), IsOk());
3638 EXPECT_THAT(
3639 system_response.request()->GetAddressResults().value().endpoints(),
3640 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
3641 CreateExpected("::1", 80)));
3642
3643 // With DnsClient
Eric Orth828bd3ae2018-12-12 17:30:363644 UseMockDnsClient(CreateValidDnsConfig(), CreateDefaultDnsRules());
Eric Orth70992982018-07-24 00:25:003645 ResolveHostResponseHelper builtin_response(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:003646 HostPortPair("localhost", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:003647 EXPECT_THAT(builtin_response.result_error(), IsOk());
3648 EXPECT_THAT(
3649 builtin_response.request()->GetAddressResults().value().endpoints(),
3650 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
3651 CreateExpected("::1", 80)));
3652
3653 // DnsClient configured without ipv6 (but ipv6 should still work for
3654 // localhost).
3655 DnsConfig config = CreateValidDnsConfig();
3656 config.use_local_ipv6 = false;
3657 ChangeDnsConfig(config);
3658 ResolveHostResponseHelper ipv6_disabled_response(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:003659 HostPortPair("localhost", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:003660 EXPECT_THAT(ipv6_disabled_response.result_error(), IsOk());
3661 EXPECT_THAT(
3662 ipv6_disabled_response.request()->GetAddressResults().value().endpoints(),
3663 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
3664 CreateExpected("::1", 80)));
3665}
3666
[email protected]daae1322013-09-05 18:26:503667// Cancel a request with a single DNS transaction active.
3668TEST_F(HostResolverImplDnsTest, CancelWithOneTransactionActive) {
Eric Orth70992982018-07-24 00:25:003669 // Disable ipv6 to ensure we'll only try a single transaction for the host.
3670 CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_.get()),
3671 false /* ipv6_reachable */);
3672 DnsConfig config = CreateValidDnsConfig();
3673 config.use_local_ipv6 = false;
3674 ChangeDnsConfig(config);
3675
Eric Orth00fe5a62018-08-15 22:20:003676 ResolveHostResponseHelper response(resolver_->CreateRequest(
3677 HostPortPair("ok", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:003678 ASSERT_FALSE(response.complete());
3679 ASSERT_EQ(1u, num_running_dispatcher_jobs());
3680
3681 response.CancelRequest();
3682 base::RunLoop().RunUntilIdle();
3683 EXPECT_FALSE(response.complete());
3684
3685 // Dispatcher state checked in TearDown.
3686}
3687
[email protected]daae1322013-09-05 18:26:503688// Cancel a request with a single DNS transaction active and another pending.
3689TEST_F(HostResolverImplDnsTest, CancelWithOneTransactionActiveOnePending) {
3690 CreateSerialResolver();
[email protected]daae1322013-09-05 18:26:503691 ChangeDnsConfig(CreateValidDnsConfig());
3692
Eric Orth00fe5a62018-08-15 22:20:003693 ResolveHostResponseHelper response(resolver_->CreateRequest(
3694 HostPortPair("ok", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:003695 EXPECT_EQ(1u, num_running_dispatcher_jobs());
3696
3697 response.CancelRequest();
3698 base::RunLoop().RunUntilIdle();
3699 EXPECT_FALSE(response.complete());
3700
3701 // Dispatcher state checked in TearDown.
3702}
3703
[email protected]daae1322013-09-05 18:26:503704// Cancel a request with two DNS transactions active.
3705TEST_F(HostResolverImplDnsTest, CancelWithTwoTransactionsActive) {
[email protected]daae1322013-09-05 18:26:503706 ChangeDnsConfig(CreateValidDnsConfig());
3707
Eric Orth00fe5a62018-08-15 22:20:003708 ResolveHostResponseHelper response(resolver_->CreateRequest(
3709 HostPortPair("ok", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:003710 EXPECT_EQ(2u, num_running_dispatcher_jobs());
3711
3712 response.CancelRequest();
3713 base::RunLoop().RunUntilIdle();
3714 EXPECT_FALSE(response.complete());
3715
3716 // Dispatcher state checked in TearDown.
3717}
3718
[email protected]daae1322013-09-05 18:26:503719// Delete a resolver with some active requests and some queued requests.
3720TEST_F(HostResolverImplDnsTest, DeleteWithActiveTransactions) {
3721 // At most 10 Jobs active at once.
Eric Orth70992982018-07-24 00:25:003722 CreateResolverWithLimitsAndParams(10u, DefaultParams(proc_.get()),
3723 true /* ipv6_reachable */);
[email protected]daae1322013-09-05 18:26:503724
[email protected]daae1322013-09-05 18:26:503725 ChangeDnsConfig(CreateValidDnsConfig());
3726
Eric Orth70992982018-07-24 00:25:003727 // Add 12 DNS lookups (creating well more than 10 transaction).
3728 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
3729 for (int i = 0; i < 12; ++i) {
3730 std::string hostname = base::StringPrintf("ok%i", i);
3731 responses.emplace_back(
3732 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:003733 HostPortPair(hostname, 80), NetLogWithSource(), base::nullopt)));
Eric Orth70992982018-07-24 00:25:003734 }
3735 EXPECT_EQ(10u, num_running_dispatcher_jobs());
3736
3737 resolver_.reset();
3738
3739 base::RunLoop().RunUntilIdle();
3740 for (auto& response : responses) {
3741 EXPECT_FALSE(response->complete());
3742 }
3743}
3744
[email protected]daae1322013-09-05 18:26:503745// Cancel a request with only the IPv6 transaction active.
3746TEST_F(HostResolverImplDnsTest, CancelWithIPv6TransactionActive) {
[email protected]daae1322013-09-05 18:26:503747 ChangeDnsConfig(CreateValidDnsConfig());
3748
Eric Orth70992982018-07-24 00:25:003749 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:003750 HostPortPair("6slow_ok", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:003751 EXPECT_EQ(2u, num_running_dispatcher_jobs());
3752
3753 // The IPv4 request should complete, the IPv6 request is still pending.
3754 base::RunLoop().RunUntilIdle();
3755 EXPECT_EQ(1u, num_running_dispatcher_jobs());
3756
3757 response.CancelRequest();
3758 base::RunLoop().RunUntilIdle();
3759 EXPECT_FALSE(response.complete());
3760
3761 // Dispatcher state checked in TearDown.
3762}
3763
[email protected]daae1322013-09-05 18:26:503764// Cancel a request with only the IPv4 transaction pending.
3765TEST_F(HostResolverImplDnsTest, CancelWithIPv4TransactionPending) {
Eric Orth60931742018-11-05 23:40:573766 set_allow_fallback_to_proctask(false);
[email protected]daae1322013-09-05 18:26:503767 ChangeDnsConfig(CreateValidDnsConfig());
3768
Eric Orth70992982018-07-24 00:25:003769 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:003770 HostPortPair("4slow_ok", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:003771 EXPECT_EQ(2u, num_running_dispatcher_jobs());
3772
3773 // The IPv6 request should complete, the IPv4 request is still pending.
3774 base::RunLoop().RunUntilIdle();
3775 EXPECT_EQ(1u, num_running_dispatcher_jobs());
3776
3777 response.CancelRequest();
3778 base::RunLoop().RunUntilIdle();
3779 EXPECT_FALSE(response.complete());
3780}
3781
[email protected]daae1322013-09-05 18:26:503782// Test cases where AAAA completes first.
3783TEST_F(HostResolverImplDnsTest, AAAACompletesFirst) {
Eric Orth60931742018-11-05 23:40:573784 set_allow_fallback_to_proctask(false);
[email protected]daae1322013-09-05 18:26:503785 ChangeDnsConfig(CreateValidDnsConfig());
3786
Eric Orth70992982018-07-24 00:25:003787 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
3788 responses.emplace_back(
3789 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:003790 HostPortPair("4slow_ok", 80), NetLogWithSource(), base::nullopt)));
Eric Orth70992982018-07-24 00:25:003791 responses.emplace_back(
3792 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:003793 HostPortPair("4slow_4ok", 80), NetLogWithSource(), base::nullopt)));
3794 responses.emplace_back(std::make_unique<ResolveHostResponseHelper>(
3795 resolver_->CreateRequest(HostPortPair("4slow_4timeout", 80),
3796 NetLogWithSource(), base::nullopt)));
3797 responses.emplace_back(std::make_unique<ResolveHostResponseHelper>(
3798 resolver_->CreateRequest(HostPortPair("4slow_6timeout", 80),
3799 NetLogWithSource(), base::nullopt)));
Eric Orth70992982018-07-24 00:25:003800
3801 base::RunLoop().RunUntilIdle();
3802 EXPECT_FALSE(responses[0]->complete());
3803 EXPECT_FALSE(responses[1]->complete());
3804 EXPECT_FALSE(responses[2]->complete());
3805 // The IPv6 of request 3 should have failed and resulted in cancelling the
3806 // IPv4 request.
3807 EXPECT_THAT(responses[3]->result_error(), IsError(ERR_DNS_TIMED_OUT));
3808 EXPECT_EQ(3u, num_running_dispatcher_jobs());
3809
3810 dns_client_->CompleteDelayedTransactions();
3811 EXPECT_THAT(responses[0]->result_error(), IsOk());
3812 EXPECT_THAT(responses[0]->request()->GetAddressResults().value().endpoints(),
3813 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
3814 CreateExpected("::1", 80)));
3815
3816 EXPECT_THAT(responses[1]->result_error(), IsOk());
3817 EXPECT_THAT(responses[1]->request()->GetAddressResults().value().endpoints(),
3818 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
3819
3820 EXPECT_THAT(responses[2]->result_error(), IsError(ERR_DNS_TIMED_OUT));
3821}
3822
dalyk48b20a992019-02-25 16:10:263823// Test cases where transactions return secure or mixed secure/insecure results.
3824TEST_F(HostResolverImplDnsTest, SecureOrMixedSecurityResults) {
3825 MockDnsClientRuleList rules;
3826 AddSecureDnsRule(&rules, "secure", dns_protocol::kTypeA,
3827 MockDnsClientRule::OK, false /* delay */);
3828 AddSecureDnsRule(&rules, "secure", dns_protocol::kTypeAAAA,
3829 MockDnsClientRule::OK, false /* delay */);
3830 AddDnsRule(&rules, "4insecure_6slowsecure", dns_protocol::kTypeA,
3831 MockDnsClientRule::OK, false /* delay */);
3832 AddSecureDnsRule(&rules, "4insecure_6slowsecure", dns_protocol::kTypeAAAA,
3833 MockDnsClientRule::OK, true /* delay */);
3834 AddDnsRule(&rules, "4insecure_6slowemptysecure", dns_protocol::kTypeA,
3835 MockDnsClientRule::OK, false /* delay */);
3836 AddSecureDnsRule(&rules, "4insecure_6slowemptysecure",
3837 dns_protocol::kTypeAAAA, MockDnsClientRule::EMPTY,
3838 true /* delay */);
3839 AddDnsRule(&rules, "4insecureempty_6slowsecure", dns_protocol::kTypeA,
3840 MockDnsClientRule::EMPTY, false /* delay */);
3841 AddSecureDnsRule(&rules, "4insecureempty_6slowsecure",
3842 dns_protocol::kTypeAAAA, MockDnsClientRule::OK,
3843 true /* delay */);
3844 AddDnsRule(&rules, "4insecure_6slowfailsecure", dns_protocol::kTypeA,
3845 MockDnsClientRule::OK, false /* delay */);
3846 AddSecureDnsRule(&rules, "4insecure_6slowfailsecure", dns_protocol::kTypeAAAA,
3847 MockDnsClientRule::FAIL, true /* delay */);
3848 AddSecureDnsRule(&rules, "4secure_6slowinsecure", dns_protocol::kTypeA,
3849 MockDnsClientRule::OK, false /* delay */);
3850 AddDnsRule(&rules, "4secure_6slowinsecure", dns_protocol::kTypeAAAA,
3851 MockDnsClientRule::OK, true /* delay */);
3852
3853 CreateResolver();
3854 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
3855 set_allow_fallback_to_proctask(false);
3856
3857 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
3858 responses.emplace_back(
3859 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
3860 HostPortPair("secure", 80), NetLogWithSource(), base::nullopt)));
3861 responses.emplace_back(std::make_unique<ResolveHostResponseHelper>(
3862 resolver_->CreateRequest(HostPortPair("4insecure_6slowsecure", 80),
3863 NetLogWithSource(), base::nullopt)));
3864 responses.emplace_back(std::make_unique<ResolveHostResponseHelper>(
3865 resolver_->CreateRequest(HostPortPair("4insecure_6slowemptysecure", 80),
3866 NetLogWithSource(), base::nullopt)));
3867 responses.emplace_back(std::make_unique<ResolveHostResponseHelper>(
3868 resolver_->CreateRequest(HostPortPair("4insecureempty_6slowsecure", 80),
3869 NetLogWithSource(), base::nullopt)));
3870 responses.emplace_back(std::make_unique<ResolveHostResponseHelper>(
3871 resolver_->CreateRequest(HostPortPair("4insecure_6slowfailsecure", 80),
3872 NetLogWithSource(), base::nullopt)));
3873 responses.emplace_back(std::make_unique<ResolveHostResponseHelper>(
3874 resolver_->CreateRequest(HostPortPair("4secure_6slowinsecure", 80),
3875 NetLogWithSource(), base::nullopt)));
3876
3877 base::RunLoop().RunUntilIdle();
3878 EXPECT_TRUE(responses[0]->complete());
3879 EXPECT_FALSE(responses[1]->complete());
3880 EXPECT_FALSE(responses[2]->complete());
3881 EXPECT_FALSE(responses[3]->complete());
3882 EXPECT_FALSE(responses[4]->complete());
3883 EXPECT_FALSE(responses[5]->complete());
3884
3885 dns_client_->CompleteDelayedTransactions();
3886 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result;
3887
3888 EXPECT_THAT(responses[0]->result_error(), IsOk());
3889 EXPECT_THAT(responses[0]->request()->GetAddressResults().value().endpoints(),
3890 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
3891 CreateExpected("::1", 80)));
3892 HostCache::Key key =
3893 HostCache::Key("secure", DnsQueryType::UNSPECIFIED,
3894 0 /* host_resolver_flags */, HostResolverSource::ANY);
3895 key.secure = true;
3896 cache_result = GetCacheHit(key);
3897 EXPECT_TRUE(!!cache_result);
3898
3899 EXPECT_TRUE(responses[1]->complete());
3900 EXPECT_THAT(responses[1]->result_error(), IsOk());
3901 EXPECT_THAT(responses[1]->request()->GetAddressResults().value().endpoints(),
3902 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
3903 CreateExpected("::1", 80)));
3904 cache_result = GetCacheHit(
3905 HostCache::Key("4insecure_6slowsecure", DnsQueryType::UNSPECIFIED,
3906 0 /* host_resolver_flags */, HostResolverSource::ANY));
3907 EXPECT_TRUE(!!cache_result);
3908
3909 EXPECT_TRUE(responses[2]->complete());
3910 EXPECT_THAT(responses[2]->result_error(), IsOk());
3911 EXPECT_THAT(responses[2]->request()->GetAddressResults().value().endpoints(),
3912 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
3913 cache_result = GetCacheHit(
3914 HostCache::Key("4insecure_6slowemptysecure", DnsQueryType::UNSPECIFIED,
3915 0 /* host_resolver_flags */, HostResolverSource::ANY));
3916 EXPECT_TRUE(!!cache_result);
3917
3918 EXPECT_TRUE(responses[3]->complete());
3919 EXPECT_THAT(responses[3]->result_error(), IsOk());
3920 EXPECT_THAT(responses[3]->request()->GetAddressResults().value().endpoints(),
3921 testing::ElementsAre(CreateExpected("::1", 80)));
3922 cache_result = GetCacheHit(
3923 HostCache::Key("4insecureempty_6slowsecure", DnsQueryType::UNSPECIFIED,
3924 0 /* host_resolver_flags */, HostResolverSource::ANY));
3925 EXPECT_TRUE(!!cache_result);
3926
3927 EXPECT_TRUE(responses[4]->complete());
3928 EXPECT_THAT(responses[4]->result_error(), IsError(ERR_NAME_NOT_RESOLVED));
3929 EXPECT_FALSE(responses[4]->request()->GetAddressResults());
3930 cache_result = GetCacheHit(
3931 HostCache::Key("4insecure_6slowfailsecure", DnsQueryType::UNSPECIFIED,
3932 0 /* host_resolver_flags */, HostResolverSource::ANY));
3933 EXPECT_TRUE(!!cache_result);
3934
3935 EXPECT_TRUE(responses[5]->complete());
3936 EXPECT_THAT(responses[5]->result_error(), IsOk());
3937 EXPECT_THAT(responses[5]->request()->GetAddressResults().value().endpoints(),
3938 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
3939 CreateExpected("::1", 80)));
3940 cache_result = GetCacheHit(
3941 HostCache::Key("4secure_6slowinsecure", DnsQueryType::UNSPECIFIED,
3942 0 /* host_resolver_flags */, HostResolverSource::ANY));
3943 EXPECT_TRUE(!!cache_result);
3944}
3945
[email protected]daae1322013-09-05 18:26:503946// Test the case where only a single transaction slot is available.
3947TEST_F(HostResolverImplDnsTest, SerialResolver) {
3948 CreateSerialResolver();
Eric Orth60931742018-11-05 23:40:573949 set_allow_fallback_to_proctask(false);
[email protected]daae1322013-09-05 18:26:503950 ChangeDnsConfig(CreateValidDnsConfig());
3951
Eric Orth00fe5a62018-08-15 22:20:003952 ResolveHostResponseHelper response(resolver_->CreateRequest(
3953 HostPortPair("ok", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:003954 EXPECT_FALSE(response.complete());
3955 EXPECT_EQ(1u, num_running_dispatcher_jobs());
3956
3957 base::RunLoop().RunUntilIdle();
3958 EXPECT_TRUE(response.complete());
3959 EXPECT_THAT(response.result_error(), IsOk());
3960 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
3961 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
3962 CreateExpected("::1", 80)));
3963}
3964
Eric Orth70992982018-07-24 00:25:003965// Test the case where subsequent transactions are handled on transaction
3966// completion when only part of a multi-transaction request could be initially
3967// started.
Eric Orth26fa08e2019-02-22 01:28:373968TEST_F(HostResolverImplDnsTest, AAAAStartsAfterOtherJobFinishes) {
Eric Orth70992982018-07-24 00:25:003969 CreateResolverWithLimitsAndParams(3u, DefaultParams(proc_.get()),
3970 true /* ipv6_reachable */);
Eric Orth60931742018-11-05 23:40:573971 set_allow_fallback_to_proctask(false);
Eric Orth70992982018-07-24 00:25:003972 ChangeDnsConfig(CreateValidDnsConfig());
3973
Eric Orth00fe5a62018-08-15 22:20:003974 ResolveHostResponseHelper response0(resolver_->CreateRequest(
3975 HostPortPair("ok", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:003976 EXPECT_EQ(2u, num_running_dispatcher_jobs());
3977 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:003978 HostPortPair("4slow_ok", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:003979 EXPECT_EQ(3u, num_running_dispatcher_jobs());
3980
3981 // Request 0's transactions should complete, starting Request 1's second
3982 // transaction, which should also complete.
3983 base::RunLoop().RunUntilIdle();
3984 EXPECT_EQ(1u, num_running_dispatcher_jobs());
3985 EXPECT_TRUE(response0.complete());
3986 EXPECT_FALSE(response1.complete());
3987
3988 dns_client_->CompleteDelayedTransactions();
3989 EXPECT_THAT(response1.result_error(), IsOk());
3990 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
3991 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
3992 CreateExpected("::1", 80)));
3993}
3994
[email protected]daae1322013-09-05 18:26:503995// Tests the case that a Job with a single transaction receives an empty address
3996// list, triggering fallback to ProcTask.
3997TEST_F(HostResolverImplDnsTest, IPv4EmptyFallback) {
Eric Orth70992982018-07-24 00:25:003998 // Disable ipv6 to ensure we'll only try a single transaction for the host.
3999 CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_.get()),
4000 false /* ipv6_reachable */);
4001 DnsConfig config = CreateValidDnsConfig();
4002 config.use_local_ipv6 = false;
4003 ChangeDnsConfig(config);
4004
Eric Orth322af3e42018-08-20 18:12:594005 proc_->AddRuleForAllFamilies("empty_fallback", "192.168.0.1",
4006 HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6);
Eric Orth70992982018-07-24 00:25:004007 proc_->SignalMultiple(1u);
4008
4009 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:004010 HostPortPair("empty_fallback", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:004011 EXPECT_THAT(response.result_error(), IsOk());
4012 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
4013 testing::ElementsAre(CreateExpected("192.168.0.1", 80)));
4014}
4015
[email protected]daae1322013-09-05 18:26:504016// Tests the case that a Job with two transactions receives two empty address
4017// lists, triggering fallback to ProcTask.
4018TEST_F(HostResolverImplDnsTest, UnspecEmptyFallback) {
4019 ChangeDnsConfig(CreateValidDnsConfig());
4020 proc_->AddRuleForAllFamilies("empty_fallback", "192.168.0.1");
4021 proc_->SignalMultiple(1u);
Eric Orth70992982018-07-24 00:25:004022
4023 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:004024 HostPortPair("empty_fallback", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:004025
4026 EXPECT_THAT(response.result_error(), IsOk());
4027 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
4028 testing::ElementsAre(CreateExpected("192.168.0.1", 80)));
4029}
4030
[email protected]daae1322013-09-05 18:26:504031// Tests getting a new invalid DnsConfig while there are active DnsTasks.
4032TEST_F(HostResolverImplDnsTest, InvalidDnsConfigWithPendingRequests) {
Eric Orth70992982018-07-24 00:25:004033 // At most 3 jobs active at once. This number is important, since we want
4034 // to make sure that aborting the first HostResolverImpl::Job does not
4035 // trigger another DnsTransaction on the second Job when it releases its
4036 // second prioritized dispatcher slot.
4037 CreateResolverWithLimitsAndParams(3u, DefaultParams(proc_.get()),
4038 true /* ipv6_reachable */);
4039
4040 ChangeDnsConfig(CreateValidDnsConfig());
4041
4042 proc_->AddRuleForAllFamilies("slow_nx1", "192.168.0.1");
4043 proc_->AddRuleForAllFamilies("slow_nx2", "192.168.0.2");
4044 proc_->AddRuleForAllFamilies("ok", "192.168.0.3");
4045
4046 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
4047 // First active job gets two slots.
4048 responses.emplace_back(
4049 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:004050 HostPortPair("slow_nx1", 80), NetLogWithSource(), base::nullopt)));
Eric Orth70992982018-07-24 00:25:004051 // Next job gets one slot, and waits on another.
4052 responses.emplace_back(
4053 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:004054 HostPortPair("slow_nx2", 80), NetLogWithSource(), base::nullopt)));
4055 responses.emplace_back(
4056 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
4057 HostPortPair("ok", 80), NetLogWithSource(), base::nullopt)));
Eric Orth70992982018-07-24 00:25:004058
4059 EXPECT_EQ(3u, num_running_dispatcher_jobs());
4060 for (auto& response : responses) {
4061 EXPECT_FALSE(response->complete());
4062 }
4063
4064 // Clear DNS config. Request:
4065 // 0 fully in-progress should be aborted.
4066 // 1 partially in-progress should be fully aborted.
4067 // 2 queued up should run using ProcTask.
4068 ChangeDnsConfig(DnsConfig());
4069 EXPECT_THAT(responses[0]->result_error(), IsError(ERR_NETWORK_CHANGED));
4070 EXPECT_THAT(responses[1]->result_error(), IsError(ERR_NETWORK_CHANGED));
4071 EXPECT_FALSE(responses[2]->complete());
4072
4073 // Finish up the third job. Should bypass the DnsClient, and get its
4074 // results from MockHostResolverProc.
4075 proc_->SignalMultiple(1u);
4076 EXPECT_THAT(responses[2]->result_error(), IsOk());
4077 EXPECT_THAT(responses[2]->request()->GetAddressResults().value().endpoints(),
4078 testing::ElementsAre(CreateExpected("192.168.0.3", 80)));
4079}
4080
Eric Orth70992982018-07-24 00:25:004081// Test that initial DNS config read signals do not abort pending requests
4082// when using DnsClient.
Eric Orth26fa08e2019-02-22 01:28:374083TEST_F(HostResolverImplDnsTest, DontAbortOnInitialDNSConfigRead) {
Eric Orth70992982018-07-24 00:25:004084 // DnsClient is enabled, but there's no DnsConfig, so the request should start
4085 // using ProcTask.
Eric Orth00fe5a62018-08-15 22:20:004086 ResolveHostResponseHelper response(resolver_->CreateRequest(
4087 HostPortPair("host1", 70), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:004088 EXPECT_FALSE(response.complete());
4089
4090 EXPECT_TRUE(proc_->WaitFor(1u));
4091 // Send the initial config read signal, with a valid config.
4092 SetInitialDnsConfig(CreateValidDnsConfig());
4093 proc_->SignalAll();
4094
4095 EXPECT_THAT(response.result_error(), IsOk());
4096}
4097
[email protected]daae1322013-09-05 18:26:504098// Tests the case that DnsClient is automatically disabled due to failures
4099// while there are active DnsTasks.
4100TEST_F(HostResolverImplDnsTest,
4101 AutomaticallyDisableDnsClientWithPendingRequests) {
4102 // Trying different limits is important for this test: Different limits
4103 // result in different behavior when aborting in-progress DnsTasks. Having
4104 // a DnsTask that has one job active and one in the queue when another job
4105 // occupying two slots has its DnsTask aborted is the case most likely to run
Eric Orth60931742018-11-05 23:40:574106 // into problems. Try limits between [1, 2 * # of non failure requests].
4107 for (size_t limit = 1u; limit < 10u; ++limit) {
Eric Orth70992982018-07-24 00:25:004108 CreateResolverWithLimitsAndParams(limit, DefaultParams(proc_.get()),
4109 true /* ipv6_reachable */);
4110
4111 ChangeDnsConfig(CreateValidDnsConfig());
4112
4113 // Queue up enough failures to disable DnsTasks. These will all fall back
4114 // to ProcTasks, and succeed there.
4115 std::vector<std::unique_ptr<ResolveHostResponseHelper>> failure_responses;
4116 for (unsigned i = 0u; i < maximum_dns_failures(); ++i) {
4117 std::string host = base::StringPrintf("nx%u", i);
4118 proc_->AddRuleForAllFamilies(host, "192.168.0.1");
4119 failure_responses.emplace_back(
4120 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:004121 HostPortPair(host, 80), NetLogWithSource(), base::nullopt)));
Eric Orth70992982018-07-24 00:25:004122 EXPECT_FALSE(failure_responses[i]->complete());
4123 }
4124
4125 // These requests should all bypass DnsTasks, due to the above failures,
4126 // so should end up using ProcTasks.
4127 proc_->AddRuleForAllFamilies("slow_ok1", "192.168.0.2");
4128 ResolveHostResponseHelper response0(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:004129 HostPortPair("slow_ok1", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:004130 EXPECT_FALSE(response0.complete());
4131 proc_->AddRuleForAllFamilies("slow_ok2", "192.168.0.3");
4132 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:004133 HostPortPair("slow_ok2", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:004134 EXPECT_FALSE(response1.complete());
4135 proc_->AddRuleForAllFamilies("slow_ok3", "192.168.0.4");
4136 ResolveHostResponseHelper response2(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:004137 HostPortPair("slow_ok3", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:004138 EXPECT_FALSE(response2.complete());
4139
Eric Orth60931742018-11-05 23:40:574140 // Requests specifying DNS source cannot fallback to ProcTask, so they
4141 // should be unaffected.
4142 HostResolver::ResolveHostParameters parameters;
4143 parameters.source = HostResolverSource::DNS;
4144 ResolveHostResponseHelper response_dns(resolver_->CreateRequest(
4145 HostPortPair("4slow_ok", 80), NetLogWithSource(), parameters));
4146 EXPECT_FALSE(response_dns.complete());
4147
4148 // Requests specifying SYSTEM source should be unaffected by disabling
4149 // DnsClient.
4150 proc_->AddRuleForAllFamilies("nx_ok", "192.168.0.5");
4151 parameters.source = HostResolverSource::SYSTEM;
4152 ResolveHostResponseHelper response_system(resolver_->CreateRequest(
4153 HostPortPair("nx_ok", 80), NetLogWithSource(), parameters));
4154 EXPECT_FALSE(response_system.complete());
4155
4156 proc_->SignalMultiple(maximum_dns_failures() + 5);
Eric Orth70992982018-07-24 00:25:004157
4158 for (size_t i = 0u; i < maximum_dns_failures(); ++i) {
4159 EXPECT_THAT(failure_responses[i]->result_error(), IsOk());
4160 EXPECT_THAT(failure_responses[i]
4161 ->request()
4162 ->GetAddressResults()
4163 .value()
4164 .endpoints(),
4165 testing::ElementsAre(CreateExpected("192.168.0.1", 80)));
4166 }
4167
4168 EXPECT_THAT(response0.result_error(), IsOk());
4169 EXPECT_THAT(response0.request()->GetAddressResults().value().endpoints(),
4170 testing::ElementsAre(CreateExpected("192.168.0.2", 80)));
4171 EXPECT_THAT(response1.result_error(), IsOk());
4172 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
4173 testing::ElementsAre(CreateExpected("192.168.0.3", 80)));
4174 EXPECT_THAT(response2.result_error(), IsOk());
4175 EXPECT_THAT(response2.request()->GetAddressResults().value().endpoints(),
4176 testing::ElementsAre(CreateExpected("192.168.0.4", 80)));
Eric Orth60931742018-11-05 23:40:574177
4178 dns_client_->CompleteDelayedTransactions();
4179 EXPECT_THAT(response_dns.result_error(), IsOk());
4180
4181 EXPECT_THAT(response_system.result_error(), IsOk());
4182 EXPECT_THAT(
4183 response_system.request()->GetAddressResults().value().endpoints(),
4184 testing::ElementsAre(CreateExpected("192.168.0.5", 80)));
Eric Orth70992982018-07-24 00:25:004185 }
4186}
4187
[email protected]daae1322013-09-05 18:26:504188// Tests a call to SetDnsClient while there are active DnsTasks.
4189TEST_F(HostResolverImplDnsTest, ManuallyDisableDnsClientWithPendingRequests) {
4190 // At most 3 jobs active at once. This number is important, since we want to
4191 // make sure that aborting the first HostResolverImpl::Job does not trigger
4192 // another DnsTransaction on the second Job when it releases its second
4193 // prioritized dispatcher slot.
Eric Orth70992982018-07-24 00:25:004194 CreateResolverWithLimitsAndParams(3u, DefaultParams(proc_.get()),
4195 true /* ipv6_reachable */);
[email protected]daae1322013-09-05 18:26:504196
[email protected]daae1322013-09-05 18:26:504197 ChangeDnsConfig(CreateValidDnsConfig());
4198
4199 proc_->AddRuleForAllFamilies("slow_ok1", "192.168.0.1");
4200 proc_->AddRuleForAllFamilies("slow_ok2", "192.168.0.2");
4201 proc_->AddRuleForAllFamilies("ok", "192.168.0.3");
4202
Eric Orth70992982018-07-24 00:25:004203 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
4204 // First active job gets two slots.
4205 responses.emplace_back(
4206 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:004207 HostPortPair("slow_ok1", 80), NetLogWithSource(), base::nullopt)));
Eric Orth70992982018-07-24 00:25:004208 EXPECT_FALSE(responses[0]->complete());
4209 // Next job gets one slot, and waits on another.
4210 responses.emplace_back(
4211 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:004212 HostPortPair("slow_ok2", 80), NetLogWithSource(), base::nullopt)));
Eric Orth70992982018-07-24 00:25:004213 EXPECT_FALSE(responses[1]->complete());
4214 // Next one is queued.
Eric Orth00fe5a62018-08-15 22:20:004215 responses.emplace_back(
4216 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
4217 HostPortPair("ok", 80), NetLogWithSource(), base::nullopt)));
Eric Orth70992982018-07-24 00:25:004218 EXPECT_FALSE(responses[2]->complete());
4219
4220 EXPECT_EQ(3u, num_running_dispatcher_jobs());
4221
4222 // Clear DnsClient. The two in-progress jobs should fall back to a ProcTask,
4223 // and the next one should be started with a ProcTask.
4224 resolver_->SetDnsClient(std::unique_ptr<DnsClient>());
4225
4226 // All three in-progress requests should now be running a ProcTask.
4227 EXPECT_EQ(3u, num_running_dispatcher_jobs());
4228 proc_->SignalMultiple(3u);
4229
4230 for (auto& response : responses) {
4231 EXPECT_THAT(response->result_error(), IsOk());
4232 }
4233 EXPECT_THAT(responses[0]->request()->GetAddressResults().value().endpoints(),
4234 testing::ElementsAre(CreateExpected("192.168.0.1", 80)));
4235 EXPECT_THAT(responses[1]->request()->GetAddressResults().value().endpoints(),
4236 testing::ElementsAre(CreateExpected("192.168.0.2", 80)));
4237 EXPECT_THAT(responses[2]->request()->GetAddressResults().value().endpoints(),
4238 testing::ElementsAre(CreateExpected("192.168.0.3", 80)));
4239}
4240
rchce64e6732017-06-05 17:41:574241TEST_F(HostResolverImplDnsTest, NoIPv6OnWifi) {
4242 // CreateSerialResolver will destroy the current resolver_ which will attempt
4243 // to remove itself from the NetworkChangeNotifier. If this happens after a
4244 // new NetworkChangeNotifier is active, then it will not remove itself from
4245 // the old NetworkChangeNotifier which is a potential use-after-free.
4246 resolver_ = nullptr;
mgershaf9a9232017-04-13 20:19:034247 test::ScopedMockNetworkChangeNotifier notifier;
4248 CreateSerialResolver(); // To guarantee order of resolutions.
4249 resolver_->SetNoIPv6OnWifi(true);
4250
4251 notifier.mock_network_change_notifier()->SetConnectionType(
4252 NetworkChangeNotifier::CONNECTION_WIFI);
4253 // Needed so IPv6 availability check isn't skipped.
4254 ChangeDnsConfig(CreateValidDnsConfig());
4255
4256 proc_->AddRule("h1", ADDRESS_FAMILY_UNSPECIFIED, "::3");
4257 proc_->AddRule("h1", ADDRESS_FAMILY_IPV4, "1.0.0.1");
Eric Orth322af3e42018-08-20 18:12:594258 proc_->AddRule("h1", ADDRESS_FAMILY_IPV4, "1.0.0.1",
4259 HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6);
mgershaf9a9232017-04-13 20:19:034260 proc_->AddRule("h1", ADDRESS_FAMILY_IPV6, "::2");
4261
Eric Orth00fe5a62018-08-15 22:20:004262 ResolveHostResponseHelper response(resolver_->CreateRequest(
4263 HostPortPair("h1", 80), NetLogWithSource(), base::nullopt));
4264 HostResolver::ResolveHostParameters parameters;
Eric Orth192e3bb2018-11-14 19:30:324265 parameters.dns_query_type = DnsQueryType::A;
Eric Orth00fe5a62018-08-15 22:20:004266 ResolveHostResponseHelper v4_response(resolver_->CreateRequest(
4267 HostPortPair("h1", 80), NetLogWithSource(), parameters));
Eric Orth192e3bb2018-11-14 19:30:324268 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth00fe5a62018-08-15 22:20:004269 ResolveHostResponseHelper v6_response(resolver_->CreateRequest(
4270 HostPortPair("h1", 80), NetLogWithSource(), parameters));
Eric Orth70992982018-07-24 00:25:004271
Eric Orth00fe5a62018-08-15 22:20:004272 proc_->SignalMultiple(3u);
Eric Orth70992982018-07-24 00:25:004273
4274 // Should revert to only IPV4 request.
4275 EXPECT_THAT(response.result_error(), IsOk());
4276 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
4277 testing::ElementsAre(CreateExpected("1.0.0.1", 80)));
4278
Eric Orth00fe5a62018-08-15 22:20:004279 EXPECT_THAT(v4_response.result_error(), IsOk());
4280 EXPECT_THAT(v4_response.request()->GetAddressResults().value().endpoints(),
4281 testing::ElementsAre(CreateExpected("1.0.0.1", 80)));
4282 EXPECT_THAT(v6_response.result_error(), IsOk());
4283 EXPECT_THAT(v6_response.request()->GetAddressResults().value().endpoints(),
4284 testing::ElementsAre(CreateExpected("::2", 80)));
4285
Eric Orth70992982018-07-24 00:25:004286 // Now repeat the test on non-wifi to check that IPv6 is used as normal
4287 // after the network changes.
4288 notifier.mock_network_change_notifier()->SetConnectionType(
4289 NetworkChangeNotifier::CONNECTION_4G);
4290 base::RunLoop().RunUntilIdle(); // Wait for NetworkChangeNotifier.
4291
Eric Orth00fe5a62018-08-15 22:20:004292 ResolveHostResponseHelper no_wifi_response(resolver_->CreateRequest(
4293 HostPortPair("h1", 80), NetLogWithSource(), base::nullopt));
Eric Orth192e3bb2018-11-14 19:30:324294 parameters.dns_query_type = DnsQueryType::A;
Eric Orth00fe5a62018-08-15 22:20:004295 ResolveHostResponseHelper no_wifi_v4_response(resolver_->CreateRequest(
4296 HostPortPair("h1", 80), NetLogWithSource(), parameters));
Eric Orth192e3bb2018-11-14 19:30:324297 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth00fe5a62018-08-15 22:20:004298 ResolveHostResponseHelper no_wifi_v6_response(resolver_->CreateRequest(
4299 HostPortPair("h1", 80), NetLogWithSource(), parameters));
Eric Orth70992982018-07-24 00:25:004300
Eric Orth00fe5a62018-08-15 22:20:004301 proc_->SignalMultiple(3u);
Eric Orth70992982018-07-24 00:25:004302
4303 // IPV6 should be available.
4304 EXPECT_THAT(no_wifi_response.result_error(), IsOk());
4305 EXPECT_THAT(
4306 no_wifi_response.request()->GetAddressResults().value().endpoints(),
4307 testing::ElementsAre(CreateExpected("::3", 80)));
Eric Orth00fe5a62018-08-15 22:20:004308
4309 EXPECT_THAT(no_wifi_v4_response.result_error(), IsOk());
4310 EXPECT_THAT(
4311 no_wifi_v4_response.request()->GetAddressResults().value().endpoints(),
4312 testing::ElementsAre(CreateExpected("1.0.0.1", 80)));
4313 EXPECT_THAT(no_wifi_v6_response.result_error(), IsOk());
4314 EXPECT_THAT(
4315 no_wifi_v6_response.request()->GetAddressResults().value().endpoints(),
4316 testing::ElementsAre(CreateExpected("::2", 80)));
Eric Orth70992982018-07-24 00:25:004317}
4318
Brad Lassey2e8f185d2018-05-21 22:25:214319TEST_F(HostResolverImplDnsTest, NotFoundTTL) {
4320 CreateResolver();
Eric Orth60931742018-11-05 23:40:574321 set_allow_fallback_to_proctask(false);
Brad Lassey2e8f185d2018-05-21 22:25:214322 ChangeDnsConfig(CreateValidDnsConfig());
Eric Orth70992982018-07-24 00:25:004323
4324 // NODATA
Eric Orth00fe5a62018-08-15 22:20:004325 ResolveHostResponseHelper no_data_response(resolver_->CreateRequest(
4326 HostPortPair("empty", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:004327 EXPECT_THAT(no_data_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
4328 EXPECT_FALSE(no_data_response.request()->GetAddressResults());
Eric Orth192e3bb2018-11-14 19:30:324329 HostCache::Key key("empty", DnsQueryType::UNSPECIFIED, 0,
4330 HostResolverSource::ANY);
Eric Orth70992982018-07-24 00:25:004331 HostCache::EntryStaleness staleness;
dalyk48b20a992019-02-25 16:10:264332 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result =
4333 resolver_->GetHostCache()->Lookup(key, base::TimeTicks::Now(),
4334 false /* ignore_secure */);
4335 EXPECT_TRUE(!!cache_result);
4336 EXPECT_TRUE(cache_result->second.has_ttl());
4337 EXPECT_THAT(cache_result->second.ttl(), base::TimeDelta::FromSeconds(86400));
Eric Orth70992982018-07-24 00:25:004338
4339 // NXDOMAIN
4340 ResolveHostResponseHelper no_domain_response(resolver_->CreateRequest(
Eric Orth00fe5a62018-08-15 22:20:004341 HostPortPair("nodomain", 80), NetLogWithSource(), base::nullopt));
Eric Orth70992982018-07-24 00:25:004342 EXPECT_THAT(no_domain_response.result_error(),
4343 IsError(ERR_NAME_NOT_RESOLVED));
4344 EXPECT_FALSE(no_domain_response.request()->GetAddressResults());
Eric Orth192e3bb2018-11-14 19:30:324345 HostCache::Key nxkey("nodomain", DnsQueryType::UNSPECIFIED, 0,
4346 HostResolverSource::ANY);
dalyk48b20a992019-02-25 16:10:264347 cache_result = resolver_->GetHostCache()->Lookup(
4348 nxkey, base::TimeTicks::Now(), false /* ignore_secure */);
4349 EXPECT_TRUE(!!cache_result);
4350 EXPECT_TRUE(cache_result->second.has_ttl());
4351 EXPECT_THAT(cache_result->second.ttl(), base::TimeDelta::FromSeconds(86400));
Eric Orth70992982018-07-24 00:25:004352}
4353
Eric Ortheb332862019-01-26 00:52:384354TEST_F(HostResolverImplDnsTest, CachedError) {
4355 CreateResolver();
4356 set_allow_fallback_to_proctask(false);
4357 ChangeDnsConfig(CreateValidDnsConfig());
4358
4359 HostResolver::ResolveHostParameters cache_only_parameters;
4360 cache_only_parameters.source = HostResolverSource::LOCAL_ONLY;
4361
4362 // Expect cache initially empty.
4363 ResolveHostResponseHelper cache_miss_response(resolver_->CreateRequest(
4364 HostPortPair("nodomain", 80), NetLogWithSource(), cache_only_parameters));
4365 EXPECT_THAT(cache_miss_response.result_error(), IsError(ERR_DNS_CACHE_MISS));
4366 EXPECT_FALSE(cache_miss_response.request()->GetStaleInfo());
4367
4368 // Populate cache with an error.
4369 ResolveHostResponseHelper no_domain_response(resolver_->CreateRequest(
4370 HostPortPair("nodomain", 80), NetLogWithSource(), base::nullopt));
4371 EXPECT_THAT(no_domain_response.result_error(),
4372 IsError(ERR_NAME_NOT_RESOLVED));
4373
4374 // Expect the error result can be resolved from the cache.
4375 ResolveHostResponseHelper cache_hit_response(resolver_->CreateRequest(
4376 HostPortPair("nodomain", 80), NetLogWithSource(), cache_only_parameters));
4377 EXPECT_THAT(cache_hit_response.result_error(),
4378 IsError(ERR_NAME_NOT_RESOLVED));
4379 EXPECT_FALSE(cache_hit_response.request()->GetStaleInfo().value().is_stale());
4380}
4381
Asanka Herath2d0226c2018-10-24 14:35:554382TEST_F(HostResolverImplDnsTest, NoCanonicalName) {
Eric Orth828bd3ae2018-12-12 17:30:364383 MockDnsClientRuleList rules;
4384 AddDnsRule(&rules, "alias", dns_protocol::kTypeA, IPAddress::IPv4Localhost(),
dalyk48b20a992019-02-25 16:10:264385 "canonical", false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:364386 AddDnsRule(&rules, "alias", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:264387 IPAddress::IPv6Localhost(), "canonical", false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:364388
Asanka Herath2d0226c2018-10-24 14:35:554389 CreateResolver();
Eric Orth828bd3ae2018-12-12 17:30:364390 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
Eric Orth60931742018-11-05 23:40:574391 set_allow_fallback_to_proctask(false);
Eric Orth828bd3ae2018-12-12 17:30:364392
Asanka Herath2d0226c2018-10-24 14:35:554393 ResolveHostResponseHelper response(resolver_->CreateRequest(
Asanka Herathf186bcf2018-10-24 21:23:434394 HostPortPair("alias", 80), NetLogWithSource(), base::nullopt));
Asanka Herath2d0226c2018-10-24 14:35:554395 ASSERT_THAT(response.result_error(), IsOk());
4396
Matt Menkec35d1632018-11-29 12:43:494397 // HostResolver may still give name, but if so, it must be correct.
4398 std::string result_name =
4399 response.request()->GetAddressResults().value().canonical_name();
4400 EXPECT_TRUE(result_name.empty() || result_name == "canonical");
Asanka Herath2d0226c2018-10-24 14:35:554401}
4402
Eric Orth26fa08e2019-02-22 01:28:374403TEST_F(HostResolverImplDnsTest, CanonicalName) {
Eric Orth828bd3ae2018-12-12 17:30:364404 MockDnsClientRuleList rules;
4405 AddDnsRule(&rules, "alias", dns_protocol::kTypeA, IPAddress::IPv4Localhost(),
dalyk48b20a992019-02-25 16:10:264406 "canonical", false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:364407 AddDnsRule(&rules, "alias", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:264408 IPAddress::IPv6Localhost(), "canonical", false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:364409
Asanka Herath2d0226c2018-10-24 14:35:554410 CreateResolver();
Eric Orth828bd3ae2018-12-12 17:30:364411 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
Eric Orth60931742018-11-05 23:40:574412 set_allow_fallback_to_proctask(false);
Eric Orth828bd3ae2018-12-12 17:30:364413
Asanka Herath2d0226c2018-10-24 14:35:554414 HostResolver::ResolveHostParameters params;
Asanka Herath2d0226c2018-10-24 14:35:554415 params.include_canonical_name = true;
Eric Orth541a90c2019-01-17 20:11:464416 params.source = HostResolverSource::DNS;
Asanka Herath2d0226c2018-10-24 14:35:554417 ResolveHostResponseHelper response(resolver_->CreateRequest(
4418 HostPortPair("alias", 80), NetLogWithSource(), params));
4419 ASSERT_THAT(response.result_error(), IsOk());
4420
4421 EXPECT_EQ(response.request()->GetAddressResults().value().canonical_name(),
4422 "canonical");
4423}
4424
Eric Orth26fa08e2019-02-22 01:28:374425TEST_F(HostResolverImplDnsTest, CanonicalName_PreferV6) {
Eric Orth828bd3ae2018-12-12 17:30:364426 MockDnsClientRuleList rules;
4427 AddDnsRule(&rules, "alias", dns_protocol::kTypeA, IPAddress::IPv4Localhost(),
dalyk48b20a992019-02-25 16:10:264428 "wrong", false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:364429 AddDnsRule(&rules, "alias", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:264430 IPAddress::IPv6Localhost(), "correct", true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:364431
Asanka Herath2d0226c2018-10-24 14:35:554432 CreateResolver();
Eric Orth828bd3ae2018-12-12 17:30:364433 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
Eric Orth60931742018-11-05 23:40:574434 set_allow_fallback_to_proctask(false);
Eric Orth828bd3ae2018-12-12 17:30:364435
Asanka Herath2d0226c2018-10-24 14:35:554436 HostResolver::ResolveHostParameters params;
Asanka Herath2d0226c2018-10-24 14:35:554437 params.include_canonical_name = true;
Eric Orth541a90c2019-01-17 20:11:464438 params.source = HostResolverSource::DNS;
Asanka Herath2d0226c2018-10-24 14:35:554439 ResolveHostResponseHelper response(resolver_->CreateRequest(
4440 HostPortPair("alias", 80), NetLogWithSource(), params));
4441 ASSERT_FALSE(response.complete());
4442 base::RunLoop().RunUntilIdle();
4443 dns_client_->CompleteDelayedTransactions();
4444 ASSERT_THAT(response.result_error(), IsOk());
4445 EXPECT_EQ(response.request()->GetAddressResults().value().canonical_name(),
4446 "correct");
4447}
4448
Eric Orth26fa08e2019-02-22 01:28:374449TEST_F(HostResolverImplDnsTest, CanonicalName_V4Only) {
Eric Orth828bd3ae2018-12-12 17:30:364450 MockDnsClientRuleList rules;
4451 AddDnsRule(&rules, "alias", dns_protocol::kTypeA, IPAddress::IPv4Localhost(),
dalyk48b20a992019-02-25 16:10:264452 "correct", false /* delay */);
Asanka Herath2d0226c2018-10-24 14:35:554453 CreateResolver();
Eric Orth828bd3ae2018-12-12 17:30:364454 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
Eric Orth60931742018-11-05 23:40:574455 set_allow_fallback_to_proctask(false);
Eric Orth828bd3ae2018-12-12 17:30:364456
Asanka Herath2d0226c2018-10-24 14:35:554457 HostResolver::ResolveHostParameters params;
Eric Orth192e3bb2018-11-14 19:30:324458 params.dns_query_type = DnsQueryType::A;
Asanka Herath2d0226c2018-10-24 14:35:554459 params.include_canonical_name = true;
Eric Orth541a90c2019-01-17 20:11:464460 params.source = HostResolverSource::DNS;
Asanka Herath2d0226c2018-10-24 14:35:554461 ResolveHostResponseHelper response(resolver_->CreateRequest(
4462 HostPortPair("alias", 80), NetLogWithSource(), params));
4463 ASSERT_THAT(response.result_error(), IsOk());
4464 EXPECT_EQ(response.request()->GetAddressResults().value().canonical_name(),
4465 "correct");
4466}
4467
Eric Orth541a90c2019-01-17 20:11:464468// Test that without specifying source, a request that would otherwise be
4469// handled by DNS is sent to the system resolver if cannonname is requested.
4470TEST_F(HostResolverImplDnsTest, CanonicalNameForcesProc) {
4471 // Disable fallback to ensure system resolver is used directly, not via
4472 // fallback.
4473 set_allow_fallback_to_proctask(false);
4474
4475 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.102",
4476 HOST_RESOLVER_CANONNAME, "canonical");
4477 proc_->SignalMultiple(1u);
4478
4479 ChangeDnsConfig(CreateValidDnsConfig());
4480
4481 HostResolver::ResolveHostParameters params;
4482 params.include_canonical_name = true;
4483 ResolveHostResponseHelper response(resolver_->CreateRequest(
4484 HostPortPair("nx_succeed", 80), NetLogWithSource(), params));
4485 ASSERT_THAT(response.result_error(), IsOk());
4486
4487 EXPECT_EQ(response.request()->GetAddressResults().value().canonical_name(),
4488 "canonical");
4489}
4490
tfarina9ed7f8c52016-02-19 17:50:184491TEST_F(HostResolverImplTest, ResolveLocalHostname) {
4492 AddressList addresses;
4493
4494 TestBothLoopbackIPs("localhost");
4495 TestBothLoopbackIPs("localhoST");
4496 TestBothLoopbackIPs("localhost.");
4497 TestBothLoopbackIPs("localhoST.");
4498 TestBothLoopbackIPs("localhost.localdomain");
4499 TestBothLoopbackIPs("localhost.localdomAIn");
4500 TestBothLoopbackIPs("localhost.localdomain.");
4501 TestBothLoopbackIPs("localhost.localdomAIn.");
4502 TestBothLoopbackIPs("foo.localhost");
4503 TestBothLoopbackIPs("foo.localhOSt");
4504 TestBothLoopbackIPs("foo.localhost.");
4505 TestBothLoopbackIPs("foo.localhOSt.");
4506
4507 TestIPv6LoopbackOnly("localhost6");
4508 TestIPv6LoopbackOnly("localhoST6");
4509 TestIPv6LoopbackOnly("localhost6.");
4510 TestIPv6LoopbackOnly("localhost6.localdomain6");
4511 TestIPv6LoopbackOnly("localhost6.localdomain6.");
4512
Matt Menkec35d1632018-11-29 12:43:494513 EXPECT_FALSE(ResolveLocalHostname("127.0.0.1", &addresses));
4514 EXPECT_FALSE(ResolveLocalHostname("::1", &addresses));
4515 EXPECT_FALSE(ResolveLocalHostname("0:0:0:0:0:0:0:1", &addresses));
4516 EXPECT_FALSE(ResolveLocalHostname("localhostx", &addresses));
4517 EXPECT_FALSE(ResolveLocalHostname("localhost.x", &addresses));
4518 EXPECT_FALSE(ResolveLocalHostname("foo.localdomain", &addresses));
4519 EXPECT_FALSE(ResolveLocalHostname("foo.localdomain.x", &addresses));
4520 EXPECT_FALSE(ResolveLocalHostname("localhost6x", &addresses));
4521 EXPECT_FALSE(ResolveLocalHostname("localhost.localdomain6", &addresses));
4522 EXPECT_FALSE(ResolveLocalHostname("localhost6.localdomain", &addresses));
4523 EXPECT_FALSE(ResolveLocalHostname("127.0.0.1.1", &addresses));
4524 EXPECT_FALSE(ResolveLocalHostname(".127.0.0.255", &addresses));
4525 EXPECT_FALSE(ResolveLocalHostname("::2", &addresses));
4526 EXPECT_FALSE(ResolveLocalHostname("::1:1", &addresses));
4527 EXPECT_FALSE(ResolveLocalHostname("0:0:0:0:1:0:0:1", &addresses));
4528 EXPECT_FALSE(ResolveLocalHostname("::1:1", &addresses));
4529 EXPECT_FALSE(ResolveLocalHostname("0:0:0:0:0:0:0:0:1", &addresses));
4530 EXPECT_FALSE(ResolveLocalHostname("foo.localhost.com", &addresses));
4531 EXPECT_FALSE(ResolveLocalHostname("foo.localhoste", &addresses));
tfarina9ed7f8c52016-02-19 17:50:184532}
4533
Brad Lassey786929ad2018-02-21 20:54:274534TEST_F(HostResolverImplDnsTest, AddDnsOverHttpsServerAfterConfig) {
4535 resolver_ = nullptr;
4536 test::ScopedMockNetworkChangeNotifier notifier;
4537 CreateSerialResolver(); // To guarantee order of resolutions.
4538 notifier.mock_network_change_notifier()->SetConnectionType(
4539 NetworkChangeNotifier::CONNECTION_WIFI);
4540 ChangeDnsConfig(CreateValidDnsConfig());
4541
4542 resolver_->SetDnsClientEnabled(true);
dalykb34631f2018-08-24 19:59:484543 std::string server("https://dnsserver.example.net/dns-query{?dns}");
Eric Orthc1eb1292018-10-09 22:07:074544 DnsConfigOverrides overrides;
4545 overrides.dns_over_https_servers.emplace(
4546 {DnsConfig::DnsOverHttpsServerConfig(server, true)});
4547 resolver_->SetDnsConfigOverrides(overrides);
Brad Lassey786929ad2018-02-21 20:54:274548 base::DictionaryValue* config;
4549
4550 auto value = resolver_->GetDnsConfigAsValue();
4551 EXPECT_TRUE(value);
4552 if (!value)
4553 return;
4554 value->GetAsDictionary(&config);
4555 base::ListValue* doh_servers;
4556 config->GetListWithoutPathExpansion("doh_servers", &doh_servers);
4557 EXPECT_TRUE(doh_servers);
4558 if (!doh_servers)
4559 return;
4560 EXPECT_EQ(doh_servers->GetSize(), 1u);
4561 base::DictionaryValue* server_method;
4562 EXPECT_TRUE(doh_servers->GetDictionary(0, &server_method));
4563 bool use_post;
4564 EXPECT_TRUE(server_method->GetBoolean("use_post", &use_post));
4565 EXPECT_TRUE(use_post);
dalykb34631f2018-08-24 19:59:484566 std::string server_template;
4567 EXPECT_TRUE(server_method->GetString("server_template", &server_template));
4568 EXPECT_EQ(server_template, server);
Brad Lassey786929ad2018-02-21 20:54:274569}
4570
4571TEST_F(HostResolverImplDnsTest, AddDnsOverHttpsServerBeforeConfig) {
4572 resolver_ = nullptr;
4573 test::ScopedMockNetworkChangeNotifier notifier;
4574 CreateSerialResolver(); // To guarantee order of resolutions.
4575 resolver_->SetDnsClientEnabled(true);
dalykb34631f2018-08-24 19:59:484576 std::string server("https://dnsserver.example.net/dns-query{?dns}");
Eric Orthc1eb1292018-10-09 22:07:074577 DnsConfigOverrides overrides;
4578 overrides.dns_over_https_servers.emplace(
4579 {DnsConfig::DnsOverHttpsServerConfig(server, true)});
4580 resolver_->SetDnsConfigOverrides(overrides);
Brad Lassey786929ad2018-02-21 20:54:274581
4582 notifier.mock_network_change_notifier()->SetConnectionType(
4583 NetworkChangeNotifier::CONNECTION_WIFI);
4584 ChangeDnsConfig(CreateValidDnsConfig());
4585
4586 base::DictionaryValue* config;
4587 auto value = resolver_->GetDnsConfigAsValue();
4588 EXPECT_TRUE(value);
4589 if (!value)
4590 return;
4591 value->GetAsDictionary(&config);
4592 base::ListValue* doh_servers;
4593 config->GetListWithoutPathExpansion("doh_servers", &doh_servers);
4594 EXPECT_TRUE(doh_servers);
4595 if (!doh_servers)
4596 return;
4597 EXPECT_EQ(doh_servers->GetSize(), 1u);
4598 base::DictionaryValue* server_method;
4599 EXPECT_TRUE(doh_servers->GetDictionary(0, &server_method));
4600 bool use_post;
4601 EXPECT_TRUE(server_method->GetBoolean("use_post", &use_post));
4602 EXPECT_TRUE(use_post);
dalykb34631f2018-08-24 19:59:484603 std::string server_template;
4604 EXPECT_TRUE(server_method->GetString("server_template", &server_template));
4605 EXPECT_EQ(server_template, server);
Brad Lassey786929ad2018-02-21 20:54:274606}
4607
4608TEST_F(HostResolverImplDnsTest, AddDnsOverHttpsServerBeforeClient) {
4609 resolver_ = nullptr;
4610 test::ScopedMockNetworkChangeNotifier notifier;
4611 CreateSerialResolver(); // To guarantee order of resolutions.
dalykb34631f2018-08-24 19:59:484612 std::string server("https://dnsserver.example.net/dns-query{?dns}");
Eric Orthc1eb1292018-10-09 22:07:074613 DnsConfigOverrides overrides;
4614 overrides.dns_over_https_servers.emplace(
4615 {DnsConfig::DnsOverHttpsServerConfig(server, true)});
4616 resolver_->SetDnsConfigOverrides(overrides);
Brad Lassey786929ad2018-02-21 20:54:274617
4618 notifier.mock_network_change_notifier()->SetConnectionType(
4619 NetworkChangeNotifier::CONNECTION_WIFI);
4620 ChangeDnsConfig(CreateValidDnsConfig());
4621
4622 resolver_->SetDnsClientEnabled(true);
4623
4624 base::DictionaryValue* config;
4625 auto value = resolver_->GetDnsConfigAsValue();
4626 EXPECT_TRUE(value);
4627 if (!value)
4628 return;
4629 value->GetAsDictionary(&config);
4630 base::ListValue* doh_servers;
4631 config->GetListWithoutPathExpansion("doh_servers", &doh_servers);
4632 EXPECT_TRUE(doh_servers);
4633 if (!doh_servers)
4634 return;
4635 EXPECT_EQ(doh_servers->GetSize(), 1u);
4636 base::DictionaryValue* server_method;
4637 EXPECT_TRUE(doh_servers->GetDictionary(0, &server_method));
4638 bool use_post;
4639 EXPECT_TRUE(server_method->GetBoolean("use_post", &use_post));
4640 EXPECT_TRUE(use_post);
dalykb34631f2018-08-24 19:59:484641 std::string server_template;
4642 EXPECT_TRUE(server_method->GetString("server_template", &server_template));
4643 EXPECT_EQ(server_template, server);
Brad Lassey786929ad2018-02-21 20:54:274644}
4645
4646TEST_F(HostResolverImplDnsTest, AddDnsOverHttpsServerAndThenRemove) {
4647 resolver_ = nullptr;
4648 test::ScopedMockNetworkChangeNotifier notifier;
4649 CreateSerialResolver(); // To guarantee order of resolutions.
dalykb34631f2018-08-24 19:59:484650 std::string server("https://dns.example.com/");
Eric Orthc1eb1292018-10-09 22:07:074651 DnsConfigOverrides overrides;
4652 overrides.dns_over_https_servers.emplace(
4653 {DnsConfig::DnsOverHttpsServerConfig(server, true)});
4654 resolver_->SetDnsConfigOverrides(overrides);
Brad Lassey786929ad2018-02-21 20:54:274655
4656 notifier.mock_network_change_notifier()->SetConnectionType(
4657 NetworkChangeNotifier::CONNECTION_WIFI);
4658 ChangeDnsConfig(CreateValidDnsConfig());
4659
4660 resolver_->SetDnsClientEnabled(true);
4661
4662 base::DictionaryValue* config;
4663 auto value = resolver_->GetDnsConfigAsValue();
4664 EXPECT_TRUE(value);
4665 if (!value)
4666 return;
4667 value->GetAsDictionary(&config);
4668 base::ListValue* doh_servers;
4669 config->GetListWithoutPathExpansion("doh_servers", &doh_servers);
4670 EXPECT_TRUE(doh_servers);
4671 if (!doh_servers)
4672 return;
4673 EXPECT_EQ(doh_servers->GetSize(), 1u);
4674 base::DictionaryValue* server_method;
4675 EXPECT_TRUE(doh_servers->GetDictionary(0, &server_method));
4676 bool use_post;
4677 EXPECT_TRUE(server_method->GetBoolean("use_post", &use_post));
4678 EXPECT_TRUE(use_post);
dalykb34631f2018-08-24 19:59:484679 std::string server_template;
4680 EXPECT_TRUE(server_method->GetString("server_template", &server_template));
4681 EXPECT_EQ(server_template, server);
Brad Lassey786929ad2018-02-21 20:54:274682
Eric Orthc1eb1292018-10-09 22:07:074683 resolver_->SetDnsConfigOverrides(DnsConfigOverrides());
Brad Lassey786929ad2018-02-21 20:54:274684 value = resolver_->GetDnsConfigAsValue();
4685 EXPECT_TRUE(value);
4686 if (!value)
4687 return;
4688 value->GetAsDictionary(&config);
4689 config->GetListWithoutPathExpansion("doh_servers", &doh_servers);
4690 EXPECT_TRUE(doh_servers);
4691 if (!doh_servers)
4692 return;
4693 EXPECT_EQ(doh_servers->GetSize(), 0u);
4694}
4695
Eric Orthc1eb1292018-10-09 22:07:074696TEST_F(HostResolverImplDnsTest, SetDnsConfigOverrides) {
4697 DnsConfig original_config = CreateValidDnsConfig();
4698 ChangeDnsConfig(original_config);
4699
4700 // Confirm pre-override state.
4701 ASSERT_TRUE(original_config.Equals(*dns_client_->GetConfig()));
4702
4703 DnsConfigOverrides overrides;
4704 const std::vector<IPEndPoint> nameservers = {
4705 CreateExpected("192.168.0.1", 92)};
4706 overrides.nameservers = nameservers;
4707 const std::vector<std::string> search = {"str"};
4708 overrides.search = search;
4709 const DnsHosts hosts = {
4710 {DnsHostsKey("host", ADDRESS_FAMILY_IPV4), IPAddress(192, 168, 1, 1)}};
4711 overrides.hosts = hosts;
4712 overrides.append_to_multi_label_name = false;
4713 overrides.randomize_ports = true;
4714 const int ndots = 5;
4715 overrides.ndots = ndots;
4716 const base::TimeDelta timeout = base::TimeDelta::FromSeconds(10);
4717 overrides.timeout = timeout;
4718 const int attempts = 20;
4719 overrides.attempts = attempts;
4720 overrides.rotate = true;
4721 overrides.use_local_ipv6 = true;
4722 const std::vector<DnsConfig::DnsOverHttpsServerConfig>
4723 dns_over_https_servers = {
4724 DnsConfig::DnsOverHttpsServerConfig("dns.example.com", true)};
4725 overrides.dns_over_https_servers = dns_over_https_servers;
4726
Eric Orthc823a23d2018-10-30 22:12:484727 // This test is expected to test overriding all fields.
4728 EXPECT_TRUE(overrides.OverridesEverything());
4729
Eric Orthc1eb1292018-10-09 22:07:074730 resolver_->SetDnsConfigOverrides(overrides);
4731
4732 const DnsConfig* overridden_config = dns_client_->GetConfig();
4733 EXPECT_EQ(nameservers, overridden_config->nameservers);
4734 EXPECT_EQ(search, overridden_config->search);
4735 EXPECT_EQ(hosts, overridden_config->hosts);
4736 EXPECT_FALSE(overridden_config->append_to_multi_label_name);
4737 EXPECT_TRUE(overridden_config->randomize_ports);
4738 EXPECT_EQ(ndots, overridden_config->ndots);
4739 EXPECT_EQ(timeout, overridden_config->timeout);
4740 EXPECT_EQ(attempts, overridden_config->attempts);
4741 EXPECT_TRUE(overridden_config->rotate);
4742 EXPECT_TRUE(overridden_config->use_local_ipv6);
4743 EXPECT_EQ(dns_over_https_servers, overridden_config->dns_over_https_servers);
4744}
4745
Eric Orthc823a23d2018-10-30 22:12:484746TEST_F(HostResolverImplDnsTest,
4747 SetDnsConfigOverrides_OverrideEverythingCreation) {
4748 DnsConfig original_config = CreateValidDnsConfig();
4749 ChangeDnsConfig(original_config);
4750
4751 // Confirm pre-override state.
4752 ASSERT_TRUE(original_config.Equals(*dns_client_->GetConfig()));
4753 ASSERT_FALSE(original_config.Equals(DnsConfig()));
4754
4755 DnsConfigOverrides overrides =
4756 DnsConfigOverrides::CreateOverridingEverythingWithDefaults();
4757 EXPECT_TRUE(overrides.OverridesEverything());
4758
4759 // Ensure config is valid by setting a nameserver.
4760 std::vector<IPEndPoint> nameservers = {CreateExpected("1.2.3.4", 50)};
4761 overrides.nameservers = nameservers;
4762 EXPECT_TRUE(overrides.OverridesEverything());
4763
4764 resolver_->SetDnsConfigOverrides(overrides);
4765
4766 DnsConfig expected;
4767 expected.nameservers = nameservers;
4768 EXPECT_TRUE(dns_client_->GetConfig()->Equals(DnsConfig(expected)));
4769}
4770
Eric Orthc1eb1292018-10-09 22:07:074771TEST_F(HostResolverImplDnsTest, SetDnsConfigOverrides_PartialOverride) {
4772 DnsConfig original_config = CreateValidDnsConfig();
4773 ChangeDnsConfig(original_config);
4774
4775 // Confirm pre-override state.
4776 ASSERT_TRUE(original_config.Equals(*dns_client_->GetConfig()));
4777
4778 DnsConfigOverrides overrides;
4779 const std::vector<IPEndPoint> nameservers = {
4780 CreateExpected("192.168.0.2", 192)};
4781 overrides.nameservers = nameservers;
4782 overrides.rotate = true;
Eric Orthc823a23d2018-10-30 22:12:484783 EXPECT_FALSE(overrides.OverridesEverything());
Eric Orthc1eb1292018-10-09 22:07:074784
4785 resolver_->SetDnsConfigOverrides(overrides);
4786
4787 const DnsConfig* overridden_config = dns_client_->GetConfig();
4788 EXPECT_EQ(nameservers, overridden_config->nameservers);
4789 EXPECT_EQ(original_config.search, overridden_config->search);
4790 EXPECT_EQ(original_config.hosts, overridden_config->hosts);
4791 EXPECT_TRUE(overridden_config->append_to_multi_label_name);
4792 EXPECT_FALSE(overridden_config->randomize_ports);
4793 EXPECT_EQ(original_config.ndots, overridden_config->ndots);
4794 EXPECT_EQ(original_config.timeout, overridden_config->timeout);
4795 EXPECT_EQ(original_config.attempts, overridden_config->attempts);
4796 EXPECT_TRUE(overridden_config->rotate);
4797 EXPECT_FALSE(overridden_config->use_local_ipv6);
4798 EXPECT_EQ(original_config.dns_over_https_servers,
4799 overridden_config->dns_over_https_servers);
4800}
4801
4802// Test that overridden configs are reapplied over a changed underlying system
4803// config.
4804TEST_F(HostResolverImplDnsTest, SetDnsConfigOverrides_NewConfig) {
4805 DnsConfig original_config = CreateValidDnsConfig();
4806 ChangeDnsConfig(original_config);
4807
4808 // Confirm pre-override state.
4809 ASSERT_TRUE(original_config.Equals(*dns_client_->GetConfig()));
4810
4811 DnsConfigOverrides overrides;
4812 const std::vector<IPEndPoint> nameservers = {
4813 CreateExpected("192.168.0.2", 192)};
4814 overrides.nameservers = nameservers;
4815
4816 resolver_->SetDnsConfigOverrides(overrides);
4817 ASSERT_EQ(nameservers, dns_client_->GetConfig()->nameservers);
4818
4819 DnsConfig new_config = original_config;
4820 new_config.attempts = 103;
4821 ASSERT_NE(nameservers, new_config.nameservers);
4822 ChangeDnsConfig(new_config);
4823
4824 const DnsConfig* overridden_config = dns_client_->GetConfig();
4825 EXPECT_EQ(nameservers, overridden_config->nameservers);
4826 EXPECT_EQ(new_config.attempts, overridden_config->attempts);
4827}
4828
4829TEST_F(HostResolverImplDnsTest, SetDnsConfigOverrides_ClearOverrides) {
4830 DnsConfig original_config = CreateValidDnsConfig();
4831 ChangeDnsConfig(original_config);
4832
4833 DnsConfigOverrides overrides;
4834 overrides.attempts = 245;
4835 resolver_->SetDnsConfigOverrides(overrides);
4836
4837 ASSERT_FALSE(original_config.Equals(*dns_client_->GetConfig()));
4838
4839 resolver_->SetDnsConfigOverrides(DnsConfigOverrides());
4840 EXPECT_TRUE(original_config.Equals(*dns_client_->GetConfig()));
4841}
4842
Eric Orthc823a23d2018-10-30 22:12:484843// Test that even when using config overrides, a change to the base system
4844// config cancels pending requests.
4845TEST_F(HostResolverImplDnsTest, CancellationOnBaseConfigChange) {
4846 DnsConfig original_config = CreateValidDnsConfig();
4847 ChangeDnsConfig(original_config);
4848
4849 DnsConfigOverrides overrides;
4850 overrides.nameservers.emplace({CreateExpected("123.123.123.123", 80)});
4851 ASSERT_FALSE(overrides.OverridesEverything());
4852 resolver_->SetDnsConfigOverrides(overrides);
4853
4854 ResolveHostResponseHelper response(resolver_->CreateRequest(
4855 HostPortPair("4slow_ok", 80), NetLogWithSource(), base::nullopt));
4856 ASSERT_FALSE(response.complete());
4857
4858 DnsConfig new_config = original_config;
4859 new_config.attempts = 103;
4860 ChangeDnsConfig(new_config);
4861
4862 EXPECT_THAT(response.result_error(), IsError(ERR_NETWORK_CHANGED));
4863}
4864
4865// Test that when all configuration is overridden, system configuration changes
4866// do not cancel requests.
4867TEST_F(HostResolverImplDnsTest,
4868 CancellationOnBaseConfigChange_OverridesEverything) {
4869 DnsConfig original_config = CreateValidDnsConfig();
4870 ChangeDnsConfig(original_config);
4871
4872 DnsConfigOverrides overrides =
4873 DnsConfigOverrides::CreateOverridingEverythingWithDefaults();
4874 overrides.nameservers.emplace({CreateExpected("123.123.123.123", 80)});
4875 ASSERT_TRUE(overrides.OverridesEverything());
4876 resolver_->SetDnsConfigOverrides(overrides);
4877
4878 ResolveHostResponseHelper response(resolver_->CreateRequest(
4879 HostPortPair("4slow_ok", 80), NetLogWithSource(), base::nullopt));
4880 ASSERT_FALSE(response.complete());
4881
4882 DnsConfig new_config = original_config;
4883 new_config.attempts = 103;
4884 ChangeDnsConfig(new_config);
4885
4886 dns_client_->CompleteDelayedTransactions();
4887 EXPECT_THAT(response.result_error(), IsOk());
4888}
4889
Eric Orthc1eb1292018-10-09 22:07:074890// Test that in-progress queries are cancelled on applying new DNS config
4891// overrides, same as receiving a new DnsConfig from the system.
4892TEST_F(HostResolverImplDnsTest, CancelQueriesOnSettingOverrides) {
4893 ChangeDnsConfig(CreateValidDnsConfig());
4894 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orthc823a23d2018-10-30 22:12:484895 HostPortPair("4slow_ok", 80), NetLogWithSource(), base::nullopt));
Eric Orthc1eb1292018-10-09 22:07:074896 ASSERT_FALSE(response.complete());
4897
4898 DnsConfigOverrides overrides;
4899 overrides.attempts = 123;
4900 resolver_->SetDnsConfigOverrides(overrides);
4901
4902 EXPECT_THAT(response.result_error(), IsError(ERR_NETWORK_CHANGED));
4903}
4904
4905// Queries should not be cancelled if equal overrides are set.
4906TEST_F(HostResolverImplDnsTest, CancelQueriesOnSettingOverrides_SameOverrides) {
4907 ChangeDnsConfig(CreateValidDnsConfig());
4908 DnsConfigOverrides overrides;
4909 overrides.attempts = 123;
4910 resolver_->SetDnsConfigOverrides(overrides);
4911
4912 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orthc823a23d2018-10-30 22:12:484913 HostPortPair("4slow_ok", 80), NetLogWithSource(), base::nullopt));
Eric Orthc1eb1292018-10-09 22:07:074914 ASSERT_FALSE(response.complete());
4915
4916 resolver_->SetDnsConfigOverrides(overrides);
4917
Eric Orthc823a23d2018-10-30 22:12:484918 dns_client_->CompleteDelayedTransactions();
Eric Orthc1eb1292018-10-09 22:07:074919 EXPECT_THAT(response.result_error(), IsOk());
4920}
4921
4922// Test that in-progress queries are cancelled on clearing DNS config overrides,
4923// same as receiving a new DnsConfig from the system.
4924TEST_F(HostResolverImplDnsTest, CancelQueriesOnClearingOverrides) {
4925 ChangeDnsConfig(CreateValidDnsConfig());
4926 DnsConfigOverrides overrides;
4927 overrides.attempts = 123;
4928 resolver_->SetDnsConfigOverrides(overrides);
4929
4930 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orthc823a23d2018-10-30 22:12:484931 HostPortPair("4slow_ok", 80), NetLogWithSource(), base::nullopt));
Eric Orthc1eb1292018-10-09 22:07:074932 ASSERT_FALSE(response.complete());
4933
4934 resolver_->SetDnsConfigOverrides(DnsConfigOverrides());
4935
4936 EXPECT_THAT(response.result_error(), IsError(ERR_NETWORK_CHANGED));
4937}
4938
4939// Queries should not be cancelled on clearing overrides if there were not any
4940// overrides.
4941TEST_F(HostResolverImplDnsTest, CancelQueriesOnClearingOverrides_NoOverrides) {
4942 ChangeDnsConfig(CreateValidDnsConfig());
4943 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orthc823a23d2018-10-30 22:12:484944 HostPortPair("4slow_ok", 80), NetLogWithSource(), base::nullopt));
Eric Orthc1eb1292018-10-09 22:07:074945 ASSERT_FALSE(response.complete());
4946
4947 resolver_->SetDnsConfigOverrides(DnsConfigOverrides());
4948
Eric Orthc823a23d2018-10-30 22:12:484949 dns_client_->CompleteDelayedTransactions();
Eric Orthc1eb1292018-10-09 22:07:074950 EXPECT_THAT(response.result_error(), IsOk());
4951}
4952
Paul Jensen41dc3e9f2018-11-06 22:10:104953// Test HostResolverImpl::UpdateModeForHistogram.
4954TEST_F(HostResolverImplDnsTest, ModeForHistogram) {
4955 // Test Async resolver is detected.
4956 ChangeDnsConfig(CreateValidDnsConfig());
4957 EXPECT_EQ(resolver_->mode_for_histogram_,
4958 HostResolverImpl::MODE_FOR_HISTOGRAM_ASYNC_DNS);
4959
4960 // Test upgradability is detected for async DNS.
Eric Orth192e3bb2018-11-14 19:30:324961 static const std::vector<const char*> upgradable_servers(
Paul Jensen41dc3e9f2018-11-06 22:10:104962 {// Google Public DNS
4963 "8.8.8.8", "8.8.4.4", "2001:4860:4860::8888", "2001:4860:4860::8844",
4964 // Cloudflare DNS
4965 "1.1.1.1", "1.0.0.1", "2606:4700:4700::1111", "2606:4700:4700::1001",
4966 // Quad9 DNS
4967 "9.9.9.9", "149.112.112.112", "2620:fe::fe", "2620:fe::9"});
4968 for (const char* upgradable_server : upgradable_servers) {
4969 IPAddress ip_address;
4970 ASSERT_TRUE(ip_address.AssignFromIPLiteral(upgradable_server));
4971 DnsConfig dns_config;
4972 dns_config.nameservers.push_back(
4973 IPEndPoint(ip_address, dns_protocol::kDefaultPort));
4974 ChangeDnsConfig(dns_config);
4975 EXPECT_EQ(
4976 resolver_->mode_for_histogram_,
4977 HostResolverImpl::MODE_FOR_HISTOGRAM_ASYNC_DNS_PRIVATE_SUPPORTS_DOH);
4978 }
4979
4980 // Test system resolver is detected.
4981 resolver_->SetDnsClient(nullptr);
4982 ChangeDnsConfig(CreateValidDnsConfig());
4983 EXPECT_EQ(resolver_->mode_for_histogram_,
4984 HostResolverImpl::MODE_FOR_HISTOGRAM_SYSTEM);
4985
4986 // Test upgradability is detected for system resolver.
4987 for (const char* upgradable_server : upgradable_servers) {
4988 IPAddress ip_address;
4989 ASSERT_TRUE(ip_address.AssignFromIPLiteral(upgradable_server));
4990 DnsConfig dns_config;
4991 dns_config.nameservers.push_back(
4992 IPEndPoint(ip_address, dns_protocol::kDefaultPort));
4993 ChangeDnsConfig(dns_config);
4994 EXPECT_EQ(resolver_->mode_for_histogram_,
4995 HostResolverImpl::MODE_FOR_HISTOGRAM_SYSTEM_SUPPORTS_DOH);
4996 }
4997}
4998
Eric Orth828bd3ae2018-12-12 17:30:364999TEST_F(HostResolverImplDnsTest, TxtQuery) {
5000 // Simulate two separate DNS records, each with multiple strings.
5001 std::vector<std::string> foo_records = {"foo1", "foo2", "foo3"};
5002 std::vector<std::string> bar_records = {"bar1", "bar2"};
5003 std::vector<std::vector<std::string>> text_records = {foo_records,
5004 bar_records};
5005
5006 MockDnsClientRuleList rules;
5007 rules.emplace_back("host", dns_protocol::kTypeTXT,
5008 MockDnsClientRule::Result(
5009 BuildTestDnsResponse("host", std::move(text_records))),
5010 false /* delay */);
5011
5012 CreateResolver();
5013 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
5014
5015 HostResolver::ResolveHostParameters parameters;
5016 parameters.dns_query_type = DnsQueryType::TXT;
5017
5018 ResolveHostResponseHelper response(resolver_->CreateRequest(
5019 HostPortPair("host", 108), NetLogWithSource(), parameters));
5020 EXPECT_THAT(response.result_error(), IsOk());
5021 EXPECT_FALSE(response.request()->GetAddressResults());
5022 EXPECT_FALSE(response.request()->GetHostnameResults());
5023
5024 // Order between separate DNS records is undefined, but each record should
5025 // stay in order as that order may be meaningful.
5026 ASSERT_THAT(response.request()->GetTextResults(),
5027 testing::Optional(testing::UnorderedElementsAre(
5028 "foo1", "foo2", "foo3", "bar1", "bar2")));
5029 std::vector<std::string> results =
5030 response.request()->GetTextResults().value();
5031 EXPECT_NE(results.end(), std::search(results.begin(), results.end(),
5032 foo_records.begin(), foo_records.end()));
5033 EXPECT_NE(results.end(), std::search(results.begin(), results.end(),
5034 bar_records.begin(), bar_records.end()));
5035}
5036
5037TEST_F(HostResolverImplDnsTest, TxtQuery_NonexistentDomain) {
5038 // Setup fallback to confirm it is not used for non-address results.
5039 set_allow_fallback_to_proctask(true);
5040 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
5041 proc_->SignalMultiple(1u);
5042
5043 MockDnsClientRuleList rules;
5044 rules.emplace_back("host", dns_protocol::kTypeTXT,
5045 MockDnsClientRule::Result(MockDnsClientRule::NODOMAIN),
5046 false /* delay */);
5047
5048 CreateResolver();
5049 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
5050
5051 HostResolver::ResolveHostParameters parameters;
5052 parameters.dns_query_type = DnsQueryType::TXT;
5053
5054 ResolveHostResponseHelper response(resolver_->CreateRequest(
5055 HostPortPair("host", 108), NetLogWithSource(), parameters));
5056 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
5057 EXPECT_FALSE(response.request()->GetAddressResults());
5058 EXPECT_FALSE(response.request()->GetTextResults());
5059 EXPECT_FALSE(response.request()->GetHostnameResults());
5060}
5061
5062TEST_F(HostResolverImplDnsTest, TxtQuery_Failure) {
5063 // Setup fallback to confirm it is not used for non-address results.
5064 set_allow_fallback_to_proctask(true);
5065 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
5066 proc_->SignalMultiple(1u);
5067
5068 MockDnsClientRuleList rules;
5069 rules.emplace_back("host", dns_protocol::kTypeTXT,
5070 MockDnsClientRule::Result(MockDnsClientRule::FAIL),
5071 false /* delay */);
5072
5073 CreateResolver();
5074 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
5075
5076 HostResolver::ResolveHostParameters parameters;
5077 parameters.dns_query_type = DnsQueryType::TXT;
5078
5079 ResolveHostResponseHelper response(resolver_->CreateRequest(
5080 HostPortPair("host", 108), NetLogWithSource(), parameters));
5081 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
5082 EXPECT_FALSE(response.request()->GetAddressResults());
5083 EXPECT_FALSE(response.request()->GetTextResults());
5084 EXPECT_FALSE(response.request()->GetHostnameResults());
5085}
5086
5087TEST_F(HostResolverImplDnsTest, TxtQuery_Timeout) {
5088 // Setup fallback to confirm it is not used for non-address results.
5089 set_allow_fallback_to_proctask(true);
5090 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
5091 proc_->SignalMultiple(1u);
5092
5093 MockDnsClientRuleList rules;
5094 rules.emplace_back("host", dns_protocol::kTypeTXT,
5095 MockDnsClientRule::Result(MockDnsClientRule::TIMEOUT),
5096 false /* delay */);
5097
5098 CreateResolver();
5099 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
5100
5101 HostResolver::ResolveHostParameters parameters;
5102 parameters.dns_query_type = DnsQueryType::TXT;
5103
5104 ResolveHostResponseHelper response(resolver_->CreateRequest(
5105 HostPortPair("host", 108), NetLogWithSource(), parameters));
5106 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_TIMED_OUT));
5107 EXPECT_FALSE(response.request()->GetAddressResults());
5108 EXPECT_FALSE(response.request()->GetTextResults());
5109 EXPECT_FALSE(response.request()->GetHostnameResults());
5110}
5111
5112TEST_F(HostResolverImplDnsTest, TxtQuery_Empty) {
5113 // Setup fallback to confirm it is not used for non-address results.
5114 set_allow_fallback_to_proctask(true);
5115 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
5116 proc_->SignalMultiple(1u);
5117
5118 MockDnsClientRuleList rules;
5119 rules.emplace_back("host", dns_protocol::kTypeTXT,
5120 MockDnsClientRule::Result(MockDnsClientRule::EMPTY),
5121 false /* delay */);
5122
5123 CreateResolver();
5124 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
5125
5126 HostResolver::ResolveHostParameters parameters;
5127 parameters.dns_query_type = DnsQueryType::TXT;
5128
5129 ResolveHostResponseHelper response(resolver_->CreateRequest(
5130 HostPortPair("host", 108), NetLogWithSource(), parameters));
5131 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
5132 EXPECT_FALSE(response.request()->GetAddressResults());
5133 EXPECT_FALSE(response.request()->GetTextResults());
5134 EXPECT_FALSE(response.request()->GetHostnameResults());
5135}
5136
5137TEST_F(HostResolverImplDnsTest, TxtQuery_Malformed) {
5138 // Setup fallback to confirm it is not used for non-address results.
5139 set_allow_fallback_to_proctask(true);
5140 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
5141 proc_->SignalMultiple(1u);
5142
5143 MockDnsClientRuleList rules;
5144 rules.emplace_back("host", dns_protocol::kTypeTXT,
5145 MockDnsClientRule::Result(MockDnsClientRule::MALFORMED),
5146 false /* delay */);
5147
5148 CreateResolver();
5149 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
5150
5151 HostResolver::ResolveHostParameters parameters;
5152 parameters.dns_query_type = DnsQueryType::TXT;
5153
5154 ResolveHostResponseHelper response(resolver_->CreateRequest(
5155 HostPortPair("host", 108), NetLogWithSource(), parameters));
5156 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE));
5157 EXPECT_FALSE(response.request()->GetAddressResults());
5158 EXPECT_FALSE(response.request()->GetTextResults());
5159 EXPECT_FALSE(response.request()->GetHostnameResults());
5160}
5161
5162TEST_F(HostResolverImplDnsTest, TxtQuery_MismatchedName) {
5163 std::vector<std::vector<std::string>> text_records = {{"text"}};
5164 MockDnsClientRuleList rules;
5165 rules.emplace_back("host", dns_protocol::kTypeTXT,
5166 MockDnsClientRule::Result(BuildTestDnsResponse(
5167 "host", std::move(text_records), "not.host")),
5168 false /* delay */);
5169
5170 CreateResolver();
5171 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
5172
5173 HostResolver::ResolveHostParameters parameters;
5174 parameters.dns_query_type = DnsQueryType::TXT;
5175
5176 ResolveHostResponseHelper response(resolver_->CreateRequest(
5177 HostPortPair("host", 108), NetLogWithSource(), parameters));
5178 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE));
5179 EXPECT_FALSE(response.request()->GetAddressResults());
5180 EXPECT_FALSE(response.request()->GetTextResults());
5181 EXPECT_FALSE(response.request()->GetHostnameResults());
5182}
5183
5184TEST_F(HostResolverImplDnsTest, TxtQuery_WrongType) {
5185 // Respond to a TXT query with an A response.
5186 MockDnsClientRuleList rules;
5187 rules.emplace_back("host", dns_protocol::kTypeTXT,
5188 MockDnsClientRule::Result(
5189 BuildTestDnsResponse("host", IPAddress(1, 2, 3, 4))),
5190 false /* delay */);
5191
5192 CreateResolver();
5193 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
5194
5195 HostResolver::ResolveHostParameters parameters;
5196 parameters.dns_query_type = DnsQueryType::TXT;
5197
5198 // Responses for the wrong type should be ignored.
5199 ResolveHostResponseHelper response(resolver_->CreateRequest(
5200 HostPortPair("ok", 108), NetLogWithSource(), parameters));
5201 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
5202 EXPECT_FALSE(response.request()->GetAddressResults());
5203 EXPECT_FALSE(response.request()->GetTextResults());
5204 EXPECT_FALSE(response.request()->GetHostnameResults());
5205}
5206
Eric Ortha625b042019-01-16 01:14:455207// Same as TxtQuery except we specify DNS HostResolverSource instead of relying
5208// on automatic determination. Expect same results since DNS should be what we
5209// automatically determine, but some slightly different logic paths are
5210// involved.
Eric Orth828bd3ae2018-12-12 17:30:365211TEST_F(HostResolverImplDnsTest, TxtDnsQuery) {
5212 // Simulate two separate DNS records, each with multiple strings.
5213 std::vector<std::string> foo_records = {"foo1", "foo2", "foo3"};
5214 std::vector<std::string> bar_records = {"bar1", "bar2"};
5215 std::vector<std::vector<std::string>> text_records = {foo_records,
5216 bar_records};
5217
5218 MockDnsClientRuleList rules;
5219 rules.emplace_back("host", dns_protocol::kTypeTXT,
5220 MockDnsClientRule::Result(
5221 BuildTestDnsResponse("host", std::move(text_records))),
5222 false /* delay */);
5223
5224 CreateResolver();
5225 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
5226
5227 HostResolver::ResolveHostParameters parameters;
5228 parameters.source = HostResolverSource::DNS;
5229 parameters.dns_query_type = DnsQueryType::TXT;
5230
5231 ResolveHostResponseHelper response(resolver_->CreateRequest(
5232 HostPortPair("host", 108), NetLogWithSource(), parameters));
5233 EXPECT_THAT(response.result_error(), IsOk());
5234 EXPECT_FALSE(response.request()->GetAddressResults());
5235 EXPECT_FALSE(response.request()->GetHostnameResults());
5236
5237 // Order between separate DNS records is undefined, but each record should
5238 // stay in order as that order may be meaningful.
5239 ASSERT_THAT(response.request()->GetTextResults(),
5240 testing::Optional(testing::UnorderedElementsAre(
5241 "foo1", "foo2", "foo3", "bar1", "bar2")));
5242 std::vector<std::string> results =
5243 response.request()->GetTextResults().value();
5244 EXPECT_NE(results.end(), std::search(results.begin(), results.end(),
5245 foo_records.begin(), foo_records.end()));
5246 EXPECT_NE(results.end(), std::search(results.begin(), results.end(),
5247 bar_records.begin(), bar_records.end()));
5248}
5249
Eric Orthe9db8d232019-01-14 21:24:455250TEST_F(HostResolverImplDnsTest, PtrQuery) {
5251 MockDnsClientRuleList rules;
5252 rules.emplace_back("host", dns_protocol::kTypePTR,
5253 MockDnsClientRule::Result(BuildTestDnsPointerResponse(
5254 "host", {"foo.com", "bar.com"})),
5255 false /* delay */);
5256
5257 CreateResolver();
5258 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
5259
5260 HostResolver::ResolveHostParameters parameters;
5261 parameters.dns_query_type = DnsQueryType::PTR;
5262
5263 ResolveHostResponseHelper response(resolver_->CreateRequest(
5264 HostPortPair("host", 108), NetLogWithSource(), parameters));
5265 EXPECT_THAT(response.result_error(), IsOk());
5266 EXPECT_FALSE(response.request()->GetAddressResults());
5267 EXPECT_FALSE(response.request()->GetTextResults());
5268
5269 // Order between separate records is undefined.
5270 EXPECT_THAT(response.request()->GetHostnameResults(),
5271 testing::Optional(testing::UnorderedElementsAre(
5272 HostPortPair("foo.com", 108), HostPortPair("bar.com", 108))));
5273}
5274
5275TEST_F(HostResolverImplDnsTest, PtrQuery_Ip) {
5276 MockDnsClientRuleList rules;
5277 rules.emplace_back("8.8.8.8", dns_protocol::kTypePTR,
5278 MockDnsClientRule::Result(BuildTestDnsPointerResponse(
5279 "8.8.8.8", {"foo.com", "bar.com"})),
5280 false /* delay */);
5281
5282 CreateResolver();
5283 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
5284
5285 HostResolver::ResolveHostParameters parameters;
5286 parameters.dns_query_type = DnsQueryType::PTR;
5287
5288 ResolveHostResponseHelper response(resolver_->CreateRequest(
5289 HostPortPair("8.8.8.8", 108), NetLogWithSource(), parameters));
5290 EXPECT_THAT(response.result_error(), IsOk());
5291 EXPECT_FALSE(response.request()->GetAddressResults());
5292 EXPECT_FALSE(response.request()->GetTextResults());
5293
5294 // Order between separate records is undefined.
5295 EXPECT_THAT(response.request()->GetHostnameResults(),
5296 testing::Optional(testing::UnorderedElementsAre(
5297 HostPortPair("foo.com", 108), HostPortPair("bar.com", 108))));
5298}
5299
5300TEST_F(HostResolverImplDnsTest, PtrQuery_NonexistentDomain) {
5301 // Setup fallback to confirm it is not used for non-address results.
5302 set_allow_fallback_to_proctask(true);
5303 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
5304 proc_->SignalMultiple(1u);
5305
5306 MockDnsClientRuleList rules;
5307 rules.emplace_back("host", dns_protocol::kTypePTR,
5308 MockDnsClientRule::Result(MockDnsClientRule::NODOMAIN),
5309 false /* delay */);
5310
5311 CreateResolver();
5312 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
5313
5314 HostResolver::ResolveHostParameters parameters;
5315 parameters.dns_query_type = DnsQueryType::PTR;
5316
5317 ResolveHostResponseHelper response(resolver_->CreateRequest(
5318 HostPortPair("host", 108), NetLogWithSource(), parameters));
5319 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
5320 EXPECT_FALSE(response.request()->GetAddressResults());
5321 EXPECT_FALSE(response.request()->GetTextResults());
5322 EXPECT_FALSE(response.request()->GetHostnameResults());
5323}
5324
5325TEST_F(HostResolverImplDnsTest, PtrQuery_Failure) {
5326 // Setup fallback to confirm it is not used for non-address results.
5327 set_allow_fallback_to_proctask(true);
5328 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
5329 proc_->SignalMultiple(1u);
5330
5331 MockDnsClientRuleList rules;
5332 rules.emplace_back("host", dns_protocol::kTypePTR,
5333 MockDnsClientRule::Result(MockDnsClientRule::FAIL),
5334 false /* delay */);
5335
5336 CreateResolver();
5337 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
5338
5339 HostResolver::ResolveHostParameters parameters;
5340 parameters.dns_query_type = DnsQueryType::PTR;
5341
5342 ResolveHostResponseHelper response(resolver_->CreateRequest(
5343 HostPortPair("host", 108), NetLogWithSource(), parameters));
5344 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
5345 EXPECT_FALSE(response.request()->GetAddressResults());
5346 EXPECT_FALSE(response.request()->GetTextResults());
5347 EXPECT_FALSE(response.request()->GetHostnameResults());
5348}
5349
5350TEST_F(HostResolverImplDnsTest, PtrQuery_Timeout) {
5351 // Setup fallback to confirm it is not used for non-address results.
5352 set_allow_fallback_to_proctask(true);
5353 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
5354 proc_->SignalMultiple(1u);
5355
5356 MockDnsClientRuleList rules;
5357 rules.emplace_back("host", dns_protocol::kTypePTR,
5358 MockDnsClientRule::Result(MockDnsClientRule::TIMEOUT),
5359 false /* delay */);
5360
5361 CreateResolver();
5362 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
5363
5364 HostResolver::ResolveHostParameters parameters;
5365 parameters.dns_query_type = DnsQueryType::PTR;
5366
5367 ResolveHostResponseHelper response(resolver_->CreateRequest(
5368 HostPortPair("host", 108), NetLogWithSource(), parameters));
5369 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_TIMED_OUT));
5370 EXPECT_FALSE(response.request()->GetAddressResults());
5371 EXPECT_FALSE(response.request()->GetTextResults());
5372 EXPECT_FALSE(response.request()->GetHostnameResults());
5373}
5374
5375TEST_F(HostResolverImplDnsTest, PtrQuery_Empty) {
5376 // Setup fallback to confirm it is not used for non-address results.
5377 set_allow_fallback_to_proctask(true);
5378 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
5379 proc_->SignalMultiple(1u);
5380
5381 MockDnsClientRuleList rules;
5382 rules.emplace_back("host", dns_protocol::kTypePTR,
5383 MockDnsClientRule::Result(MockDnsClientRule::EMPTY),
5384 false /* delay */);
5385
5386 CreateResolver();
5387 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
5388
5389 HostResolver::ResolveHostParameters parameters;
5390 parameters.dns_query_type = DnsQueryType::PTR;
5391
5392 ResolveHostResponseHelper response(resolver_->CreateRequest(
5393 HostPortPair("host", 108), NetLogWithSource(), parameters));
5394 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
5395 EXPECT_FALSE(response.request()->GetAddressResults());
5396 EXPECT_FALSE(response.request()->GetTextResults());
5397 EXPECT_FALSE(response.request()->GetHostnameResults());
5398}
5399
5400TEST_F(HostResolverImplDnsTest, PtrQuery_Malformed) {
5401 // Setup fallback to confirm it is not used for non-address results.
5402 set_allow_fallback_to_proctask(true);
5403 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
5404 proc_->SignalMultiple(1u);
5405
5406 MockDnsClientRuleList rules;
5407 rules.emplace_back("host", dns_protocol::kTypePTR,
5408 MockDnsClientRule::Result(MockDnsClientRule::MALFORMED),
5409 false /* delay */);
5410
5411 CreateResolver();
5412 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
5413
5414 HostResolver::ResolveHostParameters parameters;
5415 parameters.dns_query_type = DnsQueryType::PTR;
5416
5417 ResolveHostResponseHelper response(resolver_->CreateRequest(
5418 HostPortPair("host", 108), NetLogWithSource(), parameters));
5419 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE));
5420 EXPECT_FALSE(response.request()->GetAddressResults());
5421 EXPECT_FALSE(response.request()->GetTextResults());
5422 EXPECT_FALSE(response.request()->GetHostnameResults());
5423}
5424
5425TEST_F(HostResolverImplDnsTest, PtrQuery_MismatchedName) {
5426 std::vector<std::string> ptr_records = {{"foo.com"}};
5427 MockDnsClientRuleList rules;
5428 rules.emplace_back("host", dns_protocol::kTypePTR,
5429 MockDnsClientRule::Result(BuildTestDnsPointerResponse(
5430 "host", std::move(ptr_records), "not.host")),
5431 false /* delay */);
5432
5433 CreateResolver();
5434 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
5435
5436 HostResolver::ResolveHostParameters parameters;
5437 parameters.dns_query_type = DnsQueryType::PTR;
5438
5439 ResolveHostResponseHelper response(resolver_->CreateRequest(
5440 HostPortPair("host", 108), NetLogWithSource(), parameters));
5441 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE));
5442 EXPECT_FALSE(response.request()->GetAddressResults());
5443 EXPECT_FALSE(response.request()->GetTextResults());
5444 EXPECT_FALSE(response.request()->GetHostnameResults());
5445}
5446
5447TEST_F(HostResolverImplDnsTest, PtrQuery_WrongType) {
5448 // Respond to a TXT query with an A response.
5449 MockDnsClientRuleList rules;
5450 rules.emplace_back("host", dns_protocol::kTypePTR,
5451 MockDnsClientRule::Result(
5452 BuildTestDnsResponse("host", IPAddress(1, 2, 3, 4))),
5453 false /* delay */);
5454
5455 CreateResolver();
5456 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
5457
5458 HostResolver::ResolveHostParameters parameters;
5459 parameters.dns_query_type = DnsQueryType::PTR;
5460
5461 // Responses for the wrong type should be ignored.
5462 ResolveHostResponseHelper response(resolver_->CreateRequest(
5463 HostPortPair("ok", 108), NetLogWithSource(), parameters));
5464 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
5465 EXPECT_FALSE(response.request()->GetAddressResults());
5466 EXPECT_FALSE(response.request()->GetTextResults());
5467 EXPECT_FALSE(response.request()->GetHostnameResults());
5468}
5469
Eric Ortha625b042019-01-16 01:14:455470// Same as PtrQuery except we specify DNS HostResolverSource instead of relying
5471// on automatic determination. Expect same results since DNS should be what we
5472// automatically determine, but some slightly different logic paths are
5473// involved.
Eric Orthe9db8d232019-01-14 21:24:455474TEST_F(HostResolverImplDnsTest, PtrDnsQuery) {
5475 MockDnsClientRuleList rules;
5476 rules.emplace_back("host", dns_protocol::kTypePTR,
5477 MockDnsClientRule::Result(BuildTestDnsPointerResponse(
5478 "host", {"foo.com", "bar.com"})),
5479 false /* delay */);
5480
5481 CreateResolver();
5482 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
5483
5484 HostResolver::ResolveHostParameters parameters;
5485 parameters.source = HostResolverSource::DNS;
5486 parameters.dns_query_type = DnsQueryType::PTR;
5487
5488 ResolveHostResponseHelper response(resolver_->CreateRequest(
5489 HostPortPair("host", 108), NetLogWithSource(), parameters));
5490 EXPECT_THAT(response.result_error(), IsOk());
5491 EXPECT_FALSE(response.request()->GetAddressResults());
5492 EXPECT_FALSE(response.request()->GetTextResults());
5493
5494 // Order between separate records is undefined.
5495 EXPECT_THAT(response.request()->GetHostnameResults(),
5496 testing::Optional(testing::UnorderedElementsAre(
5497 HostPortPair("foo.com", 108), HostPortPair("bar.com", 108))));
5498}
5499
Eric Ortha625b042019-01-16 01:14:455500TEST_F(HostResolverImplDnsTest, SrvQuery) {
5501 const TestServiceRecord kRecord1 = {2, 3, 1223, "foo.com"};
5502 const TestServiceRecord kRecord2 = {5, 10, 80, "bar.com"};
5503 const TestServiceRecord kRecord3 = {5, 1, 5, "google.com"};
5504 const TestServiceRecord kRecord4 = {2, 100, 12345, "chromium.org"};
5505 MockDnsClientRuleList rules;
5506 rules.emplace_back("host", dns_protocol::kTypeSRV,
5507 MockDnsClientRule::Result(BuildTestDnsResponse(
5508 "host", {kRecord1, kRecord2, kRecord3, kRecord4})),
5509 false /* delay */);
5510
5511 CreateResolver();
5512 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
5513
5514 HostResolver::ResolveHostParameters parameters;
5515 parameters.dns_query_type = DnsQueryType::SRV;
5516
5517 ResolveHostResponseHelper response(resolver_->CreateRequest(
5518 HostPortPair("host", 108), NetLogWithSource(), parameters));
5519 EXPECT_THAT(response.result_error(), IsOk());
5520 EXPECT_FALSE(response.request()->GetAddressResults());
5521 EXPECT_FALSE(response.request()->GetTextResults());
5522
5523 // Expect ordered by priority, and random within a priority.
5524 base::Optional<std::vector<HostPortPair>> results =
5525 response.request()->GetHostnameResults();
5526 ASSERT_THAT(
5527 results,
5528 testing::Optional(testing::UnorderedElementsAre(
5529 HostPortPair("foo.com", 1223), HostPortPair("bar.com", 80),
5530 HostPortPair("google.com", 5), HostPortPair("chromium.org", 12345))));
5531 auto priority2 = std::vector<HostPortPair>(results.value().begin(),
5532 results.value().begin() + 2);
5533 EXPECT_THAT(priority2, testing::UnorderedElementsAre(
5534 HostPortPair("foo.com", 1223),
5535 HostPortPair("chromium.org", 12345)));
5536 auto priority5 = std::vector<HostPortPair>(results.value().begin() + 2,
5537 results.value().end());
5538 EXPECT_THAT(priority5,
5539 testing::UnorderedElementsAre(HostPortPair("bar.com", 80),
5540 HostPortPair("google.com", 5)));
5541}
5542
5543// 0-weight services are allowed. Ensure that we can handle such records,
5544// especially the case where all entries have weight 0.
5545TEST_F(HostResolverImplDnsTest, SrvQuery_ZeroWeight) {
5546 const TestServiceRecord kRecord1 = {5, 0, 80, "bar.com"};
5547 const TestServiceRecord kRecord2 = {5, 0, 5, "google.com"};
5548 MockDnsClientRuleList rules;
5549 rules.emplace_back("host", dns_protocol::kTypeSRV,
5550 MockDnsClientRule::Result(
5551 BuildTestDnsResponse("host", {kRecord1, kRecord2})),
5552 false /* delay */);
5553
5554 CreateResolver();
5555 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
5556
5557 HostResolver::ResolveHostParameters parameters;
5558 parameters.dns_query_type = DnsQueryType::SRV;
5559
5560 ResolveHostResponseHelper response(resolver_->CreateRequest(
5561 HostPortPair("host", 108), NetLogWithSource(), parameters));
5562 EXPECT_THAT(response.result_error(), IsOk());
5563 EXPECT_FALSE(response.request()->GetAddressResults());
5564 EXPECT_FALSE(response.request()->GetTextResults());
5565
5566 // Expect ordered by priority, and random within a priority.
5567 EXPECT_THAT(response.request()->GetHostnameResults(),
5568 testing::Optional(testing::UnorderedElementsAre(
5569 HostPortPair("bar.com", 80), HostPortPair("google.com", 5))));
5570}
5571
5572TEST_F(HostResolverImplDnsTest, SrvQuery_NonexistentDomain) {
5573 // Setup fallback to confirm it is not used for non-address results.
5574 set_allow_fallback_to_proctask(true);
5575 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
5576 proc_->SignalMultiple(1u);
5577
5578 MockDnsClientRuleList rules;
5579 rules.emplace_back("host", dns_protocol::kTypeSRV,
5580 MockDnsClientRule::Result(MockDnsClientRule::NODOMAIN),
5581 false /* delay */);
5582
5583 CreateResolver();
5584 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
5585
5586 HostResolver::ResolveHostParameters parameters;
5587 parameters.dns_query_type = DnsQueryType::SRV;
5588
5589 ResolveHostResponseHelper response(resolver_->CreateRequest(
5590 HostPortPair("host", 108), NetLogWithSource(), parameters));
5591 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
5592 EXPECT_FALSE(response.request()->GetAddressResults());
5593 EXPECT_FALSE(response.request()->GetTextResults());
5594 EXPECT_FALSE(response.request()->GetHostnameResults());
5595}
5596
5597TEST_F(HostResolverImplDnsTest, SrvQuery_Failure) {
5598 // Setup fallback to confirm it is not used for non-address results.
5599 set_allow_fallback_to_proctask(true);
5600 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
5601 proc_->SignalMultiple(1u);
5602
5603 MockDnsClientRuleList rules;
5604 rules.emplace_back("host", dns_protocol::kTypeSRV,
5605 MockDnsClientRule::Result(MockDnsClientRule::FAIL),
5606 false /* delay */);
5607
5608 CreateResolver();
5609 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
5610
5611 HostResolver::ResolveHostParameters parameters;
5612 parameters.dns_query_type = DnsQueryType::SRV;
5613
5614 ResolveHostResponseHelper response(resolver_->CreateRequest(
5615 HostPortPair("host", 108), NetLogWithSource(), parameters));
5616 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
5617 EXPECT_FALSE(response.request()->GetAddressResults());
5618 EXPECT_FALSE(response.request()->GetTextResults());
5619 EXPECT_FALSE(response.request()->GetHostnameResults());
5620}
5621
5622TEST_F(HostResolverImplDnsTest, SrvQuery_Timeout) {
5623 // Setup fallback to confirm it is not used for non-address results.
5624 set_allow_fallback_to_proctask(true);
5625 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
5626 proc_->SignalMultiple(1u);
5627
5628 MockDnsClientRuleList rules;
5629 rules.emplace_back("host", dns_protocol::kTypeSRV,
5630 MockDnsClientRule::Result(MockDnsClientRule::TIMEOUT),
5631 false /* delay */);
5632
5633 CreateResolver();
5634 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
5635
5636 HostResolver::ResolveHostParameters parameters;
5637 parameters.dns_query_type = DnsQueryType::SRV;
5638
5639 ResolveHostResponseHelper response(resolver_->CreateRequest(
5640 HostPortPair("host", 108), NetLogWithSource(), parameters));
5641 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_TIMED_OUT));
5642 EXPECT_FALSE(response.request()->GetAddressResults());
5643 EXPECT_FALSE(response.request()->GetTextResults());
5644 EXPECT_FALSE(response.request()->GetHostnameResults());
5645}
5646
5647TEST_F(HostResolverImplDnsTest, SrvQuery_Empty) {
5648 // Setup fallback to confirm it is not used for non-address results.
5649 set_allow_fallback_to_proctask(true);
5650 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
5651 proc_->SignalMultiple(1u);
5652
5653 MockDnsClientRuleList rules;
5654 rules.emplace_back("host", dns_protocol::kTypeSRV,
5655 MockDnsClientRule::Result(MockDnsClientRule::EMPTY),
5656 false /* delay */);
5657
5658 CreateResolver();
5659 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
5660
5661 HostResolver::ResolveHostParameters parameters;
5662 parameters.dns_query_type = DnsQueryType::SRV;
5663
5664 ResolveHostResponseHelper response(resolver_->CreateRequest(
5665 HostPortPair("host", 108), NetLogWithSource(), parameters));
5666 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
5667 EXPECT_FALSE(response.request()->GetAddressResults());
5668 EXPECT_FALSE(response.request()->GetTextResults());
5669 EXPECT_FALSE(response.request()->GetHostnameResults());
5670}
5671
5672TEST_F(HostResolverImplDnsTest, SrvQuery_Malformed) {
5673 // Setup fallback to confirm it is not used for non-address results.
5674 set_allow_fallback_to_proctask(true);
5675 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
5676 proc_->SignalMultiple(1u);
5677
5678 MockDnsClientRuleList rules;
5679 rules.emplace_back("host", dns_protocol::kTypeSRV,
5680 MockDnsClientRule::Result(MockDnsClientRule::MALFORMED),
5681 false /* delay */);
5682
5683 CreateResolver();
5684 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
5685
5686 HostResolver::ResolveHostParameters parameters;
5687 parameters.dns_query_type = DnsQueryType::SRV;
5688
5689 ResolveHostResponseHelper response(resolver_->CreateRequest(
5690 HostPortPair("host", 108), NetLogWithSource(), parameters));
5691 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE));
5692 EXPECT_FALSE(response.request()->GetAddressResults());
5693 EXPECT_FALSE(response.request()->GetTextResults());
5694 EXPECT_FALSE(response.request()->GetHostnameResults());
5695}
5696
5697TEST_F(HostResolverImplDnsTest, SrvQuery_MismatchedName) {
5698 std::vector<TestServiceRecord> srv_records = {{1, 2, 3, "foo.com"}};
5699 MockDnsClientRuleList rules;
5700 rules.emplace_back("host", dns_protocol::kTypeSRV,
5701 MockDnsClientRule::Result(BuildTestDnsResponse(
5702 "host", std::move(srv_records), "not.host")),
5703 false /* delay */);
5704
5705 CreateResolver();
5706 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
5707
5708 HostResolver::ResolveHostParameters parameters;
5709 parameters.dns_query_type = DnsQueryType::SRV;
5710
5711 ResolveHostResponseHelper response(resolver_->CreateRequest(
5712 HostPortPair("host", 108), NetLogWithSource(), parameters));
5713 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE));
5714 EXPECT_FALSE(response.request()->GetAddressResults());
5715 EXPECT_FALSE(response.request()->GetTextResults());
5716 EXPECT_FALSE(response.request()->GetHostnameResults());
5717}
5718
5719TEST_F(HostResolverImplDnsTest, SrvQuery_WrongType) {
5720 // Respond to a SRV query with an A response.
5721 MockDnsClientRuleList rules;
5722 rules.emplace_back("host", dns_protocol::kTypeSRV,
5723 MockDnsClientRule::Result(
5724 BuildTestDnsResponse("host", IPAddress(1, 2, 3, 4))),
5725 false /* delay */);
5726
5727 CreateResolver();
5728 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
5729
5730 HostResolver::ResolveHostParameters parameters;
5731 parameters.dns_query_type = DnsQueryType::SRV;
5732
5733 // Responses for the wrong type should be ignored.
5734 ResolveHostResponseHelper response(resolver_->CreateRequest(
5735 HostPortPair("ok", 108), NetLogWithSource(), parameters));
5736 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
5737 EXPECT_FALSE(response.request()->GetAddressResults());
5738 EXPECT_FALSE(response.request()->GetTextResults());
5739 EXPECT_FALSE(response.request()->GetHostnameResults());
5740}
5741
5742// Same as SrvQuery except we specify DNS HostResolverSource instead of relying
5743// on automatic determination. Expect same results since DNS should be what we
5744// automatically determine, but some slightly different logic paths are
5745// involved.
5746TEST_F(HostResolverImplDnsTest, SrvDnsQuery) {
5747 const TestServiceRecord kRecord1 = {2, 3, 1223, "foo.com"};
5748 const TestServiceRecord kRecord2 = {5, 10, 80, "bar.com"};
5749 const TestServiceRecord kRecord3 = {5, 1, 5, "google.com"};
5750 const TestServiceRecord kRecord4 = {2, 100, 12345, "chromium.org"};
5751 MockDnsClientRuleList rules;
5752 rules.emplace_back("host", dns_protocol::kTypeSRV,
5753 MockDnsClientRule::Result(BuildTestDnsResponse(
5754 "host", {kRecord1, kRecord2, kRecord3, kRecord4})),
5755 false /* delay */);
5756
5757 CreateResolver();
5758 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
5759
5760 HostResolver::ResolveHostParameters parameters;
5761 parameters.source = HostResolverSource::DNS;
5762 parameters.dns_query_type = DnsQueryType::SRV;
5763
5764 ResolveHostResponseHelper response(resolver_->CreateRequest(
5765 HostPortPair("host", 108), NetLogWithSource(), parameters));
5766 EXPECT_THAT(response.result_error(), IsOk());
5767 EXPECT_FALSE(response.request()->GetAddressResults());
5768 EXPECT_FALSE(response.request()->GetTextResults());
5769
5770 // Expect ordered by priority, and random within a priority.
5771 base::Optional<std::vector<HostPortPair>> results =
5772 response.request()->GetHostnameResults();
5773 ASSERT_THAT(
5774 results,
5775 testing::Optional(testing::UnorderedElementsAre(
5776 HostPortPair("foo.com", 1223), HostPortPair("bar.com", 80),
5777 HostPortPair("google.com", 5), HostPortPair("chromium.org", 12345))));
5778 auto priority2 = std::vector<HostPortPair>(results.value().begin(),
5779 results.value().begin() + 2);
5780 EXPECT_THAT(priority2, testing::UnorderedElementsAre(
5781 HostPortPair("foo.com", 1223),
5782 HostPortPair("chromium.org", 12345)));
5783 auto priority5 = std::vector<HostPortPair>(results.value().begin() + 2,
5784 results.value().end());
5785 EXPECT_THAT(priority5,
5786 testing::UnorderedElementsAre(HostPortPair("bar.com", 80),
5787 HostPortPair("google.com", 5)));
5788}
5789
[email protected]259aefa2009-08-20 22:45:005790} // namespace net