blob: 7756612cd02820e4209b4f463659253cd62aac39 [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
Eric Orth960e7062019-03-08 18:43:54471class HostResolverManagerTest : public TestWithScopedTaskEnvironment {
[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
jdoerriedfede5ad2019-02-11 13:06:571108// Flaky on Fuchsia and Linux ASAN. crbug.com/930483
1109#if defined(OS_FUCHSIA) || defined(OS_LINUX)
Eric Orth26fa08e2019-02-22 01:28:371110#define MAYBE_DeleteWithinAbortedCallback DISABLED_DeleteWithinAbortedCallback
jdoerriedfede5ad2019-02-11 13:06:571111#else
Eric Orth26fa08e2019-02-22 01:28:371112#define MAYBE_DeleteWithinAbortedCallback DeleteWithinAbortedCallback
jdoerriedfede5ad2019-02-11 13:06:571113#endif
Eric Orth960e7062019-03-08 18:43:541114TEST_F(HostResolverManagerTest, MAYBE_DeleteWithinAbortedCallback) {
Eric Orth70992982018-07-24 00:25:001115 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
1116 ResolveHostResponseHelper::Callback custom_callback =
1117 base::BindLambdaForTesting(
1118 [&](CompletionOnceCallback completion_callback, int error) {
1119 for (auto& response : responses) {
1120 // Deleting request is required to be first, so the other requests
1121 // will still be running to be deleted. This test assumes that the
1122 // Jobs will be Aborted in order and the requests in order within
1123 // the jobs.
1124 DCHECK(!response->complete());
1125 }
Eric Orth37b18192019-04-22 19:09:281126 DestroyResolver();
Eric Orth70992982018-07-24 00:25:001127 std::move(completion_callback).Run(error);
1128 });
1129
1130 ResolveHostResponseHelper deleting_response(
Eric Orth00fe5a62018-08-15 22:20:001131 resolver_->CreateRequest(HostPortPair("a", 80), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:151132 base::nullopt, request_context_.get(),
1133 host_cache_.get()),
Eric Orth70992982018-07-24 00:25:001134 std::move(custom_callback));
1135
Eric Orth117e1992019-04-17 00:24:151136 responses.emplace_back(
1137 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1138 HostPortPair("a", 81), NetLogWithSource(), base::nullopt,
1139 request_context_.get(), host_cache_.get())));
1140 responses.emplace_back(
1141 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1142 HostPortPair("b", 82), NetLogWithSource(), base::nullopt,
1143 request_context_.get(), host_cache_.get())));
1144 responses.emplace_back(
1145 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1146 HostPortPair("b", 83), NetLogWithSource(), base::nullopt,
1147 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:001148
1149 // Wait for all calls to queue up, trigger abort via IP address change, then
1150 // signal all the queued requests to let them all try to finish.
1151 EXPECT_TRUE(proc_->WaitFor(2u));
Paul Jensenf47bbab2018-09-14 16:34:041152 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
Eric Orth70992982018-07-24 00:25:001153 proc_->SignalAll();
1154
1155 EXPECT_THAT(deleting_response.result_error(), IsError(ERR_NETWORK_CHANGED));
1156 base::RunLoop().RunUntilIdle();
1157 for (auto& response : responses) {
1158 EXPECT_FALSE(response->complete());
1159 }
1160}
1161
Eric Orth960e7062019-03-08 18:43:541162TEST_F(HostResolverManagerTest, StartWithinCallback) {
Eric Orth70992982018-07-24 00:25:001163 std::unique_ptr<ResolveHostResponseHelper> new_response;
1164 auto custom_callback = base::BindLambdaForTesting(
1165 [&](CompletionOnceCallback completion_callback, int error) {
1166 new_response = std::make_unique<ResolveHostResponseHelper>(
Eric Orth117e1992019-04-17 00:24:151167 resolver_->CreateRequest(
1168 HostPortPair("new", 70), NetLogWithSource(), base::nullopt,
1169 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:001170 std::move(completion_callback).Run(error);
1171 });
1172
1173 ResolveHostResponseHelper starting_response(
Eric Orth00fe5a62018-08-15 22:20:001174 resolver_->CreateRequest(HostPortPair("a", 80), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:151175 base::nullopt, request_context_.get(),
1176 host_cache_.get()),
Eric Orth70992982018-07-24 00:25:001177 std::move(custom_callback));
1178
1179 proc_->SignalMultiple(2u); // One for "a". One for "new".
1180
1181 EXPECT_THAT(starting_response.result_error(), IsOk());
1182 EXPECT_THAT(new_response->result_error(), IsOk());
1183}
1184
Eric Orth3bd9e512019-03-29 15:33:351185TEST_F(HostResolverManagerTest, StartWithinEvictionCallback) {
1186 CreateSerialResolver();
1187 resolver_->SetMaxQueuedJobsForTesting(2);
1188
1189 std::unique_ptr<ResolveHostResponseHelper> new_response;
1190 auto custom_callback = base::BindLambdaForTesting(
1191 [&](CompletionOnceCallback completion_callback, int error) {
1192 new_response = std::make_unique<ResolveHostResponseHelper>(
Eric Orth117e1992019-04-17 00:24:151193 resolver_->CreateRequest(
1194 HostPortPair("new", 70), NetLogWithSource(), base::nullopt,
1195 request_context_.get(), host_cache_.get()));
Eric Orth3bd9e512019-03-29 15:33:351196 std::move(completion_callback).Run(error);
1197 });
1198
Eric Orth117e1992019-04-17 00:24:151199 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
1200 HostPortPair("initial", 80), NetLogWithSource(), base::nullopt,
1201 request_context_.get(), host_cache_.get()));
Eric Orth3bd9e512019-03-29 15:33:351202 ResolveHostResponseHelper evictee1_response(
1203 resolver_->CreateRequest(HostPortPair("evictee1", 80), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:151204 base::nullopt, request_context_.get(),
1205 host_cache_.get()),
Eric Orth3bd9e512019-03-29 15:33:351206 std::move(custom_callback));
Eric Orth117e1992019-04-17 00:24:151207 ResolveHostResponseHelper evictee2_response(resolver_->CreateRequest(
1208 HostPortPair("evictee2", 80), NetLogWithSource(), base::nullopt,
1209 request_context_.get(), host_cache_.get()));
Eric Orth3bd9e512019-03-29 15:33:351210
1211 // Now one running request ("initial") and two queued requests ("evictee1" and
1212 // "evictee2"). Any further requests will cause evictions.
Eric Orth117e1992019-04-17 00:24:151213 ResolveHostResponseHelper evictor_response(resolver_->CreateRequest(
1214 HostPortPair("evictor", 80), NetLogWithSource(), base::nullopt,
1215 request_context_.get(), host_cache_.get()));
Eric Orth3bd9e512019-03-29 15:33:351216 EXPECT_THAT(evictee1_response.result_error(),
1217 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
1218
1219 // "new" should evict "evictee2"
1220 EXPECT_THAT(evictee2_response.result_error(),
1221 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
1222
1223 proc_->SignalMultiple(3u);
1224
1225 EXPECT_THAT(initial_response.result_error(), IsOk());
1226 EXPECT_THAT(evictor_response.result_error(), IsOk());
1227 EXPECT_THAT(new_response->result_error(), IsOk());
1228}
1229
1230// Test where we start a new request within an eviction callback that itself
1231// evicts the first evictor.
1232TEST_F(HostResolverManagerTest, StartWithinEvictionCallback_DoubleEviction) {
1233 CreateSerialResolver();
1234 resolver_->SetMaxQueuedJobsForTesting(1);
1235
1236 std::unique_ptr<ResolveHostResponseHelper> new_response;
1237 auto custom_callback = base::BindLambdaForTesting(
1238 [&](CompletionOnceCallback completion_callback, int error) {
1239 new_response = std::make_unique<ResolveHostResponseHelper>(
Eric Orth117e1992019-04-17 00:24:151240 resolver_->CreateRequest(
1241 HostPortPair("new", 70), NetLogWithSource(), base::nullopt,
1242 request_context_.get(), host_cache_.get()));
Eric Orth3bd9e512019-03-29 15:33:351243 std::move(completion_callback).Run(error);
1244 });
1245
Eric Orth117e1992019-04-17 00:24:151246 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
1247 HostPortPair("initial", 80), NetLogWithSource(), base::nullopt,
1248 request_context_.get(), host_cache_.get()));
Eric Orth3bd9e512019-03-29 15:33:351249 ResolveHostResponseHelper evictee_response(
1250 resolver_->CreateRequest(HostPortPair("evictee", 80), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:151251 base::nullopt, request_context_.get(),
1252 host_cache_.get()),
Eric Orth3bd9e512019-03-29 15:33:351253 std::move(custom_callback));
1254
1255 // Now one running request ("initial") and one queued requests ("evictee").
1256 // Any further requests will cause evictions.
Eric Orth117e1992019-04-17 00:24:151257 ResolveHostResponseHelper evictor_response(resolver_->CreateRequest(
1258 HostPortPair("evictor", 80), NetLogWithSource(), base::nullopt,
1259 request_context_.get(), host_cache_.get()));
Eric Orth3bd9e512019-03-29 15:33:351260 EXPECT_THAT(evictee_response.result_error(),
1261 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
1262
1263 // "new" should evict "evictor"
1264 EXPECT_THAT(evictor_response.result_error(),
1265 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
1266
1267 proc_->SignalMultiple(2u);
1268
1269 EXPECT_THAT(initial_response.result_error(), IsOk());
1270 EXPECT_THAT(new_response->result_error(), IsOk());
1271}
1272
1273TEST_F(HostResolverManagerTest, StartWithinEvictionCallback_SameRequest) {
1274 CreateSerialResolver();
1275 resolver_->SetMaxQueuedJobsForTesting(2);
1276
1277 std::unique_ptr<ResolveHostResponseHelper> new_response;
1278 auto custom_callback = base::BindLambdaForTesting(
1279 [&](CompletionOnceCallback completion_callback, int error) {
1280 new_response = std::make_unique<ResolveHostResponseHelper>(
Eric Orth117e1992019-04-17 00:24:151281 resolver_->CreateRequest(
1282 HostPortPair("evictor", 70), NetLogWithSource(), base::nullopt,
1283 request_context_.get(), host_cache_.get()));
Eric Orth3bd9e512019-03-29 15:33:351284 std::move(completion_callback).Run(error);
1285 });
1286
Eric Orth117e1992019-04-17 00:24:151287 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
1288 HostPortPair("initial", 80), NetLogWithSource(), base::nullopt,
1289 request_context_.get(), host_cache_.get()));
Eric Orth3bd9e512019-03-29 15:33:351290 ResolveHostResponseHelper evictee_response(
1291 resolver_->CreateRequest(HostPortPair("evictee", 80), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:151292 base::nullopt, request_context_.get(),
1293 host_cache_.get()),
Eric Orth3bd9e512019-03-29 15:33:351294 std::move(custom_callback));
1295 ResolveHostResponseHelper additional_response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:271296 HostPortPair("additional", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:151297 request_context_.get(), host_cache_.get()));
Eric Orth3bd9e512019-03-29 15:33:351298
1299 // Now one running request ("initial") and two queued requests ("evictee" and
1300 // "additional"). Any further requests will cause evictions.
Eric Orth117e1992019-04-17 00:24:151301 ResolveHostResponseHelper evictor_response(resolver_->CreateRequest(
1302 HostPortPair("evictor", 80), NetLogWithSource(), base::nullopt,
1303 request_context_.get(), host_cache_.get()));
Eric Orth3bd9e512019-03-29 15:33:351304 EXPECT_THAT(evictee_response.result_error(),
1305 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
1306
1307 // Second "evictor" should be joined with the first and not evict "additional"
1308
1309 // Only 3 proc requests because both "evictor" requests are combined.
1310 proc_->SignalMultiple(3u);
1311
1312 EXPECT_THAT(initial_response.result_error(), IsOk());
1313 EXPECT_THAT(additional_response.result_error(), IsOk());
1314 EXPECT_THAT(evictor_response.result_error(), IsOk());
1315 EXPECT_THAT(new_response->result_error(), IsOk());
1316}
1317
Eric Orth960e7062019-03-08 18:43:541318TEST_F(HostResolverManagerTest, BypassCache) {
Eric Orthdc35748e2018-08-23 22:41:481319 proc_->SignalMultiple(2u);
1320
Eric Orth117e1992019-04-17 00:24:151321 ResolveHostResponseHelper initial_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(initial_response.result_error(), IsOk());
1325 EXPECT_EQ(1u, proc_->GetCaptureList().size());
1326
Eric Orth117e1992019-04-17 00:24:151327 ResolveHostResponseHelper cached_response(resolver_->CreateRequest(
1328 HostPortPair("a", 80), NetLogWithSource(), base::nullopt,
1329 request_context_.get(), host_cache_.get()));
Eric Orthdc35748e2018-08-23 22:41:481330 EXPECT_THAT(cached_response.result_error(), IsOk());
1331 // Expect no increase to calls to |proc_| because result was cached.
1332 EXPECT_EQ(1u, proc_->GetCaptureList().size());
1333
1334 HostResolver::ResolveHostParameters parameters;
Eric Ortheb332862019-01-26 00:52:381335 parameters.cache_usage =
1336 HostResolver::ResolveHostParameters::CacheUsage::DISALLOWED;
Eric Orth117e1992019-04-17 00:24:151337 ResolveHostResponseHelper cache_bypassed_response(resolver_->CreateRequest(
1338 HostPortPair("a", 80), NetLogWithSource(), parameters,
1339 request_context_.get(), host_cache_.get()));
Eric Orthdc35748e2018-08-23 22:41:481340 EXPECT_THAT(cache_bypassed_response.result_error(), IsOk());
1341 // Expect call to |proc_| because cache was bypassed.
1342 EXPECT_EQ(2u, proc_->GetCaptureList().size());
1343}
1344
Paul Jensenf47bbab2018-09-14 16:34:041345// Test that IP address changes flush the cache but initial DNS config reads
Eric Orth70992982018-07-24 00:25:001346// do not.
Eric Orth960e7062019-03-08 18:43:541347TEST_F(HostResolverManagerTest, FlushCacheOnIPAddressChange) {
Eric Orth70992982018-07-24 00:25:001348 proc_->SignalMultiple(2u); // One before the flush, one after.
1349
Eric Orth117e1992019-04-17 00:24:151350 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
1351 HostPortPair("host1", 70), NetLogWithSource(), base::nullopt,
1352 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:001353 EXPECT_THAT(initial_response.result_error(), IsOk());
1354 EXPECT_EQ(1u, proc_->GetCaptureList().size());
1355
Eric Orth117e1992019-04-17 00:24:151356 ResolveHostResponseHelper cached_response(resolver_->CreateRequest(
1357 HostPortPair("host1", 75), NetLogWithSource(), base::nullopt,
1358 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:001359 EXPECT_THAT(cached_response.result_error(), IsOk());
1360 EXPECT_EQ(1u, proc_->GetCaptureList().size()); // No expected increase.
1361
1362 // Verify initial DNS config read does not flush cache.
1363 NetworkChangeNotifier::NotifyObserversOfInitialDNSConfigReadForTests();
Eric Orth117e1992019-04-17 00:24:151364 ResolveHostResponseHelper unflushed_response(resolver_->CreateRequest(
1365 HostPortPair("host1", 75), NetLogWithSource(), base::nullopt,
1366 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:001367 EXPECT_THAT(unflushed_response.result_error(), IsOk());
1368 EXPECT_EQ(1u, proc_->GetCaptureList().size()); // No expected increase.
1369
Paul Jensenf47bbab2018-09-14 16:34:041370 // Flush cache by triggering an IP address change.
1371 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
Eric Orth70992982018-07-24 00:25:001372 base::RunLoop().RunUntilIdle(); // Notification happens async.
1373
1374 // Resolve "host1" again -- this time it won't be served from cache, so it
1375 // will complete asynchronously.
Eric Orth117e1992019-04-17 00:24:151376 ResolveHostResponseHelper flushed_response(resolver_->CreateRequest(
1377 HostPortPair("host1", 80), NetLogWithSource(), base::nullopt,
1378 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:001379 EXPECT_THAT(flushed_response.result_error(), IsOk());
1380 EXPECT_EQ(2u, proc_->GetCaptureList().size()); // Expected increase.
1381}
1382
Eric Orth37b18192019-04-22 19:09:281383TEST_F(HostResolverManagerTest, FlushCacheOnDnsConfigChange) {
1384 proc_->SignalMultiple(2u); // One before the flush, one after.
1385
1386 // Resolve to load cache.
1387 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
1388 HostPortPair("host1", 70), NetLogWithSource(), base::nullopt,
1389 request_context_.get(), host_cache_.get()));
1390 EXPECT_THAT(initial_response.result_error(), IsOk());
1391 EXPECT_EQ(1u, proc_->GetCaptureList().size());
1392
1393 // Result expected to come from the cache.
1394 ResolveHostResponseHelper cached_response(resolver_->CreateRequest(
1395 HostPortPair("host1", 75), NetLogWithSource(), base::nullopt,
1396 request_context_.get(), host_cache_.get()));
1397 EXPECT_THAT(cached_response.result_error(), IsOk());
1398 EXPECT_EQ(1u, proc_->GetCaptureList().size()); // No expected increase.
1399
1400 // Flush cache by triggering a DNS config change.
1401 NetworkChangeNotifier::NotifyObserversOfDNSChangeForTests();
1402 base::RunLoop().RunUntilIdle(); // Notification happens async.
1403
1404 // Expect flushed from cache and therefore served from |proc_|.
1405 ResolveHostResponseHelper flushed_response(resolver_->CreateRequest(
1406 HostPortPair("host1", 80), NetLogWithSource(), base::nullopt,
1407 request_context_.get(), host_cache_.get()));
1408 EXPECT_THAT(flushed_response.result_error(), IsOk());
1409 EXPECT_EQ(2u, proc_->GetCaptureList().size()); // Expected increase.
1410}
1411
Paul Jensenf47bbab2018-09-14 16:34:041412// Test that IP address changes send ERR_NETWORK_CHANGED to pending requests.
Eric Orth960e7062019-03-08 18:43:541413TEST_F(HostResolverManagerTest, AbortOnIPAddressChanged) {
Eric Orth117e1992019-04-17 00:24:151414 ResolveHostResponseHelper response(resolver_->CreateRequest(
1415 HostPortPair("host1", 70), NetLogWithSource(), base::nullopt,
1416 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:001417
1418 ASSERT_FALSE(response.complete());
1419 ASSERT_TRUE(proc_->WaitFor(1u));
1420
Paul Jensenf47bbab2018-09-14 16:34:041421 // Triggering an IP address change.
1422 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
Eric Orth70992982018-07-24 00:25:001423 base::RunLoop().RunUntilIdle(); // Notification happens async.
1424 proc_->SignalAll();
1425
1426 EXPECT_THAT(response.result_error(), IsError(ERR_NETWORK_CHANGED));
1427 EXPECT_FALSE(response.request()->GetAddressResults());
Eric Orth37b18192019-04-22 19:09:281428 EXPECT_EQ(0u, host_cache_->size());
Eric Orth70992982018-07-24 00:25:001429}
1430
pauljensen101ed372015-04-17 00:11:421431// Test that initial DNS config read signals do not abort pending requests.
Eric Orth960e7062019-03-08 18:43:541432TEST_F(HostResolverManagerTest, DontAbortOnInitialDNSConfigRead) {
Eric Orth117e1992019-04-17 00:24:151433 ResolveHostResponseHelper response(resolver_->CreateRequest(
1434 HostPortPair("host1", 70), NetLogWithSource(), base::nullopt,
1435 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:001436
1437 ASSERT_FALSE(response.complete());
1438 ASSERT_TRUE(proc_->WaitFor(1u));
1439
1440 // Triggering initial DNS config read signal.
1441 NetworkChangeNotifier::NotifyObserversOfInitialDNSConfigReadForTests();
1442 base::RunLoop().RunUntilIdle(); // Notification happens async.
1443 proc_->SignalAll();
1444
1445 EXPECT_THAT(response.result_error(), IsOk());
1446 EXPECT_TRUE(response.request()->GetAddressResults());
1447}
1448
Paul Jensenf47bbab2018-09-14 16:34:041449// Obey pool constraints after IP address has changed.
Eric Orth960e7062019-03-08 18:43:541450TEST_F(HostResolverManagerTest, ObeyPoolConstraintsAfterIPAddressChange) {
[email protected]38b50d92012-04-19 21:07:521451 // Runs at most one job at a time.
1452 CreateSerialResolver();
Eric Orth70992982018-07-24 00:25:001453
1454 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:151455 responses.emplace_back(
1456 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1457 HostPortPair("a", 80), NetLogWithSource(), base::nullopt,
1458 request_context_.get(), host_cache_.get())));
1459 responses.emplace_back(
1460 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1461 HostPortPair("b", 80), NetLogWithSource(), base::nullopt,
1462 request_context_.get(), host_cache_.get())));
1463 responses.emplace_back(
1464 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1465 HostPortPair("c", 80), NetLogWithSource(), base::nullopt,
1466 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:001467
1468 for (auto& response : responses) {
1469 ASSERT_FALSE(response->complete());
1470 }
1471 ASSERT_TRUE(proc_->WaitFor(1u));
1472
Paul Jensenf47bbab2018-09-14 16:34:041473 // Triggering an IP address change.
1474 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
Eric Orth70992982018-07-24 00:25:001475 base::RunLoop().RunUntilIdle(); // Notification happens async.
1476 proc_->SignalMultiple(3u); // Let the false-start go so that we can catch it.
1477
1478 // Requests should complete one at a time, with the first failing.
1479 EXPECT_THAT(responses[0]->result_error(), IsError(ERR_NETWORK_CHANGED));
1480 EXPECT_EQ(1u, num_running_dispatcher_jobs());
1481 EXPECT_FALSE(responses[1]->complete());
1482 EXPECT_FALSE(responses[2]->complete());
1483
1484 EXPECT_THAT(responses[1]->result_error(), IsOk());
1485 EXPECT_EQ(1u, num_running_dispatcher_jobs());
1486 EXPECT_FALSE(responses[2]->complete());
1487
1488 EXPECT_THAT(responses[2]->result_error(), IsOk());
1489}
1490
[email protected]b3601bc22012-02-21 21:23:201491// Tests that a new Request made from the callback of a previously aborted one
1492// will not be aborted.
Eric Orth960e7062019-03-08 18:43:541493TEST_F(HostResolverManagerTest, AbortOnlyExistingRequestsOnIPAddressChange) {
Eric Orth70992982018-07-24 00:25:001494 auto custom_callback_template = base::BindLambdaForTesting(
1495 [&](const HostPortPair& next_host,
1496 std::unique_ptr<ResolveHostResponseHelper>* next_response,
1497 CompletionOnceCallback completion_callback, int error) {
1498 *next_response = std::make_unique<ResolveHostResponseHelper>(
Eric Orth00fe5a62018-08-15 22:20:001499 resolver_->CreateRequest(next_host, NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:151500 base::nullopt, request_context_.get(),
1501 host_cache_.get()));
Eric Orth70992982018-07-24 00:25:001502 std::move(completion_callback).Run(error);
1503 });
1504
1505 std::vector<std::unique_ptr<ResolveHostResponseHelper>> next_responses(3);
1506
1507 ResolveHostResponseHelper response0(
Eric Orth00fe5a62018-08-15 22:20:001508 resolver_->CreateRequest(HostPortPair("bbb", 80), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:151509 base::nullopt, request_context_.get(),
1510 host_cache_.get()),
Eric Orth70992982018-07-24 00:25:001511 base::BindOnce(custom_callback_template, HostPortPair("zzz", 80),
1512 &next_responses[0]));
1513
1514 ResolveHostResponseHelper response1(
Eric Orth00fe5a62018-08-15 22:20:001515 resolver_->CreateRequest(HostPortPair("eee", 80), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:151516 base::nullopt, request_context_.get(),
1517 host_cache_.get()),
Eric Orth70992982018-07-24 00:25:001518 base::BindOnce(custom_callback_template, HostPortPair("aaa", 80),
1519 &next_responses[1]));
1520
1521 ResolveHostResponseHelper response2(
Eric Orth00fe5a62018-08-15 22:20:001522 resolver_->CreateRequest(HostPortPair("ccc", 80), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:151523 base::nullopt, request_context_.get(),
1524 host_cache_.get()),
Eric Orth70992982018-07-24 00:25:001525 base::BindOnce(custom_callback_template, HostPortPair("eee", 80),
1526 &next_responses[2]));
1527
1528 // Wait until all are blocked;
1529 ASSERT_TRUE(proc_->WaitFor(3u));
Paul Jensenf47bbab2018-09-14 16:34:041530 // Trigger an IP address change.
1531 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
Eric Orth70992982018-07-24 00:25:001532 // This should abort all running jobs.
1533 base::RunLoop().RunUntilIdle();
1534
1535 EXPECT_THAT(response0.result_error(), IsError(ERR_NETWORK_CHANGED));
1536 EXPECT_THAT(response1.result_error(), IsError(ERR_NETWORK_CHANGED));
1537 EXPECT_THAT(response2.result_error(), IsError(ERR_NETWORK_CHANGED));
1538
1539 EXPECT_FALSE(next_responses[0]->complete());
1540 EXPECT_FALSE(next_responses[1]->complete());
1541 EXPECT_FALSE(next_responses[2]->complete());
1542
1543 // Unblock all calls to proc.
1544 proc_->SignalMultiple(6u);
1545
1546 // Run until the re-started requests finish.
1547 EXPECT_THAT(next_responses[0]->result_error(), IsOk());
1548 EXPECT_THAT(next_responses[1]->result_error(), IsOk());
1549 EXPECT_THAT(next_responses[2]->result_error(), IsOk());
1550
1551 // Verify that results of aborted Jobs were not cached.
1552 EXPECT_EQ(6u, proc_->GetCaptureList().size());
Eric Orth37b18192019-04-22 19:09:281553 EXPECT_EQ(3u, host_cache_->size());
Eric Orth70992982018-07-24 00:25:001554}
1555
[email protected]68ad3ee2010-01-30 03:45:391556// Tests that when the maximum threads is set to 1, requests are dequeued
1557// in order of priority.
Eric Orth960e7062019-03-08 18:43:541558TEST_F(HostResolverManagerTest, HigherPriorityRequestsStartedFirst) {
[email protected]38b50d92012-04-19 21:07:521559 CreateSerialResolver();
[email protected]68ad3ee2010-01-30 03:45:391560
Eric Orth00fe5a62018-08-15 22:20:001561 HostResolver::ResolveHostParameters low_priority;
1562 low_priority.initial_priority = LOW;
1563 HostResolver::ResolveHostParameters medium_priority;
1564 medium_priority.initial_priority = MEDIUM;
1565 HostResolver::ResolveHostParameters highest_priority;
1566 highest_priority.initial_priority = HIGHEST;
1567
1568 // Note that at this point the MockHostResolverProc is blocked, so any
1569 // requests we make will not complete.
1570
1571 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:151572 responses.emplace_back(
1573 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1574 HostPortPair("req0", 80), NetLogWithSource(), low_priority,
1575 request_context_.get(), host_cache_.get())));
1576 responses.emplace_back(
1577 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1578 HostPortPair("req1", 80), NetLogWithSource(), medium_priority,
1579 request_context_.get(), host_cache_.get())));
1580 responses.emplace_back(
1581 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1582 HostPortPair("req2", 80), NetLogWithSource(), medium_priority,
1583 request_context_.get(), host_cache_.get())));
1584 responses.emplace_back(
1585 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1586 HostPortPair("req3", 80), NetLogWithSource(), low_priority,
1587 request_context_.get(), host_cache_.get())));
1588 responses.emplace_back(
1589 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1590 HostPortPair("req4", 80), NetLogWithSource(), highest_priority,
1591 request_context_.get(), host_cache_.get())));
1592 responses.emplace_back(
1593 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1594 HostPortPair("req5", 80), NetLogWithSource(), low_priority,
1595 request_context_.get(), host_cache_.get())));
1596 responses.emplace_back(
1597 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1598 HostPortPair("req6", 80), NetLogWithSource(), low_priority,
1599 request_context_.get(), host_cache_.get())));
1600 responses.emplace_back(
1601 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1602 HostPortPair("req5", 80), NetLogWithSource(), highest_priority,
1603 request_context_.get(), host_cache_.get())));
Eric Orth00fe5a62018-08-15 22:20:001604
1605 for (const auto& response : responses) {
1606 ASSERT_FALSE(response->complete());
1607 }
1608
1609 // Unblock the resolver thread so the requests can run.
1610 proc_->SignalMultiple(responses.size()); // More than needed.
1611
1612 // Wait for all the requests to complete successfully.
1613 for (auto& response : responses) {
1614 EXPECT_THAT(response->result_error(), IsOk());
1615 }
1616
1617 // Since we have restricted to a single concurrent thread in the jobpool,
1618 // the requests should complete in order of priority (with the exception
1619 // of the first request, which gets started right away, since there is
1620 // nothing outstanding).
1621 MockHostResolverProc::CaptureList capture_list = proc_->GetCaptureList();
1622 ASSERT_EQ(7u, capture_list.size());
1623
1624 EXPECT_EQ("req0", capture_list[0].hostname);
1625 EXPECT_EQ("req4", capture_list[1].hostname);
1626 EXPECT_EQ("req5", capture_list[2].hostname);
1627 EXPECT_EQ("req1", capture_list[3].hostname);
1628 EXPECT_EQ("req2", capture_list[4].hostname);
1629 EXPECT_EQ("req3", capture_list[5].hostname);
1630 EXPECT_EQ("req6", capture_list[6].hostname);
1631}
1632
juliatuttlec53b19a72016-05-05 13:51:311633// Test that changing a job's priority affects the dequeueing order.
Eric Orth960e7062019-03-08 18:43:541634TEST_F(HostResolverManagerTest, ChangePriority) {
juliatuttlec53b19a72016-05-05 13:51:311635 CreateSerialResolver();
1636
Eric Orth26fa08e2019-02-22 01:28:371637 HostResolver::ResolveHostParameters lowest_priority;
1638 lowest_priority.initial_priority = LOWEST;
1639 HostResolver::ResolveHostParameters low_priority;
1640 low_priority.initial_priority = LOW;
1641 HostResolver::ResolveHostParameters medium_priority;
1642 medium_priority.initial_priority = MEDIUM;
juliatuttlec53b19a72016-05-05 13:51:311643
Eric Orth26fa08e2019-02-22 01:28:371644 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:151645 responses.emplace_back(
1646 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1647 HostPortPair("req0", 80), NetLogWithSource(), medium_priority,
1648 request_context_.get(), host_cache_.get())));
1649 responses.emplace_back(
1650 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1651 HostPortPair("req1", 80), NetLogWithSource(), low_priority,
1652 request_context_.get(), host_cache_.get())));
1653 responses.emplace_back(
1654 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1655 HostPortPair("req2", 80), NetLogWithSource(), lowest_priority,
1656 request_context_.get(), host_cache_.get())));
juliatuttlec53b19a72016-05-05 13:51:311657
1658 // req0 starts immediately; without ChangePriority, req1 and then req2 should
1659 // run.
Eric Orth26fa08e2019-02-22 01:28:371660 for (const auto& response : responses) {
1661 ASSERT_FALSE(response->complete());
1662 }
juliatuttlec53b19a72016-05-05 13:51:311663
Eric Orth26fa08e2019-02-22 01:28:371664 // Changing req2 to HIGHEST should make it run before req1.
juliatuttlec53b19a72016-05-05 13:51:311665 // (It can't run before req0, since req0 started immediately.)
Eric Orth26fa08e2019-02-22 01:28:371666 responses[2]->request()->ChangeRequestPriority(HIGHEST);
juliatuttlec53b19a72016-05-05 13:51:311667
1668 // Let all 3 requests finish.
1669 proc_->SignalMultiple(3u);
1670
Eric Orth26fa08e2019-02-22 01:28:371671 for (auto& response : responses) {
1672 EXPECT_THAT(response->result_error(), IsOk());
1673 }
juliatuttlec53b19a72016-05-05 13:51:311674
1675 MockHostResolverProc::CaptureList capture_list = proc_->GetCaptureList();
1676 ASSERT_EQ(3u, capture_list.size());
1677
1678 EXPECT_EQ("req0", capture_list[0].hostname);
1679 EXPECT_EQ("req2", capture_list[1].hostname);
1680 EXPECT_EQ("req1", capture_list[2].hostname);
1681}
1682
[email protected]38b50d92012-04-19 21:07:521683// Try cancelling a job which has not started yet.
Eric Orth960e7062019-03-08 18:43:541684TEST_F(HostResolverManagerTest, CancelPendingRequest) {
[email protected]38b50d92012-04-19 21:07:521685 CreateSerialResolver();
[email protected]68ad3ee2010-01-30 03:45:391686
Eric Orth00fe5a62018-08-15 22:20:001687 HostResolver::ResolveHostParameters lowest_priority;
1688 lowest_priority.initial_priority = LOWEST;
1689 HostResolver::ResolveHostParameters low_priority;
1690 low_priority.initial_priority = LOW;
1691 HostResolver::ResolveHostParameters medium_priority;
1692 medium_priority.initial_priority = MEDIUM;
1693 HostResolver::ResolveHostParameters highest_priority;
1694 highest_priority.initial_priority = HIGHEST;
1695
Eric Orth70992982018-07-24 00:25:001696 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:151697 responses.emplace_back(
1698 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1699 HostPortPair("req0", 80), NetLogWithSource(), lowest_priority,
1700 request_context_.get(), host_cache_.get())));
1701 responses.emplace_back(
1702 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1703 HostPortPair("req1", 80), NetLogWithSource(), highest_priority,
1704 request_context_.get(), host_cache_.get())));
1705 responses.emplace_back(
1706 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1707 HostPortPair("req2", 80), NetLogWithSource(), medium_priority,
1708 request_context_.get(), host_cache_.get())));
1709 responses.emplace_back(
1710 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1711 HostPortPair("req3", 80), NetLogWithSource(), low_priority,
1712 request_context_.get(), host_cache_.get())));
1713 responses.emplace_back(
1714 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1715 HostPortPair("req4", 80), NetLogWithSource(), highest_priority,
1716 request_context_.get(), host_cache_.get())));
1717 responses.emplace_back(
1718 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1719 HostPortPair("req5", 80), NetLogWithSource(), lowest_priority,
1720 request_context_.get(), host_cache_.get())));
1721 responses.emplace_back(
1722 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1723 HostPortPair("req6", 80), NetLogWithSource(), medium_priority,
1724 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:001725
1726 // Cancel some requests
1727 responses[1]->CancelRequest();
1728 responses[4]->CancelRequest();
1729 responses[5]->CancelRequest();
1730
1731 // Unblock the resolver thread so the requests can run.
1732 proc_->SignalMultiple(responses.size()); // More than needed.
1733
1734 // Let everything try to finish.
1735 base::RunLoop().RunUntilIdle();
1736
1737 // Wait for all the requests to complete succesfully.
1738 EXPECT_THAT(responses[0]->result_error(), IsOk());
1739 EXPECT_THAT(responses[2]->result_error(), IsOk());
1740 EXPECT_THAT(responses[3]->result_error(), IsOk());
1741 EXPECT_THAT(responses[6]->result_error(), IsOk());
1742
1743 // Cancelled requests shouldn't complete.
1744 EXPECT_FALSE(responses[1]->complete());
1745 EXPECT_FALSE(responses[4]->complete());
1746 EXPECT_FALSE(responses[5]->complete());
1747
1748 // Verify that they called out the the resolver proc (which runs on the
1749 // resolver thread) in the expected order.
1750 MockHostResolverProc::CaptureList capture_list = proc_->GetCaptureList();
1751 ASSERT_EQ(4u, capture_list.size());
1752
1753 EXPECT_EQ("req0", capture_list[0].hostname);
1754 EXPECT_EQ("req2", capture_list[1].hostname);
Eric Orth00fe5a62018-08-15 22:20:001755 EXPECT_EQ("req6", capture_list[2].hostname);
1756 EXPECT_EQ("req3", capture_list[3].hostname);
Eric Orth70992982018-07-24 00:25:001757}
1758
[email protected]68ad3ee2010-01-30 03:45:391759// Test that when too many requests are enqueued, old ones start to be aborted.
Eric Orth960e7062019-03-08 18:43:541760TEST_F(HostResolverManagerTest, QueueOverflow) {
[email protected]38b50d92012-04-19 21:07:521761 CreateSerialResolver();
[email protected]68ad3ee2010-01-30 03:45:391762
[email protected]0f292de02012-02-01 22:28:201763 // Allow only 3 queued jobs.
1764 const size_t kMaxPendingJobs = 3u;
Eric Orth70992982018-07-24 00:25:001765 resolver_->SetMaxQueuedJobsForTesting(kMaxPendingJobs);
[email protected]68ad3ee2010-01-30 03:45:391766
Eric Orth00fe5a62018-08-15 22:20:001767 HostResolver::ResolveHostParameters lowest_priority;
1768 lowest_priority.initial_priority = LOWEST;
1769 HostResolver::ResolveHostParameters low_priority;
1770 low_priority.initial_priority = LOW;
1771 HostResolver::ResolveHostParameters medium_priority;
1772 medium_priority.initial_priority = MEDIUM;
1773 HostResolver::ResolveHostParameters highest_priority;
1774 highest_priority.initial_priority = HIGHEST;
1775
Eric Orth70992982018-07-24 00:25:001776 // Note that at this point the MockHostResolverProc is blocked, so any
1777 // requests we make will not complete.
1778
1779 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:151780 responses.emplace_back(
1781 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1782 HostPortPair("req0", 80), NetLogWithSource(), lowest_priority,
1783 request_context_.get(), host_cache_.get())));
1784 responses.emplace_back(
1785 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1786 HostPortPair("req1", 80), NetLogWithSource(), highest_priority,
1787 request_context_.get(), host_cache_.get())));
1788 responses.emplace_back(
1789 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1790 HostPortPair("req2", 80), NetLogWithSource(), medium_priority,
1791 request_context_.get(), host_cache_.get())));
1792 responses.emplace_back(
1793 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1794 HostPortPair("req3", 80), NetLogWithSource(), medium_priority,
1795 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:001796
1797 // At this point, there are 3 enqueued jobs (and one "running" job).
1798 // Insertion of subsequent requests will cause evictions.
1799
Eric Orth117e1992019-04-17 00:24:151800 responses.emplace_back(
1801 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1802 HostPortPair("req4", 80), NetLogWithSource(), low_priority,
1803 request_context_.get(), host_cache_.get())));
Eric Orth00fe5a62018-08-15 22:20:001804 EXPECT_THAT(responses[4]->result_error(),
1805 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE)); // Evicts self.
1806 EXPECT_FALSE(responses[4]->request()->GetAddressResults());
Eric Orth70992982018-07-24 00:25:001807
Eric Orth117e1992019-04-17 00:24:151808 responses.emplace_back(
1809 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1810 HostPortPair("req5", 80), NetLogWithSource(), medium_priority,
1811 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:001812 EXPECT_THAT(responses[2]->result_error(),
1813 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
1814 EXPECT_FALSE(responses[2]->request()->GetAddressResults());
1815
Eric Orth117e1992019-04-17 00:24:151816 responses.emplace_back(
1817 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1818 HostPortPair("req6", 80), NetLogWithSource(), highest_priority,
1819 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:001820 EXPECT_THAT(responses[3]->result_error(),
1821 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
1822 EXPECT_FALSE(responses[3]->request()->GetAddressResults());
1823
Eric Orth117e1992019-04-17 00:24:151824 responses.emplace_back(
1825 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
1826 HostPortPair("req7", 80), NetLogWithSource(), medium_priority,
1827 request_context_.get(), host_cache_.get())));
Eric Orth00fe5a62018-08-15 22:20:001828 EXPECT_THAT(responses[5]->result_error(),
Eric Orth70992982018-07-24 00:25:001829 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
Eric Orth00fe5a62018-08-15 22:20:001830 EXPECT_FALSE(responses[5]->request()->GetAddressResults());
Eric Orth70992982018-07-24 00:25:001831
1832 // Unblock the resolver thread so the requests can run.
1833 proc_->SignalMultiple(4u);
1834
1835 // The rest should succeed.
1836 EXPECT_THAT(responses[0]->result_error(), IsOk());
1837 EXPECT_TRUE(responses[0]->request()->GetAddressResults());
Eric Orth00fe5a62018-08-15 22:20:001838 EXPECT_THAT(responses[1]->result_error(), IsOk());
1839 EXPECT_TRUE(responses[1]->request()->GetAddressResults());
Eric Orth70992982018-07-24 00:25:001840 EXPECT_THAT(responses[6]->result_error(), IsOk());
1841 EXPECT_TRUE(responses[6]->request()->GetAddressResults());
1842 EXPECT_THAT(responses[7]->result_error(), IsOk());
1843 EXPECT_TRUE(responses[7]->request()->GetAddressResults());
1844
1845 // Verify that they called out the the resolver proc (which runs on the
1846 // resolver thread) in the expected order.
1847 MockHostResolverProc::CaptureList capture_list = proc_->GetCaptureList();
1848 ASSERT_EQ(4u, capture_list.size());
1849
1850 EXPECT_EQ("req0", capture_list[0].hostname);
Eric Orth00fe5a62018-08-15 22:20:001851 EXPECT_EQ("req1", capture_list[1].hostname);
Eric Orth70992982018-07-24 00:25:001852 EXPECT_EQ("req6", capture_list[2].hostname);
1853 EXPECT_EQ("req7", capture_list[3].hostname);
1854
1855 // Verify that the evicted (incomplete) requests were not cached.
Eric Orth37b18192019-04-22 19:09:281856 EXPECT_EQ(4u, host_cache_->size());
Eric Orth70992982018-07-24 00:25:001857
1858 for (size_t i = 0; i < responses.size(); ++i) {
1859 EXPECT_TRUE(responses[i]->complete()) << i;
1860 }
1861}
1862
1863// Tests that jobs can self-evict by setting the max queue to 0.
Eric Orth960e7062019-03-08 18:43:541864TEST_F(HostResolverManagerTest, QueueOverflow_SelfEvict) {
Eric Orth70992982018-07-24 00:25:001865 CreateSerialResolver();
1866 resolver_->SetMaxQueuedJobsForTesting(0);
1867
1868 // Note that at this point the MockHostResolverProc is blocked, so any
1869 // requests we make will not complete.
1870
Eric Orth117e1992019-04-17 00:24:151871 ResolveHostResponseHelper run_response(resolver_->CreateRequest(
1872 HostPortPair("run", 80), NetLogWithSource(), base::nullopt,
1873 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:001874
Eric Orth117e1992019-04-17 00:24:151875 ResolveHostResponseHelper evict_response(resolver_->CreateRequest(
1876 HostPortPair("req1", 80), NetLogWithSource(), base::nullopt,
1877 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:001878 EXPECT_THAT(evict_response.result_error(),
1879 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
1880 EXPECT_FALSE(evict_response.request()->GetAddressResults());
1881
1882 proc_->SignalMultiple(1u);
1883
1884 EXPECT_THAT(run_response.result_error(), IsOk());
1885 EXPECT_TRUE(run_response.request()->GetAddressResults());
1886}
1887
Eric Orth00fe5a62018-08-15 22:20:001888// Make sure that the dns query type parameter is respected when raw IPs are
1889// passed in.
Eric Orth960e7062019-03-08 18:43:541890TEST_F(HostResolverManagerTest, AddressFamilyWithRawIPs) {
Eric Orth00fe5a62018-08-15 22:20:001891 HostResolver::ResolveHostParameters v4_parameters;
Eric Orth192e3bb2018-11-14 19:30:321892 v4_parameters.dns_query_type = DnsQueryType::A;
Eric Orth00fe5a62018-08-15 22:20:001893
1894 HostResolver::ResolveHostParameters v6_parameters;
Eric Orth192e3bb2018-11-14 19:30:321895 v6_parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth00fe5a62018-08-15 22:20:001896
1897 ResolveHostResponseHelper v4_v4_request(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:271898 HostPortPair("127.0.0.1", 80), NetLogWithSource(), v4_parameters,
Eric Orth117e1992019-04-17 00:24:151899 request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:001900 EXPECT_THAT(v4_v4_request.result_error(), IsOk());
1901 EXPECT_THAT(v4_v4_request.request()->GetAddressResults().value().endpoints(),
1902 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
1903
1904 ResolveHostResponseHelper v4_v6_request(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:271905 HostPortPair("127.0.0.1", 80), NetLogWithSource(), v6_parameters,
Eric Orth117e1992019-04-17 00:24:151906 request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:001907 EXPECT_THAT(v4_v6_request.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
1908
1909 ResolveHostResponseHelper v4_unsp_request(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:271910 HostPortPair("127.0.0.1", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:151911 request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:001912 EXPECT_THAT(v4_unsp_request.result_error(), IsOk());
1913 EXPECT_THAT(
1914 v4_unsp_request.request()->GetAddressResults().value().endpoints(),
1915 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
1916
Eric Orth117e1992019-04-17 00:24:151917 ResolveHostResponseHelper v6_v4_request(resolver_->CreateRequest(
1918 HostPortPair("::1", 80), NetLogWithSource(), v4_parameters,
1919 request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:001920 EXPECT_THAT(v6_v4_request.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
1921
Eric Orth117e1992019-04-17 00:24:151922 ResolveHostResponseHelper v6_v6_request(resolver_->CreateRequest(
1923 HostPortPair("::1", 80), NetLogWithSource(), v6_parameters,
1924 request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:001925 EXPECT_THAT(v6_v6_request.result_error(), IsOk());
1926 EXPECT_THAT(v6_v6_request.request()->GetAddressResults().value().endpoints(),
1927 testing::ElementsAre(CreateExpected("::1", 80)));
1928
Eric Orth117e1992019-04-17 00:24:151929 ResolveHostResponseHelper v6_unsp_request(resolver_->CreateRequest(
1930 HostPortPair("::1", 80), NetLogWithSource(), base::nullopt,
1931 request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:001932 EXPECT_THAT(v6_unsp_request.result_error(), IsOk());
1933 EXPECT_THAT(
1934 v6_unsp_request.request()->GetAddressResults().value().endpoints(),
1935 testing::ElementsAre(CreateExpected("::1", 80)));
1936}
1937
Eric Orth960e7062019-03-08 18:43:541938TEST_F(HostResolverManagerTest, LocalOnly_FromCache) {
Eric Ortheb332862019-01-26 00:52:381939 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42");
1940 proc_->SignalMultiple(1u); // Need only one.
1941
1942 HostResolver::ResolveHostParameters source_none_parameters;
1943 source_none_parameters.source = HostResolverSource::LOCAL_ONLY;
1944
1945 // First NONE query expected to complete synchronously with a cache miss.
Eric Orth6f1c5172019-04-16 17:08:271946 ResolveHostResponseHelper cache_miss_request(resolver_->CreateRequest(
1947 HostPortPair("just.testing", 80), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:151948 source_none_parameters, request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:381949 EXPECT_TRUE(cache_miss_request.complete());
1950 EXPECT_THAT(cache_miss_request.result_error(), IsError(ERR_DNS_CACHE_MISS));
1951 EXPECT_FALSE(cache_miss_request.request()->GetAddressResults());
1952 EXPECT_FALSE(cache_miss_request.request()->GetStaleInfo());
1953
1954 // Normal query to populate the cache.
1955 ResolveHostResponseHelper normal_request(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:271956 HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:151957 request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:381958 EXPECT_THAT(normal_request.result_error(), IsOk());
1959 EXPECT_FALSE(normal_request.request()->GetStaleInfo());
1960
1961 // Second NONE query expected to complete synchronously with cache hit.
Eric Orth6f1c5172019-04-16 17:08:271962 ResolveHostResponseHelper cache_hit_request(resolver_->CreateRequest(
1963 HostPortPair("just.testing", 80), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:151964 source_none_parameters, request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:381965 EXPECT_TRUE(cache_hit_request.complete());
1966 EXPECT_THAT(cache_hit_request.result_error(), IsOk());
1967 EXPECT_THAT(
1968 cache_hit_request.request()->GetAddressResults().value().endpoints(),
1969 testing::ElementsAre(CreateExpected("192.168.1.42", 80)));
1970 EXPECT_FALSE(cache_hit_request.request()->GetStaleInfo().value().is_stale());
1971}
1972
Eric Orth960e7062019-03-08 18:43:541973TEST_F(HostResolverManagerTest, LocalOnly_StaleEntry) {
Eric Ortheb332862019-01-26 00:52:381974 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42");
1975 proc_->SignalMultiple(1u); // Need only one.
1976
1977 HostResolver::ResolveHostParameters source_none_parameters;
1978 source_none_parameters.source = HostResolverSource::LOCAL_ONLY;
1979
1980 // First NONE query expected to complete synchronously with a cache miss.
Eric Orth6f1c5172019-04-16 17:08:271981 ResolveHostResponseHelper cache_miss_request(resolver_->CreateRequest(
1982 HostPortPair("just.testing", 80), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:151983 source_none_parameters, request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:381984 EXPECT_TRUE(cache_miss_request.complete());
1985 EXPECT_THAT(cache_miss_request.result_error(), IsError(ERR_DNS_CACHE_MISS));
1986 EXPECT_FALSE(cache_miss_request.request()->GetAddressResults());
1987 EXPECT_FALSE(cache_miss_request.request()->GetStaleInfo());
1988
1989 // Normal query to populate the cache.
1990 ResolveHostResponseHelper normal_request(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:271991 HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:151992 request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:381993 EXPECT_THAT(normal_request.result_error(), IsOk());
1994 EXPECT_FALSE(normal_request.request()->GetStaleInfo());
1995
1996 MakeCacheStale();
1997
1998 // Second NONE query still expected to complete synchronously with cache miss.
Eric Orth6f1c5172019-04-16 17:08:271999 ResolveHostResponseHelper stale_request(resolver_->CreateRequest(
2000 HostPortPair("just.testing", 80), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:152001 source_none_parameters, request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:382002 EXPECT_TRUE(stale_request.complete());
2003 EXPECT_THAT(stale_request.result_error(), IsError(ERR_DNS_CACHE_MISS));
2004 EXPECT_FALSE(stale_request.request()->GetAddressResults());
2005 EXPECT_FALSE(stale_request.request()->GetStaleInfo());
2006}
2007
Eric Orth960e7062019-03-08 18:43:542008TEST_F(HostResolverManagerTest, LocalOnly_FromIp) {
Eric Ortheb332862019-01-26 00:52:382009 HostResolver::ResolveHostParameters source_none_parameters;
2010 source_none_parameters.source = HostResolverSource::LOCAL_ONLY;
2011
Eric Orth117e1992019-04-17 00:24:152012 ResolveHostResponseHelper response(resolver_->CreateRequest(
2013 HostPortPair("1.2.3.4", 56), NetLogWithSource(), source_none_parameters,
2014 request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:382015
2016 // Expected to resolve synchronously.
2017 EXPECT_TRUE(response.complete());
2018 EXPECT_THAT(response.result_error(), IsOk());
2019 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
2020 testing::ElementsAre(CreateExpected("1.2.3.4", 56)));
2021 EXPECT_FALSE(response.request()->GetStaleInfo());
2022}
2023
Eric Orth960e7062019-03-08 18:43:542024TEST_F(HostResolverManagerTest, LocalOnly_InvalidName) {
Eric Ortheb332862019-01-26 00:52:382025 proc_->AddRuleForAllFamilies("foo,bar.com", "192.168.1.42");
2026
2027 HostResolver::ResolveHostParameters source_none_parameters;
2028 source_none_parameters.source = HostResolverSource::LOCAL_ONLY;
2029
Eric Orth6f1c5172019-04-16 17:08:272030 ResolveHostResponseHelper response(resolver_->CreateRequest(
2031 HostPortPair("foo,bar.com", 57), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:152032 source_none_parameters, request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:382033
2034 // Expected to fail synchronously.
2035 EXPECT_TRUE(response.complete());
2036 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
2037 EXPECT_FALSE(response.request()->GetAddressResults());
2038 EXPECT_FALSE(response.request()->GetStaleInfo());
2039}
2040
Eric Orth960e7062019-03-08 18:43:542041TEST_F(HostResolverManagerTest, LocalOnly_InvalidLocalhost) {
Eric Ortheb332862019-01-26 00:52:382042 HostResolver::ResolveHostParameters source_none_parameters;
2043 source_none_parameters.source = HostResolverSource::LOCAL_ONLY;
2044
Eric Orth6f1c5172019-04-16 17:08:272045 ResolveHostResponseHelper response(resolver_->CreateRequest(
2046 HostPortPair("foo,bar.localhost", 58), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:152047 source_none_parameters, request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:382048
2049 // Expected to fail synchronously.
2050 EXPECT_TRUE(response.complete());
2051 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
2052 EXPECT_FALSE(response.request()->GetAddressResults());
2053 EXPECT_FALSE(response.request()->GetStaleInfo());
2054}
2055
Eric Orth960e7062019-03-08 18:43:542056TEST_F(HostResolverManagerTest, StaleAllowed) {
Eric Ortheb332862019-01-26 00:52:382057 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42");
2058 proc_->SignalMultiple(1u); // Need only one.
2059
2060 HostResolver::ResolveHostParameters stale_allowed_parameters;
2061 stale_allowed_parameters.source = HostResolverSource::LOCAL_ONLY;
2062 stale_allowed_parameters.cache_usage =
2063 HostResolver::ResolveHostParameters::CacheUsage::STALE_ALLOWED;
2064
2065 // First query expected to complete synchronously as a cache miss.
Eric Orth6f1c5172019-04-16 17:08:272066 ResolveHostResponseHelper cache_miss_request(resolver_->CreateRequest(
2067 HostPortPair("just.testing", 80), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:152068 stale_allowed_parameters, request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:382069 EXPECT_TRUE(cache_miss_request.complete());
2070 EXPECT_THAT(cache_miss_request.result_error(), IsError(ERR_DNS_CACHE_MISS));
2071 EXPECT_FALSE(cache_miss_request.request()->GetAddressResults());
2072 EXPECT_FALSE(cache_miss_request.request()->GetStaleInfo());
2073
2074 // Normal query to populate cache
2075 ResolveHostResponseHelper normal_request(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272076 HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:152077 request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:382078 EXPECT_THAT(normal_request.result_error(), IsOk());
2079 EXPECT_FALSE(normal_request.request()->GetStaleInfo());
2080
2081 MakeCacheStale();
2082
2083 // Second NONE query expected to get a stale cache hit.
Eric Orth6f1c5172019-04-16 17:08:272084 ResolveHostResponseHelper stale_request(resolver_->CreateRequest(
2085 HostPortPair("just.testing", 84), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:152086 stale_allowed_parameters, request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:382087 EXPECT_TRUE(stale_request.complete());
2088 EXPECT_THAT(stale_request.result_error(), IsOk());
2089 EXPECT_THAT(stale_request.request()->GetAddressResults().value().endpoints(),
2090 testing::ElementsAre(CreateExpected("192.168.1.42", 84)));
2091 EXPECT_TRUE(stale_request.request()->GetStaleInfo().value().is_stale());
2092}
2093
Eric Orth960e7062019-03-08 18:43:542094TEST_F(HostResolverManagerTest, StaleAllowed_NonLocal) {
Eric Ortheb332862019-01-26 00:52:382095 proc_->AddRuleForAllFamilies("just.testing", "192.168.2.42");
2096 proc_->SignalMultiple(1u); // Need only one.
2097
2098 HostResolver::ResolveHostParameters stale_allowed_parameters;
2099 stale_allowed_parameters.cache_usage =
2100 HostResolver::ResolveHostParameters::CacheUsage::STALE_ALLOWED;
2101
2102 // Normal non-local resolves should still work normally with the STALE_ALLOWED
2103 // parameter, and there should be no stale info.
Eric Orth6f1c5172019-04-16 17:08:272104 ResolveHostResponseHelper response(resolver_->CreateRequest(
2105 HostPortPair("just.testing", 85), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:152106 stale_allowed_parameters, request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:382107 EXPECT_THAT(response.result_error(), IsOk());
2108 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
2109 testing::ElementsAre(CreateExpected("192.168.2.42", 85)));
2110 EXPECT_FALSE(response.request()->GetStaleInfo());
2111}
2112
Eric Orth960e7062019-03-08 18:43:542113TEST_F(HostResolverManagerTest, StaleAllowed_FromIp) {
Eric Ortheb332862019-01-26 00:52:382114 HostResolver::ResolveHostParameters stale_allowed_parameters;
2115 stale_allowed_parameters.cache_usage =
2116 HostResolver::ResolveHostParameters::CacheUsage::STALE_ALLOWED;
2117
Eric Orth6f1c5172019-04-16 17:08:272118 ResolveHostResponseHelper response(resolver_->CreateRequest(
2119 HostPortPair("1.2.3.4", 57), NetLogWithSource(), stale_allowed_parameters,
Eric Orth117e1992019-04-17 00:24:152120 request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:382121
2122 // Expected to resolve synchronously without stale info.
2123 EXPECT_TRUE(response.complete());
2124 EXPECT_THAT(response.result_error(), IsOk());
2125 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
2126 testing::ElementsAre(CreateExpected("1.2.3.4", 57)));
2127 EXPECT_FALSE(response.request()->GetStaleInfo());
2128}
2129
Miriam Gershensone3bc63022017-10-09 19:57:052130// TODO(mgersh): add a test case for errors with positive TTL after
2131// https://crbug.com/115051 is fixed.
2132
[email protected]189163e2011-05-11 01:48:542133// Test the retry attempts simulating host resolver proc that takes too long.
Eric Orth960e7062019-03-08 18:43:542134TEST_F(HostResolverManagerTest, MultipleAttempts) {
[email protected]189163e2011-05-11 01:48:542135 // Total number of attempts would be 3 and we want the 3rd attempt to resolve
Eric Orth9a037562018-07-03 21:24:382136 // the host. First and second attempt will be forced to wait until they get
[email protected]189163e2011-05-11 01:48:542137 // word that a resolution has completed. The 3rd resolution attempt will try
Eric Orth9a037562018-07-03 21:24:382138 // to get done ASAP, and won't wait.
[email protected]189163e2011-05-11 01:48:542139 int kAttemptNumberToResolve = 3;
2140 int kTotalAttempts = 3;
2141
Eric Orth9a037562018-07-03 21:24:382142 // Add a little bit of extra fudge to the delay to allow reasonable
2143 // flexibility for time > vs >= etc. We don't need to fail the test if we
2144 // retry at t=6001 instead of t=6000.
2145 base::TimeDelta kSleepFudgeFactor = base::TimeDelta::FromMilliseconds(1);
2146
[email protected]189163e2011-05-11 01:48:542147 scoped_refptr<LookupAttemptHostResolverProc> resolver_proc(
Raul Tambre94493c652019-03-11 17:18:352148 new LookupAttemptHostResolverProc(nullptr, kAttemptNumberToResolve,
Eric Orth70992982018-07-24 00:25:002149 kTotalAttempts));
2150
Eric Orth59066222019-03-07 23:52:272151 ProcTaskParams params = DefaultParams(resolver_proc.get());
Eric Orth70992982018-07-24 00:25:002152 base::TimeDelta unresponsive_delay = params.unresponsive_delay;
2153 int retry_factor = params.retry_factor;
2154
Eric Orth607b6d82019-05-08 16:43:322155 CreateResolverWithLimitsAndParams(kMaxJobs, params, true /* ipv6_reachable */,
2156 true /* check_ipv6_on_wifi */);
Eric Orth70992982018-07-24 00:25:002157
2158 // Override the current thread task runner, so we can simulate the passage of
2159 // time and avoid any actual sleeps.
2160 auto test_task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
2161 base::ScopedClosureRunner task_runner_override_scoped_cleanup =
2162 base::ThreadTaskRunnerHandle::OverrideForTesting(test_task_runner);
2163
2164 // Resolve "host1".
Eric Orth117e1992019-04-17 00:24:152165 ResolveHostResponseHelper response(resolver_->CreateRequest(
2166 HostPortPair("host1", 70), NetLogWithSource(), base::nullopt,
2167 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:002168 EXPECT_FALSE(response.complete());
2169
2170 resolver_proc->WaitForNAttemptsToBeBlocked(1);
2171 EXPECT_FALSE(response.complete());
2172
2173 test_task_runner->FastForwardBy(unresponsive_delay + kSleepFudgeFactor);
2174 resolver_proc->WaitForNAttemptsToBeBlocked(2);
2175 EXPECT_FALSE(response.complete());
2176
2177 test_task_runner->FastForwardBy(unresponsive_delay * retry_factor +
2178 kSleepFudgeFactor);
2179
2180 resolver_proc->WaitForAllAttemptsToFinish();
2181 test_task_runner->RunUntilIdle();
2182
2183 // Resolve returns -4 to indicate that 3rd attempt has resolved the host.
2184 // Since we're using a TestMockTimeTaskRunner, the RunLoop stuff in
2185 // result_error() will fail if it actually has to wait, but unless there's an
2186 // error, the result should be immediately ready by this point.
2187 EXPECT_EQ(-4, response.result_error());
2188
2189 // We should be done with retries, but make sure none erroneously happen.
2190 test_task_runner->FastForwardUntilNoTasksRemain();
2191
Eric Roman21b39232019-06-28 21:28:212192 EXPECT_EQ(resolver_proc->GetTotalAttemptsResolved(), kTotalAttempts);
2193}
2194
2195// Regression test for https://crbug.com/976948.
2196//
2197// Tests that when the maximum number of retries is set to
2198// |HostResolver::ManagerOptions::kDefaultRetryAttempts| the
2199// number of retries used is 4 rather than something higher.
2200TEST_F(HostResolverManagerTest, DefaultMaxRetryAttempts) {
2201 auto test_task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
2202 base::ScopedClosureRunner task_runner_override_scoped_cleanup =
2203 base::ThreadTaskRunnerHandle::OverrideForTesting(test_task_runner);
2204
2205 // Instantiate a ResolverProc that will block all incoming requests.
2206 auto resolver_proc = base::MakeRefCounted<LookupAttemptHostResolverProc>(
2207 nullptr, std::numeric_limits<size_t>::max(),
2208 std::numeric_limits<size_t>::max());
2209
2210 // This corresponds to kDefaultMaxRetryAttempts in
2211 // ProcTaskParams::ProcTaskParams(). The correspondence is verified below,
2212 // since that symbol is not exported.
2213 const size_t expected_max_retries = 4;
2214
2215 // Use the special value |ManagerOptions::kDefaultRetryAttempts|, which is
2216 // expected to translate into |expected_num_retries|.
2217 ASSERT_NE(HostResolver::ManagerOptions::kDefaultRetryAttempts,
2218 expected_max_retries);
2219 ProcTaskParams params(resolver_proc.get(),
2220 HostResolver::ManagerOptions::kDefaultRetryAttempts);
2221 ASSERT_EQ(params.max_retry_attempts, expected_max_retries);
2222
2223 CreateResolverWithLimitsAndParams(kMaxJobs, params,
2224 false /* ipv6_reachable */,
2225 false /* check_ipv6_on_wifi */);
2226
2227 // Resolve "host1". The resolver proc will hang all requests so this
2228 // resolution should remain stalled until calling SetResolvedAttemptNumber().
2229 ResolveHostResponseHelper response(resolver_->CreateRequest(
2230 HostPortPair("host1", 70), NetLogWithSource(), base::nullopt,
2231 request_context_.get(), host_cache_.get()));
2232 EXPECT_FALSE(response.complete());
2233
2234 // Simulate running the main thread (network task runner) for a long
2235 // time. Because none of the attempts posted to worker pool can complete, this
2236 // should cause all of the retry attempts to get posted, according to the
2237 // exponential backoff schedule.
2238 test_task_runner->FastForwardBy(base::TimeDelta::FromMinutes(20));
2239
2240 // Unblock the resolver proc, then wait for all the worker pool and main
2241 // thread tasks to complete. Note that the call to SetResolvedAttemptNumber(1)
2242 // will cause all the blocked resolver procs tasks fail with -2.
2243 resolver_proc->SetResolvedAttemptNumber(1);
2244 const int kExpectedError = -2;
2245 base::ThreadPoolInstance::Get()->FlushForTesting();
2246 test_task_runner->RunUntilIdle();
2247
2248 ASSERT_TRUE(response.complete());
2249 EXPECT_EQ(kExpectedError, response.result_error());
2250
2251 // Ensure that the original attempt was executed on the worker pool, as well
2252 // as the maximum number of allowed retries, and no more.
2253 EXPECT_EQ(static_cast<int>(expected_max_retries + 1),
2254 resolver_proc->GetTotalAttemptsResolved());
Eric Orth70992982018-07-24 00:25:002255}
2256
eroman91dd3602015-03-26 03:46:332257// If a host resolves to a list that includes 127.0.53.53, this is treated as
2258// an error. 127.0.53.53 is a localhost address, however it has been given a
eroman1efc237c2016-12-14 00:00:452259// special significance by ICANN to help surface name collision resulting from
eroman91dd3602015-03-26 03:46:332260// the new gTLDs.
Eric Orth960e7062019-03-08 18:43:542261TEST_F(HostResolverManagerTest, NameCollisionIcann) {
eroman91dd3602015-03-26 03:46:332262 proc_->AddRuleForAllFamilies("single", "127.0.53.53");
2263 proc_->AddRuleForAllFamilies("multiple", "127.0.0.1,127.0.53.53");
2264 proc_->AddRuleForAllFamilies("ipv6", "::127.0.53.53");
2265 proc_->AddRuleForAllFamilies("not_reserved1", "53.53.0.127");
2266 proc_->AddRuleForAllFamilies("not_reserved2", "127.0.53.54");
2267 proc_->AddRuleForAllFamilies("not_reserved3", "10.0.53.53");
2268 proc_->SignalMultiple(6u);
2269
Eric Orth117e1992019-04-17 00:24:152270 ResolveHostResponseHelper single_response(resolver_->CreateRequest(
2271 HostPortPair("single", 80), NetLogWithSource(), base::nullopt,
2272 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:002273 EXPECT_THAT(single_response.result_error(),
2274 IsError(ERR_ICANN_NAME_COLLISION));
2275 EXPECT_FALSE(single_response.request()->GetAddressResults());
2276
2277 // ERR_ICANN_NAME_COLLISION is cached like any other error, using a fixed TTL
2278 // for failed entries from proc-based resolver. That said, the fixed TTL is 0,
2279 // so it should never be cached.
dalyk48b20a992019-02-25 16:10:262280 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result =
2281 GetCacheHit(HostCache::Key("single", DnsQueryType::UNSPECIFIED,
2282 0 /* host_resolver_flags */,
2283 HostResolverSource::ANY));
2284 EXPECT_FALSE(cache_result);
Eric Orth70992982018-07-24 00:25:002285
Eric Orth117e1992019-04-17 00:24:152286 ResolveHostResponseHelper multiple_response(resolver_->CreateRequest(
2287 HostPortPair("multiple", 80), NetLogWithSource(), base::nullopt,
2288 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:002289 EXPECT_THAT(multiple_response.result_error(),
2290 IsError(ERR_ICANN_NAME_COLLISION));
2291
2292 // Resolving an IP literal of 127.0.53.53 however is allowed.
2293 ResolveHostResponseHelper literal_response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272294 HostPortPair("127.0.53.53", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:152295 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:002296 EXPECT_THAT(literal_response.result_error(), IsOk());
2297
2298 // Moreover the address should not be recognized when embedded in an IPv6
2299 // address.
2300 ResolveHostResponseHelper ipv6_response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272301 HostPortPair("127.0.53.53", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:152302 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:002303 EXPECT_THAT(ipv6_response.result_error(), IsOk());
2304
2305 // Try some other IPs which are similar, but NOT an exact match on
2306 // 127.0.53.53.
2307 ResolveHostResponseHelper similar_response1(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272308 HostPortPair("not_reserved1", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:152309 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:002310 EXPECT_THAT(similar_response1.result_error(), IsOk());
2311
2312 ResolveHostResponseHelper similar_response2(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272313 HostPortPair("not_reserved2", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:152314 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:002315 EXPECT_THAT(similar_response2.result_error(), IsOk());
2316
2317 ResolveHostResponseHelper similar_response3(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272318 HostPortPair("not_reserved3", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:152319 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:002320 EXPECT_THAT(similar_response3.result_error(), IsOk());
2321}
2322
Eric Orth960e7062019-03-08 18:43:542323TEST_F(HostResolverManagerTest, IsIPv6Reachable) {
2324 // The real HostResolverManager is needed since TestHostResolverManager will
cbentzel1906f872015-06-05 16:25:252325 // bypass the IPv6 reachability tests.
Eric Orth37b18192019-04-22 19:09:282326 DestroyResolver();
2327 host_cache_ = nullptr;
2328 resolver_ = std::make_unique<HostResolverManager>(DefaultOptions(), nullptr);
cbentzel1906f872015-06-05 16:25:252329
sergeyub8cdc212015-05-14 18:50:372330 // Verify that two consecutive calls return the same value.
tfarina42834112016-09-22 13:38:202331 TestNetLog test_net_log;
2332 NetLogWithSource net_log =
2333 NetLogWithSource::Make(&test_net_log, NetLogSourceType::NONE);
2334 bool result1 = IsIPv6Reachable(net_log);
2335 bool result2 = IsIPv6Reachable(net_log);
sergeyub8cdc212015-05-14 18:50:372336 EXPECT_EQ(result1, result2);
2337
2338 // Filter reachability check events and verify that there are two of them.
Eric Roman79cc7552019-07-19 02:17:542339 auto probe_event_list = test_net_log.GetEntriesWithType(
2340 NetLogEventType::HOST_RESOLVER_IMPL_IPV6_REACHABILITY_CHECK);
sergeyub8cdc212015-05-14 18:50:372341 ASSERT_EQ(2U, probe_event_list.size());
2342
2343 // Verify that the first request was not cached and the second one was.
Eric Roman79cc7552019-07-19 02:17:542344 EXPECT_FALSE(GetBooleanValueFromParams(probe_event_list[0], "cached"));
2345 EXPECT_TRUE(GetBooleanValueFromParams(probe_event_list[1], "cached"));
sergeyub8cdc212015-05-14 18:50:372346}
2347
Eric Orth960e7062019-03-08 18:43:542348TEST_F(HostResolverManagerTest, IncludeCanonicalName) {
Eric Orth322af3e42018-08-20 18:12:592349 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42",
2350 HOST_RESOLVER_CANONNAME, "canon.name");
2351 proc_->SignalMultiple(2u);
2352
2353 HostResolver::ResolveHostParameters parameters;
2354 parameters.include_canonical_name = true;
2355 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272356 HostPortPair("just.testing", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:152357 request_context_.get(), host_cache_.get()));
Eric Orth322af3e42018-08-20 18:12:592358 ResolveHostResponseHelper response_no_flag(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272359 HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:152360 request_context_.get(), host_cache_.get()));
Eric Orth322af3e42018-08-20 18:12:592361
2362 EXPECT_THAT(response.result_error(), IsOk());
2363 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
2364 testing::ElementsAre(CreateExpected("192.168.1.42", 80)));
2365 EXPECT_EQ("canon.name",
2366 response.request()->GetAddressResults().value().canonical_name());
2367
2368 EXPECT_THAT(response_no_flag.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
2369}
2370
Eric Orth960e7062019-03-08 18:43:542371TEST_F(HostResolverManagerTest, LoopbackOnly) {
Eric Orth322af3e42018-08-20 18:12:592372 proc_->AddRuleForAllFamilies("otherlocal", "127.0.0.1",
2373 HOST_RESOLVER_LOOPBACK_ONLY);
2374 proc_->SignalMultiple(2u);
2375
2376 HostResolver::ResolveHostParameters parameters;
2377 parameters.loopback_only = true;
2378 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272379 HostPortPair("otherlocal", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:152380 request_context_.get(), host_cache_.get()));
Eric Orth322af3e42018-08-20 18:12:592381 ResolveHostResponseHelper response_no_flag(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272382 HostPortPair("otherlocal", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:152383 request_context_.get(), host_cache_.get()));
Eric Orth322af3e42018-08-20 18:12:592384
2385 EXPECT_THAT(response.result_error(), IsOk());
2386 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
2387 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
2388
2389 EXPECT_THAT(response_no_flag.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
2390}
2391
Eric Orth960e7062019-03-08 18:43:542392TEST_F(HostResolverManagerTest, IsSpeculative) {
Eric Orthb30bc172018-08-17 21:09:572393 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42");
2394 proc_->SignalMultiple(1u);
2395
2396 HostResolver::ResolveHostParameters parameters;
2397 parameters.is_speculative = true;
2398
2399 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272400 HostPortPair("just.testing", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:152401 request_context_.get(), host_cache_.get()));
Eric Orthb30bc172018-08-17 21:09:572402
2403 EXPECT_THAT(response.result_error(), IsOk());
2404 EXPECT_FALSE(response.request()->GetAddressResults());
2405
2406 ASSERT_EQ(1u, proc_->GetCaptureList().size());
2407 EXPECT_EQ("just.testing", proc_->GetCaptureList()[0].hostname);
2408
2409 // Reresolve without the |is_speculative| flag should immediately return from
2410 // cache.
2411 ResolveHostResponseHelper response2(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272412 HostPortPair("just.testing", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:152413 request_context_.get(), host_cache_.get()));
Eric Orthb30bc172018-08-17 21:09:572414
2415 EXPECT_THAT(response2.result_error(), IsOk());
2416 EXPECT_THAT(response2.request()->GetAddressResults().value().endpoints(),
2417 testing::ElementsAre(CreateExpected("192.168.1.42", 80)));
2418
2419 EXPECT_EQ("just.testing", proc_->GetCaptureList()[0].hostname);
2420 EXPECT_EQ(1u, proc_->GetCaptureList().size()); // No increase.
2421}
2422
Eric Orth9871aafa2018-10-02 19:59:182423#if BUILDFLAG(ENABLE_MDNS)
2424const uint8_t kMdnsResponseA[] = {
2425 // Header
2426 0x00, 0x00, // ID is zeroed out
2427 0x81, 0x80, // Standard query response, RA, no error
2428 0x00, 0x00, // No questions (for simplicity)
2429 0x00, 0x01, // 1 RR (answers)
2430 0x00, 0x00, // 0 authority RRs
2431 0x00, 0x00, // 0 additional RRs
2432
2433 // "myhello.local."
2434 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2435 0x00,
2436
2437 0x00, 0x01, // TYPE is A.
2438 0x00, 0x01, // CLASS is IN.
2439 0x00, 0x00, 0x00, 0x10, // TTL is 16 (seconds)
2440 0x00, 0x04, // RDLENGTH is 4 bytes.
2441 0x01, 0x02, 0x03, 0x04, // 1.2.3.4
2442};
2443
Eric Orth026776a2019-01-18 00:13:282444const uint8_t kMdnsResponseA2[] = {
2445 // Header
2446 0x00, 0x00, // ID is zeroed out
2447 0x81, 0x80, // Standard query response, RA, no error
2448 0x00, 0x00, // No questions (for simplicity)
2449 0x00, 0x01, // 1 RR (answers)
2450 0x00, 0x00, // 0 authority RRs
2451 0x00, 0x00, // 0 additional RRs
2452
2453 // "myhello.local."
2454 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2455 0x00,
2456
2457 0x00, 0x01, // TYPE is A.
2458 0x00, 0x01, // CLASS is IN.
2459 0x00, 0x00, 0x00, 0x10, // TTL is 16 (seconds)
2460 0x00, 0x04, // RDLENGTH is 4 bytes.
2461 0x05, 0x06, 0x07, 0x08, // 5.6.7.8
2462};
2463
2464const uint8_t kMdnsResponseA2Goodbye[] = {
2465 // Header
2466 0x00, 0x00, // ID is zeroed out
2467 0x81, 0x80, // Standard query response, RA, no error
2468 0x00, 0x00, // No questions (for simplicity)
2469 0x00, 0x01, // 1 RR (answers)
2470 0x00, 0x00, // 0 authority RRs
2471 0x00, 0x00, // 0 additional RRs
2472
2473 // "myhello.local."
2474 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2475 0x00,
2476
2477 0x00, 0x01, // TYPE is A.
2478 0x00, 0x01, // CLASS is IN.
2479 0x00, 0x00, 0x00, 0x00, // TTL is 0 (signaling "goodbye" removal of result)
2480 0x00, 0x04, // RDLENGTH is 4 bytes.
2481 0x05, 0x06, 0x07, 0x08, // 5.6.7.8
2482};
2483
Eric Orth9871aafa2018-10-02 19:59:182484const uint8_t kMdnsResponseAAAA[] = {
2485 // Header
2486 0x00, 0x00, // ID is zeroed out
2487 0x81, 0x80, // Standard query response, RA, no error
2488 0x00, 0x00, // No questions (for simplicity)
2489 0x00, 0x01, // 1 RR (answers)
2490 0x00, 0x00, // 0 authority RRs
2491 0x00, 0x00, // 0 additional RRs
2492
2493 // "myhello.local."
2494 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2495 0x00,
2496
2497 0x00, 0x1C, // TYPE is AAAA.
2498 0x00, 0x01, // CLASS is IN.
2499 0x00, 0x00, 0x00, 0x10, // TTL is 16 (seconds)
2500 0x00, 0x10, // RDLENGTH is 16 bytes.
2501
2502 // 000a:0000:0000:0000:0001:0002:0003:0004
2503 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02,
Eric Orth960e7062019-03-08 18:43:542504 0x00, 0x03, 0x00, 0x04};
Eric Orth9871aafa2018-10-02 19:59:182505
2506// An MDNS response indicating that the responder owns the hostname, but the
2507// specific requested type (AAAA) does not exist because the responder only has
2508// A addresses.
2509const uint8_t kMdnsResponseNsec[] = {
2510 // Header
2511 0x00, 0x00, // ID is zeroed out
2512 0x81, 0x80, // Standard query response, RA, no error
2513 0x00, 0x00, // No questions (for simplicity)
2514 0x00, 0x01, // 1 RR (answers)
2515 0x00, 0x00, // 0 authority RRs
2516 0x00, 0x00, // 0 additional RRs
2517
2518 // "myhello.local."
2519 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2520 0x00,
2521
2522 0x00, 0x2f, // TYPE is NSEC.
2523 0x00, 0x01, // CLASS is IN.
2524 0x00, 0x00, 0x00, 0x10, // TTL is 16 (seconds)
2525 0x00, 0x06, // RDLENGTH is 6 bytes.
2526 0xc0, 0x0c, // Next Domain Name (always pointer back to name in MDNS)
2527 0x00, // Bitmap block number (always 0 in MDNS)
2528 0x02, // Bitmap length is 2
2529 0x00, 0x08 // A type only
2530};
2531
Eric Orth828bd3ae2018-12-12 17:30:362532const uint8_t kMdnsResponseTxt[] = {
2533 // Header
2534 0x00, 0x00, // ID is zeroed out
2535 0x81, 0x80, // Standard query response, RA, no error
2536 0x00, 0x00, // No questions (for simplicity)
2537 0x00, 0x01, // 1 RR (answers)
2538 0x00, 0x00, // 0 authority RRs
2539 0x00, 0x00, // 0 additional RRs
2540
2541 // "myhello.local."
2542 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2543 0x00,
2544
2545 0x00, 0x10, // TYPE is TXT.
2546 0x00, 0x01, // CLASS is IN.
2547 0x00, 0x00, 0x00, 0x11, // TTL is 17 (seconds)
2548 0x00, 0x08, // RDLENGTH is 8 bytes.
2549
2550 // "foo"
2551 0x03, 0x66, 0x6f, 0x6f,
2552 // "bar"
Eric Orth960e7062019-03-08 18:43:542553 0x03, 0x62, 0x61, 0x72};
Eric Orth828bd3ae2018-12-12 17:30:362554
Eric Orthe9db8d232019-01-14 21:24:452555const uint8_t kMdnsResponsePtr[] = {
2556 // Header
2557 0x00, 0x00, // ID is zeroed out
2558 0x81, 0x80, // Standard query response, RA, no error
2559 0x00, 0x00, // No questions (for simplicity)
2560 0x00, 0x01, // 1 RR (answers)
2561 0x00, 0x00, // 0 authority RRs
2562 0x00, 0x00, // 0 additional RRs
2563
2564 // "myhello.local."
2565 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2566 0x00,
2567
2568 0x00, 0x0c, // TYPE is PTR.
2569 0x00, 0x01, // CLASS is IN.
2570 0x00, 0x00, 0x00, 0x12, // TTL is 18 (seconds)
2571 0x00, 0x09, // RDLENGTH is 9 bytes.
2572
2573 // "foo.com."
2574 0x03, 'f', 'o', 'o', 0x03, 'c', 'o', 'm', 0x00};
2575
Eric Orth026776a2019-01-18 00:13:282576const uint8_t kMdnsResponsePtrRoot[] = {
2577 // Header
2578 0x00, 0x00, // ID is zeroed out
2579 0x81, 0x80, // Standard query response, RA, no error
2580 0x00, 0x00, // No questions (for simplicity)
2581 0x00, 0x01, // 1 RR (answers)
2582 0x00, 0x00, // 0 authority RRs
2583 0x00, 0x00, // 0 additional RRs
2584
2585 // "myhello.local."
2586 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2587 0x00,
2588
2589 0x00, 0x0c, // TYPE is PTR.
2590 0x00, 0x01, // CLASS is IN.
2591 0x00, 0x00, 0x00, 0x13, // TTL is 19 (seconds)
2592 0x00, 0x01, // RDLENGTH is 1 byte.
2593
2594 // "." (the root domain)
2595 0x00};
2596
Eric Ortha625b042019-01-16 01:14:452597const uint8_t kMdnsResponseSrv[] = {
2598 // Header
2599 0x00, 0x00, // ID is zeroed out
2600 0x81, 0x80, // Standard query response, RA, no error
2601 0x00, 0x00, // No questions (for simplicity)
2602 0x00, 0x01, // 1 RR (answers)
2603 0x00, 0x00, // 0 authority RRs
2604 0x00, 0x00, // 0 additional RRs
2605
2606 // "myhello.local."
2607 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2608 0x00,
2609
2610 0x00, 0x21, // TYPE is SRV.
2611 0x00, 0x01, // CLASS is IN.
2612 0x00, 0x00, 0x00, 0x13, // TTL is 19 (seconds)
2613 0x00, 0x0f, // RDLENGTH is 15 bytes.
2614
2615 0x00, 0x05, // Priority 5
2616 0x00, 0x01, // Weight 1
2617 0x20, 0x49, // Port 8265
2618
2619 // "foo.com."
2620 0x03, 'f', 'o', 'o', 0x03, 'c', 'o', 'm', 0x00};
2621
Bailey Berroe70f06c2019-03-11 22:22:462622const uint8_t kMdnsResponseSrvUnrestricted[] = {
2623 // Header
2624 0x00, 0x00, // ID is zeroed out
2625 0x81, 0x80, // Standard query response, RA, no error
2626 0x00, 0x00, // No questions (for simplicity)
2627 0x00, 0x01, // 1 RR (answers)
2628 0x00, 0x00, // 0 authority RRs
2629 0x00, 0x00, // 0 additional RRs
2630
2631 // "foo bar(A1B2)._ipps._tcp.local"
2632 0x0d, 'f', 'o', 'o', ' ', 'b', 'a', 'r', '(', 'A', '1', 'B', '2', ')', 0x05,
2633 '_', 'i', 'p', 'p', 's', 0x04, '_', 't', 'c', 'p', 0x05, 'l', 'o', 'c', 'a',
2634 'l', 0x00,
2635
2636 0x00, 0x21, // TYPE is SRV.
2637 0x00, 0x01, // CLASS is IN.
2638 0x00, 0x00, 0x00, 0x13, // TTL is 19 (seconds)
2639 0x00, 0x0f, // RDLENGTH is 15 bytes.
2640
2641 0x00, 0x05, // Priority 5
2642 0x00, 0x01, // Weight 1
2643 0x20, 0x49, // Port 8265
2644
2645 // "foo.com."
2646 0x03, 'f', 'o', 'o', 0x03, 'c', 'o', 'm', 0x00};
2647
2648const uint8_t kMdnsResponseSrvUnrestrictedResult[] = {
2649 // Header
2650 0x00, 0x00, // ID is zeroed out
2651 0x81, 0x80, // Standard query response, RA, no error
2652 0x00, 0x00, // No questions (for simplicity)
2653 0x00, 0x01, // 1 RR (answers)
2654 0x00, 0x00, // 0 authority RRs
2655 0x00, 0x00, // 0 additional RRs
2656
2657 // "myhello.local."
2658 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2659 0x00,
2660
2661 0x00, 0x21, // TYPE is SRV.
2662 0x00, 0x01, // CLASS is IN.
2663 0x00, 0x00, 0x00, 0x13, // TTL is 19 (seconds)
2664 0x00, 0x15, // RDLENGTH is 21 bytes.
2665
2666 0x00, 0x05, // Priority 5
2667 0x00, 0x01, // Weight 1
2668 0x20, 0x49, // Port 8265
2669
2670 // "foo bar.local"
2671 0x07, 'f', 'o', 'o', ' ', 'b', 'a', 'r', 0x05, 'l', 'o', 'c', 'a', 'l',
2672 0x00};
2673
Eric Orth960e7062019-03-08 18:43:542674TEST_F(HostResolverManagerTest, Mdns) {
Eric Orth9871aafa2018-10-02 19:59:182675 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2676 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2677 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2678 // 2 socket creations for every transaction.
2679 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(4);
2680
2681 HostResolver::ResolveHostParameters parameters;
2682 parameters.source = HostResolverSource::MULTICAST_DNS;
2683
2684 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272685 HostPortPair("myhello.local", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:152686 request_context_.get(), host_cache_.get()));
Eric Orth9871aafa2018-10-02 19:59:182687
2688 socket_factory_ptr->SimulateReceive(kMdnsResponseA, sizeof(kMdnsResponseA));
2689 socket_factory_ptr->SimulateReceive(kMdnsResponseAAAA,
2690 sizeof(kMdnsResponseAAAA));
2691
2692 EXPECT_THAT(response.result_error(), IsOk());
2693 EXPECT_THAT(
2694 response.request()->GetAddressResults().value().endpoints(),
2695 testing::UnorderedElementsAre(
2696 CreateExpected("1.2.3.4", 80),
2697 CreateExpected("000a:0000:0000:0000:0001:0002:0003:0004", 80)));
Eric Orth828bd3ae2018-12-12 17:30:362698 EXPECT_FALSE(response.request()->GetTextResults());
2699 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth9871aafa2018-10-02 19:59:182700}
2701
Eric Orth960e7062019-03-08 18:43:542702TEST_F(HostResolverManagerTest, Mdns_AaaaOnly) {
Eric Orth9871aafa2018-10-02 19:59:182703 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2704 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2705 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2706 // 2 socket creations for every transaction.
2707 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(2);
2708
2709 HostResolver::ResolveHostParameters parameters;
Eric Orth192e3bb2018-11-14 19:30:322710 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth9871aafa2018-10-02 19:59:182711 parameters.source = HostResolverSource::MULTICAST_DNS;
2712
2713 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272714 HostPortPair("myhello.local", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:152715 request_context_.get(), host_cache_.get()));
Eric Orth9871aafa2018-10-02 19:59:182716
2717 socket_factory_ptr->SimulateReceive(kMdnsResponseAAAA,
2718 sizeof(kMdnsResponseAAAA));
2719
2720 EXPECT_THAT(response.result_error(), IsOk());
2721 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
2722 testing::ElementsAre(CreateExpected(
2723 "000a:0000:0000:0000:0001:0002:0003:0004", 80)));
2724}
2725
Eric Orth960e7062019-03-08 18:43:542726TEST_F(HostResolverManagerTest, Mdns_Txt) {
Eric Orth828bd3ae2018-12-12 17:30:362727 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2728 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2729 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2730 // 2 socket creations for every transaction.
2731 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(2);
2732
2733 HostResolver::ResolveHostParameters parameters;
2734 parameters.dns_query_type = DnsQueryType::TXT;
2735 parameters.source = HostResolverSource::MULTICAST_DNS;
2736
2737 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272738 HostPortPair("myhello.local", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:152739 request_context_.get(), host_cache_.get()));
Eric Orth828bd3ae2018-12-12 17:30:362740
2741 socket_factory_ptr->SimulateReceive(kMdnsResponseTxt,
2742 sizeof(kMdnsResponseTxt));
2743
2744 EXPECT_THAT(response.result_error(), IsOk());
2745 EXPECT_FALSE(response.request()->GetAddressResults());
2746 EXPECT_THAT(response.request()->GetTextResults(),
2747 testing::Optional(testing::ElementsAre("foo", "bar")));
2748 EXPECT_FALSE(response.request()->GetHostnameResults());
2749}
2750
Eric Orth960e7062019-03-08 18:43:542751TEST_F(HostResolverManagerTest, Mdns_Ptr) {
Eric Orthe9db8d232019-01-14 21:24:452752 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2753 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2754 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2755 // 2 socket creations for every transaction.
2756 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(2);
2757
2758 HostResolver::ResolveHostParameters parameters;
2759 parameters.dns_query_type = DnsQueryType::PTR;
2760 parameters.source = HostResolverSource::MULTICAST_DNS;
2761
2762 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272763 HostPortPair("myhello.local", 83), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:152764 request_context_.get(), host_cache_.get()));
Eric Orthe9db8d232019-01-14 21:24:452765
2766 socket_factory_ptr->SimulateReceive(kMdnsResponsePtr,
2767 sizeof(kMdnsResponsePtr));
2768
2769 EXPECT_THAT(response.result_error(), IsOk());
2770 EXPECT_FALSE(response.request()->GetAddressResults());
2771 EXPECT_FALSE(response.request()->GetTextResults());
2772 EXPECT_THAT(
2773 response.request()->GetHostnameResults(),
2774 testing::Optional(testing::ElementsAre(HostPortPair("foo.com", 83))));
2775}
2776
Eric Orth960e7062019-03-08 18:43:542777TEST_F(HostResolverManagerTest, Mdns_Srv) {
Eric Ortha625b042019-01-16 01:14:452778 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2779 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2780 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2781 // 2 socket creations for every transaction.
2782 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(2);
2783
2784 HostResolver::ResolveHostParameters parameters;
2785 parameters.dns_query_type = DnsQueryType::SRV;
2786 parameters.source = HostResolverSource::MULTICAST_DNS;
2787
2788 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272789 HostPortPair("myhello.local", 83), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:152790 request_context_.get(), host_cache_.get()));
Eric Ortha625b042019-01-16 01:14:452791
2792 socket_factory_ptr->SimulateReceive(kMdnsResponseSrv,
2793 sizeof(kMdnsResponseSrv));
2794
2795 EXPECT_THAT(response.result_error(), IsOk());
2796 EXPECT_FALSE(response.request()->GetAddressResults());
2797 EXPECT_FALSE(response.request()->GetTextResults());
2798 EXPECT_THAT(
2799 response.request()->GetHostnameResults(),
2800 testing::Optional(testing::ElementsAre(HostPortPair("foo.com", 8265))));
2801}
2802
Bailey Berroe70f06c2019-03-11 22:22:462803// Test that we are able to create multicast DNS requests that contain
2804// characters not permitted in the DNS spec such as spaces and parenthesis.
2805TEST_F(HostResolverManagerTest, Mdns_Srv_Unrestricted) {
2806 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2807 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2808 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2809
2810 HostResolver::ResolveHostParameters parameters;
2811 parameters.dns_query_type = DnsQueryType::SRV;
2812 parameters.source = HostResolverSource::MULTICAST_DNS;
2813
2814 ResolveHostResponseHelper response(resolver_->CreateRequest(
2815 HostPortPair("foo bar(A1B2)._ipps._tcp.local", 83), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:152816 parameters, request_context_.get(), host_cache_.get()));
Bailey Berroe70f06c2019-03-11 22:22:462817
2818 socket_factory_ptr->SimulateReceive(kMdnsResponseSrvUnrestricted,
2819 sizeof(kMdnsResponseSrvUnrestricted));
2820
2821 EXPECT_THAT(response.result_error(), IsOk());
2822 EXPECT_FALSE(response.request()->GetAddressResults());
2823 EXPECT_FALSE(response.request()->GetTextResults());
2824 EXPECT_THAT(
2825 response.request()->GetHostnameResults(),
2826 testing::Optional(testing::ElementsAre(HostPortPair("foo.com", 8265))));
2827}
2828
2829// Test that we are able to create multicast DNS requests that contain
2830// characters not permitted in the DNS spec such as spaces and parenthesis.
2831TEST_F(HostResolverManagerTest, Mdns_Srv_Result_Unrestricted) {
2832 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2833 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2834 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2835
2836 HostResolver::ResolveHostParameters parameters;
2837 parameters.dns_query_type = DnsQueryType::SRV;
2838 parameters.source = HostResolverSource::MULTICAST_DNS;
2839
2840 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272841 HostPortPair("myhello.local", 83), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:152842 request_context_.get(), host_cache_.get()));
Bailey Berroe70f06c2019-03-11 22:22:462843
2844 socket_factory_ptr->SimulateReceive(
2845 kMdnsResponseSrvUnrestrictedResult,
2846 sizeof(kMdnsResponseSrvUnrestrictedResult));
2847
2848 EXPECT_THAT(response.result_error(), IsOk());
2849 EXPECT_FALSE(response.request()->GetAddressResults());
2850 EXPECT_FALSE(response.request()->GetTextResults());
2851 EXPECT_THAT(response.request()->GetHostnameResults(),
2852 testing::Optional(
2853 testing::ElementsAre(HostPortPair("foo bar.local", 8265))));
2854}
2855
Eric Orth9871aafa2018-10-02 19:59:182856// Test multicast DNS handling of NSEC responses (used for explicit negative
2857// response).
Eric Orth960e7062019-03-08 18:43:542858TEST_F(HostResolverManagerTest, Mdns_Nsec) {
Eric Orth9871aafa2018-10-02 19:59:182859 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2860 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2861 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2862 // 2 socket creations for every transaction.
2863 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(2);
2864
2865 HostResolver::ResolveHostParameters parameters;
Eric Orth192e3bb2018-11-14 19:30:322866 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth9871aafa2018-10-02 19:59:182867 parameters.source = HostResolverSource::MULTICAST_DNS;
2868
2869 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272870 HostPortPair("myhello.local", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:152871 request_context_.get(), host_cache_.get()));
Eric Orth9871aafa2018-10-02 19:59:182872
2873 socket_factory_ptr->SimulateReceive(kMdnsResponseNsec,
2874 sizeof(kMdnsResponseNsec));
2875
2876 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
2877 EXPECT_FALSE(response.request()->GetAddressResults());
2878}
2879
Eric Orth960e7062019-03-08 18:43:542880TEST_F(HostResolverManagerTest, Mdns_NoResponse) {
Eric Orth9871aafa2018-10-02 19:59:182881 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2882 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2883 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2884 // 2 socket creations for every transaction.
2885 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(4);
2886
2887 // Add a little bit of extra fudge to the delay to allow reasonable
2888 // flexibility for time > vs >= etc. We don't need to fail the test if we
2889 // timeout at t=6001 instead of t=6000.
2890 base::TimeDelta kSleepFudgeFactor = base::TimeDelta::FromMilliseconds(1);
2891
2892 // Override the current thread task runner, so we can simulate the passage of
2893 // time to trigger the timeout.
2894 auto test_task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
2895 base::ScopedClosureRunner task_runner_override_scoped_cleanup =
2896 base::ThreadTaskRunnerHandle::OverrideForTesting(test_task_runner);
2897
2898 HostResolver::ResolveHostParameters parameters;
2899 parameters.source = HostResolverSource::MULTICAST_DNS;
2900
2901 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272902 HostPortPair("myhello.local", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:152903 request_context_.get(), host_cache_.get()));
Eric Orth9871aafa2018-10-02 19:59:182904
2905 ASSERT_TRUE(test_task_runner->HasPendingTask());
2906 test_task_runner->FastForwardBy(MDnsTransaction::kTransactionTimeout +
2907 kSleepFudgeFactor);
2908
2909 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
2910 EXPECT_FALSE(response.request()->GetAddressResults());
Eric Orth828bd3ae2018-12-12 17:30:362911 EXPECT_FALSE(response.request()->GetTextResults());
2912 EXPECT_FALSE(response.request()->GetHostnameResults());
2913
2914 test_task_runner->FastForwardUntilNoTasksRemain();
2915}
2916
Eric Orth960e7062019-03-08 18:43:542917TEST_F(HostResolverManagerTest, Mdns_WrongType) {
Eric Orth828bd3ae2018-12-12 17:30:362918 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2919 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2920 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2921 // 2 socket creations for every transaction.
2922 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(2);
2923
2924 // Add a little bit of extra fudge to the delay to allow reasonable
2925 // flexibility for time > vs >= etc. We don't need to fail the test if we
2926 // timeout at t=6001 instead of t=6000.
2927 base::TimeDelta kSleepFudgeFactor = base::TimeDelta::FromMilliseconds(1);
2928
2929 // Override the current thread task runner, so we can simulate the passage of
2930 // time to trigger the timeout.
2931 auto test_task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
2932 base::ScopedClosureRunner task_runner_override_scoped_cleanup =
2933 base::ThreadTaskRunnerHandle::OverrideForTesting(test_task_runner);
2934
2935 HostResolver::ResolveHostParameters parameters;
2936 parameters.dns_query_type = DnsQueryType::A;
2937 parameters.source = HostResolverSource::MULTICAST_DNS;
2938
2939 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272940 HostPortPair("myhello.local", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:152941 request_context_.get(), host_cache_.get()));
Eric Orth828bd3ae2018-12-12 17:30:362942
2943 // Not the requested type. Should be ignored.
2944 socket_factory_ptr->SimulateReceive(kMdnsResponseTxt,
2945 sizeof(kMdnsResponseTxt));
2946
2947 ASSERT_TRUE(test_task_runner->HasPendingTask());
2948 test_task_runner->FastForwardBy(MDnsTransaction::kTransactionTimeout +
2949 kSleepFudgeFactor);
2950
2951 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
2952 EXPECT_FALSE(response.request()->GetAddressResults());
2953 EXPECT_FALSE(response.request()->GetTextResults());
2954 EXPECT_FALSE(response.request()->GetHostnameResults());
Eric Orth9871aafa2018-10-02 19:59:182955
2956 test_task_runner->FastForwardUntilNoTasksRemain();
2957}
2958
2959// Test for a request for both A and AAAA results where results only exist for
2960// one type.
Eric Orth960e7062019-03-08 18:43:542961TEST_F(HostResolverManagerTest, Mdns_PartialResults) {
Eric Orth9871aafa2018-10-02 19:59:182962 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2963 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2964 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2965 // 2 socket creations for every transaction.
2966 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(4);
2967
2968 // Add a little bit of extra fudge to the delay to allow reasonable
2969 // flexibility for time > vs >= etc. We don't need to fail the test if we
2970 // timeout at t=6001 instead of t=6000.
2971 base::TimeDelta kSleepFudgeFactor = base::TimeDelta::FromMilliseconds(1);
2972
2973 // Override the current thread task runner, so we can simulate the passage of
2974 // time to trigger the timeout.
2975 auto test_task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
2976 base::ScopedClosureRunner task_runner_override_scoped_cleanup =
2977 base::ThreadTaskRunnerHandle::OverrideForTesting(test_task_runner);
2978
2979 HostResolver::ResolveHostParameters parameters;
2980 parameters.source = HostResolverSource::MULTICAST_DNS;
2981
2982 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:272983 HostPortPair("myhello.local", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:152984 request_context_.get(), host_cache_.get()));
Eric Orth9871aafa2018-10-02 19:59:182985
2986 ASSERT_TRUE(test_task_runner->HasPendingTask());
2987
2988 socket_factory_ptr->SimulateReceive(kMdnsResponseA, sizeof(kMdnsResponseA));
2989 test_task_runner->FastForwardBy(MDnsTransaction::kTransactionTimeout +
2990 kSleepFudgeFactor);
2991
2992 EXPECT_THAT(response.result_error(), IsOk());
2993 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
2994 testing::ElementsAre(CreateExpected("1.2.3.4", 80)));
2995
2996 test_task_runner->FastForwardUntilNoTasksRemain();
2997}
2998
Eric Orth960e7062019-03-08 18:43:542999TEST_F(HostResolverManagerTest, Mdns_Cancel) {
Eric Orth9871aafa2018-10-02 19:59:183000 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3001 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
3002 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
3003 // 2 socket creations for every transaction.
3004 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(4);
3005
3006 HostResolver::ResolveHostParameters parameters;
3007 parameters.source = HostResolverSource::MULTICAST_DNS;
3008
3009 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:273010 HostPortPair("myhello.local", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:153011 request_context_.get(), host_cache_.get()));
Eric Orth9871aafa2018-10-02 19:59:183012
3013 response.CancelRequest();
3014
3015 socket_factory_ptr->SimulateReceive(kMdnsResponseA, sizeof(kMdnsResponseA));
3016 socket_factory_ptr->SimulateReceive(kMdnsResponseAAAA,
3017 sizeof(kMdnsResponseAAAA));
3018
3019 base::RunLoop().RunUntilIdle();
3020 EXPECT_FALSE(response.complete());
3021}
3022
3023// Test for a two-transaction query where the first fails to start. The second
3024// should be cancelled.
Eric Orth960e7062019-03-08 18:43:543025TEST_F(HostResolverManagerTest, Mdns_PartialFailure) {
Eric Orth9871aafa2018-10-02 19:59:183026 // Setup a mock MDnsClient where the first transaction will always return
3027 // |false| immediately on Start(). Second transaction may or may not be
3028 // created, but if it is, Start() not expected to be called because the
3029 // overall request should immediately fail.
3030 auto transaction1 = std::make_unique<MockMDnsTransaction>();
3031 EXPECT_CALL(*transaction1, Start()).WillOnce(Return(false));
3032 auto transaction2 = std::make_unique<MockMDnsTransaction>();
3033 EXPECT_CALL(*transaction2, Start()).Times(0);
3034
3035 auto client = std::make_unique<MockMDnsClient>();
3036 EXPECT_CALL(*client, CreateTransaction(_, _, _, _))
3037 .Times(Between(1, 2)) // Second transaction optionally created.
3038 .WillOnce(Return(ByMove(std::move(transaction1))))
3039 .WillOnce(Return(ByMove(std::move(transaction2))));
3040 EXPECT_CALL(*client, IsListening()).WillRepeatedly(Return(true));
3041 resolver_->SetMdnsClientForTesting(std::move(client));
3042
3043 HostResolver::ResolveHostParameters parameters;
3044 parameters.source = HostResolverSource::MULTICAST_DNS;
3045
3046 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:273047 HostPortPair("myhello.local", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:153048 request_context_.get(), host_cache_.get()));
Eric Orth9871aafa2018-10-02 19:59:183049
3050 EXPECT_THAT(response.result_error(), IsError(ERR_FAILED));
3051 EXPECT_FALSE(response.request()->GetAddressResults());
3052}
Eric Orth026776a2019-01-18 00:13:283053
Eric Orthe857ebb2019-03-13 23:02:073054TEST_F(HostResolverManagerTest, Mdns_ListenFailure) {
3055 // Inject an MdnsClient mock that will always fail to start listening.
3056 auto client = std::make_unique<MockMDnsClient>();
3057 EXPECT_CALL(*client, StartListening(_)).WillOnce(Return(ERR_FAILED));
3058 EXPECT_CALL(*client, IsListening()).WillRepeatedly(Return(false));
3059 resolver_->SetMdnsClientForTesting(std::move(client));
3060
3061 HostResolver::ResolveHostParameters parameters;
3062 parameters.source = HostResolverSource::MULTICAST_DNS;
3063
3064 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:273065 HostPortPair("myhello.local", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:153066 request_context_.get(), host_cache_.get()));
Eric Orthe857ebb2019-03-13 23:02:073067
3068 EXPECT_THAT(response.result_error(), IsError(ERR_FAILED));
3069 EXPECT_FALSE(response.request()->GetAddressResults());
3070}
3071
Eric Orth026776a2019-01-18 00:13:283072// Implementation of HostResolver::MdnsListenerDelegate that records all
3073// received results in maps.
3074class TestMdnsListenerDelegate : public HostResolver::MdnsListener::Delegate {
3075 public:
3076 using UpdateKey =
3077 std::pair<HostResolver::MdnsListener::Delegate::UpdateType, DnsQueryType>;
3078
3079 void OnAddressResult(
3080 HostResolver::MdnsListener::Delegate::UpdateType update_type,
3081 DnsQueryType result_type,
3082 IPEndPoint address) override {
3083 address_results_.insert({{update_type, result_type}, std::move(address)});
3084 }
3085
3086 void OnTextResult(
3087 HostResolver::MdnsListener::Delegate::UpdateType update_type,
3088 DnsQueryType result_type,
3089 std::vector<std::string> text_records) override {
3090 for (auto& text_record : text_records) {
3091 text_results_.insert(
3092 {{update_type, result_type}, std::move(text_record)});
3093 }
3094 }
3095
3096 void OnHostnameResult(
3097 HostResolver::MdnsListener::Delegate::UpdateType update_type,
3098 DnsQueryType result_type,
3099 HostPortPair host) override {
3100 hostname_results_.insert({{update_type, result_type}, std::move(host)});
3101 }
3102
3103 void OnUnhandledResult(
3104 HostResolver::MdnsListener::Delegate::UpdateType update_type,
3105 DnsQueryType result_type) override {
3106 unhandled_results_.insert({update_type, result_type});
3107 }
3108
3109 const std::multimap<UpdateKey, IPEndPoint>& address_results() {
3110 return address_results_;
3111 }
3112
3113 const std::multimap<UpdateKey, std::string>& text_results() {
3114 return text_results_;
3115 }
3116
3117 const std::multimap<UpdateKey, HostPortPair>& hostname_results() {
3118 return hostname_results_;
3119 }
3120
3121 const std::multiset<UpdateKey>& unhandled_results() {
3122 return unhandled_results_;
3123 }
3124
3125 template <typename T>
3126 static std::pair<UpdateKey, T> CreateExpectedResult(
3127 HostResolver::MdnsListener::Delegate::UpdateType update_type,
3128 DnsQueryType query_type,
3129 T result) {
3130 return std::make_pair(std::make_pair(update_type, query_type), result);
3131 }
3132
3133 private:
3134 std::multimap<UpdateKey, IPEndPoint> address_results_;
3135 std::multimap<UpdateKey, std::string> text_results_;
3136 std::multimap<UpdateKey, HostPortPair> hostname_results_;
3137 std::multiset<UpdateKey> unhandled_results_;
3138};
3139
Eric Orth960e7062019-03-08 18:43:543140TEST_F(HostResolverManagerTest, MdnsListener) {
Eric Orth026776a2019-01-18 00:13:283141 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3142 base::SimpleTestClock clock;
3143 clock.SetNow(base::Time::Now());
3144 auto cache_cleanup_timer = std::make_unique<base::MockOneShotTimer>();
3145 auto* cache_cleanup_timer_ptr = cache_cleanup_timer.get();
3146 auto mdns_client =
3147 std::make_unique<MDnsClientImpl>(&clock, std::move(cache_cleanup_timer));
Eric Orthe857ebb2019-03-13 23:02:073148 ASSERT_THAT(mdns_client->StartListening(socket_factory.get()), IsOk());
Eric Orth026776a2019-01-18 00:13:283149 resolver_->SetMdnsClientForTesting(std::move(mdns_client));
3150
3151 std::unique_ptr<HostResolver::MdnsListener> listener =
3152 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 80),
3153 DnsQueryType::A);
3154
3155 TestMdnsListenerDelegate delegate;
3156 ASSERT_THAT(listener->Start(&delegate), IsOk());
3157 ASSERT_THAT(delegate.address_results(), testing::IsEmpty());
3158
3159 socket_factory->SimulateReceive(kMdnsResponseA, sizeof(kMdnsResponseA));
3160 socket_factory->SimulateReceive(kMdnsResponseA2, sizeof(kMdnsResponseA2));
3161 socket_factory->SimulateReceive(kMdnsResponseA2Goodbye,
3162 sizeof(kMdnsResponseA2Goodbye));
3163
3164 // Per RFC6762 section 10.1, removals take effect 1 second after receiving the
3165 // goodbye message.
3166 clock.Advance(base::TimeDelta::FromSeconds(1));
3167 cache_cleanup_timer_ptr->Fire();
3168
3169 // Expect 1 record adding "1.2.3.4", another changing to "5.6.7.8", and a
3170 // final removing "5.6.7.8".
3171 EXPECT_THAT(delegate.address_results(),
3172 testing::ElementsAre(
3173 TestMdnsListenerDelegate::CreateExpectedResult(
3174 HostResolver::MdnsListener::Delegate::UpdateType::ADDED,
3175 DnsQueryType::A, CreateExpected("1.2.3.4", 80)),
3176 TestMdnsListenerDelegate::CreateExpectedResult(
3177 HostResolver::MdnsListener::Delegate::UpdateType::CHANGED,
3178 DnsQueryType::A, CreateExpected("5.6.7.8", 80)),
3179 TestMdnsListenerDelegate::CreateExpectedResult(
3180 HostResolver::MdnsListener::Delegate::UpdateType::REMOVED,
3181 DnsQueryType::A, CreateExpected("5.6.7.8", 80))));
3182
3183 EXPECT_THAT(delegate.text_results(), testing::IsEmpty());
3184 EXPECT_THAT(delegate.hostname_results(), testing::IsEmpty());
3185 EXPECT_THAT(delegate.unhandled_results(), testing::IsEmpty());
3186}
3187
Eric Orthe857ebb2019-03-13 23:02:073188TEST_F(HostResolverManagerTest, MdnsListener_StartListenFailure) {
3189 // Inject an MdnsClient mock that will always fail to start listening.
3190 auto client = std::make_unique<MockMDnsClient>();
3191 EXPECT_CALL(*client, StartListening(_)).WillOnce(Return(ERR_TIMED_OUT));
3192 EXPECT_CALL(*client, IsListening()).WillRepeatedly(Return(false));
3193 resolver_->SetMdnsClientForTesting(std::move(client));
3194
3195 std::unique_ptr<HostResolver::MdnsListener> listener =
3196 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 80),
3197 DnsQueryType::A);
3198 TestMdnsListenerDelegate delegate;
3199 EXPECT_THAT(listener->Start(&delegate), IsError(ERR_TIMED_OUT));
3200 EXPECT_THAT(delegate.address_results(), testing::IsEmpty());
3201}
3202
Eric Orth026776a2019-01-18 00:13:283203// Test that removal notifications are sent on natural expiration of MDNS
3204// records.
Eric Orth960e7062019-03-08 18:43:543205TEST_F(HostResolverManagerTest, MdnsListener_Expiration) {
Eric Orth026776a2019-01-18 00:13:283206 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3207 base::SimpleTestClock clock;
3208 clock.SetNow(base::Time::Now());
3209 auto cache_cleanup_timer = std::make_unique<base::MockOneShotTimer>();
3210 auto* cache_cleanup_timer_ptr = cache_cleanup_timer.get();
3211 auto mdns_client =
3212 std::make_unique<MDnsClientImpl>(&clock, std::move(cache_cleanup_timer));
Eric Orthe857ebb2019-03-13 23:02:073213 ASSERT_THAT(mdns_client->StartListening(socket_factory.get()), IsOk());
Eric Orth026776a2019-01-18 00:13:283214 resolver_->SetMdnsClientForTesting(std::move(mdns_client));
3215
3216 std::unique_ptr<HostResolver::MdnsListener> listener =
3217 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 100),
3218 DnsQueryType::A);
3219
3220 TestMdnsListenerDelegate delegate;
3221 ASSERT_THAT(listener->Start(&delegate), IsOk());
3222 ASSERT_THAT(delegate.address_results(), testing::IsEmpty());
3223
3224 socket_factory->SimulateReceive(kMdnsResponseA, sizeof(kMdnsResponseA));
3225
3226 EXPECT_THAT(
3227 delegate.address_results(),
3228 testing::ElementsAre(TestMdnsListenerDelegate::CreateExpectedResult(
3229 HostResolver::MdnsListener::Delegate::UpdateType::ADDED,
3230 DnsQueryType::A, CreateExpected("1.2.3.4", 100))));
3231
3232 clock.Advance(base::TimeDelta::FromSeconds(16));
3233 cache_cleanup_timer_ptr->Fire();
3234
3235 EXPECT_THAT(delegate.address_results(),
3236 testing::ElementsAre(
3237 TestMdnsListenerDelegate::CreateExpectedResult(
3238 HostResolver::MdnsListener::Delegate::UpdateType::ADDED,
3239 DnsQueryType::A, CreateExpected("1.2.3.4", 100)),
3240 TestMdnsListenerDelegate::CreateExpectedResult(
3241 HostResolver::MdnsListener::Delegate::UpdateType::REMOVED,
3242 DnsQueryType::A, CreateExpected("1.2.3.4", 100))));
3243
3244 EXPECT_THAT(delegate.text_results(), testing::IsEmpty());
3245 EXPECT_THAT(delegate.hostname_results(), testing::IsEmpty());
3246 EXPECT_THAT(delegate.unhandled_results(), testing::IsEmpty());
3247}
3248
Eric Orth960e7062019-03-08 18:43:543249TEST_F(HostResolverManagerTest, MdnsListener_Txt) {
Eric Orth026776a2019-01-18 00:13:283250 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3251 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
3252 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
3253
3254 std::unique_ptr<HostResolver::MdnsListener> listener =
3255 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 12),
3256 DnsQueryType::TXT);
3257
3258 TestMdnsListenerDelegate delegate;
3259 ASSERT_THAT(listener->Start(&delegate), IsOk());
3260 ASSERT_THAT(delegate.text_results(), testing::IsEmpty());
3261
3262 socket_factory_ptr->SimulateReceive(kMdnsResponseTxt,
3263 sizeof(kMdnsResponseTxt));
3264
3265 EXPECT_THAT(delegate.text_results(),
3266 testing::ElementsAre(
3267 TestMdnsListenerDelegate::CreateExpectedResult(
3268 HostResolver::MdnsListener::Delegate::UpdateType::ADDED,
3269 DnsQueryType::TXT, "foo"),
3270 TestMdnsListenerDelegate::CreateExpectedResult(
3271 HostResolver::MdnsListener::Delegate::UpdateType::ADDED,
3272 DnsQueryType::TXT, "bar")));
3273
3274 EXPECT_THAT(delegate.address_results(), testing::IsEmpty());
3275 EXPECT_THAT(delegate.hostname_results(), testing::IsEmpty());
3276 EXPECT_THAT(delegate.unhandled_results(), testing::IsEmpty());
3277}
3278
Eric Orth960e7062019-03-08 18:43:543279TEST_F(HostResolverManagerTest, MdnsListener_Ptr) {
Eric Orth026776a2019-01-18 00:13:283280 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3281 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
3282 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
3283
3284 std::unique_ptr<HostResolver::MdnsListener> listener =
3285 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 13),
3286 DnsQueryType::PTR);
3287
3288 TestMdnsListenerDelegate delegate;
3289 ASSERT_THAT(listener->Start(&delegate), IsOk());
3290 ASSERT_THAT(delegate.text_results(), testing::IsEmpty());
3291
3292 socket_factory_ptr->SimulateReceive(kMdnsResponsePtr,
3293 sizeof(kMdnsResponsePtr));
3294
3295 EXPECT_THAT(
3296 delegate.hostname_results(),
3297 testing::ElementsAre(TestMdnsListenerDelegate::CreateExpectedResult(
3298 HostResolver::MdnsListener::Delegate::UpdateType::ADDED,
3299 DnsQueryType::PTR, HostPortPair("foo.com", 13))));
3300
3301 EXPECT_THAT(delegate.address_results(), testing::IsEmpty());
3302 EXPECT_THAT(delegate.text_results(), testing::IsEmpty());
3303 EXPECT_THAT(delegate.unhandled_results(), testing::IsEmpty());
3304}
3305
Eric Orth960e7062019-03-08 18:43:543306TEST_F(HostResolverManagerTest, MdnsListener_Srv) {
Eric Orth026776a2019-01-18 00:13:283307 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3308 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
3309 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
3310
3311 std::unique_ptr<HostResolver::MdnsListener> listener =
3312 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 14),
3313 DnsQueryType::SRV);
3314
3315 TestMdnsListenerDelegate delegate;
3316 ASSERT_THAT(listener->Start(&delegate), IsOk());
3317 ASSERT_THAT(delegate.text_results(), testing::IsEmpty());
3318
3319 socket_factory_ptr->SimulateReceive(kMdnsResponseSrv,
3320 sizeof(kMdnsResponseSrv));
3321
3322 EXPECT_THAT(
3323 delegate.hostname_results(),
3324 testing::ElementsAre(TestMdnsListenerDelegate::CreateExpectedResult(
3325 HostResolver::MdnsListener::Delegate::UpdateType::ADDED,
3326 DnsQueryType::SRV, HostPortPair("foo.com", 8265))));
3327
3328 EXPECT_THAT(delegate.address_results(), testing::IsEmpty());
3329 EXPECT_THAT(delegate.text_results(), testing::IsEmpty());
3330 EXPECT_THAT(delegate.unhandled_results(), testing::IsEmpty());
3331}
3332
3333// Ensure query types we are not listening for do not affect MdnsListener.
Eric Orth960e7062019-03-08 18:43:543334TEST_F(HostResolverManagerTest, MdnsListener_NonListeningTypes) {
Eric Orth026776a2019-01-18 00:13:283335 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3336 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
3337 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
3338
3339 std::unique_ptr<HostResolver::MdnsListener> listener =
3340 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 41),
3341 DnsQueryType::A);
3342
3343 TestMdnsListenerDelegate delegate;
3344 ASSERT_THAT(listener->Start(&delegate), IsOk());
3345
3346 socket_factory_ptr->SimulateReceive(kMdnsResponseAAAA,
3347 sizeof(kMdnsResponseAAAA));
3348
3349 EXPECT_THAT(delegate.address_results(), testing::IsEmpty());
3350 EXPECT_THAT(delegate.text_results(), testing::IsEmpty());
3351 EXPECT_THAT(delegate.hostname_results(), testing::IsEmpty());
3352 EXPECT_THAT(delegate.unhandled_results(), testing::IsEmpty());
3353}
3354
Eric Orth960e7062019-03-08 18:43:543355TEST_F(HostResolverManagerTest, MdnsListener_RootDomain) {
Eric Orth026776a2019-01-18 00:13:283356 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3357 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
3358 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
3359
3360 std::unique_ptr<HostResolver::MdnsListener> listener =
3361 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 5),
3362 DnsQueryType::PTR);
3363
3364 TestMdnsListenerDelegate delegate;
3365 ASSERT_THAT(listener->Start(&delegate), IsOk());
3366
3367 socket_factory_ptr->SimulateReceive(kMdnsResponsePtrRoot,
3368 sizeof(kMdnsResponsePtrRoot));
3369
3370 EXPECT_THAT(delegate.unhandled_results(),
3371 testing::ElementsAre(std::make_pair(
3372 HostResolver::MdnsListener::Delegate::UpdateType::ADDED,
3373 DnsQueryType::PTR)));
3374
3375 EXPECT_THAT(delegate.address_results(), testing::IsEmpty());
3376 EXPECT_THAT(delegate.text_results(), testing::IsEmpty());
3377 EXPECT_THAT(delegate.hostname_results(), testing::IsEmpty());
3378}
Eric Orth9871aafa2018-10-02 19:59:183379#endif // BUILDFLAG(ENABLE_MDNS)
3380
[email protected]78eac2a2012-03-14 19:09:273381DnsConfig CreateValidDnsConfig() {
martijna23c8962016-03-04 18:18:513382 IPAddress dns_ip(192, 168, 1, 0);
[email protected]78eac2a2012-03-14 19:09:273383 DnsConfig config;
[email protected]38b50d92012-04-19 21:07:523384 config.nameservers.push_back(IPEndPoint(dns_ip, dns_protocol::kDefaultPort));
dalyk4f4ac712019-05-31 16:33:133385 config.dns_over_https_servers.push_back({DnsConfig::DnsOverHttpsServerConfig(
3386 "https://dns.example.com/", true /* use_post */)});
3387 config.secure_dns_mode = DnsConfig::SecureDnsMode::OFF;
[email protected]78eac2a2012-03-14 19:09:273388 EXPECT_TRUE(config.IsValid());
3389 return config;
3390}
3391
[email protected]1d932852012-06-19 19:40:333392// Specialized fixture for tests of DnsTask.
Eric Orth960e7062019-03-08 18:43:543393class HostResolverManagerDnsTest : public HostResolverManagerTest {
[email protected]daae1322013-09-05 18:26:503394 public:
Raul Tambre94493c652019-03-11 17:18:353395 HostResolverManagerDnsTest() : dns_client_(nullptr) {}
[email protected]daae1322013-09-05 18:26:503396
[email protected]1d932852012-06-19 19:40:333397 protected:
Miriam Gershenson17acdf092017-08-23 19:43:083398 void TearDown() override {
Eric Orth960e7062019-03-08 18:43:543399 HostResolverManagerTest::TearDown();
Miriam Gershenson17acdf092017-08-23 19:43:083400 ChangeDnsConfig(DnsConfig());
3401 }
3402
Eric Orth960e7062019-03-08 18:43:543403 // HostResolverManagerTest implementation:
Eric Orth4e55b362019-05-07 22:00:033404 HostResolver::ManagerOptions DefaultOptions() override {
3405 HostResolver::ManagerOptions options =
3406 HostResolverManagerTest::DefaultOptions();
dalykc27699a2019-07-29 20:53:293407 options.insecure_dns_client_enabled = true;
Eric Orth4e55b362019-05-07 22:00:033408 return options;
3409 }
3410
Eric Orth4e55b362019-05-07 22:00:033411 void CreateResolverWithOptionsAndParams(HostResolver::ManagerOptions options,
3412 const ProcTaskParams& params,
3413 bool ipv6_reachable) override {
Eric Orth37b18192019-04-22 19:09:283414 DestroyResolver();
3415
Eric Orth4e55b362019-05-07 22:00:033416 resolver_ = std::make_unique<TestHostResolverManager>(
dalykc27699a2019-07-29 20:53:293417 options, nullptr /* net_log */, ipv6_reachable);
3418 auto dns_client =
3419 std::make_unique<MockDnsClient>(DnsConfig(), CreateDefaultDnsRules());
3420 dns_client_ = dns_client.get();
3421 resolver_->SetDnsClientForTesting(std::move(dns_client));
[email protected]106ccd2c2014-06-17 09:21:003422 resolver_->set_proc_params_for_test(params);
Eric Orth37b18192019-04-22 19:09:283423
3424 if (host_cache_)
3425 resolver_->AddHostCacheInvalidator(host_cache_->invalidator());
[email protected]1d932852012-06-19 19:40:333426 }
3427
Eric Orth828bd3ae2018-12-12 17:30:363428 // Call after CreateResolver() to update the resolver with a new MockDnsClient
3429 // using |config| and |rules|.
3430 void UseMockDnsClient(const DnsConfig& config, MockDnsClientRuleList rules) {
3431 // HostResolver expects DnsConfig to get set after setting DnsClient, so
3432 // create first with an empty config and then update the config.
3433 auto dns_client =
3434 std::make_unique<MockDnsClient>(DnsConfig(), std::move(rules));
3435 dns_client_ = dns_client.get();
Eric Orth4e55b362019-05-07 22:00:033436 resolver_->SetDnsClientForTesting(std::move(dns_client));
dalykc27699a2019-07-29 20:53:293437 resolver_->SetInsecureDnsClientEnabled(true);
Eric Orth828bd3ae2018-12-12 17:30:363438 if (!config.Equals(DnsConfig()))
3439 ChangeDnsConfig(config);
eroman1efc237c2016-12-14 00:00:453440 }
3441
Eric Orth828bd3ae2018-12-12 17:30:363442 static MockDnsClientRuleList CreateDefaultDnsRules() {
3443 MockDnsClientRuleList rules;
3444
3445 AddDnsRule(&rules, "nodomain", dns_protocol::kTypeA,
dalyk48b20a992019-02-25 16:10:263446 MockDnsClientRule::NODOMAIN, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363447 AddDnsRule(&rules, "nodomain", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:263448 MockDnsClientRule::NODOMAIN, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363449 AddDnsRule(&rules, "nx", dns_protocol::kTypeA, MockDnsClientRule::FAIL,
dalyk48b20a992019-02-25 16:10:263450 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363451 AddDnsRule(&rules, "nx", dns_protocol::kTypeAAAA, MockDnsClientRule::FAIL,
dalyk48b20a992019-02-25 16:10:263452 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363453 AddDnsRule(&rules, "ok", dns_protocol::kTypeA, MockDnsClientRule::OK,
dalyk48b20a992019-02-25 16:10:263454 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363455 AddDnsRule(&rules, "ok", dns_protocol::kTypeAAAA, MockDnsClientRule::OK,
dalyk48b20a992019-02-25 16:10:263456 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363457 AddDnsRule(&rules, "4ok", dns_protocol::kTypeA, MockDnsClientRule::OK,
dalyk48b20a992019-02-25 16:10:263458 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363459 AddDnsRule(&rules, "4ok", dns_protocol::kTypeAAAA, MockDnsClientRule::EMPTY,
dalyk48b20a992019-02-25 16:10:263460 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363461 AddDnsRule(&rules, "6ok", dns_protocol::kTypeA, MockDnsClientRule::EMPTY,
dalyk48b20a992019-02-25 16:10:263462 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363463 AddDnsRule(&rules, "6ok", dns_protocol::kTypeAAAA, MockDnsClientRule::OK,
dalyk48b20a992019-02-25 16:10:263464 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363465 AddDnsRule(&rules, "4nx", dns_protocol::kTypeA, MockDnsClientRule::OK,
dalyk48b20a992019-02-25 16:10:263466 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363467 AddDnsRule(&rules, "4nx", dns_protocol::kTypeAAAA, MockDnsClientRule::FAIL,
dalyk48b20a992019-02-25 16:10:263468 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363469 AddDnsRule(&rules, "empty", dns_protocol::kTypeA, MockDnsClientRule::EMPTY,
dalyk48b20a992019-02-25 16:10:263470 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363471 AddDnsRule(&rules, "empty", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:263472 MockDnsClientRule::EMPTY, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363473
3474 AddDnsRule(&rules, "slow_nx", dns_protocol::kTypeA, MockDnsClientRule::FAIL,
dalyk48b20a992019-02-25 16:10:263475 true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363476 AddDnsRule(&rules, "slow_nx", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:263477 MockDnsClientRule::FAIL, true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363478
3479 AddDnsRule(&rules, "4slow_ok", dns_protocol::kTypeA, MockDnsClientRule::OK,
dalyk48b20a992019-02-25 16:10:263480 true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363481 AddDnsRule(&rules, "4slow_ok", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:263482 MockDnsClientRule::OK, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363483 AddDnsRule(&rules, "6slow_ok", dns_protocol::kTypeA, MockDnsClientRule::OK,
dalyk48b20a992019-02-25 16:10:263484 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363485 AddDnsRule(&rules, "6slow_ok", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:263486 MockDnsClientRule::OK, true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363487 AddDnsRule(&rules, "4slow_4ok", dns_protocol::kTypeA, MockDnsClientRule::OK,
dalyk48b20a992019-02-25 16:10:263488 true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363489 AddDnsRule(&rules, "4slow_4ok", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:263490 MockDnsClientRule::EMPTY, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363491 AddDnsRule(&rules, "4slow_4timeout", dns_protocol::kTypeA,
dalyk48b20a992019-02-25 16:10:263492 MockDnsClientRule::TIMEOUT, true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363493 AddDnsRule(&rules, "4slow_4timeout", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:263494 MockDnsClientRule::OK, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363495 AddDnsRule(&rules, "4slow_6timeout", dns_protocol::kTypeA,
dalyk48b20a992019-02-25 16:10:263496 MockDnsClientRule::OK, true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363497 AddDnsRule(&rules, "4slow_6timeout", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:263498 MockDnsClientRule::TIMEOUT, false /* delay */);
3499
Eric Orth828bd3ae2018-12-12 17:30:363500 AddDnsRule(&rules, "4collision", dns_protocol::kTypeA,
dalyk48b20a992019-02-25 16:10:263501 IPAddress(127, 0, 53, 53), false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363502 AddDnsRule(&rules, "4collision", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:263503 MockDnsClientRule::EMPTY, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363504 AddDnsRule(&rules, "6collision", dns_protocol::kTypeA,
dalyk48b20a992019-02-25 16:10:263505 MockDnsClientRule::EMPTY, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363506 // This isn't the expected IP for collisions (but looks close to it).
3507 AddDnsRule(&rules, "6collision", dns_protocol::kTypeAAAA,
3508 IPAddress(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 0, 53, 53),
dalyk48b20a992019-02-25 16:10:263509 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363510
dalyk4f4ac712019-05-31 16:33:133511 AddSecureDnsRule(&rules, "automatic_nodomain", dns_protocol::kTypeA,
3512 MockDnsClientRule::NODOMAIN, false /* delay */);
3513 AddSecureDnsRule(&rules, "automatic_nodomain", dns_protocol::kTypeAAAA,
3514 MockDnsClientRule::NODOMAIN, false /* delay */);
3515 AddDnsRule(&rules, "automatic_nodomain", dns_protocol::kTypeA,
3516 MockDnsClientRule::NODOMAIN, false /* delay */);
3517 AddDnsRule(&rules, "automatic_nodomain", dns_protocol::kTypeAAAA,
3518 MockDnsClientRule::NODOMAIN, false /* delay */);
3519 AddSecureDnsRule(&rules, "automatic", dns_protocol::kTypeA,
3520 MockDnsClientRule::OK, false /* delay */);
3521 AddSecureDnsRule(&rules, "automatic", dns_protocol::kTypeAAAA,
3522 MockDnsClientRule::OK, false /* delay */);
3523 AddDnsRule(&rules, "automatic", dns_protocol::kTypeA, MockDnsClientRule::OK,
3524 false /* delay */);
3525 AddDnsRule(&rules, "automatic", dns_protocol::kTypeAAAA,
3526 MockDnsClientRule::OK, false /* delay */);
3527 AddDnsRule(&rules, "insecure_automatic", dns_protocol::kTypeA,
3528 MockDnsClientRule::OK, false /* delay */);
3529 AddDnsRule(&rules, "insecure_automatic", dns_protocol::kTypeAAAA,
3530 MockDnsClientRule::OK, false /* delay */);
3531
dalykc27699a2019-07-29 20:53:293532 AddSecureDnsRule(&rules, "secure", dns_protocol::kTypeA,
3533 MockDnsClientRule::OK, false /* delay */);
3534 AddSecureDnsRule(&rules, "secure", dns_protocol::kTypeAAAA,
3535 MockDnsClientRule::OK, false /* delay */);
3536
Eric Orth828bd3ae2018-12-12 17:30:363537 return rules;
eroman1efc237c2016-12-14 00:00:453538 }
3539
Eric Orth828bd3ae2018-12-12 17:30:363540 // Adds a rule to |rules|.
3541 static void AddDnsRule(MockDnsClientRuleList* rules,
3542 const std::string& prefix,
3543 uint16_t qtype,
3544 MockDnsClientRule::ResultType result_type,
3545 bool delay) {
dalyk4f4ac712019-05-31 16:33:133546 rules->emplace_back(prefix, qtype, false /* secure */,
dalykad3f6c32019-03-06 13:38:333547 MockDnsClientRule::Result(result_type), delay);
Eric Orth828bd3ae2018-12-12 17:30:363548 }
3549
3550 static void AddDnsRule(MockDnsClientRuleList* rules,
3551 const std::string& prefix,
3552 uint16_t qtype,
3553 const IPAddress& result_ip,
3554 bool delay) {
dalyk4f4ac712019-05-31 16:33:133555 rules->emplace_back(prefix, qtype, false /* secure */,
Eric Orth828bd3ae2018-12-12 17:30:363556 MockDnsClientRule::Result(
3557 BuildTestDnsResponse(prefix, std::move(result_ip))),
3558 delay);
3559 }
3560
3561 static void AddDnsRule(MockDnsClientRuleList* rules,
3562 const std::string& prefix,
3563 uint16_t qtype,
3564 IPAddress result_ip,
3565 std::string cannonname,
3566 bool delay) {
3567 rules->emplace_back(
dalyk4f4ac712019-05-31 16:33:133568 prefix, qtype, false /* secure */,
dalykc0ab0722019-03-14 17:00:583569 MockDnsClientRule::Result(BuildTestDnsResponseWithCname(
Eric Orth828bd3ae2018-12-12 17:30:363570 prefix, std::move(result_ip), std::move(cannonname))),
3571 delay);
[email protected]0adcb2b2012-08-15 21:30:463572 }
3573
dalyk48b20a992019-02-25 16:10:263574 static void AddSecureDnsRule(MockDnsClientRuleList* rules,
3575 const std::string& prefix,
3576 uint16_t qtype,
3577 MockDnsClientRule::ResultType result_type,
3578 bool delay) {
dalyk4f4ac712019-05-31 16:33:133579 rules->emplace_back(prefix, qtype, true /* secure */,
3580 MockDnsClientRule::Result(result_type), delay);
dalyk48b20a992019-02-25 16:10:263581 }
3582
[email protected]1d932852012-06-19 19:40:333583 void ChangeDnsConfig(const DnsConfig& config) {
Eric Orthc398f1e2019-07-09 21:54:553584 NetworkChangeNotifier::SetDnsConfigForTesting(config);
[email protected]bb0e34542012-08-31 19:52:403585 // Notification is delivered asynchronously.
fdoray5eeb7642016-06-22 16:11:283586 base::RunLoop().RunUntilIdle();
[email protected]1d932852012-06-19 19:40:333587 }
3588
Miriam Gershenson44aafc122017-10-18 19:29:253589 void SetInitialDnsConfig(const DnsConfig& config) {
John Abd-El-Malek1842b8c2018-05-16 14:53:223590 NetworkChangeNotifier::ClearDnsConfigForTesting();
Eric Orthc398f1e2019-07-09 21:54:553591 NetworkChangeNotifier::SetDnsConfigForTesting(config);
Miriam Gershenson44aafc122017-10-18 19:29:253592 // Notification is delivered asynchronously.
3593 base::RunLoop().RunUntilIdle();
3594 }
3595
[email protected]daae1322013-09-05 18:26:503596 // Owned by |resolver_|.
3597 MockDnsClient* dns_client_;
[email protected]1d932852012-06-19 19:40:333598};
3599
dalykc27699a2019-07-29 20:53:293600TEST_F(HostResolverManagerDnsTest, DisableAndEnableInsecureDnsClient) {
Eric Orth4e55b362019-05-07 22:00:033601 // Disable fallback to allow testing how requests are initially handled.
3602 set_allow_fallback_to_proctask(false);
3603
3604 ChangeDnsConfig(CreateValidDnsConfig());
3605 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.2.47");
3606 proc_->SignalMultiple(1u);
3607
dalykc27699a2019-07-29 20:53:293608 resolver_->SetInsecureDnsClientEnabled(false);
Eric Orth4e55b362019-05-07 22:00:033609 ResolveHostResponseHelper response_proc(resolver_->CreateRequest(
3610 HostPortPair("nx_succeed", 1212), NetLogWithSource(), base::nullopt,
3611 request_context_.get(), host_cache_.get()));
3612 EXPECT_THAT(response_proc.result_error(), IsOk());
3613 EXPECT_THAT(response_proc.request()->GetAddressResults().value().endpoints(),
3614 testing::ElementsAre(CreateExpected("192.168.2.47", 1212)));
3615
dalykc27699a2019-07-29 20:53:293616 resolver_->SetInsecureDnsClientEnabled(true);
Eric Orth4e55b362019-05-07 22:00:033617 ResolveHostResponseHelper response_dns_client(resolver_->CreateRequest(
3618 HostPortPair("ok_fail", 1212), NetLogWithSource(), base::nullopt,
3619 request_context_.get(), host_cache_.get()));
3620 EXPECT_THAT(response_dns_client.result_error(), IsOk());
3621 EXPECT_THAT(
3622 response_dns_client.request()->GetAddressResults().value().endpoints(),
3623 testing::UnorderedElementsAre(CreateExpected("::1", 1212),
3624 CreateExpected("127.0.0.1", 1212)));
3625}
3626
dalyk6d7d8ead2019-08-15 03:30:083627TEST_F(HostResolverManagerDnsTest, UseProcTaskWhenPrivateDnsActive) {
3628 // Disable fallback to allow testing how requests are initially handled.
3629 set_allow_fallback_to_proctask(false);
3630 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.2.47");
3631 proc_->SignalMultiple(1u);
3632
3633 DnsConfig config = CreateValidDnsConfig();
3634 config.dns_over_tls_active = true;
3635 ChangeDnsConfig(config);
3636 ResolveHostResponseHelper response_proc(resolver_->CreateRequest(
3637 HostPortPair("nx_succeed", 1212), NetLogWithSource(), base::nullopt,
3638 request_context_.get(), host_cache_.get()));
3639 EXPECT_THAT(response_proc.result_error(), IsOk());
3640 EXPECT_THAT(response_proc.request()->GetAddressResults().value().endpoints(),
3641 testing::ElementsAre(CreateExpected("192.168.2.47", 1212)));
3642}
3643
Mike Westda1c690e2017-08-12 05:57:163644// RFC 6761 localhost names should always resolve to loopback.
Eric Orth960e7062019-03-08 18:43:543645TEST_F(HostResolverManagerDnsTest, LocalhostLookup) {
Mike Westda1c690e2017-08-12 05:57:163646 // Add a rule resolving localhost names to a non-loopback IP and test
3647 // that they still resolves to loopback.
3648 proc_->AddRuleForAllFamilies("foo.localhost", "192.168.1.42");
3649 proc_->AddRuleForAllFamilies("localhost", "192.168.1.42");
3650 proc_->AddRuleForAllFamilies("localhost.", "192.168.1.42");
3651
Eric Orth70992982018-07-24 00:25:003652 ResolveHostResponseHelper response0(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:273653 HostPortPair("foo.localhost", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:153654 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:003655 EXPECT_THAT(response0.result_error(), IsOk());
3656 EXPECT_THAT(response0.request()->GetAddressResults().value().endpoints(),
3657 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
3658 CreateExpected("::1", 80)));
3659
3660 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:273661 HostPortPair("localhost", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:153662 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:003663 EXPECT_THAT(response1.result_error(), IsOk());
3664 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
3665 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
3666 CreateExpected("::1", 80)));
3667
3668 ResolveHostResponseHelper response2(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:273669 HostPortPair("localhost.", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:153670 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:003671 EXPECT_THAT(response2.result_error(), IsOk());
3672 EXPECT_THAT(response2.request()->GetAddressResults().value().endpoints(),
3673 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
3674 CreateExpected("::1", 80)));
3675}
3676
Mike Westda1c690e2017-08-12 05:57:163677// RFC 6761 localhost names should always resolve to loopback, even if a HOSTS
3678// file is active.
Eric Orth960e7062019-03-08 18:43:543679TEST_F(HostResolverManagerDnsTest, LocalhostLookupWithHosts) {
Mike Westda1c690e2017-08-12 05:57:163680 DnsHosts hosts;
3681 hosts[DnsHostsKey("localhost", ADDRESS_FAMILY_IPV4)] =
3682 IPAddress({192, 168, 1, 1});
3683 hosts[DnsHostsKey("foo.localhost", ADDRESS_FAMILY_IPV4)] =
3684 IPAddress({192, 168, 1, 2});
3685
3686 DnsConfig config = CreateValidDnsConfig();
3687 config.hosts = hosts;
3688 ChangeDnsConfig(config);
3689
Eric Orth70992982018-07-24 00:25:003690 ResolveHostResponseHelper response0(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:273691 HostPortPair("localhost", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:153692 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:003693 EXPECT_THAT(response0.result_error(), IsOk());
3694 EXPECT_THAT(response0.request()->GetAddressResults().value().endpoints(),
3695 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
3696 CreateExpected("::1", 80)));
3697
3698 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:273699 HostPortPair("foo.localhost", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:153700 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:003701 EXPECT_THAT(response1.result_error(), IsOk());
3702 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
3703 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
3704 CreateExpected("::1", 80)));
3705}
3706
Eric Orth960e7062019-03-08 18:43:543707// Test successful and fallback resolutions in HostResolverManager::DnsTask.
3708TEST_F(HostResolverManagerDnsTest, DnsTask) {
[email protected]38b50d92012-04-19 21:07:523709 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.102");
3710 // All other hostnames will fail in proc_.
[email protected]78eac2a2012-03-14 19:09:273711
3712 // Initially there is no config, so client should not be invoked.
Eric Orth117e1992019-04-17 00:24:153713 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
3714 HostPortPair("ok_fail", 80), NetLogWithSource(), base::nullopt,
3715 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:003716 EXPECT_FALSE(initial_response.complete());
3717
3718 proc_->SignalMultiple(1u);
3719
3720 EXPECT_THAT(initial_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
3721
3722 ChangeDnsConfig(CreateValidDnsConfig());
3723
Eric Orth117e1992019-04-17 00:24:153724 ResolveHostResponseHelper response0(resolver_->CreateRequest(
3725 HostPortPair("ok_fail", 80), NetLogWithSource(), base::nullopt,
3726 request_context_.get(), host_cache_.get()));
3727 ResolveHostResponseHelper response1(resolver_->CreateRequest(
3728 HostPortPair("nx_fail", 80), NetLogWithSource(), base::nullopt,
3729 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:003730 ResolveHostResponseHelper response2(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:273731 HostPortPair("nx_succeed", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:153732 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:003733
3734 proc_->SignalMultiple(4u);
3735
3736 // Resolved by MockDnsClient.
3737 EXPECT_THAT(response0.result_error(), IsOk());
3738 EXPECT_THAT(response0.request()->GetAddressResults().value().endpoints(),
3739 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
3740 CreateExpected("::1", 80)));
3741
3742 // Fallback to ProcTask.
3743 EXPECT_THAT(response1.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
3744 EXPECT_THAT(response2.result_error(), IsOk());
3745 EXPECT_THAT(response2.request()->GetAddressResults().value().endpoints(),
3746 testing::ElementsAre(CreateExpected("192.168.1.102", 80)));
3747}
3748
Eric Orth960e7062019-03-08 18:43:543749// Test successful and failing resolutions in HostResolverManager::DnsTask when
[email protected]16c2bd72013-06-28 01:19:223750// fallback to ProcTask is disabled.
Eric Orth960e7062019-03-08 18:43:543751TEST_F(HostResolverManagerDnsTest, NoFallbackToProcTask) {
Eric Orth60931742018-11-05 23:40:573752 set_allow_fallback_to_proctask(false);
[email protected]16c2bd72013-06-28 01:19:223753
[email protected]16c2bd72013-06-28 01:19:223754 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.102");
3755 // All other hostnames will fail in proc_.
3756
3757 // Set empty DnsConfig.
3758 ChangeDnsConfig(DnsConfig());
3759 // Initially there is no config, so client should not be invoked.
Eric Orth117e1992019-04-17 00:24:153760 ResolveHostResponseHelper initial_response0(resolver_->CreateRequest(
3761 HostPortPair("ok_fail", 80), NetLogWithSource(), base::nullopt,
3762 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:003763 ResolveHostResponseHelper initial_response1(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:273764 HostPortPair("nx_succeed", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:153765 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:003766 proc_->SignalMultiple(2u);
3767
3768 EXPECT_THAT(initial_response0.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
3769 EXPECT_THAT(initial_response1.result_error(), IsOk());
3770 EXPECT_THAT(
3771 initial_response1.request()->GetAddressResults().value().endpoints(),
3772 testing::ElementsAre(CreateExpected("192.168.1.102", 80)));
3773
dalykc27699a2019-07-29 20:53:293774 // Switch to a valid config.
Eric Orth70992982018-07-24 00:25:003775 ChangeDnsConfig(CreateValidDnsConfig());
Eric Orth70992982018-07-24 00:25:003776 // First request is resolved by MockDnsClient, others should fail due to
3777 // disabled fallback to ProcTask.
Eric Orth117e1992019-04-17 00:24:153778 ResolveHostResponseHelper response0(resolver_->CreateRequest(
3779 HostPortPair("ok_fail", 80), NetLogWithSource(), base::nullopt,
3780 request_context_.get(), host_cache_.get()));
3781 ResolveHostResponseHelper response1(resolver_->CreateRequest(
dalykc27699a2019-07-29 20:53:293782 HostPortPair("nx_succeed", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:153783 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:003784 proc_->SignalMultiple(6u);
3785
Eric Orth70992982018-07-24 00:25:003786 // Resolved by MockDnsClient.
3787 EXPECT_THAT(response0.result_error(), IsOk());
3788 EXPECT_THAT(response0.request()->GetAddressResults().value().endpoints(),
3789 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
3790 CreateExpected("::1", 80)));
3791 // Fallback to ProcTask is disabled.
3792 EXPECT_THAT(response1.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
3793}
3794
[email protected]16c2bd72013-06-28 01:19:223795// Test behavior of OnDnsTaskFailure when Job is aborted.
Eric Orth960e7062019-03-08 18:43:543796TEST_F(HostResolverManagerDnsTest, OnDnsTaskFailureAbortedJob) {
[email protected]16c2bd72013-06-28 01:19:223797 ChangeDnsConfig(CreateValidDnsConfig());
Eric Orth117e1992019-04-17 00:24:153798 ResolveHostResponseHelper response(resolver_->CreateRequest(
3799 HostPortPair("nx_abort", 80), NetLogWithSource(), base::nullopt,
3800 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:003801 // Abort all jobs here.
3802 CreateResolver();
3803 proc_->SignalMultiple(1u);
3804 // Run to completion.
3805 base::RunLoop().RunUntilIdle(); // Notification happens async.
3806 // It shouldn't crash during OnDnsTaskFailure callbacks.
3807 EXPECT_FALSE(response.complete());
3808
3809 // Repeat test with Fallback to ProcTask disabled
Eric Orth60931742018-11-05 23:40:573810 set_allow_fallback_to_proctask(false);
Eric Orth70992982018-07-24 00:25:003811 ChangeDnsConfig(CreateValidDnsConfig());
Eric Orth117e1992019-04-17 00:24:153812 ResolveHostResponseHelper no_fallback_response(resolver_->CreateRequest(
3813 HostPortPair("nx_abort", 80), NetLogWithSource(), base::nullopt,
3814 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:003815 // Abort all jobs here.
3816 CreateResolver();
3817 proc_->SignalMultiple(2u);
3818 // Run to completion.
3819 base::RunLoop().RunUntilIdle(); // Notification happens async.
3820 // It shouldn't crash during OnDnsTaskFailure callbacks.
3821 EXPECT_FALSE(no_fallback_response.complete());
3822}
3823
Eric Orth60931742018-11-05 23:40:573824// Fallback to proc allowed with ANY source.
Eric Orth960e7062019-03-08 18:43:543825TEST_F(HostResolverManagerDnsTest, FallbackBySource_Any) {
Eric Orth60931742018-11-05 23:40:573826 // Ensure fallback is otherwise allowed by resolver settings.
3827 set_allow_fallback_to_proctask(true);
3828
3829 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.102");
3830 // All other hostnames will fail in proc_.
3831
3832 ChangeDnsConfig(CreateValidDnsConfig());
3833
Eric Orth117e1992019-04-17 00:24:153834 ResolveHostResponseHelper response0(resolver_->CreateRequest(
3835 HostPortPair("nx_fail", 80), NetLogWithSource(), base::nullopt,
3836 request_context_.get(), host_cache_.get()));
Eric Orth60931742018-11-05 23:40:573837 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:273838 HostPortPair("nx_succeed", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:153839 request_context_.get(), host_cache_.get()));
Eric Orth60931742018-11-05 23:40:573840 proc_->SignalMultiple(2u);
3841
3842 EXPECT_THAT(response0.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
3843 EXPECT_THAT(response1.result_error(), IsOk());
3844 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
3845 testing::ElementsAre(CreateExpected("192.168.1.102", 80)));
3846}
3847
3848// Fallback to proc not allowed with DNS source.
Eric Orth960e7062019-03-08 18:43:543849TEST_F(HostResolverManagerDnsTest, FallbackBySource_Dns) {
Eric Orth60931742018-11-05 23:40:573850 // Ensure fallback is otherwise allowed by resolver settings.
3851 set_allow_fallback_to_proctask(true);
3852
3853 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.102");
3854 // All other hostnames will fail in proc_.
3855
3856 ChangeDnsConfig(CreateValidDnsConfig());
3857
3858 HostResolver::ResolveHostParameters parameters;
3859 parameters.source = HostResolverSource::DNS;
Eric Orth117e1992019-04-17 00:24:153860 ResolveHostResponseHelper response0(resolver_->CreateRequest(
3861 HostPortPair("nx_fail", 80), NetLogWithSource(), parameters,
3862 request_context_.get(), host_cache_.get()));
Eric Orth60931742018-11-05 23:40:573863 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:273864 HostPortPair("nx_succeed", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:153865 request_context_.get(), host_cache_.get()));
Eric Orth60931742018-11-05 23:40:573866 // Nothing should reach |proc_| on success, but let failures through to fail
3867 // instead of hanging.
3868 proc_->SignalMultiple(2u);
3869
3870 EXPECT_THAT(response0.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
3871 EXPECT_THAT(response1.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
3872}
3873
3874// Fallback to proc on DnsClient change allowed with ANY source.
Eric Orth960e7062019-03-08 18:43:543875TEST_F(HostResolverManagerDnsTest, FallbackOnAbortBySource_Any) {
Eric Orth60931742018-11-05 23:40:573876 // Ensure fallback is otherwise allowed by resolver settings.
3877 set_allow_fallback_to_proctask(true);
3878
3879 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.102");
3880 // All other hostnames will fail in proc_.
3881
3882 ChangeDnsConfig(CreateValidDnsConfig());
3883
Eric Orth117e1992019-04-17 00:24:153884 ResolveHostResponseHelper response0(resolver_->CreateRequest(
3885 HostPortPair("ok_fail", 80), NetLogWithSource(), base::nullopt,
3886 request_context_.get(), host_cache_.get()));
Eric Orth60931742018-11-05 23:40:573887 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:273888 HostPortPair("nx_succeed", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:153889 request_context_.get(), host_cache_.get()));
Eric Orth60931742018-11-05 23:40:573890 proc_->SignalMultiple(2u);
3891
dalykc27699a2019-07-29 20:53:293892 // Simulate the case when the preference or policy has disabled the insecure
3893 // DNS client causing AbortInsecureDnsTasks.
3894 resolver_->SetInsecureDnsClientEnabled(false);
Eric Orth60931742018-11-05 23:40:573895
3896 // All requests should fallback to proc resolver.
3897 EXPECT_THAT(response0.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
3898 EXPECT_THAT(response1.result_error(), IsOk());
3899 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
3900 testing::ElementsAre(CreateExpected("192.168.1.102", 80)));
3901}
3902
3903// Fallback to proc on DnsClient change not allowed with DNS source.
Eric Orth960e7062019-03-08 18:43:543904TEST_F(HostResolverManagerDnsTest, FallbackOnAbortBySource_Dns) {
Eric Orth60931742018-11-05 23:40:573905 // Ensure fallback is otherwise allowed by resolver settings.
3906 set_allow_fallback_to_proctask(true);
3907
3908 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.102");
3909 // All other hostnames will fail in proc_.
3910
3911 ChangeDnsConfig(CreateValidDnsConfig());
3912
3913 HostResolver::ResolveHostParameters parameters;
3914 parameters.source = HostResolverSource::DNS;
Eric Orth117e1992019-04-17 00:24:153915 ResolveHostResponseHelper response0(resolver_->CreateRequest(
3916 HostPortPair("ok_fail", 80), NetLogWithSource(), parameters,
3917 request_context_.get(), host_cache_.get()));
Eric Orth60931742018-11-05 23:40:573918 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:273919 HostPortPair("nx_succeed", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:153920 request_context_.get(), host_cache_.get()));
Eric Orth60931742018-11-05 23:40:573921 // Nothing should reach |proc_| on success, but let failures through to fail
3922 // instead of hanging.
3923 proc_->SignalMultiple(2u);
3924
dalykc27699a2019-07-29 20:53:293925 // Simulate the case when the preference or policy has disabled the insecure
3926 // DNS client causing AbortInsecureDnsTasks.
3927 resolver_->SetInsecureDnsClientEnabled(false);
Eric Orth60931742018-11-05 23:40:573928
3929 // No fallback expected. All requests should fail.
3930 EXPECT_THAT(response0.result_error(), IsError(ERR_NETWORK_CHANGED));
3931 EXPECT_THAT(response1.result_error(), IsError(ERR_NETWORK_CHANGED));
3932}
3933
dalykc27699a2019-07-29 20:53:293934// Insecure DnsClient change shouldn't affect secure DnsTasks.
3935TEST_F(HostResolverManagerDnsTest,
3936 DisableInsecureDnsClient_SecureDnsTasksUnaffected) {
3937 // Ensure fallback is otherwise allowed by resolver settings.
3938 set_allow_fallback_to_proctask(true);
3939
3940 proc_->AddRuleForAllFamilies("automatic", "192.168.1.102");
3941 // All other hostnames will fail in proc_.
3942
3943 ChangeDnsConfig(CreateValidDnsConfig());
3944
3945 HostResolver::ResolveHostParameters secure_parameters;
3946 secure_parameters.secure_dns_mode_override =
3947 DnsConfig::SecureDnsMode::AUTOMATIC;
3948 ResolveHostResponseHelper response_secure(resolver_->CreateRequest(
3949 HostPortPair("automatic", 80), NetLogWithSource(), secure_parameters,
3950 request_context_.get(), host_cache_.get()));
3951 EXPECT_FALSE(response_secure.complete());
3952
3953 // Simulate the case when the preference or policy has disabled the insecure
3954 // DNS client causing AbortInsecureDnsTasks.
3955 resolver_->SetInsecureDnsClientEnabled(false);
3956
3957 EXPECT_THAT(response_secure.result_error(), IsOk());
3958 EXPECT_THAT(
3959 response_secure.request()->GetAddressResults().value().endpoints(),
3960 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
3961 CreateExpected("::1", 80)));
3962}
3963
Eric Orth960e7062019-03-08 18:43:543964TEST_F(HostResolverManagerDnsTest, DnsTaskUnspec) {
[email protected]0adcb2b2012-08-15 21:30:463965 ChangeDnsConfig(CreateValidDnsConfig());
3966
3967 proc_->AddRuleForAllFamilies("4nx", "192.168.1.101");
3968 // All other hostnames will fail in proc_.
3969
Eric Orth70992982018-07-24 00:25:003970 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:153971 responses.emplace_back(
3972 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
3973 HostPortPair("ok", 80), NetLogWithSource(), base::nullopt,
3974 request_context_.get(), host_cache_.get())));
3975 responses.emplace_back(
3976 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
3977 HostPortPair("4ok", 80), NetLogWithSource(), base::nullopt,
3978 request_context_.get(), host_cache_.get())));
3979 responses.emplace_back(
3980 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
3981 HostPortPair("6ok", 80), NetLogWithSource(), base::nullopt,
3982 request_context_.get(), host_cache_.get())));
3983 responses.emplace_back(
3984 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
3985 HostPortPair("4nx", 80), NetLogWithSource(), base::nullopt,
3986 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:003987
3988 proc_->SignalMultiple(4u);
3989
3990 for (auto& response : responses) {
3991 EXPECT_THAT(response->result_error(), IsOk());
3992 }
3993
3994 EXPECT_THAT(responses[0]->request()->GetAddressResults().value().endpoints(),
3995 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
3996 CreateExpected("::1", 80)));
3997 EXPECT_THAT(responses[1]->request()->GetAddressResults().value().endpoints(),
3998 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
3999 EXPECT_THAT(responses[2]->request()->GetAddressResults().value().endpoints(),
4000 testing::ElementsAre(CreateExpected("::1", 80)));
4001 EXPECT_THAT(responses[3]->request()->GetAddressResults().value().endpoints(),
4002 testing::ElementsAre(CreateExpected("192.168.1.101", 80)));
4003}
4004
Eric Orth960e7062019-03-08 18:43:544005TEST_F(HostResolverManagerDnsTest, NameCollisionIcann) {
eroman1efc237c2016-12-14 00:00:454006 ChangeDnsConfig(CreateValidDnsConfig());
4007
Eric Orth70992982018-07-24 00:25:004008 // When the resolver returns an A record with 127.0.53.53 it should be
4009 // mapped to a special error.
4010 ResolveHostResponseHelper response_ipv4(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:274011 HostPortPair("4collision", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:154012 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004013 EXPECT_THAT(response_ipv4.result_error(), IsError(ERR_ICANN_NAME_COLLISION));
4014 EXPECT_FALSE(response_ipv4.request()->GetAddressResults());
4015
4016 // When the resolver returns an AAAA record with ::127.0.53.53 it should
4017 // work just like any other IP. (Despite having the same suffix, it is not
4018 // considered special)
4019 ResolveHostResponseHelper response_ipv6(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:274020 HostPortPair("6collision", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:154021 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004022 EXPECT_THAT(response_ipv6.result_error(), IsOk());
4023 EXPECT_THAT(response_ipv6.request()->GetAddressResults().value().endpoints(),
4024 testing::ElementsAre(CreateExpected("::127.0.53.53", 80)));
4025}
4026
Eric Orth960e7062019-03-08 18:43:544027TEST_F(HostResolverManagerDnsTest, ServeFromHosts) {
[email protected]d7b9a2b2012-05-31 22:31:194028 // Initially, use empty HOSTS file.
[email protected]bb0e34542012-08-31 19:52:404029 DnsConfig config = CreateValidDnsConfig();
4030 ChangeDnsConfig(config);
[email protected]d7b9a2b2012-05-31 22:31:194031
[email protected]007b3f82013-04-09 08:46:454032 proc_->AddRuleForAllFamilies(std::string(),
4033 std::string()); // Default to failures.
[email protected]38b50d92012-04-19 21:07:524034 proc_->SignalMultiple(1u); // For the first request which misses.
[email protected]78eac2a2012-03-14 19:09:274035
Eric Orth117e1992019-04-17 00:24:154036 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
4037 HostPortPair("nx_ipv4", 80), NetLogWithSource(), base::nullopt,
4038 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004039 EXPECT_THAT(initial_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
4040
4041 IPAddress local_ipv4 = IPAddress::IPv4Localhost();
4042 IPAddress local_ipv6 = IPAddress::IPv6Localhost();
4043
4044 DnsHosts hosts;
4045 hosts[DnsHostsKey("nx_ipv4", ADDRESS_FAMILY_IPV4)] = local_ipv4;
4046 hosts[DnsHostsKey("nx_ipv6", ADDRESS_FAMILY_IPV6)] = local_ipv6;
4047 hosts[DnsHostsKey("nx_both", ADDRESS_FAMILY_IPV4)] = local_ipv4;
4048 hosts[DnsHostsKey("nx_both", ADDRESS_FAMILY_IPV6)] = local_ipv6;
4049
4050 // Update HOSTS file.
4051 config.hosts = hosts;
4052 ChangeDnsConfig(config);
4053
Eric Orth117e1992019-04-17 00:24:154054 ResolveHostResponseHelper response_ipv4(resolver_->CreateRequest(
4055 HostPortPair("nx_ipv4", 80), NetLogWithSource(), base::nullopt,
4056 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004057 EXPECT_THAT(response_ipv4.result_error(), IsOk());
4058 EXPECT_THAT(response_ipv4.request()->GetAddressResults().value().endpoints(),
4059 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
4060
Eric Orth117e1992019-04-17 00:24:154061 ResolveHostResponseHelper response_ipv6(resolver_->CreateRequest(
4062 HostPortPair("nx_ipv6", 80), NetLogWithSource(), base::nullopt,
4063 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004064 EXPECT_THAT(response_ipv6.result_error(), IsOk());
4065 EXPECT_THAT(response_ipv6.request()->GetAddressResults().value().endpoints(),
4066 testing::ElementsAre(CreateExpected("::1", 80)));
4067
Eric Orth117e1992019-04-17 00:24:154068 ResolveHostResponseHelper response_both(resolver_->CreateRequest(
4069 HostPortPair("nx_both", 80), NetLogWithSource(), base::nullopt,
4070 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004071 EXPECT_THAT(response_both.result_error(), IsOk());
4072 EXPECT_THAT(response_both.request()->GetAddressResults().value().endpoints(),
4073 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4074 CreateExpected("::1", 80)));
4075
Eric Orth00fe5a62018-08-15 22:20:004076 // Requests with specified DNS query type.
4077 HostResolver::ResolveHostParameters parameters;
4078
Eric Orth192e3bb2018-11-14 19:30:324079 parameters.dns_query_type = DnsQueryType::A;
Eric Orth117e1992019-04-17 00:24:154080 ResolveHostResponseHelper response_specified_ipv4(resolver_->CreateRequest(
4081 HostPortPair("nx_ipv4", 80), NetLogWithSource(), parameters,
4082 request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:004083 EXPECT_THAT(response_specified_ipv4.result_error(), IsOk());
4084 EXPECT_THAT(response_specified_ipv4.request()
4085 ->GetAddressResults()
4086 .value()
4087 .endpoints(),
4088 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
4089
Eric Orth192e3bb2018-11-14 19:30:324090 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth117e1992019-04-17 00:24:154091 ResolveHostResponseHelper response_specified_ipv6(resolver_->CreateRequest(
4092 HostPortPair("nx_ipv6", 80), NetLogWithSource(), parameters,
4093 request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:004094 EXPECT_THAT(response_specified_ipv6.result_error(), IsOk());
4095 EXPECT_THAT(response_specified_ipv6.request()
4096 ->GetAddressResults()
4097 .value()
4098 .endpoints(),
4099 testing::ElementsAre(CreateExpected("::1", 80)));
4100
Eric Orth70992982018-07-24 00:25:004101 // Request with upper case.
Eric Orth117e1992019-04-17 00:24:154102 ResolveHostResponseHelper response_upper(resolver_->CreateRequest(
4103 HostPortPair("nx_IPV4", 80), NetLogWithSource(), base::nullopt,
4104 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004105 EXPECT_THAT(response_upper.result_error(), IsOk());
4106 EXPECT_THAT(response_upper.request()->GetAddressResults().value().endpoints(),
4107 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
4108}
4109
dalykc27699a2019-07-29 20:53:294110TEST_F(HostResolverManagerDnsTest, SkipHostsWithUpcomingProcTask) {
4111 // Disable the DnsClient.
4112 resolver_->SetInsecureDnsClientEnabled(false);
4113
4114 proc_->AddRuleForAllFamilies(std::string(),
4115 std::string()); // Default to failures.
4116 proc_->SignalMultiple(1u); // For the first request which misses.
4117
4118 DnsConfig config = CreateValidDnsConfig();
4119 DnsHosts hosts;
4120 hosts[DnsHostsKey("hosts", ADDRESS_FAMILY_IPV4)] = IPAddress::IPv4Localhost();
4121
4122 // Update HOSTS file.
4123 config.hosts = hosts;
4124 ChangeDnsConfig(config);
4125
4126 ResolveHostResponseHelper response(resolver_->CreateRequest(
4127 HostPortPair("hosts", 80), NetLogWithSource(), base::nullopt,
4128 request_context_.get(), host_cache_.get()));
4129 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
4130}
4131
Eric Orthdc35748e2018-08-23 22:41:484132// Test that hosts ending in ".local" or ".local." are resolved using the system
4133// resolver.
Eric Orth960e7062019-03-08 18:43:544134TEST_F(HostResolverManagerDnsTest, BypassDnsTask) {
Eric Orth70992982018-07-24 00:25:004135 ChangeDnsConfig(CreateValidDnsConfig());
4136
4137 proc_->AddRuleForAllFamilies(std::string(),
4138 std::string()); // Default to failures.
4139
4140 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
4141
Eric Orth117e1992019-04-17 00:24:154142 responses.emplace_back(
4143 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
4144 HostPortPair("ok.local", 80), NetLogWithSource(), base::nullopt,
4145 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:004146 responses.emplace_back(
4147 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:274148 HostPortPair("ok.local.", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:154149 request_context_.get(), host_cache_.get())));
4150 responses.emplace_back(
4151 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
4152 HostPortPair("oklocal", 80), NetLogWithSource(), base::nullopt,
4153 request_context_.get(), host_cache_.get())));
4154 responses.emplace_back(
4155 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
4156 HostPortPair("oklocal.", 80), NetLogWithSource(), base::nullopt,
4157 request_context_.get(), host_cache_.get())));
4158 responses.emplace_back(
4159 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
4160 HostPortPair("ok", 80), NetLogWithSource(), base::nullopt,
4161 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:004162
4163 proc_->SignalMultiple(5u);
4164
4165 for (size_t i = 0; i < 2; ++i)
4166 EXPECT_THAT(responses[i]->result_error(), IsError(ERR_NAME_NOT_RESOLVED));
4167
4168 for (size_t i = 2; i < responses.size(); ++i)
4169 EXPECT_THAT(responses[i]->result_error(), IsOk());
4170}
4171
Eric Orth828bd3ae2018-12-12 17:30:364172#if BUILDFLAG(ENABLE_MDNS)
4173// Test that non-address queries for hosts ending in ".local" are resolved using
4174// the MDNS resolver.
Eric Orth960e7062019-03-08 18:43:544175TEST_F(HostResolverManagerDnsTest, BypassDnsToMdnsWithNonAddress) {
Eric Orth828bd3ae2018-12-12 17:30:364176 // Ensure DNS task and system (proc) requests will fail.
4177 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:134178 rules.emplace_back(
4179 "myhello.local", dns_protocol::kTypeTXT, false /* secure */,
4180 MockDnsClientRule::Result(MockDnsClientRule::FAIL), false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:364181 CreateResolver();
4182 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
4183 proc_->AddRuleForAllFamilies(std::string(), std::string());
4184
4185 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
4186 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
4187 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
4188 // 2 socket creations for every transaction.
4189 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(2);
4190
4191 HostResolver::ResolveHostParameters dns_parameters;
4192 dns_parameters.dns_query_type = DnsQueryType::TXT;
4193
4194 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:274195 HostPortPair("myhello.local", 80), NetLogWithSource(), dns_parameters,
Eric Orth117e1992019-04-17 00:24:154196 request_context_.get(), host_cache_.get()));
Eric Orth828bd3ae2018-12-12 17:30:364197
4198 socket_factory_ptr->SimulateReceive(kMdnsResponseTxt,
4199 sizeof(kMdnsResponseTxt));
4200 proc_->SignalMultiple(1u);
4201
4202 EXPECT_THAT(response.result_error(), IsOk());
4203 EXPECT_THAT(response.request()->GetTextResults(),
4204 testing::Optional(testing::ElementsAre("foo", "bar")));
4205}
4206#endif // BUILDFLAG(ENABLE_MDNS)
4207
Eric Orthdc35748e2018-08-23 22:41:484208// Test that DNS task is always used when explicitly requested as the source,
4209// even with a case that would normally bypass it eg hosts ending in ".local".
Eric Orth960e7062019-03-08 18:43:544210TEST_F(HostResolverManagerDnsTest, DnsNotBypassedWhenDnsSource) {
Eric Orthdc35748e2018-08-23 22:41:484211 // Ensure DNS task requests will succeed and system (proc) requests will fail.
4212 ChangeDnsConfig(CreateValidDnsConfig());
4213 proc_->AddRuleForAllFamilies(std::string(), std::string());
4214
4215 HostResolver::ResolveHostParameters dns_parameters;
4216 dns_parameters.source = HostResolverSource::DNS;
4217
Eric Orth117e1992019-04-17 00:24:154218 ResolveHostResponseHelper dns_response(resolver_->CreateRequest(
4219 HostPortPair("ok", 80), NetLogWithSource(), dns_parameters,
4220 request_context_.get(), host_cache_.get()));
4221 ResolveHostResponseHelper dns_local_response(resolver_->CreateRequest(
4222 HostPortPair("ok.local", 80), NetLogWithSource(), dns_parameters,
4223 request_context_.get(), host_cache_.get()));
4224 ResolveHostResponseHelper normal_local_response(resolver_->CreateRequest(
4225 HostPortPair("ok.local", 80), NetLogWithSource(), base::nullopt,
4226 request_context_.get(), host_cache_.get()));
Eric Orthdc35748e2018-08-23 22:41:484227
4228 proc_->SignalMultiple(3u);
4229
4230 EXPECT_THAT(dns_response.result_error(), IsOk());
4231 EXPECT_THAT(dns_local_response.result_error(), IsOk());
4232 EXPECT_THAT(normal_local_response.result_error(),
4233 IsError(ERR_NAME_NOT_RESOLVED));
4234}
4235
Eric Orth960e7062019-03-08 18:43:544236TEST_F(HostResolverManagerDnsTest, SystemOnlyBypassesDnsTask) {
Eric Orthdc35748e2018-08-23 22:41:484237 // Ensure DNS task requests will succeed and system (proc) requests will fail.
4238 ChangeDnsConfig(CreateValidDnsConfig());
4239 proc_->AddRuleForAllFamilies(std::string(), std::string());
4240
Eric Orth117e1992019-04-17 00:24:154241 ResolveHostResponseHelper dns_response(resolver_->CreateRequest(
4242 HostPortPair("ok", 80), NetLogWithSource(), base::nullopt,
4243 request_context_.get(), host_cache_.get()));
Eric Orthdc35748e2018-08-23 22:41:484244
4245 HostResolver::ResolveHostParameters parameters;
4246 parameters.source = HostResolverSource::SYSTEM;
Eric Orth117e1992019-04-17 00:24:154247 ResolveHostResponseHelper system_response(resolver_->CreateRequest(
4248 HostPortPair("ok", 80), NetLogWithSource(), parameters,
4249 request_context_.get(), host_cache_.get()));
Eric Orthdc35748e2018-08-23 22:41:484250
4251 proc_->SignalMultiple(2u);
4252
4253 EXPECT_THAT(dns_response.result_error(), IsOk());
4254 EXPECT_THAT(system_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
4255}
4256
dalykc27699a2019-07-29 20:53:294257TEST_F(HostResolverManagerDnsTest,
4258 DisableInsecureDnsClientOnPersistentFailure) {
[email protected]f0f602bd2012-11-15 18:01:024259 ChangeDnsConfig(CreateValidDnsConfig());
4260
[email protected]007b3f82013-04-09 08:46:454261 proc_->AddRuleForAllFamilies(std::string(),
4262 std::string()); // Default to failures.
[email protected]f0f602bd2012-11-15 18:01:024263
4264 // Check that DnsTask works.
Eric Orth117e1992019-04-17 00:24:154265 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
4266 HostPortPair("ok_1", 80), NetLogWithSource(), base::nullopt,
4267 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004268 EXPECT_THAT(initial_response.result_error(), IsOk());
4269
4270 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
dalykc27699a2019-07-29 20:53:294271 for (unsigned i = 0; i < maximum_insecure_dns_task_failures(); ++i) {
Eric Orth70992982018-07-24 00:25:004272 // Use custom names to require separate Jobs.
4273 std::string hostname = base::StringPrintf("nx_%u", i);
4274 // Ensure fallback to ProcTask succeeds.
4275 proc_->AddRuleForAllFamilies(hostname, "192.168.1.101");
Eric Orth117e1992019-04-17 00:24:154276 responses.emplace_back(
4277 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
4278 HostPortPair(hostname, 80), NetLogWithSource(), base::nullopt,
4279 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:004280 }
4281
4282 proc_->SignalMultiple(responses.size());
4283
4284 for (size_t i = 0; i < responses.size(); ++i)
4285 EXPECT_THAT(responses[i]->result_error(), IsOk());
4286
4287 ASSERT_FALSE(proc_->HasBlockedRequests());
4288
dalykc27699a2019-07-29 20:53:294289 // Insecure DnsTasks should be disabled by now unless explicitly requested via
4290 // |source|.
Eric Orth117e1992019-04-17 00:24:154291 ResolveHostResponseHelper fail_response(resolver_->CreateRequest(
4292 HostPortPair("ok_2", 80), NetLogWithSource(), base::nullopt,
4293 request_context_.get(), host_cache_.get()));
Eric Orth60931742018-11-05 23:40:574294 HostResolver::ResolveHostParameters parameters;
4295 parameters.source = HostResolverSource::DNS;
Eric Orth117e1992019-04-17 00:24:154296 ResolveHostResponseHelper dns_response(resolver_->CreateRequest(
4297 HostPortPair("ok_2", 80), NetLogWithSource(), parameters,
4298 request_context_.get(), host_cache_.get()));
Eric Orth60931742018-11-05 23:40:574299 proc_->SignalMultiple(2u);
Eric Orth70992982018-07-24 00:25:004300 EXPECT_THAT(fail_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
Eric Orth60931742018-11-05 23:40:574301 EXPECT_THAT(dns_response.result_error(), IsOk());
Eric Orth70992982018-07-24 00:25:004302
dalykc27699a2019-07-29 20:53:294303 // Secure DnsTasks should not be affected.
4304 HostResolver::ResolveHostParameters secure_parameters;
4305 secure_parameters.secure_dns_mode_override =
4306 DnsConfig::SecureDnsMode::AUTOMATIC;
4307 ResolveHostResponseHelper secure_response(resolver_->CreateRequest(
4308 HostPortPair("automatic", 80), NetLogWithSource(), secure_parameters,
4309 request_context_.get(), host_cache_.get()));
4310 EXPECT_THAT(secure_response.result_error(), IsOk());
4311
Eric Orth70992982018-07-24 00:25:004312 // Check that it is re-enabled after DNS change.
4313 ChangeDnsConfig(CreateValidDnsConfig());
Eric Orth117e1992019-04-17 00:24:154314 ResolveHostResponseHelper reenabled_response(resolver_->CreateRequest(
4315 HostPortPair("ok_3", 80), NetLogWithSource(), base::nullopt,
4316 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004317 EXPECT_THAT(reenabled_response.result_error(), IsOk());
4318}
4319
Eric Orth960e7062019-03-08 18:43:544320TEST_F(HostResolverManagerDnsTest, DontDisableDnsClientOnSporadicFailure) {
[email protected]f0f602bd2012-11-15 18:01:024321 ChangeDnsConfig(CreateValidDnsConfig());
4322
4323 // |proc_| defaults to successes.
4324
4325 // 20 failures interleaved with 20 successes.
Eric Orth70992982018-07-24 00:25:004326 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
4327 for (unsigned i = 0; i < 40; ++i) {
4328 // Use custom names to require separate Jobs.
4329 std::string hostname = (i % 2) == 0 ? base::StringPrintf("nx_%u", i)
4330 : base::StringPrintf("ok_%u", i);
Eric Orth117e1992019-04-17 00:24:154331 responses.emplace_back(
4332 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
4333 HostPortPair(hostname, 80), NetLogWithSource(), base::nullopt,
4334 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:004335 }
4336
4337 proc_->SignalMultiple(40u);
4338
Eric Orth26fa08e2019-02-22 01:28:374339 for (const auto& response : responses)
4340 EXPECT_THAT(response->result_error(), IsOk());
Eric Orth70992982018-07-24 00:25:004341
4342 // Make |proc_| default to failures.
4343 proc_->AddRuleForAllFamilies(std::string(), std::string());
4344
4345 // DnsTask should still be enabled.
Eric Orth117e1992019-04-17 00:24:154346 ResolveHostResponseHelper final_response(resolver_->CreateRequest(
4347 HostPortPair("ok_last", 80), NetLogWithSource(), base::nullopt,
4348 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004349 EXPECT_THAT(final_response.result_error(), IsOk());
4350}
4351
[email protected]ec666ab22013-04-17 20:05:594352// Confirm that resolving "localhost" is unrestricted even if there are no
4353// global IPv6 address. See SystemHostResolverCall for rationale.
4354// Test both the DnsClient and system host resolver paths.
Eric Orth960e7062019-03-08 18:43:544355TEST_F(HostResolverManagerDnsTest, DualFamilyLocalhost) {
Eric Orth70992982018-07-24 00:25:004356 CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:324357 false /* ipv6_reachable */,
4358 true /* check_ipv6_on_wifi */);
Eric Orth70992982018-07-24 00:25:004359
4360 // Make request fail if we actually get to the system resolver.
4361 proc_->AddRuleForAllFamilies(std::string(), std::string());
4362
4363 // Try without DnsClient.
dalykc27699a2019-07-29 20:53:294364 resolver_->SetInsecureDnsClientEnabled(false);
Eric Orth70992982018-07-24 00:25:004365 ResolveHostResponseHelper system_response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:274366 HostPortPair("localhost", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:154367 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004368 EXPECT_THAT(system_response.result_error(), IsOk());
4369 EXPECT_THAT(
4370 system_response.request()->GetAddressResults().value().endpoints(),
4371 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4372 CreateExpected("::1", 80)));
4373
4374 // With DnsClient
Eric Orth828bd3ae2018-12-12 17:30:364375 UseMockDnsClient(CreateValidDnsConfig(), CreateDefaultDnsRules());
Eric Orth70992982018-07-24 00:25:004376 ResolveHostResponseHelper builtin_response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:274377 HostPortPair("localhost", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:154378 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004379 EXPECT_THAT(builtin_response.result_error(), IsOk());
4380 EXPECT_THAT(
4381 builtin_response.request()->GetAddressResults().value().endpoints(),
4382 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4383 CreateExpected("::1", 80)));
4384
4385 // DnsClient configured without ipv6 (but ipv6 should still work for
4386 // localhost).
4387 DnsConfig config = CreateValidDnsConfig();
4388 config.use_local_ipv6 = false;
4389 ChangeDnsConfig(config);
4390 ResolveHostResponseHelper ipv6_disabled_response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:274391 HostPortPair("localhost", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:154392 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004393 EXPECT_THAT(ipv6_disabled_response.result_error(), IsOk());
4394 EXPECT_THAT(
4395 ipv6_disabled_response.request()->GetAddressResults().value().endpoints(),
4396 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4397 CreateExpected("::1", 80)));
4398}
4399
dalykc27699a2019-07-29 20:53:294400TEST_F(HostResolverManagerDnsTest, SeparateJobsBySecureDnsMode) {
4401 MockDnsClientRuleList rules;
4402 rules.emplace_back("a", dns_protocol::kTypeA, true /* secure */,
4403 MockDnsClientRule::Result(MockDnsClientRule::FAIL),
4404 true /* delay */);
4405 rules.emplace_back("a", dns_protocol::kTypeAAAA, true /* secure */,
4406 MockDnsClientRule::Result(MockDnsClientRule::FAIL),
4407 true /* delay */);
4408 rules.emplace_back("a", dns_protocol::kTypeA, false /* secure */,
4409 MockDnsClientRule::Result(MockDnsClientRule::OK),
4410 false /* delay */);
4411 rules.emplace_back("a", dns_protocol::kTypeAAAA, false /* secure */,
4412 MockDnsClientRule::Result(MockDnsClientRule::OK),
4413 false /* delay */);
4414 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
4415 DnsConfigOverrides overrides;
4416 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
4417 resolver_->SetDnsConfigOverrides(overrides);
4418
4419 // Create three requests. One with a SECURE mode override, one with no
4420 // mode override, and one with an AUTOMATIC mode override (which is a no-op
4421 // since the DnsConfig uses AUTOMATIC).
4422 HostResolver::ResolveHostParameters parameters_secure_override;
4423 parameters_secure_override.secure_dns_mode_override =
4424 DnsConfig::SecureDnsMode::SECURE;
4425 ResolveHostResponseHelper secure_response(resolver_->CreateRequest(
4426 HostPortPair("a", 80), NetLogWithSource(), parameters_secure_override,
4427 request_context_.get(), host_cache_.get()));
4428 EXPECT_EQ(1u, resolver_->num_jobs_for_testing());
4429
4430 ResolveHostResponseHelper automatic_response0(resolver_->CreateRequest(
4431 HostPortPair("a", 80), NetLogWithSource(), base::nullopt,
4432 request_context_.get(), host_cache_.get()));
4433 EXPECT_EQ(2u, resolver_->num_jobs_for_testing());
4434
4435 HostResolver::ResolveHostParameters parameters_automatic_override;
4436 parameters_automatic_override.secure_dns_mode_override =
4437 DnsConfig::SecureDnsMode::AUTOMATIC;
4438 ResolveHostResponseHelper automatic_response1(resolver_->CreateRequest(
4439 HostPortPair("a", 80), NetLogWithSource(), parameters_automatic_override,
4440 request_context_.get(), host_cache_.get()));
4441 // The AUTOMATIC mode requests should be joined into the same job.
4442 EXPECT_EQ(2u, resolver_->num_jobs_for_testing());
4443
4444 // All requests should be blocked on the secure transactions.
4445 base::RunLoop().RunUntilIdle();
4446 EXPECT_FALSE(secure_response.complete());
4447 EXPECT_FALSE(automatic_response0.complete());
4448 EXPECT_FALSE(automatic_response1.complete());
4449
4450 // Complete secure transactions.
4451 dns_client_->CompleteDelayedTransactions();
4452 EXPECT_THAT(secure_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
4453 EXPECT_THAT(automatic_response0.result_error(), IsOk());
4454 EXPECT_THAT(automatic_response1.result_error(), IsOk());
4455}
4456
[email protected]daae1322013-09-05 18:26:504457// Cancel a request with a single DNS transaction active.
Eric Orth960e7062019-03-08 18:43:544458TEST_F(HostResolverManagerDnsTest, CancelWithOneTransactionActive) {
Eric Orth70992982018-07-24 00:25:004459 // Disable ipv6 to ensure we'll only try a single transaction for the host.
4460 CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:324461 false /* ipv6_reachable */,
4462 true /* check_ipv6_on_wifi */);
Eric Orth70992982018-07-24 00:25:004463 DnsConfig config = CreateValidDnsConfig();
4464 config.use_local_ipv6 = false;
4465 ChangeDnsConfig(config);
4466
Eric Orth117e1992019-04-17 00:24:154467 ResolveHostResponseHelper response(resolver_->CreateRequest(
4468 HostPortPair("ok", 80), NetLogWithSource(), base::nullopt,
4469 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004470 ASSERT_FALSE(response.complete());
4471 ASSERT_EQ(1u, num_running_dispatcher_jobs());
4472
4473 response.CancelRequest();
4474 base::RunLoop().RunUntilIdle();
4475 EXPECT_FALSE(response.complete());
4476
4477 // Dispatcher state checked in TearDown.
4478}
4479
[email protected]daae1322013-09-05 18:26:504480// Cancel a request with a single DNS transaction active and another pending.
Eric Orth960e7062019-03-08 18:43:544481TEST_F(HostResolverManagerDnsTest, CancelWithOneTransactionActiveOnePending) {
[email protected]daae1322013-09-05 18:26:504482 CreateSerialResolver();
[email protected]daae1322013-09-05 18:26:504483 ChangeDnsConfig(CreateValidDnsConfig());
4484
Eric Orth117e1992019-04-17 00:24:154485 ResolveHostResponseHelper response(resolver_->CreateRequest(
4486 HostPortPair("ok", 80), NetLogWithSource(), base::nullopt,
4487 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004488 EXPECT_EQ(1u, num_running_dispatcher_jobs());
4489
4490 response.CancelRequest();
4491 base::RunLoop().RunUntilIdle();
4492 EXPECT_FALSE(response.complete());
4493
4494 // Dispatcher state checked in TearDown.
4495}
4496
[email protected]daae1322013-09-05 18:26:504497// Cancel a request with two DNS transactions active.
Eric Orth960e7062019-03-08 18:43:544498TEST_F(HostResolverManagerDnsTest, CancelWithTwoTransactionsActive) {
[email protected]daae1322013-09-05 18:26:504499 ChangeDnsConfig(CreateValidDnsConfig());
4500
Eric Orth117e1992019-04-17 00:24:154501 ResolveHostResponseHelper response(resolver_->CreateRequest(
4502 HostPortPair("ok", 80), NetLogWithSource(), base::nullopt,
4503 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004504 EXPECT_EQ(2u, num_running_dispatcher_jobs());
4505
4506 response.CancelRequest();
4507 base::RunLoop().RunUntilIdle();
4508 EXPECT_FALSE(response.complete());
4509
4510 // Dispatcher state checked in TearDown.
4511}
4512
[email protected]daae1322013-09-05 18:26:504513// Delete a resolver with some active requests and some queued requests.
Eric Orth960e7062019-03-08 18:43:544514TEST_F(HostResolverManagerDnsTest, DeleteWithActiveTransactions) {
[email protected]daae1322013-09-05 18:26:504515 // At most 10 Jobs active at once.
Eric Orth70992982018-07-24 00:25:004516 CreateResolverWithLimitsAndParams(10u, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:324517 true /* ipv6_reachable */,
4518 true /* check_ipv6_on_wifi */);
[email protected]daae1322013-09-05 18:26:504519
[email protected]daae1322013-09-05 18:26:504520 ChangeDnsConfig(CreateValidDnsConfig());
4521
Eric Orth70992982018-07-24 00:25:004522 // Add 12 DNS lookups (creating well more than 10 transaction).
4523 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
4524 for (int i = 0; i < 12; ++i) {
4525 std::string hostname = base::StringPrintf("ok%i", i);
Eric Orth117e1992019-04-17 00:24:154526 responses.emplace_back(
4527 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
4528 HostPortPair(hostname, 80), NetLogWithSource(), base::nullopt,
4529 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:004530 }
4531 EXPECT_EQ(10u, num_running_dispatcher_jobs());
4532
Eric Orth37b18192019-04-22 19:09:284533 DestroyResolver();
Eric Orth70992982018-07-24 00:25:004534
4535 base::RunLoop().RunUntilIdle();
4536 for (auto& response : responses) {
4537 EXPECT_FALSE(response->complete());
4538 }
4539}
4540
Eric Orth5233c3a2019-04-08 17:01:144541TEST_F(HostResolverManagerDnsTest, DeleteWithCompletedRequests) {
4542 ChangeDnsConfig(CreateValidDnsConfig());
4543
Eric Orth117e1992019-04-17 00:24:154544 ResolveHostResponseHelper response(resolver_->CreateRequest(
4545 HostPortPair("ok", 80), NetLogWithSource(), base::nullopt,
4546 request_context_.get(), host_cache_.get()));
Eric Orth5233c3a2019-04-08 17:01:144547
4548 EXPECT_THAT(response.result_error(), IsOk());
4549 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
4550 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4551 CreateExpected("::1", 80)));
4552
Eric Orth37b18192019-04-22 19:09:284553 DestroyResolver();
Eric Orth5233c3a2019-04-08 17:01:144554
4555 // Completed requests should be unaffected by manager destruction.
4556 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
4557 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4558 CreateExpected("::1", 80)));
4559}
4560
4561TEST_F(HostResolverManagerDnsTest, ExplicitCancel) {
4562 ChangeDnsConfig(CreateValidDnsConfig());
4563
4564 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:274565 HostPortPair("4slow_4ok", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:154566 request_context_.get(), host_cache_.get()));
Eric Orth5233c3a2019-04-08 17:01:144567
4568 response.request()->Cancel();
4569 dns_client_->CompleteDelayedTransactions();
4570
4571 base::RunLoop().RunUntilIdle();
4572 EXPECT_FALSE(response.complete());
4573}
4574
4575TEST_F(HostResolverManagerDnsTest, ExplicitCancel_Completed) {
4576 ChangeDnsConfig(CreateValidDnsConfig());
4577
Eric Orth117e1992019-04-17 00:24:154578 ResolveHostResponseHelper response(resolver_->CreateRequest(
4579 HostPortPair("ok", 80), NetLogWithSource(), base::nullopt,
4580 request_context_.get(), host_cache_.get()));
Eric Orth5233c3a2019-04-08 17:01:144581
4582 EXPECT_THAT(response.result_error(), IsOk());
4583 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
4584 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4585 CreateExpected("::1", 80)));
4586
4587 response.request()->Cancel();
4588
4589 // Completed requests should be unaffected by cancellation.
4590 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
4591 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4592 CreateExpected("::1", 80)));
4593}
4594
[email protected]daae1322013-09-05 18:26:504595// Cancel a request with only the IPv6 transaction active.
Eric Orth960e7062019-03-08 18:43:544596TEST_F(HostResolverManagerDnsTest, CancelWithIPv6TransactionActive) {
[email protected]daae1322013-09-05 18:26:504597 ChangeDnsConfig(CreateValidDnsConfig());
4598
Eric Orth117e1992019-04-17 00:24:154599 ResolveHostResponseHelper response(resolver_->CreateRequest(
4600 HostPortPair("6slow_ok", 80), NetLogWithSource(), base::nullopt,
4601 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004602 EXPECT_EQ(2u, num_running_dispatcher_jobs());
4603
4604 // The IPv4 request should complete, the IPv6 request is still pending.
4605 base::RunLoop().RunUntilIdle();
4606 EXPECT_EQ(1u, num_running_dispatcher_jobs());
4607
4608 response.CancelRequest();
4609 base::RunLoop().RunUntilIdle();
4610 EXPECT_FALSE(response.complete());
4611
4612 // Dispatcher state checked in TearDown.
4613}
4614
[email protected]daae1322013-09-05 18:26:504615// Cancel a request with only the IPv4 transaction pending.
Eric Orth960e7062019-03-08 18:43:544616TEST_F(HostResolverManagerDnsTest, CancelWithIPv4TransactionPending) {
Eric Orth60931742018-11-05 23:40:574617 set_allow_fallback_to_proctask(false);
[email protected]daae1322013-09-05 18:26:504618 ChangeDnsConfig(CreateValidDnsConfig());
4619
Eric Orth117e1992019-04-17 00:24:154620 ResolveHostResponseHelper response(resolver_->CreateRequest(
4621 HostPortPair("4slow_ok", 80), NetLogWithSource(), base::nullopt,
4622 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004623 EXPECT_EQ(2u, num_running_dispatcher_jobs());
4624
4625 // The IPv6 request should complete, the IPv4 request is still pending.
4626 base::RunLoop().RunUntilIdle();
4627 EXPECT_EQ(1u, num_running_dispatcher_jobs());
4628
4629 response.CancelRequest();
4630 base::RunLoop().RunUntilIdle();
4631 EXPECT_FALSE(response.complete());
4632}
4633
dalyk4f4ac712019-05-31 16:33:134634TEST_F(HostResolverManagerDnsTest, CancelWithAutomaticModeTransactionPending) {
4635 MockDnsClientRuleList rules;
4636 rules.emplace_back("secure_6slow_6nx_insecure_6slow_ok", dns_protocol::kTypeA,
4637 true /* secure */,
4638 MockDnsClientRule::Result(MockDnsClientRule::OK),
4639 false /* delay */);
4640 rules.emplace_back("secure_6slow_6nx_insecure_6slow_ok",
4641 dns_protocol::kTypeAAAA, true /* secure */,
4642 MockDnsClientRule::Result(MockDnsClientRule::FAIL),
4643 true /* delay */);
4644 rules.emplace_back("secure_6slow_6nx_insecure_6slow_ok", dns_protocol::kTypeA,
4645 false /* secure */,
4646 MockDnsClientRule::Result(MockDnsClientRule::OK),
4647 false /* delay */);
4648 rules.emplace_back("secure_6slow_6nx_insecure_6slow_ok",
4649 dns_protocol::kTypeAAAA, false /* secure */,
4650 MockDnsClientRule::Result(MockDnsClientRule::OK),
4651 true /* delay */);
4652 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
4653
4654 DnsConfigOverrides overrides;
4655 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
4656 resolver_->SetDnsConfigOverrides(overrides);
4657
4658 ResolveHostResponseHelper response0(resolver_->CreateRequest(
4659 HostPortPair("secure_6slow_6nx_insecure_6slow_ok", 80),
4660 NetLogWithSource(), base::nullopt, request_context_.get(),
4661 host_cache_.get()));
4662 EXPECT_EQ(2u, num_running_dispatcher_jobs());
4663
4664 // The secure IPv4 request should complete, the secure IPv6 request is still
4665 // pending.
4666 base::RunLoop().RunUntilIdle();
4667 EXPECT_EQ(1u, num_running_dispatcher_jobs());
4668
4669 response0.CancelRequest();
4670 base::RunLoop().RunUntilIdle();
4671 EXPECT_FALSE(response0.complete());
4672 EXPECT_EQ(0u, num_running_dispatcher_jobs());
4673
4674 ResolveHostResponseHelper response1(resolver_->CreateRequest(
4675 HostPortPair("secure_6slow_6nx_insecure_6slow_ok", 80),
4676 NetLogWithSource(), base::nullopt, request_context_.get(),
4677 host_cache_.get()));
4678 EXPECT_EQ(2u, num_running_dispatcher_jobs());
4679
4680 // The secure IPv4 request should complete, the secure IPv6 request is still
4681 // pending.
4682 base::RunLoop().RunUntilIdle();
4683 EXPECT_EQ(1u, num_running_dispatcher_jobs());
4684
4685 // Let the secure IPv6 request complete and start the insecure requests.
4686 dns_client_->CompleteDelayedTransactions();
4687 EXPECT_EQ(2u, num_running_dispatcher_jobs());
4688
4689 // The insecure IPv4 request should complete, the insecure IPv6 request is
4690 // still pending.
4691 base::RunLoop().RunUntilIdle();
4692 EXPECT_EQ(1u, num_running_dispatcher_jobs());
4693
4694 response1.CancelRequest();
4695 base::RunLoop().RunUntilIdle();
4696 EXPECT_FALSE(response1.complete());
4697
4698 // Dispatcher state checked in TearDown.
4699}
4700
[email protected]daae1322013-09-05 18:26:504701// Test cases where AAAA completes first.
Eric Orth960e7062019-03-08 18:43:544702TEST_F(HostResolverManagerDnsTest, AAAACompletesFirst) {
Eric Orth60931742018-11-05 23:40:574703 set_allow_fallback_to_proctask(false);
[email protected]daae1322013-09-05 18:26:504704 ChangeDnsConfig(CreateValidDnsConfig());
4705
Eric Orth70992982018-07-24 00:25:004706 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:154707 responses.emplace_back(
4708 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
4709 HostPortPair("4slow_ok", 80), NetLogWithSource(), base::nullopt,
4710 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:004711 responses.emplace_back(
4712 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:274713 HostPortPair("4slow_4ok", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:154714 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:004715 responses.emplace_back(
4716 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:274717 HostPortPair("4slow_4timeout", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:154718 request_context_.get(), host_cache_.get())));
Eric Orth6f1c5172019-04-16 17:08:274719 responses.emplace_back(
4720 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
4721 HostPortPair("4slow_6timeout", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:154722 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:004723
4724 base::RunLoop().RunUntilIdle();
4725 EXPECT_FALSE(responses[0]->complete());
4726 EXPECT_FALSE(responses[1]->complete());
4727 EXPECT_FALSE(responses[2]->complete());
4728 // The IPv6 of request 3 should have failed and resulted in cancelling the
4729 // IPv4 request.
4730 EXPECT_THAT(responses[3]->result_error(), IsError(ERR_DNS_TIMED_OUT));
4731 EXPECT_EQ(3u, num_running_dispatcher_jobs());
4732
4733 dns_client_->CompleteDelayedTransactions();
4734 EXPECT_THAT(responses[0]->result_error(), IsOk());
4735 EXPECT_THAT(responses[0]->request()->GetAddressResults().value().endpoints(),
4736 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4737 CreateExpected("::1", 80)));
4738
4739 EXPECT_THAT(responses[1]->result_error(), IsOk());
4740 EXPECT_THAT(responses[1]->request()->GetAddressResults().value().endpoints(),
4741 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
4742
4743 EXPECT_THAT(responses[2]->result_error(), IsError(ERR_DNS_TIMED_OUT));
4744}
4745
dalyk4f4ac712019-05-31 16:33:134746TEST_F(HostResolverManagerDnsTest, AAAACompletesFirst_AutomaticMode) {
dalyk48b20a992019-02-25 16:10:264747 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:134748 rules.emplace_back("secure_slow_nx_insecure_4slow_ok", dns_protocol::kTypeA,
4749 true /* secure */,
4750 MockDnsClientRule::Result(MockDnsClientRule::FAIL),
4751 true /* delay */);
4752 rules.emplace_back("secure_slow_nx_insecure_4slow_ok",
4753 dns_protocol::kTypeAAAA, true /* secure */,
4754 MockDnsClientRule::Result(MockDnsClientRule::FAIL),
4755 true /* delay */);
4756 rules.emplace_back("secure_slow_nx_insecure_4slow_ok", dns_protocol::kTypeA,
4757 false /* secure */,
4758 MockDnsClientRule::Result(MockDnsClientRule::OK),
4759 true /* delay */);
4760 rules.emplace_back("secure_slow_nx_insecure_4slow_ok",
4761 dns_protocol::kTypeAAAA, false /* secure */,
4762 MockDnsClientRule::Result(MockDnsClientRule::EMPTY),
4763 false /* delay */);
dalyk48b20a992019-02-25 16:10:264764 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
dalyk4f4ac712019-05-31 16:33:134765 DnsConfigOverrides overrides;
4766 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
4767 resolver_->SetDnsConfigOverrides(overrides);
dalyk48b20a992019-02-25 16:10:264768
dalyk4f4ac712019-05-31 16:33:134769 ResolveHostResponseHelper response(resolver_->CreateRequest(
4770 HostPortPair("secure_slow_nx_insecure_4slow_ok", 80), NetLogWithSource(),
4771 base::nullopt, request_context_.get(), host_cache_.get()));
dalyk48b20a992019-02-25 16:10:264772 base::RunLoop().RunUntilIdle();
dalyk4f4ac712019-05-31 16:33:134773 EXPECT_FALSE(response.complete());
4774 // Complete the secure transactions.
dalyk48b20a992019-02-25 16:10:264775 dns_client_->CompleteDelayedTransactions();
dalyk4f4ac712019-05-31 16:33:134776 base::RunLoop().RunUntilIdle();
4777 EXPECT_FALSE(response.complete());
4778 // Complete the insecure transactions.
4779 dns_client_->CompleteDelayedTransactions();
4780 ASSERT_THAT(response.result_error(), IsOk());
4781 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
4782 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
4783 HostCache::Key insecure_key = HostCache::Key(
4784 "secure_slow_nx_insecure_4slow_ok", DnsQueryType::UNSPECIFIED,
4785 0 /* host_resolver_flags */, HostResolverSource::ANY);
4786 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result =
4787 GetCacheHit(insecure_key);
4788 EXPECT_TRUE(!!cache_result);
4789}
4790
4791TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Automatic) {
4792 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.100");
4793 set_allow_fallback_to_proctask(true);
4794
4795 ChangeDnsConfig(CreateValidDnsConfig());
4796 DnsConfigOverrides overrides;
4797 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
4798 resolver_->SetDnsConfigOverrides(overrides);
dalyk48b20a992019-02-25 16:10:264799 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result;
4800
dalyk4f4ac712019-05-31 16:33:134801 // A successful DoH request should result in a secure cache entry.
4802 ResolveHostResponseHelper response_secure(resolver_->CreateRequest(
4803 HostPortPair("automatic", 80), NetLogWithSource(), base::nullopt,
4804 request_context_.get(), host_cache_.get()));
4805 ASSERT_THAT(response_secure.result_error(), IsOk());
4806 EXPECT_THAT(
4807 response_secure.request()->GetAddressResults().value().endpoints(),
4808 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4809 CreateExpected("::1", 80)));
4810 HostCache::Key secure_key =
4811 HostCache::Key("automatic", DnsQueryType::UNSPECIFIED,
4812 0 /* host_resolver_flags */, HostResolverSource::ANY);
4813 secure_key.secure = true;
4814 cache_result = GetCacheHit(secure_key);
4815 EXPECT_TRUE(!!cache_result);
4816
4817 // A successful plaintext DNS request should result in an insecure cache
4818 // entry.
4819 ResolveHostResponseHelper response_insecure(resolver_->CreateRequest(
4820 HostPortPair("insecure_automatic", 80), NetLogWithSource(), base::nullopt,
4821 request_context_.get(), host_cache_.get()));
4822 ASSERT_THAT(response_insecure.result_error(), IsOk());
4823 EXPECT_THAT(
4824 response_insecure.request()->GetAddressResults().value().endpoints(),
4825 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4826 CreateExpected("::1", 80)));
4827 HostCache::Key insecure_key =
4828 HostCache::Key("insecure_automatic", DnsQueryType::UNSPECIFIED,
4829 0 /* host_resolver_flags */, HostResolverSource::ANY);
4830 cache_result = GetCacheHit(insecure_key);
4831 EXPECT_TRUE(!!cache_result);
4832
4833 // Fallback to ProcTask allowed in AUTOMATIC mode.
4834 ResolveHostResponseHelper response_proc(resolver_->CreateRequest(
4835 HostPortPair("nx_succeed", 80), NetLogWithSource(), base::nullopt,
4836 request_context_.get(), host_cache_.get()));
4837 proc_->SignalMultiple(1u);
4838 EXPECT_THAT(response_proc.result_error(), IsOk());
4839 EXPECT_THAT(response_proc.request()->GetAddressResults().value().endpoints(),
4840 testing::ElementsAre(CreateExpected("192.168.1.100", 80)));
4841}
4842
dalyke966a1832019-06-05 20:53:134843TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Automatic_SecureCache) {
4844 ChangeDnsConfig(CreateValidDnsConfig());
4845 DnsConfigOverrides overrides;
4846 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
4847 resolver_->SetDnsConfigOverrides(overrides);
4848
4849 // Populate cache with a secure entry.
4850 HostCache::Key cached_secure_key =
4851 HostCache::Key("automatic_cached", DnsQueryType::UNSPECIFIED,
4852 0 /* host_resolver_flags */, HostResolverSource::ANY);
4853 cached_secure_key.secure = true;
4854 IPEndPoint kExpectedSecureIP = CreateExpected("192.168.1.102", 80);
4855 PopulateCache(cached_secure_key, kExpectedSecureIP);
4856
4857 // The secure cache should be checked prior to any DoH request being sent.
4858 ResolveHostResponseHelper response_secure_cached(resolver_->CreateRequest(
4859 HostPortPair("automatic_cached", 80), NetLogWithSource(), base::nullopt,
4860 request_context_.get(), host_cache_.get()));
4861 EXPECT_THAT(response_secure_cached.result_error(), IsOk());
4862 EXPECT_THAT(
4863 response_secure_cached.request()->GetAddressResults().value().endpoints(),
4864 testing::ElementsAre(kExpectedSecureIP));
4865 EXPECT_FALSE(
4866 response_secure_cached.request()->GetStaleInfo().value().is_stale());
4867}
4868
4869TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Automatic_InsecureCache) {
4870 ChangeDnsConfig(CreateValidDnsConfig());
4871 DnsConfigOverrides overrides;
4872 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
4873 resolver_->SetDnsConfigOverrides(overrides);
4874
4875 // Populate cache with an insecure entry.
4876 HostCache::Key cached_insecure_key =
4877 HostCache::Key("insecure_automatic_cached", DnsQueryType::UNSPECIFIED,
4878 0 /* host_resolver_flags */, HostResolverSource::ANY);
4879 IPEndPoint kExpectedInsecureIP = CreateExpected("192.168.1.103", 80);
4880 PopulateCache(cached_insecure_key, kExpectedInsecureIP);
4881
4882 // The insecure cache should be checked after DoH requests fail.
4883 ResolveHostResponseHelper response_insecure_cached(resolver_->CreateRequest(
4884 HostPortPair("insecure_automatic_cached", 80), NetLogWithSource(),
4885 base::nullopt, request_context_.get(), host_cache_.get()));
4886 EXPECT_THAT(response_insecure_cached.result_error(), IsOk());
4887 EXPECT_THAT(response_insecure_cached.request()
4888 ->GetAddressResults()
4889 .value()
4890 .endpoints(),
4891 testing::ElementsAre(kExpectedInsecureIP));
4892 EXPECT_FALSE(
4893 response_insecure_cached.request()->GetStaleInfo().value().is_stale());
4894}
4895
dalyk4f4ac712019-05-31 16:33:134896TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Automatic_Downgrade) {
4897 ChangeDnsConfig(CreateValidDnsConfig());
4898 // Remove all DoH servers from the config so there is no DoH server available.
4899 DnsConfigOverrides overrides;
4900 std::vector<DnsConfig::DnsOverHttpsServerConfig> doh_servers;
4901 overrides.dns_over_https_servers = doh_servers;
4902 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
4903 resolver_->SetDnsConfigOverrides(overrides);
4904 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result;
4905
dalyke966a1832019-06-05 20:53:134906 // Populate cache with both secure and insecure entries.
4907 HostCache::Key cached_secure_key =
4908 HostCache::Key("automatic_cached", DnsQueryType::UNSPECIFIED,
4909 0 /* host_resolver_flags */, HostResolverSource::ANY);
4910 cached_secure_key.secure = true;
4911 IPEndPoint kExpectedSecureIP = CreateExpected("192.168.1.102", 80);
4912 PopulateCache(cached_secure_key, kExpectedSecureIP);
4913 HostCache::Key cached_insecure_key =
4914 HostCache::Key("insecure_automatic_cached", DnsQueryType::UNSPECIFIED,
4915 0 /* host_resolver_flags */, HostResolverSource::ANY);
4916 IPEndPoint kExpectedInsecureIP = CreateExpected("192.168.1.103", 80);
4917 PopulateCache(cached_insecure_key, kExpectedInsecureIP);
4918
4919 // The secure cache should still be checked first.
4920 ResolveHostResponseHelper response_cached(resolver_->CreateRequest(
4921 HostPortPair("automatic_cached", 80), NetLogWithSource(), base::nullopt,
4922 request_context_.get(), host_cache_.get()));
4923 EXPECT_THAT(response_cached.result_error(), IsOk());
4924 EXPECT_THAT(
4925 response_cached.request()->GetAddressResults().value().endpoints(),
4926 testing::ElementsAre(kExpectedSecureIP));
4927
4928 // The insecure cache should be checked before any insecure requests are sent.
4929 ResolveHostResponseHelper insecure_response_cached(resolver_->CreateRequest(
4930 HostPortPair("insecure_automatic_cached", 80), NetLogWithSource(),
4931 base::nullopt, request_context_.get(), host_cache_.get()));
4932 EXPECT_THAT(insecure_response_cached.result_error(), IsOk());
4933 EXPECT_THAT(insecure_response_cached.request()
4934 ->GetAddressResults()
4935 .value()
4936 .endpoints(),
4937 testing::ElementsAre(kExpectedInsecureIP));
4938
dalyk4f4ac712019-05-31 16:33:134939 // The DnsConfig doesn't contain DoH servers so AUTOMATIC mode will be
4940 // downgraded to OFF. A successful plaintext DNS request should result in an
4941 // insecure cache entry.
4942 ResolveHostResponseHelper response(resolver_->CreateRequest(
4943 HostPortPair("automatic", 80), NetLogWithSource(), base::nullopt,
4944 request_context_.get(), host_cache_.get()));
4945 ASSERT_THAT(response.result_error(), IsOk());
4946 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
dalyk48b20a992019-02-25 16:10:264947 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4948 CreateExpected("::1", 80)));
4949 HostCache::Key key =
dalyk4f4ac712019-05-31 16:33:134950 HostCache::Key("automatic", DnsQueryType::UNSPECIFIED,
dalyk48b20a992019-02-25 16:10:264951 0 /* host_resolver_flags */, HostResolverSource::ANY);
dalyk48b20a992019-02-25 16:10:264952 cache_result = GetCacheHit(key);
4953 EXPECT_TRUE(!!cache_result);
dalyk4f4ac712019-05-31 16:33:134954}
dalyk48b20a992019-02-25 16:10:264955
dalyke966a1832019-06-05 20:53:134956TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Automatic_Stale) {
4957 ChangeDnsConfig(CreateValidDnsConfig());
4958 DnsConfigOverrides overrides;
4959 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
4960 resolver_->SetDnsConfigOverrides(overrides);
4961
4962 // Populate cache with insecure entry.
4963 HostCache::Key cached_stale_key =
4964 HostCache::Key("automatic_stale", DnsQueryType::UNSPECIFIED,
4965 0 /* host_resolver_flags */, HostResolverSource::ANY);
4966 IPEndPoint kExpectedStaleIP = CreateExpected("192.168.1.102", 80);
4967 PopulateCache(cached_stale_key, kExpectedStaleIP);
4968 MakeCacheStale();
4969
4970 HostResolver::ResolveHostParameters stale_allowed_parameters;
4971 stale_allowed_parameters.cache_usage =
4972 HostResolver::ResolveHostParameters::CacheUsage::STALE_ALLOWED;
4973
4974 // The insecure cache should be checked before secure requests are made since
4975 // stale results are allowed.
4976 ResolveHostResponseHelper response_stale(resolver_->CreateRequest(
4977 HostPortPair("automatic_stale", 80), NetLogWithSource(),
4978 stale_allowed_parameters, request_context_.get(), host_cache_.get()));
4979 EXPECT_THAT(response_stale.result_error(), IsOk());
4980 EXPECT_THAT(response_stale.request()->GetAddressResults().value().endpoints(),
4981 testing::ElementsAre(kExpectedStaleIP));
4982 EXPECT_TRUE(response_stale.request()->GetStaleInfo()->is_stale());
4983}
4984
dalykc27699a2019-07-29 20:53:294985TEST_F(HostResolverManagerDnsTest,
4986 SecureDnsMode_Automatic_InsecureAsyncDisabled) {
4987 proc_->AddRuleForAllFamilies("insecure_automatic", "192.168.1.100");
4988 ChangeDnsConfig(CreateValidDnsConfig());
4989 resolver_->SetInsecureDnsClientEnabled(false);
4990 DnsConfigOverrides overrides;
4991 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
4992 resolver_->SetDnsConfigOverrides(overrides);
4993
4994 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result;
4995
4996 // The secure part of the dns client should be enabled.
4997 ResolveHostResponseHelper response_secure(resolver_->CreateRequest(
4998 HostPortPair("automatic", 80), NetLogWithSource(), base::nullopt,
4999 request_context_.get(), host_cache_.get()));
5000 ASSERT_THAT(response_secure.result_error(), IsOk());
5001 EXPECT_THAT(
5002 response_secure.request()->GetAddressResults().value().endpoints(),
5003 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
5004 CreateExpected("::1", 80)));
5005 HostCache::Key secure_key =
5006 HostCache::Key("automatic", DnsQueryType::UNSPECIFIED,
5007 0 /* host_resolver_flags */, HostResolverSource::ANY);
5008 secure_key.secure = true;
5009 cache_result = GetCacheHit(secure_key);
5010 EXPECT_TRUE(!!cache_result);
5011
5012 // The insecure part of the dns client is disabled so insecure requests
5013 // should be skipped.
5014 ResolveHostResponseHelper response_insecure(resolver_->CreateRequest(
5015 HostPortPair("insecure_automatic", 80), NetLogWithSource(), base::nullopt,
5016 request_context_.get(), host_cache_.get()));
5017 proc_->SignalMultiple(1u);
5018 ASSERT_THAT(response_insecure.result_error(), IsOk());
5019 EXPECT_THAT(
5020 response_insecure.request()->GetAddressResults().value().endpoints(),
5021 testing::ElementsAre(CreateExpected("192.168.1.100", 80)));
5022 HostCache::Key insecure_key =
5023 HostCache::Key("insecure_automatic", DnsQueryType::UNSPECIFIED,
5024 0 /* host_resolver_flags */, HostResolverSource::ANY);
5025 cache_result = GetCacheHit(insecure_key);
5026 EXPECT_TRUE(!!cache_result);
5027
5028 HostCache::Key cached_insecure_key =
5029 HostCache::Key("insecure_automatic_cached", DnsQueryType::UNSPECIFIED,
5030 0 /* host_resolver_flags */, HostResolverSource::ANY);
5031 IPEndPoint kExpectedInsecureIP = CreateExpected("192.168.1.101", 80);
5032 PopulateCache(cached_insecure_key, kExpectedInsecureIP);
5033
5034 // The insecure cache should still be checked even if the insecure part of
5035 // the dns client is disabled.
5036 ResolveHostResponseHelper response_insecure_cached(resolver_->CreateRequest(
5037 HostPortPair("insecure_automatic_cached", 80), NetLogWithSource(),
5038 base::nullopt, request_context_.get(), host_cache_.get()));
5039 EXPECT_THAT(response_insecure_cached.result_error(), IsOk());
5040 EXPECT_THAT(response_insecure_cached.request()
5041 ->GetAddressResults()
5042 .value()
5043 .endpoints(),
5044 testing::ElementsAre(kExpectedInsecureIP));
5045}
5046
dalyk6d7d8ead2019-08-15 03:30:085047TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Automatic_DotActive) {
5048 proc_->AddRuleForAllFamilies("insecure_automatic", "192.168.1.100");
5049 DnsConfig config = CreateValidDnsConfig();
5050 config.dns_over_tls_active = true;
5051 ChangeDnsConfig(config);
5052 DnsConfigOverrides overrides;
5053 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
5054 resolver_->SetDnsConfigOverrides(overrides);
5055
5056 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result;
5057
5058 // The secure part of the dns client should be enabled.
5059 ResolveHostResponseHelper response_secure(resolver_->CreateRequest(
5060 HostPortPair("automatic", 80), NetLogWithSource(), base::nullopt,
5061 request_context_.get(), host_cache_.get()));
5062 ASSERT_THAT(response_secure.result_error(), IsOk());
5063 EXPECT_THAT(
5064 response_secure.request()->GetAddressResults().value().endpoints(),
5065 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
5066 CreateExpected("::1", 80)));
5067 HostCache::Key secure_key =
5068 HostCache::Key("automatic", DnsQueryType::UNSPECIFIED,
5069 0 /* host_resolver_flags */, HostResolverSource::ANY);
5070 secure_key.secure = true;
5071 cache_result = GetCacheHit(secure_key);
5072 EXPECT_TRUE(!!cache_result);
5073
5074 // Insecure async requests should be skipped since the system resolver
5075 // requests will be secure.
5076 ResolveHostResponseHelper response_insecure(resolver_->CreateRequest(
5077 HostPortPair("insecure_automatic", 80), NetLogWithSource(), base::nullopt,
5078 request_context_.get(), host_cache_.get()));
5079 proc_->SignalMultiple(1u);
5080 ASSERT_THAT(response_insecure.result_error(), IsOk());
5081 EXPECT_THAT(
5082 response_insecure.request()->GetAddressResults().value().endpoints(),
5083 testing::ElementsAre(CreateExpected("192.168.1.100", 80)));
5084 HostCache::Key insecure_key =
5085 HostCache::Key("insecure_automatic", DnsQueryType::UNSPECIFIED,
5086 0 /* host_resolver_flags */, HostResolverSource::ANY);
5087 cache_result = GetCacheHit(insecure_key);
5088 EXPECT_TRUE(!!cache_result);
5089
5090 HostCache::Key cached_insecure_key =
5091 HostCache::Key("insecure_automatic_cached", DnsQueryType::UNSPECIFIED,
5092 0 /* host_resolver_flags */, HostResolverSource::ANY);
5093 IPEndPoint kExpectedInsecureIP = CreateExpected("192.168.1.101", 80);
5094 PopulateCache(cached_insecure_key, kExpectedInsecureIP);
5095
5096 // The insecure cache should still be checked.
5097 ResolveHostResponseHelper response_insecure_cached(resolver_->CreateRequest(
5098 HostPortPair("insecure_automatic_cached", 80), NetLogWithSource(),
5099 base::nullopt, request_context_.get(), host_cache_.get()));
5100 EXPECT_THAT(response_insecure_cached.result_error(), IsOk());
5101 EXPECT_THAT(response_insecure_cached.request()
5102 ->GetAddressResults()
5103 .value()
5104 .endpoints(),
5105 testing::ElementsAre(kExpectedInsecureIP));
5106}
5107
dalyk4f4ac712019-05-31 16:33:135108TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Secure) {
5109 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.100");
5110 set_allow_fallback_to_proctask(true);
5111
dalykc27699a2019-07-29 20:53:295112 ChangeDnsConfig(CreateValidDnsConfig());
dalyk4f4ac712019-05-31 16:33:135113 DnsConfigOverrides overrides;
5114 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::SECURE;
5115 resolver_->SetDnsConfigOverrides(overrides);
5116 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result;
5117
5118 ResolveHostResponseHelper response_secure(resolver_->CreateRequest(
5119 HostPortPair("secure", 80), NetLogWithSource(), base::nullopt,
5120 request_context_.get(), host_cache_.get()));
5121 ASSERT_THAT(response_secure.result_error(), IsOk());
5122 HostCache::Key secure_key =
5123 HostCache::Key("secure", DnsQueryType::UNSPECIFIED,
5124 0 /* host_resolver_flags */, HostResolverSource::ANY);
5125 secure_key.secure = true;
5126 cache_result = GetCacheHit(secure_key);
dalyk48b20a992019-02-25 16:10:265127 EXPECT_TRUE(!!cache_result);
5128
dalyk4f4ac712019-05-31 16:33:135129 ResolveHostResponseHelper response_insecure(resolver_->CreateRequest(
5130 HostPortPair("ok", 80), NetLogWithSource(), base::nullopt,
5131 request_context_.get(), host_cache_.get()));
5132 ASSERT_THAT(response_insecure.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
5133 HostCache::Key insecure_key =
5134 HostCache::Key("ok", DnsQueryType::UNSPECIFIED,
5135 0 /* host_resolver_flags */, HostResolverSource::ANY);
5136 cache_result = GetCacheHit(insecure_key);
5137 EXPECT_FALSE(!!cache_result);
dalyk48b20a992019-02-25 16:10:265138
dalyk4f4ac712019-05-31 16:33:135139 // Fallback to ProcTask not allowed in SECURE mode.
5140 ResolveHostResponseHelper response_proc(resolver_->CreateRequest(
5141 HostPortPair("nx_succeed", 80), NetLogWithSource(), base::nullopt,
5142 request_context_.get(), host_cache_.get()));
5143 proc_->SignalMultiple(1u);
5144 EXPECT_THAT(response_proc.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
dalyk48b20a992019-02-25 16:10:265145}
5146
dalykc27699a2019-07-29 20:53:295147TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Secure_InsecureAsyncDisabled) {
5148 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.100");
5149 set_allow_fallback_to_proctask(true);
5150 resolver_->SetInsecureDnsClientEnabled(false);
5151
5152 ChangeDnsConfig(CreateValidDnsConfig());
5153 DnsConfigOverrides overrides;
5154 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::SECURE;
5155 resolver_->SetDnsConfigOverrides(overrides);
5156 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result;
5157
5158 // The secure part of the dns client should be enabled.
5159 ResolveHostResponseHelper response_secure(resolver_->CreateRequest(
5160 HostPortPair("secure", 80), NetLogWithSource(), base::nullopt,
5161 request_context_.get(), host_cache_.get()));
5162 ASSERT_THAT(response_secure.result_error(), IsOk());
5163 HostCache::Key secure_key =
5164 HostCache::Key("secure", DnsQueryType::UNSPECIFIED,
5165 0 /* host_resolver_flags */, HostResolverSource::ANY);
5166 secure_key.secure = true;
5167 cache_result = GetCacheHit(secure_key);
5168 EXPECT_TRUE(!!cache_result);
5169}
5170
[email protected]daae1322013-09-05 18:26:505171// Test the case where only a single transaction slot is available.
Eric Orth960e7062019-03-08 18:43:545172TEST_F(HostResolverManagerDnsTest, SerialResolver) {
[email protected]daae1322013-09-05 18:26:505173 CreateSerialResolver();
Eric Orth60931742018-11-05 23:40:575174 set_allow_fallback_to_proctask(false);
[email protected]daae1322013-09-05 18:26:505175 ChangeDnsConfig(CreateValidDnsConfig());
5176
Eric Orth117e1992019-04-17 00:24:155177 ResolveHostResponseHelper response(resolver_->CreateRequest(
5178 HostPortPair("ok", 80), NetLogWithSource(), base::nullopt,
5179 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:005180 EXPECT_FALSE(response.complete());
5181 EXPECT_EQ(1u, num_running_dispatcher_jobs());
5182
5183 base::RunLoop().RunUntilIdle();
5184 EXPECT_TRUE(response.complete());
5185 EXPECT_THAT(response.result_error(), IsOk());
5186 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
5187 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
5188 CreateExpected("::1", 80)));
5189}
5190
dalyk4f4ac712019-05-31 16:33:135191TEST_F(HostResolverManagerDnsTest, SerialResolver_AutomaticMode) {
5192 CreateSerialResolver();
5193 ChangeDnsConfig(CreateValidDnsConfig());
5194 DnsConfigOverrides overrides;
5195 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
5196 resolver_->SetDnsConfigOverrides(overrides);
5197
5198 ResolveHostResponseHelper response(resolver_->CreateRequest(
5199 HostPortPair("insecure_automatic", 80), NetLogWithSource(), base::nullopt,
5200 request_context_.get(), host_cache_.get()));
5201 EXPECT_FALSE(response.complete());
5202 EXPECT_EQ(1u, num_running_dispatcher_jobs());
5203
5204 base::RunLoop().RunUntilIdle();
5205 EXPECT_TRUE(response.complete());
5206 EXPECT_THAT(response.result_error(), IsOk());
5207 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
5208 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
5209 CreateExpected("::1", 80)));
5210 HostCache::Key insecure_key =
5211 HostCache::Key("insecure_automatic", DnsQueryType::UNSPECIFIED,
5212 0 /* host_resolver_flags */, HostResolverSource::ANY);
5213 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result =
5214 GetCacheHit(insecure_key);
5215 EXPECT_TRUE(!!cache_result);
5216}
5217
Eric Orth70992982018-07-24 00:25:005218// Test the case where subsequent transactions are handled on transaction
5219// completion when only part of a multi-transaction request could be initially
5220// started.
Eric Orth960e7062019-03-08 18:43:545221TEST_F(HostResolverManagerDnsTest, AAAAStartsAfterOtherJobFinishes) {
Eric Orth70992982018-07-24 00:25:005222 CreateResolverWithLimitsAndParams(3u, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:325223 true /* ipv6_reachable */,
5224 true /* check_ipv6_on_wifi */);
Eric Orth60931742018-11-05 23:40:575225 set_allow_fallback_to_proctask(false);
Eric Orth70992982018-07-24 00:25:005226 ChangeDnsConfig(CreateValidDnsConfig());
5227
Eric Orth117e1992019-04-17 00:24:155228 ResolveHostResponseHelper response0(resolver_->CreateRequest(
5229 HostPortPair("ok", 80), NetLogWithSource(), base::nullopt,
5230 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:005231 EXPECT_EQ(2u, num_running_dispatcher_jobs());
Eric Orth117e1992019-04-17 00:24:155232 ResolveHostResponseHelper response1(resolver_->CreateRequest(
5233 HostPortPair("4slow_ok", 80), NetLogWithSource(), base::nullopt,
5234 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:005235 EXPECT_EQ(3u, num_running_dispatcher_jobs());
5236
5237 // Request 0's transactions should complete, starting Request 1's second
5238 // transaction, which should also complete.
5239 base::RunLoop().RunUntilIdle();
5240 EXPECT_EQ(1u, num_running_dispatcher_jobs());
5241 EXPECT_TRUE(response0.complete());
5242 EXPECT_FALSE(response1.complete());
5243
5244 dns_client_->CompleteDelayedTransactions();
5245 EXPECT_THAT(response1.result_error(), IsOk());
5246 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
5247 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
5248 CreateExpected("::1", 80)));
5249}
5250
[email protected]daae1322013-09-05 18:26:505251// Tests the case that a Job with a single transaction receives an empty address
5252// list, triggering fallback to ProcTask.
Eric Orth960e7062019-03-08 18:43:545253TEST_F(HostResolverManagerDnsTest, IPv4EmptyFallback) {
Eric Orth70992982018-07-24 00:25:005254 // Disable ipv6 to ensure we'll only try a single transaction for the host.
5255 CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:325256 false /* ipv6_reachable */,
5257 true /* check_ipv6_on_wifi */);
Eric Orth70992982018-07-24 00:25:005258 DnsConfig config = CreateValidDnsConfig();
5259 config.use_local_ipv6 = false;
5260 ChangeDnsConfig(config);
5261
Eric Orth322af3e42018-08-20 18:12:595262 proc_->AddRuleForAllFamilies("empty_fallback", "192.168.0.1",
5263 HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6);
Eric Orth70992982018-07-24 00:25:005264 proc_->SignalMultiple(1u);
5265
5266 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:275267 HostPortPair("empty_fallback", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:155268 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:005269 EXPECT_THAT(response.result_error(), IsOk());
5270 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
5271 testing::ElementsAre(CreateExpected("192.168.0.1", 80)));
5272}
5273
[email protected]daae1322013-09-05 18:26:505274// Tests the case that a Job with two transactions receives two empty address
5275// lists, triggering fallback to ProcTask.
Eric Orth960e7062019-03-08 18:43:545276TEST_F(HostResolverManagerDnsTest, UnspecEmptyFallback) {
[email protected]daae1322013-09-05 18:26:505277 ChangeDnsConfig(CreateValidDnsConfig());
5278 proc_->AddRuleForAllFamilies("empty_fallback", "192.168.0.1");
5279 proc_->SignalMultiple(1u);
Eric Orth70992982018-07-24 00:25:005280
5281 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:275282 HostPortPair("empty_fallback", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:155283 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:005284
5285 EXPECT_THAT(response.result_error(), IsOk());
5286 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
5287 testing::ElementsAre(CreateExpected("192.168.0.1", 80)));
5288}
5289
[email protected]daae1322013-09-05 18:26:505290// Tests getting a new invalid DnsConfig while there are active DnsTasks.
Eric Orth960e7062019-03-08 18:43:545291TEST_F(HostResolverManagerDnsTest, InvalidDnsConfigWithPendingRequests) {
Eric Orth70992982018-07-24 00:25:005292 // At most 3 jobs active at once. This number is important, since we want
Eric Orth960e7062019-03-08 18:43:545293 // to make sure that aborting the first HostResolverManager::Job does not
Eric Orth70992982018-07-24 00:25:005294 // trigger another DnsTransaction on the second Job when it releases its
5295 // second prioritized dispatcher slot.
5296 CreateResolverWithLimitsAndParams(3u, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:325297 true /* ipv6_reachable */,
5298 true /* check_ipv6_on_wifi */);
Eric Orth70992982018-07-24 00:25:005299
5300 ChangeDnsConfig(CreateValidDnsConfig());
5301
5302 proc_->AddRuleForAllFamilies("slow_nx1", "192.168.0.1");
5303 proc_->AddRuleForAllFamilies("slow_nx2", "192.168.0.2");
5304 proc_->AddRuleForAllFamilies("ok", "192.168.0.3");
5305
5306 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
5307 // First active job gets two slots.
Eric Orth117e1992019-04-17 00:24:155308 responses.emplace_back(
5309 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
5310 HostPortPair("slow_nx1", 80), NetLogWithSource(), base::nullopt,
5311 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:005312 // Next job gets one slot, and waits on another.
Eric Orth117e1992019-04-17 00:24:155313 responses.emplace_back(
5314 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
5315 HostPortPair("slow_nx2", 80), NetLogWithSource(), base::nullopt,
5316 request_context_.get(), host_cache_.get())));
5317 responses.emplace_back(
5318 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
5319 HostPortPair("ok", 80), NetLogWithSource(), base::nullopt,
5320 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:005321
5322 EXPECT_EQ(3u, num_running_dispatcher_jobs());
5323 for (auto& response : responses) {
5324 EXPECT_FALSE(response->complete());
5325 }
5326
dalyk4f4ac712019-05-31 16:33:135327 // Clear DNS config. Fully in-progress, partially in-progress, and queued
5328 // requests should all be aborted.
Eric Orth70992982018-07-24 00:25:005329 ChangeDnsConfig(DnsConfig());
dalyk4f4ac712019-05-31 16:33:135330 for (auto& response : responses) {
5331 EXPECT_THAT(response->result_error(), IsError(ERR_NETWORK_CHANGED));
5332 }
Eric Orth70992982018-07-24 00:25:005333}
5334
Eric Orth70992982018-07-24 00:25:005335// Test that initial DNS config read signals do not abort pending requests
5336// when using DnsClient.
Eric Orth960e7062019-03-08 18:43:545337TEST_F(HostResolverManagerDnsTest, DontAbortOnInitialDNSConfigRead) {
Eric Orth70992982018-07-24 00:25:005338 // DnsClient is enabled, but there's no DnsConfig, so the request should start
5339 // using ProcTask.
Eric Orth117e1992019-04-17 00:24:155340 ResolveHostResponseHelper response(resolver_->CreateRequest(
5341 HostPortPair("host1", 70), NetLogWithSource(), base::nullopt,
5342 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:005343 EXPECT_FALSE(response.complete());
5344
5345 EXPECT_TRUE(proc_->WaitFor(1u));
5346 // Send the initial config read signal, with a valid config.
5347 SetInitialDnsConfig(CreateValidDnsConfig());
5348 proc_->SignalAll();
5349
5350 EXPECT_THAT(response.result_error(), IsOk());
5351}
5352
dalykc27699a2019-07-29 20:53:295353// Tests the case that the insecure part of the DnsClient is automatically
5354// disabled due to failures while there are active DnsTasks.
Eric Orth960e7062019-03-08 18:43:545355TEST_F(HostResolverManagerDnsTest,
dalykc27699a2019-07-29 20:53:295356 AutomaticallyDisableInsecureDnsClientWithPendingRequests) {
[email protected]daae1322013-09-05 18:26:505357 // Trying different limits is important for this test: Different limits
5358 // result in different behavior when aborting in-progress DnsTasks. Having
5359 // a DnsTask that has one job active and one in the queue when another job
5360 // occupying two slots has its DnsTask aborted is the case most likely to run
Eric Orth60931742018-11-05 23:40:575361 // into problems. Try limits between [1, 2 * # of non failure requests].
5362 for (size_t limit = 1u; limit < 10u; ++limit) {
Eric Orth70992982018-07-24 00:25:005363 CreateResolverWithLimitsAndParams(limit, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:325364 true /* ipv6_reachable */,
5365 true /* check_ipv6_on_wifi */);
Eric Orth70992982018-07-24 00:25:005366
5367 ChangeDnsConfig(CreateValidDnsConfig());
5368
dalykc27699a2019-07-29 20:53:295369 // Queue up enough failures to disable insecure DnsTasks. These will all
5370 // fall back to ProcTasks, and succeed there.
Eric Orth70992982018-07-24 00:25:005371 std::vector<std::unique_ptr<ResolveHostResponseHelper>> failure_responses;
dalykc27699a2019-07-29 20:53:295372 for (unsigned i = 0u; i < maximum_insecure_dns_task_failures(); ++i) {
Eric Orth70992982018-07-24 00:25:005373 std::string host = base::StringPrintf("nx%u", i);
5374 proc_->AddRuleForAllFamilies(host, "192.168.0.1");
5375 failure_responses.emplace_back(
5376 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:275377 HostPortPair(host, 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:155378 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:005379 EXPECT_FALSE(failure_responses[i]->complete());
5380 }
5381
dalykc27699a2019-07-29 20:53:295382 // These requests should all bypass insecure DnsTasks, due to the above
5383 // failures, so should end up using ProcTasks.
Eric Orth70992982018-07-24 00:25:005384 proc_->AddRuleForAllFamilies("slow_ok1", "192.168.0.2");
5385 ResolveHostResponseHelper response0(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:275386 HostPortPair("slow_ok1", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:155387 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:005388 EXPECT_FALSE(response0.complete());
5389 proc_->AddRuleForAllFamilies("slow_ok2", "192.168.0.3");
5390 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:275391 HostPortPair("slow_ok2", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:155392 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:005393 EXPECT_FALSE(response1.complete());
5394 proc_->AddRuleForAllFamilies("slow_ok3", "192.168.0.4");
5395 ResolveHostResponseHelper response2(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:275396 HostPortPair("slow_ok3", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:155397 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:005398 EXPECT_FALSE(response2.complete());
5399
Eric Orth60931742018-11-05 23:40:575400 // Requests specifying DNS source cannot fallback to ProcTask, so they
5401 // should be unaffected.
5402 HostResolver::ResolveHostParameters parameters;
5403 parameters.source = HostResolverSource::DNS;
5404 ResolveHostResponseHelper response_dns(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:275405 HostPortPair("4slow_ok", 80), NetLogWithSource(), parameters,
Eric Orth117e1992019-04-17 00:24:155406 request_context_.get(), host_cache_.get()));
Eric Orth60931742018-11-05 23:40:575407 EXPECT_FALSE(response_dns.complete());
5408
5409 // Requests specifying SYSTEM source should be unaffected by disabling
5410 // DnsClient.
5411 proc_->AddRuleForAllFamilies("nx_ok", "192.168.0.5");
5412 parameters.source = HostResolverSource::SYSTEM;
Eric Orth117e1992019-04-17 00:24:155413 ResolveHostResponseHelper response_system(resolver_->CreateRequest(
5414 HostPortPair("nx_ok", 80), NetLogWithSource(), parameters,
5415 request_context_.get(), host_cache_.get()));
Eric Orth60931742018-11-05 23:40:575416 EXPECT_FALSE(response_system.complete());
5417
dalykc27699a2019-07-29 20:53:295418 // Secure DnsTasks should not be affected.
5419 HostResolver::ResolveHostParameters secure_parameters;
5420 secure_parameters.secure_dns_mode_override =
5421 DnsConfig::SecureDnsMode::AUTOMATIC;
5422 ResolveHostResponseHelper response_secure(resolver_->CreateRequest(
5423 HostPortPair("automatic", 80), NetLogWithSource(), secure_parameters,
5424 request_context_.get(), host_cache_.get()));
5425 EXPECT_FALSE(response_secure.complete());
Eric Orth70992982018-07-24 00:25:005426
dalykc27699a2019-07-29 20:53:295427 proc_->SignalMultiple(maximum_insecure_dns_task_failures() + 6);
5428
5429 for (size_t i = 0u; i < maximum_insecure_dns_task_failures(); ++i) {
Eric Orth70992982018-07-24 00:25:005430 EXPECT_THAT(failure_responses[i]->result_error(), IsOk());
5431 EXPECT_THAT(failure_responses[i]
5432 ->request()
5433 ->GetAddressResults()
5434 .value()
5435 .endpoints(),
5436 testing::ElementsAre(CreateExpected("192.168.0.1", 80)));
5437 }
5438
5439 EXPECT_THAT(response0.result_error(), IsOk());
5440 EXPECT_THAT(response0.request()->GetAddressResults().value().endpoints(),
5441 testing::ElementsAre(CreateExpected("192.168.0.2", 80)));
5442 EXPECT_THAT(response1.result_error(), IsOk());
5443 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
5444 testing::ElementsAre(CreateExpected("192.168.0.3", 80)));
5445 EXPECT_THAT(response2.result_error(), IsOk());
5446 EXPECT_THAT(response2.request()->GetAddressResults().value().endpoints(),
5447 testing::ElementsAre(CreateExpected("192.168.0.4", 80)));
Eric Orth60931742018-11-05 23:40:575448
5449 dns_client_->CompleteDelayedTransactions();
5450 EXPECT_THAT(response_dns.result_error(), IsOk());
5451
5452 EXPECT_THAT(response_system.result_error(), IsOk());
5453 EXPECT_THAT(
5454 response_system.request()->GetAddressResults().value().endpoints(),
5455 testing::ElementsAre(CreateExpected("192.168.0.5", 80)));
dalykc27699a2019-07-29 20:53:295456
5457 EXPECT_THAT(response_secure.result_error(), IsOk());
Eric Orth70992982018-07-24 00:25:005458 }
5459}
5460
[email protected]daae1322013-09-05 18:26:505461// Tests a call to SetDnsClient while there are active DnsTasks.
Eric Orth960e7062019-03-08 18:43:545462TEST_F(HostResolverManagerDnsTest,
5463 ManuallyDisableDnsClientWithPendingRequests) {
[email protected]daae1322013-09-05 18:26:505464 // At most 3 jobs active at once. This number is important, since we want to
Eric Orth960e7062019-03-08 18:43:545465 // make sure that aborting the first HostResolverManager::Job does not trigger
[email protected]daae1322013-09-05 18:26:505466 // another DnsTransaction on the second Job when it releases its second
5467 // prioritized dispatcher slot.
Eric Orth70992982018-07-24 00:25:005468 CreateResolverWithLimitsAndParams(3u, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:325469 true /* ipv6_reachable */,
5470 true /* check_ipv6_on_wifi */);
[email protected]daae1322013-09-05 18:26:505471
[email protected]daae1322013-09-05 18:26:505472 ChangeDnsConfig(CreateValidDnsConfig());
5473
5474 proc_->AddRuleForAllFamilies("slow_ok1", "192.168.0.1");
5475 proc_->AddRuleForAllFamilies("slow_ok2", "192.168.0.2");
5476 proc_->AddRuleForAllFamilies("ok", "192.168.0.3");
5477
Eric Orth70992982018-07-24 00:25:005478 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
5479 // First active job gets two slots.
Eric Orth117e1992019-04-17 00:24:155480 responses.emplace_back(
5481 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
5482 HostPortPair("slow_ok1", 80), NetLogWithSource(), base::nullopt,
5483 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:005484 EXPECT_FALSE(responses[0]->complete());
5485 // Next job gets one slot, and waits on another.
Eric Orth117e1992019-04-17 00:24:155486 responses.emplace_back(
5487 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
5488 HostPortPair("slow_ok2", 80), NetLogWithSource(), base::nullopt,
5489 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:005490 EXPECT_FALSE(responses[1]->complete());
5491 // Next one is queued.
Eric Orth117e1992019-04-17 00:24:155492 responses.emplace_back(
5493 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
5494 HostPortPair("ok", 80), NetLogWithSource(), base::nullopt,
5495 request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:005496 EXPECT_FALSE(responses[2]->complete());
5497
5498 EXPECT_EQ(3u, num_running_dispatcher_jobs());
5499
5500 // Clear DnsClient. The two in-progress jobs should fall back to a ProcTask,
5501 // and the next one should be started with a ProcTask.
dalykc27699a2019-07-29 20:53:295502 resolver_->SetInsecureDnsClientEnabled(false);
Eric Orth70992982018-07-24 00:25:005503
5504 // All three in-progress requests should now be running a ProcTask.
5505 EXPECT_EQ(3u, num_running_dispatcher_jobs());
5506 proc_->SignalMultiple(3u);
5507
5508 for (auto& response : responses) {
5509 EXPECT_THAT(response->result_error(), IsOk());
5510 }
5511 EXPECT_THAT(responses[0]->request()->GetAddressResults().value().endpoints(),
5512 testing::ElementsAre(CreateExpected("192.168.0.1", 80)));
5513 EXPECT_THAT(responses[1]->request()->GetAddressResults().value().endpoints(),
5514 testing::ElementsAre(CreateExpected("192.168.0.2", 80)));
5515 EXPECT_THAT(responses[2]->request()->GetAddressResults().value().endpoints(),
5516 testing::ElementsAre(CreateExpected("192.168.0.3", 80)));
5517}
5518
Eric Orth04aad982019-05-06 22:41:045519// When explicitly requesting source=DNS, no fallback allowed, so doing so with
5520// DnsClient disabled should result in an error.
5521TEST_F(HostResolverManagerDnsTest, DnsCallsWithDisabledDnsClient) {
Eric Orth4e55b362019-05-07 22:00:035522 ChangeDnsConfig(CreateValidDnsConfig());
dalykc27699a2019-07-29 20:53:295523 resolver_->SetInsecureDnsClientEnabled(false);
Eric Orth04aad982019-05-06 22:41:045524
5525 HostResolver::ResolveHostParameters params;
5526 params.source = HostResolverSource::DNS;
5527 ResolveHostResponseHelper response(resolver_->CreateRequest(
5528 HostPortPair("host", 80), NetLogWithSource(), params,
5529 request_context_.get(), host_cache_.get()));
5530
dalykc27699a2019-07-29 20:53:295531 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_CACHE_MISS));
Eric Orth04aad982019-05-06 22:41:045532}
5533
Eric Orth4e55b362019-05-07 22:00:035534TEST_F(HostResolverManagerDnsTest,
5535 DnsCallsWithDisabledDnsClient_DisabledAtConstruction) {
5536 HostResolver::ManagerOptions options = DefaultOptions();
dalykc27699a2019-07-29 20:53:295537 options.insecure_dns_client_enabled = false;
Eric Orth4e55b362019-05-07 22:00:035538 CreateResolverWithOptionsAndParams(std::move(options),
5539 DefaultParams(proc_.get()),
5540 true /* ipv6_reachable */);
5541 ChangeDnsConfig(CreateValidDnsConfig());
5542
5543 HostResolver::ResolveHostParameters params;
5544 params.source = HostResolverSource::DNS;
5545 ResolveHostResponseHelper response(resolver_->CreateRequest(
5546 HostPortPair("host", 80), NetLogWithSource(), params,
5547 request_context_.get(), host_cache_.get()));
5548
dalykc27699a2019-07-29 20:53:295549 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_CACHE_MISS));
Eric Orth4e55b362019-05-07 22:00:035550}
5551
5552// Same as DnsClient disabled, requests with source=DNS and no usable DnsConfig
5553// should result in an error.
5554TEST_F(HostResolverManagerDnsTest, DnsCallsWithNoDnsConfig) {
5555 ChangeDnsConfig(DnsConfig());
5556
5557 HostResolver::ResolveHostParameters params;
5558 params.source = HostResolverSource::DNS;
5559 ResolveHostResponseHelper response(resolver_->CreateRequest(
5560 HostPortPair("host", 80), NetLogWithSource(), params,
5561 request_context_.get(), host_cache_.get()));
5562
dalykc27699a2019-07-29 20:53:295563 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_CACHE_MISS));
Eric Orth4e55b362019-05-07 22:00:035564}
5565
Eric Orth607b6d82019-05-08 16:43:325566TEST_F(HostResolverManagerDnsTest, NoCheckIpv6OnWifi) {
rchce64e6732017-06-05 17:41:575567 // CreateSerialResolver will destroy the current resolver_ which will attempt
5568 // to remove itself from the NetworkChangeNotifier. If this happens after a
5569 // new NetworkChangeNotifier is active, then it will not remove itself from
5570 // the old NetworkChangeNotifier which is a potential use-after-free.
Eric Orth37b18192019-04-22 19:09:285571 DestroyResolver();
mgershaf9a9232017-04-13 20:19:035572 test::ScopedMockNetworkChangeNotifier notifier;
Eric Orth607b6d82019-05-08 16:43:325573 // Serial resolver to guarantee order of resolutions.
5574 CreateSerialResolver(false /* check_ipv6_on_wifi */);
mgershaf9a9232017-04-13 20:19:035575
5576 notifier.mock_network_change_notifier()->SetConnectionType(
5577 NetworkChangeNotifier::CONNECTION_WIFI);
5578 // Needed so IPv6 availability check isn't skipped.
5579 ChangeDnsConfig(CreateValidDnsConfig());
5580
5581 proc_->AddRule("h1", ADDRESS_FAMILY_UNSPECIFIED, "::3");
5582 proc_->AddRule("h1", ADDRESS_FAMILY_IPV4, "1.0.0.1");
Eric Orth322af3e42018-08-20 18:12:595583 proc_->AddRule("h1", ADDRESS_FAMILY_IPV4, "1.0.0.1",
5584 HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6);
mgershaf9a9232017-04-13 20:19:035585 proc_->AddRule("h1", ADDRESS_FAMILY_IPV6, "::2");
5586
Eric Orth117e1992019-04-17 00:24:155587 ResolveHostResponseHelper response(resolver_->CreateRequest(
5588 HostPortPair("h1", 80), NetLogWithSource(), base::nullopt,
5589 request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:005590 HostResolver::ResolveHostParameters parameters;
Eric Orth192e3bb2018-11-14 19:30:325591 parameters.dns_query_type = DnsQueryType::A;
Eric Orth117e1992019-04-17 00:24:155592 ResolveHostResponseHelper v4_response(resolver_->CreateRequest(
5593 HostPortPair("h1", 80), NetLogWithSource(), parameters,
5594 request_context_.get(), host_cache_.get()));
Eric Orth192e3bb2018-11-14 19:30:325595 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth117e1992019-04-17 00:24:155596 ResolveHostResponseHelper v6_response(resolver_->CreateRequest(
5597 HostPortPair("h1", 80), NetLogWithSource(), parameters,
5598 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:005599
Eric Orth00fe5a62018-08-15 22:20:005600 proc_->SignalMultiple(3u);
Eric Orth70992982018-07-24 00:25:005601
5602 // Should revert to only IPV4 request.
5603 EXPECT_THAT(response.result_error(), IsOk());
5604 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
5605 testing::ElementsAre(CreateExpected("1.0.0.1", 80)));
5606
Eric Orth00fe5a62018-08-15 22:20:005607 EXPECT_THAT(v4_response.result_error(), IsOk());
5608 EXPECT_THAT(v4_response.request()->GetAddressResults().value().endpoints(),
5609 testing::ElementsAre(CreateExpected("1.0.0.1", 80)));
5610 EXPECT_THAT(v6_response.result_error(), IsOk());
5611 EXPECT_THAT(v6_response.request()->GetAddressResults().value().endpoints(),
5612 testing::ElementsAre(CreateExpected("::2", 80)));
5613
Eric Orth70992982018-07-24 00:25:005614 // Now repeat the test on non-wifi to check that IPv6 is used as normal
5615 // after the network changes.
5616 notifier.mock_network_change_notifier()->SetConnectionType(
5617 NetworkChangeNotifier::CONNECTION_4G);
5618 base::RunLoop().RunUntilIdle(); // Wait for NetworkChangeNotifier.
5619
Eric Orth117e1992019-04-17 00:24:155620 ResolveHostResponseHelper no_wifi_response(resolver_->CreateRequest(
5621 HostPortPair("h1", 80), NetLogWithSource(), base::nullopt,
5622 request_context_.get(), host_cache_.get()));
Eric Orth192e3bb2018-11-14 19:30:325623 parameters.dns_query_type = DnsQueryType::A;
Eric Orth117e1992019-04-17 00:24:155624 ResolveHostResponseHelper no_wifi_v4_response(resolver_->CreateRequest(
5625 HostPortPair("h1", 80), NetLogWithSource(), parameters,
5626 request_context_.get(), host_cache_.get()));
Eric Orth192e3bb2018-11-14 19:30:325627 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth117e1992019-04-17 00:24:155628 ResolveHostResponseHelper no_wifi_v6_response(resolver_->CreateRequest(
5629 HostPortPair("h1", 80), NetLogWithSource(), parameters,
5630 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:005631
Eric Orth00fe5a62018-08-15 22:20:005632 proc_->SignalMultiple(3u);
Eric Orth70992982018-07-24 00:25:005633
5634 // IPV6 should be available.
5635 EXPECT_THAT(no_wifi_response.result_error(), IsOk());
5636 EXPECT_THAT(
5637 no_wifi_response.request()->GetAddressResults().value().endpoints(),
5638 testing::ElementsAre(CreateExpected("::3", 80)));
Eric Orth00fe5a62018-08-15 22:20:005639
5640 EXPECT_THAT(no_wifi_v4_response.result_error(), IsOk());
5641 EXPECT_THAT(
5642 no_wifi_v4_response.request()->GetAddressResults().value().endpoints(),
5643 testing::ElementsAre(CreateExpected("1.0.0.1", 80)));
5644 EXPECT_THAT(no_wifi_v6_response.result_error(), IsOk());
5645 EXPECT_THAT(
5646 no_wifi_v6_response.request()->GetAddressResults().value().endpoints(),
5647 testing::ElementsAre(CreateExpected("::2", 80)));
Eric Orth70992982018-07-24 00:25:005648}
5649
Eric Orth960e7062019-03-08 18:43:545650TEST_F(HostResolverManagerDnsTest, NotFoundTTL) {
Brad Lassey2e8f185d2018-05-21 22:25:215651 CreateResolver();
Eric Orth60931742018-11-05 23:40:575652 set_allow_fallback_to_proctask(false);
Brad Lassey2e8f185d2018-05-21 22:25:215653 ChangeDnsConfig(CreateValidDnsConfig());
Eric Orth70992982018-07-24 00:25:005654
5655 // NODATA
Eric Orth117e1992019-04-17 00:24:155656 ResolveHostResponseHelper no_data_response(resolver_->CreateRequest(
5657 HostPortPair("empty", 80), NetLogWithSource(), base::nullopt,
5658 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:005659 EXPECT_THAT(no_data_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
5660 EXPECT_FALSE(no_data_response.request()->GetAddressResults());
Eric Orth192e3bb2018-11-14 19:30:325661 HostCache::Key key("empty", DnsQueryType::UNSPECIFIED, 0,
5662 HostResolverSource::ANY);
Eric Orth70992982018-07-24 00:25:005663 HostCache::EntryStaleness staleness;
dalyk48b20a992019-02-25 16:10:265664 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result =
Eric Orth37b18192019-04-22 19:09:285665 host_cache_->Lookup(key, base::TimeTicks::Now(),
5666 false /* ignore_secure */);
dalyk48b20a992019-02-25 16:10:265667 EXPECT_TRUE(!!cache_result);
5668 EXPECT_TRUE(cache_result->second.has_ttl());
5669 EXPECT_THAT(cache_result->second.ttl(), base::TimeDelta::FromSeconds(86400));
Eric Orth70992982018-07-24 00:25:005670
5671 // NXDOMAIN
Eric Orth117e1992019-04-17 00:24:155672 ResolveHostResponseHelper no_domain_response(resolver_->CreateRequest(
5673 HostPortPair("nodomain", 80), NetLogWithSource(), base::nullopt,
5674 request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:005675 EXPECT_THAT(no_domain_response.result_error(),
5676 IsError(ERR_NAME_NOT_RESOLVED));
5677 EXPECT_FALSE(no_domain_response.request()->GetAddressResults());
Eric Orth192e3bb2018-11-14 19:30:325678 HostCache::Key nxkey("nodomain", DnsQueryType::UNSPECIFIED, 0,
5679 HostResolverSource::ANY);
Eric Orth37b18192019-04-22 19:09:285680 cache_result = host_cache_->Lookup(nxkey, base::TimeTicks::Now(),
5681 false /* ignore_secure */);
dalyk48b20a992019-02-25 16:10:265682 EXPECT_TRUE(!!cache_result);
5683 EXPECT_TRUE(cache_result->second.has_ttl());
5684 EXPECT_THAT(cache_result->second.ttl(), base::TimeDelta::FromSeconds(86400));
Eric Orth70992982018-07-24 00:25:005685}
5686
Eric Orth960e7062019-03-08 18:43:545687TEST_F(HostResolverManagerDnsTest, CachedError) {
dalyk4f4ac712019-05-31 16:33:135688 proc_->AddRuleForAllFamilies(std::string(),
5689 "0.0.0.0"); // Default to failures.
5690 proc_->SignalMultiple(1u);
5691
Eric Ortheb332862019-01-26 00:52:385692 CreateResolver();
dalyk4f4ac712019-05-31 16:33:135693 set_allow_fallback_to_proctask(true);
Eric Ortheb332862019-01-26 00:52:385694 ChangeDnsConfig(CreateValidDnsConfig());
5695
5696 HostResolver::ResolveHostParameters cache_only_parameters;
5697 cache_only_parameters.source = HostResolverSource::LOCAL_ONLY;
5698
5699 // Expect cache initially empty.
dalyk4f4ac712019-05-31 16:33:135700 ResolveHostResponseHelper cache_miss_response0(resolver_->CreateRequest(
Eric Orth117e1992019-04-17 00:24:155701 HostPortPair("nodomain", 80), NetLogWithSource(), cache_only_parameters,
5702 request_context_.get(), host_cache_.get()));
dalyk4f4ac712019-05-31 16:33:135703 EXPECT_THAT(cache_miss_response0.result_error(), IsError(ERR_DNS_CACHE_MISS));
5704 EXPECT_FALSE(cache_miss_response0.request()->GetStaleInfo());
5705
5706 // The cache should not be populate with an error because fallback to ProcTask
5707 // was available.
5708 ResolveHostResponseHelper no_domain_response_with_fallback(
5709 resolver_->CreateRequest(HostPortPair("nodomain", 80), NetLogWithSource(),
5710 base::nullopt, request_context_.get(),
5711 host_cache_.get()));
5712 EXPECT_THAT(no_domain_response_with_fallback.result_error(),
5713 IsError(ERR_NAME_NOT_RESOLVED));
5714
5715 // Expect cache still empty.
5716 ResolveHostResponseHelper cache_miss_response1(resolver_->CreateRequest(
5717 HostPortPair("nodomain", 80), NetLogWithSource(), cache_only_parameters,
5718 request_context_.get(), host_cache_.get()));
5719 EXPECT_THAT(cache_miss_response1.result_error(), IsError(ERR_DNS_CACHE_MISS));
5720 EXPECT_FALSE(cache_miss_response1.request()->GetStaleInfo());
5721
5722 // Disable fallback to proctask
5723 set_allow_fallback_to_proctask(false);
Eric Ortheb332862019-01-26 00:52:385724
5725 // Populate cache with an error.
Eric Orth117e1992019-04-17 00:24:155726 ResolveHostResponseHelper no_domain_response(resolver_->CreateRequest(
5727 HostPortPair("nodomain", 80), NetLogWithSource(), base::nullopt,
5728 request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:385729 EXPECT_THAT(no_domain_response.result_error(),
5730 IsError(ERR_NAME_NOT_RESOLVED));
5731
5732 // Expect the error result can be resolved from the cache.
Eric Orth117e1992019-04-17 00:24:155733 ResolveHostResponseHelper cache_hit_response(resolver_->CreateRequest(
5734 HostPortPair("nodomain", 80), NetLogWithSource(), cache_only_parameters,
5735 request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:385736 EXPECT_THAT(cache_hit_response.result_error(),
5737 IsError(ERR_NAME_NOT_RESOLVED));
5738 EXPECT_FALSE(cache_hit_response.request()->GetStaleInfo().value().is_stale());
5739}
5740
dalyk4f4ac712019-05-31 16:33:135741TEST_F(HostResolverManagerDnsTest, CachedError_AutomaticMode) {
5742 CreateResolver();
5743 set_allow_fallback_to_proctask(false);
5744 ChangeDnsConfig(CreateValidDnsConfig());
5745
5746 // Switch to automatic mode.
5747 DnsConfigOverrides overrides;
5748 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
5749 resolver_->SetDnsConfigOverrides(overrides);
5750
5751 HostCache::Key insecure_key =
5752 HostCache::Key("automatic_nodomain", DnsQueryType::UNSPECIFIED,
5753 0 /* host_resolver_flags */, HostResolverSource::ANY);
5754 HostCache::Key secure_key =
5755 HostCache::Key("automatic_nodomain", DnsQueryType::UNSPECIFIED,
5756 0 /* host_resolver_flags */, HostResolverSource::ANY);
5757 secure_key.secure = true;
5758
5759 // Expect cache initially empty.
5760 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result;
5761 cache_result = GetCacheHit(secure_key);
5762 EXPECT_FALSE(!!cache_result);
5763 cache_result = GetCacheHit(insecure_key);
5764 EXPECT_FALSE(!!cache_result);
5765
5766 // Populate both secure and insecure caches with an error.
5767 ResolveHostResponseHelper no_domain_response(resolver_->CreateRequest(
5768 HostPortPair("automatic_nodomain", 80), NetLogWithSource(), base::nullopt,
5769 request_context_.get(), host_cache_.get()));
5770 EXPECT_THAT(no_domain_response.result_error(),
5771 IsError(ERR_NAME_NOT_RESOLVED));
5772
5773 // Expect both secure and insecure caches to have the error result.
5774 cache_result = GetCacheHit(secure_key);
5775 EXPECT_TRUE(!!cache_result);
5776 cache_result = GetCacheHit(insecure_key);
5777 EXPECT_TRUE(!!cache_result);
5778}
5779
5780TEST_F(HostResolverManagerDnsTest, CachedError_SecureMode) {
5781 CreateResolver();
5782 set_allow_fallback_to_proctask(false);
5783 ChangeDnsConfig(CreateValidDnsConfig());
5784
5785 // Switch to secure mode.
5786 DnsConfigOverrides overrides;
5787 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::SECURE;
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 secure cache 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 only the secure cache to have the error result.
5813 cache_result = GetCacheHit(secure_key);
5814 EXPECT_TRUE(!!cache_result);
5815 cache_result = GetCacheHit(insecure_key);
5816 EXPECT_FALSE(!!cache_result);
5817}
5818
Eric Orth960e7062019-03-08 18:43:545819TEST_F(HostResolverManagerDnsTest, NoCanonicalName) {
Eric Orth828bd3ae2018-12-12 17:30:365820 MockDnsClientRuleList rules;
5821 AddDnsRule(&rules, "alias", dns_protocol::kTypeA, IPAddress::IPv4Localhost(),
dalyk48b20a992019-02-25 16:10:265822 "canonical", false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:365823 AddDnsRule(&rules, "alias", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:265824 IPAddress::IPv6Localhost(), "canonical", false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:365825
Asanka Herath2d0226c2018-10-24 14:35:555826 CreateResolver();
Eric Orth828bd3ae2018-12-12 17:30:365827 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
Eric Orth60931742018-11-05 23:40:575828 set_allow_fallback_to_proctask(false);
Eric Orth828bd3ae2018-12-12 17:30:365829
Eric Orth117e1992019-04-17 00:24:155830 ResolveHostResponseHelper response(resolver_->CreateRequest(
5831 HostPortPair("alias", 80), NetLogWithSource(), base::nullopt,
5832 request_context_.get(), host_cache_.get()));
Asanka Herath2d0226c2018-10-24 14:35:555833 ASSERT_THAT(response.result_error(), IsOk());
5834
Matt Menkec35d1632018-11-29 12:43:495835 // HostResolver may still give name, but if so, it must be correct.
5836 std::string result_name =
5837 response.request()->GetAddressResults().value().canonical_name();
5838 EXPECT_TRUE(result_name.empty() || result_name == "canonical");
Asanka Herath2d0226c2018-10-24 14:35:555839}
5840
Eric Orth960e7062019-03-08 18:43:545841TEST_F(HostResolverManagerDnsTest, CanonicalName) {
Eric Orth828bd3ae2018-12-12 17:30:365842 MockDnsClientRuleList rules;
5843 AddDnsRule(&rules, "alias", dns_protocol::kTypeA, IPAddress::IPv4Localhost(),
dalyk48b20a992019-02-25 16:10:265844 "canonical", false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:365845 AddDnsRule(&rules, "alias", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:265846 IPAddress::IPv6Localhost(), "canonical", false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:365847
Asanka Herath2d0226c2018-10-24 14:35:555848 CreateResolver();
Eric Orth828bd3ae2018-12-12 17:30:365849 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
Eric Orth60931742018-11-05 23:40:575850 set_allow_fallback_to_proctask(false);
Eric Orth828bd3ae2018-12-12 17:30:365851
Asanka Herath2d0226c2018-10-24 14:35:555852 HostResolver::ResolveHostParameters params;
Asanka Herath2d0226c2018-10-24 14:35:555853 params.include_canonical_name = true;
Eric Orth541a90c2019-01-17 20:11:465854 params.source = HostResolverSource::DNS;
Eric Orth117e1992019-04-17 00:24:155855 ResolveHostResponseHelper response(resolver_->CreateRequest(
5856 HostPortPair("alias", 80), NetLogWithSource(), params,
5857 request_context_.get(), host_cache_.get()));
Asanka Herath2d0226c2018-10-24 14:35:555858 ASSERT_THAT(response.result_error(), IsOk());
5859
5860 EXPECT_EQ(response.request()->GetAddressResults().value().canonical_name(),
5861 "canonical");
5862}
5863
Eric Orth960e7062019-03-08 18:43:545864TEST_F(HostResolverManagerDnsTest, CanonicalName_PreferV6) {
Eric Orth828bd3ae2018-12-12 17:30:365865 MockDnsClientRuleList rules;
5866 AddDnsRule(&rules, "alias", dns_protocol::kTypeA, IPAddress::IPv4Localhost(),
dalyk48b20a992019-02-25 16:10:265867 "wrong", false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:365868 AddDnsRule(&rules, "alias", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:265869 IPAddress::IPv6Localhost(), "correct", true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:365870
Asanka Herath2d0226c2018-10-24 14:35:555871 CreateResolver();
Eric Orth828bd3ae2018-12-12 17:30:365872 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
Eric Orth60931742018-11-05 23:40:575873 set_allow_fallback_to_proctask(false);
Eric Orth828bd3ae2018-12-12 17:30:365874
Asanka Herath2d0226c2018-10-24 14:35:555875 HostResolver::ResolveHostParameters params;
Asanka Herath2d0226c2018-10-24 14:35:555876 params.include_canonical_name = true;
Eric Orth541a90c2019-01-17 20:11:465877 params.source = HostResolverSource::DNS;
Eric Orth117e1992019-04-17 00:24:155878 ResolveHostResponseHelper response(resolver_->CreateRequest(
5879 HostPortPair("alias", 80), NetLogWithSource(), params,
5880 request_context_.get(), host_cache_.get()));
Asanka Herath2d0226c2018-10-24 14:35:555881 ASSERT_FALSE(response.complete());
5882 base::RunLoop().RunUntilIdle();
5883 dns_client_->CompleteDelayedTransactions();
5884 ASSERT_THAT(response.result_error(), IsOk());
5885 EXPECT_EQ(response.request()->GetAddressResults().value().canonical_name(),
5886 "correct");
5887}
5888
Eric Orth960e7062019-03-08 18:43:545889TEST_F(HostResolverManagerDnsTest, CanonicalName_V4Only) {
Eric Orth828bd3ae2018-12-12 17:30:365890 MockDnsClientRuleList rules;
5891 AddDnsRule(&rules, "alias", dns_protocol::kTypeA, IPAddress::IPv4Localhost(),
dalyk48b20a992019-02-25 16:10:265892 "correct", false /* delay */);
Asanka Herath2d0226c2018-10-24 14:35:555893 CreateResolver();
Eric Orth828bd3ae2018-12-12 17:30:365894 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
Eric Orth60931742018-11-05 23:40:575895 set_allow_fallback_to_proctask(false);
Eric Orth828bd3ae2018-12-12 17:30:365896
Asanka Herath2d0226c2018-10-24 14:35:555897 HostResolver::ResolveHostParameters params;
Eric Orth192e3bb2018-11-14 19:30:325898 params.dns_query_type = DnsQueryType::A;
Asanka Herath2d0226c2018-10-24 14:35:555899 params.include_canonical_name = true;
Eric Orth541a90c2019-01-17 20:11:465900 params.source = HostResolverSource::DNS;
Eric Orth117e1992019-04-17 00:24:155901 ResolveHostResponseHelper response(resolver_->CreateRequest(
5902 HostPortPair("alias", 80), NetLogWithSource(), params,
5903 request_context_.get(), host_cache_.get()));
Asanka Herath2d0226c2018-10-24 14:35:555904 ASSERT_THAT(response.result_error(), IsOk());
5905 EXPECT_EQ(response.request()->GetAddressResults().value().canonical_name(),
5906 "correct");
5907}
5908
Eric Orth541a90c2019-01-17 20:11:465909// Test that without specifying source, a request that would otherwise be
5910// handled by DNS is sent to the system resolver if cannonname is requested.
Eric Orth960e7062019-03-08 18:43:545911TEST_F(HostResolverManagerDnsTest, CanonicalNameForcesProc) {
Eric Orth541a90c2019-01-17 20:11:465912 // Disable fallback to ensure system resolver is used directly, not via
5913 // fallback.
5914 set_allow_fallback_to_proctask(false);
5915
5916 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.102",
5917 HOST_RESOLVER_CANONNAME, "canonical");
5918 proc_->SignalMultiple(1u);
5919
5920 ChangeDnsConfig(CreateValidDnsConfig());
5921
5922 HostResolver::ResolveHostParameters params;
5923 params.include_canonical_name = true;
5924 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:275925 HostPortPair("nx_succeed", 80), NetLogWithSource(), params,
Eric Orth117e1992019-04-17 00:24:155926 request_context_.get(), host_cache_.get()));
Eric Orth541a90c2019-01-17 20:11:465927 ASSERT_THAT(response.result_error(), IsOk());
5928
5929 EXPECT_EQ(response.request()->GetAddressResults().value().canonical_name(),
5930 "canonical");
5931}
5932
Eric Orth960e7062019-03-08 18:43:545933TEST_F(HostResolverManagerTest, ResolveLocalHostname) {
tfarina9ed7f8c52016-02-19 17:50:185934 AddressList addresses;
5935
5936 TestBothLoopbackIPs("localhost");
5937 TestBothLoopbackIPs("localhoST");
5938 TestBothLoopbackIPs("localhost.");
5939 TestBothLoopbackIPs("localhoST.");
5940 TestBothLoopbackIPs("localhost.localdomain");
5941 TestBothLoopbackIPs("localhost.localdomAIn");
5942 TestBothLoopbackIPs("localhost.localdomain.");
5943 TestBothLoopbackIPs("localhost.localdomAIn.");
5944 TestBothLoopbackIPs("foo.localhost");
5945 TestBothLoopbackIPs("foo.localhOSt");
5946 TestBothLoopbackIPs("foo.localhost.");
5947 TestBothLoopbackIPs("foo.localhOSt.");
5948
5949 TestIPv6LoopbackOnly("localhost6");
5950 TestIPv6LoopbackOnly("localhoST6");
5951 TestIPv6LoopbackOnly("localhost6.");
5952 TestIPv6LoopbackOnly("localhost6.localdomain6");
5953 TestIPv6LoopbackOnly("localhost6.localdomain6.");
5954
Matt Menkec35d1632018-11-29 12:43:495955 EXPECT_FALSE(ResolveLocalHostname("127.0.0.1", &addresses));
5956 EXPECT_FALSE(ResolveLocalHostname("::1", &addresses));
5957 EXPECT_FALSE(ResolveLocalHostname("0:0:0:0:0:0:0:1", &addresses));
5958 EXPECT_FALSE(ResolveLocalHostname("localhostx", &addresses));
5959 EXPECT_FALSE(ResolveLocalHostname("localhost.x", &addresses));
5960 EXPECT_FALSE(ResolveLocalHostname("foo.localdomain", &addresses));
5961 EXPECT_FALSE(ResolveLocalHostname("foo.localdomain.x", &addresses));
5962 EXPECT_FALSE(ResolveLocalHostname("localhost6x", &addresses));
5963 EXPECT_FALSE(ResolveLocalHostname("localhost.localdomain6", &addresses));
5964 EXPECT_FALSE(ResolveLocalHostname("localhost6.localdomain", &addresses));
5965 EXPECT_FALSE(ResolveLocalHostname("127.0.0.1.1", &addresses));
5966 EXPECT_FALSE(ResolveLocalHostname(".127.0.0.255", &addresses));
5967 EXPECT_FALSE(ResolveLocalHostname("::2", &addresses));
5968 EXPECT_FALSE(ResolveLocalHostname("::1:1", &addresses));
5969 EXPECT_FALSE(ResolveLocalHostname("0:0:0:0:1:0:0:1", &addresses));
5970 EXPECT_FALSE(ResolveLocalHostname("::1:1", &addresses));
5971 EXPECT_FALSE(ResolveLocalHostname("0:0:0:0:0:0:0:0:1", &addresses));
5972 EXPECT_FALSE(ResolveLocalHostname("foo.localhost.com", &addresses));
5973 EXPECT_FALSE(ResolveLocalHostname("foo.localhoste", &addresses));
tfarina9ed7f8c52016-02-19 17:50:185974}
5975
dalyk40dcab152019-03-15 21:03:155976TEST_F(HostResolverManagerDnsTest, ResolveDnsOverHttpsServerName) {
5977 MockDnsClientRuleList rules;
5978 rules.emplace_back(
dalyk4f4ac712019-05-31 16:33:135979 "dns.example2.com", dns_protocol::kTypeA, false /* secure */,
dalyk40dcab152019-03-15 21:03:155980 MockDnsClientRule::Result(MockDnsClientRule::OK), false /* delay */);
dalyk4f4ac712019-05-31 16:33:135981 rules.emplace_back(
5982 "dns.example2.com", dns_protocol::kTypeAAAA, false /* secure */,
5983 MockDnsClientRule::Result(MockDnsClientRule::OK), false /* delay */);
dalyk40dcab152019-03-15 21:03:155984 CreateResolver();
5985 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
5986
5987 DnsConfigOverrides overrides;
dalyk4f4ac712019-05-31 16:33:135988 std::vector<DnsConfig::DnsOverHttpsServerConfig> doh_servers = {
5989 DnsConfig::DnsOverHttpsServerConfig("https://dns.example.com/",
5990 true /* use_post */),
5991 DnsConfig::DnsOverHttpsServerConfig(
5992 "https://dns.example2.com/dns-query{?dns}", false /* use_post */)};
5993 overrides.dns_over_https_servers = doh_servers;
5994 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::SECURE;
dalyk40dcab152019-03-15 21:03:155995 resolver_->SetDnsConfigOverrides(overrides);
5996
5997 ResolveHostResponseHelper response(resolver_->CreateRequest(
Eric Orth6f1c5172019-04-16 17:08:275998 HostPortPair("dns.example2.com", 80), NetLogWithSource(), base::nullopt,
Eric Orth117e1992019-04-17 00:24:155999 request_context_.get(), host_cache_.get()));
dalyk40dcab152019-03-15 21:03:156000 ASSERT_THAT(response.result_error(), IsOk());
6001}
6002
Eric Orth960e7062019-03-08 18:43:546003TEST_F(HostResolverManagerDnsTest, AddDnsOverHttpsServerAfterConfig) {
Eric Orth37b18192019-04-22 19:09:286004 DestroyResolver();
Brad Lassey786929ad2018-02-21 20:54:276005 test::ScopedMockNetworkChangeNotifier notifier;
6006 CreateSerialResolver(); // To guarantee order of resolutions.
6007 notifier.mock_network_change_notifier()->SetConnectionType(
6008 NetworkChangeNotifier::CONNECTION_WIFI);
6009 ChangeDnsConfig(CreateValidDnsConfig());
6010
dalykb34631f2018-08-24 19:59:486011 std::string server("https://dnsserver.example.net/dns-query{?dns}");
Eric Orthc1eb1292018-10-09 22:07:076012 DnsConfigOverrides overrides;
6013 overrides.dns_over_https_servers.emplace(
6014 {DnsConfig::DnsOverHttpsServerConfig(server, true)});
dalykc27699a2019-07-29 20:53:296015 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
Eric Orthc1eb1292018-10-09 22:07:076016 resolver_->SetDnsConfigOverrides(overrides);
Brad Lassey786929ad2018-02-21 20:54:276017 base::DictionaryValue* config;
6018
6019 auto value = resolver_->GetDnsConfigAsValue();
6020 EXPECT_TRUE(value);
6021 if (!value)
6022 return;
6023 value->GetAsDictionary(&config);
6024 base::ListValue* doh_servers;
6025 config->GetListWithoutPathExpansion("doh_servers", &doh_servers);
6026 EXPECT_TRUE(doh_servers);
6027 if (!doh_servers)
6028 return;
6029 EXPECT_EQ(doh_servers->GetSize(), 1u);
6030 base::DictionaryValue* server_method;
6031 EXPECT_TRUE(doh_servers->GetDictionary(0, &server_method));
6032 bool use_post;
6033 EXPECT_TRUE(server_method->GetBoolean("use_post", &use_post));
6034 EXPECT_TRUE(use_post);
dalykb34631f2018-08-24 19:59:486035 std::string server_template;
6036 EXPECT_TRUE(server_method->GetString("server_template", &server_template));
6037 EXPECT_EQ(server_template, server);
dalykc27699a2019-07-29 20:53:296038 EXPECT_EQ(config->FindKey("secure_dns_mode")->GetInt(),
6039 static_cast<int>(DnsConfig::SecureDnsMode::AUTOMATIC));
Brad Lassey786929ad2018-02-21 20:54:276040}
6041
Eric Orth960e7062019-03-08 18:43:546042TEST_F(HostResolverManagerDnsTest, AddDnsOverHttpsServerBeforeConfig) {
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.
dalykb34631f2018-08-24 19:59:486046 std::string server("https://dnsserver.example.net/dns-query{?dns}");
Eric Orthc1eb1292018-10-09 22:07:076047 DnsConfigOverrides overrides;
6048 overrides.dns_over_https_servers.emplace(
6049 {DnsConfig::DnsOverHttpsServerConfig(server, true)});
dalykc27699a2019-07-29 20:53:296050 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
Eric Orthc1eb1292018-10-09 22:07:076051 resolver_->SetDnsConfigOverrides(overrides);
Brad Lassey786929ad2018-02-21 20:54:276052
6053 notifier.mock_network_change_notifier()->SetConnectionType(
6054 NetworkChangeNotifier::CONNECTION_WIFI);
6055 ChangeDnsConfig(CreateValidDnsConfig());
6056
6057 base::DictionaryValue* config;
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, AddDnsOverHttpsServerBeforeClient) {
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
Brad Lassey786929ad2018-02-21 20:54:276096 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, AddDnsOverHttpsServerAndThenRemove) {
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://dns.example.com/");
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);
dalyk4f4ac712019-05-31 16:33:136133 DnsConfig network_dns_config = CreateValidDnsConfig();
6134 network_dns_config.dns_over_https_servers.clear();
6135 ChangeDnsConfig(network_dns_config);
Brad Lassey786929ad2018-02-21 20:54:276136
6137 base::DictionaryValue* config;
6138 auto value = resolver_->GetDnsConfigAsValue();
6139 EXPECT_TRUE(value);
6140 if (!value)
6141 return;
6142 value->GetAsDictionary(&config);
6143 base::ListValue* doh_servers;
6144 config->GetListWithoutPathExpansion("doh_servers", &doh_servers);
6145 EXPECT_TRUE(doh_servers);
6146 if (!doh_servers)
6147 return;
6148 EXPECT_EQ(doh_servers->GetSize(), 1u);
6149 base::DictionaryValue* server_method;
6150 EXPECT_TRUE(doh_servers->GetDictionary(0, &server_method));
6151 bool use_post;
6152 EXPECT_TRUE(server_method->GetBoolean("use_post", &use_post));
6153 EXPECT_TRUE(use_post);
dalykb34631f2018-08-24 19:59:486154 std::string server_template;
6155 EXPECT_TRUE(server_method->GetString("server_template", &server_template));
6156 EXPECT_EQ(server_template, server);
dalykc27699a2019-07-29 20:53:296157 EXPECT_EQ(config->FindKey("secure_dns_mode")->GetInt(),
6158 static_cast<int>(DnsConfig::SecureDnsMode::AUTOMATIC));
Brad Lassey786929ad2018-02-21 20:54:276159
Eric Orthc1eb1292018-10-09 22:07:076160 resolver_->SetDnsConfigOverrides(DnsConfigOverrides());
Brad Lassey786929ad2018-02-21 20:54:276161 value = resolver_->GetDnsConfigAsValue();
6162 EXPECT_TRUE(value);
6163 if (!value)
6164 return;
6165 value->GetAsDictionary(&config);
6166 config->GetListWithoutPathExpansion("doh_servers", &doh_servers);
6167 EXPECT_TRUE(doh_servers);
6168 if (!doh_servers)
6169 return;
6170 EXPECT_EQ(doh_servers->GetSize(), 0u);
dalykc27699a2019-07-29 20:53:296171 EXPECT_EQ(config->FindKey("secure_dns_mode")->GetInt(),
6172 static_cast<int>(DnsConfig::SecureDnsMode::OFF));
Brad Lassey786929ad2018-02-21 20:54:276173}
6174
Eric Orth960e7062019-03-08 18:43:546175TEST_F(HostResolverManagerDnsTest, SetDnsConfigOverrides) {
Eric Orthc1eb1292018-10-09 22:07:076176 DnsConfig original_config = CreateValidDnsConfig();
6177 ChangeDnsConfig(original_config);
6178
6179 // Confirm pre-override state.
6180 ASSERT_TRUE(original_config.Equals(*dns_client_->GetConfig()));
6181
6182 DnsConfigOverrides overrides;
6183 const std::vector<IPEndPoint> nameservers = {
6184 CreateExpected("192.168.0.1", 92)};
6185 overrides.nameservers = nameservers;
6186 const std::vector<std::string> search = {"str"};
6187 overrides.search = search;
6188 const DnsHosts hosts = {
6189 {DnsHostsKey("host", ADDRESS_FAMILY_IPV4), IPAddress(192, 168, 1, 1)}};
6190 overrides.hosts = hosts;
6191 overrides.append_to_multi_label_name = false;
6192 overrides.randomize_ports = true;
6193 const int ndots = 5;
6194 overrides.ndots = ndots;
6195 const base::TimeDelta timeout = base::TimeDelta::FromSeconds(10);
6196 overrides.timeout = timeout;
6197 const int attempts = 20;
6198 overrides.attempts = attempts;
6199 overrides.rotate = true;
6200 overrides.use_local_ipv6 = true;
6201 const std::vector<DnsConfig::DnsOverHttpsServerConfig>
6202 dns_over_https_servers = {
6203 DnsConfig::DnsOverHttpsServerConfig("dns.example.com", true)};
6204 overrides.dns_over_https_servers = dns_over_https_servers;
dalykbd726ee2019-05-30 01:44:066205 const DnsConfig::SecureDnsMode secure_dns_mode =
6206 DnsConfig::SecureDnsMode::SECURE;
6207 overrides.secure_dns_mode = secure_dns_mode;
Eric Orthc1eb1292018-10-09 22:07:076208
Eric Orthc823a23d2018-10-30 22:12:486209 // This test is expected to test overriding all fields.
6210 EXPECT_TRUE(overrides.OverridesEverything());
6211
Eric Orthc1eb1292018-10-09 22:07:076212 resolver_->SetDnsConfigOverrides(overrides);
6213
6214 const DnsConfig* overridden_config = dns_client_->GetConfig();
6215 EXPECT_EQ(nameservers, overridden_config->nameservers);
6216 EXPECT_EQ(search, overridden_config->search);
6217 EXPECT_EQ(hosts, overridden_config->hosts);
6218 EXPECT_FALSE(overridden_config->append_to_multi_label_name);
6219 EXPECT_TRUE(overridden_config->randomize_ports);
6220 EXPECT_EQ(ndots, overridden_config->ndots);
6221 EXPECT_EQ(timeout, overridden_config->timeout);
6222 EXPECT_EQ(attempts, overridden_config->attempts);
6223 EXPECT_TRUE(overridden_config->rotate);
6224 EXPECT_TRUE(overridden_config->use_local_ipv6);
6225 EXPECT_EQ(dns_over_https_servers, overridden_config->dns_over_https_servers);
dalykbd726ee2019-05-30 01:44:066226 EXPECT_EQ(secure_dns_mode, overridden_config->secure_dns_mode);
Eric Orthc1eb1292018-10-09 22:07:076227}
6228
Eric Orth960e7062019-03-08 18:43:546229TEST_F(HostResolverManagerDnsTest,
Eric Orthc823a23d2018-10-30 22:12:486230 SetDnsConfigOverrides_OverrideEverythingCreation) {
6231 DnsConfig original_config = CreateValidDnsConfig();
6232 ChangeDnsConfig(original_config);
6233
6234 // Confirm pre-override state.
6235 ASSERT_TRUE(original_config.Equals(*dns_client_->GetConfig()));
6236 ASSERT_FALSE(original_config.Equals(DnsConfig()));
6237
6238 DnsConfigOverrides overrides =
6239 DnsConfigOverrides::CreateOverridingEverythingWithDefaults();
6240 EXPECT_TRUE(overrides.OverridesEverything());
6241
6242 // Ensure config is valid by setting a nameserver.
6243 std::vector<IPEndPoint> nameservers = {CreateExpected("1.2.3.4", 50)};
6244 overrides.nameservers = nameservers;
6245 EXPECT_TRUE(overrides.OverridesEverything());
6246
6247 resolver_->SetDnsConfigOverrides(overrides);
6248
6249 DnsConfig expected;
6250 expected.nameservers = nameservers;
6251 EXPECT_TRUE(dns_client_->GetConfig()->Equals(DnsConfig(expected)));
6252}
6253
Eric Orth960e7062019-03-08 18:43:546254TEST_F(HostResolverManagerDnsTest, SetDnsConfigOverrides_PartialOverride) {
Eric Orthc1eb1292018-10-09 22:07:076255 DnsConfig original_config = CreateValidDnsConfig();
6256 ChangeDnsConfig(original_config);
6257
6258 // Confirm pre-override state.
6259 ASSERT_TRUE(original_config.Equals(*dns_client_->GetConfig()));
6260
6261 DnsConfigOverrides overrides;
6262 const std::vector<IPEndPoint> nameservers = {
6263 CreateExpected("192.168.0.2", 192)};
6264 overrides.nameservers = nameservers;
6265 overrides.rotate = true;
Eric Orthc823a23d2018-10-30 22:12:486266 EXPECT_FALSE(overrides.OverridesEverything());
Eric Orthc1eb1292018-10-09 22:07:076267
6268 resolver_->SetDnsConfigOverrides(overrides);
6269
6270 const DnsConfig* overridden_config = dns_client_->GetConfig();
6271 EXPECT_EQ(nameservers, overridden_config->nameservers);
6272 EXPECT_EQ(original_config.search, overridden_config->search);
6273 EXPECT_EQ(original_config.hosts, overridden_config->hosts);
6274 EXPECT_TRUE(overridden_config->append_to_multi_label_name);
6275 EXPECT_FALSE(overridden_config->randomize_ports);
6276 EXPECT_EQ(original_config.ndots, overridden_config->ndots);
6277 EXPECT_EQ(original_config.timeout, overridden_config->timeout);
6278 EXPECT_EQ(original_config.attempts, overridden_config->attempts);
6279 EXPECT_TRUE(overridden_config->rotate);
6280 EXPECT_FALSE(overridden_config->use_local_ipv6);
6281 EXPECT_EQ(original_config.dns_over_https_servers,
6282 overridden_config->dns_over_https_servers);
dalykbd726ee2019-05-30 01:44:066283 EXPECT_EQ(original_config.secure_dns_mode,
6284 overridden_config->secure_dns_mode);
Eric Orthc1eb1292018-10-09 22:07:076285}
6286
6287// Test that overridden configs are reapplied over a changed underlying system
6288// config.
Eric Orth960e7062019-03-08 18:43:546289TEST_F(HostResolverManagerDnsTest, SetDnsConfigOverrides_NewConfig) {
Eric Orthc1eb1292018-10-09 22:07:076290 DnsConfig original_config = CreateValidDnsConfig();
6291 ChangeDnsConfig(original_config);
6292
6293 // Confirm pre-override state.
6294 ASSERT_TRUE(original_config.Equals(*dns_client_->GetConfig()));
6295
6296 DnsConfigOverrides overrides;
6297 const std::vector<IPEndPoint> nameservers = {
6298 CreateExpected("192.168.0.2", 192)};
6299 overrides.nameservers = nameservers;
6300
6301 resolver_->SetDnsConfigOverrides(overrides);
6302 ASSERT_EQ(nameservers, dns_client_->GetConfig()->nameservers);
6303
6304 DnsConfig new_config = original_config;
6305 new_config.attempts = 103;
6306 ASSERT_NE(nameservers, new_config.nameservers);
6307 ChangeDnsConfig(new_config);
6308
6309 const DnsConfig* overridden_config = dns_client_->GetConfig();
6310 EXPECT_EQ(nameservers, overridden_config->nameservers);
6311 EXPECT_EQ(new_config.attempts, overridden_config->attempts);
6312}
6313
Eric Orth960e7062019-03-08 18:43:546314TEST_F(HostResolverManagerDnsTest, SetDnsConfigOverrides_ClearOverrides) {
Eric Orthc1eb1292018-10-09 22:07:076315 DnsConfig original_config = CreateValidDnsConfig();
6316 ChangeDnsConfig(original_config);
6317
6318 DnsConfigOverrides overrides;
6319 overrides.attempts = 245;
6320 resolver_->SetDnsConfigOverrides(overrides);
6321
6322 ASSERT_FALSE(original_config.Equals(*dns_client_->GetConfig()));
6323
6324 resolver_->SetDnsConfigOverrides(DnsConfigOverrides());
6325 EXPECT_TRUE(original_config.Equals(*dns_client_->GetConfig()));
6326}
6327
Eric Orth37b18192019-04-22 19:09:286328TEST_F(HostResolverManagerDnsTest, FlushCacheOnDnsConfigOverridesChange) {
6329 ChangeDnsConfig(CreateValidDnsConfig());
6330
6331 HostResolver::ResolveHostParameters local_source_parameters;
6332 local_source_parameters.source = HostResolverSource::LOCAL_ONLY;
6333
6334 // Populate cache.
6335 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
6336 HostPortPair("ok", 70), NetLogWithSource(), base::nullopt,
6337 request_context_.get(), host_cache_.get()));
6338 EXPECT_THAT(initial_response.result_error(), IsOk());
6339
6340 // Confirm result now cached.
6341 ResolveHostResponseHelper cached_response(resolver_->CreateRequest(
6342 HostPortPair("ok", 75), NetLogWithSource(), local_source_parameters,
6343 request_context_.get(), host_cache_.get()));
6344 ASSERT_THAT(cached_response.result_error(), IsOk());
6345 ASSERT_TRUE(cached_response.request()->GetStaleInfo());
6346
6347 // Flush cache by triggering a DnsConfigOverrides change.
6348 DnsConfigOverrides overrides;
6349 overrides.attempts = 4;
6350 resolver_->SetDnsConfigOverrides(overrides);
6351
6352 // Expect no longer cached
6353 ResolveHostResponseHelper flushed_response(resolver_->CreateRequest(
6354 HostPortPair("ok", 80), NetLogWithSource(), local_source_parameters,
6355 request_context_.get(), host_cache_.get()));
6356 EXPECT_THAT(flushed_response.result_error(), IsError(ERR_DNS_CACHE_MISS));
6357}
6358
Eric Orthc823a23d2018-10-30 22:12:486359// Test that even when using config overrides, a change to the base system
6360// config cancels pending requests.
Eric Orth960e7062019-03-08 18:43:546361TEST_F(HostResolverManagerDnsTest, CancellationOnBaseConfigChange) {
Eric Orthc823a23d2018-10-30 22:12:486362 DnsConfig original_config = CreateValidDnsConfig();
6363 ChangeDnsConfig(original_config);
6364
6365 DnsConfigOverrides overrides;
6366 overrides.nameservers.emplace({CreateExpected("123.123.123.123", 80)});
6367 ASSERT_FALSE(overrides.OverridesEverything());
6368 resolver_->SetDnsConfigOverrides(overrides);
6369
Eric Orth117e1992019-04-17 00:24:156370 ResolveHostResponseHelper response(resolver_->CreateRequest(
6371 HostPortPair("4slow_ok", 80), NetLogWithSource(), base::nullopt,
6372 request_context_.get(), host_cache_.get()));
Eric Orthc823a23d2018-10-30 22:12:486373 ASSERT_FALSE(response.complete());
6374
6375 DnsConfig new_config = original_config;
6376 new_config.attempts = 103;
6377 ChangeDnsConfig(new_config);
6378
6379 EXPECT_THAT(response.result_error(), IsError(ERR_NETWORK_CHANGED));
6380}
6381
6382// Test that when all configuration is overridden, system configuration changes
6383// do not cancel requests.
Eric Orth960e7062019-03-08 18:43:546384TEST_F(HostResolverManagerDnsTest,
Eric Orthc823a23d2018-10-30 22:12:486385 CancellationOnBaseConfigChange_OverridesEverything) {
6386 DnsConfig original_config = CreateValidDnsConfig();
6387 ChangeDnsConfig(original_config);
6388
6389 DnsConfigOverrides overrides =
6390 DnsConfigOverrides::CreateOverridingEverythingWithDefaults();
6391 overrides.nameservers.emplace({CreateExpected("123.123.123.123", 80)});
6392 ASSERT_TRUE(overrides.OverridesEverything());
6393 resolver_->SetDnsConfigOverrides(overrides);
6394
Eric Orth117e1992019-04-17 00:24:156395 ResolveHostResponseHelper response(resolver_->CreateRequest(
6396 HostPortPair("4slow_ok", 80), NetLogWithSource(), base::nullopt,
6397 request_context_.get(), host_cache_.get()));
Eric Orthc823a23d2018-10-30 22:12:486398 ASSERT_FALSE(response.complete());
6399
6400 DnsConfig new_config = original_config;
6401 new_config.attempts = 103;
6402 ChangeDnsConfig(new_config);
6403
6404 dns_client_->CompleteDelayedTransactions();
6405 EXPECT_THAT(response.result_error(), IsOk());
6406}
6407
Eric Orthc1eb1292018-10-09 22:07:076408// Test that in-progress queries are cancelled on applying new DNS config
6409// overrides, same as receiving a new DnsConfig from the system.
Eric Orth960e7062019-03-08 18:43:546410TEST_F(HostResolverManagerDnsTest, CancelQueriesOnSettingOverrides) {
Eric Orthc1eb1292018-10-09 22:07:076411 ChangeDnsConfig(CreateValidDnsConfig());
Eric Orth117e1992019-04-17 00:24:156412 ResolveHostResponseHelper response(resolver_->CreateRequest(
6413 HostPortPair("4slow_ok", 80), NetLogWithSource(), base::nullopt,
6414 request_context_.get(), host_cache_.get()));
Eric Orthc1eb1292018-10-09 22:07:076415 ASSERT_FALSE(response.complete());
6416
6417 DnsConfigOverrides overrides;
6418 overrides.attempts = 123;
6419 resolver_->SetDnsConfigOverrides(overrides);
6420
6421 EXPECT_THAT(response.result_error(), IsError(ERR_NETWORK_CHANGED));
6422}
6423
6424// Queries should not be cancelled if equal overrides are set.
Eric Orth960e7062019-03-08 18:43:546425TEST_F(HostResolverManagerDnsTest,
6426 CancelQueriesOnSettingOverrides_SameOverrides) {
Eric Orthc1eb1292018-10-09 22:07:076427 ChangeDnsConfig(CreateValidDnsConfig());
6428 DnsConfigOverrides overrides;
6429 overrides.attempts = 123;
6430 resolver_->SetDnsConfigOverrides(overrides);
6431
Eric Orth117e1992019-04-17 00:24:156432 ResolveHostResponseHelper response(resolver_->CreateRequest(
6433 HostPortPair("4slow_ok", 80), NetLogWithSource(), base::nullopt,
6434 request_context_.get(), host_cache_.get()));
Eric Orthc1eb1292018-10-09 22:07:076435 ASSERT_FALSE(response.complete());
6436
6437 resolver_->SetDnsConfigOverrides(overrides);
6438
Eric Orthc823a23d2018-10-30 22:12:486439 dns_client_->CompleteDelayedTransactions();
Eric Orthc1eb1292018-10-09 22:07:076440 EXPECT_THAT(response.result_error(), IsOk());
6441}
6442
6443// Test that in-progress queries are cancelled on clearing DNS config overrides,
6444// same as receiving a new DnsConfig from the system.
Eric Orth960e7062019-03-08 18:43:546445TEST_F(HostResolverManagerDnsTest, CancelQueriesOnClearingOverrides) {
Eric Orthc1eb1292018-10-09 22:07:076446 ChangeDnsConfig(CreateValidDnsConfig());
6447 DnsConfigOverrides overrides;
6448 overrides.attempts = 123;
6449 resolver_->SetDnsConfigOverrides(overrides);
6450
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 resolver_->SetDnsConfigOverrides(DnsConfigOverrides());
6457
6458 EXPECT_THAT(response.result_error(), IsError(ERR_NETWORK_CHANGED));
6459}
6460
6461// Queries should not be cancelled on clearing overrides if there were not any
6462// overrides.
Eric Orth960e7062019-03-08 18:43:546463TEST_F(HostResolverManagerDnsTest,
6464 CancelQueriesOnClearingOverrides_NoOverrides) {
Eric Orthc1eb1292018-10-09 22:07:076465 ChangeDnsConfig(CreateValidDnsConfig());
Eric Orth117e1992019-04-17 00:24:156466 ResolveHostResponseHelper response(resolver_->CreateRequest(
6467 HostPortPair("4slow_ok", 80), NetLogWithSource(), base::nullopt,
6468 request_context_.get(), host_cache_.get()));
Eric Orthc1eb1292018-10-09 22:07:076469 ASSERT_FALSE(response.complete());
6470
6471 resolver_->SetDnsConfigOverrides(DnsConfigOverrides());
6472
Eric Orthc823a23d2018-10-30 22:12:486473 dns_client_->CompleteDelayedTransactions();
Eric Orthc1eb1292018-10-09 22:07:076474 EXPECT_THAT(response.result_error(), IsOk());
6475}
6476
Eric Orth960e7062019-03-08 18:43:546477// Test HostResolverManager::UpdateModeForHistogram.
6478TEST_F(HostResolverManagerDnsTest, ModeForHistogram) {
Paul Jensen41dc3e9f2018-11-06 22:10:106479 // Test Async resolver is detected.
6480 ChangeDnsConfig(CreateValidDnsConfig());
6481 EXPECT_EQ(resolver_->mode_for_histogram_,
Eric Orth960e7062019-03-08 18:43:546482 HostResolverManager::MODE_FOR_HISTOGRAM_ASYNC_DNS);
Paul Jensen41dc3e9f2018-11-06 22:10:106483
6484 // Test upgradability is detected for async DNS.
Eric Orth192e3bb2018-11-14 19:30:326485 static const std::vector<const char*> upgradable_servers(
Paul Jensen41dc3e9f2018-11-06 22:10:106486 {// Google Public DNS
6487 "8.8.8.8", "8.8.4.4", "2001:4860:4860::8888", "2001:4860:4860::8844",
6488 // Cloudflare DNS
6489 "1.1.1.1", "1.0.0.1", "2606:4700:4700::1111", "2606:4700:4700::1001",
6490 // Quad9 DNS
6491 "9.9.9.9", "149.112.112.112", "2620:fe::fe", "2620:fe::9"});
6492 for (const char* upgradable_server : upgradable_servers) {
6493 IPAddress ip_address;
6494 ASSERT_TRUE(ip_address.AssignFromIPLiteral(upgradable_server));
6495 DnsConfig dns_config;
6496 dns_config.nameservers.push_back(
6497 IPEndPoint(ip_address, dns_protocol::kDefaultPort));
6498 ChangeDnsConfig(dns_config);
6499 EXPECT_EQ(
6500 resolver_->mode_for_histogram_,
Eric Orth960e7062019-03-08 18:43:546501 HostResolverManager::MODE_FOR_HISTOGRAM_ASYNC_DNS_PRIVATE_SUPPORTS_DOH);
Paul Jensen41dc3e9f2018-11-06 22:10:106502 }
6503
6504 // Test system resolver is detected.
dalykc27699a2019-07-29 20:53:296505 resolver_->SetInsecureDnsClientEnabled(false);
Paul Jensen41dc3e9f2018-11-06 22:10:106506 ChangeDnsConfig(CreateValidDnsConfig());
6507 EXPECT_EQ(resolver_->mode_for_histogram_,
Eric Orth960e7062019-03-08 18:43:546508 HostResolverManager::MODE_FOR_HISTOGRAM_SYSTEM);
Paul Jensen41dc3e9f2018-11-06 22:10:106509
6510 // Test upgradability is detected for system resolver.
6511 for (const char* upgradable_server : upgradable_servers) {
6512 IPAddress ip_address;
6513 ASSERT_TRUE(ip_address.AssignFromIPLiteral(upgradable_server));
6514 DnsConfig dns_config;
6515 dns_config.nameservers.push_back(
6516 IPEndPoint(ip_address, dns_protocol::kDefaultPort));
6517 ChangeDnsConfig(dns_config);
6518 EXPECT_EQ(resolver_->mode_for_histogram_,
Eric Orth960e7062019-03-08 18:43:546519 HostResolverManager::MODE_FOR_HISTOGRAM_SYSTEM_SUPPORTS_DOH);
Paul Jensen41dc3e9f2018-11-06 22:10:106520 }
dalyk6d7d8ead2019-08-15 03:30:086521
6522 // Test private DNS is detected.
6523 DnsConfig config = CreateValidDnsConfig();
6524 config.dns_over_tls_active = true;
6525 ChangeDnsConfig(config);
6526 EXPECT_EQ(resolver_->mode_for_histogram_,
6527 HostResolverManager::MODE_FOR_HISTOGRAM_SYSTEM_PRIVATE_DNS);
6528
6529 // Test upgradeability from IP addresses when private DNS is active.
6530 for (const char* upgradable_server : upgradable_servers) {
6531 IPAddress ip_address;
6532 ASSERT_TRUE(ip_address.AssignFromIPLiteral(upgradable_server));
6533 DnsConfig dns_config;
6534 dns_config.dns_over_tls_active = true;
6535 dns_config.nameservers.push_back(
6536 IPEndPoint(ip_address, dns_protocol::kDefaultPort));
6537 ChangeDnsConfig(dns_config);
6538 EXPECT_EQ(resolver_->mode_for_histogram_,
6539 HostResolverManager::
6540 MODE_FOR_HISTOGRAM_SYSTEM_PRIVATE_DNS_SUPPORTS_DOH);
6541 }
6542
6543 // Test upgradeability from private DNS hostname.
6544 static const std::vector<const char*> upgradeable_private_servers(
6545 {// Google Public DNS
6546 "dns.google",
6547 // Cloudflare DNS
6548 "1dot1dot1dot1.cloudflare-dns.com", "cloudflare-dns.com",
6549 // Quad9 DNS
6550 "dns.quad9.net"});
6551 for (const char* upgradeable_private_server : upgradeable_private_servers) {
6552 DnsConfig dns_config;
6553 dns_config.dns_over_tls_active = true;
6554 dns_config.dns_over_tls_hostname = upgradeable_private_server;
6555 dns_config.nameservers.push_back(
6556 IPEndPoint(IPAddress(1, 2, 3, 4), dns_protocol::kDefaultPort));
6557 ChangeDnsConfig(dns_config);
6558 EXPECT_EQ(resolver_->mode_for_histogram_,
6559 HostResolverManager::
6560 MODE_FOR_HISTOGRAM_SYSTEM_PRIVATE_DNS_SUPPORTS_DOH);
6561 }
Paul Jensen41dc3e9f2018-11-06 22:10:106562}
6563
Eric Orth960e7062019-03-08 18:43:546564TEST_F(HostResolverManagerDnsTest, TxtQuery) {
Eric Orth828bd3ae2018-12-12 17:30:366565 // Simulate two separate DNS records, each with multiple strings.
6566 std::vector<std::string> foo_records = {"foo1", "foo2", "foo3"};
6567 std::vector<std::string> bar_records = {"bar1", "bar2"};
6568 std::vector<std::vector<std::string>> text_records = {foo_records,
6569 bar_records};
6570
6571 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136572 rules.emplace_back("host", dns_protocol::kTypeTXT, false /* secure */,
dalykc0ab0722019-03-14 17:00:586573 MockDnsClientRule::Result(BuildTestDnsTextResponse(
6574 "host", std::move(text_records))),
Eric Orth828bd3ae2018-12-12 17:30:366575 false /* delay */);
6576
6577 CreateResolver();
6578 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6579
6580 HostResolver::ResolveHostParameters parameters;
6581 parameters.dns_query_type = DnsQueryType::TXT;
6582
Eric Orth117e1992019-04-17 00:24:156583 ResolveHostResponseHelper response(resolver_->CreateRequest(
6584 HostPortPair("host", 108), NetLogWithSource(), parameters,
6585 request_context_.get(), host_cache_.get()));
Eric Orth828bd3ae2018-12-12 17:30:366586 EXPECT_THAT(response.result_error(), IsOk());
6587 EXPECT_FALSE(response.request()->GetAddressResults());
6588 EXPECT_FALSE(response.request()->GetHostnameResults());
6589
6590 // Order between separate DNS records is undefined, but each record should
6591 // stay in order as that order may be meaningful.
6592 ASSERT_THAT(response.request()->GetTextResults(),
6593 testing::Optional(testing::UnorderedElementsAre(
6594 "foo1", "foo2", "foo3", "bar1", "bar2")));
6595 std::vector<std::string> results =
6596 response.request()->GetTextResults().value();
6597 EXPECT_NE(results.end(), std::search(results.begin(), results.end(),
6598 foo_records.begin(), foo_records.end()));
6599 EXPECT_NE(results.end(), std::search(results.begin(), results.end(),
6600 bar_records.begin(), bar_records.end()));
6601}
6602
dalykc27699a2019-07-29 20:53:296603TEST_F(HostResolverManagerDnsTest, TxtQuery_InvalidConfig) {
6604 set_allow_fallback_to_proctask(false);
6605 // Set empty DnsConfig.
6606 ChangeDnsConfig(DnsConfig());
6607
6608 HostResolver::ResolveHostParameters parameters;
6609 parameters.dns_query_type = DnsQueryType::TXT;
6610
6611 ResolveHostResponseHelper response(resolver_->CreateRequest(
6612 HostPortPair("host", 108), NetLogWithSource(), parameters,
6613 request_context_.get(), host_cache_.get()));
6614 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_CACHE_MISS));
6615}
6616
Eric Orth960e7062019-03-08 18:43:546617TEST_F(HostResolverManagerDnsTest, TxtQuery_NonexistentDomain) {
Eric Orth828bd3ae2018-12-12 17:30:366618 // Setup fallback to confirm it is not used for non-address results.
6619 set_allow_fallback_to_proctask(true);
6620 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
6621 proc_->SignalMultiple(1u);
6622
6623 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136624 rules.emplace_back("host", dns_protocol::kTypeTXT, false /* secure */,
Eric Orth828bd3ae2018-12-12 17:30:366625 MockDnsClientRule::Result(MockDnsClientRule::NODOMAIN),
6626 false /* delay */);
6627
6628 CreateResolver();
6629 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6630
6631 HostResolver::ResolveHostParameters parameters;
6632 parameters.dns_query_type = DnsQueryType::TXT;
6633
Eric Orth117e1992019-04-17 00:24:156634 ResolveHostResponseHelper response(resolver_->CreateRequest(
6635 HostPortPair("host", 108), NetLogWithSource(), parameters,
6636 request_context_.get(), host_cache_.get()));
Eric Orth828bd3ae2018-12-12 17:30:366637 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
6638 EXPECT_FALSE(response.request()->GetAddressResults());
6639 EXPECT_FALSE(response.request()->GetTextResults());
6640 EXPECT_FALSE(response.request()->GetHostnameResults());
6641}
6642
Eric Orth960e7062019-03-08 18:43:546643TEST_F(HostResolverManagerDnsTest, TxtQuery_Failure) {
Eric Orth828bd3ae2018-12-12 17:30:366644 // Setup fallback to confirm it is not used for non-address results.
6645 set_allow_fallback_to_proctask(true);
6646 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
6647 proc_->SignalMultiple(1u);
6648
6649 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136650 rules.emplace_back("host", dns_protocol::kTypeTXT, false /* secure */,
6651 MockDnsClientRule::Result(MockDnsClientRule::FAIL),
6652 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:366653
6654 CreateResolver();
6655 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6656
6657 HostResolver::ResolveHostParameters parameters;
6658 parameters.dns_query_type = DnsQueryType::TXT;
6659
Eric Orth117e1992019-04-17 00:24:156660 ResolveHostResponseHelper response(resolver_->CreateRequest(
6661 HostPortPair("host", 108), NetLogWithSource(), parameters,
6662 request_context_.get(), host_cache_.get()));
Eric Orth828bd3ae2018-12-12 17:30:366663 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
6664 EXPECT_FALSE(response.request()->GetAddressResults());
6665 EXPECT_FALSE(response.request()->GetTextResults());
6666 EXPECT_FALSE(response.request()->GetHostnameResults());
6667}
6668
Eric Orth960e7062019-03-08 18:43:546669TEST_F(HostResolverManagerDnsTest, TxtQuery_Timeout) {
Eric Orth828bd3ae2018-12-12 17:30:366670 // Setup fallback to confirm it is not used for non-address results.
6671 set_allow_fallback_to_proctask(true);
6672 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
6673 proc_->SignalMultiple(1u);
6674
6675 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136676 rules.emplace_back("host", dns_protocol::kTypeTXT, false /* secure */,
6677 MockDnsClientRule::Result(MockDnsClientRule::TIMEOUT),
6678 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:366679
6680 CreateResolver();
6681 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6682
6683 HostResolver::ResolveHostParameters parameters;
6684 parameters.dns_query_type = DnsQueryType::TXT;
6685
Eric Orth117e1992019-04-17 00:24:156686 ResolveHostResponseHelper response(resolver_->CreateRequest(
6687 HostPortPair("host", 108), NetLogWithSource(), parameters,
6688 request_context_.get(), host_cache_.get()));
Eric Orth828bd3ae2018-12-12 17:30:366689 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_TIMED_OUT));
6690 EXPECT_FALSE(response.request()->GetAddressResults());
6691 EXPECT_FALSE(response.request()->GetTextResults());
6692 EXPECT_FALSE(response.request()->GetHostnameResults());
6693}
6694
Eric Orth960e7062019-03-08 18:43:546695TEST_F(HostResolverManagerDnsTest, TxtQuery_Empty) {
Eric Orth828bd3ae2018-12-12 17:30:366696 // Setup fallback to confirm it is not used for non-address results.
6697 set_allow_fallback_to_proctask(true);
6698 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
6699 proc_->SignalMultiple(1u);
6700
6701 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136702 rules.emplace_back("host", dns_protocol::kTypeTXT, false /* secure */,
6703 MockDnsClientRule::Result(MockDnsClientRule::EMPTY),
6704 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:366705
6706 CreateResolver();
6707 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6708
6709 HostResolver::ResolveHostParameters parameters;
6710 parameters.dns_query_type = DnsQueryType::TXT;
6711
Eric Orth117e1992019-04-17 00:24:156712 ResolveHostResponseHelper response(resolver_->CreateRequest(
6713 HostPortPair("host", 108), NetLogWithSource(), parameters,
6714 request_context_.get(), host_cache_.get()));
Eric Orth828bd3ae2018-12-12 17:30:366715 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
6716 EXPECT_FALSE(response.request()->GetAddressResults());
6717 EXPECT_FALSE(response.request()->GetTextResults());
6718 EXPECT_FALSE(response.request()->GetHostnameResults());
6719}
6720
Eric Orth960e7062019-03-08 18:43:546721TEST_F(HostResolverManagerDnsTest, TxtQuery_Malformed) {
Eric Orth828bd3ae2018-12-12 17:30:366722 // Setup fallback to confirm it is not used for non-address results.
6723 set_allow_fallback_to_proctask(true);
6724 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
6725 proc_->SignalMultiple(1u);
6726
6727 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136728 rules.emplace_back("host", dns_protocol::kTypeTXT, false /* secure */,
Eric Orth828bd3ae2018-12-12 17:30:366729 MockDnsClientRule::Result(MockDnsClientRule::MALFORMED),
6730 false /* delay */);
6731
6732 CreateResolver();
6733 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6734
6735 HostResolver::ResolveHostParameters parameters;
6736 parameters.dns_query_type = DnsQueryType::TXT;
6737
Eric Orth117e1992019-04-17 00:24:156738 ResolveHostResponseHelper response(resolver_->CreateRequest(
6739 HostPortPair("host", 108), NetLogWithSource(), parameters,
6740 request_context_.get(), host_cache_.get()));
Eric Orth828bd3ae2018-12-12 17:30:366741 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE));
6742 EXPECT_FALSE(response.request()->GetAddressResults());
6743 EXPECT_FALSE(response.request()->GetTextResults());
6744 EXPECT_FALSE(response.request()->GetHostnameResults());
6745}
6746
Eric Orth960e7062019-03-08 18:43:546747TEST_F(HostResolverManagerDnsTest, TxtQuery_MismatchedName) {
Eric Orth828bd3ae2018-12-12 17:30:366748 std::vector<std::vector<std::string>> text_records = {{"text"}};
6749 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136750 rules.emplace_back("host", dns_protocol::kTypeTXT, false /* secure */,
dalykc0ab0722019-03-14 17:00:586751 MockDnsClientRule::Result(BuildTestDnsTextResponse(
Eric Orth828bd3ae2018-12-12 17:30:366752 "host", std::move(text_records), "not.host")),
6753 false /* delay */);
6754
6755 CreateResolver();
6756 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6757
6758 HostResolver::ResolveHostParameters parameters;
6759 parameters.dns_query_type = DnsQueryType::TXT;
6760
Eric Orth117e1992019-04-17 00:24:156761 ResolveHostResponseHelper response(resolver_->CreateRequest(
6762 HostPortPair("host", 108), NetLogWithSource(), parameters,
6763 request_context_.get(), host_cache_.get()));
Eric Orth828bd3ae2018-12-12 17:30:366764 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE));
6765 EXPECT_FALSE(response.request()->GetAddressResults());
6766 EXPECT_FALSE(response.request()->GetTextResults());
6767 EXPECT_FALSE(response.request()->GetHostnameResults());
6768}
6769
Eric Orth960e7062019-03-08 18:43:546770TEST_F(HostResolverManagerDnsTest, TxtQuery_WrongType) {
Eric Orth828bd3ae2018-12-12 17:30:366771 // Respond to a TXT query with an A response.
6772 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136773 rules.emplace_back("host", dns_protocol::kTypeTXT, false /* secure */,
Eric Orth828bd3ae2018-12-12 17:30:366774 MockDnsClientRule::Result(
6775 BuildTestDnsResponse("host", IPAddress(1, 2, 3, 4))),
6776 false /* delay */);
6777
6778 CreateResolver();
6779 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6780
6781 HostResolver::ResolveHostParameters parameters;
6782 parameters.dns_query_type = DnsQueryType::TXT;
6783
6784 // Responses for the wrong type should be ignored.
Eric Orth117e1992019-04-17 00:24:156785 ResolveHostResponseHelper response(resolver_->CreateRequest(
6786 HostPortPair("ok", 108), NetLogWithSource(), parameters,
6787 request_context_.get(), host_cache_.get()));
Eric Orth828bd3ae2018-12-12 17:30:366788 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
6789 EXPECT_FALSE(response.request()->GetAddressResults());
6790 EXPECT_FALSE(response.request()->GetTextResults());
6791 EXPECT_FALSE(response.request()->GetHostnameResults());
6792}
6793
Eric Ortha625b042019-01-16 01:14:456794// Same as TxtQuery except we specify DNS HostResolverSource instead of relying
6795// on automatic determination. Expect same results since DNS should be what we
6796// automatically determine, but some slightly different logic paths are
6797// involved.
Eric Orth960e7062019-03-08 18:43:546798TEST_F(HostResolverManagerDnsTest, TxtDnsQuery) {
Eric Orth828bd3ae2018-12-12 17:30:366799 // Simulate two separate DNS records, each with multiple strings.
6800 std::vector<std::string> foo_records = {"foo1", "foo2", "foo3"};
6801 std::vector<std::string> bar_records = {"bar1", "bar2"};
6802 std::vector<std::vector<std::string>> text_records = {foo_records,
6803 bar_records};
6804
6805 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136806 rules.emplace_back("host", dns_protocol::kTypeTXT, false /* secure */,
dalykc0ab0722019-03-14 17:00:586807 MockDnsClientRule::Result(BuildTestDnsTextResponse(
6808 "host", std::move(text_records))),
Eric Orth828bd3ae2018-12-12 17:30:366809 false /* delay */);
6810
6811 CreateResolver();
6812 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6813
6814 HostResolver::ResolveHostParameters parameters;
6815 parameters.source = HostResolverSource::DNS;
6816 parameters.dns_query_type = DnsQueryType::TXT;
6817
Eric Orth117e1992019-04-17 00:24:156818 ResolveHostResponseHelper response(resolver_->CreateRequest(
6819 HostPortPair("host", 108), NetLogWithSource(), parameters,
6820 request_context_.get(), host_cache_.get()));
Eric Orth828bd3ae2018-12-12 17:30:366821 EXPECT_THAT(response.result_error(), IsOk());
6822 EXPECT_FALSE(response.request()->GetAddressResults());
6823 EXPECT_FALSE(response.request()->GetHostnameResults());
6824
6825 // Order between separate DNS records is undefined, but each record should
6826 // stay in order as that order may be meaningful.
6827 ASSERT_THAT(response.request()->GetTextResults(),
6828 testing::Optional(testing::UnorderedElementsAre(
6829 "foo1", "foo2", "foo3", "bar1", "bar2")));
6830 std::vector<std::string> results =
6831 response.request()->GetTextResults().value();
6832 EXPECT_NE(results.end(), std::search(results.begin(), results.end(),
6833 foo_records.begin(), foo_records.end()));
6834 EXPECT_NE(results.end(), std::search(results.begin(), results.end(),
6835 bar_records.begin(), bar_records.end()));
6836}
6837
Eric Orth960e7062019-03-08 18:43:546838TEST_F(HostResolverManagerDnsTest, PtrQuery) {
Eric Orthe9db8d232019-01-14 21:24:456839 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136840 rules.emplace_back("host", dns_protocol::kTypePTR, false /* secure */,
Eric Orthe9db8d232019-01-14 21:24:456841 MockDnsClientRule::Result(BuildTestDnsPointerResponse(
6842 "host", {"foo.com", "bar.com"})),
6843 false /* delay */);
6844
6845 CreateResolver();
6846 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6847
6848 HostResolver::ResolveHostParameters parameters;
6849 parameters.dns_query_type = DnsQueryType::PTR;
6850
Eric Orth117e1992019-04-17 00:24:156851 ResolveHostResponseHelper response(resolver_->CreateRequest(
6852 HostPortPair("host", 108), NetLogWithSource(), parameters,
6853 request_context_.get(), host_cache_.get()));
Eric Orthe9db8d232019-01-14 21:24:456854 EXPECT_THAT(response.result_error(), IsOk());
6855 EXPECT_FALSE(response.request()->GetAddressResults());
6856 EXPECT_FALSE(response.request()->GetTextResults());
6857
6858 // Order between separate records is undefined.
6859 EXPECT_THAT(response.request()->GetHostnameResults(),
6860 testing::Optional(testing::UnorderedElementsAre(
6861 HostPortPair("foo.com", 108), HostPortPair("bar.com", 108))));
6862}
6863
Eric Orth960e7062019-03-08 18:43:546864TEST_F(HostResolverManagerDnsTest, PtrQuery_Ip) {
Eric Orthe9db8d232019-01-14 21:24:456865 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136866 rules.emplace_back("8.8.8.8", dns_protocol::kTypePTR, false /* secure */,
Eric Orthe9db8d232019-01-14 21:24:456867 MockDnsClientRule::Result(BuildTestDnsPointerResponse(
6868 "8.8.8.8", {"foo.com", "bar.com"})),
6869 false /* delay */);
6870
6871 CreateResolver();
6872 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6873
6874 HostResolver::ResolveHostParameters parameters;
6875 parameters.dns_query_type = DnsQueryType::PTR;
6876
Eric Orth117e1992019-04-17 00:24:156877 ResolveHostResponseHelper response(resolver_->CreateRequest(
6878 HostPortPair("8.8.8.8", 108), NetLogWithSource(), parameters,
6879 request_context_.get(), host_cache_.get()));
Eric Orthe9db8d232019-01-14 21:24:456880 EXPECT_THAT(response.result_error(), IsOk());
6881 EXPECT_FALSE(response.request()->GetAddressResults());
6882 EXPECT_FALSE(response.request()->GetTextResults());
6883
6884 // Order between separate records is undefined.
6885 EXPECT_THAT(response.request()->GetHostnameResults(),
6886 testing::Optional(testing::UnorderedElementsAre(
6887 HostPortPair("foo.com", 108), HostPortPair("bar.com", 108))));
6888}
6889
Eric Orth960e7062019-03-08 18:43:546890TEST_F(HostResolverManagerDnsTest, PtrQuery_NonexistentDomain) {
Eric Orthe9db8d232019-01-14 21:24:456891 // Setup fallback to confirm it is not used for non-address results.
6892 set_allow_fallback_to_proctask(true);
6893 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
6894 proc_->SignalMultiple(1u);
6895
6896 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136897 rules.emplace_back("host", dns_protocol::kTypePTR, false /* secure */,
Eric Orthe9db8d232019-01-14 21:24:456898 MockDnsClientRule::Result(MockDnsClientRule::NODOMAIN),
6899 false /* delay */);
6900
6901 CreateResolver();
6902 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6903
6904 HostResolver::ResolveHostParameters parameters;
6905 parameters.dns_query_type = DnsQueryType::PTR;
6906
Eric Orth117e1992019-04-17 00:24:156907 ResolveHostResponseHelper response(resolver_->CreateRequest(
6908 HostPortPair("host", 108), NetLogWithSource(), parameters,
6909 request_context_.get(), host_cache_.get()));
Eric Orthe9db8d232019-01-14 21:24:456910 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
6911 EXPECT_FALSE(response.request()->GetAddressResults());
6912 EXPECT_FALSE(response.request()->GetTextResults());
6913 EXPECT_FALSE(response.request()->GetHostnameResults());
6914}
6915
Eric Orth960e7062019-03-08 18:43:546916TEST_F(HostResolverManagerDnsTest, PtrQuery_Failure) {
Eric Orthe9db8d232019-01-14 21:24:456917 // Setup fallback to confirm it is not used for non-address results.
6918 set_allow_fallback_to_proctask(true);
6919 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
6920 proc_->SignalMultiple(1u);
6921
6922 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136923 rules.emplace_back("host", dns_protocol::kTypePTR, false /* secure */,
6924 MockDnsClientRule::Result(MockDnsClientRule::FAIL),
6925 false /* delay */);
Eric Orthe9db8d232019-01-14 21:24:456926
6927 CreateResolver();
6928 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6929
6930 HostResolver::ResolveHostParameters parameters;
6931 parameters.dns_query_type = DnsQueryType::PTR;
6932
Eric Orth117e1992019-04-17 00:24:156933 ResolveHostResponseHelper response(resolver_->CreateRequest(
6934 HostPortPair("host", 108), NetLogWithSource(), parameters,
6935 request_context_.get(), host_cache_.get()));
Eric Orthe9db8d232019-01-14 21:24:456936 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
6937 EXPECT_FALSE(response.request()->GetAddressResults());
6938 EXPECT_FALSE(response.request()->GetTextResults());
6939 EXPECT_FALSE(response.request()->GetHostnameResults());
6940}
6941
Eric Orth960e7062019-03-08 18:43:546942TEST_F(HostResolverManagerDnsTest, PtrQuery_Timeout) {
Eric Orthe9db8d232019-01-14 21:24:456943 // Setup fallback to confirm it is not used for non-address results.
6944 set_allow_fallback_to_proctask(true);
6945 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
6946 proc_->SignalMultiple(1u);
6947
6948 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136949 rules.emplace_back("host", dns_protocol::kTypePTR, false /* secure */,
6950 MockDnsClientRule::Result(MockDnsClientRule::TIMEOUT),
6951 false /* delay */);
Eric Orthe9db8d232019-01-14 21:24:456952
6953 CreateResolver();
6954 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6955
6956 HostResolver::ResolveHostParameters parameters;
6957 parameters.dns_query_type = DnsQueryType::PTR;
6958
Eric Orth117e1992019-04-17 00:24:156959 ResolveHostResponseHelper response(resolver_->CreateRequest(
6960 HostPortPair("host", 108), NetLogWithSource(), parameters,
6961 request_context_.get(), host_cache_.get()));
Eric Orthe9db8d232019-01-14 21:24:456962 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_TIMED_OUT));
6963 EXPECT_FALSE(response.request()->GetAddressResults());
6964 EXPECT_FALSE(response.request()->GetTextResults());
6965 EXPECT_FALSE(response.request()->GetHostnameResults());
6966}
6967
Eric Orth960e7062019-03-08 18:43:546968TEST_F(HostResolverManagerDnsTest, PtrQuery_Empty) {
Eric Orthe9db8d232019-01-14 21:24:456969 // Setup fallback to confirm it is not used for non-address results.
6970 set_allow_fallback_to_proctask(true);
6971 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
6972 proc_->SignalMultiple(1u);
6973
6974 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:136975 rules.emplace_back("host", dns_protocol::kTypePTR, false /* secure */,
6976 MockDnsClientRule::Result(MockDnsClientRule::EMPTY),
6977 false /* delay */);
Eric Orthe9db8d232019-01-14 21:24:456978
6979 CreateResolver();
6980 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6981
6982 HostResolver::ResolveHostParameters parameters;
6983 parameters.dns_query_type = DnsQueryType::PTR;
6984
Eric Orth117e1992019-04-17 00:24:156985 ResolveHostResponseHelper response(resolver_->CreateRequest(
6986 HostPortPair("host", 108), NetLogWithSource(), parameters,
6987 request_context_.get(), host_cache_.get()));
Eric Orthe9db8d232019-01-14 21:24:456988 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
6989 EXPECT_FALSE(response.request()->GetAddressResults());
6990 EXPECT_FALSE(response.request()->GetTextResults());
6991 EXPECT_FALSE(response.request()->GetHostnameResults());
6992}
6993
Eric Orth960e7062019-03-08 18:43:546994TEST_F(HostResolverManagerDnsTest, PtrQuery_Malformed) {
Eric Orthe9db8d232019-01-14 21:24:456995 // Setup fallback to confirm it is not used for non-address results.
6996 set_allow_fallback_to_proctask(true);
6997 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
6998 proc_->SignalMultiple(1u);
6999
7000 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137001 rules.emplace_back("host", dns_protocol::kTypePTR, false /* secure */,
Eric Orthe9db8d232019-01-14 21:24:457002 MockDnsClientRule::Result(MockDnsClientRule::MALFORMED),
7003 false /* delay */);
7004
7005 CreateResolver();
7006 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7007
7008 HostResolver::ResolveHostParameters parameters;
7009 parameters.dns_query_type = DnsQueryType::PTR;
7010
Eric Orth117e1992019-04-17 00:24:157011 ResolveHostResponseHelper response(resolver_->CreateRequest(
7012 HostPortPair("host", 108), NetLogWithSource(), parameters,
7013 request_context_.get(), host_cache_.get()));
Eric Orthe9db8d232019-01-14 21:24:457014 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE));
7015 EXPECT_FALSE(response.request()->GetAddressResults());
7016 EXPECT_FALSE(response.request()->GetTextResults());
7017 EXPECT_FALSE(response.request()->GetHostnameResults());
7018}
7019
Eric Orth960e7062019-03-08 18:43:547020TEST_F(HostResolverManagerDnsTest, PtrQuery_MismatchedName) {
Eric Orthe9db8d232019-01-14 21:24:457021 std::vector<std::string> ptr_records = {{"foo.com"}};
7022 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137023 rules.emplace_back("host", dns_protocol::kTypePTR, false /* secure */,
Eric Orthe9db8d232019-01-14 21:24:457024 MockDnsClientRule::Result(BuildTestDnsPointerResponse(
7025 "host", std::move(ptr_records), "not.host")),
7026 false /* delay */);
7027
7028 CreateResolver();
7029 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7030
7031 HostResolver::ResolveHostParameters parameters;
7032 parameters.dns_query_type = DnsQueryType::PTR;
7033
Eric Orth117e1992019-04-17 00:24:157034 ResolveHostResponseHelper response(resolver_->CreateRequest(
7035 HostPortPair("host", 108), NetLogWithSource(), parameters,
7036 request_context_.get(), host_cache_.get()));
Eric Orthe9db8d232019-01-14 21:24:457037 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE));
7038 EXPECT_FALSE(response.request()->GetAddressResults());
7039 EXPECT_FALSE(response.request()->GetTextResults());
7040 EXPECT_FALSE(response.request()->GetHostnameResults());
7041}
7042
Eric Orth960e7062019-03-08 18:43:547043TEST_F(HostResolverManagerDnsTest, PtrQuery_WrongType) {
Eric Orthe9db8d232019-01-14 21:24:457044 // Respond to a TXT query with an A response.
7045 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137046 rules.emplace_back("host", dns_protocol::kTypePTR, false /* secure */,
Eric Orthe9db8d232019-01-14 21:24:457047 MockDnsClientRule::Result(
7048 BuildTestDnsResponse("host", IPAddress(1, 2, 3, 4))),
7049 false /* delay */);
7050
7051 CreateResolver();
7052 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7053
7054 HostResolver::ResolveHostParameters parameters;
7055 parameters.dns_query_type = DnsQueryType::PTR;
7056
7057 // Responses for the wrong type should be ignored.
Eric Orth117e1992019-04-17 00:24:157058 ResolveHostResponseHelper response(resolver_->CreateRequest(
7059 HostPortPair("ok", 108), NetLogWithSource(), parameters,
7060 request_context_.get(), host_cache_.get()));
Eric Orthe9db8d232019-01-14 21:24:457061 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
7062 EXPECT_FALSE(response.request()->GetAddressResults());
7063 EXPECT_FALSE(response.request()->GetTextResults());
7064 EXPECT_FALSE(response.request()->GetHostnameResults());
7065}
7066
Eric Ortha625b042019-01-16 01:14:457067// Same as PtrQuery except we specify DNS HostResolverSource instead of relying
7068// on automatic determination. Expect same results since DNS should be what we
7069// automatically determine, but some slightly different logic paths are
7070// involved.
Eric Orth960e7062019-03-08 18:43:547071TEST_F(HostResolverManagerDnsTest, PtrDnsQuery) {
Eric Orthe9db8d232019-01-14 21:24:457072 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137073 rules.emplace_back("host", dns_protocol::kTypePTR, false /* secure */,
Eric Orthe9db8d232019-01-14 21:24:457074 MockDnsClientRule::Result(BuildTestDnsPointerResponse(
7075 "host", {"foo.com", "bar.com"})),
7076 false /* delay */);
7077
7078 CreateResolver();
7079 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7080
7081 HostResolver::ResolveHostParameters parameters;
7082 parameters.source = HostResolverSource::DNS;
7083 parameters.dns_query_type = DnsQueryType::PTR;
7084
Eric Orth117e1992019-04-17 00:24:157085 ResolveHostResponseHelper response(resolver_->CreateRequest(
7086 HostPortPair("host", 108), NetLogWithSource(), parameters,
7087 request_context_.get(), host_cache_.get()));
Eric Orthe9db8d232019-01-14 21:24:457088 EXPECT_THAT(response.result_error(), IsOk());
7089 EXPECT_FALSE(response.request()->GetAddressResults());
7090 EXPECT_FALSE(response.request()->GetTextResults());
7091
7092 // Order between separate records is undefined.
7093 EXPECT_THAT(response.request()->GetHostnameResults(),
7094 testing::Optional(testing::UnorderedElementsAre(
7095 HostPortPair("foo.com", 108), HostPortPair("bar.com", 108))));
7096}
7097
Eric Orth960e7062019-03-08 18:43:547098TEST_F(HostResolverManagerDnsTest, SrvQuery) {
Eric Ortha625b042019-01-16 01:14:457099 const TestServiceRecord kRecord1 = {2, 3, 1223, "foo.com"};
7100 const TestServiceRecord kRecord2 = {5, 10, 80, "bar.com"};
7101 const TestServiceRecord kRecord3 = {5, 1, 5, "google.com"};
7102 const TestServiceRecord kRecord4 = {2, 100, 12345, "chromium.org"};
7103 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137104 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
dalykc0ab0722019-03-14 17:00:587105 MockDnsClientRule::Result(BuildTestDnsServiceResponse(
Eric Ortha625b042019-01-16 01:14:457106 "host", {kRecord1, kRecord2, kRecord3, kRecord4})),
7107 false /* delay */);
7108
7109 CreateResolver();
7110 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7111
7112 HostResolver::ResolveHostParameters parameters;
7113 parameters.dns_query_type = DnsQueryType::SRV;
7114
Eric Orth117e1992019-04-17 00:24:157115 ResolveHostResponseHelper response(resolver_->CreateRequest(
7116 HostPortPair("host", 108), NetLogWithSource(), parameters,
7117 request_context_.get(), host_cache_.get()));
Eric Ortha625b042019-01-16 01:14:457118 EXPECT_THAT(response.result_error(), IsOk());
7119 EXPECT_FALSE(response.request()->GetAddressResults());
7120 EXPECT_FALSE(response.request()->GetTextResults());
7121
7122 // Expect ordered by priority, and random within a priority.
7123 base::Optional<std::vector<HostPortPair>> results =
7124 response.request()->GetHostnameResults();
7125 ASSERT_THAT(
7126 results,
7127 testing::Optional(testing::UnorderedElementsAre(
7128 HostPortPair("foo.com", 1223), HostPortPair("bar.com", 80),
7129 HostPortPair("google.com", 5), HostPortPair("chromium.org", 12345))));
7130 auto priority2 = std::vector<HostPortPair>(results.value().begin(),
7131 results.value().begin() + 2);
7132 EXPECT_THAT(priority2, testing::UnorderedElementsAre(
7133 HostPortPair("foo.com", 1223),
7134 HostPortPair("chromium.org", 12345)));
7135 auto priority5 = std::vector<HostPortPair>(results.value().begin() + 2,
7136 results.value().end());
7137 EXPECT_THAT(priority5,
7138 testing::UnorderedElementsAre(HostPortPair("bar.com", 80),
7139 HostPortPair("google.com", 5)));
7140}
7141
7142// 0-weight services are allowed. Ensure that we can handle such records,
7143// especially the case where all entries have weight 0.
Eric Orth960e7062019-03-08 18:43:547144TEST_F(HostResolverManagerDnsTest, SrvQuery_ZeroWeight) {
Eric Ortha625b042019-01-16 01:14:457145 const TestServiceRecord kRecord1 = {5, 0, 80, "bar.com"};
7146 const TestServiceRecord kRecord2 = {5, 0, 5, "google.com"};
7147 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137148 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
dalykc0ab0722019-03-14 17:00:587149 MockDnsClientRule::Result(BuildTestDnsServiceResponse(
7150 "host", {kRecord1, kRecord2})),
Eric Ortha625b042019-01-16 01:14:457151 false /* delay */);
7152
7153 CreateResolver();
7154 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7155
7156 HostResolver::ResolveHostParameters parameters;
7157 parameters.dns_query_type = DnsQueryType::SRV;
7158
Eric Orth117e1992019-04-17 00:24:157159 ResolveHostResponseHelper response(resolver_->CreateRequest(
7160 HostPortPair("host", 108), NetLogWithSource(), parameters,
7161 request_context_.get(), host_cache_.get()));
Eric Ortha625b042019-01-16 01:14:457162 EXPECT_THAT(response.result_error(), IsOk());
7163 EXPECT_FALSE(response.request()->GetAddressResults());
7164 EXPECT_FALSE(response.request()->GetTextResults());
7165
7166 // Expect ordered by priority, and random within a priority.
7167 EXPECT_THAT(response.request()->GetHostnameResults(),
7168 testing::Optional(testing::UnorderedElementsAre(
7169 HostPortPair("bar.com", 80), HostPortPair("google.com", 5))));
7170}
7171
Eric Orth960e7062019-03-08 18:43:547172TEST_F(HostResolverManagerDnsTest, SrvQuery_NonexistentDomain) {
Eric Ortha625b042019-01-16 01:14:457173 // Setup fallback to confirm it is not used for non-address results.
7174 set_allow_fallback_to_proctask(true);
7175 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
7176 proc_->SignalMultiple(1u);
7177
7178 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137179 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
Eric Ortha625b042019-01-16 01:14:457180 MockDnsClientRule::Result(MockDnsClientRule::NODOMAIN),
7181 false /* delay */);
7182
7183 CreateResolver();
7184 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7185
7186 HostResolver::ResolveHostParameters parameters;
7187 parameters.dns_query_type = DnsQueryType::SRV;
7188
Eric Orth117e1992019-04-17 00:24:157189 ResolveHostResponseHelper response(resolver_->CreateRequest(
7190 HostPortPair("host", 108), NetLogWithSource(), parameters,
7191 request_context_.get(), host_cache_.get()));
Eric Ortha625b042019-01-16 01:14:457192 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
7193 EXPECT_FALSE(response.request()->GetAddressResults());
7194 EXPECT_FALSE(response.request()->GetTextResults());
7195 EXPECT_FALSE(response.request()->GetHostnameResults());
7196}
7197
Eric Orth960e7062019-03-08 18:43:547198TEST_F(HostResolverManagerDnsTest, SrvQuery_Failure) {
Eric Ortha625b042019-01-16 01:14:457199 // Setup fallback to confirm it is not used for non-address results.
7200 set_allow_fallback_to_proctask(true);
7201 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
7202 proc_->SignalMultiple(1u);
7203
7204 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137205 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
7206 MockDnsClientRule::Result(MockDnsClientRule::FAIL),
7207 false /* delay */);
Eric Ortha625b042019-01-16 01:14:457208
7209 CreateResolver();
7210 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7211
7212 HostResolver::ResolveHostParameters parameters;
7213 parameters.dns_query_type = DnsQueryType::SRV;
7214
Eric Orth117e1992019-04-17 00:24:157215 ResolveHostResponseHelper response(resolver_->CreateRequest(
7216 HostPortPair("host", 108), NetLogWithSource(), parameters,
7217 request_context_.get(), host_cache_.get()));
Eric Ortha625b042019-01-16 01:14:457218 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
7219 EXPECT_FALSE(response.request()->GetAddressResults());
7220 EXPECT_FALSE(response.request()->GetTextResults());
7221 EXPECT_FALSE(response.request()->GetHostnameResults());
7222}
7223
Eric Orth960e7062019-03-08 18:43:547224TEST_F(HostResolverManagerDnsTest, SrvQuery_Timeout) {
Eric Ortha625b042019-01-16 01:14:457225 // Setup fallback to confirm it is not used for non-address results.
7226 set_allow_fallback_to_proctask(true);
7227 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
7228 proc_->SignalMultiple(1u);
7229
7230 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137231 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
7232 MockDnsClientRule::Result(MockDnsClientRule::TIMEOUT),
7233 false /* delay */);
Eric Ortha625b042019-01-16 01:14:457234
7235 CreateResolver();
7236 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7237
7238 HostResolver::ResolveHostParameters parameters;
7239 parameters.dns_query_type = DnsQueryType::SRV;
7240
Eric Orth117e1992019-04-17 00:24:157241 ResolveHostResponseHelper response(resolver_->CreateRequest(
7242 HostPortPair("host", 108), NetLogWithSource(), parameters,
7243 request_context_.get(), host_cache_.get()));
Eric Ortha625b042019-01-16 01:14:457244 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_TIMED_OUT));
7245 EXPECT_FALSE(response.request()->GetAddressResults());
7246 EXPECT_FALSE(response.request()->GetTextResults());
7247 EXPECT_FALSE(response.request()->GetHostnameResults());
7248}
7249
Eric Orth960e7062019-03-08 18:43:547250TEST_F(HostResolverManagerDnsTest, SrvQuery_Empty) {
Eric Ortha625b042019-01-16 01:14:457251 // Setup fallback to confirm it is not used for non-address results.
7252 set_allow_fallback_to_proctask(true);
7253 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
7254 proc_->SignalMultiple(1u);
7255
7256 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137257 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
7258 MockDnsClientRule::Result(MockDnsClientRule::EMPTY),
7259 false /* delay */);
Eric Ortha625b042019-01-16 01:14:457260
7261 CreateResolver();
7262 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7263
7264 HostResolver::ResolveHostParameters parameters;
7265 parameters.dns_query_type = DnsQueryType::SRV;
7266
Eric Orth117e1992019-04-17 00:24:157267 ResolveHostResponseHelper response(resolver_->CreateRequest(
7268 HostPortPair("host", 108), NetLogWithSource(), parameters,
7269 request_context_.get(), host_cache_.get()));
Eric Ortha625b042019-01-16 01:14:457270 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
7271 EXPECT_FALSE(response.request()->GetAddressResults());
7272 EXPECT_FALSE(response.request()->GetTextResults());
7273 EXPECT_FALSE(response.request()->GetHostnameResults());
7274}
7275
Eric Orth960e7062019-03-08 18:43:547276TEST_F(HostResolverManagerDnsTest, SrvQuery_Malformed) {
Eric Ortha625b042019-01-16 01:14:457277 // Setup fallback to confirm it is not used for non-address results.
7278 set_allow_fallback_to_proctask(true);
7279 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
7280 proc_->SignalMultiple(1u);
7281
7282 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137283 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
Eric Ortha625b042019-01-16 01:14:457284 MockDnsClientRule::Result(MockDnsClientRule::MALFORMED),
7285 false /* delay */);
7286
7287 CreateResolver();
7288 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7289
7290 HostResolver::ResolveHostParameters parameters;
7291 parameters.dns_query_type = DnsQueryType::SRV;
7292
Eric Orth117e1992019-04-17 00:24:157293 ResolveHostResponseHelper response(resolver_->CreateRequest(
7294 HostPortPair("host", 108), NetLogWithSource(), parameters,
7295 request_context_.get(), host_cache_.get()));
Eric Ortha625b042019-01-16 01:14:457296 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE));
7297 EXPECT_FALSE(response.request()->GetAddressResults());
7298 EXPECT_FALSE(response.request()->GetTextResults());
7299 EXPECT_FALSE(response.request()->GetHostnameResults());
7300}
7301
Eric Orth960e7062019-03-08 18:43:547302TEST_F(HostResolverManagerDnsTest, SrvQuery_MismatchedName) {
Eric Ortha625b042019-01-16 01:14:457303 std::vector<TestServiceRecord> srv_records = {{1, 2, 3, "foo.com"}};
7304 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137305 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
dalykc0ab0722019-03-14 17:00:587306 MockDnsClientRule::Result(BuildTestDnsServiceResponse(
Eric Ortha625b042019-01-16 01:14:457307 "host", std::move(srv_records), "not.host")),
7308 false /* delay */);
7309
7310 CreateResolver();
7311 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7312
7313 HostResolver::ResolveHostParameters parameters;
7314 parameters.dns_query_type = DnsQueryType::SRV;
7315
Eric Orth117e1992019-04-17 00:24:157316 ResolveHostResponseHelper response(resolver_->CreateRequest(
7317 HostPortPair("host", 108), NetLogWithSource(), parameters,
7318 request_context_.get(), host_cache_.get()));
Eric Ortha625b042019-01-16 01:14:457319 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE));
7320 EXPECT_FALSE(response.request()->GetAddressResults());
7321 EXPECT_FALSE(response.request()->GetTextResults());
7322 EXPECT_FALSE(response.request()->GetHostnameResults());
7323}
7324
Eric Orth960e7062019-03-08 18:43:547325TEST_F(HostResolverManagerDnsTest, SrvQuery_WrongType) {
Eric Ortha625b042019-01-16 01:14:457326 // Respond to a SRV query with an A response.
7327 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137328 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
Eric Ortha625b042019-01-16 01:14:457329 MockDnsClientRule::Result(
7330 BuildTestDnsResponse("host", IPAddress(1, 2, 3, 4))),
7331 false /* delay */);
7332
7333 CreateResolver();
7334 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7335
7336 HostResolver::ResolveHostParameters parameters;
7337 parameters.dns_query_type = DnsQueryType::SRV;
7338
7339 // Responses for the wrong type should be ignored.
Eric Orth117e1992019-04-17 00:24:157340 ResolveHostResponseHelper response(resolver_->CreateRequest(
7341 HostPortPair("ok", 108), NetLogWithSource(), parameters,
7342 request_context_.get(), host_cache_.get()));
Eric Ortha625b042019-01-16 01:14:457343 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
7344 EXPECT_FALSE(response.request()->GetAddressResults());
7345 EXPECT_FALSE(response.request()->GetTextResults());
7346 EXPECT_FALSE(response.request()->GetHostnameResults());
7347}
7348
7349// Same as SrvQuery except we specify DNS HostResolverSource instead of relying
7350// on automatic determination. Expect same results since DNS should be what we
7351// automatically determine, but some slightly different logic paths are
7352// involved.
Eric Orth960e7062019-03-08 18:43:547353TEST_F(HostResolverManagerDnsTest, SrvDnsQuery) {
Eric Ortha625b042019-01-16 01:14:457354 const TestServiceRecord kRecord1 = {2, 3, 1223, "foo.com"};
7355 const TestServiceRecord kRecord2 = {5, 10, 80, "bar.com"};
7356 const TestServiceRecord kRecord3 = {5, 1, 5, "google.com"};
7357 const TestServiceRecord kRecord4 = {2, 100, 12345, "chromium.org"};
7358 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137359 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
dalykc0ab0722019-03-14 17:00:587360 MockDnsClientRule::Result(BuildTestDnsServiceResponse(
Eric Ortha625b042019-01-16 01:14:457361 "host", {kRecord1, kRecord2, kRecord3, kRecord4})),
7362 false /* delay */);
7363
7364 CreateResolver();
7365 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7366
7367 HostResolver::ResolveHostParameters parameters;
7368 parameters.source = HostResolverSource::DNS;
7369 parameters.dns_query_type = DnsQueryType::SRV;
7370
Eric Orth117e1992019-04-17 00:24:157371 ResolveHostResponseHelper response(resolver_->CreateRequest(
7372 HostPortPair("host", 108), NetLogWithSource(), parameters,
7373 request_context_.get(), host_cache_.get()));
Eric Ortha625b042019-01-16 01:14:457374 EXPECT_THAT(response.result_error(), IsOk());
7375 EXPECT_FALSE(response.request()->GetAddressResults());
7376 EXPECT_FALSE(response.request()->GetTextResults());
7377
7378 // Expect ordered by priority, and random within a priority.
7379 base::Optional<std::vector<HostPortPair>> results =
7380 response.request()->GetHostnameResults();
7381 ASSERT_THAT(
7382 results,
7383 testing::Optional(testing::UnorderedElementsAre(
7384 HostPortPair("foo.com", 1223), HostPortPair("bar.com", 80),
7385 HostPortPair("google.com", 5), HostPortPair("chromium.org", 12345))));
7386 auto priority2 = std::vector<HostPortPair>(results.value().begin(),
7387 results.value().begin() + 2);
7388 EXPECT_THAT(priority2, testing::UnorderedElementsAre(
7389 HostPortPair("foo.com", 1223),
7390 HostPortPair("chromium.org", 12345)));
7391 auto priority5 = std::vector<HostPortPair>(results.value().begin() + 2,
7392 results.value().end());
7393 EXPECT_THAT(priority5,
7394 testing::UnorderedElementsAre(HostPortPair("bar.com", 80),
7395 HostPortPair("google.com", 5)));
7396}
7397
[email protected]259aefa2009-08-20 22:45:007398} // namespace net