blob: 3fff6e1428a4fb2add307138076c68b24555deb5 [file] [log] [blame]
[email protected]a33347c2012-01-09 18:27:011// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]212d1492008-09-05 19:38:542// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Eric Orth960e7062019-03-08 18:43:545#include "net/dns/host_resolver_manager.h"
[email protected]212d1492008-09-05 19:38:546
Eric Orth828bd3ae2018-12-12 17:30:367#include <algorithm>
Eric Roman21b39232019-06-28 21:28:218#include <limits>
[email protected]471822ca2009-01-29 11:32:269#include <string>
jsbellcea42a52015-11-30 23:50:2510#include <tuple>
Eric Orth70992982018-07-24 00:25:0011#include <utility>
olli.raula9cdf9d72015-12-10 14:24:2912#include <vector>
[email protected]471822ca2009-01-29 11:32:2613
Weza03bae02018-07-13 17:17:3314#include "base/auto_reset.h"
[email protected]aa22b242011-11-16 18:58:2915#include "base/bind.h"
16#include "base/bind_helpers.h"
skyostil4891b25b2015-06-11 11:43:4517#include "base/location.h"
Avi Drissman13fc8932015-12-20 04:40:4618#include "base/macros.h"
[email protected]3b63f8f42011-03-28 01:54:1519#include "base/memory/ref_counted.h"
[email protected]daae1322013-09-05 18:26:5020#include "base/run_loop.h"
skyostil4891b25b2015-06-11 11:43:4521#include "base/single_thread_task_runner.h"
tripta.gdda72022017-06-19 05:16:2322#include "base/stl_util.h"
[email protected]be528af2013-06-11 07:39:4823#include "base/strings/string_util.h"
24#include "base/strings/stringprintf.h"
[email protected]189163e2011-05-11 01:48:5425#include "base/synchronization/condition_variable.h"
26#include "base/synchronization/lock.h"
Eric Roman21b39232019-06-28 21:28:2127#include "base/task/thread_pool/thread_pool.h"
Eric Orth70992982018-07-24 00:25:0028#include "base/test/bind_test_util.h"
Eric Orth026776a2019-01-18 00:13:2829#include "base/test/simple_test_clock.h"
Eric Orth9a037562018-07-03 21:24:3830#include "base/test/test_mock_time_task_runner.h"
[email protected]57a48d32012-03-03 00:04:5531#include "base/test/test_timeouts.h"
Francois Doraya2d01ba2017-09-25 19:17:4032#include "base/threading/thread_restrictions.h"
gabf767595f2016-05-11 18:50:3533#include "base/threading/thread_task_runner_handle.h"
[email protected]66e96c42013-06-28 15:20:3134#include "base/time/time.h"
Eric Orth026776a2019-01-18 00:13:2835#include "base/timer/mock_timer.h"
Miriam Gershenson48857a352018-03-22 21:14:0336#include "base/values.h"
jdoerriedfede5ad2019-02-11 13:06:5737#include "build/build_config.h"
[email protected]ecfa71c2008-09-09 13:28:3638#include "net/base/address_list.h"
Eric Orth026776a2019-01-18 00:13:2839#include "net/base/host_port_pair.h"
martijna23c8962016-03-04 18:18:5140#include "net/base/ip_address.h"
Eric Orth026776a2019-01-18 00:13:2841#include "net/base/ip_endpoint.h"
mgershaf9a9232017-04-13 20:19:0342#include "net/base/mock_network_change_notifier.h"
[email protected]471822ca2009-01-29 11:32:2643#include "net/base/net_errors.h"
[email protected]78eac2a2012-03-14 19:09:2744#include "net/dns/dns_client.h"
Eric Orthc1eb1292018-10-09 22:07:0745#include "net/dns/dns_config.h"
[email protected]78eac2a2012-03-14 19:09:2746#include "net/dns/dns_test_util.h"
Eric Orth192e3bb2018-11-14 19:30:3247#include "net/dns/dns_util.h"
[email protected]f2cb3cf2013-03-21 01:40:5348#include "net/dns/mock_host_resolver.h"
Eric Orth9871aafa2018-10-02 19:59:1849#include "net/dns/mock_mdns_client.h"
50#include "net/dns/mock_mdns_socket_factory.h"
mikecirone8b85c432016-09-08 19:11:0051#include "net/log/net_log_event_type.h"
52#include "net/log/net_log_source_type.h"
mikecironef22f9812016-10-04 03:40:1953#include "net/log/net_log_with_source.h"
sergeyub8cdc212015-05-14 18:50:3754#include "net/log/test_net_log.h"
Eric Roman79cc7552019-07-19 02:17:5455#include "net/log/test_net_log_util.h"
robpercival214763f2016-07-01 23:27:0156#include "net/test/gtest_util.h"
Bence Béky98447b12018-05-08 03:14:0157#include "net/test/test_with_scoped_task_environment.h"
Eric Orth6f1c5172019-04-16 17:08:2758#include "net/url_request/url_request_context.h"
59#include "net/url_request/url_request_test_util.h"
robpercival214763f2016-07-01 23:27:0160#include "testing/gmock/include/gmock/gmock.h"
[email protected]ecfa71c2008-09-09 13:28:3661#include "testing/gtest/include/gtest/gtest.h"
[email protected]212d1492008-09-05 19:38:5462
Eric Orth026776a2019-01-18 00:13:2863#if BUILDFLAG(ENABLE_MDNS)
64#include "net/dns/mdns_client_impl.h"
65#endif // BUILDFLAG(ENABLE_MDNS)
66
robpercival214763f2016-07-01 23:27:0167using net::test::IsError;
68using net::test::IsOk;
Eric Orth9871aafa2018-10-02 19:59:1869using ::testing::_;
70using ::testing::Between;
71using ::testing::ByMove;
Rob Percival94f21ad2017-11-14 10:20:2472using ::testing::NotNull;
Eric Orth9871aafa2018-10-02 19:59:1873using ::testing::Return;
robpercival214763f2016-07-01 23:27:0174
[email protected]259aefa2009-08-20 22:45:0075namespace net {
[email protected]68ad3ee2010-01-30 03:45:3976
[email protected]38b50d92012-04-19 21:07:5277namespace {
[email protected]112bd462009-12-10 07:23:4078
[email protected]78eac2a2012-03-14 19:09:2779const size_t kMaxJobs = 10u;
80const size_t kMaxRetryAttempts = 4u;
[email protected]68ad3ee2010-01-30 03:45:3981
Eric Orth59066222019-03-07 23:52:2782ProcTaskParams DefaultParams(HostResolverProc* resolver_proc) {
83 return ProcTaskParams(resolver_proc, kMaxRetryAttempts);
[email protected]0f292de02012-02-01 22:28:2084}
85
[email protected]38b50d92012-04-19 21:07:5286// A HostResolverProc that pushes each host mapped into a list and allows
87// waiting for a specific number of requests. Unlike RuleBasedHostResolverProc
[email protected]1ee9afa12013-04-16 14:18:0688// it never calls SystemHostResolverCall. By default resolves all hostnames to
[email protected]38b50d92012-04-19 21:07:5289// "127.0.0.1". After AddRule(), it resolves only names explicitly specified.
90class MockHostResolverProc : public HostResolverProc {
[email protected]57a48d32012-03-03 00:04:5591 public:
[email protected]38b50d92012-04-19 21:07:5292 struct ResolveKey {
Eric Orth322af3e42018-08-20 18:12:5993 ResolveKey(const std::string& hostname,
94 AddressFamily address_family,
95 HostResolverFlags flags)
96 : hostname(hostname), address_family(address_family), flags(flags) {}
[email protected]38b50d92012-04-19 21:07:5297 bool operator<(const ResolveKey& other) const {
Eric Orth322af3e42018-08-20 18:12:5998 return std::tie(address_family, hostname, flags) <
99 std::tie(other.address_family, other.hostname, other.flags);
[email protected]38b50d92012-04-19 21:07:52100 }
[email protected]137af622010-02-05 02:14:35101 std::string hostname;
102 AddressFamily address_family;
Eric Orth322af3e42018-08-20 18:12:59103 HostResolverFlags flags;
[email protected]137af622010-02-05 02:14:35104 };
105
[email protected]38b50d92012-04-19 21:07:52106 typedef std::vector<ResolveKey> CaptureList;
[email protected]137af622010-02-05 02:14:35107
[email protected]38b50d92012-04-19 21:07:52108 MockHostResolverProc()
Raul Tambre94493c652019-03-11 17:18:35109 : HostResolverProc(nullptr),
[email protected]57a48d32012-03-03 00:04:55110 num_requests_waiting_(0),
111 num_slots_available_(0),
112 requests_waiting_(&lock_),
Eric Orth960e7062019-03-08 18:43:54113 slots_available_(&lock_) {}
[email protected]57a48d32012-03-03 00:04:55114
115 // Waits until |count| calls to |Resolve| are blocked. Returns false when
116 // timed out.
117 bool WaitFor(unsigned count) {
118 base::AutoLock lock(lock_);
119 base::Time start_time = base::Time::Now();
120 while (num_requests_waiting_ < count) {
121 requests_waiting_.TimedWait(TestTimeouts::action_timeout());
122 if (base::Time::Now() > start_time + TestTimeouts::action_timeout())
123 return false;
124 }
125 return true;
126 }
127
128 // Signals |count| waiting calls to |Resolve|. First come first served.
129 void SignalMultiple(unsigned count) {
130 base::AutoLock lock(lock_);
131 num_slots_available_ += count;
132 slots_available_.Broadcast();
133 }
134
135 // Signals all waiting calls to |Resolve|. Beware of races.
136 void SignalAll() {
137 base::AutoLock lock(lock_);
[email protected]38b50d92012-04-19 21:07:52138 num_slots_available_ = num_requests_waiting_;
[email protected]57a48d32012-03-03 00:04:55139 slots_available_.Broadcast();
140 }
141
Eric Orth322af3e42018-08-20 18:12:59142 void AddRule(const std::string& hostname,
143 AddressFamily family,
144 const AddressList& result,
145 HostResolverFlags flags = 0) {
[email protected]38b50d92012-04-19 21:07:52146 base::AutoLock lock(lock_);
Eric Orth322af3e42018-08-20 18:12:59147 rules_[ResolveKey(hostname, family, flags)] = result;
[email protected]57a48d32012-03-03 00:04:55148 }
149
Eric Orth322af3e42018-08-20 18:12:59150 void AddRule(const std::string& hostname,
151 AddressFamily family,
152 const std::string& ip_list,
153 HostResolverFlags flags = 0,
154 const std::string& canonical_name = "") {
[email protected]38b50d92012-04-19 21:07:52155 AddressList result;
Eric Orth322af3e42018-08-20 18:12:59156 int rv = ParseAddressList(ip_list, canonical_name, &result);
[email protected]38b50d92012-04-19 21:07:52157 DCHECK_EQ(OK, rv);
Eric Orth322af3e42018-08-20 18:12:59158 AddRule(hostname, family, result, flags);
[email protected]38b50d92012-04-19 21:07:52159 }
[email protected]57a48d32012-03-03 00:04:55160
[email protected]38b50d92012-04-19 21:07:52161 void AddRuleForAllFamilies(const std::string& hostname,
Eric Orth322af3e42018-08-20 18:12:59162 const std::string& ip_list,
163 HostResolverFlags flags = 0,
164 const std::string& canonical_name = "") {
[email protected]38b50d92012-04-19 21:07:52165 AddressList result;
Eric Orth322af3e42018-08-20 18:12:59166 int rv = ParseAddressList(ip_list, canonical_name, &result);
[email protected]38b50d92012-04-19 21:07:52167 DCHECK_EQ(OK, rv);
Eric Orth322af3e42018-08-20 18:12:59168 AddRule(hostname, ADDRESS_FAMILY_UNSPECIFIED, result, flags);
169 AddRule(hostname, ADDRESS_FAMILY_IPV4, result, flags);
170 AddRule(hostname, ADDRESS_FAMILY_IPV6, result, flags);
[email protected]38b50d92012-04-19 21:07:52171 }
[email protected]137af622010-02-05 02:14:35172
dchengb03027d2014-10-21 12:00:20173 int Resolve(const std::string& hostname,
174 AddressFamily address_family,
175 HostResolverFlags host_resolver_flags,
176 AddressList* addrlist,
177 int* os_error) override {
[email protected]38b50d92012-04-19 21:07:52178 base::AutoLock lock(lock_);
Eric Orth322af3e42018-08-20 18:12:59179 capture_list_.push_back(
180 ResolveKey(hostname, address_family, host_resolver_flags));
[email protected]38b50d92012-04-19 21:07:52181 ++num_requests_waiting_;
182 requests_waiting_.Broadcast();
Francois Doraya2d01ba2017-09-25 19:17:40183 {
184 base::ScopedAllowBaseSyncPrimitivesForTesting
185 scoped_allow_base_sync_primitives;
186 while (!num_slots_available_)
187 slots_available_.Wait();
188 }
[email protected]38b50d92012-04-19 21:07:52189 DCHECK_GT(num_requests_waiting_, 0u);
190 --num_slots_available_;
191 --num_requests_waiting_;
192 if (rules_.empty()) {
[email protected]007b3f82013-04-09 08:46:45193 int rv = ParseAddressList("127.0.0.1", std::string(), addrlist);
[email protected]38b50d92012-04-19 21:07:52194 DCHECK_EQ(OK, rv);
195 return OK;
196 }
Eric Orth60931742018-11-05 23:40:57197 // Ignore HOST_RESOLVER_SYSTEM_ONLY, since it should have no impact on
198 // whether a rule matches. It should only affect cache lookups.
199 ResolveKey key(hostname, address_family,
200 host_resolver_flags & ~HOST_RESOLVER_SYSTEM_ONLY);
[email protected]38b50d92012-04-19 21:07:52201 if (rules_.count(key) == 0)
202 return ERR_NAME_NOT_RESOLVED;
203 *addrlist = rules_[key];
204 return OK;
[email protected]137af622010-02-05 02:14:35205 }
[email protected]38b50d92012-04-19 21:07:52206
207 CaptureList GetCaptureList() const {
208 CaptureList copy;
209 {
210 base::AutoLock lock(lock_);
211 copy = capture_list_;
212 }
213 return copy;
214 }
215
216 bool HasBlockedRequests() const {
217 base::AutoLock lock(lock_);
218 return num_requests_waiting_ > num_slots_available_;
219 }
220
[email protected]a9813302012-04-28 09:29:28221 protected:
Chris Watkins68b15032017-12-01 03:07:13222 ~MockHostResolverProc() override = default;
[email protected]38b50d92012-04-19 21:07:52223
[email protected]a9813302012-04-28 09:29:28224 private:
[email protected]38b50d92012-04-19 21:07:52225 mutable base::Lock lock_;
226 std::map<ResolveKey, AddressList> rules_;
227 CaptureList capture_list_;
228 unsigned num_requests_waiting_;
229 unsigned num_slots_available_;
230 base::ConditionVariable requests_waiting_;
231 base::ConditionVariable slots_available_;
232
233 DISALLOW_COPY_AND_ASSIGN(MockHostResolverProc);
234};
235
Eric Orth70992982018-07-24 00:25:00236class ResolveHostResponseHelper {
237 public:
238 using Callback =
239 base::OnceCallback<void(CompletionOnceCallback completion_callback,
240 int error)>;
241
242 ResolveHostResponseHelper() {}
243 explicit ResolveHostResponseHelper(
Eric Orth5233c3a2019-04-08 17:01:14244 std::unique_ptr<HostResolverManager::CancellableRequest> request)
Eric Orth70992982018-07-24 00:25:00245 : request_(std::move(request)) {
246 result_error_ = request_->Start(base::BindOnce(
247 &ResolveHostResponseHelper::OnComplete, base::Unretained(this)));
248 }
249 ResolveHostResponseHelper(
Eric Orth5233c3a2019-04-08 17:01:14250 std::unique_ptr<HostResolverManager::CancellableRequest> request,
Eric Orth70992982018-07-24 00:25:00251 Callback custom_callback)
252 : request_(std::move(request)) {
253 result_error_ = request_->Start(
254 base::BindOnce(std::move(custom_callback),
255 base::BindOnce(&ResolveHostResponseHelper::OnComplete,
256 base::Unretained(this))));
257 }
258
259 bool complete() const { return result_error_ != ERR_IO_PENDING; }
260 int result_error() {
261 WaitForCompletion();
262 return result_error_;
263 }
264
Eric Orth5233c3a2019-04-08 17:01:14265 HostResolverManager::CancellableRequest* request() { return request_.get(); }
Eric Orth70992982018-07-24 00:25:00266
267 void CancelRequest() {
268 DCHECK(request_);
269 DCHECK(!complete());
270
271 request_ = nullptr;
272 }
273
274 void OnComplete(int error) {
275 DCHECK(!complete());
276 result_error_ = error;
277
278 run_loop_.Quit();
279 }
280
281 private:
282 void WaitForCompletion() {
283 DCHECK(request_);
284 if (complete()) {
285 return;
286 }
287 run_loop_.Run();
288 DCHECK(complete());
289 }
290
Eric Orth5233c3a2019-04-08 17:01:14291 std::unique_ptr<HostResolverManager::CancellableRequest> request_;
Eric Orth70992982018-07-24 00:25:00292 int result_error_ = ERR_IO_PENDING;
293 base::RunLoop run_loop_;
294
295 DISALLOW_COPY_AND_ASSIGN(ResolveHostResponseHelper);
296};
297
[email protected]189163e2011-05-11 01:48:54298// Using LookupAttemptHostResolverProc simulate very long lookups, and control
299// which attempt resolves the host.
300class LookupAttemptHostResolverProc : public HostResolverProc {
301 public:
302 LookupAttemptHostResolverProc(HostResolverProc* previous,
303 int attempt_number_to_resolve,
304 int total_attempts)
305 : HostResolverProc(previous),
306 attempt_number_to_resolve_(attempt_number_to_resolve),
307 current_attempt_number_(0),
308 total_attempts_(total_attempts),
309 total_attempts_resolved_(0),
310 resolved_attempt_number_(0),
Eric Orth9a037562018-07-03 21:24:38311 num_attempts_waiting_(0),
312 all_done_(&lock_),
313 blocked_attempt_signal_(&lock_) {}
[email protected]189163e2011-05-11 01:48:54314
315 // Test harness will wait for all attempts to finish before checking the
316 // results.
Eric Orth9a037562018-07-03 21:24:38317 void WaitForAllAttemptsToFinish() {
318 base::AutoLock auto_lock(lock_);
319 while (total_attempts_resolved_ != total_attempts_) {
320 all_done_.Wait();
321 }
322 }
323
324 void WaitForNAttemptsToBeBlocked(int n) {
325 base::AutoLock auto_lock(lock_);
326 while (num_attempts_waiting_ < n) {
327 blocked_attempt_signal_.Wait();
[email protected]189163e2011-05-11 01:48:54328 }
329 }
330
331 // All attempts will wait for an attempt to resolve the host.
332 void WaitForAnAttemptToComplete() {
[email protected]189163e2011-05-11 01:48:54333 {
334 base::AutoLock auto_lock(lock_);
Francois Doraya2d01ba2017-09-25 19:17:40335 base::ScopedAllowBaseSyncPrimitivesForTesting
336 scoped_allow_base_sync_primitives;
Eric Orth9a037562018-07-03 21:24:38337 while (resolved_attempt_number_ == 0)
338 all_done_.Wait();
[email protected]189163e2011-05-11 01:48:54339 }
340 all_done_.Broadcast(); // Tell all waiting attempts to proceed.
341 }
342
343 // Returns the number of attempts that have finished the Resolve() method.
Eric Roman21b39232019-06-28 21:28:21344 int GetTotalAttemptsResolved() {
345 base::AutoLock auto_lock(lock_);
346 return total_attempts_resolved_;
347 }
[email protected]189163e2011-05-11 01:48:54348
Eric Roman21b39232019-06-28 21:28:21349 // Sets the resolved attempt number and unblocks waiting
350 // attempts.
351 void SetResolvedAttemptNumber(int n) {
352 base::AutoLock auto_lock(lock_);
353 EXPECT_EQ(0, resolved_attempt_number_);
354 resolved_attempt_number_ = n;
355 all_done_.Broadcast();
356 }
Eric Orth9a037562018-07-03 21:24:38357
[email protected]189163e2011-05-11 01:48:54358 // HostResolverProc methods.
dchengb03027d2014-10-21 12:00:20359 int Resolve(const std::string& host,
360 AddressFamily address_family,
361 HostResolverFlags host_resolver_flags,
362 AddressList* addrlist,
363 int* os_error) override {
[email protected]189163e2011-05-11 01:48:54364 bool wait_for_right_attempt_to_complete = true;
365 {
366 base::AutoLock auto_lock(lock_);
367 ++current_attempt_number_;
Eric Orth9a037562018-07-03 21:24:38368 ++num_attempts_waiting_;
[email protected]189163e2011-05-11 01:48:54369 if (current_attempt_number_ == attempt_number_to_resolve_) {
370 resolved_attempt_number_ = current_attempt_number_;
371 wait_for_right_attempt_to_complete = false;
372 }
373 }
374
Eric Orth9a037562018-07-03 21:24:38375 blocked_attempt_signal_.Broadcast();
376
[email protected]189163e2011-05-11 01:48:54377 if (wait_for_right_attempt_to_complete)
378 // Wait for the attempt_number_to_resolve_ attempt to resolve.
379 WaitForAnAttemptToComplete();
380
381 int result = ResolveUsingPrevious(host, address_family, host_resolver_flags,
382 addrlist, os_error);
383
384 {
385 base::AutoLock auto_lock(lock_);
386 ++total_attempts_resolved_;
Eric Orth9a037562018-07-03 21:24:38387 --num_attempts_waiting_;
[email protected]189163e2011-05-11 01:48:54388 }
389
390 all_done_.Broadcast(); // Tell all attempts to proceed.
391
392 // Since any negative number is considered a network error, with -1 having
393 // special meaning (ERR_IO_PENDING). We could return the attempt that has
394 // resolved the host as a negative number. For example, if attempt number 3
395 // resolves the host, then this method returns -4.
396 if (result == OK)
397 return -1 - resolved_attempt_number_;
398 else
399 return result;
400 }
401
[email protected]a9813302012-04-28 09:29:28402 protected:
Chris Watkins68b15032017-12-01 03:07:13403 ~LookupAttemptHostResolverProc() override = default;
[email protected]189163e2011-05-11 01:48:54404
[email protected]a9813302012-04-28 09:29:28405 private:
[email protected]189163e2011-05-11 01:48:54406 int attempt_number_to_resolve_;
407 int current_attempt_number_; // Incremented whenever Resolve is called.
408 int total_attempts_;
409 int total_attempts_resolved_;
410 int resolved_attempt_number_;
Eric Orth9a037562018-07-03 21:24:38411 int num_attempts_waiting_;
[email protected]189163e2011-05-11 01:48:54412
413 // All attempts wait for right attempt to be resolve.
414 base::Lock lock_;
415 base::ConditionVariable all_done_;
Eric Orth9a037562018-07-03 21:24:38416 base::ConditionVariable blocked_attempt_signal_;
[email protected]189163e2011-05-11 01:48:54417};
418
Eric Orth960e7062019-03-08 18:43:54419// TestHostResolverManager's sole purpose is to mock the IPv6 reachability test.
cbentzel1906f872015-06-05 16:25:25420// By default, this pretends that IPv6 is globally reachable.
421// This class is necessary so unit tests run the same on dual-stack machines as
422// well as IPv4 only machines.
Eric Orth960e7062019-03-08 18:43:54423class TestHostResolverManager : public HostResolverManager {
cbentzel1906f872015-06-05 16:25:25424 public:
Eric Orth4d635c12019-04-24 22:53:04425 TestHostResolverManager(const HostResolver::ManagerOptions& options,
426 NetLog* net_log)
Eric Orth960e7062019-03-08 18:43:54427 : TestHostResolverManager(options, net_log, true) {}
cbentzel1906f872015-06-05 16:25:25428
dalykc27699a2019-07-29 20:53:29429 TestHostResolverManager(const HostResolver::ManagerOptions& options,
430 NetLog* net_log,
431 bool ipv6_reachable)
432 : HostResolverManager(options, net_log),
Eric Orth960e7062019-03-08 18:43:54433 ipv6_reachable_(ipv6_reachable) {}
cbentzel1906f872015-06-05 16:25:25434
Eric Orth960e7062019-03-08 18:43:54435 ~TestHostResolverManager() override = default;
cbentzel1906f872015-06-05 16:25:25436
437 private:
438 const bool ipv6_reachable_;
439
mgershaf9a9232017-04-13 20:19:03440 bool IsGloballyReachable(const IPAddress& dest,
441 const NetLogWithSource& net_log) override {
cbentzel1906f872015-06-05 16:25:25442 return ipv6_reachable_;
443 }
444};
445
Matt Menkec35d1632018-11-29 12:43:49446bool HasAddress(const IPAddress& search_address, const AddressList& addresses) {
tfarina9ed7f8c52016-02-19 17:50:18447 for (const auto& address : addresses) {
Matt Menkec35d1632018-11-29 12:43:49448 if (search_address == address.address())
tfarina9ed7f8c52016-02-19 17:50:18449 return true;
450 }
451 return false;
452}
453
454void TestBothLoopbackIPs(const std::string& host) {
tfarina9ed7f8c52016-02-19 17:50:18455 AddressList addresses;
Matt Menkec35d1632018-11-29 12:43:49456 EXPECT_TRUE(ResolveLocalHostname(host, &addresses));
tfarina9ed7f8c52016-02-19 17:50:18457 EXPECT_EQ(2u, addresses.size());
Matt Menkec35d1632018-11-29 12:43:49458 EXPECT_TRUE(HasAddress(IPAddress::IPv4Localhost(), addresses));
459 EXPECT_TRUE(HasAddress(IPAddress::IPv6Localhost(), addresses));
tfarina9ed7f8c52016-02-19 17:50:18460}
461
462void TestIPv6LoopbackOnly(const std::string& host) {
tfarina9ed7f8c52016-02-19 17:50:18463 AddressList addresses;
Matt Menkec35d1632018-11-29 12:43:49464 EXPECT_TRUE(ResolveLocalHostname(host, &addresses));
tfarina9ed7f8c52016-02-19 17:50:18465 EXPECT_EQ(1u, addresses.size());
Matt Menkec35d1632018-11-29 12:43:49466 EXPECT_TRUE(HasAddress(IPAddress::IPv6Localhost(), addresses));
tfarina9ed7f8c52016-02-19 17:50:18467}
468
[email protected]38b50d92012-04-19 21:07:52469} // namespace
[email protected]8a00f00a2009-06-12 00:49:38470
Gabriel Charette694c3c332019-08-19 14:53:05471class HostResolverManagerTest : public TestWithTaskEnvironment {
[email protected]471822ca2009-01-29 11:32:26472 public:
[email protected]38b50d92012-04-19 21:07:52473 static const int kDefaultPort = 80;
474
Eric Orth960e7062019-03-08 18:43:54475 HostResolverManagerTest() : proc_(new MockHostResolverProc()) {}
[email protected]471822ca2009-01-29 11:32:26476
Eric Orth607b6d82019-05-08 16:43:32477 void CreateResolver(bool check_ipv6_on_wifi = true) {
Eric Orth70992982018-07-24 00:25:00478 CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:32479 true /* ipv6_reachable */,
480 check_ipv6_on_wifi);
[email protected]daae1322013-09-05 18:26:50481 }
482
Eric Orth37b18192019-04-22 19:09:28483 void DestroyResolver() {
484 if (!resolver_)
485 return;
486
487 if (host_cache_)
488 resolver_->RemoveHostCacheInvalidator(host_cache_->invalidator());
489 resolver_ = nullptr;
490 }
491
Eric Orth960e7062019-03-08 18:43:54492 // This HostResolverManager will only allow 1 outstanding resolve at a time
493 // and perform no retries.
Eric Orth607b6d82019-05-08 16:43:32494 void CreateSerialResolver(bool check_ipv6_on_wifi = true) {
Eric Orth59066222019-03-07 23:52:27495 ProcTaskParams params = DefaultParams(proc_.get());
[email protected]daae1322013-09-05 18:26:50496 params.max_retry_attempts = 0u;
Eric Orth607b6d82019-05-08 16:43:32497 CreateResolverWithLimitsAndParams(1u, params, true /* ipv6_reachable */,
498 check_ipv6_on_wifi);
[email protected]daae1322013-09-05 18:26:50499 }
500
[email protected]471822ca2009-01-29 11:32:26501 protected:
[email protected]daae1322013-09-05 18:26:50502 // testing::Test implementation:
Eric Orth6f1c5172019-04-16 17:08:27503 void SetUp() override {
Eric Orth37b18192019-04-22 19:09:28504 host_cache_ = HostCache::CreateDefaultCache();
Eric Orth6f1c5172019-04-16 17:08:27505 CreateResolver();
506 request_context_ = std::make_unique<TestURLRequestContext>();
507 }
[email protected]70c04ab2013-08-22 16:05:12508
dcheng67be2b1f2014-10-27 21:47:29509 void TearDown() override {
Eric Orth37b18192019-04-22 19:09:28510 if (resolver_) {
[email protected]daae1322013-09-05 18:26:50511 EXPECT_EQ(0u, resolver_->num_running_dispatcher_jobs_for_tests());
Eric Orth37b18192019-04-22 19:09:28512 if (host_cache_)
513 resolver_->RemoveHostCacheInvalidator(host_cache_->invalidator());
514 }
[email protected]daae1322013-09-05 18:26:50515 EXPECT_FALSE(proc_->HasBlockedRequests());
516 }
517
Eric Orth4e55b362019-05-07 22:00:03518 void CreateResolverWithLimitsAndParams(size_t max_concurrent_resolves,
519 const ProcTaskParams& params,
Eric Orth607b6d82019-05-08 16:43:32520 bool ipv6_reachable,
521 bool check_ipv6_on_wifi) {
Eric Orth4d635c12019-04-24 22:53:04522 HostResolver::ManagerOptions options = DefaultOptions();
[email protected]106ccd2c2014-06-17 09:21:00523 options.max_concurrent_resolves = max_concurrent_resolves;
Eric Orth607b6d82019-05-08 16:43:32524 options.check_ipv6_on_wifi = check_ipv6_on_wifi;
Eric Orth4e55b362019-05-07 22:00:03525
526 CreateResolverWithOptionsAndParams(std::move(options), params,
527 ipv6_reachable);
528 }
529
530 virtual HostResolver::ManagerOptions DefaultOptions() {
531 HostResolver::ManagerOptions options;
532 options.max_concurrent_resolves = kMaxJobs;
533 options.max_system_retry_attempts = kMaxRetryAttempts;
534 return options;
535 }
536
537 virtual void CreateResolverWithOptionsAndParams(
538 HostResolver::ManagerOptions options,
539 const ProcTaskParams& params,
540 bool ipv6_reachable) {
541 // Use HostResolverManagerDnsTest if enabling DNS client.
dalykc27699a2019-07-29 20:53:29542 DCHECK(!options.insecure_dns_client_enabled);
Eric Orth4e55b362019-05-07 22:00:03543
544 DestroyResolver();
545
546 resolver_ = std::make_unique<TestHostResolverManager>(
547 options, nullptr /* net_log */, ipv6_reachable);
[email protected]106ccd2c2014-06-17 09:21:00548 resolver_->set_proc_params_for_test(params);
Eric Orth37b18192019-04-22 19:09:28549
550 if (host_cache_)
551 resolver_->AddHostCacheInvalidator(host_cache_->invalidator());
[email protected]471822ca2009-01-29 11:32:26552 }
[email protected]aa22b242011-11-16 18:58:29553
[email protected]38b50d92012-04-19 21:07:52554 // Friendship is not inherited, so use proxies to access those.
[email protected]daae1322013-09-05 18:26:50555 size_t num_running_dispatcher_jobs() const {
[email protected]38b50d92012-04-19 21:07:52556 DCHECK(resolver_.get());
[email protected]daae1322013-09-05 18:26:50557 return resolver_->num_running_dispatcher_jobs_for_tests();
[email protected]38b50d92012-04-19 21:07:52558 }
559
Eric Orth60931742018-11-05 23:40:57560 void set_allow_fallback_to_proctask(bool allow_fallback_to_proctask) {
[email protected]16c2bd72013-06-28 01:19:22561 DCHECK(resolver_.get());
Eric Orth60931742018-11-05 23:40:57562 resolver_->allow_fallback_to_proctask_ = allow_fallback_to_proctask;
[email protected]16c2bd72013-06-28 01:19:22563 }
564
dalykc27699a2019-07-29 20:53:29565 static unsigned maximum_insecure_dns_task_failures() {
566 return HostResolverManager::kMaximumInsecureDnsTaskFailures;
[email protected]daae1322013-09-05 18:26:50567 }
568
tfarina42834112016-09-22 13:38:20569 bool IsIPv6Reachable(const NetLogWithSource& net_log) {
sergeyub8cdc212015-05-14 18:50:37570 return resolver_->IsIPv6Reachable(net_log);
571 }
572
dalyke966a1832019-06-05 20:53:13573 void PopulateCache(HostCache::Key& key, IPEndPoint endpoint) {
574 resolver_->CacheResult(host_cache_.get(), key,
575 HostCache::Entry(OK, AddressList(endpoint),
576 HostCache::Entry::SOURCE_UNKNOWN),
577 base::TimeDelta::FromSeconds(1));
578 }
579
dalyk48b20a992019-02-25 16:10:26580 const std::pair<const HostCache::Key, HostCache::Entry>* GetCacheHit(
581 const HostCache::Key& key) {
Eric Orth37b18192019-04-22 19:09:28582 DCHECK(host_cache_);
583 return host_cache_->LookupStale(key, base::TimeTicks(), nullptr,
584 false /* ignore_secure */);
Rob Percival94f21ad2017-11-14 10:20:24585 }
586
juliatuttle9fb7aeb2016-06-06 20:16:33587 void MakeCacheStale() {
Eric Orth37b18192019-04-22 19:09:28588 DCHECK(host_cache_);
589 host_cache_->Invalidate();
juliatuttle9fb7aeb2016-06-06 20:16:33590 }
591
Eric Orth70992982018-07-24 00:25:00592 IPEndPoint CreateExpected(const std::string& ip_literal, uint16_t port) {
593 IPAddress ip;
594 bool result = ip.AssignFromIPLiteral(ip_literal);
595 DCHECK(result);
596 return IPEndPoint(ip, port);
597 }
598
[email protected]38b50d92012-04-19 21:07:52599 scoped_refptr<MockHostResolverProc> proc_;
Eric Orth960e7062019-03-08 18:43:54600 std::unique_ptr<HostResolverManager> resolver_;
Eric Orth6f1c5172019-04-16 17:08:27601 std::unique_ptr<URLRequestContext> request_context_;
Eric Orth117e1992019-04-17 00:24:15602 std::unique_ptr<HostCache> host_cache_;
[email protected]471822ca2009-01-29 11:32:26603};
604
Eric Orth960e7062019-03-08 18:43:54605TEST_F(HostResolverManagerTest, AsynchronousLookup) {
[email protected]38b50d92012-04-19 21:07:52606 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42");
607 proc_->SignalMultiple(1u);
[email protected]471822ca2009-01-29 11:32:26608
Eric Orth70992982018-07-24 00:25:00609 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:27610 HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:15611 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:00612
613 EXPECT_THAT(response.result_error(), IsOk());
614 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
615 testing::ElementsAre(CreateExpected("192.168.1.42", 80)));
Eric Ortheb332862019-01-26 00:52:38616 EXPECT_FALSE(response.request()->GetStaleInfo());
Eric Orth70992982018-07-24 00:25:00617
618 EXPECT_EQ("just.testing", proc_->GetCaptureList()[0].hostname);
Eric Orth26fa08e2019-02-22 01:28:37619
dalyk48b20a992019-02-25 16:10:26620 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result =
621 GetCacheHit(HostCache::Key("just.testing", DnsQueryType::UNSPECIFIED,
622 0 /* host_resolver_flags */,
623 HostResolverSource::ANY));
624 EXPECT_TRUE(cache_result);
Eric Orth70992982018-07-24 00:25:00625}
626
Eric Orth6f1c5172019-04-16 17:08:27627TEST_F(HostResolverManagerTest, JobsClearedOnCompletion) {
628 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42");
629 proc_->SignalMultiple(1u);
630
631 ResolveHostResponseHelper response(resolver_->CreateRequest(
632 HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:15633 request_context_.get(), host_cache_.get()));
Eric Orth6f1c5172019-04-16 17:08:27634 EXPECT_EQ(1u, resolver_->num_jobs_for_testing());
635
636 EXPECT_THAT(response.result_error(), IsOk());
637 EXPECT_EQ(0u, resolver_->num_jobs_for_testing());
638}
639
640TEST_F(HostResolverManagerTest, JobsClearedOnCompletion_MultipleRequests) {
641 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42");
642 proc_->SignalMultiple(1u);
643
644 ResolveHostResponseHelper response1(resolver_->CreateRequest(
645 HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:15646 request_context_.get(), host_cache_.get()));
Eric Orth6f1c5172019-04-16 17:08:27647 ResolveHostResponseHelper response2(resolver_->CreateRequest(
648 HostPortPair("just.testing", 85), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:15649 request_context_.get(), host_cache_.get()));
Eric Orth6f1c5172019-04-16 17:08:27650 EXPECT_EQ(1u, resolver_->num_jobs_for_testing());
651
652 EXPECT_THAT(response1.result_error(), IsOk());
653 EXPECT_THAT(response2.result_error(), IsOk());
654 EXPECT_EQ(0u, resolver_->num_jobs_for_testing());
655}
656
657TEST_F(HostResolverManagerTest, JobsClearedOnCompletion_Failure) {
658 proc_->AddRuleForAllFamilies(std::string(),
659 "0.0.0.0"); // Default to failures.
660 proc_->SignalMultiple(1u);
661
662 ResolveHostResponseHelper response(resolver_->CreateRequest(
663 HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:15664 request_context_.get(), host_cache_.get()));
Eric Orth6f1c5172019-04-16 17:08:27665 EXPECT_EQ(1u, resolver_->num_jobs_for_testing());
666
667 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
668 EXPECT_EQ(0u, resolver_->num_jobs_for_testing());
669}
670
671TEST_F(HostResolverManagerTest, JobsClearedOnCompletion_Abort) {
672 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42");
673
674 ResolveHostResponseHelper response(resolver_->CreateRequest(
675 HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:15676 request_context_.get(), host_cache_.get()));
Eric Orth6f1c5172019-04-16 17:08:27677 EXPECT_EQ(1u, resolver_->num_jobs_for_testing());
678
679 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
680 proc_->SignalMultiple(1u);
681
682 EXPECT_THAT(response.result_error(), IsError(ERR_NETWORK_CHANGED));
683 EXPECT_EQ(0u, resolver_->num_jobs_for_testing());
684}
685
Eric Orth960e7062019-03-08 18:43:54686TEST_F(HostResolverManagerTest, DnsQueryType) {
Eric Orth00fe5a62018-08-15 22:20:00687 proc_->AddRule("host", ADDRESS_FAMILY_IPV4, "192.168.1.20");
688 proc_->AddRule("host", ADDRESS_FAMILY_IPV6, "::5");
689
690 HostResolver::ResolveHostParameters parameters;
691
Eric Orth192e3bb2018-11-14 19:30:32692 parameters.dns_query_type = DnsQueryType::A;
Eric Orth117e1992019-04-17 00:24:15693 ResolveHostResponseHelper v4_response(resolver_->CreateRequest(
694 HostPortPair("host", 80), NetLogWithSource(), parameters,
695 request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:00696
Eric Orth192e3bb2018-11-14 19:30:32697 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth117e1992019-04-17 00:24:15698 ResolveHostResponseHelper v6_response(resolver_->CreateRequest(
699 HostPortPair("host", 80), NetLogWithSource(), parameters,
700 request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:00701
702 proc_->SignalMultiple(2u);
703
704 EXPECT_THAT(v4_response.result_error(), IsOk());
705 EXPECT_THAT(v4_response.request()->GetAddressResults().value().endpoints(),
706 testing::ElementsAre(CreateExpected("192.168.1.20", 80)));
707
708 EXPECT_THAT(v6_response.result_error(), IsOk());
709 EXPECT_THAT(v6_response.request()->GetAddressResults().value().endpoints(),
710 testing::ElementsAre(CreateExpected("::5", 80)));
711}
712
Eric Orth960e7062019-03-08 18:43:54713TEST_F(HostResolverManagerTest, LocalhostIPV4IPV6Lookup) {
Eric Orth00fe5a62018-08-15 22:20:00714 HostResolver::ResolveHostParameters parameters;
715
Eric Orth192e3bb2018-11-14 19:30:32716 parameters.dns_query_type = DnsQueryType::A;
Eric Orth00fe5a62018-08-15 22:20:00717 ResolveHostResponseHelper v6_v4_response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:27718 HostPortPair("localhost6", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:15719 request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:00720 EXPECT_THAT(v6_v4_response.result_error(), IsOk());
721 EXPECT_THAT(v6_v4_response.request()->GetAddressResults().value().endpoints(),
722 testing::IsEmpty());
723
Eric Orth192e3bb2018-11-14 19:30:32724 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth00fe5a62018-08-15 22:20:00725 ResolveHostResponseHelper v6_v6_response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:27726 HostPortPair("localhost6", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:15727 request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:00728 EXPECT_THAT(v6_v6_response.result_error(), IsOk());
729 EXPECT_THAT(v6_v6_response.request()->GetAddressResults().value().endpoints(),
730 testing::ElementsAre(CreateExpected("::1", 80)));
731
732 ResolveHostResponseHelper v6_unsp_response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:27733 HostPortPair("localhost6", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:15734 request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:00735 EXPECT_THAT(v6_unsp_response.result_error(), IsOk());
736 EXPECT_THAT(
737 v6_unsp_response.request()->GetAddressResults().value().endpoints(),
738 testing::ElementsAre(CreateExpected("::1", 80)));
739
Eric Orth192e3bb2018-11-14 19:30:32740 parameters.dns_query_type = DnsQueryType::A;
Eric Orth00fe5a62018-08-15 22:20:00741 ResolveHostResponseHelper v4_v4_response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:27742 HostPortPair("localhost", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:15743 request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:00744 EXPECT_THAT(v4_v4_response.result_error(), IsOk());
745 EXPECT_THAT(v4_v4_response.request()->GetAddressResults().value().endpoints(),
746 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
747
Eric Orth192e3bb2018-11-14 19:30:32748 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth00fe5a62018-08-15 22:20:00749 ResolveHostResponseHelper v4_v6_response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:27750 HostPortPair("localhost", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:15751 request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:00752 EXPECT_THAT(v4_v6_response.result_error(), IsOk());
753 EXPECT_THAT(v4_v6_response.request()->GetAddressResults().value().endpoints(),
754 testing::ElementsAre(CreateExpected("::1", 80)));
755
756 ResolveHostResponseHelper v4_unsp_response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:27757 HostPortPair("localhost", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:15758 request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:00759 EXPECT_THAT(v4_unsp_response.result_error(), IsOk());
760 EXPECT_THAT(
761 v4_unsp_response.request()->GetAddressResults().value().endpoints(),
762 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
763 CreateExpected("::1", 80)));
764}
765
Eric Orth960e7062019-03-08 18:43:54766TEST_F(HostResolverManagerTest, ResolveIPLiteralWithHostResolverSystemOnly) {
eroman368a1002016-03-04 21:52:55767 const char kIpLiteral[] = "178.78.32.1";
768 // Add a mapping to tell if the resolver proc was called (if it was called,
769 // then the result will be the remapped value. Otherwise it will be the IP
770 // literal).
771 proc_->AddRuleForAllFamilies(kIpLiteral, "183.45.32.1");
772
Eric Orthdc35748e2018-08-23 22:41:48773 HostResolver::ResolveHostParameters parameters;
774 parameters.source = HostResolverSource::SYSTEM;
Eric Orth117e1992019-04-17 00:24:15775 ResolveHostResponseHelper response(resolver_->CreateRequest(
776 HostPortPair(kIpLiteral, 80), NetLogWithSource(), parameters,
777 request_context_.get(), host_cache_.get()));
Eric Orthdc35748e2018-08-23 22:41:48778
779 // IP literal resolution is expected to take precedence over source, so the
780 // result is expected to be the input IP, not the result IP from the proc rule
781 EXPECT_THAT(response.result_error(), IsOk());
782 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
783 testing::ElementsAre(CreateExpected(kIpLiteral, 80)));
Eric Ortheb332862019-01-26 00:52:38784 EXPECT_FALSE(response.request()->GetStaleInfo());
Eric Orthdc35748e2018-08-23 22:41:48785}
786
Eric Orth960e7062019-03-08 18:43:54787TEST_F(HostResolverManagerTest, EmptyListMeansNameNotResolved) {
[email protected]49b70b222013-05-07 21:24:23788 proc_->AddRuleForAllFamilies("just.testing", "");
789 proc_->SignalMultiple(1u);
790
Eric Orth70992982018-07-24 00:25:00791 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:27792 HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:15793 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:00794
795 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
796 EXPECT_FALSE(response.request()->GetAddressResults());
Eric Ortheb332862019-01-26 00:52:38797 EXPECT_FALSE(response.request()->GetStaleInfo());
Eric Orth70992982018-07-24 00:25:00798
799 EXPECT_EQ("just.testing", proc_->GetCaptureList()[0].hostname);
800}
801
Eric Orth960e7062019-03-08 18:43:54802TEST_F(HostResolverManagerTest, FailedAsynchronousLookup) {
[email protected]007b3f82013-04-09 08:46:45803 proc_->AddRuleForAllFamilies(std::string(),
804 "0.0.0.0"); // Default to failures.
[email protected]38b50d92012-04-19 21:07:52805 proc_->SignalMultiple(1u);
[email protected]a33347c2012-01-09 18:27:01806
Eric Orth70992982018-07-24 00:25:00807 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:27808 HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:15809 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:00810 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
811 EXPECT_FALSE(response.request()->GetAddressResults());
Eric Ortheb332862019-01-26 00:52:38812 EXPECT_FALSE(response.request()->GetStaleInfo());
Eric Orth70992982018-07-24 00:25:00813
814 EXPECT_EQ("just.testing", proc_->GetCaptureList()[0].hostname);
815
816 // Also test that the error is not cached.
dalyk48b20a992019-02-25 16:10:26817 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result =
818 GetCacheHit(HostCache::Key("just.testing", DnsQueryType::UNSPECIFIED,
819 0 /* host_resolver_flags */,
820 HostResolverSource::ANY));
821 EXPECT_FALSE(cache_result);
Eric Orth70992982018-07-24 00:25:00822}
823
Eric Orth960e7062019-03-08 18:43:54824TEST_F(HostResolverManagerTest, AbortedAsynchronousLookup) {
Eric Orth70992982018-07-24 00:25:00825 ResolveHostResponseHelper response0(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:27826 HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:15827 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:00828 ASSERT_FALSE(response0.complete());
829 ASSERT_TRUE(proc_->WaitFor(1u));
830
831 // Resolver is destroyed while job is running on WorkerPool.
Eric Orth37b18192019-04-22 19:09:28832 DestroyResolver();
Eric Orth70992982018-07-24 00:25:00833
834 proc_->SignalAll();
835
836 // To ensure there was no spurious callback, complete with a new resolver.
837 CreateResolver();
838 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:27839 HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:15840 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:00841
842 proc_->SignalMultiple(2u);
843
844 EXPECT_THAT(response1.result_error(), IsOk());
845
846 // This request was canceled.
847 EXPECT_FALSE(response0.complete());
848}
849
Eric Orth960e7062019-03-08 18:43:54850TEST_F(HostResolverManagerTest, NumericIPv4Address) {
Eric Orth70992982018-07-24 00:25:00851 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:27852 HostPortPair("127.1.2.3", 5555), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:15853 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:00854
855 EXPECT_THAT(response.result_error(), IsOk());
856 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
857 testing::ElementsAre(CreateExpected("127.1.2.3", 5555)));
858}
859
Eric Orth960e7062019-03-08 18:43:54860TEST_F(HostResolverManagerTest, NumericIPv6Address) {
[email protected]dbcff96272009-05-07 00:23:44861 // Resolve a plain IPv6 address. Don't worry about [brackets], because
862 // the caller should have removed them.
Eric Orth70992982018-07-24 00:25:00863 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:27864 HostPortPair("2001:db8::1", 5555), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:15865 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:00866
867 EXPECT_THAT(response.result_error(), IsOk());
868 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
869 testing::ElementsAre(CreateExpected("2001:db8::1", 5555)));
870}
871
Eric Orth960e7062019-03-08 18:43:54872TEST_F(HostResolverManagerTest, EmptyHost) {
Eric Orth70992982018-07-24 00:25:00873 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:27874 HostPortPair(std::string(), 5555), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:15875 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:00876
877 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
878 EXPECT_FALSE(response.request()->GetAddressResults());
879}
880
Eric Orth960e7062019-03-08 18:43:54881TEST_F(HostResolverManagerTest, EmptyDotsHost) {
[email protected]e806cd72013-05-17 02:08:43882 for (int i = 0; i < 16; ++i) {
Eric Orth6f1c5172019-04-16 17:08:27883 ResolveHostResponseHelper response(resolver_->CreateRequest(
884 HostPortPair(std::string(i, '.'), 5555), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:15885 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:00886
887 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
888 EXPECT_FALSE(response.request()->GetAddressResults());
889 }
890}
891
Eric Orth960e7062019-03-08 18:43:54892TEST_F(HostResolverManagerTest, LongHost) {
Eric Orth6f1c5172019-04-16 17:08:27893 ResolveHostResponseHelper response(resolver_->CreateRequest(
894 HostPortPair(std::string(4097, 'a'), 5555), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:15895 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:00896
897 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
898 EXPECT_FALSE(response.request()->GetAddressResults());
899}
900
Eric Orth960e7062019-03-08 18:43:54901TEST_F(HostResolverManagerTest, DeDupeRequests) {
[email protected]b59ff372009-07-15 22:04:32902 // Start 5 requests, duplicating hosts "a" and "b". Since the resolver_proc is
[email protected]8a00f00a2009-06-12 00:49:38903 // blocked, these should all pile up until we signal it.
Eric Orth70992982018-07-24 00:25:00904 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:15905 responses.emplace_back(
906 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
907 HostPortPair("a", 80), NetLogWithSource(), base::nullopt,
908 request_context_.get(), host_cache_.get())));
909 responses.emplace_back(
910 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
911 HostPortPair("b", 80), NetLogWithSource(), base::nullopt,
912 request_context_.get(), host_cache_.get())));
913 responses.emplace_back(
914 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
915 HostPortPair("b", 81), NetLogWithSource(), base::nullopt,
916 request_context_.get(), host_cache_.get())));
917 responses.emplace_back(
918 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
919 HostPortPair("a", 82), NetLogWithSource(), base::nullopt,
920 request_context_.get(), host_cache_.get())));
921 responses.emplace_back(
922 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
923 HostPortPair("b", 83), NetLogWithSource(), base::nullopt,
924 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:00925
926 for (auto& response : responses) {
927 ASSERT_FALSE(response->complete());
928 }
929
930 proc_->SignalMultiple(2u); // One for "a", one for "b".
931
932 for (auto& response : responses) {
933 EXPECT_THAT(response->result_error(), IsOk());
934 }
935}
936
Eric Orth960e7062019-03-08 18:43:54937TEST_F(HostResolverManagerTest, CancelMultipleRequests) {
Eric Orth70992982018-07-24 00:25:00938 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:15939 responses.emplace_back(
940 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
941 HostPortPair("a", 80), NetLogWithSource(), base::nullopt,
942 request_context_.get(), host_cache_.get())));
943 responses.emplace_back(
944 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
945 HostPortPair("b", 80), NetLogWithSource(), base::nullopt,
946 request_context_.get(), host_cache_.get())));
947 responses.emplace_back(
948 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
949 HostPortPair("b", 81), NetLogWithSource(), base::nullopt,
950 request_context_.get(), host_cache_.get())));
951 responses.emplace_back(
952 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
953 HostPortPair("a", 82), NetLogWithSource(), base::nullopt,
954 request_context_.get(), host_cache_.get())));
955 responses.emplace_back(
956 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
957 HostPortPair("b", 83), NetLogWithSource(), base::nullopt,
958 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:00959
960 for (auto& response : responses) {
961 ASSERT_FALSE(response->complete());
962 }
963
964 // Cancel everything except request for requests[3] ("a", 82).
965 responses[0]->CancelRequest();
966 responses[1]->CancelRequest();
967 responses[2]->CancelRequest();
968 responses[4]->CancelRequest();
969
970 proc_->SignalMultiple(2u); // One for "a", one for "b".
971
972 EXPECT_THAT(responses[3]->result_error(), IsOk());
973
974 EXPECT_FALSE(responses[0]->complete());
975 EXPECT_FALSE(responses[1]->complete());
976 EXPECT_FALSE(responses[2]->complete());
977 EXPECT_FALSE(responses[4]->complete());
978}
979
Eric Orth960e7062019-03-08 18:43:54980TEST_F(HostResolverManagerTest, CanceledRequestsReleaseJobSlots) {
Eric Orth70992982018-07-24 00:25:00981 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
982
983 // Fill up the dispatcher and queue.
984 for (unsigned i = 0; i < kMaxJobs + 1; ++i) {
985 std::string hostname = "a_";
986 hostname[1] = 'a' + i;
987
Eric Orth117e1992019-04-17 00:24:15988 responses.emplace_back(
989 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
990 HostPortPair(hostname, 80), NetLogWithSource(), base::nullopt,
991 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:00992 ASSERT_FALSE(responses.back()->complete());
993
Eric Orth117e1992019-04-17 00:24:15994 responses.emplace_back(
995 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
996 HostPortPair(hostname, 81), NetLogWithSource(), base::nullopt,
997 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:00998 ASSERT_FALSE(responses.back()->complete());
999 }
1000
1001 ASSERT_TRUE(proc_->WaitFor(kMaxJobs));
1002
1003 // Cancel all but last two.
1004 for (unsigned i = 0; i < responses.size() - 2; ++i) {
1005 responses[i]->CancelRequest();
1006 }
1007
1008 ASSERT_TRUE(proc_->WaitFor(kMaxJobs + 1));
1009
1010 proc_->SignalAll();
1011
1012 size_t num_requests = responses.size();
1013 EXPECT_THAT(responses[num_requests - 1]->result_error(), IsOk());
1014 EXPECT_THAT(responses[num_requests - 2]->result_error(), IsOk());
1015 for (unsigned i = 0; i < num_requests - 2; ++i) {
1016 EXPECT_FALSE(responses[i]->complete());
1017 }
1018}
1019
Eric Orth960e7062019-03-08 18:43:541020TEST_F(HostResolverManagerTest, CancelWithinCallback) {
Eric Orth70992982018-07-24 00:25:001021 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
1022 auto custom_callback = base::BindLambdaForTesting(
1023 [&](CompletionOnceCallback completion_callback, int error) {
1024 for (auto& response : responses) {
1025 // Cancelling request is required to complete first, so that it can
1026 // attempt to cancel the others. This test assumes all jobs are
1027 // completed in order.
1028 DCHECK(!response->complete());
1029
1030 response->CancelRequest();
1031 }
1032 std::move(completion_callback).Run(error);
1033 });
1034
1035 ResolveHostResponseHelper cancelling_response(
Eric Orth00fe5a62018-08-15 22:20:001036 resolver_->CreateRequest(HostPortPair("a", 80), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:151037 base::nullopt, request_context_.get(),
1038 host_cache_.get()),
Eric Orth70992982018-07-24 00:25:001039 std::move(custom_callback));
1040
Eric Orth117e1992019-04-17 00:24:151041 responses.emplace_back(
1042 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1043 HostPortPair("a", 81), NetLogWithSource(), base::nullopt,
1044 request_context_.get(), host_cache_.get())));
1045 responses.emplace_back(
1046 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1047 HostPortPair("a", 82), NetLogWithSource(), base::nullopt,
1048 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:001049
1050 proc_->SignalMultiple(2u); // One for "a". One for "finalrequest".
1051
1052 EXPECT_THAT(cancelling_response.result_error(), IsOk());
1053
1054 ResolveHostResponseHelper final_response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:271055 HostPortPair("finalrequest", 70), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:151056 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:001057 EXPECT_THAT(final_response.result_error(), IsOk());
1058
1059 for (auto& response : responses) {
1060 EXPECT_FALSE(response->complete());
1061 }
1062}
1063
Eric Orth960e7062019-03-08 18:43:541064TEST_F(HostResolverManagerTest, DeleteWithinCallback) {
Eric Orth70992982018-07-24 00:25:001065 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
1066 auto custom_callback = base::BindLambdaForTesting(
1067 [&](CompletionOnceCallback completion_callback, int error) {
1068 for (auto& response : responses) {
1069 // Deleting request is required to be first, so the other requests
1070 // will still be running to be deleted. This test assumes that the
1071 // Jobs will be Aborted in order and the requests in order within the
1072 // jobs.
1073 DCHECK(!response->complete());
1074 }
1075
Eric Orth37b18192019-04-22 19:09:281076 DestroyResolver();
Eric Orth70992982018-07-24 00:25:001077 std::move(completion_callback).Run(error);
1078 });
1079
1080 ResolveHostResponseHelper deleting_response(
Eric Orth00fe5a62018-08-15 22:20:001081 resolver_->CreateRequest(HostPortPair("a", 80), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:151082 base::nullopt, request_context_.get(),
1083 host_cache_.get()),
Eric Orth70992982018-07-24 00:25:001084 std::move(custom_callback));
1085
1086 // Start additional requests to be cancelled as part of the first's deletion.
1087 // Assumes all requests for a job are handled in order so that the deleting
1088 // request will run first and cancel the rest.
Eric Orth117e1992019-04-17 00:24:151089 responses.emplace_back(
1090 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1091 HostPortPair("a", 81), NetLogWithSource(), base::nullopt,
1092 request_context_.get(), host_cache_.get())));
1093 responses.emplace_back(
1094 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1095 HostPortPair("a", 82), NetLogWithSource(), base::nullopt,
1096 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:001097
1098 proc_->SignalMultiple(3u);
1099
1100 EXPECT_THAT(deleting_response.result_error(), IsOk());
1101
1102 base::RunLoop().RunUntilIdle();
1103 for (auto& response : responses) {
1104 EXPECT_FALSE(response->complete());
1105 }
1106}
1107
Francois Doray4a0a6f12019-08-19 15:25:221108TEST_F(HostResolverManagerTest, DeleteWithinAbortedCallback) {
Eric Orth70992982018-07-24 00:25:001109 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
1110 ResolveHostResponseHelper::Callback custom_callback =
1111 base::BindLambdaForTesting(
1112 [&](CompletionOnceCallback completion_callback, int error) {
1113 for (auto& response : responses) {
1114 // Deleting request is required to be first, so the other requests
1115 // will still be running to be deleted. This test assumes that the
1116 // Jobs will be Aborted in order and the requests in order within
1117 // the jobs.
1118 DCHECK(!response->complete());
1119 }
Eric Orth37b18192019-04-22 19:09:281120 DestroyResolver();
Eric Orth70992982018-07-24 00:25:001121 std::move(completion_callback).Run(error);
1122 });
1123
1124 ResolveHostResponseHelper deleting_response(
Eric Orth00fe5a62018-08-15 22:20:001125 resolver_->CreateRequest(HostPortPair("a", 80), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:151126 base::nullopt, request_context_.get(),
1127 host_cache_.get()),
Eric Orth70992982018-07-24 00:25:001128 std::move(custom_callback));
1129
Eric Orth117e1992019-04-17 00:24:151130 responses.emplace_back(
1131 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1132 HostPortPair("a", 81), NetLogWithSource(), base::nullopt,
1133 request_context_.get(), host_cache_.get())));
1134 responses.emplace_back(
1135 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1136 HostPortPair("b", 82), NetLogWithSource(), base::nullopt,
1137 request_context_.get(), host_cache_.get())));
1138 responses.emplace_back(
1139 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1140 HostPortPair("b", 83), NetLogWithSource(), base::nullopt,
1141 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:001142
1143 // Wait for all calls to queue up, trigger abort via IP address change, then
1144 // signal all the queued requests to let them all try to finish.
1145 EXPECT_TRUE(proc_->WaitFor(2u));
Paul Jensenf47bbab2018-09-14 16:34:041146 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
Eric Orth70992982018-07-24 00:25:001147 proc_->SignalAll();
1148
1149 EXPECT_THAT(deleting_response.result_error(), IsError(ERR_NETWORK_CHANGED));
1150 base::RunLoop().RunUntilIdle();
1151 for (auto& response : responses) {
1152 EXPECT_FALSE(response->complete());
1153 }
1154}
1155
Eric Orth960e7062019-03-08 18:43:541156TEST_F(HostResolverManagerTest, StartWithinCallback) {
Eric Orth70992982018-07-24 00:25:001157 std::unique_ptr<ResolveHostResponseHelper> new_response;
1158 auto custom_callback = base::BindLambdaForTesting(
1159 [&](CompletionOnceCallback completion_callback, int error) {
1160 new_response = std::make_unique<ResolveHostResponseHelper>(
Eric Orth117e1992019-04-17 00:24:151161 resolver_->CreateRequest(
1162 HostPortPair("new", 70), NetLogWithSource(), base::nullopt,
1163 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:001164 std::move(completion_callback).Run(error);
1165 });
1166
1167 ResolveHostResponseHelper starting_response(
Eric Orth00fe5a62018-08-15 22:20:001168 resolver_->CreateRequest(HostPortPair("a", 80), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:151169 base::nullopt, request_context_.get(),
1170 host_cache_.get()),
Eric Orth70992982018-07-24 00:25:001171 std::move(custom_callback));
1172
1173 proc_->SignalMultiple(2u); // One for "a". One for "new".
1174
1175 EXPECT_THAT(starting_response.result_error(), IsOk());
1176 EXPECT_THAT(new_response->result_error(), IsOk());
1177}
1178
Eric Orth3bd9e512019-03-29 15:33:351179TEST_F(HostResolverManagerTest, StartWithinEvictionCallback) {
1180 CreateSerialResolver();
1181 resolver_->SetMaxQueuedJobsForTesting(2);
1182
1183 std::unique_ptr<ResolveHostResponseHelper> new_response;
1184 auto custom_callback = base::BindLambdaForTesting(
1185 [&](CompletionOnceCallback completion_callback, int error) {
1186 new_response = std::make_unique<ResolveHostResponseHelper>(
Eric Orth117e1992019-04-17 00:24:151187 resolver_->CreateRequest(
1188 HostPortPair("new", 70), NetLogWithSource(), base::nullopt,
1189 request_context_.get(), host_cache_.get()));
Eric Orth3bd9e512019-03-29 15:33:351190 std::move(completion_callback).Run(error);
1191 });
1192
Eric Orth117e1992019-04-17 00:24:151193 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
1194 HostPortPair("initial", 80), NetLogWithSource(), base::nullopt,
1195 request_context_.get(), host_cache_.get()));
Eric Orth3bd9e512019-03-29 15:33:351196 ResolveHostResponseHelper evictee1_response(
1197 resolver_->CreateRequest(HostPortPair("evictee1", 80), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:151198 base::nullopt, request_context_.get(),
1199 host_cache_.get()),
Eric Orth3bd9e512019-03-29 15:33:351200 std::move(custom_callback));
Eric Orth117e1992019-04-17 00:24:151201 ResolveHostResponseHelper evictee2_response(resolver_->CreateRequest(
1202 HostPortPair("evictee2", 80), NetLogWithSource(), base::nullopt,
1203 request_context_.get(), host_cache_.get()));
Eric Orth3bd9e512019-03-29 15:33:351204
1205 // Now one running request ("initial") and two queued requests ("evictee1" and
1206 // "evictee2"). Any further requests will cause evictions.
Eric Orth117e1992019-04-17 00:24:151207 ResolveHostResponseHelper evictor_response(resolver_->CreateRequest(
1208 HostPortPair("evictor", 80), NetLogWithSource(), base::nullopt,
1209 request_context_.get(), host_cache_.get()));
Eric Orth3bd9e512019-03-29 15:33:351210 EXPECT_THAT(evictee1_response.result_error(),
1211 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
1212
1213 // "new" should evict "evictee2"
1214 EXPECT_THAT(evictee2_response.result_error(),
1215 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
1216
1217 proc_->SignalMultiple(3u);
1218
1219 EXPECT_THAT(initial_response.result_error(), IsOk());
1220 EXPECT_THAT(evictor_response.result_error(), IsOk());
1221 EXPECT_THAT(new_response->result_error(), IsOk());
1222}
1223
1224// Test where we start a new request within an eviction callback that itself
1225// evicts the first evictor.
1226TEST_F(HostResolverManagerTest, StartWithinEvictionCallback_DoubleEviction) {
1227 CreateSerialResolver();
1228 resolver_->SetMaxQueuedJobsForTesting(1);
1229
1230 std::unique_ptr<ResolveHostResponseHelper> new_response;
1231 auto custom_callback = base::BindLambdaForTesting(
1232 [&](CompletionOnceCallback completion_callback, int error) {
1233 new_response = std::make_unique<ResolveHostResponseHelper>(
Eric Orth117e1992019-04-17 00:24:151234 resolver_->CreateRequest(
1235 HostPortPair("new", 70), NetLogWithSource(), base::nullopt,
1236 request_context_.get(), host_cache_.get()));
Eric Orth3bd9e512019-03-29 15:33:351237 std::move(completion_callback).Run(error);
1238 });
1239
Eric Orth117e1992019-04-17 00:24:151240 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
1241 HostPortPair("initial", 80), NetLogWithSource(), base::nullopt,
1242 request_context_.get(), host_cache_.get()));
Eric Orth3bd9e512019-03-29 15:33:351243 ResolveHostResponseHelper evictee_response(
1244 resolver_->CreateRequest(HostPortPair("evictee", 80), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:151245 base::nullopt, request_context_.get(),
1246 host_cache_.get()),
Eric Orth3bd9e512019-03-29 15:33:351247 std::move(custom_callback));
1248
1249 // Now one running request ("initial") and one queued requests ("evictee").
1250 // Any further requests will cause evictions.
Eric Orth117e1992019-04-17 00:24:151251 ResolveHostResponseHelper evictor_response(resolver_->CreateRequest(
1252 HostPortPair("evictor", 80), NetLogWithSource(), base::nullopt,
1253 request_context_.get(), host_cache_.get()));
Eric Orth3bd9e512019-03-29 15:33:351254 EXPECT_THAT(evictee_response.result_error(),
1255 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
1256
1257 // "new" should evict "evictor"
1258 EXPECT_THAT(evictor_response.result_error(),
1259 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
1260
1261 proc_->SignalMultiple(2u);
1262
1263 EXPECT_THAT(initial_response.result_error(), IsOk());
1264 EXPECT_THAT(new_response->result_error(), IsOk());
1265}
1266
1267TEST_F(HostResolverManagerTest, StartWithinEvictionCallback_SameRequest) {
1268 CreateSerialResolver();
1269 resolver_->SetMaxQueuedJobsForTesting(2);
1270
1271 std::unique_ptr<ResolveHostResponseHelper> new_response;
1272 auto custom_callback = base::BindLambdaForTesting(
1273 [&](CompletionOnceCallback completion_callback, int error) {
1274 new_response = std::make_unique<ResolveHostResponseHelper>(
Eric Orth117e1992019-04-17 00:24:151275 resolver_->CreateRequest(
1276 HostPortPair("evictor", 70), NetLogWithSource(), base::nullopt,
1277 request_context_.get(), host_cache_.get()));
Eric Orth3bd9e512019-03-29 15:33:351278 std::move(completion_callback).Run(error);
1279 });
1280
Eric Orth117e1992019-04-17 00:24:151281 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
1282 HostPortPair("initial", 80), NetLogWithSource(), base::nullopt,
1283 request_context_.get(), host_cache_.get()));
Eric Orth3bd9e512019-03-29 15:33:351284 ResolveHostResponseHelper evictee_response(
1285 resolver_->CreateRequest(HostPortPair("evictee", 80), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:151286 base::nullopt, request_context_.get(),
1287 host_cache_.get()),
Eric Orth3bd9e512019-03-29 15:33:351288 std::move(custom_callback));
1289 ResolveHostResponseHelper additional_response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:271290 HostPortPair("additional", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:151291 request_context_.get(), host_cache_.get()));
Eric Orth3bd9e512019-03-29 15:33:351292
1293 // Now one running request ("initial") and two queued requests ("evictee" and
1294 // "additional"). Any further requests will cause evictions.
Eric Orth117e1992019-04-17 00:24:151295 ResolveHostResponseHelper evictor_response(resolver_->CreateRequest(
1296 HostPortPair("evictor", 80), NetLogWithSource(), base::nullopt,
1297 request_context_.get(), host_cache_.get()));
Eric Orth3bd9e512019-03-29 15:33:351298 EXPECT_THAT(evictee_response.result_error(),
1299 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
1300
1301 // Second "evictor" should be joined with the first and not evict "additional"
1302
1303 // Only 3 proc requests because both "evictor" requests are combined.
1304 proc_->SignalMultiple(3u);
1305
1306 EXPECT_THAT(initial_response.result_error(), IsOk());
1307 EXPECT_THAT(additional_response.result_error(), IsOk());
1308 EXPECT_THAT(evictor_response.result_error(), IsOk());
1309 EXPECT_THAT(new_response->result_error(), IsOk());
1310}
1311
Eric Orth960e7062019-03-08 18:43:541312TEST_F(HostResolverManagerTest, BypassCache) {
Eric Orthdc35748e2018-08-23 22:41:481313 proc_->SignalMultiple(2u);
1314
Eric Orth117e1992019-04-17 00:24:151315 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
1316 HostPortPair("a", 80), NetLogWithSource(), base::nullopt,
1317 request_context_.get(), host_cache_.get()));
Eric Orthdc35748e2018-08-23 22:41:481318 EXPECT_THAT(initial_response.result_error(), IsOk());
1319 EXPECT_EQ(1u, proc_->GetCaptureList().size());
1320
Eric Orth117e1992019-04-17 00:24:151321 ResolveHostResponseHelper cached_response(resolver_->CreateRequest(
1322 HostPortPair("a", 80), NetLogWithSource(), base::nullopt,
1323 request_context_.get(), host_cache_.get()));
Eric Orthdc35748e2018-08-23 22:41:481324 EXPECT_THAT(cached_response.result_error(), IsOk());
1325 // Expect no increase to calls to |proc_| because result was cached.
1326 EXPECT_EQ(1u, proc_->GetCaptureList().size());
1327
1328 HostResolver::ResolveHostParameters parameters;
Eric Ortheb332862019-01-26 00:52:381329 parameters.cache_usage =
1330 HostResolver::ResolveHostParameters::CacheUsage::DISALLOWED;
Eric Orth117e1992019-04-17 00:24:151331 ResolveHostResponseHelper cache_bypassed_response(resolver_->CreateRequest(
1332 HostPortPair("a", 80), NetLogWithSource(), parameters,
1333 request_context_.get(), host_cache_.get()));
Eric Orthdc35748e2018-08-23 22:41:481334 EXPECT_THAT(cache_bypassed_response.result_error(), IsOk());
1335 // Expect call to |proc_| because cache was bypassed.
1336 EXPECT_EQ(2u, proc_->GetCaptureList().size());
1337}
1338
Paul Jensenf47bbab2018-09-14 16:34:041339// Test that IP address changes flush the cache but initial DNS config reads
Eric Orth70992982018-07-24 00:25:001340// do not.
Eric Orth960e7062019-03-08 18:43:541341TEST_F(HostResolverManagerTest, FlushCacheOnIPAddressChange) {
Eric Orth70992982018-07-24 00:25:001342 proc_->SignalMultiple(2u); // One before the flush, one after.
1343
Eric Orth117e1992019-04-17 00:24:151344 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
1345 HostPortPair("host1", 70), NetLogWithSource(), base::nullopt,
1346 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:001347 EXPECT_THAT(initial_response.result_error(), IsOk());
1348 EXPECT_EQ(1u, proc_->GetCaptureList().size());
1349
Eric Orth117e1992019-04-17 00:24:151350 ResolveHostResponseHelper cached_response(resolver_->CreateRequest(
1351 HostPortPair("host1", 75), NetLogWithSource(), base::nullopt,
1352 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:001353 EXPECT_THAT(cached_response.result_error(), IsOk());
1354 EXPECT_EQ(1u, proc_->GetCaptureList().size()); // No expected increase.
1355
1356 // Verify initial DNS config read does not flush cache.
1357 NetworkChangeNotifier::NotifyObserversOfInitialDNSConfigReadForTests();
Eric Orth117e1992019-04-17 00:24:151358 ResolveHostResponseHelper unflushed_response(resolver_->CreateRequest(
1359 HostPortPair("host1", 75), NetLogWithSource(), base::nullopt,
1360 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:001361 EXPECT_THAT(unflushed_response.result_error(), IsOk());
1362 EXPECT_EQ(1u, proc_->GetCaptureList().size()); // No expected increase.
1363
Paul Jensenf47bbab2018-09-14 16:34:041364 // Flush cache by triggering an IP address change.
1365 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
Eric Orth70992982018-07-24 00:25:001366 base::RunLoop().RunUntilIdle(); // Notification happens async.
1367
1368 // Resolve "host1" again -- this time it won't be served from cache, so it
1369 // will complete asynchronously.
Eric Orth117e1992019-04-17 00:24:151370 ResolveHostResponseHelper flushed_response(resolver_->CreateRequest(
1371 HostPortPair("host1", 80), NetLogWithSource(), base::nullopt,
1372 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:001373 EXPECT_THAT(flushed_response.result_error(), IsOk());
1374 EXPECT_EQ(2u, proc_->GetCaptureList().size()); // Expected increase.
1375}
1376
Eric Orth37b18192019-04-22 19:09:281377TEST_F(HostResolverManagerTest, FlushCacheOnDnsConfigChange) {
1378 proc_->SignalMultiple(2u); // One before the flush, one after.
1379
1380 // Resolve to load cache.
1381 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
1382 HostPortPair("host1", 70), NetLogWithSource(), base::nullopt,
1383 request_context_.get(), host_cache_.get()));
1384 EXPECT_THAT(initial_response.result_error(), IsOk());
1385 EXPECT_EQ(1u, proc_->GetCaptureList().size());
1386
1387 // Result expected to come from the cache.
1388 ResolveHostResponseHelper cached_response(resolver_->CreateRequest(
1389 HostPortPair("host1", 75), NetLogWithSource(), base::nullopt,
1390 request_context_.get(), host_cache_.get()));
1391 EXPECT_THAT(cached_response.result_error(), IsOk());
1392 EXPECT_EQ(1u, proc_->GetCaptureList().size()); // No expected increase.
1393
1394 // Flush cache by triggering a DNS config change.
1395 NetworkChangeNotifier::NotifyObserversOfDNSChangeForTests();
1396 base::RunLoop().RunUntilIdle(); // Notification happens async.
1397
1398 // Expect flushed from cache and therefore served from |proc_|.
1399 ResolveHostResponseHelper flushed_response(resolver_->CreateRequest(
1400 HostPortPair("host1", 80), NetLogWithSource(), base::nullopt,
1401 request_context_.get(), host_cache_.get()));
1402 EXPECT_THAT(flushed_response.result_error(), IsOk());
1403 EXPECT_EQ(2u, proc_->GetCaptureList().size()); // Expected increase.
1404}
1405
Paul Jensenf47bbab2018-09-14 16:34:041406// Test that IP address changes send ERR_NETWORK_CHANGED to pending requests.
Eric Orth960e7062019-03-08 18:43:541407TEST_F(HostResolverManagerTest, AbortOnIPAddressChanged) {
Eric Orth117e1992019-04-17 00:24:151408 ResolveHostResponseHelper response(resolver_->CreateRequest(
1409 HostPortPair("host1", 70), NetLogWithSource(), base::nullopt,
1410 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:001411
1412 ASSERT_FALSE(response.complete());
1413 ASSERT_TRUE(proc_->WaitFor(1u));
1414
Paul Jensenf47bbab2018-09-14 16:34:041415 // Triggering an IP address change.
1416 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
Eric Orth70992982018-07-24 00:25:001417 base::RunLoop().RunUntilIdle(); // Notification happens async.
1418 proc_->SignalAll();
1419
1420 EXPECT_THAT(response.result_error(), IsError(ERR_NETWORK_CHANGED));
1421 EXPECT_FALSE(response.request()->GetAddressResults());
Eric Orth37b18192019-04-22 19:09:281422 EXPECT_EQ(0u, host_cache_->size());
Eric Orth70992982018-07-24 00:25:001423}
1424
pauljensen101ed372015-04-17 00:11:421425// Test that initial DNS config read signals do not abort pending requests.
Eric Orth960e7062019-03-08 18:43:541426TEST_F(HostResolverManagerTest, DontAbortOnInitialDNSConfigRead) {
Eric Orth117e1992019-04-17 00:24:151427 ResolveHostResponseHelper response(resolver_->CreateRequest(
1428 HostPortPair("host1", 70), NetLogWithSource(), base::nullopt,
1429 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:001430
1431 ASSERT_FALSE(response.complete());
1432 ASSERT_TRUE(proc_->WaitFor(1u));
1433
1434 // Triggering initial DNS config read signal.
1435 NetworkChangeNotifier::NotifyObserversOfInitialDNSConfigReadForTests();
1436 base::RunLoop().RunUntilIdle(); // Notification happens async.
1437 proc_->SignalAll();
1438
1439 EXPECT_THAT(response.result_error(), IsOk());
1440 EXPECT_TRUE(response.request()->GetAddressResults());
1441}
1442
Paul Jensenf47bbab2018-09-14 16:34:041443// Obey pool constraints after IP address has changed.
Eric Orth960e7062019-03-08 18:43:541444TEST_F(HostResolverManagerTest, ObeyPoolConstraintsAfterIPAddressChange) {
[email protected]38b50d92012-04-19 21:07:521445 // Runs at most one job at a time.
1446 CreateSerialResolver();
Eric Orth70992982018-07-24 00:25:001447
1448 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:151449 responses.emplace_back(
1450 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1451 HostPortPair("a", 80), NetLogWithSource(), base::nullopt,
1452 request_context_.get(), host_cache_.get())));
1453 responses.emplace_back(
1454 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1455 HostPortPair("b", 80), NetLogWithSource(), base::nullopt,
1456 request_context_.get(), host_cache_.get())));
1457 responses.emplace_back(
1458 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1459 HostPortPair("c", 80), NetLogWithSource(), base::nullopt,
1460 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:001461
1462 for (auto& response : responses) {
1463 ASSERT_FALSE(response->complete());
1464 }
1465 ASSERT_TRUE(proc_->WaitFor(1u));
1466
Paul Jensenf47bbab2018-09-14 16:34:041467 // Triggering an IP address change.
1468 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
Eric Orth70992982018-07-24 00:25:001469 base::RunLoop().RunUntilIdle(); // Notification happens async.
1470 proc_->SignalMultiple(3u); // Let the false-start go so that we can catch it.
1471
1472 // Requests should complete one at a time, with the first failing.
1473 EXPECT_THAT(responses[0]->result_error(), IsError(ERR_NETWORK_CHANGED));
1474 EXPECT_EQ(1u, num_running_dispatcher_jobs());
1475 EXPECT_FALSE(responses[1]->complete());
1476 EXPECT_FALSE(responses[2]->complete());
1477
1478 EXPECT_THAT(responses[1]->result_error(), IsOk());
1479 EXPECT_EQ(1u, num_running_dispatcher_jobs());
1480 EXPECT_FALSE(responses[2]->complete());
1481
1482 EXPECT_THAT(responses[2]->result_error(), IsOk());
1483}
1484
[email protected]b3601bc22012-02-21 21:23:201485// Tests that a new Request made from the callback of a previously aborted one
1486// will not be aborted.
Eric Orth960e7062019-03-08 18:43:541487TEST_F(HostResolverManagerTest, AbortOnlyExistingRequestsOnIPAddressChange) {
Eric Orth70992982018-07-24 00:25:001488 auto custom_callback_template = base::BindLambdaForTesting(
1489 [&](const HostPortPair& next_host,
1490 std::unique_ptr<ResolveHostResponseHelper>* next_response,
1491 CompletionOnceCallback completion_callback, int error) {
1492 *next_response = std::make_unique<ResolveHostResponseHelper>(
Eric Orth00fe5a62018-08-15 22:20:001493 resolver_->CreateRequest(next_host, NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:151494 base::nullopt, request_context_.get(),
1495 host_cache_.get()));
Eric Orth70992982018-07-24 00:25:001496 std::move(completion_callback).Run(error);
1497 });
1498
1499 std::vector<std::unique_ptr<ResolveHostResponseHelper>> next_responses(3);
1500
1501 ResolveHostResponseHelper response0(
Eric Orth00fe5a62018-08-15 22:20:001502 resolver_->CreateRequest(HostPortPair("bbb", 80), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:151503 base::nullopt, request_context_.get(),
1504 host_cache_.get()),
Eric Orth70992982018-07-24 00:25:001505 base::BindOnce(custom_callback_template, HostPortPair("zzz", 80),
1506 &next_responses[0]));
1507
1508 ResolveHostResponseHelper response1(
Eric Orth00fe5a62018-08-15 22:20:001509 resolver_->CreateRequest(HostPortPair("eee", 80), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:151510 base::nullopt, request_context_.get(),
1511 host_cache_.get()),
Eric Orth70992982018-07-24 00:25:001512 base::BindOnce(custom_callback_template, HostPortPair("aaa", 80),
1513 &next_responses[1]));
1514
1515 ResolveHostResponseHelper response2(
Eric Orth00fe5a62018-08-15 22:20:001516 resolver_->CreateRequest(HostPortPair("ccc", 80), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:151517 base::nullopt, request_context_.get(),
1518 host_cache_.get()),
Eric Orth70992982018-07-24 00:25:001519 base::BindOnce(custom_callback_template, HostPortPair("eee", 80),
1520 &next_responses[2]));
1521
1522 // Wait until all are blocked;
1523 ASSERT_TRUE(proc_->WaitFor(3u));
Paul Jensenf47bbab2018-09-14 16:34:041524 // Trigger an IP address change.
1525 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
Eric Orth70992982018-07-24 00:25:001526 // This should abort all running jobs.
1527 base::RunLoop().RunUntilIdle();
1528
1529 EXPECT_THAT(response0.result_error(), IsError(ERR_NETWORK_CHANGED));
1530 EXPECT_THAT(response1.result_error(), IsError(ERR_NETWORK_CHANGED));
1531 EXPECT_THAT(response2.result_error(), IsError(ERR_NETWORK_CHANGED));
1532
1533 EXPECT_FALSE(next_responses[0]->complete());
1534 EXPECT_FALSE(next_responses[1]->complete());
1535 EXPECT_FALSE(next_responses[2]->complete());
1536
1537 // Unblock all calls to proc.
1538 proc_->SignalMultiple(6u);
1539
1540 // Run until the re-started requests finish.
1541 EXPECT_THAT(next_responses[0]->result_error(), IsOk());
1542 EXPECT_THAT(next_responses[1]->result_error(), IsOk());
1543 EXPECT_THAT(next_responses[2]->result_error(), IsOk());
1544
1545 // Verify that results of aborted Jobs were not cached.
1546 EXPECT_EQ(6u, proc_->GetCaptureList().size());
Eric Orth37b18192019-04-22 19:09:281547 EXPECT_EQ(3u, host_cache_->size());
Eric Orth70992982018-07-24 00:25:001548}
1549
[email protected]68ad3ee2010-01-30 03:45:391550// Tests that when the maximum threads is set to 1, requests are dequeued
1551// in order of priority.
Eric Orth960e7062019-03-08 18:43:541552TEST_F(HostResolverManagerTest, HigherPriorityRequestsStartedFirst) {
[email protected]38b50d92012-04-19 21:07:521553 CreateSerialResolver();
[email protected]68ad3ee2010-01-30 03:45:391554
Eric Orth00fe5a62018-08-15 22:20:001555 HostResolver::ResolveHostParameters low_priority;
1556 low_priority.initial_priority = LOW;
1557 HostResolver::ResolveHostParameters medium_priority;
1558 medium_priority.initial_priority = MEDIUM;
1559 HostResolver::ResolveHostParameters highest_priority;
1560 highest_priority.initial_priority = HIGHEST;
1561
1562 // Note that at this point the MockHostResolverProc is blocked, so any
1563 // requests we make will not complete.
1564
1565 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:151566 responses.emplace_back(
1567 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1568 HostPortPair("req0", 80), NetLogWithSource(), low_priority,
1569 request_context_.get(), host_cache_.get())));
1570 responses.emplace_back(
1571 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1572 HostPortPair("req1", 80), NetLogWithSource(), medium_priority,
1573 request_context_.get(), host_cache_.get())));
1574 responses.emplace_back(
1575 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1576 HostPortPair("req2", 80), NetLogWithSource(), medium_priority,
1577 request_context_.get(), host_cache_.get())));
1578 responses.emplace_back(
1579 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1580 HostPortPair("req3", 80), NetLogWithSource(), low_priority,
1581 request_context_.get(), host_cache_.get())));
1582 responses.emplace_back(
1583 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1584 HostPortPair("req4", 80), NetLogWithSource(), highest_priority,
1585 request_context_.get(), host_cache_.get())));
1586 responses.emplace_back(
1587 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1588 HostPortPair("req5", 80), NetLogWithSource(), low_priority,
1589 request_context_.get(), host_cache_.get())));
1590 responses.emplace_back(
1591 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1592 HostPortPair("req6", 80), NetLogWithSource(), low_priority,
1593 request_context_.get(), host_cache_.get())));
1594 responses.emplace_back(
1595 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1596 HostPortPair("req5", 80), NetLogWithSource(), highest_priority,
1597 request_context_.get(), host_cache_.get())));
Eric Orth00fe5a62018-08-15 22:20:001598
1599 for (const auto& response : responses) {
1600 ASSERT_FALSE(response->complete());
1601 }
1602
1603 // Unblock the resolver thread so the requests can run.
1604 proc_->SignalMultiple(responses.size()); // More than needed.
1605
1606 // Wait for all the requests to complete successfully.
1607 for (auto& response : responses) {
1608 EXPECT_THAT(response->result_error(), IsOk());
1609 }
1610
1611 // Since we have restricted to a single concurrent thread in the jobpool,
1612 // the requests should complete in order of priority (with the exception
1613 // of the first request, which gets started right away, since there is
1614 // nothing outstanding).
1615 MockHostResolverProc::CaptureList capture_list = proc_->GetCaptureList();
1616 ASSERT_EQ(7u, capture_list.size());
1617
1618 EXPECT_EQ("req0", capture_list[0].hostname);
1619 EXPECT_EQ("req4", capture_list[1].hostname);
1620 EXPECT_EQ("req5", capture_list[2].hostname);
1621 EXPECT_EQ("req1", capture_list[3].hostname);
1622 EXPECT_EQ("req2", capture_list[4].hostname);
1623 EXPECT_EQ("req3", capture_list[5].hostname);
1624 EXPECT_EQ("req6", capture_list[6].hostname);
1625}
1626
juliatuttlec53b19a72016-05-05 13:51:311627// Test that changing a job's priority affects the dequeueing order.
Eric Orth960e7062019-03-08 18:43:541628TEST_F(HostResolverManagerTest, ChangePriority) {
juliatuttlec53b19a72016-05-05 13:51:311629 CreateSerialResolver();
1630
Eric Orth26fa08e2019-02-22 01:28:371631 HostResolver::ResolveHostParameters lowest_priority;
1632 lowest_priority.initial_priority = LOWEST;
1633 HostResolver::ResolveHostParameters low_priority;
1634 low_priority.initial_priority = LOW;
1635 HostResolver::ResolveHostParameters medium_priority;
1636 medium_priority.initial_priority = MEDIUM;
juliatuttlec53b19a72016-05-05 13:51:311637
Eric Orth26fa08e2019-02-22 01:28:371638 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:151639 responses.emplace_back(
1640 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1641 HostPortPair("req0", 80), NetLogWithSource(), medium_priority,
1642 request_context_.get(), host_cache_.get())));
1643 responses.emplace_back(
1644 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1645 HostPortPair("req1", 80), NetLogWithSource(), low_priority,
1646 request_context_.get(), host_cache_.get())));
1647 responses.emplace_back(
1648 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1649 HostPortPair("req2", 80), NetLogWithSource(), lowest_priority,
1650 request_context_.get(), host_cache_.get())));
juliatuttlec53b19a72016-05-05 13:51:311651
1652 // req0 starts immediately; without ChangePriority, req1 and then req2 should
1653 // run.
Eric Orth26fa08e2019-02-22 01:28:371654 for (const auto& response : responses) {
1655 ASSERT_FALSE(response->complete());
1656 }
juliatuttlec53b19a72016-05-05 13:51:311657
Eric Orth26fa08e2019-02-22 01:28:371658 // Changing req2 to HIGHEST should make it run before req1.
juliatuttlec53b19a72016-05-05 13:51:311659 // (It can't run before req0, since req0 started immediately.)
Eric Orth26fa08e2019-02-22 01:28:371660 responses[2]->request()->ChangeRequestPriority(HIGHEST);
juliatuttlec53b19a72016-05-05 13:51:311661
1662 // Let all 3 requests finish.
1663 proc_->SignalMultiple(3u);
1664
Eric Orth26fa08e2019-02-22 01:28:371665 for (auto& response : responses) {
1666 EXPECT_THAT(response->result_error(), IsOk());
1667 }
juliatuttlec53b19a72016-05-05 13:51:311668
1669 MockHostResolverProc::CaptureList capture_list = proc_->GetCaptureList();
1670 ASSERT_EQ(3u, capture_list.size());
1671
1672 EXPECT_EQ("req0", capture_list[0].hostname);
1673 EXPECT_EQ("req2", capture_list[1].hostname);
1674 EXPECT_EQ("req1", capture_list[2].hostname);
1675}
1676
[email protected]38b50d92012-04-19 21:07:521677// Try cancelling a job which has not started yet.
Eric Orth960e7062019-03-08 18:43:541678TEST_F(HostResolverManagerTest, CancelPendingRequest) {
[email protected]38b50d92012-04-19 21:07:521679 CreateSerialResolver();
[email protected]68ad3ee2010-01-30 03:45:391680
Eric Orth00fe5a62018-08-15 22:20:001681 HostResolver::ResolveHostParameters lowest_priority;
1682 lowest_priority.initial_priority = LOWEST;
1683 HostResolver::ResolveHostParameters low_priority;
1684 low_priority.initial_priority = LOW;
1685 HostResolver::ResolveHostParameters medium_priority;
1686 medium_priority.initial_priority = MEDIUM;
1687 HostResolver::ResolveHostParameters highest_priority;
1688 highest_priority.initial_priority = HIGHEST;
1689
Eric Orth70992982018-07-24 00:25:001690 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:151691 responses.emplace_back(
1692 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1693 HostPortPair("req0", 80), NetLogWithSource(), lowest_priority,
1694 request_context_.get(), host_cache_.get())));
1695 responses.emplace_back(
1696 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1697 HostPortPair("req1", 80), NetLogWithSource(), highest_priority,
1698 request_context_.get(), host_cache_.get())));
1699 responses.emplace_back(
1700 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1701 HostPortPair("req2", 80), NetLogWithSource(), medium_priority,
1702 request_context_.get(), host_cache_.get())));
1703 responses.emplace_back(
1704 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1705 HostPortPair("req3", 80), NetLogWithSource(), low_priority,
1706 request_context_.get(), host_cache_.get())));
1707 responses.emplace_back(
1708 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1709 HostPortPair("req4", 80), NetLogWithSource(), highest_priority,
1710 request_context_.get(), host_cache_.get())));
1711 responses.emplace_back(
1712 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1713 HostPortPair("req5", 80), NetLogWithSource(), lowest_priority,
1714 request_context_.get(), host_cache_.get())));
1715 responses.emplace_back(
1716 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1717 HostPortPair("req6", 80), NetLogWithSource(), medium_priority,
1718 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:001719
1720 // Cancel some requests
1721 responses[1]->CancelRequest();
1722 responses[4]->CancelRequest();
1723 responses[5]->CancelRequest();
1724
1725 // Unblock the resolver thread so the requests can run.
1726 proc_->SignalMultiple(responses.size()); // More than needed.
1727
1728 // Let everything try to finish.
1729 base::RunLoop().RunUntilIdle();
1730
1731 // Wait for all the requests to complete succesfully.
1732 EXPECT_THAT(responses[0]->result_error(), IsOk());
1733 EXPECT_THAT(responses[2]->result_error(), IsOk());
1734 EXPECT_THAT(responses[3]->result_error(), IsOk());
1735 EXPECT_THAT(responses[6]->result_error(), IsOk());
1736
1737 // Cancelled requests shouldn't complete.
1738 EXPECT_FALSE(responses[1]->complete());
1739 EXPECT_FALSE(responses[4]->complete());
1740 EXPECT_FALSE(responses[5]->complete());
1741
1742 // Verify that they called out the the resolver proc (which runs on the
1743 // resolver thread) in the expected order.
1744 MockHostResolverProc::CaptureList capture_list = proc_->GetCaptureList();
1745 ASSERT_EQ(4u, capture_list.size());
1746
1747 EXPECT_EQ("req0", capture_list[0].hostname);
1748 EXPECT_EQ("req2", capture_list[1].hostname);
Eric Orth00fe5a62018-08-15 22:20:001749 EXPECT_EQ("req6", capture_list[2].hostname);
1750 EXPECT_EQ("req3", capture_list[3].hostname);
Eric Orth70992982018-07-24 00:25:001751}
1752
[email protected]68ad3ee2010-01-30 03:45:391753// Test that when too many requests are enqueued, old ones start to be aborted.
Eric Orth960e7062019-03-08 18:43:541754TEST_F(HostResolverManagerTest, QueueOverflow) {
[email protected]38b50d92012-04-19 21:07:521755 CreateSerialResolver();
[email protected]68ad3ee2010-01-30 03:45:391756
[email protected]0f292de02012-02-01 22:28:201757 // Allow only 3 queued jobs.
1758 const size_t kMaxPendingJobs = 3u;
Eric Orth70992982018-07-24 00:25:001759 resolver_->SetMaxQueuedJobsForTesting(kMaxPendingJobs);
[email protected]68ad3ee2010-01-30 03:45:391760
Eric Orth00fe5a62018-08-15 22:20:001761 HostResolver::ResolveHostParameters lowest_priority;
1762 lowest_priority.initial_priority = LOWEST;
1763 HostResolver::ResolveHostParameters low_priority;
1764 low_priority.initial_priority = LOW;
1765 HostResolver::ResolveHostParameters medium_priority;
1766 medium_priority.initial_priority = MEDIUM;
1767 HostResolver::ResolveHostParameters highest_priority;
1768 highest_priority.initial_priority = HIGHEST;
1769
Eric Orth70992982018-07-24 00:25:001770 // Note that at this point the MockHostResolverProc is blocked, so any
1771 // requests we make will not complete.
1772
1773 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:151774 responses.emplace_back(
1775 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1776 HostPortPair("req0", 80), NetLogWithSource(), lowest_priority,
1777 request_context_.get(), host_cache_.get())));
1778 responses.emplace_back(
1779 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1780 HostPortPair("req1", 80), NetLogWithSource(), highest_priority,
1781 request_context_.get(), host_cache_.get())));
1782 responses.emplace_back(
1783 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1784 HostPortPair("req2", 80), NetLogWithSource(), medium_priority,
1785 request_context_.get(), host_cache_.get())));
1786 responses.emplace_back(
1787 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1788 HostPortPair("req3", 80), NetLogWithSource(), medium_priority,
1789 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:001790
1791 // At this point, there are 3 enqueued jobs (and one "running" job).
1792 // Insertion of subsequent requests will cause evictions.
1793
Eric Orth117e1992019-04-17 00:24:151794 responses.emplace_back(
1795 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1796 HostPortPair("req4", 80), NetLogWithSource(), low_priority,
1797 request_context_.get(), host_cache_.get())));
Eric Orth00fe5a62018-08-15 22:20:001798 EXPECT_THAT(responses[4]->result_error(),
1799 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE)); // Evicts self.
1800 EXPECT_FALSE(responses[4]->request()->GetAddressResults());
Eric Orth70992982018-07-24 00:25:001801
Eric Orth117e1992019-04-17 00:24:151802 responses.emplace_back(
1803 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1804 HostPortPair("req5", 80), NetLogWithSource(), medium_priority,
1805 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:001806 EXPECT_THAT(responses[2]->result_error(),
1807 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
1808 EXPECT_FALSE(responses[2]->request()->GetAddressResults());
1809
Eric Orth117e1992019-04-17 00:24:151810 responses.emplace_back(
1811 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1812 HostPortPair("req6", 80), NetLogWithSource(), highest_priority,
1813 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:001814 EXPECT_THAT(responses[3]->result_error(),
1815 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
1816 EXPECT_FALSE(responses[3]->request()->GetAddressResults());
1817
Eric Orth117e1992019-04-17 00:24:151818 responses.emplace_back(
1819 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1820 HostPortPair("req7", 80), NetLogWithSource(), medium_priority,
1821 request_context_.get(), host_cache_.get())));
Eric Orth00fe5a62018-08-15 22:20:001822 EXPECT_THAT(responses[5]->result_error(),
Eric Orth70992982018-07-24 00:25:001823 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
Eric Orth00fe5a62018-08-15 22:20:001824 EXPECT_FALSE(responses[5]->request()->GetAddressResults());
Eric Orth70992982018-07-24 00:25:001825
1826 // Unblock the resolver thread so the requests can run.
1827 proc_->SignalMultiple(4u);
1828
1829 // The rest should succeed.
1830 EXPECT_THAT(responses[0]->result_error(), IsOk());
1831 EXPECT_TRUE(responses[0]->request()->GetAddressResults());
Eric Orth00fe5a62018-08-15 22:20:001832 EXPECT_THAT(responses[1]->result_error(), IsOk());
1833 EXPECT_TRUE(responses[1]->request()->GetAddressResults());
Eric Orth70992982018-07-24 00:25:001834 EXPECT_THAT(responses[6]->result_error(), IsOk());
1835 EXPECT_TRUE(responses[6]->request()->GetAddressResults());
1836 EXPECT_THAT(responses[7]->result_error(), IsOk());
1837 EXPECT_TRUE(responses[7]->request()->GetAddressResults());
1838
1839 // Verify that they called out the the resolver proc (which runs on the
1840 // resolver thread) in the expected order.
1841 MockHostResolverProc::CaptureList capture_list = proc_->GetCaptureList();
1842 ASSERT_EQ(4u, capture_list.size());
1843
1844 EXPECT_EQ("req0", capture_list[0].hostname);
Eric Orth00fe5a62018-08-15 22:20:001845 EXPECT_EQ("req1", capture_list[1].hostname);
Eric Orth70992982018-07-24 00:25:001846 EXPECT_EQ("req6", capture_list[2].hostname);
1847 EXPECT_EQ("req7", capture_list[3].hostname);
1848
1849 // Verify that the evicted (incomplete) requests were not cached.
Eric Orth37b18192019-04-22 19:09:281850 EXPECT_EQ(4u, host_cache_->size());
Eric Orth70992982018-07-24 00:25:001851
1852 for (size_t i = 0; i < responses.size(); ++i) {
1853 EXPECT_TRUE(responses[i]->complete()) << i;
1854 }
1855}
1856
1857// Tests that jobs can self-evict by setting the max queue to 0.
Eric Orth960e7062019-03-08 18:43:541858TEST_F(HostResolverManagerTest, QueueOverflow_SelfEvict) {
Eric Orth70992982018-07-24 00:25:001859 CreateSerialResolver();
1860 resolver_->SetMaxQueuedJobsForTesting(0);
1861
1862 // Note that at this point the MockHostResolverProc is blocked, so any
1863 // requests we make will not complete.
1864
Eric Orth117e1992019-04-17 00:24:151865 ResolveHostResponseHelper run_response(resolver_->CreateRequest(
1866 HostPortPair("run", 80), NetLogWithSource(), base::nullopt,
1867 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:001868
Eric Orth117e1992019-04-17 00:24:151869 ResolveHostResponseHelper evict_response(resolver_->CreateRequest(
1870 HostPortPair("req1", 80), NetLogWithSource(), base::nullopt,
1871 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:001872 EXPECT_THAT(evict_response.result_error(),
1873 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
1874 EXPECT_FALSE(evict_response.request()->GetAddressResults());
1875
1876 proc_->SignalMultiple(1u);
1877
1878 EXPECT_THAT(run_response.result_error(), IsOk());
1879 EXPECT_TRUE(run_response.request()->GetAddressResults());
1880}
1881
Eric Orth00fe5a62018-08-15 22:20:001882// Make sure that the dns query type parameter is respected when raw IPs are
1883// passed in.
Eric Orth960e7062019-03-08 18:43:541884TEST_F(HostResolverManagerTest, AddressFamilyWithRawIPs) {
Eric Orth00fe5a62018-08-15 22:20:001885 HostResolver::ResolveHostParameters v4_parameters;
Eric Orth192e3bb2018-11-14 19:30:321886 v4_parameters.dns_query_type = DnsQueryType::A;
Eric Orth00fe5a62018-08-15 22:20:001887
1888 HostResolver::ResolveHostParameters v6_parameters;
Eric Orth192e3bb2018-11-14 19:30:321889 v6_parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth00fe5a62018-08-15 22:20:001890
1891 ResolveHostResponseHelper v4_v4_request(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:271892 HostPortPair("127.0.0.1", 80), NetLogWithSource(), v4_parameters,
Eric Orth117e1992019-04-17 00:24:151893 request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:001894 EXPECT_THAT(v4_v4_request.result_error(), IsOk());
1895 EXPECT_THAT(v4_v4_request.request()->GetAddressResults().value().endpoints(),
1896 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
1897
1898 ResolveHostResponseHelper v4_v6_request(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:271899 HostPortPair("127.0.0.1", 80), NetLogWithSource(), v6_parameters,
Eric Orth117e1992019-04-17 00:24:151900 request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:001901 EXPECT_THAT(v4_v6_request.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
1902
1903 ResolveHostResponseHelper v4_unsp_request(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:271904 HostPortPair("127.0.0.1", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:151905 request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:001906 EXPECT_THAT(v4_unsp_request.result_error(), IsOk());
1907 EXPECT_THAT(
1908 v4_unsp_request.request()->GetAddressResults().value().endpoints(),
1909 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
1910
Eric Orth117e1992019-04-17 00:24:151911 ResolveHostResponseHelper v6_v4_request(resolver_->CreateRequest(
1912 HostPortPair("::1", 80), NetLogWithSource(), v4_parameters,
1913 request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:001914 EXPECT_THAT(v6_v4_request.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
1915
Eric Orth117e1992019-04-17 00:24:151916 ResolveHostResponseHelper v6_v6_request(resolver_->CreateRequest(
1917 HostPortPair("::1", 80), NetLogWithSource(), v6_parameters,
1918 request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:001919 EXPECT_THAT(v6_v6_request.result_error(), IsOk());
1920 EXPECT_THAT(v6_v6_request.request()->GetAddressResults().value().endpoints(),
1921 testing::ElementsAre(CreateExpected("::1", 80)));
1922
Eric Orth117e1992019-04-17 00:24:151923 ResolveHostResponseHelper v6_unsp_request(resolver_->CreateRequest(
1924 HostPortPair("::1", 80), NetLogWithSource(), base::nullopt,
1925 request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:001926 EXPECT_THAT(v6_unsp_request.result_error(), IsOk());
1927 EXPECT_THAT(
1928 v6_unsp_request.request()->GetAddressResults().value().endpoints(),
1929 testing::ElementsAre(CreateExpected("::1", 80)));
1930}
1931
Eric Orth960e7062019-03-08 18:43:541932TEST_F(HostResolverManagerTest, LocalOnly_FromCache) {
Eric Ortheb332862019-01-26 00:52:381933 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42");
1934 proc_->SignalMultiple(1u); // Need only one.
1935
1936 HostResolver::ResolveHostParameters source_none_parameters;
1937 source_none_parameters.source = HostResolverSource::LOCAL_ONLY;
1938
1939 // First NONE query expected to complete synchronously with a cache miss.
Eric Orth6f1c5172019-04-16 17:08:271940 ResolveHostResponseHelper cache_miss_request(resolver_->CreateRequest(
1941 HostPortPair("just.testing", 80), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:151942 source_none_parameters, request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:381943 EXPECT_TRUE(cache_miss_request.complete());
1944 EXPECT_THAT(cache_miss_request.result_error(), IsError(ERR_DNS_CACHE_MISS));
1945 EXPECT_FALSE(cache_miss_request.request()->GetAddressResults());
1946 EXPECT_FALSE(cache_miss_request.request()->GetStaleInfo());
1947
1948 // Normal query to populate the cache.
1949 ResolveHostResponseHelper normal_request(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:271950 HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:151951 request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:381952 EXPECT_THAT(normal_request.result_error(), IsOk());
1953 EXPECT_FALSE(normal_request.request()->GetStaleInfo());
1954
1955 // Second NONE query expected to complete synchronously with cache hit.
Eric Orth6f1c5172019-04-16 17:08:271956 ResolveHostResponseHelper cache_hit_request(resolver_->CreateRequest(
1957 HostPortPair("just.testing", 80), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:151958 source_none_parameters, request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:381959 EXPECT_TRUE(cache_hit_request.complete());
1960 EXPECT_THAT(cache_hit_request.result_error(), IsOk());
1961 EXPECT_THAT(
1962 cache_hit_request.request()->GetAddressResults().value().endpoints(),
1963 testing::ElementsAre(CreateExpected("192.168.1.42", 80)));
1964 EXPECT_FALSE(cache_hit_request.request()->GetStaleInfo().value().is_stale());
1965}
1966
Eric Orth960e7062019-03-08 18:43:541967TEST_F(HostResolverManagerTest, LocalOnly_StaleEntry) {
Eric Ortheb332862019-01-26 00:52:381968 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42");
1969 proc_->SignalMultiple(1u); // Need only one.
1970
1971 HostResolver::ResolveHostParameters source_none_parameters;
1972 source_none_parameters.source = HostResolverSource::LOCAL_ONLY;
1973
1974 // First NONE query expected to complete synchronously with a cache miss.
Eric Orth6f1c5172019-04-16 17:08:271975 ResolveHostResponseHelper cache_miss_request(resolver_->CreateRequest(
1976 HostPortPair("just.testing", 80), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:151977 source_none_parameters, request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:381978 EXPECT_TRUE(cache_miss_request.complete());
1979 EXPECT_THAT(cache_miss_request.result_error(), IsError(ERR_DNS_CACHE_MISS));
1980 EXPECT_FALSE(cache_miss_request.request()->GetAddressResults());
1981 EXPECT_FALSE(cache_miss_request.request()->GetStaleInfo());
1982
1983 // Normal query to populate the cache.
1984 ResolveHostResponseHelper normal_request(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:271985 HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:151986 request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:381987 EXPECT_THAT(normal_request.result_error(), IsOk());
1988 EXPECT_FALSE(normal_request.request()->GetStaleInfo());
1989
1990 MakeCacheStale();
1991
1992 // Second NONE query still expected to complete synchronously with cache miss.
Eric Orth6f1c5172019-04-16 17:08:271993 ResolveHostResponseHelper stale_request(resolver_->CreateRequest(
1994 HostPortPair("just.testing", 80), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:151995 source_none_parameters, request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:381996 EXPECT_TRUE(stale_request.complete());
1997 EXPECT_THAT(stale_request.result_error(), IsError(ERR_DNS_CACHE_MISS));
1998 EXPECT_FALSE(stale_request.request()->GetAddressResults());
1999 EXPECT_FALSE(stale_request.request()->GetStaleInfo());
2000}
2001
Eric Orth960e7062019-03-08 18:43:542002TEST_F(HostResolverManagerTest, LocalOnly_FromIp) {
Eric Ortheb332862019-01-26 00:52:382003 HostResolver::ResolveHostParameters source_none_parameters;
2004 source_none_parameters.source = HostResolverSource::LOCAL_ONLY;
2005
Eric Orth117e1992019-04-17 00:24:152006 ResolveHostResponseHelper response(resolver_->CreateRequest(
2007 HostPortPair("1.2.3.4", 56), NetLogWithSource(), source_none_parameters,
2008 request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:382009
2010 // Expected to resolve synchronously.
2011 EXPECT_TRUE(response.complete());
2012 EXPECT_THAT(response.result_error(), IsOk());
2013 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
2014 testing::ElementsAre(CreateExpected("1.2.3.4", 56)));
2015 EXPECT_FALSE(response.request()->GetStaleInfo());
2016}
2017
Eric Orth960e7062019-03-08 18:43:542018TEST_F(HostResolverManagerTest, LocalOnly_InvalidName) {
Eric Ortheb332862019-01-26 00:52:382019 proc_->AddRuleForAllFamilies("foo,bar.com", "192.168.1.42");
2020
2021 HostResolver::ResolveHostParameters source_none_parameters;
2022 source_none_parameters.source = HostResolverSource::LOCAL_ONLY;
2023
Eric Orth6f1c5172019-04-16 17:08:272024 ResolveHostResponseHelper response(resolver_->CreateRequest(
2025 HostPortPair("foo,bar.com", 57), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:152026 source_none_parameters, request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:382027
2028 // Expected to fail synchronously.
2029 EXPECT_TRUE(response.complete());
2030 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
2031 EXPECT_FALSE(response.request()->GetAddressResults());
2032 EXPECT_FALSE(response.request()->GetStaleInfo());
2033}
2034
Eric Orth960e7062019-03-08 18:43:542035TEST_F(HostResolverManagerTest, LocalOnly_InvalidLocalhost) {
Eric Ortheb332862019-01-26 00:52:382036 HostResolver::ResolveHostParameters source_none_parameters;
2037 source_none_parameters.source = HostResolverSource::LOCAL_ONLY;
2038
Eric Orth6f1c5172019-04-16 17:08:272039 ResolveHostResponseHelper response(resolver_->CreateRequest(
2040 HostPortPair("foo,bar.localhost", 58), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:152041 source_none_parameters, request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:382042
2043 // Expected to fail synchronously.
2044 EXPECT_TRUE(response.complete());
2045 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
2046 EXPECT_FALSE(response.request()->GetAddressResults());
2047 EXPECT_FALSE(response.request()->GetStaleInfo());
2048}
2049
Eric Orth960e7062019-03-08 18:43:542050TEST_F(HostResolverManagerTest, StaleAllowed) {
Eric Ortheb332862019-01-26 00:52:382051 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42");
2052 proc_->SignalMultiple(1u); // Need only one.
2053
2054 HostResolver::ResolveHostParameters stale_allowed_parameters;
2055 stale_allowed_parameters.source = HostResolverSource::LOCAL_ONLY;
2056 stale_allowed_parameters.cache_usage =
2057 HostResolver::ResolveHostParameters::CacheUsage::STALE_ALLOWED;
2058
2059 // First query expected to complete synchronously as a cache miss.
Eric Orth6f1c5172019-04-16 17:08:272060 ResolveHostResponseHelper cache_miss_request(resolver_->CreateRequest(
2061 HostPortPair("just.testing", 80), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:152062 stale_allowed_parameters, request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:382063 EXPECT_TRUE(cache_miss_request.complete());
2064 EXPECT_THAT(cache_miss_request.result_error(), IsError(ERR_DNS_CACHE_MISS));
2065 EXPECT_FALSE(cache_miss_request.request()->GetAddressResults());
2066 EXPECT_FALSE(cache_miss_request.request()->GetStaleInfo());
2067
2068 // Normal query to populate cache
2069 ResolveHostResponseHelper normal_request(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272070 HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:152071 request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:382072 EXPECT_THAT(normal_request.result_error(), IsOk());
2073 EXPECT_FALSE(normal_request.request()->GetStaleInfo());
2074
2075 MakeCacheStale();
2076
2077 // Second NONE query expected to get a stale cache hit.
Eric Orth6f1c5172019-04-16 17:08:272078 ResolveHostResponseHelper stale_request(resolver_->CreateRequest(
2079 HostPortPair("just.testing", 84), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:152080 stale_allowed_parameters, request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:382081 EXPECT_TRUE(stale_request.complete());
2082 EXPECT_THAT(stale_request.result_error(), IsOk());
2083 EXPECT_THAT(stale_request.request()->GetAddressResults().value().endpoints(),
2084 testing::ElementsAre(CreateExpected("192.168.1.42", 84)));
2085 EXPECT_TRUE(stale_request.request()->GetStaleInfo().value().is_stale());
2086}
2087
Eric Orth960e7062019-03-08 18:43:542088TEST_F(HostResolverManagerTest, StaleAllowed_NonLocal) {
Eric Ortheb332862019-01-26 00:52:382089 proc_->AddRuleForAllFamilies("just.testing", "192.168.2.42");
2090 proc_->SignalMultiple(1u); // Need only one.
2091
2092 HostResolver::ResolveHostParameters stale_allowed_parameters;
2093 stale_allowed_parameters.cache_usage =
2094 HostResolver::ResolveHostParameters::CacheUsage::STALE_ALLOWED;
2095
2096 // Normal non-local resolves should still work normally with the STALE_ALLOWED
2097 // parameter, and there should be no stale info.
Eric Orth6f1c5172019-04-16 17:08:272098 ResolveHostResponseHelper response(resolver_->CreateRequest(
2099 HostPortPair("just.testing", 85), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:152100 stale_allowed_parameters, request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:382101 EXPECT_THAT(response.result_error(), IsOk());
2102 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
2103 testing::ElementsAre(CreateExpected("192.168.2.42", 85)));
2104 EXPECT_FALSE(response.request()->GetStaleInfo());
2105}
2106
Eric Orth960e7062019-03-08 18:43:542107TEST_F(HostResolverManagerTest, StaleAllowed_FromIp) {
Eric Ortheb332862019-01-26 00:52:382108 HostResolver::ResolveHostParameters stale_allowed_parameters;
2109 stale_allowed_parameters.cache_usage =
2110 HostResolver::ResolveHostParameters::CacheUsage::STALE_ALLOWED;
2111
Eric Orth6f1c5172019-04-16 17:08:272112 ResolveHostResponseHelper response(resolver_->CreateRequest(
2113 HostPortPair("1.2.3.4", 57), NetLogWithSource(), stale_allowed_parameters,
Eric Orth117e1992019-04-17 00:24:152114 request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:382115
2116 // Expected to resolve synchronously without stale info.
2117 EXPECT_TRUE(response.complete());
2118 EXPECT_THAT(response.result_error(), IsOk());
2119 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
2120 testing::ElementsAre(CreateExpected("1.2.3.4", 57)));
2121 EXPECT_FALSE(response.request()->GetStaleInfo());
2122}
2123
Miriam Gershensone3bc63022017-10-09 19:57:052124// TODO(mgersh): add a test case for errors with positive TTL after
2125// https://crbug.com/115051 is fixed.
2126
[email protected]189163e2011-05-11 01:48:542127// Test the retry attempts simulating host resolver proc that takes too long.
Eric Orth960e7062019-03-08 18:43:542128TEST_F(HostResolverManagerTest, MultipleAttempts) {
[email protected]189163e2011-05-11 01:48:542129 // Total number of attempts would be 3 and we want the 3rd attempt to resolve
Eric Orth9a037562018-07-03 21:24:382130 // the host. First and second attempt will be forced to wait until they get
[email protected]189163e2011-05-11 01:48:542131 // word that a resolution has completed. The 3rd resolution attempt will try
Eric Orth9a037562018-07-03 21:24:382132 // to get done ASAP, and won't wait.
[email protected]189163e2011-05-11 01:48:542133 int kAttemptNumberToResolve = 3;
2134 int kTotalAttempts = 3;
2135
Eric Orth9a037562018-07-03 21:24:382136 // Add a little bit of extra fudge to the delay to allow reasonable
2137 // flexibility for time > vs >= etc. We don't need to fail the test if we
2138 // retry at t=6001 instead of t=6000.
2139 base::TimeDelta kSleepFudgeFactor = base::TimeDelta::FromMilliseconds(1);
2140
[email protected]189163e2011-05-11 01:48:542141 scoped_refptr<LookupAttemptHostResolverProc> resolver_proc(
Raul Tambre94493c652019-03-11 17:18:352142 new LookupAttemptHostResolverProc(nullptr, kAttemptNumberToResolve,
Eric Orth70992982018-07-24 00:25:002143 kTotalAttempts));
2144
Eric Orth59066222019-03-07 23:52:272145 ProcTaskParams params = DefaultParams(resolver_proc.get());
Eric Orth70992982018-07-24 00:25:002146 base::TimeDelta unresponsive_delay = params.unresponsive_delay;
2147 int retry_factor = params.retry_factor;
2148
Eric Orth607b6d82019-05-08 16:43:322149 CreateResolverWithLimitsAndParams(kMaxJobs, params, true /* ipv6_reachable */,
2150 true /* check_ipv6_on_wifi */);
Eric Orth70992982018-07-24 00:25:002151
2152 // Override the current thread task runner, so we can simulate the passage of
2153 // time and avoid any actual sleeps.
2154 auto test_task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
2155 base::ScopedClosureRunner task_runner_override_scoped_cleanup =
2156 base::ThreadTaskRunnerHandle::OverrideForTesting(test_task_runner);
2157
2158 // Resolve "host1".
Eric Orth117e1992019-04-17 00:24:152159 ResolveHostResponseHelper response(resolver_->CreateRequest(
2160 HostPortPair("host1", 70), NetLogWithSource(), base::nullopt,
2161 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:002162 EXPECT_FALSE(response.complete());
2163
2164 resolver_proc->WaitForNAttemptsToBeBlocked(1);
2165 EXPECT_FALSE(response.complete());
2166
2167 test_task_runner->FastForwardBy(unresponsive_delay + kSleepFudgeFactor);
2168 resolver_proc->WaitForNAttemptsToBeBlocked(2);
2169 EXPECT_FALSE(response.complete());
2170
2171 test_task_runner->FastForwardBy(unresponsive_delay * retry_factor +
2172 kSleepFudgeFactor);
2173
2174 resolver_proc->WaitForAllAttemptsToFinish();
2175 test_task_runner->RunUntilIdle();
2176
2177 // Resolve returns -4 to indicate that 3rd attempt has resolved the host.
2178 // Since we're using a TestMockTimeTaskRunner, the RunLoop stuff in
2179 // result_error() will fail if it actually has to wait, but unless there's an
2180 // error, the result should be immediately ready by this point.
2181 EXPECT_EQ(-4, response.result_error());
2182
2183 // We should be done with retries, but make sure none erroneously happen.
2184 test_task_runner->FastForwardUntilNoTasksRemain();
2185
Eric Roman21b39232019-06-28 21:28:212186 EXPECT_EQ(resolver_proc->GetTotalAttemptsResolved(), kTotalAttempts);
2187}
2188
2189// Regression test for https://crbug.com/976948.
2190//
2191// Tests that when the maximum number of retries is set to
2192// |HostResolver::ManagerOptions::kDefaultRetryAttempts| the
2193// number of retries used is 4 rather than something higher.
2194TEST_F(HostResolverManagerTest, DefaultMaxRetryAttempts) {
2195 auto test_task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
2196 base::ScopedClosureRunner task_runner_override_scoped_cleanup =
2197 base::ThreadTaskRunnerHandle::OverrideForTesting(test_task_runner);
2198
2199 // Instantiate a ResolverProc that will block all incoming requests.
2200 auto resolver_proc = base::MakeRefCounted<LookupAttemptHostResolverProc>(
2201 nullptr, std::numeric_limits<size_t>::max(),
2202 std::numeric_limits<size_t>::max());
2203
2204 // This corresponds to kDefaultMaxRetryAttempts in
2205 // ProcTaskParams::ProcTaskParams(). The correspondence is verified below,
2206 // since that symbol is not exported.
2207 const size_t expected_max_retries = 4;
2208
2209 // Use the special value |ManagerOptions::kDefaultRetryAttempts|, which is
2210 // expected to translate into |expected_num_retries|.
2211 ASSERT_NE(HostResolver::ManagerOptions::kDefaultRetryAttempts,
2212 expected_max_retries);
2213 ProcTaskParams params(resolver_proc.get(),
2214 HostResolver::ManagerOptions::kDefaultRetryAttempts);
2215 ASSERT_EQ(params.max_retry_attempts, expected_max_retries);
2216
2217 CreateResolverWithLimitsAndParams(kMaxJobs, params,
2218 false /* ipv6_reachable */,
2219 false /* check_ipv6_on_wifi */);
2220
2221 // Resolve "host1". The resolver proc will hang all requests so this
2222 // resolution should remain stalled until calling SetResolvedAttemptNumber().
2223 ResolveHostResponseHelper response(resolver_->CreateRequest(
2224 HostPortPair("host1", 70), NetLogWithSource(), base::nullopt,
2225 request_context_.get(), host_cache_.get()));
2226 EXPECT_FALSE(response.complete());
2227
2228 // Simulate running the main thread (network task runner) for a long
2229 // time. Because none of the attempts posted to worker pool can complete, this
2230 // should cause all of the retry attempts to get posted, according to the
2231 // exponential backoff schedule.
2232 test_task_runner->FastForwardBy(base::TimeDelta::FromMinutes(20));
2233
2234 // Unblock the resolver proc, then wait for all the worker pool and main
2235 // thread tasks to complete. Note that the call to SetResolvedAttemptNumber(1)
2236 // will cause all the blocked resolver procs tasks fail with -2.
2237 resolver_proc->SetResolvedAttemptNumber(1);
2238 const int kExpectedError = -2;
2239 base::ThreadPoolInstance::Get()->FlushForTesting();
2240 test_task_runner->RunUntilIdle();
2241
2242 ASSERT_TRUE(response.complete());
2243 EXPECT_EQ(kExpectedError, response.result_error());
2244
2245 // Ensure that the original attempt was executed on the worker pool, as well
2246 // as the maximum number of allowed retries, and no more.
2247 EXPECT_EQ(static_cast<int>(expected_max_retries + 1),
2248 resolver_proc->GetTotalAttemptsResolved());
Eric Orth70992982018-07-24 00:25:002249}
2250
eroman91dd3602015-03-26 03:46:332251// If a host resolves to a list that includes 127.0.53.53, this is treated as
2252// an error. 127.0.53.53 is a localhost address, however it has been given a
eroman1efc237c2016-12-14 00:00:452253// special significance by ICANN to help surface name collision resulting from
eroman91dd3602015-03-26 03:46:332254// the new gTLDs.
Eric Orth960e7062019-03-08 18:43:542255TEST_F(HostResolverManagerTest, NameCollisionIcann) {
eroman91dd3602015-03-26 03:46:332256 proc_->AddRuleForAllFamilies("single", "127.0.53.53");
2257 proc_->AddRuleForAllFamilies("multiple", "127.0.0.1,127.0.53.53");
2258 proc_->AddRuleForAllFamilies("ipv6", "::127.0.53.53");
2259 proc_->AddRuleForAllFamilies("not_reserved1", "53.53.0.127");
2260 proc_->AddRuleForAllFamilies("not_reserved2", "127.0.53.54");
2261 proc_->AddRuleForAllFamilies("not_reserved3", "10.0.53.53");
2262 proc_->SignalMultiple(6u);
2263
Eric Orth117e1992019-04-17 00:24:152264 ResolveHostResponseHelper single_response(resolver_->CreateRequest(
2265 HostPortPair("single", 80), NetLogWithSource(), base::nullopt,
2266 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:002267 EXPECT_THAT(single_response.result_error(),
2268 IsError(ERR_ICANN_NAME_COLLISION));
2269 EXPECT_FALSE(single_response.request()->GetAddressResults());
2270
2271 // ERR_ICANN_NAME_COLLISION is cached like any other error, using a fixed TTL
2272 // for failed entries from proc-based resolver. That said, the fixed TTL is 0,
2273 // so it should never be cached.
dalyk48b20a992019-02-25 16:10:262274 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result =
2275 GetCacheHit(HostCache::Key("single", DnsQueryType::UNSPECIFIED,
2276 0 /* host_resolver_flags */,
2277 HostResolverSource::ANY));
2278 EXPECT_FALSE(cache_result);
Eric Orth70992982018-07-24 00:25:002279
Eric Orth117e1992019-04-17 00:24:152280 ResolveHostResponseHelper multiple_response(resolver_->CreateRequest(
2281 HostPortPair("multiple", 80), NetLogWithSource(), base::nullopt,
2282 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:002283 EXPECT_THAT(multiple_response.result_error(),
2284 IsError(ERR_ICANN_NAME_COLLISION));
2285
2286 // Resolving an IP literal of 127.0.53.53 however is allowed.
2287 ResolveHostResponseHelper literal_response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272288 HostPortPair("127.0.53.53", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:152289 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:002290 EXPECT_THAT(literal_response.result_error(), IsOk());
2291
2292 // Moreover the address should not be recognized when embedded in an IPv6
2293 // address.
2294 ResolveHostResponseHelper ipv6_response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272295 HostPortPair("127.0.53.53", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:152296 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:002297 EXPECT_THAT(ipv6_response.result_error(), IsOk());
2298
2299 // Try some other IPs which are similar, but NOT an exact match on
2300 // 127.0.53.53.
2301 ResolveHostResponseHelper similar_response1(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272302 HostPortPair("not_reserved1", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:152303 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:002304 EXPECT_THAT(similar_response1.result_error(), IsOk());
2305
2306 ResolveHostResponseHelper similar_response2(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272307 HostPortPair("not_reserved2", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:152308 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:002309 EXPECT_THAT(similar_response2.result_error(), IsOk());
2310
2311 ResolveHostResponseHelper similar_response3(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272312 HostPortPair("not_reserved3", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:152313 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:002314 EXPECT_THAT(similar_response3.result_error(), IsOk());
2315}
2316
Eric Orth960e7062019-03-08 18:43:542317TEST_F(HostResolverManagerTest, IsIPv6Reachable) {
2318 // The real HostResolverManager is needed since TestHostResolverManager will
cbentzel1906f872015-06-05 16:25:252319 // bypass the IPv6 reachability tests.
Eric Orth37b18192019-04-22 19:09:282320 DestroyResolver();
2321 host_cache_ = nullptr;
2322 resolver_ = std::make_unique<HostResolverManager>(DefaultOptions(), nullptr);
cbentzel1906f872015-06-05 16:25:252323
sergeyub8cdc212015-05-14 18:50:372324 // Verify that two consecutive calls return the same value.
tfarina42834112016-09-22 13:38:202325 TestNetLog test_net_log;
2326 NetLogWithSource net_log =
2327 NetLogWithSource::Make(&test_net_log, NetLogSourceType::NONE);
2328 bool result1 = IsIPv6Reachable(net_log);
2329 bool result2 = IsIPv6Reachable(net_log);
sergeyub8cdc212015-05-14 18:50:372330 EXPECT_EQ(result1, result2);
2331
2332 // Filter reachability check events and verify that there are two of them.
Eric Roman79cc7552019-07-19 02:17:542333 auto probe_event_list = test_net_log.GetEntriesWithType(
2334 NetLogEventType::HOST_RESOLVER_IMPL_IPV6_REACHABILITY_CHECK);
sergeyub8cdc212015-05-14 18:50:372335 ASSERT_EQ(2U, probe_event_list.size());
2336
2337 // Verify that the first request was not cached and the second one was.
Eric Roman79cc7552019-07-19 02:17:542338 EXPECT_FALSE(GetBooleanValueFromParams(probe_event_list[0], "cached"));
2339 EXPECT_TRUE(GetBooleanValueFromParams(probe_event_list[1], "cached"));
sergeyub8cdc212015-05-14 18:50:372340}
2341
Eric Orth960e7062019-03-08 18:43:542342TEST_F(HostResolverManagerTest, IncludeCanonicalName) {
Eric Orth322af3e42018-08-20 18:12:592343 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42",
2344 HOST_RESOLVER_CANONNAME, "canon.name");
2345 proc_->SignalMultiple(2u);
2346
2347 HostResolver::ResolveHostParameters parameters;
2348 parameters.include_canonical_name = true;
2349 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272350 HostPortPair("just.testing", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:152351 request_context_.get(), host_cache_.get()));
Eric Orth322af3e42018-08-20 18:12:592352 ResolveHostResponseHelper response_no_flag(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272353 HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:152354 request_context_.get(), host_cache_.get()));
Eric Orth322af3e42018-08-20 18:12:592355
2356 EXPECT_THAT(response.result_error(), IsOk());
2357 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
2358 testing::ElementsAre(CreateExpected("192.168.1.42", 80)));
2359 EXPECT_EQ("canon.name",
2360 response.request()->GetAddressResults().value().canonical_name());
2361
2362 EXPECT_THAT(response_no_flag.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
2363}
2364
Eric Orth960e7062019-03-08 18:43:542365TEST_F(HostResolverManagerTest, LoopbackOnly) {
Eric Orth322af3e42018-08-20 18:12:592366 proc_->AddRuleForAllFamilies("otherlocal", "127.0.0.1",
2367 HOST_RESOLVER_LOOPBACK_ONLY);
2368 proc_->SignalMultiple(2u);
2369
2370 HostResolver::ResolveHostParameters parameters;
2371 parameters.loopback_only = true;
2372 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272373 HostPortPair("otherlocal", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:152374 request_context_.get(), host_cache_.get()));
Eric Orth322af3e42018-08-20 18:12:592375 ResolveHostResponseHelper response_no_flag(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272376 HostPortPair("otherlocal", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:152377 request_context_.get(), host_cache_.get()));
Eric Orth322af3e42018-08-20 18:12:592378
2379 EXPECT_THAT(response.result_error(), IsOk());
2380 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
2381 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
2382
2383 EXPECT_THAT(response_no_flag.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
2384}
2385
Eric Orth960e7062019-03-08 18:43:542386TEST_F(HostResolverManagerTest, IsSpeculative) {
Eric Orthb30bc172018-08-17 21:09:572387 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42");
2388 proc_->SignalMultiple(1u);
2389
2390 HostResolver::ResolveHostParameters parameters;
2391 parameters.is_speculative = true;
2392
2393 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272394 HostPortPair("just.testing", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:152395 request_context_.get(), host_cache_.get()));
Eric Orthb30bc172018-08-17 21:09:572396
2397 EXPECT_THAT(response.result_error(), IsOk());
2398 EXPECT_FALSE(response.request()->GetAddressResults());
2399
2400 ASSERT_EQ(1u, proc_->GetCaptureList().size());
2401 EXPECT_EQ("just.testing", proc_->GetCaptureList()[0].hostname);
2402
2403 // Reresolve without the |is_speculative| flag should immediately return from
2404 // cache.
2405 ResolveHostResponseHelper response2(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272406 HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:152407 request_context_.get(), host_cache_.get()));
Eric Orthb30bc172018-08-17 21:09:572408
2409 EXPECT_THAT(response2.result_error(), IsOk());
2410 EXPECT_THAT(response2.request()->GetAddressResults().value().endpoints(),
2411 testing::ElementsAre(CreateExpected("192.168.1.42", 80)));
2412
2413 EXPECT_EQ("just.testing", proc_->GetCaptureList()[0].hostname);
2414 EXPECT_EQ(1u, proc_->GetCaptureList().size()); // No increase.
2415}
2416
Eric Orth9871aafa2018-10-02 19:59:182417#if BUILDFLAG(ENABLE_MDNS)
2418const uint8_t kMdnsResponseA[] = {
2419 // Header
2420 0x00, 0x00, // ID is zeroed out
2421 0x81, 0x80, // Standard query response, RA, no error
2422 0x00, 0x00, // No questions (for simplicity)
2423 0x00, 0x01, // 1 RR (answers)
2424 0x00, 0x00, // 0 authority RRs
2425 0x00, 0x00, // 0 additional RRs
2426
2427 // "myhello.local."
2428 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2429 0x00,
2430
2431 0x00, 0x01, // TYPE is A.
2432 0x00, 0x01, // CLASS is IN.
2433 0x00, 0x00, 0x00, 0x10, // TTL is 16 (seconds)
2434 0x00, 0x04, // RDLENGTH is 4 bytes.
2435 0x01, 0x02, 0x03, 0x04, // 1.2.3.4
2436};
2437
Eric Orth026776a2019-01-18 00:13:282438const uint8_t kMdnsResponseA2[] = {
2439 // Header
2440 0x00, 0x00, // ID is zeroed out
2441 0x81, 0x80, // Standard query response, RA, no error
2442 0x00, 0x00, // No questions (for simplicity)
2443 0x00, 0x01, // 1 RR (answers)
2444 0x00, 0x00, // 0 authority RRs
2445 0x00, 0x00, // 0 additional RRs
2446
2447 // "myhello.local."
2448 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2449 0x00,
2450
2451 0x00, 0x01, // TYPE is A.
2452 0x00, 0x01, // CLASS is IN.
2453 0x00, 0x00, 0x00, 0x10, // TTL is 16 (seconds)
2454 0x00, 0x04, // RDLENGTH is 4 bytes.
2455 0x05, 0x06, 0x07, 0x08, // 5.6.7.8
2456};
2457
2458const uint8_t kMdnsResponseA2Goodbye[] = {
2459 // Header
2460 0x00, 0x00, // ID is zeroed out
2461 0x81, 0x80, // Standard query response, RA, no error
2462 0x00, 0x00, // No questions (for simplicity)
2463 0x00, 0x01, // 1 RR (answers)
2464 0x00, 0x00, // 0 authority RRs
2465 0x00, 0x00, // 0 additional RRs
2466
2467 // "myhello.local."
2468 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2469 0x00,
2470
2471 0x00, 0x01, // TYPE is A.
2472 0x00, 0x01, // CLASS is IN.
2473 0x00, 0x00, 0x00, 0x00, // TTL is 0 (signaling "goodbye" removal of result)
2474 0x00, 0x04, // RDLENGTH is 4 bytes.
2475 0x05, 0x06, 0x07, 0x08, // 5.6.7.8
2476};
2477
Eric Orth9871aafa2018-10-02 19:59:182478const uint8_t kMdnsResponseAAAA[] = {
2479 // Header
2480 0x00, 0x00, // ID is zeroed out
2481 0x81, 0x80, // Standard query response, RA, no error
2482 0x00, 0x00, // No questions (for simplicity)
2483 0x00, 0x01, // 1 RR (answers)
2484 0x00, 0x00, // 0 authority RRs
2485 0x00, 0x00, // 0 additional RRs
2486
2487 // "myhello.local."
2488 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2489 0x00,
2490
2491 0x00, 0x1C, // TYPE is AAAA.
2492 0x00, 0x01, // CLASS is IN.
2493 0x00, 0x00, 0x00, 0x10, // TTL is 16 (seconds)
2494 0x00, 0x10, // RDLENGTH is 16 bytes.
2495
2496 // 000a:0000:0000:0000:0001:0002:0003:0004
2497 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02,
Eric Orth960e7062019-03-08 18:43:542498 0x00, 0x03, 0x00, 0x04};
Eric Orth9871aafa2018-10-02 19:59:182499
2500// An MDNS response indicating that the responder owns the hostname, but the
2501// specific requested type (AAAA) does not exist because the responder only has
2502// A addresses.
2503const uint8_t kMdnsResponseNsec[] = {
2504 // Header
2505 0x00, 0x00, // ID is zeroed out
2506 0x81, 0x80, // Standard query response, RA, no error
2507 0x00, 0x00, // No questions (for simplicity)
2508 0x00, 0x01, // 1 RR (answers)
2509 0x00, 0x00, // 0 authority RRs
2510 0x00, 0x00, // 0 additional RRs
2511
2512 // "myhello.local."
2513 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2514 0x00,
2515
2516 0x00, 0x2f, // TYPE is NSEC.
2517 0x00, 0x01, // CLASS is IN.
2518 0x00, 0x00, 0x00, 0x10, // TTL is 16 (seconds)
2519 0x00, 0x06, // RDLENGTH is 6 bytes.
2520 0xc0, 0x0c, // Next Domain Name (always pointer back to name in MDNS)
2521 0x00, // Bitmap block number (always 0 in MDNS)
2522 0x02, // Bitmap length is 2
2523 0x00, 0x08 // A type only
2524};
2525
Eric Orth828bd3ae2018-12-12 17:30:362526const uint8_t kMdnsResponseTxt[] = {
2527 // Header
2528 0x00, 0x00, // ID is zeroed out
2529 0x81, 0x80, // Standard query response, RA, no error
2530 0x00, 0x00, // No questions (for simplicity)
2531 0x00, 0x01, // 1 RR (answers)
2532 0x00, 0x00, // 0 authority RRs
2533 0x00, 0x00, // 0 additional RRs
2534
2535 // "myhello.local."
2536 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2537 0x00,
2538
2539 0x00, 0x10, // TYPE is TXT.
2540 0x00, 0x01, // CLASS is IN.
2541 0x00, 0x00, 0x00, 0x11, // TTL is 17 (seconds)
2542 0x00, 0x08, // RDLENGTH is 8 bytes.
2543
2544 // "foo"
2545 0x03, 0x66, 0x6f, 0x6f,
2546 // "bar"
Eric Orth960e7062019-03-08 18:43:542547 0x03, 0x62, 0x61, 0x72};
Eric Orth828bd3ae2018-12-12 17:30:362548
Eric Orthe9db8d232019-01-14 21:24:452549const uint8_t kMdnsResponsePtr[] = {
2550 // Header
2551 0x00, 0x00, // ID is zeroed out
2552 0x81, 0x80, // Standard query response, RA, no error
2553 0x00, 0x00, // No questions (for simplicity)
2554 0x00, 0x01, // 1 RR (answers)
2555 0x00, 0x00, // 0 authority RRs
2556 0x00, 0x00, // 0 additional RRs
2557
2558 // "myhello.local."
2559 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2560 0x00,
2561
2562 0x00, 0x0c, // TYPE is PTR.
2563 0x00, 0x01, // CLASS is IN.
2564 0x00, 0x00, 0x00, 0x12, // TTL is 18 (seconds)
2565 0x00, 0x09, // RDLENGTH is 9 bytes.
2566
2567 // "foo.com."
2568 0x03, 'f', 'o', 'o', 0x03, 'c', 'o', 'm', 0x00};
2569
Eric Orth026776a2019-01-18 00:13:282570const uint8_t kMdnsResponsePtrRoot[] = {
2571 // Header
2572 0x00, 0x00, // ID is zeroed out
2573 0x81, 0x80, // Standard query response, RA, no error
2574 0x00, 0x00, // No questions (for simplicity)
2575 0x00, 0x01, // 1 RR (answers)
2576 0x00, 0x00, // 0 authority RRs
2577 0x00, 0x00, // 0 additional RRs
2578
2579 // "myhello.local."
2580 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2581 0x00,
2582
2583 0x00, 0x0c, // TYPE is PTR.
2584 0x00, 0x01, // CLASS is IN.
2585 0x00, 0x00, 0x00, 0x13, // TTL is 19 (seconds)
2586 0x00, 0x01, // RDLENGTH is 1 byte.
2587
2588 // "." (the root domain)
2589 0x00};
2590
Eric Ortha625b042019-01-16 01:14:452591const uint8_t kMdnsResponseSrv[] = {
2592 // Header
2593 0x00, 0x00, // ID is zeroed out
2594 0x81, 0x80, // Standard query response, RA, no error
2595 0x00, 0x00, // No questions (for simplicity)
2596 0x00, 0x01, // 1 RR (answers)
2597 0x00, 0x00, // 0 authority RRs
2598 0x00, 0x00, // 0 additional RRs
2599
2600 // "myhello.local."
2601 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2602 0x00,
2603
2604 0x00, 0x21, // TYPE is SRV.
2605 0x00, 0x01, // CLASS is IN.
2606 0x00, 0x00, 0x00, 0x13, // TTL is 19 (seconds)
2607 0x00, 0x0f, // RDLENGTH is 15 bytes.
2608
2609 0x00, 0x05, // Priority 5
2610 0x00, 0x01, // Weight 1
2611 0x20, 0x49, // Port 8265
2612
2613 // "foo.com."
2614 0x03, 'f', 'o', 'o', 0x03, 'c', 'o', 'm', 0x00};
2615
Bailey Berroe70f06c2019-03-11 22:22:462616const uint8_t kMdnsResponseSrvUnrestricted[] = {
2617 // Header
2618 0x00, 0x00, // ID is zeroed out
2619 0x81, 0x80, // Standard query response, RA, no error
2620 0x00, 0x00, // No questions (for simplicity)
2621 0x00, 0x01, // 1 RR (answers)
2622 0x00, 0x00, // 0 authority RRs
2623 0x00, 0x00, // 0 additional RRs
2624
2625 // "foo bar(A1B2)._ipps._tcp.local"
2626 0x0d, 'f', 'o', 'o', ' ', 'b', 'a', 'r', '(', 'A', '1', 'B', '2', ')', 0x05,
2627 '_', 'i', 'p', 'p', 's', 0x04, '_', 't', 'c', 'p', 0x05, 'l', 'o', 'c', 'a',
2628 'l', 0x00,
2629
2630 0x00, 0x21, // TYPE is SRV.
2631 0x00, 0x01, // CLASS is IN.
2632 0x00, 0x00, 0x00, 0x13, // TTL is 19 (seconds)
2633 0x00, 0x0f, // RDLENGTH is 15 bytes.
2634
2635 0x00, 0x05, // Priority 5
2636 0x00, 0x01, // Weight 1
2637 0x20, 0x49, // Port 8265
2638
2639 // "foo.com."
2640 0x03, 'f', 'o', 'o', 0x03, 'c', 'o', 'm', 0x00};
2641
2642const uint8_t kMdnsResponseSrvUnrestrictedResult[] = {
2643 // Header
2644 0x00, 0x00, // ID is zeroed out
2645 0x81, 0x80, // Standard query response, RA, no error
2646 0x00, 0x00, // No questions (for simplicity)
2647 0x00, 0x01, // 1 RR (answers)
2648 0x00, 0x00, // 0 authority RRs
2649 0x00, 0x00, // 0 additional RRs
2650
2651 // "myhello.local."
2652 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2653 0x00,
2654
2655 0x00, 0x21, // TYPE is SRV.
2656 0x00, 0x01, // CLASS is IN.
2657 0x00, 0x00, 0x00, 0x13, // TTL is 19 (seconds)
2658 0x00, 0x15, // RDLENGTH is 21 bytes.
2659
2660 0x00, 0x05, // Priority 5
2661 0x00, 0x01, // Weight 1
2662 0x20, 0x49, // Port 8265
2663
2664 // "foo bar.local"
2665 0x07, 'f', 'o', 'o', ' ', 'b', 'a', 'r', 0x05, 'l', 'o', 'c', 'a', 'l',
2666 0x00};
2667
Eric Orth960e7062019-03-08 18:43:542668TEST_F(HostResolverManagerTest, Mdns) {
Eric Orth9871aafa2018-10-02 19:59:182669 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2670 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2671 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2672 // 2 socket creations for every transaction.
2673 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(4);
2674
2675 HostResolver::ResolveHostParameters parameters;
2676 parameters.source = HostResolverSource::MULTICAST_DNS;
2677
2678 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272679 HostPortPair("myhello.local", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:152680 request_context_.get(), host_cache_.get()));
Eric Orth9871aafa2018-10-02 19:59:182681
2682 socket_factory_ptr->SimulateReceive(kMdnsResponseA, sizeof(kMdnsResponseA));
2683 socket_factory_ptr->SimulateReceive(kMdnsResponseAAAA,
2684 sizeof(kMdnsResponseAAAA));
2685
2686 EXPECT_THAT(response.result_error(), IsOk());
2687 EXPECT_THAT(
2688 response.request()->GetAddressResults().value().endpoints(),
2689 testing::UnorderedElementsAre(
2690 CreateExpected("1.2.3.4", 80),
2691 CreateExpected("000a:0000:0000:0000:0001:0002:0003:0004", 80)));
Eric Orth828bd3ae2018-12-12 17:30:362692 EXPECT_FALSE(response.request()->GetTextResults());
2693 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth9871aafa2018-10-02 19:59:182694}
2695
Eric Orth960e7062019-03-08 18:43:542696TEST_F(HostResolverManagerTest, Mdns_AaaaOnly) {
Eric Orth9871aafa2018-10-02 19:59:182697 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2698 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2699 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2700 // 2 socket creations for every transaction.
2701 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(2);
2702
2703 HostResolver::ResolveHostParameters parameters;
Eric Orth192e3bb2018-11-14 19:30:322704 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth9871aafa2018-10-02 19:59:182705 parameters.source = HostResolverSource::MULTICAST_DNS;
2706
2707 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272708 HostPortPair("myhello.local", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:152709 request_context_.get(), host_cache_.get()));
Eric Orth9871aafa2018-10-02 19:59:182710
2711 socket_factory_ptr->SimulateReceive(kMdnsResponseAAAA,
2712 sizeof(kMdnsResponseAAAA));
2713
2714 EXPECT_THAT(response.result_error(), IsOk());
2715 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
2716 testing::ElementsAre(CreateExpected(
2717 "000a:0000:0000:0000:0001:0002:0003:0004", 80)));
2718}
2719
Eric Orth960e7062019-03-08 18:43:542720TEST_F(HostResolverManagerTest, Mdns_Txt) {
Eric Orth828bd3ae2018-12-12 17:30:362721 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2722 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2723 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2724 // 2 socket creations for every transaction.
2725 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(2);
2726
2727 HostResolver::ResolveHostParameters parameters;
2728 parameters.dns_query_type = DnsQueryType::TXT;
2729 parameters.source = HostResolverSource::MULTICAST_DNS;
2730
2731 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272732 HostPortPair("myhello.local", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:152733 request_context_.get(), host_cache_.get()));
Eric Orth828bd3ae2018-12-12 17:30:362734
2735 socket_factory_ptr->SimulateReceive(kMdnsResponseTxt,
2736 sizeof(kMdnsResponseTxt));
2737
2738 EXPECT_THAT(response.result_error(), IsOk());
2739 EXPECT_FALSE(response.request()->GetAddressResults());
2740 EXPECT_THAT(response.request()->GetTextResults(),
2741 testing::Optional(testing::ElementsAre("foo", "bar")));
2742 EXPECT_FALSE(response.request()->GetHostnameResults());
2743}
2744
Eric Orth960e7062019-03-08 18:43:542745TEST_F(HostResolverManagerTest, Mdns_Ptr) {
Eric Orthe9db8d232019-01-14 21:24:452746 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2747 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2748 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2749 // 2 socket creations for every transaction.
2750 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(2);
2751
2752 HostResolver::ResolveHostParameters parameters;
2753 parameters.dns_query_type = DnsQueryType::PTR;
2754 parameters.source = HostResolverSource::MULTICAST_DNS;
2755
2756 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272757 HostPortPair("myhello.local", 83), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:152758 request_context_.get(), host_cache_.get()));
Eric Orthe9db8d232019-01-14 21:24:452759
2760 socket_factory_ptr->SimulateReceive(kMdnsResponsePtr,
2761 sizeof(kMdnsResponsePtr));
2762
2763 EXPECT_THAT(response.result_error(), IsOk());
2764 EXPECT_FALSE(response.request()->GetAddressResults());
2765 EXPECT_FALSE(response.request()->GetTextResults());
2766 EXPECT_THAT(
2767 response.request()->GetHostnameResults(),
2768 testing::Optional(testing::ElementsAre(HostPortPair("foo.com", 83))));
2769}
2770
Eric Orth960e7062019-03-08 18:43:542771TEST_F(HostResolverManagerTest, Mdns_Srv) {
Eric Ortha625b042019-01-16 01:14:452772 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2773 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2774 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2775 // 2 socket creations for every transaction.
2776 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(2);
2777
2778 HostResolver::ResolveHostParameters parameters;
2779 parameters.dns_query_type = DnsQueryType::SRV;
2780 parameters.source = HostResolverSource::MULTICAST_DNS;
2781
2782 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272783 HostPortPair("myhello.local", 83), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:152784 request_context_.get(), host_cache_.get()));
Eric Ortha625b042019-01-16 01:14:452785
2786 socket_factory_ptr->SimulateReceive(kMdnsResponseSrv,
2787 sizeof(kMdnsResponseSrv));
2788
2789 EXPECT_THAT(response.result_error(), IsOk());
2790 EXPECT_FALSE(response.request()->GetAddressResults());
2791 EXPECT_FALSE(response.request()->GetTextResults());
2792 EXPECT_THAT(
2793 response.request()->GetHostnameResults(),
2794 testing::Optional(testing::ElementsAre(HostPortPair("foo.com", 8265))));
2795}
2796
Bailey Berroe70f06c2019-03-11 22:22:462797// Test that we are able to create multicast DNS requests that contain
2798// characters not permitted in the DNS spec such as spaces and parenthesis.
2799TEST_F(HostResolverManagerTest, Mdns_Srv_Unrestricted) {
2800 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2801 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2802 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2803
2804 HostResolver::ResolveHostParameters parameters;
2805 parameters.dns_query_type = DnsQueryType::SRV;
2806 parameters.source = HostResolverSource::MULTICAST_DNS;
2807
2808 ResolveHostResponseHelper response(resolver_->CreateRequest(
2809 HostPortPair("foo bar(A1B2)._ipps._tcp.local", 83), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:152810 parameters, request_context_.get(), host_cache_.get()));
Bailey Berroe70f06c2019-03-11 22:22:462811
2812 socket_factory_ptr->SimulateReceive(kMdnsResponseSrvUnrestricted,
2813 sizeof(kMdnsResponseSrvUnrestricted));
2814
2815 EXPECT_THAT(response.result_error(), IsOk());
2816 EXPECT_FALSE(response.request()->GetAddressResults());
2817 EXPECT_FALSE(response.request()->GetTextResults());
2818 EXPECT_THAT(
2819 response.request()->GetHostnameResults(),
2820 testing::Optional(testing::ElementsAre(HostPortPair("foo.com", 8265))));
2821}
2822
2823// Test that we are able to create multicast DNS requests that contain
2824// characters not permitted in the DNS spec such as spaces and parenthesis.
2825TEST_F(HostResolverManagerTest, Mdns_Srv_Result_Unrestricted) {
2826 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2827 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2828 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2829
2830 HostResolver::ResolveHostParameters parameters;
2831 parameters.dns_query_type = DnsQueryType::SRV;
2832 parameters.source = HostResolverSource::MULTICAST_DNS;
2833
2834 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272835 HostPortPair("myhello.local", 83), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:152836 request_context_.get(), host_cache_.get()));
Bailey Berroe70f06c2019-03-11 22:22:462837
2838 socket_factory_ptr->SimulateReceive(
2839 kMdnsResponseSrvUnrestrictedResult,
2840 sizeof(kMdnsResponseSrvUnrestrictedResult));
2841
2842 EXPECT_THAT(response.result_error(), IsOk());
2843 EXPECT_FALSE(response.request()->GetAddressResults());
2844 EXPECT_FALSE(response.request()->GetTextResults());
2845 EXPECT_THAT(response.request()->GetHostnameResults(),
2846 testing::Optional(
2847 testing::ElementsAre(HostPortPair("foo bar.local", 8265))));
2848}
2849
Eric Orth9871aafa2018-10-02 19:59:182850// Test multicast DNS handling of NSEC responses (used for explicit negative
2851// response).
Eric Orth960e7062019-03-08 18:43:542852TEST_F(HostResolverManagerTest, Mdns_Nsec) {
Eric Orth9871aafa2018-10-02 19:59:182853 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2854 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2855 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2856 // 2 socket creations for every transaction.
2857 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(2);
2858
2859 HostResolver::ResolveHostParameters parameters;
Eric Orth192e3bb2018-11-14 19:30:322860 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth9871aafa2018-10-02 19:59:182861 parameters.source = HostResolverSource::MULTICAST_DNS;
2862
2863 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272864 HostPortPair("myhello.local", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:152865 request_context_.get(), host_cache_.get()));
Eric Orth9871aafa2018-10-02 19:59:182866
2867 socket_factory_ptr->SimulateReceive(kMdnsResponseNsec,
2868 sizeof(kMdnsResponseNsec));
2869
2870 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
2871 EXPECT_FALSE(response.request()->GetAddressResults());
2872}
2873
Eric Orth960e7062019-03-08 18:43:542874TEST_F(HostResolverManagerTest, Mdns_NoResponse) {
Eric Orth9871aafa2018-10-02 19:59:182875 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2876 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2877 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2878 // 2 socket creations for every transaction.
2879 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(4);
2880
2881 // Add a little bit of extra fudge to the delay to allow reasonable
2882 // flexibility for time > vs >= etc. We don't need to fail the test if we
2883 // timeout at t=6001 instead of t=6000.
2884 base::TimeDelta kSleepFudgeFactor = base::TimeDelta::FromMilliseconds(1);
2885
2886 // Override the current thread task runner, so we can simulate the passage of
2887 // time to trigger the timeout.
2888 auto test_task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
2889 base::ScopedClosureRunner task_runner_override_scoped_cleanup =
2890 base::ThreadTaskRunnerHandle::OverrideForTesting(test_task_runner);
2891
2892 HostResolver::ResolveHostParameters parameters;
2893 parameters.source = HostResolverSource::MULTICAST_DNS;
2894
2895 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272896 HostPortPair("myhello.local", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:152897 request_context_.get(), host_cache_.get()));
Eric Orth9871aafa2018-10-02 19:59:182898
2899 ASSERT_TRUE(test_task_runner->HasPendingTask());
2900 test_task_runner->FastForwardBy(MDnsTransaction::kTransactionTimeout +
2901 kSleepFudgeFactor);
2902
2903 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
2904 EXPECT_FALSE(response.request()->GetAddressResults());
Eric Orth828bd3ae2018-12-12 17:30:362905 EXPECT_FALSE(response.request()->GetTextResults());
2906 EXPECT_FALSE(response.request()->GetHostnameResults());
2907
2908 test_task_runner->FastForwardUntilNoTasksRemain();
2909}
2910
Eric Orth960e7062019-03-08 18:43:542911TEST_F(HostResolverManagerTest, Mdns_WrongType) {
Eric Orth828bd3ae2018-12-12 17:30:362912 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2913 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2914 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2915 // 2 socket creations for every transaction.
2916 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(2);
2917
2918 // Add a little bit of extra fudge to the delay to allow reasonable
2919 // flexibility for time > vs >= etc. We don't need to fail the test if we
2920 // timeout at t=6001 instead of t=6000.
2921 base::TimeDelta kSleepFudgeFactor = base::TimeDelta::FromMilliseconds(1);
2922
2923 // Override the current thread task runner, so we can simulate the passage of
2924 // time to trigger the timeout.
2925 auto test_task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
2926 base::ScopedClosureRunner task_runner_override_scoped_cleanup =
2927 base::ThreadTaskRunnerHandle::OverrideForTesting(test_task_runner);
2928
2929 HostResolver::ResolveHostParameters parameters;
2930 parameters.dns_query_type = DnsQueryType::A;
2931 parameters.source = HostResolverSource::MULTICAST_DNS;
2932
2933 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272934 HostPortPair("myhello.local", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:152935 request_context_.get(), host_cache_.get()));
Eric Orth828bd3ae2018-12-12 17:30:362936
2937 // Not the requested type. Should be ignored.
2938 socket_factory_ptr->SimulateReceive(kMdnsResponseTxt,
2939 sizeof(kMdnsResponseTxt));
2940
2941 ASSERT_TRUE(test_task_runner->HasPendingTask());
2942 test_task_runner->FastForwardBy(MDnsTransaction::kTransactionTimeout +
2943 kSleepFudgeFactor);
2944
2945 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
2946 EXPECT_FALSE(response.request()->GetAddressResults());
2947 EXPECT_FALSE(response.request()->GetTextResults());
2948 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth9871aafa2018-10-02 19:59:182949
2950 test_task_runner->FastForwardUntilNoTasksRemain();
2951}
2952
2953// Test for a request for both A and AAAA results where results only exist for
2954// one type.
Eric Orth960e7062019-03-08 18:43:542955TEST_F(HostResolverManagerTest, Mdns_PartialResults) {
Eric Orth9871aafa2018-10-02 19:59:182956 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2957 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2958 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2959 // 2 socket creations for every transaction.
2960 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(4);
2961
2962 // Add a little bit of extra fudge to the delay to allow reasonable
2963 // flexibility for time > vs >= etc. We don't need to fail the test if we
2964 // timeout at t=6001 instead of t=6000.
2965 base::TimeDelta kSleepFudgeFactor = base::TimeDelta::FromMilliseconds(1);
2966
2967 // Override the current thread task runner, so we can simulate the passage of
2968 // time to trigger the timeout.
2969 auto test_task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
2970 base::ScopedClosureRunner task_runner_override_scoped_cleanup =
2971 base::ThreadTaskRunnerHandle::OverrideForTesting(test_task_runner);
2972
2973 HostResolver::ResolveHostParameters parameters;
2974 parameters.source = HostResolverSource::MULTICAST_DNS;
2975
2976 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272977 HostPortPair("myhello.local", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:152978 request_context_.get(), host_cache_.get()));
Eric Orth9871aafa2018-10-02 19:59:182979
2980 ASSERT_TRUE(test_task_runner->HasPendingTask());
2981
2982 socket_factory_ptr->SimulateReceive(kMdnsResponseA, sizeof(kMdnsResponseA));
2983 test_task_runner->FastForwardBy(MDnsTransaction::kTransactionTimeout +
2984 kSleepFudgeFactor);
2985
2986 EXPECT_THAT(response.result_error(), IsOk());
2987 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
2988 testing::ElementsAre(CreateExpected("1.2.3.4", 80)));
2989
2990 test_task_runner->FastForwardUntilNoTasksRemain();
2991}
2992
Eric Orth960e7062019-03-08 18:43:542993TEST_F(HostResolverManagerTest, Mdns_Cancel) {
Eric Orth9871aafa2018-10-02 19:59:182994 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2995 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2996 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2997 // 2 socket creations for every transaction.
2998 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(4);
2999
3000 HostResolver::ResolveHostParameters parameters;
3001 parameters.source = HostResolverSource::MULTICAST_DNS;
3002
3003 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:273004 HostPortPair("myhello.local", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:153005 request_context_.get(), host_cache_.get()));
Eric Orth9871aafa2018-10-02 19:59:183006
3007 response.CancelRequest();
3008
3009 socket_factory_ptr->SimulateReceive(kMdnsResponseA, sizeof(kMdnsResponseA));
3010 socket_factory_ptr->SimulateReceive(kMdnsResponseAAAA,
3011 sizeof(kMdnsResponseAAAA));
3012
3013 base::RunLoop().RunUntilIdle();
3014 EXPECT_FALSE(response.complete());
3015}
3016
3017// Test for a two-transaction query where the first fails to start. The second
3018// should be cancelled.
Eric Orth960e7062019-03-08 18:43:543019TEST_F(HostResolverManagerTest, Mdns_PartialFailure) {
Eric Orth9871aafa2018-10-02 19:59:183020 // Setup a mock MDnsClient where the first transaction will always return
3021 // |false| immediately on Start(). Second transaction may or may not be
3022 // created, but if it is, Start() not expected to be called because the
3023 // overall request should immediately fail.
3024 auto transaction1 = std::make_unique<MockMDnsTransaction>();
3025 EXPECT_CALL(*transaction1, Start()).WillOnce(Return(false));
3026 auto transaction2 = std::make_unique<MockMDnsTransaction>();
3027 EXPECT_CALL(*transaction2, Start()).Times(0);
3028
3029 auto client = std::make_unique<MockMDnsClient>();
3030 EXPECT_CALL(*client, CreateTransaction(_, _, _, _))
3031 .Times(Between(1, 2)) // Second transaction optionally created.
3032 .WillOnce(Return(ByMove(std::move(transaction1))))
3033 .WillOnce(Return(ByMove(std::move(transaction2))));
3034 EXPECT_CALL(*client, IsListening()).WillRepeatedly(Return(true));
3035 resolver_->SetMdnsClientForTesting(std::move(client));
3036
3037 HostResolver::ResolveHostParameters parameters;
3038 parameters.source = HostResolverSource::MULTICAST_DNS;
3039
3040 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:273041 HostPortPair("myhello.local", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:153042 request_context_.get(), host_cache_.get()));
Eric Orth9871aafa2018-10-02 19:59:183043
3044 EXPECT_THAT(response.result_error(), IsError(ERR_FAILED));
3045 EXPECT_FALSE(response.request()->GetAddressResults());
3046}
Eric Orth026776a2019-01-18 00:13:283047
Eric Orthe857ebb2019-03-13 23:02:073048TEST_F(HostResolverManagerTest, Mdns_ListenFailure) {
3049 // Inject an MdnsClient mock that will always fail to start listening.
3050 auto client = std::make_unique<MockMDnsClient>();
3051 EXPECT_CALL(*client, StartListening(_)).WillOnce(Return(ERR_FAILED));
3052 EXPECT_CALL(*client, IsListening()).WillRepeatedly(Return(false));
3053 resolver_->SetMdnsClientForTesting(std::move(client));
3054
3055 HostResolver::ResolveHostParameters parameters;
3056 parameters.source = HostResolverSource::MULTICAST_DNS;
3057
3058 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:273059 HostPortPair("myhello.local", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:153060 request_context_.get(), host_cache_.get()));
Eric Orthe857ebb2019-03-13 23:02:073061
3062 EXPECT_THAT(response.result_error(), IsError(ERR_FAILED));
3063 EXPECT_FALSE(response.request()->GetAddressResults());
3064}
3065
Eric Orth026776a2019-01-18 00:13:283066// Implementation of HostResolver::MdnsListenerDelegate that records all
3067// received results in maps.
3068class TestMdnsListenerDelegate : public HostResolver::MdnsListener::Delegate {
3069 public:
3070 using UpdateKey =
3071 std::pair<HostResolver::MdnsListener::Delegate::UpdateType, DnsQueryType>;
3072
3073 void OnAddressResult(
3074 HostResolver::MdnsListener::Delegate::UpdateType update_type,
3075 DnsQueryType result_type,
3076 IPEndPoint address) override {
3077 address_results_.insert({{update_type, result_type}, std::move(address)});
3078 }
3079
3080 void OnTextResult(
3081 HostResolver::MdnsListener::Delegate::UpdateType update_type,
3082 DnsQueryType result_type,
3083 std::vector<std::string> text_records) override {
3084 for (auto& text_record : text_records) {
3085 text_results_.insert(
3086 {{update_type, result_type}, std::move(text_record)});
3087 }
3088 }
3089
3090 void OnHostnameResult(
3091 HostResolver::MdnsListener::Delegate::UpdateType update_type,
3092 DnsQueryType result_type,
3093 HostPortPair host) override {
3094 hostname_results_.insert({{update_type, result_type}, std::move(host)});
3095 }
3096
3097 void OnUnhandledResult(
3098 HostResolver::MdnsListener::Delegate::UpdateType update_type,
3099 DnsQueryType result_type) override {
3100 unhandled_results_.insert({update_type, result_type});
3101 }
3102
3103 const std::multimap<UpdateKey, IPEndPoint>& address_results() {
3104 return address_results_;
3105 }
3106
3107 const std::multimap<UpdateKey, std::string>& text_results() {
3108 return text_results_;
3109 }
3110
3111 const std::multimap<UpdateKey, HostPortPair>& hostname_results() {
3112 return hostname_results_;
3113 }
3114
3115 const std::multiset<UpdateKey>& unhandled_results() {
3116 return unhandled_results_;
3117 }
3118
3119 template <typename T>
3120 static std::pair<UpdateKey, T> CreateExpectedResult(
3121 HostResolver::MdnsListener::Delegate::UpdateType update_type,
3122 DnsQueryType query_type,
3123 T result) {
3124 return std::make_pair(std::make_pair(update_type, query_type), result);
3125 }
3126
3127 private:
3128 std::multimap<UpdateKey, IPEndPoint> address_results_;
3129 std::multimap<UpdateKey, std::string> text_results_;
3130 std::multimap<UpdateKey, HostPortPair> hostname_results_;
3131 std::multiset<UpdateKey> unhandled_results_;
3132};
3133
Eric Orth960e7062019-03-08 18:43:543134TEST_F(HostResolverManagerTest, MdnsListener) {
Eric Orth026776a2019-01-18 00:13:283135 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3136 base::SimpleTestClock clock;
3137 clock.SetNow(base::Time::Now());
3138 auto cache_cleanup_timer = std::make_unique<base::MockOneShotTimer>();
3139 auto* cache_cleanup_timer_ptr = cache_cleanup_timer.get();
3140 auto mdns_client =
3141 std::make_unique<MDnsClientImpl>(&clock, std::move(cache_cleanup_timer));
Eric Orthe857ebb2019-03-13 23:02:073142 ASSERT_THAT(mdns_client->StartListening(socket_factory.get()), IsOk());
Eric Orth026776a2019-01-18 00:13:283143 resolver_->SetMdnsClientForTesting(std::move(mdns_client));
3144
3145 std::unique_ptr<HostResolver::MdnsListener> listener =
3146 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 80),
3147 DnsQueryType::A);
3148
3149 TestMdnsListenerDelegate delegate;
3150 ASSERT_THAT(listener->Start(&delegate), IsOk());
3151 ASSERT_THAT(delegate.address_results(), testing::IsEmpty());
3152
3153 socket_factory->SimulateReceive(kMdnsResponseA, sizeof(kMdnsResponseA));
3154 socket_factory->SimulateReceive(kMdnsResponseA2, sizeof(kMdnsResponseA2));
3155 socket_factory->SimulateReceive(kMdnsResponseA2Goodbye,
3156 sizeof(kMdnsResponseA2Goodbye));
3157
3158 // Per RFC6762 section 10.1, removals take effect 1 second after receiving the
3159 // goodbye message.
3160 clock.Advance(base::TimeDelta::FromSeconds(1));
3161 cache_cleanup_timer_ptr->Fire();
3162
3163 // Expect 1 record adding "1.2.3.4", another changing to "5.6.7.8", and a
3164 // final removing "5.6.7.8".
3165 EXPECT_THAT(delegate.address_results(),
3166 testing::ElementsAre(
3167 TestMdnsListenerDelegate::CreateExpectedResult(
3168 HostResolver::MdnsListener::Delegate::UpdateType::ADDED,
3169 DnsQueryType::A, CreateExpected("1.2.3.4", 80)),
3170 TestMdnsListenerDelegate::CreateExpectedResult(
3171 HostResolver::MdnsListener::Delegate::UpdateType::CHANGED,
3172 DnsQueryType::A, CreateExpected("5.6.7.8", 80)),
3173 TestMdnsListenerDelegate::CreateExpectedResult(
3174 HostResolver::MdnsListener::Delegate::UpdateType::REMOVED,
3175 DnsQueryType::A, CreateExpected("5.6.7.8", 80))));
3176
3177 EXPECT_THAT(delegate.text_results(), testing::IsEmpty());
3178 EXPECT_THAT(delegate.hostname_results(), testing::IsEmpty());
3179 EXPECT_THAT(delegate.unhandled_results(), testing::IsEmpty());
3180}
3181
Eric Orthe857ebb2019-03-13 23:02:073182TEST_F(HostResolverManagerTest, MdnsListener_StartListenFailure) {
3183 // Inject an MdnsClient mock that will always fail to start listening.
3184 auto client = std::make_unique<MockMDnsClient>();
3185 EXPECT_CALL(*client, StartListening(_)).WillOnce(Return(ERR_TIMED_OUT));
3186 EXPECT_CALL(*client, IsListening()).WillRepeatedly(Return(false));
3187 resolver_->SetMdnsClientForTesting(std::move(client));
3188
3189 std::unique_ptr<HostResolver::MdnsListener> listener =
3190 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 80),
3191 DnsQueryType::A);
3192 TestMdnsListenerDelegate delegate;
3193 EXPECT_THAT(listener->Start(&delegate), IsError(ERR_TIMED_OUT));
3194 EXPECT_THAT(delegate.address_results(), testing::IsEmpty());
3195}
3196
Eric Orth026776a2019-01-18 00:13:283197// Test that removal notifications are sent on natural expiration of MDNS
3198// records.
Eric Orth960e7062019-03-08 18:43:543199TEST_F(HostResolverManagerTest, MdnsListener_Expiration) {
Eric Orth026776a2019-01-18 00:13:283200 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3201 base::SimpleTestClock clock;
3202 clock.SetNow(base::Time::Now());
3203 auto cache_cleanup_timer = std::make_unique<base::MockOneShotTimer>();
3204 auto* cache_cleanup_timer_ptr = cache_cleanup_timer.get();
3205 auto mdns_client =
3206 std::make_unique<MDnsClientImpl>(&clock, std::move(cache_cleanup_timer));
Eric Orthe857ebb2019-03-13 23:02:073207 ASSERT_THAT(mdns_client->StartListening(socket_factory.get()), IsOk());
Eric Orth026776a2019-01-18 00:13:283208 resolver_->SetMdnsClientForTesting(std::move(mdns_client));
3209
3210 std::unique_ptr<HostResolver::MdnsListener> listener =
3211 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 100),
3212 DnsQueryType::A);
3213
3214 TestMdnsListenerDelegate delegate;
3215 ASSERT_THAT(listener->Start(&delegate), IsOk());
3216 ASSERT_THAT(delegate.address_results(), testing::IsEmpty());
3217
3218 socket_factory->SimulateReceive(kMdnsResponseA, sizeof(kMdnsResponseA));
3219
3220 EXPECT_THAT(
3221 delegate.address_results(),
3222 testing::ElementsAre(TestMdnsListenerDelegate::CreateExpectedResult(
3223 HostResolver::MdnsListener::Delegate::UpdateType::ADDED,
3224 DnsQueryType::A, CreateExpected("1.2.3.4", 100))));
3225
3226 clock.Advance(base::TimeDelta::FromSeconds(16));
3227 cache_cleanup_timer_ptr->Fire();
3228
3229 EXPECT_THAT(delegate.address_results(),
3230 testing::ElementsAre(
3231 TestMdnsListenerDelegate::CreateExpectedResult(
3232 HostResolver::MdnsListener::Delegate::UpdateType::ADDED,
3233 DnsQueryType::A, CreateExpected("1.2.3.4", 100)),
3234 TestMdnsListenerDelegate::CreateExpectedResult(
3235 HostResolver::MdnsListener::Delegate::UpdateType::REMOVED,
3236 DnsQueryType::A, CreateExpected("1.2.3.4", 100))));
3237
3238 EXPECT_THAT(delegate.text_results(), testing::IsEmpty());
3239 EXPECT_THAT(delegate.hostname_results(), testing::IsEmpty());
3240 EXPECT_THAT(delegate.unhandled_results(), testing::IsEmpty());
3241}
3242
Eric Orth960e7062019-03-08 18:43:543243TEST_F(HostResolverManagerTest, MdnsListener_Txt) {
Eric Orth026776a2019-01-18 00:13:283244 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3245 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
3246 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
3247
3248 std::unique_ptr<HostResolver::MdnsListener> listener =
3249 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 12),
3250 DnsQueryType::TXT);
3251
3252 TestMdnsListenerDelegate delegate;
3253 ASSERT_THAT(listener->Start(&delegate), IsOk());
3254 ASSERT_THAT(delegate.text_results(), testing::IsEmpty());
3255
3256 socket_factory_ptr->SimulateReceive(kMdnsResponseTxt,
3257 sizeof(kMdnsResponseTxt));
3258
3259 EXPECT_THAT(delegate.text_results(),
3260 testing::ElementsAre(
3261 TestMdnsListenerDelegate::CreateExpectedResult(
3262 HostResolver::MdnsListener::Delegate::UpdateType::ADDED,
3263 DnsQueryType::TXT, "foo"),
3264 TestMdnsListenerDelegate::CreateExpectedResult(
3265 HostResolver::MdnsListener::Delegate::UpdateType::ADDED,
3266 DnsQueryType::TXT, "bar")));
3267
3268 EXPECT_THAT(delegate.address_results(), testing::IsEmpty());
3269 EXPECT_THAT(delegate.hostname_results(), testing::IsEmpty());
3270 EXPECT_THAT(delegate.unhandled_results(), testing::IsEmpty());
3271}
3272
Eric Orth960e7062019-03-08 18:43:543273TEST_F(HostResolverManagerTest, MdnsListener_Ptr) {
Eric Orth026776a2019-01-18 00:13:283274 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3275 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
3276 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
3277
3278 std::unique_ptr<HostResolver::MdnsListener> listener =
3279 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 13),
3280 DnsQueryType::PTR);
3281
3282 TestMdnsListenerDelegate delegate;
3283 ASSERT_THAT(listener->Start(&delegate), IsOk());
3284 ASSERT_THAT(delegate.text_results(), testing::IsEmpty());
3285
3286 socket_factory_ptr->SimulateReceive(kMdnsResponsePtr,
3287 sizeof(kMdnsResponsePtr));
3288
3289 EXPECT_THAT(
3290 delegate.hostname_results(),
3291 testing::ElementsAre(TestMdnsListenerDelegate::CreateExpectedResult(
3292 HostResolver::MdnsListener::Delegate::UpdateType::ADDED,
3293 DnsQueryType::PTR, HostPortPair("foo.com", 13))));
3294
3295 EXPECT_THAT(delegate.address_results(), testing::IsEmpty());
3296 EXPECT_THAT(delegate.text_results(), testing::IsEmpty());
3297 EXPECT_THAT(delegate.unhandled_results(), testing::IsEmpty());
3298}
3299
Eric Orth960e7062019-03-08 18:43:543300TEST_F(HostResolverManagerTest, MdnsListener_Srv) {
Eric Orth026776a2019-01-18 00:13:283301 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3302 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
3303 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
3304
3305 std::unique_ptr<HostResolver::MdnsListener> listener =
3306 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 14),
3307 DnsQueryType::SRV);
3308
3309 TestMdnsListenerDelegate delegate;
3310 ASSERT_THAT(listener->Start(&delegate), IsOk());
3311 ASSERT_THAT(delegate.text_results(), testing::IsEmpty());
3312
3313 socket_factory_ptr->SimulateReceive(kMdnsResponseSrv,
3314 sizeof(kMdnsResponseSrv));
3315
3316 EXPECT_THAT(
3317 delegate.hostname_results(),
3318 testing::ElementsAre(TestMdnsListenerDelegate::CreateExpectedResult(
3319 HostResolver::MdnsListener::Delegate::UpdateType::ADDED,
3320 DnsQueryType::SRV, HostPortPair("foo.com", 8265))));
3321
3322 EXPECT_THAT(delegate.address_results(), testing::IsEmpty());
3323 EXPECT_THAT(delegate.text_results(), testing::IsEmpty());
3324 EXPECT_THAT(delegate.unhandled_results(), testing::IsEmpty());
3325}
3326
3327// Ensure query types we are not listening for do not affect MdnsListener.
Eric Orth960e7062019-03-08 18:43:543328TEST_F(HostResolverManagerTest, MdnsListener_NonListeningTypes) {
Eric Orth026776a2019-01-18 00:13:283329 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3330 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
3331 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
3332
3333 std::unique_ptr<HostResolver::MdnsListener> listener =
3334 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 41),
3335 DnsQueryType::A);
3336
3337 TestMdnsListenerDelegate delegate;
3338 ASSERT_THAT(listener->Start(&delegate), IsOk());
3339
3340 socket_factory_ptr->SimulateReceive(kMdnsResponseAAAA,
3341 sizeof(kMdnsResponseAAAA));
3342
3343 EXPECT_THAT(delegate.address_results(), testing::IsEmpty());
3344 EXPECT_THAT(delegate.text_results(), testing::IsEmpty());
3345 EXPECT_THAT(delegate.hostname_results(), testing::IsEmpty());
3346 EXPECT_THAT(delegate.unhandled_results(), testing::IsEmpty());
3347}
3348
Eric Orth960e7062019-03-08 18:43:543349TEST_F(HostResolverManagerTest, MdnsListener_RootDomain) {
Eric Orth026776a2019-01-18 00:13:283350 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3351 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
3352 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
3353
3354 std::unique_ptr<HostResolver::MdnsListener> listener =
3355 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 5),
3356 DnsQueryType::PTR);
3357
3358 TestMdnsListenerDelegate delegate;
3359 ASSERT_THAT(listener->Start(&delegate), IsOk());
3360
3361 socket_factory_ptr->SimulateReceive(kMdnsResponsePtrRoot,
3362 sizeof(kMdnsResponsePtrRoot));
3363
3364 EXPECT_THAT(delegate.unhandled_results(),
3365 testing::ElementsAre(std::make_pair(
3366 HostResolver::MdnsListener::Delegate::UpdateType::ADDED,
3367 DnsQueryType::PTR)));
3368
3369 EXPECT_THAT(delegate.address_results(), testing::IsEmpty());
3370 EXPECT_THAT(delegate.text_results(), testing::IsEmpty());
3371 EXPECT_THAT(delegate.hostname_results(), testing::IsEmpty());
3372}
Eric Orth9871aafa2018-10-02 19:59:183373#endif // BUILDFLAG(ENABLE_MDNS)
3374
[email protected]78eac2a2012-03-14 19:09:273375DnsConfig CreateValidDnsConfig() {
martijna23c8962016-03-04 18:18:513376 IPAddress dns_ip(192, 168, 1, 0);
[email protected]78eac2a2012-03-14 19:09:273377 DnsConfig config;
[email protected]38b50d92012-04-19 21:07:523378 config.nameservers.push_back(IPEndPoint(dns_ip, dns_protocol::kDefaultPort));
dalyk4f4ac712019-05-31 16:33:133379 config.dns_over_https_servers.push_back({DnsConfig::DnsOverHttpsServerConfig(
3380 "https://dns.example.com/", true /* use_post */)});
3381 config.secure_dns_mode = DnsConfig::SecureDnsMode::OFF;
[email protected]78eac2a2012-03-14 19:09:273382 EXPECT_TRUE(config.IsValid());
3383 return config;
3384}
3385
[email protected]1d932852012-06-19 19:40:333386// Specialized fixture for tests of DnsTask.
Eric Orth960e7062019-03-08 18:43:543387class HostResolverManagerDnsTest : public HostResolverManagerTest {
[email protected]daae1322013-09-05 18:26:503388 public:
Raul Tambre94493c652019-03-11 17:18:353389 HostResolverManagerDnsTest() : dns_client_(nullptr) {}
[email protected]daae1322013-09-05 18:26:503390
[email protected]1d932852012-06-19 19:40:333391 protected:
Miriam Gershenson17acdf092017-08-23 19:43:083392 void TearDown() override {
Eric Orth960e7062019-03-08 18:43:543393 HostResolverManagerTest::TearDown();
Miriam Gershenson17acdf092017-08-23 19:43:083394 ChangeDnsConfig(DnsConfig());
3395 }
3396
Eric Orth960e7062019-03-08 18:43:543397 // HostResolverManagerTest implementation:
Eric Orth4e55b362019-05-07 22:00:033398 HostResolver::ManagerOptions DefaultOptions() override {
3399 HostResolver::ManagerOptions options =
3400 HostResolverManagerTest::DefaultOptions();
dalykc27699a2019-07-29 20:53:293401 options.insecure_dns_client_enabled = true;
Eric Orth4e55b362019-05-07 22:00:033402 return options;
3403 }
3404
Eric Orth4e55b362019-05-07 22:00:033405 void CreateResolverWithOptionsAndParams(HostResolver::ManagerOptions options,
3406 const ProcTaskParams& params,
3407 bool ipv6_reachable) override {
Eric Orth37b18192019-04-22 19:09:283408 DestroyResolver();
3409
Eric Orth4e55b362019-05-07 22:00:033410 resolver_ = std::make_unique<TestHostResolverManager>(
dalykc27699a2019-07-29 20:53:293411 options, nullptr /* net_log */, ipv6_reachable);
3412 auto dns_client =
3413 std::make_unique<MockDnsClient>(DnsConfig(), CreateDefaultDnsRules());
3414 dns_client_ = dns_client.get();
3415 resolver_->SetDnsClientForTesting(std::move(dns_client));
[email protected]106ccd2c2014-06-17 09:21:003416 resolver_->set_proc_params_for_test(params);
Eric Orth37b18192019-04-22 19:09:283417
3418 if (host_cache_)
3419 resolver_->AddHostCacheInvalidator(host_cache_->invalidator());
[email protected]1d932852012-06-19 19:40:333420 }
3421
Eric Orth828bd3ae2018-12-12 17:30:363422 // Call after CreateResolver() to update the resolver with a new MockDnsClient
3423 // using |config| and |rules|.
3424 void UseMockDnsClient(const DnsConfig& config, MockDnsClientRuleList rules) {
3425 // HostResolver expects DnsConfig to get set after setting DnsClient, so
3426 // create first with an empty config and then update the config.
3427 auto dns_client =
3428 std::make_unique<MockDnsClient>(DnsConfig(), std::move(rules));
3429 dns_client_ = dns_client.get();
Eric Orth4e55b362019-05-07 22:00:033430 resolver_->SetDnsClientForTesting(std::move(dns_client));
dalykc27699a2019-07-29 20:53:293431 resolver_->SetInsecureDnsClientEnabled(true);
Eric Orth828bd3ae2018-12-12 17:30:363432 if (!config.Equals(DnsConfig()))
3433 ChangeDnsConfig(config);
eroman1efc237c2016-12-14 00:00:453434 }
3435
Eric Orth828bd3ae2018-12-12 17:30:363436 static MockDnsClientRuleList CreateDefaultDnsRules() {
3437 MockDnsClientRuleList rules;
3438
3439 AddDnsRule(&rules, "nodomain", dns_protocol::kTypeA,
dalyk48b20a992019-02-25 16:10:263440 MockDnsClientRule::NODOMAIN, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363441 AddDnsRule(&rules, "nodomain", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:263442 MockDnsClientRule::NODOMAIN, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363443 AddDnsRule(&rules, "nx", dns_protocol::kTypeA, MockDnsClientRule::FAIL,
dalyk48b20a992019-02-25 16:10:263444 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363445 AddDnsRule(&rules, "nx", dns_protocol::kTypeAAAA, MockDnsClientRule::FAIL,
dalyk48b20a992019-02-25 16:10:263446 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363447 AddDnsRule(&rules, "ok", dns_protocol::kTypeA, MockDnsClientRule::OK,
dalyk48b20a992019-02-25 16:10:263448 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363449 AddDnsRule(&rules, "ok", dns_protocol::kTypeAAAA, MockDnsClientRule::OK,
dalyk48b20a992019-02-25 16:10:263450 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363451 AddDnsRule(&rules, "4ok", dns_protocol::kTypeA, MockDnsClientRule::OK,
dalyk48b20a992019-02-25 16:10:263452 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363453 AddDnsRule(&rules, "4ok", dns_protocol::kTypeAAAA, MockDnsClientRule::EMPTY,
dalyk48b20a992019-02-25 16:10:263454 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363455 AddDnsRule(&rules, "6ok", dns_protocol::kTypeA, MockDnsClientRule::EMPTY,
dalyk48b20a992019-02-25 16:10:263456 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363457 AddDnsRule(&rules, "6ok", dns_protocol::kTypeAAAA, MockDnsClientRule::OK,
dalyk48b20a992019-02-25 16:10:263458 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363459 AddDnsRule(&rules, "4nx", dns_protocol::kTypeA, MockDnsClientRule::OK,
dalyk48b20a992019-02-25 16:10:263460 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363461 AddDnsRule(&rules, "4nx", dns_protocol::kTypeAAAA, MockDnsClientRule::FAIL,
dalyk48b20a992019-02-25 16:10:263462 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363463 AddDnsRule(&rules, "empty", dns_protocol::kTypeA, MockDnsClientRule::EMPTY,
dalyk48b20a992019-02-25 16:10:263464 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363465 AddDnsRule(&rules, "empty", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:263466 MockDnsClientRule::EMPTY, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363467
3468 AddDnsRule(&rules, "slow_nx", dns_protocol::kTypeA, MockDnsClientRule::FAIL,
dalyk48b20a992019-02-25 16:10:263469 true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363470 AddDnsRule(&rules, "slow_nx", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:263471 MockDnsClientRule::FAIL, true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363472
3473 AddDnsRule(&rules, "4slow_ok", dns_protocol::kTypeA, MockDnsClientRule::OK,
dalyk48b20a992019-02-25 16:10:263474 true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363475 AddDnsRule(&rules, "4slow_ok", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:263476 MockDnsClientRule::OK, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363477 AddDnsRule(&rules, "6slow_ok", dns_protocol::kTypeA, MockDnsClientRule::OK,
dalyk48b20a992019-02-25 16:10:263478 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363479 AddDnsRule(&rules, "6slow_ok", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:263480 MockDnsClientRule::OK, true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363481 AddDnsRule(&rules, "4slow_4ok", dns_protocol::kTypeA, MockDnsClientRule::OK,
dalyk48b20a992019-02-25 16:10:263482 true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363483 AddDnsRule(&rules, "4slow_4ok", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:263484 MockDnsClientRule::EMPTY, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363485 AddDnsRule(&rules, "4slow_4timeout", dns_protocol::kTypeA,
dalyk48b20a992019-02-25 16:10:263486 MockDnsClientRule::TIMEOUT, true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363487 AddDnsRule(&rules, "4slow_4timeout", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:263488 MockDnsClientRule::OK, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363489 AddDnsRule(&rules, "4slow_6timeout", dns_protocol::kTypeA,
dalyk48b20a992019-02-25 16:10:263490 MockDnsClientRule::OK, true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363491 AddDnsRule(&rules, "4slow_6timeout", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:263492 MockDnsClientRule::TIMEOUT, false /* delay */);
3493
Eric Orth828bd3ae2018-12-12 17:30:363494 AddDnsRule(&rules, "4collision", dns_protocol::kTypeA,
dalyk48b20a992019-02-25 16:10:263495 IPAddress(127, 0, 53, 53), false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363496 AddDnsRule(&rules, "4collision", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:263497 MockDnsClientRule::EMPTY, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363498 AddDnsRule(&rules, "6collision", dns_protocol::kTypeA,
dalyk48b20a992019-02-25 16:10:263499 MockDnsClientRule::EMPTY, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363500 // This isn't the expected IP for collisions (but looks close to it).
3501 AddDnsRule(&rules, "6collision", dns_protocol::kTypeAAAA,
3502 IPAddress(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 0, 53, 53),
dalyk48b20a992019-02-25 16:10:263503 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363504
dalyk4f4ac712019-05-31 16:33:133505 AddSecureDnsRule(&rules, "automatic_nodomain", dns_protocol::kTypeA,
3506 MockDnsClientRule::NODOMAIN, false /* delay */);
3507 AddSecureDnsRule(&rules, "automatic_nodomain", dns_protocol::kTypeAAAA,
3508 MockDnsClientRule::NODOMAIN, false /* delay */);
3509 AddDnsRule(&rules, "automatic_nodomain", dns_protocol::kTypeA,
3510 MockDnsClientRule::NODOMAIN, false /* delay */);
3511 AddDnsRule(&rules, "automatic_nodomain", dns_protocol::kTypeAAAA,
3512 MockDnsClientRule::NODOMAIN, false /* delay */);
3513 AddSecureDnsRule(&rules, "automatic", dns_protocol::kTypeA,
3514 MockDnsClientRule::OK, false /* delay */);
3515 AddSecureDnsRule(&rules, "automatic", dns_protocol::kTypeAAAA,
3516 MockDnsClientRule::OK, false /* delay */);
3517 AddDnsRule(&rules, "automatic", dns_protocol::kTypeA, MockDnsClientRule::OK,
3518 false /* delay */);
3519 AddDnsRule(&rules, "automatic", dns_protocol::kTypeAAAA,
3520 MockDnsClientRule::OK, false /* delay */);
3521 AddDnsRule(&rules, "insecure_automatic", dns_protocol::kTypeA,
3522 MockDnsClientRule::OK, false /* delay */);
3523 AddDnsRule(&rules, "insecure_automatic", dns_protocol::kTypeAAAA,
3524 MockDnsClientRule::OK, false /* delay */);
3525
dalykc27699a2019-07-29 20:53:293526 AddSecureDnsRule(&rules, "secure", dns_protocol::kTypeA,
3527 MockDnsClientRule::OK, false /* delay */);
3528 AddSecureDnsRule(&rules, "secure", dns_protocol::kTypeAAAA,
3529 MockDnsClientRule::OK, false /* delay */);
3530
Eric Orth828bd3ae2018-12-12 17:30:363531 return rules;
eroman1efc237c2016-12-14 00:00:453532 }
3533
Eric Orth828bd3ae2018-12-12 17:30:363534 // Adds a rule to |rules|.
3535 static void AddDnsRule(MockDnsClientRuleList* rules,
3536 const std::string& prefix,
3537 uint16_t qtype,
3538 MockDnsClientRule::ResultType result_type,
3539 bool delay) {
dalyk4f4ac712019-05-31 16:33:133540 rules->emplace_back(prefix, qtype, false /* secure */,
dalykad3f6c32019-03-06 13:38:333541 MockDnsClientRule::Result(result_type), delay);
Eric Orth828bd3ae2018-12-12 17:30:363542 }
3543
3544 static void AddDnsRule(MockDnsClientRuleList* rules,
3545 const std::string& prefix,
3546 uint16_t qtype,
3547 const IPAddress& result_ip,
3548 bool delay) {
dalyk4f4ac712019-05-31 16:33:133549 rules->emplace_back(prefix, qtype, false /* secure */,
Eric Orth828bd3ae2018-12-12 17:30:363550 MockDnsClientRule::Result(
3551 BuildTestDnsResponse(prefix, std::move(result_ip))),
3552 delay);
3553 }
3554
3555 static void AddDnsRule(MockDnsClientRuleList* rules,
3556 const std::string& prefix,
3557 uint16_t qtype,
3558 IPAddress result_ip,
3559 std::string cannonname,
3560 bool delay) {
3561 rules->emplace_back(
dalyk4f4ac712019-05-31 16:33:133562 prefix, qtype, false /* secure */,
dalykc0ab0722019-03-14 17:00:583563 MockDnsClientRule::Result(BuildTestDnsResponseWithCname(
Eric Orth828bd3ae2018-12-12 17:30:363564 prefix, std::move(result_ip), std::move(cannonname))),
3565 delay);
[email protected]0adcb2b2012-08-15 21:30:463566 }
3567
dalyk48b20a992019-02-25 16:10:263568 static void AddSecureDnsRule(MockDnsClientRuleList* rules,
3569 const std::string& prefix,
3570 uint16_t qtype,
3571 MockDnsClientRule::ResultType result_type,
3572 bool delay) {
dalyk4f4ac712019-05-31 16:33:133573 rules->emplace_back(prefix, qtype, true /* secure */,
3574 MockDnsClientRule::Result(result_type), delay);
dalyk48b20a992019-02-25 16:10:263575 }
3576
[email protected]1d932852012-06-19 19:40:333577 void ChangeDnsConfig(const DnsConfig& config) {
Eric Orthc398f1e2019-07-09 21:54:553578 NetworkChangeNotifier::SetDnsConfigForTesting(config);
[email protected]bb0e34542012-08-31 19:52:403579 // Notification is delivered asynchronously.
fdoray5eeb7642016-06-22 16:11:283580 base::RunLoop().RunUntilIdle();
[email protected]1d932852012-06-19 19:40:333581 }
3582
Miriam Gershenson44aafc122017-10-18 19:29:253583 void SetInitialDnsConfig(const DnsConfig& config) {
John Abd-El-Malek1842b8c2018-05-16 14:53:223584 NetworkChangeNotifier::ClearDnsConfigForTesting();
Eric Orthc398f1e2019-07-09 21:54:553585 NetworkChangeNotifier::SetDnsConfigForTesting(config);
Miriam Gershenson44aafc122017-10-18 19:29:253586 // Notification is delivered asynchronously.
3587 base::RunLoop().RunUntilIdle();
3588 }
3589
[email protected]daae1322013-09-05 18:26:503590 // Owned by |resolver_|.
3591 MockDnsClient* dns_client_;
[email protected]1d932852012-06-19 19:40:333592};
3593
dalykc27699a2019-07-29 20:53:293594TEST_F(HostResolverManagerDnsTest, DisableAndEnableInsecureDnsClient) {
Eric Orth4e55b362019-05-07 22:00:033595 // Disable fallback to allow testing how requests are initially handled.
3596 set_allow_fallback_to_proctask(false);
3597
3598 ChangeDnsConfig(CreateValidDnsConfig());
3599 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.2.47");
3600 proc_->SignalMultiple(1u);
3601
dalykc27699a2019-07-29 20:53:293602 resolver_->SetInsecureDnsClientEnabled(false);
Eric Orth4e55b362019-05-07 22:00:033603 ResolveHostResponseHelper response_proc(resolver_->CreateRequest(
3604 HostPortPair("nx_succeed", 1212), NetLogWithSource(), base::nullopt,
3605 request_context_.get(), host_cache_.get()));
3606 EXPECT_THAT(response_proc.result_error(), IsOk());
3607 EXPECT_THAT(response_proc.request()->GetAddressResults().value().endpoints(),
3608 testing::ElementsAre(CreateExpected("192.168.2.47", 1212)));
3609
dalykc27699a2019-07-29 20:53:293610 resolver_->SetInsecureDnsClientEnabled(true);
Eric Orth4e55b362019-05-07 22:00:033611 ResolveHostResponseHelper response_dns_client(resolver_->CreateRequest(
3612 HostPortPair("ok_fail", 1212), NetLogWithSource(), base::nullopt,
3613 request_context_.get(), host_cache_.get()));
3614 EXPECT_THAT(response_dns_client.result_error(), IsOk());
3615 EXPECT_THAT(
3616 response_dns_client.request()->GetAddressResults().value().endpoints(),
3617 testing::UnorderedElementsAre(CreateExpected("::1", 1212),
3618 CreateExpected("127.0.0.1", 1212)));
3619}
3620
dalyk6d7d8ead2019-08-15 03:30:083621TEST_F(HostResolverManagerDnsTest, UseProcTaskWhenPrivateDnsActive) {
3622 // Disable fallback to allow testing how requests are initially handled.
3623 set_allow_fallback_to_proctask(false);
3624 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.2.47");
3625 proc_->SignalMultiple(1u);
3626
3627 DnsConfig config = CreateValidDnsConfig();
3628 config.dns_over_tls_active = true;
3629 ChangeDnsConfig(config);
3630 ResolveHostResponseHelper response_proc(resolver_->CreateRequest(
3631 HostPortPair("nx_succeed", 1212), NetLogWithSource(), base::nullopt,
3632 request_context_.get(), host_cache_.get()));
3633 EXPECT_THAT(response_proc.result_error(), IsOk());
3634 EXPECT_THAT(response_proc.request()->GetAddressResults().value().endpoints(),
3635 testing::ElementsAre(CreateExpected("192.168.2.47", 1212)));
3636}
3637
Mike Westda1c690e2017-08-12 05:57:163638// RFC 6761 localhost names should always resolve to loopback.
Eric Orth960e7062019-03-08 18:43:543639TEST_F(HostResolverManagerDnsTest, LocalhostLookup) {
Mike Westda1c690e2017-08-12 05:57:163640 // Add a rule resolving localhost names to a non-loopback IP and test
3641 // that they still resolves to loopback.
3642 proc_->AddRuleForAllFamilies("foo.localhost", "192.168.1.42");
3643 proc_->AddRuleForAllFamilies("localhost", "192.168.1.42");
3644 proc_->AddRuleForAllFamilies("localhost.", "192.168.1.42");
3645
Eric Orth70992982018-07-24 00:25:003646 ResolveHostResponseHelper response0(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:273647 HostPortPair("foo.localhost", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:153648 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:003649 EXPECT_THAT(response0.result_error(), IsOk());
3650 EXPECT_THAT(response0.request()->GetAddressResults().value().endpoints(),
3651 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
3652 CreateExpected("::1", 80)));
3653
3654 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:273655 HostPortPair("localhost", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:153656 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:003657 EXPECT_THAT(response1.result_error(), IsOk());
3658 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
3659 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
3660 CreateExpected("::1", 80)));
3661
3662 ResolveHostResponseHelper response2(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:273663 HostPortPair("localhost.", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:153664 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:003665 EXPECT_THAT(response2.result_error(), IsOk());
3666 EXPECT_THAT(response2.request()->GetAddressResults().value().endpoints(),
3667 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
3668 CreateExpected("::1", 80)));
3669}
3670
Mike Westda1c690e2017-08-12 05:57:163671// RFC 6761 localhost names should always resolve to loopback, even if a HOSTS
3672// file is active.
Eric Orth960e7062019-03-08 18:43:543673TEST_F(HostResolverManagerDnsTest, LocalhostLookupWithHosts) {
Mike Westda1c690e2017-08-12 05:57:163674 DnsHosts hosts;
3675 hosts[DnsHostsKey("localhost", ADDRESS_FAMILY_IPV4)] =
3676 IPAddress({192, 168, 1, 1});
3677 hosts[DnsHostsKey("foo.localhost", ADDRESS_FAMILY_IPV4)] =
3678 IPAddress({192, 168, 1, 2});
3679
3680 DnsConfig config = CreateValidDnsConfig();
3681 config.hosts = hosts;
3682 ChangeDnsConfig(config);
3683
Eric Orth70992982018-07-24 00:25:003684 ResolveHostResponseHelper response0(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:273685 HostPortPair("localhost", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:153686 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:003687 EXPECT_THAT(response0.result_error(), IsOk());
3688 EXPECT_THAT(response0.request()->GetAddressResults().value().endpoints(),
3689 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
3690 CreateExpected("::1", 80)));
3691
3692 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:273693 HostPortPair("foo.localhost", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:153694 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:003695 EXPECT_THAT(response1.result_error(), IsOk());
3696 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
3697 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
3698 CreateExpected("::1", 80)));
3699}
3700
Eric Orth960e7062019-03-08 18:43:543701// Test successful and fallback resolutions in HostResolverManager::DnsTask.
3702TEST_F(HostResolverManagerDnsTest, DnsTask) {
[email protected]38b50d92012-04-19 21:07:523703 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.102");
3704 // All other hostnames will fail in proc_.
[email protected]78eac2a2012-03-14 19:09:273705
3706 // Initially there is no config, so client should not be invoked.
Eric Orth117e1992019-04-17 00:24:153707 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
3708 HostPortPair("ok_fail", 80), NetLogWithSource(), base::nullopt,
3709 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:003710 EXPECT_FALSE(initial_response.complete());
3711
3712 proc_->SignalMultiple(1u);
3713
3714 EXPECT_THAT(initial_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
3715
3716 ChangeDnsConfig(CreateValidDnsConfig());
3717
Eric Orth117e1992019-04-17 00:24:153718 ResolveHostResponseHelper response0(resolver_->CreateRequest(
3719 HostPortPair("ok_fail", 80), NetLogWithSource(), base::nullopt,
3720 request_context_.get(), host_cache_.get()));
3721 ResolveHostResponseHelper response1(resolver_->CreateRequest(
3722 HostPortPair("nx_fail", 80), NetLogWithSource(), base::nullopt,
3723 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:003724 ResolveHostResponseHelper response2(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:273725 HostPortPair("nx_succeed", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:153726 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:003727
3728 proc_->SignalMultiple(4u);
3729
3730 // Resolved by MockDnsClient.
3731 EXPECT_THAT(response0.result_error(), IsOk());
3732 EXPECT_THAT(response0.request()->GetAddressResults().value().endpoints(),
3733 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
3734 CreateExpected("::1", 80)));
3735
3736 // Fallback to ProcTask.
3737 EXPECT_THAT(response1.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
3738 EXPECT_THAT(response2.result_error(), IsOk());
3739 EXPECT_THAT(response2.request()->GetAddressResults().value().endpoints(),
3740 testing::ElementsAre(CreateExpected("192.168.1.102", 80)));
3741}
3742
Eric Orth960e7062019-03-08 18:43:543743// Test successful and failing resolutions in HostResolverManager::DnsTask when
[email protected]16c2bd72013-06-28 01:19:223744// fallback to ProcTask is disabled.
Eric Orth960e7062019-03-08 18:43:543745TEST_F(HostResolverManagerDnsTest, NoFallbackToProcTask) {
Eric Orth60931742018-11-05 23:40:573746 set_allow_fallback_to_proctask(false);
[email protected]16c2bd72013-06-28 01:19:223747
[email protected]16c2bd72013-06-28 01:19:223748 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.102");
3749 // All other hostnames will fail in proc_.
3750
3751 // Set empty DnsConfig.
3752 ChangeDnsConfig(DnsConfig());
3753 // Initially there is no config, so client should not be invoked.
Eric Orth117e1992019-04-17 00:24:153754 ResolveHostResponseHelper initial_response0(resolver_->CreateRequest(
3755 HostPortPair("ok_fail", 80), NetLogWithSource(), base::nullopt,
3756 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:003757 ResolveHostResponseHelper initial_response1(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:273758 HostPortPair("nx_succeed", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:153759 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:003760 proc_->SignalMultiple(2u);
3761
3762 EXPECT_THAT(initial_response0.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
3763 EXPECT_THAT(initial_response1.result_error(), IsOk());
3764 EXPECT_THAT(
3765 initial_response1.request()->GetAddressResults().value().endpoints(),
3766 testing::ElementsAre(CreateExpected("192.168.1.102", 80)));
3767
dalykc27699a2019-07-29 20:53:293768 // Switch to a valid config.
Eric Orth70992982018-07-24 00:25:003769 ChangeDnsConfig(CreateValidDnsConfig());
Eric Orth70992982018-07-24 00:25:003770 // First request is resolved by MockDnsClient, others should fail due to
3771 // disabled fallback to ProcTask.
Eric Orth117e1992019-04-17 00:24:153772 ResolveHostResponseHelper response0(resolver_->CreateRequest(
3773 HostPortPair("ok_fail", 80), NetLogWithSource(), base::nullopt,
3774 request_context_.get(), host_cache_.get()));
3775 ResolveHostResponseHelper response1(resolver_->CreateRequest(
dalykc27699a2019-07-29 20:53:293776 HostPortPair("nx_succeed", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:153777 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:003778 proc_->SignalMultiple(6u);
3779
Eric Orth70992982018-07-24 00:25:003780 // Resolved by MockDnsClient.
3781 EXPECT_THAT(response0.result_error(), IsOk());
3782 EXPECT_THAT(response0.request()->GetAddressResults().value().endpoints(),
3783 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
3784 CreateExpected("::1", 80)));
3785 // Fallback to ProcTask is disabled.
3786 EXPECT_THAT(response1.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
3787}
3788
[email protected]16c2bd72013-06-28 01:19:223789// Test behavior of OnDnsTaskFailure when Job is aborted.
Eric Orth960e7062019-03-08 18:43:543790TEST_F(HostResolverManagerDnsTest, OnDnsTaskFailureAbortedJob) {
[email protected]16c2bd72013-06-28 01:19:223791 ChangeDnsConfig(CreateValidDnsConfig());
Eric Orth117e1992019-04-17 00:24:153792 ResolveHostResponseHelper response(resolver_->CreateRequest(
3793 HostPortPair("nx_abort", 80), NetLogWithSource(), base::nullopt,
3794 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:003795 // Abort all jobs here.
3796 CreateResolver();
3797 proc_->SignalMultiple(1u);
3798 // Run to completion.
3799 base::RunLoop().RunUntilIdle(); // Notification happens async.
3800 // It shouldn't crash during OnDnsTaskFailure callbacks.
3801 EXPECT_FALSE(response.complete());
3802
3803 // Repeat test with Fallback to ProcTask disabled
Eric Orth60931742018-11-05 23:40:573804 set_allow_fallback_to_proctask(false);
Eric Orth70992982018-07-24 00:25:003805 ChangeDnsConfig(CreateValidDnsConfig());
Eric Orth117e1992019-04-17 00:24:153806 ResolveHostResponseHelper no_fallback_response(resolver_->CreateRequest(
3807 HostPortPair("nx_abort", 80), NetLogWithSource(), base::nullopt,
3808 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:003809 // Abort all jobs here.
3810 CreateResolver();
3811 proc_->SignalMultiple(2u);
3812 // Run to completion.
3813 base::RunLoop().RunUntilIdle(); // Notification happens async.
3814 // It shouldn't crash during OnDnsTaskFailure callbacks.
3815 EXPECT_FALSE(no_fallback_response.complete());
3816}
3817
Eric Orth60931742018-11-05 23:40:573818// Fallback to proc allowed with ANY source.
Eric Orth960e7062019-03-08 18:43:543819TEST_F(HostResolverManagerDnsTest, FallbackBySource_Any) {
Eric Orth60931742018-11-05 23:40:573820 // Ensure fallback is otherwise allowed by resolver settings.
3821 set_allow_fallback_to_proctask(true);
3822
3823 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.102");
3824 // All other hostnames will fail in proc_.
3825
3826 ChangeDnsConfig(CreateValidDnsConfig());
3827
Eric Orth117e1992019-04-17 00:24:153828 ResolveHostResponseHelper response0(resolver_->CreateRequest(
3829 HostPortPair("nx_fail", 80), NetLogWithSource(), base::nullopt,
3830 request_context_.get(), host_cache_.get()));
Eric Orth60931742018-11-05 23:40:573831 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:273832 HostPortPair("nx_succeed", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:153833 request_context_.get(), host_cache_.get()));
Eric Orth60931742018-11-05 23:40:573834 proc_->SignalMultiple(2u);
3835
3836 EXPECT_THAT(response0.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
3837 EXPECT_THAT(response1.result_error(), IsOk());
3838 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
3839 testing::ElementsAre(CreateExpected("192.168.1.102", 80)));
3840}
3841
3842// Fallback to proc not allowed with DNS source.
Eric Orth960e7062019-03-08 18:43:543843TEST_F(HostResolverManagerDnsTest, FallbackBySource_Dns) {
Eric Orth60931742018-11-05 23:40:573844 // Ensure fallback is otherwise allowed by resolver settings.
3845 set_allow_fallback_to_proctask(true);
3846
3847 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.102");
3848 // All other hostnames will fail in proc_.
3849
3850 ChangeDnsConfig(CreateValidDnsConfig());
3851
3852 HostResolver::ResolveHostParameters parameters;
3853 parameters.source = HostResolverSource::DNS;
Eric Orth117e1992019-04-17 00:24:153854 ResolveHostResponseHelper response0(resolver_->CreateRequest(
3855 HostPortPair("nx_fail", 80), NetLogWithSource(), parameters,
3856 request_context_.get(), host_cache_.get()));
Eric Orth60931742018-11-05 23:40:573857 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:273858 HostPortPair("nx_succeed", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:153859 request_context_.get(), host_cache_.get()));
Eric Orth60931742018-11-05 23:40:573860 // Nothing should reach |proc_| on success, but let failures through to fail
3861 // instead of hanging.
3862 proc_->SignalMultiple(2u);
3863
3864 EXPECT_THAT(response0.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
3865 EXPECT_THAT(response1.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
3866}
3867
3868// Fallback to proc on DnsClient change allowed with ANY source.
Eric Orth960e7062019-03-08 18:43:543869TEST_F(HostResolverManagerDnsTest, FallbackOnAbortBySource_Any) {
Eric Orth60931742018-11-05 23:40:573870 // Ensure fallback is otherwise allowed by resolver settings.
3871 set_allow_fallback_to_proctask(true);
3872
3873 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.102");
3874 // All other hostnames will fail in proc_.
3875
3876 ChangeDnsConfig(CreateValidDnsConfig());
3877
Eric Orth117e1992019-04-17 00:24:153878 ResolveHostResponseHelper response0(resolver_->CreateRequest(
3879 HostPortPair("ok_fail", 80), NetLogWithSource(), base::nullopt,
3880 request_context_.get(), host_cache_.get()));
Eric Orth60931742018-11-05 23:40:573881 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:273882 HostPortPair("nx_succeed", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:153883 request_context_.get(), host_cache_.get()));
Eric Orth60931742018-11-05 23:40:573884 proc_->SignalMultiple(2u);
3885
dalykc27699a2019-07-29 20:53:293886 // Simulate the case when the preference or policy has disabled the insecure
3887 // DNS client causing AbortInsecureDnsTasks.
3888 resolver_->SetInsecureDnsClientEnabled(false);
Eric Orth60931742018-11-05 23:40:573889
3890 // All requests should fallback to proc resolver.
3891 EXPECT_THAT(response0.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
3892 EXPECT_THAT(response1.result_error(), IsOk());
3893 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
3894 testing::ElementsAre(CreateExpected("192.168.1.102", 80)));
3895}
3896
3897// Fallback to proc on DnsClient change not allowed with DNS source.
Eric Orth960e7062019-03-08 18:43:543898TEST_F(HostResolverManagerDnsTest, FallbackOnAbortBySource_Dns) {
Eric Orth60931742018-11-05 23:40:573899 // Ensure fallback is otherwise allowed by resolver settings.
3900 set_allow_fallback_to_proctask(true);
3901
3902 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.102");
3903 // All other hostnames will fail in proc_.
3904
3905 ChangeDnsConfig(CreateValidDnsConfig());
3906
3907 HostResolver::ResolveHostParameters parameters;
3908 parameters.source = HostResolverSource::DNS;
Eric Orth117e1992019-04-17 00:24:153909 ResolveHostResponseHelper response0(resolver_->CreateRequest(
3910 HostPortPair("ok_fail", 80), NetLogWithSource(), parameters,
3911 request_context_.get(), host_cache_.get()));
Eric Orth60931742018-11-05 23:40:573912 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:273913 HostPortPair("nx_succeed", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:153914 request_context_.get(), host_cache_.get()));
Eric Orth60931742018-11-05 23:40:573915 // Nothing should reach |proc_| on success, but let failures through to fail
3916 // instead of hanging.
3917 proc_->SignalMultiple(2u);
3918
dalykc27699a2019-07-29 20:53:293919 // Simulate the case when the preference or policy has disabled the insecure
3920 // DNS client causing AbortInsecureDnsTasks.
3921 resolver_->SetInsecureDnsClientEnabled(false);
Eric Orth60931742018-11-05 23:40:573922
3923 // No fallback expected. All requests should fail.
3924 EXPECT_THAT(response0.result_error(), IsError(ERR_NETWORK_CHANGED));
3925 EXPECT_THAT(response1.result_error(), IsError(ERR_NETWORK_CHANGED));
3926}
3927
dalykc27699a2019-07-29 20:53:293928// Insecure DnsClient change shouldn't affect secure DnsTasks.
3929TEST_F(HostResolverManagerDnsTest,
3930 DisableInsecureDnsClient_SecureDnsTasksUnaffected) {
3931 // Ensure fallback is otherwise allowed by resolver settings.
3932 set_allow_fallback_to_proctask(true);
3933
3934 proc_->AddRuleForAllFamilies("automatic", "192.168.1.102");
3935 // All other hostnames will fail in proc_.
3936
3937 ChangeDnsConfig(CreateValidDnsConfig());
3938
3939 HostResolver::ResolveHostParameters secure_parameters;
3940 secure_parameters.secure_dns_mode_override =
3941 DnsConfig::SecureDnsMode::AUTOMATIC;
3942 ResolveHostResponseHelper response_secure(resolver_->CreateRequest(
3943 HostPortPair("automatic", 80), NetLogWithSource(), secure_parameters,
3944 request_context_.get(), host_cache_.get()));
3945 EXPECT_FALSE(response_secure.complete());
3946
3947 // Simulate the case when the preference or policy has disabled the insecure
3948 // DNS client causing AbortInsecureDnsTasks.
3949 resolver_->SetInsecureDnsClientEnabled(false);
3950
3951 EXPECT_THAT(response_secure.result_error(), IsOk());
3952 EXPECT_THAT(
3953 response_secure.request()->GetAddressResults().value().endpoints(),
3954 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
3955 CreateExpected("::1", 80)));
3956}
3957
Eric Orth960e7062019-03-08 18:43:543958TEST_F(HostResolverManagerDnsTest, DnsTaskUnspec) {
[email protected]0adcb2b2012-08-15 21:30:463959 ChangeDnsConfig(CreateValidDnsConfig());
3960
3961 proc_->AddRuleForAllFamilies("4nx", "192.168.1.101");
3962 // All other hostnames will fail in proc_.
3963
Eric Orth70992982018-07-24 00:25:003964 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:153965 responses.emplace_back(
3966 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
3967 HostPortPair("ok", 80), NetLogWithSource(), base::nullopt,
3968 request_context_.get(), host_cache_.get())));
3969 responses.emplace_back(
3970 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
3971 HostPortPair("4ok", 80), NetLogWithSource(), base::nullopt,
3972 request_context_.get(), host_cache_.get())));
3973 responses.emplace_back(
3974 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
3975 HostPortPair("6ok", 80), NetLogWithSource(), base::nullopt,
3976 request_context_.get(), host_cache_.get())));
3977 responses.emplace_back(
3978 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
3979 HostPortPair("4nx", 80), NetLogWithSource(), base::nullopt,
3980 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:003981
3982 proc_->SignalMultiple(4u);
3983
3984 for (auto& response : responses) {
3985 EXPECT_THAT(response->result_error(), IsOk());
3986 }
3987
3988 EXPECT_THAT(responses[0]->request()->GetAddressResults().value().endpoints(),
3989 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
3990 CreateExpected("::1", 80)));
3991 EXPECT_THAT(responses[1]->request()->GetAddressResults().value().endpoints(),
3992 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
3993 EXPECT_THAT(responses[2]->request()->GetAddressResults().value().endpoints(),
3994 testing::ElementsAre(CreateExpected("::1", 80)));
3995 EXPECT_THAT(responses[3]->request()->GetAddressResults().value().endpoints(),
3996 testing::ElementsAre(CreateExpected("192.168.1.101", 80)));
3997}
3998
Eric Orth960e7062019-03-08 18:43:543999TEST_F(HostResolverManagerDnsTest, NameCollisionIcann) {
eroman1efc237c2016-12-14 00:00:454000 ChangeDnsConfig(CreateValidDnsConfig());
4001
Eric Orth70992982018-07-24 00:25:004002 // When the resolver returns an A record with 127.0.53.53 it should be
4003 // mapped to a special error.
4004 ResolveHostResponseHelper response_ipv4(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:274005 HostPortPair("4collision", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:154006 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004007 EXPECT_THAT(response_ipv4.result_error(), IsError(ERR_ICANN_NAME_COLLISION));
4008 EXPECT_FALSE(response_ipv4.request()->GetAddressResults());
4009
4010 // When the resolver returns an AAAA record with ::127.0.53.53 it should
4011 // work just like any other IP. (Despite having the same suffix, it is not
4012 // considered special)
4013 ResolveHostResponseHelper response_ipv6(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:274014 HostPortPair("6collision", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:154015 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004016 EXPECT_THAT(response_ipv6.result_error(), IsOk());
4017 EXPECT_THAT(response_ipv6.request()->GetAddressResults().value().endpoints(),
4018 testing::ElementsAre(CreateExpected("::127.0.53.53", 80)));
4019}
4020
Eric Orth960e7062019-03-08 18:43:544021TEST_F(HostResolverManagerDnsTest, ServeFromHosts) {
[email protected]d7b9a2b2012-05-31 22:31:194022 // Initially, use empty HOSTS file.
[email protected]bb0e34542012-08-31 19:52:404023 DnsConfig config = CreateValidDnsConfig();
4024 ChangeDnsConfig(config);
[email protected]d7b9a2b2012-05-31 22:31:194025
[email protected]007b3f82013-04-09 08:46:454026 proc_->AddRuleForAllFamilies(std::string(),
4027 std::string()); // Default to failures.
[email protected]38b50d92012-04-19 21:07:524028 proc_->SignalMultiple(1u); // For the first request which misses.
[email protected]78eac2a2012-03-14 19:09:274029
Eric Orth117e1992019-04-17 00:24:154030 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
4031 HostPortPair("nx_ipv4", 80), NetLogWithSource(), base::nullopt,
4032 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004033 EXPECT_THAT(initial_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
4034
4035 IPAddress local_ipv4 = IPAddress::IPv4Localhost();
4036 IPAddress local_ipv6 = IPAddress::IPv6Localhost();
4037
4038 DnsHosts hosts;
4039 hosts[DnsHostsKey("nx_ipv4", ADDRESS_FAMILY_IPV4)] = local_ipv4;
4040 hosts[DnsHostsKey("nx_ipv6", ADDRESS_FAMILY_IPV6)] = local_ipv6;
4041 hosts[DnsHostsKey("nx_both", ADDRESS_FAMILY_IPV4)] = local_ipv4;
4042 hosts[DnsHostsKey("nx_both", ADDRESS_FAMILY_IPV6)] = local_ipv6;
4043
4044 // Update HOSTS file.
4045 config.hosts = hosts;
4046 ChangeDnsConfig(config);
4047
Eric Orth117e1992019-04-17 00:24:154048 ResolveHostResponseHelper response_ipv4(resolver_->CreateRequest(
4049 HostPortPair("nx_ipv4", 80), NetLogWithSource(), base::nullopt,
4050 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004051 EXPECT_THAT(response_ipv4.result_error(), IsOk());
4052 EXPECT_THAT(response_ipv4.request()->GetAddressResults().value().endpoints(),
4053 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
4054
Eric Orth117e1992019-04-17 00:24:154055 ResolveHostResponseHelper response_ipv6(resolver_->CreateRequest(
4056 HostPortPair("nx_ipv6", 80), NetLogWithSource(), base::nullopt,
4057 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004058 EXPECT_THAT(response_ipv6.result_error(), IsOk());
4059 EXPECT_THAT(response_ipv6.request()->GetAddressResults().value().endpoints(),
4060 testing::ElementsAre(CreateExpected("::1", 80)));
4061
Eric Orth117e1992019-04-17 00:24:154062 ResolveHostResponseHelper response_both(resolver_->CreateRequest(
4063 HostPortPair("nx_both", 80), NetLogWithSource(), base::nullopt,
4064 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004065 EXPECT_THAT(response_both.result_error(), IsOk());
4066 EXPECT_THAT(response_both.request()->GetAddressResults().value().endpoints(),
4067 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4068 CreateExpected("::1", 80)));
4069
Eric Orth00fe5a62018-08-15 22:20:004070 // Requests with specified DNS query type.
4071 HostResolver::ResolveHostParameters parameters;
4072
Eric Orth192e3bb2018-11-14 19:30:324073 parameters.dns_query_type = DnsQueryType::A;
Eric Orth117e1992019-04-17 00:24:154074 ResolveHostResponseHelper response_specified_ipv4(resolver_->CreateRequest(
4075 HostPortPair("nx_ipv4", 80), NetLogWithSource(), parameters,
4076 request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:004077 EXPECT_THAT(response_specified_ipv4.result_error(), IsOk());
4078 EXPECT_THAT(response_specified_ipv4.request()
4079 ->GetAddressResults()
4080 .value()
4081 .endpoints(),
4082 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
4083
Eric Orth192e3bb2018-11-14 19:30:324084 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth117e1992019-04-17 00:24:154085 ResolveHostResponseHelper response_specified_ipv6(resolver_->CreateRequest(
4086 HostPortPair("nx_ipv6", 80), NetLogWithSource(), parameters,
4087 request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:004088 EXPECT_THAT(response_specified_ipv6.result_error(), IsOk());
4089 EXPECT_THAT(response_specified_ipv6.request()
4090 ->GetAddressResults()
4091 .value()
4092 .endpoints(),
4093 testing::ElementsAre(CreateExpected("::1", 80)));
4094
Eric Orth70992982018-07-24 00:25:004095 // Request with upper case.
Eric Orth117e1992019-04-17 00:24:154096 ResolveHostResponseHelper response_upper(resolver_->CreateRequest(
4097 HostPortPair("nx_IPV4", 80), NetLogWithSource(), base::nullopt,
4098 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004099 EXPECT_THAT(response_upper.result_error(), IsOk());
4100 EXPECT_THAT(response_upper.request()->GetAddressResults().value().endpoints(),
4101 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
4102}
4103
dalykc27699a2019-07-29 20:53:294104TEST_F(HostResolverManagerDnsTest, SkipHostsWithUpcomingProcTask) {
4105 // Disable the DnsClient.
4106 resolver_->SetInsecureDnsClientEnabled(false);
4107
4108 proc_->AddRuleForAllFamilies(std::string(),
4109 std::string()); // Default to failures.
4110 proc_->SignalMultiple(1u); // For the first request which misses.
4111
4112 DnsConfig config = CreateValidDnsConfig();
4113 DnsHosts hosts;
4114 hosts[DnsHostsKey("hosts", ADDRESS_FAMILY_IPV4)] = IPAddress::IPv4Localhost();
4115
4116 // Update HOSTS file.
4117 config.hosts = hosts;
4118 ChangeDnsConfig(config);
4119
4120 ResolveHostResponseHelper response(resolver_->CreateRequest(
4121 HostPortPair("hosts", 80), NetLogWithSource(), base::nullopt,
4122 request_context_.get(), host_cache_.get()));
4123 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
4124}
4125
Eric Orthdc35748e2018-08-23 22:41:484126// Test that hosts ending in ".local" or ".local." are resolved using the system
4127// resolver.
Eric Orth960e7062019-03-08 18:43:544128TEST_F(HostResolverManagerDnsTest, BypassDnsTask) {
Eric Orth70992982018-07-24 00:25:004129 ChangeDnsConfig(CreateValidDnsConfig());
4130
4131 proc_->AddRuleForAllFamilies(std::string(),
4132 std::string()); // Default to failures.
4133
4134 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
4135
Eric Orth117e1992019-04-17 00:24:154136 responses.emplace_back(
4137 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
4138 HostPortPair("ok.local", 80), NetLogWithSource(), base::nullopt,
4139 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:004140 responses.emplace_back(
4141 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:274142 HostPortPair("ok.local.", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:154143 request_context_.get(), host_cache_.get())));
4144 responses.emplace_back(
4145 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
4146 HostPortPair("oklocal", 80), NetLogWithSource(), base::nullopt,
4147 request_context_.get(), host_cache_.get())));
4148 responses.emplace_back(
4149 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
4150 HostPortPair("oklocal.", 80), NetLogWithSource(), base::nullopt,
4151 request_context_.get(), host_cache_.get())));
4152 responses.emplace_back(
4153 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
4154 HostPortPair("ok", 80), NetLogWithSource(), base::nullopt,
4155 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:004156
4157 proc_->SignalMultiple(5u);
4158
4159 for (size_t i = 0; i < 2; ++i)
4160 EXPECT_THAT(responses[i]->result_error(), IsError(ERR_NAME_NOT_RESOLVED));
4161
4162 for (size_t i = 2; i < responses.size(); ++i)
4163 EXPECT_THAT(responses[i]->result_error(), IsOk());
4164}
4165
Eric Orth828bd3ae2018-12-12 17:30:364166#if BUILDFLAG(ENABLE_MDNS)
4167// Test that non-address queries for hosts ending in ".local" are resolved using
4168// the MDNS resolver.
Eric Orth960e7062019-03-08 18:43:544169TEST_F(HostResolverManagerDnsTest, BypassDnsToMdnsWithNonAddress) {
Eric Orth828bd3ae2018-12-12 17:30:364170 // Ensure DNS task and system (proc) requests will fail.
4171 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:134172 rules.emplace_back(
4173 "myhello.local", dns_protocol::kTypeTXT, false /* secure */,
4174 MockDnsClientRule::Result(MockDnsClientRule::FAIL), false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:364175 CreateResolver();
4176 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
4177 proc_->AddRuleForAllFamilies(std::string(), std::string());
4178
4179 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
4180 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
4181 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
4182 // 2 socket creations for every transaction.
4183 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(2);
4184
4185 HostResolver::ResolveHostParameters dns_parameters;
4186 dns_parameters.dns_query_type = DnsQueryType::TXT;
4187
4188 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:274189 HostPortPair("myhello.local", 80), NetLogWithSource(), dns_parameters,
Eric Orth117e1992019-04-17 00:24:154190 request_context_.get(), host_cache_.get()));
Eric Orth828bd3ae2018-12-12 17:30:364191
4192 socket_factory_ptr->SimulateReceive(kMdnsResponseTxt,
4193 sizeof(kMdnsResponseTxt));
4194 proc_->SignalMultiple(1u);
4195
4196 EXPECT_THAT(response.result_error(), IsOk());
4197 EXPECT_THAT(response.request()->GetTextResults(),
4198 testing::Optional(testing::ElementsAre("foo", "bar")));
4199}
4200#endif // BUILDFLAG(ENABLE_MDNS)
4201
Eric Orthdc35748e2018-08-23 22:41:484202// Test that DNS task is always used when explicitly requested as the source,
4203// even with a case that would normally bypass it eg hosts ending in ".local".
Eric Orth960e7062019-03-08 18:43:544204TEST_F(HostResolverManagerDnsTest, DnsNotBypassedWhenDnsSource) {
Eric Orthdc35748e2018-08-23 22:41:484205 // Ensure DNS task requests will succeed and system (proc) requests will fail.
4206 ChangeDnsConfig(CreateValidDnsConfig());
4207 proc_->AddRuleForAllFamilies(std::string(), std::string());
4208
4209 HostResolver::ResolveHostParameters dns_parameters;
4210 dns_parameters.source = HostResolverSource::DNS;
4211
Eric Orth117e1992019-04-17 00:24:154212 ResolveHostResponseHelper dns_response(resolver_->CreateRequest(
4213 HostPortPair("ok", 80), NetLogWithSource(), dns_parameters,
4214 request_context_.get(), host_cache_.get()));
4215 ResolveHostResponseHelper dns_local_response(resolver_->CreateRequest(
4216 HostPortPair("ok.local", 80), NetLogWithSource(), dns_parameters,
4217 request_context_.get(), host_cache_.get()));
4218 ResolveHostResponseHelper normal_local_response(resolver_->CreateRequest(
4219 HostPortPair("ok.local", 80), NetLogWithSource(), base::nullopt,
4220 request_context_.get(), host_cache_.get()));
Eric Orthdc35748e2018-08-23 22:41:484221
4222 proc_->SignalMultiple(3u);
4223
4224 EXPECT_THAT(dns_response.result_error(), IsOk());
4225 EXPECT_THAT(dns_local_response.result_error(), IsOk());
4226 EXPECT_THAT(normal_local_response.result_error(),
4227 IsError(ERR_NAME_NOT_RESOLVED));
4228}
4229
Eric Orth960e7062019-03-08 18:43:544230TEST_F(HostResolverManagerDnsTest, SystemOnlyBypassesDnsTask) {
Eric Orthdc35748e2018-08-23 22:41:484231 // Ensure DNS task requests will succeed and system (proc) requests will fail.
4232 ChangeDnsConfig(CreateValidDnsConfig());
4233 proc_->AddRuleForAllFamilies(std::string(), std::string());
4234
Eric Orth117e1992019-04-17 00:24:154235 ResolveHostResponseHelper dns_response(resolver_->CreateRequest(
4236 HostPortPair("ok", 80), NetLogWithSource(), base::nullopt,
4237 request_context_.get(), host_cache_.get()));
Eric Orthdc35748e2018-08-23 22:41:484238
4239 HostResolver::ResolveHostParameters parameters;
4240 parameters.source = HostResolverSource::SYSTEM;
Eric Orth117e1992019-04-17 00:24:154241 ResolveHostResponseHelper system_response(resolver_->CreateRequest(
4242 HostPortPair("ok", 80), NetLogWithSource(), parameters,
4243 request_context_.get(), host_cache_.get()));
Eric Orthdc35748e2018-08-23 22:41:484244
4245 proc_->SignalMultiple(2u);
4246
4247 EXPECT_THAT(dns_response.result_error(), IsOk());
4248 EXPECT_THAT(system_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
4249}
4250
dalykc27699a2019-07-29 20:53:294251TEST_F(HostResolverManagerDnsTest,
4252 DisableInsecureDnsClientOnPersistentFailure) {
[email protected]f0f602bd2012-11-15 18:01:024253 ChangeDnsConfig(CreateValidDnsConfig());
4254
[email protected]007b3f82013-04-09 08:46:454255 proc_->AddRuleForAllFamilies(std::string(),
4256 std::string()); // Default to failures.
[email protected]f0f602bd2012-11-15 18:01:024257
4258 // Check that DnsTask works.
Eric Orth117e1992019-04-17 00:24:154259 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
4260 HostPortPair("ok_1", 80), NetLogWithSource(), base::nullopt,
4261 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004262 EXPECT_THAT(initial_response.result_error(), IsOk());
4263
4264 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
dalykc27699a2019-07-29 20:53:294265 for (unsigned i = 0; i < maximum_insecure_dns_task_failures(); ++i) {
Eric Orth70992982018-07-24 00:25:004266 // Use custom names to require separate Jobs.
4267 std::string hostname = base::StringPrintf("nx_%u", i);
4268 // Ensure fallback to ProcTask succeeds.
4269 proc_->AddRuleForAllFamilies(hostname, "192.168.1.101");
Eric Orth117e1992019-04-17 00:24:154270 responses.emplace_back(
4271 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
4272 HostPortPair(hostname, 80), NetLogWithSource(), base::nullopt,
4273 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:004274 }
4275
4276 proc_->SignalMultiple(responses.size());
4277
4278 for (size_t i = 0; i < responses.size(); ++i)
4279 EXPECT_THAT(responses[i]->result_error(), IsOk());
4280
4281 ASSERT_FALSE(proc_->HasBlockedRequests());
4282
dalykc27699a2019-07-29 20:53:294283 // Insecure DnsTasks should be disabled by now unless explicitly requested via
4284 // |source|.
Eric Orth117e1992019-04-17 00:24:154285 ResolveHostResponseHelper fail_response(resolver_->CreateRequest(
4286 HostPortPair("ok_2", 80), NetLogWithSource(), base::nullopt,
4287 request_context_.get(), host_cache_.get()));
Eric Orth60931742018-11-05 23:40:574288 HostResolver::ResolveHostParameters parameters;
4289 parameters.source = HostResolverSource::DNS;
Eric Orth117e1992019-04-17 00:24:154290 ResolveHostResponseHelper dns_response(resolver_->CreateRequest(
4291 HostPortPair("ok_2", 80), NetLogWithSource(), parameters,
4292 request_context_.get(), host_cache_.get()));
Eric Orth60931742018-11-05 23:40:574293 proc_->SignalMultiple(2u);
Eric Orth70992982018-07-24 00:25:004294 EXPECT_THAT(fail_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
Eric Orth60931742018-11-05 23:40:574295 EXPECT_THAT(dns_response.result_error(), IsOk());
Eric Orth70992982018-07-24 00:25:004296
dalykc27699a2019-07-29 20:53:294297 // Secure DnsTasks should not be affected.
4298 HostResolver::ResolveHostParameters secure_parameters;
4299 secure_parameters.secure_dns_mode_override =
4300 DnsConfig::SecureDnsMode::AUTOMATIC;
4301 ResolveHostResponseHelper secure_response(resolver_->CreateRequest(
4302 HostPortPair("automatic", 80), NetLogWithSource(), secure_parameters,
4303 request_context_.get(), host_cache_.get()));
4304 EXPECT_THAT(secure_response.result_error(), IsOk());
4305
Eric Orth70992982018-07-24 00:25:004306 // Check that it is re-enabled after DNS change.
4307 ChangeDnsConfig(CreateValidDnsConfig());
Eric Orth117e1992019-04-17 00:24:154308 ResolveHostResponseHelper reenabled_response(resolver_->CreateRequest(
4309 HostPortPair("ok_3", 80), NetLogWithSource(), base::nullopt,
4310 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004311 EXPECT_THAT(reenabled_response.result_error(), IsOk());
4312}
4313
Eric Orth960e7062019-03-08 18:43:544314TEST_F(HostResolverManagerDnsTest, DontDisableDnsClientOnSporadicFailure) {
[email protected]f0f602bd2012-11-15 18:01:024315 ChangeDnsConfig(CreateValidDnsConfig());
4316
4317 // |proc_| defaults to successes.
4318
4319 // 20 failures interleaved with 20 successes.
Eric Orth70992982018-07-24 00:25:004320 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
4321 for (unsigned i = 0; i < 40; ++i) {
4322 // Use custom names to require separate Jobs.
4323 std::string hostname = (i % 2) == 0 ? base::StringPrintf("nx_%u", i)
4324 : base::StringPrintf("ok_%u", i);
Eric Orth117e1992019-04-17 00:24:154325 responses.emplace_back(
4326 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
4327 HostPortPair(hostname, 80), NetLogWithSource(), base::nullopt,
4328 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:004329 }
4330
4331 proc_->SignalMultiple(40u);
4332
Eric Orth26fa08e2019-02-22 01:28:374333 for (const auto& response : responses)
4334 EXPECT_THAT(response->result_error(), IsOk());
Eric Orth70992982018-07-24 00:25:004335
4336 // Make |proc_| default to failures.
4337 proc_->AddRuleForAllFamilies(std::string(), std::string());
4338
4339 // DnsTask should still be enabled.
Eric Orth117e1992019-04-17 00:24:154340 ResolveHostResponseHelper final_response(resolver_->CreateRequest(
4341 HostPortPair("ok_last", 80), NetLogWithSource(), base::nullopt,
4342 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004343 EXPECT_THAT(final_response.result_error(), IsOk());
4344}
4345
[email protected]ec666ab22013-04-17 20:05:594346// Confirm that resolving "localhost" is unrestricted even if there are no
4347// global IPv6 address. See SystemHostResolverCall for rationale.
4348// Test both the DnsClient and system host resolver paths.
Eric Orth960e7062019-03-08 18:43:544349TEST_F(HostResolverManagerDnsTest, DualFamilyLocalhost) {
Eric Orth70992982018-07-24 00:25:004350 CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:324351 false /* ipv6_reachable */,
4352 true /* check_ipv6_on_wifi */);
Eric Orth70992982018-07-24 00:25:004353
4354 // Make request fail if we actually get to the system resolver.
4355 proc_->AddRuleForAllFamilies(std::string(), std::string());
4356
4357 // Try without DnsClient.
dalykc27699a2019-07-29 20:53:294358 resolver_->SetInsecureDnsClientEnabled(false);
Eric Orth70992982018-07-24 00:25:004359 ResolveHostResponseHelper system_response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:274360 HostPortPair("localhost", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:154361 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004362 EXPECT_THAT(system_response.result_error(), IsOk());
4363 EXPECT_THAT(
4364 system_response.request()->GetAddressResults().value().endpoints(),
4365 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4366 CreateExpected("::1", 80)));
4367
4368 // With DnsClient
Eric Orth828bd3ae2018-12-12 17:30:364369 UseMockDnsClient(CreateValidDnsConfig(), CreateDefaultDnsRules());
Eric Orth70992982018-07-24 00:25:004370 ResolveHostResponseHelper builtin_response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:274371 HostPortPair("localhost", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:154372 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004373 EXPECT_THAT(builtin_response.result_error(), IsOk());
4374 EXPECT_THAT(
4375 builtin_response.request()->GetAddressResults().value().endpoints(),
4376 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4377 CreateExpected("::1", 80)));
4378
4379 // DnsClient configured without ipv6 (but ipv6 should still work for
4380 // localhost).
4381 DnsConfig config = CreateValidDnsConfig();
4382 config.use_local_ipv6 = false;
4383 ChangeDnsConfig(config);
4384 ResolveHostResponseHelper ipv6_disabled_response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:274385 HostPortPair("localhost", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:154386 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004387 EXPECT_THAT(ipv6_disabled_response.result_error(), IsOk());
4388 EXPECT_THAT(
4389 ipv6_disabled_response.request()->GetAddressResults().value().endpoints(),
4390 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4391 CreateExpected("::1", 80)));
4392}
4393
dalykc27699a2019-07-29 20:53:294394TEST_F(HostResolverManagerDnsTest, SeparateJobsBySecureDnsMode) {
4395 MockDnsClientRuleList rules;
4396 rules.emplace_back("a", dns_protocol::kTypeA, true /* secure */,
4397 MockDnsClientRule::Result(MockDnsClientRule::FAIL),
4398 true /* delay */);
4399 rules.emplace_back("a", dns_protocol::kTypeAAAA, true /* secure */,
4400 MockDnsClientRule::Result(MockDnsClientRule::FAIL),
4401 true /* delay */);
4402 rules.emplace_back("a", dns_protocol::kTypeA, false /* secure */,
4403 MockDnsClientRule::Result(MockDnsClientRule::OK),
4404 false /* delay */);
4405 rules.emplace_back("a", dns_protocol::kTypeAAAA, false /* secure */,
4406 MockDnsClientRule::Result(MockDnsClientRule::OK),
4407 false /* delay */);
4408 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
4409 DnsConfigOverrides overrides;
4410 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
4411 resolver_->SetDnsConfigOverrides(overrides);
4412
4413 // Create three requests. One with a SECURE mode override, one with no
4414 // mode override, and one with an AUTOMATIC mode override (which is a no-op
4415 // since the DnsConfig uses AUTOMATIC).
4416 HostResolver::ResolveHostParameters parameters_secure_override;
4417 parameters_secure_override.secure_dns_mode_override =
4418 DnsConfig::SecureDnsMode::SECURE;
4419 ResolveHostResponseHelper secure_response(resolver_->CreateRequest(
4420 HostPortPair("a", 80), NetLogWithSource(), parameters_secure_override,
4421 request_context_.get(), host_cache_.get()));
4422 EXPECT_EQ(1u, resolver_->num_jobs_for_testing());
4423
4424 ResolveHostResponseHelper automatic_response0(resolver_->CreateRequest(
4425 HostPortPair("a", 80), NetLogWithSource(), base::nullopt,
4426 request_context_.get(), host_cache_.get()));
4427 EXPECT_EQ(2u, resolver_->num_jobs_for_testing());
4428
4429 HostResolver::ResolveHostParameters parameters_automatic_override;
4430 parameters_automatic_override.secure_dns_mode_override =
4431 DnsConfig::SecureDnsMode::AUTOMATIC;
4432 ResolveHostResponseHelper automatic_response1(resolver_->CreateRequest(
4433 HostPortPair("a", 80), NetLogWithSource(), parameters_automatic_override,
4434 request_context_.get(), host_cache_.get()));
4435 // The AUTOMATIC mode requests should be joined into the same job.
4436 EXPECT_EQ(2u, resolver_->num_jobs_for_testing());
4437
4438 // All requests should be blocked on the secure transactions.
4439 base::RunLoop().RunUntilIdle();
4440 EXPECT_FALSE(secure_response.complete());
4441 EXPECT_FALSE(automatic_response0.complete());
4442 EXPECT_FALSE(automatic_response1.complete());
4443
4444 // Complete secure transactions.
4445 dns_client_->CompleteDelayedTransactions();
4446 EXPECT_THAT(secure_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
4447 EXPECT_THAT(automatic_response0.result_error(), IsOk());
4448 EXPECT_THAT(automatic_response1.result_error(), IsOk());
4449}
4450
[email protected]daae1322013-09-05 18:26:504451// Cancel a request with a single DNS transaction active.
Eric Orth960e7062019-03-08 18:43:544452TEST_F(HostResolverManagerDnsTest, CancelWithOneTransactionActive) {
Eric Orth70992982018-07-24 00:25:004453 // Disable ipv6 to ensure we'll only try a single transaction for the host.
4454 CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:324455 false /* ipv6_reachable */,
4456 true /* check_ipv6_on_wifi */);
Eric Orth70992982018-07-24 00:25:004457 DnsConfig config = CreateValidDnsConfig();
4458 config.use_local_ipv6 = false;
4459 ChangeDnsConfig(config);
4460
Eric Orth117e1992019-04-17 00:24:154461 ResolveHostResponseHelper response(resolver_->CreateRequest(
4462 HostPortPair("ok", 80), NetLogWithSource(), base::nullopt,
4463 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004464 ASSERT_FALSE(response.complete());
4465 ASSERT_EQ(1u, num_running_dispatcher_jobs());
4466
4467 response.CancelRequest();
4468 base::RunLoop().RunUntilIdle();
4469 EXPECT_FALSE(response.complete());
4470
4471 // Dispatcher state checked in TearDown.
4472}
4473
[email protected]daae1322013-09-05 18:26:504474// Cancel a request with a single DNS transaction active and another pending.
Eric Orth960e7062019-03-08 18:43:544475TEST_F(HostResolverManagerDnsTest, CancelWithOneTransactionActiveOnePending) {
[email protected]daae1322013-09-05 18:26:504476 CreateSerialResolver();
[email protected]daae1322013-09-05 18:26:504477 ChangeDnsConfig(CreateValidDnsConfig());
4478
Eric Orth117e1992019-04-17 00:24:154479 ResolveHostResponseHelper response(resolver_->CreateRequest(
4480 HostPortPair("ok", 80), NetLogWithSource(), base::nullopt,
4481 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004482 EXPECT_EQ(1u, num_running_dispatcher_jobs());
4483
4484 response.CancelRequest();
4485 base::RunLoop().RunUntilIdle();
4486 EXPECT_FALSE(response.complete());
4487
4488 // Dispatcher state checked in TearDown.
4489}
4490
[email protected]daae1322013-09-05 18:26:504491// Cancel a request with two DNS transactions active.
Eric Orth960e7062019-03-08 18:43:544492TEST_F(HostResolverManagerDnsTest, CancelWithTwoTransactionsActive) {
[email protected]daae1322013-09-05 18:26:504493 ChangeDnsConfig(CreateValidDnsConfig());
4494
Eric Orth117e1992019-04-17 00:24:154495 ResolveHostResponseHelper response(resolver_->CreateRequest(
4496 HostPortPair("ok", 80), NetLogWithSource(), base::nullopt,
4497 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004498 EXPECT_EQ(2u, num_running_dispatcher_jobs());
4499
4500 response.CancelRequest();
4501 base::RunLoop().RunUntilIdle();
4502 EXPECT_FALSE(response.complete());
4503
4504 // Dispatcher state checked in TearDown.
4505}
4506
[email protected]daae1322013-09-05 18:26:504507// Delete a resolver with some active requests and some queued requests.
Eric Orth960e7062019-03-08 18:43:544508TEST_F(HostResolverManagerDnsTest, DeleteWithActiveTransactions) {
[email protected]daae1322013-09-05 18:26:504509 // At most 10 Jobs active at once.
Eric Orth70992982018-07-24 00:25:004510 CreateResolverWithLimitsAndParams(10u, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:324511 true /* ipv6_reachable */,
4512 true /* check_ipv6_on_wifi */);
[email protected]daae1322013-09-05 18:26:504513
[email protected]daae1322013-09-05 18:26:504514 ChangeDnsConfig(CreateValidDnsConfig());
4515
Eric Orth70992982018-07-24 00:25:004516 // Add 12 DNS lookups (creating well more than 10 transaction).
4517 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
4518 for (int i = 0; i < 12; ++i) {
4519 std::string hostname = base::StringPrintf("ok%i", i);
Eric Orth117e1992019-04-17 00:24:154520 responses.emplace_back(
4521 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
4522 HostPortPair(hostname, 80), NetLogWithSource(), base::nullopt,
4523 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:004524 }
4525 EXPECT_EQ(10u, num_running_dispatcher_jobs());
4526
Eric Orth37b18192019-04-22 19:09:284527 DestroyResolver();
Eric Orth70992982018-07-24 00:25:004528
4529 base::RunLoop().RunUntilIdle();
4530 for (auto& response : responses) {
4531 EXPECT_FALSE(response->complete());
4532 }
4533}
4534
dalykc682ba3c2019-08-21 17:16:234535TEST_F(HostResolverManagerDnsTest, DeleteWithSecureTransactions) {
4536 ChangeDnsConfig(CreateValidDnsConfig());
4537 DnsConfigOverrides overrides;
4538 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::SECURE;
4539 resolver_->SetDnsConfigOverrides(overrides);
4540
4541 ResolveHostResponseHelper response(resolver_->CreateRequest(
4542 HostPortPair("secure", 80), NetLogWithSource(), base::nullopt,
4543 request_context_.get(), host_cache_.get()));
4544
4545 DestroyResolver();
4546
4547 base::RunLoop().RunUntilIdle();
4548 EXPECT_FALSE(response.complete());
4549}
4550
Eric Orth5233c3a2019-04-08 17:01:144551TEST_F(HostResolverManagerDnsTest, DeleteWithCompletedRequests) {
4552 ChangeDnsConfig(CreateValidDnsConfig());
4553
Eric Orth117e1992019-04-17 00:24:154554 ResolveHostResponseHelper response(resolver_->CreateRequest(
4555 HostPortPair("ok", 80), NetLogWithSource(), base::nullopt,
4556 request_context_.get(), host_cache_.get()));
Eric Orth5233c3a2019-04-08 17:01:144557
4558 EXPECT_THAT(response.result_error(), IsOk());
4559 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
4560 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4561 CreateExpected("::1", 80)));
4562
Eric Orth37b18192019-04-22 19:09:284563 DestroyResolver();
Eric Orth5233c3a2019-04-08 17:01:144564
4565 // Completed requests should be unaffected by manager destruction.
4566 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
4567 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4568 CreateExpected("::1", 80)));
4569}
4570
4571TEST_F(HostResolverManagerDnsTest, ExplicitCancel) {
4572 ChangeDnsConfig(CreateValidDnsConfig());
4573
4574 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:274575 HostPortPair("4slow_4ok", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:154576 request_context_.get(), host_cache_.get()));
Eric Orth5233c3a2019-04-08 17:01:144577
4578 response.request()->Cancel();
4579 dns_client_->CompleteDelayedTransactions();
4580
4581 base::RunLoop().RunUntilIdle();
4582 EXPECT_FALSE(response.complete());
4583}
4584
4585TEST_F(HostResolverManagerDnsTest, ExplicitCancel_Completed) {
4586 ChangeDnsConfig(CreateValidDnsConfig());
4587
Eric Orth117e1992019-04-17 00:24:154588 ResolveHostResponseHelper response(resolver_->CreateRequest(
4589 HostPortPair("ok", 80), NetLogWithSource(), base::nullopt,
4590 request_context_.get(), host_cache_.get()));
Eric Orth5233c3a2019-04-08 17:01:144591
4592 EXPECT_THAT(response.result_error(), IsOk());
4593 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
4594 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4595 CreateExpected("::1", 80)));
4596
4597 response.request()->Cancel();
4598
4599 // Completed requests should be unaffected by cancellation.
4600 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
4601 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4602 CreateExpected("::1", 80)));
4603}
4604
[email protected]daae1322013-09-05 18:26:504605// Cancel a request with only the IPv6 transaction active.
Eric Orth960e7062019-03-08 18:43:544606TEST_F(HostResolverManagerDnsTest, CancelWithIPv6TransactionActive) {
[email protected]daae1322013-09-05 18:26:504607 ChangeDnsConfig(CreateValidDnsConfig());
4608
Eric Orth117e1992019-04-17 00:24:154609 ResolveHostResponseHelper response(resolver_->CreateRequest(
4610 HostPortPair("6slow_ok", 80), NetLogWithSource(), base::nullopt,
4611 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004612 EXPECT_EQ(2u, num_running_dispatcher_jobs());
4613
4614 // The IPv4 request should complete, the IPv6 request is still pending.
4615 base::RunLoop().RunUntilIdle();
4616 EXPECT_EQ(1u, num_running_dispatcher_jobs());
4617
4618 response.CancelRequest();
4619 base::RunLoop().RunUntilIdle();
4620 EXPECT_FALSE(response.complete());
4621
4622 // Dispatcher state checked in TearDown.
4623}
4624
[email protected]daae1322013-09-05 18:26:504625// Cancel a request with only the IPv4 transaction pending.
Eric Orth960e7062019-03-08 18:43:544626TEST_F(HostResolverManagerDnsTest, CancelWithIPv4TransactionPending) {
Eric Orth60931742018-11-05 23:40:574627 set_allow_fallback_to_proctask(false);
[email protected]daae1322013-09-05 18:26:504628 ChangeDnsConfig(CreateValidDnsConfig());
4629
Eric Orth117e1992019-04-17 00:24:154630 ResolveHostResponseHelper response(resolver_->CreateRequest(
4631 HostPortPair("4slow_ok", 80), NetLogWithSource(), base::nullopt,
4632 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004633 EXPECT_EQ(2u, num_running_dispatcher_jobs());
4634
4635 // The IPv6 request should complete, the IPv4 request is still pending.
4636 base::RunLoop().RunUntilIdle();
4637 EXPECT_EQ(1u, num_running_dispatcher_jobs());
4638
4639 response.CancelRequest();
4640 base::RunLoop().RunUntilIdle();
4641 EXPECT_FALSE(response.complete());
4642}
4643
dalyk4f4ac712019-05-31 16:33:134644TEST_F(HostResolverManagerDnsTest, CancelWithAutomaticModeTransactionPending) {
4645 MockDnsClientRuleList rules;
4646 rules.emplace_back("secure_6slow_6nx_insecure_6slow_ok", dns_protocol::kTypeA,
4647 true /* secure */,
4648 MockDnsClientRule::Result(MockDnsClientRule::OK),
4649 false /* delay */);
4650 rules.emplace_back("secure_6slow_6nx_insecure_6slow_ok",
4651 dns_protocol::kTypeAAAA, true /* secure */,
4652 MockDnsClientRule::Result(MockDnsClientRule::FAIL),
4653 true /* delay */);
4654 rules.emplace_back("secure_6slow_6nx_insecure_6slow_ok", dns_protocol::kTypeA,
4655 false /* secure */,
4656 MockDnsClientRule::Result(MockDnsClientRule::OK),
4657 false /* delay */);
4658 rules.emplace_back("secure_6slow_6nx_insecure_6slow_ok",
4659 dns_protocol::kTypeAAAA, false /* secure */,
4660 MockDnsClientRule::Result(MockDnsClientRule::OK),
4661 true /* delay */);
4662 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
4663
4664 DnsConfigOverrides overrides;
4665 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
4666 resolver_->SetDnsConfigOverrides(overrides);
4667
4668 ResolveHostResponseHelper response0(resolver_->CreateRequest(
4669 HostPortPair("secure_6slow_6nx_insecure_6slow_ok", 80),
4670 NetLogWithSource(), base::nullopt, request_context_.get(),
4671 host_cache_.get()));
dalykc682ba3c2019-08-21 17:16:234672 EXPECT_EQ(0u, num_running_dispatcher_jobs());
dalyk4f4ac712019-05-31 16:33:134673
4674 // The secure IPv4 request should complete, the secure IPv6 request is still
4675 // pending.
4676 base::RunLoop().RunUntilIdle();
dalykc682ba3c2019-08-21 17:16:234677 EXPECT_EQ(0u, num_running_dispatcher_jobs());
dalyk4f4ac712019-05-31 16:33:134678
4679 response0.CancelRequest();
4680 base::RunLoop().RunUntilIdle();
4681 EXPECT_FALSE(response0.complete());
4682 EXPECT_EQ(0u, num_running_dispatcher_jobs());
4683
4684 ResolveHostResponseHelper response1(resolver_->CreateRequest(
4685 HostPortPair("secure_6slow_6nx_insecure_6slow_ok", 80),
4686 NetLogWithSource(), base::nullopt, request_context_.get(),
4687 host_cache_.get()));
dalykc682ba3c2019-08-21 17:16:234688 EXPECT_EQ(0u, num_running_dispatcher_jobs());
dalyk4f4ac712019-05-31 16:33:134689
4690 // The secure IPv4 request should complete, the secure IPv6 request is still
4691 // pending.
4692 base::RunLoop().RunUntilIdle();
dalykc682ba3c2019-08-21 17:16:234693 EXPECT_EQ(0u, num_running_dispatcher_jobs());
dalyk4f4ac712019-05-31 16:33:134694
4695 // Let the secure IPv6 request complete and start the insecure requests.
4696 dns_client_->CompleteDelayedTransactions();
4697 EXPECT_EQ(2u, num_running_dispatcher_jobs());
4698
4699 // The insecure IPv4 request should complete, the insecure IPv6 request is
4700 // still pending.
4701 base::RunLoop().RunUntilIdle();
4702 EXPECT_EQ(1u, num_running_dispatcher_jobs());
4703
4704 response1.CancelRequest();
4705 base::RunLoop().RunUntilIdle();
4706 EXPECT_FALSE(response1.complete());
4707
4708 // Dispatcher state checked in TearDown.
4709}
4710
[email protected]daae1322013-09-05 18:26:504711// Test cases where AAAA completes first.
Eric Orth960e7062019-03-08 18:43:544712TEST_F(HostResolverManagerDnsTest, AAAACompletesFirst) {
Eric Orth60931742018-11-05 23:40:574713 set_allow_fallback_to_proctask(false);
[email protected]daae1322013-09-05 18:26:504714 ChangeDnsConfig(CreateValidDnsConfig());
4715
Eric Orth70992982018-07-24 00:25:004716 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:154717 responses.emplace_back(
4718 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
4719 HostPortPair("4slow_ok", 80), NetLogWithSource(), base::nullopt,
4720 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:004721 responses.emplace_back(
4722 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:274723 HostPortPair("4slow_4ok", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:154724 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:004725 responses.emplace_back(
4726 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:274727 HostPortPair("4slow_4timeout", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:154728 request_context_.get(), host_cache_.get())));
Eric Orth6f1c5172019-04-16 17:08:274729 responses.emplace_back(
4730 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
4731 HostPortPair("4slow_6timeout", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:154732 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:004733
4734 base::RunLoop().RunUntilIdle();
4735 EXPECT_FALSE(responses[0]->complete());
4736 EXPECT_FALSE(responses[1]->complete());
4737 EXPECT_FALSE(responses[2]->complete());
4738 // The IPv6 of request 3 should have failed and resulted in cancelling the
4739 // IPv4 request.
4740 EXPECT_THAT(responses[3]->result_error(), IsError(ERR_DNS_TIMED_OUT));
4741 EXPECT_EQ(3u, num_running_dispatcher_jobs());
4742
4743 dns_client_->CompleteDelayedTransactions();
4744 EXPECT_THAT(responses[0]->result_error(), IsOk());
4745 EXPECT_THAT(responses[0]->request()->GetAddressResults().value().endpoints(),
4746 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4747 CreateExpected("::1", 80)));
4748
4749 EXPECT_THAT(responses[1]->result_error(), IsOk());
4750 EXPECT_THAT(responses[1]->request()->GetAddressResults().value().endpoints(),
4751 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
4752
4753 EXPECT_THAT(responses[2]->result_error(), IsError(ERR_DNS_TIMED_OUT));
4754}
4755
dalyk4f4ac712019-05-31 16:33:134756TEST_F(HostResolverManagerDnsTest, AAAACompletesFirst_AutomaticMode) {
dalyk48b20a992019-02-25 16:10:264757 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:134758 rules.emplace_back("secure_slow_nx_insecure_4slow_ok", dns_protocol::kTypeA,
4759 true /* secure */,
4760 MockDnsClientRule::Result(MockDnsClientRule::FAIL),
4761 true /* delay */);
4762 rules.emplace_back("secure_slow_nx_insecure_4slow_ok",
4763 dns_protocol::kTypeAAAA, true /* secure */,
4764 MockDnsClientRule::Result(MockDnsClientRule::FAIL),
4765 true /* delay */);
4766 rules.emplace_back("secure_slow_nx_insecure_4slow_ok", dns_protocol::kTypeA,
4767 false /* secure */,
4768 MockDnsClientRule::Result(MockDnsClientRule::OK),
4769 true /* delay */);
4770 rules.emplace_back("secure_slow_nx_insecure_4slow_ok",
4771 dns_protocol::kTypeAAAA, false /* secure */,
4772 MockDnsClientRule::Result(MockDnsClientRule::EMPTY),
4773 false /* delay */);
dalyk48b20a992019-02-25 16:10:264774 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
dalyk4f4ac712019-05-31 16:33:134775 DnsConfigOverrides overrides;
4776 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
4777 resolver_->SetDnsConfigOverrides(overrides);
dalyk48b20a992019-02-25 16:10:264778
dalyk4f4ac712019-05-31 16:33:134779 ResolveHostResponseHelper response(resolver_->CreateRequest(
4780 HostPortPair("secure_slow_nx_insecure_4slow_ok", 80), NetLogWithSource(),
4781 base::nullopt, request_context_.get(), host_cache_.get()));
dalyk48b20a992019-02-25 16:10:264782 base::RunLoop().RunUntilIdle();
dalyk4f4ac712019-05-31 16:33:134783 EXPECT_FALSE(response.complete());
4784 // Complete the secure transactions.
dalyk48b20a992019-02-25 16:10:264785 dns_client_->CompleteDelayedTransactions();
dalyk4f4ac712019-05-31 16:33:134786 base::RunLoop().RunUntilIdle();
4787 EXPECT_FALSE(response.complete());
4788 // Complete the insecure transactions.
4789 dns_client_->CompleteDelayedTransactions();
4790 ASSERT_THAT(response.result_error(), IsOk());
4791 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
4792 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
4793 HostCache::Key insecure_key = HostCache::Key(
4794 "secure_slow_nx_insecure_4slow_ok", DnsQueryType::UNSPECIFIED,
4795 0 /* host_resolver_flags */, HostResolverSource::ANY);
4796 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result =
4797 GetCacheHit(insecure_key);
4798 EXPECT_TRUE(!!cache_result);
4799}
4800
4801TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Automatic) {
4802 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.100");
4803 set_allow_fallback_to_proctask(true);
4804
4805 ChangeDnsConfig(CreateValidDnsConfig());
4806 DnsConfigOverrides overrides;
4807 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
4808 resolver_->SetDnsConfigOverrides(overrides);
dalyk48b20a992019-02-25 16:10:264809 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result;
4810
dalyk4f4ac712019-05-31 16:33:134811 // A successful DoH request should result in a secure cache entry.
4812 ResolveHostResponseHelper response_secure(resolver_->CreateRequest(
4813 HostPortPair("automatic", 80), NetLogWithSource(), base::nullopt,
4814 request_context_.get(), host_cache_.get()));
4815 ASSERT_THAT(response_secure.result_error(), IsOk());
4816 EXPECT_THAT(
4817 response_secure.request()->GetAddressResults().value().endpoints(),
4818 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4819 CreateExpected("::1", 80)));
4820 HostCache::Key secure_key =
4821 HostCache::Key("automatic", DnsQueryType::UNSPECIFIED,
4822 0 /* host_resolver_flags */, HostResolverSource::ANY);
4823 secure_key.secure = true;
4824 cache_result = GetCacheHit(secure_key);
4825 EXPECT_TRUE(!!cache_result);
4826
4827 // A successful plaintext DNS request should result in an insecure cache
4828 // entry.
4829 ResolveHostResponseHelper response_insecure(resolver_->CreateRequest(
4830 HostPortPair("insecure_automatic", 80), NetLogWithSource(), base::nullopt,
4831 request_context_.get(), host_cache_.get()));
4832 ASSERT_THAT(response_insecure.result_error(), IsOk());
4833 EXPECT_THAT(
4834 response_insecure.request()->GetAddressResults().value().endpoints(),
4835 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4836 CreateExpected("::1", 80)));
4837 HostCache::Key insecure_key =
4838 HostCache::Key("insecure_automatic", DnsQueryType::UNSPECIFIED,
4839 0 /* host_resolver_flags */, HostResolverSource::ANY);
4840 cache_result = GetCacheHit(insecure_key);
4841 EXPECT_TRUE(!!cache_result);
4842
4843 // Fallback to ProcTask allowed in AUTOMATIC mode.
4844 ResolveHostResponseHelper response_proc(resolver_->CreateRequest(
4845 HostPortPair("nx_succeed", 80), NetLogWithSource(), base::nullopt,
4846 request_context_.get(), host_cache_.get()));
4847 proc_->SignalMultiple(1u);
4848 EXPECT_THAT(response_proc.result_error(), IsOk());
4849 EXPECT_THAT(response_proc.request()->GetAddressResults().value().endpoints(),
4850 testing::ElementsAre(CreateExpected("192.168.1.100", 80)));
4851}
4852
dalyke966a1832019-06-05 20:53:134853TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Automatic_SecureCache) {
4854 ChangeDnsConfig(CreateValidDnsConfig());
4855 DnsConfigOverrides overrides;
4856 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
4857 resolver_->SetDnsConfigOverrides(overrides);
4858
4859 // Populate cache with a secure entry.
4860 HostCache::Key cached_secure_key =
4861 HostCache::Key("automatic_cached", DnsQueryType::UNSPECIFIED,
4862 0 /* host_resolver_flags */, HostResolverSource::ANY);
4863 cached_secure_key.secure = true;
4864 IPEndPoint kExpectedSecureIP = CreateExpected("192.168.1.102", 80);
4865 PopulateCache(cached_secure_key, kExpectedSecureIP);
4866
4867 // The secure cache should be checked prior to any DoH request being sent.
4868 ResolveHostResponseHelper response_secure_cached(resolver_->CreateRequest(
4869 HostPortPair("automatic_cached", 80), NetLogWithSource(), base::nullopt,
4870 request_context_.get(), host_cache_.get()));
4871 EXPECT_THAT(response_secure_cached.result_error(), IsOk());
4872 EXPECT_THAT(
4873 response_secure_cached.request()->GetAddressResults().value().endpoints(),
4874 testing::ElementsAre(kExpectedSecureIP));
4875 EXPECT_FALSE(
4876 response_secure_cached.request()->GetStaleInfo().value().is_stale());
4877}
4878
4879TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Automatic_InsecureCache) {
4880 ChangeDnsConfig(CreateValidDnsConfig());
4881 DnsConfigOverrides overrides;
4882 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
4883 resolver_->SetDnsConfigOverrides(overrides);
4884
4885 // Populate cache with an insecure entry.
4886 HostCache::Key cached_insecure_key =
4887 HostCache::Key("insecure_automatic_cached", DnsQueryType::UNSPECIFIED,
4888 0 /* host_resolver_flags */, HostResolverSource::ANY);
4889 IPEndPoint kExpectedInsecureIP = CreateExpected("192.168.1.103", 80);
4890 PopulateCache(cached_insecure_key, kExpectedInsecureIP);
4891
4892 // The insecure cache should be checked after DoH requests fail.
4893 ResolveHostResponseHelper response_insecure_cached(resolver_->CreateRequest(
4894 HostPortPair("insecure_automatic_cached", 80), NetLogWithSource(),
4895 base::nullopt, request_context_.get(), host_cache_.get()));
4896 EXPECT_THAT(response_insecure_cached.result_error(), IsOk());
4897 EXPECT_THAT(response_insecure_cached.request()
4898 ->GetAddressResults()
4899 .value()
4900 .endpoints(),
4901 testing::ElementsAre(kExpectedInsecureIP));
4902 EXPECT_FALSE(
4903 response_insecure_cached.request()->GetStaleInfo().value().is_stale());
4904}
4905
dalyk4f4ac712019-05-31 16:33:134906TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Automatic_Downgrade) {
4907 ChangeDnsConfig(CreateValidDnsConfig());
4908 // Remove all DoH servers from the config so there is no DoH server available.
4909 DnsConfigOverrides overrides;
4910 std::vector<DnsConfig::DnsOverHttpsServerConfig> doh_servers;
4911 overrides.dns_over_https_servers = doh_servers;
4912 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
4913 resolver_->SetDnsConfigOverrides(overrides);
4914 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result;
4915
dalyke966a1832019-06-05 20:53:134916 // Populate cache with both secure and insecure entries.
4917 HostCache::Key cached_secure_key =
4918 HostCache::Key("automatic_cached", DnsQueryType::UNSPECIFIED,
4919 0 /* host_resolver_flags */, HostResolverSource::ANY);
4920 cached_secure_key.secure = true;
4921 IPEndPoint kExpectedSecureIP = CreateExpected("192.168.1.102", 80);
4922 PopulateCache(cached_secure_key, kExpectedSecureIP);
4923 HostCache::Key cached_insecure_key =
4924 HostCache::Key("insecure_automatic_cached", DnsQueryType::UNSPECIFIED,
4925 0 /* host_resolver_flags */, HostResolverSource::ANY);
4926 IPEndPoint kExpectedInsecureIP = CreateExpected("192.168.1.103", 80);
4927 PopulateCache(cached_insecure_key, kExpectedInsecureIP);
4928
4929 // The secure cache should still be checked first.
4930 ResolveHostResponseHelper response_cached(resolver_->CreateRequest(
4931 HostPortPair("automatic_cached", 80), NetLogWithSource(), base::nullopt,
4932 request_context_.get(), host_cache_.get()));
4933 EXPECT_THAT(response_cached.result_error(), IsOk());
4934 EXPECT_THAT(
4935 response_cached.request()->GetAddressResults().value().endpoints(),
4936 testing::ElementsAre(kExpectedSecureIP));
4937
4938 // The insecure cache should be checked before any insecure requests are sent.
4939 ResolveHostResponseHelper insecure_response_cached(resolver_->CreateRequest(
4940 HostPortPair("insecure_automatic_cached", 80), NetLogWithSource(),
4941 base::nullopt, request_context_.get(), host_cache_.get()));
4942 EXPECT_THAT(insecure_response_cached.result_error(), IsOk());
4943 EXPECT_THAT(insecure_response_cached.request()
4944 ->GetAddressResults()
4945 .value()
4946 .endpoints(),
4947 testing::ElementsAre(kExpectedInsecureIP));
4948
dalyk4f4ac712019-05-31 16:33:134949 // The DnsConfig doesn't contain DoH servers so AUTOMATIC mode will be
4950 // downgraded to OFF. A successful plaintext DNS request should result in an
4951 // insecure cache entry.
4952 ResolveHostResponseHelper response(resolver_->CreateRequest(
4953 HostPortPair("automatic", 80), NetLogWithSource(), base::nullopt,
4954 request_context_.get(), host_cache_.get()));
4955 ASSERT_THAT(response.result_error(), IsOk());
4956 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
dalyk48b20a992019-02-25 16:10:264957 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4958 CreateExpected("::1", 80)));
4959 HostCache::Key key =
dalyk4f4ac712019-05-31 16:33:134960 HostCache::Key("automatic", DnsQueryType::UNSPECIFIED,
dalyk48b20a992019-02-25 16:10:264961 0 /* host_resolver_flags */, HostResolverSource::ANY);
dalyk48b20a992019-02-25 16:10:264962 cache_result = GetCacheHit(key);
4963 EXPECT_TRUE(!!cache_result);
dalyk4f4ac712019-05-31 16:33:134964}
dalyk48b20a992019-02-25 16:10:264965
dalyke966a1832019-06-05 20:53:134966TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Automatic_Stale) {
4967 ChangeDnsConfig(CreateValidDnsConfig());
4968 DnsConfigOverrides overrides;
4969 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
4970 resolver_->SetDnsConfigOverrides(overrides);
4971
4972 // Populate cache with insecure entry.
4973 HostCache::Key cached_stale_key =
4974 HostCache::Key("automatic_stale", DnsQueryType::UNSPECIFIED,
4975 0 /* host_resolver_flags */, HostResolverSource::ANY);
4976 IPEndPoint kExpectedStaleIP = CreateExpected("192.168.1.102", 80);
4977 PopulateCache(cached_stale_key, kExpectedStaleIP);
4978 MakeCacheStale();
4979
4980 HostResolver::ResolveHostParameters stale_allowed_parameters;
4981 stale_allowed_parameters.cache_usage =
4982 HostResolver::ResolveHostParameters::CacheUsage::STALE_ALLOWED;
4983
4984 // The insecure cache should be checked before secure requests are made since
4985 // stale results are allowed.
4986 ResolveHostResponseHelper response_stale(resolver_->CreateRequest(
4987 HostPortPair("automatic_stale", 80), NetLogWithSource(),
4988 stale_allowed_parameters, request_context_.get(), host_cache_.get()));
4989 EXPECT_THAT(response_stale.result_error(), IsOk());
4990 EXPECT_THAT(response_stale.request()->GetAddressResults().value().endpoints(),
4991 testing::ElementsAre(kExpectedStaleIP));
4992 EXPECT_TRUE(response_stale.request()->GetStaleInfo()->is_stale());
4993}
4994
dalykc27699a2019-07-29 20:53:294995TEST_F(HostResolverManagerDnsTest,
4996 SecureDnsMode_Automatic_InsecureAsyncDisabled) {
4997 proc_->AddRuleForAllFamilies("insecure_automatic", "192.168.1.100");
4998 ChangeDnsConfig(CreateValidDnsConfig());
4999 resolver_->SetInsecureDnsClientEnabled(false);
5000 DnsConfigOverrides overrides;
5001 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
5002 resolver_->SetDnsConfigOverrides(overrides);
5003
5004 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result;
5005
5006 // The secure part of the dns client should be enabled.
5007 ResolveHostResponseHelper response_secure(resolver_->CreateRequest(
5008 HostPortPair("automatic", 80), NetLogWithSource(), base::nullopt,
5009 request_context_.get(), host_cache_.get()));
5010 ASSERT_THAT(response_secure.result_error(), IsOk());
5011 EXPECT_THAT(
5012 response_secure.request()->GetAddressResults().value().endpoints(),
5013 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
5014 CreateExpected("::1", 80)));
5015 HostCache::Key secure_key =
5016 HostCache::Key("automatic", DnsQueryType::UNSPECIFIED,
5017 0 /* host_resolver_flags */, HostResolverSource::ANY);
5018 secure_key.secure = true;
5019 cache_result = GetCacheHit(secure_key);
5020 EXPECT_TRUE(!!cache_result);
5021
5022 // The insecure part of the dns client is disabled so insecure requests
5023 // should be skipped.
5024 ResolveHostResponseHelper response_insecure(resolver_->CreateRequest(
5025 HostPortPair("insecure_automatic", 80), NetLogWithSource(), base::nullopt,
5026 request_context_.get(), host_cache_.get()));
5027 proc_->SignalMultiple(1u);
5028 ASSERT_THAT(response_insecure.result_error(), IsOk());
5029 EXPECT_THAT(
5030 response_insecure.request()->GetAddressResults().value().endpoints(),
5031 testing::ElementsAre(CreateExpected("192.168.1.100", 80)));
5032 HostCache::Key insecure_key =
5033 HostCache::Key("insecure_automatic", DnsQueryType::UNSPECIFIED,
5034 0 /* host_resolver_flags */, HostResolverSource::ANY);
5035 cache_result = GetCacheHit(insecure_key);
5036 EXPECT_TRUE(!!cache_result);
5037
5038 HostCache::Key cached_insecure_key =
5039 HostCache::Key("insecure_automatic_cached", DnsQueryType::UNSPECIFIED,
5040 0 /* host_resolver_flags */, HostResolverSource::ANY);
5041 IPEndPoint kExpectedInsecureIP = CreateExpected("192.168.1.101", 80);
5042 PopulateCache(cached_insecure_key, kExpectedInsecureIP);
5043
5044 // The insecure cache should still be checked even if the insecure part of
5045 // the dns client is disabled.
5046 ResolveHostResponseHelper response_insecure_cached(resolver_->CreateRequest(
5047 HostPortPair("insecure_automatic_cached", 80), NetLogWithSource(),
5048 base::nullopt, request_context_.get(), host_cache_.get()));
5049 EXPECT_THAT(response_insecure_cached.result_error(), IsOk());
5050 EXPECT_THAT(response_insecure_cached.request()
5051 ->GetAddressResults()
5052 .value()
5053 .endpoints(),
5054 testing::ElementsAre(kExpectedInsecureIP));
5055}
5056
dalyk6d7d8ead2019-08-15 03:30:085057TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Automatic_DotActive) {
5058 proc_->AddRuleForAllFamilies("insecure_automatic", "192.168.1.100");
5059 DnsConfig config = CreateValidDnsConfig();
5060 config.dns_over_tls_active = true;
5061 ChangeDnsConfig(config);
5062 DnsConfigOverrides overrides;
5063 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
5064 resolver_->SetDnsConfigOverrides(overrides);
5065
5066 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result;
5067
5068 // The secure part of the dns client should be enabled.
5069 ResolveHostResponseHelper response_secure(resolver_->CreateRequest(
5070 HostPortPair("automatic", 80), NetLogWithSource(), base::nullopt,
5071 request_context_.get(), host_cache_.get()));
5072 ASSERT_THAT(response_secure.result_error(), IsOk());
5073 EXPECT_THAT(
5074 response_secure.request()->GetAddressResults().value().endpoints(),
5075 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
5076 CreateExpected("::1", 80)));
5077 HostCache::Key secure_key =
5078 HostCache::Key("automatic", DnsQueryType::UNSPECIFIED,
5079 0 /* host_resolver_flags */, HostResolverSource::ANY);
5080 secure_key.secure = true;
5081 cache_result = GetCacheHit(secure_key);
5082 EXPECT_TRUE(!!cache_result);
5083
5084 // Insecure async requests should be skipped since the system resolver
5085 // requests will be secure.
5086 ResolveHostResponseHelper response_insecure(resolver_->CreateRequest(
5087 HostPortPair("insecure_automatic", 80), NetLogWithSource(), base::nullopt,
5088 request_context_.get(), host_cache_.get()));
5089 proc_->SignalMultiple(1u);
5090 ASSERT_THAT(response_insecure.result_error(), IsOk());
5091 EXPECT_THAT(
5092 response_insecure.request()->GetAddressResults().value().endpoints(),
5093 testing::ElementsAre(CreateExpected("192.168.1.100", 80)));
5094 HostCache::Key insecure_key =
5095 HostCache::Key("insecure_automatic", DnsQueryType::UNSPECIFIED,
5096 0 /* host_resolver_flags */, HostResolverSource::ANY);
5097 cache_result = GetCacheHit(insecure_key);
5098 EXPECT_TRUE(!!cache_result);
5099
5100 HostCache::Key cached_insecure_key =
5101 HostCache::Key("insecure_automatic_cached", DnsQueryType::UNSPECIFIED,
5102 0 /* host_resolver_flags */, HostResolverSource::ANY);
5103 IPEndPoint kExpectedInsecureIP = CreateExpected("192.168.1.101", 80);
5104 PopulateCache(cached_insecure_key, kExpectedInsecureIP);
5105
5106 // The insecure cache should still be checked.
5107 ResolveHostResponseHelper response_insecure_cached(resolver_->CreateRequest(
5108 HostPortPair("insecure_automatic_cached", 80), NetLogWithSource(),
5109 base::nullopt, request_context_.get(), host_cache_.get()));
5110 EXPECT_THAT(response_insecure_cached.result_error(), IsOk());
5111 EXPECT_THAT(response_insecure_cached.request()
5112 ->GetAddressResults()
5113 .value()
5114 .endpoints(),
5115 testing::ElementsAre(kExpectedInsecureIP));
5116}
5117
dalyk4f4ac712019-05-31 16:33:135118TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Secure) {
5119 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.100");
5120 set_allow_fallback_to_proctask(true);
5121
dalykc27699a2019-07-29 20:53:295122 ChangeDnsConfig(CreateValidDnsConfig());
dalyk4f4ac712019-05-31 16:33:135123 DnsConfigOverrides overrides;
5124 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::SECURE;
5125 resolver_->SetDnsConfigOverrides(overrides);
5126 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result;
5127
5128 ResolveHostResponseHelper response_secure(resolver_->CreateRequest(
5129 HostPortPair("secure", 80), NetLogWithSource(), base::nullopt,
5130 request_context_.get(), host_cache_.get()));
5131 ASSERT_THAT(response_secure.result_error(), IsOk());
5132 HostCache::Key secure_key =
5133 HostCache::Key("secure", DnsQueryType::UNSPECIFIED,
5134 0 /* host_resolver_flags */, HostResolverSource::ANY);
5135 secure_key.secure = true;
5136 cache_result = GetCacheHit(secure_key);
dalyk48b20a992019-02-25 16:10:265137 EXPECT_TRUE(!!cache_result);
5138
dalyk4f4ac712019-05-31 16:33:135139 ResolveHostResponseHelper response_insecure(resolver_->CreateRequest(
5140 HostPortPair("ok", 80), NetLogWithSource(), base::nullopt,
5141 request_context_.get(), host_cache_.get()));
5142 ASSERT_THAT(response_insecure.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
5143 HostCache::Key insecure_key =
5144 HostCache::Key("ok", DnsQueryType::UNSPECIFIED,
5145 0 /* host_resolver_flags */, HostResolverSource::ANY);
5146 cache_result = GetCacheHit(insecure_key);
5147 EXPECT_FALSE(!!cache_result);
dalyk48b20a992019-02-25 16:10:265148
dalyk4f4ac712019-05-31 16:33:135149 // Fallback to ProcTask not allowed in SECURE mode.
5150 ResolveHostResponseHelper response_proc(resolver_->CreateRequest(
5151 HostPortPair("nx_succeed", 80), NetLogWithSource(), base::nullopt,
5152 request_context_.get(), host_cache_.get()));
5153 proc_->SignalMultiple(1u);
5154 EXPECT_THAT(response_proc.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
dalyk48b20a992019-02-25 16:10:265155}
5156
dalykc27699a2019-07-29 20:53:295157TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Secure_InsecureAsyncDisabled) {
5158 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.100");
5159 set_allow_fallback_to_proctask(true);
5160 resolver_->SetInsecureDnsClientEnabled(false);
5161
5162 ChangeDnsConfig(CreateValidDnsConfig());
5163 DnsConfigOverrides overrides;
5164 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::SECURE;
5165 resolver_->SetDnsConfigOverrides(overrides);
5166 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result;
5167
5168 // The secure part of the dns client should be enabled.
5169 ResolveHostResponseHelper response_secure(resolver_->CreateRequest(
5170 HostPortPair("secure", 80), NetLogWithSource(), base::nullopt,
5171 request_context_.get(), host_cache_.get()));
5172 ASSERT_THAT(response_secure.result_error(), IsOk());
5173 HostCache::Key secure_key =
5174 HostCache::Key("secure", DnsQueryType::UNSPECIFIED,
5175 0 /* host_resolver_flags */, HostResolverSource::ANY);
5176 secure_key.secure = true;
5177 cache_result = GetCacheHit(secure_key);
5178 EXPECT_TRUE(!!cache_result);
5179}
5180
dalyk6f7f7ce62019-08-15 23:18:235181TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Secure_Local_CacheMiss) {
5182 ChangeDnsConfig(CreateValidDnsConfig());
5183 DnsConfigOverrides overrides;
5184 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::SECURE;
5185 resolver_->SetDnsConfigOverrides(overrides);
5186
5187 HostResolver::ResolveHostParameters source_none_parameters;
5188 source_none_parameters.source = HostResolverSource::LOCAL_ONLY;
5189
5190 // Populate cache with an insecure entry.
5191 HostCache::Key cached_insecure_key =
5192 HostCache::Key("automatic", DnsQueryType::UNSPECIFIED,
5193 0 /* host_resolver_flags */, HostResolverSource::ANY);
5194 IPEndPoint kExpectedInsecureIP = CreateExpected("192.168.1.102", 80);
5195 PopulateCache(cached_insecure_key, kExpectedInsecureIP);
5196
5197 // NONE query expected to complete synchronously with a cache miss since
5198 // the insecure cache should not be checked.
5199 ResolveHostResponseHelper cache_miss_request(resolver_->CreateRequest(
5200 HostPortPair("automatic", 80), NetLogWithSource(), source_none_parameters,
5201 request_context_.get(), host_cache_.get()));
5202 EXPECT_TRUE(cache_miss_request.complete());
5203 EXPECT_THAT(cache_miss_request.result_error(), IsError(ERR_DNS_CACHE_MISS));
5204 EXPECT_FALSE(cache_miss_request.request()->GetAddressResults());
5205 EXPECT_FALSE(cache_miss_request.request()->GetStaleInfo());
5206}
5207
5208TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Secure_Local_CacheHit) {
5209 ChangeDnsConfig(CreateValidDnsConfig());
5210 DnsConfigOverrides overrides;
5211 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::SECURE;
5212 resolver_->SetDnsConfigOverrides(overrides);
5213
5214 HostResolver::ResolveHostParameters source_none_parameters;
5215 source_none_parameters.source = HostResolverSource::LOCAL_ONLY;
5216
5217 // Populate cache with a secure entry.
5218 HostCache::Key cached_secure_key =
5219 HostCache::Key("secure", DnsQueryType::UNSPECIFIED,
5220 0 /* host_resolver_flags */, HostResolverSource::ANY);
5221 cached_secure_key.secure = true;
5222 IPEndPoint kExpectedSecureIP = CreateExpected("192.168.1.103", 80);
5223 PopulateCache(cached_secure_key, kExpectedSecureIP);
5224
5225 // NONE query expected to complete synchronously with a cache hit from the
5226 // secure cache.
5227 ResolveHostResponseHelper response_cached(resolver_->CreateRequest(
5228 HostPortPair("secure", 80), NetLogWithSource(), base::nullopt,
5229 request_context_.get(), host_cache_.get()));
5230 EXPECT_TRUE(response_cached.complete());
5231 EXPECT_THAT(response_cached.result_error(), IsOk());
5232 EXPECT_THAT(
5233 response_cached.request()->GetAddressResults().value().endpoints(),
5234 testing::ElementsAre(kExpectedSecureIP));
5235}
5236
[email protected]daae1322013-09-05 18:26:505237// Test the case where only a single transaction slot is available.
Eric Orth960e7062019-03-08 18:43:545238TEST_F(HostResolverManagerDnsTest, SerialResolver) {
[email protected]daae1322013-09-05 18:26:505239 CreateSerialResolver();
Eric Orth60931742018-11-05 23:40:575240 set_allow_fallback_to_proctask(false);
[email protected]daae1322013-09-05 18:26:505241 ChangeDnsConfig(CreateValidDnsConfig());
5242
Eric Orth117e1992019-04-17 00:24:155243 ResolveHostResponseHelper response(resolver_->CreateRequest(
5244 HostPortPair("ok", 80), NetLogWithSource(), base::nullopt,
5245 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:005246 EXPECT_FALSE(response.complete());
5247 EXPECT_EQ(1u, num_running_dispatcher_jobs());
5248
5249 base::RunLoop().RunUntilIdle();
5250 EXPECT_TRUE(response.complete());
5251 EXPECT_THAT(response.result_error(), IsOk());
5252 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
5253 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
5254 CreateExpected("::1", 80)));
5255}
5256
Eric Orth70992982018-07-24 00:25:005257// Test the case where subsequent transactions are handled on transaction
5258// completion when only part of a multi-transaction request could be initially
5259// started.
Eric Orth960e7062019-03-08 18:43:545260TEST_F(HostResolverManagerDnsTest, AAAAStartsAfterOtherJobFinishes) {
Eric Orth70992982018-07-24 00:25:005261 CreateResolverWithLimitsAndParams(3u, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:325262 true /* ipv6_reachable */,
5263 true /* check_ipv6_on_wifi */);
Eric Orth60931742018-11-05 23:40:575264 set_allow_fallback_to_proctask(false);
Eric Orth70992982018-07-24 00:25:005265 ChangeDnsConfig(CreateValidDnsConfig());
5266
Eric Orth117e1992019-04-17 00:24:155267 ResolveHostResponseHelper response0(resolver_->CreateRequest(
5268 HostPortPair("ok", 80), NetLogWithSource(), base::nullopt,
5269 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:005270 EXPECT_EQ(2u, num_running_dispatcher_jobs());
Eric Orth117e1992019-04-17 00:24:155271 ResolveHostResponseHelper response1(resolver_->CreateRequest(
5272 HostPortPair("4slow_ok", 80), NetLogWithSource(), base::nullopt,
5273 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:005274 EXPECT_EQ(3u, num_running_dispatcher_jobs());
5275
5276 // Request 0's transactions should complete, starting Request 1's second
5277 // transaction, which should also complete.
5278 base::RunLoop().RunUntilIdle();
5279 EXPECT_EQ(1u, num_running_dispatcher_jobs());
5280 EXPECT_TRUE(response0.complete());
5281 EXPECT_FALSE(response1.complete());
5282
5283 dns_client_->CompleteDelayedTransactions();
5284 EXPECT_THAT(response1.result_error(), IsOk());
5285 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
5286 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
5287 CreateExpected("::1", 80)));
5288}
5289
[email protected]daae1322013-09-05 18:26:505290// Tests the case that a Job with a single transaction receives an empty address
5291// list, triggering fallback to ProcTask.
Eric Orth960e7062019-03-08 18:43:545292TEST_F(HostResolverManagerDnsTest, IPv4EmptyFallback) {
Eric Orth70992982018-07-24 00:25:005293 // Disable ipv6 to ensure we'll only try a single transaction for the host.
5294 CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:325295 false /* ipv6_reachable */,
5296 true /* check_ipv6_on_wifi */);
Eric Orth70992982018-07-24 00:25:005297 DnsConfig config = CreateValidDnsConfig();
5298 config.use_local_ipv6 = false;
5299 ChangeDnsConfig(config);
5300
Eric Orth322af3e42018-08-20 18:12:595301 proc_->AddRuleForAllFamilies("empty_fallback", "192.168.0.1",
5302 HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6);
Eric Orth70992982018-07-24 00:25:005303 proc_->SignalMultiple(1u);
5304
5305 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:275306 HostPortPair("empty_fallback", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:155307 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:005308 EXPECT_THAT(response.result_error(), IsOk());
5309 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
5310 testing::ElementsAre(CreateExpected("192.168.0.1", 80)));
5311}
5312
[email protected]daae1322013-09-05 18:26:505313// Tests the case that a Job with two transactions receives two empty address
5314// lists, triggering fallback to ProcTask.
Eric Orth960e7062019-03-08 18:43:545315TEST_F(HostResolverManagerDnsTest, UnspecEmptyFallback) {
[email protected]daae1322013-09-05 18:26:505316 ChangeDnsConfig(CreateValidDnsConfig());
5317 proc_->AddRuleForAllFamilies("empty_fallback", "192.168.0.1");
5318 proc_->SignalMultiple(1u);
Eric Orth70992982018-07-24 00:25:005319
5320 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:275321 HostPortPair("empty_fallback", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:155322 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:005323
5324 EXPECT_THAT(response.result_error(), IsOk());
5325 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
5326 testing::ElementsAre(CreateExpected("192.168.0.1", 80)));
5327}
5328
[email protected]daae1322013-09-05 18:26:505329// Tests getting a new invalid DnsConfig while there are active DnsTasks.
Eric Orth960e7062019-03-08 18:43:545330TEST_F(HostResolverManagerDnsTest, InvalidDnsConfigWithPendingRequests) {
Eric Orth70992982018-07-24 00:25:005331 // At most 3 jobs active at once. This number is important, since we want
Eric Orth960e7062019-03-08 18:43:545332 // to make sure that aborting the first HostResolverManager::Job does not
Eric Orth70992982018-07-24 00:25:005333 // trigger another DnsTransaction on the second Job when it releases its
5334 // second prioritized dispatcher slot.
5335 CreateResolverWithLimitsAndParams(3u, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:325336 true /* ipv6_reachable */,
5337 true /* check_ipv6_on_wifi */);
Eric Orth70992982018-07-24 00:25:005338
5339 ChangeDnsConfig(CreateValidDnsConfig());
5340
5341 proc_->AddRuleForAllFamilies("slow_nx1", "192.168.0.1");
5342 proc_->AddRuleForAllFamilies("slow_nx2", "192.168.0.2");
5343 proc_->AddRuleForAllFamilies("ok", "192.168.0.3");
5344
5345 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
5346 // First active job gets two slots.
Eric Orth117e1992019-04-17 00:24:155347 responses.emplace_back(
5348 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
5349 HostPortPair("slow_nx1", 80), NetLogWithSource(), base::nullopt,
5350 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:005351 // Next job gets one slot, and waits on another.
Eric Orth117e1992019-04-17 00:24:155352 responses.emplace_back(
5353 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
5354 HostPortPair("slow_nx2", 80), NetLogWithSource(), base::nullopt,
5355 request_context_.get(), host_cache_.get())));
5356 responses.emplace_back(
5357 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
5358 HostPortPair("ok", 80), NetLogWithSource(), base::nullopt,
5359 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:005360
5361 EXPECT_EQ(3u, num_running_dispatcher_jobs());
5362 for (auto& response : responses) {
5363 EXPECT_FALSE(response->complete());
5364 }
5365
dalyk4f4ac712019-05-31 16:33:135366 // Clear DNS config. Fully in-progress, partially in-progress, and queued
5367 // requests should all be aborted.
Eric Orth70992982018-07-24 00:25:005368 ChangeDnsConfig(DnsConfig());
dalyk4f4ac712019-05-31 16:33:135369 for (auto& response : responses) {
5370 EXPECT_THAT(response->result_error(), IsError(ERR_NETWORK_CHANGED));
5371 }
Eric Orth70992982018-07-24 00:25:005372}
5373
Eric Orth70992982018-07-24 00:25:005374// Test that initial DNS config read signals do not abort pending requests
5375// when using DnsClient.
Eric Orth960e7062019-03-08 18:43:545376TEST_F(HostResolverManagerDnsTest, DontAbortOnInitialDNSConfigRead) {
Eric Orth70992982018-07-24 00:25:005377 // DnsClient is enabled, but there's no DnsConfig, so the request should start
5378 // using ProcTask.
Eric Orth117e1992019-04-17 00:24:155379 ResolveHostResponseHelper response(resolver_->CreateRequest(
5380 HostPortPair("host1", 70), NetLogWithSource(), base::nullopt,
5381 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:005382 EXPECT_FALSE(response.complete());
5383
5384 EXPECT_TRUE(proc_->WaitFor(1u));
5385 // Send the initial config read signal, with a valid config.
5386 SetInitialDnsConfig(CreateValidDnsConfig());
5387 proc_->SignalAll();
5388
5389 EXPECT_THAT(response.result_error(), IsOk());
5390}
5391
dalykc27699a2019-07-29 20:53:295392// Tests the case that the insecure part of the DnsClient is automatically
5393// disabled due to failures while there are active DnsTasks.
Eric Orth960e7062019-03-08 18:43:545394TEST_F(HostResolverManagerDnsTest,
dalykc27699a2019-07-29 20:53:295395 AutomaticallyDisableInsecureDnsClientWithPendingRequests) {
[email protected]daae1322013-09-05 18:26:505396 // Trying different limits is important for this test: Different limits
5397 // result in different behavior when aborting in-progress DnsTasks. Having
5398 // a DnsTask that has one job active and one in the queue when another job
5399 // occupying two slots has its DnsTask aborted is the case most likely to run
Eric Orth60931742018-11-05 23:40:575400 // into problems. Try limits between [1, 2 * # of non failure requests].
5401 for (size_t limit = 1u; limit < 10u; ++limit) {
Eric Orth70992982018-07-24 00:25:005402 CreateResolverWithLimitsAndParams(limit, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:325403 true /* ipv6_reachable */,
5404 true /* check_ipv6_on_wifi */);
Eric Orth70992982018-07-24 00:25:005405
5406 ChangeDnsConfig(CreateValidDnsConfig());
5407
dalykc27699a2019-07-29 20:53:295408 // Queue up enough failures to disable insecure DnsTasks. These will all
5409 // fall back to ProcTasks, and succeed there.
Eric Orth70992982018-07-24 00:25:005410 std::vector<std::unique_ptr<ResolveHostResponseHelper>> failure_responses;
dalykc27699a2019-07-29 20:53:295411 for (unsigned i = 0u; i < maximum_insecure_dns_task_failures(); ++i) {
Eric Orth70992982018-07-24 00:25:005412 std::string host = base::StringPrintf("nx%u", i);
5413 proc_->AddRuleForAllFamilies(host, "192.168.0.1");
5414 failure_responses.emplace_back(
5415 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:275416 HostPortPair(host, 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:155417 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:005418 EXPECT_FALSE(failure_responses[i]->complete());
5419 }
5420
dalykc27699a2019-07-29 20:53:295421 // These requests should all bypass insecure DnsTasks, due to the above
5422 // failures, so should end up using ProcTasks.
Eric Orth70992982018-07-24 00:25:005423 proc_->AddRuleForAllFamilies("slow_ok1", "192.168.0.2");
5424 ResolveHostResponseHelper response0(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:275425 HostPortPair("slow_ok1", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:155426 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:005427 EXPECT_FALSE(response0.complete());
5428 proc_->AddRuleForAllFamilies("slow_ok2", "192.168.0.3");
5429 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:275430 HostPortPair("slow_ok2", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:155431 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:005432 EXPECT_FALSE(response1.complete());
5433 proc_->AddRuleForAllFamilies("slow_ok3", "192.168.0.4");
5434 ResolveHostResponseHelper response2(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:275435 HostPortPair("slow_ok3", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:155436 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:005437 EXPECT_FALSE(response2.complete());
5438
Eric Orth60931742018-11-05 23:40:575439 // Requests specifying DNS source cannot fallback to ProcTask, so they
5440 // should be unaffected.
5441 HostResolver::ResolveHostParameters parameters;
5442 parameters.source = HostResolverSource::DNS;
5443 ResolveHostResponseHelper response_dns(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:275444 HostPortPair("4slow_ok", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:155445 request_context_.get(), host_cache_.get()));
Eric Orth60931742018-11-05 23:40:575446 EXPECT_FALSE(response_dns.complete());
5447
5448 // Requests specifying SYSTEM source should be unaffected by disabling
5449 // DnsClient.
5450 proc_->AddRuleForAllFamilies("nx_ok", "192.168.0.5");
5451 parameters.source = HostResolverSource::SYSTEM;
Eric Orth117e1992019-04-17 00:24:155452 ResolveHostResponseHelper response_system(resolver_->CreateRequest(
5453 HostPortPair("nx_ok", 80), NetLogWithSource(), parameters,
5454 request_context_.get(), host_cache_.get()));
Eric Orth60931742018-11-05 23:40:575455 EXPECT_FALSE(response_system.complete());
5456
dalykc27699a2019-07-29 20:53:295457 // Secure DnsTasks should not be affected.
5458 HostResolver::ResolveHostParameters secure_parameters;
5459 secure_parameters.secure_dns_mode_override =
5460 DnsConfig::SecureDnsMode::AUTOMATIC;
5461 ResolveHostResponseHelper response_secure(resolver_->CreateRequest(
5462 HostPortPair("automatic", 80), NetLogWithSource(), secure_parameters,
5463 request_context_.get(), host_cache_.get()));
5464 EXPECT_FALSE(response_secure.complete());
Eric Orth70992982018-07-24 00:25:005465
dalykc27699a2019-07-29 20:53:295466 proc_->SignalMultiple(maximum_insecure_dns_task_failures() + 6);
5467
5468 for (size_t i = 0u; i < maximum_insecure_dns_task_failures(); ++i) {
Eric Orth70992982018-07-24 00:25:005469 EXPECT_THAT(failure_responses[i]->result_error(), IsOk());
5470 EXPECT_THAT(failure_responses[i]
5471 ->request()
5472 ->GetAddressResults()
5473 .value()
5474 .endpoints(),
5475 testing::ElementsAre(CreateExpected("192.168.0.1", 80)));
5476 }
5477
5478 EXPECT_THAT(response0.result_error(), IsOk());
5479 EXPECT_THAT(response0.request()->GetAddressResults().value().endpoints(),
5480 testing::ElementsAre(CreateExpected("192.168.0.2", 80)));
5481 EXPECT_THAT(response1.result_error(), IsOk());
5482 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
5483 testing::ElementsAre(CreateExpected("192.168.0.3", 80)));
5484 EXPECT_THAT(response2.result_error(), IsOk());
5485 EXPECT_THAT(response2.request()->GetAddressResults().value().endpoints(),
5486 testing::ElementsAre(CreateExpected("192.168.0.4", 80)));
Eric Orth60931742018-11-05 23:40:575487
5488 dns_client_->CompleteDelayedTransactions();
5489 EXPECT_THAT(response_dns.result_error(), IsOk());
5490
5491 EXPECT_THAT(response_system.result_error(), IsOk());
5492 EXPECT_THAT(
5493 response_system.request()->GetAddressResults().value().endpoints(),
5494 testing::ElementsAre(CreateExpected("192.168.0.5", 80)));
dalykc27699a2019-07-29 20:53:295495
5496 EXPECT_THAT(response_secure.result_error(), IsOk());
Eric Orth70992982018-07-24 00:25:005497 }
5498}
5499
[email protected]daae1322013-09-05 18:26:505500// Tests a call to SetDnsClient while there are active DnsTasks.
Eric Orth960e7062019-03-08 18:43:545501TEST_F(HostResolverManagerDnsTest,
5502 ManuallyDisableDnsClientWithPendingRequests) {
[email protected]daae1322013-09-05 18:26:505503 // At most 3 jobs active at once. This number is important, since we want to
Eric Orth960e7062019-03-08 18:43:545504 // make sure that aborting the first HostResolverManager::Job does not trigger
[email protected]daae1322013-09-05 18:26:505505 // another DnsTransaction on the second Job when it releases its second
5506 // prioritized dispatcher slot.
Eric Orth70992982018-07-24 00:25:005507 CreateResolverWithLimitsAndParams(3u, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:325508 true /* ipv6_reachable */,
5509 true /* check_ipv6_on_wifi */);
[email protected]daae1322013-09-05 18:26:505510
[email protected]daae1322013-09-05 18:26:505511 ChangeDnsConfig(CreateValidDnsConfig());
5512
5513 proc_->AddRuleForAllFamilies("slow_ok1", "192.168.0.1");
5514 proc_->AddRuleForAllFamilies("slow_ok2", "192.168.0.2");
5515 proc_->AddRuleForAllFamilies("ok", "192.168.0.3");
5516
Eric Orth70992982018-07-24 00:25:005517 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
5518 // First active job gets two slots.
Eric Orth117e1992019-04-17 00:24:155519 responses.emplace_back(
5520 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
5521 HostPortPair("slow_ok1", 80), NetLogWithSource(), base::nullopt,
5522 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:005523 EXPECT_FALSE(responses[0]->complete());
5524 // Next job gets one slot, and waits on another.
Eric Orth117e1992019-04-17 00:24:155525 responses.emplace_back(
5526 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
5527 HostPortPair("slow_ok2", 80), NetLogWithSource(), base::nullopt,
5528 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:005529 EXPECT_FALSE(responses[1]->complete());
5530 // Next one is queued.
Eric Orth117e1992019-04-17 00:24:155531 responses.emplace_back(
5532 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
5533 HostPortPair("ok", 80), NetLogWithSource(), base::nullopt,
5534 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:005535 EXPECT_FALSE(responses[2]->complete());
5536
5537 EXPECT_EQ(3u, num_running_dispatcher_jobs());
5538
5539 // Clear DnsClient. The two in-progress jobs should fall back to a ProcTask,
5540 // and the next one should be started with a ProcTask.
dalykc27699a2019-07-29 20:53:295541 resolver_->SetInsecureDnsClientEnabled(false);
Eric Orth70992982018-07-24 00:25:005542
5543 // All three in-progress requests should now be running a ProcTask.
5544 EXPECT_EQ(3u, num_running_dispatcher_jobs());
5545 proc_->SignalMultiple(3u);
5546
5547 for (auto& response : responses) {
5548 EXPECT_THAT(response->result_error(), IsOk());
5549 }
5550 EXPECT_THAT(responses[0]->request()->GetAddressResults().value().endpoints(),
5551 testing::ElementsAre(CreateExpected("192.168.0.1", 80)));
5552 EXPECT_THAT(responses[1]->request()->GetAddressResults().value().endpoints(),
5553 testing::ElementsAre(CreateExpected("192.168.0.2", 80)));
5554 EXPECT_THAT(responses[2]->request()->GetAddressResults().value().endpoints(),
5555 testing::ElementsAre(CreateExpected("192.168.0.3", 80)));
5556}
5557
Eric Orth04aad982019-05-06 22:41:045558// When explicitly requesting source=DNS, no fallback allowed, so doing so with
5559// DnsClient disabled should result in an error.
5560TEST_F(HostResolverManagerDnsTest, DnsCallsWithDisabledDnsClient) {
Eric Orth4e55b362019-05-07 22:00:035561 ChangeDnsConfig(CreateValidDnsConfig());
dalykc27699a2019-07-29 20:53:295562 resolver_->SetInsecureDnsClientEnabled(false);
Eric Orth04aad982019-05-06 22:41:045563
5564 HostResolver::ResolveHostParameters params;
5565 params.source = HostResolverSource::DNS;
5566 ResolveHostResponseHelper response(resolver_->CreateRequest(
5567 HostPortPair("host", 80), NetLogWithSource(), params,
5568 request_context_.get(), host_cache_.get()));
5569
dalykc27699a2019-07-29 20:53:295570 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_CACHE_MISS));
Eric Orth04aad982019-05-06 22:41:045571}
5572
Eric Orth4e55b362019-05-07 22:00:035573TEST_F(HostResolverManagerDnsTest,
5574 DnsCallsWithDisabledDnsClient_DisabledAtConstruction) {
5575 HostResolver::ManagerOptions options = DefaultOptions();
dalykc27699a2019-07-29 20:53:295576 options.insecure_dns_client_enabled = false;
Eric Orth4e55b362019-05-07 22:00:035577 CreateResolverWithOptionsAndParams(std::move(options),
5578 DefaultParams(proc_.get()),
5579 true /* ipv6_reachable */);
5580 ChangeDnsConfig(CreateValidDnsConfig());
5581
5582 HostResolver::ResolveHostParameters params;
5583 params.source = HostResolverSource::DNS;
5584 ResolveHostResponseHelper response(resolver_->CreateRequest(
5585 HostPortPair("host", 80), NetLogWithSource(), params,
5586 request_context_.get(), host_cache_.get()));
5587
dalykc27699a2019-07-29 20:53:295588 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_CACHE_MISS));
Eric Orth4e55b362019-05-07 22:00:035589}
5590
5591// Same as DnsClient disabled, requests with source=DNS and no usable DnsConfig
5592// should result in an error.
5593TEST_F(HostResolverManagerDnsTest, DnsCallsWithNoDnsConfig) {
5594 ChangeDnsConfig(DnsConfig());
5595
5596 HostResolver::ResolveHostParameters params;
5597 params.source = HostResolverSource::DNS;
5598 ResolveHostResponseHelper response(resolver_->CreateRequest(
5599 HostPortPair("host", 80), NetLogWithSource(), params,
5600 request_context_.get(), host_cache_.get()));
5601
dalykc27699a2019-07-29 20:53:295602 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_CACHE_MISS));
Eric Orth4e55b362019-05-07 22:00:035603}
5604
Eric Orth607b6d82019-05-08 16:43:325605TEST_F(HostResolverManagerDnsTest, NoCheckIpv6OnWifi) {
rchce64e6732017-06-05 17:41:575606 // CreateSerialResolver will destroy the current resolver_ which will attempt
5607 // to remove itself from the NetworkChangeNotifier. If this happens after a
5608 // new NetworkChangeNotifier is active, then it will not remove itself from
5609 // the old NetworkChangeNotifier which is a potential use-after-free.
Eric Orth37b18192019-04-22 19:09:285610 DestroyResolver();
mgershaf9a9232017-04-13 20:19:035611 test::ScopedMockNetworkChangeNotifier notifier;
Eric Orth607b6d82019-05-08 16:43:325612 // Serial resolver to guarantee order of resolutions.
5613 CreateSerialResolver(false /* check_ipv6_on_wifi */);
mgershaf9a9232017-04-13 20:19:035614
5615 notifier.mock_network_change_notifier()->SetConnectionType(
5616 NetworkChangeNotifier::CONNECTION_WIFI);
5617 // Needed so IPv6 availability check isn't skipped.
5618 ChangeDnsConfig(CreateValidDnsConfig());
5619
5620 proc_->AddRule("h1", ADDRESS_FAMILY_UNSPECIFIED, "::3");
5621 proc_->AddRule("h1", ADDRESS_FAMILY_IPV4, "1.0.0.1");
Eric Orth322af3e42018-08-20 18:12:595622 proc_->AddRule("h1", ADDRESS_FAMILY_IPV4, "1.0.0.1",
5623 HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6);
mgershaf9a9232017-04-13 20:19:035624 proc_->AddRule("h1", ADDRESS_FAMILY_IPV6, "::2");
5625
Eric Orth117e1992019-04-17 00:24:155626 ResolveHostResponseHelper response(resolver_->CreateRequest(
5627 HostPortPair("h1", 80), NetLogWithSource(), base::nullopt,
5628 request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:005629 HostResolver::ResolveHostParameters parameters;
Eric Orth192e3bb2018-11-14 19:30:325630 parameters.dns_query_type = DnsQueryType::A;
Eric Orth117e1992019-04-17 00:24:155631 ResolveHostResponseHelper v4_response(resolver_->CreateRequest(
5632 HostPortPair("h1", 80), NetLogWithSource(), parameters,
5633 request_context_.get(), host_cache_.get()));
Eric Orth192e3bb2018-11-14 19:30:325634 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth117e1992019-04-17 00:24:155635 ResolveHostResponseHelper v6_response(resolver_->CreateRequest(
5636 HostPortPair("h1", 80), NetLogWithSource(), parameters,
5637 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:005638
Eric Orth00fe5a62018-08-15 22:20:005639 proc_->SignalMultiple(3u);
Eric Orth70992982018-07-24 00:25:005640
5641 // Should revert to only IPV4 request.
5642 EXPECT_THAT(response.result_error(), IsOk());
5643 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
5644 testing::ElementsAre(CreateExpected("1.0.0.1", 80)));
5645
Eric Orth00fe5a62018-08-15 22:20:005646 EXPECT_THAT(v4_response.result_error(), IsOk());
5647 EXPECT_THAT(v4_response.request()->GetAddressResults().value().endpoints(),
5648 testing::ElementsAre(CreateExpected("1.0.0.1", 80)));
5649 EXPECT_THAT(v6_response.result_error(), IsOk());
5650 EXPECT_THAT(v6_response.request()->GetAddressResults().value().endpoints(),
5651 testing::ElementsAre(CreateExpected("::2", 80)));
5652
Eric Orth70992982018-07-24 00:25:005653 // Now repeat the test on non-wifi to check that IPv6 is used as normal
5654 // after the network changes.
5655 notifier.mock_network_change_notifier()->SetConnectionType(
5656 NetworkChangeNotifier::CONNECTION_4G);
5657 base::RunLoop().RunUntilIdle(); // Wait for NetworkChangeNotifier.
5658
Eric Orth117e1992019-04-17 00:24:155659 ResolveHostResponseHelper no_wifi_response(resolver_->CreateRequest(
5660 HostPortPair("h1", 80), NetLogWithSource(), base::nullopt,
5661 request_context_.get(), host_cache_.get()));
Eric Orth192e3bb2018-11-14 19:30:325662 parameters.dns_query_type = DnsQueryType::A;
Eric Orth117e1992019-04-17 00:24:155663 ResolveHostResponseHelper no_wifi_v4_response(resolver_->CreateRequest(
5664 HostPortPair("h1", 80), NetLogWithSource(), parameters,
5665 request_context_.get(), host_cache_.get()));
Eric Orth192e3bb2018-11-14 19:30:325666 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth117e1992019-04-17 00:24:155667 ResolveHostResponseHelper no_wifi_v6_response(resolver_->CreateRequest(
5668 HostPortPair("h1", 80), NetLogWithSource(), parameters,
5669 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:005670
Eric Orth00fe5a62018-08-15 22:20:005671 proc_->SignalMultiple(3u);
Eric Orth70992982018-07-24 00:25:005672
5673 // IPV6 should be available.
5674 EXPECT_THAT(no_wifi_response.result_error(), IsOk());
5675 EXPECT_THAT(
5676 no_wifi_response.request()->GetAddressResults().value().endpoints(),
5677 testing::ElementsAre(CreateExpected("::3", 80)));
Eric Orth00fe5a62018-08-15 22:20:005678
5679 EXPECT_THAT(no_wifi_v4_response.result_error(), IsOk());
5680 EXPECT_THAT(
5681 no_wifi_v4_response.request()->GetAddressResults().value().endpoints(),
5682 testing::ElementsAre(CreateExpected("1.0.0.1", 80)));
5683 EXPECT_THAT(no_wifi_v6_response.result_error(), IsOk());
5684 EXPECT_THAT(
5685 no_wifi_v6_response.request()->GetAddressResults().value().endpoints(),
5686 testing::ElementsAre(CreateExpected("::2", 80)));
Eric Orth70992982018-07-24 00:25:005687}
5688
Eric Orth960e7062019-03-08 18:43:545689TEST_F(HostResolverManagerDnsTest, NotFoundTTL) {
Brad Lassey2e8f185d2018-05-21 22:25:215690 CreateResolver();
Eric Orth60931742018-11-05 23:40:575691 set_allow_fallback_to_proctask(false);
Brad Lassey2e8f185d2018-05-21 22:25:215692 ChangeDnsConfig(CreateValidDnsConfig());
Eric Orth70992982018-07-24 00:25:005693
5694 // NODATA
Eric Orth117e1992019-04-17 00:24:155695 ResolveHostResponseHelper no_data_response(resolver_->CreateRequest(
5696 HostPortPair("empty", 80), NetLogWithSource(), base::nullopt,
5697 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:005698 EXPECT_THAT(no_data_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
5699 EXPECT_FALSE(no_data_response.request()->GetAddressResults());
Eric Orth192e3bb2018-11-14 19:30:325700 HostCache::Key key("empty", DnsQueryType::UNSPECIFIED, 0,
5701 HostResolverSource::ANY);
Eric Orth70992982018-07-24 00:25:005702 HostCache::EntryStaleness staleness;
dalyk48b20a992019-02-25 16:10:265703 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result =
Eric Orth37b18192019-04-22 19:09:285704 host_cache_->Lookup(key, base::TimeTicks::Now(),
5705 false /* ignore_secure */);
dalyk48b20a992019-02-25 16:10:265706 EXPECT_TRUE(!!cache_result);
5707 EXPECT_TRUE(cache_result->second.has_ttl());
5708 EXPECT_THAT(cache_result->second.ttl(), base::TimeDelta::FromSeconds(86400));
Eric Orth70992982018-07-24 00:25:005709
5710 // NXDOMAIN
Eric Orth117e1992019-04-17 00:24:155711 ResolveHostResponseHelper no_domain_response(resolver_->CreateRequest(
5712 HostPortPair("nodomain", 80), NetLogWithSource(), base::nullopt,
5713 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:005714 EXPECT_THAT(no_domain_response.result_error(),
5715 IsError(ERR_NAME_NOT_RESOLVED));
5716 EXPECT_FALSE(no_domain_response.request()->GetAddressResults());
Eric Orth192e3bb2018-11-14 19:30:325717 HostCache::Key nxkey("nodomain", DnsQueryType::UNSPECIFIED, 0,
5718 HostResolverSource::ANY);
Eric Orth37b18192019-04-22 19:09:285719 cache_result = host_cache_->Lookup(nxkey, base::TimeTicks::Now(),
5720 false /* ignore_secure */);
dalyk48b20a992019-02-25 16:10:265721 EXPECT_TRUE(!!cache_result);
5722 EXPECT_TRUE(cache_result->second.has_ttl());
5723 EXPECT_THAT(cache_result->second.ttl(), base::TimeDelta::FromSeconds(86400));
Eric Orth70992982018-07-24 00:25:005724}
5725
Eric Orth960e7062019-03-08 18:43:545726TEST_F(HostResolverManagerDnsTest, CachedError) {
dalyk4f4ac712019-05-31 16:33:135727 proc_->AddRuleForAllFamilies(std::string(),
5728 "0.0.0.0"); // Default to failures.
5729 proc_->SignalMultiple(1u);
5730
Eric Ortheb332862019-01-26 00:52:385731 CreateResolver();
dalyk4f4ac712019-05-31 16:33:135732 set_allow_fallback_to_proctask(true);
Eric Ortheb332862019-01-26 00:52:385733 ChangeDnsConfig(CreateValidDnsConfig());
5734
5735 HostResolver::ResolveHostParameters cache_only_parameters;
5736 cache_only_parameters.source = HostResolverSource::LOCAL_ONLY;
5737
5738 // Expect cache initially empty.
dalyk4f4ac712019-05-31 16:33:135739 ResolveHostResponseHelper cache_miss_response0(resolver_->CreateRequest(
Eric Orth117e1992019-04-17 00:24:155740 HostPortPair("nodomain", 80), NetLogWithSource(), cache_only_parameters,
5741 request_context_.get(), host_cache_.get()));
dalyk4f4ac712019-05-31 16:33:135742 EXPECT_THAT(cache_miss_response0.result_error(), IsError(ERR_DNS_CACHE_MISS));
5743 EXPECT_FALSE(cache_miss_response0.request()->GetStaleInfo());
5744
5745 // The cache should not be populate with an error because fallback to ProcTask
5746 // was available.
5747 ResolveHostResponseHelper no_domain_response_with_fallback(
5748 resolver_->CreateRequest(HostPortPair("nodomain", 80), NetLogWithSource(),
5749 base::nullopt, request_context_.get(),
5750 host_cache_.get()));
5751 EXPECT_THAT(no_domain_response_with_fallback.result_error(),
5752 IsError(ERR_NAME_NOT_RESOLVED));
5753
5754 // Expect cache still empty.
5755 ResolveHostResponseHelper cache_miss_response1(resolver_->CreateRequest(
5756 HostPortPair("nodomain", 80), NetLogWithSource(), cache_only_parameters,
5757 request_context_.get(), host_cache_.get()));
5758 EXPECT_THAT(cache_miss_response1.result_error(), IsError(ERR_DNS_CACHE_MISS));
5759 EXPECT_FALSE(cache_miss_response1.request()->GetStaleInfo());
5760
5761 // Disable fallback to proctask
5762 set_allow_fallback_to_proctask(false);
Eric Ortheb332862019-01-26 00:52:385763
5764 // Populate cache with an error.
Eric Orth117e1992019-04-17 00:24:155765 ResolveHostResponseHelper no_domain_response(resolver_->CreateRequest(
5766 HostPortPair("nodomain", 80), NetLogWithSource(), base::nullopt,
5767 request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:385768 EXPECT_THAT(no_domain_response.result_error(),
5769 IsError(ERR_NAME_NOT_RESOLVED));
5770
5771 // Expect the error result can be resolved from the cache.
Eric Orth117e1992019-04-17 00:24:155772 ResolveHostResponseHelper cache_hit_response(resolver_->CreateRequest(
5773 HostPortPair("nodomain", 80), NetLogWithSource(), cache_only_parameters,
5774 request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:385775 EXPECT_THAT(cache_hit_response.result_error(),
5776 IsError(ERR_NAME_NOT_RESOLVED));
5777 EXPECT_FALSE(cache_hit_response.request()->GetStaleInfo().value().is_stale());
5778}
5779
dalyk4f4ac712019-05-31 16:33:135780TEST_F(HostResolverManagerDnsTest, CachedError_AutomaticMode) {
5781 CreateResolver();
5782 set_allow_fallback_to_proctask(false);
5783 ChangeDnsConfig(CreateValidDnsConfig());
5784
5785 // Switch to automatic mode.
5786 DnsConfigOverrides overrides;
5787 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
5788 resolver_->SetDnsConfigOverrides(overrides);
5789
5790 HostCache::Key insecure_key =
5791 HostCache::Key("automatic_nodomain", DnsQueryType::UNSPECIFIED,
5792 0 /* host_resolver_flags */, HostResolverSource::ANY);
5793 HostCache::Key secure_key =
5794 HostCache::Key("automatic_nodomain", DnsQueryType::UNSPECIFIED,
5795 0 /* host_resolver_flags */, HostResolverSource::ANY);
5796 secure_key.secure = true;
5797
5798 // Expect cache initially empty.
5799 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result;
5800 cache_result = GetCacheHit(secure_key);
5801 EXPECT_FALSE(!!cache_result);
5802 cache_result = GetCacheHit(insecure_key);
5803 EXPECT_FALSE(!!cache_result);
5804
5805 // Populate both secure and insecure caches with an error.
5806 ResolveHostResponseHelper no_domain_response(resolver_->CreateRequest(
5807 HostPortPair("automatic_nodomain", 80), NetLogWithSource(), base::nullopt,
5808 request_context_.get(), host_cache_.get()));
5809 EXPECT_THAT(no_domain_response.result_error(),
5810 IsError(ERR_NAME_NOT_RESOLVED));
5811
5812 // Expect both secure and insecure caches to have the error result.
5813 cache_result = GetCacheHit(secure_key);
5814 EXPECT_TRUE(!!cache_result);
5815 cache_result = GetCacheHit(insecure_key);
5816 EXPECT_TRUE(!!cache_result);
5817}
5818
5819TEST_F(HostResolverManagerDnsTest, CachedError_SecureMode) {
5820 CreateResolver();
5821 set_allow_fallback_to_proctask(false);
5822 ChangeDnsConfig(CreateValidDnsConfig());
5823
5824 // Switch to secure mode.
5825 DnsConfigOverrides overrides;
5826 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::SECURE;
5827 resolver_->SetDnsConfigOverrides(overrides);
5828
5829 HostCache::Key insecure_key =
5830 HostCache::Key("automatic_nodomain", DnsQueryType::UNSPECIFIED,
5831 0 /* host_resolver_flags */, HostResolverSource::ANY);
5832 HostCache::Key secure_key =
5833 HostCache::Key("automatic_nodomain", DnsQueryType::UNSPECIFIED,
5834 0 /* host_resolver_flags */, HostResolverSource::ANY);
5835 secure_key.secure = true;
5836
5837 // Expect cache initially empty.
5838 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result;
5839 cache_result = GetCacheHit(secure_key);
5840 EXPECT_FALSE(!!cache_result);
5841 cache_result = GetCacheHit(insecure_key);
5842 EXPECT_FALSE(!!cache_result);
5843
5844 // Populate secure cache with an error.
5845 ResolveHostResponseHelper no_domain_response(resolver_->CreateRequest(
5846 HostPortPair("automatic_nodomain", 80), NetLogWithSource(), base::nullopt,
5847 request_context_.get(), host_cache_.get()));
5848 EXPECT_THAT(no_domain_response.result_error(),
5849 IsError(ERR_NAME_NOT_RESOLVED));
5850
5851 // Expect only the secure cache to have the error result.
5852 cache_result = GetCacheHit(secure_key);
5853 EXPECT_TRUE(!!cache_result);
5854 cache_result = GetCacheHit(insecure_key);
5855 EXPECT_FALSE(!!cache_result);
5856}
5857
Eric Orth960e7062019-03-08 18:43:545858TEST_F(HostResolverManagerDnsTest, NoCanonicalName) {
Eric Orth828bd3ae2018-12-12 17:30:365859 MockDnsClientRuleList rules;
5860 AddDnsRule(&rules, "alias", dns_protocol::kTypeA, IPAddress::IPv4Localhost(),
dalyk48b20a992019-02-25 16:10:265861 "canonical", false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:365862 AddDnsRule(&rules, "alias", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:265863 IPAddress::IPv6Localhost(), "canonical", false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:365864
Asanka Herath2d0226c2018-10-24 14:35:555865 CreateResolver();
Eric Orth828bd3ae2018-12-12 17:30:365866 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
Eric Orth60931742018-11-05 23:40:575867 set_allow_fallback_to_proctask(false);
Eric Orth828bd3ae2018-12-12 17:30:365868
Eric Orth117e1992019-04-17 00:24:155869 ResolveHostResponseHelper response(resolver_->CreateRequest(
5870 HostPortPair("alias", 80), NetLogWithSource(), base::nullopt,
5871 request_context_.get(), host_cache_.get()));
Asanka Herath2d0226c2018-10-24 14:35:555872 ASSERT_THAT(response.result_error(), IsOk());
5873
Matt Menkec35d1632018-11-29 12:43:495874 // HostResolver may still give name, but if so, it must be correct.
5875 std::string result_name =
5876 response.request()->GetAddressResults().value().canonical_name();
5877 EXPECT_TRUE(result_name.empty() || result_name == "canonical");
Asanka Herath2d0226c2018-10-24 14:35:555878}
5879
Eric Orth960e7062019-03-08 18:43:545880TEST_F(HostResolverManagerDnsTest, CanonicalName) {
Eric Orth828bd3ae2018-12-12 17:30:365881 MockDnsClientRuleList rules;
5882 AddDnsRule(&rules, "alias", dns_protocol::kTypeA, IPAddress::IPv4Localhost(),
dalyk48b20a992019-02-25 16:10:265883 "canonical", false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:365884 AddDnsRule(&rules, "alias", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:265885 IPAddress::IPv6Localhost(), "canonical", false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:365886
Asanka Herath2d0226c2018-10-24 14:35:555887 CreateResolver();
Eric Orth828bd3ae2018-12-12 17:30:365888 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
Eric Orth60931742018-11-05 23:40:575889 set_allow_fallback_to_proctask(false);
Eric Orth828bd3ae2018-12-12 17:30:365890
Asanka Herath2d0226c2018-10-24 14:35:555891 HostResolver::ResolveHostParameters params;
Asanka Herath2d0226c2018-10-24 14:35:555892 params.include_canonical_name = true;
Eric Orth541a90c2019-01-17 20:11:465893 params.source = HostResolverSource::DNS;
Eric Orth117e1992019-04-17 00:24:155894 ResolveHostResponseHelper response(resolver_->CreateRequest(
5895 HostPortPair("alias", 80), NetLogWithSource(), params,
5896 request_context_.get(), host_cache_.get()));
Asanka Herath2d0226c2018-10-24 14:35:555897 ASSERT_THAT(response.result_error(), IsOk());
5898
5899 EXPECT_EQ(response.request()->GetAddressResults().value().canonical_name(),
5900 "canonical");
5901}
5902
Eric Orth960e7062019-03-08 18:43:545903TEST_F(HostResolverManagerDnsTest, CanonicalName_PreferV6) {
Eric Orth828bd3ae2018-12-12 17:30:365904 MockDnsClientRuleList rules;
5905 AddDnsRule(&rules, "alias", dns_protocol::kTypeA, IPAddress::IPv4Localhost(),
dalyk48b20a992019-02-25 16:10:265906 "wrong", false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:365907 AddDnsRule(&rules, "alias", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:265908 IPAddress::IPv6Localhost(), "correct", true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:365909
Asanka Herath2d0226c2018-10-24 14:35:555910 CreateResolver();
Eric Orth828bd3ae2018-12-12 17:30:365911 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
Eric Orth60931742018-11-05 23:40:575912 set_allow_fallback_to_proctask(false);
Eric Orth828bd3ae2018-12-12 17:30:365913
Asanka Herath2d0226c2018-10-24 14:35:555914 HostResolver::ResolveHostParameters params;
Asanka Herath2d0226c2018-10-24 14:35:555915 params.include_canonical_name = true;
Eric Orth541a90c2019-01-17 20:11:465916 params.source = HostResolverSource::DNS;
Eric Orth117e1992019-04-17 00:24:155917 ResolveHostResponseHelper response(resolver_->CreateRequest(
5918 HostPortPair("alias", 80), NetLogWithSource(), params,
5919 request_context_.get(), host_cache_.get()));
Asanka Herath2d0226c2018-10-24 14:35:555920 ASSERT_FALSE(response.complete());
5921 base::RunLoop().RunUntilIdle();
5922 dns_client_->CompleteDelayedTransactions();
5923 ASSERT_THAT(response.result_error(), IsOk());
5924 EXPECT_EQ(response.request()->GetAddressResults().value().canonical_name(),
5925 "correct");
5926}
5927
Eric Orth960e7062019-03-08 18:43:545928TEST_F(HostResolverManagerDnsTest, CanonicalName_V4Only) {
Eric Orth828bd3ae2018-12-12 17:30:365929 MockDnsClientRuleList rules;
5930 AddDnsRule(&rules, "alias", dns_protocol::kTypeA, IPAddress::IPv4Localhost(),
dalyk48b20a992019-02-25 16:10:265931 "correct", false /* delay */);
Asanka Herath2d0226c2018-10-24 14:35:555932 CreateResolver();
Eric Orth828bd3ae2018-12-12 17:30:365933 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
Eric Orth60931742018-11-05 23:40:575934 set_allow_fallback_to_proctask(false);
Eric Orth828bd3ae2018-12-12 17:30:365935
Asanka Herath2d0226c2018-10-24 14:35:555936 HostResolver::ResolveHostParameters params;
Eric Orth192e3bb2018-11-14 19:30:325937 params.dns_query_type = DnsQueryType::A;
Asanka Herath2d0226c2018-10-24 14:35:555938 params.include_canonical_name = true;
Eric Orth541a90c2019-01-17 20:11:465939 params.source = HostResolverSource::DNS;
Eric Orth117e1992019-04-17 00:24:155940 ResolveHostResponseHelper response(resolver_->CreateRequest(
5941 HostPortPair("alias", 80), NetLogWithSource(), params,
5942 request_context_.get(), host_cache_.get()));
Asanka Herath2d0226c2018-10-24 14:35:555943 ASSERT_THAT(response.result_error(), IsOk());
5944 EXPECT_EQ(response.request()->GetAddressResults().value().canonical_name(),
5945 "correct");
5946}
5947
Eric Orth541a90c2019-01-17 20:11:465948// Test that without specifying source, a request that would otherwise be
5949// handled by DNS is sent to the system resolver if cannonname is requested.
Eric Orth960e7062019-03-08 18:43:545950TEST_F(HostResolverManagerDnsTest, CanonicalNameForcesProc) {
Eric Orth541a90c2019-01-17 20:11:465951 // Disable fallback to ensure system resolver is used directly, not via
5952 // fallback.
5953 set_allow_fallback_to_proctask(false);
5954
5955 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.102",
5956 HOST_RESOLVER_CANONNAME, "canonical");
5957 proc_->SignalMultiple(1u);
5958
5959 ChangeDnsConfig(CreateValidDnsConfig());
5960
5961 HostResolver::ResolveHostParameters params;
5962 params.include_canonical_name = true;
5963 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:275964 HostPortPair("nx_succeed", 80), NetLogWithSource(), params,
Eric Orth117e1992019-04-17 00:24:155965 request_context_.get(), host_cache_.get()));
Eric Orth541a90c2019-01-17 20:11:465966 ASSERT_THAT(response.result_error(), IsOk());
5967
5968 EXPECT_EQ(response.request()->GetAddressResults().value().canonical_name(),
5969 "canonical");
5970}
5971
Eric Orth960e7062019-03-08 18:43:545972TEST_F(HostResolverManagerTest, ResolveLocalHostname) {
tfarina9ed7f8c52016-02-19 17:50:185973 AddressList addresses;
5974
5975 TestBothLoopbackIPs("localhost");
5976 TestBothLoopbackIPs("localhoST");
5977 TestBothLoopbackIPs("localhost.");
5978 TestBothLoopbackIPs("localhoST.");
5979 TestBothLoopbackIPs("localhost.localdomain");
5980 TestBothLoopbackIPs("localhost.localdomAIn");
5981 TestBothLoopbackIPs("localhost.localdomain.");
5982 TestBothLoopbackIPs("localhost.localdomAIn.");
5983 TestBothLoopbackIPs("foo.localhost");
5984 TestBothLoopbackIPs("foo.localhOSt");
5985 TestBothLoopbackIPs("foo.localhost.");
5986 TestBothLoopbackIPs("foo.localhOSt.");
5987
5988 TestIPv6LoopbackOnly("localhost6");
5989 TestIPv6LoopbackOnly("localhoST6");
5990 TestIPv6LoopbackOnly("localhost6.");
5991 TestIPv6LoopbackOnly("localhost6.localdomain6");
5992 TestIPv6LoopbackOnly("localhost6.localdomain6.");
5993
Matt Menkec35d1632018-11-29 12:43:495994 EXPECT_FALSE(ResolveLocalHostname("127.0.0.1", &addresses));
5995 EXPECT_FALSE(ResolveLocalHostname("::1", &addresses));
5996 EXPECT_FALSE(ResolveLocalHostname("0:0:0:0:0:0:0:1", &addresses));
5997 EXPECT_FALSE(ResolveLocalHostname("localhostx", &addresses));
5998 EXPECT_FALSE(ResolveLocalHostname("localhost.x", &addresses));
5999 EXPECT_FALSE(ResolveLocalHostname("foo.localdomain", &addresses));
6000 EXPECT_FALSE(ResolveLocalHostname("foo.localdomain.x", &addresses));
6001 EXPECT_FALSE(ResolveLocalHostname("localhost6x", &addresses));
6002 EXPECT_FALSE(ResolveLocalHostname("localhost.localdomain6", &addresses));
6003 EXPECT_FALSE(ResolveLocalHostname("localhost6.localdomain", &addresses));
6004 EXPECT_FALSE(ResolveLocalHostname("127.0.0.1.1", &addresses));
6005 EXPECT_FALSE(ResolveLocalHostname(".127.0.0.255", &addresses));
6006 EXPECT_FALSE(ResolveLocalHostname("::2", &addresses));
6007 EXPECT_FALSE(ResolveLocalHostname("::1:1", &addresses));
6008 EXPECT_FALSE(ResolveLocalHostname("0:0:0:0:1:0:0:1", &addresses));
6009 EXPECT_FALSE(ResolveLocalHostname("::1:1", &addresses));
6010 EXPECT_FALSE(ResolveLocalHostname("0:0:0:0:0:0:0:0:1", &addresses));
6011 EXPECT_FALSE(ResolveLocalHostname("foo.localhost.com", &addresses));
6012 EXPECT_FALSE(ResolveLocalHostname("foo.localhoste", &addresses));
tfarina9ed7f8c52016-02-19 17:50:186013}
6014
dalyk40dcab152019-03-15 21:03:156015TEST_F(HostResolverManagerDnsTest, ResolveDnsOverHttpsServerName) {
6016 MockDnsClientRuleList rules;
6017 rules.emplace_back(
dalyk4f4ac712019-05-31 16:33:136018 "dns.example2.com", dns_protocol::kTypeA, false /* secure */,
dalyk40dcab152019-03-15 21:03:156019 MockDnsClientRule::Result(MockDnsClientRule::OK), false /* delay */);
dalyk4f4ac712019-05-31 16:33:136020 rules.emplace_back(
6021 "dns.example2.com", dns_protocol::kTypeAAAA, false /* secure */,
6022 MockDnsClientRule::Result(MockDnsClientRule::OK), false /* delay */);
dalyk40dcab152019-03-15 21:03:156023 CreateResolver();
6024 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6025
6026 DnsConfigOverrides overrides;
dalyk4f4ac712019-05-31 16:33:136027 std::vector<DnsConfig::DnsOverHttpsServerConfig> doh_servers = {
6028 DnsConfig::DnsOverHttpsServerConfig("https://dns.example.com/",
6029 true /* use_post */),
6030 DnsConfig::DnsOverHttpsServerConfig(
6031 "https://dns.example2.com/dns-query{?dns}", false /* use_post */)};
6032 overrides.dns_over_https_servers = doh_servers;
6033 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::SECURE;
dalyk40dcab152019-03-15 21:03:156034 resolver_->SetDnsConfigOverrides(overrides);
6035
6036 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:276037 HostPortPair("dns.example2.com", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:156038 request_context_.get(), host_cache_.get()));
dalyk40dcab152019-03-15 21:03:156039 ASSERT_THAT(response.result_error(), IsOk());
6040}
6041
Eric Orth960e7062019-03-08 18:43:546042TEST_F(HostResolverManagerDnsTest, AddDnsOverHttpsServerAfterConfig) {
Eric Orth37b18192019-04-22 19:09:286043 DestroyResolver();
Brad Lassey786929ad2018-02-21 20:54:276044 test::ScopedMockNetworkChangeNotifier notifier;
6045 CreateSerialResolver(); // To guarantee order of resolutions.
6046 notifier.mock_network_change_notifier()->SetConnectionType(
6047 NetworkChangeNotifier::CONNECTION_WIFI);
6048 ChangeDnsConfig(CreateValidDnsConfig());
6049
dalykb34631f2018-08-24 19:59:486050 std::string server("https://dnsserver.example.net/dns-query{?dns}");
Eric Orthc1eb1292018-10-09 22:07:076051 DnsConfigOverrides overrides;
6052 overrides.dns_over_https_servers.emplace(
6053 {DnsConfig::DnsOverHttpsServerConfig(server, true)});
dalykc27699a2019-07-29 20:53:296054 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
Eric Orthc1eb1292018-10-09 22:07:076055 resolver_->SetDnsConfigOverrides(overrides);
Brad Lassey786929ad2018-02-21 20:54:276056 base::DictionaryValue* config;
6057
6058 auto value = resolver_->GetDnsConfigAsValue();
6059 EXPECT_TRUE(value);
6060 if (!value)
6061 return;
6062 value->GetAsDictionary(&config);
6063 base::ListValue* doh_servers;
6064 config->GetListWithoutPathExpansion("doh_servers", &doh_servers);
6065 EXPECT_TRUE(doh_servers);
6066 if (!doh_servers)
6067 return;
6068 EXPECT_EQ(doh_servers->GetSize(), 1u);
6069 base::DictionaryValue* server_method;
6070 EXPECT_TRUE(doh_servers->GetDictionary(0, &server_method));
6071 bool use_post;
6072 EXPECT_TRUE(server_method->GetBoolean("use_post", &use_post));
6073 EXPECT_TRUE(use_post);
dalykb34631f2018-08-24 19:59:486074 std::string server_template;
6075 EXPECT_TRUE(server_method->GetString("server_template", &server_template));
6076 EXPECT_EQ(server_template, server);
dalykc27699a2019-07-29 20:53:296077 EXPECT_EQ(config->FindKey("secure_dns_mode")->GetInt(),
6078 static_cast<int>(DnsConfig::SecureDnsMode::AUTOMATIC));
Brad Lassey786929ad2018-02-21 20:54:276079}
6080
Eric Orth960e7062019-03-08 18:43:546081TEST_F(HostResolverManagerDnsTest, AddDnsOverHttpsServerBeforeConfig) {
Eric Orth37b18192019-04-22 19:09:286082 DestroyResolver();
Brad Lassey786929ad2018-02-21 20:54:276083 test::ScopedMockNetworkChangeNotifier notifier;
6084 CreateSerialResolver(); // To guarantee order of resolutions.
dalykb34631f2018-08-24 19:59:486085 std::string server("https://dnsserver.example.net/dns-query{?dns}");
Eric Orthc1eb1292018-10-09 22:07:076086 DnsConfigOverrides overrides;
6087 overrides.dns_over_https_servers.emplace(
6088 {DnsConfig::DnsOverHttpsServerConfig(server, true)});
dalykc27699a2019-07-29 20:53:296089 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
Eric Orthc1eb1292018-10-09 22:07:076090 resolver_->SetDnsConfigOverrides(overrides);
Brad Lassey786929ad2018-02-21 20:54:276091
6092 notifier.mock_network_change_notifier()->SetConnectionType(
6093 NetworkChangeNotifier::CONNECTION_WIFI);
6094 ChangeDnsConfig(CreateValidDnsConfig());
6095
6096 base::DictionaryValue* config;
6097 auto value = resolver_->GetDnsConfigAsValue();
6098 EXPECT_TRUE(value);
6099 if (!value)
6100 return;
6101 value->GetAsDictionary(&config);
6102 base::ListValue* doh_servers;
6103 config->GetListWithoutPathExpansion("doh_servers", &doh_servers);
6104 EXPECT_TRUE(doh_servers);
6105 if (!doh_servers)
6106 return;
6107 EXPECT_EQ(doh_servers->GetSize(), 1u);
6108 base::DictionaryValue* server_method;
6109 EXPECT_TRUE(doh_servers->GetDictionary(0, &server_method));
6110 bool use_post;
6111 EXPECT_TRUE(server_method->GetBoolean("use_post", &use_post));
6112 EXPECT_TRUE(use_post);
dalykb34631f2018-08-24 19:59:486113 std::string server_template;
6114 EXPECT_TRUE(server_method->GetString("server_template", &server_template));
6115 EXPECT_EQ(server_template, server);
dalykc27699a2019-07-29 20:53:296116 EXPECT_EQ(config->FindKey("secure_dns_mode")->GetInt(),
6117 static_cast<int>(DnsConfig::SecureDnsMode::AUTOMATIC));
Brad Lassey786929ad2018-02-21 20:54:276118}
6119
Eric Orth960e7062019-03-08 18:43:546120TEST_F(HostResolverManagerDnsTest, AddDnsOverHttpsServerBeforeClient) {
Eric Orth37b18192019-04-22 19:09:286121 DestroyResolver();
Brad Lassey786929ad2018-02-21 20:54:276122 test::ScopedMockNetworkChangeNotifier notifier;
6123 CreateSerialResolver(); // To guarantee order of resolutions.
dalykb34631f2018-08-24 19:59:486124 std::string server("https://dnsserver.example.net/dns-query{?dns}");
Eric Orthc1eb1292018-10-09 22:07:076125 DnsConfigOverrides overrides;
6126 overrides.dns_over_https_servers.emplace(
6127 {DnsConfig::DnsOverHttpsServerConfig(server, true)});
dalykc27699a2019-07-29 20:53:296128 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
Eric Orthc1eb1292018-10-09 22:07:076129 resolver_->SetDnsConfigOverrides(overrides);
Brad Lassey786929ad2018-02-21 20:54:276130
6131 notifier.mock_network_change_notifier()->SetConnectionType(
6132 NetworkChangeNotifier::CONNECTION_WIFI);
6133 ChangeDnsConfig(CreateValidDnsConfig());
6134
Brad Lassey786929ad2018-02-21 20:54:276135 base::DictionaryValue* config;
6136 auto value = resolver_->GetDnsConfigAsValue();
6137 EXPECT_TRUE(value);
6138 if (!value)
6139 return;
6140 value->GetAsDictionary(&config);
6141 base::ListValue* doh_servers;
6142 config->GetListWithoutPathExpansion("doh_servers", &doh_servers);
6143 EXPECT_TRUE(doh_servers);
6144 if (!doh_servers)
6145 return;
6146 EXPECT_EQ(doh_servers->GetSize(), 1u);
6147 base::DictionaryValue* server_method;
6148 EXPECT_TRUE(doh_servers->GetDictionary(0, &server_method));
6149 bool use_post;
6150 EXPECT_TRUE(server_method->GetBoolean("use_post", &use_post));
6151 EXPECT_TRUE(use_post);
dalykb34631f2018-08-24 19:59:486152 std::string server_template;
6153 EXPECT_TRUE(server_method->GetString("server_template", &server_template));
6154 EXPECT_EQ(server_template, server);
dalykc27699a2019-07-29 20:53:296155 EXPECT_EQ(config->FindKey("secure_dns_mode")->GetInt(),
6156 static_cast<int>(DnsConfig::SecureDnsMode::AUTOMATIC));
Brad Lassey786929ad2018-02-21 20:54:276157}
6158
Eric Orth960e7062019-03-08 18:43:546159TEST_F(HostResolverManagerDnsTest, AddDnsOverHttpsServerAndThenRemove) {
Eric Orth37b18192019-04-22 19:09:286160 DestroyResolver();
Brad Lassey786929ad2018-02-21 20:54:276161 test::ScopedMockNetworkChangeNotifier notifier;
6162 CreateSerialResolver(); // To guarantee order of resolutions.
dalykb34631f2018-08-24 19:59:486163 std::string server("https://dns.example.com/");
Eric Orthc1eb1292018-10-09 22:07:076164 DnsConfigOverrides overrides;
6165 overrides.dns_over_https_servers.emplace(
6166 {DnsConfig::DnsOverHttpsServerConfig(server, true)});
dalykc27699a2019-07-29 20:53:296167 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
Eric Orthc1eb1292018-10-09 22:07:076168 resolver_->SetDnsConfigOverrides(overrides);
Brad Lassey786929ad2018-02-21 20:54:276169
6170 notifier.mock_network_change_notifier()->SetConnectionType(
6171 NetworkChangeNotifier::CONNECTION_WIFI);
dalyk4f4ac712019-05-31 16:33:136172 DnsConfig network_dns_config = CreateValidDnsConfig();
6173 network_dns_config.dns_over_https_servers.clear();
6174 ChangeDnsConfig(network_dns_config);
Brad Lassey786929ad2018-02-21 20:54:276175
6176 base::DictionaryValue* config;
6177 auto value = resolver_->GetDnsConfigAsValue();
6178 EXPECT_TRUE(value);
6179 if (!value)
6180 return;
6181 value->GetAsDictionary(&config);
6182 base::ListValue* doh_servers;
6183 config->GetListWithoutPathExpansion("doh_servers", &doh_servers);
6184 EXPECT_TRUE(doh_servers);
6185 if (!doh_servers)
6186 return;
6187 EXPECT_EQ(doh_servers->GetSize(), 1u);
6188 base::DictionaryValue* server_method;
6189 EXPECT_TRUE(doh_servers->GetDictionary(0, &server_method));
6190 bool use_post;
6191 EXPECT_TRUE(server_method->GetBoolean("use_post", &use_post));
6192 EXPECT_TRUE(use_post);
dalykb34631f2018-08-24 19:59:486193 std::string server_template;
6194 EXPECT_TRUE(server_method->GetString("server_template", &server_template));
6195 EXPECT_EQ(server_template, server);
dalykc27699a2019-07-29 20:53:296196 EXPECT_EQ(config->FindKey("secure_dns_mode")->GetInt(),
6197 static_cast<int>(DnsConfig::SecureDnsMode::AUTOMATIC));
Brad Lassey786929ad2018-02-21 20:54:276198
Eric Orthc1eb1292018-10-09 22:07:076199 resolver_->SetDnsConfigOverrides(DnsConfigOverrides());
Brad Lassey786929ad2018-02-21 20:54:276200 value = resolver_->GetDnsConfigAsValue();
6201 EXPECT_TRUE(value);
6202 if (!value)
6203 return;
6204 value->GetAsDictionary(&config);
6205 config->GetListWithoutPathExpansion("doh_servers", &doh_servers);
6206 EXPECT_TRUE(doh_servers);
6207 if (!doh_servers)
6208 return;
6209 EXPECT_EQ(doh_servers->GetSize(), 0u);
dalykc27699a2019-07-29 20:53:296210 EXPECT_EQ(config->FindKey("secure_dns_mode")->GetInt(),
6211 static_cast<int>(DnsConfig::SecureDnsMode::OFF));
Brad Lassey786929ad2018-02-21 20:54:276212}
6213
Eric Orth960e7062019-03-08 18:43:546214TEST_F(HostResolverManagerDnsTest, SetDnsConfigOverrides) {
Eric Orthc1eb1292018-10-09 22:07:076215 DnsConfig original_config = CreateValidDnsConfig();
6216 ChangeDnsConfig(original_config);
6217
6218 // Confirm pre-override state.
6219 ASSERT_TRUE(original_config.Equals(*dns_client_->GetConfig()));
6220
6221 DnsConfigOverrides overrides;
6222 const std::vector<IPEndPoint> nameservers = {
6223 CreateExpected("192.168.0.1", 92)};
6224 overrides.nameservers = nameservers;
6225 const std::vector<std::string> search = {"str"};
6226 overrides.search = search;
6227 const DnsHosts hosts = {
6228 {DnsHostsKey("host", ADDRESS_FAMILY_IPV4), IPAddress(192, 168, 1, 1)}};
6229 overrides.hosts = hosts;
6230 overrides.append_to_multi_label_name = false;
6231 overrides.randomize_ports = true;
6232 const int ndots = 5;
6233 overrides.ndots = ndots;
6234 const base::TimeDelta timeout = base::TimeDelta::FromSeconds(10);
6235 overrides.timeout = timeout;
6236 const int attempts = 20;
6237 overrides.attempts = attempts;
6238 overrides.rotate = true;
6239 overrides.use_local_ipv6 = true;
6240 const std::vector<DnsConfig::DnsOverHttpsServerConfig>
6241 dns_over_https_servers = {
6242 DnsConfig::DnsOverHttpsServerConfig("dns.example.com", true)};
6243 overrides.dns_over_https_servers = dns_over_https_servers;
dalykbd726ee2019-05-30 01:44:066244 const DnsConfig::SecureDnsMode secure_dns_mode =
6245 DnsConfig::SecureDnsMode::SECURE;
6246 overrides.secure_dns_mode = secure_dns_mode;
Eric Orthc1eb1292018-10-09 22:07:076247
Eric Orthc823a23d2018-10-30 22:12:486248 // This test is expected to test overriding all fields.
6249 EXPECT_TRUE(overrides.OverridesEverything());
6250
Eric Orthc1eb1292018-10-09 22:07:076251 resolver_->SetDnsConfigOverrides(overrides);
6252
6253 const DnsConfig* overridden_config = dns_client_->GetConfig();
6254 EXPECT_EQ(nameservers, overridden_config->nameservers);
6255 EXPECT_EQ(search, overridden_config->search);
6256 EXPECT_EQ(hosts, overridden_config->hosts);
6257 EXPECT_FALSE(overridden_config->append_to_multi_label_name);
6258 EXPECT_TRUE(overridden_config->randomize_ports);
6259 EXPECT_EQ(ndots, overridden_config->ndots);
6260 EXPECT_EQ(timeout, overridden_config->timeout);
6261 EXPECT_EQ(attempts, overridden_config->attempts);
6262 EXPECT_TRUE(overridden_config->rotate);
6263 EXPECT_TRUE(overridden_config->use_local_ipv6);
6264 EXPECT_EQ(dns_over_https_servers, overridden_config->dns_over_https_servers);
dalykbd726ee2019-05-30 01:44:066265 EXPECT_EQ(secure_dns_mode, overridden_config->secure_dns_mode);
Eric Orthc1eb1292018-10-09 22:07:076266}
6267
Eric Orth960e7062019-03-08 18:43:546268TEST_F(HostResolverManagerDnsTest,
Eric Orthc823a23d2018-10-30 22:12:486269 SetDnsConfigOverrides_OverrideEverythingCreation) {
6270 DnsConfig original_config = CreateValidDnsConfig();
6271 ChangeDnsConfig(original_config);
6272
6273 // Confirm pre-override state.
6274 ASSERT_TRUE(original_config.Equals(*dns_client_->GetConfig()));
6275 ASSERT_FALSE(original_config.Equals(DnsConfig()));
6276
6277 DnsConfigOverrides overrides =
6278 DnsConfigOverrides::CreateOverridingEverythingWithDefaults();
6279 EXPECT_TRUE(overrides.OverridesEverything());
6280
6281 // Ensure config is valid by setting a nameserver.
6282 std::vector<IPEndPoint> nameservers = {CreateExpected("1.2.3.4", 50)};
6283 overrides.nameservers = nameservers;
6284 EXPECT_TRUE(overrides.OverridesEverything());
6285
6286 resolver_->SetDnsConfigOverrides(overrides);
6287
6288 DnsConfig expected;
6289 expected.nameservers = nameservers;
6290 EXPECT_TRUE(dns_client_->GetConfig()->Equals(DnsConfig(expected)));
6291}
6292
Eric Orth960e7062019-03-08 18:43:546293TEST_F(HostResolverManagerDnsTest, SetDnsConfigOverrides_PartialOverride) {
Eric Orthc1eb1292018-10-09 22:07:076294 DnsConfig original_config = CreateValidDnsConfig();
6295 ChangeDnsConfig(original_config);
6296
6297 // Confirm pre-override state.
6298 ASSERT_TRUE(original_config.Equals(*dns_client_->GetConfig()));
6299
6300 DnsConfigOverrides overrides;
6301 const std::vector<IPEndPoint> nameservers = {
6302 CreateExpected("192.168.0.2", 192)};
6303 overrides.nameservers = nameservers;
6304 overrides.rotate = true;
Eric Orthc823a23d2018-10-30 22:12:486305 EXPECT_FALSE(overrides.OverridesEverything());
Eric Orthc1eb1292018-10-09 22:07:076306
6307 resolver_->SetDnsConfigOverrides(overrides);
6308
6309 const DnsConfig* overridden_config = dns_client_->GetConfig();
6310 EXPECT_EQ(nameservers, overridden_config->nameservers);
6311 EXPECT_EQ(original_config.search, overridden_config->search);
6312 EXPECT_EQ(original_config.hosts, overridden_config->hosts);
6313 EXPECT_TRUE(overridden_config->append_to_multi_label_name);
6314 EXPECT_FALSE(overridden_config->randomize_ports);
6315 EXPECT_EQ(original_config.ndots, overridden_config->ndots);
6316 EXPECT_EQ(original_config.timeout, overridden_config->timeout);
6317 EXPECT_EQ(original_config.attempts, overridden_config->attempts);
6318 EXPECT_TRUE(overridden_config->rotate);
6319 EXPECT_FALSE(overridden_config->use_local_ipv6);
6320 EXPECT_EQ(original_config.dns_over_https_servers,
6321 overridden_config->dns_over_https_servers);
dalykbd726ee2019-05-30 01:44:066322 EXPECT_EQ(original_config.secure_dns_mode,
6323 overridden_config->secure_dns_mode);
Eric Orthc1eb1292018-10-09 22:07:076324}
6325
6326// Test that overridden configs are reapplied over a changed underlying system
6327// config.
Eric Orth960e7062019-03-08 18:43:546328TEST_F(HostResolverManagerDnsTest, SetDnsConfigOverrides_NewConfig) {
Eric Orthc1eb1292018-10-09 22:07:076329 DnsConfig original_config = CreateValidDnsConfig();
6330 ChangeDnsConfig(original_config);
6331
6332 // Confirm pre-override state.
6333 ASSERT_TRUE(original_config.Equals(*dns_client_->GetConfig()));
6334
6335 DnsConfigOverrides overrides;
6336 const std::vector<IPEndPoint> nameservers = {
6337 CreateExpected("192.168.0.2", 192)};
6338 overrides.nameservers = nameservers;
6339
6340 resolver_->SetDnsConfigOverrides(overrides);
6341 ASSERT_EQ(nameservers, dns_client_->GetConfig()->nameservers);
6342
6343 DnsConfig new_config = original_config;
6344 new_config.attempts = 103;
6345 ASSERT_NE(nameservers, new_config.nameservers);
6346 ChangeDnsConfig(new_config);
6347
6348 const DnsConfig* overridden_config = dns_client_->GetConfig();
6349 EXPECT_EQ(nameservers, overridden_config->nameservers);
6350 EXPECT_EQ(new_config.attempts, overridden_config->attempts);
6351}
6352
Eric Orth960e7062019-03-08 18:43:546353TEST_F(HostResolverManagerDnsTest, SetDnsConfigOverrides_ClearOverrides) {
Eric Orthc1eb1292018-10-09 22:07:076354 DnsConfig original_config = CreateValidDnsConfig();
6355 ChangeDnsConfig(original_config);
6356
6357 DnsConfigOverrides overrides;
6358 overrides.attempts = 245;
6359 resolver_->SetDnsConfigOverrides(overrides);
6360
6361 ASSERT_FALSE(original_config.Equals(*dns_client_->GetConfig()));
6362
6363 resolver_->SetDnsConfigOverrides(DnsConfigOverrides());
6364 EXPECT_TRUE(original_config.Equals(*dns_client_->GetConfig()));
6365}
6366
Eric Orth37b18192019-04-22 19:09:286367TEST_F(HostResolverManagerDnsTest, FlushCacheOnDnsConfigOverridesChange) {
6368 ChangeDnsConfig(CreateValidDnsConfig());
6369
6370 HostResolver::ResolveHostParameters local_source_parameters;
6371 local_source_parameters.source = HostResolverSource::LOCAL_ONLY;
6372
6373 // Populate cache.
6374 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
6375 HostPortPair("ok", 70), NetLogWithSource(), base::nullopt,
6376 request_context_.get(), host_cache_.get()));
6377 EXPECT_THAT(initial_response.result_error(), IsOk());
6378
6379 // Confirm result now cached.
6380 ResolveHostResponseHelper cached_response(resolver_->CreateRequest(
6381 HostPortPair("ok", 75), NetLogWithSource(), local_source_parameters,
6382 request_context_.get(), host_cache_.get()));
6383 ASSERT_THAT(cached_response.result_error(), IsOk());
6384 ASSERT_TRUE(cached_response.request()->GetStaleInfo());
6385
6386 // Flush cache by triggering a DnsConfigOverrides change.
6387 DnsConfigOverrides overrides;
6388 overrides.attempts = 4;
6389 resolver_->SetDnsConfigOverrides(overrides);
6390
6391 // Expect no longer cached
6392 ResolveHostResponseHelper flushed_response(resolver_->CreateRequest(
6393 HostPortPair("ok", 80), NetLogWithSource(), local_source_parameters,
6394 request_context_.get(), host_cache_.get()));
6395 EXPECT_THAT(flushed_response.result_error(), IsError(ERR_DNS_CACHE_MISS));
6396}
6397
Eric Orthc823a23d2018-10-30 22:12:486398// Test that even when using config overrides, a change to the base system
6399// config cancels pending requests.
Eric Orth960e7062019-03-08 18:43:546400TEST_F(HostResolverManagerDnsTest, CancellationOnBaseConfigChange) {
Eric Orthc823a23d2018-10-30 22:12:486401 DnsConfig original_config = CreateValidDnsConfig();
6402 ChangeDnsConfig(original_config);
6403
6404 DnsConfigOverrides overrides;
6405 overrides.nameservers.emplace({CreateExpected("123.123.123.123", 80)});
6406 ASSERT_FALSE(overrides.OverridesEverything());
6407 resolver_->SetDnsConfigOverrides(overrides);
6408
Eric Orth117e1992019-04-17 00:24:156409 ResolveHostResponseHelper response(resolver_->CreateRequest(
6410 HostPortPair("4slow_ok", 80), NetLogWithSource(), base::nullopt,
6411 request_context_.get(), host_cache_.get()));
Eric Orthc823a23d2018-10-30 22:12:486412 ASSERT_FALSE(response.complete());
6413
6414 DnsConfig new_config = original_config;
6415 new_config.attempts = 103;
6416 ChangeDnsConfig(new_config);
6417
6418 EXPECT_THAT(response.result_error(), IsError(ERR_NETWORK_CHANGED));
6419}
6420
6421// Test that when all configuration is overridden, system configuration changes
6422// do not cancel requests.
Eric Orth960e7062019-03-08 18:43:546423TEST_F(HostResolverManagerDnsTest,
Eric Orthc823a23d2018-10-30 22:12:486424 CancellationOnBaseConfigChange_OverridesEverything) {
6425 DnsConfig original_config = CreateValidDnsConfig();
6426 ChangeDnsConfig(original_config);
6427
6428 DnsConfigOverrides overrides =
6429 DnsConfigOverrides::CreateOverridingEverythingWithDefaults();
6430 overrides.nameservers.emplace({CreateExpected("123.123.123.123", 80)});
6431 ASSERT_TRUE(overrides.OverridesEverything());
6432 resolver_->SetDnsConfigOverrides(overrides);
6433
Eric Orth117e1992019-04-17 00:24:156434 ResolveHostResponseHelper response(resolver_->CreateRequest(
6435 HostPortPair("4slow_ok", 80), NetLogWithSource(), base::nullopt,
6436 request_context_.get(), host_cache_.get()));
Eric Orthc823a23d2018-10-30 22:12:486437 ASSERT_FALSE(response.complete());
6438
6439 DnsConfig new_config = original_config;
6440 new_config.attempts = 103;
6441 ChangeDnsConfig(new_config);
6442
6443 dns_client_->CompleteDelayedTransactions();
6444 EXPECT_THAT(response.result_error(), IsOk());
6445}
6446
Eric Orthc1eb1292018-10-09 22:07:076447// Test that in-progress queries are cancelled on applying new DNS config
6448// overrides, same as receiving a new DnsConfig from the system.
Eric Orth960e7062019-03-08 18:43:546449TEST_F(HostResolverManagerDnsTest, CancelQueriesOnSettingOverrides) {
Eric Orthc1eb1292018-10-09 22:07:076450 ChangeDnsConfig(CreateValidDnsConfig());
Eric Orth117e1992019-04-17 00:24:156451 ResolveHostResponseHelper response(resolver_->CreateRequest(
6452 HostPortPair("4slow_ok", 80), NetLogWithSource(), base::nullopt,
6453 request_context_.get(), host_cache_.get()));
Eric Orthc1eb1292018-10-09 22:07:076454 ASSERT_FALSE(response.complete());
6455
6456 DnsConfigOverrides overrides;
6457 overrides.attempts = 123;
6458 resolver_->SetDnsConfigOverrides(overrides);
6459
6460 EXPECT_THAT(response.result_error(), IsError(ERR_NETWORK_CHANGED));
6461}
6462
6463// Queries should not be cancelled if equal overrides are set.
Eric Orth960e7062019-03-08 18:43:546464TEST_F(HostResolverManagerDnsTest,
6465 CancelQueriesOnSettingOverrides_SameOverrides) {
Eric Orthc1eb1292018-10-09 22:07:076466 ChangeDnsConfig(CreateValidDnsConfig());
6467 DnsConfigOverrides overrides;
6468 overrides.attempts = 123;
6469 resolver_->SetDnsConfigOverrides(overrides);
6470
Eric Orth117e1992019-04-17 00:24:156471 ResolveHostResponseHelper response(resolver_->CreateRequest(
6472 HostPortPair("4slow_ok", 80), NetLogWithSource(), base::nullopt,
6473 request_context_.get(), host_cache_.get()));
Eric Orthc1eb1292018-10-09 22:07:076474 ASSERT_FALSE(response.complete());
6475
6476 resolver_->SetDnsConfigOverrides(overrides);
6477
Eric Orthc823a23d2018-10-30 22:12:486478 dns_client_->CompleteDelayedTransactions();
Eric Orthc1eb1292018-10-09 22:07:076479 EXPECT_THAT(response.result_error(), IsOk());
6480}
6481
6482// Test that in-progress queries are cancelled on clearing DNS config overrides,
6483// same as receiving a new DnsConfig from the system.
Eric Orth960e7062019-03-08 18:43:546484TEST_F(HostResolverManagerDnsTest, CancelQueriesOnClearingOverrides) {
Eric Orthc1eb1292018-10-09 22:07:076485 ChangeDnsConfig(CreateValidDnsConfig());
6486 DnsConfigOverrides overrides;
6487 overrides.attempts = 123;
6488 resolver_->SetDnsConfigOverrides(overrides);
6489
Eric Orth117e1992019-04-17 00:24:156490 ResolveHostResponseHelper response(resolver_->CreateRequest(
6491 HostPortPair("4slow_ok", 80), NetLogWithSource(), base::nullopt,
6492 request_context_.get(), host_cache_.get()));
Eric Orthc1eb1292018-10-09 22:07:076493 ASSERT_FALSE(response.complete());
6494
6495 resolver_->SetDnsConfigOverrides(DnsConfigOverrides());
6496
6497 EXPECT_THAT(response.result_error(), IsError(ERR_NETWORK_CHANGED));
6498}
6499
6500// Queries should not be cancelled on clearing overrides if there were not any
6501// overrides.
Eric Orth960e7062019-03-08 18:43:546502TEST_F(HostResolverManagerDnsTest,
6503 CancelQueriesOnClearingOverrides_NoOverrides) {
Eric Orthc1eb1292018-10-09 22:07:076504 ChangeDnsConfig(CreateValidDnsConfig());
Eric Orth117e1992019-04-17 00:24:156505 ResolveHostResponseHelper response(resolver_->CreateRequest(
6506 HostPortPair("4slow_ok", 80), NetLogWithSource(), base::nullopt,
6507 request_context_.get(), host_cache_.get()));
Eric Orthc1eb1292018-10-09 22:07:076508 ASSERT_FALSE(response.complete());
6509
6510 resolver_->SetDnsConfigOverrides(DnsConfigOverrides());
6511
Eric Orthc823a23d2018-10-30 22:12:486512 dns_client_->CompleteDelayedTransactions();
Eric Orthc1eb1292018-10-09 22:07:076513 EXPECT_THAT(response.result_error(), IsOk());
6514}
6515
Eric Orth960e7062019-03-08 18:43:546516// Test HostResolverManager::UpdateModeForHistogram.
6517TEST_F(HostResolverManagerDnsTest, ModeForHistogram) {
Paul Jensen41dc3e9f2018-11-06 22:10:106518 // Test Async resolver is detected.
6519 ChangeDnsConfig(CreateValidDnsConfig());
6520 EXPECT_EQ(resolver_->mode_for_histogram_,
Eric Orth960e7062019-03-08 18:43:546521 HostResolverManager::MODE_FOR_HISTOGRAM_ASYNC_DNS);
Paul Jensen41dc3e9f2018-11-06 22:10:106522
6523 // Test upgradability is detected for async DNS.
Eric Orth192e3bb2018-11-14 19:30:326524 static const std::vector<const char*> upgradable_servers(
Paul Jensen41dc3e9f2018-11-06 22:10:106525 {// Google Public DNS
6526 "8.8.8.8", "8.8.4.4", "2001:4860:4860::8888", "2001:4860:4860::8844",
6527 // Cloudflare DNS
6528 "1.1.1.1", "1.0.0.1", "2606:4700:4700::1111", "2606:4700:4700::1001",
6529 // Quad9 DNS
6530 "9.9.9.9", "149.112.112.112", "2620:fe::fe", "2620:fe::9"});
6531 for (const char* upgradable_server : upgradable_servers) {
6532 IPAddress ip_address;
6533 ASSERT_TRUE(ip_address.AssignFromIPLiteral(upgradable_server));
6534 DnsConfig dns_config;
6535 dns_config.nameservers.push_back(
6536 IPEndPoint(ip_address, dns_protocol::kDefaultPort));
6537 ChangeDnsConfig(dns_config);
6538 EXPECT_EQ(
6539 resolver_->mode_for_histogram_,
Eric Orth960e7062019-03-08 18:43:546540 HostResolverManager::MODE_FOR_HISTOGRAM_ASYNC_DNS_PRIVATE_SUPPORTS_DOH);
Paul Jensen41dc3e9f2018-11-06 22:10:106541 }
6542
6543 // Test system resolver is detected.
dalykc27699a2019-07-29 20:53:296544 resolver_->SetInsecureDnsClientEnabled(false);
Paul Jensen41dc3e9f2018-11-06 22:10:106545 ChangeDnsConfig(CreateValidDnsConfig());
6546 EXPECT_EQ(resolver_->mode_for_histogram_,
Eric Orth960e7062019-03-08 18:43:546547 HostResolverManager::MODE_FOR_HISTOGRAM_SYSTEM);
Paul Jensen41dc3e9f2018-11-06 22:10:106548
6549 // Test upgradability is detected for system resolver.
6550 for (const char* upgradable_server : upgradable_servers) {
6551 IPAddress ip_address;
6552 ASSERT_TRUE(ip_address.AssignFromIPLiteral(upgradable_server));
6553 DnsConfig dns_config;
6554 dns_config.nameservers.push_back(
6555 IPEndPoint(ip_address, dns_protocol::kDefaultPort));
6556 ChangeDnsConfig(dns_config);
6557 EXPECT_EQ(resolver_->mode_for_histogram_,
Eric Orth960e7062019-03-08 18:43:546558 HostResolverManager::MODE_FOR_HISTOGRAM_SYSTEM_SUPPORTS_DOH);
Paul Jensen41dc3e9f2018-11-06 22:10:106559 }
dalyk6d7d8ead2019-08-15 03:30:086560
6561 // Test private DNS is detected.
6562 DnsConfig config = CreateValidDnsConfig();
6563 config.dns_over_tls_active = true;
6564 ChangeDnsConfig(config);
6565 EXPECT_EQ(resolver_->mode_for_histogram_,
6566 HostResolverManager::MODE_FOR_HISTOGRAM_SYSTEM_PRIVATE_DNS);
6567
6568 // Test upgradeability from IP addresses when private DNS is active.
6569 for (const char* upgradable_server : upgradable_servers) {
6570 IPAddress ip_address;
6571 ASSERT_TRUE(ip_address.AssignFromIPLiteral(upgradable_server));
6572 DnsConfig dns_config;
6573 dns_config.dns_over_tls_active = true;
6574 dns_config.nameservers.push_back(
6575 IPEndPoint(ip_address, dns_protocol::kDefaultPort));
6576 ChangeDnsConfig(dns_config);
6577 EXPECT_EQ(resolver_->mode_for_histogram_,
6578 HostResolverManager::
6579 MODE_FOR_HISTOGRAM_SYSTEM_PRIVATE_DNS_SUPPORTS_DOH);
6580 }
6581
6582 // Test upgradeability from private DNS hostname.
6583 static const std::vector<const char*> upgradeable_private_servers(
6584 {// Google Public DNS
6585 "dns.google",
6586 // Cloudflare DNS
6587 "1dot1dot1dot1.cloudflare-dns.com", "cloudflare-dns.com",
6588 // Quad9 DNS
6589 "dns.quad9.net"});
6590 for (const char* upgradeable_private_server : upgradeable_private_servers) {
6591 DnsConfig dns_config;
6592 dns_config.dns_over_tls_active = true;
6593 dns_config.dns_over_tls_hostname = upgradeable_private_server;
6594 dns_config.nameservers.push_back(
6595 IPEndPoint(IPAddress(1, 2, 3, 4), dns_protocol::kDefaultPort));
6596 ChangeDnsConfig(dns_config);
6597 EXPECT_EQ(resolver_->mode_for_histogram_,
6598 HostResolverManager::
6599 MODE_FOR_HISTOGRAM_SYSTEM_PRIVATE_DNS_SUPPORTS_DOH);
6600 }
Paul Jensen41dc3e9f2018-11-06 22:10:106601}
6602
Eric Orth960e7062019-03-08 18:43:546603TEST_F(HostResolverManagerDnsTest, TxtQuery) {
Eric Orth828bd3ae2018-12-12 17:30:366604 // Simulate two separate DNS records, each with multiple strings.
6605 std::vector<std::string> foo_records = {"foo1", "foo2", "foo3"};
6606 std::vector<std::string> bar_records = {"bar1", "bar2"};
6607 std::vector<std::vector<std::string>> text_records = {foo_records,
6608 bar_records};
6609
6610 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136611 rules.emplace_back("host", dns_protocol::kTypeTXT, false /* secure */,
dalykc0ab0722019-03-14 17:00:586612 MockDnsClientRule::Result(BuildTestDnsTextResponse(
6613 "host", std::move(text_records))),
Eric Orth828bd3ae2018-12-12 17:30:366614 false /* delay */);
6615
6616 CreateResolver();
6617 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6618
6619 HostResolver::ResolveHostParameters parameters;
6620 parameters.dns_query_type = DnsQueryType::TXT;
6621
Eric Orth117e1992019-04-17 00:24:156622 ResolveHostResponseHelper response(resolver_->CreateRequest(
6623 HostPortPair("host", 108), NetLogWithSource(), parameters,
6624 request_context_.get(), host_cache_.get()));
Eric Orth828bd3ae2018-12-12 17:30:366625 EXPECT_THAT(response.result_error(), IsOk());
6626 EXPECT_FALSE(response.request()->GetAddressResults());
6627 EXPECT_FALSE(response.request()->GetHostnameResults());
6628
6629 // Order between separate DNS records is undefined, but each record should
6630 // stay in order as that order may be meaningful.
6631 ASSERT_THAT(response.request()->GetTextResults(),
6632 testing::Optional(testing::UnorderedElementsAre(
6633 "foo1", "foo2", "foo3", "bar1", "bar2")));
6634 std::vector<std::string> results =
6635 response.request()->GetTextResults().value();
6636 EXPECT_NE(results.end(), std::search(results.begin(), results.end(),
6637 foo_records.begin(), foo_records.end()));
6638 EXPECT_NE(results.end(), std::search(results.begin(), results.end(),
6639 bar_records.begin(), bar_records.end()));
6640}
6641
dalykc27699a2019-07-29 20:53:296642TEST_F(HostResolverManagerDnsTest, TxtQuery_InvalidConfig) {
6643 set_allow_fallback_to_proctask(false);
6644 // Set empty DnsConfig.
6645 ChangeDnsConfig(DnsConfig());
6646
6647 HostResolver::ResolveHostParameters parameters;
6648 parameters.dns_query_type = DnsQueryType::TXT;
6649
6650 ResolveHostResponseHelper response(resolver_->CreateRequest(
6651 HostPortPair("host", 108), NetLogWithSource(), parameters,
6652 request_context_.get(), host_cache_.get()));
6653 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_CACHE_MISS));
6654}
6655
Eric Orth960e7062019-03-08 18:43:546656TEST_F(HostResolverManagerDnsTest, TxtQuery_NonexistentDomain) {
Eric Orth828bd3ae2018-12-12 17:30:366657 // Setup fallback to confirm it is not used for non-address results.
6658 set_allow_fallback_to_proctask(true);
6659 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
6660 proc_->SignalMultiple(1u);
6661
6662 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136663 rules.emplace_back("host", dns_protocol::kTypeTXT, false /* secure */,
Eric Orth828bd3ae2018-12-12 17:30:366664 MockDnsClientRule::Result(MockDnsClientRule::NODOMAIN),
6665 false /* delay */);
6666
6667 CreateResolver();
6668 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6669
6670 HostResolver::ResolveHostParameters parameters;
6671 parameters.dns_query_type = DnsQueryType::TXT;
6672
Eric Orth117e1992019-04-17 00:24:156673 ResolveHostResponseHelper response(resolver_->CreateRequest(
6674 HostPortPair("host", 108), NetLogWithSource(), parameters,
6675 request_context_.get(), host_cache_.get()));
Eric Orth828bd3ae2018-12-12 17:30:366676 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
6677 EXPECT_FALSE(response.request()->GetAddressResults());
6678 EXPECT_FALSE(response.request()->GetTextResults());
6679 EXPECT_FALSE(response.request()->GetHostnameResults());
6680}
6681
Eric Orth960e7062019-03-08 18:43:546682TEST_F(HostResolverManagerDnsTest, TxtQuery_Failure) {
Eric Orth828bd3ae2018-12-12 17:30:366683 // Setup fallback to confirm it is not used for non-address results.
6684 set_allow_fallback_to_proctask(true);
6685 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
6686 proc_->SignalMultiple(1u);
6687
6688 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136689 rules.emplace_back("host", dns_protocol::kTypeTXT, false /* secure */,
6690 MockDnsClientRule::Result(MockDnsClientRule::FAIL),
6691 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:366692
6693 CreateResolver();
6694 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6695
6696 HostResolver::ResolveHostParameters parameters;
6697 parameters.dns_query_type = DnsQueryType::TXT;
6698
Eric Orth117e1992019-04-17 00:24:156699 ResolveHostResponseHelper response(resolver_->CreateRequest(
6700 HostPortPair("host", 108), NetLogWithSource(), parameters,
6701 request_context_.get(), host_cache_.get()));
Eric Orth828bd3ae2018-12-12 17:30:366702 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
6703 EXPECT_FALSE(response.request()->GetAddressResults());
6704 EXPECT_FALSE(response.request()->GetTextResults());
6705 EXPECT_FALSE(response.request()->GetHostnameResults());
6706}
6707
Eric Orth960e7062019-03-08 18:43:546708TEST_F(HostResolverManagerDnsTest, TxtQuery_Timeout) {
Eric Orth828bd3ae2018-12-12 17:30:366709 // Setup fallback to confirm it is not used for non-address results.
6710 set_allow_fallback_to_proctask(true);
6711 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
6712 proc_->SignalMultiple(1u);
6713
6714 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136715 rules.emplace_back("host", dns_protocol::kTypeTXT, false /* secure */,
6716 MockDnsClientRule::Result(MockDnsClientRule::TIMEOUT),
6717 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:366718
6719 CreateResolver();
6720 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6721
6722 HostResolver::ResolveHostParameters parameters;
6723 parameters.dns_query_type = DnsQueryType::TXT;
6724
Eric Orth117e1992019-04-17 00:24:156725 ResolveHostResponseHelper response(resolver_->CreateRequest(
6726 HostPortPair("host", 108), NetLogWithSource(), parameters,
6727 request_context_.get(), host_cache_.get()));
Eric Orth828bd3ae2018-12-12 17:30:366728 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_TIMED_OUT));
6729 EXPECT_FALSE(response.request()->GetAddressResults());
6730 EXPECT_FALSE(response.request()->GetTextResults());
6731 EXPECT_FALSE(response.request()->GetHostnameResults());
6732}
6733
Eric Orth960e7062019-03-08 18:43:546734TEST_F(HostResolverManagerDnsTest, TxtQuery_Empty) {
Eric Orth828bd3ae2018-12-12 17:30:366735 // Setup fallback to confirm it is not used for non-address results.
6736 set_allow_fallback_to_proctask(true);
6737 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
6738 proc_->SignalMultiple(1u);
6739
6740 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136741 rules.emplace_back("host", dns_protocol::kTypeTXT, false /* secure */,
6742 MockDnsClientRule::Result(MockDnsClientRule::EMPTY),
6743 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:366744
6745 CreateResolver();
6746 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6747
6748 HostResolver::ResolveHostParameters parameters;
6749 parameters.dns_query_type = DnsQueryType::TXT;
6750
Eric Orth117e1992019-04-17 00:24:156751 ResolveHostResponseHelper response(resolver_->CreateRequest(
6752 HostPortPair("host", 108), NetLogWithSource(), parameters,
6753 request_context_.get(), host_cache_.get()));
Eric Orth828bd3ae2018-12-12 17:30:366754 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
6755 EXPECT_FALSE(response.request()->GetAddressResults());
6756 EXPECT_FALSE(response.request()->GetTextResults());
6757 EXPECT_FALSE(response.request()->GetHostnameResults());
6758}
6759
Eric Orth960e7062019-03-08 18:43:546760TEST_F(HostResolverManagerDnsTest, TxtQuery_Malformed) {
Eric Orth828bd3ae2018-12-12 17:30:366761 // Setup fallback to confirm it is not used for non-address results.
6762 set_allow_fallback_to_proctask(true);
6763 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
6764 proc_->SignalMultiple(1u);
6765
6766 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136767 rules.emplace_back("host", dns_protocol::kTypeTXT, false /* secure */,
Eric Orth828bd3ae2018-12-12 17:30:366768 MockDnsClientRule::Result(MockDnsClientRule::MALFORMED),
6769 false /* delay */);
6770
6771 CreateResolver();
6772 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6773
6774 HostResolver::ResolveHostParameters parameters;
6775 parameters.dns_query_type = DnsQueryType::TXT;
6776
Eric Orth117e1992019-04-17 00:24:156777 ResolveHostResponseHelper response(resolver_->CreateRequest(
6778 HostPortPair("host", 108), NetLogWithSource(), parameters,
6779 request_context_.get(), host_cache_.get()));
Eric Orth828bd3ae2018-12-12 17:30:366780 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE));
6781 EXPECT_FALSE(response.request()->GetAddressResults());
6782 EXPECT_FALSE(response.request()->GetTextResults());
6783 EXPECT_FALSE(response.request()->GetHostnameResults());
6784}
6785
Eric Orth960e7062019-03-08 18:43:546786TEST_F(HostResolverManagerDnsTest, TxtQuery_MismatchedName) {
Eric Orth828bd3ae2018-12-12 17:30:366787 std::vector<std::vector<std::string>> text_records = {{"text"}};
6788 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136789 rules.emplace_back("host", dns_protocol::kTypeTXT, false /* secure */,
dalykc0ab0722019-03-14 17:00:586790 MockDnsClientRule::Result(BuildTestDnsTextResponse(
Eric Orth828bd3ae2018-12-12 17:30:366791 "host", std::move(text_records), "not.host")),
6792 false /* delay */);
6793
6794 CreateResolver();
6795 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6796
6797 HostResolver::ResolveHostParameters parameters;
6798 parameters.dns_query_type = DnsQueryType::TXT;
6799
Eric Orth117e1992019-04-17 00:24:156800 ResolveHostResponseHelper response(resolver_->CreateRequest(
6801 HostPortPair("host", 108), NetLogWithSource(), parameters,
6802 request_context_.get(), host_cache_.get()));
Eric Orth828bd3ae2018-12-12 17:30:366803 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE));
6804 EXPECT_FALSE(response.request()->GetAddressResults());
6805 EXPECT_FALSE(response.request()->GetTextResults());
6806 EXPECT_FALSE(response.request()->GetHostnameResults());
6807}
6808
Eric Orth960e7062019-03-08 18:43:546809TEST_F(HostResolverManagerDnsTest, TxtQuery_WrongType) {
Eric Orth828bd3ae2018-12-12 17:30:366810 // Respond to a TXT query with an A response.
6811 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136812 rules.emplace_back("host", dns_protocol::kTypeTXT, false /* secure */,
Eric Orth828bd3ae2018-12-12 17:30:366813 MockDnsClientRule::Result(
6814 BuildTestDnsResponse("host", IPAddress(1, 2, 3, 4))),
6815 false /* delay */);
6816
6817 CreateResolver();
6818 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6819
6820 HostResolver::ResolveHostParameters parameters;
6821 parameters.dns_query_type = DnsQueryType::TXT;
6822
6823 // Responses for the wrong type should be ignored.
Eric Orth117e1992019-04-17 00:24:156824 ResolveHostResponseHelper response(resolver_->CreateRequest(
6825 HostPortPair("ok", 108), NetLogWithSource(), parameters,
6826 request_context_.get(), host_cache_.get()));
Eric Orth828bd3ae2018-12-12 17:30:366827 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
6828 EXPECT_FALSE(response.request()->GetAddressResults());
6829 EXPECT_FALSE(response.request()->GetTextResults());
6830 EXPECT_FALSE(response.request()->GetHostnameResults());
6831}
6832
Eric Ortha625b042019-01-16 01:14:456833// Same as TxtQuery except we specify DNS HostResolverSource instead of relying
6834// on automatic determination. Expect same results since DNS should be what we
6835// automatically determine, but some slightly different logic paths are
6836// involved.
Eric Orth960e7062019-03-08 18:43:546837TEST_F(HostResolverManagerDnsTest, TxtDnsQuery) {
Eric Orth828bd3ae2018-12-12 17:30:366838 // Simulate two separate DNS records, each with multiple strings.
6839 std::vector<std::string> foo_records = {"foo1", "foo2", "foo3"};
6840 std::vector<std::string> bar_records = {"bar1", "bar2"};
6841 std::vector<std::vector<std::string>> text_records = {foo_records,
6842 bar_records};
6843
6844 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136845 rules.emplace_back("host", dns_protocol::kTypeTXT, false /* secure */,
dalykc0ab0722019-03-14 17:00:586846 MockDnsClientRule::Result(BuildTestDnsTextResponse(
6847 "host", std::move(text_records))),
Eric Orth828bd3ae2018-12-12 17:30:366848 false /* delay */);
6849
6850 CreateResolver();
6851 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6852
6853 HostResolver::ResolveHostParameters parameters;
6854 parameters.source = HostResolverSource::DNS;
6855 parameters.dns_query_type = DnsQueryType::TXT;
6856
Eric Orth117e1992019-04-17 00:24:156857 ResolveHostResponseHelper response(resolver_->CreateRequest(
6858 HostPortPair("host", 108), NetLogWithSource(), parameters,
6859 request_context_.get(), host_cache_.get()));
Eric Orth828bd3ae2018-12-12 17:30:366860 EXPECT_THAT(response.result_error(), IsOk());
6861 EXPECT_FALSE(response.request()->GetAddressResults());
6862 EXPECT_FALSE(response.request()->GetHostnameResults());
6863
6864 // Order between separate DNS records is undefined, but each record should
6865 // stay in order as that order may be meaningful.
6866 ASSERT_THAT(response.request()->GetTextResults(),
6867 testing::Optional(testing::UnorderedElementsAre(
6868 "foo1", "foo2", "foo3", "bar1", "bar2")));
6869 std::vector<std::string> results =
6870 response.request()->GetTextResults().value();
6871 EXPECT_NE(results.end(), std::search(results.begin(), results.end(),
6872 foo_records.begin(), foo_records.end()));
6873 EXPECT_NE(results.end(), std::search(results.begin(), results.end(),
6874 bar_records.begin(), bar_records.end()));
6875}
6876
Eric Orth960e7062019-03-08 18:43:546877TEST_F(HostResolverManagerDnsTest, PtrQuery) {
Eric Orthe9db8d232019-01-14 21:24:456878 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136879 rules.emplace_back("host", dns_protocol::kTypePTR, false /* secure */,
Eric Orthe9db8d232019-01-14 21:24:456880 MockDnsClientRule::Result(BuildTestDnsPointerResponse(
6881 "host", {"foo.com", "bar.com"})),
6882 false /* delay */);
6883
6884 CreateResolver();
6885 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6886
6887 HostResolver::ResolveHostParameters parameters;
6888 parameters.dns_query_type = DnsQueryType::PTR;
6889
Eric Orth117e1992019-04-17 00:24:156890 ResolveHostResponseHelper response(resolver_->CreateRequest(
6891 HostPortPair("host", 108), NetLogWithSource(), parameters,
6892 request_context_.get(), host_cache_.get()));
Eric Orthe9db8d232019-01-14 21:24:456893 EXPECT_THAT(response.result_error(), IsOk());
6894 EXPECT_FALSE(response.request()->GetAddressResults());
6895 EXPECT_FALSE(response.request()->GetTextResults());
6896
6897 // Order between separate records is undefined.
6898 EXPECT_THAT(response.request()->GetHostnameResults(),
6899 testing::Optional(testing::UnorderedElementsAre(
6900 HostPortPair("foo.com", 108), HostPortPair("bar.com", 108))));
6901}
6902
Eric Orth960e7062019-03-08 18:43:546903TEST_F(HostResolverManagerDnsTest, PtrQuery_Ip) {
Eric Orthe9db8d232019-01-14 21:24:456904 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136905 rules.emplace_back("8.8.8.8", dns_protocol::kTypePTR, false /* secure */,
Eric Orthe9db8d232019-01-14 21:24:456906 MockDnsClientRule::Result(BuildTestDnsPointerResponse(
6907 "8.8.8.8", {"foo.com", "bar.com"})),
6908 false /* delay */);
6909
6910 CreateResolver();
6911 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6912
6913 HostResolver::ResolveHostParameters parameters;
6914 parameters.dns_query_type = DnsQueryType::PTR;
6915
Eric Orth117e1992019-04-17 00:24:156916 ResolveHostResponseHelper response(resolver_->CreateRequest(
6917 HostPortPair("8.8.8.8", 108), NetLogWithSource(), parameters,
6918 request_context_.get(), host_cache_.get()));
Eric Orthe9db8d232019-01-14 21:24:456919 EXPECT_THAT(response.result_error(), IsOk());
6920 EXPECT_FALSE(response.request()->GetAddressResults());
6921 EXPECT_FALSE(response.request()->GetTextResults());
6922
6923 // Order between separate records is undefined.
6924 EXPECT_THAT(response.request()->GetHostnameResults(),
6925 testing::Optional(testing::UnorderedElementsAre(
6926 HostPortPair("foo.com", 108), HostPortPair("bar.com", 108))));
6927}
6928
Eric Orth960e7062019-03-08 18:43:546929TEST_F(HostResolverManagerDnsTest, PtrQuery_NonexistentDomain) {
Eric Orthe9db8d232019-01-14 21:24:456930 // Setup fallback to confirm it is not used for non-address results.
6931 set_allow_fallback_to_proctask(true);
6932 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
6933 proc_->SignalMultiple(1u);
6934
6935 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136936 rules.emplace_back("host", dns_protocol::kTypePTR, false /* secure */,
Eric Orthe9db8d232019-01-14 21:24:456937 MockDnsClientRule::Result(MockDnsClientRule::NODOMAIN),
6938 false /* delay */);
6939
6940 CreateResolver();
6941 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6942
6943 HostResolver::ResolveHostParameters parameters;
6944 parameters.dns_query_type = DnsQueryType::PTR;
6945
Eric Orth117e1992019-04-17 00:24:156946 ResolveHostResponseHelper response(resolver_->CreateRequest(
6947 HostPortPair("host", 108), NetLogWithSource(), parameters,
6948 request_context_.get(), host_cache_.get()));
Eric Orthe9db8d232019-01-14 21:24:456949 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
6950 EXPECT_FALSE(response.request()->GetAddressResults());
6951 EXPECT_FALSE(response.request()->GetTextResults());
6952 EXPECT_FALSE(response.request()->GetHostnameResults());
6953}
6954
Eric Orth960e7062019-03-08 18:43:546955TEST_F(HostResolverManagerDnsTest, PtrQuery_Failure) {
Eric Orthe9db8d232019-01-14 21:24:456956 // Setup fallback to confirm it is not used for non-address results.
6957 set_allow_fallback_to_proctask(true);
6958 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
6959 proc_->SignalMultiple(1u);
6960
6961 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136962 rules.emplace_back("host", dns_protocol::kTypePTR, false /* secure */,
6963 MockDnsClientRule::Result(MockDnsClientRule::FAIL),
6964 false /* delay */);
Eric Orthe9db8d232019-01-14 21:24:456965
6966 CreateResolver();
6967 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6968
6969 HostResolver::ResolveHostParameters parameters;
6970 parameters.dns_query_type = DnsQueryType::PTR;
6971
Eric Orth117e1992019-04-17 00:24:156972 ResolveHostResponseHelper response(resolver_->CreateRequest(
6973 HostPortPair("host", 108), NetLogWithSource(), parameters,
6974 request_context_.get(), host_cache_.get()));
Eric Orthe9db8d232019-01-14 21:24:456975 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
6976 EXPECT_FALSE(response.request()->GetAddressResults());
6977 EXPECT_FALSE(response.request()->GetTextResults());
6978 EXPECT_FALSE(response.request()->GetHostnameResults());
6979}
6980
Eric Orth960e7062019-03-08 18:43:546981TEST_F(HostResolverManagerDnsTest, PtrQuery_Timeout) {
Eric Orthe9db8d232019-01-14 21:24:456982 // Setup fallback to confirm it is not used for non-address results.
6983 set_allow_fallback_to_proctask(true);
6984 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
6985 proc_->SignalMultiple(1u);
6986
6987 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136988 rules.emplace_back("host", dns_protocol::kTypePTR, false /* secure */,
6989 MockDnsClientRule::Result(MockDnsClientRule::TIMEOUT),
6990 false /* delay */);
Eric Orthe9db8d232019-01-14 21:24:456991
6992 CreateResolver();
6993 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6994
6995 HostResolver::ResolveHostParameters parameters;
6996 parameters.dns_query_type = DnsQueryType::PTR;
6997
Eric Orth117e1992019-04-17 00:24:156998 ResolveHostResponseHelper response(resolver_->CreateRequest(
6999 HostPortPair("host", 108), NetLogWithSource(), parameters,
7000 request_context_.get(), host_cache_.get()));
Eric Orthe9db8d232019-01-14 21:24:457001 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_TIMED_OUT));
7002 EXPECT_FALSE(response.request()->GetAddressResults());
7003 EXPECT_FALSE(response.request()->GetTextResults());
7004 EXPECT_FALSE(response.request()->GetHostnameResults());
7005}
7006
Eric Orth960e7062019-03-08 18:43:547007TEST_F(HostResolverManagerDnsTest, PtrQuery_Empty) {
Eric Orthe9db8d232019-01-14 21:24:457008 // Setup fallback to confirm it is not used for non-address results.
7009 set_allow_fallback_to_proctask(true);
7010 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
7011 proc_->SignalMultiple(1u);
7012
7013 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137014 rules.emplace_back("host", dns_protocol::kTypePTR, false /* secure */,
7015 MockDnsClientRule::Result(MockDnsClientRule::EMPTY),
7016 false /* delay */);
Eric Orthe9db8d232019-01-14 21:24:457017
7018 CreateResolver();
7019 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7020
7021 HostResolver::ResolveHostParameters parameters;
7022 parameters.dns_query_type = DnsQueryType::PTR;
7023
Eric Orth117e1992019-04-17 00:24:157024 ResolveHostResponseHelper response(resolver_->CreateRequest(
7025 HostPortPair("host", 108), NetLogWithSource(), parameters,
7026 request_context_.get(), host_cache_.get()));
Eric Orthe9db8d232019-01-14 21:24:457027 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
7028 EXPECT_FALSE(response.request()->GetAddressResults());
7029 EXPECT_FALSE(response.request()->GetTextResults());
7030 EXPECT_FALSE(response.request()->GetHostnameResults());
7031}
7032
Eric Orth960e7062019-03-08 18:43:547033TEST_F(HostResolverManagerDnsTest, PtrQuery_Malformed) {
Eric Orthe9db8d232019-01-14 21:24:457034 // Setup fallback to confirm it is not used for non-address results.
7035 set_allow_fallback_to_proctask(true);
7036 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
7037 proc_->SignalMultiple(1u);
7038
7039 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137040 rules.emplace_back("host", dns_protocol::kTypePTR, false /* secure */,
Eric Orthe9db8d232019-01-14 21:24:457041 MockDnsClientRule::Result(MockDnsClientRule::MALFORMED),
7042 false /* delay */);
7043
7044 CreateResolver();
7045 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7046
7047 HostResolver::ResolveHostParameters parameters;
7048 parameters.dns_query_type = DnsQueryType::PTR;
7049
Eric Orth117e1992019-04-17 00:24:157050 ResolveHostResponseHelper response(resolver_->CreateRequest(
7051 HostPortPair("host", 108), NetLogWithSource(), parameters,
7052 request_context_.get(), host_cache_.get()));
Eric Orthe9db8d232019-01-14 21:24:457053 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE));
7054 EXPECT_FALSE(response.request()->GetAddressResults());
7055 EXPECT_FALSE(response.request()->GetTextResults());
7056 EXPECT_FALSE(response.request()->GetHostnameResults());
7057}
7058
Eric Orth960e7062019-03-08 18:43:547059TEST_F(HostResolverManagerDnsTest, PtrQuery_MismatchedName) {
Eric Orthe9db8d232019-01-14 21:24:457060 std::vector<std::string> ptr_records = {{"foo.com"}};
7061 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137062 rules.emplace_back("host", dns_protocol::kTypePTR, false /* secure */,
Eric Orthe9db8d232019-01-14 21:24:457063 MockDnsClientRule::Result(BuildTestDnsPointerResponse(
7064 "host", std::move(ptr_records), "not.host")),
7065 false /* delay */);
7066
7067 CreateResolver();
7068 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7069
7070 HostResolver::ResolveHostParameters parameters;
7071 parameters.dns_query_type = DnsQueryType::PTR;
7072
Eric Orth117e1992019-04-17 00:24:157073 ResolveHostResponseHelper response(resolver_->CreateRequest(
7074 HostPortPair("host", 108), NetLogWithSource(), parameters,
7075 request_context_.get(), host_cache_.get()));
Eric Orthe9db8d232019-01-14 21:24:457076 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE));
7077 EXPECT_FALSE(response.request()->GetAddressResults());
7078 EXPECT_FALSE(response.request()->GetTextResults());
7079 EXPECT_FALSE(response.request()->GetHostnameResults());
7080}
7081
Eric Orth960e7062019-03-08 18:43:547082TEST_F(HostResolverManagerDnsTest, PtrQuery_WrongType) {
Eric Orthe9db8d232019-01-14 21:24:457083 // Respond to a TXT query with an A response.
7084 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137085 rules.emplace_back("host", dns_protocol::kTypePTR, false /* secure */,
Eric Orthe9db8d232019-01-14 21:24:457086 MockDnsClientRule::Result(
7087 BuildTestDnsResponse("host", IPAddress(1, 2, 3, 4))),
7088 false /* delay */);
7089
7090 CreateResolver();
7091 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7092
7093 HostResolver::ResolveHostParameters parameters;
7094 parameters.dns_query_type = DnsQueryType::PTR;
7095
7096 // Responses for the wrong type should be ignored.
Eric Orth117e1992019-04-17 00:24:157097 ResolveHostResponseHelper response(resolver_->CreateRequest(
7098 HostPortPair("ok", 108), NetLogWithSource(), parameters,
7099 request_context_.get(), host_cache_.get()));
Eric Orthe9db8d232019-01-14 21:24:457100 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
7101 EXPECT_FALSE(response.request()->GetAddressResults());
7102 EXPECT_FALSE(response.request()->GetTextResults());
7103 EXPECT_FALSE(response.request()->GetHostnameResults());
7104}
7105
Eric Ortha625b042019-01-16 01:14:457106// Same as PtrQuery except we specify DNS HostResolverSource instead of relying
7107// on automatic determination. Expect same results since DNS should be what we
7108// automatically determine, but some slightly different logic paths are
7109// involved.
Eric Orth960e7062019-03-08 18:43:547110TEST_F(HostResolverManagerDnsTest, PtrDnsQuery) {
Eric Orthe9db8d232019-01-14 21:24:457111 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137112 rules.emplace_back("host", dns_protocol::kTypePTR, false /* secure */,
Eric Orthe9db8d232019-01-14 21:24:457113 MockDnsClientRule::Result(BuildTestDnsPointerResponse(
7114 "host", {"foo.com", "bar.com"})),
7115 false /* delay */);
7116
7117 CreateResolver();
7118 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7119
7120 HostResolver::ResolveHostParameters parameters;
7121 parameters.source = HostResolverSource::DNS;
7122 parameters.dns_query_type = DnsQueryType::PTR;
7123
Eric Orth117e1992019-04-17 00:24:157124 ResolveHostResponseHelper response(resolver_->CreateRequest(
7125 HostPortPair("host", 108), NetLogWithSource(), parameters,
7126 request_context_.get(), host_cache_.get()));
Eric Orthe9db8d232019-01-14 21:24:457127 EXPECT_THAT(response.result_error(), IsOk());
7128 EXPECT_FALSE(response.request()->GetAddressResults());
7129 EXPECT_FALSE(response.request()->GetTextResults());
7130
7131 // Order between separate records is undefined.
7132 EXPECT_THAT(response.request()->GetHostnameResults(),
7133 testing::Optional(testing::UnorderedElementsAre(
7134 HostPortPair("foo.com", 108), HostPortPair("bar.com", 108))));
7135}
7136
Eric Orth960e7062019-03-08 18:43:547137TEST_F(HostResolverManagerDnsTest, SrvQuery) {
Eric Ortha625b042019-01-16 01:14:457138 const TestServiceRecord kRecord1 = {2, 3, 1223, "foo.com"};
7139 const TestServiceRecord kRecord2 = {5, 10, 80, "bar.com"};
7140 const TestServiceRecord kRecord3 = {5, 1, 5, "google.com"};
7141 const TestServiceRecord kRecord4 = {2, 100, 12345, "chromium.org"};
7142 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137143 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
dalykc0ab0722019-03-14 17:00:587144 MockDnsClientRule::Result(BuildTestDnsServiceResponse(
Eric Ortha625b042019-01-16 01:14:457145 "host", {kRecord1, kRecord2, kRecord3, kRecord4})),
7146 false /* delay */);
7147
7148 CreateResolver();
7149 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7150
7151 HostResolver::ResolveHostParameters parameters;
7152 parameters.dns_query_type = DnsQueryType::SRV;
7153
Eric Orth117e1992019-04-17 00:24:157154 ResolveHostResponseHelper response(resolver_->CreateRequest(
7155 HostPortPair("host", 108), NetLogWithSource(), parameters,
7156 request_context_.get(), host_cache_.get()));
Eric Ortha625b042019-01-16 01:14:457157 EXPECT_THAT(response.result_error(), IsOk());
7158 EXPECT_FALSE(response.request()->GetAddressResults());
7159 EXPECT_FALSE(response.request()->GetTextResults());
7160
7161 // Expect ordered by priority, and random within a priority.
7162 base::Optional<std::vector<HostPortPair>> results =
7163 response.request()->GetHostnameResults();
7164 ASSERT_THAT(
7165 results,
7166 testing::Optional(testing::UnorderedElementsAre(
7167 HostPortPair("foo.com", 1223), HostPortPair("bar.com", 80),
7168 HostPortPair("google.com", 5), HostPortPair("chromium.org", 12345))));
7169 auto priority2 = std::vector<HostPortPair>(results.value().begin(),
7170 results.value().begin() + 2);
7171 EXPECT_THAT(priority2, testing::UnorderedElementsAre(
7172 HostPortPair("foo.com", 1223),
7173 HostPortPair("chromium.org", 12345)));
7174 auto priority5 = std::vector<HostPortPair>(results.value().begin() + 2,
7175 results.value().end());
7176 EXPECT_THAT(priority5,
7177 testing::UnorderedElementsAre(HostPortPair("bar.com", 80),
7178 HostPortPair("google.com", 5)));
7179}
7180
7181// 0-weight services are allowed. Ensure that we can handle such records,
7182// especially the case where all entries have weight 0.
Eric Orth960e7062019-03-08 18:43:547183TEST_F(HostResolverManagerDnsTest, SrvQuery_ZeroWeight) {
Eric Ortha625b042019-01-16 01:14:457184 const TestServiceRecord kRecord1 = {5, 0, 80, "bar.com"};
7185 const TestServiceRecord kRecord2 = {5, 0, 5, "google.com"};
7186 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137187 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
dalykc0ab0722019-03-14 17:00:587188 MockDnsClientRule::Result(BuildTestDnsServiceResponse(
7189 "host", {kRecord1, kRecord2})),
Eric Ortha625b042019-01-16 01:14:457190 false /* delay */);
7191
7192 CreateResolver();
7193 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7194
7195 HostResolver::ResolveHostParameters parameters;
7196 parameters.dns_query_type = DnsQueryType::SRV;
7197
Eric Orth117e1992019-04-17 00:24:157198 ResolveHostResponseHelper response(resolver_->CreateRequest(
7199 HostPortPair("host", 108), NetLogWithSource(), parameters,
7200 request_context_.get(), host_cache_.get()));
Eric Ortha625b042019-01-16 01:14:457201 EXPECT_THAT(response.result_error(), IsOk());
7202 EXPECT_FALSE(response.request()->GetAddressResults());
7203 EXPECT_FALSE(response.request()->GetTextResults());
7204
7205 // Expect ordered by priority, and random within a priority.
7206 EXPECT_THAT(response.request()->GetHostnameResults(),
7207 testing::Optional(testing::UnorderedElementsAre(
7208 HostPortPair("bar.com", 80), HostPortPair("google.com", 5))));
7209}
7210
Eric Orth960e7062019-03-08 18:43:547211TEST_F(HostResolverManagerDnsTest, SrvQuery_NonexistentDomain) {
Eric Ortha625b042019-01-16 01:14:457212 // Setup fallback to confirm it is not used for non-address results.
7213 set_allow_fallback_to_proctask(true);
7214 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
7215 proc_->SignalMultiple(1u);
7216
7217 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137218 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
Eric Ortha625b042019-01-16 01:14:457219 MockDnsClientRule::Result(MockDnsClientRule::NODOMAIN),
7220 false /* delay */);
7221
7222 CreateResolver();
7223 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7224
7225 HostResolver::ResolveHostParameters parameters;
7226 parameters.dns_query_type = DnsQueryType::SRV;
7227
Eric Orth117e1992019-04-17 00:24:157228 ResolveHostResponseHelper response(resolver_->CreateRequest(
7229 HostPortPair("host", 108), NetLogWithSource(), parameters,
7230 request_context_.get(), host_cache_.get()));
Eric Ortha625b042019-01-16 01:14:457231 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
7232 EXPECT_FALSE(response.request()->GetAddressResults());
7233 EXPECT_FALSE(response.request()->GetTextResults());
7234 EXPECT_FALSE(response.request()->GetHostnameResults());
7235}
7236
Eric Orth960e7062019-03-08 18:43:547237TEST_F(HostResolverManagerDnsTest, SrvQuery_Failure) {
Eric Ortha625b042019-01-16 01:14:457238 // Setup fallback to confirm it is not used for non-address results.
7239 set_allow_fallback_to_proctask(true);
7240 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
7241 proc_->SignalMultiple(1u);
7242
7243 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137244 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
7245 MockDnsClientRule::Result(MockDnsClientRule::FAIL),
7246 false /* delay */);
Eric Ortha625b042019-01-16 01:14:457247
7248 CreateResolver();
7249 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7250
7251 HostResolver::ResolveHostParameters parameters;
7252 parameters.dns_query_type = DnsQueryType::SRV;
7253
Eric Orth117e1992019-04-17 00:24:157254 ResolveHostResponseHelper response(resolver_->CreateRequest(
7255 HostPortPair("host", 108), NetLogWithSource(), parameters,
7256 request_context_.get(), host_cache_.get()));
Eric Ortha625b042019-01-16 01:14:457257 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
7258 EXPECT_FALSE(response.request()->GetAddressResults());
7259 EXPECT_FALSE(response.request()->GetTextResults());
7260 EXPECT_FALSE(response.request()->GetHostnameResults());
7261}
7262
Eric Orth960e7062019-03-08 18:43:547263TEST_F(HostResolverManagerDnsTest, SrvQuery_Timeout) {
Eric Ortha625b042019-01-16 01:14:457264 // Setup fallback to confirm it is not used for non-address results.
7265 set_allow_fallback_to_proctask(true);
7266 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
7267 proc_->SignalMultiple(1u);
7268
7269 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137270 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
7271 MockDnsClientRule::Result(MockDnsClientRule::TIMEOUT),
7272 false /* delay */);
Eric Ortha625b042019-01-16 01:14:457273
7274 CreateResolver();
7275 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7276
7277 HostResolver::ResolveHostParameters parameters;
7278 parameters.dns_query_type = DnsQueryType::SRV;
7279
Eric Orth117e1992019-04-17 00:24:157280 ResolveHostResponseHelper response(resolver_->CreateRequest(
7281 HostPortPair("host", 108), NetLogWithSource(), parameters,
7282 request_context_.get(), host_cache_.get()));
Eric Ortha625b042019-01-16 01:14:457283 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_TIMED_OUT));
7284 EXPECT_FALSE(response.request()->GetAddressResults());
7285 EXPECT_FALSE(response.request()->GetTextResults());
7286 EXPECT_FALSE(response.request()->GetHostnameResults());
7287}
7288
Eric Orth960e7062019-03-08 18:43:547289TEST_F(HostResolverManagerDnsTest, SrvQuery_Empty) {
Eric Ortha625b042019-01-16 01:14:457290 // Setup fallback to confirm it is not used for non-address results.
7291 set_allow_fallback_to_proctask(true);
7292 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
7293 proc_->SignalMultiple(1u);
7294
7295 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137296 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
7297 MockDnsClientRule::Result(MockDnsClientRule::EMPTY),
7298 false /* delay */);
Eric Ortha625b042019-01-16 01:14:457299
7300 CreateResolver();
7301 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7302
7303 HostResolver::ResolveHostParameters parameters;
7304 parameters.dns_query_type = DnsQueryType::SRV;
7305
Eric Orth117e1992019-04-17 00:24:157306 ResolveHostResponseHelper response(resolver_->CreateRequest(
7307 HostPortPair("host", 108), NetLogWithSource(), parameters,
7308 request_context_.get(), host_cache_.get()));
Eric Ortha625b042019-01-16 01:14:457309 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
7310 EXPECT_FALSE(response.request()->GetAddressResults());
7311 EXPECT_FALSE(response.request()->GetTextResults());
7312 EXPECT_FALSE(response.request()->GetHostnameResults());
7313}
7314
Eric Orth960e7062019-03-08 18:43:547315TEST_F(HostResolverManagerDnsTest, SrvQuery_Malformed) {
Eric Ortha625b042019-01-16 01:14:457316 // Setup fallback to confirm it is not used for non-address results.
7317 set_allow_fallback_to_proctask(true);
7318 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
7319 proc_->SignalMultiple(1u);
7320
7321 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137322 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
Eric Ortha625b042019-01-16 01:14:457323 MockDnsClientRule::Result(MockDnsClientRule::MALFORMED),
7324 false /* delay */);
7325
7326 CreateResolver();
7327 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7328
7329 HostResolver::ResolveHostParameters parameters;
7330 parameters.dns_query_type = DnsQueryType::SRV;
7331
Eric Orth117e1992019-04-17 00:24:157332 ResolveHostResponseHelper response(resolver_->CreateRequest(
7333 HostPortPair("host", 108), NetLogWithSource(), parameters,
7334 request_context_.get(), host_cache_.get()));
Eric Ortha625b042019-01-16 01:14:457335 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE));
7336 EXPECT_FALSE(response.request()->GetAddressResults());
7337 EXPECT_FALSE(response.request()->GetTextResults());
7338 EXPECT_FALSE(response.request()->GetHostnameResults());
7339}
7340
Eric Orth960e7062019-03-08 18:43:547341TEST_F(HostResolverManagerDnsTest, SrvQuery_MismatchedName) {
Eric Ortha625b042019-01-16 01:14:457342 std::vector<TestServiceRecord> srv_records = {{1, 2, 3, "foo.com"}};
7343 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137344 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
dalykc0ab0722019-03-14 17:00:587345 MockDnsClientRule::Result(BuildTestDnsServiceResponse(
Eric Ortha625b042019-01-16 01:14:457346 "host", std::move(srv_records), "not.host")),
7347 false /* delay */);
7348
7349 CreateResolver();
7350 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7351
7352 HostResolver::ResolveHostParameters parameters;
7353 parameters.dns_query_type = DnsQueryType::SRV;
7354
Eric Orth117e1992019-04-17 00:24:157355 ResolveHostResponseHelper response(resolver_->CreateRequest(
7356 HostPortPair("host", 108), NetLogWithSource(), parameters,
7357 request_context_.get(), host_cache_.get()));
Eric Ortha625b042019-01-16 01:14:457358 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE));
7359 EXPECT_FALSE(response.request()->GetAddressResults());
7360 EXPECT_FALSE(response.request()->GetTextResults());
7361 EXPECT_FALSE(response.request()->GetHostnameResults());
7362}
7363
Eric Orth960e7062019-03-08 18:43:547364TEST_F(HostResolverManagerDnsTest, SrvQuery_WrongType) {
Eric Ortha625b042019-01-16 01:14:457365 // Respond to a SRV query with an A response.
7366 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137367 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
Eric Ortha625b042019-01-16 01:14:457368 MockDnsClientRule::Result(
7369 BuildTestDnsResponse("host", IPAddress(1, 2, 3, 4))),
7370 false /* delay */);
7371
7372 CreateResolver();
7373 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7374
7375 HostResolver::ResolveHostParameters parameters;
7376 parameters.dns_query_type = DnsQueryType::SRV;
7377
7378 // Responses for the wrong type should be ignored.
Eric Orth117e1992019-04-17 00:24:157379 ResolveHostResponseHelper response(resolver_->CreateRequest(
7380 HostPortPair("ok", 108), NetLogWithSource(), parameters,
7381 request_context_.get(), host_cache_.get()));
Eric Ortha625b042019-01-16 01:14:457382 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
7383 EXPECT_FALSE(response.request()->GetAddressResults());
7384 EXPECT_FALSE(response.request()->GetTextResults());
7385 EXPECT_FALSE(response.request()->GetHostnameResults());
7386}
7387
7388// Same as SrvQuery except we specify DNS HostResolverSource instead of relying
7389// on automatic determination. Expect same results since DNS should be what we
7390// automatically determine, but some slightly different logic paths are
7391// involved.
Eric Orth960e7062019-03-08 18:43:547392TEST_F(HostResolverManagerDnsTest, SrvDnsQuery) {
Eric Ortha625b042019-01-16 01:14:457393 const TestServiceRecord kRecord1 = {2, 3, 1223, "foo.com"};
7394 const TestServiceRecord kRecord2 = {5, 10, 80, "bar.com"};
7395 const TestServiceRecord kRecord3 = {5, 1, 5, "google.com"};
7396 const TestServiceRecord kRecord4 = {2, 100, 12345, "chromium.org"};
7397 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137398 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
dalykc0ab0722019-03-14 17:00:587399 MockDnsClientRule::Result(BuildTestDnsServiceResponse(
Eric Ortha625b042019-01-16 01:14:457400 "host", {kRecord1, kRecord2, kRecord3, kRecord4})),
7401 false /* delay */);
7402
7403 CreateResolver();
7404 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7405
7406 HostResolver::ResolveHostParameters parameters;
7407 parameters.source = HostResolverSource::DNS;
7408 parameters.dns_query_type = DnsQueryType::SRV;
7409
Eric Orth117e1992019-04-17 00:24:157410 ResolveHostResponseHelper response(resolver_->CreateRequest(
7411 HostPortPair("host", 108), NetLogWithSource(), parameters,
7412 request_context_.get(), host_cache_.get()));
Eric Ortha625b042019-01-16 01:14:457413 EXPECT_THAT(response.result_error(), IsOk());
7414 EXPECT_FALSE(response.request()->GetAddressResults());
7415 EXPECT_FALSE(response.request()->GetTextResults());
7416
7417 // Expect ordered by priority, and random within a priority.
7418 base::Optional<std::vector<HostPortPair>> results =
7419 response.request()->GetHostnameResults();
7420 ASSERT_THAT(
7421 results,
7422 testing::Optional(testing::UnorderedElementsAre(
7423 HostPortPair("foo.com", 1223), HostPortPair("bar.com", 80),
7424 HostPortPair("google.com", 5), HostPortPair("chromium.org", 12345))));
7425 auto priority2 = std::vector<HostPortPair>(results.value().begin(),
7426 results.value().begin() + 2);
7427 EXPECT_THAT(priority2, testing::UnorderedElementsAre(
7428 HostPortPair("foo.com", 1223),
7429 HostPortPair("chromium.org", 12345)));
7430 auto priority5 = std::vector<HostPortPair>(results.value().begin() + 2,
7431 results.value().end());
7432 EXPECT_THAT(priority5,
7433 testing::UnorderedElementsAre(HostPortPair("bar.com", 80),
7434 HostPortPair("google.com", 5)));
7435}
7436
[email protected]259aefa2009-08-20 22:45:007437} // namespace net