1*6777b538SAndroid Build Coastguard Worker // Copyright 2011 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef NET_DNS_MOCK_HOST_RESOLVER_H_ 6*6777b538SAndroid Build Coastguard Worker #define NET_DNS_MOCK_HOST_RESOLVER_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <stddef.h> 9*6777b538SAndroid Build Coastguard Worker #include <stdint.h> 10*6777b538SAndroid Build Coastguard Worker 11*6777b538SAndroid Build Coastguard Worker #include <list> 12*6777b538SAndroid Build Coastguard Worker #include <map> 13*6777b538SAndroid Build Coastguard Worker #include <memory> 14*6777b538SAndroid Build Coastguard Worker #include <optional> 15*6777b538SAndroid Build Coastguard Worker #include <set> 16*6777b538SAndroid Build Coastguard Worker #include <string> 17*6777b538SAndroid Build Coastguard Worker #include <string_view> 18*6777b538SAndroid Build Coastguard Worker #include <vector> 19*6777b538SAndroid Build Coastguard Worker 20*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h" 21*6777b538SAndroid Build Coastguard Worker #include "base/memory/weak_ptr.h" 22*6777b538SAndroid Build Coastguard Worker #include "base/synchronization/lock.h" 23*6777b538SAndroid Build Coastguard Worker #include "base/synchronization/waitable_event.h" 24*6777b538SAndroid Build Coastguard Worker #include "base/thread_annotations.h" 25*6777b538SAndroid Build Coastguard Worker #include "base/threading/thread_checker.h" 26*6777b538SAndroid Build Coastguard Worker #include "net/base/address_family.h" 27*6777b538SAndroid Build Coastguard Worker #include "net/base/address_list.h" 28*6777b538SAndroid Build Coastguard Worker #include "net/base/completion_once_callback.h" 29*6777b538SAndroid Build Coastguard Worker #include "net/base/host_port_pair.h" 30*6777b538SAndroid Build Coastguard Worker #include "net/base/net_errors.h" 31*6777b538SAndroid Build Coastguard Worker #include "net/base/network_anonymization_key.h" 32*6777b538SAndroid Build Coastguard Worker #include "net/dns/host_resolver.h" 33*6777b538SAndroid Build Coastguard Worker #include "net/dns/host_resolver_proc.h" 34*6777b538SAndroid Build Coastguard Worker #include "net/dns/public/dns_query_type.h" 35*6777b538SAndroid Build Coastguard Worker #include "net/dns/public/host_resolver_results.h" 36*6777b538SAndroid Build Coastguard Worker #include "net/dns/public/host_resolver_source.h" 37*6777b538SAndroid Build Coastguard Worker #include "net/dns/public/mdns_listener_update_type.h" 38*6777b538SAndroid Build Coastguard Worker #include "net/dns/public/secure_dns_policy.h" 39*6777b538SAndroid Build Coastguard Worker #include "net/log/net_log_with_source.h" 40*6777b538SAndroid Build Coastguard Worker #include "third_party/abseil-cpp/absl/types/variant.h" 41*6777b538SAndroid Build Coastguard Worker #include "url/scheme_host_port.h" 42*6777b538SAndroid Build Coastguard Worker 43*6777b538SAndroid Build Coastguard Worker namespace base { 44*6777b538SAndroid Build Coastguard Worker class TickClock; 45*6777b538SAndroid Build Coastguard Worker } // namespace base 46*6777b538SAndroid Build Coastguard Worker 47*6777b538SAndroid Build Coastguard Worker namespace net { 48*6777b538SAndroid Build Coastguard Worker 49*6777b538SAndroid Build Coastguard Worker class HostCache; 50*6777b538SAndroid Build Coastguard Worker class IPEndPoint; 51*6777b538SAndroid Build Coastguard Worker class URLRequestContext; 52*6777b538SAndroid Build Coastguard Worker 53*6777b538SAndroid Build Coastguard Worker // Fills `ip_endpoints` with a socket address for `host_list` which should be a 54*6777b538SAndroid Build Coastguard Worker // comma-separated list of IPv4 or IPv6 literal(s) without enclosing brackets. 55*6777b538SAndroid Build Coastguard Worker int ParseAddressList(std::string_view host_list, 56*6777b538SAndroid Build Coastguard Worker std::vector<net::IPEndPoint>* ip_endpoints); 57*6777b538SAndroid Build Coastguard Worker 58*6777b538SAndroid Build Coastguard Worker // In most cases, it is important that unit tests avoid relying on making actual 59*6777b538SAndroid Build Coastguard Worker // DNS queries since the resulting tests can be flaky, especially if the network 60*6777b538SAndroid Build Coastguard Worker // is unreliable for some reason. To simplify writing tests that avoid making 61*6777b538SAndroid Build Coastguard Worker // actual DNS queries, pass a MockHostResolver as the HostResolver dependency. 62*6777b538SAndroid Build Coastguard Worker // The socket addresses returned can be configured using the 63*6777b538SAndroid Build Coastguard Worker // MockHostResolverBase::RuleResolver: 64*6777b538SAndroid Build Coastguard Worker // 65*6777b538SAndroid Build Coastguard Worker // host_resolver->rules()->AddRule("foo.com", "1.2.3.4"); 66*6777b538SAndroid Build Coastguard Worker // host_resolver->rules()->AddRule("bar.com", "2.3.4.5"); 67*6777b538SAndroid Build Coastguard Worker // 68*6777b538SAndroid Build Coastguard Worker // The above rules define a static mapping from hostnames to IP address 69*6777b538SAndroid Build Coastguard Worker // literals. The first parameter to AddRule specifies a host pattern to match 70*6777b538SAndroid Build Coastguard Worker // against, and the second parameter indicates what IP address should be used to 71*6777b538SAndroid Build Coastguard Worker // replace the given hostname. So, the following is also supported: 72*6777b538SAndroid Build Coastguard Worker // 73*6777b538SAndroid Build Coastguard Worker // host_mapper->AddRule("*.com", "127.0.0.1"); 74*6777b538SAndroid Build Coastguard Worker // 75*6777b538SAndroid Build Coastguard Worker // For more advanced matching, the first parameter may be replaced with a 76*6777b538SAndroid Build Coastguard Worker // MockHostResolverBase::RuleResolver::RuleKey. For more advanced responses, the 77*6777b538SAndroid Build Coastguard Worker // second parameter may be replaced with a 78*6777b538SAndroid Build Coastguard Worker // MockHostResolverBase::RuleResolver::RuleResultOrError. 79*6777b538SAndroid Build Coastguard Worker // 80*6777b538SAndroid Build Coastguard Worker // MockHostResolvers may optionally be created with a default result: 81*6777b538SAndroid Build Coastguard Worker // 82*6777b538SAndroid Build Coastguard Worker // MockHostResolver(ERR_NAME_NOT_RESOLVED); 83*6777b538SAndroid Build Coastguard Worker // MockHostResolver(AddressList(ip_endpoint)); 84*6777b538SAndroid Build Coastguard Worker // MockHostResolver(MockHostResolverBase::RuleResolver::GetLocalhostResult()); 85*6777b538SAndroid Build Coastguard Worker // 86*6777b538SAndroid Build Coastguard Worker // If no default result is given, every resolve request must match a configured 87*6777b538SAndroid Build Coastguard Worker // rule, otherwise DCHECKs will fire. 88*6777b538SAndroid Build Coastguard Worker 89*6777b538SAndroid Build Coastguard Worker // Base class shared by MockHostResolver and MockCachingHostResolver. 90*6777b538SAndroid Build Coastguard Worker class MockHostResolverBase 91*6777b538SAndroid Build Coastguard Worker : public HostResolver, 92*6777b538SAndroid Build Coastguard Worker public base::SupportsWeakPtr<MockHostResolverBase> { 93*6777b538SAndroid Build Coastguard Worker private: 94*6777b538SAndroid Build Coastguard Worker class RequestImpl; 95*6777b538SAndroid Build Coastguard Worker class ProbeRequestImpl; 96*6777b538SAndroid Build Coastguard Worker class MdnsListenerImpl; 97*6777b538SAndroid Build Coastguard Worker 98*6777b538SAndroid Build Coastguard Worker public: 99*6777b538SAndroid Build Coastguard Worker class RuleResolver { 100*6777b538SAndroid Build Coastguard Worker public: 101*6777b538SAndroid Build Coastguard Worker struct RuleKey { 102*6777b538SAndroid Build Coastguard Worker struct WildcardScheme : absl::monostate {}; 103*6777b538SAndroid Build Coastguard Worker struct NoScheme : absl::monostate {}; 104*6777b538SAndroid Build Coastguard Worker using Scheme = std::string; 105*6777b538SAndroid Build Coastguard Worker 106*6777b538SAndroid Build Coastguard Worker RuleKey(); 107*6777b538SAndroid Build Coastguard Worker ~RuleKey(); 108*6777b538SAndroid Build Coastguard Worker 109*6777b538SAndroid Build Coastguard Worker RuleKey(const RuleKey&); 110*6777b538SAndroid Build Coastguard Worker RuleKey& operator=(const RuleKey&); 111*6777b538SAndroid Build Coastguard Worker RuleKey(RuleKey&&); 112*6777b538SAndroid Build Coastguard Worker RuleKey& operator=(RuleKey&&); 113*6777b538SAndroid Build Coastguard Worker GetTupleRuleKey114*6777b538SAndroid Build Coastguard Worker auto GetTuple() const { 115*6777b538SAndroid Build Coastguard Worker return std::tie(scheme, hostname_pattern, port, query_type, 116*6777b538SAndroid Build Coastguard Worker query_source); 117*6777b538SAndroid Build Coastguard Worker } 118*6777b538SAndroid Build Coastguard Worker 119*6777b538SAndroid Build Coastguard Worker bool operator<(const RuleKey& other) const { 120*6777b538SAndroid Build Coastguard Worker return GetTuple() < other.GetTuple(); 121*6777b538SAndroid Build Coastguard Worker } 122*6777b538SAndroid Build Coastguard Worker 123*6777b538SAndroid Build Coastguard Worker // If `WildcardScheme`, scheme is wildcard and any query will match, 124*6777b538SAndroid Build Coastguard Worker // whether made with url::SchemeHostPort or HostPortPair. If `NoScheme`, 125*6777b538SAndroid Build Coastguard Worker // queries will only match if made using HostPortPair. Else, queries will 126*6777b538SAndroid Build Coastguard Worker // only match if made using url::SchemeHostPort with matching scheme 127*6777b538SAndroid Build Coastguard Worker // value. 128*6777b538SAndroid Build Coastguard Worker absl::variant<WildcardScheme, NoScheme, Scheme> scheme = WildcardScheme(); 129*6777b538SAndroid Build Coastguard Worker 130*6777b538SAndroid Build Coastguard Worker // Pattern matched via `base::MatchPattern()`. 131*6777b538SAndroid Build Coastguard Worker std::string hostname_pattern = "*"; 132*6777b538SAndroid Build Coastguard Worker 133*6777b538SAndroid Build Coastguard Worker // `nullopt` represents wildcard and all queries will match. 134*6777b538SAndroid Build Coastguard Worker std::optional<uint16_t> port; 135*6777b538SAndroid Build Coastguard Worker std::optional<DnsQueryType> query_type; 136*6777b538SAndroid Build Coastguard Worker std::optional<HostResolverSource> query_source; 137*6777b538SAndroid Build Coastguard Worker }; 138*6777b538SAndroid Build Coastguard Worker 139*6777b538SAndroid Build Coastguard Worker struct RuleResult { 140*6777b538SAndroid Build Coastguard Worker RuleResult(); 141*6777b538SAndroid Build Coastguard Worker explicit RuleResult( 142*6777b538SAndroid Build Coastguard Worker std::vector<HostResolverEndpointResult> endpoints, 143*6777b538SAndroid Build Coastguard Worker std::set<std::string> aliases = std::set<std::string>()); 144*6777b538SAndroid Build Coastguard Worker 145*6777b538SAndroid Build Coastguard Worker ~RuleResult(); 146*6777b538SAndroid Build Coastguard Worker 147*6777b538SAndroid Build Coastguard Worker RuleResult(const RuleResult&); 148*6777b538SAndroid Build Coastguard Worker RuleResult& operator=(const RuleResult&); 149*6777b538SAndroid Build Coastguard Worker RuleResult(RuleResult&&); 150*6777b538SAndroid Build Coastguard Worker RuleResult& operator=(RuleResult&&); 151*6777b538SAndroid Build Coastguard Worker 152*6777b538SAndroid Build Coastguard Worker std::vector<HostResolverEndpointResult> endpoints; 153*6777b538SAndroid Build Coastguard Worker std::set<std::string> aliases; 154*6777b538SAndroid Build Coastguard Worker }; 155*6777b538SAndroid Build Coastguard Worker 156*6777b538SAndroid Build Coastguard Worker using ErrorResult = Error; 157*6777b538SAndroid Build Coastguard Worker using RuleResultOrError = absl::variant<RuleResult, ErrorResult>; 158*6777b538SAndroid Build Coastguard Worker 159*6777b538SAndroid Build Coastguard Worker // If `default_result` is nullopt, every resolve must match an added rule. 160*6777b538SAndroid Build Coastguard Worker explicit RuleResolver( 161*6777b538SAndroid Build Coastguard Worker std::optional<RuleResultOrError> default_result = std::nullopt); 162*6777b538SAndroid Build Coastguard Worker ~RuleResolver(); 163*6777b538SAndroid Build Coastguard Worker 164*6777b538SAndroid Build Coastguard Worker RuleResolver(const RuleResolver&); 165*6777b538SAndroid Build Coastguard Worker RuleResolver& operator=(const RuleResolver&); 166*6777b538SAndroid Build Coastguard Worker RuleResolver(RuleResolver&&); 167*6777b538SAndroid Build Coastguard Worker RuleResolver& operator=(RuleResolver&&); 168*6777b538SAndroid Build Coastguard Worker 169*6777b538SAndroid Build Coastguard Worker const RuleResultOrError& Resolve(const Host& request_endpoint, 170*6777b538SAndroid Build Coastguard Worker DnsQueryTypeSet request_types, 171*6777b538SAndroid Build Coastguard Worker HostResolverSource request_source) const; 172*6777b538SAndroid Build Coastguard Worker 173*6777b538SAndroid Build Coastguard Worker void ClearRules(); 174*6777b538SAndroid Build Coastguard Worker 175*6777b538SAndroid Build Coastguard Worker static RuleResultOrError GetLocalhostResult(); 176*6777b538SAndroid Build Coastguard Worker 177*6777b538SAndroid Build Coastguard Worker void AddRule(RuleKey key, RuleResultOrError result); 178*6777b538SAndroid Build Coastguard Worker void AddRule(RuleKey key, std::string_view ip_literal); 179*6777b538SAndroid Build Coastguard Worker 180*6777b538SAndroid Build Coastguard Worker void AddRule(std::string_view hostname_pattern, RuleResultOrError result); 181*6777b538SAndroid Build Coastguard Worker void AddRule(std::string_view hostname_pattern, 182*6777b538SAndroid Build Coastguard Worker std::string_view ip_literal); 183*6777b538SAndroid Build Coastguard Worker 184*6777b538SAndroid Build Coastguard Worker void AddRule(std::string_view hostname_pattern, Error error); 185*6777b538SAndroid Build Coastguard Worker 186*6777b538SAndroid Build Coastguard Worker // Legacy rule creation. Only for compatibility with tests written for use 187*6777b538SAndroid Build Coastguard Worker // with RuleBasedHostResolverProc. New code should use the AddRule() calls 188*6777b538SAndroid Build Coastguard Worker // above. 189*6777b538SAndroid Build Coastguard Worker void AddIPLiteralRule(std::string_view hostname_pattern, 190*6777b538SAndroid Build Coastguard Worker std::string_view ip_literal, 191*6777b538SAndroid Build Coastguard Worker std::string_view canonical_name); 192*6777b538SAndroid Build Coastguard Worker void AddIPLiteralRuleWithDnsAliases(std::string_view hostname_pattern, 193*6777b538SAndroid Build Coastguard Worker std::string_view ip_literal, 194*6777b538SAndroid Build Coastguard Worker std::vector<std::string> dns_aliases); 195*6777b538SAndroid Build Coastguard Worker void AddIPLiteralRuleWithDnsAliases(std::string_view hostname_pattern, 196*6777b538SAndroid Build Coastguard Worker std::string_view ip_literal, 197*6777b538SAndroid Build Coastguard Worker std::set<std::string> dns_aliases); 198*6777b538SAndroid Build Coastguard Worker void AddSimulatedFailure(std::string_view hostname_pattern); 199*6777b538SAndroid Build Coastguard Worker void AddSimulatedTimeoutFailure(std::string_view hostname_pattern); 200*6777b538SAndroid Build Coastguard Worker void AddRuleWithFlags(std::string_view host_pattern, 201*6777b538SAndroid Build Coastguard Worker std::string_view ip_literal, 202*6777b538SAndroid Build Coastguard Worker HostResolverFlags flags, 203*6777b538SAndroid Build Coastguard Worker std::vector<std::string> dns_aliases = {}); 204*6777b538SAndroid Build Coastguard Worker 205*6777b538SAndroid Build Coastguard Worker private: 206*6777b538SAndroid Build Coastguard Worker std::map<RuleKey, RuleResultOrError> rules_; 207*6777b538SAndroid Build Coastguard Worker std::optional<RuleResultOrError> default_result_; 208*6777b538SAndroid Build Coastguard Worker }; 209*6777b538SAndroid Build Coastguard Worker 210*6777b538SAndroid Build Coastguard Worker using RequestMap = std::map<size_t, RequestImpl*>; 211*6777b538SAndroid Build Coastguard Worker 212*6777b538SAndroid Build Coastguard Worker // A set of states in MockHostResolver. This is used to observe the internal 213*6777b538SAndroid Build Coastguard Worker // state variables after destructing a MockHostResolver. 214*6777b538SAndroid Build Coastguard Worker class State : public base::RefCounted<State> { 215*6777b538SAndroid Build Coastguard Worker public: 216*6777b538SAndroid Build Coastguard Worker State(); 217*6777b538SAndroid Build Coastguard Worker has_pending_requests()218*6777b538SAndroid Build Coastguard Worker bool has_pending_requests() const { return !requests_.empty(); } IsDohProbeRunning()219*6777b538SAndroid Build Coastguard Worker bool IsDohProbeRunning() const { return !!doh_probe_request_; } num_resolve()220*6777b538SAndroid Build Coastguard Worker size_t num_resolve() const { return num_resolve_; } num_resolve_from_cache()221*6777b538SAndroid Build Coastguard Worker size_t num_resolve_from_cache() const { return num_resolve_from_cache_; } num_non_local_resolves()222*6777b538SAndroid Build Coastguard Worker size_t num_non_local_resolves() const { return num_non_local_resolves_; } 223*6777b538SAndroid Build Coastguard Worker mutable_requests()224*6777b538SAndroid Build Coastguard Worker RequestMap& mutable_requests() { return requests_; } IncrementNumResolve()225*6777b538SAndroid Build Coastguard Worker void IncrementNumResolve() { ++num_resolve_; } IncrementNumResolveFromCache()226*6777b538SAndroid Build Coastguard Worker void IncrementNumResolveFromCache() { ++num_resolve_from_cache_; } IncrementNumNonLocalResolves()227*6777b538SAndroid Build Coastguard Worker void IncrementNumNonLocalResolves() { ++num_non_local_resolves_; } ClearDohProbeRequest()228*6777b538SAndroid Build Coastguard Worker void ClearDohProbeRequest() { doh_probe_request_ = nullptr; } ClearDohProbeRequestIfMatching(ProbeRequestImpl * request)229*6777b538SAndroid Build Coastguard Worker void ClearDohProbeRequestIfMatching(ProbeRequestImpl* request) { 230*6777b538SAndroid Build Coastguard Worker if (request == doh_probe_request_) { 231*6777b538SAndroid Build Coastguard Worker doh_probe_request_ = nullptr; 232*6777b538SAndroid Build Coastguard Worker } 233*6777b538SAndroid Build Coastguard Worker } set_doh_probe_request(ProbeRequestImpl * request)234*6777b538SAndroid Build Coastguard Worker void set_doh_probe_request(ProbeRequestImpl* request) { 235*6777b538SAndroid Build Coastguard Worker DCHECK(request); 236*6777b538SAndroid Build Coastguard Worker DCHECK(!doh_probe_request_); 237*6777b538SAndroid Build Coastguard Worker doh_probe_request_ = request; 238*6777b538SAndroid Build Coastguard Worker } 239*6777b538SAndroid Build Coastguard Worker 240*6777b538SAndroid Build Coastguard Worker private: 241*6777b538SAndroid Build Coastguard Worker friend class RefCounted<State>; 242*6777b538SAndroid Build Coastguard Worker 243*6777b538SAndroid Build Coastguard Worker ~State(); 244*6777b538SAndroid Build Coastguard Worker 245*6777b538SAndroid Build Coastguard Worker // Maintain non-owning pointers to outstanding requests and listeners to 246*6777b538SAndroid Build Coastguard Worker // allow completing/notifying them. The objects are owned by callers, and 247*6777b538SAndroid Build Coastguard Worker // should be removed from |this| on destruction by calling DetachRequest() 248*6777b538SAndroid Build Coastguard Worker // or RemoveCancelledListener(). 249*6777b538SAndroid Build Coastguard Worker RequestMap requests_; 250*6777b538SAndroid Build Coastguard Worker raw_ptr<ProbeRequestImpl> doh_probe_request_ = nullptr; 251*6777b538SAndroid Build Coastguard Worker size_t num_resolve_ = 0; 252*6777b538SAndroid Build Coastguard Worker size_t num_resolve_from_cache_ = 0; 253*6777b538SAndroid Build Coastguard Worker size_t num_non_local_resolves_ = 0; 254*6777b538SAndroid Build Coastguard Worker }; 255*6777b538SAndroid Build Coastguard Worker 256*6777b538SAndroid Build Coastguard Worker MockHostResolverBase(const MockHostResolverBase&) = delete; 257*6777b538SAndroid Build Coastguard Worker MockHostResolverBase& operator=(const MockHostResolverBase&) = delete; 258*6777b538SAndroid Build Coastguard Worker 259*6777b538SAndroid Build Coastguard Worker ~MockHostResolverBase() override; 260*6777b538SAndroid Build Coastguard Worker rules()261*6777b538SAndroid Build Coastguard Worker RuleResolver* rules() { return &rule_resolver_; } 262*6777b538SAndroid Build Coastguard Worker state()263*6777b538SAndroid Build Coastguard Worker scoped_refptr<const State> state() const { return state_; } 264*6777b538SAndroid Build Coastguard Worker 265*6777b538SAndroid Build Coastguard Worker // Controls whether resolutions complete synchronously or asynchronously. set_synchronous_mode(bool is_synchronous)266*6777b538SAndroid Build Coastguard Worker void set_synchronous_mode(bool is_synchronous) { 267*6777b538SAndroid Build Coastguard Worker synchronous_mode_ = is_synchronous; 268*6777b538SAndroid Build Coastguard Worker } 269*6777b538SAndroid Build Coastguard Worker 270*6777b538SAndroid Build Coastguard Worker // Asynchronous requests are automatically resolved by default. 271*6777b538SAndroid Build Coastguard Worker // If set_ondemand_mode() is set then Resolve() returns IO_PENDING and 272*6777b538SAndroid Build Coastguard Worker // ResolveAllPending() must be explicitly invoked to resolve all requests 273*6777b538SAndroid Build Coastguard Worker // that are pending. set_ondemand_mode(bool is_ondemand)274*6777b538SAndroid Build Coastguard Worker void set_ondemand_mode(bool is_ondemand) { 275*6777b538SAndroid Build Coastguard Worker ondemand_mode_ = is_ondemand; 276*6777b538SAndroid Build Coastguard Worker } 277*6777b538SAndroid Build Coastguard Worker 278*6777b538SAndroid Build Coastguard Worker // HostResolver methods: 279*6777b538SAndroid Build Coastguard Worker void OnShutdown() override; 280*6777b538SAndroid Build Coastguard Worker std::unique_ptr<ResolveHostRequest> CreateRequest( 281*6777b538SAndroid Build Coastguard Worker url::SchemeHostPort host, 282*6777b538SAndroid Build Coastguard Worker NetworkAnonymizationKey network_anonymization_key, 283*6777b538SAndroid Build Coastguard Worker NetLogWithSource net_log, 284*6777b538SAndroid Build Coastguard Worker std::optional<ResolveHostParameters> optional_parameters) override; 285*6777b538SAndroid Build Coastguard Worker std::unique_ptr<ResolveHostRequest> CreateRequest( 286*6777b538SAndroid Build Coastguard Worker const HostPortPair& host, 287*6777b538SAndroid Build Coastguard Worker const NetworkAnonymizationKey& network_anonymization_key, 288*6777b538SAndroid Build Coastguard Worker const NetLogWithSource& net_log, 289*6777b538SAndroid Build Coastguard Worker const std::optional<ResolveHostParameters>& optional_parameters) override; 290*6777b538SAndroid Build Coastguard Worker std::unique_ptr<ServiceEndpointRequest> CreateServiceEndpointRequest( 291*6777b538SAndroid Build Coastguard Worker Host host, 292*6777b538SAndroid Build Coastguard Worker NetworkAnonymizationKey network_anonymization_key, 293*6777b538SAndroid Build Coastguard Worker NetLogWithSource net_log, 294*6777b538SAndroid Build Coastguard Worker ResolveHostParameters parameters) override; 295*6777b538SAndroid Build Coastguard Worker std::unique_ptr<ProbeRequest> CreateDohProbeRequest() override; 296*6777b538SAndroid Build Coastguard Worker std::unique_ptr<MdnsListener> CreateMdnsListener( 297*6777b538SAndroid Build Coastguard Worker const HostPortPair& host, 298*6777b538SAndroid Build Coastguard Worker DnsQueryType query_type) override; 299*6777b538SAndroid Build Coastguard Worker HostCache* GetHostCache() override; SetRequestContext(URLRequestContext * request_context)300*6777b538SAndroid Build Coastguard Worker void SetRequestContext(URLRequestContext* request_context) override {} 301*6777b538SAndroid Build Coastguard Worker 302*6777b538SAndroid Build Coastguard Worker // Preloads the cache with what would currently be the result of a request 303*6777b538SAndroid Build Coastguard Worker // with the given parameters. Returns the net error of the cached result. 304*6777b538SAndroid Build Coastguard Worker int LoadIntoCache( 305*6777b538SAndroid Build Coastguard Worker absl::variant<url::SchemeHostPort, HostPortPair> endpoint, 306*6777b538SAndroid Build Coastguard Worker const NetworkAnonymizationKey& network_anonymization_key, 307*6777b538SAndroid Build Coastguard Worker const std::optional<ResolveHostParameters>& optional_parameters); 308*6777b538SAndroid Build Coastguard Worker int LoadIntoCache( 309*6777b538SAndroid Build Coastguard Worker const Host& endpoint, 310*6777b538SAndroid Build Coastguard Worker const NetworkAnonymizationKey& network_anonymization_key, 311*6777b538SAndroid Build Coastguard Worker const std::optional<ResolveHostParameters>& optional_parameters); 312*6777b538SAndroid Build Coastguard Worker 313*6777b538SAndroid Build Coastguard Worker // Returns true if there are pending requests that can be resolved by invoking 314*6777b538SAndroid Build Coastguard Worker // ResolveAllPending(). has_pending_requests()315*6777b538SAndroid Build Coastguard Worker bool has_pending_requests() const { return state_->has_pending_requests(); } 316*6777b538SAndroid Build Coastguard Worker 317*6777b538SAndroid Build Coastguard Worker // Resolves all pending requests. It is only valid to invoke this if 318*6777b538SAndroid Build Coastguard Worker // set_ondemand_mode was set before. The requests are resolved asynchronously, 319*6777b538SAndroid Build Coastguard Worker // after this call returns. 320*6777b538SAndroid Build Coastguard Worker void ResolveAllPending(); 321*6777b538SAndroid Build Coastguard Worker 322*6777b538SAndroid Build Coastguard Worker // Each request is assigned an ID when started and stored with the resolver 323*6777b538SAndroid Build Coastguard Worker // for async resolution, starting with 1. IDs are not reused. Once a request 324*6777b538SAndroid Build Coastguard Worker // completes, it is destroyed, and can no longer be accessed. 325*6777b538SAndroid Build Coastguard Worker 326*6777b538SAndroid Build Coastguard Worker // Returns the ID of the most recently started still-active request. Zero if 327*6777b538SAndroid Build Coastguard Worker // no requests are currently active. 328*6777b538SAndroid Build Coastguard Worker size_t last_id(); 329*6777b538SAndroid Build Coastguard Worker 330*6777b538SAndroid Build Coastguard Worker // Resolve request stored in |requests_|. Pass rv to callback. 331*6777b538SAndroid Build Coastguard Worker void ResolveNow(size_t id); 332*6777b538SAndroid Build Coastguard Worker 333*6777b538SAndroid Build Coastguard Worker // Detach cancelled request. 334*6777b538SAndroid Build Coastguard Worker void DetachRequest(size_t id); 335*6777b538SAndroid Build Coastguard Worker 336*6777b538SAndroid Build Coastguard Worker // Returns the hostname of the request with the given id. 337*6777b538SAndroid Build Coastguard Worker std::string_view request_host(size_t id); 338*6777b538SAndroid Build Coastguard Worker 339*6777b538SAndroid Build Coastguard Worker // Returns the priority of the request with the given id. 340*6777b538SAndroid Build Coastguard Worker RequestPriority request_priority(size_t id); 341*6777b538SAndroid Build Coastguard Worker 342*6777b538SAndroid Build Coastguard Worker // Returns NetworkAnonymizationKey of the request with the given id. 343*6777b538SAndroid Build Coastguard Worker const NetworkAnonymizationKey& request_network_anonymization_key(size_t id); 344*6777b538SAndroid Build Coastguard Worker 345*6777b538SAndroid Build Coastguard Worker // Like ResolveNow, but doesn't take an ID. DCHECKs if there's more than one 346*6777b538SAndroid Build Coastguard Worker // pending request. 347*6777b538SAndroid Build Coastguard Worker void ResolveOnlyRequestNow(); 348*6777b538SAndroid Build Coastguard Worker 349*6777b538SAndroid Build Coastguard Worker // The number of times that Resolve() has been called. num_resolve()350*6777b538SAndroid Build Coastguard Worker size_t num_resolve() const { return state_->num_resolve(); } 351*6777b538SAndroid Build Coastguard Worker 352*6777b538SAndroid Build Coastguard Worker // The number of times that ResolveFromCache() has been called. num_resolve_from_cache()353*6777b538SAndroid Build Coastguard Worker size_t num_resolve_from_cache() const { 354*6777b538SAndroid Build Coastguard Worker return state_->num_resolve_from_cache(); 355*6777b538SAndroid Build Coastguard Worker } 356*6777b538SAndroid Build Coastguard Worker 357*6777b538SAndroid Build Coastguard Worker // The number of times resolve was attempted non-locally. num_non_local_resolves()358*6777b538SAndroid Build Coastguard Worker size_t num_non_local_resolves() const { 359*6777b538SAndroid Build Coastguard Worker return state_->num_non_local_resolves(); 360*6777b538SAndroid Build Coastguard Worker } 361*6777b538SAndroid Build Coastguard Worker 362*6777b538SAndroid Build Coastguard Worker // Returns the RequestPriority of the last call to Resolve() (or 363*6777b538SAndroid Build Coastguard Worker // DEFAULT_PRIORITY if Resolve() hasn't been called yet). last_request_priority()364*6777b538SAndroid Build Coastguard Worker RequestPriority last_request_priority() const { 365*6777b538SAndroid Build Coastguard Worker return last_request_priority_; 366*6777b538SAndroid Build Coastguard Worker } 367*6777b538SAndroid Build Coastguard Worker 368*6777b538SAndroid Build Coastguard Worker // Returns the NetworkAnonymizationKey passed in to the last call to Resolve() 369*6777b538SAndroid Build Coastguard Worker // (or std::nullopt if Resolve() hasn't been called yet). 370*6777b538SAndroid Build Coastguard Worker const std::optional<NetworkAnonymizationKey>& last_request_network_anonymization_key()371*6777b538SAndroid Build Coastguard Worker last_request_network_anonymization_key() { 372*6777b538SAndroid Build Coastguard Worker return last_request_network_anonymization_key_; 373*6777b538SAndroid Build Coastguard Worker } 374*6777b538SAndroid Build Coastguard Worker 375*6777b538SAndroid Build Coastguard Worker // Returns the SecureDnsPolicy of the last call to Resolve() (or 376*6777b538SAndroid Build Coastguard Worker // std::nullopt if Resolve() hasn't been called yet). last_secure_dns_policy()377*6777b538SAndroid Build Coastguard Worker SecureDnsPolicy last_secure_dns_policy() const { 378*6777b538SAndroid Build Coastguard Worker return last_secure_dns_policy_; 379*6777b538SAndroid Build Coastguard Worker } 380*6777b538SAndroid Build Coastguard Worker IsDohProbeRunning()381*6777b538SAndroid Build Coastguard Worker bool IsDohProbeRunning() const { return state_->IsDohProbeRunning(); } 382*6777b538SAndroid Build Coastguard Worker 383*6777b538SAndroid Build Coastguard Worker void TriggerMdnsListeners(const HostPortPair& host, 384*6777b538SAndroid Build Coastguard Worker DnsQueryType query_type, 385*6777b538SAndroid Build Coastguard Worker MdnsListenerUpdateType update_type, 386*6777b538SAndroid Build Coastguard Worker const IPEndPoint& address_result); 387*6777b538SAndroid Build Coastguard Worker void TriggerMdnsListeners(const HostPortPair& host, 388*6777b538SAndroid Build Coastguard Worker DnsQueryType query_type, 389*6777b538SAndroid Build Coastguard Worker MdnsListenerUpdateType update_type, 390*6777b538SAndroid Build Coastguard Worker const std::vector<std::string>& text_result); 391*6777b538SAndroid Build Coastguard Worker void TriggerMdnsListeners(const HostPortPair& host, 392*6777b538SAndroid Build Coastguard Worker DnsQueryType query_type, 393*6777b538SAndroid Build Coastguard Worker MdnsListenerUpdateType update_type, 394*6777b538SAndroid Build Coastguard Worker const HostPortPair& host_result); 395*6777b538SAndroid Build Coastguard Worker void TriggerMdnsListeners(const HostPortPair& host, 396*6777b538SAndroid Build Coastguard Worker DnsQueryType query_type, 397*6777b538SAndroid Build Coastguard Worker MdnsListenerUpdateType update_type); 398*6777b538SAndroid Build Coastguard Worker set_tick_clock(const base::TickClock * tick_clock)399*6777b538SAndroid Build Coastguard Worker void set_tick_clock(const base::TickClock* tick_clock) { 400*6777b538SAndroid Build Coastguard Worker tick_clock_ = tick_clock; 401*6777b538SAndroid Build Coastguard Worker } 402*6777b538SAndroid Build Coastguard Worker 403*6777b538SAndroid Build Coastguard Worker private: 404*6777b538SAndroid Build Coastguard Worker friend class MockHostResolver; 405*6777b538SAndroid Build Coastguard Worker friend class MockCachingHostResolver; 406*6777b538SAndroid Build Coastguard Worker friend class MockHostResolverFactory; 407*6777b538SAndroid Build Coastguard Worker 408*6777b538SAndroid Build Coastguard Worker // Returns the request with the given id. 409*6777b538SAndroid Build Coastguard Worker RequestImpl* request(size_t id); 410*6777b538SAndroid Build Coastguard Worker 411*6777b538SAndroid Build Coastguard Worker // If > 0, |cache_invalidation_num| is the number of times a cached entry can 412*6777b538SAndroid Build Coastguard Worker // be read before it invalidates itself. Useful to force cache expiration 413*6777b538SAndroid Build Coastguard Worker // scenarios. 414*6777b538SAndroid Build Coastguard Worker MockHostResolverBase(bool use_caching, 415*6777b538SAndroid Build Coastguard Worker int cache_invalidation_num, 416*6777b538SAndroid Build Coastguard Worker RuleResolver rule_resolver); 417*6777b538SAndroid Build Coastguard Worker 418*6777b538SAndroid Build Coastguard Worker // Handle resolution for |request|. Expected to be called only the RequestImpl 419*6777b538SAndroid Build Coastguard Worker // object itself. 420*6777b538SAndroid Build Coastguard Worker int Resolve(RequestImpl* request); 421*6777b538SAndroid Build Coastguard Worker 422*6777b538SAndroid Build Coastguard Worker // Resolve as IP or from |cache_| return cached error or 423*6777b538SAndroid Build Coastguard Worker // DNS_CACHE_MISS if failed. 424*6777b538SAndroid Build Coastguard Worker int ResolveFromIPLiteralOrCache( 425*6777b538SAndroid Build Coastguard Worker const Host& endpoint, 426*6777b538SAndroid Build Coastguard Worker const NetworkAnonymizationKey& network_anonymization_key, 427*6777b538SAndroid Build Coastguard Worker DnsQueryType dns_query_type, 428*6777b538SAndroid Build Coastguard Worker HostResolverFlags flags, 429*6777b538SAndroid Build Coastguard Worker HostResolverSource source, 430*6777b538SAndroid Build Coastguard Worker HostResolver::ResolveHostParameters::CacheUsage cache_usage, 431*6777b538SAndroid Build Coastguard Worker std::vector<HostResolverEndpointResult>* out_endpoints, 432*6777b538SAndroid Build Coastguard Worker std::set<std::string>* out_aliases, 433*6777b538SAndroid Build Coastguard Worker std::optional<HostCache::EntryStaleness>* out_stale_info); 434*6777b538SAndroid Build Coastguard Worker int DoSynchronousResolution(RequestImpl& request); 435*6777b538SAndroid Build Coastguard Worker 436*6777b538SAndroid Build Coastguard Worker void AddListener(MdnsListenerImpl* listener); 437*6777b538SAndroid Build Coastguard Worker void RemoveCancelledListener(MdnsListenerImpl* listener); 438*6777b538SAndroid Build Coastguard Worker 439*6777b538SAndroid Build Coastguard Worker RequestPriority last_request_priority_ = DEFAULT_PRIORITY; 440*6777b538SAndroid Build Coastguard Worker std::optional<NetworkAnonymizationKey> 441*6777b538SAndroid Build Coastguard Worker last_request_network_anonymization_key_; 442*6777b538SAndroid Build Coastguard Worker SecureDnsPolicy last_secure_dns_policy_ = SecureDnsPolicy::kAllow; 443*6777b538SAndroid Build Coastguard Worker bool synchronous_mode_ = false; 444*6777b538SAndroid Build Coastguard Worker bool ondemand_mode_ = false; 445*6777b538SAndroid Build Coastguard Worker RuleResolver rule_resolver_; 446*6777b538SAndroid Build Coastguard Worker std::unique_ptr<HostCache> cache_; 447*6777b538SAndroid Build Coastguard Worker 448*6777b538SAndroid Build Coastguard Worker const int initial_cache_invalidation_num_; 449*6777b538SAndroid Build Coastguard Worker std::map<HostCache::Key, int> cache_invalidation_nums_; 450*6777b538SAndroid Build Coastguard Worker 451*6777b538SAndroid Build Coastguard Worker std::set<raw_ptr<MdnsListenerImpl, SetExperimental>> listeners_; 452*6777b538SAndroid Build Coastguard Worker 453*6777b538SAndroid Build Coastguard Worker size_t next_request_id_ = 1; 454*6777b538SAndroid Build Coastguard Worker 455*6777b538SAndroid Build Coastguard Worker raw_ptr<const base::TickClock> tick_clock_; 456*6777b538SAndroid Build Coastguard Worker 457*6777b538SAndroid Build Coastguard Worker scoped_refptr<State> state_; 458*6777b538SAndroid Build Coastguard Worker 459*6777b538SAndroid Build Coastguard Worker THREAD_CHECKER(thread_checker_); 460*6777b538SAndroid Build Coastguard Worker }; 461*6777b538SAndroid Build Coastguard Worker 462*6777b538SAndroid Build Coastguard Worker class MockHostResolver : public MockHostResolverBase { 463*6777b538SAndroid Build Coastguard Worker public: 464*6777b538SAndroid Build Coastguard Worker explicit MockHostResolver(std::optional<RuleResolver::RuleResultOrError> 465*6777b538SAndroid Build Coastguard Worker default_result = std::nullopt) 466*6777b538SAndroid Build Coastguard Worker : MockHostResolverBase(/*use_caching=*/false, 467*6777b538SAndroid Build Coastguard Worker /*cache_invalidation_num=*/0, RuleResolver(std::move (default_result))468*6777b538SAndroid Build Coastguard Worker RuleResolver(std::move(default_result))) {} 469*6777b538SAndroid Build Coastguard Worker ~MockHostResolver() override = default; 470*6777b538SAndroid Build Coastguard Worker }; 471*6777b538SAndroid Build Coastguard Worker 472*6777b538SAndroid Build Coastguard Worker // Same as MockHostResolver, except internally it uses a host-cache. 473*6777b538SAndroid Build Coastguard Worker // 474*6777b538SAndroid Build Coastguard Worker // Note that tests are advised to use MockHostResolver instead, since it is 475*6777b538SAndroid Build Coastguard Worker // more predictable. (MockHostResolver also can be put into synchronous 476*6777b538SAndroid Build Coastguard Worker // operation mode in case that is what you needed from the caching version). 477*6777b538SAndroid Build Coastguard Worker class MockCachingHostResolver : public MockHostResolverBase { 478*6777b538SAndroid Build Coastguard Worker public: 479*6777b538SAndroid Build Coastguard Worker // If > 0, |cache_invalidation_num| is the number of times a cached entry can 480*6777b538SAndroid Build Coastguard Worker // be read before it invalidates itself. Useful to force cache expiration 481*6777b538SAndroid Build Coastguard Worker // scenarios. 482*6777b538SAndroid Build Coastguard Worker explicit MockCachingHostResolver( 483*6777b538SAndroid Build Coastguard Worker int cache_invalidation_num = 0, 484*6777b538SAndroid Build Coastguard Worker std::optional<RuleResolver::RuleResultOrError> default_result = 485*6777b538SAndroid Build Coastguard Worker std::nullopt) MockHostResolverBase(true,cache_invalidation_num,RuleResolver (std::move (default_result)))486*6777b538SAndroid Build Coastguard Worker : MockHostResolverBase(/*use_caching=*/true, 487*6777b538SAndroid Build Coastguard Worker cache_invalidation_num, 488*6777b538SAndroid Build Coastguard Worker RuleResolver(std::move(default_result))) {} 489*6777b538SAndroid Build Coastguard Worker ~MockCachingHostResolver() override = default; 490*6777b538SAndroid Build Coastguard Worker }; 491*6777b538SAndroid Build Coastguard Worker 492*6777b538SAndroid Build Coastguard Worker // Factory that will always create and return Mock(Caching)HostResolvers. 493*6777b538SAndroid Build Coastguard Worker // 494*6777b538SAndroid Build Coastguard Worker // The default behavior is to create a non-caching mock, even if the tested code 495*6777b538SAndroid Build Coastguard Worker // requests caching enabled (via the |enable_caching| parameter in the creation 496*6777b538SAndroid Build Coastguard Worker // methods). A caching mock will only be created if both |use_caching| is set on 497*6777b538SAndroid Build Coastguard Worker // factory construction and |enable_caching| is set in the creation method. 498*6777b538SAndroid Build Coastguard Worker class MockHostResolverFactory : public HostResolver::Factory { 499*6777b538SAndroid Build Coastguard Worker public: 500*6777b538SAndroid Build Coastguard Worker explicit MockHostResolverFactory(MockHostResolverBase::RuleResolver rules = 501*6777b538SAndroid Build Coastguard Worker MockHostResolverBase::RuleResolver(), 502*6777b538SAndroid Build Coastguard Worker bool use_caching = false, 503*6777b538SAndroid Build Coastguard Worker int cache_invalidation_num = 0); 504*6777b538SAndroid Build Coastguard Worker 505*6777b538SAndroid Build Coastguard Worker MockHostResolverFactory(const MockHostResolverFactory&) = delete; 506*6777b538SAndroid Build Coastguard Worker MockHostResolverFactory& operator=(const MockHostResolverFactory&) = delete; 507*6777b538SAndroid Build Coastguard Worker 508*6777b538SAndroid Build Coastguard Worker ~MockHostResolverFactory() override; 509*6777b538SAndroid Build Coastguard Worker 510*6777b538SAndroid Build Coastguard Worker std::unique_ptr<HostResolver> CreateResolver( 511*6777b538SAndroid Build Coastguard Worker HostResolverManager* manager, 512*6777b538SAndroid Build Coastguard Worker std::string_view host_mapping_rules, 513*6777b538SAndroid Build Coastguard Worker bool enable_caching) override; 514*6777b538SAndroid Build Coastguard Worker std::unique_ptr<HostResolver> CreateStandaloneResolver( 515*6777b538SAndroid Build Coastguard Worker NetLog* net_log, 516*6777b538SAndroid Build Coastguard Worker const HostResolver::ManagerOptions& options, 517*6777b538SAndroid Build Coastguard Worker std::string_view host_mapping_rules, 518*6777b538SAndroid Build Coastguard Worker bool enable_caching) override; 519*6777b538SAndroid Build Coastguard Worker 520*6777b538SAndroid Build Coastguard Worker private: 521*6777b538SAndroid Build Coastguard Worker const MockHostResolverBase::RuleResolver rules_; 522*6777b538SAndroid Build Coastguard Worker const bool use_caching_; 523*6777b538SAndroid Build Coastguard Worker const int cache_invalidation_num_; 524*6777b538SAndroid Build Coastguard Worker }; 525*6777b538SAndroid Build Coastguard Worker 526*6777b538SAndroid Build Coastguard Worker // RuleBasedHostResolverProc applies a set of rules to map a host string to 527*6777b538SAndroid Build Coastguard Worker // a replacement host string. It then uses the system host resolver to return 528*6777b538SAndroid Build Coastguard Worker // a socket address. Generally the replacement should be an IPv4 literal so 529*6777b538SAndroid Build Coastguard Worker // there is no network dependency. 530*6777b538SAndroid Build Coastguard Worker // 531*6777b538SAndroid Build Coastguard Worker // RuleBasedHostResolverProc is thread-safe, to a limited degree. Rules can be 532*6777b538SAndroid Build Coastguard Worker // added or removed on any thread. 533*6777b538SAndroid Build Coastguard Worker class RuleBasedHostResolverProc : public HostResolverProc { 534*6777b538SAndroid Build Coastguard Worker public: 535*6777b538SAndroid Build Coastguard Worker // If `allow_fallback` is false, no Proc fallback is allowed except to 536*6777b538SAndroid Build Coastguard Worker // `previous`. 537*6777b538SAndroid Build Coastguard Worker explicit RuleBasedHostResolverProc(scoped_refptr<HostResolverProc> previous, 538*6777b538SAndroid Build Coastguard Worker bool allow_fallback = true); 539*6777b538SAndroid Build Coastguard Worker 540*6777b538SAndroid Build Coastguard Worker // Any hostname matching the given pattern will be replaced with the given 541*6777b538SAndroid Build Coastguard Worker // |ip_literal|. 542*6777b538SAndroid Build Coastguard Worker void AddRule(std::string_view host_pattern, std::string_view ip_literal); 543*6777b538SAndroid Build Coastguard Worker 544*6777b538SAndroid Build Coastguard Worker // Same as AddRule(), but further restricts to |address_family|. 545*6777b538SAndroid Build Coastguard Worker void AddRuleForAddressFamily(std::string_view host_pattern, 546*6777b538SAndroid Build Coastguard Worker AddressFamily address_family, 547*6777b538SAndroid Build Coastguard Worker std::string_view ip_literal); 548*6777b538SAndroid Build Coastguard Worker 549*6777b538SAndroid Build Coastguard Worker void AddRuleWithFlags(std::string_view host_pattern, 550*6777b538SAndroid Build Coastguard Worker std::string_view ip_literal, 551*6777b538SAndroid Build Coastguard Worker HostResolverFlags flags, 552*6777b538SAndroid Build Coastguard Worker std::vector<std::string> dns_aliases = {}); 553*6777b538SAndroid Build Coastguard Worker 554*6777b538SAndroid Build Coastguard Worker // Same as AddRule(), but the replacement is expected to be an IPv4 or IPv6 555*6777b538SAndroid Build Coastguard Worker // literal. This can be used in place of AddRule() to bypass the system's 556*6777b538SAndroid Build Coastguard Worker // host resolver (the address list will be constructed manually). 557*6777b538SAndroid Build Coastguard Worker // If |canonical_name| is non-empty, it is copied to the resulting AddressList 558*6777b538SAndroid Build Coastguard Worker // but does not impact DNS resolution. 559*6777b538SAndroid Build Coastguard Worker // |ip_literal| can be a single IP address like "192.168.1.1" or a comma 560*6777b538SAndroid Build Coastguard Worker // separated list of IP addresses, like "::1,192:168.1.2". 561*6777b538SAndroid Build Coastguard Worker void AddIPLiteralRule(std::string_view host_pattern, 562*6777b538SAndroid Build Coastguard Worker std::string_view ip_literal, 563*6777b538SAndroid Build Coastguard Worker std::string_view canonical_name); 564*6777b538SAndroid Build Coastguard Worker 565*6777b538SAndroid Build Coastguard Worker // Same as AddIPLiteralRule, but with a parameter allowing multiple DNS 566*6777b538SAndroid Build Coastguard Worker // aliases, such as CNAME aliases, instead of only the canonical name. While 567*6777b538SAndroid Build Coastguard Worker // a simulation using HostResolverProc to obtain more than a single DNS alias 568*6777b538SAndroid Build Coastguard Worker // is currently unrealistic, this capability is useful for clients of 569*6777b538SAndroid Build Coastguard Worker // MockHostResolver who need to be able to obtain aliases and can be 570*6777b538SAndroid Build Coastguard Worker // agnostic about how the host resolution took place, as the alternative, 571*6777b538SAndroid Build Coastguard Worker // MockDnsClient, is not currently hooked up to MockHostResolver. 572*6777b538SAndroid Build Coastguard Worker void AddIPLiteralRuleWithDnsAliases(std::string_view host_pattern, 573*6777b538SAndroid Build Coastguard Worker std::string_view ip_literal, 574*6777b538SAndroid Build Coastguard Worker std::vector<std::string> dns_aliases); 575*6777b538SAndroid Build Coastguard Worker 576*6777b538SAndroid Build Coastguard Worker void AddRuleWithLatency(std::string_view host_pattern, 577*6777b538SAndroid Build Coastguard Worker std::string_view replacement, 578*6777b538SAndroid Build Coastguard Worker int latency_ms); 579*6777b538SAndroid Build Coastguard Worker 580*6777b538SAndroid Build Coastguard Worker // Make sure that |host| will not be re-mapped or even processed by underlying 581*6777b538SAndroid Build Coastguard Worker // host resolver procedures. It can also be a pattern. 582*6777b538SAndroid Build Coastguard Worker void AllowDirectLookup(std::string_view host); 583*6777b538SAndroid Build Coastguard Worker 584*6777b538SAndroid Build Coastguard Worker // Simulate a lookup failure for |host| (it also can be a pattern). 585*6777b538SAndroid Build Coastguard Worker void AddSimulatedFailure( 586*6777b538SAndroid Build Coastguard Worker std::string_view host, 587*6777b538SAndroid Build Coastguard Worker HostResolverFlags flags = HOST_RESOLVER_LOOPBACK_ONLY); 588*6777b538SAndroid Build Coastguard Worker 589*6777b538SAndroid Build Coastguard Worker // Simulate a lookup timeout failure for |host| (it also can be a pattern). 590*6777b538SAndroid Build Coastguard Worker void AddSimulatedTimeoutFailure( 591*6777b538SAndroid Build Coastguard Worker std::string_view host, 592*6777b538SAndroid Build Coastguard Worker HostResolverFlags flags = HOST_RESOLVER_LOOPBACK_ONLY); 593*6777b538SAndroid Build Coastguard Worker 594*6777b538SAndroid Build Coastguard Worker // Deletes all the rules that have been added. 595*6777b538SAndroid Build Coastguard Worker void ClearRules(); 596*6777b538SAndroid Build Coastguard Worker 597*6777b538SAndroid Build Coastguard Worker // Causes method calls that add or delete rules to assert. 598*6777b538SAndroid Build Coastguard Worker // TODO(jam): once this class isn't used by tests that use an out of process 599*6777b538SAndroid Build Coastguard Worker // network service, remove this method and make Rule private. 600*6777b538SAndroid Build Coastguard Worker void DisableModifications(); 601*6777b538SAndroid Build Coastguard Worker 602*6777b538SAndroid Build Coastguard Worker // HostResolverProc methods: 603*6777b538SAndroid Build Coastguard Worker int Resolve(const std::string& host, 604*6777b538SAndroid Build Coastguard Worker AddressFamily address_family, 605*6777b538SAndroid Build Coastguard Worker HostResolverFlags host_resolver_flags, 606*6777b538SAndroid Build Coastguard Worker AddressList* addrlist, 607*6777b538SAndroid Build Coastguard Worker int* os_error) override; 608*6777b538SAndroid Build Coastguard Worker 609*6777b538SAndroid Build Coastguard Worker struct Rule { 610*6777b538SAndroid Build Coastguard Worker // TODO(https://crbug.com/1298106) Deduplicate this enum's definition. 611*6777b538SAndroid Build Coastguard Worker enum ResolverType { 612*6777b538SAndroid Build Coastguard Worker kResolverTypeFail, 613*6777b538SAndroid Build Coastguard Worker kResolverTypeFailTimeout, 614*6777b538SAndroid Build Coastguard Worker // TODO(mmenke): Is it really reasonable for a "mock" host resolver to 615*6777b538SAndroid Build Coastguard Worker // fall back to the system resolver? 616*6777b538SAndroid Build Coastguard Worker kResolverTypeSystem, 617*6777b538SAndroid Build Coastguard Worker kResolverTypeIPLiteral, 618*6777b538SAndroid Build Coastguard Worker }; 619*6777b538SAndroid Build Coastguard Worker 620*6777b538SAndroid Build Coastguard Worker Rule(ResolverType resolver_type, 621*6777b538SAndroid Build Coastguard Worker std::string_view host_pattern, 622*6777b538SAndroid Build Coastguard Worker AddressFamily address_family, 623*6777b538SAndroid Build Coastguard Worker HostResolverFlags host_resolver_flags, 624*6777b538SAndroid Build Coastguard Worker std::string_view replacement, 625*6777b538SAndroid Build Coastguard Worker std::vector<std::string> dns_aliases, 626*6777b538SAndroid Build Coastguard Worker int latency_ms); 627*6777b538SAndroid Build Coastguard Worker Rule(const Rule& other); 628*6777b538SAndroid Build Coastguard Worker ~Rule(); 629*6777b538SAndroid Build Coastguard Worker 630*6777b538SAndroid Build Coastguard Worker ResolverType resolver_type; 631*6777b538SAndroid Build Coastguard Worker std::string host_pattern; 632*6777b538SAndroid Build Coastguard Worker AddressFamily address_family; 633*6777b538SAndroid Build Coastguard Worker HostResolverFlags host_resolver_flags; 634*6777b538SAndroid Build Coastguard Worker std::string replacement; 635*6777b538SAndroid Build Coastguard Worker std::vector<std::string> dns_aliases; 636*6777b538SAndroid Build Coastguard Worker int latency_ms; // In milliseconds. 637*6777b538SAndroid Build Coastguard Worker }; 638*6777b538SAndroid Build Coastguard Worker 639*6777b538SAndroid Build Coastguard Worker typedef std::list<Rule> RuleList; 640*6777b538SAndroid Build Coastguard Worker 641*6777b538SAndroid Build Coastguard Worker RuleList GetRules(); 642*6777b538SAndroid Build Coastguard Worker 643*6777b538SAndroid Build Coastguard Worker // Returns the number of calls to Resolve() where |host| matched 644*6777b538SAndroid Build Coastguard Worker // |host_pattern|. 645*6777b538SAndroid Build Coastguard Worker size_t NumResolvesForHostPattern(std::string_view host_pattern); 646*6777b538SAndroid Build Coastguard Worker 647*6777b538SAndroid Build Coastguard Worker private: 648*6777b538SAndroid Build Coastguard Worker ~RuleBasedHostResolverProc() override; 649*6777b538SAndroid Build Coastguard Worker 650*6777b538SAndroid Build Coastguard Worker void AddRuleInternal(const Rule& rule); 651*6777b538SAndroid Build Coastguard Worker 652*6777b538SAndroid Build Coastguard Worker RuleList rules_ GUARDED_BY(rule_lock_); 653*6777b538SAndroid Build Coastguard Worker 654*6777b538SAndroid Build Coastguard Worker // Tracks the number of calls to Resolve() where |host| matches a rule's host 655*6777b538SAndroid Build Coastguard Worker // pattern. 656*6777b538SAndroid Build Coastguard Worker std::map<std::string_view, size_t> num_resolves_per_host_pattern_ 657*6777b538SAndroid Build Coastguard Worker GUARDED_BY(rule_lock_); 658*6777b538SAndroid Build Coastguard Worker 659*6777b538SAndroid Build Coastguard Worker // Must be obtained before writing to or reading from |rules_|. 660*6777b538SAndroid Build Coastguard Worker base::Lock rule_lock_; 661*6777b538SAndroid Build Coastguard Worker 662*6777b538SAndroid Build Coastguard Worker // Whether changes are allowed. 663*6777b538SAndroid Build Coastguard Worker bool modifications_allowed_ = true; 664*6777b538SAndroid Build Coastguard Worker }; 665*6777b538SAndroid Build Coastguard Worker 666*6777b538SAndroid Build Coastguard Worker // Create rules that map all requests to localhost. 667*6777b538SAndroid Build Coastguard Worker scoped_refptr<RuleBasedHostResolverProc> CreateCatchAllHostResolverProc(); 668*6777b538SAndroid Build Coastguard Worker 669*6777b538SAndroid Build Coastguard Worker // HangingHostResolver never completes its |Resolve| request. As LOCAL_ONLY 670*6777b538SAndroid Build Coastguard Worker // requests are not allowed to complete asynchronously, they will always result 671*6777b538SAndroid Build Coastguard Worker // in |ERR_DNS_CACHE_MISS|. 672*6777b538SAndroid Build Coastguard Worker class HangingHostResolver : public HostResolver { 673*6777b538SAndroid Build Coastguard Worker public: 674*6777b538SAndroid Build Coastguard Worker // A set of states in HangingHostResolver. This is used to observe the 675*6777b538SAndroid Build Coastguard Worker // internal state variables after destructing a MockHostResolver. 676*6777b538SAndroid Build Coastguard Worker class State : public base::RefCounted<State> { 677*6777b538SAndroid Build Coastguard Worker public: 678*6777b538SAndroid Build Coastguard Worker State(); 679*6777b538SAndroid Build Coastguard Worker num_cancellations()680*6777b538SAndroid Build Coastguard Worker int num_cancellations() const { return num_cancellations_; } 681*6777b538SAndroid Build Coastguard Worker IncrementNumCancellations()682*6777b538SAndroid Build Coastguard Worker void IncrementNumCancellations() { ++num_cancellations_; } 683*6777b538SAndroid Build Coastguard Worker 684*6777b538SAndroid Build Coastguard Worker private: 685*6777b538SAndroid Build Coastguard Worker friend class RefCounted<State>; 686*6777b538SAndroid Build Coastguard Worker 687*6777b538SAndroid Build Coastguard Worker ~State(); 688*6777b538SAndroid Build Coastguard Worker 689*6777b538SAndroid Build Coastguard Worker int num_cancellations_ = 0; 690*6777b538SAndroid Build Coastguard Worker }; 691*6777b538SAndroid Build Coastguard Worker 692*6777b538SAndroid Build Coastguard Worker HangingHostResolver(); 693*6777b538SAndroid Build Coastguard Worker ~HangingHostResolver() override; 694*6777b538SAndroid Build Coastguard Worker void OnShutdown() override; 695*6777b538SAndroid Build Coastguard Worker std::unique_ptr<ResolveHostRequest> CreateRequest( 696*6777b538SAndroid Build Coastguard Worker url::SchemeHostPort host, 697*6777b538SAndroid Build Coastguard Worker NetworkAnonymizationKey network_anonymization_key, 698*6777b538SAndroid Build Coastguard Worker NetLogWithSource net_log, 699*6777b538SAndroid Build Coastguard Worker std::optional<ResolveHostParameters> optional_parameters) override; 700*6777b538SAndroid Build Coastguard Worker std::unique_ptr<ResolveHostRequest> CreateRequest( 701*6777b538SAndroid Build Coastguard Worker const HostPortPair& host, 702*6777b538SAndroid Build Coastguard Worker const NetworkAnonymizationKey& network_anonymization_key, 703*6777b538SAndroid Build Coastguard Worker const NetLogWithSource& net_log, 704*6777b538SAndroid Build Coastguard Worker const std::optional<ResolveHostParameters>& optional_parameters) override; 705*6777b538SAndroid Build Coastguard Worker std::unique_ptr<ServiceEndpointRequest> CreateServiceEndpointRequest( 706*6777b538SAndroid Build Coastguard Worker Host host, 707*6777b538SAndroid Build Coastguard Worker NetworkAnonymizationKey network_anonymization_key, 708*6777b538SAndroid Build Coastguard Worker NetLogWithSource net_log, 709*6777b538SAndroid Build Coastguard Worker ResolveHostParameters parameters) override; 710*6777b538SAndroid Build Coastguard Worker 711*6777b538SAndroid Build Coastguard Worker std::unique_ptr<ProbeRequest> CreateDohProbeRequest() override; 712*6777b538SAndroid Build Coastguard Worker 713*6777b538SAndroid Build Coastguard Worker void SetRequestContext(URLRequestContext* url_request_context) override; 714*6777b538SAndroid Build Coastguard Worker 715*6777b538SAndroid Build Coastguard Worker // Use to detect cancellations since there's otherwise no externally-visible 716*6777b538SAndroid Build Coastguard Worker // differentiation between a cancelled and a hung task. num_cancellations()717*6777b538SAndroid Build Coastguard Worker int num_cancellations() const { return state_->num_cancellations(); } 718*6777b538SAndroid Build Coastguard Worker 719*6777b538SAndroid Build Coastguard Worker // Return the corresponding values passed to the most recent call to 720*6777b538SAndroid Build Coastguard Worker // CreateRequest() last_host()721*6777b538SAndroid Build Coastguard Worker const HostPortPair& last_host() const { return last_host_; } last_network_anonymization_key()722*6777b538SAndroid Build Coastguard Worker const NetworkAnonymizationKey& last_network_anonymization_key() const { 723*6777b538SAndroid Build Coastguard Worker return last_network_anonymization_key_; 724*6777b538SAndroid Build Coastguard Worker } 725*6777b538SAndroid Build Coastguard Worker state()726*6777b538SAndroid Build Coastguard Worker const scoped_refptr<const State> state() const { return state_; } 727*6777b538SAndroid Build Coastguard Worker 728*6777b538SAndroid Build Coastguard Worker private: 729*6777b538SAndroid Build Coastguard Worker class RequestImpl; 730*6777b538SAndroid Build Coastguard Worker class ProbeRequestImpl; 731*6777b538SAndroid Build Coastguard Worker 732*6777b538SAndroid Build Coastguard Worker HostPortPair last_host_; 733*6777b538SAndroid Build Coastguard Worker NetworkAnonymizationKey last_network_anonymization_key_; 734*6777b538SAndroid Build Coastguard Worker 735*6777b538SAndroid Build Coastguard Worker scoped_refptr<State> state_; 736*6777b538SAndroid Build Coastguard Worker bool shutting_down_ = false; 737*6777b538SAndroid Build Coastguard Worker base::WeakPtrFactory<HangingHostResolver> weak_ptr_factory_{this}; 738*6777b538SAndroid Build Coastguard Worker }; 739*6777b538SAndroid Build Coastguard Worker 740*6777b538SAndroid Build Coastguard Worker // This class sets the default HostResolverProc for a particular scope. The 741*6777b538SAndroid Build Coastguard Worker // chain of resolver procs starting at |proc| is placed in front of any existing 742*6777b538SAndroid Build Coastguard Worker // default resolver proc(s). This means that if multiple 743*6777b538SAndroid Build Coastguard Worker // ScopedDefaultHostResolverProcs are declared, then resolving will start with 744*6777b538SAndroid Build Coastguard Worker // the procs given to the last-allocated one, then fall back to the procs given 745*6777b538SAndroid Build Coastguard Worker // to the previously-allocated one, and so forth. 746*6777b538SAndroid Build Coastguard Worker // 747*6777b538SAndroid Build Coastguard Worker // NOTE: Only use this as a catch-all safety net. Individual tests should use 748*6777b538SAndroid Build Coastguard Worker // MockHostResolver. 749*6777b538SAndroid Build Coastguard Worker class ScopedDefaultHostResolverProc { 750*6777b538SAndroid Build Coastguard Worker public: 751*6777b538SAndroid Build Coastguard Worker ScopedDefaultHostResolverProc(); 752*6777b538SAndroid Build Coastguard Worker explicit ScopedDefaultHostResolverProc(HostResolverProc* proc); 753*6777b538SAndroid Build Coastguard Worker 754*6777b538SAndroid Build Coastguard Worker ~ScopedDefaultHostResolverProc(); 755*6777b538SAndroid Build Coastguard Worker 756*6777b538SAndroid Build Coastguard Worker void Init(HostResolverProc* proc); 757*6777b538SAndroid Build Coastguard Worker 758*6777b538SAndroid Build Coastguard Worker private: 759*6777b538SAndroid Build Coastguard Worker scoped_refptr<HostResolverProc> current_proc_; 760*6777b538SAndroid Build Coastguard Worker scoped_refptr<HostResolverProc> previous_proc_; 761*6777b538SAndroid Build Coastguard Worker }; 762*6777b538SAndroid Build Coastguard Worker 763*6777b538SAndroid Build Coastguard Worker } // namespace net 764*6777b538SAndroid Build Coastguard Worker 765*6777b538SAndroid Build Coastguard Worker #endif // NET_DNS_MOCK_HOST_RESOLVER_H_ 766