File: host_resolver_manager_unittest.h

package info (click to toggle)
chromium 139.0.7258.127-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 6,122,068 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (206 lines) | stat: -rw-r--r-- 7,193 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef NET_DNS_HOST_RESOLVER_MANAGER_UNITTEST_H_
#define NET_DNS_HOST_RESOLVER_MANAGER_UNITTEST_H_

#include <memory>
#include <string>
#include <utility>

#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/test/test_mock_time_task_runner.h"
#include "net/base/completion_once_callback.h"
#include "net/base/ip_endpoint.h"
#include "net/base/net_export.h"
#include "net/dns/dns_client.h"
#include "net/dns/dns_test_util.h"
#include "net/dns/host_cache.h"
#include "net/dns/host_resolver_dns_task.h"
#include "net/dns/host_resolver_manager.h"
#include "net/dns/test_dns_config_service.h"
#include "net/log/net_log_with_source.h"
#include "net/test/test_with_task_environment.h"

namespace net {

class MockHostResolverProc;

class HostResolverManagerTest : public TestWithTaskEnvironment {
 public:
  static const int kDefaultPort = 80;
  static inline constexpr base::TimeDelta kDefaultTtl = base::Seconds(1);

  explicit HostResolverManagerTest(
      base::test::TaskEnvironment::TimeSource time_source =
          base::test::TaskEnvironment::TimeSource::SYSTEM_TIME);

  ~HostResolverManagerTest() override;

  void CreateResolver(bool check_ipv6_on_wifi = true);

  virtual void DestroyResolver();

  // This HostResolverManager will only allow 1 outstanding resolve at a time
  // and perform no retries.
  void CreateSerialResolver(bool check_ipv6_on_wifi = true,
                            bool ipv6_reachable = true,
                            bool is_async = false);

  void StaleAllowedFromIpTest(bool is_async);
  void LocalOnlyFromIpTest(bool is_async);
  void ChangePriorityTest(bool is_async);
  void AbortOnlyExistingRequestsOnIPAddressChangeTest(bool is_async);
  void FlushCacheOnIPAddressChangeTest(bool is_async);
  void AbortOnIPAddressChangedTest(bool is_async);
  void NumericIPv6AddressTest(bool is_async);
  void NumericIPv6AddressWithSchemeTest(bool is_async);
  void LocalhostIPV4IPV6LookupTest(bool is_async);
  void IPv4AddressLiteralInIPv6OnlyNetworkTest(bool is_async);
  void IPv4AddressLiteralInIPv6OnlyNetworkPort443Test(bool is_async);
  void IPv4AddressLiteralInIPv6OnlyNetworkNoDns64Test(bool is_async);
  void IPv4AddressLiteralInIPv6OnlyNetworkBadAddressTest(bool is_async);

 protected:
  // testing::Test implementation:
  void SetUp() override;
  void TearDown() override;

  void CreateResolverWithLimitsAndParams(
      size_t max_concurrent_resolves,
      const HostResolverSystemTask::Params& params,
      bool ipv6_reachable,
      bool check_ipv6_on_wifi,
      bool is_async = false);

  virtual HostResolver::ManagerOptions DefaultOptions();

  virtual void CreateResolverWithOptionsAndParams(
      HostResolver::ManagerOptions options,
      const HostResolverSystemTask::Params& params,
      bool ipv6_reachable,
      bool is_async = false,
      bool ipv4_reachable = true);

  // Friendship is not inherited, so use proxies to access those.
  size_t num_running_dispatcher_jobs() const;

  void set_allow_fallback_to_systemtask(bool allow_fallback_to_systemtask);

  static unsigned maximum_insecure_dns_task_failures() {
    return DnsClient::kMaxInsecureFallbackFailures;
  }

  int StartIPv6ReachabilityCheck(
      const NetLogWithSource& net_log,
      raw_ptr<ClientSocketFactory> client_socket_factory,
      CompletionOnceCallback callback);

  bool GetLastIpv6ProbeResult();

  void PopulateCache(const HostCache::Key& key, IPEndPoint endpoint);
  void PopulateCache(const HostCache::Key& key,
                     std::vector<IPEndPoint> endpoints);

  const std::pair<const HostCache::Key, HostCache::Entry>* GetCacheHit(
      const HostCache::Key& key);

  void MakeCacheStale();

  IPEndPoint CreateExpected(const std::string& ip_literal, uint16_t port);

  scoped_refptr<MockHostResolverProc> proc_;
  std::unique_ptr<HostResolverManager> resolver_;
  std::unique_ptr<URLRequestContext> request_context_;
  std::unique_ptr<ResolveContext> resolve_context_;
};

// Specialized fixture for tests of DnsTask.
class HostResolverManagerDnsTest : public HostResolverManagerTest {
 public:
  explicit HostResolverManagerDnsTest(
      base::test::TaskEnvironment::TimeSource time_source =
          base::test::TaskEnvironment::TimeSource::MOCK_TIME);

  ~HostResolverManagerDnsTest() override;

  void DestroyResolver() override;

  // Note that this clears `mock_dns_client_`.
  void SetDnsClient(std::unique_ptr<DnsClient> dns_client);

  void Ipv6UnreachableTest(bool is_async);
  void Ipv6UnreachableInvalidConfigTest(bool is_async);

 protected:
  void TearDown() override;

  // HostResolverManagerTest implementation:
  HostResolver::ManagerOptions DefaultOptions() override;

  void CreateResolverWithOptionsAndParams(
      HostResolver::ManagerOptions options,
      const HostResolverSystemTask::Params& params,
      bool ipv6_reachable,
      bool is_async = false,
      bool ipv4_reachable = true) override;

  // Call after CreateResolver() to update the resolver with a new MockDnsClient
  // using`config` and `rules`.
  void UseMockDnsClient(const DnsConfig& config, MockDnsClientRuleList rules);

  static MockDnsClientRuleList CreateDefaultDnsRules();

  // Adds a rule to `rules`.
  static void AddDnsRule(MockDnsClientRuleList* rules,
                         const std::string& prefix,
                         uint16_t qtype,
                         MockDnsClientRule::ResultType result_type,
                         bool delay);

  static void AddDnsRule(MockDnsClientRuleList* rules,
                         const std::string& prefix,
                         uint16_t qtype,
                         const IPAddress& result_ip,
                         bool delay);

  static void AddDnsRule(MockDnsClientRuleList* rules,
                         const std::string& prefix,
                         uint16_t qtype,
                         IPAddress result_ip,
                         std::string cannonname,
                         bool delay);

  static void AddDnsRule(MockDnsClientRuleList* rules,
                         const std::string& prefix,
                         uint16_t qtype,
                         DnsResponse dns_test_response,
                         bool delay);

  static void AddSecureDnsRule(MockDnsClientRuleList* rules,
                               const std::string& prefix,
                               uint16_t qtype,
                               MockDnsClientRule::ResultType result_type,
                               bool delay);

  void ChangeDnsConfig(const DnsConfig& config);

  void InvalidateDnsConfig();

  void SetInitialDnsConfig(const DnsConfig& config);

  void TriggerInsecureFailureCondition();

  scoped_refptr<base::TestMockTimeTaskRunner> notifier_task_runner_;
  raw_ptr<TestDnsConfigService, DanglingUntriaged> config_service_;
  std::unique_ptr<SystemDnsConfigChangeNotifier> notifier_;

  // Owned by `resolver_`.
  raw_ptr<MockDnsClient> mock_dns_client_ = nullptr;
};

}  // namespace net

#endif  // NET_DNS_HOST_RESOLVER_MANAGER_UNITTEST_H_