blob: 839dd617c18a39b2ecea3052abb0413dcdfd25d2 [file] [log] [blame]
[email protected]a33347c2012-01-09 18:27:011// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]212d1492008-09-05 19:38:542// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Eric Orth960e7062019-03-08 18:43:545#include "net/dns/host_resolver_manager.h"
[email protected]212d1492008-09-05 19:38:546
Eric Orth828bd3ae2018-12-12 17:30:367#include <algorithm>
Eric Roman21b39232019-06-28 21:28:218#include <limits>
[email protected]471822ca2009-01-29 11:32:269#include <string>
jsbellcea42a52015-11-30 23:50:2510#include <tuple>
Eric Orth70992982018-07-24 00:25:0011#include <utility>
olli.raula9cdf9d72015-12-10 14:24:2912#include <vector>
[email protected]471822ca2009-01-29 11:32:2613
Weza03bae02018-07-13 17:17:3314#include "base/auto_reset.h"
[email protected]aa22b242011-11-16 18:58:2915#include "base/bind.h"
16#include "base/bind_helpers.h"
skyostil4891b25b2015-06-11 11:43:4517#include "base/location.h"
Avi Drissman13fc8932015-12-20 04:40:4618#include "base/macros.h"
[email protected]3b63f8f42011-03-28 01:54:1519#include "base/memory/ref_counted.h"
David Van Cleve1fb5e8c2019-11-04 16:45:1620#include "base/numerics/safe_conversions.h"
Eric Orth394db1732019-08-27 20:09:3921#include "base/rand_util.h"
[email protected]daae1322013-09-05 18:26:5022#include "base/run_loop.h"
Eric Orthfe6d5482019-09-03 18:27:5723#include "base/sequenced_task_runner.h"
skyostil4891b25b2015-06-11 11:43:4524#include "base/single_thread_task_runner.h"
tripta.gdda72022017-06-19 05:16:2325#include "base/stl_util.h"
[email protected]be528af2013-06-11 07:39:4826#include "base/strings/string_util.h"
27#include "base/strings/stringprintf.h"
[email protected]189163e2011-05-11 01:48:5428#include "base/synchronization/condition_variable.h"
29#include "base/synchronization/lock.h"
Eric Orthfe6d5482019-09-03 18:27:5730#include "base/task/post_task.h"
Gabriel Charetteeadf58862019-08-29 05:20:2731#include "base/task/thread_pool/thread_pool_instance.h"
Eric Orth70992982018-07-24 00:25:0032#include "base/test/bind_test_util.h"
David Van Cleveb1f45bd2019-11-14 07:36:4933#include "base/test/metrics/histogram_tester.h"
Matt Menkef4023312019-11-01 18:24:5534#include "base/test/scoped_feature_list.h"
Eric Orth026776a2019-01-18 00:13:2835#include "base/test/simple_test_clock.h"
Eric Orth9a037562018-07-03 21:24:3836#include "base/test/test_mock_time_task_runner.h"
[email protected]57a48d32012-03-03 00:04:5537#include "base/test/test_timeouts.h"
Francois Doraya2d01ba2017-09-25 19:17:4038#include "base/threading/thread_restrictions.h"
gabf767595f2016-05-11 18:50:3539#include "base/threading/thread_task_runner_handle.h"
[email protected]66e96c42013-06-28 15:20:3140#include "base/time/time.h"
Eric Orth026776a2019-01-18 00:13:2841#include "base/timer/mock_timer.h"
Miriam Gershenson48857a352018-03-22 21:14:0342#include "base/values.h"
jdoerriedfede5ad2019-02-11 13:06:5743#include "build/build_config.h"
[email protected]ecfa71c2008-09-09 13:28:3644#include "net/base/address_list.h"
Matt Menkef4023312019-11-01 18:24:5545#include "net/base/features.h"
Eric Orth026776a2019-01-18 00:13:2846#include "net/base/host_port_pair.h"
martijna23c8962016-03-04 18:18:5147#include "net/base/ip_address.h"
Eric Orth026776a2019-01-18 00:13:2848#include "net/base/ip_endpoint.h"
mgershaf9a9232017-04-13 20:19:0349#include "net/base/mock_network_change_notifier.h"
[email protected]471822ca2009-01-29 11:32:2650#include "net/base/net_errors.h"
Matt Menkef4023312019-11-01 18:24:5551#include "net/base/network_isolation_key.h"
[email protected]78eac2a2012-03-14 19:09:2752#include "net/dns/dns_client.h"
Eric Orthc1eb1292018-10-09 22:07:0753#include "net/dns/dns_config.h"
[email protected]78eac2a2012-03-14 19:09:2754#include "net/dns/dns_test_util.h"
Eric Orth192e3bb2018-11-14 19:30:3255#include "net/dns/dns_util.h"
David Van Cleveb1f45bd2019-11-14 07:36:4956#include "net/dns/host_resolver_histograms.h"
[email protected]f2cb3cf2013-03-21 01:40:5357#include "net/dns/mock_host_resolver.h"
Eric Orth9871aafa2018-10-02 19:59:1858#include "net/dns/mock_mdns_client.h"
59#include "net/dns/mock_mdns_socket_factory.h"
Eric Orthfe6d5482019-09-03 18:27:5760#include "net/dns/test_dns_config_service.h"
mikecirone8b85c432016-09-08 19:11:0061#include "net/log/net_log_event_type.h"
62#include "net/log/net_log_source_type.h"
mikecironef22f9812016-10-04 03:40:1963#include "net/log/net_log_with_source.h"
sergeyub8cdc212015-05-14 18:50:3764#include "net/log/test_net_log.h"
Eric Roman79cc7552019-07-19 02:17:5465#include "net/log/test_net_log_util.h"
Eric Orth394db1732019-08-27 20:09:3966#include "net/socket/socket_test_util.h"
robpercival214763f2016-07-01 23:27:0167#include "net/test/gtest_util.h"
Gabriel Charettec7108742019-08-23 03:31:4068#include "net/test/test_with_task_environment.h"
Eric Orth6f1c5172019-04-16 17:08:2769#include "net/url_request/url_request_context.h"
70#include "net/url_request/url_request_test_util.h"
robpercival214763f2016-07-01 23:27:0171#include "testing/gmock/include/gmock/gmock.h"
[email protected]ecfa71c2008-09-09 13:28:3672#include "testing/gtest/include/gtest/gtest.h"
Matt Menkef4023312019-11-01 18:24:5573#include "url/gurl.h"
74#include "url/origin.h"
[email protected]212d1492008-09-05 19:38:5475
Eric Orth026776a2019-01-18 00:13:2876#if BUILDFLAG(ENABLE_MDNS)
77#include "net/dns/mdns_client_impl.h"
78#endif // BUILDFLAG(ENABLE_MDNS)
79
robpercival214763f2016-07-01 23:27:0180using net::test::IsError;
81using net::test::IsOk;
Eric Orth9871aafa2018-10-02 19:59:1882using ::testing::_;
David Van Clevec719c882019-11-04 15:47:4083using ::testing::AllOf;
Eric Orth9871aafa2018-10-02 19:59:1884using ::testing::Between;
85using ::testing::ByMove;
David Van Clevec719c882019-11-04 15:47:4086using ::testing::Eq;
87using ::testing::Optional;
88using ::testing::Pair;
89using ::testing::Property;
Eric Orth9871aafa2018-10-02 19:59:1890using ::testing::Return;
David Van Clevec719c882019-11-04 15:47:4091using ::testing::UnorderedElementsAre;
robpercival214763f2016-07-01 23:27:0192
[email protected]259aefa2009-08-20 22:45:0093namespace net {
[email protected]68ad3ee2010-01-30 03:45:3994
[email protected]38b50d92012-04-19 21:07:5295namespace {
[email protected]112bd462009-12-10 07:23:4096
[email protected]78eac2a2012-03-14 19:09:2797const size_t kMaxJobs = 10u;
98const size_t kMaxRetryAttempts = 4u;
[email protected]68ad3ee2010-01-30 03:45:3999
Eric Orth59066222019-03-07 23:52:27100ProcTaskParams DefaultParams(HostResolverProc* resolver_proc) {
101 return ProcTaskParams(resolver_proc, kMaxRetryAttempts);
[email protected]0f292de02012-02-01 22:28:20102}
103
[email protected]38b50d92012-04-19 21:07:52104// A HostResolverProc that pushes each host mapped into a list and allows
105// waiting for a specific number of requests. Unlike RuleBasedHostResolverProc
[email protected]1ee9afa12013-04-16 14:18:06106// it never calls SystemHostResolverCall. By default resolves all hostnames to
[email protected]38b50d92012-04-19 21:07:52107// "127.0.0.1". After AddRule(), it resolves only names explicitly specified.
108class MockHostResolverProc : public HostResolverProc {
[email protected]57a48d32012-03-03 00:04:55109 public:
[email protected]38b50d92012-04-19 21:07:52110 struct ResolveKey {
Eric Orth322af3e42018-08-20 18:12:59111 ResolveKey(const std::string& hostname,
112 AddressFamily address_family,
113 HostResolverFlags flags)
114 : hostname(hostname), address_family(address_family), flags(flags) {}
[email protected]38b50d92012-04-19 21:07:52115 bool operator<(const ResolveKey& other) const {
Eric Orth322af3e42018-08-20 18:12:59116 return std::tie(address_family, hostname, flags) <
117 std::tie(other.address_family, other.hostname, other.flags);
[email protected]38b50d92012-04-19 21:07:52118 }
[email protected]137af622010-02-05 02:14:35119 std::string hostname;
120 AddressFamily address_family;
Eric Orth322af3e42018-08-20 18:12:59121 HostResolverFlags flags;
[email protected]137af622010-02-05 02:14:35122 };
123
[email protected]38b50d92012-04-19 21:07:52124 typedef std::vector<ResolveKey> CaptureList;
[email protected]137af622010-02-05 02:14:35125
[email protected]38b50d92012-04-19 21:07:52126 MockHostResolverProc()
Raul Tambre94493c652019-03-11 17:18:35127 : HostResolverProc(nullptr),
[email protected]57a48d32012-03-03 00:04:55128 num_requests_waiting_(0),
129 num_slots_available_(0),
130 requests_waiting_(&lock_),
Eric Orth960e7062019-03-08 18:43:54131 slots_available_(&lock_) {}
[email protected]57a48d32012-03-03 00:04:55132
133 // Waits until |count| calls to |Resolve| are blocked. Returns false when
134 // timed out.
135 bool WaitFor(unsigned count) {
136 base::AutoLock lock(lock_);
137 base::Time start_time = base::Time::Now();
138 while (num_requests_waiting_ < count) {
139 requests_waiting_.TimedWait(TestTimeouts::action_timeout());
140 if (base::Time::Now() > start_time + TestTimeouts::action_timeout())
141 return false;
142 }
143 return true;
144 }
145
146 // Signals |count| waiting calls to |Resolve|. First come first served.
147 void SignalMultiple(unsigned count) {
148 base::AutoLock lock(lock_);
149 num_slots_available_ += count;
150 slots_available_.Broadcast();
151 }
152
153 // Signals all waiting calls to |Resolve|. Beware of races.
154 void SignalAll() {
155 base::AutoLock lock(lock_);
[email protected]38b50d92012-04-19 21:07:52156 num_slots_available_ = num_requests_waiting_;
[email protected]57a48d32012-03-03 00:04:55157 slots_available_.Broadcast();
158 }
159
Eric Orth322af3e42018-08-20 18:12:59160 void AddRule(const std::string& hostname,
161 AddressFamily family,
162 const AddressList& result,
163 HostResolverFlags flags = 0) {
[email protected]38b50d92012-04-19 21:07:52164 base::AutoLock lock(lock_);
Eric Orth322af3e42018-08-20 18:12:59165 rules_[ResolveKey(hostname, family, flags)] = result;
[email protected]57a48d32012-03-03 00:04:55166 }
167
Eric Orth322af3e42018-08-20 18:12:59168 void AddRule(const std::string& hostname,
169 AddressFamily family,
170 const std::string& ip_list,
171 HostResolverFlags flags = 0,
172 const std::string& canonical_name = "") {
[email protected]38b50d92012-04-19 21:07:52173 AddressList result;
Eric Orth322af3e42018-08-20 18:12:59174 int rv = ParseAddressList(ip_list, canonical_name, &result);
[email protected]38b50d92012-04-19 21:07:52175 DCHECK_EQ(OK, rv);
Eric Orth322af3e42018-08-20 18:12:59176 AddRule(hostname, family, result, flags);
[email protected]38b50d92012-04-19 21:07:52177 }
[email protected]57a48d32012-03-03 00:04:55178
[email protected]38b50d92012-04-19 21:07:52179 void AddRuleForAllFamilies(const std::string& hostname,
Eric Orth322af3e42018-08-20 18:12:59180 const std::string& ip_list,
181 HostResolverFlags flags = 0,
182 const std::string& canonical_name = "") {
[email protected]38b50d92012-04-19 21:07:52183 AddressList result;
Eric Orth322af3e42018-08-20 18:12:59184 int rv = ParseAddressList(ip_list, canonical_name, &result);
[email protected]38b50d92012-04-19 21:07:52185 DCHECK_EQ(OK, rv);
Eric Orth322af3e42018-08-20 18:12:59186 AddRule(hostname, ADDRESS_FAMILY_UNSPECIFIED, result, flags);
187 AddRule(hostname, ADDRESS_FAMILY_IPV4, result, flags);
188 AddRule(hostname, ADDRESS_FAMILY_IPV6, result, flags);
[email protected]38b50d92012-04-19 21:07:52189 }
[email protected]137af622010-02-05 02:14:35190
dchengb03027d2014-10-21 12:00:20191 int Resolve(const std::string& hostname,
192 AddressFamily address_family,
193 HostResolverFlags host_resolver_flags,
194 AddressList* addrlist,
195 int* os_error) override {
[email protected]38b50d92012-04-19 21:07:52196 base::AutoLock lock(lock_);
Eric Orth322af3e42018-08-20 18:12:59197 capture_list_.push_back(
198 ResolveKey(hostname, address_family, host_resolver_flags));
[email protected]38b50d92012-04-19 21:07:52199 ++num_requests_waiting_;
200 requests_waiting_.Broadcast();
Francois Doraya2d01ba2017-09-25 19:17:40201 {
202 base::ScopedAllowBaseSyncPrimitivesForTesting
203 scoped_allow_base_sync_primitives;
204 while (!num_slots_available_)
205 slots_available_.Wait();
206 }
[email protected]38b50d92012-04-19 21:07:52207 DCHECK_GT(num_requests_waiting_, 0u);
208 --num_slots_available_;
209 --num_requests_waiting_;
210 if (rules_.empty()) {
[email protected]007b3f82013-04-09 08:46:45211 int rv = ParseAddressList("127.0.0.1", std::string(), addrlist);
[email protected]38b50d92012-04-19 21:07:52212 DCHECK_EQ(OK, rv);
213 return OK;
214 }
Eric Orth60931742018-11-05 23:40:57215 // Ignore HOST_RESOLVER_SYSTEM_ONLY, since it should have no impact on
216 // whether a rule matches. It should only affect cache lookups.
217 ResolveKey key(hostname, address_family,
218 host_resolver_flags & ~HOST_RESOLVER_SYSTEM_ONLY);
[email protected]38b50d92012-04-19 21:07:52219 if (rules_.count(key) == 0)
220 return ERR_NAME_NOT_RESOLVED;
221 *addrlist = rules_[key];
222 return OK;
[email protected]137af622010-02-05 02:14:35223 }
[email protected]38b50d92012-04-19 21:07:52224
225 CaptureList GetCaptureList() const {
226 CaptureList copy;
227 {
228 base::AutoLock lock(lock_);
229 copy = capture_list_;
230 }
231 return copy;
232 }
233
Matt Menkef4023312019-11-01 18:24:55234 void ClearCaptureList() {
235 base::AutoLock lock(lock_);
236 capture_list_.clear();
237 }
238
[email protected]38b50d92012-04-19 21:07:52239 bool HasBlockedRequests() const {
240 base::AutoLock lock(lock_);
241 return num_requests_waiting_ > num_slots_available_;
242 }
243
[email protected]a9813302012-04-28 09:29:28244 protected:
Chris Watkins68b15032017-12-01 03:07:13245 ~MockHostResolverProc() override = default;
[email protected]38b50d92012-04-19 21:07:52246
[email protected]a9813302012-04-28 09:29:28247 private:
[email protected]38b50d92012-04-19 21:07:52248 mutable base::Lock lock_;
249 std::map<ResolveKey, AddressList> rules_;
250 CaptureList capture_list_;
251 unsigned num_requests_waiting_;
252 unsigned num_slots_available_;
253 base::ConditionVariable requests_waiting_;
254 base::ConditionVariable slots_available_;
255
256 DISALLOW_COPY_AND_ASSIGN(MockHostResolverProc);
257};
258
Eric Orth70992982018-07-24 00:25:00259class ResolveHostResponseHelper {
260 public:
261 using Callback =
262 base::OnceCallback<void(CompletionOnceCallback completion_callback,
263 int error)>;
264
David Van Cleve1fb5e8c2019-11-04 16:45:16265 ResolveHostResponseHelper() = default;
Eric Orth70992982018-07-24 00:25:00266 explicit ResolveHostResponseHelper(
Eric Orth314e8b42019-11-12 00:32:21267 std::unique_ptr<HostResolverManager::CancellableResolveHostRequest>
268 request)
Eric Orth70992982018-07-24 00:25:00269 : request_(std::move(request)) {
270 result_error_ = request_->Start(base::BindOnce(
271 &ResolveHostResponseHelper::OnComplete, base::Unretained(this)));
272 }
273 ResolveHostResponseHelper(
Eric Orth314e8b42019-11-12 00:32:21274 std::unique_ptr<HostResolverManager::CancellableResolveHostRequest>
275 request,
Eric Orth70992982018-07-24 00:25:00276 Callback custom_callback)
277 : request_(std::move(request)) {
278 result_error_ = request_->Start(
279 base::BindOnce(std::move(custom_callback),
280 base::BindOnce(&ResolveHostResponseHelper::OnComplete,
281 base::Unretained(this))));
282 }
283
284 bool complete() const { return result_error_ != ERR_IO_PENDING; }
285 int result_error() {
286 WaitForCompletion();
287 return result_error_;
288 }
289
Eric Orth314e8b42019-11-12 00:32:21290 HostResolverManager::CancellableResolveHostRequest* request() {
291 return request_.get();
292 }
Eric Orth70992982018-07-24 00:25:00293
294 void CancelRequest() {
295 DCHECK(request_);
296 DCHECK(!complete());
297
298 request_ = nullptr;
299 }
300
301 void OnComplete(int error) {
302 DCHECK(!complete());
303 result_error_ = error;
304
305 run_loop_.Quit();
306 }
307
308 private:
309 void WaitForCompletion() {
310 DCHECK(request_);
311 if (complete()) {
312 return;
313 }
314 run_loop_.Run();
315 DCHECK(complete());
316 }
317
Eric Orth314e8b42019-11-12 00:32:21318 std::unique_ptr<HostResolverManager::CancellableResolveHostRequest> request_;
Eric Orth70992982018-07-24 00:25:00319 int result_error_ = ERR_IO_PENDING;
320 base::RunLoop run_loop_;
321
322 DISALLOW_COPY_AND_ASSIGN(ResolveHostResponseHelper);
323};
324
[email protected]189163e2011-05-11 01:48:54325// Using LookupAttemptHostResolverProc simulate very long lookups, and control
326// which attempt resolves the host.
327class LookupAttemptHostResolverProc : public HostResolverProc {
328 public:
329 LookupAttemptHostResolverProc(HostResolverProc* previous,
330 int attempt_number_to_resolve,
331 int total_attempts)
332 : HostResolverProc(previous),
333 attempt_number_to_resolve_(attempt_number_to_resolve),
334 current_attempt_number_(0),
335 total_attempts_(total_attempts),
336 total_attempts_resolved_(0),
337 resolved_attempt_number_(0),
Eric Orth9a037562018-07-03 21:24:38338 num_attempts_waiting_(0),
339 all_done_(&lock_),
340 blocked_attempt_signal_(&lock_) {}
[email protected]189163e2011-05-11 01:48:54341
342 // Test harness will wait for all attempts to finish before checking the
343 // results.
Eric Orth9a037562018-07-03 21:24:38344 void WaitForAllAttemptsToFinish() {
345 base::AutoLock auto_lock(lock_);
346 while (total_attempts_resolved_ != total_attempts_) {
347 all_done_.Wait();
348 }
349 }
350
351 void WaitForNAttemptsToBeBlocked(int n) {
352 base::AutoLock auto_lock(lock_);
353 while (num_attempts_waiting_ < n) {
354 blocked_attempt_signal_.Wait();
[email protected]189163e2011-05-11 01:48:54355 }
356 }
357
358 // All attempts will wait for an attempt to resolve the host.
359 void WaitForAnAttemptToComplete() {
[email protected]189163e2011-05-11 01:48:54360 {
361 base::AutoLock auto_lock(lock_);
Francois Doraya2d01ba2017-09-25 19:17:40362 base::ScopedAllowBaseSyncPrimitivesForTesting
363 scoped_allow_base_sync_primitives;
Eric Orth9a037562018-07-03 21:24:38364 while (resolved_attempt_number_ == 0)
365 all_done_.Wait();
[email protected]189163e2011-05-11 01:48:54366 }
367 all_done_.Broadcast(); // Tell all waiting attempts to proceed.
368 }
369
370 // Returns the number of attempts that have finished the Resolve() method.
Eric Roman21b39232019-06-28 21:28:21371 int GetTotalAttemptsResolved() {
372 base::AutoLock auto_lock(lock_);
373 return total_attempts_resolved_;
374 }
[email protected]189163e2011-05-11 01:48:54375
Eric Roman21b39232019-06-28 21:28:21376 // Sets the resolved attempt number and unblocks waiting
377 // attempts.
378 void SetResolvedAttemptNumber(int n) {
379 base::AutoLock auto_lock(lock_);
380 EXPECT_EQ(0, resolved_attempt_number_);
381 resolved_attempt_number_ = n;
382 all_done_.Broadcast();
383 }
Eric Orth9a037562018-07-03 21:24:38384
[email protected]189163e2011-05-11 01:48:54385 // HostResolverProc methods.
dchengb03027d2014-10-21 12:00:20386 int Resolve(const std::string& host,
387 AddressFamily address_family,
388 HostResolverFlags host_resolver_flags,
389 AddressList* addrlist,
390 int* os_error) override {
[email protected]189163e2011-05-11 01:48:54391 bool wait_for_right_attempt_to_complete = true;
392 {
393 base::AutoLock auto_lock(lock_);
394 ++current_attempt_number_;
Eric Orth9a037562018-07-03 21:24:38395 ++num_attempts_waiting_;
[email protected]189163e2011-05-11 01:48:54396 if (current_attempt_number_ == attempt_number_to_resolve_) {
397 resolved_attempt_number_ = current_attempt_number_;
398 wait_for_right_attempt_to_complete = false;
399 }
400 }
401
Eric Orth9a037562018-07-03 21:24:38402 blocked_attempt_signal_.Broadcast();
403
[email protected]189163e2011-05-11 01:48:54404 if (wait_for_right_attempt_to_complete)
405 // Wait for the attempt_number_to_resolve_ attempt to resolve.
406 WaitForAnAttemptToComplete();
407
408 int result = ResolveUsingPrevious(host, address_family, host_resolver_flags,
409 addrlist, os_error);
410
411 {
412 base::AutoLock auto_lock(lock_);
413 ++total_attempts_resolved_;
Eric Orth9a037562018-07-03 21:24:38414 --num_attempts_waiting_;
[email protected]189163e2011-05-11 01:48:54415 }
416
417 all_done_.Broadcast(); // Tell all attempts to proceed.
418
419 // Since any negative number is considered a network error, with -1 having
420 // special meaning (ERR_IO_PENDING). We could return the attempt that has
421 // resolved the host as a negative number. For example, if attempt number 3
422 // resolves the host, then this method returns -4.
423 if (result == OK)
424 return -1 - resolved_attempt_number_;
425 else
426 return result;
427 }
428
[email protected]a9813302012-04-28 09:29:28429 protected:
Chris Watkins68b15032017-12-01 03:07:13430 ~LookupAttemptHostResolverProc() override = default;
[email protected]189163e2011-05-11 01:48:54431
[email protected]a9813302012-04-28 09:29:28432 private:
[email protected]189163e2011-05-11 01:48:54433 int attempt_number_to_resolve_;
434 int current_attempt_number_; // Incremented whenever Resolve is called.
435 int total_attempts_;
436 int total_attempts_resolved_;
437 int resolved_attempt_number_;
Eric Orth9a037562018-07-03 21:24:38438 int num_attempts_waiting_;
[email protected]189163e2011-05-11 01:48:54439
440 // All attempts wait for right attempt to be resolve.
441 base::Lock lock_;
442 base::ConditionVariable all_done_;
Eric Orth9a037562018-07-03 21:24:38443 base::ConditionVariable blocked_attempt_signal_;
[email protected]189163e2011-05-11 01:48:54444};
445
Eric Orth960e7062019-03-08 18:43:54446// TestHostResolverManager's sole purpose is to mock the IPv6 reachability test.
cbentzel1906f872015-06-05 16:25:25447// By default, this pretends that IPv6 is globally reachable.
448// This class is necessary so unit tests run the same on dual-stack machines as
449// well as IPv4 only machines.
Eric Orth960e7062019-03-08 18:43:54450class TestHostResolverManager : public HostResolverManager {
cbentzel1906f872015-06-05 16:25:25451 public:
Eric Orth4d635c12019-04-24 22:53:04452 TestHostResolverManager(const HostResolver::ManagerOptions& options,
Eric Orthfe6d5482019-09-03 18:27:57453 SystemDnsConfigChangeNotifier* notifier,
dalykc27699a2019-07-29 20:53:29454 NetLog* net_log,
Eric Orthfe6d5482019-09-03 18:27:57455 bool ipv6_reachable = true)
456 : HostResolverManager(options, notifier, net_log),
Eric Orth960e7062019-03-08 18:43:54457 ipv6_reachable_(ipv6_reachable) {}
cbentzel1906f872015-06-05 16:25:25458
Eric Orth960e7062019-03-08 18:43:54459 ~TestHostResolverManager() override = default;
cbentzel1906f872015-06-05 16:25:25460
461 private:
462 const bool ipv6_reachable_;
463
mgershaf9a9232017-04-13 20:19:03464 bool IsGloballyReachable(const IPAddress& dest,
465 const NetLogWithSource& net_log) override {
cbentzel1906f872015-06-05 16:25:25466 return ipv6_reachable_;
467 }
468};
469
Matt Menkec35d1632018-11-29 12:43:49470bool HasAddress(const IPAddress& search_address, const AddressList& addresses) {
tfarina9ed7f8c52016-02-19 17:50:18471 for (const auto& address : addresses) {
Matt Menkec35d1632018-11-29 12:43:49472 if (search_address == address.address())
tfarina9ed7f8c52016-02-19 17:50:18473 return true;
474 }
475 return false;
476}
477
478void TestBothLoopbackIPs(const std::string& host) {
tfarina9ed7f8c52016-02-19 17:50:18479 AddressList addresses;
Matt Menkec35d1632018-11-29 12:43:49480 EXPECT_TRUE(ResolveLocalHostname(host, &addresses));
tfarina9ed7f8c52016-02-19 17:50:18481 EXPECT_EQ(2u, addresses.size());
Matt Menkec35d1632018-11-29 12:43:49482 EXPECT_TRUE(HasAddress(IPAddress::IPv4Localhost(), addresses));
483 EXPECT_TRUE(HasAddress(IPAddress::IPv6Localhost(), addresses));
tfarina9ed7f8c52016-02-19 17:50:18484}
485
486void TestIPv6LoopbackOnly(const std::string& host) {
tfarina9ed7f8c52016-02-19 17:50:18487 AddressList addresses;
Matt Menkec35d1632018-11-29 12:43:49488 EXPECT_TRUE(ResolveLocalHostname(host, &addresses));
tfarina9ed7f8c52016-02-19 17:50:18489 EXPECT_EQ(1u, addresses.size());
Matt Menkec35d1632018-11-29 12:43:49490 EXPECT_TRUE(HasAddress(IPAddress::IPv6Localhost(), addresses));
tfarina9ed7f8c52016-02-19 17:50:18491}
492
[email protected]38b50d92012-04-19 21:07:52493} // namespace
[email protected]8a00f00a2009-06-12 00:49:38494
Gabriel Charette694c3c332019-08-19 14:53:05495class HostResolverManagerTest : public TestWithTaskEnvironment {
[email protected]471822ca2009-01-29 11:32:26496 public:
[email protected]38b50d92012-04-19 21:07:52497 static const int kDefaultPort = 80;
498
David Van Cleve1fb5e8c2019-11-04 16:45:16499 explicit HostResolverManagerTest(
500 base::test::TaskEnvironment::TimeSource time_source =
501 base::test::TaskEnvironment::TimeSource::SYSTEM_TIME)
502 : TestWithTaskEnvironment(time_source),
503 proc_(new MockHostResolverProc()) {}
[email protected]471822ca2009-01-29 11:32:26504
Eric Orth607b6d82019-05-08 16:43:32505 void CreateResolver(bool check_ipv6_on_wifi = true) {
Eric Orth70992982018-07-24 00:25:00506 CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:32507 true /* ipv6_reachable */,
508 check_ipv6_on_wifi);
[email protected]daae1322013-09-05 18:26:50509 }
510
Eric Orth37b18192019-04-22 19:09:28511 void DestroyResolver() {
512 if (!resolver_)
513 return;
514
515 if (host_cache_)
516 resolver_->RemoveHostCacheInvalidator(host_cache_->invalidator());
517 resolver_ = nullptr;
518 }
519
Eric Orth960e7062019-03-08 18:43:54520 // This HostResolverManager will only allow 1 outstanding resolve at a time
521 // and perform no retries.
Eric Orth607b6d82019-05-08 16:43:32522 void CreateSerialResolver(bool check_ipv6_on_wifi = true) {
Eric Orth59066222019-03-07 23:52:27523 ProcTaskParams params = DefaultParams(proc_.get());
[email protected]daae1322013-09-05 18:26:50524 params.max_retry_attempts = 0u;
Eric Orth607b6d82019-05-08 16:43:32525 CreateResolverWithLimitsAndParams(1u, params, true /* ipv6_reachable */,
526 check_ipv6_on_wifi);
[email protected]daae1322013-09-05 18:26:50527 }
528
[email protected]471822ca2009-01-29 11:32:26529 protected:
[email protected]daae1322013-09-05 18:26:50530 // testing::Test implementation:
Eric Orth6f1c5172019-04-16 17:08:27531 void SetUp() override {
Eric Orth37b18192019-04-22 19:09:28532 host_cache_ = HostCache::CreateDefaultCache();
Eric Orth6f1c5172019-04-16 17:08:27533 CreateResolver();
534 request_context_ = std::make_unique<TestURLRequestContext>();
535 }
[email protected]70c04ab2013-08-22 16:05:12536
dcheng67be2b1f2014-10-27 21:47:29537 void TearDown() override {
Eric Orth37b18192019-04-22 19:09:28538 if (resolver_) {
[email protected]daae1322013-09-05 18:26:50539 EXPECT_EQ(0u, resolver_->num_running_dispatcher_jobs_for_tests());
Eric Orth37b18192019-04-22 19:09:28540 if (host_cache_)
541 resolver_->RemoveHostCacheInvalidator(host_cache_->invalidator());
Eric Orthfe6d5482019-09-03 18:27:57542 resolver_.reset();
Eric Orth37b18192019-04-22 19:09:28543 }
[email protected]daae1322013-09-05 18:26:50544 EXPECT_FALSE(proc_->HasBlockedRequests());
545 }
546
Eric Orth4e55b362019-05-07 22:00:03547 void CreateResolverWithLimitsAndParams(size_t max_concurrent_resolves,
548 const ProcTaskParams& params,
Eric Orth607b6d82019-05-08 16:43:32549 bool ipv6_reachable,
550 bool check_ipv6_on_wifi) {
Eric Orth4d635c12019-04-24 22:53:04551 HostResolver::ManagerOptions options = DefaultOptions();
[email protected]106ccd2c2014-06-17 09:21:00552 options.max_concurrent_resolves = max_concurrent_resolves;
Eric Orth607b6d82019-05-08 16:43:32553 options.check_ipv6_on_wifi = check_ipv6_on_wifi;
Eric Orth4e55b362019-05-07 22:00:03554
555 CreateResolverWithOptionsAndParams(std::move(options), params,
556 ipv6_reachable);
557 }
558
559 virtual HostResolver::ManagerOptions DefaultOptions() {
560 HostResolver::ManagerOptions options;
561 options.max_concurrent_resolves = kMaxJobs;
562 options.max_system_retry_attempts = kMaxRetryAttempts;
563 return options;
564 }
565
566 virtual void CreateResolverWithOptionsAndParams(
567 HostResolver::ManagerOptions options,
568 const ProcTaskParams& params,
569 bool ipv6_reachable) {
570 // Use HostResolverManagerDnsTest if enabling DNS client.
dalykc27699a2019-07-29 20:53:29571 DCHECK(!options.insecure_dns_client_enabled);
Eric Orth4e55b362019-05-07 22:00:03572
573 DestroyResolver();
574
575 resolver_ = std::make_unique<TestHostResolverManager>(
Eric Orthfe6d5482019-09-03 18:27:57576 options, nullptr /* notifier */, nullptr /* net_log */, ipv6_reachable);
[email protected]106ccd2c2014-06-17 09:21:00577 resolver_->set_proc_params_for_test(params);
Eric Orth37b18192019-04-22 19:09:28578
579 if (host_cache_)
580 resolver_->AddHostCacheInvalidator(host_cache_->invalidator());
[email protected]471822ca2009-01-29 11:32:26581 }
[email protected]aa22b242011-11-16 18:58:29582
[email protected]38b50d92012-04-19 21:07:52583 // Friendship is not inherited, so use proxies to access those.
[email protected]daae1322013-09-05 18:26:50584 size_t num_running_dispatcher_jobs() const {
[email protected]38b50d92012-04-19 21:07:52585 DCHECK(resolver_.get());
[email protected]daae1322013-09-05 18:26:50586 return resolver_->num_running_dispatcher_jobs_for_tests();
[email protected]38b50d92012-04-19 21:07:52587 }
588
Eric Orth60931742018-11-05 23:40:57589 void set_allow_fallback_to_proctask(bool allow_fallback_to_proctask) {
[email protected]16c2bd72013-06-28 01:19:22590 DCHECK(resolver_.get());
Eric Orth60931742018-11-05 23:40:57591 resolver_->allow_fallback_to_proctask_ = allow_fallback_to_proctask;
[email protected]16c2bd72013-06-28 01:19:22592 }
593
dalykc27699a2019-07-29 20:53:29594 static unsigned maximum_insecure_dns_task_failures() {
Eric Orth394db1732019-08-27 20:09:39595 return DnsClient::kMaxInsecureFallbackFailures;
[email protected]daae1322013-09-05 18:26:50596 }
597
tfarina42834112016-09-22 13:38:20598 bool IsIPv6Reachable(const NetLogWithSource& net_log) {
sergeyub8cdc212015-05-14 18:50:37599 return resolver_->IsIPv6Reachable(net_log);
600 }
601
Eric Orth394db1732019-08-27 20:09:39602 void PopulateCache(const HostCache::Key& key, IPEndPoint endpoint) {
dalyke966a1832019-06-05 20:53:13603 resolver_->CacheResult(host_cache_.get(), key,
604 HostCache::Entry(OK, AddressList(endpoint),
605 HostCache::Entry::SOURCE_UNKNOWN),
606 base::TimeDelta::FromSeconds(1));
607 }
608
dalyk48b20a992019-02-25 16:10:26609 const std::pair<const HostCache::Key, HostCache::Entry>* GetCacheHit(
610 const HostCache::Key& key) {
Eric Orth37b18192019-04-22 19:09:28611 DCHECK(host_cache_);
612 return host_cache_->LookupStale(key, base::TimeTicks(), nullptr,
613 false /* ignore_secure */);
Rob Percival94f21ad2017-11-14 10:20:24614 }
615
juliatuttle9fb7aeb2016-06-06 20:16:33616 void MakeCacheStale() {
Eric Orth37b18192019-04-22 19:09:28617 DCHECK(host_cache_);
618 host_cache_->Invalidate();
juliatuttle9fb7aeb2016-06-06 20:16:33619 }
620
Eric Orth70992982018-07-24 00:25:00621 IPEndPoint CreateExpected(const std::string& ip_literal, uint16_t port) {
622 IPAddress ip;
623 bool result = ip.AssignFromIPLiteral(ip_literal);
624 DCHECK(result);
625 return IPEndPoint(ip, port);
626 }
627
[email protected]38b50d92012-04-19 21:07:52628 scoped_refptr<MockHostResolverProc> proc_;
Eric Orth960e7062019-03-08 18:43:54629 std::unique_ptr<HostResolverManager> resolver_;
Eric Orth6f1c5172019-04-16 17:08:27630 std::unique_ptr<URLRequestContext> request_context_;
Eric Orth117e1992019-04-17 00:24:15631 std::unique_ptr<HostCache> host_cache_;
[email protected]471822ca2009-01-29 11:32:26632};
633
Eric Orth960e7062019-03-08 18:43:54634TEST_F(HostResolverManagerTest, AsynchronousLookup) {
[email protected]38b50d92012-04-19 21:07:52635 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42");
636 proc_->SignalMultiple(1u);
[email protected]471822ca2009-01-29 11:32:26637
Eric Orth70992982018-07-24 00:25:00638 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55639 HostPortPair("just.testing", 80), NetworkIsolationKey(),
640 NetLogWithSource(), base::nullopt, request_context_.get(),
641 host_cache_.get()));
Eric Orth70992982018-07-24 00:25:00642
643 EXPECT_THAT(response.result_error(), IsOk());
644 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
645 testing::ElementsAre(CreateExpected("192.168.1.42", 80)));
Eric Ortheb332862019-01-26 00:52:38646 EXPECT_FALSE(response.request()->GetStaleInfo());
Eric Orth70992982018-07-24 00:25:00647
648 EXPECT_EQ("just.testing", proc_->GetCaptureList()[0].hostname);
Eric Orth26fa08e2019-02-22 01:28:37649
dalyk48b20a992019-02-25 16:10:26650 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result =
651 GetCacheHit(HostCache::Key("just.testing", DnsQueryType::UNSPECIFIED,
652 0 /* host_resolver_flags */,
Matt Menke7b4a32f2019-10-25 22:13:46653 HostResolverSource::ANY,
654 NetworkIsolationKey()));
dalyk48b20a992019-02-25 16:10:26655 EXPECT_TRUE(cache_result);
Eric Orth70992982018-07-24 00:25:00656}
657
Eric Orth6f1c5172019-04-16 17:08:27658TEST_F(HostResolverManagerTest, JobsClearedOnCompletion) {
659 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42");
660 proc_->SignalMultiple(1u);
661
662 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55663 HostPortPair("just.testing", 80), NetworkIsolationKey(),
664 NetLogWithSource(), base::nullopt, request_context_.get(),
665 host_cache_.get()));
Eric Orth6f1c5172019-04-16 17:08:27666 EXPECT_EQ(1u, resolver_->num_jobs_for_testing());
667
668 EXPECT_THAT(response.result_error(), IsOk());
669 EXPECT_EQ(0u, resolver_->num_jobs_for_testing());
670}
671
672TEST_F(HostResolverManagerTest, JobsClearedOnCompletion_MultipleRequests) {
673 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42");
674 proc_->SignalMultiple(1u);
675
676 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55677 HostPortPair("just.testing", 80), NetworkIsolationKey(),
678 NetLogWithSource(), base::nullopt, request_context_.get(),
679 host_cache_.get()));
Eric Orth6f1c5172019-04-16 17:08:27680 ResolveHostResponseHelper response2(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55681 HostPortPair("just.testing", 85), NetworkIsolationKey(),
682 NetLogWithSource(), base::nullopt, request_context_.get(),
683 host_cache_.get()));
Eric Orth6f1c5172019-04-16 17:08:27684 EXPECT_EQ(1u, resolver_->num_jobs_for_testing());
685
686 EXPECT_THAT(response1.result_error(), IsOk());
687 EXPECT_THAT(response2.result_error(), IsOk());
688 EXPECT_EQ(0u, resolver_->num_jobs_for_testing());
689}
690
691TEST_F(HostResolverManagerTest, JobsClearedOnCompletion_Failure) {
692 proc_->AddRuleForAllFamilies(std::string(),
Eric Roman862ae4b22019-08-22 20:25:44693 "0.0.0.1"); // Default to failures.
Eric Orth6f1c5172019-04-16 17:08:27694 proc_->SignalMultiple(1u);
695
696 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55697 HostPortPair("just.testing", 80), NetworkIsolationKey(),
698 NetLogWithSource(), base::nullopt, request_context_.get(),
699 host_cache_.get()));
Eric Orth6f1c5172019-04-16 17:08:27700 EXPECT_EQ(1u, resolver_->num_jobs_for_testing());
701
702 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
703 EXPECT_EQ(0u, resolver_->num_jobs_for_testing());
704}
705
706TEST_F(HostResolverManagerTest, JobsClearedOnCompletion_Abort) {
707 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42");
708
709 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55710 HostPortPair("just.testing", 80), NetworkIsolationKey(),
711 NetLogWithSource(), base::nullopt, request_context_.get(),
712 host_cache_.get()));
Eric Orth6f1c5172019-04-16 17:08:27713 EXPECT_EQ(1u, resolver_->num_jobs_for_testing());
714
715 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
716 proc_->SignalMultiple(1u);
717
718 EXPECT_THAT(response.result_error(), IsError(ERR_NETWORK_CHANGED));
719 EXPECT_EQ(0u, resolver_->num_jobs_for_testing());
720}
721
Eric Orth960e7062019-03-08 18:43:54722TEST_F(HostResolverManagerTest, DnsQueryType) {
Eric Orth00fe5a62018-08-15 22:20:00723 proc_->AddRule("host", ADDRESS_FAMILY_IPV4, "192.168.1.20");
724 proc_->AddRule("host", ADDRESS_FAMILY_IPV6, "::5");
725
726 HostResolver::ResolveHostParameters parameters;
727
Eric Orth192e3bb2018-11-14 19:30:32728 parameters.dns_query_type = DnsQueryType::A;
Eric Orth117e1992019-04-17 00:24:15729 ResolveHostResponseHelper v4_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55730 HostPortPair("host", 80), NetworkIsolationKey(), NetLogWithSource(),
731 parameters, request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:00732
Eric Orth192e3bb2018-11-14 19:30:32733 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth117e1992019-04-17 00:24:15734 ResolveHostResponseHelper v6_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55735 HostPortPair("host", 80), NetworkIsolationKey(), NetLogWithSource(),
736 parameters, request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:00737
738 proc_->SignalMultiple(2u);
739
740 EXPECT_THAT(v4_response.result_error(), IsOk());
741 EXPECT_THAT(v4_response.request()->GetAddressResults().value().endpoints(),
742 testing::ElementsAre(CreateExpected("192.168.1.20", 80)));
743
744 EXPECT_THAT(v6_response.result_error(), IsOk());
745 EXPECT_THAT(v6_response.request()->GetAddressResults().value().endpoints(),
746 testing::ElementsAre(CreateExpected("::5", 80)));
747}
748
Eric Orth960e7062019-03-08 18:43:54749TEST_F(HostResolverManagerTest, LocalhostIPV4IPV6Lookup) {
Eric Orth00fe5a62018-08-15 22:20:00750 HostResolver::ResolveHostParameters parameters;
751
Eric Orth192e3bb2018-11-14 19:30:32752 parameters.dns_query_type = DnsQueryType::A;
Eric Orth00fe5a62018-08-15 22:20:00753 ResolveHostResponseHelper v6_v4_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55754 HostPortPair("localhost6", 80), NetworkIsolationKey(), NetLogWithSource(),
755 parameters, request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:00756 EXPECT_THAT(v6_v4_response.result_error(), IsOk());
757 EXPECT_THAT(v6_v4_response.request()->GetAddressResults().value().endpoints(),
758 testing::IsEmpty());
759
Eric Orth192e3bb2018-11-14 19:30:32760 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth00fe5a62018-08-15 22:20:00761 ResolveHostResponseHelper v6_v6_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55762 HostPortPair("localhost6", 80), NetworkIsolationKey(), NetLogWithSource(),
763 parameters, request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:00764 EXPECT_THAT(v6_v6_response.result_error(), IsOk());
765 EXPECT_THAT(v6_v6_response.request()->GetAddressResults().value().endpoints(),
766 testing::ElementsAre(CreateExpected("::1", 80)));
767
768 ResolveHostResponseHelper v6_unsp_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55769 HostPortPair("localhost6", 80), NetworkIsolationKey(), NetLogWithSource(),
770 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:00771 EXPECT_THAT(v6_unsp_response.result_error(), IsOk());
772 EXPECT_THAT(
773 v6_unsp_response.request()->GetAddressResults().value().endpoints(),
774 testing::ElementsAre(CreateExpected("::1", 80)));
775
Eric Orth192e3bb2018-11-14 19:30:32776 parameters.dns_query_type = DnsQueryType::A;
Eric Orth00fe5a62018-08-15 22:20:00777 ResolveHostResponseHelper v4_v4_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55778 HostPortPair("localhost", 80), NetworkIsolationKey(), NetLogWithSource(),
779 parameters, request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:00780 EXPECT_THAT(v4_v4_response.result_error(), IsOk());
781 EXPECT_THAT(v4_v4_response.request()->GetAddressResults().value().endpoints(),
782 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
783
Eric Orth192e3bb2018-11-14 19:30:32784 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth00fe5a62018-08-15 22:20:00785 ResolveHostResponseHelper v4_v6_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55786 HostPortPair("localhost", 80), NetworkIsolationKey(), NetLogWithSource(),
787 parameters, request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:00788 EXPECT_THAT(v4_v6_response.result_error(), IsOk());
789 EXPECT_THAT(v4_v6_response.request()->GetAddressResults().value().endpoints(),
790 testing::ElementsAre(CreateExpected("::1", 80)));
791
792 ResolveHostResponseHelper v4_unsp_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55793 HostPortPair("localhost", 80), NetworkIsolationKey(), NetLogWithSource(),
794 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:00795 EXPECT_THAT(v4_unsp_response.result_error(), IsOk());
796 EXPECT_THAT(
797 v4_unsp_response.request()->GetAddressResults().value().endpoints(),
798 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
799 CreateExpected("::1", 80)));
800}
801
Eric Orth960e7062019-03-08 18:43:54802TEST_F(HostResolverManagerTest, ResolveIPLiteralWithHostResolverSystemOnly) {
eroman368a1002016-03-04 21:52:55803 const char kIpLiteral[] = "178.78.32.1";
804 // Add a mapping to tell if the resolver proc was called (if it was called,
805 // then the result will be the remapped value. Otherwise it will be the IP
806 // literal).
807 proc_->AddRuleForAllFamilies(kIpLiteral, "183.45.32.1");
808
Eric Orthdc35748e2018-08-23 22:41:48809 HostResolver::ResolveHostParameters parameters;
810 parameters.source = HostResolverSource::SYSTEM;
Eric Orth117e1992019-04-17 00:24:15811 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55812 HostPortPair(kIpLiteral, 80), NetworkIsolationKey(), NetLogWithSource(),
813 parameters, request_context_.get(), host_cache_.get()));
Eric Orthdc35748e2018-08-23 22:41:48814
815 // IP literal resolution is expected to take precedence over source, so the
816 // result is expected to be the input IP, not the result IP from the proc rule
817 EXPECT_THAT(response.result_error(), IsOk());
818 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
819 testing::ElementsAre(CreateExpected(kIpLiteral, 80)));
Eric Ortheb332862019-01-26 00:52:38820 EXPECT_FALSE(response.request()->GetStaleInfo());
Eric Orthdc35748e2018-08-23 22:41:48821}
822
Eric Orth960e7062019-03-08 18:43:54823TEST_F(HostResolverManagerTest, EmptyListMeansNameNotResolved) {
[email protected]49b70b222013-05-07 21:24:23824 proc_->AddRuleForAllFamilies("just.testing", "");
825 proc_->SignalMultiple(1u);
826
Eric Orth70992982018-07-24 00:25:00827 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55828 HostPortPair("just.testing", 80), NetworkIsolationKey(),
829 NetLogWithSource(), base::nullopt, request_context_.get(),
830 host_cache_.get()));
Eric Orth70992982018-07-24 00:25:00831
832 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
833 EXPECT_FALSE(response.request()->GetAddressResults());
Eric Ortheb332862019-01-26 00:52:38834 EXPECT_FALSE(response.request()->GetStaleInfo());
Eric Orth70992982018-07-24 00:25:00835
836 EXPECT_EQ("just.testing", proc_->GetCaptureList()[0].hostname);
837}
838
Eric Orth960e7062019-03-08 18:43:54839TEST_F(HostResolverManagerTest, FailedAsynchronousLookup) {
[email protected]007b3f82013-04-09 08:46:45840 proc_->AddRuleForAllFamilies(std::string(),
Eric Roman862ae4b22019-08-22 20:25:44841 "0.0.0.1"); // Default to failures.
[email protected]38b50d92012-04-19 21:07:52842 proc_->SignalMultiple(1u);
[email protected]a33347c2012-01-09 18:27:01843
Eric Orth70992982018-07-24 00:25:00844 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55845 HostPortPair("just.testing", 80), NetworkIsolationKey(),
846 NetLogWithSource(), base::nullopt, request_context_.get(),
847 host_cache_.get()));
Eric Orth70992982018-07-24 00:25:00848 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
849 EXPECT_FALSE(response.request()->GetAddressResults());
Eric Ortheb332862019-01-26 00:52:38850 EXPECT_FALSE(response.request()->GetStaleInfo());
Eric Orth70992982018-07-24 00:25:00851
852 EXPECT_EQ("just.testing", proc_->GetCaptureList()[0].hostname);
853
854 // Also test that the error is not cached.
dalyk48b20a992019-02-25 16:10:26855 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result =
856 GetCacheHit(HostCache::Key("just.testing", DnsQueryType::UNSPECIFIED,
857 0 /* host_resolver_flags */,
Matt Menke7b4a32f2019-10-25 22:13:46858 HostResolverSource::ANY,
859 NetworkIsolationKey()));
dalyk48b20a992019-02-25 16:10:26860 EXPECT_FALSE(cache_result);
Eric Orth70992982018-07-24 00:25:00861}
862
Eric Orth960e7062019-03-08 18:43:54863TEST_F(HostResolverManagerTest, AbortedAsynchronousLookup) {
Eric Orth70992982018-07-24 00:25:00864 ResolveHostResponseHelper response0(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55865 HostPortPair("just.testing", 80), NetworkIsolationKey(),
866 NetLogWithSource(), base::nullopt, request_context_.get(),
867 host_cache_.get()));
Eric Orth70992982018-07-24 00:25:00868 ASSERT_FALSE(response0.complete());
869 ASSERT_TRUE(proc_->WaitFor(1u));
870
871 // Resolver is destroyed while job is running on WorkerPool.
Eric Orth37b18192019-04-22 19:09:28872 DestroyResolver();
Eric Orth70992982018-07-24 00:25:00873
874 proc_->SignalAll();
875
876 // To ensure there was no spurious callback, complete with a new resolver.
877 CreateResolver();
878 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55879 HostPortPair("just.testing", 80), NetworkIsolationKey(),
880 NetLogWithSource(), base::nullopt, request_context_.get(),
881 host_cache_.get()));
Eric Orth70992982018-07-24 00:25:00882
883 proc_->SignalMultiple(2u);
884
885 EXPECT_THAT(response1.result_error(), IsOk());
886
887 // This request was canceled.
888 EXPECT_FALSE(response0.complete());
889}
890
Eric Orth960e7062019-03-08 18:43:54891TEST_F(HostResolverManagerTest, NumericIPv4Address) {
Eric Orth70992982018-07-24 00:25:00892 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55893 HostPortPair("127.1.2.3", 5555), NetworkIsolationKey(),
894 NetLogWithSource(), base::nullopt, request_context_.get(),
895 host_cache_.get()));
Eric Orth70992982018-07-24 00:25:00896
897 EXPECT_THAT(response.result_error(), IsOk());
898 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
899 testing::ElementsAre(CreateExpected("127.1.2.3", 5555)));
900}
901
Eric Orth960e7062019-03-08 18:43:54902TEST_F(HostResolverManagerTest, NumericIPv6Address) {
[email protected]dbcff96272009-05-07 00:23:44903 // Resolve a plain IPv6 address. Don't worry about [brackets], because
904 // the caller should have removed them.
Eric Orth70992982018-07-24 00:25:00905 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55906 HostPortPair("2001:db8::1", 5555), NetworkIsolationKey(),
907 NetLogWithSource(), base::nullopt, request_context_.get(),
908 host_cache_.get()));
Eric Orth70992982018-07-24 00:25:00909
910 EXPECT_THAT(response.result_error(), IsOk());
911 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
912 testing::ElementsAre(CreateExpected("2001:db8::1", 5555)));
913}
914
Eric Orth960e7062019-03-08 18:43:54915TEST_F(HostResolverManagerTest, EmptyHost) {
Eric Orth70992982018-07-24 00:25:00916 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55917 HostPortPair(std::string(), 5555), NetworkIsolationKey(),
918 NetLogWithSource(), base::nullopt, request_context_.get(),
919 host_cache_.get()));
Eric Orth70992982018-07-24 00:25:00920
921 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
922 EXPECT_FALSE(response.request()->GetAddressResults());
923}
924
Eric Orth960e7062019-03-08 18:43:54925TEST_F(HostResolverManagerTest, EmptyDotsHost) {
[email protected]e806cd72013-05-17 02:08:43926 for (int i = 0; i < 16; ++i) {
Eric Orth6f1c5172019-04-16 17:08:27927 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55928 HostPortPair(std::string(i, '.'), 5555), NetworkIsolationKey(),
929 NetLogWithSource(), base::nullopt, request_context_.get(),
930 host_cache_.get()));
Eric Orth70992982018-07-24 00:25:00931
932 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
933 EXPECT_FALSE(response.request()->GetAddressResults());
934 }
935}
936
Eric Orth960e7062019-03-08 18:43:54937TEST_F(HostResolverManagerTest, LongHost) {
Eric Orth6f1c5172019-04-16 17:08:27938 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55939 HostPortPair(std::string(4097, 'a'), 5555), NetworkIsolationKey(),
940 NetLogWithSource(), base::nullopt, request_context_.get(),
941 host_cache_.get()));
Eric Orth70992982018-07-24 00:25:00942
943 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
944 EXPECT_FALSE(response.request()->GetAddressResults());
945}
946
Eric Orth960e7062019-03-08 18:43:54947TEST_F(HostResolverManagerTest, DeDupeRequests) {
[email protected]b59ff372009-07-15 22:04:32948 // Start 5 requests, duplicating hosts "a" and "b". Since the resolver_proc is
[email protected]8a00f00a2009-06-12 00:49:38949 // blocked, these should all pile up until we signal it.
Eric Orth70992982018-07-24 00:25:00950 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:15951 responses.emplace_back(
952 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55953 HostPortPair("a", 80), NetworkIsolationKey(), NetLogWithSource(),
954 base::nullopt, request_context_.get(), host_cache_.get())));
Eric Orth117e1992019-04-17 00:24:15955 responses.emplace_back(
956 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55957 HostPortPair("b", 80), NetworkIsolationKey(), NetLogWithSource(),
958 base::nullopt, request_context_.get(), host_cache_.get())));
Eric Orth117e1992019-04-17 00:24:15959 responses.emplace_back(
960 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55961 HostPortPair("b", 81), NetworkIsolationKey(), NetLogWithSource(),
962 base::nullopt, request_context_.get(), host_cache_.get())));
Eric Orth117e1992019-04-17 00:24:15963 responses.emplace_back(
964 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55965 HostPortPair("a", 82), NetworkIsolationKey(), NetLogWithSource(),
966 base::nullopt, request_context_.get(), host_cache_.get())));
Eric Orth117e1992019-04-17 00:24:15967 responses.emplace_back(
968 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55969 HostPortPair("b", 83), NetworkIsolationKey(), NetLogWithSource(),
970 base::nullopt, request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:00971
972 for (auto& response : responses) {
973 ASSERT_FALSE(response->complete());
974 }
975
976 proc_->SignalMultiple(2u); // One for "a", one for "b".
977
978 for (auto& response : responses) {
979 EXPECT_THAT(response->result_error(), IsOk());
980 }
981}
982
Eric Orth960e7062019-03-08 18:43:54983TEST_F(HostResolverManagerTest, CancelMultipleRequests) {
Eric Orth70992982018-07-24 00:25:00984 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:15985 responses.emplace_back(
986 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55987 HostPortPair("a", 80), NetworkIsolationKey(), NetLogWithSource(),
988 base::nullopt, request_context_.get(), host_cache_.get())));
Eric Orth117e1992019-04-17 00:24:15989 responses.emplace_back(
990 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55991 HostPortPair("b", 80), NetworkIsolationKey(), NetLogWithSource(),
992 base::nullopt, request_context_.get(), host_cache_.get())));
Eric Orth117e1992019-04-17 00:24:15993 responses.emplace_back(
994 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55995 HostPortPair("b", 81), NetworkIsolationKey(), NetLogWithSource(),
996 base::nullopt, request_context_.get(), host_cache_.get())));
Eric Orth117e1992019-04-17 00:24:15997 responses.emplace_back(
998 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:55999 HostPortPair("a", 82), NetworkIsolationKey(), NetLogWithSource(),
1000 base::nullopt, request_context_.get(), host_cache_.get())));
Eric Orth117e1992019-04-17 00:24:151001 responses.emplace_back(
1002 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551003 HostPortPair("b", 83), NetworkIsolationKey(), NetLogWithSource(),
1004 base::nullopt, request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:001005
1006 for (auto& response : responses) {
1007 ASSERT_FALSE(response->complete());
1008 }
1009
1010 // Cancel everything except request for requests[3] ("a", 82).
1011 responses[0]->CancelRequest();
1012 responses[1]->CancelRequest();
1013 responses[2]->CancelRequest();
1014 responses[4]->CancelRequest();
1015
1016 proc_->SignalMultiple(2u); // One for "a", one for "b".
1017
1018 EXPECT_THAT(responses[3]->result_error(), IsOk());
1019
1020 EXPECT_FALSE(responses[0]->complete());
1021 EXPECT_FALSE(responses[1]->complete());
1022 EXPECT_FALSE(responses[2]->complete());
1023 EXPECT_FALSE(responses[4]->complete());
1024}
1025
Eric Orth960e7062019-03-08 18:43:541026TEST_F(HostResolverManagerTest, CanceledRequestsReleaseJobSlots) {
Eric Orth70992982018-07-24 00:25:001027 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
1028
1029 // Fill up the dispatcher and queue.
1030 for (unsigned i = 0; i < kMaxJobs + 1; ++i) {
1031 std::string hostname = "a_";
1032 hostname[1] = 'a' + i;
1033
Eric Orth117e1992019-04-17 00:24:151034 responses.emplace_back(
1035 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551036 HostPortPair(hostname, 80), NetworkIsolationKey(),
1037 NetLogWithSource(), base::nullopt, request_context_.get(),
1038 host_cache_.get())));
Eric Orth70992982018-07-24 00:25:001039 ASSERT_FALSE(responses.back()->complete());
1040
Eric Orth117e1992019-04-17 00:24:151041 responses.emplace_back(
1042 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551043 HostPortPair(hostname, 81), NetworkIsolationKey(),
1044 NetLogWithSource(), base::nullopt, request_context_.get(),
1045 host_cache_.get())));
Eric Orth70992982018-07-24 00:25:001046 ASSERT_FALSE(responses.back()->complete());
1047 }
1048
1049 ASSERT_TRUE(proc_->WaitFor(kMaxJobs));
1050
1051 // Cancel all but last two.
1052 for (unsigned i = 0; i < responses.size() - 2; ++i) {
1053 responses[i]->CancelRequest();
1054 }
1055
1056 ASSERT_TRUE(proc_->WaitFor(kMaxJobs + 1));
1057
1058 proc_->SignalAll();
1059
1060 size_t num_requests = responses.size();
1061 EXPECT_THAT(responses[num_requests - 1]->result_error(), IsOk());
1062 EXPECT_THAT(responses[num_requests - 2]->result_error(), IsOk());
1063 for (unsigned i = 0; i < num_requests - 2; ++i) {
1064 EXPECT_FALSE(responses[i]->complete());
1065 }
1066}
1067
Eric Orth960e7062019-03-08 18:43:541068TEST_F(HostResolverManagerTest, CancelWithinCallback) {
Eric Orth70992982018-07-24 00:25:001069 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
1070 auto custom_callback = base::BindLambdaForTesting(
1071 [&](CompletionOnceCallback completion_callback, int error) {
1072 for (auto& response : responses) {
1073 // Cancelling request is required to complete first, so that it can
1074 // attempt to cancel the others. This test assumes all jobs are
1075 // completed in order.
1076 DCHECK(!response->complete());
1077
1078 response->CancelRequest();
1079 }
1080 std::move(completion_callback).Run(error);
1081 });
1082
1083 ResolveHostResponseHelper cancelling_response(
Matt Menkef4023312019-11-01 18:24:551084 resolver_->CreateRequest(HostPortPair("a", 80), NetworkIsolationKey(),
1085 NetLogWithSource(), base::nullopt,
1086 request_context_.get(), host_cache_.get()),
Eric Orth70992982018-07-24 00:25:001087 std::move(custom_callback));
1088
Eric Orth117e1992019-04-17 00:24:151089 responses.emplace_back(
1090 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551091 HostPortPair("a", 81), NetworkIsolationKey(), NetLogWithSource(),
1092 base::nullopt, request_context_.get(), host_cache_.get())));
Eric Orth117e1992019-04-17 00:24:151093 responses.emplace_back(
1094 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551095 HostPortPair("a", 82), NetworkIsolationKey(), NetLogWithSource(),
1096 base::nullopt, request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:001097
1098 proc_->SignalMultiple(2u); // One for "a". One for "finalrequest".
1099
1100 EXPECT_THAT(cancelling_response.result_error(), IsOk());
1101
1102 ResolveHostResponseHelper final_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551103 HostPortPair("finalrequest", 70), NetworkIsolationKey(),
1104 NetLogWithSource(), base::nullopt, request_context_.get(),
1105 host_cache_.get()));
Eric Orth70992982018-07-24 00:25:001106 EXPECT_THAT(final_response.result_error(), IsOk());
1107
1108 for (auto& response : responses) {
1109 EXPECT_FALSE(response->complete());
1110 }
1111}
1112
Eric Orth960e7062019-03-08 18:43:541113TEST_F(HostResolverManagerTest, DeleteWithinCallback) {
Eric Orth70992982018-07-24 00:25:001114 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
1115 auto custom_callback = base::BindLambdaForTesting(
1116 [&](CompletionOnceCallback completion_callback, int error) {
1117 for (auto& response : responses) {
1118 // Deleting request is required to be first, so the other requests
1119 // will still be running to be deleted. This test assumes that the
1120 // Jobs will be Aborted in order and the requests in order within the
1121 // jobs.
1122 DCHECK(!response->complete());
1123 }
1124
Eric Orth37b18192019-04-22 19:09:281125 DestroyResolver();
Eric Orth70992982018-07-24 00:25:001126 std::move(completion_callback).Run(error);
1127 });
1128
1129 ResolveHostResponseHelper deleting_response(
Matt Menkef4023312019-11-01 18:24:551130 resolver_->CreateRequest(HostPortPair("a", 80), NetworkIsolationKey(),
1131 NetLogWithSource(), base::nullopt,
1132 request_context_.get(), host_cache_.get()),
Eric Orth70992982018-07-24 00:25:001133 std::move(custom_callback));
1134
1135 // Start additional requests to be cancelled as part of the first's deletion.
1136 // Assumes all requests for a job are handled in order so that the deleting
1137 // request will run first and cancel the rest.
Eric Orth117e1992019-04-17 00:24:151138 responses.emplace_back(
1139 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551140 HostPortPair("a", 81), NetworkIsolationKey(), NetLogWithSource(),
1141 base::nullopt, request_context_.get(), host_cache_.get())));
Eric Orth117e1992019-04-17 00:24:151142 responses.emplace_back(
1143 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551144 HostPortPair("a", 82), NetworkIsolationKey(), NetLogWithSource(),
1145 base::nullopt, request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:001146
1147 proc_->SignalMultiple(3u);
1148
1149 EXPECT_THAT(deleting_response.result_error(), IsOk());
1150
1151 base::RunLoop().RunUntilIdle();
1152 for (auto& response : responses) {
1153 EXPECT_FALSE(response->complete());
1154 }
1155}
1156
Francois Doray4a0a6f12019-08-19 15:25:221157TEST_F(HostResolverManagerTest, DeleteWithinAbortedCallback) {
Eric Orth70992982018-07-24 00:25:001158 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
1159 ResolveHostResponseHelper::Callback custom_callback =
1160 base::BindLambdaForTesting(
1161 [&](CompletionOnceCallback completion_callback, int error) {
1162 for (auto& response : responses) {
1163 // Deleting request is required to be first, so the other requests
1164 // will still be running to be deleted. This test assumes that the
1165 // Jobs will be Aborted in order and the requests in order within
1166 // the jobs.
1167 DCHECK(!response->complete());
1168 }
Eric Orth37b18192019-04-22 19:09:281169 DestroyResolver();
Eric Orth70992982018-07-24 00:25:001170 std::move(completion_callback).Run(error);
1171 });
1172
1173 ResolveHostResponseHelper deleting_response(
Matt Menkef4023312019-11-01 18:24:551174 resolver_->CreateRequest(HostPortPair("a", 80), NetworkIsolationKey(),
1175 NetLogWithSource(), base::nullopt,
1176 request_context_.get(), host_cache_.get()),
Eric Orth70992982018-07-24 00:25:001177 std::move(custom_callback));
1178
Eric Orth117e1992019-04-17 00:24:151179 responses.emplace_back(
1180 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551181 HostPortPair("a", 81), NetworkIsolationKey(), NetLogWithSource(),
1182 base::nullopt, request_context_.get(), host_cache_.get())));
Eric Orth117e1992019-04-17 00:24:151183 responses.emplace_back(
1184 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551185 HostPortPair("b", 82), NetworkIsolationKey(), NetLogWithSource(),
1186 base::nullopt, request_context_.get(), host_cache_.get())));
Eric Orth117e1992019-04-17 00:24:151187 responses.emplace_back(
1188 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551189 HostPortPair("b", 83), NetworkIsolationKey(), NetLogWithSource(),
1190 base::nullopt, request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:001191
1192 // Wait for all calls to queue up, trigger abort via IP address change, then
1193 // signal all the queued requests to let them all try to finish.
1194 EXPECT_TRUE(proc_->WaitFor(2u));
Paul Jensenf47bbab2018-09-14 16:34:041195 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
Eric Orth70992982018-07-24 00:25:001196 proc_->SignalAll();
1197
1198 EXPECT_THAT(deleting_response.result_error(), IsError(ERR_NETWORK_CHANGED));
1199 base::RunLoop().RunUntilIdle();
1200 for (auto& response : responses) {
1201 EXPECT_FALSE(response->complete());
1202 }
1203}
1204
Eric Orth960e7062019-03-08 18:43:541205TEST_F(HostResolverManagerTest, StartWithinCallback) {
Eric Orth70992982018-07-24 00:25:001206 std::unique_ptr<ResolveHostResponseHelper> new_response;
1207 auto custom_callback = base::BindLambdaForTesting(
1208 [&](CompletionOnceCallback completion_callback, int error) {
1209 new_response = std::make_unique<ResolveHostResponseHelper>(
Matt Menkef4023312019-11-01 18:24:551210 resolver_->CreateRequest(HostPortPair("new", 70),
1211 NetworkIsolationKey(), NetLogWithSource(),
1212 base::nullopt, request_context_.get(),
1213 host_cache_.get()));
Eric Orth70992982018-07-24 00:25:001214 std::move(completion_callback).Run(error);
1215 });
1216
1217 ResolveHostResponseHelper starting_response(
Matt Menkef4023312019-11-01 18:24:551218 resolver_->CreateRequest(HostPortPair("a", 80), NetworkIsolationKey(),
1219 NetLogWithSource(), base::nullopt,
1220 request_context_.get(), host_cache_.get()),
Eric Orth70992982018-07-24 00:25:001221 std::move(custom_callback));
1222
1223 proc_->SignalMultiple(2u); // One for "a". One for "new".
1224
1225 EXPECT_THAT(starting_response.result_error(), IsOk());
1226 EXPECT_THAT(new_response->result_error(), IsOk());
1227}
1228
Eric Orth3bd9e512019-03-29 15:33:351229TEST_F(HostResolverManagerTest, StartWithinEvictionCallback) {
1230 CreateSerialResolver();
1231 resolver_->SetMaxQueuedJobsForTesting(2);
1232
1233 std::unique_ptr<ResolveHostResponseHelper> new_response;
1234 auto custom_callback = base::BindLambdaForTesting(
1235 [&](CompletionOnceCallback completion_callback, int error) {
1236 new_response = std::make_unique<ResolveHostResponseHelper>(
Matt Menkef4023312019-11-01 18:24:551237 resolver_->CreateRequest(HostPortPair("new", 70),
1238 NetworkIsolationKey(), NetLogWithSource(),
1239 base::nullopt, request_context_.get(),
1240 host_cache_.get()));
Eric Orth3bd9e512019-03-29 15:33:351241 std::move(completion_callback).Run(error);
1242 });
1243
Eric Orth117e1992019-04-17 00:24:151244 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551245 HostPortPair("initial", 80), NetworkIsolationKey(), NetLogWithSource(),
1246 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth3bd9e512019-03-29 15:33:351247 ResolveHostResponseHelper evictee1_response(
Matt Menkef4023312019-11-01 18:24:551248 resolver_->CreateRequest(HostPortPair("evictee1", 80),
1249 NetworkIsolationKey(), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:151250 base::nullopt, request_context_.get(),
1251 host_cache_.get()),
Eric Orth3bd9e512019-03-29 15:33:351252 std::move(custom_callback));
Eric Orth117e1992019-04-17 00:24:151253 ResolveHostResponseHelper evictee2_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551254 HostPortPair("evictee2", 80), NetworkIsolationKey(), NetLogWithSource(),
1255 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth3bd9e512019-03-29 15:33:351256
1257 // Now one running request ("initial") and two queued requests ("evictee1" and
1258 // "evictee2"). Any further requests will cause evictions.
Eric Orth117e1992019-04-17 00:24:151259 ResolveHostResponseHelper evictor_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551260 HostPortPair("evictor", 80), NetworkIsolationKey(), NetLogWithSource(),
1261 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth3bd9e512019-03-29 15:33:351262 EXPECT_THAT(evictee1_response.result_error(),
1263 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
1264
1265 // "new" should evict "evictee2"
1266 EXPECT_THAT(evictee2_response.result_error(),
1267 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
1268
1269 proc_->SignalMultiple(3u);
1270
1271 EXPECT_THAT(initial_response.result_error(), IsOk());
1272 EXPECT_THAT(evictor_response.result_error(), IsOk());
1273 EXPECT_THAT(new_response->result_error(), IsOk());
1274}
1275
1276// Test where we start a new request within an eviction callback that itself
1277// evicts the first evictor.
1278TEST_F(HostResolverManagerTest, StartWithinEvictionCallback_DoubleEviction) {
1279 CreateSerialResolver();
1280 resolver_->SetMaxQueuedJobsForTesting(1);
1281
1282 std::unique_ptr<ResolveHostResponseHelper> new_response;
1283 auto custom_callback = base::BindLambdaForTesting(
1284 [&](CompletionOnceCallback completion_callback, int error) {
1285 new_response = std::make_unique<ResolveHostResponseHelper>(
Matt Menkef4023312019-11-01 18:24:551286 resolver_->CreateRequest(HostPortPair("new", 70),
1287 NetworkIsolationKey(), NetLogWithSource(),
1288 base::nullopt, request_context_.get(),
1289 host_cache_.get()));
Eric Orth3bd9e512019-03-29 15:33:351290 std::move(completion_callback).Run(error);
1291 });
1292
Eric Orth117e1992019-04-17 00:24:151293 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551294 HostPortPair("initial", 80), NetworkIsolationKey(), NetLogWithSource(),
1295 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth3bd9e512019-03-29 15:33:351296 ResolveHostResponseHelper evictee_response(
Matt Menkef4023312019-11-01 18:24:551297 resolver_->CreateRequest(HostPortPair("evictee", 80),
1298 NetworkIsolationKey(), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:151299 base::nullopt, request_context_.get(),
1300 host_cache_.get()),
Eric Orth3bd9e512019-03-29 15:33:351301 std::move(custom_callback));
1302
1303 // Now one running request ("initial") and one queued requests ("evictee").
1304 // Any further requests will cause evictions.
Eric Orth117e1992019-04-17 00:24:151305 ResolveHostResponseHelper evictor_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551306 HostPortPair("evictor", 80), NetworkIsolationKey(), NetLogWithSource(),
1307 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth3bd9e512019-03-29 15:33:351308 EXPECT_THAT(evictee_response.result_error(),
1309 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
1310
1311 // "new" should evict "evictor"
1312 EXPECT_THAT(evictor_response.result_error(),
1313 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
1314
1315 proc_->SignalMultiple(2u);
1316
1317 EXPECT_THAT(initial_response.result_error(), IsOk());
1318 EXPECT_THAT(new_response->result_error(), IsOk());
1319}
1320
1321TEST_F(HostResolverManagerTest, StartWithinEvictionCallback_SameRequest) {
1322 CreateSerialResolver();
1323 resolver_->SetMaxQueuedJobsForTesting(2);
1324
1325 std::unique_ptr<ResolveHostResponseHelper> new_response;
1326 auto custom_callback = base::BindLambdaForTesting(
1327 [&](CompletionOnceCallback completion_callback, int error) {
1328 new_response = std::make_unique<ResolveHostResponseHelper>(
Matt Menkef4023312019-11-01 18:24:551329 resolver_->CreateRequest(HostPortPair("evictor", 70),
1330 NetworkIsolationKey(), NetLogWithSource(),
1331 base::nullopt, request_context_.get(),
1332 host_cache_.get()));
Eric Orth3bd9e512019-03-29 15:33:351333 std::move(completion_callback).Run(error);
1334 });
1335
Eric Orth117e1992019-04-17 00:24:151336 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551337 HostPortPair("initial", 80), NetworkIsolationKey(), NetLogWithSource(),
1338 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth3bd9e512019-03-29 15:33:351339 ResolveHostResponseHelper evictee_response(
Matt Menkef4023312019-11-01 18:24:551340 resolver_->CreateRequest(HostPortPair("evictee", 80),
1341 NetworkIsolationKey(), NetLogWithSource(),
Eric Orth117e1992019-04-17 00:24:151342 base::nullopt, request_context_.get(),
1343 host_cache_.get()),
Eric Orth3bd9e512019-03-29 15:33:351344 std::move(custom_callback));
1345 ResolveHostResponseHelper additional_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551346 HostPortPair("additional", 80), NetworkIsolationKey(), NetLogWithSource(),
1347 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth3bd9e512019-03-29 15:33:351348
1349 // Now one running request ("initial") and two queued requests ("evictee" and
1350 // "additional"). Any further requests will cause evictions.
Eric Orth117e1992019-04-17 00:24:151351 ResolveHostResponseHelper evictor_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551352 HostPortPair("evictor", 80), NetworkIsolationKey(), NetLogWithSource(),
1353 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth3bd9e512019-03-29 15:33:351354 EXPECT_THAT(evictee_response.result_error(),
1355 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
1356
1357 // Second "evictor" should be joined with the first and not evict "additional"
1358
1359 // Only 3 proc requests because both "evictor" requests are combined.
1360 proc_->SignalMultiple(3u);
1361
1362 EXPECT_THAT(initial_response.result_error(), IsOk());
1363 EXPECT_THAT(additional_response.result_error(), IsOk());
1364 EXPECT_THAT(evictor_response.result_error(), IsOk());
1365 EXPECT_THAT(new_response->result_error(), IsOk());
1366}
1367
Eric Orth960e7062019-03-08 18:43:541368TEST_F(HostResolverManagerTest, BypassCache) {
Eric Orthdc35748e2018-08-23 22:41:481369 proc_->SignalMultiple(2u);
1370
Eric Orth117e1992019-04-17 00:24:151371 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551372 HostPortPair("a", 80), NetworkIsolationKey(), NetLogWithSource(),
1373 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orthdc35748e2018-08-23 22:41:481374 EXPECT_THAT(initial_response.result_error(), IsOk());
1375 EXPECT_EQ(1u, proc_->GetCaptureList().size());
1376
Eric Orth117e1992019-04-17 00:24:151377 ResolveHostResponseHelper cached_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551378 HostPortPair("a", 80), NetworkIsolationKey(), NetLogWithSource(),
1379 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orthdc35748e2018-08-23 22:41:481380 EXPECT_THAT(cached_response.result_error(), IsOk());
1381 // Expect no increase to calls to |proc_| because result was cached.
1382 EXPECT_EQ(1u, proc_->GetCaptureList().size());
1383
1384 HostResolver::ResolveHostParameters parameters;
Eric Ortheb332862019-01-26 00:52:381385 parameters.cache_usage =
1386 HostResolver::ResolveHostParameters::CacheUsage::DISALLOWED;
Eric Orth117e1992019-04-17 00:24:151387 ResolveHostResponseHelper cache_bypassed_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551388 HostPortPair("a", 80), NetworkIsolationKey(), NetLogWithSource(),
1389 parameters, request_context_.get(), host_cache_.get()));
Eric Orthdc35748e2018-08-23 22:41:481390 EXPECT_THAT(cache_bypassed_response.result_error(), IsOk());
1391 // Expect call to |proc_| because cache was bypassed.
1392 EXPECT_EQ(2u, proc_->GetCaptureList().size());
1393}
1394
Paul Jensenf47bbab2018-09-14 16:34:041395// Test that IP address changes flush the cache but initial DNS config reads
Eric Orth70992982018-07-24 00:25:001396// do not.
Eric Orth960e7062019-03-08 18:43:541397TEST_F(HostResolverManagerTest, FlushCacheOnIPAddressChange) {
Eric Orth70992982018-07-24 00:25:001398 proc_->SignalMultiple(2u); // One before the flush, one after.
1399
Eric Orth117e1992019-04-17 00:24:151400 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551401 HostPortPair("host1", 70), NetworkIsolationKey(), NetLogWithSource(),
1402 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:001403 EXPECT_THAT(initial_response.result_error(), IsOk());
1404 EXPECT_EQ(1u, proc_->GetCaptureList().size());
1405
Eric Orth117e1992019-04-17 00:24:151406 ResolveHostResponseHelper cached_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551407 HostPortPair("host1", 75), NetworkIsolationKey(), NetLogWithSource(),
1408 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:001409 EXPECT_THAT(cached_response.result_error(), IsOk());
1410 EXPECT_EQ(1u, proc_->GetCaptureList().size()); // No expected increase.
1411
Paul Jensenf47bbab2018-09-14 16:34:041412 // Flush cache by triggering an IP address change.
1413 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
Eric Orth70992982018-07-24 00:25:001414 base::RunLoop().RunUntilIdle(); // Notification happens async.
1415
1416 // Resolve "host1" again -- this time it won't be served from cache, so it
1417 // will complete asynchronously.
Eric Orth117e1992019-04-17 00:24:151418 ResolveHostResponseHelper flushed_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551419 HostPortPair("host1", 80), NetworkIsolationKey(), NetLogWithSource(),
1420 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:001421 EXPECT_THAT(flushed_response.result_error(), IsOk());
1422 EXPECT_EQ(2u, proc_->GetCaptureList().size()); // Expected increase.
1423}
1424
Paul Jensenf47bbab2018-09-14 16:34:041425// Test that IP address changes send ERR_NETWORK_CHANGED to pending requests.
Eric Orth960e7062019-03-08 18:43:541426TEST_F(HostResolverManagerTest, AbortOnIPAddressChanged) {
Eric Orth117e1992019-04-17 00:24:151427 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551428 HostPortPair("host1", 70), NetworkIsolationKey(), NetLogWithSource(),
1429 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:001430
1431 ASSERT_FALSE(response.complete());
1432 ASSERT_TRUE(proc_->WaitFor(1u));
1433
Paul Jensenf47bbab2018-09-14 16:34:041434 // Triggering an IP address change.
1435 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
Eric Orth70992982018-07-24 00:25:001436 base::RunLoop().RunUntilIdle(); // Notification happens async.
1437 proc_->SignalAll();
1438
1439 EXPECT_THAT(response.result_error(), IsError(ERR_NETWORK_CHANGED));
1440 EXPECT_FALSE(response.request()->GetAddressResults());
Eric Orth37b18192019-04-22 19:09:281441 EXPECT_EQ(0u, host_cache_->size());
Eric Orth70992982018-07-24 00:25:001442}
1443
Paul Jensenf47bbab2018-09-14 16:34:041444// Obey pool constraints after IP address has changed.
Eric Orth960e7062019-03-08 18:43:541445TEST_F(HostResolverManagerTest, ObeyPoolConstraintsAfterIPAddressChange) {
[email protected]38b50d92012-04-19 21:07:521446 // Runs at most one job at a time.
1447 CreateSerialResolver();
Eric Orth70992982018-07-24 00:25:001448
1449 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:151450 responses.emplace_back(
1451 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551452 HostPortPair("a", 80), NetworkIsolationKey(), NetLogWithSource(),
1453 base::nullopt, request_context_.get(), host_cache_.get())));
Eric Orth117e1992019-04-17 00:24:151454 responses.emplace_back(
1455 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551456 HostPortPair("b", 80), NetworkIsolationKey(), NetLogWithSource(),
1457 base::nullopt, request_context_.get(), host_cache_.get())));
Eric Orth117e1992019-04-17 00:24:151458 responses.emplace_back(
1459 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551460 HostPortPair("c", 80), NetworkIsolationKey(), NetLogWithSource(),
1461 base::nullopt, request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:001462
1463 for (auto& response : responses) {
1464 ASSERT_FALSE(response->complete());
1465 }
1466 ASSERT_TRUE(proc_->WaitFor(1u));
1467
Paul Jensenf47bbab2018-09-14 16:34:041468 // Triggering an IP address change.
1469 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
Eric Orth70992982018-07-24 00:25:001470 base::RunLoop().RunUntilIdle(); // Notification happens async.
1471 proc_->SignalMultiple(3u); // Let the false-start go so that we can catch it.
1472
1473 // Requests should complete one at a time, with the first failing.
1474 EXPECT_THAT(responses[0]->result_error(), IsError(ERR_NETWORK_CHANGED));
1475 EXPECT_EQ(1u, num_running_dispatcher_jobs());
1476 EXPECT_FALSE(responses[1]->complete());
1477 EXPECT_FALSE(responses[2]->complete());
1478
1479 EXPECT_THAT(responses[1]->result_error(), IsOk());
1480 EXPECT_EQ(1u, num_running_dispatcher_jobs());
1481 EXPECT_FALSE(responses[2]->complete());
1482
1483 EXPECT_THAT(responses[2]->result_error(), IsOk());
1484}
1485
[email protected]b3601bc22012-02-21 21:23:201486// Tests that a new Request made from the callback of a previously aborted one
1487// will not be aborted.
Eric Orth960e7062019-03-08 18:43:541488TEST_F(HostResolverManagerTest, AbortOnlyExistingRequestsOnIPAddressChange) {
Eric Orth70992982018-07-24 00:25:001489 auto custom_callback_template = base::BindLambdaForTesting(
1490 [&](const HostPortPair& next_host,
1491 std::unique_ptr<ResolveHostResponseHelper>* next_response,
1492 CompletionOnceCallback completion_callback, int error) {
1493 *next_response = std::make_unique<ResolveHostResponseHelper>(
Matt Menkef4023312019-11-01 18:24:551494 resolver_->CreateRequest(
1495 next_host, NetworkIsolationKey(), NetLogWithSource(),
1496 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:001497 std::move(completion_callback).Run(error);
1498 });
1499
1500 std::vector<std::unique_ptr<ResolveHostResponseHelper>> next_responses(3);
1501
1502 ResolveHostResponseHelper response0(
Matt Menkef4023312019-11-01 18:24:551503 resolver_->CreateRequest(HostPortPair("bbb", 80), NetworkIsolationKey(),
1504 NetLogWithSource(), base::nullopt,
1505 request_context_.get(), host_cache_.get()),
Eric Orth70992982018-07-24 00:25:001506 base::BindOnce(custom_callback_template, HostPortPair("zzz", 80),
1507 &next_responses[0]));
1508
1509 ResolveHostResponseHelper response1(
Matt Menkef4023312019-11-01 18:24:551510 resolver_->CreateRequest(HostPortPair("eee", 80), NetworkIsolationKey(),
1511 NetLogWithSource(), base::nullopt,
1512 request_context_.get(), host_cache_.get()),
Eric Orth70992982018-07-24 00:25:001513 base::BindOnce(custom_callback_template, HostPortPair("aaa", 80),
1514 &next_responses[1]));
1515
1516 ResolveHostResponseHelper response2(
Matt Menkef4023312019-11-01 18:24:551517 resolver_->CreateRequest(HostPortPair("ccc", 80), NetworkIsolationKey(),
1518 NetLogWithSource(), base::nullopt,
1519 request_context_.get(), host_cache_.get()),
Eric Orth70992982018-07-24 00:25:001520 base::BindOnce(custom_callback_template, HostPortPair("eee", 80),
1521 &next_responses[2]));
1522
1523 // Wait until all are blocked;
1524 ASSERT_TRUE(proc_->WaitFor(3u));
Paul Jensenf47bbab2018-09-14 16:34:041525 // Trigger an IP address change.
1526 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
Eric Orth70992982018-07-24 00:25:001527 // This should abort all running jobs.
1528 base::RunLoop().RunUntilIdle();
1529
1530 EXPECT_THAT(response0.result_error(), IsError(ERR_NETWORK_CHANGED));
1531 EXPECT_THAT(response1.result_error(), IsError(ERR_NETWORK_CHANGED));
1532 EXPECT_THAT(response2.result_error(), IsError(ERR_NETWORK_CHANGED));
1533
1534 EXPECT_FALSE(next_responses[0]->complete());
1535 EXPECT_FALSE(next_responses[1]->complete());
1536 EXPECT_FALSE(next_responses[2]->complete());
1537
1538 // Unblock all calls to proc.
1539 proc_->SignalMultiple(6u);
1540
1541 // Run until the re-started requests finish.
1542 EXPECT_THAT(next_responses[0]->result_error(), IsOk());
1543 EXPECT_THAT(next_responses[1]->result_error(), IsOk());
1544 EXPECT_THAT(next_responses[2]->result_error(), IsOk());
1545
1546 // Verify that results of aborted Jobs were not cached.
1547 EXPECT_EQ(6u, proc_->GetCaptureList().size());
Eric Orth37b18192019-04-22 19:09:281548 EXPECT_EQ(3u, host_cache_->size());
Eric Orth70992982018-07-24 00:25:001549}
1550
[email protected]68ad3ee2010-01-30 03:45:391551// Tests that when the maximum threads is set to 1, requests are dequeued
1552// in order of priority.
Eric Orth960e7062019-03-08 18:43:541553TEST_F(HostResolverManagerTest, HigherPriorityRequestsStartedFirst) {
[email protected]38b50d92012-04-19 21:07:521554 CreateSerialResolver();
[email protected]68ad3ee2010-01-30 03:45:391555
Eric Orth00fe5a62018-08-15 22:20:001556 HostResolver::ResolveHostParameters low_priority;
1557 low_priority.initial_priority = LOW;
1558 HostResolver::ResolveHostParameters medium_priority;
1559 medium_priority.initial_priority = MEDIUM;
1560 HostResolver::ResolveHostParameters highest_priority;
1561 highest_priority.initial_priority = HIGHEST;
1562
1563 // Note that at this point the MockHostResolverProc is blocked, so any
1564 // requests we make will not complete.
1565
1566 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:151567 responses.emplace_back(
1568 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551569 HostPortPair("req0", 80), NetworkIsolationKey(), NetLogWithSource(),
1570 low_priority, request_context_.get(), host_cache_.get())));
Eric Orth117e1992019-04-17 00:24:151571 responses.emplace_back(
1572 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551573 HostPortPair("req1", 80), NetworkIsolationKey(), NetLogWithSource(),
1574 medium_priority, request_context_.get(), host_cache_.get())));
Eric Orth117e1992019-04-17 00:24:151575 responses.emplace_back(
1576 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551577 HostPortPair("req2", 80), NetworkIsolationKey(), NetLogWithSource(),
1578 medium_priority, request_context_.get(), host_cache_.get())));
Eric Orth117e1992019-04-17 00:24:151579 responses.emplace_back(
1580 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551581 HostPortPair("req3", 80), NetworkIsolationKey(), NetLogWithSource(),
1582 low_priority, request_context_.get(), host_cache_.get())));
Eric Orth117e1992019-04-17 00:24:151583 responses.emplace_back(
1584 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551585 HostPortPair("req4", 80), NetworkIsolationKey(), NetLogWithSource(),
1586 highest_priority, request_context_.get(), host_cache_.get())));
Eric Orth117e1992019-04-17 00:24:151587 responses.emplace_back(
1588 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551589 HostPortPair("req5", 80), NetworkIsolationKey(), NetLogWithSource(),
1590 low_priority, request_context_.get(), host_cache_.get())));
Eric Orth117e1992019-04-17 00:24:151591 responses.emplace_back(
1592 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551593 HostPortPair("req6", 80), NetworkIsolationKey(), NetLogWithSource(),
1594 low_priority, request_context_.get(), host_cache_.get())));
Eric Orth117e1992019-04-17 00:24:151595 responses.emplace_back(
1596 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551597 HostPortPair("req5", 80), NetworkIsolationKey(), NetLogWithSource(),
1598 highest_priority, request_context_.get(), host_cache_.get())));
Eric Orth00fe5a62018-08-15 22:20:001599
1600 for (const auto& response : responses) {
1601 ASSERT_FALSE(response->complete());
1602 }
1603
1604 // Unblock the resolver thread so the requests can run.
1605 proc_->SignalMultiple(responses.size()); // More than needed.
1606
1607 // Wait for all the requests to complete successfully.
1608 for (auto& response : responses) {
1609 EXPECT_THAT(response->result_error(), IsOk());
1610 }
1611
1612 // Since we have restricted to a single concurrent thread in the jobpool,
1613 // the requests should complete in order of priority (with the exception
1614 // of the first request, which gets started right away, since there is
1615 // nothing outstanding).
1616 MockHostResolverProc::CaptureList capture_list = proc_->GetCaptureList();
1617 ASSERT_EQ(7u, capture_list.size());
1618
1619 EXPECT_EQ("req0", capture_list[0].hostname);
1620 EXPECT_EQ("req4", capture_list[1].hostname);
1621 EXPECT_EQ("req5", capture_list[2].hostname);
1622 EXPECT_EQ("req1", capture_list[3].hostname);
1623 EXPECT_EQ("req2", capture_list[4].hostname);
1624 EXPECT_EQ("req3", capture_list[5].hostname);
1625 EXPECT_EQ("req6", capture_list[6].hostname);
1626}
1627
juliatuttlec53b19a72016-05-05 13:51:311628// Test that changing a job's priority affects the dequeueing order.
Eric Orth960e7062019-03-08 18:43:541629TEST_F(HostResolverManagerTest, ChangePriority) {
juliatuttlec53b19a72016-05-05 13:51:311630 CreateSerialResolver();
1631
Eric Orth26fa08e2019-02-22 01:28:371632 HostResolver::ResolveHostParameters lowest_priority;
1633 lowest_priority.initial_priority = LOWEST;
1634 HostResolver::ResolveHostParameters low_priority;
1635 low_priority.initial_priority = LOW;
1636 HostResolver::ResolveHostParameters medium_priority;
1637 medium_priority.initial_priority = MEDIUM;
juliatuttlec53b19a72016-05-05 13:51:311638
Eric Orth26fa08e2019-02-22 01:28:371639 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:151640 responses.emplace_back(
1641 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551642 HostPortPair("req0", 80), NetworkIsolationKey(), NetLogWithSource(),
1643 medium_priority, request_context_.get(), host_cache_.get())));
Eric Orth117e1992019-04-17 00:24:151644 responses.emplace_back(
1645 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551646 HostPortPair("req1", 80), NetworkIsolationKey(), NetLogWithSource(),
1647 low_priority, request_context_.get(), host_cache_.get())));
Eric Orth117e1992019-04-17 00:24:151648 responses.emplace_back(
1649 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551650 HostPortPair("req2", 80), NetworkIsolationKey(), NetLogWithSource(),
1651 lowest_priority, request_context_.get(), host_cache_.get())));
juliatuttlec53b19a72016-05-05 13:51:311652
1653 // req0 starts immediately; without ChangePriority, req1 and then req2 should
1654 // run.
Eric Orth26fa08e2019-02-22 01:28:371655 for (const auto& response : responses) {
1656 ASSERT_FALSE(response->complete());
1657 }
juliatuttlec53b19a72016-05-05 13:51:311658
Eric Orth26fa08e2019-02-22 01:28:371659 // Changing req2 to HIGHEST should make it run before req1.
juliatuttlec53b19a72016-05-05 13:51:311660 // (It can't run before req0, since req0 started immediately.)
Eric Orth26fa08e2019-02-22 01:28:371661 responses[2]->request()->ChangeRequestPriority(HIGHEST);
juliatuttlec53b19a72016-05-05 13:51:311662
1663 // Let all 3 requests finish.
1664 proc_->SignalMultiple(3u);
1665
Eric Orth26fa08e2019-02-22 01:28:371666 for (auto& response : responses) {
1667 EXPECT_THAT(response->result_error(), IsOk());
1668 }
juliatuttlec53b19a72016-05-05 13:51:311669
1670 MockHostResolverProc::CaptureList capture_list = proc_->GetCaptureList();
1671 ASSERT_EQ(3u, capture_list.size());
1672
1673 EXPECT_EQ("req0", capture_list[0].hostname);
1674 EXPECT_EQ("req2", capture_list[1].hostname);
1675 EXPECT_EQ("req1", capture_list[2].hostname);
1676}
1677
[email protected]38b50d92012-04-19 21:07:521678// Try cancelling a job which has not started yet.
Eric Orth960e7062019-03-08 18:43:541679TEST_F(HostResolverManagerTest, CancelPendingRequest) {
[email protected]38b50d92012-04-19 21:07:521680 CreateSerialResolver();
[email protected]68ad3ee2010-01-30 03:45:391681
Eric Orth00fe5a62018-08-15 22:20:001682 HostResolver::ResolveHostParameters lowest_priority;
1683 lowest_priority.initial_priority = LOWEST;
1684 HostResolver::ResolveHostParameters low_priority;
1685 low_priority.initial_priority = LOW;
1686 HostResolver::ResolveHostParameters medium_priority;
1687 medium_priority.initial_priority = MEDIUM;
1688 HostResolver::ResolveHostParameters highest_priority;
1689 highest_priority.initial_priority = HIGHEST;
1690
Eric Orth70992982018-07-24 00:25:001691 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:151692 responses.emplace_back(
1693 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551694 HostPortPair("req0", 80), NetworkIsolationKey(), NetLogWithSource(),
1695 lowest_priority, request_context_.get(), host_cache_.get())));
Eric Orth117e1992019-04-17 00:24:151696 responses.emplace_back(
1697 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551698 HostPortPair("req1", 80), NetworkIsolationKey(), NetLogWithSource(),
1699 highest_priority, request_context_.get(), host_cache_.get())));
Eric Orth117e1992019-04-17 00:24:151700 responses.emplace_back(
1701 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551702 HostPortPair("req2", 80), NetworkIsolationKey(), NetLogWithSource(),
1703 medium_priority, request_context_.get(), host_cache_.get())));
Eric Orth117e1992019-04-17 00:24:151704 responses.emplace_back(
1705 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551706 HostPortPair("req3", 80), NetworkIsolationKey(), NetLogWithSource(),
1707 low_priority, request_context_.get(), host_cache_.get())));
Eric Orth117e1992019-04-17 00:24:151708 responses.emplace_back(
1709 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551710 HostPortPair("req4", 80), NetworkIsolationKey(), NetLogWithSource(),
1711 highest_priority, request_context_.get(), host_cache_.get())));
Eric Orth117e1992019-04-17 00:24:151712 responses.emplace_back(
1713 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551714 HostPortPair("req5", 80), NetworkIsolationKey(), NetLogWithSource(),
1715 lowest_priority, request_context_.get(), host_cache_.get())));
Eric Orth117e1992019-04-17 00:24:151716 responses.emplace_back(
1717 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551718 HostPortPair("req6", 80), NetworkIsolationKey(), NetLogWithSource(),
1719 medium_priority, request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:001720
1721 // Cancel some requests
1722 responses[1]->CancelRequest();
1723 responses[4]->CancelRequest();
1724 responses[5]->CancelRequest();
1725
1726 // Unblock the resolver thread so the requests can run.
1727 proc_->SignalMultiple(responses.size()); // More than needed.
1728
1729 // Let everything try to finish.
1730 base::RunLoop().RunUntilIdle();
1731
1732 // Wait for all the requests to complete succesfully.
1733 EXPECT_THAT(responses[0]->result_error(), IsOk());
1734 EXPECT_THAT(responses[2]->result_error(), IsOk());
1735 EXPECT_THAT(responses[3]->result_error(), IsOk());
1736 EXPECT_THAT(responses[6]->result_error(), IsOk());
1737
1738 // Cancelled requests shouldn't complete.
1739 EXPECT_FALSE(responses[1]->complete());
1740 EXPECT_FALSE(responses[4]->complete());
1741 EXPECT_FALSE(responses[5]->complete());
1742
1743 // Verify that they called out the the resolver proc (which runs on the
1744 // resolver thread) in the expected order.
1745 MockHostResolverProc::CaptureList capture_list = proc_->GetCaptureList();
1746 ASSERT_EQ(4u, capture_list.size());
1747
1748 EXPECT_EQ("req0", capture_list[0].hostname);
1749 EXPECT_EQ("req2", capture_list[1].hostname);
Eric Orth00fe5a62018-08-15 22:20:001750 EXPECT_EQ("req6", capture_list[2].hostname);
1751 EXPECT_EQ("req3", capture_list[3].hostname);
Eric Orth70992982018-07-24 00:25:001752}
1753
[email protected]68ad3ee2010-01-30 03:45:391754// Test that when too many requests are enqueued, old ones start to be aborted.
Eric Orth960e7062019-03-08 18:43:541755TEST_F(HostResolverManagerTest, QueueOverflow) {
[email protected]38b50d92012-04-19 21:07:521756 CreateSerialResolver();
[email protected]68ad3ee2010-01-30 03:45:391757
[email protected]0f292de02012-02-01 22:28:201758 // Allow only 3 queued jobs.
1759 const size_t kMaxPendingJobs = 3u;
Eric Orth70992982018-07-24 00:25:001760 resolver_->SetMaxQueuedJobsForTesting(kMaxPendingJobs);
[email protected]68ad3ee2010-01-30 03:45:391761
Eric Orth00fe5a62018-08-15 22:20:001762 HostResolver::ResolveHostParameters lowest_priority;
1763 lowest_priority.initial_priority = LOWEST;
1764 HostResolver::ResolveHostParameters low_priority;
1765 low_priority.initial_priority = LOW;
1766 HostResolver::ResolveHostParameters medium_priority;
1767 medium_priority.initial_priority = MEDIUM;
1768 HostResolver::ResolveHostParameters highest_priority;
1769 highest_priority.initial_priority = HIGHEST;
1770
Eric Orth70992982018-07-24 00:25:001771 // Note that at this point the MockHostResolverProc is blocked, so any
1772 // requests we make will not complete.
1773
1774 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:151775 responses.emplace_back(
1776 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551777 HostPortPair("req0", 80), NetworkIsolationKey(), NetLogWithSource(),
1778 lowest_priority, request_context_.get(), host_cache_.get())));
Eric Orth117e1992019-04-17 00:24:151779 responses.emplace_back(
1780 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551781 HostPortPair("req1", 80), NetworkIsolationKey(), NetLogWithSource(),
1782 highest_priority, request_context_.get(), host_cache_.get())));
Eric Orth117e1992019-04-17 00:24:151783 responses.emplace_back(
1784 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551785 HostPortPair("req2", 80), NetworkIsolationKey(), NetLogWithSource(),
1786 medium_priority, request_context_.get(), host_cache_.get())));
Eric Orth117e1992019-04-17 00:24:151787 responses.emplace_back(
1788 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551789 HostPortPair("req3", 80), NetworkIsolationKey(), NetLogWithSource(),
1790 medium_priority, request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:001791
1792 // At this point, there are 3 enqueued jobs (and one "running" job).
1793 // Insertion of subsequent requests will cause evictions.
1794
Eric Orth117e1992019-04-17 00:24:151795 responses.emplace_back(
1796 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551797 HostPortPair("req4", 80), NetworkIsolationKey(), NetLogWithSource(),
1798 low_priority, request_context_.get(), host_cache_.get())));
Eric Orth00fe5a62018-08-15 22:20:001799 EXPECT_THAT(responses[4]->result_error(),
1800 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE)); // Evicts self.
1801 EXPECT_FALSE(responses[4]->request()->GetAddressResults());
Eric Orth70992982018-07-24 00:25:001802
Eric Orth117e1992019-04-17 00:24:151803 responses.emplace_back(
1804 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551805 HostPortPair("req5", 80), NetworkIsolationKey(), NetLogWithSource(),
1806 medium_priority, request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:001807 EXPECT_THAT(responses[2]->result_error(),
1808 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
1809 EXPECT_FALSE(responses[2]->request()->GetAddressResults());
1810
Eric Orth117e1992019-04-17 00:24:151811 responses.emplace_back(
1812 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551813 HostPortPair("req6", 80), NetworkIsolationKey(), NetLogWithSource(),
1814 highest_priority, request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:001815 EXPECT_THAT(responses[3]->result_error(),
1816 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
1817 EXPECT_FALSE(responses[3]->request()->GetAddressResults());
1818
Eric Orth117e1992019-04-17 00:24:151819 responses.emplace_back(
1820 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551821 HostPortPair("req7", 80), NetworkIsolationKey(), NetLogWithSource(),
1822 medium_priority, request_context_.get(), host_cache_.get())));
Eric Orth00fe5a62018-08-15 22:20:001823 EXPECT_THAT(responses[5]->result_error(),
Eric Orth70992982018-07-24 00:25:001824 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
Eric Orth00fe5a62018-08-15 22:20:001825 EXPECT_FALSE(responses[5]->request()->GetAddressResults());
Eric Orth70992982018-07-24 00:25:001826
1827 // Unblock the resolver thread so the requests can run.
1828 proc_->SignalMultiple(4u);
1829
1830 // The rest should succeed.
1831 EXPECT_THAT(responses[0]->result_error(), IsOk());
1832 EXPECT_TRUE(responses[0]->request()->GetAddressResults());
Eric Orth00fe5a62018-08-15 22:20:001833 EXPECT_THAT(responses[1]->result_error(), IsOk());
1834 EXPECT_TRUE(responses[1]->request()->GetAddressResults());
Eric Orth70992982018-07-24 00:25:001835 EXPECT_THAT(responses[6]->result_error(), IsOk());
1836 EXPECT_TRUE(responses[6]->request()->GetAddressResults());
1837 EXPECT_THAT(responses[7]->result_error(), IsOk());
1838 EXPECT_TRUE(responses[7]->request()->GetAddressResults());
1839
1840 // Verify that they called out the the resolver proc (which runs on the
1841 // resolver thread) in the expected order.
1842 MockHostResolverProc::CaptureList capture_list = proc_->GetCaptureList();
1843 ASSERT_EQ(4u, capture_list.size());
1844
1845 EXPECT_EQ("req0", capture_list[0].hostname);
Eric Orth00fe5a62018-08-15 22:20:001846 EXPECT_EQ("req1", capture_list[1].hostname);
Eric Orth70992982018-07-24 00:25:001847 EXPECT_EQ("req6", capture_list[2].hostname);
1848 EXPECT_EQ("req7", capture_list[3].hostname);
1849
1850 // Verify that the evicted (incomplete) requests were not cached.
Eric Orth37b18192019-04-22 19:09:281851 EXPECT_EQ(4u, host_cache_->size());
Eric Orth70992982018-07-24 00:25:001852
1853 for (size_t i = 0; i < responses.size(); ++i) {
1854 EXPECT_TRUE(responses[i]->complete()) << i;
1855 }
1856}
1857
1858// Tests that jobs can self-evict by setting the max queue to 0.
Eric Orth960e7062019-03-08 18:43:541859TEST_F(HostResolverManagerTest, QueueOverflow_SelfEvict) {
Eric Orth70992982018-07-24 00:25:001860 CreateSerialResolver();
1861 resolver_->SetMaxQueuedJobsForTesting(0);
1862
1863 // Note that at this point the MockHostResolverProc is blocked, so any
1864 // requests we make will not complete.
1865
Eric Orth117e1992019-04-17 00:24:151866 ResolveHostResponseHelper run_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551867 HostPortPair("run", 80), NetworkIsolationKey(), NetLogWithSource(),
1868 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:001869
Eric Orth117e1992019-04-17 00:24:151870 ResolveHostResponseHelper evict_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551871 HostPortPair("req1", 80), NetworkIsolationKey(), NetLogWithSource(),
1872 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:001873 EXPECT_THAT(evict_response.result_error(),
1874 IsError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE));
1875 EXPECT_FALSE(evict_response.request()->GetAddressResults());
1876
1877 proc_->SignalMultiple(1u);
1878
1879 EXPECT_THAT(run_response.result_error(), IsOk());
1880 EXPECT_TRUE(run_response.request()->GetAddressResults());
1881}
1882
Eric Orth00fe5a62018-08-15 22:20:001883// Make sure that the dns query type parameter is respected when raw IPs are
1884// passed in.
Eric Orth960e7062019-03-08 18:43:541885TEST_F(HostResolverManagerTest, AddressFamilyWithRawIPs) {
Eric Orth00fe5a62018-08-15 22:20:001886 HostResolver::ResolveHostParameters v4_parameters;
Eric Orth192e3bb2018-11-14 19:30:321887 v4_parameters.dns_query_type = DnsQueryType::A;
Eric Orth00fe5a62018-08-15 22:20:001888
1889 HostResolver::ResolveHostParameters v6_parameters;
Eric Orth192e3bb2018-11-14 19:30:321890 v6_parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth00fe5a62018-08-15 22:20:001891
1892 ResolveHostResponseHelper v4_v4_request(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551893 HostPortPair("127.0.0.1", 80), NetworkIsolationKey(), NetLogWithSource(),
1894 v4_parameters, request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:001895 EXPECT_THAT(v4_v4_request.result_error(), IsOk());
1896 EXPECT_THAT(v4_v4_request.request()->GetAddressResults().value().endpoints(),
1897 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
1898
1899 ResolveHostResponseHelper v4_v6_request(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551900 HostPortPair("127.0.0.1", 80), NetworkIsolationKey(), NetLogWithSource(),
1901 v6_parameters, request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:001902 EXPECT_THAT(v4_v6_request.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
1903
1904 ResolveHostResponseHelper v4_unsp_request(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551905 HostPortPair("127.0.0.1", 80), NetworkIsolationKey(), NetLogWithSource(),
1906 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:001907 EXPECT_THAT(v4_unsp_request.result_error(), IsOk());
1908 EXPECT_THAT(
1909 v4_unsp_request.request()->GetAddressResults().value().endpoints(),
1910 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
1911
Eric Orth117e1992019-04-17 00:24:151912 ResolveHostResponseHelper v6_v4_request(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551913 HostPortPair("::1", 80), NetworkIsolationKey(), NetLogWithSource(),
1914 v4_parameters, request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:001915 EXPECT_THAT(v6_v4_request.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
1916
Eric Orth117e1992019-04-17 00:24:151917 ResolveHostResponseHelper v6_v6_request(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551918 HostPortPair("::1", 80), NetworkIsolationKey(), NetLogWithSource(),
1919 v6_parameters, request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:001920 EXPECT_THAT(v6_v6_request.result_error(), IsOk());
1921 EXPECT_THAT(v6_v6_request.request()->GetAddressResults().value().endpoints(),
1922 testing::ElementsAre(CreateExpected("::1", 80)));
1923
Eric Orth117e1992019-04-17 00:24:151924 ResolveHostResponseHelper v6_unsp_request(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551925 HostPortPair("::1", 80), NetworkIsolationKey(), NetLogWithSource(),
1926 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:001927 EXPECT_THAT(v6_unsp_request.result_error(), IsOk());
1928 EXPECT_THAT(
1929 v6_unsp_request.request()->GetAddressResults().value().endpoints(),
1930 testing::ElementsAre(CreateExpected("::1", 80)));
1931}
1932
Eric Orth960e7062019-03-08 18:43:541933TEST_F(HostResolverManagerTest, LocalOnly_FromCache) {
Eric Ortheb332862019-01-26 00:52:381934 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42");
1935 proc_->SignalMultiple(1u); // Need only one.
1936
1937 HostResolver::ResolveHostParameters source_none_parameters;
1938 source_none_parameters.source = HostResolverSource::LOCAL_ONLY;
1939
1940 // First NONE query expected to complete synchronously with a cache miss.
Eric Orth6f1c5172019-04-16 17:08:271941 ResolveHostResponseHelper cache_miss_request(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551942 HostPortPair("just.testing", 80), NetworkIsolationKey(),
1943 NetLogWithSource(), source_none_parameters, request_context_.get(),
1944 host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:381945 EXPECT_TRUE(cache_miss_request.complete());
1946 EXPECT_THAT(cache_miss_request.result_error(), IsError(ERR_DNS_CACHE_MISS));
1947 EXPECT_FALSE(cache_miss_request.request()->GetAddressResults());
1948 EXPECT_FALSE(cache_miss_request.request()->GetStaleInfo());
1949
1950 // Normal query to populate the cache.
1951 ResolveHostResponseHelper normal_request(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551952 HostPortPair("just.testing", 80), NetworkIsolationKey(),
1953 NetLogWithSource(), base::nullopt, request_context_.get(),
1954 host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:381955 EXPECT_THAT(normal_request.result_error(), IsOk());
1956 EXPECT_FALSE(normal_request.request()->GetStaleInfo());
1957
1958 // Second NONE query expected to complete synchronously with cache hit.
Eric Orth6f1c5172019-04-16 17:08:271959 ResolveHostResponseHelper cache_hit_request(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551960 HostPortPair("just.testing", 80), NetworkIsolationKey(),
1961 NetLogWithSource(), source_none_parameters, request_context_.get(),
1962 host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:381963 EXPECT_TRUE(cache_hit_request.complete());
1964 EXPECT_THAT(cache_hit_request.result_error(), IsOk());
1965 EXPECT_THAT(
1966 cache_hit_request.request()->GetAddressResults().value().endpoints(),
1967 testing::ElementsAre(CreateExpected("192.168.1.42", 80)));
1968 EXPECT_FALSE(cache_hit_request.request()->GetStaleInfo().value().is_stale());
1969}
1970
Eric Orth960e7062019-03-08 18:43:541971TEST_F(HostResolverManagerTest, LocalOnly_StaleEntry) {
Eric Ortheb332862019-01-26 00:52:381972 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42");
1973 proc_->SignalMultiple(1u); // Need only one.
1974
1975 HostResolver::ResolveHostParameters source_none_parameters;
1976 source_none_parameters.source = HostResolverSource::LOCAL_ONLY;
1977
1978 // First NONE query expected to complete synchronously with a cache miss.
Eric Orth6f1c5172019-04-16 17:08:271979 ResolveHostResponseHelper cache_miss_request(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551980 HostPortPair("just.testing", 80), NetworkIsolationKey(),
1981 NetLogWithSource(), source_none_parameters, request_context_.get(),
1982 host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:381983 EXPECT_TRUE(cache_miss_request.complete());
1984 EXPECT_THAT(cache_miss_request.result_error(), IsError(ERR_DNS_CACHE_MISS));
1985 EXPECT_FALSE(cache_miss_request.request()->GetAddressResults());
1986 EXPECT_FALSE(cache_miss_request.request()->GetStaleInfo());
1987
1988 // Normal query to populate the cache.
1989 ResolveHostResponseHelper normal_request(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:551990 HostPortPair("just.testing", 80), NetworkIsolationKey(),
1991 NetLogWithSource(), base::nullopt, request_context_.get(),
1992 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(
Matt Menkef4023312019-11-01 18:24:552000 HostPortPair("just.testing", 80), NetworkIsolationKey(),
2001 NetLogWithSource(), source_none_parameters, request_context_.get(),
2002 host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:382003 EXPECT_TRUE(stale_request.complete());
2004 EXPECT_THAT(stale_request.result_error(), IsError(ERR_DNS_CACHE_MISS));
2005 EXPECT_FALSE(stale_request.request()->GetAddressResults());
2006 EXPECT_FALSE(stale_request.request()->GetStaleInfo());
2007}
2008
Eric Orth960e7062019-03-08 18:43:542009TEST_F(HostResolverManagerTest, LocalOnly_FromIp) {
Eric Ortheb332862019-01-26 00:52:382010 HostResolver::ResolveHostParameters source_none_parameters;
2011 source_none_parameters.source = HostResolverSource::LOCAL_ONLY;
2012
Eric Orth117e1992019-04-17 00:24:152013 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552014 HostPortPair("1.2.3.4", 56), NetworkIsolationKey(), NetLogWithSource(),
2015 source_none_parameters, request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:382016
2017 // Expected to resolve synchronously.
2018 EXPECT_TRUE(response.complete());
2019 EXPECT_THAT(response.result_error(), IsOk());
2020 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
2021 testing::ElementsAre(CreateExpected("1.2.3.4", 56)));
2022 EXPECT_FALSE(response.request()->GetStaleInfo());
2023}
2024
Eric Orth960e7062019-03-08 18:43:542025TEST_F(HostResolverManagerTest, LocalOnly_InvalidName) {
Eric Ortheb332862019-01-26 00:52:382026 proc_->AddRuleForAllFamilies("foo,bar.com", "192.168.1.42");
2027
2028 HostResolver::ResolveHostParameters source_none_parameters;
2029 source_none_parameters.source = HostResolverSource::LOCAL_ONLY;
2030
Eric Orth6f1c5172019-04-16 17:08:272031 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552032 HostPortPair("foo,bar.com", 57), NetworkIsolationKey(),
2033 NetLogWithSource(), source_none_parameters, request_context_.get(),
2034 host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:382035
2036 // Expected to fail synchronously.
2037 EXPECT_TRUE(response.complete());
2038 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
2039 EXPECT_FALSE(response.request()->GetAddressResults());
2040 EXPECT_FALSE(response.request()->GetStaleInfo());
2041}
2042
Eric Orth960e7062019-03-08 18:43:542043TEST_F(HostResolverManagerTest, LocalOnly_InvalidLocalhost) {
Eric Ortheb332862019-01-26 00:52:382044 HostResolver::ResolveHostParameters source_none_parameters;
2045 source_none_parameters.source = HostResolverSource::LOCAL_ONLY;
2046
Eric Orth6f1c5172019-04-16 17:08:272047 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552048 HostPortPair("foo,bar.localhost", 58), NetworkIsolationKey(),
2049 NetLogWithSource(), source_none_parameters, request_context_.get(),
2050 host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:382051
2052 // Expected to fail synchronously.
2053 EXPECT_TRUE(response.complete());
2054 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
2055 EXPECT_FALSE(response.request()->GetAddressResults());
2056 EXPECT_FALSE(response.request()->GetStaleInfo());
2057}
2058
Eric Orth960e7062019-03-08 18:43:542059TEST_F(HostResolverManagerTest, StaleAllowed) {
Eric Ortheb332862019-01-26 00:52:382060 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42");
2061 proc_->SignalMultiple(1u); // Need only one.
2062
2063 HostResolver::ResolveHostParameters stale_allowed_parameters;
2064 stale_allowed_parameters.source = HostResolverSource::LOCAL_ONLY;
2065 stale_allowed_parameters.cache_usage =
2066 HostResolver::ResolveHostParameters::CacheUsage::STALE_ALLOWED;
2067
2068 // First query expected to complete synchronously as a cache miss.
Eric Orth6f1c5172019-04-16 17:08:272069 ResolveHostResponseHelper cache_miss_request(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552070 HostPortPair("just.testing", 80), NetworkIsolationKey(),
2071 NetLogWithSource(), stale_allowed_parameters, request_context_.get(),
2072 host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:382073 EXPECT_TRUE(cache_miss_request.complete());
2074 EXPECT_THAT(cache_miss_request.result_error(), IsError(ERR_DNS_CACHE_MISS));
2075 EXPECT_FALSE(cache_miss_request.request()->GetAddressResults());
2076 EXPECT_FALSE(cache_miss_request.request()->GetStaleInfo());
2077
2078 // Normal query to populate cache
2079 ResolveHostResponseHelper normal_request(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552080 HostPortPair("just.testing", 80), NetworkIsolationKey(),
2081 NetLogWithSource(), base::nullopt, request_context_.get(),
2082 host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:382083 EXPECT_THAT(normal_request.result_error(), IsOk());
2084 EXPECT_FALSE(normal_request.request()->GetStaleInfo());
2085
2086 MakeCacheStale();
2087
2088 // Second NONE query expected to get a stale cache hit.
Eric Orth6f1c5172019-04-16 17:08:272089 ResolveHostResponseHelper stale_request(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552090 HostPortPair("just.testing", 84), NetworkIsolationKey(),
2091 NetLogWithSource(), stale_allowed_parameters, request_context_.get(),
2092 host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:382093 EXPECT_TRUE(stale_request.complete());
2094 EXPECT_THAT(stale_request.result_error(), IsOk());
2095 EXPECT_THAT(stale_request.request()->GetAddressResults().value().endpoints(),
2096 testing::ElementsAre(CreateExpected("192.168.1.42", 84)));
2097 EXPECT_TRUE(stale_request.request()->GetStaleInfo().value().is_stale());
2098}
2099
Eric Orth960e7062019-03-08 18:43:542100TEST_F(HostResolverManagerTest, StaleAllowed_NonLocal) {
Eric Ortheb332862019-01-26 00:52:382101 proc_->AddRuleForAllFamilies("just.testing", "192.168.2.42");
2102 proc_->SignalMultiple(1u); // Need only one.
2103
2104 HostResolver::ResolveHostParameters stale_allowed_parameters;
2105 stale_allowed_parameters.cache_usage =
2106 HostResolver::ResolveHostParameters::CacheUsage::STALE_ALLOWED;
2107
2108 // Normal non-local resolves should still work normally with the STALE_ALLOWED
2109 // parameter, and there should be no stale info.
Eric Orth6f1c5172019-04-16 17:08:272110 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552111 HostPortPair("just.testing", 85), NetworkIsolationKey(),
2112 NetLogWithSource(), stale_allowed_parameters, request_context_.get(),
2113 host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:382114 EXPECT_THAT(response.result_error(), IsOk());
2115 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
2116 testing::ElementsAre(CreateExpected("192.168.2.42", 85)));
2117 EXPECT_FALSE(response.request()->GetStaleInfo());
2118}
2119
Eric Orth960e7062019-03-08 18:43:542120TEST_F(HostResolverManagerTest, StaleAllowed_FromIp) {
Eric Ortheb332862019-01-26 00:52:382121 HostResolver::ResolveHostParameters stale_allowed_parameters;
2122 stale_allowed_parameters.cache_usage =
2123 HostResolver::ResolveHostParameters::CacheUsage::STALE_ALLOWED;
2124
Eric Orth6f1c5172019-04-16 17:08:272125 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552126 HostPortPair("1.2.3.4", 57), NetworkIsolationKey(), NetLogWithSource(),
2127 stale_allowed_parameters, request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:382128
2129 // Expected to resolve synchronously without stale info.
2130 EXPECT_TRUE(response.complete());
2131 EXPECT_THAT(response.result_error(), IsOk());
2132 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
2133 testing::ElementsAre(CreateExpected("1.2.3.4", 57)));
2134 EXPECT_FALSE(response.request()->GetStaleInfo());
2135}
2136
Miriam Gershensone3bc63022017-10-09 19:57:052137// TODO(mgersh): add a test case for errors with positive TTL after
2138// https://crbug.com/115051 is fixed.
2139
[email protected]189163e2011-05-11 01:48:542140// Test the retry attempts simulating host resolver proc that takes too long.
Eric Orth960e7062019-03-08 18:43:542141TEST_F(HostResolverManagerTest, MultipleAttempts) {
[email protected]189163e2011-05-11 01:48:542142 // Total number of attempts would be 3 and we want the 3rd attempt to resolve
Eric Orth9a037562018-07-03 21:24:382143 // the host. First and second attempt will be forced to wait until they get
[email protected]189163e2011-05-11 01:48:542144 // word that a resolution has completed. The 3rd resolution attempt will try
Eric Orth9a037562018-07-03 21:24:382145 // to get done ASAP, and won't wait.
[email protected]189163e2011-05-11 01:48:542146 int kAttemptNumberToResolve = 3;
2147 int kTotalAttempts = 3;
2148
Eric Orth9a037562018-07-03 21:24:382149 // Add a little bit of extra fudge to the delay to allow reasonable
2150 // flexibility for time > vs >= etc. We don't need to fail the test if we
2151 // retry at t=6001 instead of t=6000.
2152 base::TimeDelta kSleepFudgeFactor = base::TimeDelta::FromMilliseconds(1);
2153
[email protected]189163e2011-05-11 01:48:542154 scoped_refptr<LookupAttemptHostResolverProc> resolver_proc(
Raul Tambre94493c652019-03-11 17:18:352155 new LookupAttemptHostResolverProc(nullptr, kAttemptNumberToResolve,
Eric Orth70992982018-07-24 00:25:002156 kTotalAttempts));
2157
Eric Orth59066222019-03-07 23:52:272158 ProcTaskParams params = DefaultParams(resolver_proc.get());
Eric Orth70992982018-07-24 00:25:002159 base::TimeDelta unresponsive_delay = params.unresponsive_delay;
2160 int retry_factor = params.retry_factor;
2161
Eric Orth607b6d82019-05-08 16:43:322162 CreateResolverWithLimitsAndParams(kMaxJobs, params, true /* ipv6_reachable */,
2163 true /* check_ipv6_on_wifi */);
Eric Orth70992982018-07-24 00:25:002164
2165 // Override the current thread task runner, so we can simulate the passage of
2166 // time and avoid any actual sleeps.
2167 auto test_task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
2168 base::ScopedClosureRunner task_runner_override_scoped_cleanup =
2169 base::ThreadTaskRunnerHandle::OverrideForTesting(test_task_runner);
2170
2171 // Resolve "host1".
Eric Orth117e1992019-04-17 00:24:152172 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552173 HostPortPair("host1", 70), NetworkIsolationKey(), NetLogWithSource(),
2174 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:002175 EXPECT_FALSE(response.complete());
2176
2177 resolver_proc->WaitForNAttemptsToBeBlocked(1);
2178 EXPECT_FALSE(response.complete());
2179
2180 test_task_runner->FastForwardBy(unresponsive_delay + kSleepFudgeFactor);
2181 resolver_proc->WaitForNAttemptsToBeBlocked(2);
2182 EXPECT_FALSE(response.complete());
2183
2184 test_task_runner->FastForwardBy(unresponsive_delay * retry_factor +
2185 kSleepFudgeFactor);
2186
2187 resolver_proc->WaitForAllAttemptsToFinish();
2188 test_task_runner->RunUntilIdle();
2189
2190 // Resolve returns -4 to indicate that 3rd attempt has resolved the host.
2191 // Since we're using a TestMockTimeTaskRunner, the RunLoop stuff in
2192 // result_error() will fail if it actually has to wait, but unless there's an
2193 // error, the result should be immediately ready by this point.
2194 EXPECT_EQ(-4, response.result_error());
2195
2196 // We should be done with retries, but make sure none erroneously happen.
2197 test_task_runner->FastForwardUntilNoTasksRemain();
2198
Eric Roman21b39232019-06-28 21:28:212199 EXPECT_EQ(resolver_proc->GetTotalAttemptsResolved(), kTotalAttempts);
2200}
2201
2202// Regression test for https://crbug.com/976948.
2203//
2204// Tests that when the maximum number of retries is set to
2205// |HostResolver::ManagerOptions::kDefaultRetryAttempts| the
2206// number of retries used is 4 rather than something higher.
2207TEST_F(HostResolverManagerTest, DefaultMaxRetryAttempts) {
2208 auto test_task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
2209 base::ScopedClosureRunner task_runner_override_scoped_cleanup =
2210 base::ThreadTaskRunnerHandle::OverrideForTesting(test_task_runner);
2211
2212 // Instantiate a ResolverProc that will block all incoming requests.
2213 auto resolver_proc = base::MakeRefCounted<LookupAttemptHostResolverProc>(
2214 nullptr, std::numeric_limits<size_t>::max(),
2215 std::numeric_limits<size_t>::max());
2216
2217 // This corresponds to kDefaultMaxRetryAttempts in
2218 // ProcTaskParams::ProcTaskParams(). The correspondence is verified below,
2219 // since that symbol is not exported.
2220 const size_t expected_max_retries = 4;
2221
2222 // Use the special value |ManagerOptions::kDefaultRetryAttempts|, which is
2223 // expected to translate into |expected_num_retries|.
2224 ASSERT_NE(HostResolver::ManagerOptions::kDefaultRetryAttempts,
2225 expected_max_retries);
2226 ProcTaskParams params(resolver_proc.get(),
2227 HostResolver::ManagerOptions::kDefaultRetryAttempts);
2228 ASSERT_EQ(params.max_retry_attempts, expected_max_retries);
2229
2230 CreateResolverWithLimitsAndParams(kMaxJobs, params,
2231 false /* ipv6_reachable */,
2232 false /* check_ipv6_on_wifi */);
2233
2234 // Resolve "host1". The resolver proc will hang all requests so this
2235 // resolution should remain stalled until calling SetResolvedAttemptNumber().
2236 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552237 HostPortPair("host1", 70), NetworkIsolationKey(), NetLogWithSource(),
2238 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Roman21b39232019-06-28 21:28:212239 EXPECT_FALSE(response.complete());
2240
2241 // Simulate running the main thread (network task runner) for a long
2242 // time. Because none of the attempts posted to worker pool can complete, this
2243 // should cause all of the retry attempts to get posted, according to the
2244 // exponential backoff schedule.
2245 test_task_runner->FastForwardBy(base::TimeDelta::FromMinutes(20));
2246
2247 // Unblock the resolver proc, then wait for all the worker pool and main
2248 // thread tasks to complete. Note that the call to SetResolvedAttemptNumber(1)
2249 // will cause all the blocked resolver procs tasks fail with -2.
2250 resolver_proc->SetResolvedAttemptNumber(1);
2251 const int kExpectedError = -2;
2252 base::ThreadPoolInstance::Get()->FlushForTesting();
2253 test_task_runner->RunUntilIdle();
2254
2255 ASSERT_TRUE(response.complete());
2256 EXPECT_EQ(kExpectedError, response.result_error());
2257
2258 // Ensure that the original attempt was executed on the worker pool, as well
2259 // as the maximum number of allowed retries, and no more.
2260 EXPECT_EQ(static_cast<int>(expected_max_retries + 1),
2261 resolver_proc->GetTotalAttemptsResolved());
Eric Orth70992982018-07-24 00:25:002262}
2263
eroman91dd3602015-03-26 03:46:332264// If a host resolves to a list that includes 127.0.53.53, this is treated as
2265// an error. 127.0.53.53 is a localhost address, however it has been given a
eroman1efc237c2016-12-14 00:00:452266// special significance by ICANN to help surface name collision resulting from
eroman91dd3602015-03-26 03:46:332267// the new gTLDs.
Eric Orth960e7062019-03-08 18:43:542268TEST_F(HostResolverManagerTest, NameCollisionIcann) {
eroman91dd3602015-03-26 03:46:332269 proc_->AddRuleForAllFamilies("single", "127.0.53.53");
2270 proc_->AddRuleForAllFamilies("multiple", "127.0.0.1,127.0.53.53");
2271 proc_->AddRuleForAllFamilies("ipv6", "::127.0.53.53");
2272 proc_->AddRuleForAllFamilies("not_reserved1", "53.53.0.127");
2273 proc_->AddRuleForAllFamilies("not_reserved2", "127.0.53.54");
2274 proc_->AddRuleForAllFamilies("not_reserved3", "10.0.53.53");
2275 proc_->SignalMultiple(6u);
2276
Eric Orth117e1992019-04-17 00:24:152277 ResolveHostResponseHelper single_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552278 HostPortPair("single", 80), NetworkIsolationKey(), NetLogWithSource(),
2279 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:002280 EXPECT_THAT(single_response.result_error(),
2281 IsError(ERR_ICANN_NAME_COLLISION));
2282 EXPECT_FALSE(single_response.request()->GetAddressResults());
2283
2284 // ERR_ICANN_NAME_COLLISION is cached like any other error, using a fixed TTL
2285 // for failed entries from proc-based resolver. That said, the fixed TTL is 0,
2286 // so it should never be cached.
dalyk48b20a992019-02-25 16:10:262287 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result =
Matt Menke7b4a32f2019-10-25 22:13:462288 GetCacheHit(HostCache::Key(
2289 "single", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
2290 HostResolverSource::ANY, NetworkIsolationKey()));
dalyk48b20a992019-02-25 16:10:262291 EXPECT_FALSE(cache_result);
Eric Orth70992982018-07-24 00:25:002292
Eric Orth117e1992019-04-17 00:24:152293 ResolveHostResponseHelper multiple_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552294 HostPortPair("multiple", 80), NetworkIsolationKey(), NetLogWithSource(),
2295 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:002296 EXPECT_THAT(multiple_response.result_error(),
2297 IsError(ERR_ICANN_NAME_COLLISION));
2298
2299 // Resolving an IP literal of 127.0.53.53 however is allowed.
2300 ResolveHostResponseHelper literal_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552301 HostPortPair("127.0.53.53", 80), NetworkIsolationKey(),
2302 NetLogWithSource(), base::nullopt, request_context_.get(),
2303 host_cache_.get()));
Eric Orth70992982018-07-24 00:25:002304 EXPECT_THAT(literal_response.result_error(), IsOk());
2305
2306 // Moreover the address should not be recognized when embedded in an IPv6
2307 // address.
2308 ResolveHostResponseHelper ipv6_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552309 HostPortPair("127.0.53.53", 80), NetworkIsolationKey(),
2310 NetLogWithSource(), base::nullopt, request_context_.get(),
2311 host_cache_.get()));
Eric Orth70992982018-07-24 00:25:002312 EXPECT_THAT(ipv6_response.result_error(), IsOk());
2313
2314 // Try some other IPs which are similar, but NOT an exact match on
2315 // 127.0.53.53.
2316 ResolveHostResponseHelper similar_response1(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552317 HostPortPair("not_reserved1", 80), NetworkIsolationKey(),
2318 NetLogWithSource(), base::nullopt, request_context_.get(),
2319 host_cache_.get()));
Eric Orth70992982018-07-24 00:25:002320 EXPECT_THAT(similar_response1.result_error(), IsOk());
2321
2322 ResolveHostResponseHelper similar_response2(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552323 HostPortPair("not_reserved2", 80), NetworkIsolationKey(),
2324 NetLogWithSource(), base::nullopt, request_context_.get(),
2325 host_cache_.get()));
Eric Orth70992982018-07-24 00:25:002326 EXPECT_THAT(similar_response2.result_error(), IsOk());
2327
2328 ResolveHostResponseHelper similar_response3(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552329 HostPortPair("not_reserved3", 80), NetworkIsolationKey(),
2330 NetLogWithSource(), base::nullopt, request_context_.get(),
2331 host_cache_.get()));
Eric Orth70992982018-07-24 00:25:002332 EXPECT_THAT(similar_response3.result_error(), IsOk());
2333}
2334
Eric Orth960e7062019-03-08 18:43:542335TEST_F(HostResolverManagerTest, IsIPv6Reachable) {
2336 // The real HostResolverManager is needed since TestHostResolverManager will
cbentzel1906f872015-06-05 16:25:252337 // bypass the IPv6 reachability tests.
Eric Orth37b18192019-04-22 19:09:282338 DestroyResolver();
2339 host_cache_ = nullptr;
Eric Orthfe6d5482019-09-03 18:27:572340 resolver_ = std::make_unique<HostResolverManager>(
2341 DefaultOptions(), nullptr /* system_dns_config_notifier */,
2342 nullptr /* net_log */);
cbentzel1906f872015-06-05 16:25:252343
sergeyub8cdc212015-05-14 18:50:372344 // Verify that two consecutive calls return the same value.
tfarina42834112016-09-22 13:38:202345 TestNetLog test_net_log;
2346 NetLogWithSource net_log =
2347 NetLogWithSource::Make(&test_net_log, NetLogSourceType::NONE);
2348 bool result1 = IsIPv6Reachable(net_log);
2349 bool result2 = IsIPv6Reachable(net_log);
sergeyub8cdc212015-05-14 18:50:372350 EXPECT_EQ(result1, result2);
2351
2352 // Filter reachability check events and verify that there are two of them.
Eric Roman79cc7552019-07-19 02:17:542353 auto probe_event_list = test_net_log.GetEntriesWithType(
2354 NetLogEventType::HOST_RESOLVER_IMPL_IPV6_REACHABILITY_CHECK);
sergeyub8cdc212015-05-14 18:50:372355 ASSERT_EQ(2U, probe_event_list.size());
2356
2357 // Verify that the first request was not cached and the second one was.
Eric Roman79cc7552019-07-19 02:17:542358 EXPECT_FALSE(GetBooleanValueFromParams(probe_event_list[0], "cached"));
2359 EXPECT_TRUE(GetBooleanValueFromParams(probe_event_list[1], "cached"));
sergeyub8cdc212015-05-14 18:50:372360}
2361
Eric Orth960e7062019-03-08 18:43:542362TEST_F(HostResolverManagerTest, IncludeCanonicalName) {
Eric Orth322af3e42018-08-20 18:12:592363 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42",
2364 HOST_RESOLVER_CANONNAME, "canon.name");
2365 proc_->SignalMultiple(2u);
2366
2367 HostResolver::ResolveHostParameters parameters;
2368 parameters.include_canonical_name = true;
2369 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552370 HostPortPair("just.testing", 80), NetworkIsolationKey(),
2371 NetLogWithSource(), parameters, request_context_.get(),
2372 host_cache_.get()));
Eric Orth322af3e42018-08-20 18:12:592373 ResolveHostResponseHelper response_no_flag(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552374 HostPortPair("just.testing", 80), NetworkIsolationKey(),
2375 NetLogWithSource(), base::nullopt, request_context_.get(),
2376 host_cache_.get()));
Eric Orth322af3e42018-08-20 18:12:592377
2378 EXPECT_THAT(response.result_error(), IsOk());
2379 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
2380 testing::ElementsAre(CreateExpected("192.168.1.42", 80)));
2381 EXPECT_EQ("canon.name",
2382 response.request()->GetAddressResults().value().canonical_name());
2383
2384 EXPECT_THAT(response_no_flag.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
2385}
2386
Eric Orth960e7062019-03-08 18:43:542387TEST_F(HostResolverManagerTest, LoopbackOnly) {
Eric Orth322af3e42018-08-20 18:12:592388 proc_->AddRuleForAllFamilies("otherlocal", "127.0.0.1",
2389 HOST_RESOLVER_LOOPBACK_ONLY);
2390 proc_->SignalMultiple(2u);
2391
2392 HostResolver::ResolveHostParameters parameters;
2393 parameters.loopback_only = true;
2394 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552395 HostPortPair("otherlocal", 80), NetworkIsolationKey(), NetLogWithSource(),
2396 parameters, request_context_.get(), host_cache_.get()));
Eric Orth322af3e42018-08-20 18:12:592397 ResolveHostResponseHelper response_no_flag(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552398 HostPortPair("otherlocal", 80), NetworkIsolationKey(), NetLogWithSource(),
2399 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth322af3e42018-08-20 18:12:592400
2401 EXPECT_THAT(response.result_error(), IsOk());
2402 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
2403 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
2404
2405 EXPECT_THAT(response_no_flag.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
2406}
2407
Eric Orth960e7062019-03-08 18:43:542408TEST_F(HostResolverManagerTest, IsSpeculative) {
Eric Orthb30bc172018-08-17 21:09:572409 proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42");
2410 proc_->SignalMultiple(1u);
2411
2412 HostResolver::ResolveHostParameters parameters;
2413 parameters.is_speculative = true;
2414
2415 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552416 HostPortPair("just.testing", 80), NetworkIsolationKey(),
2417 NetLogWithSource(), parameters, request_context_.get(),
2418 host_cache_.get()));
Eric Orthb30bc172018-08-17 21:09:572419
2420 EXPECT_THAT(response.result_error(), IsOk());
2421 EXPECT_FALSE(response.request()->GetAddressResults());
2422
2423 ASSERT_EQ(1u, proc_->GetCaptureList().size());
2424 EXPECT_EQ("just.testing", proc_->GetCaptureList()[0].hostname);
2425
2426 // Reresolve without the |is_speculative| flag should immediately return from
2427 // cache.
2428 ResolveHostResponseHelper response2(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552429 HostPortPair("just.testing", 80), NetworkIsolationKey(),
2430 NetLogWithSource(), base::nullopt, request_context_.get(),
2431 host_cache_.get()));
Eric Orthb30bc172018-08-17 21:09:572432
2433 EXPECT_THAT(response2.result_error(), IsOk());
2434 EXPECT_THAT(response2.request()->GetAddressResults().value().endpoints(),
2435 testing::ElementsAre(CreateExpected("192.168.1.42", 80)));
2436
2437 EXPECT_EQ("just.testing", proc_->GetCaptureList()[0].hostname);
2438 EXPECT_EQ(1u, proc_->GetCaptureList().size()); // No increase.
2439}
2440
Eric Orth9871aafa2018-10-02 19:59:182441#if BUILDFLAG(ENABLE_MDNS)
2442const uint8_t kMdnsResponseA[] = {
2443 // Header
2444 0x00, 0x00, // ID is zeroed out
2445 0x81, 0x80, // Standard query response, RA, no error
2446 0x00, 0x00, // No questions (for simplicity)
2447 0x00, 0x01, // 1 RR (answers)
2448 0x00, 0x00, // 0 authority RRs
2449 0x00, 0x00, // 0 additional RRs
2450
2451 // "myhello.local."
2452 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2453 0x00,
2454
2455 0x00, 0x01, // TYPE is A.
2456 0x00, 0x01, // CLASS is IN.
2457 0x00, 0x00, 0x00, 0x10, // TTL is 16 (seconds)
2458 0x00, 0x04, // RDLENGTH is 4 bytes.
2459 0x01, 0x02, 0x03, 0x04, // 1.2.3.4
2460};
2461
Eric Orth026776a2019-01-18 00:13:282462const uint8_t kMdnsResponseA2[] = {
2463 // Header
2464 0x00, 0x00, // ID is zeroed out
2465 0x81, 0x80, // Standard query response, RA, no error
2466 0x00, 0x00, // No questions (for simplicity)
2467 0x00, 0x01, // 1 RR (answers)
2468 0x00, 0x00, // 0 authority RRs
2469 0x00, 0x00, // 0 additional RRs
2470
2471 // "myhello.local."
2472 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2473 0x00,
2474
2475 0x00, 0x01, // TYPE is A.
2476 0x00, 0x01, // CLASS is IN.
2477 0x00, 0x00, 0x00, 0x10, // TTL is 16 (seconds)
2478 0x00, 0x04, // RDLENGTH is 4 bytes.
2479 0x05, 0x06, 0x07, 0x08, // 5.6.7.8
2480};
2481
2482const uint8_t kMdnsResponseA2Goodbye[] = {
2483 // Header
2484 0x00, 0x00, // ID is zeroed out
2485 0x81, 0x80, // Standard query response, RA, no error
2486 0x00, 0x00, // No questions (for simplicity)
2487 0x00, 0x01, // 1 RR (answers)
2488 0x00, 0x00, // 0 authority RRs
2489 0x00, 0x00, // 0 additional RRs
2490
2491 // "myhello.local."
2492 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2493 0x00,
2494
2495 0x00, 0x01, // TYPE is A.
2496 0x00, 0x01, // CLASS is IN.
2497 0x00, 0x00, 0x00, 0x00, // TTL is 0 (signaling "goodbye" removal of result)
2498 0x00, 0x04, // RDLENGTH is 4 bytes.
2499 0x05, 0x06, 0x07, 0x08, // 5.6.7.8
2500};
2501
Eric Orth9871aafa2018-10-02 19:59:182502const uint8_t kMdnsResponseAAAA[] = {
2503 // Header
2504 0x00, 0x00, // ID is zeroed out
2505 0x81, 0x80, // Standard query response, RA, no error
2506 0x00, 0x00, // No questions (for simplicity)
2507 0x00, 0x01, // 1 RR (answers)
2508 0x00, 0x00, // 0 authority RRs
2509 0x00, 0x00, // 0 additional RRs
2510
2511 // "myhello.local."
2512 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2513 0x00,
2514
2515 0x00, 0x1C, // TYPE is AAAA.
2516 0x00, 0x01, // CLASS is IN.
2517 0x00, 0x00, 0x00, 0x10, // TTL is 16 (seconds)
2518 0x00, 0x10, // RDLENGTH is 16 bytes.
2519
2520 // 000a:0000:0000:0000:0001:0002:0003:0004
2521 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02,
Eric Orth960e7062019-03-08 18:43:542522 0x00, 0x03, 0x00, 0x04};
Eric Orth9871aafa2018-10-02 19:59:182523
2524// An MDNS response indicating that the responder owns the hostname, but the
2525// specific requested type (AAAA) does not exist because the responder only has
2526// A addresses.
2527const uint8_t kMdnsResponseNsec[] = {
2528 // Header
2529 0x00, 0x00, // ID is zeroed out
2530 0x81, 0x80, // Standard query response, RA, no error
2531 0x00, 0x00, // No questions (for simplicity)
2532 0x00, 0x01, // 1 RR (answers)
2533 0x00, 0x00, // 0 authority RRs
2534 0x00, 0x00, // 0 additional RRs
2535
2536 // "myhello.local."
2537 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2538 0x00,
2539
2540 0x00, 0x2f, // TYPE is NSEC.
2541 0x00, 0x01, // CLASS is IN.
2542 0x00, 0x00, 0x00, 0x10, // TTL is 16 (seconds)
2543 0x00, 0x06, // RDLENGTH is 6 bytes.
2544 0xc0, 0x0c, // Next Domain Name (always pointer back to name in MDNS)
2545 0x00, // Bitmap block number (always 0 in MDNS)
2546 0x02, // Bitmap length is 2
2547 0x00, 0x08 // A type only
2548};
2549
Eric Orth828bd3ae2018-12-12 17:30:362550const uint8_t kMdnsResponseTxt[] = {
2551 // Header
2552 0x00, 0x00, // ID is zeroed out
2553 0x81, 0x80, // Standard query response, RA, no error
2554 0x00, 0x00, // No questions (for simplicity)
2555 0x00, 0x01, // 1 RR (answers)
2556 0x00, 0x00, // 0 authority RRs
2557 0x00, 0x00, // 0 additional RRs
2558
2559 // "myhello.local."
2560 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2561 0x00,
2562
2563 0x00, 0x10, // TYPE is TXT.
2564 0x00, 0x01, // CLASS is IN.
2565 0x00, 0x00, 0x00, 0x11, // TTL is 17 (seconds)
2566 0x00, 0x08, // RDLENGTH is 8 bytes.
2567
2568 // "foo"
2569 0x03, 0x66, 0x6f, 0x6f,
2570 // "bar"
Eric Orth960e7062019-03-08 18:43:542571 0x03, 0x62, 0x61, 0x72};
Eric Orth828bd3ae2018-12-12 17:30:362572
Eric Orthe9db8d232019-01-14 21:24:452573const uint8_t kMdnsResponsePtr[] = {
2574 // Header
2575 0x00, 0x00, // ID is zeroed out
2576 0x81, 0x80, // Standard query response, RA, no error
2577 0x00, 0x00, // No questions (for simplicity)
2578 0x00, 0x01, // 1 RR (answers)
2579 0x00, 0x00, // 0 authority RRs
2580 0x00, 0x00, // 0 additional RRs
2581
2582 // "myhello.local."
2583 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2584 0x00,
2585
2586 0x00, 0x0c, // TYPE is PTR.
2587 0x00, 0x01, // CLASS is IN.
2588 0x00, 0x00, 0x00, 0x12, // TTL is 18 (seconds)
2589 0x00, 0x09, // RDLENGTH is 9 bytes.
2590
2591 // "foo.com."
2592 0x03, 'f', 'o', 'o', 0x03, 'c', 'o', 'm', 0x00};
2593
Eric Orth026776a2019-01-18 00:13:282594const uint8_t kMdnsResponsePtrRoot[] = {
2595 // Header
2596 0x00, 0x00, // ID is zeroed out
2597 0x81, 0x80, // Standard query response, RA, no error
2598 0x00, 0x00, // No questions (for simplicity)
2599 0x00, 0x01, // 1 RR (answers)
2600 0x00, 0x00, // 0 authority RRs
2601 0x00, 0x00, // 0 additional RRs
2602
2603 // "myhello.local."
2604 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2605 0x00,
2606
2607 0x00, 0x0c, // TYPE is PTR.
2608 0x00, 0x01, // CLASS is IN.
2609 0x00, 0x00, 0x00, 0x13, // TTL is 19 (seconds)
2610 0x00, 0x01, // RDLENGTH is 1 byte.
2611
2612 // "." (the root domain)
2613 0x00};
2614
Eric Ortha625b042019-01-16 01:14:452615const uint8_t kMdnsResponseSrv[] = {
2616 // Header
2617 0x00, 0x00, // ID is zeroed out
2618 0x81, 0x80, // Standard query response, RA, no error
2619 0x00, 0x00, // No questions (for simplicity)
2620 0x00, 0x01, // 1 RR (answers)
2621 0x00, 0x00, // 0 authority RRs
2622 0x00, 0x00, // 0 additional RRs
2623
2624 // "myhello.local."
2625 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2626 0x00,
2627
2628 0x00, 0x21, // TYPE is SRV.
2629 0x00, 0x01, // CLASS is IN.
2630 0x00, 0x00, 0x00, 0x13, // TTL is 19 (seconds)
2631 0x00, 0x0f, // RDLENGTH is 15 bytes.
2632
2633 0x00, 0x05, // Priority 5
2634 0x00, 0x01, // Weight 1
2635 0x20, 0x49, // Port 8265
2636
2637 // "foo.com."
2638 0x03, 'f', 'o', 'o', 0x03, 'c', 'o', 'm', 0x00};
2639
Bailey Berroe70f06c2019-03-11 22:22:462640const uint8_t kMdnsResponseSrvUnrestricted[] = {
2641 // Header
2642 0x00, 0x00, // ID is zeroed out
2643 0x81, 0x80, // Standard query response, RA, no error
2644 0x00, 0x00, // No questions (for simplicity)
2645 0x00, 0x01, // 1 RR (answers)
2646 0x00, 0x00, // 0 authority RRs
2647 0x00, 0x00, // 0 additional RRs
2648
2649 // "foo bar(A1B2)._ipps._tcp.local"
2650 0x0d, 'f', 'o', 'o', ' ', 'b', 'a', 'r', '(', 'A', '1', 'B', '2', ')', 0x05,
2651 '_', 'i', 'p', 'p', 's', 0x04, '_', 't', 'c', 'p', 0x05, 'l', 'o', 'c', 'a',
2652 'l', 0x00,
2653
2654 0x00, 0x21, // TYPE is SRV.
2655 0x00, 0x01, // CLASS is IN.
2656 0x00, 0x00, 0x00, 0x13, // TTL is 19 (seconds)
2657 0x00, 0x0f, // RDLENGTH is 15 bytes.
2658
2659 0x00, 0x05, // Priority 5
2660 0x00, 0x01, // Weight 1
2661 0x20, 0x49, // Port 8265
2662
2663 // "foo.com."
2664 0x03, 'f', 'o', 'o', 0x03, 'c', 'o', 'm', 0x00};
2665
2666const uint8_t kMdnsResponseSrvUnrestrictedResult[] = {
2667 // Header
2668 0x00, 0x00, // ID is zeroed out
2669 0x81, 0x80, // Standard query response, RA, no error
2670 0x00, 0x00, // No questions (for simplicity)
2671 0x00, 0x01, // 1 RR (answers)
2672 0x00, 0x00, // 0 authority RRs
2673 0x00, 0x00, // 0 additional RRs
2674
2675 // "myhello.local."
2676 0x07, 'm', 'y', 'h', 'e', 'l', 'l', 'o', 0x05, 'l', 'o', 'c', 'a', 'l',
2677 0x00,
2678
2679 0x00, 0x21, // TYPE is SRV.
2680 0x00, 0x01, // CLASS is IN.
2681 0x00, 0x00, 0x00, 0x13, // TTL is 19 (seconds)
2682 0x00, 0x15, // RDLENGTH is 21 bytes.
2683
2684 0x00, 0x05, // Priority 5
2685 0x00, 0x01, // Weight 1
2686 0x20, 0x49, // Port 8265
2687
2688 // "foo bar.local"
2689 0x07, 'f', 'o', 'o', ' ', 'b', 'a', 'r', 0x05, 'l', 'o', 'c', 'a', 'l',
2690 0x00};
2691
Eric Orth960e7062019-03-08 18:43:542692TEST_F(HostResolverManagerTest, Mdns) {
Eric Orth9871aafa2018-10-02 19:59:182693 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2694 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2695 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2696 // 2 socket creations for every transaction.
2697 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(4);
2698
2699 HostResolver::ResolveHostParameters parameters;
2700 parameters.source = HostResolverSource::MULTICAST_DNS;
2701
2702 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552703 HostPortPair("myhello.local", 80), NetworkIsolationKey(),
2704 NetLogWithSource(), parameters, request_context_.get(),
2705 host_cache_.get()));
Eric Orth9871aafa2018-10-02 19:59:182706
2707 socket_factory_ptr->SimulateReceive(kMdnsResponseA, sizeof(kMdnsResponseA));
2708 socket_factory_ptr->SimulateReceive(kMdnsResponseAAAA,
2709 sizeof(kMdnsResponseAAAA));
2710
2711 EXPECT_THAT(response.result_error(), IsOk());
2712 EXPECT_THAT(
2713 response.request()->GetAddressResults().value().endpoints(),
2714 testing::UnorderedElementsAre(
2715 CreateExpected("1.2.3.4", 80),
2716 CreateExpected("000a:0000:0000:0000:0001:0002:0003:0004", 80)));
Eric Orth828bd3ae2018-12-12 17:30:362717 EXPECT_FALSE(response.request()->GetTextResults());
2718 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:402719 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Orth9871aafa2018-10-02 19:59:182720}
2721
Eric Orth960e7062019-03-08 18:43:542722TEST_F(HostResolverManagerTest, Mdns_AaaaOnly) {
Eric Orth9871aafa2018-10-02 19:59:182723 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2724 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2725 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2726 // 2 socket creations for every transaction.
2727 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(2);
2728
2729 HostResolver::ResolveHostParameters parameters;
Eric Orth192e3bb2018-11-14 19:30:322730 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth9871aafa2018-10-02 19:59:182731 parameters.source = HostResolverSource::MULTICAST_DNS;
2732
2733 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552734 HostPortPair("myhello.local", 80), NetworkIsolationKey(),
2735 NetLogWithSource(), parameters, request_context_.get(),
2736 host_cache_.get()));
Eric Orth9871aafa2018-10-02 19:59:182737
2738 socket_factory_ptr->SimulateReceive(kMdnsResponseAAAA,
2739 sizeof(kMdnsResponseAAAA));
2740
2741 EXPECT_THAT(response.result_error(), IsOk());
2742 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
2743 testing::ElementsAre(CreateExpected(
2744 "000a:0000:0000:0000:0001:0002:0003:0004", 80)));
2745}
2746
Eric Orth960e7062019-03-08 18:43:542747TEST_F(HostResolverManagerTest, Mdns_Txt) {
Eric Orth828bd3ae2018-12-12 17:30:362748 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2749 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2750 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2751 // 2 socket creations for every transaction.
2752 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(2);
2753
2754 HostResolver::ResolveHostParameters parameters;
2755 parameters.dns_query_type = DnsQueryType::TXT;
2756 parameters.source = HostResolverSource::MULTICAST_DNS;
2757
2758 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552759 HostPortPair("myhello.local", 80), NetworkIsolationKey(),
2760 NetLogWithSource(), parameters, request_context_.get(),
2761 host_cache_.get()));
Eric Orth828bd3ae2018-12-12 17:30:362762
2763 socket_factory_ptr->SimulateReceive(kMdnsResponseTxt,
2764 sizeof(kMdnsResponseTxt));
2765
2766 EXPECT_THAT(response.result_error(), IsOk());
2767 EXPECT_FALSE(response.request()->GetAddressResults());
2768 EXPECT_THAT(response.request()->GetTextResults(),
2769 testing::Optional(testing::ElementsAre("foo", "bar")));
2770 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:402771 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Orth828bd3ae2018-12-12 17:30:362772}
2773
Eric Orth960e7062019-03-08 18:43:542774TEST_F(HostResolverManagerTest, Mdns_Ptr) {
Eric Orthe9db8d232019-01-14 21:24:452775 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2776 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2777 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2778 // 2 socket creations for every transaction.
2779 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(2);
2780
2781 HostResolver::ResolveHostParameters parameters;
2782 parameters.dns_query_type = DnsQueryType::PTR;
2783 parameters.source = HostResolverSource::MULTICAST_DNS;
2784
2785 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552786 HostPortPair("myhello.local", 83), NetworkIsolationKey(),
2787 NetLogWithSource(), parameters, request_context_.get(),
2788 host_cache_.get()));
Eric Orthe9db8d232019-01-14 21:24:452789
2790 socket_factory_ptr->SimulateReceive(kMdnsResponsePtr,
2791 sizeof(kMdnsResponsePtr));
2792
2793 EXPECT_THAT(response.result_error(), IsOk());
2794 EXPECT_FALSE(response.request()->GetAddressResults());
2795 EXPECT_FALSE(response.request()->GetTextResults());
David Van Clevec719c882019-11-04 15:47:402796 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Orthe9db8d232019-01-14 21:24:452797 EXPECT_THAT(
2798 response.request()->GetHostnameResults(),
2799 testing::Optional(testing::ElementsAre(HostPortPair("foo.com", 83))));
2800}
2801
Eric Orth960e7062019-03-08 18:43:542802TEST_F(HostResolverManagerTest, Mdns_Srv) {
Eric Ortha625b042019-01-16 01:14:452803 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2804 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2805 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2806 // 2 socket creations for every transaction.
2807 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(2);
2808
2809 HostResolver::ResolveHostParameters parameters;
2810 parameters.dns_query_type = DnsQueryType::SRV;
2811 parameters.source = HostResolverSource::MULTICAST_DNS;
2812
2813 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552814 HostPortPair("myhello.local", 83), NetworkIsolationKey(),
2815 NetLogWithSource(), parameters, request_context_.get(),
2816 host_cache_.get()));
Eric Ortha625b042019-01-16 01:14:452817
2818 socket_factory_ptr->SimulateReceive(kMdnsResponseSrv,
2819 sizeof(kMdnsResponseSrv));
2820
2821 EXPECT_THAT(response.result_error(), IsOk());
2822 EXPECT_FALSE(response.request()->GetAddressResults());
2823 EXPECT_FALSE(response.request()->GetTextResults());
David Van Clevec719c882019-11-04 15:47:402824 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Ortha625b042019-01-16 01:14:452825 EXPECT_THAT(
2826 response.request()->GetHostnameResults(),
2827 testing::Optional(testing::ElementsAre(HostPortPair("foo.com", 8265))));
2828}
2829
Bailey Berroe70f06c2019-03-11 22:22:462830// Test that we are able to create multicast DNS requests that contain
2831// characters not permitted in the DNS spec such as spaces and parenthesis.
2832TEST_F(HostResolverManagerTest, Mdns_Srv_Unrestricted) {
2833 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2834 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2835 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2836
2837 HostResolver::ResolveHostParameters parameters;
2838 parameters.dns_query_type = DnsQueryType::SRV;
2839 parameters.source = HostResolverSource::MULTICAST_DNS;
2840
2841 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552842 HostPortPair("foo bar(A1B2)._ipps._tcp.local", 83), NetworkIsolationKey(),
2843 NetLogWithSource(), parameters, request_context_.get(),
2844 host_cache_.get()));
Bailey Berroe70f06c2019-03-11 22:22:462845
2846 socket_factory_ptr->SimulateReceive(kMdnsResponseSrvUnrestricted,
2847 sizeof(kMdnsResponseSrvUnrestricted));
2848
2849 EXPECT_THAT(response.result_error(), IsOk());
2850 EXPECT_FALSE(response.request()->GetAddressResults());
2851 EXPECT_FALSE(response.request()->GetTextResults());
David Van Clevec719c882019-11-04 15:47:402852 EXPECT_FALSE(response.request()->GetEsniResults());
Bailey Berroe70f06c2019-03-11 22:22:462853 EXPECT_THAT(
2854 response.request()->GetHostnameResults(),
2855 testing::Optional(testing::ElementsAre(HostPortPair("foo.com", 8265))));
2856}
2857
2858// Test that we are able to create multicast DNS requests that contain
2859// characters not permitted in the DNS spec such as spaces and parenthesis.
2860TEST_F(HostResolverManagerTest, Mdns_Srv_Result_Unrestricted) {
2861 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2862 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2863 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2864
2865 HostResolver::ResolveHostParameters parameters;
2866 parameters.dns_query_type = DnsQueryType::SRV;
2867 parameters.source = HostResolverSource::MULTICAST_DNS;
2868
2869 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552870 HostPortPair("myhello.local", 83), NetworkIsolationKey(),
2871 NetLogWithSource(), parameters, request_context_.get(),
2872 host_cache_.get()));
Bailey Berroe70f06c2019-03-11 22:22:462873
2874 socket_factory_ptr->SimulateReceive(
2875 kMdnsResponseSrvUnrestrictedResult,
2876 sizeof(kMdnsResponseSrvUnrestrictedResult));
2877
2878 EXPECT_THAT(response.result_error(), IsOk());
2879 EXPECT_FALSE(response.request()->GetAddressResults());
2880 EXPECT_FALSE(response.request()->GetTextResults());
David Van Clevec719c882019-11-04 15:47:402881 EXPECT_FALSE(response.request()->GetEsniResults());
Bailey Berroe70f06c2019-03-11 22:22:462882 EXPECT_THAT(response.request()->GetHostnameResults(),
2883 testing::Optional(
2884 testing::ElementsAre(HostPortPair("foo bar.local", 8265))));
2885}
2886
Eric Orth9871aafa2018-10-02 19:59:182887// Test multicast DNS handling of NSEC responses (used for explicit negative
2888// response).
Eric Orth960e7062019-03-08 18:43:542889TEST_F(HostResolverManagerTest, Mdns_Nsec) {
Eric Orth9871aafa2018-10-02 19:59:182890 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2891 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2892 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2893 // 2 socket creations for every transaction.
2894 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(2);
2895
2896 HostResolver::ResolveHostParameters parameters;
Eric Orth192e3bb2018-11-14 19:30:322897 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth9871aafa2018-10-02 19:59:182898 parameters.source = HostResolverSource::MULTICAST_DNS;
2899
2900 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552901 HostPortPair("myhello.local", 80), NetworkIsolationKey(),
2902 NetLogWithSource(), parameters, request_context_.get(),
2903 host_cache_.get()));
Eric Orth9871aafa2018-10-02 19:59:182904
2905 socket_factory_ptr->SimulateReceive(kMdnsResponseNsec,
2906 sizeof(kMdnsResponseNsec));
2907
2908 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
2909 EXPECT_FALSE(response.request()->GetAddressResults());
2910}
2911
Eric Orth960e7062019-03-08 18:43:542912TEST_F(HostResolverManagerTest, Mdns_NoResponse) {
Eric Orth9871aafa2018-10-02 19:59:182913 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2914 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2915 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2916 // 2 socket creations for every transaction.
2917 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(4);
2918
2919 // Add a little bit of extra fudge to the delay to allow reasonable
2920 // flexibility for time > vs >= etc. We don't need to fail the test if we
2921 // timeout at t=6001 instead of t=6000.
2922 base::TimeDelta kSleepFudgeFactor = base::TimeDelta::FromMilliseconds(1);
2923
2924 // Override the current thread task runner, so we can simulate the passage of
2925 // time to trigger the timeout.
2926 auto test_task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
2927 base::ScopedClosureRunner task_runner_override_scoped_cleanup =
2928 base::ThreadTaskRunnerHandle::OverrideForTesting(test_task_runner);
2929
2930 HostResolver::ResolveHostParameters parameters;
2931 parameters.source = HostResolverSource::MULTICAST_DNS;
2932
2933 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552934 HostPortPair("myhello.local", 80), NetworkIsolationKey(),
2935 NetLogWithSource(), parameters, request_context_.get(),
2936 host_cache_.get()));
Eric Orth9871aafa2018-10-02 19:59:182937
2938 ASSERT_TRUE(test_task_runner->HasPendingTask());
2939 test_task_runner->FastForwardBy(MDnsTransaction::kTransactionTimeout +
2940 kSleepFudgeFactor);
2941
2942 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
2943 EXPECT_FALSE(response.request()->GetAddressResults());
Eric Orth828bd3ae2018-12-12 17:30:362944 EXPECT_FALSE(response.request()->GetTextResults());
2945 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:402946 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Orth828bd3ae2018-12-12 17:30:362947
2948 test_task_runner->FastForwardUntilNoTasksRemain();
2949}
2950
Eric Orth960e7062019-03-08 18:43:542951TEST_F(HostResolverManagerTest, Mdns_WrongType) {
Eric Orth828bd3ae2018-12-12 17:30:362952 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2953 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
2954 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
2955 // 2 socket creations for every transaction.
2956 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(2);
2957
2958 // Add a little bit of extra fudge to the delay to allow reasonable
2959 // flexibility for time > vs >= etc. We don't need to fail the test if we
2960 // timeout at t=6001 instead of t=6000.
2961 base::TimeDelta kSleepFudgeFactor = base::TimeDelta::FromMilliseconds(1);
2962
2963 // Override the current thread task runner, so we can simulate the passage of
2964 // time to trigger the timeout.
2965 auto test_task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
2966 base::ScopedClosureRunner task_runner_override_scoped_cleanup =
2967 base::ThreadTaskRunnerHandle::OverrideForTesting(test_task_runner);
2968
2969 HostResolver::ResolveHostParameters parameters;
2970 parameters.dns_query_type = DnsQueryType::A;
2971 parameters.source = HostResolverSource::MULTICAST_DNS;
2972
2973 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:552974 HostPortPair("myhello.local", 80), NetworkIsolationKey(),
2975 NetLogWithSource(), parameters, request_context_.get(),
2976 host_cache_.get()));
Eric Orth828bd3ae2018-12-12 17:30:362977
2978 // Not the requested type. Should be ignored.
2979 socket_factory_ptr->SimulateReceive(kMdnsResponseTxt,
2980 sizeof(kMdnsResponseTxt));
2981
2982 ASSERT_TRUE(test_task_runner->HasPendingTask());
2983 test_task_runner->FastForwardBy(MDnsTransaction::kTransactionTimeout +
2984 kSleepFudgeFactor);
2985
2986 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
2987 EXPECT_FALSE(response.request()->GetAddressResults());
2988 EXPECT_FALSE(response.request()->GetTextResults());
2989 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:402990 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Orth9871aafa2018-10-02 19:59:182991
2992 test_task_runner->FastForwardUntilNoTasksRemain();
2993}
2994
2995// Test for a request for both A and AAAA results where results only exist for
2996// one type.
Eric Orth960e7062019-03-08 18:43:542997TEST_F(HostResolverManagerTest, Mdns_PartialResults) {
Eric Orth9871aafa2018-10-02 19:59:182998 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
2999 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
3000 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
3001 // 2 socket creations for every transaction.
3002 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(4);
3003
3004 // Add a little bit of extra fudge to the delay to allow reasonable
3005 // flexibility for time > vs >= etc. We don't need to fail the test if we
3006 // timeout at t=6001 instead of t=6000.
3007 base::TimeDelta kSleepFudgeFactor = base::TimeDelta::FromMilliseconds(1);
3008
3009 // Override the current thread task runner, so we can simulate the passage of
3010 // time to trigger the timeout.
3011 auto test_task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
3012 base::ScopedClosureRunner task_runner_override_scoped_cleanup =
3013 base::ThreadTaskRunnerHandle::OverrideForTesting(test_task_runner);
3014
3015 HostResolver::ResolveHostParameters parameters;
3016 parameters.source = HostResolverSource::MULTICAST_DNS;
3017
3018 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:553019 HostPortPair("myhello.local", 80), NetworkIsolationKey(),
3020 NetLogWithSource(), parameters, request_context_.get(),
3021 host_cache_.get()));
Eric Orth9871aafa2018-10-02 19:59:183022
3023 ASSERT_TRUE(test_task_runner->HasPendingTask());
3024
3025 socket_factory_ptr->SimulateReceive(kMdnsResponseA, sizeof(kMdnsResponseA));
3026 test_task_runner->FastForwardBy(MDnsTransaction::kTransactionTimeout +
3027 kSleepFudgeFactor);
3028
3029 EXPECT_THAT(response.result_error(), IsOk());
3030 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
3031 testing::ElementsAre(CreateExpected("1.2.3.4", 80)));
3032
3033 test_task_runner->FastForwardUntilNoTasksRemain();
3034}
3035
Eric Orth960e7062019-03-08 18:43:543036TEST_F(HostResolverManagerTest, Mdns_Cancel) {
Eric Orth9871aafa2018-10-02 19:59:183037 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3038 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
3039 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
3040 // 2 socket creations for every transaction.
3041 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(4);
3042
3043 HostResolver::ResolveHostParameters parameters;
3044 parameters.source = HostResolverSource::MULTICAST_DNS;
3045
3046 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:553047 HostPortPair("myhello.local", 80), NetworkIsolationKey(),
3048 NetLogWithSource(), parameters, request_context_.get(),
3049 host_cache_.get()));
Eric Orth9871aafa2018-10-02 19:59:183050
3051 response.CancelRequest();
3052
3053 socket_factory_ptr->SimulateReceive(kMdnsResponseA, sizeof(kMdnsResponseA));
3054 socket_factory_ptr->SimulateReceive(kMdnsResponseAAAA,
3055 sizeof(kMdnsResponseAAAA));
3056
3057 base::RunLoop().RunUntilIdle();
3058 EXPECT_FALSE(response.complete());
3059}
3060
3061// Test for a two-transaction query where the first fails to start. The second
3062// should be cancelled.
Eric Orth960e7062019-03-08 18:43:543063TEST_F(HostResolverManagerTest, Mdns_PartialFailure) {
Eric Orth9871aafa2018-10-02 19:59:183064 // Setup a mock MDnsClient where the first transaction will always return
3065 // |false| immediately on Start(). Second transaction may or may not be
3066 // created, but if it is, Start() not expected to be called because the
3067 // overall request should immediately fail.
3068 auto transaction1 = std::make_unique<MockMDnsTransaction>();
3069 EXPECT_CALL(*transaction1, Start()).WillOnce(Return(false));
3070 auto transaction2 = std::make_unique<MockMDnsTransaction>();
3071 EXPECT_CALL(*transaction2, Start()).Times(0);
3072
3073 auto client = std::make_unique<MockMDnsClient>();
3074 EXPECT_CALL(*client, CreateTransaction(_, _, _, _))
3075 .Times(Between(1, 2)) // Second transaction optionally created.
3076 .WillOnce(Return(ByMove(std::move(transaction1))))
3077 .WillOnce(Return(ByMove(std::move(transaction2))));
3078 EXPECT_CALL(*client, IsListening()).WillRepeatedly(Return(true));
3079 resolver_->SetMdnsClientForTesting(std::move(client));
3080
3081 HostResolver::ResolveHostParameters parameters;
3082 parameters.source = HostResolverSource::MULTICAST_DNS;
3083
3084 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:553085 HostPortPair("myhello.local", 80), NetworkIsolationKey(),
3086 NetLogWithSource(), parameters, request_context_.get(),
3087 host_cache_.get()));
Eric Orth9871aafa2018-10-02 19:59:183088
3089 EXPECT_THAT(response.result_error(), IsError(ERR_FAILED));
3090 EXPECT_FALSE(response.request()->GetAddressResults());
3091}
Eric Orth026776a2019-01-18 00:13:283092
Eric Orthe857ebb2019-03-13 23:02:073093TEST_F(HostResolverManagerTest, Mdns_ListenFailure) {
3094 // Inject an MdnsClient mock that will always fail to start listening.
3095 auto client = std::make_unique<MockMDnsClient>();
3096 EXPECT_CALL(*client, StartListening(_)).WillOnce(Return(ERR_FAILED));
3097 EXPECT_CALL(*client, IsListening()).WillRepeatedly(Return(false));
3098 resolver_->SetMdnsClientForTesting(std::move(client));
3099
3100 HostResolver::ResolveHostParameters parameters;
3101 parameters.source = HostResolverSource::MULTICAST_DNS;
3102
3103 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:553104 HostPortPair("myhello.local", 80), NetworkIsolationKey(),
3105 NetLogWithSource(), parameters, request_context_.get(),
3106 host_cache_.get()));
Eric Orthe857ebb2019-03-13 23:02:073107
3108 EXPECT_THAT(response.result_error(), IsError(ERR_FAILED));
3109 EXPECT_FALSE(response.request()->GetAddressResults());
3110}
3111
Eric Orth026776a2019-01-18 00:13:283112// Implementation of HostResolver::MdnsListenerDelegate that records all
3113// received results in maps.
3114class TestMdnsListenerDelegate : public HostResolver::MdnsListener::Delegate {
3115 public:
3116 using UpdateKey =
3117 std::pair<HostResolver::MdnsListener::Delegate::UpdateType, DnsQueryType>;
3118
3119 void OnAddressResult(
3120 HostResolver::MdnsListener::Delegate::UpdateType update_type,
3121 DnsQueryType result_type,
3122 IPEndPoint address) override {
David Van Cleveac020732019-10-29 00:27:093123 address_results_.insert({{update_type, result_type}, address});
Eric Orth026776a2019-01-18 00:13:283124 }
3125
3126 void OnTextResult(
3127 HostResolver::MdnsListener::Delegate::UpdateType update_type,
3128 DnsQueryType result_type,
3129 std::vector<std::string> text_records) override {
3130 for (auto& text_record : text_records) {
3131 text_results_.insert(
3132 {{update_type, result_type}, std::move(text_record)});
3133 }
3134 }
3135
3136 void OnHostnameResult(
3137 HostResolver::MdnsListener::Delegate::UpdateType update_type,
3138 DnsQueryType result_type,
3139 HostPortPair host) override {
3140 hostname_results_.insert({{update_type, result_type}, std::move(host)});
3141 }
3142
3143 void OnUnhandledResult(
3144 HostResolver::MdnsListener::Delegate::UpdateType update_type,
3145 DnsQueryType result_type) override {
3146 unhandled_results_.insert({update_type, result_type});
3147 }
3148
3149 const std::multimap<UpdateKey, IPEndPoint>& address_results() {
3150 return address_results_;
3151 }
3152
3153 const std::multimap<UpdateKey, std::string>& text_results() {
3154 return text_results_;
3155 }
3156
3157 const std::multimap<UpdateKey, HostPortPair>& hostname_results() {
3158 return hostname_results_;
3159 }
3160
3161 const std::multiset<UpdateKey>& unhandled_results() {
3162 return unhandled_results_;
3163 }
3164
3165 template <typename T>
3166 static std::pair<UpdateKey, T> CreateExpectedResult(
3167 HostResolver::MdnsListener::Delegate::UpdateType update_type,
3168 DnsQueryType query_type,
3169 T result) {
3170 return std::make_pair(std::make_pair(update_type, query_type), result);
3171 }
3172
3173 private:
3174 std::multimap<UpdateKey, IPEndPoint> address_results_;
3175 std::multimap<UpdateKey, std::string> text_results_;
3176 std::multimap<UpdateKey, HostPortPair> hostname_results_;
3177 std::multiset<UpdateKey> unhandled_results_;
3178};
3179
Eric Orth960e7062019-03-08 18:43:543180TEST_F(HostResolverManagerTest, MdnsListener) {
Eric Orth026776a2019-01-18 00:13:283181 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3182 base::SimpleTestClock clock;
3183 clock.SetNow(base::Time::Now());
3184 auto cache_cleanup_timer = std::make_unique<base::MockOneShotTimer>();
3185 auto* cache_cleanup_timer_ptr = cache_cleanup_timer.get();
3186 auto mdns_client =
3187 std::make_unique<MDnsClientImpl>(&clock, std::move(cache_cleanup_timer));
Eric Orthe857ebb2019-03-13 23:02:073188 ASSERT_THAT(mdns_client->StartListening(socket_factory.get()), IsOk());
Eric Orth026776a2019-01-18 00:13:283189 resolver_->SetMdnsClientForTesting(std::move(mdns_client));
3190
3191 std::unique_ptr<HostResolver::MdnsListener> listener =
3192 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 80),
3193 DnsQueryType::A);
3194
3195 TestMdnsListenerDelegate delegate;
3196 ASSERT_THAT(listener->Start(&delegate), IsOk());
3197 ASSERT_THAT(delegate.address_results(), testing::IsEmpty());
3198
3199 socket_factory->SimulateReceive(kMdnsResponseA, sizeof(kMdnsResponseA));
3200 socket_factory->SimulateReceive(kMdnsResponseA2, sizeof(kMdnsResponseA2));
3201 socket_factory->SimulateReceive(kMdnsResponseA2Goodbye,
3202 sizeof(kMdnsResponseA2Goodbye));
3203
3204 // Per RFC6762 section 10.1, removals take effect 1 second after receiving the
3205 // goodbye message.
3206 clock.Advance(base::TimeDelta::FromSeconds(1));
3207 cache_cleanup_timer_ptr->Fire();
3208
3209 // Expect 1 record adding "1.2.3.4", another changing to "5.6.7.8", and a
3210 // final removing "5.6.7.8".
3211 EXPECT_THAT(delegate.address_results(),
3212 testing::ElementsAre(
3213 TestMdnsListenerDelegate::CreateExpectedResult(
3214 HostResolver::MdnsListener::Delegate::UpdateType::ADDED,
3215 DnsQueryType::A, CreateExpected("1.2.3.4", 80)),
3216 TestMdnsListenerDelegate::CreateExpectedResult(
3217 HostResolver::MdnsListener::Delegate::UpdateType::CHANGED,
3218 DnsQueryType::A, CreateExpected("5.6.7.8", 80)),
3219 TestMdnsListenerDelegate::CreateExpectedResult(
3220 HostResolver::MdnsListener::Delegate::UpdateType::REMOVED,
3221 DnsQueryType::A, CreateExpected("5.6.7.8", 80))));
3222
3223 EXPECT_THAT(delegate.text_results(), testing::IsEmpty());
3224 EXPECT_THAT(delegate.hostname_results(), testing::IsEmpty());
3225 EXPECT_THAT(delegate.unhandled_results(), testing::IsEmpty());
3226}
3227
Eric Orthe857ebb2019-03-13 23:02:073228TEST_F(HostResolverManagerTest, MdnsListener_StartListenFailure) {
3229 // Inject an MdnsClient mock that will always fail to start listening.
3230 auto client = std::make_unique<MockMDnsClient>();
3231 EXPECT_CALL(*client, StartListening(_)).WillOnce(Return(ERR_TIMED_OUT));
3232 EXPECT_CALL(*client, IsListening()).WillRepeatedly(Return(false));
3233 resolver_->SetMdnsClientForTesting(std::move(client));
3234
3235 std::unique_ptr<HostResolver::MdnsListener> listener =
3236 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 80),
3237 DnsQueryType::A);
3238 TestMdnsListenerDelegate delegate;
3239 EXPECT_THAT(listener->Start(&delegate), IsError(ERR_TIMED_OUT));
3240 EXPECT_THAT(delegate.address_results(), testing::IsEmpty());
3241}
3242
Eric Orth026776a2019-01-18 00:13:283243// Test that removal notifications are sent on natural expiration of MDNS
3244// records.
Eric Orth960e7062019-03-08 18:43:543245TEST_F(HostResolverManagerTest, MdnsListener_Expiration) {
Eric Orth026776a2019-01-18 00:13:283246 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3247 base::SimpleTestClock clock;
3248 clock.SetNow(base::Time::Now());
3249 auto cache_cleanup_timer = std::make_unique<base::MockOneShotTimer>();
3250 auto* cache_cleanup_timer_ptr = cache_cleanup_timer.get();
3251 auto mdns_client =
3252 std::make_unique<MDnsClientImpl>(&clock, std::move(cache_cleanup_timer));
Eric Orthe857ebb2019-03-13 23:02:073253 ASSERT_THAT(mdns_client->StartListening(socket_factory.get()), IsOk());
Eric Orth026776a2019-01-18 00:13:283254 resolver_->SetMdnsClientForTesting(std::move(mdns_client));
3255
3256 std::unique_ptr<HostResolver::MdnsListener> listener =
3257 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 100),
3258 DnsQueryType::A);
3259
3260 TestMdnsListenerDelegate delegate;
3261 ASSERT_THAT(listener->Start(&delegate), IsOk());
3262 ASSERT_THAT(delegate.address_results(), testing::IsEmpty());
3263
3264 socket_factory->SimulateReceive(kMdnsResponseA, sizeof(kMdnsResponseA));
3265
3266 EXPECT_THAT(
3267 delegate.address_results(),
3268 testing::ElementsAre(TestMdnsListenerDelegate::CreateExpectedResult(
3269 HostResolver::MdnsListener::Delegate::UpdateType::ADDED,
3270 DnsQueryType::A, CreateExpected("1.2.3.4", 100))));
3271
3272 clock.Advance(base::TimeDelta::FromSeconds(16));
3273 cache_cleanup_timer_ptr->Fire();
3274
3275 EXPECT_THAT(delegate.address_results(),
3276 testing::ElementsAre(
3277 TestMdnsListenerDelegate::CreateExpectedResult(
3278 HostResolver::MdnsListener::Delegate::UpdateType::ADDED,
3279 DnsQueryType::A, CreateExpected("1.2.3.4", 100)),
3280 TestMdnsListenerDelegate::CreateExpectedResult(
3281 HostResolver::MdnsListener::Delegate::UpdateType::REMOVED,
3282 DnsQueryType::A, CreateExpected("1.2.3.4", 100))));
3283
3284 EXPECT_THAT(delegate.text_results(), testing::IsEmpty());
3285 EXPECT_THAT(delegate.hostname_results(), testing::IsEmpty());
3286 EXPECT_THAT(delegate.unhandled_results(), testing::IsEmpty());
3287}
3288
Eric Orth960e7062019-03-08 18:43:543289TEST_F(HostResolverManagerTest, MdnsListener_Txt) {
Eric Orth026776a2019-01-18 00:13:283290 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3291 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
3292 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
3293
3294 std::unique_ptr<HostResolver::MdnsListener> listener =
3295 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 12),
3296 DnsQueryType::TXT);
3297
3298 TestMdnsListenerDelegate delegate;
3299 ASSERT_THAT(listener->Start(&delegate), IsOk());
3300 ASSERT_THAT(delegate.text_results(), testing::IsEmpty());
3301
3302 socket_factory_ptr->SimulateReceive(kMdnsResponseTxt,
3303 sizeof(kMdnsResponseTxt));
3304
3305 EXPECT_THAT(delegate.text_results(),
3306 testing::ElementsAre(
3307 TestMdnsListenerDelegate::CreateExpectedResult(
3308 HostResolver::MdnsListener::Delegate::UpdateType::ADDED,
3309 DnsQueryType::TXT, "foo"),
3310 TestMdnsListenerDelegate::CreateExpectedResult(
3311 HostResolver::MdnsListener::Delegate::UpdateType::ADDED,
3312 DnsQueryType::TXT, "bar")));
3313
3314 EXPECT_THAT(delegate.address_results(), testing::IsEmpty());
3315 EXPECT_THAT(delegate.hostname_results(), testing::IsEmpty());
3316 EXPECT_THAT(delegate.unhandled_results(), testing::IsEmpty());
3317}
3318
Eric Orth960e7062019-03-08 18:43:543319TEST_F(HostResolverManagerTest, MdnsListener_Ptr) {
Eric Orth026776a2019-01-18 00:13:283320 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3321 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
3322 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
3323
3324 std::unique_ptr<HostResolver::MdnsListener> listener =
3325 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 13),
3326 DnsQueryType::PTR);
3327
3328 TestMdnsListenerDelegate delegate;
3329 ASSERT_THAT(listener->Start(&delegate), IsOk());
3330 ASSERT_THAT(delegate.text_results(), testing::IsEmpty());
3331
3332 socket_factory_ptr->SimulateReceive(kMdnsResponsePtr,
3333 sizeof(kMdnsResponsePtr));
3334
3335 EXPECT_THAT(
3336 delegate.hostname_results(),
3337 testing::ElementsAre(TestMdnsListenerDelegate::CreateExpectedResult(
3338 HostResolver::MdnsListener::Delegate::UpdateType::ADDED,
3339 DnsQueryType::PTR, HostPortPair("foo.com", 13))));
3340
3341 EXPECT_THAT(delegate.address_results(), testing::IsEmpty());
3342 EXPECT_THAT(delegate.text_results(), testing::IsEmpty());
3343 EXPECT_THAT(delegate.unhandled_results(), testing::IsEmpty());
3344}
3345
Eric Orth960e7062019-03-08 18:43:543346TEST_F(HostResolverManagerTest, MdnsListener_Srv) {
Eric Orth026776a2019-01-18 00:13:283347 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3348 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
3349 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
3350
3351 std::unique_ptr<HostResolver::MdnsListener> listener =
3352 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 14),
3353 DnsQueryType::SRV);
3354
3355 TestMdnsListenerDelegate delegate;
3356 ASSERT_THAT(listener->Start(&delegate), IsOk());
3357 ASSERT_THAT(delegate.text_results(), testing::IsEmpty());
3358
3359 socket_factory_ptr->SimulateReceive(kMdnsResponseSrv,
3360 sizeof(kMdnsResponseSrv));
3361
3362 EXPECT_THAT(
3363 delegate.hostname_results(),
3364 testing::ElementsAre(TestMdnsListenerDelegate::CreateExpectedResult(
3365 HostResolver::MdnsListener::Delegate::UpdateType::ADDED,
3366 DnsQueryType::SRV, HostPortPair("foo.com", 8265))));
3367
3368 EXPECT_THAT(delegate.address_results(), testing::IsEmpty());
3369 EXPECT_THAT(delegate.text_results(), testing::IsEmpty());
3370 EXPECT_THAT(delegate.unhandled_results(), testing::IsEmpty());
3371}
3372
3373// Ensure query types we are not listening for do not affect MdnsListener.
Eric Orth960e7062019-03-08 18:43:543374TEST_F(HostResolverManagerTest, MdnsListener_NonListeningTypes) {
Eric Orth026776a2019-01-18 00:13:283375 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3376 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
3377 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
3378
3379 std::unique_ptr<HostResolver::MdnsListener> listener =
3380 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 41),
3381 DnsQueryType::A);
3382
3383 TestMdnsListenerDelegate delegate;
3384 ASSERT_THAT(listener->Start(&delegate), IsOk());
3385
3386 socket_factory_ptr->SimulateReceive(kMdnsResponseAAAA,
3387 sizeof(kMdnsResponseAAAA));
3388
3389 EXPECT_THAT(delegate.address_results(), testing::IsEmpty());
3390 EXPECT_THAT(delegate.text_results(), testing::IsEmpty());
3391 EXPECT_THAT(delegate.hostname_results(), testing::IsEmpty());
3392 EXPECT_THAT(delegate.unhandled_results(), testing::IsEmpty());
3393}
3394
Eric Orth960e7062019-03-08 18:43:543395TEST_F(HostResolverManagerTest, MdnsListener_RootDomain) {
Eric Orth026776a2019-01-18 00:13:283396 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
3397 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
3398 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
3399
3400 std::unique_ptr<HostResolver::MdnsListener> listener =
3401 resolver_->CreateMdnsListener(HostPortPair("myhello.local", 5),
3402 DnsQueryType::PTR);
3403
3404 TestMdnsListenerDelegate delegate;
3405 ASSERT_THAT(listener->Start(&delegate), IsOk());
3406
3407 socket_factory_ptr->SimulateReceive(kMdnsResponsePtrRoot,
3408 sizeof(kMdnsResponsePtrRoot));
3409
3410 EXPECT_THAT(delegate.unhandled_results(),
3411 testing::ElementsAre(std::make_pair(
3412 HostResolver::MdnsListener::Delegate::UpdateType::ADDED,
3413 DnsQueryType::PTR)));
3414
3415 EXPECT_THAT(delegate.address_results(), testing::IsEmpty());
3416 EXPECT_THAT(delegate.text_results(), testing::IsEmpty());
3417 EXPECT_THAT(delegate.hostname_results(), testing::IsEmpty());
3418}
Eric Orth9871aafa2018-10-02 19:59:183419#endif // BUILDFLAG(ENABLE_MDNS)
3420
[email protected]78eac2a2012-03-14 19:09:273421DnsConfig CreateValidDnsConfig() {
martijna23c8962016-03-04 18:18:513422 IPAddress dns_ip(192, 168, 1, 0);
[email protected]78eac2a2012-03-14 19:09:273423 DnsConfig config;
[email protected]38b50d92012-04-19 21:07:523424 config.nameservers.push_back(IPEndPoint(dns_ip, dns_protocol::kDefaultPort));
dalyk4f4ac712019-05-31 16:33:133425 config.dns_over_https_servers.push_back({DnsConfig::DnsOverHttpsServerConfig(
3426 "https://dns.example.com/", true /* use_post */)});
3427 config.secure_dns_mode = DnsConfig::SecureDnsMode::OFF;
[email protected]78eac2a2012-03-14 19:09:273428 EXPECT_TRUE(config.IsValid());
3429 return config;
3430}
3431
dalykf93a48e372019-09-04 02:57:593432DnsConfig CreateUpgradableDnsConfig() {
3433 DnsConfig config;
3434 config.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
3435 config.allow_dns_over_https_upgrade = true;
3436 // Cloudflare upgradeable IPs
3437 IPAddress dns_ip0(1, 0, 0, 1);
3438 IPAddress dns_ip1;
3439 EXPECT_TRUE(dns_ip1.AssignFromIPLiteral("2606:4700:4700::1111"));
3440 // SafeBrowsing family filter upgradeable IP
3441 IPAddress dns_ip2;
3442 EXPECT_TRUE(dns_ip2.AssignFromIPLiteral("2a0d:2a00:2::"));
3443 // SafeBrowsing security filter upgradeable IP
3444 IPAddress dns_ip3(185, 228, 169, 9);
3445 // Non-upgradeable IP
3446 IPAddress dns_ip4(1, 2, 3, 4);
3447
3448 config.nameservers.push_back(IPEndPoint(dns_ip0, dns_protocol::kDefaultPort));
3449 config.nameservers.push_back(IPEndPoint(dns_ip1, dns_protocol::kDefaultPort));
3450 config.nameservers.push_back(IPEndPoint(dns_ip2, 54));
3451 config.nameservers.push_back(IPEndPoint(dns_ip3, dns_protocol::kDefaultPort));
3452 config.nameservers.push_back(IPEndPoint(dns_ip4, dns_protocol::kDefaultPort));
3453 EXPECT_TRUE(config.IsValid());
3454 return config;
3455}
3456
Matt Menkef4023312019-11-01 18:24:553457// Check that entries are written to the cache with the right NIK.
3458TEST_F(HostResolverManagerTest, NetworkIsolationKeyWriteToHostCache) {
3459 const url::Origin kOrigin1 =
3460 url::Origin::Create(GURL("https://origin1.test/"));
3461 const url::Origin kOrigin2 =
3462 url::Origin::Create(GURL("https://origin2.test/"));
3463 const NetworkIsolationKey kNetworkIsolationKey1(kOrigin1, kOrigin1);
3464 const NetworkIsolationKey kNetworkIsolationKey2(kOrigin2, kOrigin2);
3465
3466 const char kFirstDnsResult[] = "192.168.1.42";
3467 const char kSecondDnsResult[] = "192.168.1.43";
3468
3469 for (bool split_cache_by_network_isolation_key : {false, true}) {
3470 base::test::ScopedFeatureList feature_list;
3471 if (split_cache_by_network_isolation_key) {
3472 feature_list.InitAndEnableFeature(
3473 features::kSplitHostCacheByNetworkIsolationKey);
3474 } else {
3475 feature_list.InitAndDisableFeature(
3476 features::kSplitHostCacheByNetworkIsolationKey);
3477 }
3478 proc_->AddRuleForAllFamilies("just.testing", kFirstDnsResult);
3479 proc_->SignalMultiple(1u);
3480
3481 // Resolve a host using kNetworkIsolationKey1.
3482 ResolveHostResponseHelper response1(resolver_->CreateRequest(
3483 HostPortPair("just.testing", 80), kNetworkIsolationKey1,
3484 NetLogWithSource(), base::nullopt, request_context_.get(),
3485 host_cache_.get()));
3486 EXPECT_THAT(response1.result_error(), IsOk());
3487 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
3488 testing::ElementsAre(CreateExpected(kFirstDnsResult, 80)));
3489 EXPECT_FALSE(response1.request()->GetStaleInfo());
3490 EXPECT_EQ(1u, proc_->GetCaptureList().size());
3491
3492 // If the host cache is being split by NetworkIsolationKeys, there should be
3493 // an entry in the HostCache with kNetworkIsolationKey1. Otherwise, there
3494 // should be an entry with the empy NIK.
3495 if (split_cache_by_network_isolation_key) {
3496 EXPECT_TRUE(GetCacheHit(
3497 HostCache::Key("just.testing", DnsQueryType::UNSPECIFIED,
3498 0 /* host_resolver_flags */, HostResolverSource::ANY,
3499 kNetworkIsolationKey1)));
3500
3501 EXPECT_FALSE(GetCacheHit(
3502 HostCache::Key("just.testing", DnsQueryType::UNSPECIFIED,
3503 0 /* host_resolver_flags */, HostResolverSource::ANY,
3504 NetworkIsolationKey())));
3505 } else {
3506 EXPECT_FALSE(GetCacheHit(
3507 HostCache::Key("just.testing", DnsQueryType::UNSPECIFIED,
3508 0 /* host_resolver_flags */, HostResolverSource::ANY,
3509 kNetworkIsolationKey1)));
3510
3511 EXPECT_TRUE(GetCacheHit(
3512 HostCache::Key("just.testing", DnsQueryType::UNSPECIFIED,
3513 0 /* host_resolver_flags */, HostResolverSource::ANY,
3514 NetworkIsolationKey())));
3515 }
3516
3517 // There should be no entry using kNetworkIsolationKey2 in either case.
3518 EXPECT_FALSE(GetCacheHit(HostCache::Key(
3519 "just.testing", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
3520 HostResolverSource::ANY, kNetworkIsolationKey2)));
3521
3522 // A request using kNetworkIsolationKey2 should only be served out of the
3523 // cache of the cache if |split_cache_by_network_isolation_key| is false. If
3524 // it's not served over the network, it is provided a different result.
3525 if (split_cache_by_network_isolation_key) {
3526 proc_->AddRuleForAllFamilies("just.testing", kSecondDnsResult);
3527 proc_->SignalMultiple(1u);
3528 }
3529 ResolveHostResponseHelper response2(resolver_->CreateRequest(
3530 HostPortPair("just.testing", 80), kNetworkIsolationKey2,
3531 NetLogWithSource(), base::nullopt, request_context_.get(),
3532 host_cache_.get()));
3533 EXPECT_THAT(response2.result_error(), IsOk());
3534 if (split_cache_by_network_isolation_key) {
3535 EXPECT_THAT(response2.request()->GetAddressResults().value().endpoints(),
3536 testing::ElementsAre(CreateExpected(kSecondDnsResult, 80)));
3537 EXPECT_FALSE(response2.request()->GetStaleInfo());
3538 EXPECT_EQ(2u, proc_->GetCaptureList().size());
3539 EXPECT_TRUE(GetCacheHit(
3540 HostCache::Key("just.testing", DnsQueryType::UNSPECIFIED,
3541 0 /* host_resolver_flags */, HostResolverSource::ANY,
3542 kNetworkIsolationKey2)));
3543 } else {
3544 EXPECT_THAT(response2.request()->GetAddressResults().value().endpoints(),
3545 testing::ElementsAre(CreateExpected(kFirstDnsResult, 80)));
3546 EXPECT_TRUE(response2.request()->GetStaleInfo());
3547 EXPECT_EQ(1u, proc_->GetCaptureList().size());
3548 EXPECT_FALSE(GetCacheHit(
3549 HostCache::Key("just.testing", DnsQueryType::UNSPECIFIED,
3550 0 /* host_resolver_flags */, HostResolverSource::ANY,
3551 kNetworkIsolationKey2)));
3552 }
3553
3554 host_cache_->clear();
3555 proc_->ClearCaptureList();
3556 }
3557}
3558
3559// Check that entries are read to the cache with the right NIK.
3560TEST_F(HostResolverManagerTest, NetworkIsolationKeyReadFromHostCache) {
3561 const url::Origin kOrigin1 =
3562 url::Origin::Create(GURL("https://origin1.test/"));
3563 const url::Origin kOrigin2 =
3564 url::Origin::Create(GURL("https://origin2.test/"));
3565 const NetworkIsolationKey kNetworkIsolationKey1(kOrigin1, kOrigin1);
3566 const NetworkIsolationKey kNetworkIsolationKey2(kOrigin2, kOrigin2);
3567
3568 struct CacheEntry {
3569 NetworkIsolationKey network_isolation_key;
3570 const char* cached_ip_address;
3571 };
3572
3573 const CacheEntry kCacheEntries[] = {
3574 {NetworkIsolationKey(), "192.168.1.42"},
3575 {kNetworkIsolationKey1, "192.168.1.43"},
3576 {kNetworkIsolationKey2, "192.168.1.44"},
3577 };
3578
3579 // Add entries to cache for the empty NIK, NIK1, and NIK2. Only the
3580 // HostResolverManager obeys features::kSplitHostCacheByNetworkIsolationKey,
3581 // so this is fine to do regardless of the feature value.
3582 for (const auto& cache_entry : kCacheEntries) {
3583 HostCache::Key key("just.testing", DnsQueryType::UNSPECIFIED, 0,
3584 HostResolverSource::ANY,
3585 cache_entry.network_isolation_key);
3586 IPAddress address;
3587 ASSERT_TRUE(address.AssignFromIPLiteral(cache_entry.cached_ip_address));
3588 HostCache::Entry entry =
3589 HostCache::Entry(OK, AddressList::CreateFromIPAddress(address, 80),
3590 HostCache::Entry::SOURCE_UNKNOWN);
3591 host_cache_->Set(key, entry, base::TimeTicks::Now(),
3592 base::TimeDelta::FromDays(1));
3593 }
3594
3595 for (bool split_cache_by_network_isolation_key : {false, true}) {
3596 base::test::ScopedFeatureList feature_list;
3597 if (split_cache_by_network_isolation_key) {
3598 feature_list.InitAndEnableFeature(
3599 features::kSplitHostCacheByNetworkIsolationKey);
3600 } else {
3601 feature_list.InitAndDisableFeature(
3602 features::kSplitHostCacheByNetworkIsolationKey);
3603 }
3604
3605 // A request that uses kNetworkIsolationKey1 will return cache entry 1 if
3606 // the NetworkIsolationKeys are being used, and cache entry 0 otherwise.
3607 ResolveHostResponseHelper response1(resolver_->CreateRequest(
3608 HostPortPair("just.testing", 80), kNetworkIsolationKey1,
3609 NetLogWithSource(), base::nullopt, request_context_.get(),
3610 host_cache_.get()));
3611 EXPECT_THAT(response1.result_error(), IsOk());
3612 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
3613 testing::ElementsAre(CreateExpected(
3614 kCacheEntries[split_cache_by_network_isolation_key ? 1 : 0]
3615 .cached_ip_address,
3616 80)));
3617 EXPECT_TRUE(response1.request()->GetStaleInfo());
3618
3619 // A request that uses kNetworkIsolationKey2 will return cache entry 2 if
3620 // the NetworkIsolationKeys are being used, and cache entry 0 otherwise.
3621 ResolveHostResponseHelper response2(resolver_->CreateRequest(
3622 HostPortPair("just.testing", 80), kNetworkIsolationKey2,
3623 NetLogWithSource(), base::nullopt, request_context_.get(),
3624 host_cache_.get()));
3625 EXPECT_THAT(response2.result_error(), IsOk());
3626 EXPECT_THAT(response2.request()->GetAddressResults().value().endpoints(),
3627 testing::ElementsAre(CreateExpected(
3628 kCacheEntries[split_cache_by_network_isolation_key ? 2 : 0]
3629 .cached_ip_address,
3630 80)));
3631 EXPECT_TRUE(response2.request()->GetStaleInfo());
3632 }
3633}
3634
3635// Test that two requests made with different NetworkIsolationKeys are not
3636// merged if |features::kSplitHostCacheByNetworkIsolationKey| is enabled.
3637TEST_F(HostResolverManagerTest, NetworkIsolationKeyTwoRequestsAtOnce) {
3638 const url::Origin kOrigin1 =
3639 url::Origin::Create(GURL("https://origin1.test/"));
3640 const url::Origin kOrigin2 =
3641 url::Origin::Create(GURL("https://origin2.test/"));
3642 const NetworkIsolationKey kNetworkIsolationKey1(kOrigin1, kOrigin1);
3643 const NetworkIsolationKey kNetworkIsolationKey2(kOrigin2, kOrigin2);
3644
3645 const char kDnsResult[] = "192.168.1.42";
3646
3647 for (bool split_cache_by_network_isolation_key : {false, true}) {
3648 base::test::ScopedFeatureList feature_list;
3649 if (split_cache_by_network_isolation_key) {
3650 feature_list.InitAndEnableFeature(
3651 features::kSplitHostCacheByNetworkIsolationKey);
3652 } else {
3653 feature_list.InitAndDisableFeature(
3654 features::kSplitHostCacheByNetworkIsolationKey);
3655 }
3656 proc_->AddRuleForAllFamilies("just.testing", kDnsResult);
3657
3658 // Start resolving a host using kNetworkIsolationKey1.
3659 ResolveHostResponseHelper response1(resolver_->CreateRequest(
3660 HostPortPair("just.testing", 80), kNetworkIsolationKey1,
3661 NetLogWithSource(), base::nullopt, request_context_.get(),
3662 host_cache_.get()));
3663 EXPECT_FALSE(response1.complete());
3664
3665 // Start resolving the same host using kNetworkIsolationKey2.
3666 ResolveHostResponseHelper response2(resolver_->CreateRequest(
3667 HostPortPair("just.testing", 80), kNetworkIsolationKey2,
3668 NetLogWithSource(), base::nullopt, request_context_.get(),
3669 host_cache_.get()));
3670 EXPECT_FALSE(response2.complete());
3671
3672 // Wait for and complete the expected number of over-the-wire DNS
3673 // resolutions.
3674 if (split_cache_by_network_isolation_key) {
3675 proc_->WaitFor(2);
3676 EXPECT_EQ(2u, proc_->GetCaptureList().size());
3677 proc_->SignalMultiple(2u);
3678 } else {
3679 proc_->WaitFor(1);
3680 EXPECT_EQ(1u, proc_->GetCaptureList().size());
3681 proc_->SignalMultiple(1u);
3682 }
3683
3684 // Both requests should have completed successfully, with neither served out
3685 // of the cache.
3686
3687 EXPECT_THAT(response1.result_error(), IsOk());
3688 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
3689 testing::ElementsAre(CreateExpected(kDnsResult, 80)));
3690 EXPECT_FALSE(response1.request()->GetStaleInfo());
3691
3692 EXPECT_THAT(response2.result_error(), IsOk());
3693 EXPECT_THAT(response2.request()->GetAddressResults().value().endpoints(),
3694 testing::ElementsAre(CreateExpected(kDnsResult, 80)));
3695 EXPECT_FALSE(response2.request()->GetStaleInfo());
3696
3697 host_cache_->clear();
3698 proc_->ClearCaptureList();
3699 }
3700}
3701
[email protected]1d932852012-06-19 19:40:333702// Specialized fixture for tests of DnsTask.
Eric Orth960e7062019-03-08 18:43:543703class HostResolverManagerDnsTest : public HostResolverManagerTest {
[email protected]daae1322013-09-05 18:26:503704 public:
David Van Cleve1fb5e8c2019-11-04 16:45:163705 explicit HostResolverManagerDnsTest(
3706 base::test::TaskEnvironment::TimeSource time_source =
3707 base::test::TaskEnvironment::TimeSource::SYSTEM_TIME)
3708 : HostResolverManagerTest(time_source),
3709 notifier_task_runner_(base::CreateSequencedTaskRunner(
Eric Orthfe6d5482019-09-03 18:27:573710 {base::ThreadPool(), base::MayBlock()})),
3711 dns_client_(nullptr) {
3712 auto config_service = std::make_unique<TestDnsConfigService>();
3713 config_service_ = config_service.get();
3714 notifier_ = std::make_unique<SystemDnsConfigChangeNotifier>(
3715 notifier_task_runner_, std::move(config_service));
3716 }
[email protected]daae1322013-09-05 18:26:503717
[email protected]1d932852012-06-19 19:40:333718 protected:
Miriam Gershenson17acdf092017-08-23 19:43:083719 void TearDown() override {
Eric Orth960e7062019-03-08 18:43:543720 HostResolverManagerTest::TearDown();
Eric Orthfe6d5482019-09-03 18:27:573721 InvalidateDnsConfig();
Miriam Gershenson17acdf092017-08-23 19:43:083722 }
3723
Eric Orth960e7062019-03-08 18:43:543724 // HostResolverManagerTest implementation:
Eric Orth4e55b362019-05-07 22:00:033725 HostResolver::ManagerOptions DefaultOptions() override {
3726 HostResolver::ManagerOptions options =
3727 HostResolverManagerTest::DefaultOptions();
dalykc27699a2019-07-29 20:53:293728 options.insecure_dns_client_enabled = true;
Eric Orth4e55b362019-05-07 22:00:033729 return options;
3730 }
3731
Eric Orth4e55b362019-05-07 22:00:033732 void CreateResolverWithOptionsAndParams(HostResolver::ManagerOptions options,
3733 const ProcTaskParams& params,
3734 bool ipv6_reachable) override {
Eric Orth37b18192019-04-22 19:09:283735 DestroyResolver();
3736
Eric Orth4e55b362019-05-07 22:00:033737 resolver_ = std::make_unique<TestHostResolverManager>(
Eric Orthfe6d5482019-09-03 18:27:573738 options, notifier_.get(), nullptr /* net_log */, ipv6_reachable);
dalykc27699a2019-07-29 20:53:293739 auto dns_client =
3740 std::make_unique<MockDnsClient>(DnsConfig(), CreateDefaultDnsRules());
3741 dns_client_ = dns_client.get();
3742 resolver_->SetDnsClientForTesting(std::move(dns_client));
Eric Orth394db1732019-08-27 20:09:393743 resolver_->SetInsecureDnsClientEnabled(options.insecure_dns_client_enabled);
[email protected]106ccd2c2014-06-17 09:21:003744 resolver_->set_proc_params_for_test(params);
Eric Orth37b18192019-04-22 19:09:283745
3746 if (host_cache_)
3747 resolver_->AddHostCacheInvalidator(host_cache_->invalidator());
[email protected]1d932852012-06-19 19:40:333748 }
3749
Eric Orth828bd3ae2018-12-12 17:30:363750 // Call after CreateResolver() to update the resolver with a new MockDnsClient
3751 // using |config| and |rules|.
3752 void UseMockDnsClient(const DnsConfig& config, MockDnsClientRuleList rules) {
3753 // HostResolver expects DnsConfig to get set after setting DnsClient, so
3754 // create first with an empty config and then update the config.
3755 auto dns_client =
3756 std::make_unique<MockDnsClient>(DnsConfig(), std::move(rules));
3757 dns_client_ = dns_client.get();
Eric Orth4e55b362019-05-07 22:00:033758 resolver_->SetDnsClientForTesting(std::move(dns_client));
dalykc27699a2019-07-29 20:53:293759 resolver_->SetInsecureDnsClientEnabled(true);
Eric Orth828bd3ae2018-12-12 17:30:363760 if (!config.Equals(DnsConfig()))
3761 ChangeDnsConfig(config);
eroman1efc237c2016-12-14 00:00:453762 }
3763
Eric Orth828bd3ae2018-12-12 17:30:363764 static MockDnsClientRuleList CreateDefaultDnsRules() {
3765 MockDnsClientRuleList rules;
3766
3767 AddDnsRule(&rules, "nodomain", dns_protocol::kTypeA,
dalyk48b20a992019-02-25 16:10:263768 MockDnsClientRule::NODOMAIN, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363769 AddDnsRule(&rules, "nodomain", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:263770 MockDnsClientRule::NODOMAIN, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363771 AddDnsRule(&rules, "nx", dns_protocol::kTypeA, MockDnsClientRule::FAIL,
dalyk48b20a992019-02-25 16:10:263772 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363773 AddDnsRule(&rules, "nx", dns_protocol::kTypeAAAA, MockDnsClientRule::FAIL,
dalyk48b20a992019-02-25 16:10:263774 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363775 AddDnsRule(&rules, "ok", dns_protocol::kTypeA, MockDnsClientRule::OK,
dalyk48b20a992019-02-25 16:10:263776 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363777 AddDnsRule(&rules, "ok", dns_protocol::kTypeAAAA, MockDnsClientRule::OK,
dalyk48b20a992019-02-25 16:10:263778 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363779 AddDnsRule(&rules, "4ok", dns_protocol::kTypeA, MockDnsClientRule::OK,
dalyk48b20a992019-02-25 16:10:263780 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363781 AddDnsRule(&rules, "4ok", dns_protocol::kTypeAAAA, MockDnsClientRule::EMPTY,
dalyk48b20a992019-02-25 16:10:263782 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363783 AddDnsRule(&rules, "6ok", dns_protocol::kTypeA, MockDnsClientRule::EMPTY,
dalyk48b20a992019-02-25 16:10:263784 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363785 AddDnsRule(&rules, "6ok", dns_protocol::kTypeAAAA, MockDnsClientRule::OK,
dalyk48b20a992019-02-25 16:10:263786 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363787 AddDnsRule(&rules, "4nx", dns_protocol::kTypeA, MockDnsClientRule::OK,
dalyk48b20a992019-02-25 16:10:263788 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363789 AddDnsRule(&rules, "4nx", dns_protocol::kTypeAAAA, MockDnsClientRule::FAIL,
dalyk48b20a992019-02-25 16:10:263790 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363791 AddDnsRule(&rules, "empty", dns_protocol::kTypeA, MockDnsClientRule::EMPTY,
dalyk48b20a992019-02-25 16:10:263792 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363793 AddDnsRule(&rules, "empty", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:263794 MockDnsClientRule::EMPTY, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363795
3796 AddDnsRule(&rules, "slow_nx", dns_protocol::kTypeA, MockDnsClientRule::FAIL,
dalyk48b20a992019-02-25 16:10:263797 true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363798 AddDnsRule(&rules, "slow_nx", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:263799 MockDnsClientRule::FAIL, true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363800
3801 AddDnsRule(&rules, "4slow_ok", dns_protocol::kTypeA, MockDnsClientRule::OK,
dalyk48b20a992019-02-25 16:10:263802 true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363803 AddDnsRule(&rules, "4slow_ok", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:263804 MockDnsClientRule::OK, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363805 AddDnsRule(&rules, "6slow_ok", dns_protocol::kTypeA, MockDnsClientRule::OK,
dalyk48b20a992019-02-25 16:10:263806 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363807 AddDnsRule(&rules, "6slow_ok", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:263808 MockDnsClientRule::OK, true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363809 AddDnsRule(&rules, "4slow_4ok", dns_protocol::kTypeA, MockDnsClientRule::OK,
dalyk48b20a992019-02-25 16:10:263810 true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363811 AddDnsRule(&rules, "4slow_4ok", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:263812 MockDnsClientRule::EMPTY, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363813 AddDnsRule(&rules, "4slow_4timeout", dns_protocol::kTypeA,
dalyk48b20a992019-02-25 16:10:263814 MockDnsClientRule::TIMEOUT, true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363815 AddDnsRule(&rules, "4slow_4timeout", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:263816 MockDnsClientRule::OK, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363817 AddDnsRule(&rules, "4slow_6timeout", dns_protocol::kTypeA,
dalyk48b20a992019-02-25 16:10:263818 MockDnsClientRule::OK, true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363819 AddDnsRule(&rules, "4slow_6timeout", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:263820 MockDnsClientRule::TIMEOUT, false /* delay */);
3821
Eric Orth828bd3ae2018-12-12 17:30:363822 AddDnsRule(&rules, "4collision", dns_protocol::kTypeA,
dalyk48b20a992019-02-25 16:10:263823 IPAddress(127, 0, 53, 53), false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363824 AddDnsRule(&rules, "4collision", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:263825 MockDnsClientRule::EMPTY, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363826 AddDnsRule(&rules, "6collision", dns_protocol::kTypeA,
dalyk48b20a992019-02-25 16:10:263827 MockDnsClientRule::EMPTY, false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363828 // This isn't the expected IP for collisions (but looks close to it).
3829 AddDnsRule(&rules, "6collision", dns_protocol::kTypeAAAA,
3830 IPAddress(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 0, 53, 53),
dalyk48b20a992019-02-25 16:10:263831 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:363832
dalyk4f4ac712019-05-31 16:33:133833 AddSecureDnsRule(&rules, "automatic_nodomain", dns_protocol::kTypeA,
3834 MockDnsClientRule::NODOMAIN, false /* delay */);
3835 AddSecureDnsRule(&rules, "automatic_nodomain", dns_protocol::kTypeAAAA,
3836 MockDnsClientRule::NODOMAIN, false /* delay */);
3837 AddDnsRule(&rules, "automatic_nodomain", dns_protocol::kTypeA,
3838 MockDnsClientRule::NODOMAIN, false /* delay */);
3839 AddDnsRule(&rules, "automatic_nodomain", dns_protocol::kTypeAAAA,
3840 MockDnsClientRule::NODOMAIN, false /* delay */);
3841 AddSecureDnsRule(&rules, "automatic", dns_protocol::kTypeA,
3842 MockDnsClientRule::OK, false /* delay */);
3843 AddSecureDnsRule(&rules, "automatic", dns_protocol::kTypeAAAA,
3844 MockDnsClientRule::OK, false /* delay */);
3845 AddDnsRule(&rules, "automatic", dns_protocol::kTypeA, MockDnsClientRule::OK,
3846 false /* delay */);
3847 AddDnsRule(&rules, "automatic", dns_protocol::kTypeAAAA,
3848 MockDnsClientRule::OK, false /* delay */);
3849 AddDnsRule(&rules, "insecure_automatic", dns_protocol::kTypeA,
3850 MockDnsClientRule::OK, false /* delay */);
3851 AddDnsRule(&rules, "insecure_automatic", dns_protocol::kTypeAAAA,
3852 MockDnsClientRule::OK, false /* delay */);
3853
dalykc27699a2019-07-29 20:53:293854 AddSecureDnsRule(&rules, "secure", dns_protocol::kTypeA,
3855 MockDnsClientRule::OK, false /* delay */);
3856 AddSecureDnsRule(&rules, "secure", dns_protocol::kTypeAAAA,
3857 MockDnsClientRule::OK, false /* delay */);
3858
Eric Orth828bd3ae2018-12-12 17:30:363859 return rules;
eroman1efc237c2016-12-14 00:00:453860 }
3861
Eric Orth828bd3ae2018-12-12 17:30:363862 // Adds a rule to |rules|.
3863 static void AddDnsRule(MockDnsClientRuleList* rules,
3864 const std::string& prefix,
3865 uint16_t qtype,
3866 MockDnsClientRule::ResultType result_type,
3867 bool delay) {
dalyk4f4ac712019-05-31 16:33:133868 rules->emplace_back(prefix, qtype, false /* secure */,
dalykad3f6c32019-03-06 13:38:333869 MockDnsClientRule::Result(result_type), delay);
Eric Orth828bd3ae2018-12-12 17:30:363870 }
3871
3872 static void AddDnsRule(MockDnsClientRuleList* rules,
3873 const std::string& prefix,
3874 uint16_t qtype,
3875 const IPAddress& result_ip,
3876 bool delay) {
David Van Cleveac020732019-10-29 00:27:093877 rules->emplace_back(
3878 prefix, qtype, false /* secure */,
3879 MockDnsClientRule::Result(BuildTestDnsResponse(prefix, result_ip)),
3880 delay);
Eric Orth828bd3ae2018-12-12 17:30:363881 }
3882
3883 static void AddDnsRule(MockDnsClientRuleList* rules,
3884 const std::string& prefix,
3885 uint16_t qtype,
3886 IPAddress result_ip,
3887 std::string cannonname,
3888 bool delay) {
David Van Cleveac020732019-10-29 00:27:093889 rules->emplace_back(prefix, qtype, false /* secure */,
3890 MockDnsClientRule::Result(BuildTestDnsResponseWithCname(
3891 prefix, result_ip, std::move(cannonname))),
3892 delay);
[email protected]0adcb2b2012-08-15 21:30:463893 }
3894
dalyk48b20a992019-02-25 16:10:263895 static void AddSecureDnsRule(MockDnsClientRuleList* rules,
3896 const std::string& prefix,
3897 uint16_t qtype,
3898 MockDnsClientRule::ResultType result_type,
3899 bool delay) {
dalyk4f4ac712019-05-31 16:33:133900 rules->emplace_back(prefix, qtype, true /* secure */,
3901 MockDnsClientRule::Result(result_type), delay);
dalyk48b20a992019-02-25 16:10:263902 }
3903
[email protected]1d932852012-06-19 19:40:333904 void ChangeDnsConfig(const DnsConfig& config) {
Eric Orthfe6d5482019-09-03 18:27:573905 DCHECK(config.IsValid());
3906
3907 notifier_task_runner_->PostTask(
3908 FROM_HERE,
3909 base::BindOnce(&TestDnsConfigService::OnHostsRead,
3910 base::Unretained(config_service_), config.hosts));
3911 notifier_task_runner_->PostTask(
3912 FROM_HERE, base::BindOnce(&TestDnsConfigService::OnConfigRead,
3913 base::Unretained(config_service_), config));
3914
3915 base::RunLoop run_loop;
3916 notifier_task_runner_->PostTask(FROM_HERE,
3917 base::BindOnce(run_loop.QuitClosure()));
3918 run_loop.Run();
3919 }
3920
3921 void InvalidateDnsConfig() {
3922 notifier_task_runner_->PostTask(
3923 FROM_HERE,
3924 base::BindOnce(&TestDnsConfigService::OnHostsRead,
3925 base::Unretained(config_service_), DnsHosts()));
3926 notifier_task_runner_->PostTask(
3927 FROM_HERE, base::BindOnce(&TestDnsConfigService::InvalidateConfig,
3928 base::Unretained(config_service_)));
3929
3930 base::RunLoop run_loop;
3931 notifier_task_runner_->PostTask(FROM_HERE,
3932 base::BindOnce(run_loop.QuitClosure()));
3933 run_loop.Run();
[email protected]1d932852012-06-19 19:40:333934 }
3935
Miriam Gershenson44aafc122017-10-18 19:29:253936 void SetInitialDnsConfig(const DnsConfig& config) {
Eric Orthfe6d5482019-09-03 18:27:573937 InvalidateDnsConfig();
3938 ChangeDnsConfig(config);
Miriam Gershenson44aafc122017-10-18 19:29:253939 }
3940
Eric Orthfe6d5482019-09-03 18:27:573941 scoped_refptr<base::SequencedTaskRunner> notifier_task_runner_;
3942 TestDnsConfigService* config_service_;
3943 std::unique_ptr<SystemDnsConfigChangeNotifier> notifier_;
3944
[email protected]daae1322013-09-05 18:26:503945 // Owned by |resolver_|.
3946 MockDnsClient* dns_client_;
[email protected]1d932852012-06-19 19:40:333947};
3948
Eric Orthfe6d5482019-09-03 18:27:573949TEST_F(HostResolverManagerDnsTest, FlushCacheOnDnsConfigChange) {
3950 proc_->SignalMultiple(2u); // One before the flush, one after.
3951
3952 // Resolve to populate the cache.
3953 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:553954 HostPortPair("host1", 70), NetworkIsolationKey(), NetLogWithSource(),
3955 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orthfe6d5482019-09-03 18:27:573956 EXPECT_THAT(initial_response.result_error(), IsOk());
3957 EXPECT_EQ(1u, proc_->GetCaptureList().size());
3958
3959 // Result expected to come from the cache.
3960 ResolveHostResponseHelper cached_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:553961 HostPortPair("host1", 75), NetworkIsolationKey(), NetLogWithSource(),
3962 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orthfe6d5482019-09-03 18:27:573963 EXPECT_THAT(cached_response.result_error(), IsOk());
3964 EXPECT_EQ(1u, proc_->GetCaptureList().size()); // No expected increase.
3965
3966 // Flush cache by triggering a DNS config change.
3967 ChangeDnsConfig(CreateValidDnsConfig());
3968
3969 // Expect flushed from cache and therefore served from |proc_|.
3970 ResolveHostResponseHelper flushed_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:553971 HostPortPair("host1", 80), NetworkIsolationKey(), NetLogWithSource(),
3972 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orthfe6d5482019-09-03 18:27:573973 EXPECT_THAT(flushed_response.result_error(), IsOk());
3974 EXPECT_EQ(2u, proc_->GetCaptureList().size()); // Expected increase.
3975}
3976
dalykc27699a2019-07-29 20:53:293977TEST_F(HostResolverManagerDnsTest, DisableAndEnableInsecureDnsClient) {
Eric Orth4e55b362019-05-07 22:00:033978 // Disable fallback to allow testing how requests are initially handled.
3979 set_allow_fallback_to_proctask(false);
3980
3981 ChangeDnsConfig(CreateValidDnsConfig());
3982 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.2.47");
3983 proc_->SignalMultiple(1u);
3984
dalykc27699a2019-07-29 20:53:293985 resolver_->SetInsecureDnsClientEnabled(false);
Eric Orth4e55b362019-05-07 22:00:033986 ResolveHostResponseHelper response_proc(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:553987 HostPortPair("nx_succeed", 1212), NetworkIsolationKey(),
3988 NetLogWithSource(), base::nullopt, request_context_.get(),
3989 host_cache_.get()));
Eric Orth4e55b362019-05-07 22:00:033990 EXPECT_THAT(response_proc.result_error(), IsOk());
3991 EXPECT_THAT(response_proc.request()->GetAddressResults().value().endpoints(),
3992 testing::ElementsAre(CreateExpected("192.168.2.47", 1212)));
3993
dalykc27699a2019-07-29 20:53:293994 resolver_->SetInsecureDnsClientEnabled(true);
Eric Orth4e55b362019-05-07 22:00:033995 ResolveHostResponseHelper response_dns_client(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:553996 HostPortPair("ok_fail", 1212), NetworkIsolationKey(), NetLogWithSource(),
3997 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth4e55b362019-05-07 22:00:033998 EXPECT_THAT(response_dns_client.result_error(), IsOk());
3999 EXPECT_THAT(
4000 response_dns_client.request()->GetAddressResults().value().endpoints(),
4001 testing::UnorderedElementsAre(CreateExpected("::1", 1212),
4002 CreateExpected("127.0.0.1", 1212)));
4003}
4004
dalyk6d7d8ead2019-08-15 03:30:084005TEST_F(HostResolverManagerDnsTest, UseProcTaskWhenPrivateDnsActive) {
4006 // Disable fallback to allow testing how requests are initially handled.
4007 set_allow_fallback_to_proctask(false);
4008 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.2.47");
4009 proc_->SignalMultiple(1u);
4010
4011 DnsConfig config = CreateValidDnsConfig();
4012 config.dns_over_tls_active = true;
4013 ChangeDnsConfig(config);
4014 ResolveHostResponseHelper response_proc(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554015 HostPortPair("nx_succeed", 1212), NetworkIsolationKey(),
4016 NetLogWithSource(), base::nullopt, request_context_.get(),
4017 host_cache_.get()));
dalyk6d7d8ead2019-08-15 03:30:084018 EXPECT_THAT(response_proc.result_error(), IsOk());
4019 EXPECT_THAT(response_proc.request()->GetAddressResults().value().endpoints(),
4020 testing::ElementsAre(CreateExpected("192.168.2.47", 1212)));
4021}
4022
Mike Westda1c690e2017-08-12 05:57:164023// RFC 6761 localhost names should always resolve to loopback.
Eric Orth960e7062019-03-08 18:43:544024TEST_F(HostResolverManagerDnsTest, LocalhostLookup) {
Mike Westda1c690e2017-08-12 05:57:164025 // Add a rule resolving localhost names to a non-loopback IP and test
4026 // that they still resolves to loopback.
4027 proc_->AddRuleForAllFamilies("foo.localhost", "192.168.1.42");
4028 proc_->AddRuleForAllFamilies("localhost", "192.168.1.42");
4029 proc_->AddRuleForAllFamilies("localhost.", "192.168.1.42");
4030
Eric Orth70992982018-07-24 00:25:004031 ResolveHostResponseHelper response0(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554032 HostPortPair("foo.localhost", 80), NetworkIsolationKey(),
4033 NetLogWithSource(), base::nullopt, request_context_.get(),
4034 host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004035 EXPECT_THAT(response0.result_error(), IsOk());
4036 EXPECT_THAT(response0.request()->GetAddressResults().value().endpoints(),
4037 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4038 CreateExpected("::1", 80)));
4039
4040 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554041 HostPortPair("localhost", 80), NetworkIsolationKey(), NetLogWithSource(),
4042 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004043 EXPECT_THAT(response1.result_error(), IsOk());
4044 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
4045 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4046 CreateExpected("::1", 80)));
4047
4048 ResolveHostResponseHelper response2(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554049 HostPortPair("localhost.", 80), NetworkIsolationKey(), NetLogWithSource(),
4050 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004051 EXPECT_THAT(response2.result_error(), IsOk());
4052 EXPECT_THAT(response2.request()->GetAddressResults().value().endpoints(),
4053 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4054 CreateExpected("::1", 80)));
4055}
4056
Mike Westda1c690e2017-08-12 05:57:164057// RFC 6761 localhost names should always resolve to loopback, even if a HOSTS
4058// file is active.
Eric Orth960e7062019-03-08 18:43:544059TEST_F(HostResolverManagerDnsTest, LocalhostLookupWithHosts) {
Mike Westda1c690e2017-08-12 05:57:164060 DnsHosts hosts;
4061 hosts[DnsHostsKey("localhost", ADDRESS_FAMILY_IPV4)] =
4062 IPAddress({192, 168, 1, 1});
4063 hosts[DnsHostsKey("foo.localhost", ADDRESS_FAMILY_IPV4)] =
4064 IPAddress({192, 168, 1, 2});
4065
4066 DnsConfig config = CreateValidDnsConfig();
4067 config.hosts = hosts;
4068 ChangeDnsConfig(config);
4069
Eric Orth70992982018-07-24 00:25:004070 ResolveHostResponseHelper response0(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554071 HostPortPair("localhost", 80), NetworkIsolationKey(), NetLogWithSource(),
4072 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004073 EXPECT_THAT(response0.result_error(), IsOk());
4074 EXPECT_THAT(response0.request()->GetAddressResults().value().endpoints(),
4075 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4076 CreateExpected("::1", 80)));
4077
4078 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554079 HostPortPair("foo.localhost", 80), NetworkIsolationKey(),
4080 NetLogWithSource(), base::nullopt, request_context_.get(),
4081 host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004082 EXPECT_THAT(response1.result_error(), IsOk());
4083 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
4084 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4085 CreateExpected("::1", 80)));
4086}
4087
Eric Orth960e7062019-03-08 18:43:544088// Test successful and fallback resolutions in HostResolverManager::DnsTask.
4089TEST_F(HostResolverManagerDnsTest, DnsTask) {
[email protected]38b50d92012-04-19 21:07:524090 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.102");
4091 // All other hostnames will fail in proc_.
[email protected]78eac2a2012-03-14 19:09:274092
4093 // Initially there is no config, so client should not be invoked.
Eric Orth117e1992019-04-17 00:24:154094 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554095 HostPortPair("ok_fail", 80), NetworkIsolationKey(), NetLogWithSource(),
4096 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004097 EXPECT_FALSE(initial_response.complete());
4098
4099 proc_->SignalMultiple(1u);
4100
4101 EXPECT_THAT(initial_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
4102
4103 ChangeDnsConfig(CreateValidDnsConfig());
4104
Eric Orth117e1992019-04-17 00:24:154105 ResolveHostResponseHelper response0(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554106 HostPortPair("ok_fail", 80), NetworkIsolationKey(), NetLogWithSource(),
4107 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth117e1992019-04-17 00:24:154108 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554109 HostPortPair("nx_fail", 80), NetworkIsolationKey(), NetLogWithSource(),
4110 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004111 ResolveHostResponseHelper response2(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554112 HostPortPair("nx_succeed", 80), NetworkIsolationKey(), NetLogWithSource(),
4113 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004114
4115 proc_->SignalMultiple(4u);
4116
4117 // Resolved by MockDnsClient.
4118 EXPECT_THAT(response0.result_error(), IsOk());
4119 EXPECT_THAT(response0.request()->GetAddressResults().value().endpoints(),
4120 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4121 CreateExpected("::1", 80)));
4122
4123 // Fallback to ProcTask.
4124 EXPECT_THAT(response1.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
4125 EXPECT_THAT(response2.result_error(), IsOk());
4126 EXPECT_THAT(response2.request()->GetAddressResults().value().endpoints(),
4127 testing::ElementsAre(CreateExpected("192.168.1.102", 80)));
4128}
4129
Eric Orth960e7062019-03-08 18:43:544130// Test successful and failing resolutions in HostResolverManager::DnsTask when
[email protected]16c2bd72013-06-28 01:19:224131// fallback to ProcTask is disabled.
Eric Orth960e7062019-03-08 18:43:544132TEST_F(HostResolverManagerDnsTest, NoFallbackToProcTask) {
Eric Orth60931742018-11-05 23:40:574133 set_allow_fallback_to_proctask(false);
[email protected]16c2bd72013-06-28 01:19:224134
[email protected]16c2bd72013-06-28 01:19:224135 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.102");
4136 // All other hostnames will fail in proc_.
4137
4138 // Set empty DnsConfig.
Eric Orthfe6d5482019-09-03 18:27:574139 InvalidateDnsConfig();
[email protected]16c2bd72013-06-28 01:19:224140 // Initially there is no config, so client should not be invoked.
Eric Orth117e1992019-04-17 00:24:154141 ResolveHostResponseHelper initial_response0(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554142 HostPortPair("ok_fail", 80), NetworkIsolationKey(), NetLogWithSource(),
4143 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004144 ResolveHostResponseHelper initial_response1(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554145 HostPortPair("nx_succeed", 80), NetworkIsolationKey(), NetLogWithSource(),
4146 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004147 proc_->SignalMultiple(2u);
4148
4149 EXPECT_THAT(initial_response0.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
4150 EXPECT_THAT(initial_response1.result_error(), IsOk());
4151 EXPECT_THAT(
4152 initial_response1.request()->GetAddressResults().value().endpoints(),
4153 testing::ElementsAre(CreateExpected("192.168.1.102", 80)));
4154
dalykc27699a2019-07-29 20:53:294155 // Switch to a valid config.
Eric Orth70992982018-07-24 00:25:004156 ChangeDnsConfig(CreateValidDnsConfig());
Eric Orth70992982018-07-24 00:25:004157 // First request is resolved by MockDnsClient, others should fail due to
4158 // disabled fallback to ProcTask.
Eric Orth117e1992019-04-17 00:24:154159 ResolveHostResponseHelper response0(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554160 HostPortPair("ok_fail", 80), NetworkIsolationKey(), NetLogWithSource(),
4161 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth117e1992019-04-17 00:24:154162 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554163 HostPortPair("nx_succeed", 80), NetworkIsolationKey(), NetLogWithSource(),
4164 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004165 proc_->SignalMultiple(6u);
4166
Eric Orth70992982018-07-24 00:25:004167 // Resolved by MockDnsClient.
4168 EXPECT_THAT(response0.result_error(), IsOk());
4169 EXPECT_THAT(response0.request()->GetAddressResults().value().endpoints(),
4170 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4171 CreateExpected("::1", 80)));
4172 // Fallback to ProcTask is disabled.
4173 EXPECT_THAT(response1.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
4174}
4175
[email protected]16c2bd72013-06-28 01:19:224176// Test behavior of OnDnsTaskFailure when Job is aborted.
Eric Orth960e7062019-03-08 18:43:544177TEST_F(HostResolverManagerDnsTest, OnDnsTaskFailureAbortedJob) {
[email protected]16c2bd72013-06-28 01:19:224178 ChangeDnsConfig(CreateValidDnsConfig());
Eric Orth117e1992019-04-17 00:24:154179 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554180 HostPortPair("nx_abort", 80), NetworkIsolationKey(), NetLogWithSource(),
4181 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004182 // Abort all jobs here.
4183 CreateResolver();
4184 proc_->SignalMultiple(1u);
4185 // Run to completion.
4186 base::RunLoop().RunUntilIdle(); // Notification happens async.
4187 // It shouldn't crash during OnDnsTaskFailure callbacks.
4188 EXPECT_FALSE(response.complete());
4189
4190 // Repeat test with Fallback to ProcTask disabled
Eric Orth60931742018-11-05 23:40:574191 set_allow_fallback_to_proctask(false);
Eric Orth70992982018-07-24 00:25:004192 ChangeDnsConfig(CreateValidDnsConfig());
Eric Orth117e1992019-04-17 00:24:154193 ResolveHostResponseHelper no_fallback_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554194 HostPortPair("nx_abort", 80), NetworkIsolationKey(), NetLogWithSource(),
4195 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004196 // Abort all jobs here.
4197 CreateResolver();
4198 proc_->SignalMultiple(2u);
4199 // Run to completion.
4200 base::RunLoop().RunUntilIdle(); // Notification happens async.
4201 // It shouldn't crash during OnDnsTaskFailure callbacks.
4202 EXPECT_FALSE(no_fallback_response.complete());
4203}
4204
Eric Orth60931742018-11-05 23:40:574205// Fallback to proc allowed with ANY source.
Eric Orth960e7062019-03-08 18:43:544206TEST_F(HostResolverManagerDnsTest, FallbackBySource_Any) {
Eric Orth60931742018-11-05 23:40:574207 // Ensure fallback is otherwise allowed by resolver settings.
4208 set_allow_fallback_to_proctask(true);
4209
4210 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.102");
4211 // All other hostnames will fail in proc_.
4212
4213 ChangeDnsConfig(CreateValidDnsConfig());
4214
Eric Orth117e1992019-04-17 00:24:154215 ResolveHostResponseHelper response0(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554216 HostPortPair("nx_fail", 80), NetworkIsolationKey(), NetLogWithSource(),
4217 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth60931742018-11-05 23:40:574218 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554219 HostPortPair("nx_succeed", 80), NetworkIsolationKey(), NetLogWithSource(),
4220 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth60931742018-11-05 23:40:574221 proc_->SignalMultiple(2u);
4222
4223 EXPECT_THAT(response0.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
4224 EXPECT_THAT(response1.result_error(), IsOk());
4225 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
4226 testing::ElementsAre(CreateExpected("192.168.1.102", 80)));
4227}
4228
4229// Fallback to proc not allowed with DNS source.
Eric Orth960e7062019-03-08 18:43:544230TEST_F(HostResolverManagerDnsTest, FallbackBySource_Dns) {
Eric Orth60931742018-11-05 23:40:574231 // Ensure fallback is otherwise allowed by resolver settings.
4232 set_allow_fallback_to_proctask(true);
4233
4234 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.102");
4235 // All other hostnames will fail in proc_.
4236
4237 ChangeDnsConfig(CreateValidDnsConfig());
4238
4239 HostResolver::ResolveHostParameters parameters;
4240 parameters.source = HostResolverSource::DNS;
Eric Orth117e1992019-04-17 00:24:154241 ResolveHostResponseHelper response0(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554242 HostPortPair("nx_fail", 80), NetworkIsolationKey(), NetLogWithSource(),
4243 parameters, request_context_.get(), host_cache_.get()));
Eric Orth60931742018-11-05 23:40:574244 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554245 HostPortPair("nx_succeed", 80), NetworkIsolationKey(), NetLogWithSource(),
4246 parameters, request_context_.get(), host_cache_.get()));
Eric Orth60931742018-11-05 23:40:574247 // Nothing should reach |proc_| on success, but let failures through to fail
4248 // instead of hanging.
4249 proc_->SignalMultiple(2u);
4250
4251 EXPECT_THAT(response0.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
4252 EXPECT_THAT(response1.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
4253}
4254
4255// Fallback to proc on DnsClient change allowed with ANY source.
Eric Orth960e7062019-03-08 18:43:544256TEST_F(HostResolverManagerDnsTest, FallbackOnAbortBySource_Any) {
Eric Orth60931742018-11-05 23:40:574257 // Ensure fallback is otherwise allowed by resolver settings.
4258 set_allow_fallback_to_proctask(true);
4259
4260 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.102");
4261 // All other hostnames will fail in proc_.
4262
4263 ChangeDnsConfig(CreateValidDnsConfig());
4264
Eric Orth117e1992019-04-17 00:24:154265 ResolveHostResponseHelper response0(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554266 HostPortPair("ok_fail", 80), NetworkIsolationKey(), NetLogWithSource(),
4267 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth60931742018-11-05 23:40:574268 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554269 HostPortPair("nx_succeed", 80), NetworkIsolationKey(), NetLogWithSource(),
4270 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth60931742018-11-05 23:40:574271 proc_->SignalMultiple(2u);
4272
dalykc27699a2019-07-29 20:53:294273 // Simulate the case when the preference or policy has disabled the insecure
4274 // DNS client causing AbortInsecureDnsTasks.
4275 resolver_->SetInsecureDnsClientEnabled(false);
Eric Orth60931742018-11-05 23:40:574276
4277 // All requests should fallback to proc resolver.
4278 EXPECT_THAT(response0.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
4279 EXPECT_THAT(response1.result_error(), IsOk());
4280 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
4281 testing::ElementsAre(CreateExpected("192.168.1.102", 80)));
4282}
4283
4284// Fallback to proc on DnsClient change not allowed with DNS source.
Eric Orth960e7062019-03-08 18:43:544285TEST_F(HostResolverManagerDnsTest, FallbackOnAbortBySource_Dns) {
Eric Orth60931742018-11-05 23:40:574286 // Ensure fallback is otherwise allowed by resolver settings.
4287 set_allow_fallback_to_proctask(true);
4288
4289 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.102");
4290 // All other hostnames will fail in proc_.
4291
4292 ChangeDnsConfig(CreateValidDnsConfig());
4293
4294 HostResolver::ResolveHostParameters parameters;
4295 parameters.source = HostResolverSource::DNS;
Eric Orth117e1992019-04-17 00:24:154296 ResolveHostResponseHelper response0(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554297 HostPortPair("ok_fail", 80), NetworkIsolationKey(), NetLogWithSource(),
4298 parameters, request_context_.get(), host_cache_.get()));
Eric Orth60931742018-11-05 23:40:574299 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554300 HostPortPair("nx_succeed", 80), NetworkIsolationKey(), NetLogWithSource(),
4301 parameters, request_context_.get(), host_cache_.get()));
Eric Orth60931742018-11-05 23:40:574302 // Nothing should reach |proc_| on success, but let failures through to fail
4303 // instead of hanging.
4304 proc_->SignalMultiple(2u);
4305
dalykc27699a2019-07-29 20:53:294306 // Simulate the case when the preference or policy has disabled the insecure
4307 // DNS client causing AbortInsecureDnsTasks.
4308 resolver_->SetInsecureDnsClientEnabled(false);
Eric Orth60931742018-11-05 23:40:574309
4310 // No fallback expected. All requests should fail.
4311 EXPECT_THAT(response0.result_error(), IsError(ERR_NETWORK_CHANGED));
4312 EXPECT_THAT(response1.result_error(), IsError(ERR_NETWORK_CHANGED));
4313}
4314
dalykc27699a2019-07-29 20:53:294315// Insecure DnsClient change shouldn't affect secure DnsTasks.
4316TEST_F(HostResolverManagerDnsTest,
4317 DisableInsecureDnsClient_SecureDnsTasksUnaffected) {
4318 // Ensure fallback is otherwise allowed by resolver settings.
4319 set_allow_fallback_to_proctask(true);
4320
4321 proc_->AddRuleForAllFamilies("automatic", "192.168.1.102");
4322 // All other hostnames will fail in proc_.
4323
4324 ChangeDnsConfig(CreateValidDnsConfig());
4325
4326 HostResolver::ResolveHostParameters secure_parameters;
4327 secure_parameters.secure_dns_mode_override =
4328 DnsConfig::SecureDnsMode::AUTOMATIC;
4329 ResolveHostResponseHelper response_secure(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554330 HostPortPair("automatic", 80), NetworkIsolationKey(), NetLogWithSource(),
4331 secure_parameters, request_context_.get(), host_cache_.get()));
dalykc27699a2019-07-29 20:53:294332 EXPECT_FALSE(response_secure.complete());
4333
4334 // Simulate the case when the preference or policy has disabled the insecure
4335 // DNS client causing AbortInsecureDnsTasks.
4336 resolver_->SetInsecureDnsClientEnabled(false);
4337
4338 EXPECT_THAT(response_secure.result_error(), IsOk());
4339 EXPECT_THAT(
4340 response_secure.request()->GetAddressResults().value().endpoints(),
4341 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4342 CreateExpected("::1", 80)));
4343}
4344
Eric Orth960e7062019-03-08 18:43:544345TEST_F(HostResolverManagerDnsTest, DnsTaskUnspec) {
[email protected]0adcb2b2012-08-15 21:30:464346 ChangeDnsConfig(CreateValidDnsConfig());
4347
4348 proc_->AddRuleForAllFamilies("4nx", "192.168.1.101");
4349 // All other hostnames will fail in proc_.
4350
Eric Orth70992982018-07-24 00:25:004351 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:154352 responses.emplace_back(
4353 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554354 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
4355 base::nullopt, request_context_.get(), host_cache_.get())));
Eric Orth117e1992019-04-17 00:24:154356 responses.emplace_back(
4357 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554358 HostPortPair("4ok", 80), NetworkIsolationKey(), NetLogWithSource(),
4359 base::nullopt, request_context_.get(), host_cache_.get())));
Eric Orth117e1992019-04-17 00:24:154360 responses.emplace_back(
4361 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554362 HostPortPair("6ok", 80), NetworkIsolationKey(), NetLogWithSource(),
4363 base::nullopt, request_context_.get(), host_cache_.get())));
Eric Orth117e1992019-04-17 00:24:154364 responses.emplace_back(
4365 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554366 HostPortPair("4nx", 80), NetworkIsolationKey(), NetLogWithSource(),
4367 base::nullopt, request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:004368
4369 proc_->SignalMultiple(4u);
4370
4371 for (auto& response : responses) {
4372 EXPECT_THAT(response->result_error(), IsOk());
4373 }
4374
4375 EXPECT_THAT(responses[0]->request()->GetAddressResults().value().endpoints(),
4376 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4377 CreateExpected("::1", 80)));
4378 EXPECT_THAT(responses[1]->request()->GetAddressResults().value().endpoints(),
4379 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
4380 EXPECT_THAT(responses[2]->request()->GetAddressResults().value().endpoints(),
4381 testing::ElementsAre(CreateExpected("::1", 80)));
4382 EXPECT_THAT(responses[3]->request()->GetAddressResults().value().endpoints(),
4383 testing::ElementsAre(CreateExpected("192.168.1.101", 80)));
4384}
4385
Eric Orth960e7062019-03-08 18:43:544386TEST_F(HostResolverManagerDnsTest, NameCollisionIcann) {
eroman1efc237c2016-12-14 00:00:454387 ChangeDnsConfig(CreateValidDnsConfig());
4388
Eric Orth70992982018-07-24 00:25:004389 // When the resolver returns an A record with 127.0.53.53 it should be
4390 // mapped to a special error.
4391 ResolveHostResponseHelper response_ipv4(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554392 HostPortPair("4collision", 80), NetworkIsolationKey(), NetLogWithSource(),
4393 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004394 EXPECT_THAT(response_ipv4.result_error(), IsError(ERR_ICANN_NAME_COLLISION));
4395 EXPECT_FALSE(response_ipv4.request()->GetAddressResults());
4396
4397 // When the resolver returns an AAAA record with ::127.0.53.53 it should
4398 // work just like any other IP. (Despite having the same suffix, it is not
4399 // considered special)
4400 ResolveHostResponseHelper response_ipv6(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554401 HostPortPair("6collision", 80), NetworkIsolationKey(), NetLogWithSource(),
4402 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004403 EXPECT_THAT(response_ipv6.result_error(), IsOk());
4404 EXPECT_THAT(response_ipv6.request()->GetAddressResults().value().endpoints(),
4405 testing::ElementsAre(CreateExpected("::127.0.53.53", 80)));
4406}
4407
Eric Orth960e7062019-03-08 18:43:544408TEST_F(HostResolverManagerDnsTest, ServeFromHosts) {
[email protected]d7b9a2b2012-05-31 22:31:194409 // Initially, use empty HOSTS file.
[email protected]bb0e34542012-08-31 19:52:404410 DnsConfig config = CreateValidDnsConfig();
4411 ChangeDnsConfig(config);
[email protected]d7b9a2b2012-05-31 22:31:194412
[email protected]007b3f82013-04-09 08:46:454413 proc_->AddRuleForAllFamilies(std::string(),
4414 std::string()); // Default to failures.
[email protected]38b50d92012-04-19 21:07:524415 proc_->SignalMultiple(1u); // For the first request which misses.
[email protected]78eac2a2012-03-14 19:09:274416
Eric Orth117e1992019-04-17 00:24:154417 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554418 HostPortPair("nx_ipv4", 80), NetworkIsolationKey(), NetLogWithSource(),
4419 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004420 EXPECT_THAT(initial_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
4421
4422 IPAddress local_ipv4 = IPAddress::IPv4Localhost();
4423 IPAddress local_ipv6 = IPAddress::IPv6Localhost();
4424
4425 DnsHosts hosts;
4426 hosts[DnsHostsKey("nx_ipv4", ADDRESS_FAMILY_IPV4)] = local_ipv4;
4427 hosts[DnsHostsKey("nx_ipv6", ADDRESS_FAMILY_IPV6)] = local_ipv6;
4428 hosts[DnsHostsKey("nx_both", ADDRESS_FAMILY_IPV4)] = local_ipv4;
4429 hosts[DnsHostsKey("nx_both", ADDRESS_FAMILY_IPV6)] = local_ipv6;
4430
4431 // Update HOSTS file.
4432 config.hosts = hosts;
4433 ChangeDnsConfig(config);
4434
Eric Orth117e1992019-04-17 00:24:154435 ResolveHostResponseHelper response_ipv4(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554436 HostPortPair("nx_ipv4", 80), NetworkIsolationKey(), NetLogWithSource(),
4437 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004438 EXPECT_THAT(response_ipv4.result_error(), IsOk());
4439 EXPECT_THAT(response_ipv4.request()->GetAddressResults().value().endpoints(),
4440 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
4441
Eric Orth117e1992019-04-17 00:24:154442 ResolveHostResponseHelper response_ipv6(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554443 HostPortPair("nx_ipv6", 80), NetworkIsolationKey(), NetLogWithSource(),
4444 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004445 EXPECT_THAT(response_ipv6.result_error(), IsOk());
4446 EXPECT_THAT(response_ipv6.request()->GetAddressResults().value().endpoints(),
4447 testing::ElementsAre(CreateExpected("::1", 80)));
4448
Eric Orth117e1992019-04-17 00:24:154449 ResolveHostResponseHelper response_both(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554450 HostPortPair("nx_both", 80), NetworkIsolationKey(), NetLogWithSource(),
4451 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004452 EXPECT_THAT(response_both.result_error(), IsOk());
4453 EXPECT_THAT(response_both.request()->GetAddressResults().value().endpoints(),
4454 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4455 CreateExpected("::1", 80)));
4456
Eric Orth00fe5a62018-08-15 22:20:004457 // Requests with specified DNS query type.
4458 HostResolver::ResolveHostParameters parameters;
4459
Eric Orth192e3bb2018-11-14 19:30:324460 parameters.dns_query_type = DnsQueryType::A;
Eric Orth117e1992019-04-17 00:24:154461 ResolveHostResponseHelper response_specified_ipv4(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554462 HostPortPair("nx_ipv4", 80), NetworkIsolationKey(), NetLogWithSource(),
4463 parameters, request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:004464 EXPECT_THAT(response_specified_ipv4.result_error(), IsOk());
4465 EXPECT_THAT(response_specified_ipv4.request()
4466 ->GetAddressResults()
4467 .value()
4468 .endpoints(),
4469 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
4470
Eric Orth192e3bb2018-11-14 19:30:324471 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth117e1992019-04-17 00:24:154472 ResolveHostResponseHelper response_specified_ipv6(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554473 HostPortPair("nx_ipv6", 80), NetworkIsolationKey(), NetLogWithSource(),
4474 parameters, request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:004475 EXPECT_THAT(response_specified_ipv6.result_error(), IsOk());
4476 EXPECT_THAT(response_specified_ipv6.request()
4477 ->GetAddressResults()
4478 .value()
4479 .endpoints(),
4480 testing::ElementsAre(CreateExpected("::1", 80)));
4481
Eric Orth70992982018-07-24 00:25:004482 // Request with upper case.
Eric Orth117e1992019-04-17 00:24:154483 ResolveHostResponseHelper response_upper(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554484 HostPortPair("nx_IPV4", 80), NetworkIsolationKey(), NetLogWithSource(),
4485 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004486 EXPECT_THAT(response_upper.result_error(), IsOk());
4487 EXPECT_THAT(response_upper.request()->GetAddressResults().value().endpoints(),
4488 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
4489}
4490
dalykc27699a2019-07-29 20:53:294491TEST_F(HostResolverManagerDnsTest, SkipHostsWithUpcomingProcTask) {
4492 // Disable the DnsClient.
4493 resolver_->SetInsecureDnsClientEnabled(false);
4494
4495 proc_->AddRuleForAllFamilies(std::string(),
4496 std::string()); // Default to failures.
4497 proc_->SignalMultiple(1u); // For the first request which misses.
4498
4499 DnsConfig config = CreateValidDnsConfig();
4500 DnsHosts hosts;
4501 hosts[DnsHostsKey("hosts", ADDRESS_FAMILY_IPV4)] = IPAddress::IPv4Localhost();
4502
4503 // Update HOSTS file.
4504 config.hosts = hosts;
4505 ChangeDnsConfig(config);
4506
4507 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554508 HostPortPair("hosts", 80), NetworkIsolationKey(), NetLogWithSource(),
4509 base::nullopt, request_context_.get(), host_cache_.get()));
dalykc27699a2019-07-29 20:53:294510 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
4511}
4512
Eric Orthdc35748e2018-08-23 22:41:484513// Test that hosts ending in ".local" or ".local." are resolved using the system
4514// resolver.
Eric Orth960e7062019-03-08 18:43:544515TEST_F(HostResolverManagerDnsTest, BypassDnsTask) {
Eric Orth70992982018-07-24 00:25:004516 ChangeDnsConfig(CreateValidDnsConfig());
4517
4518 proc_->AddRuleForAllFamilies(std::string(),
4519 std::string()); // Default to failures.
4520
4521 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
4522
Eric Orth117e1992019-04-17 00:24:154523 responses.emplace_back(
4524 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554525 HostPortPair("ok.local", 80), NetworkIsolationKey(),
4526 NetLogWithSource(), base::nullopt, request_context_.get(),
4527 host_cache_.get())));
Eric Orth70992982018-07-24 00:25:004528 responses.emplace_back(
4529 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554530 HostPortPair("ok.local.", 80), NetworkIsolationKey(),
4531 NetLogWithSource(), base::nullopt, request_context_.get(),
4532 host_cache_.get())));
Eric Orth117e1992019-04-17 00:24:154533 responses.emplace_back(
4534 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554535 HostPortPair("oklocal", 80), NetworkIsolationKey(),
4536 NetLogWithSource(), base::nullopt, request_context_.get(),
4537 host_cache_.get())));
Eric Orth117e1992019-04-17 00:24:154538 responses.emplace_back(
4539 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554540 HostPortPair("oklocal.", 80), NetworkIsolationKey(),
4541 NetLogWithSource(), base::nullopt, request_context_.get(),
4542 host_cache_.get())));
Eric Orth117e1992019-04-17 00:24:154543 responses.emplace_back(
4544 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554545 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
4546 base::nullopt, request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:004547
4548 proc_->SignalMultiple(5u);
4549
4550 for (size_t i = 0; i < 2; ++i)
4551 EXPECT_THAT(responses[i]->result_error(), IsError(ERR_NAME_NOT_RESOLVED));
4552
4553 for (size_t i = 2; i < responses.size(); ++i)
4554 EXPECT_THAT(responses[i]->result_error(), IsOk());
4555}
4556
Eric Orth828bd3ae2018-12-12 17:30:364557#if BUILDFLAG(ENABLE_MDNS)
4558// Test that non-address queries for hosts ending in ".local" are resolved using
4559// the MDNS resolver.
Eric Orth960e7062019-03-08 18:43:544560TEST_F(HostResolverManagerDnsTest, BypassDnsToMdnsWithNonAddress) {
Eric Orth828bd3ae2018-12-12 17:30:364561 // Ensure DNS task and system (proc) requests will fail.
4562 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:134563 rules.emplace_back(
4564 "myhello.local", dns_protocol::kTypeTXT, false /* secure */,
4565 MockDnsClientRule::Result(MockDnsClientRule::FAIL), false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:364566 CreateResolver();
4567 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
4568 proc_->AddRuleForAllFamilies(std::string(), std::string());
4569
4570 auto socket_factory = std::make_unique<MockMDnsSocketFactory>();
4571 MockMDnsSocketFactory* socket_factory_ptr = socket_factory.get();
4572 resolver_->SetMdnsSocketFactoryForTesting(std::move(socket_factory));
4573 // 2 socket creations for every transaction.
4574 EXPECT_CALL(*socket_factory_ptr, OnSendTo(_)).Times(2);
4575
4576 HostResolver::ResolveHostParameters dns_parameters;
4577 dns_parameters.dns_query_type = DnsQueryType::TXT;
4578
4579 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554580 HostPortPair("myhello.local", 80), NetworkIsolationKey(),
4581 NetLogWithSource(), dns_parameters, request_context_.get(),
4582 host_cache_.get()));
Eric Orth828bd3ae2018-12-12 17:30:364583
4584 socket_factory_ptr->SimulateReceive(kMdnsResponseTxt,
4585 sizeof(kMdnsResponseTxt));
4586 proc_->SignalMultiple(1u);
4587
4588 EXPECT_THAT(response.result_error(), IsOk());
4589 EXPECT_THAT(response.request()->GetTextResults(),
4590 testing::Optional(testing::ElementsAre("foo", "bar")));
4591}
4592#endif // BUILDFLAG(ENABLE_MDNS)
4593
Eric Orthdc35748e2018-08-23 22:41:484594// Test that DNS task is always used when explicitly requested as the source,
4595// even with a case that would normally bypass it eg hosts ending in ".local".
Eric Orth960e7062019-03-08 18:43:544596TEST_F(HostResolverManagerDnsTest, DnsNotBypassedWhenDnsSource) {
Eric Orthdc35748e2018-08-23 22:41:484597 // Ensure DNS task requests will succeed and system (proc) requests will fail.
4598 ChangeDnsConfig(CreateValidDnsConfig());
4599 proc_->AddRuleForAllFamilies(std::string(), std::string());
4600
4601 HostResolver::ResolveHostParameters dns_parameters;
4602 dns_parameters.source = HostResolverSource::DNS;
4603
Eric Orth117e1992019-04-17 00:24:154604 ResolveHostResponseHelper dns_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554605 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
4606 dns_parameters, request_context_.get(), host_cache_.get()));
Eric Orth117e1992019-04-17 00:24:154607 ResolveHostResponseHelper dns_local_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554608 HostPortPair("ok.local", 80), NetworkIsolationKey(), NetLogWithSource(),
4609 dns_parameters, request_context_.get(), host_cache_.get()));
Eric Orth117e1992019-04-17 00:24:154610 ResolveHostResponseHelper normal_local_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554611 HostPortPair("ok.local", 80), NetworkIsolationKey(), NetLogWithSource(),
4612 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orthdc35748e2018-08-23 22:41:484613
4614 proc_->SignalMultiple(3u);
4615
4616 EXPECT_THAT(dns_response.result_error(), IsOk());
4617 EXPECT_THAT(dns_local_response.result_error(), IsOk());
4618 EXPECT_THAT(normal_local_response.result_error(),
4619 IsError(ERR_NAME_NOT_RESOLVED));
4620}
4621
Eric Orth960e7062019-03-08 18:43:544622TEST_F(HostResolverManagerDnsTest, SystemOnlyBypassesDnsTask) {
Eric Orthdc35748e2018-08-23 22:41:484623 // Ensure DNS task requests will succeed and system (proc) requests will fail.
4624 ChangeDnsConfig(CreateValidDnsConfig());
4625 proc_->AddRuleForAllFamilies(std::string(), std::string());
4626
Eric Orth117e1992019-04-17 00:24:154627 ResolveHostResponseHelper dns_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554628 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
4629 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orthdc35748e2018-08-23 22:41:484630
4631 HostResolver::ResolveHostParameters parameters;
4632 parameters.source = HostResolverSource::SYSTEM;
Eric Orth117e1992019-04-17 00:24:154633 ResolveHostResponseHelper system_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554634 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
4635 parameters, request_context_.get(), host_cache_.get()));
Eric Orthdc35748e2018-08-23 22:41:484636
4637 proc_->SignalMultiple(2u);
4638
4639 EXPECT_THAT(dns_response.result_error(), IsOk());
4640 EXPECT_THAT(system_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
4641}
4642
dalykc27699a2019-07-29 20:53:294643TEST_F(HostResolverManagerDnsTest,
4644 DisableInsecureDnsClientOnPersistentFailure) {
[email protected]f0f602bd2012-11-15 18:01:024645 ChangeDnsConfig(CreateValidDnsConfig());
4646
[email protected]007b3f82013-04-09 08:46:454647 proc_->AddRuleForAllFamilies(std::string(),
4648 std::string()); // Default to failures.
[email protected]f0f602bd2012-11-15 18:01:024649
4650 // Check that DnsTask works.
Eric Orth117e1992019-04-17 00:24:154651 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554652 HostPortPair("ok_1", 80), NetworkIsolationKey(), NetLogWithSource(),
4653 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004654 EXPECT_THAT(initial_response.result_error(), IsOk());
4655
4656 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
dalykc27699a2019-07-29 20:53:294657 for (unsigned i = 0; i < maximum_insecure_dns_task_failures(); ++i) {
Eric Orth70992982018-07-24 00:25:004658 // Use custom names to require separate Jobs.
4659 std::string hostname = base::StringPrintf("nx_%u", i);
4660 // Ensure fallback to ProcTask succeeds.
4661 proc_->AddRuleForAllFamilies(hostname, "192.168.1.101");
Eric Orth117e1992019-04-17 00:24:154662 responses.emplace_back(
4663 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554664 HostPortPair(hostname, 80), NetworkIsolationKey(),
4665 NetLogWithSource(), base::nullopt, request_context_.get(),
4666 host_cache_.get())));
Eric Orth70992982018-07-24 00:25:004667 }
4668
4669 proc_->SignalMultiple(responses.size());
4670
4671 for (size_t i = 0; i < responses.size(); ++i)
4672 EXPECT_THAT(responses[i]->result_error(), IsOk());
4673
4674 ASSERT_FALSE(proc_->HasBlockedRequests());
4675
dalykc27699a2019-07-29 20:53:294676 // Insecure DnsTasks should be disabled by now unless explicitly requested via
4677 // |source|.
Eric Orth117e1992019-04-17 00:24:154678 ResolveHostResponseHelper fail_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554679 HostPortPair("ok_2", 80), NetworkIsolationKey(), NetLogWithSource(),
4680 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth60931742018-11-05 23:40:574681 HostResolver::ResolveHostParameters parameters;
4682 parameters.source = HostResolverSource::DNS;
Eric Orth117e1992019-04-17 00:24:154683 ResolveHostResponseHelper dns_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554684 HostPortPair("ok_2", 80), NetworkIsolationKey(), NetLogWithSource(),
4685 parameters, request_context_.get(), host_cache_.get()));
Eric Orth60931742018-11-05 23:40:574686 proc_->SignalMultiple(2u);
Eric Orth70992982018-07-24 00:25:004687 EXPECT_THAT(fail_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
Eric Orth60931742018-11-05 23:40:574688 EXPECT_THAT(dns_response.result_error(), IsOk());
Eric Orth70992982018-07-24 00:25:004689
dalykc27699a2019-07-29 20:53:294690 // Secure DnsTasks should not be affected.
4691 HostResolver::ResolveHostParameters secure_parameters;
4692 secure_parameters.secure_dns_mode_override =
4693 DnsConfig::SecureDnsMode::AUTOMATIC;
4694 ResolveHostResponseHelper secure_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554695 HostPortPair("automatic", 80), NetworkIsolationKey(), NetLogWithSource(),
4696 secure_parameters, request_context_.get(), host_cache_.get()));
dalykc27699a2019-07-29 20:53:294697 EXPECT_THAT(secure_response.result_error(), IsOk());
4698
Eric Orth70992982018-07-24 00:25:004699 // Check that it is re-enabled after DNS change.
4700 ChangeDnsConfig(CreateValidDnsConfig());
Eric Orth117e1992019-04-17 00:24:154701 ResolveHostResponseHelper reenabled_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554702 HostPortPair("ok_3", 80), NetworkIsolationKey(), NetLogWithSource(),
4703 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004704 EXPECT_THAT(reenabled_response.result_error(), IsOk());
4705}
4706
Eric Orth960e7062019-03-08 18:43:544707TEST_F(HostResolverManagerDnsTest, DontDisableDnsClientOnSporadicFailure) {
[email protected]f0f602bd2012-11-15 18:01:024708 ChangeDnsConfig(CreateValidDnsConfig());
4709
4710 // |proc_| defaults to successes.
4711
4712 // 20 failures interleaved with 20 successes.
Eric Orth70992982018-07-24 00:25:004713 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
4714 for (unsigned i = 0; i < 40; ++i) {
4715 // Use custom names to require separate Jobs.
4716 std::string hostname = (i % 2) == 0 ? base::StringPrintf("nx_%u", i)
4717 : base::StringPrintf("ok_%u", i);
Eric Orth117e1992019-04-17 00:24:154718 responses.emplace_back(
4719 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554720 HostPortPair(hostname, 80), NetworkIsolationKey(),
4721 NetLogWithSource(), base::nullopt, request_context_.get(),
4722 host_cache_.get())));
Eric Orth70992982018-07-24 00:25:004723 }
4724
4725 proc_->SignalMultiple(40u);
4726
Eric Orth26fa08e2019-02-22 01:28:374727 for (const auto& response : responses)
4728 EXPECT_THAT(response->result_error(), IsOk());
Eric Orth70992982018-07-24 00:25:004729
4730 // Make |proc_| default to failures.
4731 proc_->AddRuleForAllFamilies(std::string(), std::string());
4732
4733 // DnsTask should still be enabled.
Eric Orth117e1992019-04-17 00:24:154734 ResolveHostResponseHelper final_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554735 HostPortPair("ok_last", 80), NetworkIsolationKey(), NetLogWithSource(),
4736 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004737 EXPECT_THAT(final_response.result_error(), IsOk());
4738}
4739
Eric Orth394db1732019-08-27 20:09:394740TEST_F(HostResolverManagerDnsTest, Ipv6Unreachable) {
4741 CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_.get()),
4742 false /* ipv6_reachable */,
4743 true /* check_ipv6_on_wifi */);
4744 ChangeDnsConfig(CreateValidDnsConfig());
4745
4746 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554747 HostPortPair("ok", 500), NetworkIsolationKey(), NetLogWithSource(),
4748 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth394db1732019-08-27 20:09:394749 EXPECT_THAT(response.result_error(), IsOk());
4750
4751 // Only expect IPv4 results.
4752 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
4753 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 500)));
4754}
4755
4756// Without a valid DnsConfig, assume IPv6 is needed and ignore prober.
4757TEST_F(HostResolverManagerDnsTest, Ipv6Unreachable_InvalidConfig) {
4758 CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_.get()),
4759 false /* ipv6_reachable */,
4760 true /* check_ipv6_on_wifi */);
4761
4762 proc_->AddRule("example.com", ADDRESS_FAMILY_UNSPECIFIED, "1.2.3.4,::5");
4763 proc_->SignalMultiple(1u);
4764
4765 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554766 HostPortPair("example.com", 500), NetworkIsolationKey(),
4767 NetLogWithSource(), base::nullopt, request_context_.get(),
4768 host_cache_.get()));
Eric Orth394db1732019-08-27 20:09:394769 EXPECT_THAT(response.result_error(), IsOk());
4770 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
4771 testing::UnorderedElementsAre(CreateExpected("1.2.3.4", 500),
4772 CreateExpected("::5", 500)));
4773}
4774
4775TEST_F(HostResolverManagerDnsTest, Ipv6Unreachable_UseLocalIpv6) {
4776 CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_.get()),
4777 false /* ipv6_reachable */,
4778 true /* check_ipv6_on_wifi */);
4779
4780 DnsConfig config = CreateValidDnsConfig();
4781 config.use_local_ipv6 = true;
4782 ChangeDnsConfig(config);
4783
4784 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554785 HostPortPair("ok", 500), NetworkIsolationKey(), NetLogWithSource(),
4786 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth394db1732019-08-27 20:09:394787 EXPECT_THAT(response1.result_error(), IsOk());
4788 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
4789 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 500),
4790 CreateExpected("::1", 500)));
4791
4792 // Set |use_local_ipv6| to false. Expect only IPv4 results.
4793 config.use_local_ipv6 = false;
4794 ChangeDnsConfig(config);
4795
4796 ResolveHostResponseHelper response2(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554797 HostPortPair("ok", 500), NetworkIsolationKey(), NetLogWithSource(),
4798 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth394db1732019-08-27 20:09:394799 EXPECT_THAT(response2.result_error(), IsOk());
4800 EXPECT_THAT(response2.request()->GetAddressResults().value().endpoints(),
4801 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 500)));
4802}
4803
[email protected]ec666ab22013-04-17 20:05:594804// Confirm that resolving "localhost" is unrestricted even if there are no
4805// global IPv6 address. See SystemHostResolverCall for rationale.
4806// Test both the DnsClient and system host resolver paths.
Eric Orth394db1732019-08-27 20:09:394807TEST_F(HostResolverManagerDnsTest, Ipv6Unreachable_Localhost) {
Eric Orth70992982018-07-24 00:25:004808 CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:324809 false /* ipv6_reachable */,
4810 true /* check_ipv6_on_wifi */);
Eric Orth70992982018-07-24 00:25:004811
4812 // Make request fail if we actually get to the system resolver.
4813 proc_->AddRuleForAllFamilies(std::string(), std::string());
4814
4815 // Try without DnsClient.
dalykc27699a2019-07-29 20:53:294816 resolver_->SetInsecureDnsClientEnabled(false);
Eric Orth70992982018-07-24 00:25:004817 ResolveHostResponseHelper system_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554818 HostPortPair("localhost", 80), NetworkIsolationKey(), NetLogWithSource(),
4819 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004820 EXPECT_THAT(system_response.result_error(), IsOk());
4821 EXPECT_THAT(
4822 system_response.request()->GetAddressResults().value().endpoints(),
4823 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4824 CreateExpected("::1", 80)));
4825
4826 // With DnsClient
Eric Orth828bd3ae2018-12-12 17:30:364827 UseMockDnsClient(CreateValidDnsConfig(), CreateDefaultDnsRules());
Eric Orth70992982018-07-24 00:25:004828 ResolveHostResponseHelper builtin_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554829 HostPortPair("localhost", 80), NetworkIsolationKey(), NetLogWithSource(),
4830 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004831 EXPECT_THAT(builtin_response.result_error(), IsOk());
4832 EXPECT_THAT(
4833 builtin_response.request()->GetAddressResults().value().endpoints(),
4834 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4835 CreateExpected("::1", 80)));
4836
4837 // DnsClient configured without ipv6 (but ipv6 should still work for
4838 // localhost).
4839 DnsConfig config = CreateValidDnsConfig();
4840 config.use_local_ipv6 = false;
4841 ChangeDnsConfig(config);
4842 ResolveHostResponseHelper ipv6_disabled_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554843 HostPortPair("localhost", 80), NetworkIsolationKey(), NetLogWithSource(),
4844 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004845 EXPECT_THAT(ipv6_disabled_response.result_error(), IsOk());
4846 EXPECT_THAT(
4847 ipv6_disabled_response.request()->GetAddressResults().value().endpoints(),
4848 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
4849 CreateExpected("::1", 80)));
4850}
4851
dalykc27699a2019-07-29 20:53:294852TEST_F(HostResolverManagerDnsTest, SeparateJobsBySecureDnsMode) {
4853 MockDnsClientRuleList rules;
4854 rules.emplace_back("a", dns_protocol::kTypeA, true /* secure */,
4855 MockDnsClientRule::Result(MockDnsClientRule::FAIL),
4856 true /* delay */);
4857 rules.emplace_back("a", dns_protocol::kTypeAAAA, true /* secure */,
4858 MockDnsClientRule::Result(MockDnsClientRule::FAIL),
4859 true /* delay */);
4860 rules.emplace_back("a", dns_protocol::kTypeA, false /* secure */,
4861 MockDnsClientRule::Result(MockDnsClientRule::OK),
4862 false /* delay */);
4863 rules.emplace_back("a", dns_protocol::kTypeAAAA, false /* secure */,
4864 MockDnsClientRule::Result(MockDnsClientRule::OK),
4865 false /* delay */);
4866 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
4867 DnsConfigOverrides overrides;
4868 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
4869 resolver_->SetDnsConfigOverrides(overrides);
4870
4871 // Create three requests. One with a SECURE mode override, one with no
4872 // mode override, and one with an AUTOMATIC mode override (which is a no-op
4873 // since the DnsConfig uses AUTOMATIC).
4874 HostResolver::ResolveHostParameters parameters_secure_override;
4875 parameters_secure_override.secure_dns_mode_override =
4876 DnsConfig::SecureDnsMode::SECURE;
4877 ResolveHostResponseHelper secure_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554878 HostPortPair("a", 80), NetworkIsolationKey(), NetLogWithSource(),
4879 parameters_secure_override, request_context_.get(), host_cache_.get()));
dalykc27699a2019-07-29 20:53:294880 EXPECT_EQ(1u, resolver_->num_jobs_for_testing());
4881
4882 ResolveHostResponseHelper automatic_response0(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554883 HostPortPair("a", 80), NetworkIsolationKey(), NetLogWithSource(),
4884 base::nullopt, request_context_.get(), host_cache_.get()));
dalykc27699a2019-07-29 20:53:294885 EXPECT_EQ(2u, resolver_->num_jobs_for_testing());
4886
4887 HostResolver::ResolveHostParameters parameters_automatic_override;
4888 parameters_automatic_override.secure_dns_mode_override =
4889 DnsConfig::SecureDnsMode::AUTOMATIC;
4890 ResolveHostResponseHelper automatic_response1(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554891 HostPortPair("a", 80), NetworkIsolationKey(), NetLogWithSource(),
4892 parameters_automatic_override, request_context_.get(),
4893 host_cache_.get()));
dalykc27699a2019-07-29 20:53:294894 // The AUTOMATIC mode requests should be joined into the same job.
4895 EXPECT_EQ(2u, resolver_->num_jobs_for_testing());
4896
4897 // All requests should be blocked on the secure transactions.
4898 base::RunLoop().RunUntilIdle();
4899 EXPECT_FALSE(secure_response.complete());
4900 EXPECT_FALSE(automatic_response0.complete());
4901 EXPECT_FALSE(automatic_response1.complete());
4902
4903 // Complete secure transactions.
4904 dns_client_->CompleteDelayedTransactions();
4905 EXPECT_THAT(secure_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
4906 EXPECT_THAT(automatic_response0.result_error(), IsOk());
4907 EXPECT_THAT(automatic_response1.result_error(), IsOk());
4908}
4909
[email protected]daae1322013-09-05 18:26:504910// Cancel a request with a single DNS transaction active.
Eric Orth960e7062019-03-08 18:43:544911TEST_F(HostResolverManagerDnsTest, CancelWithOneTransactionActive) {
Eric Orth70992982018-07-24 00:25:004912 // Disable ipv6 to ensure we'll only try a single transaction for the host.
4913 CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:324914 false /* ipv6_reachable */,
4915 true /* check_ipv6_on_wifi */);
Eric Orth70992982018-07-24 00:25:004916 DnsConfig config = CreateValidDnsConfig();
4917 config.use_local_ipv6 = false;
4918 ChangeDnsConfig(config);
4919
Eric Orth117e1992019-04-17 00:24:154920 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554921 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
4922 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004923 ASSERT_FALSE(response.complete());
4924 ASSERT_EQ(1u, num_running_dispatcher_jobs());
4925
4926 response.CancelRequest();
4927 base::RunLoop().RunUntilIdle();
4928 EXPECT_FALSE(response.complete());
4929
4930 // Dispatcher state checked in TearDown.
4931}
4932
[email protected]daae1322013-09-05 18:26:504933// Cancel a request with a single DNS transaction active and another pending.
Eric Orth960e7062019-03-08 18:43:544934TEST_F(HostResolverManagerDnsTest, CancelWithOneTransactionActiveOnePending) {
[email protected]daae1322013-09-05 18:26:504935 CreateSerialResolver();
[email protected]daae1322013-09-05 18:26:504936 ChangeDnsConfig(CreateValidDnsConfig());
4937
Eric Orth117e1992019-04-17 00:24:154938 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554939 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
4940 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004941 EXPECT_EQ(1u, num_running_dispatcher_jobs());
4942
4943 response.CancelRequest();
4944 base::RunLoop().RunUntilIdle();
4945 EXPECT_FALSE(response.complete());
4946
4947 // Dispatcher state checked in TearDown.
4948}
4949
[email protected]daae1322013-09-05 18:26:504950// Cancel a request with two DNS transactions active.
Eric Orth960e7062019-03-08 18:43:544951TEST_F(HostResolverManagerDnsTest, CancelWithTwoTransactionsActive) {
[email protected]daae1322013-09-05 18:26:504952 ChangeDnsConfig(CreateValidDnsConfig());
4953
Eric Orth117e1992019-04-17 00:24:154954 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554955 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
4956 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:004957 EXPECT_EQ(2u, num_running_dispatcher_jobs());
4958
4959 response.CancelRequest();
4960 base::RunLoop().RunUntilIdle();
4961 EXPECT_FALSE(response.complete());
4962
4963 // Dispatcher state checked in TearDown.
4964}
4965
[email protected]daae1322013-09-05 18:26:504966// Delete a resolver with some active requests and some queued requests.
Eric Orth960e7062019-03-08 18:43:544967TEST_F(HostResolverManagerDnsTest, DeleteWithActiveTransactions) {
[email protected]daae1322013-09-05 18:26:504968 // At most 10 Jobs active at once.
Eric Orth70992982018-07-24 00:25:004969 CreateResolverWithLimitsAndParams(10u, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:324970 true /* ipv6_reachable */,
4971 true /* check_ipv6_on_wifi */);
[email protected]daae1322013-09-05 18:26:504972
[email protected]daae1322013-09-05 18:26:504973 ChangeDnsConfig(CreateValidDnsConfig());
4974
Eric Orth70992982018-07-24 00:25:004975 // Add 12 DNS lookups (creating well more than 10 transaction).
4976 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
4977 for (int i = 0; i < 12; ++i) {
4978 std::string hostname = base::StringPrintf("ok%i", i);
Eric Orth117e1992019-04-17 00:24:154979 responses.emplace_back(
4980 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:554981 HostPortPair(hostname, 80), NetworkIsolationKey(),
4982 NetLogWithSource(), base::nullopt, request_context_.get(),
4983 host_cache_.get())));
Eric Orth70992982018-07-24 00:25:004984 }
4985 EXPECT_EQ(10u, num_running_dispatcher_jobs());
4986
Eric Orth37b18192019-04-22 19:09:284987 DestroyResolver();
Eric Orth70992982018-07-24 00:25:004988
4989 base::RunLoop().RunUntilIdle();
4990 for (auto& response : responses) {
4991 EXPECT_FALSE(response->complete());
4992 }
4993}
4994
dalykc682ba3c2019-08-21 17:16:234995TEST_F(HostResolverManagerDnsTest, DeleteWithSecureTransactions) {
4996 ChangeDnsConfig(CreateValidDnsConfig());
4997 DnsConfigOverrides overrides;
4998 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::SECURE;
4999 resolver_->SetDnsConfigOverrides(overrides);
5000
5001 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555002 HostPortPair("secure", 80), NetworkIsolationKey(), NetLogWithSource(),
5003 base::nullopt, request_context_.get(), host_cache_.get()));
dalykc682ba3c2019-08-21 17:16:235004
5005 DestroyResolver();
5006
5007 base::RunLoop().RunUntilIdle();
5008 EXPECT_FALSE(response.complete());
5009}
5010
Eric Orth5233c3a2019-04-08 17:01:145011TEST_F(HostResolverManagerDnsTest, DeleteWithCompletedRequests) {
5012 ChangeDnsConfig(CreateValidDnsConfig());
5013
Eric Orth117e1992019-04-17 00:24:155014 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555015 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
5016 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth5233c3a2019-04-08 17:01:145017
5018 EXPECT_THAT(response.result_error(), IsOk());
5019 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
5020 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
5021 CreateExpected("::1", 80)));
5022
Eric Orth37b18192019-04-22 19:09:285023 DestroyResolver();
Eric Orth5233c3a2019-04-08 17:01:145024
5025 // Completed requests should be unaffected by manager destruction.
5026 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
5027 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
5028 CreateExpected("::1", 80)));
5029}
5030
5031TEST_F(HostResolverManagerDnsTest, ExplicitCancel) {
5032 ChangeDnsConfig(CreateValidDnsConfig());
5033
5034 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555035 HostPortPair("4slow_4ok", 80), NetworkIsolationKey(), NetLogWithSource(),
5036 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth5233c3a2019-04-08 17:01:145037
5038 response.request()->Cancel();
5039 dns_client_->CompleteDelayedTransactions();
5040
5041 base::RunLoop().RunUntilIdle();
5042 EXPECT_FALSE(response.complete());
5043}
5044
Eric Orth314e8b42019-11-12 00:32:215045TEST_F(HostResolverManagerDnsTest, ExplicitCancel_AfterManagerDestruction) {
5046 ChangeDnsConfig(CreateValidDnsConfig());
5047
5048 ResolveHostResponseHelper response(resolver_->CreateRequest(
5049 HostPortPair("4slow_4ok", 80), NetworkIsolationKey(), NetLogWithSource(),
5050 base::nullopt, request_context_.get(), host_cache_.get()));
5051
5052 DestroyResolver();
5053 response.request()->Cancel();
5054}
5055
Eric Orth5233c3a2019-04-08 17:01:145056TEST_F(HostResolverManagerDnsTest, ExplicitCancel_Completed) {
5057 ChangeDnsConfig(CreateValidDnsConfig());
5058
Eric Orth117e1992019-04-17 00:24:155059 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555060 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
5061 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth5233c3a2019-04-08 17:01:145062
5063 EXPECT_THAT(response.result_error(), IsOk());
5064 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
5065 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
5066 CreateExpected("::1", 80)));
5067
5068 response.request()->Cancel();
5069
5070 // Completed requests should be unaffected by cancellation.
5071 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
5072 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
5073 CreateExpected("::1", 80)));
5074}
5075
[email protected]daae1322013-09-05 18:26:505076// Cancel a request with only the IPv6 transaction active.
Eric Orth960e7062019-03-08 18:43:545077TEST_F(HostResolverManagerDnsTest, CancelWithIPv6TransactionActive) {
[email protected]daae1322013-09-05 18:26:505078 ChangeDnsConfig(CreateValidDnsConfig());
5079
Eric Orth117e1992019-04-17 00:24:155080 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555081 HostPortPair("6slow_ok", 80), NetworkIsolationKey(), NetLogWithSource(),
5082 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:005083 EXPECT_EQ(2u, num_running_dispatcher_jobs());
5084
5085 // The IPv4 request should complete, the IPv6 request is still pending.
5086 base::RunLoop().RunUntilIdle();
5087 EXPECT_EQ(1u, num_running_dispatcher_jobs());
5088
5089 response.CancelRequest();
5090 base::RunLoop().RunUntilIdle();
5091 EXPECT_FALSE(response.complete());
5092
5093 // Dispatcher state checked in TearDown.
5094}
5095
[email protected]daae1322013-09-05 18:26:505096// Cancel a request with only the IPv4 transaction pending.
Eric Orth960e7062019-03-08 18:43:545097TEST_F(HostResolverManagerDnsTest, CancelWithIPv4TransactionPending) {
Eric Orth60931742018-11-05 23:40:575098 set_allow_fallback_to_proctask(false);
[email protected]daae1322013-09-05 18:26:505099 ChangeDnsConfig(CreateValidDnsConfig());
5100
Eric Orth117e1992019-04-17 00:24:155101 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555102 HostPortPair("4slow_ok", 80), NetworkIsolationKey(), NetLogWithSource(),
5103 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:005104 EXPECT_EQ(2u, num_running_dispatcher_jobs());
5105
5106 // The IPv6 request should complete, the IPv4 request is still pending.
5107 base::RunLoop().RunUntilIdle();
5108 EXPECT_EQ(1u, num_running_dispatcher_jobs());
5109
5110 response.CancelRequest();
5111 base::RunLoop().RunUntilIdle();
5112 EXPECT_FALSE(response.complete());
5113}
5114
dalyk4f4ac712019-05-31 16:33:135115TEST_F(HostResolverManagerDnsTest, CancelWithAutomaticModeTransactionPending) {
5116 MockDnsClientRuleList rules;
5117 rules.emplace_back("secure_6slow_6nx_insecure_6slow_ok", dns_protocol::kTypeA,
5118 true /* secure */,
5119 MockDnsClientRule::Result(MockDnsClientRule::OK),
5120 false /* delay */);
5121 rules.emplace_back("secure_6slow_6nx_insecure_6slow_ok",
5122 dns_protocol::kTypeAAAA, true /* secure */,
5123 MockDnsClientRule::Result(MockDnsClientRule::FAIL),
5124 true /* delay */);
5125 rules.emplace_back("secure_6slow_6nx_insecure_6slow_ok", dns_protocol::kTypeA,
5126 false /* secure */,
5127 MockDnsClientRule::Result(MockDnsClientRule::OK),
5128 false /* delay */);
5129 rules.emplace_back("secure_6slow_6nx_insecure_6slow_ok",
5130 dns_protocol::kTypeAAAA, false /* secure */,
5131 MockDnsClientRule::Result(MockDnsClientRule::OK),
5132 true /* delay */);
5133 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
5134
5135 DnsConfigOverrides overrides;
5136 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
5137 resolver_->SetDnsConfigOverrides(overrides);
5138
5139 ResolveHostResponseHelper response0(resolver_->CreateRequest(
5140 HostPortPair("secure_6slow_6nx_insecure_6slow_ok", 80),
Matt Menkef4023312019-11-01 18:24:555141 NetworkIsolationKey(), NetLogWithSource(), base::nullopt,
5142 request_context_.get(), host_cache_.get()));
dalykc682ba3c2019-08-21 17:16:235143 EXPECT_EQ(0u, num_running_dispatcher_jobs());
dalyk4f4ac712019-05-31 16:33:135144
5145 // The secure IPv4 request should complete, the secure IPv6 request is still
5146 // pending.
5147 base::RunLoop().RunUntilIdle();
dalykc682ba3c2019-08-21 17:16:235148 EXPECT_EQ(0u, num_running_dispatcher_jobs());
dalyk4f4ac712019-05-31 16:33:135149
5150 response0.CancelRequest();
5151 base::RunLoop().RunUntilIdle();
5152 EXPECT_FALSE(response0.complete());
5153 EXPECT_EQ(0u, num_running_dispatcher_jobs());
5154
5155 ResolveHostResponseHelper response1(resolver_->CreateRequest(
5156 HostPortPair("secure_6slow_6nx_insecure_6slow_ok", 80),
Matt Menkef4023312019-11-01 18:24:555157 NetworkIsolationKey(), NetLogWithSource(), base::nullopt,
5158 request_context_.get(), host_cache_.get()));
dalykc682ba3c2019-08-21 17:16:235159 EXPECT_EQ(0u, num_running_dispatcher_jobs());
dalyk4f4ac712019-05-31 16:33:135160
5161 // The secure IPv4 request should complete, the secure IPv6 request is still
5162 // pending.
5163 base::RunLoop().RunUntilIdle();
dalykc682ba3c2019-08-21 17:16:235164 EXPECT_EQ(0u, num_running_dispatcher_jobs());
dalyk4f4ac712019-05-31 16:33:135165
5166 // Let the secure IPv6 request complete and start the insecure requests.
5167 dns_client_->CompleteDelayedTransactions();
5168 EXPECT_EQ(2u, num_running_dispatcher_jobs());
5169
5170 // The insecure IPv4 request should complete, the insecure IPv6 request is
5171 // still pending.
5172 base::RunLoop().RunUntilIdle();
5173 EXPECT_EQ(1u, num_running_dispatcher_jobs());
5174
5175 response1.CancelRequest();
5176 base::RunLoop().RunUntilIdle();
5177 EXPECT_FALSE(response1.complete());
5178
5179 // Dispatcher state checked in TearDown.
5180}
5181
[email protected]daae1322013-09-05 18:26:505182// Test cases where AAAA completes first.
Eric Orth960e7062019-03-08 18:43:545183TEST_F(HostResolverManagerDnsTest, AAAACompletesFirst) {
Eric Orth60931742018-11-05 23:40:575184 set_allow_fallback_to_proctask(false);
[email protected]daae1322013-09-05 18:26:505185 ChangeDnsConfig(CreateValidDnsConfig());
5186
Eric Orth70992982018-07-24 00:25:005187 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
Eric Orth117e1992019-04-17 00:24:155188 responses.emplace_back(
5189 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555190 HostPortPair("4slow_ok", 80), NetworkIsolationKey(),
5191 NetLogWithSource(), base::nullopt, request_context_.get(),
5192 host_cache_.get())));
Eric Orth70992982018-07-24 00:25:005193 responses.emplace_back(
5194 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555195 HostPortPair("4slow_4ok", 80), NetworkIsolationKey(),
5196 NetLogWithSource(), base::nullopt, request_context_.get(),
5197 host_cache_.get())));
Eric Orth70992982018-07-24 00:25:005198 responses.emplace_back(
5199 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555200 HostPortPair("4slow_4timeout", 80), NetworkIsolationKey(),
5201 NetLogWithSource(), base::nullopt, request_context_.get(),
5202 host_cache_.get())));
Eric Orth6f1c5172019-04-16 17:08:275203 responses.emplace_back(
5204 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555205 HostPortPair("4slow_6timeout", 80), NetworkIsolationKey(),
5206 NetLogWithSource(), base::nullopt, request_context_.get(),
5207 host_cache_.get())));
Eric Orth70992982018-07-24 00:25:005208
5209 base::RunLoop().RunUntilIdle();
5210 EXPECT_FALSE(responses[0]->complete());
5211 EXPECT_FALSE(responses[1]->complete());
5212 EXPECT_FALSE(responses[2]->complete());
5213 // The IPv6 of request 3 should have failed and resulted in cancelling the
5214 // IPv4 request.
5215 EXPECT_THAT(responses[3]->result_error(), IsError(ERR_DNS_TIMED_OUT));
5216 EXPECT_EQ(3u, num_running_dispatcher_jobs());
5217
5218 dns_client_->CompleteDelayedTransactions();
5219 EXPECT_THAT(responses[0]->result_error(), IsOk());
5220 EXPECT_THAT(responses[0]->request()->GetAddressResults().value().endpoints(),
5221 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
5222 CreateExpected("::1", 80)));
5223
5224 EXPECT_THAT(responses[1]->result_error(), IsOk());
5225 EXPECT_THAT(responses[1]->request()->GetAddressResults().value().endpoints(),
5226 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
5227
5228 EXPECT_THAT(responses[2]->result_error(), IsError(ERR_DNS_TIMED_OUT));
5229}
5230
dalyk4f4ac712019-05-31 16:33:135231TEST_F(HostResolverManagerDnsTest, AAAACompletesFirst_AutomaticMode) {
dalyk48b20a992019-02-25 16:10:265232 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:135233 rules.emplace_back("secure_slow_nx_insecure_4slow_ok", dns_protocol::kTypeA,
5234 true /* secure */,
5235 MockDnsClientRule::Result(MockDnsClientRule::FAIL),
5236 true /* delay */);
5237 rules.emplace_back("secure_slow_nx_insecure_4slow_ok",
5238 dns_protocol::kTypeAAAA, true /* secure */,
5239 MockDnsClientRule::Result(MockDnsClientRule::FAIL),
5240 true /* delay */);
5241 rules.emplace_back("secure_slow_nx_insecure_4slow_ok", dns_protocol::kTypeA,
5242 false /* secure */,
5243 MockDnsClientRule::Result(MockDnsClientRule::OK),
5244 true /* delay */);
5245 rules.emplace_back("secure_slow_nx_insecure_4slow_ok",
5246 dns_protocol::kTypeAAAA, false /* secure */,
5247 MockDnsClientRule::Result(MockDnsClientRule::EMPTY),
5248 false /* delay */);
dalyk48b20a992019-02-25 16:10:265249 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
dalyk4f4ac712019-05-31 16:33:135250 DnsConfigOverrides overrides;
5251 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
5252 resolver_->SetDnsConfigOverrides(overrides);
dalyk48b20a992019-02-25 16:10:265253
dalyk4f4ac712019-05-31 16:33:135254 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555255 HostPortPair("secure_slow_nx_insecure_4slow_ok", 80),
5256 NetworkIsolationKey(), NetLogWithSource(), base::nullopt,
5257 request_context_.get(), host_cache_.get()));
dalyk48b20a992019-02-25 16:10:265258 base::RunLoop().RunUntilIdle();
dalyk4f4ac712019-05-31 16:33:135259 EXPECT_FALSE(response.complete());
5260 // Complete the secure transactions.
dalyk48b20a992019-02-25 16:10:265261 dns_client_->CompleteDelayedTransactions();
dalyk4f4ac712019-05-31 16:33:135262 base::RunLoop().RunUntilIdle();
5263 EXPECT_FALSE(response.complete());
5264 // Complete the insecure transactions.
5265 dns_client_->CompleteDelayedTransactions();
5266 ASSERT_THAT(response.result_error(), IsOk());
5267 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
5268 testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
Matt Menke7b4a32f2019-10-25 22:13:465269 HostCache::Key insecure_key =
5270 HostCache::Key("secure_slow_nx_insecure_4slow_ok",
5271 DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
5272 HostResolverSource::ANY, NetworkIsolationKey());
dalyk4f4ac712019-05-31 16:33:135273 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result =
5274 GetCacheHit(insecure_key);
5275 EXPECT_TRUE(!!cache_result);
5276}
5277
5278TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Automatic) {
5279 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.100");
5280 set_allow_fallback_to_proctask(true);
5281
5282 ChangeDnsConfig(CreateValidDnsConfig());
5283 DnsConfigOverrides overrides;
5284 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
5285 resolver_->SetDnsConfigOverrides(overrides);
dalyk48b20a992019-02-25 16:10:265286 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result;
5287
dalyk4f4ac712019-05-31 16:33:135288 // A successful DoH request should result in a secure cache entry.
5289 ResolveHostResponseHelper response_secure(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555290 HostPortPair("automatic", 80), NetworkIsolationKey(), NetLogWithSource(),
5291 base::nullopt, request_context_.get(), host_cache_.get()));
dalyk4f4ac712019-05-31 16:33:135292 ASSERT_THAT(response_secure.result_error(), IsOk());
5293 EXPECT_THAT(
5294 response_secure.request()->GetAddressResults().value().endpoints(),
5295 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
5296 CreateExpected("::1", 80)));
Matt Menke7b4a32f2019-10-25 22:13:465297 HostCache::Key secure_key = HostCache::Key(
5298 "automatic", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
5299 HostResolverSource::ANY, NetworkIsolationKey());
dalyk4f4ac712019-05-31 16:33:135300 secure_key.secure = true;
5301 cache_result = GetCacheHit(secure_key);
5302 EXPECT_TRUE(!!cache_result);
5303
5304 // A successful plaintext DNS request should result in an insecure cache
5305 // entry.
5306 ResolveHostResponseHelper response_insecure(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555307 HostPortPair("insecure_automatic", 80), NetworkIsolationKey(),
5308 NetLogWithSource(), base::nullopt, request_context_.get(),
5309 host_cache_.get()));
dalyk4f4ac712019-05-31 16:33:135310 ASSERT_THAT(response_insecure.result_error(), IsOk());
5311 EXPECT_THAT(
5312 response_insecure.request()->GetAddressResults().value().endpoints(),
5313 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
5314 CreateExpected("::1", 80)));
5315 HostCache::Key insecure_key =
5316 HostCache::Key("insecure_automatic", DnsQueryType::UNSPECIFIED,
Matt Menke7b4a32f2019-10-25 22:13:465317 0 /* host_resolver_flags */, HostResolverSource::ANY,
5318 NetworkIsolationKey());
dalyk4f4ac712019-05-31 16:33:135319 cache_result = GetCacheHit(insecure_key);
5320 EXPECT_TRUE(!!cache_result);
5321
5322 // Fallback to ProcTask allowed in AUTOMATIC mode.
5323 ResolveHostResponseHelper response_proc(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555324 HostPortPair("nx_succeed", 80), NetworkIsolationKey(), NetLogWithSource(),
5325 base::nullopt, request_context_.get(), host_cache_.get()));
dalyk4f4ac712019-05-31 16:33:135326 proc_->SignalMultiple(1u);
5327 EXPECT_THAT(response_proc.result_error(), IsOk());
5328 EXPECT_THAT(response_proc.request()->GetAddressResults().value().endpoints(),
5329 testing::ElementsAre(CreateExpected("192.168.1.100", 80)));
5330}
5331
dalyke966a1832019-06-05 20:53:135332TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Automatic_SecureCache) {
5333 ChangeDnsConfig(CreateValidDnsConfig());
5334 DnsConfigOverrides overrides;
5335 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
5336 resolver_->SetDnsConfigOverrides(overrides);
5337
5338 // Populate cache with a secure entry.
5339 HostCache::Key cached_secure_key =
5340 HostCache::Key("automatic_cached", DnsQueryType::UNSPECIFIED,
Matt Menke7b4a32f2019-10-25 22:13:465341 0 /* host_resolver_flags */, HostResolverSource::ANY,
5342 NetworkIsolationKey());
dalyke966a1832019-06-05 20:53:135343 cached_secure_key.secure = true;
5344 IPEndPoint kExpectedSecureIP = CreateExpected("192.168.1.102", 80);
5345 PopulateCache(cached_secure_key, kExpectedSecureIP);
5346
5347 // The secure cache should be checked prior to any DoH request being sent.
5348 ResolveHostResponseHelper response_secure_cached(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555349 HostPortPair("automatic_cached", 80), NetworkIsolationKey(),
5350 NetLogWithSource(), base::nullopt, request_context_.get(),
5351 host_cache_.get()));
dalyke966a1832019-06-05 20:53:135352 EXPECT_THAT(response_secure_cached.result_error(), IsOk());
5353 EXPECT_THAT(
5354 response_secure_cached.request()->GetAddressResults().value().endpoints(),
5355 testing::ElementsAre(kExpectedSecureIP));
5356 EXPECT_FALSE(
5357 response_secure_cached.request()->GetStaleInfo().value().is_stale());
5358}
5359
5360TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Automatic_InsecureCache) {
5361 ChangeDnsConfig(CreateValidDnsConfig());
5362 DnsConfigOverrides overrides;
5363 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
5364 resolver_->SetDnsConfigOverrides(overrides);
5365
5366 // Populate cache with an insecure entry.
5367 HostCache::Key cached_insecure_key =
5368 HostCache::Key("insecure_automatic_cached", DnsQueryType::UNSPECIFIED,
Matt Menke7b4a32f2019-10-25 22:13:465369 0 /* host_resolver_flags */, HostResolverSource::ANY,
5370 NetworkIsolationKey());
dalyke966a1832019-06-05 20:53:135371 IPEndPoint kExpectedInsecureIP = CreateExpected("192.168.1.103", 80);
5372 PopulateCache(cached_insecure_key, kExpectedInsecureIP);
5373
5374 // The insecure cache should be checked after DoH requests fail.
5375 ResolveHostResponseHelper response_insecure_cached(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555376 HostPortPair("insecure_automatic_cached", 80), NetworkIsolationKey(),
5377 NetLogWithSource(), base::nullopt, request_context_.get(),
5378 host_cache_.get()));
dalyke966a1832019-06-05 20:53:135379 EXPECT_THAT(response_insecure_cached.result_error(), IsOk());
5380 EXPECT_THAT(response_insecure_cached.request()
5381 ->GetAddressResults()
5382 .value()
5383 .endpoints(),
5384 testing::ElementsAre(kExpectedInsecureIP));
5385 EXPECT_FALSE(
5386 response_insecure_cached.request()->GetStaleInfo().value().is_stale());
5387}
5388
dalyk4f4ac712019-05-31 16:33:135389TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Automatic_Downgrade) {
5390 ChangeDnsConfig(CreateValidDnsConfig());
5391 // Remove all DoH servers from the config so there is no DoH server available.
5392 DnsConfigOverrides overrides;
5393 std::vector<DnsConfig::DnsOverHttpsServerConfig> doh_servers;
5394 overrides.dns_over_https_servers = doh_servers;
5395 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
5396 resolver_->SetDnsConfigOverrides(overrides);
5397 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result;
5398
dalyke966a1832019-06-05 20:53:135399 // Populate cache with both secure and insecure entries.
5400 HostCache::Key cached_secure_key =
5401 HostCache::Key("automatic_cached", DnsQueryType::UNSPECIFIED,
Matt Menke7b4a32f2019-10-25 22:13:465402 0 /* host_resolver_flags */, HostResolverSource::ANY,
5403 NetworkIsolationKey());
dalyke966a1832019-06-05 20:53:135404 cached_secure_key.secure = true;
5405 IPEndPoint kExpectedSecureIP = CreateExpected("192.168.1.102", 80);
5406 PopulateCache(cached_secure_key, kExpectedSecureIP);
5407 HostCache::Key cached_insecure_key =
5408 HostCache::Key("insecure_automatic_cached", DnsQueryType::UNSPECIFIED,
Matt Menke7b4a32f2019-10-25 22:13:465409 0 /* host_resolver_flags */, HostResolverSource::ANY,
5410 NetworkIsolationKey());
dalyke966a1832019-06-05 20:53:135411 IPEndPoint kExpectedInsecureIP = CreateExpected("192.168.1.103", 80);
5412 PopulateCache(cached_insecure_key, kExpectedInsecureIP);
5413
5414 // The secure cache should still be checked first.
5415 ResolveHostResponseHelper response_cached(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555416 HostPortPair("automatic_cached", 80), NetworkIsolationKey(),
5417 NetLogWithSource(), base::nullopt, request_context_.get(),
5418 host_cache_.get()));
dalyke966a1832019-06-05 20:53:135419 EXPECT_THAT(response_cached.result_error(), IsOk());
5420 EXPECT_THAT(
5421 response_cached.request()->GetAddressResults().value().endpoints(),
5422 testing::ElementsAre(kExpectedSecureIP));
5423
5424 // The insecure cache should be checked before any insecure requests are sent.
5425 ResolveHostResponseHelper insecure_response_cached(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555426 HostPortPair("insecure_automatic_cached", 80), NetworkIsolationKey(),
5427 NetLogWithSource(), base::nullopt, request_context_.get(),
5428 host_cache_.get()));
dalyke966a1832019-06-05 20:53:135429 EXPECT_THAT(insecure_response_cached.result_error(), IsOk());
5430 EXPECT_THAT(insecure_response_cached.request()
5431 ->GetAddressResults()
5432 .value()
5433 .endpoints(),
5434 testing::ElementsAre(kExpectedInsecureIP));
5435
dalyk4f4ac712019-05-31 16:33:135436 // The DnsConfig doesn't contain DoH servers so AUTOMATIC mode will be
5437 // downgraded to OFF. A successful plaintext DNS request should result in an
5438 // insecure cache entry.
5439 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555440 HostPortPair("automatic", 80), NetworkIsolationKey(), NetLogWithSource(),
5441 base::nullopt, request_context_.get(), host_cache_.get()));
dalyk4f4ac712019-05-31 16:33:135442 ASSERT_THAT(response.result_error(), IsOk());
5443 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
dalyk48b20a992019-02-25 16:10:265444 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
5445 CreateExpected("::1", 80)));
Matt Menke7b4a32f2019-10-25 22:13:465446 HostCache::Key key = HostCache::Key(
5447 "automatic", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
5448 HostResolverSource::ANY, NetworkIsolationKey());
dalyk48b20a992019-02-25 16:10:265449 cache_result = GetCacheHit(key);
5450 EXPECT_TRUE(!!cache_result);
dalyk4f4ac712019-05-31 16:33:135451}
dalyk48b20a992019-02-25 16:10:265452
dalykc2adf182019-09-02 14:31:225453TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Automatic_Unavailable) {
5454 ChangeDnsConfig(CreateValidDnsConfig());
5455 DnsConfigOverrides overrides;
5456 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
5457 resolver_->SetDnsConfigOverrides(overrides);
5458 dns_client_->set_doh_server_available(false);
5459
5460 // DoH requests should be skipped when there are no available DoH servers
5461 // in automatic mode. The cached result should be in the insecure cache.
5462 ResolveHostResponseHelper response_automatic(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555463 HostPortPair("automatic", 80), NetworkIsolationKey(), NetLogWithSource(),
5464 base::nullopt, request_context_.get(), host_cache_.get()));
dalykc2adf182019-09-02 14:31:225465 ASSERT_THAT(response_automatic.result_error(), IsOk());
5466 EXPECT_THAT(
5467 response_automatic.request()->GetAddressResults().value().endpoints(),
5468 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
5469 CreateExpected("::1", 80)));
Matt Menke7b4a32f2019-10-25 22:13:465470 HostCache::Key secure_key = HostCache::Key(
5471 "automatic", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
5472 HostResolverSource::ANY, NetworkIsolationKey());
dalykc2adf182019-09-02 14:31:225473 secure_key.secure = true;
5474 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result =
5475 GetCacheHit(secure_key);
5476 EXPECT_FALSE(!!cache_result);
5477
Matt Menke7b4a32f2019-10-25 22:13:465478 HostCache::Key insecure_key = HostCache::Key(
5479 "automatic", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
5480 HostResolverSource::ANY, NetworkIsolationKey());
dalykc2adf182019-09-02 14:31:225481 cache_result = GetCacheHit(insecure_key);
5482 EXPECT_TRUE(!!cache_result);
5483}
5484
5485TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Automatic_Unavailable_Fail) {
5486 set_allow_fallback_to_proctask(false);
5487 ChangeDnsConfig(CreateValidDnsConfig());
5488 DnsConfigOverrides overrides;
5489 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
5490 resolver_->SetDnsConfigOverrides(overrides);
5491 dns_client_->set_doh_server_available(false);
5492
5493 // Insecure requests that fail should not be cached.
5494 ResolveHostResponseHelper response_secure(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555495 HostPortPair("secure", 80), NetworkIsolationKey(), NetLogWithSource(),
5496 base::nullopt, request_context_.get(), host_cache_.get()));
dalykc2adf182019-09-02 14:31:225497 ASSERT_THAT(response_secure.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
5498
Matt Menke7b4a32f2019-10-25 22:13:465499 HostCache::Key secure_key = HostCache::Key(
5500 "secure", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
5501 HostResolverSource::ANY, NetworkIsolationKey());
dalykc2adf182019-09-02 14:31:225502 secure_key.secure = true;
5503 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result =
5504 GetCacheHit(secure_key);
5505 EXPECT_FALSE(!!cache_result);
5506
Matt Menke7b4a32f2019-10-25 22:13:465507 HostCache::Key insecure_key = HostCache::Key(
5508 "secure", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
5509 HostResolverSource::ANY, NetworkIsolationKey());
dalykc2adf182019-09-02 14:31:225510 cache_result = GetCacheHit(insecure_key);
5511 EXPECT_FALSE(!!cache_result);
5512}
5513
dalyke966a1832019-06-05 20:53:135514TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Automatic_Stale) {
5515 ChangeDnsConfig(CreateValidDnsConfig());
5516 DnsConfigOverrides overrides;
5517 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
5518 resolver_->SetDnsConfigOverrides(overrides);
5519
5520 // Populate cache with insecure entry.
Matt Menke7b4a32f2019-10-25 22:13:465521 HostCache::Key cached_stale_key = HostCache::Key(
5522 "automatic_stale", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
5523 HostResolverSource::ANY, NetworkIsolationKey());
dalyke966a1832019-06-05 20:53:135524 IPEndPoint kExpectedStaleIP = CreateExpected("192.168.1.102", 80);
5525 PopulateCache(cached_stale_key, kExpectedStaleIP);
5526 MakeCacheStale();
5527
5528 HostResolver::ResolveHostParameters stale_allowed_parameters;
5529 stale_allowed_parameters.cache_usage =
5530 HostResolver::ResolveHostParameters::CacheUsage::STALE_ALLOWED;
5531
5532 // The insecure cache should be checked before secure requests are made since
5533 // stale results are allowed.
5534 ResolveHostResponseHelper response_stale(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555535 HostPortPair("automatic_stale", 80), NetworkIsolationKey(),
5536 NetLogWithSource(), stale_allowed_parameters, request_context_.get(),
5537 host_cache_.get()));
dalyke966a1832019-06-05 20:53:135538 EXPECT_THAT(response_stale.result_error(), IsOk());
5539 EXPECT_THAT(response_stale.request()->GetAddressResults().value().endpoints(),
5540 testing::ElementsAre(kExpectedStaleIP));
5541 EXPECT_TRUE(response_stale.request()->GetStaleInfo()->is_stale());
5542}
5543
dalykc27699a2019-07-29 20:53:295544TEST_F(HostResolverManagerDnsTest,
5545 SecureDnsMode_Automatic_InsecureAsyncDisabled) {
5546 proc_->AddRuleForAllFamilies("insecure_automatic", "192.168.1.100");
5547 ChangeDnsConfig(CreateValidDnsConfig());
5548 resolver_->SetInsecureDnsClientEnabled(false);
5549 DnsConfigOverrides overrides;
5550 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
5551 resolver_->SetDnsConfigOverrides(overrides);
5552
5553 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result;
5554
5555 // The secure part of the dns client should be enabled.
5556 ResolveHostResponseHelper response_secure(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555557 HostPortPair("automatic", 80), NetworkIsolationKey(), NetLogWithSource(),
5558 base::nullopt, request_context_.get(), host_cache_.get()));
dalykc27699a2019-07-29 20:53:295559 ASSERT_THAT(response_secure.result_error(), IsOk());
5560 EXPECT_THAT(
5561 response_secure.request()->GetAddressResults().value().endpoints(),
5562 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
5563 CreateExpected("::1", 80)));
Matt Menke7b4a32f2019-10-25 22:13:465564 HostCache::Key secure_key = HostCache::Key(
5565 "automatic", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
5566 HostResolverSource::ANY, NetworkIsolationKey());
dalykc27699a2019-07-29 20:53:295567 secure_key.secure = true;
5568 cache_result = GetCacheHit(secure_key);
5569 EXPECT_TRUE(!!cache_result);
5570
5571 // The insecure part of the dns client is disabled so insecure requests
5572 // should be skipped.
5573 ResolveHostResponseHelper response_insecure(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555574 HostPortPair("insecure_automatic", 80), NetworkIsolationKey(),
5575 NetLogWithSource(), base::nullopt, request_context_.get(),
5576 host_cache_.get()));
dalykc27699a2019-07-29 20:53:295577 proc_->SignalMultiple(1u);
5578 ASSERT_THAT(response_insecure.result_error(), IsOk());
5579 EXPECT_THAT(
5580 response_insecure.request()->GetAddressResults().value().endpoints(),
5581 testing::ElementsAre(CreateExpected("192.168.1.100", 80)));
5582 HostCache::Key insecure_key =
5583 HostCache::Key("insecure_automatic", DnsQueryType::UNSPECIFIED,
Matt Menke7b4a32f2019-10-25 22:13:465584 0 /* host_resolver_flags */, HostResolverSource::ANY,
5585 NetworkIsolationKey());
dalykc27699a2019-07-29 20:53:295586 cache_result = GetCacheHit(insecure_key);
5587 EXPECT_TRUE(!!cache_result);
5588
5589 HostCache::Key cached_insecure_key =
5590 HostCache::Key("insecure_automatic_cached", DnsQueryType::UNSPECIFIED,
Matt Menke7b4a32f2019-10-25 22:13:465591 0 /* host_resolver_flags */, HostResolverSource::ANY,
5592 NetworkIsolationKey());
dalykc27699a2019-07-29 20:53:295593 IPEndPoint kExpectedInsecureIP = CreateExpected("192.168.1.101", 80);
5594 PopulateCache(cached_insecure_key, kExpectedInsecureIP);
5595
5596 // The insecure cache should still be checked even if the insecure part of
5597 // the dns client is disabled.
5598 ResolveHostResponseHelper response_insecure_cached(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555599 HostPortPair("insecure_automatic_cached", 80), NetworkIsolationKey(),
5600 NetLogWithSource(), base::nullopt, request_context_.get(),
5601 host_cache_.get()));
dalykc27699a2019-07-29 20:53:295602 EXPECT_THAT(response_insecure_cached.result_error(), IsOk());
5603 EXPECT_THAT(response_insecure_cached.request()
5604 ->GetAddressResults()
5605 .value()
5606 .endpoints(),
5607 testing::ElementsAre(kExpectedInsecureIP));
5608}
5609
dalyk6d7d8ead2019-08-15 03:30:085610TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Automatic_DotActive) {
5611 proc_->AddRuleForAllFamilies("insecure_automatic", "192.168.1.100");
5612 DnsConfig config = CreateValidDnsConfig();
5613 config.dns_over_tls_active = true;
5614 ChangeDnsConfig(config);
5615 DnsConfigOverrides overrides;
5616 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
5617 resolver_->SetDnsConfigOverrides(overrides);
5618
5619 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result;
5620
5621 // The secure part of the dns client should be enabled.
5622 ResolveHostResponseHelper response_secure(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555623 HostPortPair("automatic", 80), NetworkIsolationKey(), NetLogWithSource(),
5624 base::nullopt, request_context_.get(), host_cache_.get()));
dalyk6d7d8ead2019-08-15 03:30:085625 ASSERT_THAT(response_secure.result_error(), IsOk());
5626 EXPECT_THAT(
5627 response_secure.request()->GetAddressResults().value().endpoints(),
5628 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
5629 CreateExpected("::1", 80)));
Matt Menke7b4a32f2019-10-25 22:13:465630 HostCache::Key secure_key = HostCache::Key(
5631 "automatic", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
5632 HostResolverSource::ANY, NetworkIsolationKey());
dalyk6d7d8ead2019-08-15 03:30:085633 secure_key.secure = true;
5634 cache_result = GetCacheHit(secure_key);
5635 EXPECT_TRUE(!!cache_result);
5636
5637 // Insecure async requests should be skipped since the system resolver
5638 // requests will be secure.
5639 ResolveHostResponseHelper response_insecure(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555640 HostPortPair("insecure_automatic", 80), NetworkIsolationKey(),
5641 NetLogWithSource(), base::nullopt, request_context_.get(),
5642 host_cache_.get()));
dalyk6d7d8ead2019-08-15 03:30:085643 proc_->SignalMultiple(1u);
5644 ASSERT_THAT(response_insecure.result_error(), IsOk());
5645 EXPECT_THAT(
5646 response_insecure.request()->GetAddressResults().value().endpoints(),
5647 testing::ElementsAre(CreateExpected("192.168.1.100", 80)));
5648 HostCache::Key insecure_key =
5649 HostCache::Key("insecure_automatic", DnsQueryType::UNSPECIFIED,
Matt Menke7b4a32f2019-10-25 22:13:465650 0 /* host_resolver_flags */, HostResolverSource::ANY,
5651 NetworkIsolationKey());
dalyk6d7d8ead2019-08-15 03:30:085652 cache_result = GetCacheHit(insecure_key);
5653 EXPECT_TRUE(!!cache_result);
5654
5655 HostCache::Key cached_insecure_key =
5656 HostCache::Key("insecure_automatic_cached", DnsQueryType::UNSPECIFIED,
Matt Menke7b4a32f2019-10-25 22:13:465657 0 /* host_resolver_flags */, HostResolverSource::ANY,
5658 NetworkIsolationKey());
dalyk6d7d8ead2019-08-15 03:30:085659 IPEndPoint kExpectedInsecureIP = CreateExpected("192.168.1.101", 80);
5660 PopulateCache(cached_insecure_key, kExpectedInsecureIP);
5661
5662 // The insecure cache should still be checked.
5663 ResolveHostResponseHelper response_insecure_cached(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555664 HostPortPair("insecure_automatic_cached", 80), NetworkIsolationKey(),
5665 NetLogWithSource(), base::nullopt, request_context_.get(),
5666 host_cache_.get()));
dalyk6d7d8ead2019-08-15 03:30:085667 EXPECT_THAT(response_insecure_cached.result_error(), IsOk());
5668 EXPECT_THAT(response_insecure_cached.request()
5669 ->GetAddressResults()
5670 .value()
5671 .endpoints(),
5672 testing::ElementsAre(kExpectedInsecureIP));
5673}
5674
dalyk4f4ac712019-05-31 16:33:135675TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Secure) {
5676 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.100");
5677 set_allow_fallback_to_proctask(true);
5678
dalykc27699a2019-07-29 20:53:295679 ChangeDnsConfig(CreateValidDnsConfig());
dalyk4f4ac712019-05-31 16:33:135680 DnsConfigOverrides overrides;
5681 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::SECURE;
5682 resolver_->SetDnsConfigOverrides(overrides);
5683 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result;
5684
5685 ResolveHostResponseHelper response_secure(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555686 HostPortPair("secure", 80), NetworkIsolationKey(), NetLogWithSource(),
5687 base::nullopt, request_context_.get(), host_cache_.get()));
dalyk4f4ac712019-05-31 16:33:135688 ASSERT_THAT(response_secure.result_error(), IsOk());
Matt Menke7b4a32f2019-10-25 22:13:465689 HostCache::Key secure_key = HostCache::Key(
5690 "secure", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
5691 HostResolverSource::ANY, NetworkIsolationKey());
dalyk4f4ac712019-05-31 16:33:135692 secure_key.secure = true;
5693 cache_result = GetCacheHit(secure_key);
dalyk48b20a992019-02-25 16:10:265694 EXPECT_TRUE(!!cache_result);
5695
dalyk4f4ac712019-05-31 16:33:135696 ResolveHostResponseHelper response_insecure(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555697 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
5698 base::nullopt, request_context_.get(), host_cache_.get()));
dalyk4f4ac712019-05-31 16:33:135699 ASSERT_THAT(response_insecure.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
Matt Menke7b4a32f2019-10-25 22:13:465700 HostCache::Key insecure_key = HostCache::Key(
5701 "ok", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
5702 HostResolverSource::ANY, NetworkIsolationKey());
dalyk4f4ac712019-05-31 16:33:135703 cache_result = GetCacheHit(insecure_key);
5704 EXPECT_FALSE(!!cache_result);
dalyk48b20a992019-02-25 16:10:265705
dalyk4f4ac712019-05-31 16:33:135706 // Fallback to ProcTask not allowed in SECURE mode.
5707 ResolveHostResponseHelper response_proc(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555708 HostPortPair("nx_succeed", 80), NetworkIsolationKey(), NetLogWithSource(),
5709 base::nullopt, request_context_.get(), host_cache_.get()));
dalyk4f4ac712019-05-31 16:33:135710 proc_->SignalMultiple(1u);
5711 EXPECT_THAT(response_proc.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
dalyk48b20a992019-02-25 16:10:265712}
5713
dalykc27699a2019-07-29 20:53:295714TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Secure_InsecureAsyncDisabled) {
5715 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.100");
5716 set_allow_fallback_to_proctask(true);
5717 resolver_->SetInsecureDnsClientEnabled(false);
5718
5719 ChangeDnsConfig(CreateValidDnsConfig());
5720 DnsConfigOverrides overrides;
5721 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::SECURE;
5722 resolver_->SetDnsConfigOverrides(overrides);
5723 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result;
5724
5725 // The secure part of the dns client should be enabled.
5726 ResolveHostResponseHelper response_secure(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555727 HostPortPair("secure", 80), NetworkIsolationKey(), NetLogWithSource(),
5728 base::nullopt, request_context_.get(), host_cache_.get()));
dalykc27699a2019-07-29 20:53:295729 ASSERT_THAT(response_secure.result_error(), IsOk());
Matt Menke7b4a32f2019-10-25 22:13:465730 HostCache::Key secure_key = HostCache::Key(
5731 "secure", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
5732 HostResolverSource::ANY, NetworkIsolationKey());
dalykc27699a2019-07-29 20:53:295733 secure_key.secure = true;
5734 cache_result = GetCacheHit(secure_key);
5735 EXPECT_TRUE(!!cache_result);
5736}
5737
dalyk6f7f7ce62019-08-15 23:18:235738TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Secure_Local_CacheMiss) {
5739 ChangeDnsConfig(CreateValidDnsConfig());
5740 DnsConfigOverrides overrides;
5741 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::SECURE;
5742 resolver_->SetDnsConfigOverrides(overrides);
5743
5744 HostResolver::ResolveHostParameters source_none_parameters;
5745 source_none_parameters.source = HostResolverSource::LOCAL_ONLY;
5746
5747 // Populate cache with an insecure entry.
Matt Menke7b4a32f2019-10-25 22:13:465748 HostCache::Key cached_insecure_key = HostCache::Key(
5749 "automatic", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
5750 HostResolverSource::ANY, NetworkIsolationKey());
dalyk6f7f7ce62019-08-15 23:18:235751 IPEndPoint kExpectedInsecureIP = CreateExpected("192.168.1.102", 80);
5752 PopulateCache(cached_insecure_key, kExpectedInsecureIP);
5753
5754 // NONE query expected to complete synchronously with a cache miss since
5755 // the insecure cache should not be checked.
5756 ResolveHostResponseHelper cache_miss_request(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555757 HostPortPair("automatic", 80), NetworkIsolationKey(), NetLogWithSource(),
5758 source_none_parameters, request_context_.get(), host_cache_.get()));
dalyk6f7f7ce62019-08-15 23:18:235759 EXPECT_TRUE(cache_miss_request.complete());
5760 EXPECT_THAT(cache_miss_request.result_error(), IsError(ERR_DNS_CACHE_MISS));
5761 EXPECT_FALSE(cache_miss_request.request()->GetAddressResults());
5762 EXPECT_FALSE(cache_miss_request.request()->GetStaleInfo());
5763}
5764
5765TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Secure_Local_CacheHit) {
5766 ChangeDnsConfig(CreateValidDnsConfig());
5767 DnsConfigOverrides overrides;
5768 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::SECURE;
5769 resolver_->SetDnsConfigOverrides(overrides);
5770
5771 HostResolver::ResolveHostParameters source_none_parameters;
5772 source_none_parameters.source = HostResolverSource::LOCAL_ONLY;
5773
5774 // Populate cache with a secure entry.
Matt Menke7b4a32f2019-10-25 22:13:465775 HostCache::Key cached_secure_key = HostCache::Key(
5776 "secure", DnsQueryType::UNSPECIFIED, 0 /* host_resolver_flags */,
5777 HostResolverSource::ANY, NetworkIsolationKey());
dalyk6f7f7ce62019-08-15 23:18:235778 cached_secure_key.secure = true;
5779 IPEndPoint kExpectedSecureIP = CreateExpected("192.168.1.103", 80);
5780 PopulateCache(cached_secure_key, kExpectedSecureIP);
5781
5782 // NONE query expected to complete synchronously with a cache hit from the
5783 // secure cache.
5784 ResolveHostResponseHelper response_cached(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555785 HostPortPair("secure", 80), NetworkIsolationKey(), NetLogWithSource(),
5786 base::nullopt, request_context_.get(), host_cache_.get()));
dalyk6f7f7ce62019-08-15 23:18:235787 EXPECT_TRUE(response_cached.complete());
5788 EXPECT_THAT(response_cached.result_error(), IsOk());
5789 EXPECT_THAT(
5790 response_cached.request()->GetAddressResults().value().endpoints(),
5791 testing::ElementsAre(kExpectedSecureIP));
5792}
5793
[email protected]daae1322013-09-05 18:26:505794// Test the case where only a single transaction slot is available.
Eric Orth960e7062019-03-08 18:43:545795TEST_F(HostResolverManagerDnsTest, SerialResolver) {
[email protected]daae1322013-09-05 18:26:505796 CreateSerialResolver();
Eric Orth60931742018-11-05 23:40:575797 set_allow_fallback_to_proctask(false);
[email protected]daae1322013-09-05 18:26:505798 ChangeDnsConfig(CreateValidDnsConfig());
5799
Eric Orth117e1992019-04-17 00:24:155800 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555801 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
5802 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:005803 EXPECT_FALSE(response.complete());
5804 EXPECT_EQ(1u, num_running_dispatcher_jobs());
5805
5806 base::RunLoop().RunUntilIdle();
5807 EXPECT_TRUE(response.complete());
5808 EXPECT_THAT(response.result_error(), IsOk());
5809 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
5810 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
5811 CreateExpected("::1", 80)));
5812}
5813
Eric Orth70992982018-07-24 00:25:005814// Test the case where subsequent transactions are handled on transaction
5815// completion when only part of a multi-transaction request could be initially
5816// started.
Eric Orth960e7062019-03-08 18:43:545817TEST_F(HostResolverManagerDnsTest, AAAAStartsAfterOtherJobFinishes) {
Eric Orth70992982018-07-24 00:25:005818 CreateResolverWithLimitsAndParams(3u, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:325819 true /* ipv6_reachable */,
5820 true /* check_ipv6_on_wifi */);
Eric Orth60931742018-11-05 23:40:575821 set_allow_fallback_to_proctask(false);
Eric Orth70992982018-07-24 00:25:005822 ChangeDnsConfig(CreateValidDnsConfig());
5823
Eric Orth117e1992019-04-17 00:24:155824 ResolveHostResponseHelper response0(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555825 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
5826 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:005827 EXPECT_EQ(2u, num_running_dispatcher_jobs());
Eric Orth117e1992019-04-17 00:24:155828 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555829 HostPortPair("4slow_ok", 80), NetworkIsolationKey(), NetLogWithSource(),
5830 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:005831 EXPECT_EQ(3u, num_running_dispatcher_jobs());
5832
5833 // Request 0's transactions should complete, starting Request 1's second
5834 // transaction, which should also complete.
5835 base::RunLoop().RunUntilIdle();
5836 EXPECT_EQ(1u, num_running_dispatcher_jobs());
5837 EXPECT_TRUE(response0.complete());
5838 EXPECT_FALSE(response1.complete());
5839
5840 dns_client_->CompleteDelayedTransactions();
5841 EXPECT_THAT(response1.result_error(), IsOk());
5842 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
5843 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
5844 CreateExpected("::1", 80)));
5845}
5846
[email protected]daae1322013-09-05 18:26:505847// Tests the case that a Job with a single transaction receives an empty address
5848// list, triggering fallback to ProcTask.
Eric Orth960e7062019-03-08 18:43:545849TEST_F(HostResolverManagerDnsTest, IPv4EmptyFallback) {
Eric Orth70992982018-07-24 00:25:005850 // Disable ipv6 to ensure we'll only try a single transaction for the host.
5851 CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:325852 false /* ipv6_reachable */,
5853 true /* check_ipv6_on_wifi */);
Eric Orth70992982018-07-24 00:25:005854 DnsConfig config = CreateValidDnsConfig();
5855 config.use_local_ipv6 = false;
5856 ChangeDnsConfig(config);
5857
Eric Orth322af3e42018-08-20 18:12:595858 proc_->AddRuleForAllFamilies("empty_fallback", "192.168.0.1",
5859 HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6);
Eric Orth70992982018-07-24 00:25:005860 proc_->SignalMultiple(1u);
5861
5862 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555863 HostPortPair("empty_fallback", 80), NetworkIsolationKey(),
5864 NetLogWithSource(), base::nullopt, request_context_.get(),
5865 host_cache_.get()));
Eric Orth70992982018-07-24 00:25:005866 EXPECT_THAT(response.result_error(), IsOk());
5867 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
5868 testing::ElementsAre(CreateExpected("192.168.0.1", 80)));
5869}
5870
[email protected]daae1322013-09-05 18:26:505871// Tests the case that a Job with two transactions receives two empty address
5872// lists, triggering fallback to ProcTask.
Eric Orth960e7062019-03-08 18:43:545873TEST_F(HostResolverManagerDnsTest, UnspecEmptyFallback) {
[email protected]daae1322013-09-05 18:26:505874 ChangeDnsConfig(CreateValidDnsConfig());
5875 proc_->AddRuleForAllFamilies("empty_fallback", "192.168.0.1");
5876 proc_->SignalMultiple(1u);
Eric Orth70992982018-07-24 00:25:005877
5878 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555879 HostPortPair("empty_fallback", 80), NetworkIsolationKey(),
5880 NetLogWithSource(), base::nullopt, request_context_.get(),
5881 host_cache_.get()));
Eric Orth70992982018-07-24 00:25:005882
5883 EXPECT_THAT(response.result_error(), IsOk());
5884 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
5885 testing::ElementsAre(CreateExpected("192.168.0.1", 80)));
5886}
5887
[email protected]daae1322013-09-05 18:26:505888// Tests getting a new invalid DnsConfig while there are active DnsTasks.
Eric Orth960e7062019-03-08 18:43:545889TEST_F(HostResolverManagerDnsTest, InvalidDnsConfigWithPendingRequests) {
Eric Orth70992982018-07-24 00:25:005890 // At most 3 jobs active at once. This number is important, since we want
Eric Orth960e7062019-03-08 18:43:545891 // to make sure that aborting the first HostResolverManager::Job does not
Eric Orth70992982018-07-24 00:25:005892 // trigger another DnsTransaction on the second Job when it releases its
5893 // second prioritized dispatcher slot.
5894 CreateResolverWithLimitsAndParams(3u, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:325895 true /* ipv6_reachable */,
5896 true /* check_ipv6_on_wifi */);
Eric Orth70992982018-07-24 00:25:005897
5898 ChangeDnsConfig(CreateValidDnsConfig());
5899
5900 proc_->AddRuleForAllFamilies("slow_nx1", "192.168.0.1");
5901 proc_->AddRuleForAllFamilies("slow_nx2", "192.168.0.2");
5902 proc_->AddRuleForAllFamilies("ok", "192.168.0.3");
5903
5904 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
5905 // First active job gets two slots.
Eric Orth117e1992019-04-17 00:24:155906 responses.emplace_back(
5907 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555908 HostPortPair("slow_nx1", 80), NetworkIsolationKey(),
5909 NetLogWithSource(), base::nullopt, request_context_.get(),
5910 host_cache_.get())));
Eric Orth70992982018-07-24 00:25:005911 // Next job gets one slot, and waits on another.
Eric Orth117e1992019-04-17 00:24:155912 responses.emplace_back(
5913 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555914 HostPortPair("slow_nx2", 80), NetworkIsolationKey(),
5915 NetLogWithSource(), base::nullopt, request_context_.get(),
5916 host_cache_.get())));
Eric Orth117e1992019-04-17 00:24:155917 responses.emplace_back(
5918 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555919 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
5920 base::nullopt, request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:005921
5922 EXPECT_EQ(3u, num_running_dispatcher_jobs());
5923 for (auto& response : responses) {
5924 EXPECT_FALSE(response->complete());
5925 }
5926
dalyk4f4ac712019-05-31 16:33:135927 // Clear DNS config. Fully in-progress, partially in-progress, and queued
5928 // requests should all be aborted.
Eric Orthfe6d5482019-09-03 18:27:575929 InvalidateDnsConfig();
dalyk4f4ac712019-05-31 16:33:135930 for (auto& response : responses) {
5931 EXPECT_THAT(response->result_error(), IsError(ERR_NETWORK_CHANGED));
5932 }
Eric Orth70992982018-07-24 00:25:005933}
5934
Eric Orth70992982018-07-24 00:25:005935// Test that initial DNS config read signals do not abort pending requests
5936// when using DnsClient.
Eric Orth960e7062019-03-08 18:43:545937TEST_F(HostResolverManagerDnsTest, DontAbortOnInitialDNSConfigRead) {
Eric Orth70992982018-07-24 00:25:005938 // DnsClient is enabled, but there's no DnsConfig, so the request should start
5939 // using ProcTask.
Eric Orth117e1992019-04-17 00:24:155940 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555941 HostPortPair("host1", 70), NetworkIsolationKey(), NetLogWithSource(),
5942 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:005943 EXPECT_FALSE(response.complete());
5944
5945 EXPECT_TRUE(proc_->WaitFor(1u));
5946 // Send the initial config read signal, with a valid config.
5947 SetInitialDnsConfig(CreateValidDnsConfig());
5948 proc_->SignalAll();
5949
5950 EXPECT_THAT(response.result_error(), IsOk());
5951}
5952
dalykc27699a2019-07-29 20:53:295953// Tests the case that the insecure part of the DnsClient is automatically
5954// disabled due to failures while there are active DnsTasks.
Eric Orth960e7062019-03-08 18:43:545955TEST_F(HostResolverManagerDnsTest,
dalykc27699a2019-07-29 20:53:295956 AutomaticallyDisableInsecureDnsClientWithPendingRequests) {
[email protected]daae1322013-09-05 18:26:505957 // Trying different limits is important for this test: Different limits
5958 // result in different behavior when aborting in-progress DnsTasks. Having
5959 // a DnsTask that has one job active and one in the queue when another job
5960 // occupying two slots has its DnsTask aborted is the case most likely to run
Eric Orth60931742018-11-05 23:40:575961 // into problems. Try limits between [1, 2 * # of non failure requests].
5962 for (size_t limit = 1u; limit < 10u; ++limit) {
Eric Orth70992982018-07-24 00:25:005963 CreateResolverWithLimitsAndParams(limit, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:325964 true /* ipv6_reachable */,
5965 true /* check_ipv6_on_wifi */);
Eric Orth70992982018-07-24 00:25:005966
5967 ChangeDnsConfig(CreateValidDnsConfig());
5968
dalykc27699a2019-07-29 20:53:295969 // Queue up enough failures to disable insecure DnsTasks. These will all
5970 // fall back to ProcTasks, and succeed there.
Eric Orth70992982018-07-24 00:25:005971 std::vector<std::unique_ptr<ResolveHostResponseHelper>> failure_responses;
dalykc27699a2019-07-29 20:53:295972 for (unsigned i = 0u; i < maximum_insecure_dns_task_failures(); ++i) {
Eric Orth70992982018-07-24 00:25:005973 std::string host = base::StringPrintf("nx%u", i);
5974 proc_->AddRuleForAllFamilies(host, "192.168.0.1");
5975 failure_responses.emplace_back(
5976 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555977 HostPortPair(host, 80), NetworkIsolationKey(), NetLogWithSource(),
5978 base::nullopt, request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:005979 EXPECT_FALSE(failure_responses[i]->complete());
5980 }
5981
dalykc27699a2019-07-29 20:53:295982 // These requests should all bypass insecure DnsTasks, due to the above
5983 // failures, so should end up using ProcTasks.
Eric Orth70992982018-07-24 00:25:005984 proc_->AddRuleForAllFamilies("slow_ok1", "192.168.0.2");
5985 ResolveHostResponseHelper response0(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555986 HostPortPair("slow_ok1", 80), NetworkIsolationKey(), NetLogWithSource(),
5987 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:005988 EXPECT_FALSE(response0.complete());
5989 proc_->AddRuleForAllFamilies("slow_ok2", "192.168.0.3");
5990 ResolveHostResponseHelper response1(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555991 HostPortPair("slow_ok2", 80), NetworkIsolationKey(), NetLogWithSource(),
5992 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:005993 EXPECT_FALSE(response1.complete());
5994 proc_->AddRuleForAllFamilies("slow_ok3", "192.168.0.4");
5995 ResolveHostResponseHelper response2(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:555996 HostPortPair("slow_ok3", 80), NetworkIsolationKey(), NetLogWithSource(),
5997 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:005998 EXPECT_FALSE(response2.complete());
5999
Eric Orth60931742018-11-05 23:40:576000 // Requests specifying DNS source cannot fallback to ProcTask, so they
6001 // should be unaffected.
6002 HostResolver::ResolveHostParameters parameters;
6003 parameters.source = HostResolverSource::DNS;
6004 ResolveHostResponseHelper response_dns(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556005 HostPortPair("4slow_ok", 80), NetworkIsolationKey(), NetLogWithSource(),
6006 parameters, request_context_.get(), host_cache_.get()));
Eric Orth60931742018-11-05 23:40:576007 EXPECT_FALSE(response_dns.complete());
6008
6009 // Requests specifying SYSTEM source should be unaffected by disabling
6010 // DnsClient.
6011 proc_->AddRuleForAllFamilies("nx_ok", "192.168.0.5");
6012 parameters.source = HostResolverSource::SYSTEM;
Eric Orth117e1992019-04-17 00:24:156013 ResolveHostResponseHelper response_system(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556014 HostPortPair("nx_ok", 80), NetworkIsolationKey(), NetLogWithSource(),
6015 parameters, request_context_.get(), host_cache_.get()));
Eric Orth60931742018-11-05 23:40:576016 EXPECT_FALSE(response_system.complete());
6017
dalykc27699a2019-07-29 20:53:296018 // Secure DnsTasks should not be affected.
6019 HostResolver::ResolveHostParameters secure_parameters;
6020 secure_parameters.secure_dns_mode_override =
6021 DnsConfig::SecureDnsMode::AUTOMATIC;
6022 ResolveHostResponseHelper response_secure(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556023 HostPortPair("automatic", 80), NetworkIsolationKey(),
6024 NetLogWithSource(), secure_parameters, request_context_.get(),
6025 host_cache_.get()));
dalykc27699a2019-07-29 20:53:296026 EXPECT_FALSE(response_secure.complete());
Eric Orth70992982018-07-24 00:25:006027
Eric Orth394db1732019-08-27 20:09:396028 proc_->SignalMultiple(maximum_insecure_dns_task_failures() + 4);
dalykc27699a2019-07-29 20:53:296029
6030 for (size_t i = 0u; i < maximum_insecure_dns_task_failures(); ++i) {
Eric Orth70992982018-07-24 00:25:006031 EXPECT_THAT(failure_responses[i]->result_error(), IsOk());
6032 EXPECT_THAT(failure_responses[i]
6033 ->request()
6034 ->GetAddressResults()
6035 .value()
6036 .endpoints(),
6037 testing::ElementsAre(CreateExpected("192.168.0.1", 80)));
6038 }
6039
6040 EXPECT_THAT(response0.result_error(), IsOk());
6041 EXPECT_THAT(response0.request()->GetAddressResults().value().endpoints(),
6042 testing::ElementsAre(CreateExpected("192.168.0.2", 80)));
6043 EXPECT_THAT(response1.result_error(), IsOk());
6044 EXPECT_THAT(response1.request()->GetAddressResults().value().endpoints(),
6045 testing::ElementsAre(CreateExpected("192.168.0.3", 80)));
6046 EXPECT_THAT(response2.result_error(), IsOk());
6047 EXPECT_THAT(response2.request()->GetAddressResults().value().endpoints(),
6048 testing::ElementsAre(CreateExpected("192.168.0.4", 80)));
Eric Orth60931742018-11-05 23:40:576049
6050 dns_client_->CompleteDelayedTransactions();
6051 EXPECT_THAT(response_dns.result_error(), IsOk());
6052
6053 EXPECT_THAT(response_system.result_error(), IsOk());
6054 EXPECT_THAT(
6055 response_system.request()->GetAddressResults().value().endpoints(),
6056 testing::ElementsAre(CreateExpected("192.168.0.5", 80)));
dalykc27699a2019-07-29 20:53:296057
6058 EXPECT_THAT(response_secure.result_error(), IsOk());
Eric Orth70992982018-07-24 00:25:006059 }
6060}
6061
[email protected]daae1322013-09-05 18:26:506062// Tests a call to SetDnsClient while there are active DnsTasks.
Eric Orth960e7062019-03-08 18:43:546063TEST_F(HostResolverManagerDnsTest,
6064 ManuallyDisableDnsClientWithPendingRequests) {
[email protected]daae1322013-09-05 18:26:506065 // At most 3 jobs active at once. This number is important, since we want to
Eric Orth960e7062019-03-08 18:43:546066 // make sure that aborting the first HostResolverManager::Job does not trigger
[email protected]daae1322013-09-05 18:26:506067 // another DnsTransaction on the second Job when it releases its second
6068 // prioritized dispatcher slot.
Eric Orth70992982018-07-24 00:25:006069 CreateResolverWithLimitsAndParams(3u, DefaultParams(proc_.get()),
Eric Orth607b6d82019-05-08 16:43:326070 true /* ipv6_reachable */,
6071 true /* check_ipv6_on_wifi */);
[email protected]daae1322013-09-05 18:26:506072
[email protected]daae1322013-09-05 18:26:506073 ChangeDnsConfig(CreateValidDnsConfig());
6074
6075 proc_->AddRuleForAllFamilies("slow_ok1", "192.168.0.1");
6076 proc_->AddRuleForAllFamilies("slow_ok2", "192.168.0.2");
6077 proc_->AddRuleForAllFamilies("ok", "192.168.0.3");
6078
Eric Orth70992982018-07-24 00:25:006079 std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
6080 // First active job gets two slots.
Eric Orth117e1992019-04-17 00:24:156081 responses.emplace_back(
6082 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556083 HostPortPair("slow_ok1", 80), NetworkIsolationKey(),
6084 NetLogWithSource(), base::nullopt, request_context_.get(),
6085 host_cache_.get())));
Eric Orth70992982018-07-24 00:25:006086 EXPECT_FALSE(responses[0]->complete());
6087 // Next job gets one slot, and waits on another.
Eric Orth117e1992019-04-17 00:24:156088 responses.emplace_back(
6089 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556090 HostPortPair("slow_ok2", 80), NetworkIsolationKey(),
6091 NetLogWithSource(), base::nullopt, request_context_.get(),
6092 host_cache_.get())));
Eric Orth70992982018-07-24 00:25:006093 EXPECT_FALSE(responses[1]->complete());
6094 // Next one is queued.
Eric Orth117e1992019-04-17 00:24:156095 responses.emplace_back(
6096 std::make_unique<ResolveHostResponseHelper>(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556097 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
6098 base::nullopt, request_context_.get(), host_cache_.get())));
Eric Orth70992982018-07-24 00:25:006099 EXPECT_FALSE(responses[2]->complete());
6100
6101 EXPECT_EQ(3u, num_running_dispatcher_jobs());
6102
6103 // Clear DnsClient. The two in-progress jobs should fall back to a ProcTask,
6104 // and the next one should be started with a ProcTask.
dalykc27699a2019-07-29 20:53:296105 resolver_->SetInsecureDnsClientEnabled(false);
Eric Orth70992982018-07-24 00:25:006106
6107 // All three in-progress requests should now be running a ProcTask.
6108 EXPECT_EQ(3u, num_running_dispatcher_jobs());
6109 proc_->SignalMultiple(3u);
6110
6111 for (auto& response : responses) {
6112 EXPECT_THAT(response->result_error(), IsOk());
6113 }
6114 EXPECT_THAT(responses[0]->request()->GetAddressResults().value().endpoints(),
6115 testing::ElementsAre(CreateExpected("192.168.0.1", 80)));
6116 EXPECT_THAT(responses[1]->request()->GetAddressResults().value().endpoints(),
6117 testing::ElementsAre(CreateExpected("192.168.0.2", 80)));
6118 EXPECT_THAT(responses[2]->request()->GetAddressResults().value().endpoints(),
6119 testing::ElementsAre(CreateExpected("192.168.0.3", 80)));
6120}
6121
Eric Orth04aad982019-05-06 22:41:046122// When explicitly requesting source=DNS, no fallback allowed, so doing so with
6123// DnsClient disabled should result in an error.
6124TEST_F(HostResolverManagerDnsTest, DnsCallsWithDisabledDnsClient) {
Eric Orth4e55b362019-05-07 22:00:036125 ChangeDnsConfig(CreateValidDnsConfig());
dalykc27699a2019-07-29 20:53:296126 resolver_->SetInsecureDnsClientEnabled(false);
Eric Orth04aad982019-05-06 22:41:046127
6128 HostResolver::ResolveHostParameters params;
6129 params.source = HostResolverSource::DNS;
6130 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556131 HostPortPair("host", 80), NetworkIsolationKey(), NetLogWithSource(),
6132 params, request_context_.get(), host_cache_.get()));
Eric Orth04aad982019-05-06 22:41:046133
dalykc27699a2019-07-29 20:53:296134 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_CACHE_MISS));
Eric Orth04aad982019-05-06 22:41:046135}
6136
Eric Orth4e55b362019-05-07 22:00:036137TEST_F(HostResolverManagerDnsTest,
6138 DnsCallsWithDisabledDnsClient_DisabledAtConstruction) {
6139 HostResolver::ManagerOptions options = DefaultOptions();
dalykc27699a2019-07-29 20:53:296140 options.insecure_dns_client_enabled = false;
Eric Orth4e55b362019-05-07 22:00:036141 CreateResolverWithOptionsAndParams(std::move(options),
6142 DefaultParams(proc_.get()),
6143 true /* ipv6_reachable */);
6144 ChangeDnsConfig(CreateValidDnsConfig());
6145
6146 HostResolver::ResolveHostParameters params;
6147 params.source = HostResolverSource::DNS;
6148 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556149 HostPortPair("host", 80), NetworkIsolationKey(), NetLogWithSource(),
6150 params, request_context_.get(), host_cache_.get()));
Eric Orth4e55b362019-05-07 22:00:036151
dalykc27699a2019-07-29 20:53:296152 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_CACHE_MISS));
Eric Orth4e55b362019-05-07 22:00:036153}
6154
6155// Same as DnsClient disabled, requests with source=DNS and no usable DnsConfig
6156// should result in an error.
6157TEST_F(HostResolverManagerDnsTest, DnsCallsWithNoDnsConfig) {
Eric Orthfe6d5482019-09-03 18:27:576158 InvalidateDnsConfig();
Eric Orth4e55b362019-05-07 22:00:036159
6160 HostResolver::ResolveHostParameters params;
6161 params.source = HostResolverSource::DNS;
6162 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556163 HostPortPair("host", 80), NetworkIsolationKey(), NetLogWithSource(),
6164 params, request_context_.get(), host_cache_.get()));
Eric Orth4e55b362019-05-07 22:00:036165
dalykc27699a2019-07-29 20:53:296166 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_CACHE_MISS));
Eric Orth4e55b362019-05-07 22:00:036167}
6168
Eric Orth607b6d82019-05-08 16:43:326169TEST_F(HostResolverManagerDnsTest, NoCheckIpv6OnWifi) {
rchce64e6732017-06-05 17:41:576170 // CreateSerialResolver will destroy the current resolver_ which will attempt
6171 // to remove itself from the NetworkChangeNotifier. If this happens after a
6172 // new NetworkChangeNotifier is active, then it will not remove itself from
6173 // the old NetworkChangeNotifier which is a potential use-after-free.
Eric Orth37b18192019-04-22 19:09:286174 DestroyResolver();
mgershaf9a9232017-04-13 20:19:036175 test::ScopedMockNetworkChangeNotifier notifier;
Eric Orth607b6d82019-05-08 16:43:326176 // Serial resolver to guarantee order of resolutions.
6177 CreateSerialResolver(false /* check_ipv6_on_wifi */);
mgershaf9a9232017-04-13 20:19:036178
6179 notifier.mock_network_change_notifier()->SetConnectionType(
6180 NetworkChangeNotifier::CONNECTION_WIFI);
6181 // Needed so IPv6 availability check isn't skipped.
6182 ChangeDnsConfig(CreateValidDnsConfig());
6183
6184 proc_->AddRule("h1", ADDRESS_FAMILY_UNSPECIFIED, "::3");
6185 proc_->AddRule("h1", ADDRESS_FAMILY_IPV4, "1.0.0.1");
Eric Orth322af3e42018-08-20 18:12:596186 proc_->AddRule("h1", ADDRESS_FAMILY_IPV4, "1.0.0.1",
6187 HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6);
mgershaf9a9232017-04-13 20:19:036188 proc_->AddRule("h1", ADDRESS_FAMILY_IPV6, "::2");
6189
Eric Orth117e1992019-04-17 00:24:156190 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556191 HostPortPair("h1", 80), NetworkIsolationKey(), NetLogWithSource(),
6192 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth00fe5a62018-08-15 22:20:006193 HostResolver::ResolveHostParameters parameters;
Eric Orth192e3bb2018-11-14 19:30:326194 parameters.dns_query_type = DnsQueryType::A;
Eric Orth117e1992019-04-17 00:24:156195 ResolveHostResponseHelper v4_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556196 HostPortPair("h1", 80), NetworkIsolationKey(), NetLogWithSource(),
6197 parameters, request_context_.get(), host_cache_.get()));
Eric Orth192e3bb2018-11-14 19:30:326198 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth117e1992019-04-17 00:24:156199 ResolveHostResponseHelper v6_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556200 HostPortPair("h1", 80), NetworkIsolationKey(), NetLogWithSource(),
6201 parameters, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:006202
Eric Orth00fe5a62018-08-15 22:20:006203 proc_->SignalMultiple(3u);
Eric Orth70992982018-07-24 00:25:006204
6205 // Should revert to only IPV4 request.
6206 EXPECT_THAT(response.result_error(), IsOk());
6207 EXPECT_THAT(response.request()->GetAddressResults().value().endpoints(),
6208 testing::ElementsAre(CreateExpected("1.0.0.1", 80)));
6209
Eric Orth00fe5a62018-08-15 22:20:006210 EXPECT_THAT(v4_response.result_error(), IsOk());
6211 EXPECT_THAT(v4_response.request()->GetAddressResults().value().endpoints(),
6212 testing::ElementsAre(CreateExpected("1.0.0.1", 80)));
6213 EXPECT_THAT(v6_response.result_error(), IsOk());
6214 EXPECT_THAT(v6_response.request()->GetAddressResults().value().endpoints(),
6215 testing::ElementsAre(CreateExpected("::2", 80)));
6216
Eric Orth70992982018-07-24 00:25:006217 // Now repeat the test on non-wifi to check that IPv6 is used as normal
6218 // after the network changes.
6219 notifier.mock_network_change_notifier()->SetConnectionType(
6220 NetworkChangeNotifier::CONNECTION_4G);
6221 base::RunLoop().RunUntilIdle(); // Wait for NetworkChangeNotifier.
6222
Eric Orth117e1992019-04-17 00:24:156223 ResolveHostResponseHelper no_wifi_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556224 HostPortPair("h1", 80), NetworkIsolationKey(), NetLogWithSource(),
6225 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth192e3bb2018-11-14 19:30:326226 parameters.dns_query_type = DnsQueryType::A;
Eric Orth117e1992019-04-17 00:24:156227 ResolveHostResponseHelper no_wifi_v4_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556228 HostPortPair("h1", 80), NetworkIsolationKey(), NetLogWithSource(),
6229 parameters, request_context_.get(), host_cache_.get()));
Eric Orth192e3bb2018-11-14 19:30:326230 parameters.dns_query_type = DnsQueryType::AAAA;
Eric Orth117e1992019-04-17 00:24:156231 ResolveHostResponseHelper no_wifi_v6_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556232 HostPortPair("h1", 80), NetworkIsolationKey(), NetLogWithSource(),
6233 parameters, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:006234
Eric Orth00fe5a62018-08-15 22:20:006235 proc_->SignalMultiple(3u);
Eric Orth70992982018-07-24 00:25:006236
6237 // IPV6 should be available.
6238 EXPECT_THAT(no_wifi_response.result_error(), IsOk());
6239 EXPECT_THAT(
6240 no_wifi_response.request()->GetAddressResults().value().endpoints(),
6241 testing::ElementsAre(CreateExpected("::3", 80)));
Eric Orth00fe5a62018-08-15 22:20:006242
6243 EXPECT_THAT(no_wifi_v4_response.result_error(), IsOk());
6244 EXPECT_THAT(
6245 no_wifi_v4_response.request()->GetAddressResults().value().endpoints(),
6246 testing::ElementsAre(CreateExpected("1.0.0.1", 80)));
6247 EXPECT_THAT(no_wifi_v6_response.result_error(), IsOk());
6248 EXPECT_THAT(
6249 no_wifi_v6_response.request()->GetAddressResults().value().endpoints(),
6250 testing::ElementsAre(CreateExpected("::2", 80)));
Eric Orth70992982018-07-24 00:25:006251}
6252
Eric Orth960e7062019-03-08 18:43:546253TEST_F(HostResolverManagerDnsTest, NotFoundTTL) {
Brad Lassey2e8f185d2018-05-21 22:25:216254 CreateResolver();
Eric Orth60931742018-11-05 23:40:576255 set_allow_fallback_to_proctask(false);
Brad Lassey2e8f185d2018-05-21 22:25:216256 ChangeDnsConfig(CreateValidDnsConfig());
Eric Orth70992982018-07-24 00:25:006257
6258 // NODATA
Eric Orth117e1992019-04-17 00:24:156259 ResolveHostResponseHelper no_data_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556260 HostPortPair("empty", 80), NetworkIsolationKey(), NetLogWithSource(),
6261 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:006262 EXPECT_THAT(no_data_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
6263 EXPECT_FALSE(no_data_response.request()->GetAddressResults());
Eric Orth192e3bb2018-11-14 19:30:326264 HostCache::Key key("empty", DnsQueryType::UNSPECIFIED, 0,
Matt Menke7b4a32f2019-10-25 22:13:466265 HostResolverSource::ANY, NetworkIsolationKey());
Eric Orth70992982018-07-24 00:25:006266 HostCache::EntryStaleness staleness;
dalyk48b20a992019-02-25 16:10:266267 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result =
Eric Orth37b18192019-04-22 19:09:286268 host_cache_->Lookup(key, base::TimeTicks::Now(),
6269 false /* ignore_secure */);
dalyk48b20a992019-02-25 16:10:266270 EXPECT_TRUE(!!cache_result);
6271 EXPECT_TRUE(cache_result->second.has_ttl());
6272 EXPECT_THAT(cache_result->second.ttl(), base::TimeDelta::FromSeconds(86400));
Eric Orth70992982018-07-24 00:25:006273
6274 // NXDOMAIN
Eric Orth117e1992019-04-17 00:24:156275 ResolveHostResponseHelper no_domain_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556276 HostPortPair("nodomain", 80), NetworkIsolationKey(), NetLogWithSource(),
6277 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth70992982018-07-24 00:25:006278 EXPECT_THAT(no_domain_response.result_error(),
6279 IsError(ERR_NAME_NOT_RESOLVED));
6280 EXPECT_FALSE(no_domain_response.request()->GetAddressResults());
Eric Orth192e3bb2018-11-14 19:30:326281 HostCache::Key nxkey("nodomain", DnsQueryType::UNSPECIFIED, 0,
Matt Menke7b4a32f2019-10-25 22:13:466282 HostResolverSource::ANY, NetworkIsolationKey());
Eric Orth37b18192019-04-22 19:09:286283 cache_result = host_cache_->Lookup(nxkey, base::TimeTicks::Now(),
6284 false /* ignore_secure */);
dalyk48b20a992019-02-25 16:10:266285 EXPECT_TRUE(!!cache_result);
6286 EXPECT_TRUE(cache_result->second.has_ttl());
6287 EXPECT_THAT(cache_result->second.ttl(), base::TimeDelta::FromSeconds(86400));
Eric Orth70992982018-07-24 00:25:006288}
6289
Eric Orth960e7062019-03-08 18:43:546290TEST_F(HostResolverManagerDnsTest, CachedError) {
dalyk4f4ac712019-05-31 16:33:136291 proc_->AddRuleForAllFamilies(std::string(),
Eric Roman862ae4b22019-08-22 20:25:446292 "0.0.0.1"); // Default to failures.
dalyk4f4ac712019-05-31 16:33:136293 proc_->SignalMultiple(1u);
6294
Eric Ortheb332862019-01-26 00:52:386295 CreateResolver();
dalyk4f4ac712019-05-31 16:33:136296 set_allow_fallback_to_proctask(true);
Eric Ortheb332862019-01-26 00:52:386297 ChangeDnsConfig(CreateValidDnsConfig());
6298
6299 HostResolver::ResolveHostParameters cache_only_parameters;
6300 cache_only_parameters.source = HostResolverSource::LOCAL_ONLY;
6301
6302 // Expect cache initially empty.
dalyk4f4ac712019-05-31 16:33:136303 ResolveHostResponseHelper cache_miss_response0(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556304 HostPortPair("nodomain", 80), NetworkIsolationKey(), NetLogWithSource(),
6305 cache_only_parameters, request_context_.get(), host_cache_.get()));
dalyk4f4ac712019-05-31 16:33:136306 EXPECT_THAT(cache_miss_response0.result_error(), IsError(ERR_DNS_CACHE_MISS));
6307 EXPECT_FALSE(cache_miss_response0.request()->GetStaleInfo());
6308
6309 // The cache should not be populate with an error because fallback to ProcTask
6310 // was available.
6311 ResolveHostResponseHelper no_domain_response_with_fallback(
Matt Menkef4023312019-11-01 18:24:556312 resolver_->CreateRequest(HostPortPair("nodomain", 80),
6313 NetworkIsolationKey(), NetLogWithSource(),
dalyk4f4ac712019-05-31 16:33:136314 base::nullopt, request_context_.get(),
6315 host_cache_.get()));
6316 EXPECT_THAT(no_domain_response_with_fallback.result_error(),
6317 IsError(ERR_NAME_NOT_RESOLVED));
6318
6319 // Expect cache still empty.
6320 ResolveHostResponseHelper cache_miss_response1(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556321 HostPortPair("nodomain", 80), NetworkIsolationKey(), NetLogWithSource(),
6322 cache_only_parameters, request_context_.get(), host_cache_.get()));
dalyk4f4ac712019-05-31 16:33:136323 EXPECT_THAT(cache_miss_response1.result_error(), IsError(ERR_DNS_CACHE_MISS));
6324 EXPECT_FALSE(cache_miss_response1.request()->GetStaleInfo());
6325
6326 // Disable fallback to proctask
6327 set_allow_fallback_to_proctask(false);
Eric Ortheb332862019-01-26 00:52:386328
6329 // Populate cache with an error.
Eric Orth117e1992019-04-17 00:24:156330 ResolveHostResponseHelper no_domain_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556331 HostPortPair("nodomain", 80), NetworkIsolationKey(), NetLogWithSource(),
6332 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:386333 EXPECT_THAT(no_domain_response.result_error(),
6334 IsError(ERR_NAME_NOT_RESOLVED));
6335
6336 // Expect the error result can be resolved from the cache.
Eric Orth117e1992019-04-17 00:24:156337 ResolveHostResponseHelper cache_hit_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556338 HostPortPair("nodomain", 80), NetworkIsolationKey(), NetLogWithSource(),
6339 cache_only_parameters, request_context_.get(), host_cache_.get()));
Eric Ortheb332862019-01-26 00:52:386340 EXPECT_THAT(cache_hit_response.result_error(),
6341 IsError(ERR_NAME_NOT_RESOLVED));
6342 EXPECT_FALSE(cache_hit_response.request()->GetStaleInfo().value().is_stale());
6343}
6344
dalyk4f4ac712019-05-31 16:33:136345TEST_F(HostResolverManagerDnsTest, CachedError_AutomaticMode) {
6346 CreateResolver();
6347 set_allow_fallback_to_proctask(false);
6348 ChangeDnsConfig(CreateValidDnsConfig());
6349
6350 // Switch to automatic mode.
6351 DnsConfigOverrides overrides;
6352 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
6353 resolver_->SetDnsConfigOverrides(overrides);
6354
6355 HostCache::Key insecure_key =
6356 HostCache::Key("automatic_nodomain", DnsQueryType::UNSPECIFIED,
Matt Menke7b4a32f2019-10-25 22:13:466357 0 /* host_resolver_flags */, HostResolverSource::ANY,
6358 NetworkIsolationKey());
dalyk4f4ac712019-05-31 16:33:136359 HostCache::Key secure_key =
6360 HostCache::Key("automatic_nodomain", DnsQueryType::UNSPECIFIED,
Matt Menke7b4a32f2019-10-25 22:13:466361 0 /* host_resolver_flags */, HostResolverSource::ANY,
6362 NetworkIsolationKey());
dalyk4f4ac712019-05-31 16:33:136363 secure_key.secure = true;
6364
6365 // Expect cache initially empty.
6366 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result;
6367 cache_result = GetCacheHit(secure_key);
6368 EXPECT_FALSE(!!cache_result);
6369 cache_result = GetCacheHit(insecure_key);
6370 EXPECT_FALSE(!!cache_result);
6371
6372 // Populate both secure and insecure caches with an error.
6373 ResolveHostResponseHelper no_domain_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556374 HostPortPair("automatic_nodomain", 80), NetworkIsolationKey(),
6375 NetLogWithSource(), base::nullopt, request_context_.get(),
6376 host_cache_.get()));
dalyk4f4ac712019-05-31 16:33:136377 EXPECT_THAT(no_domain_response.result_error(),
6378 IsError(ERR_NAME_NOT_RESOLVED));
6379
6380 // Expect both secure and insecure caches to have the error result.
6381 cache_result = GetCacheHit(secure_key);
6382 EXPECT_TRUE(!!cache_result);
6383 cache_result = GetCacheHit(insecure_key);
6384 EXPECT_TRUE(!!cache_result);
6385}
6386
6387TEST_F(HostResolverManagerDnsTest, CachedError_SecureMode) {
6388 CreateResolver();
6389 set_allow_fallback_to_proctask(false);
6390 ChangeDnsConfig(CreateValidDnsConfig());
6391
6392 // Switch to secure mode.
6393 DnsConfigOverrides overrides;
6394 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::SECURE;
6395 resolver_->SetDnsConfigOverrides(overrides);
6396
6397 HostCache::Key insecure_key =
6398 HostCache::Key("automatic_nodomain", DnsQueryType::UNSPECIFIED,
Matt Menke7b4a32f2019-10-25 22:13:466399 0 /* host_resolver_flags */, HostResolverSource::ANY,
6400 NetworkIsolationKey());
dalyk4f4ac712019-05-31 16:33:136401 HostCache::Key secure_key =
6402 HostCache::Key("automatic_nodomain", DnsQueryType::UNSPECIFIED,
Matt Menke7b4a32f2019-10-25 22:13:466403 0 /* host_resolver_flags */, HostResolverSource::ANY,
6404 NetworkIsolationKey());
dalyk4f4ac712019-05-31 16:33:136405 secure_key.secure = true;
6406
6407 // Expect cache initially empty.
6408 const std::pair<const HostCache::Key, HostCache::Entry>* cache_result;
6409 cache_result = GetCacheHit(secure_key);
6410 EXPECT_FALSE(!!cache_result);
6411 cache_result = GetCacheHit(insecure_key);
6412 EXPECT_FALSE(!!cache_result);
6413
6414 // Populate secure cache with an error.
6415 ResolveHostResponseHelper no_domain_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556416 HostPortPair("automatic_nodomain", 80), NetworkIsolationKey(),
6417 NetLogWithSource(), base::nullopt, request_context_.get(),
6418 host_cache_.get()));
dalyk4f4ac712019-05-31 16:33:136419 EXPECT_THAT(no_domain_response.result_error(),
6420 IsError(ERR_NAME_NOT_RESOLVED));
6421
6422 // Expect only the secure cache to have the error result.
6423 cache_result = GetCacheHit(secure_key);
6424 EXPECT_TRUE(!!cache_result);
6425 cache_result = GetCacheHit(insecure_key);
6426 EXPECT_FALSE(!!cache_result);
6427}
6428
Eric Orth960e7062019-03-08 18:43:546429TEST_F(HostResolverManagerDnsTest, NoCanonicalName) {
Eric Orth828bd3ae2018-12-12 17:30:366430 MockDnsClientRuleList rules;
6431 AddDnsRule(&rules, "alias", dns_protocol::kTypeA, IPAddress::IPv4Localhost(),
dalyk48b20a992019-02-25 16:10:266432 "canonical", false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:366433 AddDnsRule(&rules, "alias", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:266434 IPAddress::IPv6Localhost(), "canonical", false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:366435
Asanka Herath2d0226c2018-10-24 14:35:556436 CreateResolver();
Eric Orth828bd3ae2018-12-12 17:30:366437 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
Eric Orth60931742018-11-05 23:40:576438 set_allow_fallback_to_proctask(false);
Eric Orth828bd3ae2018-12-12 17:30:366439
Eric Orth117e1992019-04-17 00:24:156440 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556441 HostPortPair("alias", 80), NetworkIsolationKey(), NetLogWithSource(),
6442 base::nullopt, request_context_.get(), host_cache_.get()));
Asanka Herath2d0226c2018-10-24 14:35:556443 ASSERT_THAT(response.result_error(), IsOk());
6444
Matt Menkec35d1632018-11-29 12:43:496445 // HostResolver may still give name, but if so, it must be correct.
6446 std::string result_name =
6447 response.request()->GetAddressResults().value().canonical_name();
6448 EXPECT_TRUE(result_name.empty() || result_name == "canonical");
Asanka Herath2d0226c2018-10-24 14:35:556449}
6450
Eric Orth960e7062019-03-08 18:43:546451TEST_F(HostResolverManagerDnsTest, CanonicalName) {
Eric Orth828bd3ae2018-12-12 17:30:366452 MockDnsClientRuleList rules;
6453 AddDnsRule(&rules, "alias", dns_protocol::kTypeA, IPAddress::IPv4Localhost(),
dalyk48b20a992019-02-25 16:10:266454 "canonical", false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:366455 AddDnsRule(&rules, "alias", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:266456 IPAddress::IPv6Localhost(), "canonical", false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:366457
Asanka Herath2d0226c2018-10-24 14:35:556458 CreateResolver();
Eric Orth828bd3ae2018-12-12 17:30:366459 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
Eric Orth60931742018-11-05 23:40:576460 set_allow_fallback_to_proctask(false);
Eric Orth828bd3ae2018-12-12 17:30:366461
Asanka Herath2d0226c2018-10-24 14:35:556462 HostResolver::ResolveHostParameters params;
Asanka Herath2d0226c2018-10-24 14:35:556463 params.include_canonical_name = true;
Eric Orth541a90c2019-01-17 20:11:466464 params.source = HostResolverSource::DNS;
Eric Orth117e1992019-04-17 00:24:156465 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556466 HostPortPair("alias", 80), NetworkIsolationKey(), NetLogWithSource(),
6467 params, request_context_.get(), host_cache_.get()));
Asanka Herath2d0226c2018-10-24 14:35:556468 ASSERT_THAT(response.result_error(), IsOk());
6469
6470 EXPECT_EQ(response.request()->GetAddressResults().value().canonical_name(),
6471 "canonical");
6472}
6473
Eric Orth960e7062019-03-08 18:43:546474TEST_F(HostResolverManagerDnsTest, CanonicalName_PreferV6) {
Eric Orth828bd3ae2018-12-12 17:30:366475 MockDnsClientRuleList rules;
6476 AddDnsRule(&rules, "alias", dns_protocol::kTypeA, IPAddress::IPv4Localhost(),
dalyk48b20a992019-02-25 16:10:266477 "wrong", false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:366478 AddDnsRule(&rules, "alias", dns_protocol::kTypeAAAA,
dalyk48b20a992019-02-25 16:10:266479 IPAddress::IPv6Localhost(), "correct", true /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:366480
Asanka Herath2d0226c2018-10-24 14:35:556481 CreateResolver();
Eric Orth828bd3ae2018-12-12 17:30:366482 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
Eric Orth60931742018-11-05 23:40:576483 set_allow_fallback_to_proctask(false);
Eric Orth828bd3ae2018-12-12 17:30:366484
Asanka Herath2d0226c2018-10-24 14:35:556485 HostResolver::ResolveHostParameters params;
Asanka Herath2d0226c2018-10-24 14:35:556486 params.include_canonical_name = true;
Eric Orth541a90c2019-01-17 20:11:466487 params.source = HostResolverSource::DNS;
Eric Orth117e1992019-04-17 00:24:156488 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556489 HostPortPair("alias", 80), NetworkIsolationKey(), NetLogWithSource(),
6490 params, request_context_.get(), host_cache_.get()));
Asanka Herath2d0226c2018-10-24 14:35:556491 ASSERT_FALSE(response.complete());
6492 base::RunLoop().RunUntilIdle();
6493 dns_client_->CompleteDelayedTransactions();
6494 ASSERT_THAT(response.result_error(), IsOk());
6495 EXPECT_EQ(response.request()->GetAddressResults().value().canonical_name(),
6496 "correct");
6497}
6498
Eric Orth960e7062019-03-08 18:43:546499TEST_F(HostResolverManagerDnsTest, CanonicalName_V4Only) {
Eric Orth828bd3ae2018-12-12 17:30:366500 MockDnsClientRuleList rules;
6501 AddDnsRule(&rules, "alias", dns_protocol::kTypeA, IPAddress::IPv4Localhost(),
dalyk48b20a992019-02-25 16:10:266502 "correct", false /* delay */);
Asanka Herath2d0226c2018-10-24 14:35:556503 CreateResolver();
Eric Orth828bd3ae2018-12-12 17:30:366504 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
Eric Orth60931742018-11-05 23:40:576505 set_allow_fallback_to_proctask(false);
Eric Orth828bd3ae2018-12-12 17:30:366506
Asanka Herath2d0226c2018-10-24 14:35:556507 HostResolver::ResolveHostParameters params;
Eric Orth192e3bb2018-11-14 19:30:326508 params.dns_query_type = DnsQueryType::A;
Asanka Herath2d0226c2018-10-24 14:35:556509 params.include_canonical_name = true;
Eric Orth541a90c2019-01-17 20:11:466510 params.source = HostResolverSource::DNS;
Eric Orth117e1992019-04-17 00:24:156511 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556512 HostPortPair("alias", 80), NetworkIsolationKey(), NetLogWithSource(),
6513 params, request_context_.get(), host_cache_.get()));
Asanka Herath2d0226c2018-10-24 14:35:556514 ASSERT_THAT(response.result_error(), IsOk());
6515 EXPECT_EQ(response.request()->GetAddressResults().value().canonical_name(),
6516 "correct");
6517}
6518
Eric Orth541a90c2019-01-17 20:11:466519// Test that without specifying source, a request that would otherwise be
6520// handled by DNS is sent to the system resolver if cannonname is requested.
Eric Orth960e7062019-03-08 18:43:546521TEST_F(HostResolverManagerDnsTest, CanonicalNameForcesProc) {
Eric Orth541a90c2019-01-17 20:11:466522 // Disable fallback to ensure system resolver is used directly, not via
6523 // fallback.
6524 set_allow_fallback_to_proctask(false);
6525
6526 proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.102",
6527 HOST_RESOLVER_CANONNAME, "canonical");
6528 proc_->SignalMultiple(1u);
6529
6530 ChangeDnsConfig(CreateValidDnsConfig());
6531
6532 HostResolver::ResolveHostParameters params;
6533 params.include_canonical_name = true;
6534 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556535 HostPortPair("nx_succeed", 80), NetworkIsolationKey(), NetLogWithSource(),
6536 params, request_context_.get(), host_cache_.get()));
Eric Orth541a90c2019-01-17 20:11:466537 ASSERT_THAT(response.result_error(), IsOk());
6538
6539 EXPECT_EQ(response.request()->GetAddressResults().value().canonical_name(),
6540 "canonical");
6541}
6542
David Van Cleve34c74c72019-10-31 19:58:016543TEST_F(HostResolverManagerDnsTest, SortsAndDeduplicatesAddresses) {
6544 MockDnsClientRuleList rules;
6545
6546 {
6547 std::vector<DnsResourceRecord> answers(
6548 3, BuildTestAddressRecord("duplicate", IPAddress::IPv4Localhost()));
6549 std::string dns_name;
6550 CHECK(DNSDomainFromDot("duplicate", &dns_name));
6551 base::Optional<DnsQuery> query(base::in_place, 0, dns_name,
6552 dns_protocol::kTypeA);
6553
6554 rules.emplace_back(
6555 "duplicate", dns_protocol::kTypeA, false /* secure */,
6556 MockDnsClientRule::Result(std::make_unique<DnsResponse>(
6557 0, false, std::move(answers),
6558 std::vector<DnsResourceRecord>() /* authority_records */,
6559 std::vector<DnsResourceRecord>() /* additional_records */, query)),
6560 false /* delay */);
6561 }
6562
6563 {
6564 std::vector<DnsResourceRecord> answers(
6565 3, BuildTestAddressRecord("duplicate", IPAddress::IPv6Localhost()));
6566 std::string dns_name;
6567 CHECK(DNSDomainFromDot("duplicate", &dns_name));
6568 base::Optional<DnsQuery> query(base::in_place, 0, dns_name,
6569 dns_protocol::kTypeAAAA);
6570
6571 rules.emplace_back(
6572 "duplicate", dns_protocol::kTypeAAAA, false /* secure */,
6573 MockDnsClientRule::Result(std::make_unique<DnsResponse>(
6574 0, false, std::move(answers),
6575 std::vector<DnsResourceRecord>() /* authority_records */,
6576 std::vector<DnsResourceRecord>() /* additional_records */, query)),
6577 false /* delay */);
6578 }
6579
6580 CreateResolver();
6581 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
6582
6583 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:556584 HostPortPair("duplicate", 80), NetworkIsolationKey(), NetLogWithSource(),
6585 base::nullopt, request_context_.get(), host_cache_.get()));
David Van Cleve34c74c72019-10-31 19:58:016586 ASSERT_THAT(response.result_error(), IsOk());
6587
6588 EXPECT_THAT(
6589 response.request()->GetAddressResults(),
6590 testing::Optional(testing::Property(
6591 &AddressList::endpoints,
6592 testing::ElementsAre(IPEndPoint(IPAddress::IPv6Localhost(), 80),
6593 IPEndPoint(IPAddress::IPv4Localhost(), 80)))));
6594}
6595
Eric Orth960e7062019-03-08 18:43:546596TEST_F(HostResolverManagerTest, ResolveLocalHostname) {
tfarina9ed7f8c52016-02-19 17:50:186597 AddressList addresses;
6598
6599 TestBothLoopbackIPs("localhost");
6600 TestBothLoopbackIPs("localhoST");
6601 TestBothLoopbackIPs("localhost.");
6602 TestBothLoopbackIPs("localhoST.");
6603 TestBothLoopbackIPs("localhost.localdomain");
6604 TestBothLoopbackIPs("localhost.localdomAIn");
6605 TestBothLoopbackIPs("localhost.localdomain.");
6606 TestBothLoopbackIPs("localhost.localdomAIn.");
6607 TestBothLoopbackIPs("foo.localhost");
6608 TestBothLoopbackIPs("foo.localhOSt");
6609 TestBothLoopbackIPs("foo.localhost.");
6610 TestBothLoopbackIPs("foo.localhOSt.");
6611
6612 TestIPv6LoopbackOnly("localhost6");
6613 TestIPv6LoopbackOnly("localhoST6");
6614 TestIPv6LoopbackOnly("localhost6.");
6615 TestIPv6LoopbackOnly("localhost6.localdomain6");
6616 TestIPv6LoopbackOnly("localhost6.localdomain6.");
6617
Matt Menkec35d1632018-11-29 12:43:496618 EXPECT_FALSE(ResolveLocalHostname("127.0.0.1", &addresses));
6619 EXPECT_FALSE(ResolveLocalHostname("::1", &addresses));
6620 EXPECT_FALSE(ResolveLocalHostname("0:0:0:0:0:0:0:1", &addresses));
6621 EXPECT_FALSE(ResolveLocalHostname("localhostx", &addresses));
6622 EXPECT_FALSE(ResolveLocalHostname("localhost.x", &addresses));
6623 EXPECT_FALSE(ResolveLocalHostname("foo.localdomain", &addresses));
6624 EXPECT_FALSE(ResolveLocalHostname("foo.localdomain.x", &addresses));
6625 EXPECT_FALSE(ResolveLocalHostname("localhost6x", &addresses));
6626 EXPECT_FALSE(ResolveLocalHostname("localhost.localdomain6", &addresses));
6627 EXPECT_FALSE(ResolveLocalHostname("localhost6.localdomain", &addresses));
6628 EXPECT_FALSE(ResolveLocalHostname("127.0.0.1.1", &addresses));
6629 EXPECT_FALSE(ResolveLocalHostname(".127.0.0.255", &addresses));
6630 EXPECT_FALSE(ResolveLocalHostname("::2", &addresses));
6631 EXPECT_FALSE(ResolveLocalHostname("::1:1", &addresses));
6632 EXPECT_FALSE(ResolveLocalHostname("0:0:0:0:1:0:0:1", &addresses));
6633 EXPECT_FALSE(ResolveLocalHostname("::1:1", &addresses));
6634 EXPECT_FALSE(ResolveLocalHostname("0:0:0:0:0:0:0:0:1", &addresses));
6635 EXPECT_FALSE(ResolveLocalHostname("foo.localhost.com", &addresses));
6636 EXPECT_FALSE(ResolveLocalHostname("foo.localhoste", &addresses));
tfarina9ed7f8c52016-02-19 17:50:186637}
6638
Eric Orth960e7062019-03-08 18:43:546639TEST_F(HostResolverManagerDnsTest, AddDnsOverHttpsServerAfterConfig) {
Eric Orth37b18192019-04-22 19:09:286640 DestroyResolver();
Brad Lassey786929ad2018-02-21 20:54:276641 test::ScopedMockNetworkChangeNotifier notifier;
6642 CreateSerialResolver(); // To guarantee order of resolutions.
6643 notifier.mock_network_change_notifier()->SetConnectionType(
6644 NetworkChangeNotifier::CONNECTION_WIFI);
6645 ChangeDnsConfig(CreateValidDnsConfig());
6646
dalykb34631f2018-08-24 19:59:486647 std::string server("https://dnsserver.example.net/dns-query{?dns}");
Eric Orthc1eb1292018-10-09 22:07:076648 DnsConfigOverrides overrides;
6649 overrides.dns_over_https_servers.emplace(
6650 {DnsConfig::DnsOverHttpsServerConfig(server, true)});
dalykc27699a2019-07-29 20:53:296651 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
Eric Orthc1eb1292018-10-09 22:07:076652 resolver_->SetDnsConfigOverrides(overrides);
Brad Lassey786929ad2018-02-21 20:54:276653 base::DictionaryValue* config;
6654
6655 auto value = resolver_->GetDnsConfigAsValue();
6656 EXPECT_TRUE(value);
6657 if (!value)
6658 return;
6659 value->GetAsDictionary(&config);
6660 base::ListValue* doh_servers;
6661 config->GetListWithoutPathExpansion("doh_servers", &doh_servers);
6662 EXPECT_TRUE(doh_servers);
6663 if (!doh_servers)
6664 return;
6665 EXPECT_EQ(doh_servers->GetSize(), 1u);
6666 base::DictionaryValue* server_method;
6667 EXPECT_TRUE(doh_servers->GetDictionary(0, &server_method));
6668 bool use_post;
6669 EXPECT_TRUE(server_method->GetBoolean("use_post", &use_post));
6670 EXPECT_TRUE(use_post);
dalykb34631f2018-08-24 19:59:486671 std::string server_template;
6672 EXPECT_TRUE(server_method->GetString("server_template", &server_template));
6673 EXPECT_EQ(server_template, server);
dalykc27699a2019-07-29 20:53:296674 EXPECT_EQ(config->FindKey("secure_dns_mode")->GetInt(),
6675 static_cast<int>(DnsConfig::SecureDnsMode::AUTOMATIC));
Brad Lassey786929ad2018-02-21 20:54:276676}
6677
Eric Orth960e7062019-03-08 18:43:546678TEST_F(HostResolverManagerDnsTest, AddDnsOverHttpsServerBeforeConfig) {
Eric Orth37b18192019-04-22 19:09:286679 DestroyResolver();
Brad Lassey786929ad2018-02-21 20:54:276680 test::ScopedMockNetworkChangeNotifier notifier;
6681 CreateSerialResolver(); // To guarantee order of resolutions.
dalykb34631f2018-08-24 19:59:486682 std::string server("https://dnsserver.example.net/dns-query{?dns}");
Eric Orthc1eb1292018-10-09 22:07:076683 DnsConfigOverrides overrides;
6684 overrides.dns_over_https_servers.emplace(
6685 {DnsConfig::DnsOverHttpsServerConfig(server, true)});
dalykc27699a2019-07-29 20:53:296686 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
Eric Orthc1eb1292018-10-09 22:07:076687 resolver_->SetDnsConfigOverrides(overrides);
Brad Lassey786929ad2018-02-21 20:54:276688
6689 notifier.mock_network_change_notifier()->SetConnectionType(
6690 NetworkChangeNotifier::CONNECTION_WIFI);
6691 ChangeDnsConfig(CreateValidDnsConfig());
6692
6693 base::DictionaryValue* config;
6694 auto value = resolver_->GetDnsConfigAsValue();
6695 EXPECT_TRUE(value);
6696 if (!value)
6697 return;
6698 value->GetAsDictionary(&config);
6699 base::ListValue* doh_servers;
6700 config->GetListWithoutPathExpansion("doh_servers", &doh_servers);
6701 EXPECT_TRUE(doh_servers);
6702 if (!doh_servers)
6703 return;
6704 EXPECT_EQ(doh_servers->GetSize(), 1u);
6705 base::DictionaryValue* server_method;
6706 EXPECT_TRUE(doh_servers->GetDictionary(0, &server_method));
6707 bool use_post;
6708 EXPECT_TRUE(server_method->GetBoolean("use_post", &use_post));
6709 EXPECT_TRUE(use_post);
dalykb34631f2018-08-24 19:59:486710 std::string server_template;
6711 EXPECT_TRUE(server_method->GetString("server_template", &server_template));
6712 EXPECT_EQ(server_template, server);
dalykc27699a2019-07-29 20:53:296713 EXPECT_EQ(config->FindKey("secure_dns_mode")->GetInt(),
6714 static_cast<int>(DnsConfig::SecureDnsMode::AUTOMATIC));
Brad Lassey786929ad2018-02-21 20:54:276715}
6716
Eric Orth960e7062019-03-08 18:43:546717TEST_F(HostResolverManagerDnsTest, AddDnsOverHttpsServerBeforeClient) {
Eric Orth37b18192019-04-22 19:09:286718 DestroyResolver();
Brad Lassey786929ad2018-02-21 20:54:276719 test::ScopedMockNetworkChangeNotifier notifier;
6720 CreateSerialResolver(); // To guarantee order of resolutions.
dalykb34631f2018-08-24 19:59:486721 std::string server("https://dnsserver.example.net/dns-query{?dns}");
Eric Orthc1eb1292018-10-09 22:07:076722 DnsConfigOverrides overrides;
6723 overrides.dns_over_https_servers.emplace(
6724 {DnsConfig::DnsOverHttpsServerConfig(server, true)});
dalykc27699a2019-07-29 20:53:296725 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
Eric Orthc1eb1292018-10-09 22:07:076726 resolver_->SetDnsConfigOverrides(overrides);
Brad Lassey786929ad2018-02-21 20:54:276727
6728 notifier.mock_network_change_notifier()->SetConnectionType(
6729 NetworkChangeNotifier::CONNECTION_WIFI);
6730 ChangeDnsConfig(CreateValidDnsConfig());
6731
Brad Lassey786929ad2018-02-21 20:54:276732 base::DictionaryValue* config;
6733 auto value = resolver_->GetDnsConfigAsValue();
6734 EXPECT_TRUE(value);
6735 if (!value)
6736 return;
6737 value->GetAsDictionary(&config);
6738 base::ListValue* doh_servers;
6739 config->GetListWithoutPathExpansion("doh_servers", &doh_servers);
6740 EXPECT_TRUE(doh_servers);
6741 if (!doh_servers)
6742 return;
6743 EXPECT_EQ(doh_servers->GetSize(), 1u);
6744 base::DictionaryValue* server_method;
6745 EXPECT_TRUE(doh_servers->GetDictionary(0, &server_method));
6746 bool use_post;
6747 EXPECT_TRUE(server_method->GetBoolean("use_post", &use_post));
6748 EXPECT_TRUE(use_post);
dalykb34631f2018-08-24 19:59:486749 std::string server_template;
6750 EXPECT_TRUE(server_method->GetString("server_template", &server_template));
6751 EXPECT_EQ(server_template, server);
dalykc27699a2019-07-29 20:53:296752 EXPECT_EQ(config->FindKey("secure_dns_mode")->GetInt(),
6753 static_cast<int>(DnsConfig::SecureDnsMode::AUTOMATIC));
Brad Lassey786929ad2018-02-21 20:54:276754}
6755
Eric Orth960e7062019-03-08 18:43:546756TEST_F(HostResolverManagerDnsTest, AddDnsOverHttpsServerAndThenRemove) {
Eric Orth37b18192019-04-22 19:09:286757 DestroyResolver();
Brad Lassey786929ad2018-02-21 20:54:276758 test::ScopedMockNetworkChangeNotifier notifier;
6759 CreateSerialResolver(); // To guarantee order of resolutions.
dalykb34631f2018-08-24 19:59:486760 std::string server("https://dns.example.com/");
Eric Orthc1eb1292018-10-09 22:07:076761 DnsConfigOverrides overrides;
6762 overrides.dns_over_https_servers.emplace(
6763 {DnsConfig::DnsOverHttpsServerConfig(server, true)});
dalykc27699a2019-07-29 20:53:296764 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
Eric Orthc1eb1292018-10-09 22:07:076765 resolver_->SetDnsConfigOverrides(overrides);
Brad Lassey786929ad2018-02-21 20:54:276766
6767 notifier.mock_network_change_notifier()->SetConnectionType(
6768 NetworkChangeNotifier::CONNECTION_WIFI);
dalyk4f4ac712019-05-31 16:33:136769 DnsConfig network_dns_config = CreateValidDnsConfig();
6770 network_dns_config.dns_over_https_servers.clear();
6771 ChangeDnsConfig(network_dns_config);
Brad Lassey786929ad2018-02-21 20:54:276772
6773 base::DictionaryValue* config;
6774 auto value = resolver_->GetDnsConfigAsValue();
6775 EXPECT_TRUE(value);
6776 if (!value)
6777 return;
6778 value->GetAsDictionary(&config);
6779 base::ListValue* doh_servers;
6780 config->GetListWithoutPathExpansion("doh_servers", &doh_servers);
6781 EXPECT_TRUE(doh_servers);
6782 if (!doh_servers)
6783 return;
6784 EXPECT_EQ(doh_servers->GetSize(), 1u);
6785 base::DictionaryValue* server_method;
6786 EXPECT_TRUE(doh_servers->GetDictionary(0, &server_method));
6787 bool use_post;
6788 EXPECT_TRUE(server_method->GetBoolean("use_post", &use_post));
6789 EXPECT_TRUE(use_post);
dalykb34631f2018-08-24 19:59:486790 std::string server_template;
6791 EXPECT_TRUE(server_method->GetString("server_template", &server_template));
6792 EXPECT_EQ(server_template, server);
dalykc27699a2019-07-29 20:53:296793 EXPECT_EQ(config->FindKey("secure_dns_mode")->GetInt(),
6794 static_cast<int>(DnsConfig::SecureDnsMode::AUTOMATIC));
Brad Lassey786929ad2018-02-21 20:54:276795
Eric Orthc1eb1292018-10-09 22:07:076796 resolver_->SetDnsConfigOverrides(DnsConfigOverrides());
Brad Lassey786929ad2018-02-21 20:54:276797 value = resolver_->GetDnsConfigAsValue();
6798 EXPECT_TRUE(value);
6799 if (!value)
6800 return;
6801 value->GetAsDictionary(&config);
6802 config->GetListWithoutPathExpansion("doh_servers", &doh_servers);
6803 EXPECT_TRUE(doh_servers);
6804 if (!doh_servers)
6805 return;
6806 EXPECT_EQ(doh_servers->GetSize(), 0u);
dalykc27699a2019-07-29 20:53:296807 EXPECT_EQ(config->FindKey("secure_dns_mode")->GetInt(),
6808 static_cast<int>(DnsConfig::SecureDnsMode::OFF));
Brad Lassey786929ad2018-02-21 20:54:276809}
6810
Eric Orth394db1732019-08-27 20:09:396811// Basic test socket factory that allows creation of UDP sockets, but those
6812// sockets are mocks with no data and are not expected to be usable.
6813class AlwaysFailSocketFactory : public MockClientSocketFactory {
6814 public:
6815 std::unique_ptr<DatagramClientSocket> CreateDatagramClientSocket(
6816 DatagramSocket::BindType bind_type,
6817 NetLog* net_log,
6818 const NetLogSource& source) override {
6819 return std::make_unique<MockUDPClientSocket>();
6820 }
6821};
6822
Eric Ortha3559ca2019-09-05 23:40:546823class TestDnsObserver : public NetworkChangeNotifier::DNSObserver {
6824 public:
6825 void OnDNSChanged() override { ++dns_changed_calls_; }
6826
Eric Ortha3559ca2019-09-05 23:40:546827 int dns_changed_calls() const { return dns_changed_calls_; }
6828
6829 private:
6830 int dns_changed_calls_ = 0;
6831};
6832
Eric Orth394db1732019-08-27 20:09:396833// Built-in client and config overrides not available on iOS.
6834#if !defined(OS_IOS)
Eric Orth960e7062019-03-08 18:43:546835TEST_F(HostResolverManagerDnsTest, SetDnsConfigOverrides) {
Eric Ortha3559ca2019-09-05 23:40:546836 test::ScopedMockNetworkChangeNotifier mock_network_change_notifier;
6837 TestDnsObserver config_observer;
6838 NetworkChangeNotifier::AddDNSObserver(&config_observer);
6839
Eric Orth394db1732019-08-27 20:09:396840 // Use a real DnsClient to test config-handling behavior.
6841 AlwaysFailSocketFactory socket_factory;
6842 auto client = DnsClient::CreateClientForTesting(
6843 nullptr /* net_log */, &socket_factory, base::Bind(&base::RandInt));
6844 DnsClient* client_ptr = client.get();
6845 resolver_->SetDnsClientForTesting(std::move(client));
6846
Eric Orthc1eb1292018-10-09 22:07:076847 DnsConfig original_config = CreateValidDnsConfig();
6848 ChangeDnsConfig(original_config);
6849
6850 // Confirm pre-override state.
Eric Orth394db1732019-08-27 20:09:396851 ASSERT_EQ(original_config, *client_ptr->GetEffectiveConfig());
Eric Orthc1eb1292018-10-09 22:07:076852
6853 DnsConfigOverrides overrides;
6854 const std::vector<IPEndPoint> nameservers = {
6855 CreateExpected("192.168.0.1", 92)};
6856 overrides.nameservers = nameservers;
6857 const std::vector<std::string> search = {"str"};
6858 overrides.search = search;
6859 const DnsHosts hosts = {
6860 {DnsHostsKey("host", ADDRESS_FAMILY_IPV4), IPAddress(192, 168, 1, 1)}};
6861 overrides.hosts = hosts;
6862 overrides.append_to_multi_label_name = false;
6863 overrides.randomize_ports = true;
6864 const int ndots = 5;
6865 overrides.ndots = ndots;
6866 const base::TimeDelta timeout = base::TimeDelta::FromSeconds(10);
6867 overrides.timeout = timeout;
6868 const int attempts = 20;
6869 overrides.attempts = attempts;
6870 overrides.rotate = true;
6871 overrides.use_local_ipv6 = true;
6872 const std::vector<DnsConfig::DnsOverHttpsServerConfig>
6873 dns_over_https_servers = {
6874 DnsConfig::DnsOverHttpsServerConfig("dns.example.com", true)};
6875 overrides.dns_over_https_servers = dns_over_https_servers;
dalykbd726ee2019-05-30 01:44:066876 const DnsConfig::SecureDnsMode secure_dns_mode =
6877 DnsConfig::SecureDnsMode::SECURE;
6878 overrides.secure_dns_mode = secure_dns_mode;
dalykf93a48e372019-09-04 02:57:596879 overrides.allow_dns_over_https_upgrade = true;
6880 const std::vector<std::string> disabled_upgrade_providers = {"provider_name"};
6881 overrides.disabled_upgrade_providers = disabled_upgrade_providers;
Eric Orthc1eb1292018-10-09 22:07:076882
Eric Orthc823a23d2018-10-30 22:12:486883 // This test is expected to test overriding all fields.
6884 EXPECT_TRUE(overrides.OverridesEverything());
6885
Eric Ortha3559ca2019-09-05 23:40:546886 EXPECT_EQ(0, config_observer.dns_changed_calls());
6887
Eric Orthc1eb1292018-10-09 22:07:076888 resolver_->SetDnsConfigOverrides(overrides);
6889
Eric Orth394db1732019-08-27 20:09:396890 const DnsConfig* overridden_config = client_ptr->GetEffectiveConfig();
6891 ASSERT_TRUE(overridden_config);
Eric Orthc1eb1292018-10-09 22:07:076892 EXPECT_EQ(nameservers, overridden_config->nameservers);
6893 EXPECT_EQ(search, overridden_config->search);
6894 EXPECT_EQ(hosts, overridden_config->hosts);
6895 EXPECT_FALSE(overridden_config->append_to_multi_label_name);
6896 EXPECT_TRUE(overridden_config->randomize_ports);
6897 EXPECT_EQ(ndots, overridden_config->ndots);
6898 EXPECT_EQ(timeout, overridden_config->timeout);
6899 EXPECT_EQ(attempts, overridden_config->attempts);
6900 EXPECT_TRUE(overridden_config->rotate);
6901 EXPECT_TRUE(overridden_config->use_local_ipv6);
6902 EXPECT_EQ(dns_over_https_servers, overridden_config->dns_over_https_servers);
dalykbd726ee2019-05-30 01:44:066903 EXPECT_EQ(secure_dns_mode, overridden_config->secure_dns_mode);
dalykf93a48e372019-09-04 02:57:596904 EXPECT_TRUE(overridden_config->allow_dns_over_https_upgrade);
6905 EXPECT_EQ(disabled_upgrade_providers,
6906 overridden_config->disabled_upgrade_providers);
Eric Ortha3559ca2019-09-05 23:40:546907
6908 base::RunLoop().RunUntilIdle(); // Notifications are async.
6909 EXPECT_EQ(1, config_observer.dns_changed_calls());
6910
6911 NetworkChangeNotifier::RemoveDNSObserver(&config_observer);
Eric Orthc1eb1292018-10-09 22:07:076912}
6913
Eric Orth960e7062019-03-08 18:43:546914TEST_F(HostResolverManagerDnsTest,
Eric Orthc823a23d2018-10-30 22:12:486915 SetDnsConfigOverrides_OverrideEverythingCreation) {
Eric Orth394db1732019-08-27 20:09:396916 // Use a real DnsClient to test config-handling behavior.
6917 AlwaysFailSocketFactory socket_factory;
6918 auto client = DnsClient::CreateClientForTesting(
6919 nullptr /* net_log */, &socket_factory, base::Bind(&base::RandInt));
6920 DnsClient* client_ptr = client.get();
6921 resolver_->SetDnsClientForTesting(std::move(client));
6922
Eric Orthc823a23d2018-10-30 22:12:486923 DnsConfig original_config = CreateValidDnsConfig();
6924 ChangeDnsConfig(original_config);
6925
6926 // Confirm pre-override state.
Eric Orth394db1732019-08-27 20:09:396927 ASSERT_EQ(original_config, *client_ptr->GetEffectiveConfig());
Eric Orthc823a23d2018-10-30 22:12:486928 ASSERT_FALSE(original_config.Equals(DnsConfig()));
6929
6930 DnsConfigOverrides overrides =
6931 DnsConfigOverrides::CreateOverridingEverythingWithDefaults();
6932 EXPECT_TRUE(overrides.OverridesEverything());
6933
6934 // Ensure config is valid by setting a nameserver.
6935 std::vector<IPEndPoint> nameservers = {CreateExpected("1.2.3.4", 50)};
6936 overrides.nameservers = nameservers;
6937 EXPECT_TRUE(overrides.OverridesEverything());
6938
6939 resolver_->SetDnsConfigOverrides(overrides);
6940
6941 DnsConfig expected;
6942 expected.nameservers = nameservers;
Eric Orth394db1732019-08-27 20:09:396943 EXPECT_THAT(client_ptr->GetEffectiveConfig(), testing::Pointee(expected));
Eric Orthc823a23d2018-10-30 22:12:486944}
6945
Eric Orth960e7062019-03-08 18:43:546946TEST_F(HostResolverManagerDnsTest, SetDnsConfigOverrides_PartialOverride) {
Eric Orth394db1732019-08-27 20:09:396947 // Use a real DnsClient to test config-handling behavior.
6948 AlwaysFailSocketFactory socket_factory;
6949 auto client = DnsClient::CreateClientForTesting(
6950 nullptr /* net_log */, &socket_factory, base::Bind(&base::RandInt));
6951 DnsClient* client_ptr = client.get();
6952 resolver_->SetDnsClientForTesting(std::move(client));
6953
Eric Orthc1eb1292018-10-09 22:07:076954 DnsConfig original_config = CreateValidDnsConfig();
6955 ChangeDnsConfig(original_config);
6956
6957 // Confirm pre-override state.
Eric Orth394db1732019-08-27 20:09:396958 ASSERT_EQ(original_config, *client_ptr->GetEffectiveConfig());
Eric Orthc1eb1292018-10-09 22:07:076959
6960 DnsConfigOverrides overrides;
6961 const std::vector<IPEndPoint> nameservers = {
6962 CreateExpected("192.168.0.2", 192)};
6963 overrides.nameservers = nameservers;
6964 overrides.rotate = true;
Eric Orthc823a23d2018-10-30 22:12:486965 EXPECT_FALSE(overrides.OverridesEverything());
Eric Orthc1eb1292018-10-09 22:07:076966
6967 resolver_->SetDnsConfigOverrides(overrides);
6968
Eric Orth394db1732019-08-27 20:09:396969 const DnsConfig* overridden_config = client_ptr->GetEffectiveConfig();
6970 ASSERT_TRUE(overridden_config);
Eric Orthc1eb1292018-10-09 22:07:076971 EXPECT_EQ(nameservers, overridden_config->nameservers);
6972 EXPECT_EQ(original_config.search, overridden_config->search);
6973 EXPECT_EQ(original_config.hosts, overridden_config->hosts);
6974 EXPECT_TRUE(overridden_config->append_to_multi_label_name);
6975 EXPECT_FALSE(overridden_config->randomize_ports);
6976 EXPECT_EQ(original_config.ndots, overridden_config->ndots);
6977 EXPECT_EQ(original_config.timeout, overridden_config->timeout);
6978 EXPECT_EQ(original_config.attempts, overridden_config->attempts);
6979 EXPECT_TRUE(overridden_config->rotate);
6980 EXPECT_FALSE(overridden_config->use_local_ipv6);
6981 EXPECT_EQ(original_config.dns_over_https_servers,
6982 overridden_config->dns_over_https_servers);
dalykbd726ee2019-05-30 01:44:066983 EXPECT_EQ(original_config.secure_dns_mode,
6984 overridden_config->secure_dns_mode);
Eric Orthc1eb1292018-10-09 22:07:076985}
6986
6987// Test that overridden configs are reapplied over a changed underlying system
6988// config.
Eric Orth960e7062019-03-08 18:43:546989TEST_F(HostResolverManagerDnsTest, SetDnsConfigOverrides_NewConfig) {
Eric Orth394db1732019-08-27 20:09:396990 // Use a real DnsClient to test config-handling behavior.
6991 AlwaysFailSocketFactory socket_factory;
6992 auto client = DnsClient::CreateClientForTesting(
6993 nullptr /* net_log */, &socket_factory, base::Bind(&base::RandInt));
6994 DnsClient* client_ptr = client.get();
6995 resolver_->SetDnsClientForTesting(std::move(client));
6996
Eric Orthc1eb1292018-10-09 22:07:076997 DnsConfig original_config = CreateValidDnsConfig();
6998 ChangeDnsConfig(original_config);
6999
7000 // Confirm pre-override state.
Eric Orth394db1732019-08-27 20:09:397001 ASSERT_EQ(original_config, *client_ptr->GetEffectiveConfig());
Eric Orthc1eb1292018-10-09 22:07:077002
7003 DnsConfigOverrides overrides;
7004 const std::vector<IPEndPoint> nameservers = {
7005 CreateExpected("192.168.0.2", 192)};
7006 overrides.nameservers = nameservers;
7007
7008 resolver_->SetDnsConfigOverrides(overrides);
Eric Orth394db1732019-08-27 20:09:397009 ASSERT_TRUE(client_ptr->GetEffectiveConfig());
7010 ASSERT_EQ(nameservers, client_ptr->GetEffectiveConfig()->nameservers);
Eric Orthc1eb1292018-10-09 22:07:077011
7012 DnsConfig new_config = original_config;
7013 new_config.attempts = 103;
7014 ASSERT_NE(nameservers, new_config.nameservers);
7015 ChangeDnsConfig(new_config);
7016
Eric Orth394db1732019-08-27 20:09:397017 const DnsConfig* overridden_config = client_ptr->GetEffectiveConfig();
7018 ASSERT_TRUE(overridden_config);
Eric Orthc1eb1292018-10-09 22:07:077019 EXPECT_EQ(nameservers, overridden_config->nameservers);
7020 EXPECT_EQ(new_config.attempts, overridden_config->attempts);
7021}
7022
Eric Orth960e7062019-03-08 18:43:547023TEST_F(HostResolverManagerDnsTest, SetDnsConfigOverrides_ClearOverrides) {
Eric Orth394db1732019-08-27 20:09:397024 // Use a real DnsClient to test config-handling behavior.
7025 AlwaysFailSocketFactory socket_factory;
7026 auto client = DnsClient::CreateClientForTesting(
7027 nullptr /* net_log */, &socket_factory, base::Bind(&base::RandInt));
7028 DnsClient* client_ptr = client.get();
7029 resolver_->SetDnsClientForTesting(std::move(client));
7030
Eric Orthc1eb1292018-10-09 22:07:077031 DnsConfig original_config = CreateValidDnsConfig();
7032 ChangeDnsConfig(original_config);
7033
7034 DnsConfigOverrides overrides;
7035 overrides.attempts = 245;
7036 resolver_->SetDnsConfigOverrides(overrides);
7037
Eric Orth394db1732019-08-27 20:09:397038 ASSERT_THAT(client_ptr->GetEffectiveConfig(),
7039 testing::Not(testing::Pointee(original_config)));
Eric Orthc1eb1292018-10-09 22:07:077040
7041 resolver_->SetDnsConfigOverrides(DnsConfigOverrides());
Eric Orth394db1732019-08-27 20:09:397042 EXPECT_THAT(client_ptr->GetEffectiveConfig(),
7043 testing::Pointee(original_config));
Eric Orthc1eb1292018-10-09 22:07:077044}
dalykf93a48e372019-09-04 02:57:597045
Eric Ortha3559ca2019-09-05 23:40:547046TEST_F(HostResolverManagerDnsTest, SetDnsConfigOverrides_NoChange) {
7047 test::ScopedMockNetworkChangeNotifier mock_network_change_notifier;
7048 TestDnsObserver config_observer;
7049 NetworkChangeNotifier::AddDNSObserver(&config_observer);
7050
7051 // Use a real DnsClient to test config-handling behavior.
7052 AlwaysFailSocketFactory socket_factory;
7053 auto client = DnsClient::CreateClientForTesting(
7054 nullptr /* net_log */, &socket_factory, base::Bind(&base::RandInt));
7055 DnsClient* client_ptr = client.get();
7056 resolver_->SetDnsClientForTesting(std::move(client));
7057
7058 DnsConfig original_config = CreateValidDnsConfig();
7059 ChangeDnsConfig(original_config);
7060
7061 // Confirm pre-override state.
7062 ASSERT_EQ(original_config, *client_ptr->GetEffectiveConfig());
7063
7064 DnsConfigOverrides overrides;
7065 overrides.nameservers = original_config.nameservers;
7066
7067 EXPECT_EQ(0, config_observer.dns_changed_calls());
7068
7069 resolver_->SetDnsConfigOverrides(overrides);
7070 EXPECT_THAT(client_ptr->GetEffectiveConfig(),
7071 testing::Pointee(original_config));
7072
7073 base::RunLoop().RunUntilIdle(); // Notifications are async.
7074 EXPECT_EQ(0,
7075 config_observer.dns_changed_calls()); // No expected notification
7076
7077 NetworkChangeNotifier::RemoveDNSObserver(&config_observer);
7078}
7079
7080// No effect or notifications expected using partial overrides without a base
7081// system config.
7082TEST_F(HostResolverManagerDnsTest, NoBaseConfig_PartialOverrides) {
7083 test::ScopedMockNetworkChangeNotifier mock_network_change_notifier;
7084 TestDnsObserver config_observer;
7085 NetworkChangeNotifier::AddDNSObserver(&config_observer);
7086
7087 // Use a real DnsClient to test config-handling behavior.
7088 AlwaysFailSocketFactory socket_factory;
7089 auto client = DnsClient::CreateClientForTesting(
7090 nullptr /* net_log */, &socket_factory, base::Bind(&base::RandInt));
7091 DnsClient* client_ptr = client.get();
7092 resolver_->SetDnsClientForTesting(std::move(client));
7093
7094 client_ptr->SetSystemConfig(base::nullopt);
7095
7096 DnsConfigOverrides overrides;
7097 overrides.nameservers.emplace({CreateExpected("192.168.0.3", 193)});
7098 resolver_->SetDnsConfigOverrides(overrides);
7099 base::RunLoop().RunUntilIdle(); // Potential notifications are async.
7100
7101 EXPECT_FALSE(client_ptr->GetEffectiveConfig());
7102 EXPECT_EQ(0, config_observer.dns_changed_calls());
7103
7104 NetworkChangeNotifier::RemoveDNSObserver(&config_observer);
7105}
7106
7107TEST_F(HostResolverManagerDnsTest, NoBaseConfig_OverridesEverything) {
7108 test::ScopedMockNetworkChangeNotifier mock_network_change_notifier;
7109 TestDnsObserver config_observer;
7110 NetworkChangeNotifier::AddDNSObserver(&config_observer);
7111
7112 // Use a real DnsClient to test config-handling behavior.
7113 AlwaysFailSocketFactory socket_factory;
7114 auto client = DnsClient::CreateClientForTesting(
7115 nullptr /* net_log */, &socket_factory, base::Bind(&base::RandInt));
7116 DnsClient* client_ptr = client.get();
7117 resolver_->SetDnsClientForTesting(std::move(client));
7118
7119 client_ptr->SetSystemConfig(base::nullopt);
7120
7121 DnsConfigOverrides overrides =
7122 DnsConfigOverrides::CreateOverridingEverythingWithDefaults();
7123 const std::vector<IPEndPoint> nameservers = {
7124 CreateExpected("192.168.0.4", 194)};
7125 overrides.nameservers = nameservers;
7126 resolver_->SetDnsConfigOverrides(overrides);
7127 base::RunLoop().RunUntilIdle(); // Notifications are async.
7128
7129 DnsConfig expected;
7130 expected.nameservers = nameservers;
7131
7132 EXPECT_THAT(client_ptr->GetEffectiveConfig(), testing::Pointee(expected));
7133 EXPECT_EQ(1, config_observer.dns_changed_calls());
7134
7135 NetworkChangeNotifier::RemoveDNSObserver(&config_observer);
7136}
7137
dalykf93a48e372019-09-04 02:57:597138TEST_F(HostResolverManagerDnsTest, DohMapping) {
7139 // Use a real DnsClient to test config-handling behavior.
7140 AlwaysFailSocketFactory socket_factory;
7141 auto client = DnsClient::CreateClientForTesting(
7142 nullptr /* net_log */, &socket_factory, base::Bind(&base::RandInt));
7143 DnsClient* client_ptr = client.get();
7144 resolver_->SetDnsClientForTesting(std::move(client));
7145
7146 // Create a DnsConfig containing IP addresses associated with Cloudflare,
7147 // SafeBrowsing family filter, SafeBrowsing security filter, and other IPs
7148 // not associated with hardcoded DoH services.
7149 DnsConfig original_config = CreateUpgradableDnsConfig();
7150 ChangeDnsConfig(original_config);
7151
7152 const DnsConfig* fetched_config = client_ptr->GetEffectiveConfig();
7153 EXPECT_EQ(original_config.nameservers, fetched_config->nameservers);
7154 std::vector<DnsConfig::DnsOverHttpsServerConfig> expected_doh_servers = {
7155 {"https://chrome.cloudflare-dns.com/dns-query", true /* use-post */},
7156 {"https://doh.cleanbrowsing.org/doh/family-filter{?dns}",
7157 false /* use_post */},
7158 {"https://doh.cleanbrowsing.org/doh/security-filter{?dns}",
7159 false /* use_post */}};
7160 EXPECT_EQ(expected_doh_servers, fetched_config->dns_over_https_servers);
7161}
7162
7163TEST_F(HostResolverManagerDnsTest, DohMappingDisabled) {
7164 // Use a real DnsClient to test config-handling behavior.
7165 AlwaysFailSocketFactory socket_factory;
7166 auto client = DnsClient::CreateClientForTesting(
7167 nullptr /* net_log */, &socket_factory, base::Bind(&base::RandInt));
7168 DnsClient* client_ptr = client.get();
7169 resolver_->SetDnsClientForTesting(std::move(client));
7170
7171 // Create a DnsConfig containing IP addresses associated with Cloudflare,
7172 // SafeBrowsing family filter, SafeBrowsing security filter, and other IPs
7173 // not associated with hardcoded DoH services.
7174 DnsConfig original_config = CreateUpgradableDnsConfig();
7175 original_config.allow_dns_over_https_upgrade = false;
7176 ChangeDnsConfig(original_config);
7177
7178 const DnsConfig* fetched_config = client_ptr->GetEffectiveConfig();
7179 EXPECT_EQ(original_config.nameservers, fetched_config->nameservers);
7180 std::vector<DnsConfig::DnsOverHttpsServerConfig> expected_doh_servers = {};
7181 EXPECT_EQ(expected_doh_servers, fetched_config->dns_over_https_servers);
7182}
7183
7184TEST_F(HostResolverManagerDnsTest, DohMappingModeIneligibleForUpgrade) {
7185 // Use a real DnsClient to test config-handling behavior.
7186 AlwaysFailSocketFactory socket_factory;
7187 auto client = DnsClient::CreateClientForTesting(
7188 nullptr /* net_log */, &socket_factory, base::Bind(&base::RandInt));
7189 DnsClient* client_ptr = client.get();
7190 resolver_->SetDnsClientForTesting(std::move(client));
7191
7192 // Create a DnsConfig containing IP addresses associated with Cloudflare,
7193 // SafeBrowsing family filter, SafeBrowsing security filter, and other IPs
7194 // not associated with hardcoded DoH services.
7195 DnsConfig original_config = CreateUpgradableDnsConfig();
7196 original_config.secure_dns_mode = DnsConfig::SecureDnsMode::SECURE;
7197 ChangeDnsConfig(original_config);
7198
7199 const DnsConfig* fetched_config = client_ptr->GetEffectiveConfig();
7200 EXPECT_EQ(original_config.nameservers, fetched_config->nameservers);
7201 std::vector<DnsConfig::DnsOverHttpsServerConfig> expected_doh_servers = {};
7202 EXPECT_EQ(expected_doh_servers, fetched_config->dns_over_https_servers);
7203}
7204
7205TEST_F(HostResolverManagerDnsTest, DohMappingWithExclusion) {
7206 // Use a real DnsClient to test config-handling behavior.
7207 AlwaysFailSocketFactory socket_factory;
7208 auto client = DnsClient::CreateClientForTesting(
7209 nullptr /* net_log */, &socket_factory, base::Bind(&base::RandInt));
7210 DnsClient* client_ptr = client.get();
7211 resolver_->SetDnsClientForTesting(std::move(client));
7212
7213 // Create a DnsConfig containing IP addresses associated with Cloudflare,
7214 // SafeBrowsing family filter, SafeBrowsing security filter, and other IPs
7215 // not associated with hardcoded DoH services.
7216 DnsConfig original_config = CreateUpgradableDnsConfig();
7217 original_config.disabled_upgrade_providers = {"CleanBrowsingSecure",
7218 "Cloudflare", "Unexpected"};
7219 ChangeDnsConfig(original_config);
7220
7221 // A DoH upgrade should be attempted on the DNS servers in the config, but
7222 // only for permitted providers.
7223 const DnsConfig* fetched_config = client_ptr->GetEffectiveConfig();
7224 EXPECT_EQ(original_config.nameservers, fetched_config->nameservers);
7225 std::vector<DnsConfig::DnsOverHttpsServerConfig> expected_doh_servers = {
7226 {"https://doh.cleanbrowsing.org/doh/family-filter{?dns}",
7227 false /* use_post */}};
7228 EXPECT_EQ(expected_doh_servers, fetched_config->dns_over_https_servers);
7229}
7230
7231TEST_F(HostResolverManagerDnsTest, DohMappingIgnoredIfTemplateSpecified) {
7232 // Use a real DnsClient to test config-handling behavior.
7233 AlwaysFailSocketFactory socket_factory;
7234 auto client = DnsClient::CreateClientForTesting(
7235 nullptr /* net_log */, &socket_factory, base::Bind(&base::RandInt));
7236 DnsClient* client_ptr = client.get();
7237 resolver_->SetDnsClientForTesting(std::move(client));
7238
7239 // Create a DnsConfig containing IP addresses associated with Cloudflare,
7240 // SafeBrowsing family filter, SafeBrowsing security filter, and other IPs
7241 // not associated with hardcoded DoH services.
7242 DnsConfig original_config = CreateUpgradableDnsConfig();
7243 ChangeDnsConfig(original_config);
7244
7245 // If the overrides contains DoH servers, no DoH upgrade should be attempted.
7246 DnsConfigOverrides overrides;
7247 const std::vector<DnsConfig::DnsOverHttpsServerConfig>
7248 dns_over_https_servers_overrides = {
7249 DnsConfig::DnsOverHttpsServerConfig("doh.server.override.com", true)};
7250 overrides.dns_over_https_servers = dns_over_https_servers_overrides;
7251 resolver_->SetDnsConfigOverrides(overrides);
7252 const DnsConfig* fetched_config = client_ptr->GetEffectiveConfig();
7253 EXPECT_EQ(original_config.nameservers, fetched_config->nameservers);
7254 EXPECT_EQ(dns_over_https_servers_overrides,
7255 fetched_config->dns_over_https_servers);
7256}
7257
7258TEST_F(HostResolverManagerDnsTest, DohMappingWithAutomaticDot) {
7259 // Use a real DnsClient to test config-handling behavior.
7260 AlwaysFailSocketFactory socket_factory;
7261 auto client = DnsClient::CreateClientForTesting(
7262 nullptr /* net_log */, &socket_factory, base::Bind(&base::RandInt));
7263 DnsClient* client_ptr = client.get();
7264 resolver_->SetDnsClientForTesting(std::move(client));
7265
7266 // Create a DnsConfig containing IP addresses associated with Cloudflare,
7267 // SafeBrowsing family filter, SafeBrowsing security filter, and other IPs
7268 // not associated with hardcoded DoH services.
7269 DnsConfig original_config = CreateUpgradableDnsConfig();
7270 original_config.dns_over_tls_active = true;
7271 ChangeDnsConfig(original_config);
7272
7273 const DnsConfig* fetched_config = client_ptr->GetEffectiveConfig();
7274 EXPECT_EQ(original_config.nameservers, fetched_config->nameservers);
7275 std::vector<DnsConfig::DnsOverHttpsServerConfig> expected_doh_servers = {
7276 {"https://chrome.cloudflare-dns.com/dns-query", true /* use-post */},
7277 {"https://doh.cleanbrowsing.org/doh/family-filter{?dns}",
7278 false /* use_post */},
7279 {"https://doh.cleanbrowsing.org/doh/security-filter{?dns}",
7280 false /* use_post */}};
7281 EXPECT_EQ(expected_doh_servers, fetched_config->dns_over_https_servers);
7282}
7283
7284TEST_F(HostResolverManagerDnsTest, DohMappingWithStrictDot) {
7285 // Use a real DnsClient to test config-handling behavior.
7286 AlwaysFailSocketFactory socket_factory;
7287 auto client = DnsClient::CreateClientForTesting(
7288 nullptr /* net_log */, &socket_factory, base::Bind(&base::RandInt));
7289 DnsClient* client_ptr = client.get();
7290 resolver_->SetDnsClientForTesting(std::move(client));
7291
7292 // Create a DnsConfig containing IP addresses associated with Cloudflare,
7293 // SafeBrowsing family filter, SafeBrowsing security filter, and other IPs
7294 // not associated with hardcoded DoH services.
7295 DnsConfig original_config = CreateUpgradableDnsConfig();
7296 original_config.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
7297 original_config.dns_over_tls_active = true;
7298
7299 // Google DoT hostname
7300 original_config.dns_over_tls_hostname = "dns.google";
7301 ChangeDnsConfig(original_config);
7302 const DnsConfig* fetched_config = client_ptr->GetEffectiveConfig();
7303 EXPECT_EQ(original_config.nameservers, fetched_config->nameservers);
7304 std::vector<DnsConfig::DnsOverHttpsServerConfig> expected_doh_servers = {
7305 {"https://dns.google/dns-query{?dns}", false /* use_post */}};
7306 EXPECT_EQ(expected_doh_servers, fetched_config->dns_over_https_servers);
7307}
7308
Eric Orth394db1732019-08-27 20:09:397309#endif // !defined(OS_IOS)
Eric Orthc1eb1292018-10-09 22:07:077310
Eric Orth37b18192019-04-22 19:09:287311TEST_F(HostResolverManagerDnsTest, FlushCacheOnDnsConfigOverridesChange) {
7312 ChangeDnsConfig(CreateValidDnsConfig());
7313
7314 HostResolver::ResolveHostParameters local_source_parameters;
7315 local_source_parameters.source = HostResolverSource::LOCAL_ONLY;
7316
7317 // Populate cache.
7318 ResolveHostResponseHelper initial_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557319 HostPortPair("ok", 70), NetworkIsolationKey(), NetLogWithSource(),
7320 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orth37b18192019-04-22 19:09:287321 EXPECT_THAT(initial_response.result_error(), IsOk());
7322
7323 // Confirm result now cached.
7324 ResolveHostResponseHelper cached_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557325 HostPortPair("ok", 75), NetworkIsolationKey(), NetLogWithSource(),
7326 local_source_parameters, request_context_.get(), host_cache_.get()));
Eric Orth37b18192019-04-22 19:09:287327 ASSERT_THAT(cached_response.result_error(), IsOk());
7328 ASSERT_TRUE(cached_response.request()->GetStaleInfo());
7329
7330 // Flush cache by triggering a DnsConfigOverrides change.
7331 DnsConfigOverrides overrides;
7332 overrides.attempts = 4;
7333 resolver_->SetDnsConfigOverrides(overrides);
7334
7335 // Expect no longer cached
7336 ResolveHostResponseHelper flushed_response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557337 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
7338 local_source_parameters, request_context_.get(), host_cache_.get()));
Eric Orth37b18192019-04-22 19:09:287339 EXPECT_THAT(flushed_response.result_error(), IsError(ERR_DNS_CACHE_MISS));
7340}
7341
Eric Orthc823a23d2018-10-30 22:12:487342// Test that even when using config overrides, a change to the base system
7343// config cancels pending requests.
Eric Orth960e7062019-03-08 18:43:547344TEST_F(HostResolverManagerDnsTest, CancellationOnBaseConfigChange) {
Eric Orthc823a23d2018-10-30 22:12:487345 DnsConfig original_config = CreateValidDnsConfig();
7346 ChangeDnsConfig(original_config);
7347
7348 DnsConfigOverrides overrides;
7349 overrides.nameservers.emplace({CreateExpected("123.123.123.123", 80)});
7350 ASSERT_FALSE(overrides.OverridesEverything());
7351 resolver_->SetDnsConfigOverrides(overrides);
7352
Eric Orth117e1992019-04-17 00:24:157353 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557354 HostPortPair("4slow_ok", 80), NetworkIsolationKey(), NetLogWithSource(),
7355 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orthc823a23d2018-10-30 22:12:487356 ASSERT_FALSE(response.complete());
7357
7358 DnsConfig new_config = original_config;
7359 new_config.attempts = 103;
7360 ChangeDnsConfig(new_config);
7361
7362 EXPECT_THAT(response.result_error(), IsError(ERR_NETWORK_CHANGED));
7363}
7364
7365// Test that when all configuration is overridden, system configuration changes
7366// do not cancel requests.
Eric Orth960e7062019-03-08 18:43:547367TEST_F(HostResolverManagerDnsTest,
Eric Orthc823a23d2018-10-30 22:12:487368 CancellationOnBaseConfigChange_OverridesEverything) {
7369 DnsConfig original_config = CreateValidDnsConfig();
7370 ChangeDnsConfig(original_config);
7371
7372 DnsConfigOverrides overrides =
7373 DnsConfigOverrides::CreateOverridingEverythingWithDefaults();
7374 overrides.nameservers.emplace({CreateExpected("123.123.123.123", 80)});
7375 ASSERT_TRUE(overrides.OverridesEverything());
7376 resolver_->SetDnsConfigOverrides(overrides);
7377
Eric Orth117e1992019-04-17 00:24:157378 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557379 HostPortPair("4slow_ok", 80), NetworkIsolationKey(), NetLogWithSource(),
7380 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orthc823a23d2018-10-30 22:12:487381 ASSERT_FALSE(response.complete());
7382
7383 DnsConfig new_config = original_config;
7384 new_config.attempts = 103;
7385 ChangeDnsConfig(new_config);
7386
7387 dns_client_->CompleteDelayedTransactions();
7388 EXPECT_THAT(response.result_error(), IsOk());
7389}
7390
Eric Orthc1eb1292018-10-09 22:07:077391// Test that in-progress queries are cancelled on applying new DNS config
7392// overrides, same as receiving a new DnsConfig from the system.
Eric Orth960e7062019-03-08 18:43:547393TEST_F(HostResolverManagerDnsTest, CancelQueriesOnSettingOverrides) {
Eric Orthc1eb1292018-10-09 22:07:077394 ChangeDnsConfig(CreateValidDnsConfig());
Eric Orth117e1992019-04-17 00:24:157395 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557396 HostPortPair("4slow_ok", 80), NetworkIsolationKey(), NetLogWithSource(),
7397 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orthc1eb1292018-10-09 22:07:077398 ASSERT_FALSE(response.complete());
7399
7400 DnsConfigOverrides overrides;
7401 overrides.attempts = 123;
7402 resolver_->SetDnsConfigOverrides(overrides);
7403
7404 EXPECT_THAT(response.result_error(), IsError(ERR_NETWORK_CHANGED));
7405}
7406
7407// Queries should not be cancelled if equal overrides are set.
Eric Orth960e7062019-03-08 18:43:547408TEST_F(HostResolverManagerDnsTest,
7409 CancelQueriesOnSettingOverrides_SameOverrides) {
Eric Orthc1eb1292018-10-09 22:07:077410 ChangeDnsConfig(CreateValidDnsConfig());
7411 DnsConfigOverrides overrides;
7412 overrides.attempts = 123;
7413 resolver_->SetDnsConfigOverrides(overrides);
7414
Eric Orth117e1992019-04-17 00:24:157415 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557416 HostPortPair("4slow_ok", 80), NetworkIsolationKey(), NetLogWithSource(),
7417 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orthc1eb1292018-10-09 22:07:077418 ASSERT_FALSE(response.complete());
7419
7420 resolver_->SetDnsConfigOverrides(overrides);
7421
Eric Orthc823a23d2018-10-30 22:12:487422 dns_client_->CompleteDelayedTransactions();
Eric Orthc1eb1292018-10-09 22:07:077423 EXPECT_THAT(response.result_error(), IsOk());
7424}
7425
7426// Test that in-progress queries are cancelled on clearing DNS config overrides,
7427// same as receiving a new DnsConfig from the system.
Eric Orth960e7062019-03-08 18:43:547428TEST_F(HostResolverManagerDnsTest, CancelQueriesOnClearingOverrides) {
Eric Orthc1eb1292018-10-09 22:07:077429 ChangeDnsConfig(CreateValidDnsConfig());
7430 DnsConfigOverrides overrides;
7431 overrides.attempts = 123;
7432 resolver_->SetDnsConfigOverrides(overrides);
7433
Eric Orth117e1992019-04-17 00:24:157434 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557435 HostPortPair("4slow_ok", 80), NetworkIsolationKey(), NetLogWithSource(),
7436 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orthc1eb1292018-10-09 22:07:077437 ASSERT_FALSE(response.complete());
7438
7439 resolver_->SetDnsConfigOverrides(DnsConfigOverrides());
7440
7441 EXPECT_THAT(response.result_error(), IsError(ERR_NETWORK_CHANGED));
7442}
7443
7444// Queries should not be cancelled on clearing overrides if there were not any
7445// overrides.
Eric Orth960e7062019-03-08 18:43:547446TEST_F(HostResolverManagerDnsTest,
7447 CancelQueriesOnClearingOverrides_NoOverrides) {
Eric Orthc1eb1292018-10-09 22:07:077448 ChangeDnsConfig(CreateValidDnsConfig());
Eric Orth117e1992019-04-17 00:24:157449 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557450 HostPortPair("4slow_ok", 80), NetworkIsolationKey(), NetLogWithSource(),
7451 base::nullopt, request_context_.get(), host_cache_.get()));
Eric Orthc1eb1292018-10-09 22:07:077452 ASSERT_FALSE(response.complete());
7453
7454 resolver_->SetDnsConfigOverrides(DnsConfigOverrides());
7455
Eric Orthc823a23d2018-10-30 22:12:487456 dns_client_->CompleteDelayedTransactions();
Eric Orthc1eb1292018-10-09 22:07:077457 EXPECT_THAT(response.result_error(), IsOk());
7458}
7459
Eric Orth960e7062019-03-08 18:43:547460TEST_F(HostResolverManagerDnsTest, TxtQuery) {
Eric Orth828bd3ae2018-12-12 17:30:367461 // Simulate two separate DNS records, each with multiple strings.
7462 std::vector<std::string> foo_records = {"foo1", "foo2", "foo3"};
7463 std::vector<std::string> bar_records = {"bar1", "bar2"};
7464 std::vector<std::vector<std::string>> text_records = {foo_records,
7465 bar_records};
7466
7467 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137468 rules.emplace_back("host", dns_protocol::kTypeTXT, false /* secure */,
dalykc0ab0722019-03-14 17:00:587469 MockDnsClientRule::Result(BuildTestDnsTextResponse(
7470 "host", std::move(text_records))),
Eric Orth828bd3ae2018-12-12 17:30:367471 false /* delay */);
7472
7473 CreateResolver();
7474 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7475
7476 HostResolver::ResolveHostParameters parameters;
7477 parameters.dns_query_type = DnsQueryType::TXT;
7478
Eric Orth117e1992019-04-17 00:24:157479 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557480 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
7481 parameters, request_context_.get(), host_cache_.get()));
Eric Orth828bd3ae2018-12-12 17:30:367482 EXPECT_THAT(response.result_error(), IsOk());
7483 EXPECT_FALSE(response.request()->GetAddressResults());
7484 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:407485 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Orth828bd3ae2018-12-12 17:30:367486
7487 // Order between separate DNS records is undefined, but each record should
7488 // stay in order as that order may be meaningful.
7489 ASSERT_THAT(response.request()->GetTextResults(),
7490 testing::Optional(testing::UnorderedElementsAre(
7491 "foo1", "foo2", "foo3", "bar1", "bar2")));
7492 std::vector<std::string> results =
7493 response.request()->GetTextResults().value();
7494 EXPECT_NE(results.end(), std::search(results.begin(), results.end(),
7495 foo_records.begin(), foo_records.end()));
7496 EXPECT_NE(results.end(), std::search(results.begin(), results.end(),
7497 bar_records.begin(), bar_records.end()));
7498}
7499
dalykc27699a2019-07-29 20:53:297500TEST_F(HostResolverManagerDnsTest, TxtQuery_InvalidConfig) {
7501 set_allow_fallback_to_proctask(false);
7502 // Set empty DnsConfig.
Eric Orthfe6d5482019-09-03 18:27:577503 InvalidateDnsConfig();
dalykc27699a2019-07-29 20:53:297504
7505 HostResolver::ResolveHostParameters parameters;
7506 parameters.dns_query_type = DnsQueryType::TXT;
7507
7508 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557509 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
7510 parameters, request_context_.get(), host_cache_.get()));
dalykc27699a2019-07-29 20:53:297511 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_CACHE_MISS));
7512}
7513
Eric Orth960e7062019-03-08 18:43:547514TEST_F(HostResolverManagerDnsTest, TxtQuery_NonexistentDomain) {
Eric Orth828bd3ae2018-12-12 17:30:367515 // Setup fallback to confirm it is not used for non-address results.
7516 set_allow_fallback_to_proctask(true);
7517 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
7518 proc_->SignalMultiple(1u);
7519
7520 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137521 rules.emplace_back("host", dns_protocol::kTypeTXT, false /* secure */,
Eric Orth828bd3ae2018-12-12 17:30:367522 MockDnsClientRule::Result(MockDnsClientRule::NODOMAIN),
7523 false /* delay */);
7524
7525 CreateResolver();
7526 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7527
7528 HostResolver::ResolveHostParameters parameters;
7529 parameters.dns_query_type = DnsQueryType::TXT;
7530
Eric Orth117e1992019-04-17 00:24:157531 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557532 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
7533 parameters, request_context_.get(), host_cache_.get()));
Eric Orth828bd3ae2018-12-12 17:30:367534 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
7535 EXPECT_FALSE(response.request()->GetAddressResults());
7536 EXPECT_FALSE(response.request()->GetTextResults());
7537 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:407538 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Orth828bd3ae2018-12-12 17:30:367539}
7540
Eric Orth960e7062019-03-08 18:43:547541TEST_F(HostResolverManagerDnsTest, TxtQuery_Failure) {
Eric Orth828bd3ae2018-12-12 17:30:367542 // Setup fallback to confirm it is not used for non-address results.
7543 set_allow_fallback_to_proctask(true);
7544 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
7545 proc_->SignalMultiple(1u);
7546
7547 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137548 rules.emplace_back("host", dns_protocol::kTypeTXT, false /* secure */,
7549 MockDnsClientRule::Result(MockDnsClientRule::FAIL),
7550 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:367551
7552 CreateResolver();
7553 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7554
7555 HostResolver::ResolveHostParameters parameters;
7556 parameters.dns_query_type = DnsQueryType::TXT;
7557
Eric Orth117e1992019-04-17 00:24:157558 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557559 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
7560 parameters, request_context_.get(), host_cache_.get()));
Eric Orth828bd3ae2018-12-12 17:30:367561 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
7562 EXPECT_FALSE(response.request()->GetAddressResults());
7563 EXPECT_FALSE(response.request()->GetTextResults());
7564 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:407565 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Orth828bd3ae2018-12-12 17:30:367566}
7567
Eric Orth960e7062019-03-08 18:43:547568TEST_F(HostResolverManagerDnsTest, TxtQuery_Timeout) {
Eric Orth828bd3ae2018-12-12 17:30:367569 // Setup fallback to confirm it is not used for non-address results.
7570 set_allow_fallback_to_proctask(true);
7571 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
7572 proc_->SignalMultiple(1u);
7573
7574 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137575 rules.emplace_back("host", dns_protocol::kTypeTXT, false /* secure */,
7576 MockDnsClientRule::Result(MockDnsClientRule::TIMEOUT),
7577 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:367578
7579 CreateResolver();
7580 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7581
7582 HostResolver::ResolveHostParameters parameters;
7583 parameters.dns_query_type = DnsQueryType::TXT;
7584
Eric Orth117e1992019-04-17 00:24:157585 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557586 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
7587 parameters, request_context_.get(), host_cache_.get()));
Eric Orth828bd3ae2018-12-12 17:30:367588 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_TIMED_OUT));
7589 EXPECT_FALSE(response.request()->GetAddressResults());
7590 EXPECT_FALSE(response.request()->GetTextResults());
7591 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:407592 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Orth828bd3ae2018-12-12 17:30:367593}
7594
Eric Orth960e7062019-03-08 18:43:547595TEST_F(HostResolverManagerDnsTest, TxtQuery_Empty) {
Eric Orth828bd3ae2018-12-12 17:30:367596 // Setup fallback to confirm it is not used for non-address results.
7597 set_allow_fallback_to_proctask(true);
7598 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
7599 proc_->SignalMultiple(1u);
7600
7601 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137602 rules.emplace_back("host", dns_protocol::kTypeTXT, false /* secure */,
7603 MockDnsClientRule::Result(MockDnsClientRule::EMPTY),
7604 false /* delay */);
Eric Orth828bd3ae2018-12-12 17:30:367605
7606 CreateResolver();
7607 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7608
7609 HostResolver::ResolveHostParameters parameters;
7610 parameters.dns_query_type = DnsQueryType::TXT;
7611
Eric Orth117e1992019-04-17 00:24:157612 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557613 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
7614 parameters, request_context_.get(), host_cache_.get()));
Eric Orth828bd3ae2018-12-12 17:30:367615 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
7616 EXPECT_FALSE(response.request()->GetAddressResults());
7617 EXPECT_FALSE(response.request()->GetTextResults());
7618 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:407619 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Orth828bd3ae2018-12-12 17:30:367620}
7621
Eric Orth960e7062019-03-08 18:43:547622TEST_F(HostResolverManagerDnsTest, TxtQuery_Malformed) {
Eric Orth828bd3ae2018-12-12 17:30:367623 // Setup fallback to confirm it is not used for non-address results.
7624 set_allow_fallback_to_proctask(true);
7625 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
7626 proc_->SignalMultiple(1u);
7627
7628 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137629 rules.emplace_back("host", dns_protocol::kTypeTXT, false /* secure */,
Eric Orth828bd3ae2018-12-12 17:30:367630 MockDnsClientRule::Result(MockDnsClientRule::MALFORMED),
7631 false /* delay */);
7632
7633 CreateResolver();
7634 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7635
7636 HostResolver::ResolveHostParameters parameters;
7637 parameters.dns_query_type = DnsQueryType::TXT;
7638
Eric Orth117e1992019-04-17 00:24:157639 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557640 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
7641 parameters, request_context_.get(), host_cache_.get()));
Eric Orth828bd3ae2018-12-12 17:30:367642 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE));
7643 EXPECT_FALSE(response.request()->GetAddressResults());
7644 EXPECT_FALSE(response.request()->GetTextResults());
7645 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:407646 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Orth828bd3ae2018-12-12 17:30:367647}
7648
Eric Orth960e7062019-03-08 18:43:547649TEST_F(HostResolverManagerDnsTest, TxtQuery_MismatchedName) {
Eric Orth828bd3ae2018-12-12 17:30:367650 std::vector<std::vector<std::string>> text_records = {{"text"}};
7651 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137652 rules.emplace_back("host", dns_protocol::kTypeTXT, false /* secure */,
dalykc0ab0722019-03-14 17:00:587653 MockDnsClientRule::Result(BuildTestDnsTextResponse(
Eric Orth828bd3ae2018-12-12 17:30:367654 "host", std::move(text_records), "not.host")),
7655 false /* delay */);
7656
7657 CreateResolver();
7658 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7659
7660 HostResolver::ResolveHostParameters parameters;
7661 parameters.dns_query_type = DnsQueryType::TXT;
7662
Eric Orth117e1992019-04-17 00:24:157663 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557664 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
7665 parameters, request_context_.get(), host_cache_.get()));
Eric Orth828bd3ae2018-12-12 17:30:367666 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE));
7667 EXPECT_FALSE(response.request()->GetAddressResults());
7668 EXPECT_FALSE(response.request()->GetTextResults());
7669 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:407670 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Orth828bd3ae2018-12-12 17:30:367671}
7672
Eric Orth960e7062019-03-08 18:43:547673TEST_F(HostResolverManagerDnsTest, TxtQuery_WrongType) {
Eric Orth828bd3ae2018-12-12 17:30:367674 // Respond to a TXT query with an A response.
7675 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137676 rules.emplace_back("host", dns_protocol::kTypeTXT, false /* secure */,
Eric Orth828bd3ae2018-12-12 17:30:367677 MockDnsClientRule::Result(
7678 BuildTestDnsResponse("host", IPAddress(1, 2, 3, 4))),
7679 false /* delay */);
7680
7681 CreateResolver();
7682 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7683
7684 HostResolver::ResolveHostParameters parameters;
7685 parameters.dns_query_type = DnsQueryType::TXT;
7686
7687 // Responses for the wrong type should be ignored.
Eric Orth117e1992019-04-17 00:24:157688 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557689 HostPortPair("ok", 108), NetworkIsolationKey(), NetLogWithSource(),
7690 parameters, request_context_.get(), host_cache_.get()));
Eric Orth828bd3ae2018-12-12 17:30:367691 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
7692 EXPECT_FALSE(response.request()->GetAddressResults());
7693 EXPECT_FALSE(response.request()->GetTextResults());
7694 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:407695 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Orth828bd3ae2018-12-12 17:30:367696}
7697
Eric Ortha625b042019-01-16 01:14:457698// Same as TxtQuery except we specify DNS HostResolverSource instead of relying
7699// on automatic determination. Expect same results since DNS should be what we
7700// automatically determine, but some slightly different logic paths are
7701// involved.
Eric Orth960e7062019-03-08 18:43:547702TEST_F(HostResolverManagerDnsTest, TxtDnsQuery) {
Eric Orth828bd3ae2018-12-12 17:30:367703 // Simulate two separate DNS records, each with multiple strings.
7704 std::vector<std::string> foo_records = {"foo1", "foo2", "foo3"};
7705 std::vector<std::string> bar_records = {"bar1", "bar2"};
7706 std::vector<std::vector<std::string>> text_records = {foo_records,
7707 bar_records};
7708
7709 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137710 rules.emplace_back("host", dns_protocol::kTypeTXT, false /* secure */,
dalykc0ab0722019-03-14 17:00:587711 MockDnsClientRule::Result(BuildTestDnsTextResponse(
7712 "host", std::move(text_records))),
Eric Orth828bd3ae2018-12-12 17:30:367713 false /* delay */);
7714
7715 CreateResolver();
7716 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7717
7718 HostResolver::ResolveHostParameters parameters;
7719 parameters.source = HostResolverSource::DNS;
7720 parameters.dns_query_type = DnsQueryType::TXT;
7721
Eric Orth117e1992019-04-17 00:24:157722 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557723 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
7724 parameters, request_context_.get(), host_cache_.get()));
Eric Orth828bd3ae2018-12-12 17:30:367725 EXPECT_THAT(response.result_error(), IsOk());
7726 EXPECT_FALSE(response.request()->GetAddressResults());
7727 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:407728 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Orth828bd3ae2018-12-12 17:30:367729
7730 // Order between separate DNS records is undefined, but each record should
7731 // stay in order as that order may be meaningful.
7732 ASSERT_THAT(response.request()->GetTextResults(),
7733 testing::Optional(testing::UnorderedElementsAre(
7734 "foo1", "foo2", "foo3", "bar1", "bar2")));
7735 std::vector<std::string> results =
7736 response.request()->GetTextResults().value();
7737 EXPECT_NE(results.end(), std::search(results.begin(), results.end(),
7738 foo_records.begin(), foo_records.end()));
7739 EXPECT_NE(results.end(), std::search(results.begin(), results.end(),
7740 bar_records.begin(), bar_records.end()));
7741}
7742
Eric Orth960e7062019-03-08 18:43:547743TEST_F(HostResolverManagerDnsTest, PtrQuery) {
Eric Orthe9db8d232019-01-14 21:24:457744 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137745 rules.emplace_back("host", dns_protocol::kTypePTR, false /* secure */,
Eric Orthe9db8d232019-01-14 21:24:457746 MockDnsClientRule::Result(BuildTestDnsPointerResponse(
7747 "host", {"foo.com", "bar.com"})),
7748 false /* delay */);
7749
7750 CreateResolver();
7751 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7752
7753 HostResolver::ResolveHostParameters parameters;
7754 parameters.dns_query_type = DnsQueryType::PTR;
7755
Eric Orth117e1992019-04-17 00:24:157756 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557757 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
7758 parameters, request_context_.get(), host_cache_.get()));
Eric Orthe9db8d232019-01-14 21:24:457759 EXPECT_THAT(response.result_error(), IsOk());
7760 EXPECT_FALSE(response.request()->GetAddressResults());
7761 EXPECT_FALSE(response.request()->GetTextResults());
David Van Clevec719c882019-11-04 15:47:407762 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Orthe9db8d232019-01-14 21:24:457763
7764 // Order between separate records is undefined.
7765 EXPECT_THAT(response.request()->GetHostnameResults(),
7766 testing::Optional(testing::UnorderedElementsAre(
7767 HostPortPair("foo.com", 108), HostPortPair("bar.com", 108))));
7768}
7769
Eric Orth960e7062019-03-08 18:43:547770TEST_F(HostResolverManagerDnsTest, PtrQuery_Ip) {
Eric Orthe9db8d232019-01-14 21:24:457771 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137772 rules.emplace_back("8.8.8.8", dns_protocol::kTypePTR, false /* secure */,
Eric Orthe9db8d232019-01-14 21:24:457773 MockDnsClientRule::Result(BuildTestDnsPointerResponse(
7774 "8.8.8.8", {"foo.com", "bar.com"})),
7775 false /* delay */);
7776
7777 CreateResolver();
7778 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7779
7780 HostResolver::ResolveHostParameters parameters;
7781 parameters.dns_query_type = DnsQueryType::PTR;
7782
Eric Orth117e1992019-04-17 00:24:157783 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557784 HostPortPair("8.8.8.8", 108), NetworkIsolationKey(), NetLogWithSource(),
7785 parameters, request_context_.get(), host_cache_.get()));
Eric Orthe9db8d232019-01-14 21:24:457786 EXPECT_THAT(response.result_error(), IsOk());
7787 EXPECT_FALSE(response.request()->GetAddressResults());
7788 EXPECT_FALSE(response.request()->GetTextResults());
David Van Clevec719c882019-11-04 15:47:407789 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Orthe9db8d232019-01-14 21:24:457790
7791 // Order between separate records is undefined.
7792 EXPECT_THAT(response.request()->GetHostnameResults(),
7793 testing::Optional(testing::UnorderedElementsAre(
7794 HostPortPair("foo.com", 108), HostPortPair("bar.com", 108))));
7795}
7796
Eric Orth960e7062019-03-08 18:43:547797TEST_F(HostResolverManagerDnsTest, PtrQuery_NonexistentDomain) {
Eric Orthe9db8d232019-01-14 21:24:457798 // Setup fallback to confirm it is not used for non-address results.
7799 set_allow_fallback_to_proctask(true);
7800 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
7801 proc_->SignalMultiple(1u);
7802
7803 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137804 rules.emplace_back("host", dns_protocol::kTypePTR, false /* secure */,
Eric Orthe9db8d232019-01-14 21:24:457805 MockDnsClientRule::Result(MockDnsClientRule::NODOMAIN),
7806 false /* delay */);
7807
7808 CreateResolver();
7809 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7810
7811 HostResolver::ResolveHostParameters parameters;
7812 parameters.dns_query_type = DnsQueryType::PTR;
7813
Eric Orth117e1992019-04-17 00:24:157814 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557815 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
7816 parameters, request_context_.get(), host_cache_.get()));
Eric Orthe9db8d232019-01-14 21:24:457817 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
7818 EXPECT_FALSE(response.request()->GetAddressResults());
7819 EXPECT_FALSE(response.request()->GetTextResults());
7820 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:407821 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Orthe9db8d232019-01-14 21:24:457822}
7823
Eric Orth960e7062019-03-08 18:43:547824TEST_F(HostResolverManagerDnsTest, PtrQuery_Failure) {
Eric Orthe9db8d232019-01-14 21:24:457825 // Setup fallback to confirm it is not used for non-address results.
7826 set_allow_fallback_to_proctask(true);
7827 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
7828 proc_->SignalMultiple(1u);
7829
7830 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137831 rules.emplace_back("host", dns_protocol::kTypePTR, false /* secure */,
7832 MockDnsClientRule::Result(MockDnsClientRule::FAIL),
7833 false /* delay */);
Eric Orthe9db8d232019-01-14 21:24:457834
7835 CreateResolver();
7836 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7837
7838 HostResolver::ResolveHostParameters parameters;
7839 parameters.dns_query_type = DnsQueryType::PTR;
7840
Eric Orth117e1992019-04-17 00:24:157841 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557842 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
7843 parameters, request_context_.get(), host_cache_.get()));
Eric Orthe9db8d232019-01-14 21:24:457844 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
7845 EXPECT_FALSE(response.request()->GetAddressResults());
7846 EXPECT_FALSE(response.request()->GetTextResults());
7847 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:407848 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Orthe9db8d232019-01-14 21:24:457849}
7850
Eric Orth960e7062019-03-08 18:43:547851TEST_F(HostResolverManagerDnsTest, PtrQuery_Timeout) {
Eric Orthe9db8d232019-01-14 21:24:457852 // Setup fallback to confirm it is not used for non-address results.
7853 set_allow_fallback_to_proctask(true);
7854 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
7855 proc_->SignalMultiple(1u);
7856
7857 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137858 rules.emplace_back("host", dns_protocol::kTypePTR, false /* secure */,
7859 MockDnsClientRule::Result(MockDnsClientRule::TIMEOUT),
7860 false /* delay */);
Eric Orthe9db8d232019-01-14 21:24:457861
7862 CreateResolver();
7863 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7864
7865 HostResolver::ResolveHostParameters parameters;
7866 parameters.dns_query_type = DnsQueryType::PTR;
7867
Eric Orth117e1992019-04-17 00:24:157868 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557869 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
7870 parameters, request_context_.get(), host_cache_.get()));
Eric Orthe9db8d232019-01-14 21:24:457871 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_TIMED_OUT));
7872 EXPECT_FALSE(response.request()->GetAddressResults());
7873 EXPECT_FALSE(response.request()->GetTextResults());
7874 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:407875 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Orthe9db8d232019-01-14 21:24:457876}
7877
Eric Orth960e7062019-03-08 18:43:547878TEST_F(HostResolverManagerDnsTest, PtrQuery_Empty) {
Eric Orthe9db8d232019-01-14 21:24:457879 // Setup fallback to confirm it is not used for non-address results.
7880 set_allow_fallback_to_proctask(true);
7881 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
7882 proc_->SignalMultiple(1u);
7883
7884 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137885 rules.emplace_back("host", dns_protocol::kTypePTR, false /* secure */,
7886 MockDnsClientRule::Result(MockDnsClientRule::EMPTY),
7887 false /* delay */);
Eric Orthe9db8d232019-01-14 21:24:457888
7889 CreateResolver();
7890 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7891
7892 HostResolver::ResolveHostParameters parameters;
7893 parameters.dns_query_type = DnsQueryType::PTR;
7894
Eric Orth117e1992019-04-17 00:24:157895 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557896 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
7897 parameters, request_context_.get(), host_cache_.get()));
Eric Orthe9db8d232019-01-14 21:24:457898 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
7899 EXPECT_FALSE(response.request()->GetAddressResults());
7900 EXPECT_FALSE(response.request()->GetTextResults());
7901 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:407902 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Orthe9db8d232019-01-14 21:24:457903}
7904
Eric Orth960e7062019-03-08 18:43:547905TEST_F(HostResolverManagerDnsTest, PtrQuery_Malformed) {
Eric Orthe9db8d232019-01-14 21:24:457906 // Setup fallback to confirm it is not used for non-address results.
7907 set_allow_fallback_to_proctask(true);
7908 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
7909 proc_->SignalMultiple(1u);
7910
7911 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137912 rules.emplace_back("host", dns_protocol::kTypePTR, false /* secure */,
Eric Orthe9db8d232019-01-14 21:24:457913 MockDnsClientRule::Result(MockDnsClientRule::MALFORMED),
7914 false /* delay */);
7915
7916 CreateResolver();
7917 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7918
7919 HostResolver::ResolveHostParameters parameters;
7920 parameters.dns_query_type = DnsQueryType::PTR;
7921
Eric Orth117e1992019-04-17 00:24:157922 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557923 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
7924 parameters, request_context_.get(), host_cache_.get()));
Eric Orthe9db8d232019-01-14 21:24:457925 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE));
7926 EXPECT_FALSE(response.request()->GetAddressResults());
7927 EXPECT_FALSE(response.request()->GetTextResults());
7928 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:407929 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Orthe9db8d232019-01-14 21:24:457930}
7931
Eric Orth960e7062019-03-08 18:43:547932TEST_F(HostResolverManagerDnsTest, PtrQuery_MismatchedName) {
Eric Orthe9db8d232019-01-14 21:24:457933 std::vector<std::string> ptr_records = {{"foo.com"}};
7934 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137935 rules.emplace_back("host", dns_protocol::kTypePTR, false /* secure */,
Eric Orthe9db8d232019-01-14 21:24:457936 MockDnsClientRule::Result(BuildTestDnsPointerResponse(
7937 "host", std::move(ptr_records), "not.host")),
7938 false /* delay */);
7939
7940 CreateResolver();
7941 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7942
7943 HostResolver::ResolveHostParameters parameters;
7944 parameters.dns_query_type = DnsQueryType::PTR;
7945
Eric Orth117e1992019-04-17 00:24:157946 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557947 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
7948 parameters, request_context_.get(), host_cache_.get()));
Eric Orthe9db8d232019-01-14 21:24:457949 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE));
7950 EXPECT_FALSE(response.request()->GetAddressResults());
7951 EXPECT_FALSE(response.request()->GetTextResults());
7952 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:407953 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Orthe9db8d232019-01-14 21:24:457954}
7955
Eric Orth960e7062019-03-08 18:43:547956TEST_F(HostResolverManagerDnsTest, PtrQuery_WrongType) {
Eric Orthe9db8d232019-01-14 21:24:457957 // Respond to a TXT query with an A response.
7958 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137959 rules.emplace_back("host", dns_protocol::kTypePTR, false /* secure */,
Eric Orthe9db8d232019-01-14 21:24:457960 MockDnsClientRule::Result(
7961 BuildTestDnsResponse("host", IPAddress(1, 2, 3, 4))),
7962 false /* delay */);
7963
7964 CreateResolver();
7965 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7966
7967 HostResolver::ResolveHostParameters parameters;
7968 parameters.dns_query_type = DnsQueryType::PTR;
7969
7970 // Responses for the wrong type should be ignored.
Eric Orth117e1992019-04-17 00:24:157971 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:557972 HostPortPair("ok", 108), NetworkIsolationKey(), NetLogWithSource(),
7973 parameters, request_context_.get(), host_cache_.get()));
Eric Orthe9db8d232019-01-14 21:24:457974 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
7975 EXPECT_FALSE(response.request()->GetAddressResults());
7976 EXPECT_FALSE(response.request()->GetTextResults());
7977 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:407978 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Orthe9db8d232019-01-14 21:24:457979}
7980
Eric Ortha625b042019-01-16 01:14:457981// Same as PtrQuery except we specify DNS HostResolverSource instead of relying
7982// on automatic determination. Expect same results since DNS should be what we
7983// automatically determine, but some slightly different logic paths are
7984// involved.
Eric Orth960e7062019-03-08 18:43:547985TEST_F(HostResolverManagerDnsTest, PtrDnsQuery) {
Eric Orthe9db8d232019-01-14 21:24:457986 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:137987 rules.emplace_back("host", dns_protocol::kTypePTR, false /* secure */,
Eric Orthe9db8d232019-01-14 21:24:457988 MockDnsClientRule::Result(BuildTestDnsPointerResponse(
7989 "host", {"foo.com", "bar.com"})),
7990 false /* delay */);
7991
7992 CreateResolver();
7993 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
7994
7995 HostResolver::ResolveHostParameters parameters;
7996 parameters.source = HostResolverSource::DNS;
7997 parameters.dns_query_type = DnsQueryType::PTR;
7998
Eric Orth117e1992019-04-17 00:24:157999 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558000 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
8001 parameters, request_context_.get(), host_cache_.get()));
Eric Orthe9db8d232019-01-14 21:24:458002 EXPECT_THAT(response.result_error(), IsOk());
8003 EXPECT_FALSE(response.request()->GetAddressResults());
8004 EXPECT_FALSE(response.request()->GetTextResults());
David Van Clevec719c882019-11-04 15:47:408005 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Orthe9db8d232019-01-14 21:24:458006
8007 // Order between separate records is undefined.
8008 EXPECT_THAT(response.request()->GetHostnameResults(),
8009 testing::Optional(testing::UnorderedElementsAre(
8010 HostPortPair("foo.com", 108), HostPortPair("bar.com", 108))));
8011}
8012
Eric Orth960e7062019-03-08 18:43:548013TEST_F(HostResolverManagerDnsTest, SrvQuery) {
Eric Ortha625b042019-01-16 01:14:458014 const TestServiceRecord kRecord1 = {2, 3, 1223, "foo.com"};
8015 const TestServiceRecord kRecord2 = {5, 10, 80, "bar.com"};
8016 const TestServiceRecord kRecord3 = {5, 1, 5, "google.com"};
8017 const TestServiceRecord kRecord4 = {2, 100, 12345, "chromium.org"};
8018 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:138019 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
dalykc0ab0722019-03-14 17:00:588020 MockDnsClientRule::Result(BuildTestDnsServiceResponse(
Eric Ortha625b042019-01-16 01:14:458021 "host", {kRecord1, kRecord2, kRecord3, kRecord4})),
8022 false /* delay */);
8023
8024 CreateResolver();
8025 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8026
8027 HostResolver::ResolveHostParameters parameters;
8028 parameters.dns_query_type = DnsQueryType::SRV;
8029
Eric Orth117e1992019-04-17 00:24:158030 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558031 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
8032 parameters, request_context_.get(), host_cache_.get()));
Eric Ortha625b042019-01-16 01:14:458033 EXPECT_THAT(response.result_error(), IsOk());
8034 EXPECT_FALSE(response.request()->GetAddressResults());
8035 EXPECT_FALSE(response.request()->GetTextResults());
David Van Clevec719c882019-11-04 15:47:408036 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Ortha625b042019-01-16 01:14:458037
8038 // Expect ordered by priority, and random within a priority.
8039 base::Optional<std::vector<HostPortPair>> results =
8040 response.request()->GetHostnameResults();
8041 ASSERT_THAT(
8042 results,
8043 testing::Optional(testing::UnorderedElementsAre(
8044 HostPortPair("foo.com", 1223), HostPortPair("bar.com", 80),
8045 HostPortPair("google.com", 5), HostPortPair("chromium.org", 12345))));
8046 auto priority2 = std::vector<HostPortPair>(results.value().begin(),
8047 results.value().begin() + 2);
8048 EXPECT_THAT(priority2, testing::UnorderedElementsAre(
8049 HostPortPair("foo.com", 1223),
8050 HostPortPair("chromium.org", 12345)));
8051 auto priority5 = std::vector<HostPortPair>(results.value().begin() + 2,
8052 results.value().end());
8053 EXPECT_THAT(priority5,
8054 testing::UnorderedElementsAre(HostPortPair("bar.com", 80),
8055 HostPortPair("google.com", 5)));
8056}
8057
8058// 0-weight services are allowed. Ensure that we can handle such records,
8059// especially the case where all entries have weight 0.
Eric Orth960e7062019-03-08 18:43:548060TEST_F(HostResolverManagerDnsTest, SrvQuery_ZeroWeight) {
Eric Ortha625b042019-01-16 01:14:458061 const TestServiceRecord kRecord1 = {5, 0, 80, "bar.com"};
8062 const TestServiceRecord kRecord2 = {5, 0, 5, "google.com"};
8063 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:138064 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
dalykc0ab0722019-03-14 17:00:588065 MockDnsClientRule::Result(BuildTestDnsServiceResponse(
8066 "host", {kRecord1, kRecord2})),
Eric Ortha625b042019-01-16 01:14:458067 false /* delay */);
8068
8069 CreateResolver();
8070 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8071
8072 HostResolver::ResolveHostParameters parameters;
8073 parameters.dns_query_type = DnsQueryType::SRV;
8074
Eric Orth117e1992019-04-17 00:24:158075 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558076 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
8077 parameters, request_context_.get(), host_cache_.get()));
Eric Ortha625b042019-01-16 01:14:458078 EXPECT_THAT(response.result_error(), IsOk());
8079 EXPECT_FALSE(response.request()->GetAddressResults());
8080 EXPECT_FALSE(response.request()->GetTextResults());
David Van Clevec719c882019-11-04 15:47:408081 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Ortha625b042019-01-16 01:14:458082
8083 // Expect ordered by priority, and random within a priority.
8084 EXPECT_THAT(response.request()->GetHostnameResults(),
8085 testing::Optional(testing::UnorderedElementsAre(
8086 HostPortPair("bar.com", 80), HostPortPair("google.com", 5))));
8087}
8088
Eric Orth960e7062019-03-08 18:43:548089TEST_F(HostResolverManagerDnsTest, SrvQuery_NonexistentDomain) {
Eric Ortha625b042019-01-16 01:14:458090 // Setup fallback to confirm it is not used for non-address results.
8091 set_allow_fallback_to_proctask(true);
8092 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
8093 proc_->SignalMultiple(1u);
8094
8095 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:138096 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
Eric Ortha625b042019-01-16 01:14:458097 MockDnsClientRule::Result(MockDnsClientRule::NODOMAIN),
8098 false /* delay */);
8099
8100 CreateResolver();
8101 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8102
8103 HostResolver::ResolveHostParameters parameters;
8104 parameters.dns_query_type = DnsQueryType::SRV;
8105
Eric Orth117e1992019-04-17 00:24:158106 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558107 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
8108 parameters, request_context_.get(), host_cache_.get()));
Eric Ortha625b042019-01-16 01:14:458109 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
8110 EXPECT_FALSE(response.request()->GetAddressResults());
8111 EXPECT_FALSE(response.request()->GetTextResults());
8112 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:408113 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Ortha625b042019-01-16 01:14:458114}
8115
Eric Orth960e7062019-03-08 18:43:548116TEST_F(HostResolverManagerDnsTest, SrvQuery_Failure) {
Eric Ortha625b042019-01-16 01:14:458117 // Setup fallback to confirm it is not used for non-address results.
8118 set_allow_fallback_to_proctask(true);
8119 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
8120 proc_->SignalMultiple(1u);
8121
8122 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:138123 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
8124 MockDnsClientRule::Result(MockDnsClientRule::FAIL),
8125 false /* delay */);
Eric Ortha625b042019-01-16 01:14:458126
8127 CreateResolver();
8128 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8129
8130 HostResolver::ResolveHostParameters parameters;
8131 parameters.dns_query_type = DnsQueryType::SRV;
8132
Eric Orth117e1992019-04-17 00:24:158133 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558134 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
8135 parameters, request_context_.get(), host_cache_.get()));
Eric Ortha625b042019-01-16 01:14:458136 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
8137 EXPECT_FALSE(response.request()->GetAddressResults());
8138 EXPECT_FALSE(response.request()->GetTextResults());
8139 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:408140 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Ortha625b042019-01-16 01:14:458141}
8142
Eric Orth960e7062019-03-08 18:43:548143TEST_F(HostResolverManagerDnsTest, SrvQuery_Timeout) {
Eric Ortha625b042019-01-16 01:14:458144 // Setup fallback to confirm it is not used for non-address results.
8145 set_allow_fallback_to_proctask(true);
8146 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
8147 proc_->SignalMultiple(1u);
8148
8149 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:138150 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
8151 MockDnsClientRule::Result(MockDnsClientRule::TIMEOUT),
8152 false /* delay */);
Eric Ortha625b042019-01-16 01:14:458153
8154 CreateResolver();
8155 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8156
8157 HostResolver::ResolveHostParameters parameters;
8158 parameters.dns_query_type = DnsQueryType::SRV;
8159
Eric Orth117e1992019-04-17 00:24:158160 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558161 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
8162 parameters, request_context_.get(), host_cache_.get()));
Eric Ortha625b042019-01-16 01:14:458163 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_TIMED_OUT));
8164 EXPECT_FALSE(response.request()->GetAddressResults());
8165 EXPECT_FALSE(response.request()->GetTextResults());
8166 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:408167 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Ortha625b042019-01-16 01:14:458168}
8169
Eric Orth960e7062019-03-08 18:43:548170TEST_F(HostResolverManagerDnsTest, SrvQuery_Empty) {
Eric Ortha625b042019-01-16 01:14:458171 // Setup fallback to confirm it is not used for non-address results.
8172 set_allow_fallback_to_proctask(true);
8173 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
8174 proc_->SignalMultiple(1u);
8175
8176 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:138177 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
8178 MockDnsClientRule::Result(MockDnsClientRule::EMPTY),
8179 false /* delay */);
Eric Ortha625b042019-01-16 01:14:458180
8181 CreateResolver();
8182 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8183
8184 HostResolver::ResolveHostParameters parameters;
8185 parameters.dns_query_type = DnsQueryType::SRV;
8186
Eric Orth117e1992019-04-17 00:24:158187 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558188 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
8189 parameters, request_context_.get(), host_cache_.get()));
Eric Ortha625b042019-01-16 01:14:458190 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
8191 EXPECT_FALSE(response.request()->GetAddressResults());
8192 EXPECT_FALSE(response.request()->GetTextResults());
8193 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:408194 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Ortha625b042019-01-16 01:14:458195}
8196
Eric Orth960e7062019-03-08 18:43:548197TEST_F(HostResolverManagerDnsTest, SrvQuery_Malformed) {
Eric Ortha625b042019-01-16 01:14:458198 // Setup fallback to confirm it is not used for non-address results.
8199 set_allow_fallback_to_proctask(true);
8200 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
8201 proc_->SignalMultiple(1u);
8202
8203 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:138204 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
Eric Ortha625b042019-01-16 01:14:458205 MockDnsClientRule::Result(MockDnsClientRule::MALFORMED),
8206 false /* delay */);
8207
8208 CreateResolver();
8209 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8210
8211 HostResolver::ResolveHostParameters parameters;
8212 parameters.dns_query_type = DnsQueryType::SRV;
8213
Eric Orth117e1992019-04-17 00:24:158214 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558215 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
8216 parameters, request_context_.get(), host_cache_.get()));
Eric Ortha625b042019-01-16 01:14:458217 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE));
8218 EXPECT_FALSE(response.request()->GetAddressResults());
8219 EXPECT_FALSE(response.request()->GetTextResults());
8220 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:408221 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Ortha625b042019-01-16 01:14:458222}
8223
Eric Orth960e7062019-03-08 18:43:548224TEST_F(HostResolverManagerDnsTest, SrvQuery_MismatchedName) {
Eric Ortha625b042019-01-16 01:14:458225 std::vector<TestServiceRecord> srv_records = {{1, 2, 3, "foo.com"}};
8226 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:138227 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
dalykc0ab0722019-03-14 17:00:588228 MockDnsClientRule::Result(BuildTestDnsServiceResponse(
Eric Ortha625b042019-01-16 01:14:458229 "host", std::move(srv_records), "not.host")),
8230 false /* delay */);
8231
8232 CreateResolver();
8233 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8234
8235 HostResolver::ResolveHostParameters parameters;
8236 parameters.dns_query_type = DnsQueryType::SRV;
8237
Eric Orth117e1992019-04-17 00:24:158238 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558239 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
8240 parameters, request_context_.get(), host_cache_.get()));
Eric Ortha625b042019-01-16 01:14:458241 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE));
8242 EXPECT_FALSE(response.request()->GetAddressResults());
8243 EXPECT_FALSE(response.request()->GetTextResults());
8244 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:408245 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Ortha625b042019-01-16 01:14:458246}
8247
Eric Orth960e7062019-03-08 18:43:548248TEST_F(HostResolverManagerDnsTest, SrvQuery_WrongType) {
Eric Ortha625b042019-01-16 01:14:458249 // Respond to a SRV query with an A response.
8250 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:138251 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
Eric Ortha625b042019-01-16 01:14:458252 MockDnsClientRule::Result(
8253 BuildTestDnsResponse("host", IPAddress(1, 2, 3, 4))),
8254 false /* delay */);
8255
8256 CreateResolver();
8257 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8258
8259 HostResolver::ResolveHostParameters parameters;
8260 parameters.dns_query_type = DnsQueryType::SRV;
8261
8262 // Responses for the wrong type should be ignored.
Eric Orth117e1992019-04-17 00:24:158263 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558264 HostPortPair("ok", 108), NetworkIsolationKey(), NetLogWithSource(),
8265 parameters, request_context_.get(), host_cache_.get()));
Eric Ortha625b042019-01-16 01:14:458266 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
8267 EXPECT_FALSE(response.request()->GetAddressResults());
8268 EXPECT_FALSE(response.request()->GetTextResults());
8269 EXPECT_FALSE(response.request()->GetHostnameResults());
David Van Clevec719c882019-11-04 15:47:408270 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Ortha625b042019-01-16 01:14:458271}
8272
8273// Same as SrvQuery except we specify DNS HostResolverSource instead of relying
8274// on automatic determination. Expect same results since DNS should be what we
8275// automatically determine, but some slightly different logic paths are
8276// involved.
Eric Orth960e7062019-03-08 18:43:548277TEST_F(HostResolverManagerDnsTest, SrvDnsQuery) {
Eric Ortha625b042019-01-16 01:14:458278 const TestServiceRecord kRecord1 = {2, 3, 1223, "foo.com"};
8279 const TestServiceRecord kRecord2 = {5, 10, 80, "bar.com"};
8280 const TestServiceRecord kRecord3 = {5, 1, 5, "google.com"};
8281 const TestServiceRecord kRecord4 = {2, 100, 12345, "chromium.org"};
8282 MockDnsClientRuleList rules;
dalyk4f4ac712019-05-31 16:33:138283 rules.emplace_back("host", dns_protocol::kTypeSRV, false /* secure */,
dalykc0ab0722019-03-14 17:00:588284 MockDnsClientRule::Result(BuildTestDnsServiceResponse(
Eric Ortha625b042019-01-16 01:14:458285 "host", {kRecord1, kRecord2, kRecord3, kRecord4})),
8286 false /* delay */);
8287
8288 CreateResolver();
8289 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8290
8291 HostResolver::ResolveHostParameters parameters;
8292 parameters.source = HostResolverSource::DNS;
8293 parameters.dns_query_type = DnsQueryType::SRV;
8294
Eric Orth117e1992019-04-17 00:24:158295 ResolveHostResponseHelper response(resolver_->CreateRequest(
Matt Menkef4023312019-11-01 18:24:558296 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
8297 parameters, request_context_.get(), host_cache_.get()));
Eric Ortha625b042019-01-16 01:14:458298 EXPECT_THAT(response.result_error(), IsOk());
8299 EXPECT_FALSE(response.request()->GetAddressResults());
8300 EXPECT_FALSE(response.request()->GetTextResults());
David Van Clevec719c882019-11-04 15:47:408301 EXPECT_FALSE(response.request()->GetEsniResults());
Eric Ortha625b042019-01-16 01:14:458302
8303 // Expect ordered by priority, and random within a priority.
8304 base::Optional<std::vector<HostPortPair>> results =
8305 response.request()->GetHostnameResults();
8306 ASSERT_THAT(
8307 results,
8308 testing::Optional(testing::UnorderedElementsAre(
8309 HostPortPair("foo.com", 1223), HostPortPair("bar.com", 80),
8310 HostPortPair("google.com", 5), HostPortPair("chromium.org", 12345))));
8311 auto priority2 = std::vector<HostPortPair>(results.value().begin(),
8312 results.value().begin() + 2);
8313 EXPECT_THAT(priority2, testing::UnorderedElementsAre(
8314 HostPortPair("foo.com", 1223),
8315 HostPortPair("chromium.org", 12345)));
8316 auto priority5 = std::vector<HostPortPair>(results.value().begin() + 2,
8317 results.value().end());
8318 EXPECT_THAT(priority5,
8319 testing::UnorderedElementsAre(HostPortPair("bar.com", 80),
8320 HostPortPair("google.com", 5)));
8321}
8322
Eric Orth314e8b42019-11-12 00:32:218323TEST_F(HostResolverManagerDnsTest, DohProbeRequest) {
8324 ChangeDnsConfig(CreateValidDnsConfig());
8325
8326 EXPECT_FALSE(dns_client_->factory()->doh_probes_running());
8327
8328 std::unique_ptr<HostResolverManager::CancellableProbeRequest> request =
8329 resolver_->CreateDohProbeRequest(request_context_.get());
8330 EXPECT_THAT(request->Start(), IsError(ERR_IO_PENDING));
8331
8332 EXPECT_TRUE(dns_client_->factory()->doh_probes_running());
8333
8334 request.reset();
8335
8336 EXPECT_FALSE(dns_client_->factory()->doh_probes_running());
8337}
8338
8339TEST_F(HostResolverManagerDnsTest, DohProbeRequest_ExplicitCancel) {
8340 ChangeDnsConfig(CreateValidDnsConfig());
8341
8342 std::unique_ptr<HostResolverManager::CancellableProbeRequest> request =
8343 resolver_->CreateDohProbeRequest(request_context_.get());
8344 EXPECT_THAT(request->Start(), IsError(ERR_IO_PENDING));
8345 ASSERT_TRUE(dns_client_->factory()->doh_probes_running());
8346
8347 request->Cancel();
8348
8349 EXPECT_FALSE(dns_client_->factory()->doh_probes_running());
8350}
8351
8352TEST_F(HostResolverManagerDnsTest, DohProbeRequest_ExplicitCancel_NotStarted) {
8353 ChangeDnsConfig(CreateValidDnsConfig());
8354
8355 std::unique_ptr<HostResolverManager::CancellableProbeRequest> request =
8356 resolver_->CreateDohProbeRequest(request_context_.get());
8357
8358 request->Cancel();
8359
8360 EXPECT_FALSE(dns_client_->factory()->doh_probes_running());
8361}
8362
8363TEST_F(HostResolverManagerDnsTest,
8364 DohProbeRequest_ExplicitCancel_AfterManagerDestruction) {
8365 ChangeDnsConfig(CreateValidDnsConfig());
8366
8367 std::unique_ptr<HostResolverManager::CancellableProbeRequest> request =
8368 resolver_->CreateDohProbeRequest(request_context_.get());
8369 EXPECT_THAT(request->Start(), IsError(ERR_IO_PENDING));
8370 ASSERT_TRUE(dns_client_->factory()->doh_probes_running());
8371
8372 DestroyResolver();
8373 request->Cancel();
8374}
8375
David Van Clevec719c882019-11-04 15:47:408376TEST_F(HostResolverManagerDnsTest, EsniQuery) {
8377 EsniContent c1, c2, c3;
8378 IPAddress a1(1, 2, 3, 4), a2(5, 6, 7, 8);
8379 IPAddress a3(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1);
8380
8381 std::string kKey1 = GenerateWellFormedEsniKeys("a");
8382 std::string kKey2 = GenerateWellFormedEsniKeys("b");
8383 std::string kKey3 = GenerateWellFormedEsniKeys("c");
8384
8385 c1.AddKey(kKey1);
8386
8387 c2.AddKeyForAddress(a1, kKey2);
8388 c2.AddKeyForAddress(a2, kKey2);
8389 c2.AddKeyForAddress(a3, kKey2);
8390
8391 c3.AddKeyForAddress(a1, kKey3);
8392
8393 std::vector<EsniContent> esni_records = {c1, c2, c3};
8394
8395 MockDnsClientRuleList rules;
8396 rules.emplace_back("host", dns_protocol::kExperimentalTypeEsniDraft4,
8397 false /* secure */,
8398 MockDnsClientRule::Result(BuildTestDnsEsniResponse(
8399 "host", std::move(esni_records))),
8400 false /* delay */);
8401
8402 CreateResolver();
8403 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8404
8405 HostResolver::ResolveHostParameters parameters;
8406 parameters.dns_query_type = DnsQueryType::ESNI;
8407
8408 ResolveHostResponseHelper response(resolver_->CreateRequest(
8409 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
8410 parameters, request_context_.get(), host_cache_.get()));
8411 EXPECT_THAT(response.result_error(), IsOk());
8412
8413 EXPECT_FALSE(response.request()->GetHostnameResults());
8414 EXPECT_FALSE(response.request()->GetTextResults());
8415
8416 // The IPv6 address |a3| should come first, and the other
8417 // addresses should have been deduplicated.
8418 EXPECT_THAT(
8419 response.request()->GetAddressResults(),
8420 Optional(AllOf(Property(&AddressList::endpoints,
8421 UnorderedElementsAre(IPEndPoint(a3, 108),
8422 IPEndPoint(a1, 108),
8423 IPEndPoint(a2, 108))),
8424 Property(&AddressList::front, IPEndPoint(a3, 108)))));
8425
8426 // During aggregation of ESNI query results, we drop ESNI keys
8427 // with no associated addresses, like key 1 here. (This is an implementation
8428 // decision declining a "MAY" behavior from the spec.)
8429 // So, we require that only keys 2 and 3 are surfaced.
8430 //
8431 // The Eq() wrappers are necessary here because keys_for_addresses
8432 // returns a container of StringPieces.
8433 EXPECT_THAT(
8434 response.request()->GetEsniResults(),
8435 Optional(AllOf(
8436 Property(&EsniContent::keys,
8437 UnorderedElementsAre(Eq(kKey2), Eq(kKey3))),
8438 Property(&EsniContent::keys_for_addresses,
8439 UnorderedElementsAre(
8440 Pair(a1, UnorderedElementsAre(Eq(kKey2), Eq(kKey3))),
8441 Pair(a2, UnorderedElementsAre(Eq(kKey2))),
8442 Pair(a3, UnorderedElementsAre(Eq(kKey2))))))));
8443}
8444
8445TEST_F(HostResolverManagerDnsTest, EsniQuery_InvalidConfig) {
8446 set_allow_fallback_to_proctask(false);
8447 // Set empty DnsConfig.
8448 InvalidateDnsConfig();
8449
8450 HostResolver::ResolveHostParameters parameters;
8451 parameters.dns_query_type = DnsQueryType::ESNI;
8452
8453 ResolveHostResponseHelper response(resolver_->CreateRequest(
8454 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
8455 parameters, request_context_.get(), host_cache_.get()));
8456 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_CACHE_MISS));
8457}
8458
8459TEST_F(HostResolverManagerDnsTest, EsniQuery_NonexistentDomain) {
8460 // Setup fallback to confirm it is not used for non-address results.
8461 set_allow_fallback_to_proctask(true);
8462 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
8463 proc_->SignalMultiple(1u);
8464
8465 MockDnsClientRuleList rules;
8466 rules.emplace_back("host", dns_protocol::kExperimentalTypeEsniDraft4,
8467 false /* secure */,
8468 MockDnsClientRule::Result(MockDnsClientRule::NODOMAIN),
8469 false /* delay */);
8470
8471 CreateResolver();
8472 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8473
8474 HostResolver::ResolveHostParameters parameters;
8475 parameters.dns_query_type = DnsQueryType::ESNI;
8476
8477 ResolveHostResponseHelper response(resolver_->CreateRequest(
8478 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
8479 parameters, request_context_.get(), host_cache_.get()));
8480 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
8481 EXPECT_FALSE(response.request()->GetAddressResults());
8482 EXPECT_FALSE(response.request()->GetTextResults());
8483 EXPECT_FALSE(response.request()->GetHostnameResults());
8484 EXPECT_FALSE(response.request()->GetEsniResults());
8485}
8486
8487TEST_F(HostResolverManagerDnsTest, EsniQuery_Failure) {
8488 // Setup fallback to confirm it is not used for non-address results.
8489 set_allow_fallback_to_proctask(true);
8490 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
8491 proc_->SignalMultiple(1u);
8492
8493 MockDnsClientRuleList rules;
8494 rules.emplace_back(
8495 "host", dns_protocol::kExperimentalTypeEsniDraft4, false /* secure */,
8496 MockDnsClientRule::Result(MockDnsClientRule::FAIL), false /* delay */);
8497
8498 CreateResolver();
8499 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8500
8501 HostResolver::ResolveHostParameters parameters;
8502 parameters.dns_query_type = DnsQueryType::ESNI;
8503
8504 ResolveHostResponseHelper response(resolver_->CreateRequest(
8505 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
8506 parameters, request_context_.get(), host_cache_.get()));
8507 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
8508 EXPECT_FALSE(response.request()->GetAddressResults());
8509 EXPECT_FALSE(response.request()->GetTextResults());
8510 EXPECT_FALSE(response.request()->GetHostnameResults());
8511 EXPECT_FALSE(response.request()->GetEsniResults());
8512}
8513
8514TEST_F(HostResolverManagerDnsTest, EsniQuery_Timeout) {
8515 // Setup fallback to confirm it is not used for non-address results.
8516 set_allow_fallback_to_proctask(true);
8517 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
8518 proc_->SignalMultiple(1u);
8519
8520 MockDnsClientRuleList rules;
8521 rules.emplace_back(
8522 "host", dns_protocol::kExperimentalTypeEsniDraft4, false /* secure */,
8523 MockDnsClientRule::Result(MockDnsClientRule::TIMEOUT), false /* delay */);
8524
8525 CreateResolver();
8526 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8527
8528 HostResolver::ResolveHostParameters parameters;
8529 parameters.dns_query_type = DnsQueryType::ESNI;
8530
8531 ResolveHostResponseHelper response(resolver_->CreateRequest(
8532 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
8533 parameters, request_context_.get(), host_cache_.get()));
8534 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_TIMED_OUT));
8535 EXPECT_FALSE(response.request()->GetAddressResults());
8536 EXPECT_FALSE(response.request()->GetTextResults());
8537 EXPECT_FALSE(response.request()->GetHostnameResults());
8538 EXPECT_FALSE(response.request()->GetEsniResults());
8539}
8540
8541TEST_F(HostResolverManagerDnsTest, EsniQuery_Empty) {
8542 // Setup fallback to confirm it is not used for non-address results.
8543 set_allow_fallback_to_proctask(true);
8544 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
8545 proc_->SignalMultiple(1u);
8546
8547 MockDnsClientRuleList rules;
8548 rules.emplace_back(
8549 "host", dns_protocol::kExperimentalTypeEsniDraft4, false /* secure */,
8550 MockDnsClientRule::Result(MockDnsClientRule::EMPTY), false /* delay */);
8551
8552 CreateResolver();
8553 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8554
8555 HostResolver::ResolveHostParameters parameters;
8556 parameters.dns_query_type = DnsQueryType::ESNI;
8557
8558 ResolveHostResponseHelper response(resolver_->CreateRequest(
8559 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
8560 parameters, request_context_.get(), host_cache_.get()));
8561 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
8562 EXPECT_FALSE(response.request()->GetAddressResults());
8563 EXPECT_FALSE(response.request()->GetTextResults());
8564 EXPECT_FALSE(response.request()->GetHostnameResults());
8565 EXPECT_FALSE(response.request()->GetEsniResults());
8566}
8567
8568TEST_F(HostResolverManagerDnsTest, EsniQuery_Malformed) {
8569 // Setup fallback to confirm it is not used for non-address results.
8570 set_allow_fallback_to_proctask(true);
8571 proc_->AddRuleForAllFamilies("host", "192.168.1.102");
8572 proc_->SignalMultiple(1u);
8573
8574 MockDnsClientRuleList rules;
8575 rules.emplace_back("host", dns_protocol::kExperimentalTypeEsniDraft4,
8576 false /* secure */,
8577 MockDnsClientRule::Result(MockDnsClientRule::MALFORMED),
8578 false /* delay */);
8579
8580 CreateResolver();
8581 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8582
8583 HostResolver::ResolveHostParameters parameters;
8584 parameters.dns_query_type = DnsQueryType::ESNI;
8585
8586 ResolveHostResponseHelper response(resolver_->CreateRequest(
8587 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
8588 parameters, request_context_.get(), host_cache_.get()));
8589 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE));
8590 EXPECT_FALSE(response.request()->GetAddressResults());
8591 EXPECT_FALSE(response.request()->GetTextResults());
8592 EXPECT_FALSE(response.request()->GetHostnameResults());
8593 EXPECT_FALSE(response.request()->GetEsniResults());
8594}
8595
8596TEST_F(HostResolverManagerDnsTest, EsniQuery_MismatchedName) {
8597 EsniContent content;
8598 IPAddress address(1, 2, 3, 4);
8599 std::string key = GenerateWellFormedEsniKeys("a");
8600 content.AddKeyForAddress(address, key);
8601
8602 std::vector<EsniContent> esni_records = {content};
8603
8604 MockDnsClientRuleList rules;
8605 rules.emplace_back("host", dns_protocol::kExperimentalTypeEsniDraft4,
8606 false /* secure */,
8607 MockDnsClientRule::Result(BuildTestDnsEsniResponse(
8608 "host", std::move(esni_records), "not.host")),
8609 false /* delay */);
8610
8611 CreateResolver();
8612 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8613
8614 HostResolver::ResolveHostParameters parameters;
8615 parameters.dns_query_type = DnsQueryType::ESNI;
8616
8617 ResolveHostResponseHelper response(resolver_->CreateRequest(
8618 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
8619 parameters, request_context_.get(), host_cache_.get()));
8620 EXPECT_THAT(response.result_error(), IsError(ERR_DNS_MALFORMED_RESPONSE));
8621 EXPECT_FALSE(response.request()->GetAddressResults());
8622 EXPECT_FALSE(response.request()->GetTextResults());
8623 EXPECT_FALSE(response.request()->GetHostnameResults());
8624 EXPECT_FALSE(response.request()->GetEsniResults());
8625}
8626
8627TEST_F(HostResolverManagerDnsTest, EsniQuery_WrongType) {
8628 // Respond to an ESNI query with an A response.
8629 MockDnsClientRuleList rules;
8630 rules.emplace_back("host", dns_protocol::kExperimentalTypeEsniDraft4,
8631 false /* secure */,
8632 MockDnsClientRule::Result(
8633 BuildTestDnsResponse("host", IPAddress(1, 2, 3, 4))),
8634 false /* delay */);
8635
8636 CreateResolver();
8637 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8638
8639 HostResolver::ResolveHostParameters parameters;
8640 parameters.dns_query_type = DnsQueryType::ESNI;
8641
8642 // Responses for the wrong type should be ignored.
8643 ResolveHostResponseHelper response(resolver_->CreateRequest(
8644 HostPortPair("ok", 108), NetworkIsolationKey(), NetLogWithSource(),
8645 parameters, request_context_.get(), host_cache_.get()));
8646 EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
8647 EXPECT_FALSE(response.request()->GetAddressResults());
8648 EXPECT_FALSE(response.request()->GetTextResults());
8649 EXPECT_FALSE(response.request()->GetHostnameResults());
8650 EXPECT_FALSE(response.request()->GetEsniResults());
8651}
8652
8653// Same as EsniQuery except we specify DNS HostResolverSource instead of relying
8654// on automatic determination. Expect same results since DNS should be what we
8655// automatically determine, but some slightly different logic paths are
8656// involved.
8657TEST_F(HostResolverManagerDnsTest, EsniDnsQuery) {
8658 EsniContent c1, c2, c3;
8659 IPAddress a1(1, 2, 3, 4), a2(5, 6, 7, 8);
8660
8661 const std::string kKey1 = GenerateWellFormedEsniKeys("a");
8662 const std::string kKey2 = GenerateWellFormedEsniKeys("b");
8663 const std::string kKey3 = GenerateWellFormedEsniKeys("c");
8664
8665 c1.AddKey(kKey1);
8666
8667 c2.AddKeyForAddress(a1, kKey2);
8668 c2.AddKeyForAddress(a2, kKey2);
8669
8670 c3.AddKeyForAddress(a1, kKey3);
8671
8672 std::vector<EsniContent> esni_records = {c1, c2, c3};
8673
8674 MockDnsClientRuleList rules;
8675 rules.emplace_back("host", dns_protocol::kExperimentalTypeEsniDraft4,
8676 false /* secure */,
8677 MockDnsClientRule::Result(BuildTestDnsEsniResponse(
8678 "host", std::move(esni_records))),
8679 false /* delay */);
8680
8681 CreateResolver();
8682 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8683
8684 HostResolver::ResolveHostParameters parameters;
8685 parameters.source = HostResolverSource::DNS;
8686 parameters.dns_query_type = DnsQueryType::ESNI;
8687
8688 ResolveHostResponseHelper response(resolver_->CreateRequest(
8689 HostPortPair("host", 108), NetworkIsolationKey(), NetLogWithSource(),
8690 parameters, request_context_.get(), host_cache_.get()));
8691 EXPECT_THAT(response.result_error(), IsOk());
8692 EXPECT_FALSE(response.request()->GetHostnameResults());
8693 EXPECT_FALSE(response.request()->GetTextResults());
8694
8695 // The multiple ESNI records should have been merged when parsing
8696 // the results.
8697 c1.MergeFrom(c2);
8698 c1.MergeFrom(c3);
8699
8700 // The ESNI records' addresses should have been merged into
8701 // the address list.
8702 ASSERT_TRUE(response.request()->GetAddressResults());
8703 EXPECT_THAT(
8704 response.request()->GetAddressResults()->endpoints(),
8705 testing::UnorderedElementsAre(IPEndPoint(a1, 108), IPEndPoint(a2, 108)));
8706
8707 ASSERT_TRUE(response.request()->GetEsniResults().has_value());
8708
8709 // During aggregation of ESNI query results, we drop ESNI keys
8710 // with no associated addresses, like key 1 here. (This is an implementation
8711 // decision declining a "MAY" behavior from the spec.) So, we require that
8712 // only keys 2 and 3 are surfaced.
8713 EXPECT_THAT(response.request()->GetEsniResults()->keys(),
8714 testing::UnorderedElementsAre(kKey2, kKey3));
8715 EXPECT_EQ(response.request()->GetEsniResults()->keys_for_addresses(),
8716 c1.keys_for_addresses());
8717}
8718
David Van Cleve1fb5e8c2019-11-04 16:45:168719class HostResolverManagerEsniTest : public HostResolverManagerDnsTest {
8720 public:
8721 HostResolverManagerEsniTest()
8722 : HostResolverManagerDnsTest(
8723 base::test::TaskEnvironment::TimeSource::MOCK_TIME) {
8724 scoped_feature_list_.InitAndEnableFeature(features::kRequestEsniDnsRecords);
8725 }
8726
8727 protected:
8728 base::test::ScopedFeatureList scoped_feature_list_;
8729
8730 // Adds a rule returning a collection of ESNI records such that
8731 // - there is a lone key with no associated addresses
8732 // - there is an address associated with multiple keys
8733 // - there is a key associated with multiple addresses
8734 //
8735 // Returns a pair containing:
8736 // (1) a single merged EsniContent object which should be contained in
8737 // the eventual response.
8738 // (2) the collection of IPEndPoints corresponding to the
8739 // ESNI records' contained addresses; these are expected to
8740 // be contained in the eventual response's address list (assuming
8741 // no addresses are pruned by the address sorter, which will
8742 // be the case in the test, because MockAddressSorter no-ops)
8743 struct AddEsniRecordsRuleOptions {
8744 bool secure = true, delay = false;
8745 };
8746 std::pair<EsniContent, std::vector<IPEndPoint>> AddEsniRecordsRule(
8747 base::StringPiece hostname,
8748 AddEsniRecordsRuleOptions options,
8749 MockDnsClientRuleList* rules) {
8750 EsniContent c1, c2, c3;
8751 IPAddress a1(1, 2, 3, 4);
8752 IPAddress a2(5, 6, 7, 8);
8753
8754 const std::string kKey1 = GenerateWellFormedEsniKeys("a");
8755 const std::string kKey2 = GenerateWellFormedEsniKeys("b");
8756 const std::string kKey3 = GenerateWellFormedEsniKeys("c");
8757
8758 c1.AddKey(kKey1);
8759
8760 c2.AddKeyForAddress(a1, kKey2);
8761 c2.AddKeyForAddress(a2, kKey2);
8762
8763 c3.AddKeyForAddress(a1, kKey3);
8764
8765 std::vector<EsniContent> esni_records = {c1, c2, c3};
8766 rules->emplace_back(std::string(hostname),
8767 dns_protocol::kExperimentalTypeEsniDraft4,
8768 options.secure,
8769 MockDnsClientRule::Result(BuildTestDnsEsniResponse(
8770 std::string(hostname), std::move(esni_records))),
8771 options.delay);
8772
8773 // Key 1 will be dropped because it corresponds to no addresses;
8774 // section 4.2.2 of ESNI draft 4 gives implementors the option to associate
8775 // these with all IP addresses received in concurrent A and AAAA responses,
8776 // and we choose not to do this.
8777 c2.MergeFrom(c3);
8778 return std::make_pair(
8779 c2, std::vector<IPEndPoint>{IPEndPoint(a1, 80), IPEndPoint(a2, 80)});
8780 }
8781};
8782
8783// Check that resolving ESNI queries alongside A and AAAA queries
8784// results in a correct aggregation of addresses.
8785TEST_F(HostResolverManagerEsniTest, AggregatesResults) {
8786 MockDnsClientRuleList rules;
8787
8788 EsniContent esni_expectation;
8789 std::vector<IPEndPoint> expected_addresses;
8790 std::tie(esni_expectation, expected_addresses) =
8791 AddEsniRecordsRule("host", AddEsniRecordsRuleOptions(), &rules);
8792
8793 rules.emplace_back("host", dns_protocol::kTypeA, true /* secure */,
8794 MockDnsClientRule::Result(MockDnsClientRule::OK),
8795 false /* delay */);
8796 rules.emplace_back("host", dns_protocol::kTypeAAAA, true /* secure */,
8797 MockDnsClientRule::Result(MockDnsClientRule::OK),
8798 false /* delay */);
8799 // Even though the A and AAAA results' addresses won't have any
8800 // associated ESNI keys, they should still be surfaced in GetAddressResults().
8801 expected_addresses.push_back(CreateExpected("127.0.0.1", 80));
8802 expected_addresses.push_back(CreateExpected("::1", 80));
8803
8804 CreateResolver();
8805 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8806 DnsConfigOverrides overrides;
8807 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
8808 resolver_->SetDnsConfigOverrides(overrides);
8809
8810 ResolveHostResponseHelper response(resolver_->CreateRequest(
8811 HostPortPair("host", 80), NetworkIsolationKey(), NetLogWithSource(),
8812 HostResolver::ResolveHostParameters(), request_context_.get(),
8813 host_cache_.get()));
8814
8815 ASSERT_THAT(response.result_error(), IsOk());
8816 EXPECT_THAT(response.request()->GetEsniResults(),
8817 testing::Optional(testing::Eq(esni_expectation)));
8818 // GetAddressResults() should surface addresses with and without
8819 // associated ESNI keys.
8820 ASSERT_THAT(response.request()->GetAddressResults()->endpoints(),
8821 testing::UnorderedElementsAreArray(expected_addresses));
8822}
8823
8824// Test that addresses with associated ESNI keys are placed
8825// first in the order provided to the address sorter.
8826// (This corresponds to the order of the address list in the results
8827// because MockAddressSorter's sort is a no-op.)
8828TEST_F(HostResolverManagerEsniTest, EsniAddressesFirstInOrder) {
8829 MockDnsClientRuleList rules;
8830
8831 EsniContent esni_expectation;
8832 std::vector<IPEndPoint> esni_addresses;
8833 std::tie(esni_expectation, esni_addresses) =
8834 AddEsniRecordsRule("host", AddEsniRecordsRuleOptions(), &rules);
8835
8836 rules.emplace_back("host", dns_protocol::kTypeA, true /* secure */,
8837 MockDnsClientRule::Result(MockDnsClientRule::OK),
8838 false /* delay */);
8839 rules.emplace_back("host", dns_protocol::kTypeAAAA, true /* secure */,
8840 MockDnsClientRule::Result(MockDnsClientRule::OK),
8841 false /* delay */);
8842
8843 CreateResolver();
8844 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8845 DnsConfigOverrides overrides;
8846 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
8847 resolver_->SetDnsConfigOverrides(overrides);
8848
8849 HostResolver::ResolveHostParameters parameters;
8850 ResolveHostResponseHelper response(resolver_->CreateRequest(
8851 HostPortPair("host", 80), NetworkIsolationKey(), NetLogWithSource(),
8852 parameters, request_context_.get(), host_cache_.get()));
8853
8854 // Check that the IP addresses with associated
8855 // ESNI key objects occupy the initial entries of the
8856 // address list returned by the DNS query.
8857 ASSERT_THAT(response.result_error(), IsOk());
8858 ASSERT_TRUE(response.request()->GetAddressResults());
8859 const auto& result_addresses =
8860 response.request()->GetAddressResults()->endpoints();
8861 for (const IPEndPoint& address_with_esni_keys : esni_addresses) {
8862 int index = std::find(result_addresses.begin(), result_addresses.end(),
8863 address_with_esni_keys) -
8864 result_addresses.begin();
8865
8866 // Since this address has associated ESNI keys, it should be in
8867 // the first esni_addresses.size() many entries of the result's
8868 // address list.
8869 ASSERT_TRUE(base::IsValueInRangeForNumericType<size_t>(index));
8870 EXPECT_LT(static_cast<size_t>(index), esni_addresses.size());
8871 }
8872}
8873
8874TEST_F(HostResolverManagerEsniTest, OnlyMakesRequestOverSecureDns) {
8875 // Add some insecurely-accessible ESNI results alongside
8876 // the default (insecurely-accessible) IPv4 and IPv6 results
8877 // for the "ok" hostname.
8878 MockDnsClientRuleList rules = CreateDefaultDnsRules();
8879 AddEsniRecordsRuleOptions options;
8880 options.secure = false;
8881 AddEsniRecordsRule("ok", options, &rules);
8882
8883 CreateResolver();
8884 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8885
8886 ResolveHostResponseHelper response(resolver_->CreateRequest(
8887 HostPortPair("ok", 80), NetworkIsolationKey(), NetLogWithSource(),
8888 HostResolver::ResolveHostParameters(), request_context_.get(),
8889 host_cache_.get()));
8890
8891 ASSERT_THAT(response.result_error(), IsOk());
8892
8893 // Since the request wasn't secure, we shouldn't have
8894 // queried for any ESNI results.
8895 ASSERT_FALSE(response.request()->GetEsniResults());
8896}
8897
8898// Make sure that ESNI queries don't get cancelled *before* the
8899// configured timeout, but do get cancelled after it,
8900// in the case where the absolute timeout dominates.
8901TEST_F(HostResolverManagerEsniTest, RespectsAbsoluteTimeout) {
8902 // Add some delayed ESNI, IPv4, and IPv6 results
8903 MockDnsClientRuleList rules = CreateDefaultDnsRules();
8904 AddEsniRecordsRuleOptions options;
8905 options.delay = true;
8906 AddEsniRecordsRule("host", options, &rules);
8907 rules.emplace_back("host", dns_protocol::kTypeA, true /* secure */,
8908 MockDnsClientRule::Result(MockDnsClientRule::OK),
8909 true /* delay */);
8910 rules.emplace_back("host", dns_protocol::kTypeAAAA, true /* secure */,
8911 MockDnsClientRule::Result(MockDnsClientRule::OK),
8912 true /* delay */);
8913
8914 CreateResolver();
8915 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8916 DnsConfigOverrides overrides;
8917 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
8918 resolver_->SetDnsConfigOverrides(overrides);
8919
8920 ResolveHostResponseHelper response(resolver_->CreateRequest(
8921 HostPortPair("host", 80), NetworkIsolationKey(), NetLogWithSource(),
8922 HostResolver::ResolveHostParameters(), request_context_.get(),
8923 host_cache_.get()));
8924
8925 base::TimeDelta absolute_timeout =
8926 features::EsniDnsMaxAbsoluteAdditionalWait();
8927
8928 // Let enough time pass during the A and AAAA transactions that the
8929 // absolute timeout will be less than the relative timeout.
8930 base::TimeDelta a_aaaa_elapsed =
8931 50 * (100.0 / features::kEsniDnsMaxRelativeAdditionalWaitPercent.Get()) *
8932 absolute_timeout;
8933
8934 FastForwardBy(a_aaaa_elapsed);
8935 ASSERT_TRUE(
8936 dns_client_->CompleteOneDelayedTransactionOfType(DnsQueryType::A));
8937 ASSERT_TRUE(
8938 dns_client_->CompleteOneDelayedTransactionOfType(DnsQueryType::AAAA));
8939
8940 // Since the A and AAAA queries have only just completed, we shouldn't
8941 // have timed out the ESNI query.
8942 EXPECT_FALSE(response.complete());
8943
8944 // After half of the absolute timeout, the query should still be alive.
8945 FastForwardBy(0.5 * absolute_timeout);
8946
8947 // Since the absolute timeout has not yet elapsed, and it is shorter by
8948 // design than the relative timeout, we shouldn't
8949 // have timed out the ESNI transaction.
8950 EXPECT_FALSE(response.complete());
8951
8952 // After (more than) the timeout has passed, we should have cancelled
8953 // the ESNI transaction.
8954 FastForwardBy(absolute_timeout);
8955 ASSERT_THAT(response.result_error(), IsOk());
8956
8957 // Since we cancelled the transaction, we shouldn't have any ESNI results.
8958 EXPECT_FALSE(response.request()->GetEsniResults());
8959}
8960
8961// Make sure that ESNI queries don't get cancelled *before* the
8962// configured timeout, but do get cancelled after it,
8963// in the case where the relative timeout dominates.
8964TEST_F(HostResolverManagerEsniTest, RespectsRelativeTimeout) {
8965 // Add some delayed ESNI, IPv4, and IPv6 results
8966 MockDnsClientRuleList rules = CreateDefaultDnsRules();
8967 AddEsniRecordsRuleOptions options;
8968 options.delay = true;
8969 AddEsniRecordsRule("host", options, &rules);
8970 rules.emplace_back("host", dns_protocol::kTypeA, true /* secure */,
8971 MockDnsClientRule::Result(MockDnsClientRule::OK),
8972 false /* delay */);
8973 rules.emplace_back("host", dns_protocol::kTypeAAAA, true /* secure */,
8974 MockDnsClientRule::Result(MockDnsClientRule::OK),
8975 true /* delay */);
8976
8977 CreateResolver();
8978 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
8979 DnsConfigOverrides overrides;
8980 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
8981 resolver_->SetDnsConfigOverrides(overrides);
8982
8983 ResolveHostResponseHelper response(resolver_->CreateRequest(
8984 HostPortPair("host", 80), NetworkIsolationKey(), NetLogWithSource(),
8985 HostResolver::ResolveHostParameters(), request_context_.get(),
8986 host_cache_.get()));
8987
8988 // Let little enough time pass during the A and AAAA transactions that the
8989 // relative timeout will be less than the absolute timeout.
8990 base::TimeDelta a_aaaa_elapsed =
8991 0.05 * features::EsniDnsMaxAbsoluteAdditionalWait() *
8992 (100 / features::kEsniDnsMaxRelativeAdditionalWaitPercent.Get());
8993
8994 // Since the A and AAAA queries haven't both completed yet, we shouldn't time
8995 // out the ESNI query.
8996 FastForwardBy(a_aaaa_elapsed);
8997
8998 // Upon completing the AAAA transaction, the ESNI timer should start
8999 ASSERT_TRUE(
9000 dns_client_->CompleteOneDelayedTransactionOfType(DnsQueryType::AAAA));
9001
9002 base::TimeDelta relative_timeout =
9003 0.01 * features::kEsniDnsMaxRelativeAdditionalWaitPercent.Get() *
9004 a_aaaa_elapsed;
9005
9006 // After *less* than the relative timeout, the query shouldn't have concluded.
9007 FastForwardBy(relative_timeout * 0.5);
9008
9009 EXPECT_FALSE(response.complete());
9010
9011 // After more than the relative timeout, the query should conclude by aborting
9012 // the ESNI query.
9013 FastForwardBy(relative_timeout * 0.5);
9014
9015 // The task should have completed with a cancelled ESNI query.
9016 ASSERT_THAT(response.result_error(), IsOk());
9017 EXPECT_FALSE(response.request()->GetEsniResults());
9018 ASSERT_TRUE(response.request()->GetAddressResults());
9019 EXPECT_THAT(response.request()->GetAddressResults()->endpoints(),
9020 testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
9021 CreateExpected("::1", 80)));
9022}
9023
9024// Test that we still receive delayed A/AAAA records
9025// that arrive after a successful (non-delayed) ESNI transaction.
9026TEST_F(HostResolverManagerEsniTest, WaitsForSlowAccompanyingQueries) {
9027 MockDnsClientRuleList rules;
9028
9029 EsniContent esni_expectation;
9030 std::vector<IPEndPoint> expected_addresses;
9031 std::tie(esni_expectation, expected_addresses) =
9032 AddEsniRecordsRule("host", AddEsniRecordsRuleOptions(), &rules);
9033
9034 rules.emplace_back("host", dns_protocol::kTypeA, true /* secure */,
9035 MockDnsClientRule::Result(MockDnsClientRule::OK),
9036 true /* delay */);
9037 expected_addresses.push_back(CreateExpected("127.0.0.1", 80));
9038
9039 rules.emplace_back("host", dns_protocol::kTypeAAAA, true /* secure */,
9040 MockDnsClientRule::Result(MockDnsClientRule::OK),
9041 true /* delay */);
9042 expected_addresses.push_back(CreateExpected("::1", 80));
9043
9044 CreateResolver();
9045 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
9046 DnsConfigOverrides overrides;
9047 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
9048 resolver_->SetDnsConfigOverrides(overrides);
9049
9050 ResolveHostResponseHelper response(resolver_->CreateRequest(
9051 HostPortPair("host", 80), NetworkIsolationKey(), NetLogWithSource(),
9052 HostResolver::ResolveHostParameters(), request_context_.get(),
9053 host_cache_.get()));
9054
9055 // Wait quite a long time. (If the timer were erroneously to have been
9056 // started, it should expire by the end of this elapsed window.)
9057 FastForwardBy(features::EsniDnsMaxAbsoluteAdditionalWait() * 10);
9058 dns_client_->CompleteDelayedTransactions();
9059
9060 EXPECT_THAT(response.result_error(), IsOk());
9061 EXPECT_THAT(response.request()->GetEsniResults(),
9062 testing::Optional(testing::Eq(esni_expectation)));
9063 ASSERT_TRUE(response.request()->GetAddressResults());
9064 EXPECT_THAT(response.request()->GetAddressResults()->endpoints(),
9065 testing::UnorderedElementsAreArray(expected_addresses));
9066}
9067
David Van Cleveb1f45bd2019-11-14 07:36:499068TEST_F(HostResolverManagerEsniTest, RecordsSuccessMetric) {
9069 MockDnsClientRuleList rules;
9070 rules.emplace_back("host", dns_protocol::kTypeA, true /* secure */,
9071 MockDnsClientRule::Result(MockDnsClientRule::OK),
9072 false /* delay */);
9073 rules.emplace_back("host", dns_protocol::kTypeAAAA, true /* secure */,
9074 MockDnsClientRule::Result(MockDnsClientRule::OK),
9075 false /* delay */);
9076
9077 AddEsniRecordsRule("host", AddEsniRecordsRuleOptions(), &rules);
9078
9079 CreateResolver();
9080 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
9081 DnsConfigOverrides overrides;
9082 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
9083 resolver_->SetDnsConfigOverrides(overrides);
9084
9085 base::HistogramTester histograms;
9086
9087 ResolveHostResponseHelper response(resolver_->CreateRequest(
9088 HostPortPair("host", 80), NetworkIsolationKey(), NetLogWithSource(),
9089 HostResolver::ResolveHostParameters(), request_context_.get(),
9090 host_cache_.get()));
9091
9092 EXPECT_THAT(response.result_error(), IsOk());
9093
9094 histograms.ExpectTotalCount(dns_histograms::kEsniTransactionSuccessHistogram,
9095 2);
9096 histograms.ExpectBucketCount(
9097 dns_histograms::kEsniTransactionSuccessHistogram,
9098 static_cast<int>(dns_histograms::EsniSuccessOrTimeout::kSuccess), 1);
9099 histograms.ExpectBucketCount(
9100 dns_histograms::kEsniTransactionSuccessHistogram,
9101 static_cast<int>(dns_histograms::EsniSuccessOrTimeout::kStarted), 1);
9102}
9103
9104TEST_F(HostResolverManagerEsniTest, RecordsTimeoutMetric) {
9105 MockDnsClientRuleList rules;
9106 rules.emplace_back("host", dns_protocol::kTypeA, true /* secure */,
9107 MockDnsClientRule::Result(MockDnsClientRule::OK),
9108 false /* delay */);
9109 rules.emplace_back("host", dns_protocol::kTypeAAAA, true /* secure */,
9110 MockDnsClientRule::Result(MockDnsClientRule::OK),
9111 false /* delay */);
9112
9113 // Delay the ESNI record so that it times out.
9114 AddEsniRecordsRuleOptions options;
9115 options.delay = true;
9116 AddEsniRecordsRule("host", options, &rules);
9117
9118 CreateResolver();
9119 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
9120 DnsConfigOverrides overrides;
9121 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
9122 resolver_->SetDnsConfigOverrides(overrides);
9123
9124 base::HistogramTester histograms;
9125
9126 ResolveHostResponseHelper response(resolver_->CreateRequest(
9127 HostPortPair("host", 80), NetworkIsolationKey(), NetLogWithSource(),
9128 HostResolver::ResolveHostParameters(), request_context_.get(),
9129 host_cache_.get()));
9130
9131 // Give the transaction plenty of time to time out.
9132 FastForwardBy(features::EsniDnsMaxAbsoluteAdditionalWait() * 5);
9133 dns_client_->CompleteDelayedTransactions();
9134
9135 EXPECT_THAT(response.result_error(), IsOk());
9136
9137 histograms.ExpectTotalCount(dns_histograms::kEsniTransactionSuccessHistogram,
9138 2);
9139 histograms.ExpectBucketCount(
9140 dns_histograms::kEsniTransactionSuccessHistogram,
9141 static_cast<int>(dns_histograms::EsniSuccessOrTimeout::kTimeout), 1);
9142 histograms.ExpectBucketCount(
9143 dns_histograms::kEsniTransactionSuccessHistogram,
9144 static_cast<int>(dns_histograms::EsniSuccessOrTimeout::kStarted), 1);
9145}
9146
9147TEST_F(HostResolverManagerEsniTest,
9148 TimesUnspecTransactionsWhenEsniFinishesFirst) {
9149 MockDnsClientRuleList rules;
9150 rules.emplace_back("host", dns_protocol::kTypeA, true /* secure */,
9151 MockDnsClientRule::Result(MockDnsClientRule::OK),
9152 true /* delay */);
9153 rules.emplace_back("host", dns_protocol::kTypeAAAA, true /* secure */,
9154 MockDnsClientRule::Result(MockDnsClientRule::OK),
9155 false /* delay */);
9156
9157 AddEsniRecordsRuleOptions options;
9158 options.delay = true;
9159 AddEsniRecordsRule("host", options, &rules);
9160
9161 CreateResolver();
9162 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
9163 DnsConfigOverrides overrides;
9164 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
9165 resolver_->SetDnsConfigOverrides(overrides);
9166
9167 base::HistogramTester histograms;
9168
9169 ResolveHostResponseHelper response(resolver_->CreateRequest(
9170 HostPortPair("host", 80), NetworkIsolationKey(), NetLogWithSource(),
9171 HostResolver::ResolveHostParameters(), request_context_.get(),
9172 host_cache_.get()));
9173
9174 FastForwardBy(base::TimeDelta::FromMilliseconds(10));
9175 ASSERT_TRUE(
9176 dns_client_->CompleteOneDelayedTransactionOfType(DnsQueryType::ESNI));
9177 FastForwardBy(base::TimeDelta::FromMilliseconds(10));
9178 dns_client_->CompleteDelayedTransactions();
9179
9180 EXPECT_THAT(response.result_error(), IsOk());
9181
9182 histograms.ExpectTotalCount(dns_histograms::kEsniTimeHistogramForUnspecTasks,
9183 1);
9184 histograms.ExpectTotalCount(dns_histograms::kNonEsniTotalTimeHistogram, 1);
9185
9186 // Expect only a weak inequality because the timer granularity could be coarse
9187 // enough that the results end up in the same bucket.
9188 EXPECT_LE(
9189 histograms.GetAllSamples(dns_histograms::kEsniTimeHistogramForUnspecTasks)
9190 .front()
9191 .min,
9192 histograms.GetAllSamples(dns_histograms::kNonEsniTotalTimeHistogram)
9193 .front()
9194 .min);
9195
9196 // Check that the histograms recording the _difference_ in times were
9197 // updated correctly.
9198 histograms.ExpectTotalCount(
9199 dns_histograms::kEsniVersusNonEsniWithNonEsniLonger, 1);
9200 histograms.ExpectTotalCount(dns_histograms::kEsniVersusNonEsniWithEsniLonger,
9201 0);
9202}
9203
9204TEST_F(HostResolverManagerEsniTest,
9205 TimesUnspecTransactionsWhenEsniFinishesLast) {
9206 MockDnsClientRuleList rules;
9207 rules.emplace_back("host", dns_protocol::kTypeA, true /* secure */,
9208 MockDnsClientRule::Result(MockDnsClientRule::OK),
9209 false /* delay */);
9210 rules.emplace_back("host", dns_protocol::kTypeAAAA, true /* secure */,
9211 MockDnsClientRule::Result(MockDnsClientRule::OK),
9212 true /* delay */);
9213
9214 AddEsniRecordsRuleOptions options;
9215 options.delay = true;
9216 AddEsniRecordsRule("host", options, &rules);
9217
9218 CreateResolver();
9219 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
9220 DnsConfigOverrides overrides;
9221 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
9222 resolver_->SetDnsConfigOverrides(overrides);
9223
9224 base::HistogramTester histograms;
9225
9226 ResolveHostResponseHelper response(resolver_->CreateRequest(
9227 HostPortPair("host", 80), NetworkIsolationKey(), NetLogWithSource(),
9228 HostResolver::ResolveHostParameters(), request_context_.get(),
9229 host_cache_.get()));
9230
9231 base::TimeDelta absolute_timeout =
9232 features::EsniDnsMaxAbsoluteAdditionalWait();
9233
9234 // Let enough time pass during the A and AAAA transactions that the
9235 // absolute timeout will be equal to the relative timeout: in particular,
9236 // waiting an additional half of either of the timeouts' durations shouldn't
9237 // lead to the ESNI transaction being cancelled.
9238 base::TimeDelta a_aaaa_elapsed =
9239 (100.0 / features::kEsniDnsMaxRelativeAdditionalWaitPercent.Get()) *
9240 absolute_timeout;
9241
9242 FastForwardBy(a_aaaa_elapsed);
9243 ASSERT_TRUE(
9244 dns_client_->CompleteOneDelayedTransactionOfType(DnsQueryType::AAAA));
9245
9246 // Since the A and AAAA queries have only just completed, we shouldn't
9247 // have timed out the ESNI query.
9248 EXPECT_FALSE(response.complete());
9249
9250 // After half of the absolute timeout, the query should still be alive.
9251 FastForwardBy(0.5 * absolute_timeout);
9252
9253 dns_client_->CompleteDelayedTransactions();
9254
9255 EXPECT_THAT(response.result_error(), IsOk());
9256
9257 histograms.ExpectTotalCount(dns_histograms::kEsniTimeHistogramForUnspecTasks,
9258 1);
9259 histograms.ExpectTotalCount(dns_histograms::kNonEsniTotalTimeHistogram, 1);
9260
9261 // Expect only a weak inequality because the timer granularity could be coarse
9262 // enough that the results end up in the same bucket.
9263 EXPECT_LE(
9264 histograms.GetAllSamples(dns_histograms::kNonEsniTotalTimeHistogram)
9265 .front()
9266 .min,
9267 histograms.GetAllSamples(dns_histograms::kEsniTimeHistogramForUnspecTasks)
9268 .front()
9269 .min);
9270
9271 // Check that the histograms recording the difference in times were
9272 // updated correctly.
9273 histograms.ExpectTotalCount(dns_histograms::kEsniVersusNonEsniWithEsniLonger,
9274 1);
9275 histograms.ExpectTotalCount(
9276 dns_histograms::kEsniVersusNonEsniWithNonEsniLonger, 0);
9277}
9278
9279TEST_F(HostResolverManagerEsniTest, TimesEsniTransactions) {
9280 MockDnsClientRuleList rules;
9281 AddEsniRecordsRule("host", AddEsniRecordsRuleOptions(), &rules);
9282
9283 CreateResolver();
9284 UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
9285 DnsConfigOverrides overrides;
9286 overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
9287 resolver_->SetDnsConfigOverrides(overrides);
9288
9289 base::HistogramTester histograms;
9290
9291 HostResolver::ResolveHostParameters parameters;
9292 parameters.dns_query_type = DnsQueryType::ESNI;
9293 ResolveHostResponseHelper response(resolver_->CreateRequest(
9294 HostPortPair("host", 80), NetworkIsolationKey(), NetLogWithSource(),
9295 parameters, request_context_.get(), host_cache_.get()));
9296
9297 EXPECT_THAT(response.result_error(), IsOk());
9298
9299 histograms.ExpectTotalCount(dns_histograms::kEsniTimeHistogramForEsniTasks,
9300 1);
9301}
9302
[email protected]259aefa2009-08-20 22:45:009303} // namespace net