blob: a1ef1d76aed25524b1429ddc032d00165ab6d324 [file] [log] [blame]
Avi Drissman64595482022-09-14 20:52:291// Copyright 2012 The Chromium Authors
[email protected]78eac2a2012-03-14 19:09:272// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "net/dns/dns_test_util.h"
6
Eric Orth0eeeef182022-12-01 23:49:577#include <cstdint>
Eric Orth3b26e3ba2020-11-12 22:43:138#include <string>
9#include <utility>
10#include <vector>
11
[email protected]d9806a972014-02-26 18:14:5712#include "base/big_endian.h"
[email protected]78eac2a2012-03-14 19:09:2713#include "base/bind.h"
Eric Orth3b26e3ba2020-11-12 22:43:1314#include "base/check.h"
skyostil4891b25b2015-06-11 11:43:4515#include "base/location.h"
Eric Orth828bd3ae2018-12-12 17:30:3616#include "base/numerics/safe_conversions.h"
Benjamin M. Schwartz571353c22021-12-13 16:41:1117#include "base/ranges/algorithm.h"
Dan McArdle00271b92022-02-11 23:41:1818#include "base/strings/strcat.h"
[email protected]78eac2a2012-03-14 19:09:2719#include "base/sys_byteorder.h"
Patrick Monette643cdf62021-10-15 19:13:4220#include "base/task/single_thread_task_runner.h"
Eric Orth3b26e3ba2020-11-12 22:43:1321#include "base/time/time.h"
Daniel Cheng522adbb2022-08-29 17:18:5722#include "base/types/optional_util.h"
[email protected]78eac2a2012-03-14 19:09:2723#include "net/base/io_buffer.h"
Eric Orth828bd3ae2018-12-12 17:30:3624#include "net/base/ip_address.h"
Eric Orth48b1b7c2022-01-21 00:21:1625#include "net/base/ip_endpoint.h"
[email protected]78eac2a2012-03-14 19:09:2726#include "net/base/net_errors.h"
[email protected]0adcb2b2012-08-15 21:30:4627#include "net/dns/address_sorter.h"
Eric Orth394db1732019-08-27 20:09:3928#include "net/dns/dns_hosts.h"
Eric Orth02c98932022-12-02 23:05:4629#include "net/dns/dns_names_util.h"
[email protected]78eac2a2012-03-14 19:09:2730#include "net/dns/dns_query.h"
Eric Orthaf82b49a2020-02-01 01:48:5031#include "net/dns/dns_session.h"
Benjamin M. Schwartz571353c22021-12-13 16:41:1132#include "net/dns/public/dns_over_https_server_config.h"
Eric Orth069a3c6e2020-01-31 23:14:2433#include "net/dns/resolve_context.h"
Benjamin M. Schwartz6f719eb2021-12-15 17:47:2834#include "testing/gmock/include/gmock/gmock-matchers.h"
[email protected]78eac2a2012-03-14 19:09:2735#include "testing/gtest/include/gtest/gtest.h"
Eric Orth0eeeef182022-12-01 23:49:5736#include "third_party/abseil-cpp/absl/types/optional.h"
Benjamin M. Schwartz6f719eb2021-12-15 17:47:2837#include "url/scheme_host_port.h"
[email protected]78eac2a2012-03-14 19:09:2738
39namespace net {
40namespace {
41
Eric Orth828bd3ae2018-12-12 17:30:3642const uint8_t kMalformedResponseHeader[] = {
43 // Header
44 0x00, 0x14, // Arbitrary ID
45 0x81, 0x80, // Standard query response, RA, no error
46 0x00, 0x01, // 1 question
47 0x00, 0x01, // 1 RR (answers)
48 0x00, 0x00, // 0 authority RRs
49 0x00, 0x00, // 0 additional RRs
50};
51
52// Create a response containing a valid question (as would normally be validated
53// in DnsTransaction) but completely missing a header-declared answer.
Eric Ortha97f0f72020-10-16 16:10:3254DnsResponse CreateMalformedResponse(std::string hostname, uint16_t type) {
Eric Orth02c98932022-12-02 23:05:4655 absl::optional<std::vector<uint8_t>> dns_name =
56 dns_names_util::DottedNameToNetwork(hostname);
Eric Orth0eeeef182022-12-01 23:49:5757 CHECK(dns_name.has_value());
58 DnsQuery query(/*id=*/0x14, dns_name.value(), type);
Eric Orth828bd3ae2018-12-12 17:30:3659
60 // Build response to simulate the barebones validation DnsResponse applies to
61 // responses received from the network.
62 auto buffer = base::MakeRefCounted<IOBufferWithSize>(
63 sizeof(kMalformedResponseHeader) + query.question().size());
64 memcpy(buffer->data(), kMalformedResponseHeader,
65 sizeof(kMalformedResponseHeader));
66 memcpy(buffer->data() + sizeof(kMalformedResponseHeader),
67 query.question().data(), query.question().size());
68
Eric Ortha97f0f72020-10-16 16:10:3269 DnsResponse response(buffer, buffer->size());
70 CHECK(response.InitParseWithoutQuery(buffer->size()));
Eric Orth828bd3ae2018-12-12 17:30:3671
72 return response;
73}
74
[email protected]daae1322013-09-05 18:26:5075class MockAddressSorter : public AddressSorter {
76 public:
Chris Watkins68b15032017-12-01 03:07:1377 ~MockAddressSorter() override = default;
Eric Orth48b1b7c2022-01-21 00:21:1678 void Sort(const std::vector<IPEndPoint>& endpoints,
79 CallbackType callback) const override {
[email protected]daae1322013-09-05 18:26:5080 // Do nothing.
Eric Orth48b1b7c2022-01-21 00:21:1681 std::move(callback).Run(true, endpoints);
[email protected]daae1322013-09-05 18:26:5082 }
83};
84
[email protected]daae1322013-09-05 18:26:5085} // namespace
[email protected]78eac2a2012-03-14 19:09:2786
Eric Orth8539e492020-10-19 20:09:5587DnsResourceRecord BuildTestDnsRecord(std::string name,
88 uint16_t type,
89 std::string rdata,
90 base::TimeDelta ttl) {
David Van Cleve34c74c72019-10-31 19:58:0191 DCHECK(!name.empty());
David Van Cleve34c74c72019-10-31 19:58:0192
93 DnsResourceRecord record;
94 record.name = std::move(name);
Eric Orth8539e492020-10-19 20:09:5595 record.type = type;
David Van Cleve34c74c72019-10-31 19:58:0196 record.klass = dns_protocol::kClassIN;
Eric Orth8539e492020-10-19 20:09:5597 record.ttl = ttl.InSeconds();
Eric Orth5d21f152020-10-21 19:15:4398
99 if (!rdata.empty())
100 record.SetOwnedRdata(std::move(rdata));
David Van Cleve34c74c72019-10-31 19:58:01101
102 return record;
103}
104
Eric Orth65fd3e32020-11-18 04:59:17105DnsResourceRecord BuildTestCnameRecord(std::string name,
106 base::StringPiece canonical_name,
107 base::TimeDelta ttl) {
108 DCHECK(!name.empty());
109 DCHECK(!canonical_name.empty());
110
Eric Orth02c98932022-12-02 23:05:46111 absl::optional<std::vector<uint8_t>> rdata =
112 dns_names_util::DottedNameToNetwork(canonical_name);
Eric Orth0eeeef182022-12-01 23:49:57113 CHECK(rdata.has_value());
Eric Orth65fd3e32020-11-18 04:59:17114
Eric Orth0eeeef182022-12-01 23:49:57115 return BuildTestDnsRecord(
116 std::move(name), dns_protocol::kTypeCNAME,
117 std::string(reinterpret_cast<char*>(rdata.value().data()),
118 rdata.value().size()),
119 ttl);
Eric Orth65fd3e32020-11-18 04:59:17120}
121
Eric Orth8539e492020-10-19 20:09:55122DnsResourceRecord BuildTestAddressRecord(std::string name,
123 const IPAddress& ip,
124 base::TimeDelta ttl) {
125 DCHECK(!name.empty());
Eric Orth828bd3ae2018-12-12 17:30:36126 DCHECK(ip.IsValid());
127
Eric Orth8539e492020-10-19 20:09:55128 return BuildTestDnsRecord(
129 std::move(name),
130 ip.IsIPv4() ? dns_protocol::kTypeA : dns_protocol::kTypeAAAA,
131 net::IPAddressToPackedString(ip), ttl);
132}
133
Eric Orth3b26e3ba2020-11-12 22:43:13134DnsResourceRecord BuildTestTextRecord(std::string name,
135 std::vector<std::string> text_strings,
136 base::TimeDelta ttl) {
137 DCHECK(!text_strings.empty());
138
139 std::string rdata;
140 for (const std::string& text_string : text_strings) {
141 DCHECK(!text_string.empty());
142
143 rdata += base::checked_cast<unsigned char>(text_string.size());
144 rdata += text_string;
145 }
146
147 return BuildTestDnsRecord(std::move(name), dns_protocol::kTypeTXT,
Eric Orthd16fee6b2020-11-18 06:43:14148 std::move(rdata), ttl);
Eric Orth3b26e3ba2020-11-12 22:43:13149}
150
Eric Orth7139e0552020-11-04 02:41:11151DnsResourceRecord BuildTestHttpsAliasRecord(std::string name,
152 base::StringPiece alias_name,
153 base::TimeDelta ttl) {
154 DCHECK(!name.empty());
155
156 std::string rdata("\000\000", 2);
157
Eric Orth0eeeef182022-12-01 23:49:57158 absl::optional<std::vector<uint8_t>> alias_domain =
Eric Orth02c98932022-12-02 23:05:46159 dns_names_util::DottedNameToNetwork(alias_name);
Eric Orth0eeeef182022-12-01 23:49:57160 CHECK(alias_domain.has_value());
161 rdata.append(reinterpret_cast<char*>(alias_domain.value().data()),
162 alias_domain.value().size());
Eric Orth7139e0552020-11-04 02:41:11163
164 return BuildTestDnsRecord(std::move(name), dns_protocol::kTypeHttps,
165 std::move(rdata), ttl);
166}
167
Eric Orth17a07d42022-03-08 22:12:16168std::pair<uint16_t, std::string> BuildTestHttpsServiceAlpnParam(
169 const std::vector<std::string>& alpns) {
170 std::string param_value;
171
172 for (const std::string& alpn : alpns) {
173 CHECK(!alpn.empty());
174 param_value.append(
175 1, static_cast<char>(base::checked_cast<uint8_t>(alpn.size())));
176 param_value.append(alpn);
177 }
178
179 return std::make_pair(dns_protocol::kHttpsServiceParamKeyAlpn,
180 std::move(param_value));
181}
182
183std::pair<uint16_t, std::string> BuildTestHttpsServiceEchConfigParam(
184 base::span<const uint8_t> ech_config_list) {
185 return std::make_pair(
186 dns_protocol::kHttpsServiceParamKeyEchConfig,
187 std::string(reinterpret_cast<const char*>(ech_config_list.data()),
188 ech_config_list.size()));
189}
190
Eric Orth4a2621c2022-02-23 00:45:31191std::pair<uint16_t, std::string> BuildTestHttpsServiceMandatoryParam(
192 std::vector<uint16_t> param_key_list) {
193 base::ranges::sort(param_key_list);
194
195 std::string value;
196 for (uint16_t param_key : param_key_list) {
197 char num_buffer[2];
198 base::WriteBigEndian(num_buffer, param_key);
199 value.append(num_buffer, 2);
200 }
201
202 return std::make_pair(dns_protocol::kHttpsServiceParamKeyMandatory,
203 std::move(value));
204}
205
Eric Orth17a07d42022-03-08 22:12:16206std::pair<uint16_t, std::string> BuildTestHttpsServicePortParam(uint16_t port) {
207 char buffer[2];
208 base::WriteBigEndian(buffer, port);
209
210 return std::make_pair(dns_protocol::kHttpsServiceParamKeyPort,
211 std::string(buffer, 2));
212}
213
Eric Orth7139e0552020-11-04 02:41:11214DnsResourceRecord BuildTestHttpsServiceRecord(
215 std::string name,
216 uint16_t priority,
217 base::StringPiece service_name,
218 const std::map<uint16_t, std::string>& params,
219 base::TimeDelta ttl) {
220 DCHECK(!name.empty());
221 DCHECK_NE(priority, 0);
222
223 std::string rdata;
224
225 char num_buffer[2];
226 base::WriteBigEndian(num_buffer, priority);
227 rdata.append(num_buffer, 2);
228
Eric Orth0eeeef182022-12-01 23:49:57229 absl::optional<std::vector<uint8_t>> service_domain;
Eric Orthac9aafb2021-07-29 23:03:43230 if (service_name == ".") {
231 // HTTPS records have special behavior for `service_name == "."` (that it
232 // will be treated as if the service name is the same as the record owner
233 // name), so allow such inputs despite normally being disallowed for
234 // Chrome-encoded DNS names.
Eric Orth0eeeef182022-12-01 23:49:57235 service_domain = std::vector<uint8_t>{0};
Eric Orthac9aafb2021-07-29 23:03:43236 } else {
Eric Orth02c98932022-12-02 23:05:46237 service_domain = dns_names_util::DottedNameToNetwork(service_name);
Eric Orthac9aafb2021-07-29 23:03:43238 }
Eric Orth0eeeef182022-12-01 23:49:57239 CHECK(service_domain.has_value());
240 rdata.append(reinterpret_cast<char*>(service_domain.value().data()),
241 service_domain.value().size());
Eric Orth7139e0552020-11-04 02:41:11242
243 for (auto& param : params) {
244 base::WriteBigEndian(num_buffer, param.first);
245 rdata.append(num_buffer, 2);
246
247 base::WriteBigEndian(num_buffer,
248 base::checked_cast<uint16_t>(param.second.size()));
249 rdata.append(num_buffer, 2);
250
251 rdata.append(param.second);
252 }
253
254 return BuildTestDnsRecord(std::move(name), dns_protocol::kTypeHttps,
255 std::move(rdata), ttl);
256}
257
Eric Orth8539e492020-10-19 20:09:55258DnsResponse BuildTestDnsResponse(
259 std::string name,
260 uint16_t type,
Eric Orth69c25992020-11-10 16:55:12261 const std::vector<DnsResourceRecord>& answers,
262 const std::vector<DnsResourceRecord>& authority,
Eric Orth9cec76f2020-11-17 07:42:42263 const std::vector<DnsResourceRecord>& additional,
264 uint8_t rcode) {
Eric Orth8539e492020-10-19 20:09:55265 DCHECK(!name.empty());
266
Eric Orth02c98932022-12-02 23:05:46267 absl::optional<std::vector<uint8_t>> dns_name =
268 dns_names_util::DottedNameToNetwork(name);
Eric Orth0eeeef182022-12-01 23:49:57269 CHECK(dns_name.has_value());
Eric Orth8539e492020-10-19 20:09:55270
Eric Orth0eeeef182022-12-01 23:49:57271 absl::optional<DnsQuery> query(absl::in_place, 0, dns_name.value(), type);
Eric Orth8539e492020-10-19 20:09:55272 return DnsResponse(0, true /* is_authoritative */, answers,
Eric Orth69c25992020-11-10 16:55:12273 authority /* authority_records */,
Eric Orth9cec76f2020-11-17 07:42:42274 additional /* additional_records */, query, rcode,
Eric Orthd16fee6b2020-11-18 06:43:14275 false /* validate_records */);
Eric Orth828bd3ae2018-12-12 17:30:36276}
277
Eric Orth8539e492020-10-19 20:09:55278DnsResponse BuildTestDnsAddressResponse(std::string name,
279 const IPAddress& ip,
280 std::string answer_name) {
281 DCHECK(ip.IsValid());
282
283 if (answer_name.empty())
284 answer_name = name;
285
286 std::vector<DnsResourceRecord> answers = {
287 BuildTestAddressRecord(std::move(answer_name), ip)};
288
289 return BuildTestDnsResponse(
290 std::move(name),
291 ip.IsIPv4() ? dns_protocol::kTypeA : dns_protocol::kTypeAAAA, answers);
292}
293
Eric Ortha97f0f72020-10-16 16:10:32294DnsResponse BuildTestDnsAddressResponseWithCname(std::string name,
295 const IPAddress& ip,
Eric Orth8539e492020-10-19 20:09:55296 std::string cannonname,
297 std::string answer_name) {
Eric Orth828bd3ae2018-12-12 17:30:36298 DCHECK(ip.IsValid());
299 DCHECK(!cannonname.empty());
300
Eric Orth8539e492020-10-19 20:09:55301 if (answer_name.empty())
302 answer_name = name;
303
Eric Orth0eeeef182022-12-01 23:49:57304 absl::optional<std::vector<uint8_t>> cname_rdata =
Eric Orth02c98932022-12-02 23:05:46305 dns_names_util::DottedNameToNetwork(cannonname);
Eric Orth0eeeef182022-12-01 23:49:57306 CHECK(cname_rdata.has_value());
Eric Orth8539e492020-10-19 20:09:55307
Eric Orth828bd3ae2018-12-12 17:30:36308 std::vector<DnsResourceRecord> answers = {
Eric Orth0eeeef182022-12-01 23:49:57309 BuildTestDnsRecord(
310 std::move(answer_name), dns_protocol::kTypeCNAME,
311 std::string(reinterpret_cast<char*>(cname_rdata.value().data()),
312 cname_rdata.value().size())),
Eric Orth8539e492020-10-19 20:09:55313 BuildTestAddressRecord(std::move(cannonname), ip)};
314
315 return BuildTestDnsResponse(
316 std::move(name),
317 ip.IsIPv4() ? dns_protocol::kTypeA : dns_protocol::kTypeAAAA, answers);
Eric Orth828bd3ae2018-12-12 17:30:36318}
319
Eric Ortha97f0f72020-10-16 16:10:32320DnsResponse BuildTestDnsTextResponse(
Eric Orth828bd3ae2018-12-12 17:30:36321 std::string name,
322 std::vector<std::vector<std::string>> text_records,
323 std::string answer_name) {
324 if (answer_name.empty())
325 answer_name = name;
326
327 std::vector<DnsResourceRecord> answers;
Eric Ortha625b042019-01-16 01:14:45328 for (std::vector<std::string>& text_record : text_records) {
Eric Orth3b26e3ba2020-11-12 22:43:13329 answers.push_back(BuildTestTextRecord(answer_name, std::move(text_record)));
Eric Orth828bd3ae2018-12-12 17:30:36330 }
331
Eric Orth8539e492020-10-19 20:09:55332 return BuildTestDnsResponse(std::move(name), dns_protocol::kTypeTXT, answers);
Eric Orth828bd3ae2018-12-12 17:30:36333}
334
Eric Ortha97f0f72020-10-16 16:10:32335DnsResponse BuildTestDnsPointerResponse(std::string name,
336 std::vector<std::string> pointer_names,
337 std::string answer_name) {
Eric Orthe9db8d232019-01-14 21:24:45338 if (answer_name.empty())
339 answer_name = name;
340
341 std::vector<DnsResourceRecord> answers;
Eric Ortha625b042019-01-16 01:14:45342 for (std::string& pointer_name : pointer_names) {
Eric Orth02c98932022-12-02 23:05:46343 absl::optional<std::vector<uint8_t>> rdata =
344 dns_names_util::DottedNameToNetwork(pointer_name);
Eric Orth0eeeef182022-12-01 23:49:57345 CHECK(rdata.has_value());
Eric Orth8539e492020-10-19 20:09:55346
Eric Orth0eeeef182022-12-01 23:49:57347 answers.push_back(BuildTestDnsRecord(
348 answer_name, dns_protocol::kTypePTR,
349 std::string(reinterpret_cast<char*>(rdata.value().data()),
350 rdata.value().size())));
Eric Orthe9db8d232019-01-14 21:24:45351 }
352
Eric Orth8539e492020-10-19 20:09:55353 return BuildTestDnsResponse(std::move(name), dns_protocol::kTypePTR, answers);
Eric Orthe9db8d232019-01-14 21:24:45354}
355
Eric Ortha97f0f72020-10-16 16:10:32356DnsResponse BuildTestDnsServiceResponse(
Eric Ortha625b042019-01-16 01:14:45357 std::string name,
358 std::vector<TestServiceRecord> service_records,
359 std::string answer_name) {
360 if (answer_name.empty())
361 answer_name = name;
362
363 std::vector<DnsResourceRecord> answers;
364 for (TestServiceRecord& service_record : service_records) {
Eric Orth8539e492020-10-19 20:09:55365 std::string rdata;
366 char num_buffer[2];
367 base::WriteBigEndian(num_buffer, service_record.priority);
368 rdata.append(num_buffer, 2);
369 base::WriteBigEndian(num_buffer, service_record.weight);
370 rdata.append(num_buffer, 2);
371 base::WriteBigEndian(num_buffer, service_record.port);
372 rdata.append(num_buffer, 2);
Eric Orth0eeeef182022-12-01 23:49:57373
374 absl::optional<std::vector<uint8_t>> dns_name =
Eric Orth02c98932022-12-02 23:05:46375 dns_names_util::DottedNameToNetwork(service_record.target);
Eric Orth0eeeef182022-12-01 23:49:57376 CHECK(dns_name.has_value());
377 rdata.append(reinterpret_cast<char*>(dns_name.value().data()),
378 dns_name.value().size());
Eric Orth8539e492020-10-19 20:09:55379
380 answers.push_back(BuildTestDnsRecord(answer_name, dns_protocol::kTypeSRV,
Peter Kastinge5a38ed2021-10-02 03:06:35381 std::move(rdata), base::Hours(5)));
Eric Ortha625b042019-01-16 01:14:45382 }
383
Eric Orth8539e492020-10-19 20:09:55384 return BuildTestDnsResponse(std::move(name), dns_protocol::kTypeSRV, answers);
Daniel McArdle2daa3ec2020-06-03 16:05:48385}
386
Eric Orth89726dd2020-10-13 20:19:53387MockDnsClientRule::Result::Result(ResultType type,
Eric Orthac9aafb2021-07-29 23:03:43388 absl::optional<DnsResponse> response,
389 absl::optional<int> net_error)
390 : type(type), response(std::move(response)), net_error(net_error) {}
Eric Orth828bd3ae2018-12-12 17:30:36391
Eric Ortha97f0f72020-10-16 16:10:32392MockDnsClientRule::Result::Result(DnsResponse response)
Peter Kastingd039b772021-08-18 00:06:20393 : type(ResultType::kOk),
394 response(std::move(response)),
395 net_error(absl::nullopt) {}
Eric Orth828bd3ae2018-12-12 17:30:36396
Peter Kastingd039b772021-08-18 00:06:20397MockDnsClientRule::Result::Result(Result&&) = default;
398
399MockDnsClientRule::Result& MockDnsClientRule::Result::operator=(Result&&) =
400 default;
Eric Orth828bd3ae2018-12-12 17:30:36401
402MockDnsClientRule::Result::~Result() = default;
403
Eric Orth502d5682019-04-12 00:21:33404MockDnsClientRule::MockDnsClientRule(const std::string& prefix,
405 uint16_t qtype,
dalyk4f4ac712019-05-31 16:33:13406 bool secure,
Eric Orth502d5682019-04-12 00:21:33407 Result result,
408 bool delay,
409 URLRequestContext* context)
410 : result(std::move(result)),
411 prefix(prefix),
412 qtype(qtype),
dalyk4f4ac712019-05-31 16:33:13413 secure(secure),
Eric Orth502d5682019-04-12 00:21:33414 delay(delay),
415 context(context) {}
416
417MockDnsClientRule::MockDnsClientRule(MockDnsClientRule&& rule) = default;
418
Eric Orth3421db382019-10-20 02:35:52419// A DnsTransaction which uses MockDnsClientRuleList to determine the response.
420class MockDnsTransactionFactory::MockTransaction
421 : public DnsTransaction,
422 public base::SupportsWeakPtr<MockTransaction> {
[email protected]78eac2a2012-03-14 19:09:27423 public:
Eric Orth3421db382019-10-20 02:35:52424 MockTransaction(const MockDnsClientRuleList& rules,
Eric Orthc4cca5d2021-07-02 19:59:01425 std::string hostname,
Eric Orth3421db382019-10-20 02:35:52426 uint16_t qtype,
427 bool secure,
Eric Orth7dc18e92020-02-13 20:27:56428 bool force_doh_server_available,
Eric Ortha093b092020-09-24 23:13:02429 SecureDnsMode secure_dns_mode,
Eric Orth7dc18e92020-02-13 20:27:56430 ResolveContext* resolve_context,
Eric Orth7a85ca52022-03-25 11:04:04431 bool fast_timeout)
Tsuyoshi Horo432981d52022-06-09 09:50:13432 : hostname_(std::move(hostname)), qtype_(qtype) {
Eric Orth7dc18e92020-02-13 20:27:56433 // Do not allow matching any rules if transaction is secure and no DoH
434 // servers are available.
435 if (!secure || force_doh_server_available ||
436 resolve_context->NumAvailableDohServers(
437 resolve_context->current_session_for_testing()) > 0) {
438 // Find the relevant rule which matches |qtype|, |secure|, prefix of
Eric Orthc4cca5d2021-07-02 19:59:01439 // |hostname_|, and |url_request_context| (iff the rule context is not
Eric Orth7dc18e92020-02-13 20:27:56440 // null).
Tsuyoshi Horo17ef47d02022-06-30 10:58:27441 for (const auto& rule : rules) {
442 const std::string& prefix = rule.prefix;
443 if ((rule.qtype == qtype) && (rule.secure == secure) &&
Eric Orthc4cca5d2021-07-02 19:59:01444 (hostname_.size() >= prefix.size()) &&
445 (hostname_.compare(0, prefix.size(), prefix) == 0) &&
Tsuyoshi Horo17ef47d02022-06-30 10:58:27446 (!rule.context ||
447 rule.context == resolve_context->url_request_context())) {
448 const MockDnsClientRule::Result* result = &rule.result;
Eric Orth7dc18e92020-02-13 20:27:56449 result_ = MockDnsClientRule::Result(result->type);
Eric Orthac9aafb2021-07-29 23:03:43450 result_.net_error = result->net_error;
Tsuyoshi Horo17ef47d02022-06-30 10:58:27451 delayed_ = rule.delay;
[email protected]daae1322013-09-05 18:26:50452
Eric Orth7dc18e92020-02-13 20:27:56453 // Generate a DnsResponse when not provided with the rule.
454 std::vector<DnsResourceRecord> authority_records;
Eric Orth0eeeef182022-12-01 23:49:57455 absl::optional<std::vector<uint8_t>> dns_name =
Eric Orth02c98932022-12-02 23:05:46456 dns_names_util::DottedNameToNetwork(hostname_);
Eric Orth0eeeef182022-12-01 23:49:57457 CHECK(dns_name.has_value());
458 absl::optional<DnsQuery> query(absl::in_place, /*id=*/22,
459 dns_name.value(), qtype_);
Eric Orth7dc18e92020-02-13 20:27:56460 switch (result->type) {
Peter Kastingd039b772021-08-18 00:06:20461 case MockDnsClientRule::ResultType::kNoDomain:
462 case MockDnsClientRule::ResultType::kEmpty:
Eric Orth7dc18e92020-02-13 20:27:56463 DCHECK(!result->response); // Not expected to be provided.
Eric Orth8539e492020-10-19 20:09:55464 authority_records = {BuildTestDnsRecord(
465 hostname_, dns_protocol::kTypeSOA, "fake rdata")};
Eric Ortha97f0f72020-10-16 16:10:32466 result_.response = DnsResponse(
Eric Orth7dc18e92020-02-13 20:27:56467 22 /* id */, false /* is_authoritative */,
468 std::vector<DnsResourceRecord>() /* answers */,
469 authority_records,
470 std::vector<DnsResourceRecord>() /* additional_records */,
471 query,
Peter Kastingd039b772021-08-18 00:06:20472 result->type == MockDnsClientRule::ResultType::kNoDomain
Eric Orth7dc18e92020-02-13 20:27:56473 ? dns_protocol::kRcodeNXDOMAIN
474 : 0);
475 break;
Peter Kastingd039b772021-08-18 00:06:20476 case MockDnsClientRule::ResultType::kFail:
Eric Orthac9aafb2021-07-29 23:03:43477 if (result->response)
478 SetResponse(result);
479 break;
Peter Kastingd039b772021-08-18 00:06:20480 case MockDnsClientRule::ResultType::kTimeout:
Eric Orth7dc18e92020-02-13 20:27:56481 DCHECK(!result->response); // Not expected to be provided.
482 break;
Peter Kastingd039b772021-08-18 00:06:20483 case MockDnsClientRule::ResultType::kSlow:
Eric Orth89726dd2020-10-13 20:19:53484 if (!fast_timeout)
485 SetResponse(result);
486 break;
Peter Kastingd039b772021-08-18 00:06:20487 case MockDnsClientRule::ResultType::kOk:
Eric Orth89726dd2020-10-13 20:19:53488 SetResponse(result);
Eric Orth7dc18e92020-02-13 20:27:56489 break;
Peter Kastingd039b772021-08-18 00:06:20490 case MockDnsClientRule::ResultType::kMalformed:
Eric Orth7dc18e92020-02-13 20:27:56491 DCHECK(!result->response); // Not expected to be provided.
492 result_.response = CreateMalformedResponse(hostname_, qtype_);
493 break;
Peter Kastingd039b772021-08-18 00:06:20494 case MockDnsClientRule::ResultType::kUnexpected:
Eric Orth761feee2022-03-31 22:21:35495 if (!delayed_) {
496 // Assume a delayed kUnexpected transaction is only an issue if
497 // allowed to complete.
498 ADD_FAILURE()
499 << "Unexpected DNS transaction created for hostname "
500 << hostname_;
501 }
Eric Orthcf8e00f2021-07-24 00:41:24502 break;
Eric Orth7dc18e92020-02-13 20:27:56503 }
Eric Orth2a61be82020-02-12 17:56:48504
Eric Orth7dc18e92020-02-13 20:27:56505 break;
506 }
Eric Orth3421db382019-10-20 02:35:52507 }
[email protected]daae1322013-09-05 18:26:50508 }
[email protected]0adcb2b2012-08-15 21:30:46509 }
510
Eric Orth3421db382019-10-20 02:35:52511 const std::string& GetHostname() const override { return hostname_; }
[email protected]daae1322013-09-05 18:26:50512
Eric Orth3421db382019-10-20 02:35:52513 uint16_t GetType() const override { return qtype_; }
514
Eric Orth7a85ca52022-03-25 11:04:04515 void Start(ResponseCallback callback) override {
516 CHECK(!callback.is_null());
517 CHECK(callback_.is_null());
Eric Orth3421db382019-10-20 02:35:52518 EXPECT_FALSE(started_);
Eric Orth7a85ca52022-03-25 11:04:04519
520 callback_ = std::move(callback);
Eric Orth3421db382019-10-20 02:35:52521 started_ = true;
522 if (delayed_)
523 return;
524 // Using WeakPtr to cleanly cancel when transaction is destroyed.
Sean Maher5b9af51f2022-11-21 15:32:47525 base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
Eric Orth3421db382019-10-20 02:35:52526 FROM_HERE, base::BindOnce(&MockTransaction::Finish, AsWeakPtr()));
527 }
528
529 void FinishDelayedTransaction() {
530 EXPECT_TRUE(delayed_);
531 delayed_ = false;
532 Finish();
533 }
534
535 bool delayed() const { return delayed_; }
536
537 private:
Eric Orth89726dd2020-10-13 20:19:53538 void SetResponse(const MockDnsClientRule::Result* result) {
539 if (result->response) {
540 // Copy response in case |result| is destroyed before the transaction
541 // completes.
Eric Ortha97f0f72020-10-16 16:10:32542 auto buffer_copy =
543 base::MakeRefCounted<IOBuffer>(result->response->io_buffer_size());
544 memcpy(buffer_copy->data(), result->response->io_buffer()->data(),
545 result->response->io_buffer_size());
546 result_.response = DnsResponse(std::move(buffer_copy),
547 result->response->io_buffer_size());
Eric Orth89726dd2020-10-13 20:19:53548 CHECK(result_.response->InitParseWithoutQuery(
549 result->response->io_buffer_size()));
550 } else {
551 // Generated response only available for address types.
552 DCHECK(qtype_ == dns_protocol::kTypeA ||
553 qtype_ == dns_protocol::kTypeAAAA);
Eric Ortha97f0f72020-10-16 16:10:32554 result_.response = BuildTestDnsAddressResponse(
555 hostname_, qtype_ == dns_protocol::kTypeA
556 ? IPAddress::IPv4Localhost()
557 : IPAddress::IPv6Localhost());
Eric Orth89726dd2020-10-13 20:19:53558 }
559 }
560
Eric Orth3421db382019-10-20 02:35:52561 void Finish() {
562 switch (result_.type) {
Peter Kastingd039b772021-08-18 00:06:20563 case MockDnsClientRule::ResultType::kNoDomain:
564 case MockDnsClientRule::ResultType::kFail: {
Eric Orthac9aafb2021-07-29 23:03:43565 int error = result_.net_error.value_or(ERR_NAME_NOT_RESOLVED);
566 DCHECK_NE(error, OK);
Daniel Cheng522adbb2022-08-29 17:18:57567 std::move(callback_).Run(error, base::OptionalToPtr(result_.response));
Eric Orth3421db382019-10-20 02:35:52568 break;
Eric Orthac9aafb2021-07-29 23:03:43569 }
Peter Kastingd039b772021-08-18 00:06:20570 case MockDnsClientRule::ResultType::kEmpty:
571 case MockDnsClientRule::ResultType::kOk:
572 case MockDnsClientRule::ResultType::kMalformed:
Eric Orthac9aafb2021-07-29 23:03:43573 DCHECK(!result_.net_error.has_value());
Daniel Cheng522adbb2022-08-29 17:18:57574 std::move(callback_).Run(OK, base::OptionalToPtr(result_.response));
Eric Orth3421db382019-10-20 02:35:52575 break;
Peter Kastingd039b772021-08-18 00:06:20576 case MockDnsClientRule::ResultType::kTimeout:
Eric Orthac9aafb2021-07-29 23:03:43577 DCHECK(!result_.net_error.has_value());
Dan McArdle6cbd4182022-06-13 21:23:54578 std::move(callback_).Run(ERR_DNS_TIMED_OUT, /*response=*/nullptr);
Eric Orth3421db382019-10-20 02:35:52579 break;
Peter Kastingd039b772021-08-18 00:06:20580 case MockDnsClientRule::ResultType::kSlow:
Eric Orth89726dd2020-10-13 20:19:53581 if (result_.response) {
Eric Ortha97f0f72020-10-16 16:10:32582 std::move(callback_).Run(
Eric Orth7a85ca52022-03-25 11:04:04583 result_.net_error.value_or(OK),
Dan McArdle6cbd4182022-06-13 21:23:54584 result_.response ? &result_.response.value() : nullptr);
Eric Orth89726dd2020-10-13 20:19:53585 } else {
Eric Orthac9aafb2021-07-29 23:03:43586 DCHECK(!result_.net_error.has_value());
Dan McArdle6cbd4182022-06-13 21:23:54587 std::move(callback_).Run(ERR_DNS_TIMED_OUT, /*response=*/nullptr);
Eric Orth89726dd2020-10-13 20:19:53588 }
Eric Orthcf8e00f2021-07-24 00:41:24589 break;
Peter Kastingd039b772021-08-18 00:06:20590 case MockDnsClientRule::ResultType::kUnexpected:
Eric Orthcf8e00f2021-07-24 00:41:24591 ADD_FAILURE() << "Unexpected DNS transaction completed for hostname "
592 << hostname_;
593 break;
Eric Orth3421db382019-10-20 02:35:52594 }
595 }
596
597 void SetRequestPriority(RequestPriority priority) override {}
598
Tsuyoshi Horo432981d52022-06-09 09:50:13599 MockDnsClientRule::Result result_{MockDnsClientRule::ResultType::kFail};
Eric Orth3421db382019-10-20 02:35:52600 const std::string hostname_;
601 const uint16_t qtype_;
Eric Orth7a85ca52022-03-25 11:04:04602 ResponseCallback callback_;
603 bool started_ = false;
604 bool delayed_ = false;
[email protected]0adcb2b2012-08-15 21:30:46605};
606
Eric Orth41b249e02020-01-03 20:21:47607class MockDnsTransactionFactory::MockDohProbeRunner : public DnsProbeRunner {
608 public:
609 explicit MockDohProbeRunner(base::WeakPtr<MockDnsTransactionFactory> factory)
610 : factory_(std::move(factory)) {}
611
612 ~MockDohProbeRunner() override {
613 if (factory_)
614 factory_->running_doh_probe_runners_.erase(this);
615 }
616
Eric Orth020e5fe2020-03-12 17:43:43617 void Start(bool network_change) override {
Eric Orth41b249e02020-01-03 20:21:47618 DCHECK(factory_);
619 factory_->running_doh_probe_runners_.insert(this);
620 }
621
Eric Orth41b249e02020-01-03 20:21:47622 base::TimeDelta GetDelayUntilNextProbeForTest(
623 size_t doh_server_index) const override {
624 NOTREACHED();
625 return base::TimeDelta();
626 }
627
628 private:
629 base::WeakPtr<MockDnsTransactionFactory> factory_;
630};
631
Eric Orth3421db382019-10-20 02:35:52632MockDnsTransactionFactory::MockDnsTransactionFactory(
633 MockDnsClientRuleList rules)
634 : rules_(std::move(rules)) {}
635
636MockDnsTransactionFactory::~MockDnsTransactionFactory() = default;
637
638std::unique_ptr<DnsTransaction> MockDnsTransactionFactory::CreateTransaction(
Eric Orthc4cca5d2021-07-02 19:59:01639 std::string hostname,
Eric Orth3421db382019-10-20 02:35:52640 uint16_t qtype,
Eric Orth3421db382019-10-20 02:35:52641 const NetLogWithSource&,
642 bool secure,
Eric Ortha093b092020-09-24 23:13:02643 SecureDnsMode secure_dns_mode,
Eric Orth89726dd2020-10-13 20:19:53644 ResolveContext* resolve_context,
645 bool fast_timeout) {
Eric Orth3421db382019-10-20 02:35:52646 std::unique_ptr<MockTransaction> transaction =
Eric Orthc4cca5d2021-07-02 19:59:01647 std::make_unique<MockTransaction>(rules_, std::move(hostname), qtype,
648 secure, force_doh_server_available_,
649 secure_dns_mode, resolve_context,
Eric Orth7a85ca52022-03-25 11:04:04650 fast_timeout);
Eric Orth3421db382019-10-20 02:35:52651 if (transaction->delayed())
652 delayed_transactions_.push_back(transaction->AsWeakPtr());
653 return transaction;
654}
655
Eric Orth41b249e02020-01-03 20:21:47656std::unique_ptr<DnsProbeRunner> MockDnsTransactionFactory::CreateDohProbeRunner(
Eric Orth069a3c6e2020-01-31 23:14:24657 ResolveContext* resolve_context) {
Eric Orth41b249e02020-01-03 20:21:47658 return std::make_unique<MockDohProbeRunner>(weak_ptr_factory_.GetWeakPtr());
659}
660
Sukrit Ganesh432190c2022-08-09 19:14:21661void MockDnsTransactionFactory::AddEDNSOption(
662 std::unique_ptr<OptRecordRdata::Opt> opt) {}
Eric Orth3421db382019-10-20 02:35:52663
Eric Ortha093b092020-09-24 23:13:02664SecureDnsMode MockDnsTransactionFactory::GetSecureDnsModeForTest() {
665 return SecureDnsMode::kAutomatic;
Eric Orth3421db382019-10-20 02:35:52666}
667
668void MockDnsTransactionFactory::CompleteDelayedTransactions() {
669 DelayedTransactionList old_delayed_transactions;
670 old_delayed_transactions.swap(delayed_transactions_);
Tsuyoshi Horo17ef47d02022-06-30 10:58:27671 for (auto& old_delayed_transaction : old_delayed_transactions) {
672 if (old_delayed_transaction.get())
673 old_delayed_transaction->FinishDelayedTransaction();
Eric Orth3421db382019-10-20 02:35:52674 }
675}
676
David Van Cleve1fb5e8c2019-11-04 16:45:16677bool MockDnsTransactionFactory::CompleteOneDelayedTransactionOfType(
678 DnsQueryType type) {
679 for (base::WeakPtr<MockTransaction>& t : delayed_transactions_) {
680 if (t && t->GetType() == DnsQueryTypeToQtype(type)) {
681 t->FinishDelayedTransaction();
682 t.reset();
683 return true;
684 }
685 }
686 return false;
687}
688
Eric Orth394db1732019-08-27 20:09:39689MockDnsClient::MockDnsClient(DnsConfig config, MockDnsClientRuleList rules)
690 : config_(std::move(config)),
Tsuyoshi Horof8861cb2022-07-05 23:50:20691 factory_(std::make_unique<MockDnsTransactionFactory>(std::move(rules))),
692 address_sorter_(std::make_unique<MockAddressSorter>()) {
Eric Orth394db1732019-08-27 20:09:39693 effective_config_ = BuildEffectiveConfig();
Eric Orthaf82b49a2020-02-01 01:48:50694 session_ = BuildSession();
Eric Orth394db1732019-08-27 20:09:39695}
[email protected]78eac2a2012-03-14 19:09:27696
Chris Watkins68b15032017-12-01 03:07:13697MockDnsClient::~MockDnsClient() = default;
[email protected]78eac2a2012-03-14 19:09:27698
Eric Orth394db1732019-08-27 20:09:39699bool MockDnsClient::CanUseSecureDnsTransactions() const {
700 const DnsConfig* config = GetEffectiveConfig();
Benjamin M. Schwartz5f948312022-02-16 15:37:37701 return config && config->IsValid() && !config->doh_config.servers().empty();
[email protected]daae1322013-09-05 18:26:50702}
[email protected]78eac2a2012-03-14 19:09:27703
Eric Orth394db1732019-08-27 20:09:39704bool MockDnsClient::CanUseInsecureDnsTransactions() const {
705 const DnsConfig* config = GetEffectiveConfig();
706 return config && config->IsValid() && insecure_enabled_ &&
707 !config->dns_over_tls_active;
708}
709
Eric Orth09746312021-05-05 15:44:58710bool MockDnsClient::CanQueryAdditionalTypesViaInsecureDns() const {
711 DCHECK(CanUseInsecureDnsTransactions());
712 return additional_types_enabled_;
713}
714
715void MockDnsClient::SetInsecureEnabled(bool enabled,
716 bool additional_types_enabled) {
Eric Orth394db1732019-08-27 20:09:39717 insecure_enabled_ = enabled;
Eric Orth09746312021-05-05 15:44:58718 additional_types_enabled_ = additional_types_enabled;
Eric Orth394db1732019-08-27 20:09:39719}
720
Eric Orth069a3c6e2020-01-31 23:14:24721bool MockDnsClient::FallbackFromSecureTransactionPreferred(
722 ResolveContext* context) const {
Eric Orth7dc18e92020-02-13 20:27:56723 bool doh_server_available =
724 force_doh_server_available_ ||
725 context->NumAvailableDohServers(session_.get()) > 0;
726 return !CanUseSecureDnsTransactions() || !doh_server_available;
dalykc2adf182019-09-02 14:31:22727}
728
Eric Orth394db1732019-08-27 20:09:39729bool MockDnsClient::FallbackFromInsecureTransactionPreferred() const {
730 return !CanUseInsecureDnsTransactions() ||
731 fallback_failures_ >= max_fallback_failures_;
732}
733
Anton Bikineev068d2912021-05-15 20:43:52734bool MockDnsClient::SetSystemConfig(absl::optional<DnsConfig> system_config) {
Eric Orth394db1732019-08-27 20:09:39735 if (ignore_system_config_changes_)
736 return false;
737
Anton Bikineev068d2912021-05-15 20:43:52738 absl::optional<DnsConfig> before = effective_config_;
Eric Orth394db1732019-08-27 20:09:39739 config_ = std::move(system_config);
740 effective_config_ = BuildEffectiveConfig();
Eric Orthaf82b49a2020-02-01 01:48:50741 session_ = BuildSession();
Eric Orth394db1732019-08-27 20:09:39742 return before != effective_config_;
743}
744
745bool MockDnsClient::SetConfigOverrides(DnsConfigOverrides config_overrides) {
Anton Bikineev068d2912021-05-15 20:43:52746 absl::optional<DnsConfig> before = effective_config_;
Eric Orth394db1732019-08-27 20:09:39747 overrides_ = std::move(config_overrides);
748 effective_config_ = BuildEffectiveConfig();
Eric Orthaf82b49a2020-02-01 01:48:50749 session_ = BuildSession();
Eric Orth394db1732019-08-27 20:09:39750 return before != effective_config_;
751}
752
Eric Orth020e5fe2020-03-12 17:43:43753void MockDnsClient::ReplaceCurrentSession() {
754 // Noop if no current effective config.
755 session_ = BuildSession();
756}
757
Eric Orthaf82b49a2020-02-01 01:48:50758DnsSession* MockDnsClient::GetCurrentSession() {
759 return session_.get();
760}
761
Eric Orth394db1732019-08-27 20:09:39762const DnsConfig* MockDnsClient::GetEffectiveConfig() const {
763 return effective_config_.has_value() ? &effective_config_.value() : nullptr;
764}
765
Dan McArdle312ba6e2022-03-29 18:49:55766base::Value MockDnsClient::GetDnsConfigAsValueForNetLog() const {
767 // This is just a stub implementation that never produces a meaningful value.
768 return base::Value(base::Value::Dict());
769}
770
Eric Orth394db1732019-08-27 20:09:39771const DnsHosts* MockDnsClient::GetHosts() const {
772 const DnsConfig* config = GetEffectiveConfig();
773 if (!config)
774 return nullptr;
775
776 return &config->hosts;
[email protected]daae1322013-09-05 18:26:50777}
[email protected]78eac2a2012-03-14 19:09:27778
[email protected]daae1322013-09-05 18:26:50779DnsTransactionFactory* MockDnsClient::GetTransactionFactory() {
Eric Orth394db1732019-08-27 20:09:39780 return GetEffectiveConfig() ? factory_.get() : nullptr;
[email protected]daae1322013-09-05 18:26:50781}
[email protected]78eac2a2012-03-14 19:09:27782
[email protected]daae1322013-09-05 18:26:50783AddressSorter* MockDnsClient::GetAddressSorter() {
Eric Orth394db1732019-08-27 20:09:39784 return GetEffectiveConfig() ? address_sorter_.get() : nullptr;
785}
786
787void MockDnsClient::IncrementInsecureFallbackFailures() {
788 ++fallback_failures_;
789}
790
791void MockDnsClient::ClearInsecureFallbackFailures() {
792 fallback_failures_ = 0;
793}
794
Anton Bikineev068d2912021-05-15 20:43:52795absl::optional<DnsConfig> MockDnsClient::GetSystemConfigForTesting() const {
Eric Orth394db1732019-08-27 20:09:39796 return config_;
797}
798
799DnsConfigOverrides MockDnsClient::GetConfigOverridesForTesting() const {
800 return overrides_;
[email protected]daae1322013-09-05 18:26:50801}
[email protected]0adcb2b2012-08-15 21:30:46802
Eric Orth3421db382019-10-20 02:35:52803void MockDnsClient::SetTransactionFactoryForTesting(
804 std::unique_ptr<DnsTransactionFactory> factory) {
805 NOTREACHED();
806}
807
Tsuyoshi Horodef72e42022-08-05 23:18:17808absl::optional<std::vector<IPEndPoint>> MockDnsClient::GetPresetAddrs(
Benjamin M. Schwartz6f719eb2021-12-15 17:47:28809 const url::SchemeHostPort& endpoint) const {
810 EXPECT_THAT(preset_endpoint_, testing::Optional(endpoint));
811 return preset_addrs_;
812}
813
[email protected]daae1322013-09-05 18:26:50814void MockDnsClient::CompleteDelayedTransactions() {
815 factory_->CompleteDelayedTransactions();
[email protected]78eac2a2012-03-14 19:09:27816}
817
David Van Cleve1fb5e8c2019-11-04 16:45:16818bool MockDnsClient::CompleteOneDelayedTransactionOfType(DnsQueryType type) {
819 return factory_->CompleteOneDelayedTransactionOfType(type);
820}
821
Eric Orth7dc18e92020-02-13 20:27:56822void MockDnsClient::SetForceDohServerAvailable(bool available) {
823 force_doh_server_available_ = available;
824 factory_->set_force_doh_server_available(available);
825}
826
Anton Bikineev068d2912021-05-15 20:43:52827absl::optional<DnsConfig> MockDnsClient::BuildEffectiveConfig() {
Eric Orth394db1732019-08-27 20:09:39828 if (overrides_.OverridesEverything())
829 return overrides_.ApplyOverrides(DnsConfig());
830 if (!config_ || !config_.value().IsValid())
Anton Bikineev068d2912021-05-15 20:43:52831 return absl::nullopt;
Eric Orth394db1732019-08-27 20:09:39832
833 return overrides_.ApplyOverrides(config_.value());
834}
835
Eric Orthaf82b49a2020-02-01 01:48:50836scoped_refptr<DnsSession> MockDnsClient::BuildSession() {
837 if (!effective_config_)
838 return nullptr;
839
840 // Session not expected to be used for anything that will actually require
841 // random numbers.
842 auto null_random_callback =
Peter Boström25c6ec72022-11-02 23:25:19843 base::BindRepeating([](int, int) -> int { base::ImmediateCrash(); });
Eric Orthaf82b49a2020-02-01 01:48:50844
845 return base::MakeRefCounted<DnsSession>(
Liza Burakovab8d8dc02022-04-01 22:10:46846 effective_config_.value(), null_random_callback, nullptr /* net_log */);
Eric Orthaf82b49a2020-02-01 01:48:50847}
848
[email protected]78eac2a2012-03-14 19:09:27849} // namespace net