blob: 0346427fa408eafb821b6c184b713b241b64b518 [file] [log] [blame]
Ken Chenb9fa2062018-11-13 21:51:13 +08001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
Lorenzo Colitti0a8b4aa2019-06-26 22:31:03 +090010 * Unless required by applicable law or agreed to in writing, software
Ken Chenb9fa2062018-11-13 21:51:13 +080011 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *
16 */
17
Bernie Innocenti3952ccc2019-03-03 19:39:53 +090018#define LOG_TAG "resolv_integration_test"
Ken Chenb9fa2062018-11-13 21:51:13 +080019
Hungming Chen5bf09772019-04-25 11:16:13 +080020#include <android-base/logging.h>
Bernie Innocenti41b82c42019-06-05 22:38:25 +090021#include <android-base/parseint.h>
Mike Yu40e67072019-10-09 21:14:09 +080022#include <android-base/properties.h>
Bernie Innocenti41b82c42019-06-05 22:38:25 +090023#include <android-base/stringprintf.h>
24#include <android-base/unique_fd.h>
25#include <android/multinetwork.h> // ResNsendFlags
Ken Chenb9fa2062018-11-13 21:51:13 +080026#include <arpa/inet.h>
Luke Huang94b10b92018-11-21 20:13:38 +080027#include <arpa/nameser.h>
Hungming Chene8f970c2019-04-10 17:34:06 +080028#include <binder/ProcessState.h>
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +090029#include <bpf/BpfUtils.h>
Bernie Innocenti41b82c42019-06-05 22:38:25 +090030#include <cutils/sockets.h>
31#include <gmock/gmock-matchers.h>
32#include <gtest/gtest.h>
Ken Chenb9fa2062018-11-13 21:51:13 +080033#include <netdb.h>
Luke Huang9d2d25b2019-06-14 00:34:05 +080034#include <netdutils/InternetAddresses.h>
Luke Huang579ddc72019-06-14 00:59:39 +080035#include <netdutils/NetworkConstants.h> // SHA256_SIZE
Luke Huang9d2d25b2019-06-14 00:34:05 +080036#include <netdutils/ResponseCode.h>
Hungming Chen63779052019-10-30 15:06:13 +080037#include <netdutils/Slice.h>
Luke Huang9d2d25b2019-06-14 00:34:05 +080038#include <netdutils/SocketOption.h>
Mike Yu40e67072019-10-09 21:14:09 +080039#include <netdutils/Stopwatch.h>
Luke Huang94b10b92018-11-21 20:13:38 +080040#include <netinet/in.h>
41#include <poll.h> /* poll */
Bernie Innocenti41b82c42019-06-05 22:38:25 +090042#include <private/android_filesystem_config.h>
Luke Huang94b10b92018-11-21 20:13:38 +080043#include <resolv.h>
Ken Chenb9fa2062018-11-13 21:51:13 +080044#include <stdarg.h>
Ken Chenb9fa2062018-11-13 21:51:13 +080045#include <stdlib.h>
Luke Huang94b10b92018-11-21 20:13:38 +080046#include <sys/socket.h>
47#include <sys/un.h>
Ken Chenb9fa2062018-11-13 21:51:13 +080048#include <unistd.h>
49
50#include <algorithm>
51#include <chrono>
52#include <iterator>
53#include <numeric>
54#include <thread>
55
Luke Huangf8215372019-11-22 11:53:41 +080056#include <aidl/android/net/IDnsResolver.h>
57#include <android/binder_manager.h>
58#include <android/binder_process.h>
Bernie Innocenti41b82c42019-06-05 22:38:25 +090059#include "NetdClient.h"
Bernie Innocenti41b82c42019-06-05 22:38:25 +090060#include "ResolverStats.h"
Luke Huangf8215372019-11-22 11:53:41 +080061#include "netid_client.h" // NETID_UNSET
62#include "params.h" // MAXNS
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +090063#include "test_utils.h"
Hungming Chene8f970c2019-04-10 17:34:06 +080064#include "tests/dns_metrics_listener/dns_metrics_listener.h"
chenbruceb43ec752019-07-24 20:19:41 +080065#include "tests/dns_responder/dns_responder.h"
Luke Huangf8215372019-11-22 11:53:41 +080066#include "tests/dns_responder/dns_responder_client_ndk.h"
Hungming Chenc6556622019-10-02 16:01:07 +080067#include "tests/dns_responder/dns_tls_certificate.h"
chenbruceb43ec752019-07-24 20:19:41 +080068#include "tests/dns_responder/dns_tls_frontend.h"
Luke Huangfde82482019-06-04 01:04:53 +080069#include "tests/resolv_test_utils.h"
Ken Chenb9fa2062018-11-13 21:51:13 +080070
Luke Huang0d592bc2019-05-25 18:24:03 +080071// Valid VPN netId range is 100 ~ 65535
72constexpr int TEST_VPN_NETID = 65502;
Luke Huang94b10b92018-11-21 20:13:38 +080073constexpr int MAXPACKET = (8 * 1024);
Ken Chenb9fa2062018-11-13 21:51:13 +080074
Sehee Park2c118782019-05-07 13:02:45 +090075// Use maximum reserved appId for applications to avoid conflict with existing uids.
76static const int TEST_UID = 99999;
77
Ken Chenb9fa2062018-11-13 21:51:13 +080078// Semi-public Bionic hook used by the NDK (frameworks/base/native/android/net.c)
79// Tested here for convenience.
80extern "C" int android_getaddrinfofornet(const char* hostname, const char* servname,
81 const addrinfo* hints, unsigned netid, unsigned mark,
82 struct addrinfo** result);
83
Luke Huang70070852019-11-25 18:25:50 +080084using aidl::android::net::IDnsResolver;
Luke Huangf8215372019-11-22 11:53:41 +080085using aidl::android::net::INetd;
Mike Yu8ac63402019-12-02 15:28:38 +080086using aidl::android::net::ResolverParamsParcel;
Luke Huang9807e6b2019-05-20 16:17:12 +080087using android::base::ParseInt;
Ken Chenb9fa2062018-11-13 21:51:13 +080088using android::base::StringPrintf;
Luke Huang9807e6b2019-05-20 16:17:12 +080089using android::base::unique_fd;
Ken Chenb9fa2062018-11-13 21:51:13 +080090using android::net::ResolverStats;
Hungming Chene8f970c2019-04-10 17:34:06 +080091using android::net::metrics::DnsMetricsListener;
Ken Chenb9fa2062018-11-13 21:51:13 +080092using android::netdutils::enableSockopt;
Hungming Chen63779052019-10-30 15:06:13 +080093using android::netdutils::makeSlice;
Luke Huang9807e6b2019-05-20 16:17:12 +080094using android::netdutils::ResponseCode;
Luke Huang9d2d25b2019-06-14 00:34:05 +080095using android::netdutils::ScopedAddrinfo;
Mike Yu40e67072019-10-09 21:14:09 +080096using android::netdutils::Stopwatch;
Hungming Chen63779052019-10-30 15:06:13 +080097using android::netdutils::toHex;
Ken Chenb9fa2062018-11-13 21:51:13 +080098
99// TODO: move into libnetdutils?
100namespace {
Luke Huangfde82482019-06-04 01:04:53 +0800101
Ken Chenb9fa2062018-11-13 21:51:13 +0800102ScopedAddrinfo safe_getaddrinfo(const char* node, const char* service,
103 const struct addrinfo* hints) {
104 addrinfo* result = nullptr;
105 if (getaddrinfo(node, service, hints, &result) != 0) {
106 result = nullptr; // Should already be the case, but...
107 }
108 return ScopedAddrinfo(result);
109}
Luke Huangfde82482019-06-04 01:04:53 +0800110
Mike Yu40e67072019-10-09 21:14:09 +0800111std::pair<ScopedAddrinfo, int> safe_getaddrinfo_time_taken(const char* node, const char* service,
112 const addrinfo& hints) {
113 Stopwatch s;
114 ScopedAddrinfo result = safe_getaddrinfo(node, service, &hints);
115 return {std::move(result), s.timeTakenUs() / 1000};
116}
117
Ken Chenb9fa2062018-11-13 21:51:13 +0800118} // namespace
119
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900120class ResolverTest : public ::testing::Test {
Hungming Chene8f970c2019-04-10 17:34:06 +0800121 public:
Automerger Merge Worker19a291b2020-03-17 02:41:30 +0000122 static void SetUpTestSuite() {
Hungming Chen5bf09772019-04-25 11:16:13 +0800123 // Get binder service.
124 // Note that |mDnsClient| is not used for getting binder service in this static function.
125 // The reason is that wants to keep |mDnsClient| as a non-static data member. |mDnsClient|
126 // which sets up device network configuration could be independent from every test.
Luke Huangf8215372019-11-22 11:53:41 +0800127 // TODO: Perhaps add a static function in resolv_test_binder_utils.{cpp,h} to get binder
128 // service.
129
130 AIBinder* binder = AServiceManager_getService("dnsresolver");
131 ndk::SpAIBinder resolvBinder = ndk::SpAIBinder(binder);
132 auto resolvService = aidl::android::net::IDnsResolver::fromBinder(resolvBinder);
Hungming Chen5bf09772019-04-25 11:16:13 +0800133 ASSERT_NE(nullptr, resolvService.get());
134
135 // Subscribe the death recipient to the service IDnsResolver for detecting Netd death.
Luke Huang70070852019-11-25 18:25:50 +0800136 // GTEST assertion macros are not invoked for generating a test failure in the death
137 // recipient because the macros can't indicate failed test if Netd died between tests.
138 // Moreover, continuing testing may have no meaningful after Netd death. Therefore, the
139 // death recipient aborts process by GTEST_LOG_(FATAL) once Netd died.
Luke Huangf8215372019-11-22 11:53:41 +0800140 sResolvDeathRecipient = AIBinder_DeathRecipient_new([](void*) {
141 constexpr char errorMessage[] = "Netd died";
142 LOG(ERROR) << errorMessage;
143 GTEST_LOG_(FATAL) << errorMessage;
144 });
145 ASSERT_EQ(STATUS_OK, AIBinder_linkToDeath(binder, sResolvDeathRecipient, nullptr));
Hungming Chen5bf09772019-04-25 11:16:13 +0800146
147 // Subscribe the DNS listener for verifying DNS metrics event contents.
Luke Huangf8215372019-11-22 11:53:41 +0800148 sDnsMetricsListener = ndk::SharedRefBase::make<DnsMetricsListener>(
149 TEST_NETID /*monitor specific network*/);
Hungming Chen5bf09772019-04-25 11:16:13 +0800150 ASSERT_TRUE(resolvService->registerEventListener(sDnsMetricsListener).isOk());
151
152 // Start the binder thread pool for listening DNS metrics events and receiving death
153 // recipient.
Luke Huangf8215372019-11-22 11:53:41 +0800154 ABinderProcess_startThreadPool();
Hungming Chene8f970c2019-04-10 17:34:06 +0800155 }
Automerger Merge Worker19a291b2020-03-17 02:41:30 +0000156 static void TearDownTestSuite() { AIBinder_DeathRecipient_delete(sResolvDeathRecipient); }
Hungming Chene8f970c2019-04-10 17:34:06 +0800157
Ken Chenb9fa2062018-11-13 21:51:13 +0800158 protected:
Hungming Chen5bf09772019-04-25 11:16:13 +0800159 void SetUp() { mDnsClient.SetUp(); }
Mike Yu960243d2020-01-17 19:02:15 +0800160 void TearDown() {
161 // Ensure the dump works at the end of each test.
162 DumpResolverService();
163
164 mDnsClient.TearDown();
165 }
nuccachena26cc2a2018-07-17 18:07:23 +0800166
Xiao Ma09b71022018-12-11 17:56:32 +0900167 void StartDns(test::DNSResponder& dns, const std::vector<DnsRecord>& records) {
168 for (const auto& r : records) {
169 dns.addMapping(r.host_name, r.type, r.addr);
170 }
171
172 ASSERT_TRUE(dns.startServer());
173 dns.clearQueries();
174 }
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900175
Mike Yu960243d2020-01-17 19:02:15 +0800176 void DumpResolverService() {
177 unique_fd fd(open("/dev/null", O_WRONLY));
178 EXPECT_EQ(mDnsClient.resolvService()->dump(fd, nullptr, 0), 0);
179
180 const char* querylogCmd[] = {"querylog"}; // Keep it sync with DnsQueryLog::DUMP_KEYWORD.
181 EXPECT_EQ(mDnsClient.resolvService()->dump(fd, querylogCmd, std::size(querylogCmd)), 0);
182 }
183
Hungming Chene8f970c2019-04-10 17:34:06 +0800184 bool WaitForNat64Prefix(ExpectNat64PrefixStatus status,
185 std::chrono::milliseconds timeout = std::chrono::milliseconds(1000)) {
Hungming Chen5bf09772019-04-25 11:16:13 +0800186 return sDnsMetricsListener->waitForNat64Prefix(status, timeout);
Hungming Chene8f970c2019-04-10 17:34:06 +0800187 }
188
Mike Yu724f77d2019-08-16 11:14:50 +0800189 bool WaitForPrivateDnsValidation(std::string serverAddr, bool validated) {
190 return sDnsMetricsListener->waitForPrivateDnsValidation(serverAddr, validated);
191 }
192
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900193 DnsResponderClient mDnsClient;
Xiao Ma09b71022018-12-11 17:56:32 +0900194
Hungming Chen5bf09772019-04-25 11:16:13 +0800195 // Use a shared static DNS listener for all tests to avoid registering lots of listeners
196 // which may be released late until process terminated. Currently, registered DNS listener
197 // is removed by binder death notification which is fired when the process hosting an
198 // IBinder has gone away. If every test in ResolverTest registers its DNS listener, Netd
199 // may temporarily hold lots of dead listeners until the unit test process terminates.
200 // TODO: Perhaps add an unregistering listener binder call or fork a listener process which
201 // could be terminated earlier.
Luke Huangf8215372019-11-22 11:53:41 +0800202 static std::shared_ptr<DnsMetricsListener>
Automerger Merge Worker19a291b2020-03-17 02:41:30 +0000203 sDnsMetricsListener; // Initialized in SetUpTestSuite.
Hungming Chen5bf09772019-04-25 11:16:13 +0800204
205 // Use a shared static death recipient to monitor the service death. The static death
206 // recipient could monitor the death not only during the test but also between tests.
Automerger Merge Worker19a291b2020-03-17 02:41:30 +0000207 static AIBinder_DeathRecipient* sResolvDeathRecipient; // Initialized in SetUpTestSuite.
Ken Chenb9fa2062018-11-13 21:51:13 +0800208};
209
Hungming Chen5bf09772019-04-25 11:16:13 +0800210// Initialize static member of class.
Luke Huangf8215372019-11-22 11:53:41 +0800211std::shared_ptr<DnsMetricsListener> ResolverTest::sDnsMetricsListener;
212AIBinder_DeathRecipient* ResolverTest::sResolvDeathRecipient;
Hungming Chen5bf09772019-04-25 11:16:13 +0800213
Ken Chenb9fa2062018-11-13 21:51:13 +0800214TEST_F(ResolverTest, GetHostByName) {
Xiao Ma09b71022018-12-11 17:56:32 +0900215 constexpr char nonexistent_host_name[] = "nonexistent.example.com.";
216
217 test::DNSResponder dns;
218 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.3"}});
219 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800220
221 const hostent* result;
Ken Chenb9fa2062018-11-13 21:51:13 +0800222 result = gethostbyname("nonexistent");
223 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, nonexistent_host_name));
224 ASSERT_TRUE(result == nullptr);
225 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
226
227 dns.clearQueries();
228 result = gethostbyname("hello");
Xiao Ma09b71022018-12-11 17:56:32 +0900229 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
Ken Chenb9fa2062018-11-13 21:51:13 +0800230 ASSERT_FALSE(result == nullptr);
231 ASSERT_EQ(4, result->h_length);
232 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
233 EXPECT_EQ("1.2.3.3", ToString(result));
234 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800235}
236
lifr4e4a2e02019-01-29 16:53:51 +0800237TEST_F(ResolverTest, GetHostByName_cnames) {
238 constexpr char host_name[] = "host.example.com.";
239 size_t cnamecount = 0;
240 test::DNSResponder dns;
241
242 const std::vector<DnsRecord> records = {
243 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
244 {"a.example.com.", ns_type::ns_t_cname, "b.example.com."},
245 {"b.example.com.", ns_type::ns_t_cname, "c.example.com."},
246 {"c.example.com.", ns_type::ns_t_cname, "d.example.com."},
247 {"d.example.com.", ns_type::ns_t_cname, "e.example.com."},
248 {"e.example.com.", ns_type::ns_t_cname, host_name},
249 {host_name, ns_type::ns_t_a, "1.2.3.3"},
250 {host_name, ns_type::ns_t_aaaa, "2001:db8::42"},
251 };
252 StartDns(dns, records);
253 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
254
255 // using gethostbyname2() to resolve ipv4 hello.example.com. to 1.2.3.3
256 // Ensure the v4 address and cnames are correct
257 const hostent* result;
258 result = gethostbyname2("hello", AF_INET);
259 ASSERT_FALSE(result == nullptr);
260
261 for (int i = 0; result != nullptr && result->h_aliases[i] != nullptr; i++) {
262 std::string domain_name = records[i].host_name.substr(0, records[i].host_name.size() - 1);
263 EXPECT_EQ(result->h_aliases[i], domain_name);
264 cnamecount++;
265 }
266 // The size of "Non-cname type" record in DNS records is 2
267 ASSERT_EQ(cnamecount, records.size() - 2);
268 ASSERT_EQ(4, result->h_length);
269 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
270 EXPECT_EQ("1.2.3.3", ToString(result));
271 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
272 EXPECT_EQ(1U, dns.queries().size()) << dns.dumpQueries();
273
274 // using gethostbyname2() to resolve ipv6 hello.example.com. to 2001:db8::42
275 // Ensure the v6 address and cnames are correct
276 cnamecount = 0;
277 dns.clearQueries();
278 result = gethostbyname2("hello", AF_INET6);
279 for (unsigned i = 0; result != nullptr && result->h_aliases[i] != nullptr; i++) {
280 std::string domain_name = records[i].host_name.substr(0, records[i].host_name.size() - 1);
281 EXPECT_EQ(result->h_aliases[i], domain_name);
282 cnamecount++;
283 }
284 // The size of "Non-cname type" DNS record in records is 2
285 ASSERT_EQ(cnamecount, records.size() - 2);
286 ASSERT_FALSE(result == nullptr);
287 ASSERT_EQ(16, result->h_length);
288 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
289 EXPECT_EQ("2001:db8::42", ToString(result));
290 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
291}
292
293TEST_F(ResolverTest, GetHostByName_cnamesInfiniteLoop) {
294 test::DNSResponder dns;
295 const std::vector<DnsRecord> records = {
296 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
297 {"a.example.com.", ns_type::ns_t_cname, kHelloExampleCom},
298 };
299 StartDns(dns, records);
300 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
301
302 const hostent* result;
303 result = gethostbyname2("hello", AF_INET);
304 ASSERT_TRUE(result == nullptr);
305
306 dns.clearQueries();
307 result = gethostbyname2("hello", AF_INET6);
308 ASSERT_TRUE(result == nullptr);
309}
310
Ken Chenb9fa2062018-11-13 21:51:13 +0800311TEST_F(ResolverTest, GetHostByName_localhost) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800312 constexpr char name_camelcase[] = "LocalHost";
Ken Chenb9fa2062018-11-13 21:51:13 +0800313 constexpr char name_ip6_dot[] = "ip6-localhost.";
314 constexpr char name_ip6_fqdn[] = "ip6-localhost.example.com.";
315
316 // Add a dummy nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900317 test::DNSResponder dns;
318 StartDns(dns, {});
319 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800320
321 // Expect no DNS queries; localhost is resolved via /etc/hosts
Xiao Ma09b71022018-12-11 17:56:32 +0900322 const hostent* result = gethostbyname(kLocalHost);
Ken Chenb9fa2062018-11-13 21:51:13 +0800323 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
324 ASSERT_FALSE(result == nullptr);
325 ASSERT_EQ(4, result->h_length);
326 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900327 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800328 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
329
330 // Ensure the hosts file resolver ignores case of hostnames
331 result = gethostbyname(name_camelcase);
332 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
333 ASSERT_FALSE(result == nullptr);
334 ASSERT_EQ(4, result->h_length);
335 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900336 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800337 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
338
339 // The hosts file also contains ip6-localhost, but gethostbyname() won't
chenbruce018fdb22019-06-12 18:08:04 +0800340 // return it. This would be easy to
Ken Chenb9fa2062018-11-13 21:51:13 +0800341 // change, but there's no point in changing the legacy behavior; new code
342 // should be calling getaddrinfo() anyway.
343 // So we check the legacy behavior, which results in amusing A-record
344 // lookups for ip6-localhost, with and without search domains appended.
345 dns.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900346 result = gethostbyname(kIp6LocalHost);
Sehee Parkbbca0202018-11-16 10:53:16 +0900347 EXPECT_EQ(2U, dns.queries().size()) << dns.dumpQueries();
348 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, name_ip6_dot)) << dns.dumpQueries();
349 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, name_ip6_fqdn)) << dns.dumpQueries();
Ken Chenb9fa2062018-11-13 21:51:13 +0800350 ASSERT_TRUE(result == nullptr);
351
352 // Finally, use gethostbyname2() to resolve ip6-localhost to ::1 from
353 // the hosts file.
354 dns.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900355 result = gethostbyname2(kIp6LocalHost, AF_INET6);
Ken Chenb9fa2062018-11-13 21:51:13 +0800356 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
357 ASSERT_FALSE(result == nullptr);
358 ASSERT_EQ(16, result->h_length);
359 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900360 EXPECT_EQ(kIp6LocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800361 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800362}
363
364TEST_F(ResolverTest, GetHostByName_numeric) {
365 // Add a dummy nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900366 test::DNSResponder dns;
367 StartDns(dns, {});
368 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800369
370 // Numeric v4 address: expect no DNS queries
371 constexpr char numeric_v4[] = "192.168.0.1";
Ken Chenb9fa2062018-11-13 21:51:13 +0800372 const hostent* result = gethostbyname(numeric_v4);
Sehee Parkbbca0202018-11-16 10:53:16 +0900373 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800374 ASSERT_FALSE(result == nullptr);
375 ASSERT_EQ(4, result->h_length); // v4
376 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
377 EXPECT_EQ(numeric_v4, ToString(result));
378 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
379
380 // gethostbyname() recognizes a v6 address, and fails with no DNS queries
381 constexpr char numeric_v6[] = "2001:db8::42";
382 dns.clearQueries();
383 result = gethostbyname(numeric_v6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900384 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800385 EXPECT_TRUE(result == nullptr);
386
387 // Numeric v6 address with gethostbyname2(): succeeds with no DNS queries
388 dns.clearQueries();
389 result = gethostbyname2(numeric_v6, AF_INET6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900390 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800391 ASSERT_FALSE(result == nullptr);
392 ASSERT_EQ(16, result->h_length); // v6
393 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
394 EXPECT_EQ(numeric_v6, ToString(result));
395 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
396
397 // Numeric v6 address with scope work with getaddrinfo(),
398 // but gethostbyname2() does not understand them; it issues two dns
399 // queries, then fails. This hardly ever happens, there's no point
400 // in fixing this. This test simply verifies the current (bogus)
401 // behavior to avoid further regressions (like crashes, or leaks).
402 constexpr char numeric_v6_scope[] = "fe80::1%lo";
403 dns.clearQueries();
404 result = gethostbyname2(numeric_v6_scope, AF_INET6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900405 EXPECT_EQ(2U, dns.queries().size()); // OUCH!
Ken Chenb9fa2062018-11-13 21:51:13 +0800406 ASSERT_TRUE(result == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800407}
408
409TEST_F(ResolverTest, BinderSerialization) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800410 std::vector<int> params_offsets = {
Luke Huang5bd827c2019-03-14 16:10:04 +0800411 IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY,
412 IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD,
413 IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES,
414 IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES,
415 IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC,
416 IDnsResolver::RESOLVER_PARAMS_RETRY_COUNT,
Ken Chenb9fa2062018-11-13 21:51:13 +0800417 };
Bernie Innocentib102dd22018-12-04 14:57:48 +0900418 const int size = static_cast<int>(params_offsets.size());
Luke Huang5bd827c2019-03-14 16:10:04 +0800419 EXPECT_EQ(size, IDnsResolver::RESOLVER_PARAMS_COUNT);
Ken Chenb9fa2062018-11-13 21:51:13 +0800420 std::sort(params_offsets.begin(), params_offsets.end());
Bernie Innocentib102dd22018-12-04 14:57:48 +0900421 for (int i = 0; i < size; ++i) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800422 EXPECT_EQ(params_offsets[i], i);
423 }
424}
425
426TEST_F(ResolverTest, GetHostByName_Binder) {
Luke Huangf8215372019-11-22 11:53:41 +0800427 std::vector<std::string> domains = {"example.com"};
Ken Chenb9fa2062018-11-13 21:51:13 +0800428 std::vector<std::unique_ptr<test::DNSResponder>> dns;
429 std::vector<std::string> servers;
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900430 std::vector<DnsResponderClient::Mapping> mappings;
431 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupMappings(1, domains, &mappings));
432 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupDNSServers(4, mappings, &dns, &servers));
Ken Chenb9fa2062018-11-13 21:51:13 +0800433 ASSERT_EQ(1U, mappings.size());
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900434 const DnsResponderClient::Mapping& mapping = mappings[0];
Ken Chenb9fa2062018-11-13 21:51:13 +0800435
Xiao Ma09b71022018-12-11 17:56:32 +0900436 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains, kDefaultParams));
Ken Chenb9fa2062018-11-13 21:51:13 +0800437
438 const hostent* result = gethostbyname(mapping.host.c_str());
Bernie Innocentib102dd22018-12-04 14:57:48 +0900439 const size_t total_queries =
Luke Huangfde82482019-06-04 01:04:53 +0800440 std::accumulate(dns.begin(), dns.end(), 0, [&mapping](size_t total, auto& d) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800441 return total + GetNumQueriesForType(*d, ns_type::ns_t_a, mapping.entry.c_str());
442 });
443
444 EXPECT_LE(1U, total_queries);
445 ASSERT_FALSE(result == nullptr);
446 ASSERT_EQ(4, result->h_length);
447 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
448 EXPECT_EQ(mapping.ip4, ToString(result));
449 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
450
451 std::vector<std::string> res_servers;
452 std::vector<std::string> res_domains;
Mike Yu0a1c53d2018-11-26 13:26:21 +0900453 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +0900454 res_params res_params;
Ken Chenb9fa2062018-11-13 21:51:13 +0800455 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +0800456 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +0800457 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
458 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
459 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chenb9fa2062018-11-13 21:51:13 +0800460 EXPECT_EQ(servers.size(), res_servers.size());
461 EXPECT_EQ(domains.size(), res_domains.size());
Mike Yu0a1c53d2018-11-26 13:26:21 +0900462 EXPECT_EQ(0U, res_tls_servers.size());
Luke Huang5bd827c2019-03-14 16:10:04 +0800463 ASSERT_EQ(static_cast<size_t>(IDnsResolver::RESOLVER_PARAMS_COUNT), kDefaultParams.size());
464 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY],
465 res_params.sample_validity);
466 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900467 res_params.success_threshold);
Luke Huang5bd827c2019-03-14 16:10:04 +0800468 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
469 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
470 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
Ken Chenb9fa2062018-11-13 21:51:13 +0800471 res_params.base_timeout_msec);
472 EXPECT_EQ(servers.size(), res_stats.size());
473
Bernie Innocenti0c067e42019-04-01 15:33:16 +0900474 EXPECT_THAT(res_servers, testing::UnorderedElementsAreArray(servers));
475 EXPECT_THAT(res_domains, testing::UnorderedElementsAreArray(domains));
Ken Chenb9fa2062018-11-13 21:51:13 +0800476}
477
478TEST_F(ResolverTest, GetAddrInfo) {
Xiao Ma09b71022018-12-11 17:56:32 +0900479 constexpr char listen_addr[] = "127.0.0.4";
480 constexpr char listen_addr2[] = "127.0.0.5";
481 constexpr char host_name[] = "howdy.example.com.";
Ken Chenb9fa2062018-11-13 21:51:13 +0800482
Xiao Ma09b71022018-12-11 17:56:32 +0900483 const std::vector<DnsRecord> records = {
484 {host_name, ns_type::ns_t_a, "1.2.3.4"},
485 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
486 };
487 test::DNSResponder dns(listen_addr);
488 test::DNSResponder dns2(listen_addr2);
489 StartDns(dns, records);
490 StartDns(dns2, records);
Ken Chenb9fa2062018-11-13 21:51:13 +0800491
Xiao Ma09b71022018-12-11 17:56:32 +0900492 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}));
Ken Chenb9fa2062018-11-13 21:51:13 +0800493 dns.clearQueries();
494 dns2.clearQueries();
495
496 ScopedAddrinfo result = safe_getaddrinfo("howdy", nullptr, nullptr);
497 EXPECT_TRUE(result != nullptr);
498 size_t found = GetNumQueries(dns, host_name);
499 EXPECT_LE(1U, found);
500 // Could be A or AAAA
501 std::string result_str = ToString(result);
502 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +0800503 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +0800504
505 // Verify that the name is cached.
506 size_t old_found = found;
507 result = safe_getaddrinfo("howdy", nullptr, nullptr);
508 EXPECT_TRUE(result != nullptr);
509 found = GetNumQueries(dns, host_name);
510 EXPECT_LE(1U, found);
511 EXPECT_EQ(old_found, found);
512 result_str = ToString(result);
Luke Huangf8215372019-11-22 11:53:41 +0800513 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4") << result_str;
Ken Chenb9fa2062018-11-13 21:51:13 +0800514
515 // Change the DNS resolver, ensure that queries are still cached.
Xiao Ma09b71022018-12-11 17:56:32 +0900516 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr2}));
Ken Chenb9fa2062018-11-13 21:51:13 +0800517 dns.clearQueries();
518 dns2.clearQueries();
519
520 result = safe_getaddrinfo("howdy", nullptr, nullptr);
521 EXPECT_TRUE(result != nullptr);
522 found = GetNumQueries(dns, host_name);
523 size_t found2 = GetNumQueries(dns2, host_name);
524 EXPECT_EQ(0U, found);
525 EXPECT_LE(0U, found2);
526
527 // Could be A or AAAA
528 result_str = ToString(result);
529 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +0800530 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +0800531}
532
533TEST_F(ResolverTest, GetAddrInfoV4) {
Xiao Ma09b71022018-12-11 17:56:32 +0900534 test::DNSResponder dns;
535 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.5"}});
536 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800537
Xiao Ma09b71022018-12-11 17:56:32 +0900538 const addrinfo hints = {.ai_family = AF_INET};
539 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
Ken Chenb9fa2062018-11-13 21:51:13 +0800540 EXPECT_TRUE(result != nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900541 EXPECT_EQ(1U, GetNumQueries(dns, kHelloExampleCom));
Ken Chenb9fa2062018-11-13 21:51:13 +0800542 EXPECT_EQ("1.2.3.5", ToString(result));
543}
544
545TEST_F(ResolverTest, GetAddrInfo_localhost) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800546 // Add a dummy nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900547 test::DNSResponder dns;
548 StartDns(dns, {});
549 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800550
Xiao Ma09b71022018-12-11 17:56:32 +0900551 ScopedAddrinfo result = safe_getaddrinfo(kLocalHost, nullptr, nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800552 EXPECT_TRUE(result != nullptr);
553 // Expect no DNS queries; localhost is resolved via /etc/hosts
554 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900555 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800556
Xiao Ma09b71022018-12-11 17:56:32 +0900557 result = safe_getaddrinfo(kIp6LocalHost, nullptr, nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800558 EXPECT_TRUE(result != nullptr);
559 // Expect no DNS queries; ip6-localhost is resolved via /etc/hosts
560 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900561 EXPECT_EQ(kIp6LocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800562}
563
Luke Huangd8ac4752019-06-18 17:05:47 +0800564TEST_F(ResolverTest, GetAddrInfo_InvalidSocketType) {
565 test::DNSResponder dns;
566 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.5"}});
567 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
568
569 // TODO: Test other invalid socket types.
570 const addrinfo hints = {
571 .ai_family = AF_UNSPEC,
Luke Huangd8ac4752019-06-18 17:05:47 +0800572 .ai_socktype = SOCK_PACKET,
573 };
574 addrinfo* result = nullptr;
575 // This is a valid hint, but the query won't be sent because the socket type is
576 // not supported.
577 EXPECT_EQ(EAI_NODATA, getaddrinfo("hello", nullptr, &hints, &result));
578 ScopedAddrinfo result_cleanup(result);
579 EXPECT_EQ(nullptr, result);
580}
581
Ken Chen92bed612018-12-22 21:46:55 +0800582// Verify if the resolver correctly handle multiple queries simultaneously
583// step 1: set dns server#1 into deferred responding mode.
584// step 2: thread#1 query "hello.example.com." --> resolver send query to server#1.
585// step 3: thread#2 query "hello.example.com." --> resolver hold the request and wait for
586// response of previous pending query sent by thread#1.
587// step 4: thread#3 query "konbanha.example.com." --> resolver send query to server#3. Server
588// respond to resolver immediately.
589// step 5: check if server#1 get 1 query by thread#1, server#2 get 0 query, server#3 get 1 query.
590// step 6: resume dns server#1 to respond dns query in step#2.
591// step 7: thread#1 and #2 should get returned from DNS query after step#6. Also, check the
592// number of queries in server#2 is 0 to ensure thread#2 does not wake up unexpectedly
593// before signaled by thread#1.
594TEST_F(ResolverTest, GetAddrInfoV4_deferred_resp) {
595 const char* listen_addr1 = "127.0.0.9";
596 const char* listen_addr2 = "127.0.0.10";
597 const char* listen_addr3 = "127.0.0.11";
598 const char* listen_srv = "53";
599 const char* host_name_deferred = "hello.example.com.";
600 const char* host_name_normal = "konbanha.example.com.";
Mike Yufc125e42019-05-15 20:41:28 +0800601 test::DNSResponder dns1(listen_addr1, listen_srv, ns_rcode::ns_r_servfail);
602 test::DNSResponder dns2(listen_addr2, listen_srv, ns_rcode::ns_r_servfail);
603 test::DNSResponder dns3(listen_addr3, listen_srv, ns_rcode::ns_r_servfail);
Ken Chen92bed612018-12-22 21:46:55 +0800604 dns1.addMapping(host_name_deferred, ns_type::ns_t_a, "1.2.3.4");
605 dns2.addMapping(host_name_deferred, ns_type::ns_t_a, "1.2.3.4");
606 dns3.addMapping(host_name_normal, ns_type::ns_t_a, "1.2.3.5");
607 ASSERT_TRUE(dns1.startServer());
608 ASSERT_TRUE(dns2.startServer());
609 ASSERT_TRUE(dns3.startServer());
610 const std::vector<std::string> servers_for_t1 = {listen_addr1};
611 const std::vector<std::string> servers_for_t2 = {listen_addr2};
612 const std::vector<std::string> servers_for_t3 = {listen_addr3};
613 addrinfo hints = {.ai_family = AF_INET};
614 const std::vector<int> params = {300, 25, 8, 8, 5000};
615 bool t3_task_done = false;
616
617 dns1.setDeferredResp(true);
618 std::thread t1([&, this]() {
619 ASSERT_TRUE(
620 mDnsClient.SetResolversForNetwork(servers_for_t1, kDefaultSearchDomains, params));
621 ScopedAddrinfo result = safe_getaddrinfo(host_name_deferred, nullptr, &hints);
622 // t3's dns query should got returned first
623 EXPECT_TRUE(t3_task_done);
624 EXPECT_EQ(1U, GetNumQueries(dns1, host_name_deferred));
625 EXPECT_TRUE(result != nullptr);
626 EXPECT_EQ("1.2.3.4", ToString(result));
627 });
628
629 // ensuring t1 and t2 handler functions are processed in order
630 usleep(100 * 1000);
631 std::thread t2([&, this]() {
632 ASSERT_TRUE(
633 mDnsClient.SetResolversForNetwork(servers_for_t2, kDefaultSearchDomains, params));
634 ScopedAddrinfo result = safe_getaddrinfo(host_name_deferred, nullptr, &hints);
635 EXPECT_TRUE(t3_task_done);
636 EXPECT_EQ(0U, GetNumQueries(dns2, host_name_deferred));
637 EXPECT_TRUE(result != nullptr);
638 EXPECT_EQ("1.2.3.4", ToString(result));
639
640 std::vector<std::string> res_servers;
641 std::vector<std::string> res_domains;
642 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +0900643 res_params res_params;
Ken Chen92bed612018-12-22 21:46:55 +0800644 std::vector<ResolverStats> res_stats;
645 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +0800646 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
647 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains,
648 &res_tls_servers, &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chen92bed612018-12-22 21:46:55 +0800649 EXPECT_EQ(0, wait_for_pending_req_timeout_count);
650 });
651
652 // ensuring t2 and t3 handler functions are processed in order
653 usleep(100 * 1000);
654 std::thread t3([&, this]() {
655 ASSERT_TRUE(
656 mDnsClient.SetResolversForNetwork(servers_for_t3, kDefaultSearchDomains, params));
657 ScopedAddrinfo result = safe_getaddrinfo(host_name_normal, nullptr, &hints);
658 EXPECT_EQ(1U, GetNumQueries(dns1, host_name_deferred));
659 EXPECT_EQ(0U, GetNumQueries(dns2, host_name_deferred));
660 EXPECT_EQ(1U, GetNumQueries(dns3, host_name_normal));
661 EXPECT_TRUE(result != nullptr);
662 EXPECT_EQ("1.2.3.5", ToString(result));
663
664 t3_task_done = true;
665 dns1.setDeferredResp(false);
666 });
667 t3.join();
668 t1.join();
669 t2.join();
670}
671
lifr4e4a2e02019-01-29 16:53:51 +0800672TEST_F(ResolverTest, GetAddrInfo_cnames) {
673 constexpr char host_name[] = "host.example.com.";
674 test::DNSResponder dns;
675 const std::vector<DnsRecord> records = {
676 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
677 {"a.example.com.", ns_type::ns_t_cname, "b.example.com."},
678 {"b.example.com.", ns_type::ns_t_cname, "c.example.com."},
679 {"c.example.com.", ns_type::ns_t_cname, "d.example.com."},
680 {"d.example.com.", ns_type::ns_t_cname, "e.example.com."},
681 {"e.example.com.", ns_type::ns_t_cname, host_name},
682 {host_name, ns_type::ns_t_a, "1.2.3.3"},
683 {host_name, ns_type::ns_t_aaaa, "2001:db8::42"},
684 };
685 StartDns(dns, records);
686 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
687
688 addrinfo hints = {.ai_family = AF_INET};
689 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
690 EXPECT_TRUE(result != nullptr);
691 EXPECT_EQ("1.2.3.3", ToString(result));
692
693 dns.clearQueries();
694 hints = {.ai_family = AF_INET6};
695 result = safe_getaddrinfo("hello", nullptr, &hints);
696 EXPECT_TRUE(result != nullptr);
697 EXPECT_EQ("2001:db8::42", ToString(result));
698}
699
700TEST_F(ResolverTest, GetAddrInfo_cnamesNoIpAddress) {
701 test::DNSResponder dns;
702 const std::vector<DnsRecord> records = {
703 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
704 };
705 StartDns(dns, records);
706 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
707
708 addrinfo hints = {.ai_family = AF_INET};
709 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
710 EXPECT_TRUE(result == nullptr);
711
712 dns.clearQueries();
713 hints = {.ai_family = AF_INET6};
714 result = safe_getaddrinfo("hello", nullptr, &hints);
715 EXPECT_TRUE(result == nullptr);
716}
717
718TEST_F(ResolverTest, GetAddrInfo_cnamesIllegalRdata) {
719 test::DNSResponder dns;
720 const std::vector<DnsRecord> records = {
721 {kHelloExampleCom, ns_type::ns_t_cname, ".!#?"},
722 };
723 StartDns(dns, records);
724 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
725
726 addrinfo hints = {.ai_family = AF_INET};
727 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
728 EXPECT_TRUE(result == nullptr);
729
730 dns.clearQueries();
731 hints = {.ai_family = AF_INET6};
732 result = safe_getaddrinfo("hello", nullptr, &hints);
733 EXPECT_TRUE(result == nullptr);
734}
735
Ken Chenb9fa2062018-11-13 21:51:13 +0800736TEST_F(ResolverTest, MultidomainResolution) {
Xiao Ma09b71022018-12-11 17:56:32 +0900737 constexpr char host_name[] = "nihao.example2.com.";
Luke Huangf8215372019-11-22 11:53:41 +0800738 std::vector<std::string> searchDomains = {"example1.com", "example2.com", "example3.com"};
Ken Chenb9fa2062018-11-13 21:51:13 +0800739
Xiao Ma09b71022018-12-11 17:56:32 +0900740 test::DNSResponder dns("127.0.0.6");
741 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.3"}});
742 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({"127.0.0.6"}, searchDomains));
743
Ken Chenb9fa2062018-11-13 21:51:13 +0800744 const hostent* result = gethostbyname("nihao");
Xiao Ma09b71022018-12-11 17:56:32 +0900745
Ken Chenb9fa2062018-11-13 21:51:13 +0800746 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
747 ASSERT_FALSE(result == nullptr);
748 ASSERT_EQ(4, result->h_length);
749 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
750 EXPECT_EQ("1.2.3.3", ToString(result));
751 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800752}
753
754TEST_F(ResolverTest, GetAddrInfoV6_numeric) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800755 constexpr char host_name[] = "ohayou.example.com.";
756 constexpr char numeric_addr[] = "fe80::1%lo";
757
Xiao Ma09b71022018-12-11 17:56:32 +0900758 test::DNSResponder dns;
Ken Chenb9fa2062018-11-13 21:51:13 +0800759 dns.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900760 StartDns(dns, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
761 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800762
763 addrinfo hints = {.ai_family = AF_INET6};
764 ScopedAddrinfo result = safe_getaddrinfo(numeric_addr, nullptr, &hints);
765 EXPECT_TRUE(result != nullptr);
766 EXPECT_EQ(numeric_addr, ToString(result));
767 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
768
769 // Now try a non-numeric hostname query with the AI_NUMERICHOST flag set.
770 // We should fail without sending out a DNS query.
771 hints.ai_flags |= AI_NUMERICHOST;
772 result = safe_getaddrinfo(host_name, nullptr, &hints);
773 EXPECT_TRUE(result == nullptr);
774 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
775}
776
777TEST_F(ResolverTest, GetAddrInfoV6_failing) {
Xiao Ma09b71022018-12-11 17:56:32 +0900778 constexpr char listen_addr0[] = "127.0.0.7";
779 constexpr char listen_addr1[] = "127.0.0.8";
Ken Chenb9fa2062018-11-13 21:51:13 +0800780 const char* host_name = "ohayou.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +0900781
782 test::DNSResponder dns0(listen_addr0);
783 test::DNSResponder dns1(listen_addr1);
Ken Chenb9fa2062018-11-13 21:51:13 +0800784 dns0.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900785 StartDns(dns0, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
786 StartDns(dns1, {{host_name, ns_type::ns_t_aaaa, "2001:db8::6"}});
787
Luke Huangf8215372019-11-22 11:53:41 +0800788 std::vector<std::string> servers = {listen_addr0, listen_addr1};
Ken Chenb9fa2062018-11-13 21:51:13 +0800789 // <sample validity in s> <success threshold in percent> <min samples> <max samples>
790 int sample_count = 8;
Luke Huangf8215372019-11-22 11:53:41 +0800791 const std::vector<int> params = {300, 25, sample_count, sample_count};
Xiao Ma09b71022018-12-11 17:56:32 +0900792 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, kDefaultSearchDomains, params));
Ken Chenb9fa2062018-11-13 21:51:13 +0800793
794 // Repeatedly perform resolutions for non-existing domains until MAXNSSAMPLES resolutions have
795 // reached the dns0, which is set to fail. No more requests should then arrive at that server
796 // for the next sample_lifetime seconds.
797 // TODO: This approach is implementation-dependent, change once metrics reporting is available.
Xiao Ma09b71022018-12-11 17:56:32 +0900798 const addrinfo hints = {.ai_family = AF_INET6};
Bernie Innocentib102dd22018-12-04 14:57:48 +0900799 for (int i = 0; i < sample_count; ++i) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800800 std::string domain = StringPrintf("nonexistent%d", i);
801 ScopedAddrinfo result = safe_getaddrinfo(domain.c_str(), nullptr, &hints);
802 }
803 // Due to 100% errors for all possible samples, the server should be ignored from now on and
804 // only the second one used for all following queries, until NSSAMPLE_VALIDITY is reached.
805 dns0.clearQueries();
806 dns1.clearQueries();
807 ScopedAddrinfo result = safe_getaddrinfo("ohayou", nullptr, &hints);
808 EXPECT_TRUE(result != nullptr);
809 EXPECT_EQ(0U, GetNumQueries(dns0, host_name));
810 EXPECT_EQ(1U, GetNumQueries(dns1, host_name));
811}
812
813TEST_F(ResolverTest, GetAddrInfoV6_nonresponsive) {
Xiao Ma09b71022018-12-11 17:56:32 +0900814 constexpr char listen_addr0[] = "127.0.0.7";
815 constexpr char listen_addr1[] = "127.0.0.8";
816 constexpr char listen_srv[] = "53";
817 constexpr char host_name1[] = "ohayou.example.com.";
818 constexpr char host_name2[] = "ciao.example.com.";
Luke Huang483cf332019-06-03 17:24:51 +0800819 const std::vector<std::string> defaultSearchDomain = {"example.com"};
820 // The minimal timeout is 1000ms, so we can't decrease timeout
821 // So reduce retry count.
822 const std::vector<int> reduceRetryParams = {
823 300, // sample validity in seconds
824 25, // success threshod in percent
825 8, 8, // {MIN,MAX}_SAMPLES
826 1000, // BASE_TIMEOUT_MSEC
827 1, // retry count
828 };
Xiao Ma09b71022018-12-11 17:56:32 +0900829 const std::vector<DnsRecord> records0 = {
830 {host_name1, ns_type::ns_t_aaaa, "2001:db8::5"},
831 {host_name2, ns_type::ns_t_aaaa, "2001:db8::5"},
832 };
833 const std::vector<DnsRecord> records1 = {
834 {host_name1, ns_type::ns_t_aaaa, "2001:db8::6"},
835 {host_name2, ns_type::ns_t_aaaa, "2001:db8::6"},
836 };
Ken Chenb9fa2062018-11-13 21:51:13 +0800837
838 // dns0 does not respond with 100% probability, while
839 // dns1 responds normally, at least initially.
Mike Yufc125e42019-05-15 20:41:28 +0800840 test::DNSResponder dns0(listen_addr0, listen_srv, static_cast<ns_rcode>(-1));
841 test::DNSResponder dns1(listen_addr1, listen_srv, static_cast<ns_rcode>(-1));
Ken Chenb9fa2062018-11-13 21:51:13 +0800842 dns0.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900843 StartDns(dns0, records0);
844 StartDns(dns1, records1);
Luke Huang483cf332019-06-03 17:24:51 +0800845 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr0, listen_addr1}, defaultSearchDomain,
846 reduceRetryParams));
Ken Chenb9fa2062018-11-13 21:51:13 +0800847
Luke Huang483cf332019-06-03 17:24:51 +0800848 // Specify ai_socktype to make getaddrinfo will only query 1 time
849 const addrinfo hints = {.ai_family = AF_INET6, .ai_socktype = SOCK_STREAM};
Ken Chenb9fa2062018-11-13 21:51:13 +0800850
851 // dns0 will ignore the request, and we'll fallback to dns1 after the first
852 // retry.
853 ScopedAddrinfo result = safe_getaddrinfo(host_name1, nullptr, &hints);
854 EXPECT_TRUE(result != nullptr);
855 EXPECT_EQ(1U, GetNumQueries(dns0, host_name1));
856 EXPECT_EQ(1U, GetNumQueries(dns1, host_name1));
857
858 // Now make dns1 also ignore 100% requests... The resolve should alternate
Luke Huang483cf332019-06-03 17:24:51 +0800859 // queries between the nameservers and fail
Ken Chenb9fa2062018-11-13 21:51:13 +0800860 dns1.setResponseProbability(0.0);
861 addrinfo* result2 = nullptr;
862 EXPECT_EQ(EAI_NODATA, getaddrinfo(host_name2, nullptr, &hints, &result2));
863 EXPECT_EQ(nullptr, result2);
Luke Huang483cf332019-06-03 17:24:51 +0800864 EXPECT_EQ(1U, GetNumQueries(dns0, host_name2));
865 EXPECT_EQ(1U, GetNumQueries(dns1, host_name2));
Ken Chenb9fa2062018-11-13 21:51:13 +0800866}
867
868TEST_F(ResolverTest, GetAddrInfoV6_concurrent) {
Xiao Ma09b71022018-12-11 17:56:32 +0900869 constexpr char listen_addr0[] = "127.0.0.9";
870 constexpr char listen_addr1[] = "127.0.0.10";
871 constexpr char listen_addr2[] = "127.0.0.11";
872 constexpr char host_name[] = "konbanha.example.com.";
873
874 test::DNSResponder dns0(listen_addr0);
875 test::DNSResponder dns1(listen_addr1);
876 test::DNSResponder dns2(listen_addr2);
877 StartDns(dns0, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
878 StartDns(dns1, {{host_name, ns_type::ns_t_aaaa, "2001:db8::6"}});
879 StartDns(dns2, {{host_name, ns_type::ns_t_aaaa, "2001:db8::7"}});
880
Luke Huangf8215372019-11-22 11:53:41 +0800881 const std::vector<std::string> servers = {listen_addr0, listen_addr1, listen_addr2};
Ken Chenb9fa2062018-11-13 21:51:13 +0800882 std::vector<std::thread> threads(10);
883 for (std::thread& thread : threads) {
Luke Huangf8215372019-11-22 11:53:41 +0800884 thread = std::thread([this, &servers]() {
885 unsigned delay = arc4random_uniform(1 * 1000 * 1000); // <= 1s
Ken Chenb9fa2062018-11-13 21:51:13 +0800886 usleep(delay);
887 std::vector<std::string> serverSubset;
888 for (const auto& server : servers) {
889 if (arc4random_uniform(2)) {
890 serverSubset.push_back(server);
891 }
892 }
893 if (serverSubset.empty()) serverSubset = servers;
Xiao Ma09b71022018-12-11 17:56:32 +0900894 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(serverSubset));
895 const addrinfo hints = {.ai_family = AF_INET6};
Ken Chenb9fa2062018-11-13 21:51:13 +0800896 addrinfo* result = nullptr;
897 int rv = getaddrinfo("konbanha", nullptr, &hints, &result);
898 EXPECT_EQ(0, rv) << "error [" << rv << "] " << gai_strerror(rv);
899 if (result) {
900 freeaddrinfo(result);
901 result = nullptr;
902 }
903 });
904 }
905 for (std::thread& thread : threads) {
906 thread.join();
907 }
Ken Chen92bed612018-12-22 21:46:55 +0800908
909 std::vector<std::string> res_servers;
910 std::vector<std::string> res_domains;
911 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +0900912 res_params res_params;
Ken Chen92bed612018-12-22 21:46:55 +0800913 std::vector<ResolverStats> res_stats;
914 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +0800915 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
916 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
917 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chen92bed612018-12-22 21:46:55 +0800918 EXPECT_EQ(0, wait_for_pending_req_timeout_count);
Ken Chenb9fa2062018-11-13 21:51:13 +0800919}
920
Mike Yu8ac63402019-12-02 15:28:38 +0800921TEST_F(ResolverTest, SkipBadServersDueToInternalError) {
922 constexpr char listen_addr1[] = "fe80::1";
923 constexpr char listen_addr2[] = "255.255.255.255";
924 constexpr char listen_addr3[] = "127.0.0.3";
925
926 test::DNSResponder dns(listen_addr3);
927 ASSERT_TRUE(dns.startServer());
928
929 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
930 parcel.servers = {listen_addr1, listen_addr2, listen_addr3};
931
932 // Bad servers can be distinguished after two attempts.
933 parcel.minSamples = 2;
934 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
935
936 // Start querying five times.
937 for (int i = 0; i < 5; i++) {
938 std::string hostName = StringPrintf("hello%d.com.", i);
939 dns.addMapping(hostName, ns_type::ns_t_a, "1.2.3.4");
940 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
941 EXPECT_TRUE(safe_getaddrinfo(hostName.c_str(), nullptr, &hints) != nullptr);
942 }
943
944 std::vector<std::string> res_servers;
945 std::vector<std::string> res_domains;
946 std::vector<std::string> res_tls_servers;
947 res_params res_params;
948 std::vector<ResolverStats> res_stats;
949 int wait_for_pending_req_timeout_count;
950 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
951 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
952 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
953
954 // Verify the result by means of the statistics.
955 EXPECT_EQ(res_stats[0].successes, 0);
956 EXPECT_EQ(res_stats[1].successes, 0);
957 EXPECT_EQ(res_stats[2].successes, 5);
958 EXPECT_EQ(res_stats[0].internal_errors, 2);
959 EXPECT_EQ(res_stats[1].internal_errors, 2);
960 EXPECT_EQ(res_stats[2].internal_errors, 0);
961}
962
963TEST_F(ResolverTest, SkipBadServersDueToTimeout) {
964 constexpr char listen_addr1[] = "127.0.0.3";
965 constexpr char listen_addr2[] = "127.0.0.4";
966
967 // Set dns1 non-responsive and dns2 workable.
968 test::DNSResponder dns1(listen_addr1, test::kDefaultListenService, static_cast<ns_rcode>(-1));
969 test::DNSResponder dns2(listen_addr2);
970 dns1.setResponseProbability(0.0);
971 ASSERT_TRUE(dns1.startServer());
972 ASSERT_TRUE(dns2.startServer());
973
974 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
975 parcel.servers = {listen_addr1, listen_addr2};
976
977 // Bad servers can be distinguished after two attempts.
978 parcel.minSamples = 2;
979 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
980
981 // Start querying five times.
982 for (int i = 0; i < 5; i++) {
983 std::string hostName = StringPrintf("hello%d.com.", i);
984 dns1.addMapping(hostName, ns_type::ns_t_a, "1.2.3.4");
985 dns2.addMapping(hostName, ns_type::ns_t_a, "1.2.3.5");
986 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
987 EXPECT_TRUE(safe_getaddrinfo(hostName.c_str(), nullptr, &hints) != nullptr);
988 }
989
990 std::vector<std::string> res_servers;
991 std::vector<std::string> res_domains;
992 std::vector<std::string> res_tls_servers;
993 res_params res_params;
994 std::vector<ResolverStats> res_stats;
995 int wait_for_pending_req_timeout_count;
996 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
997 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
998 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
999
1000 // Verify the result by means of the statistics as well as the query counts.
1001 EXPECT_EQ(res_stats[0].successes, 0);
1002 EXPECT_EQ(res_stats[1].successes, 5);
1003 EXPECT_EQ(res_stats[0].timeouts, 2);
1004 EXPECT_EQ(res_stats[1].timeouts, 0);
1005 EXPECT_EQ(dns1.queries().size(), 2U);
1006 EXPECT_EQ(dns2.queries().size(), 5U);
1007}
1008
chenbrucefd837fa2019-10-29 18:35:36 +08001009TEST_F(ResolverTest, GetAddrInfoFromCustTable_InvalidInput) {
1010 constexpr char hostnameNoip[] = "noip.example.com.";
1011 constexpr char hostnameInvalidip[] = "invalidip.example.com.";
1012 const std::vector<aidl::android::net::ResolverHostsParcel> invalidCustHosts = {
1013 {"", hostnameNoip},
1014 {"wrong IP", hostnameInvalidip},
1015 };
1016 test::DNSResponder dns;
1017 StartDns(dns, {});
1018 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
Ken Chen99344882020-01-01 14:59:38 +08001019 resolverParams.experimentalOptions.hosts = invalidCustHosts;
chenbrucefd837fa2019-10-29 18:35:36 +08001020 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1021 for (const auto& hostname : {hostnameNoip, hostnameInvalidip}) {
1022 // The query won't get data from customized table because of invalid customized table
1023 // and DNSResponder also has no records. hostnameNoip has never registered and
1024 // hostnameInvalidip has registered but wrong IP.
1025 const addrinfo hints = {.ai_family = AF_UNSPEC};
1026 ScopedAddrinfo result = safe_getaddrinfo(hostname, nullptr, &hints);
1027 ASSERT_TRUE(result == nullptr);
1028 EXPECT_EQ(4U, GetNumQueries(dns, hostname));
1029 }
1030}
1031
1032TEST_F(ResolverTest, GetAddrInfoFromCustTable) {
1033 constexpr char hostnameV4[] = "v4only.example.com.";
1034 constexpr char hostnameV6[] = "v6only.example.com.";
1035 constexpr char hostnameV4V6[] = "v4v6.example.com.";
1036 constexpr char custAddrV4[] = "1.2.3.4";
1037 constexpr char custAddrV6[] = "::1.2.3.4";
1038 constexpr char dnsSvAddrV4[] = "1.2.3.5";
1039 constexpr char dnsSvAddrV6[] = "::1.2.3.5";
1040 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4 = {
1041 {custAddrV4, hostnameV4},
1042 };
1043 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV6 = {
1044 {custAddrV6, hostnameV6},
1045 };
1046 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4V6 = {
1047 {custAddrV4, hostnameV4V6},
1048 {custAddrV6, hostnameV4V6},
1049 };
1050 const std::vector<DnsRecord> dnsSvHostV4 = {
1051 {hostnameV4, ns_type::ns_t_a, dnsSvAddrV4},
1052 };
1053 const std::vector<DnsRecord> dnsSvHostV6 = {
1054 {hostnameV6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1055 };
1056 const std::vector<DnsRecord> dnsSvHostV4V6 = {
1057 {hostnameV4V6, ns_type::ns_t_a, dnsSvAddrV4},
1058 {hostnameV4V6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1059 };
1060 struct TestConfig {
1061 const std::string name;
1062 const std::vector<aidl::android::net::ResolverHostsParcel> customizedHosts;
1063 const std::vector<DnsRecord> dnsserverHosts;
1064 const std::vector<std::string> queryResult;
1065 std::string asParameters() const {
1066 return StringPrintf("name: %s, customizedHosts: %s, dnsserverHosts: %s", name.c_str(),
1067 customizedHosts.empty() ? "No" : "Yes",
1068 dnsserverHosts.empty() ? "No" : "Yes");
1069 }
1070 } testConfigs[]{
1071 // clang-format off
1072 {hostnameV4, {}, {}, {}},
1073 {hostnameV4, {}, dnsSvHostV4, {dnsSvAddrV4}},
1074 {hostnameV4, custHostV4, {}, {custAddrV4}},
1075 {hostnameV4, custHostV4, dnsSvHostV4, {custAddrV4}},
1076 {hostnameV6, {}, {}, {}},
1077 {hostnameV6, {}, dnsSvHostV6, {dnsSvAddrV6}},
1078 {hostnameV6, custHostV6, {}, {custAddrV6}},
1079 {hostnameV6, custHostV6, dnsSvHostV6, {custAddrV6}},
1080 {hostnameV4V6, {}, {}, {}},
1081 {hostnameV4V6, {}, dnsSvHostV4V6, {dnsSvAddrV4, dnsSvAddrV6}},
1082 {hostnameV4V6, custHostV4V6, {}, {custAddrV4, custAddrV6}},
1083 {hostnameV4V6, custHostV4V6, dnsSvHostV4V6, {custAddrV4, custAddrV6}},
1084 // clang-format on
1085 };
1086
1087 for (const auto& config : testConfigs) {
1088 SCOPED_TRACE(config.asParameters());
1089
1090 test::DNSResponder dns;
1091 StartDns(dns, config.dnsserverHosts);
1092
1093 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
Ken Chen99344882020-01-01 14:59:38 +08001094 resolverParams.experimentalOptions.hosts = config.customizedHosts;
chenbrucefd837fa2019-10-29 18:35:36 +08001095 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1096 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM};
1097 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
1098 if (config.customizedHosts.empty() && config.dnsserverHosts.empty()) {
1099 ASSERT_TRUE(result == nullptr);
1100 EXPECT_EQ(2U, GetNumQueries(dns, config.name.c_str()));
1101 } else {
1102 ASSERT_TRUE(result != nullptr);
1103 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(config.queryResult));
1104 EXPECT_EQ(config.customizedHosts.empty() ? 2U : 0U,
1105 GetNumQueries(dns, config.name.c_str()));
1106 }
1107
1108 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
1109 }
1110}
1111
1112TEST_F(ResolverTest, GetAddrInfoFromCustTable_Modify) {
1113 constexpr char hostnameV4V6[] = "v4v6.example.com.";
1114 constexpr char custAddrV4[] = "1.2.3.4";
1115 constexpr char custAddrV6[] = "::1.2.3.4";
1116 constexpr char dnsSvAddrV4[] = "1.2.3.5";
1117 constexpr char dnsSvAddrV6[] = "::1.2.3.5";
1118 const std::vector<DnsRecord> dnsSvHostV4V6 = {
1119 {hostnameV4V6, ns_type::ns_t_a, dnsSvAddrV4},
1120 {hostnameV4V6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1121 };
1122 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4V6 = {
1123 {custAddrV4, hostnameV4V6},
1124 {custAddrV6, hostnameV4V6},
1125 };
1126 test::DNSResponder dns;
1127 StartDns(dns, dnsSvHostV4V6);
1128 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1129
Ken Chen99344882020-01-01 14:59:38 +08001130 resolverParams.experimentalOptions.hosts = custHostV4V6;
chenbrucefd837fa2019-10-29 18:35:36 +08001131 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1132 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM};
1133 ScopedAddrinfo result = safe_getaddrinfo(hostnameV4V6, nullptr, &hints);
1134 ASSERT_TRUE(result != nullptr);
1135 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray({custAddrV4, custAddrV6}));
1136 EXPECT_EQ(0U, GetNumQueries(dns, hostnameV4V6));
1137
Ken Chen99344882020-01-01 14:59:38 +08001138 resolverParams.experimentalOptions.hosts = {};
chenbrucefd837fa2019-10-29 18:35:36 +08001139 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1140 result = safe_getaddrinfo(hostnameV4V6, nullptr, &hints);
1141 ASSERT_TRUE(result != nullptr);
1142 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray({dnsSvAddrV4, dnsSvAddrV6}));
1143 EXPECT_EQ(2U, GetNumQueries(dns, hostnameV4V6));
1144}
1145
Ken Chenb9fa2062018-11-13 21:51:13 +08001146TEST_F(ResolverTest, EmptySetup) {
Ken Chenb9fa2062018-11-13 21:51:13 +08001147 std::vector<std::string> servers;
1148 std::vector<std::string> domains;
Xiao Ma09b71022018-12-11 17:56:32 +09001149 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001150 std::vector<std::string> res_servers;
1151 std::vector<std::string> res_domains;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001152 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001153 res_params res_params;
Ken Chenb9fa2062018-11-13 21:51:13 +08001154 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +08001155 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001156 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1157 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1158 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chenb9fa2062018-11-13 21:51:13 +08001159 EXPECT_EQ(0U, res_servers.size());
1160 EXPECT_EQ(0U, res_domains.size());
Mike Yu0a1c53d2018-11-26 13:26:21 +09001161 EXPECT_EQ(0U, res_tls_servers.size());
Luke Huang5bd827c2019-03-14 16:10:04 +08001162 ASSERT_EQ(static_cast<size_t>(IDnsResolver::RESOLVER_PARAMS_COUNT), kDefaultParams.size());
1163 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY],
1164 res_params.sample_validity);
1165 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001166 res_params.success_threshold);
Luke Huang5bd827c2019-03-14 16:10:04 +08001167 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
1168 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
1169 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
Ken Chenb9fa2062018-11-13 21:51:13 +08001170 res_params.base_timeout_msec);
Luke Huang5bd827c2019-03-14 16:10:04 +08001171 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_RETRY_COUNT], res_params.retry_count);
Ken Chenb9fa2062018-11-13 21:51:13 +08001172}
1173
1174TEST_F(ResolverTest, SearchPathChange) {
Xiao Ma09b71022018-12-11 17:56:32 +09001175 constexpr char listen_addr[] = "127.0.0.13";
1176 constexpr char host_name1[] = "test13.domain1.org.";
1177 constexpr char host_name2[] = "test13.domain2.org.";
Luke Huangf8215372019-11-22 11:53:41 +08001178 std::vector<std::string> servers = {listen_addr};
1179 std::vector<std::string> domains = {"domain1.org"};
Xiao Ma09b71022018-12-11 17:56:32 +09001180
1181 const std::vector<DnsRecord> records = {
1182 {host_name1, ns_type::ns_t_aaaa, "2001:db8::13"},
1183 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1:13"},
1184 };
1185 test::DNSResponder dns(listen_addr);
1186 StartDns(dns, records);
1187 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001188
1189 const addrinfo hints = {.ai_family = AF_INET6};
1190 ScopedAddrinfo result = safe_getaddrinfo("test13", nullptr, &hints);
1191 EXPECT_TRUE(result != nullptr);
1192 EXPECT_EQ(1U, dns.queries().size());
1193 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
1194 EXPECT_EQ("2001:db8::13", ToString(result));
1195
1196 // Test that changing the domain search path on its own works.
Luke Huangf8215372019-11-22 11:53:41 +08001197 domains = {"domain2.org"};
Xiao Ma09b71022018-12-11 17:56:32 +09001198 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001199 dns.clearQueries();
1200
1201 result = safe_getaddrinfo("test13", nullptr, &hints);
1202 EXPECT_TRUE(result != nullptr);
1203 EXPECT_EQ(1U, dns.queries().size());
1204 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
1205 EXPECT_EQ("2001:db8::1:13", ToString(result));
1206}
1207
Luke Huang2dac4382019-06-24 13:28:44 +08001208namespace {
1209
Luke Huangf8215372019-11-22 11:53:41 +08001210std::vector<std::string> getResolverDomains(aidl::android::net::IDnsResolver* dnsResolverService,
Luke Huang2dac4382019-06-24 13:28:44 +08001211 unsigned netId) {
1212 std::vector<std::string> res_servers;
1213 std::vector<std::string> res_domains;
1214 std::vector<std::string> res_tls_servers;
1215 res_params res_params;
1216 std::vector<ResolverStats> res_stats;
1217 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001218 DnsResponderClient::GetResolverInfo(dnsResolverService, netId, &res_servers, &res_domains,
1219 &res_tls_servers, &res_params, &res_stats,
1220 &wait_for_pending_req_timeout_count);
Luke Huang2dac4382019-06-24 13:28:44 +08001221 return res_domains;
1222}
1223
1224} // namespace
1225
1226TEST_F(ResolverTest, SearchPathPrune) {
1227 constexpr size_t DUPLICATED_DOMAIN_NUM = 3;
1228 constexpr char listen_addr[] = "127.0.0.13";
1229 constexpr char domian_name1[] = "domain13.org.";
1230 constexpr char domian_name2[] = "domain14.org.";
1231 constexpr char host_name1[] = "test13.domain13.org.";
1232 constexpr char host_name2[] = "test14.domain14.org.";
1233 std::vector<std::string> servers = {listen_addr};
1234
1235 std::vector<std::string> testDomains1;
1236 std::vector<std::string> testDomains2;
1237 // Domain length should be <= 255
1238 // Max number of domains in search path is 6
1239 for (size_t i = 0; i < MAXDNSRCH + 1; i++) {
1240 // Fill up with invalid domain
1241 testDomains1.push_back(std::string(300, i + '0'));
1242 // Fill up with valid but duplicated domain
1243 testDomains2.push_back(StringPrintf("domain%zu.org", i % DUPLICATED_DOMAIN_NUM));
1244 }
1245
1246 // Add valid domain used for query.
1247 testDomains1.push_back(domian_name1);
1248
1249 // Add valid domain twice used for query.
1250 testDomains2.push_back(domian_name2);
1251 testDomains2.push_back(domian_name2);
1252
1253 const std::vector<DnsRecord> records = {
1254 {host_name1, ns_type::ns_t_aaaa, "2001:db8::13"},
1255 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1:13"},
1256 };
1257 test::DNSResponder dns(listen_addr);
1258 StartDns(dns, records);
1259 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, testDomains1));
1260
1261 const addrinfo hints = {.ai_family = AF_INET6};
1262 ScopedAddrinfo result = safe_getaddrinfo("test13", nullptr, &hints);
1263
1264 EXPECT_TRUE(result != nullptr);
1265
1266 EXPECT_EQ(1U, dns.queries().size());
1267 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
1268 EXPECT_EQ("2001:db8::13", ToString(result));
1269
1270 const auto& res_domains1 = getResolverDomains(mDnsClient.resolvService(), TEST_NETID);
1271 // Expect 1 valid domain, invalid domains are removed.
1272 ASSERT_EQ(1U, res_domains1.size());
1273 EXPECT_EQ(domian_name1, res_domains1[0]);
1274
1275 dns.clearQueries();
1276
1277 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, testDomains2));
1278
1279 result = safe_getaddrinfo("test14", nullptr, &hints);
1280 EXPECT_TRUE(result != nullptr);
1281
1282 // (3 domains * 2 retries) + 1 success query = 7
1283 EXPECT_EQ(7U, dns.queries().size());
1284 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
1285 EXPECT_EQ("2001:db8::1:13", ToString(result));
1286
1287 const auto& res_domains2 = getResolverDomains(mDnsClient.resolvService(), TEST_NETID);
1288 // Expect 4 valid domain, duplicate domains are removed.
1289 EXPECT_EQ(DUPLICATED_DOMAIN_NUM + 1U, res_domains2.size());
1290 EXPECT_THAT(
1291 std::vector<std::string>({"domain0.org", "domain1.org", "domain2.org", domian_name2}),
1292 testing::ElementsAreArray(res_domains2));
1293}
1294
Mike Yu0a1c53d2018-11-26 13:26:21 +09001295// If we move this function to dns_responder_client, it will complicate the dependency need of
1296// dns_tls_frontend.h.
1297static void setupTlsServers(const std::vector<std::string>& servers,
waynema0e73c2e2019-07-31 15:04:08 +08001298 std::vector<std::unique_ptr<test::DnsTlsFrontend>>* tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001299 constexpr char listen_udp[] = "53";
1300 constexpr char listen_tls[] = "853";
Mike Yu0a1c53d2018-11-26 13:26:21 +09001301
1302 for (const auto& server : servers) {
1303 auto t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
1304 t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
1305 t->startServer();
Mike Yu0a1c53d2018-11-26 13:26:21 +09001306 tls->push_back(std::move(t));
1307 }
1308}
1309
Mike Yu0a1c53d2018-11-26 13:26:21 +09001310TEST_F(ResolverTest, MaxServerPrune_Binder) {
Mike Yu0a1c53d2018-11-26 13:26:21 +09001311 std::vector<std::string> domains;
1312 std::vector<std::unique_ptr<test::DNSResponder>> dns;
1313 std::vector<std::unique_ptr<test::DnsTlsFrontend>> tls;
1314 std::vector<std::string> servers;
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001315 std::vector<DnsResponderClient::Mapping> mappings;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001316
1317 for (unsigned i = 0; i < MAXDNSRCH + 1; i++) {
1318 domains.push_back(StringPrintf("example%u.com", i));
1319 }
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001320 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupMappings(1, domains, &mappings));
1321 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupDNSServers(MAXNS + 1, mappings, &dns, &servers));
waynema0e73c2e2019-07-31 15:04:08 +08001322 ASSERT_NO_FATAL_FAILURE(setupTlsServers(servers, &tls));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001323
waynema0e73c2e2019-07-31 15:04:08 +08001324 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, domains, kDefaultParams,
1325 kDefaultPrivateDnsHostName));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001326
Mike Yu383855b2019-01-15 17:53:27 +08001327 // If the private DNS validation hasn't completed yet before backend DNS servers stop,
1328 // TLS servers will get stuck in handleOneRequest(), which causes this test stuck in
1329 // ~DnsTlsFrontend() because the TLS server loop threads can't be terminated.
1330 // So, wait for private DNS validation done before stopping backend DNS servers.
1331 for (int i = 0; i < MAXNS; i++) {
chenbruceaff85842019-05-31 15:46:42 +08001332 LOG(INFO) << "Waiting for private DNS validation on " << tls[i]->listen_address() << ".";
Mike Yu724f77d2019-08-16 11:14:50 +08001333 EXPECT_TRUE(WaitForPrivateDnsValidation(tls[i]->listen_address(), true));
chenbruceaff85842019-05-31 15:46:42 +08001334 LOG(INFO) << "private DNS validation on " << tls[i]->listen_address() << " done.";
Mike Yu383855b2019-01-15 17:53:27 +08001335 }
1336
Mike Yu0a1c53d2018-11-26 13:26:21 +09001337 std::vector<std::string> res_servers;
1338 std::vector<std::string> res_domains;
1339 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001340 res_params res_params;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001341 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +08001342 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001343 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1344 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1345 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001346
1347 // Check the size of the stats and its contents.
1348 EXPECT_EQ(static_cast<size_t>(MAXNS), res_servers.size());
1349 EXPECT_EQ(static_cast<size_t>(MAXNS), res_tls_servers.size());
1350 EXPECT_EQ(static_cast<size_t>(MAXDNSRCH), res_domains.size());
1351 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_servers.begin()));
1352 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_tls_servers.begin()));
1353 EXPECT_TRUE(std::equal(domains.begin(), domains.begin() + MAXDNSRCH, res_domains.begin()));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001354}
1355
1356TEST_F(ResolverTest, ResolverStats) {
Xiao Ma09b71022018-12-11 17:56:32 +09001357 constexpr char listen_addr1[] = "127.0.0.4";
1358 constexpr char listen_addr2[] = "127.0.0.5";
1359 constexpr char listen_addr3[] = "127.0.0.6";
Mike Yu0a1c53d2018-11-26 13:26:21 +09001360
1361 // Set server 1 timeout.
Mike Yufc125e42019-05-15 20:41:28 +08001362 test::DNSResponder dns1(listen_addr1, "53", static_cast<ns_rcode>(-1));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001363 dns1.setResponseProbability(0.0);
1364 ASSERT_TRUE(dns1.startServer());
1365
1366 // Set server 2 responding server failure.
Xiao Ma09b71022018-12-11 17:56:32 +09001367 test::DNSResponder dns2(listen_addr2);
Mike Yu0a1c53d2018-11-26 13:26:21 +09001368 dns2.setResponseProbability(0.0);
1369 ASSERT_TRUE(dns2.startServer());
1370
1371 // Set server 3 workable.
Xiao Ma09b71022018-12-11 17:56:32 +09001372 test::DNSResponder dns3(listen_addr3);
1373 dns3.addMapping(kHelloExampleCom, ns_type::ns_t_a, "1.2.3.4");
Mike Yu0a1c53d2018-11-26 13:26:21 +09001374 ASSERT_TRUE(dns3.startServer());
1375
1376 std::vector<std::string> servers = {listen_addr1, listen_addr2, listen_addr3};
Xiao Ma09b71022018-12-11 17:56:32 +09001377 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001378
1379 dns3.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +09001380 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
Mike Yu0a1c53d2018-11-26 13:26:21 +09001381 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
Xiao Ma09b71022018-12-11 17:56:32 +09001382 size_t found = GetNumQueries(dns3, kHelloExampleCom);
Mike Yu0a1c53d2018-11-26 13:26:21 +09001383 EXPECT_LE(1U, found);
1384 std::string result_str = ToString(result);
1385 EXPECT_TRUE(result_str == "1.2.3.4") << ", result_str='" << result_str << "'";
1386
1387 std::vector<std::string> res_servers;
1388 std::vector<std::string> res_domains;
1389 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001390 res_params res_params;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001391 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +08001392 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001393 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1394 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1395 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001396
1397 EXPECT_EQ(1, res_stats[0].timeouts);
1398 EXPECT_EQ(1, res_stats[1].errors);
1399 EXPECT_EQ(1, res_stats[2].successes);
Mike Yu0a1c53d2018-11-26 13:26:21 +09001400}
1401
Mike Yu15791832020-02-11 13:38:48 +08001402TEST_F(ResolverTest, AlwaysUseLatestSetupParamsInLookups) {
1403 constexpr char listen_addr1[] = "127.0.0.3";
1404 constexpr char listen_addr2[] = "255.255.255.255";
1405 constexpr char listen_addr3[] = "127.0.0.4";
1406 constexpr char hostname[] = "hello";
1407 constexpr char fqdn_with_search_domain[] = "hello.domain2.com.";
1408
1409 test::DNSResponder dns1(listen_addr1, test::kDefaultListenService, static_cast<ns_rcode>(-1));
1410 dns1.setResponseProbability(0.0);
1411 ASSERT_TRUE(dns1.startServer());
1412
1413 test::DNSResponder dns3(listen_addr3);
1414 StartDns(dns3, {{fqdn_with_search_domain, ns_type::ns_t_a, "1.2.3.4"}});
1415
1416 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
1417 parcel.tlsServers.clear();
1418 parcel.servers = {listen_addr1, listen_addr2};
1419 parcel.domains = {"domain1.com", "domain2.com"};
1420 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1421
1422 // Expect the things happening in t1:
1423 // 1. The lookup starts using the first domain for query. It sends queries to the populated
1424 // nameserver list {listen_addr1, listen_addr2} for the hostname "hello.domain1.com".
1425 // 2. A different list of nameservers is updated to the resolver. Revision ID is incremented.
1426 // 3. The query for the hostname times out. The lookup fails to add the timeout record to the
1427 // the stats because of the unmatched revision ID.
1428 // 4. The lookup starts using the second domain for query. It sends queries to the populated
1429 // nameserver list {listen_addr3, listen_addr1, listen_addr2} for another hostname
1430 // "hello.domain2.com".
1431 // 5. The lookup gets the answer and updates a success record to the stats.
1432 std::thread t1([&hostname]() {
1433 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1434 ScopedAddrinfo result = safe_getaddrinfo(hostname, nullptr, &hints);
1435 EXPECT_NE(result.get(), nullptr);
1436 EXPECT_EQ(ToString(result), "1.2.3.4");
1437 });
1438
1439 // Wait for t1 to start the step 1.
1440 while (dns1.queries().size() == 0) {
1441 usleep(1000);
1442 }
1443
1444 // Update the resolver with three nameservers. This will increment the revision ID.
1445 parcel.servers = {listen_addr3, listen_addr1, listen_addr2};
1446 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1447
1448 t1.join();
1449 EXPECT_EQ(0U, GetNumQueriesForType(dns3, ns_type::ns_t_aaaa, fqdn_with_search_domain));
1450 EXPECT_EQ(1U, GetNumQueriesForType(dns3, ns_type::ns_t_a, fqdn_with_search_domain));
1451
1452 std::vector<std::string> res_servers;
1453 std::vector<std::string> res_domains;
1454 std::vector<std::string> res_tls_servers;
1455 res_params res_params;
1456 std::vector<ResolverStats> res_stats;
1457 int wait_for_pending_req_timeout_count;
1458 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1459 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1460 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
1461 EXPECT_EQ(res_stats[0].successes, 1);
1462 EXPECT_EQ(res_stats[0].timeouts, 0);
1463 EXPECT_EQ(res_stats[0].internal_errors, 0);
1464 EXPECT_EQ(res_stats[1].successes, 0);
1465 EXPECT_EQ(res_stats[1].timeouts, 0);
1466 EXPECT_EQ(res_stats[1].internal_errors, 0);
1467 EXPECT_EQ(res_stats[2].successes, 0);
1468 EXPECT_EQ(res_stats[2].timeouts, 0);
1469 EXPECT_EQ(res_stats[2].internal_errors, 0);
1470 EXPECT_EQ(res_servers, parcel.servers);
1471}
1472
Ken Chenb9fa2062018-11-13 21:51:13 +08001473// Test what happens if the specified TLS server is nonexistent.
1474TEST_F(ResolverTest, GetHostByName_TlsMissing) {
Xiao Ma09b71022018-12-11 17:56:32 +09001475 constexpr char listen_addr[] = "127.0.0.3";
1476 constexpr char host_name[] = "tlsmissing.example.com.";
1477
1478 test::DNSResponder dns;
1479 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.3"}});
Luke Huangf8215372019-11-22 11:53:41 +08001480 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001481
1482 // There's nothing listening on this address, so validation will either fail or
1483 /// hang. Either way, queries will continue to flow to the DNSResponder.
waynema0e73c2e2019-07-31 15:04:08 +08001484 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Ken Chenb9fa2062018-11-13 21:51:13 +08001485
1486 const hostent* result;
1487
1488 result = gethostbyname("tlsmissing");
1489 ASSERT_FALSE(result == nullptr);
1490 EXPECT_EQ("1.2.3.3", ToString(result));
1491
1492 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001493 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001494}
1495
1496// Test what happens if the specified TLS server replies with garbage.
1497TEST_F(ResolverTest, GetHostByName_TlsBroken) {
Xiao Ma09b71022018-12-11 17:56:32 +09001498 constexpr char listen_addr[] = "127.0.0.3";
1499 constexpr char host_name1[] = "tlsbroken1.example.com.";
1500 constexpr char host_name2[] = "tlsbroken2.example.com.";
1501 const std::vector<DnsRecord> records = {
1502 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1503 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1504 };
1505
1506 test::DNSResponder dns;
1507 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001508 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001509
1510 // Bind the specified private DNS socket but don't respond to any client sockets yet.
1511 int s = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, IPPROTO_TCP);
1512 ASSERT_TRUE(s >= 0);
1513 struct sockaddr_in tlsServer = {
Luke Huangf8215372019-11-22 11:53:41 +08001514 .sin_family = AF_INET,
1515 .sin_port = htons(853),
Ken Chenb9fa2062018-11-13 21:51:13 +08001516 };
1517 ASSERT_TRUE(inet_pton(AF_INET, listen_addr, &tlsServer.sin_addr));
1518 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEPORT).ok());
1519 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEADDR).ok());
1520 ASSERT_FALSE(bind(s, reinterpret_cast<struct sockaddr*>(&tlsServer), sizeof(tlsServer)));
1521 ASSERT_FALSE(listen(s, 1));
1522
1523 // Trigger TLS validation.
waynema0e73c2e2019-07-31 15:04:08 +08001524 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Ken Chenb9fa2062018-11-13 21:51:13 +08001525
1526 struct sockaddr_storage cliaddr;
1527 socklen_t sin_size = sizeof(cliaddr);
Luke Huangf8215372019-11-22 11:53:41 +08001528 int new_fd = accept4(s, reinterpret_cast<struct sockaddr*>(&cliaddr), &sin_size, SOCK_CLOEXEC);
Ken Chenb9fa2062018-11-13 21:51:13 +08001529 ASSERT_TRUE(new_fd > 0);
1530
1531 // We've received the new file descriptor but not written to it or closed, so the
1532 // validation is still pending. Queries should still flow correctly because the
1533 // server is not used until validation succeeds.
1534 const hostent* result;
1535 result = gethostbyname("tlsbroken1");
1536 ASSERT_FALSE(result == nullptr);
1537 EXPECT_EQ("1.2.3.1", ToString(result));
1538
1539 // Now we cause the validation to fail.
1540 std::string garbage = "definitely not a valid TLS ServerHello";
1541 write(new_fd, garbage.data(), garbage.size());
1542 close(new_fd);
1543
1544 // Validation failure shouldn't interfere with lookups, because lookups won't be sent
1545 // to the TLS server unless validation succeeds.
1546 result = gethostbyname("tlsbroken2");
1547 ASSERT_FALSE(result == nullptr);
1548 EXPECT_EQ("1.2.3.2", ToString(result));
1549
1550 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001551 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001552 close(s);
1553}
1554
1555TEST_F(ResolverTest, GetHostByName_Tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001556 constexpr char listen_addr[] = "127.0.0.3";
1557 constexpr char listen_udp[] = "53";
1558 constexpr char listen_tls[] = "853";
1559 constexpr char host_name1[] = "tls1.example.com.";
1560 constexpr char host_name2[] = "tls2.example.com.";
1561 constexpr char host_name3[] = "tls3.example.com.";
1562 const std::vector<DnsRecord> records = {
1563 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1564 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1565 {host_name3, ns_type::ns_t_a, "1.2.3.3"},
1566 };
1567
1568 test::DNSResponder dns;
1569 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001570 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001571
1572 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1573 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001574 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08001575 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001576
Mike Yu724f77d2019-08-16 11:14:50 +08001577 const hostent* result = gethostbyname("tls1");
Ken Chenb9fa2062018-11-13 21:51:13 +08001578 ASSERT_FALSE(result == nullptr);
1579 EXPECT_EQ("1.2.3.1", ToString(result));
1580
1581 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001582 EXPECT_TRUE(tls.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001583
1584 // Stop the TLS server. Since we're in opportunistic mode, queries will
1585 // fall back to the locally-assigned (clear text) nameservers.
1586 tls.stopServer();
1587
1588 dns.clearQueries();
1589 result = gethostbyname("tls2");
1590 EXPECT_FALSE(result == nullptr);
1591 EXPECT_EQ("1.2.3.2", ToString(result));
1592 const auto queries = dns.queries();
1593 EXPECT_EQ(1U, queries.size());
waynema29253052019-08-20 11:26:08 +08001594 EXPECT_EQ("tls2.example.com.", queries[0].name);
1595 EXPECT_EQ(ns_t_a, queries[0].type);
Ken Chenb9fa2062018-11-13 21:51:13 +08001596
1597 // Reset the resolvers without enabling TLS. Queries should still be routed
1598 // to the UDP endpoint.
Xiao Ma09b71022018-12-11 17:56:32 +09001599 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001600
1601 result = gethostbyname("tls3");
1602 ASSERT_FALSE(result == nullptr);
1603 EXPECT_EQ("1.2.3.3", ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +08001604}
1605
Ken Chenb9fa2062018-11-13 21:51:13 +08001606TEST_F(ResolverTest, GetHostByName_TlsFailover) {
Xiao Ma09b71022018-12-11 17:56:32 +09001607 constexpr char listen_addr1[] = "127.0.0.3";
1608 constexpr char listen_addr2[] = "127.0.0.4";
1609 constexpr char listen_udp[] = "53";
1610 constexpr char listen_tls[] = "853";
1611 constexpr char host_name1[] = "tlsfailover1.example.com.";
1612 constexpr char host_name2[] = "tlsfailover2.example.com.";
1613 const std::vector<DnsRecord> records1 = {
1614 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1615 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1616 };
1617 const std::vector<DnsRecord> records2 = {
1618 {host_name1, ns_type::ns_t_a, "1.2.3.3"},
1619 {host_name2, ns_type::ns_t_a, "1.2.3.4"},
1620 };
1621
1622 test::DNSResponder dns1(listen_addr1);
1623 test::DNSResponder dns2(listen_addr2);
1624 StartDns(dns1, records1);
1625 StartDns(dns2, records2);
1626
Luke Huangf8215372019-11-22 11:53:41 +08001627 std::vector<std::string> servers = {listen_addr1, listen_addr2};
Ken Chenb9fa2062018-11-13 21:51:13 +08001628
1629 test::DnsTlsFrontend tls1(listen_addr1, listen_tls, listen_addr1, listen_udp);
1630 test::DnsTlsFrontend tls2(listen_addr2, listen_tls, listen_addr2, listen_udp);
1631 ASSERT_TRUE(tls1.startServer());
1632 ASSERT_TRUE(tls2.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001633 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1634 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08001635 EXPECT_TRUE(WaitForPrivateDnsValidation(tls1.listen_address(), true));
1636 EXPECT_TRUE(WaitForPrivateDnsValidation(tls2.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001637
Mike Yu724f77d2019-08-16 11:14:50 +08001638 const hostent* result = gethostbyname("tlsfailover1");
Ken Chenb9fa2062018-11-13 21:51:13 +08001639 ASSERT_FALSE(result == nullptr);
1640 EXPECT_EQ("1.2.3.1", ToString(result));
1641
1642 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001643 EXPECT_TRUE(tls1.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001644 // No new queries should have reached tls2.
1645 EXPECT_EQ(1, tls2.queries());
1646
1647 // Stop tls1. Subsequent queries should attempt to reach tls1, fail, and retry to tls2.
1648 tls1.stopServer();
1649
1650 result = gethostbyname("tlsfailover2");
1651 EXPECT_EQ("1.2.3.4", ToString(result));
1652
1653 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001654 EXPECT_TRUE(tls2.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001655
1656 // No additional queries should have reached the insecure servers.
1657 EXPECT_EQ(2U, dns1.queries().size());
1658 EXPECT_EQ(2U, dns2.queries().size());
1659
1660 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001661 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Ken Chenb9fa2062018-11-13 21:51:13 +08001662}
1663
1664TEST_F(ResolverTest, GetHostByName_BadTlsName) {
Xiao Ma09b71022018-12-11 17:56:32 +09001665 constexpr char listen_addr[] = "127.0.0.3";
1666 constexpr char listen_udp[] = "53";
1667 constexpr char listen_tls[] = "853";
1668 constexpr char host_name[] = "badtlsname.example.com.";
1669
1670 test::DNSResponder dns;
1671 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.1"}});
Luke Huangf8215372019-11-22 11:53:41 +08001672 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001673
1674 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1675 ASSERT_TRUE(tls.startServer());
Xiao Ma09b71022018-12-11 17:56:32 +09001676 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
waynema0e73c2e2019-07-31 15:04:08 +08001677 kDefaultIncorrectPrivateDnsHostName));
Ken Chenb9fa2062018-11-13 21:51:13 +08001678
waynema0e73c2e2019-07-31 15:04:08 +08001679 // The TLS handshake would fail because the name of TLS server doesn't
1680 // match with TLS server's certificate.
Mike Yu724f77d2019-08-16 11:14:50 +08001681 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), false));
Ken Chenb9fa2062018-11-13 21:51:13 +08001682
1683 // The query should fail hard, because a name was specified.
1684 EXPECT_EQ(nullptr, gethostbyname("badtlsname"));
1685
1686 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001687 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001688}
1689
1690TEST_F(ResolverTest, GetAddrInfo_Tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001691 constexpr char listen_addr[] = "127.0.0.3";
1692 constexpr char listen_udp[] = "53";
1693 constexpr char listen_tls[] = "853";
1694 constexpr char host_name[] = "addrinfotls.example.com.";
1695 const std::vector<DnsRecord> records = {
1696 {host_name, ns_type::ns_t_a, "1.2.3.4"},
1697 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
1698 };
1699
1700 test::DNSResponder dns;
1701 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001702 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001703
1704 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1705 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001706 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1707 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08001708 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001709
1710 dns.clearQueries();
1711 ScopedAddrinfo result = safe_getaddrinfo("addrinfotls", nullptr, nullptr);
1712 EXPECT_TRUE(result != nullptr);
1713 size_t found = GetNumQueries(dns, host_name);
1714 EXPECT_LE(1U, found);
1715 // Could be A or AAAA
1716 std::string result_str = ToString(result);
1717 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +08001718 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08001719 // Wait for both A and AAAA queries to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001720 EXPECT_TRUE(tls.waitForQueries(3));
Ken Chenb9fa2062018-11-13 21:51:13 +08001721
1722 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001723 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001724}
1725
1726TEST_F(ResolverTest, TlsBypass) {
1727 const char OFF[] = "off";
1728 const char OPPORTUNISTIC[] = "opportunistic";
1729 const char STRICT[] = "strict";
1730
1731 const char GETHOSTBYNAME[] = "gethostbyname";
1732 const char GETADDRINFO[] = "getaddrinfo";
1733 const char GETADDRINFOFORNET[] = "getaddrinfofornet";
1734
1735 const unsigned BYPASS_NETID = NETID_USE_LOCAL_NAMESERVERS | TEST_NETID;
1736
Ken Chenb9fa2062018-11-13 21:51:13 +08001737 const char ADDR4[] = "192.0.2.1";
1738 const char ADDR6[] = "2001:db8::1";
1739
1740 const char cleartext_addr[] = "127.0.0.53";
1741 const char cleartext_port[] = "53";
1742 const char tls_port[] = "853";
Luke Huangf8215372019-11-22 11:53:41 +08001743 const std::vector<std::string> servers = {cleartext_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001744
Xiao Ma09b71022018-12-11 17:56:32 +09001745 test::DNSResponder dns(cleartext_addr);
Ken Chenb9fa2062018-11-13 21:51:13 +08001746 ASSERT_TRUE(dns.startServer());
1747
1748 test::DnsTlsFrontend tls(cleartext_addr, tls_port, cleartext_addr, cleartext_port);
Mike Yudd4ac2d2019-05-31 16:52:11 +08001749 ASSERT_TRUE(tls.startServer());
Ken Chenb9fa2062018-11-13 21:51:13 +08001750
Luke Huangf8215372019-11-22 11:53:41 +08001751 // clang-format off
Ken Chenb9fa2062018-11-13 21:51:13 +08001752 struct TestConfig {
1753 const std::string mode;
1754 const bool withWorkingTLS;
1755 const std::string method;
1756
1757 std::string asHostName() const {
Luke Huangf8215372019-11-22 11:53:41 +08001758 return StringPrintf("%s.%s.%s.", mode.c_str(), withWorkingTLS ? "tlsOn" : "tlsOff",
Ken Chenb9fa2062018-11-13 21:51:13 +08001759 method.c_str());
1760 }
1761 } testConfigs[]{
Ken Chenb9fa2062018-11-13 21:51:13 +08001762 {OFF, true, GETHOSTBYNAME},
1763 {OPPORTUNISTIC, true, GETHOSTBYNAME},
1764 {STRICT, true, GETHOSTBYNAME},
Ken Chenb9fa2062018-11-13 21:51:13 +08001765 {OFF, true, GETADDRINFO},
1766 {OPPORTUNISTIC, true, GETADDRINFO},
1767 {STRICT, true, GETADDRINFO},
Ken Chenb9fa2062018-11-13 21:51:13 +08001768 {OFF, true, GETADDRINFOFORNET},
1769 {OPPORTUNISTIC, true, GETADDRINFOFORNET},
1770 {STRICT, true, GETADDRINFOFORNET},
Mike Yudd4ac2d2019-05-31 16:52:11 +08001771 {OFF, false, GETHOSTBYNAME},
1772 {OPPORTUNISTIC, false, GETHOSTBYNAME},
1773 {STRICT, false, GETHOSTBYNAME},
1774 {OFF, false, GETADDRINFO},
1775 {OPPORTUNISTIC, false, GETADDRINFO},
1776 {STRICT, false, GETADDRINFO},
1777 {OFF, false, GETADDRINFOFORNET},
1778 {OPPORTUNISTIC, false, GETADDRINFOFORNET},
1779 {STRICT, false, GETADDRINFOFORNET},
Ken Chenb9fa2062018-11-13 21:51:13 +08001780 };
Luke Huangf8215372019-11-22 11:53:41 +08001781 // clang-format on
Ken Chenb9fa2062018-11-13 21:51:13 +08001782
1783 for (const auto& config : testConfigs) {
1784 const std::string testHostName = config.asHostName();
1785 SCOPED_TRACE(testHostName);
1786
1787 // Don't tempt test bugs due to caching.
1788 const char* host_name = testHostName.c_str();
1789 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
1790 dns.addMapping(host_name, ns_type::ns_t_aaaa, ADDR6);
1791
Mike Yudd4ac2d2019-05-31 16:52:11 +08001792 if (config.withWorkingTLS) {
1793 if (!tls.running()) {
1794 ASSERT_TRUE(tls.startServer());
1795 }
1796 } else {
1797 if (tls.running()) {
1798 ASSERT_TRUE(tls.stopServer());
1799 }
1800 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001801
1802 if (config.mode == OFF) {
Xiao Ma09b71022018-12-11 17:56:32 +09001803 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, kDefaultSearchDomains,
1804 kDefaultParams));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001805 } else /* OPPORTUNISTIC or STRICT */ {
1806 const char* tls_hostname = (config.mode == STRICT) ? kDefaultPrivateDnsHostName : "";
Xiao Ma09b71022018-12-11 17:56:32 +09001807 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001808 kDefaultParams, tls_hostname));
Mike Yu724f77d2019-08-16 11:14:50 +08001809
1810 // Wait for the validation event. If the server is running, the validation should
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001811 // succeed; otherwise, the validation should fail.
Mike Yu724f77d2019-08-16 11:14:50 +08001812 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), config.withWorkingTLS));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001813 if (config.withWorkingTLS) {
1814 EXPECT_TRUE(tls.waitForQueries(1));
1815 tls.clearQueries();
1816 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001817 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001818
1819 const hostent* h_result = nullptr;
1820 ScopedAddrinfo ai_result;
1821
1822 if (config.method == GETHOSTBYNAME) {
1823 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
1824 h_result = gethostbyname(host_name);
1825
1826 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
1827 ASSERT_FALSE(h_result == nullptr);
1828 ASSERT_EQ(4, h_result->h_length);
1829 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
1830 EXPECT_EQ(ADDR4, ToString(h_result));
1831 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
1832 } else if (config.method == GETADDRINFO) {
1833 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
1834 ai_result = safe_getaddrinfo(host_name, nullptr, nullptr);
1835 EXPECT_TRUE(ai_result != nullptr);
1836
1837 EXPECT_LE(1U, GetNumQueries(dns, host_name));
1838 // Could be A or AAAA
1839 const std::string result_str = ToString(ai_result);
1840 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
Luke Huangf8215372019-11-22 11:53:41 +08001841 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08001842 } else if (config.method == GETADDRINFOFORNET) {
1843 addrinfo* raw_ai_result = nullptr;
1844 EXPECT_EQ(0, android_getaddrinfofornet(host_name, /*servname=*/nullptr,
1845 /*hints=*/nullptr, BYPASS_NETID, MARK_UNSET,
1846 &raw_ai_result));
1847 ai_result.reset(raw_ai_result);
1848
1849 EXPECT_LE(1U, GetNumQueries(dns, host_name));
1850 // Could be A or AAAA
1851 const std::string result_str = ToString(ai_result);
1852 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
Luke Huangf8215372019-11-22 11:53:41 +08001853 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08001854 }
1855
Mike Yudd4ac2d2019-05-31 16:52:11 +08001856 EXPECT_EQ(0, tls.queries());
Ken Chenb9fa2062018-11-13 21:51:13 +08001857
1858 // Clear per-process resolv netid.
1859 ASSERT_EQ(0, setNetworkForResolv(NETID_UNSET));
Ken Chenb9fa2062018-11-13 21:51:13 +08001860 dns.clearQueries();
1861 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001862}
1863
1864TEST_F(ResolverTest, StrictMode_NoTlsServers) {
Xiao Ma09b71022018-12-11 17:56:32 +09001865 constexpr char cleartext_addr[] = "127.0.0.53";
Luke Huangf8215372019-11-22 11:53:41 +08001866 const std::vector<std::string> servers = {cleartext_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09001867 constexpr char host_name[] = "strictmode.notlsips.example.com.";
1868 const std::vector<DnsRecord> records = {
1869 {host_name, ns_type::ns_t_a, "1.2.3.4"},
1870 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
1871 };
Ken Chenb9fa2062018-11-13 21:51:13 +08001872
Xiao Ma09b71022018-12-11 17:56:32 +09001873 test::DNSResponder dns(cleartext_addr);
1874 StartDns(dns, records);
Ken Chenb9fa2062018-11-13 21:51:13 +08001875
waynema0e73c2e2019-07-31 15:04:08 +08001876 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1877 kDefaultIncorrectPrivateDnsHostName));
Ken Chenb9fa2062018-11-13 21:51:13 +08001878
1879 addrinfo* ai_result = nullptr;
1880 EXPECT_NE(0, getaddrinfo(host_name, nullptr, nullptr, &ai_result));
1881 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
1882}
Luke Huang94b10b92018-11-21 20:13:38 +08001883
1884namespace {
1885
Luke Huang70931aa2019-01-31 11:57:41 +08001886int getAsyncResponse(int fd, int* rcode, uint8_t* buf, int bufLen) {
Luke Huang94b10b92018-11-21 20:13:38 +08001887 struct pollfd wait_fd[1];
1888 wait_fd[0].fd = fd;
1889 wait_fd[0].events = POLLIN;
1890 short revents;
1891 int ret;
1892
1893 ret = poll(wait_fd, 1, -1);
1894 revents = wait_fd[0].revents;
1895 if (revents & POLLIN) {
1896 int n = resNetworkResult(fd, rcode, buf, bufLen);
Luke Huangba7bef92018-12-26 16:53:03 +08001897 // Verify that resNetworkResult() closed the fd
1898 char dummy;
1899 EXPECT_EQ(-1, read(fd, &dummy, sizeof dummy));
1900 EXPECT_EQ(EBADF, errno);
Luke Huang94b10b92018-11-21 20:13:38 +08001901 return n;
1902 }
1903 return -1;
1904}
1905
Luke Huang70931aa2019-01-31 11:57:41 +08001906std::string toString(uint8_t* buf, int bufLen, int ipType) {
Luke Huang94b10b92018-11-21 20:13:38 +08001907 ns_msg handle;
1908 int ancount, n = 0;
1909 ns_rr rr;
1910
Luke Huangf8215372019-11-22 11:53:41 +08001911 if (ns_initparse((const uint8_t*)buf, bufLen, &handle) >= 0) {
Luke Huang94b10b92018-11-21 20:13:38 +08001912 ancount = ns_msg_count(handle, ns_s_an);
1913 if (ns_parserr(&handle, ns_s_an, n, &rr) == 0) {
Luke Huang70931aa2019-01-31 11:57:41 +08001914 const uint8_t* rdata = ns_rr_rdata(rr);
Luke Huang94b10b92018-11-21 20:13:38 +08001915 char buffer[INET6_ADDRSTRLEN];
Luke Huangf8215372019-11-22 11:53:41 +08001916 if (inet_ntop(ipType, (const char*)rdata, buffer, sizeof(buffer))) {
Luke Huang94b10b92018-11-21 20:13:38 +08001917 return buffer;
1918 }
1919 }
1920 }
1921 return "";
1922}
1923
1924int dns_open_proxy() {
1925 int s = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
1926 if (s == -1) {
1927 return -1;
1928 }
1929 const int one = 1;
1930 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
1931
1932 static const struct sockaddr_un proxy_addr = {
1933 .sun_family = AF_UNIX,
1934 .sun_path = "/dev/socket/dnsproxyd",
1935 };
1936
Luke Huangf8215372019-11-22 11:53:41 +08001937 if (TEMP_FAILURE_RETRY(connect(s, (const struct sockaddr*)&proxy_addr, sizeof(proxy_addr))) !=
Luke Huang94b10b92018-11-21 20:13:38 +08001938 0) {
1939 close(s);
1940 return -1;
1941 }
1942
1943 return s;
1944}
1945
Luke Huangba7bef92018-12-26 16:53:03 +08001946void expectAnswersValid(int fd, int ipType, const std::string& expectedAnswer) {
1947 int rcode = -1;
1948 uint8_t buf[MAXPACKET] = {};
1949
1950 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
1951 EXPECT_GT(res, 0);
1952 EXPECT_EQ(expectedAnswer, toString(buf, res, ipType));
1953}
1954
1955void expectAnswersNotValid(int fd, int expectedErrno) {
1956 int rcode = -1;
1957 uint8_t buf[MAXPACKET] = {};
1958
1959 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
1960 EXPECT_EQ(expectedErrno, res);
1961}
1962
Luke Huang94b10b92018-11-21 20:13:38 +08001963} // namespace
1964
1965TEST_F(ResolverTest, Async_NormalQueryV4V6) {
Xiao Ma09b71022018-12-11 17:56:32 +09001966 constexpr char listen_addr[] = "127.0.0.4";
1967 constexpr char host_name[] = "howdy.example.com.";
1968 const std::vector<DnsRecord> records = {
1969 {host_name, ns_type::ns_t_a, "1.2.3.4"},
1970 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
1971 };
1972
1973 test::DNSResponder dns(listen_addr);
1974 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08001975 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09001976 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08001977
Luke Huangba7bef92018-12-26 16:53:03 +08001978 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
1979 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08001980 EXPECT_TRUE(fd1 != -1);
1981 EXPECT_TRUE(fd2 != -1);
1982
Luke Huang70931aa2019-01-31 11:57:41 +08001983 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08001984 int rcode;
1985 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
1986 EXPECT_GT(res, 0);
1987 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
1988
1989 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
1990 EXPECT_GT(res, 0);
1991 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
1992
1993 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
1994
1995 // Re-query verify cache works
Luke Huangba7bef92018-12-26 16:53:03 +08001996 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
1997 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08001998
1999 EXPECT_TRUE(fd1 != -1);
2000 EXPECT_TRUE(fd2 != -1);
2001
2002 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2003 EXPECT_GT(res, 0);
2004 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
2005
2006 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2007 EXPECT_GT(res, 0);
2008 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2009
2010 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
2011}
2012
2013TEST_F(ResolverTest, Async_BadQuery) {
Xiao Ma09b71022018-12-11 17:56:32 +09002014 constexpr char listen_addr[] = "127.0.0.4";
2015 constexpr char host_name[] = "howdy.example.com.";
2016 const std::vector<DnsRecord> records = {
2017 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2018 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2019 };
2020
2021 test::DNSResponder dns(listen_addr);
2022 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002023 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002024 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002025
2026 static struct {
2027 int fd;
2028 const char* dname;
2029 const int queryType;
2030 const int expectRcode;
2031 } kTestData[] = {
Luke Huangba7bef92018-12-26 16:53:03 +08002032 {-1, "", ns_t_aaaa, 0},
2033 {-1, "as65ass46", ns_t_aaaa, 0},
2034 {-1, "454564564564", ns_t_aaaa, 0},
2035 {-1, "h645235", ns_t_a, 0},
2036 {-1, "www.google.com", ns_t_a, 0},
Luke Huang94b10b92018-11-21 20:13:38 +08002037 };
2038
2039 for (auto& td : kTestData) {
2040 SCOPED_TRACE(td.dname);
Luke Huangba7bef92018-12-26 16:53:03 +08002041 td.fd = resNetworkQuery(TEST_NETID, td.dname, ns_c_in, td.queryType, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002042 EXPECT_TRUE(td.fd != -1);
2043 }
2044
2045 // dns_responder return empty resp(packet only contains query part) with no error currently
2046 for (const auto& td : kTestData) {
Luke Huang70931aa2019-01-31 11:57:41 +08002047 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002048 int rcode;
2049 SCOPED_TRACE(td.dname);
2050 int res = getAsyncResponse(td.fd, &rcode, buf, MAXPACKET);
2051 EXPECT_GT(res, 0);
2052 EXPECT_EQ(rcode, td.expectRcode);
2053 }
2054}
2055
2056TEST_F(ResolverTest, Async_EmptyAnswer) {
Xiao Ma09b71022018-12-11 17:56:32 +09002057 constexpr char listen_addr[] = "127.0.0.4";
2058 constexpr char host_name[] = "howdy.example.com.";
2059 const std::vector<DnsRecord> records = {
2060 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2061 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2062 };
2063
2064 test::DNSResponder dns(listen_addr);
2065 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002066 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002067 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002068
Luke Huang9c264bb2018-12-18 16:44:41 +08002069 // TODO: Disable retry to make this test explicit.
2070 auto& cv = dns.getCv();
2071 auto& cvMutex = dns.getCvMutex();
2072 int fd1;
2073 // Wait on the condition variable to ensure that the DNS server has handled our first query.
2074 {
2075 std::unique_lock lk(cvMutex);
Luke Huangba7bef92018-12-26 16:53:03 +08002076 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang9c264bb2018-12-18 16:44:41 +08002077 EXPECT_TRUE(fd1 != -1);
2078 EXPECT_EQ(std::cv_status::no_timeout, cv.wait_for(lk, std::chrono::seconds(1)));
2079 }
Luke Huang94b10b92018-11-21 20:13:38 +08002080
Luke Huang94b10b92018-11-21 20:13:38 +08002081 dns.setResponseProbability(0.0);
Luke Huang94b10b92018-11-21 20:13:38 +08002082
Luke Huangba7bef92018-12-26 16:53:03 +08002083 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002084 EXPECT_TRUE(fd2 != -1);
2085
Luke Huangba7bef92018-12-26 16:53:03 +08002086 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002087 EXPECT_TRUE(fd3 != -1);
2088
Luke Huang9c264bb2018-12-18 16:44:41 +08002089 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002090 int rcode;
2091
Luke Huang9c264bb2018-12-18 16:44:41 +08002092 // expect no response
2093 int res = getAsyncResponse(fd3, &rcode, buf, MAXPACKET);
2094 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huang94b10b92018-11-21 20:13:38 +08002095
Luke Huang9c264bb2018-12-18 16:44:41 +08002096 // expect no response
Luke Huang94b10b92018-11-21 20:13:38 +08002097 memset(buf, 0, MAXPACKET);
Luke Huang9c264bb2018-12-18 16:44:41 +08002098 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2099 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huang94b10b92018-11-21 20:13:38 +08002100
Luke Huang94b10b92018-11-21 20:13:38 +08002101 dns.setResponseProbability(1.0);
Luke Huang94b10b92018-11-21 20:13:38 +08002102
Luke Huangba7bef92018-12-26 16:53:03 +08002103 int fd4 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002104 EXPECT_TRUE(fd4 != -1);
2105
2106 memset(buf, 0, MAXPACKET);
2107 res = getAsyncResponse(fd4, &rcode, buf, MAXPACKET);
2108 EXPECT_GT(res, 0);
2109 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2110
2111 memset(buf, 0, MAXPACKET);
2112 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2113 EXPECT_GT(res, 0);
2114 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
2115}
2116
2117TEST_F(ResolverTest, Async_MalformedQuery) {
Xiao Ma09b71022018-12-11 17:56:32 +09002118 constexpr char listen_addr[] = "127.0.0.4";
2119 constexpr char host_name[] = "howdy.example.com.";
2120 const std::vector<DnsRecord> records = {
2121 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2122 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2123 };
2124
2125 test::DNSResponder dns(listen_addr);
2126 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002127 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002128 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002129
2130 int fd = dns_open_proxy();
2131 EXPECT_TRUE(fd > 0);
2132
2133 const std::string badMsg = "16-52512#";
Xiao Ma09b71022018-12-11 17:56:32 +09002134 static const struct {
Luke Huang94b10b92018-11-21 20:13:38 +08002135 const std::string cmd;
2136 const int expectErr;
2137 } kTestData[] = {
Luke Huangba7bef92018-12-26 16:53:03 +08002138 // Too few arguments
Luke Huang94b10b92018-11-21 20:13:38 +08002139 {"resnsend " + badMsg + '\0', -EINVAL},
2140 // Bad netId
Luke Huangba7bef92018-12-26 16:53:03 +08002141 {"resnsend badnetId 0 " + badMsg + '\0', -EINVAL},
Luke Huang94b10b92018-11-21 20:13:38 +08002142 // Bad raw data
Luke Huangba7bef92018-12-26 16:53:03 +08002143 {"resnsend " + std::to_string(TEST_NETID) + " 0 " + badMsg + '\0', -EILSEQ},
Luke Huang94b10b92018-11-21 20:13:38 +08002144 };
2145
2146 for (unsigned int i = 0; i < std::size(kTestData); i++) {
2147 auto& td = kTestData[i];
2148 SCOPED_TRACE(td.cmd);
2149 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, td.cmd.c_str(), td.cmd.size()));
2150 EXPECT_EQ(rc, static_cast<ssize_t>(td.cmd.size()));
2151
2152 int32_t tmp;
2153 rc = TEMP_FAILURE_RETRY(read(fd, &tmp, sizeof(tmp)));
2154 EXPECT_TRUE(rc > 0);
2155 EXPECT_EQ(static_cast<int>(ntohl(tmp)), td.expectErr);
2156 }
2157 // Normal query with answer buffer
2158 // This is raw data of query "howdy.example.com" type 1 class 1
2159 std::string query = "81sBAAABAAAAAAAABWhvd2R5B2V4YW1wbGUDY29tAAABAAE=";
Luke Huangba7bef92018-12-26 16:53:03 +08002160 std::string cmd = "resnsend " + std::to_string(TEST_NETID) + " 0 " + query + '\0';
Luke Huang94b10b92018-11-21 20:13:38 +08002161 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
2162 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
2163
Luke Huang70931aa2019-01-31 11:57:41 +08002164 uint8_t smallBuf[1] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002165 int rcode;
2166 rc = getAsyncResponse(fd, &rcode, smallBuf, 1);
Luke Huangba7bef92018-12-26 16:53:03 +08002167 EXPECT_EQ(-EMSGSIZE, rc);
Luke Huang94b10b92018-11-21 20:13:38 +08002168
2169 // Do the normal test with large buffer again
2170 fd = dns_open_proxy();
2171 EXPECT_TRUE(fd > 0);
2172 rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
2173 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
Luke Huang70931aa2019-01-31 11:57:41 +08002174 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002175 rc = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2176 EXPECT_EQ("1.2.3.4", toString(buf, rc, AF_INET));
Mike Yu4f3747b2018-12-02 17:54:29 +09002177}
2178
Luke Huangba7bef92018-12-26 16:53:03 +08002179TEST_F(ResolverTest, Async_CacheFlags) {
Xiao Ma09b71022018-12-11 17:56:32 +09002180 constexpr char listen_addr[] = "127.0.0.4";
2181 constexpr char host_name[] = "howdy.example.com.";
Luke Huang40f5f492019-05-09 19:37:35 +08002182 constexpr char another_host_name[] = "howdy.example2.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002183 const std::vector<DnsRecord> records = {
2184 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2185 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
Luke Huang40f5f492019-05-09 19:37:35 +08002186 {another_host_name, ns_type::ns_t_a, "1.2.3.5"},
2187 {another_host_name, ns_type::ns_t_aaaa, "::1.2.3.5"},
Xiao Ma09b71022018-12-11 17:56:32 +09002188 };
2189
2190 test::DNSResponder dns(listen_addr);
2191 StartDns(dns, records);
Luke Huangba7bef92018-12-26 16:53:03 +08002192 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002193 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huangba7bef92018-12-26 16:53:03 +08002194
2195 // ANDROID_RESOLV_NO_CACHE_STORE
2196 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2197 ANDROID_RESOLV_NO_CACHE_STORE);
2198 EXPECT_TRUE(fd1 != -1);
2199 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2200 ANDROID_RESOLV_NO_CACHE_STORE);
2201 EXPECT_TRUE(fd2 != -1);
2202 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2203 ANDROID_RESOLV_NO_CACHE_STORE);
2204 EXPECT_TRUE(fd3 != -1);
2205
2206 expectAnswersValid(fd3, AF_INET, "1.2.3.4");
2207 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
2208 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2209
2210 // No cache exists, expect 3 queries
2211 EXPECT_EQ(3U, GetNumQueries(dns, host_name));
2212
2213 // Re-query and cache
2214 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2215
2216 EXPECT_TRUE(fd1 != -1);
2217
2218 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2219
2220 // Now we have cache, expect 4 queries
2221 EXPECT_EQ(4U, GetNumQueries(dns, host_name));
2222
2223 // ANDROID_RESOLV_NO_CACHE_LOOKUP
2224 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2225 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2226 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2227 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2228
2229 EXPECT_TRUE(fd1 != -1);
2230 EXPECT_TRUE(fd2 != -1);
2231
2232 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
2233 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2234
2235 // Skip cache, expect 6 queries
2236 EXPECT_EQ(6U, GetNumQueries(dns, host_name));
2237
2238 // Re-query verify cache works
2239 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2240 ANDROID_RESOLV_NO_CACHE_STORE);
2241 EXPECT_TRUE(fd1 != -1);
2242 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2243
2244 // Cache hits, expect still 6 queries
2245 EXPECT_EQ(6U, GetNumQueries(dns, host_name));
Luke Huanga1d74182019-03-19 17:30:36 +08002246
2247 // Start to verify if ANDROID_RESOLV_NO_CACHE_LOOKUP does write response into cache
2248 dns.clearQueries();
2249
2250 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa,
2251 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2252 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa,
2253 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2254
2255 EXPECT_TRUE(fd1 != -1);
2256 EXPECT_TRUE(fd2 != -1);
2257
2258 expectAnswersValid(fd2, AF_INET6, "::1.2.3.4");
2259 expectAnswersValid(fd1, AF_INET6, "::1.2.3.4");
2260
2261 // Skip cache, expect 2 queries
2262 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
2263
2264 // Re-query without flags
2265 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
2266 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
2267
2268 EXPECT_TRUE(fd1 != -1);
2269 EXPECT_TRUE(fd2 != -1);
2270
2271 expectAnswersValid(fd2, AF_INET6, "::1.2.3.4");
2272 expectAnswersValid(fd1, AF_INET6, "::1.2.3.4");
2273
2274 // Cache hits, expect still 2 queries
2275 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
Luke Huang40f5f492019-05-09 19:37:35 +08002276
2277 // Test both ANDROID_RESOLV_NO_CACHE_STORE and ANDROID_RESOLV_NO_CACHE_LOOKUP are set
2278 dns.clearQueries();
2279
2280 // Make sure that the cache of "howdy.example2.com" exists.
2281 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa, 0);
2282 EXPECT_TRUE(fd1 != -1);
2283 expectAnswersValid(fd1, AF_INET6, "::1.2.3.5");
2284 EXPECT_EQ(1U, GetNumQueries(dns, another_host_name));
2285
2286 // Re-query with testFlags
2287 const int testFlag = ANDROID_RESOLV_NO_CACHE_STORE | ANDROID_RESOLV_NO_CACHE_LOOKUP;
2288 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa, testFlag);
2289 EXPECT_TRUE(fd1 != -1);
2290 expectAnswersValid(fd1, AF_INET6, "::1.2.3.5");
2291 // Expect cache lookup is skipped.
2292 EXPECT_EQ(2U, GetNumQueries(dns, another_host_name));
2293
2294 // Do another query with testFlags
2295 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_a, testFlag);
2296 EXPECT_TRUE(fd1 != -1);
2297 expectAnswersValid(fd1, AF_INET, "1.2.3.5");
2298 // Expect cache lookup is skipped.
2299 EXPECT_EQ(3U, GetNumQueries(dns, another_host_name));
2300
2301 // Re-query with no flags
2302 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_a, 0);
2303 EXPECT_TRUE(fd1 != -1);
2304 expectAnswersValid(fd1, AF_INET, "1.2.3.5");
2305 // Expect no cache hit because cache storing is also skipped in previous query.
2306 EXPECT_EQ(4U, GetNumQueries(dns, another_host_name));
Luke Huangba7bef92018-12-26 16:53:03 +08002307}
2308
Luke Huang08b13d22020-02-05 14:46:21 +08002309TEST_F(ResolverTest, Async_NoCacheStoreFlagDoesNotRefreshStaleCacheEntry) {
2310 constexpr char listen_addr[] = "127.0.0.4";
2311 constexpr char host_name[] = "howdy.example.com.";
2312 const std::vector<DnsRecord> records = {
2313 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2314 };
2315
2316 test::DNSResponder dns(listen_addr);
2317 StartDns(dns, records);
2318 std::vector<std::string> servers = {listen_addr};
2319 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
2320
2321 const unsigned SHORT_TTL_SEC = 1;
2322 dns.setTtl(SHORT_TTL_SEC);
2323
2324 // Refer to b/148842821 for the purpose of below test steps.
2325 // Basically, this test is used to ensure stale cache case is handled
2326 // correctly with ANDROID_RESOLV_NO_CACHE_STORE.
2327 int fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2328 EXPECT_TRUE(fd != -1);
2329 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2330
2331 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2332 dns.clearQueries();
2333
2334 // Wait until cache expired
2335 sleep(SHORT_TTL_SEC + 0.5);
2336
2337 // Now request the same hostname again.
2338 // We should see a new DNS query because the entry in cache has become stale.
2339 // Due to ANDROID_RESOLV_NO_CACHE_STORE, this query must *not* refresh that stale entry.
2340 fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2341 ANDROID_RESOLV_NO_CACHE_STORE);
2342 EXPECT_TRUE(fd != -1);
2343 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2344 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2345 dns.clearQueries();
2346
2347 // If the cache is still stale, we expect to see one more DNS query
2348 // (this time the cache will be refreshed, but we're not checking for it).
2349 fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2350 EXPECT_TRUE(fd != -1);
2351 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2352 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2353}
2354
Luke Huangba7bef92018-12-26 16:53:03 +08002355TEST_F(ResolverTest, Async_NoRetryFlag) {
Luke Huang70931aa2019-01-31 11:57:41 +08002356 constexpr char listen_addr0[] = "127.0.0.4";
2357 constexpr char listen_addr1[] = "127.0.0.6";
Xiao Ma09b71022018-12-11 17:56:32 +09002358 constexpr char host_name[] = "howdy.example.com.";
2359 const std::vector<DnsRecord> records = {
2360 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2361 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2362 };
2363
Luke Huang70931aa2019-01-31 11:57:41 +08002364 test::DNSResponder dns0(listen_addr0);
2365 test::DNSResponder dns1(listen_addr1);
2366 StartDns(dns0, records);
2367 StartDns(dns1, records);
2368 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr0, listen_addr1}));
Luke Huangba7bef92018-12-26 16:53:03 +08002369
Luke Huang70931aa2019-01-31 11:57:41 +08002370 dns0.clearQueries();
2371 dns1.clearQueries();
2372
2373 dns0.setResponseProbability(0.0);
2374 dns1.setResponseProbability(0.0);
Luke Huangba7bef92018-12-26 16:53:03 +08002375
2376 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2377 ANDROID_RESOLV_NO_RETRY);
2378 EXPECT_TRUE(fd1 != -1);
2379
2380 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa,
2381 ANDROID_RESOLV_NO_RETRY);
2382 EXPECT_TRUE(fd2 != -1);
2383
2384 // expect no response
2385 expectAnswersNotValid(fd1, -ETIMEDOUT);
2386 expectAnswersNotValid(fd2, -ETIMEDOUT);
2387
Luke Huang70931aa2019-01-31 11:57:41 +08002388 // No retry case, expect total 2 queries. The server is selected randomly.
2389 EXPECT_EQ(2U, GetNumQueries(dns0, host_name) + GetNumQueries(dns1, host_name));
Luke Huangba7bef92018-12-26 16:53:03 +08002390
Luke Huang70931aa2019-01-31 11:57:41 +08002391 dns0.clearQueries();
2392 dns1.clearQueries();
Luke Huangba7bef92018-12-26 16:53:03 +08002393
2394 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2395 EXPECT_TRUE(fd1 != -1);
2396
2397 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
2398 EXPECT_TRUE(fd2 != -1);
2399
2400 // expect no response
2401 expectAnswersNotValid(fd1, -ETIMEDOUT);
2402 expectAnswersNotValid(fd2, -ETIMEDOUT);
2403
2404 // Retry case, expect 4 queries
Luke Huang70931aa2019-01-31 11:57:41 +08002405 EXPECT_EQ(4U, GetNumQueries(dns0, host_name));
2406 EXPECT_EQ(4U, GetNumQueries(dns1, host_name));
2407}
2408
2409TEST_F(ResolverTest, Async_VerifyQueryID) {
2410 constexpr char listen_addr[] = "127.0.0.4";
2411 constexpr char host_name[] = "howdy.example.com.";
2412 const std::vector<DnsRecord> records = {
2413 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2414 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2415 };
2416
2417 test::DNSResponder dns(listen_addr);
2418 StartDns(dns, records);
2419 std::vector<std::string> servers = {listen_addr};
2420 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
2421
2422 const uint8_t queryBuf1[] = {
2423 /* Header */
2424 0x55, 0x66, /* Transaction ID */
2425 0x01, 0x00, /* Flags */
2426 0x00, 0x01, /* Questions */
2427 0x00, 0x00, /* Answer RRs */
2428 0x00, 0x00, /* Authority RRs */
2429 0x00, 0x00, /* Additional RRs */
2430 /* Queries */
2431 0x05, 0x68, 0x6f, 0x77, 0x64, 0x79, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
2432 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name */
2433 0x00, 0x01, /* Type */
2434 0x00, 0x01 /* Class */
2435 };
2436
2437 int fd = resNetworkSend(TEST_NETID, queryBuf1, sizeof(queryBuf1), 0);
2438 EXPECT_TRUE(fd != -1);
2439
2440 uint8_t buf[MAXPACKET] = {};
2441 int rcode;
2442
2443 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2444 EXPECT_GT(res, 0);
2445 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2446
2447 auto hp = reinterpret_cast<HEADER*>(buf);
2448 EXPECT_EQ(21862U, htons(hp->id));
2449
2450 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2451
2452 const uint8_t queryBuf2[] = {
2453 /* Header */
2454 0x00, 0x53, /* Transaction ID */
2455 0x01, 0x00, /* Flags */
2456 0x00, 0x01, /* Questions */
2457 0x00, 0x00, /* Answer RRs */
2458 0x00, 0x00, /* Authority RRs */
2459 0x00, 0x00, /* Additional RRs */
2460 /* Queries */
2461 0x05, 0x68, 0x6f, 0x77, 0x64, 0x79, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
2462 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name */
2463 0x00, 0x01, /* Type */
2464 0x00, 0x01 /* Class */
2465 };
2466
2467 // Re-query verify cache works and query id is correct
2468 fd = resNetworkSend(TEST_NETID, queryBuf2, sizeof(queryBuf2), 0);
2469
2470 EXPECT_TRUE(fd != -1);
2471
2472 res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2473 EXPECT_GT(res, 0);
2474 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2475
2476 EXPECT_EQ(0x0053U, htons(hp->id));
2477
2478 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
Luke Huangba7bef92018-12-26 16:53:03 +08002479}
2480
Mike Yu4f3747b2018-12-02 17:54:29 +09002481// This test checks that the resolver should not generate the request containing OPT RR when using
Ken Chen0a015532019-01-02 14:59:38 +08002482// cleartext DNS. If we query the DNS server not supporting EDNS0 and it reponds with
2483// FORMERR_ON_EDNS, we will fallback to no EDNS0 and try again. If the server does no response, we
2484// won't retry so that we get no answer.
Mike Yu4f3747b2018-12-02 17:54:29 +09002485TEST_F(ResolverTest, BrokenEdns) {
2486 typedef test::DNSResponder::Edns Edns;
2487 enum ExpectResult { EXPECT_FAILURE, EXPECT_SUCCESS };
2488
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002489 // Perform cleartext query in off mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002490 const char OFF[] = "off";
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002491
2492 // Perform cleartext query when there's no private DNS server validated in opportunistic mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002493 const char OPPORTUNISTIC_UDP[] = "opportunistic_udp";
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002494
2495 // Perform cleartext query when there is a private DNS server validated in opportunistic mode.
2496 const char OPPORTUNISTIC_FALLBACK_UDP[] = "opportunistic_fallback_udp";
2497
2498 // Perform cyphertext query in opportunistic mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002499 const char OPPORTUNISTIC_TLS[] = "opportunistic_tls";
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002500
2501 // Perform cyphertext query in strict mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002502 const char STRICT[] = "strict";
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002503
Mike Yu4f3747b2018-12-02 17:54:29 +09002504 const char GETHOSTBYNAME[] = "gethostbyname";
2505 const char GETADDRINFO[] = "getaddrinfo";
Mike Yu4f3747b2018-12-02 17:54:29 +09002506 const char ADDR4[] = "192.0.2.1";
2507 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2508 const char CLEARTEXT_PORT[] = "53";
2509 const char TLS_PORT[] = "853";
Luke Huangf8215372019-11-22 11:53:41 +08002510 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002511 ResolverParamsParcel paramsForCleanup = DnsResponderClient::GetDefaultResolverParamsParcel();
2512 paramsForCleanup.servers.clear();
2513 paramsForCleanup.tlsServers.clear();
Mike Yu4f3747b2018-12-02 17:54:29 +09002514
Mike Yufc125e42019-05-15 20:41:28 +08002515 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Mike Yu4f3747b2018-12-02 17:54:29 +09002516 ASSERT_TRUE(dns.startServer());
2517
2518 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2519
Luke Huangf8215372019-11-22 11:53:41 +08002520 // clang-format off
Mike Yu4f3747b2018-12-02 17:54:29 +09002521 static const struct TestConfig {
2522 std::string mode;
2523 std::string method;
2524 Edns edns;
2525 ExpectResult expectResult;
2526
2527 std::string asHostName() const {
2528 const char* ednsString;
2529 switch (edns) {
2530 case Edns::ON:
2531 ednsString = "ednsOn";
2532 break;
Ken Chen0a015532019-01-02 14:59:38 +08002533 case Edns::FORMERR_ON_EDNS:
Mike Yu4f3747b2018-12-02 17:54:29 +09002534 ednsString = "ednsFormerr";
2535 break;
2536 case Edns::DROP:
2537 ednsString = "ednsDrop";
2538 break;
2539 default:
2540 ednsString = "";
2541 break;
2542 }
2543 return StringPrintf("%s.%s.%s.", mode.c_str(), method.c_str(), ednsString);
2544 }
2545 } testConfigs[] = {
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002546 // In OPPORTUNISTIC_TLS, if the DNS server doesn't support EDNS0 but TLS, the lookup
2547 // fails. Could such server exist? if so, we might need to fix it to fallback to
2548 // cleartext query. If the server still make no response for the queries with EDNS0, we
2549 // might also need to fix it to retry without EDNS0.
Mike Yu4f3747b2018-12-02 17:54:29 +09002550 // Another thing is that {OPPORTUNISTIC_TLS, Edns::DROP} and {STRICT, Edns::DROP} are
2551 // commented out since TLS timeout is not configurable.
2552 // TODO: Uncomment them after TLS timeout is configurable.
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002553 {OFF, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2554 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2555 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2556 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2557 {STRICT, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2558 {OFF, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2559 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2560 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2561 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2562 {STRICT, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2563 {OFF, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2564 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2565
2566 // The failure is due to no retry on timeout. Maybe fix it?
2567 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2568
2569 //{OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2570 //{STRICT, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2571 {OFF, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2572 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2573 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2574 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2575 {STRICT, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2576 {OFF, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2577 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2578 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2579 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2580 {STRICT, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2581 {OFF, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2582 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2583
2584 // The failure is due to no retry on timeout. Maybe fix it?
2585 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2586
Mike Yu4f3747b2018-12-02 17:54:29 +09002587 //{OPPORTUNISTIC_TLS, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2588 //{STRICT, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2589 };
Luke Huangf8215372019-11-22 11:53:41 +08002590 // clang-format on
Mike Yu4f3747b2018-12-02 17:54:29 +09002591
2592 for (const auto& config : testConfigs) {
2593 const std::string testHostName = config.asHostName();
2594 SCOPED_TRACE(testHostName);
2595
2596 const char* host_name = testHostName.c_str();
2597 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
2598 dns.setEdns(config.edns);
2599
2600 if (config.mode == OFF) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002601 if (tls.running()) {
2602 ASSERT_TRUE(tls.stopServer());
2603 }
Xiao Ma09b71022018-12-11 17:56:32 +09002604 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Mike Yu4f3747b2018-12-02 17:54:29 +09002605 } else if (config.mode == OPPORTUNISTIC_UDP) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002606 if (tls.running()) {
2607 ASSERT_TRUE(tls.stopServer());
2608 }
Xiao Ma09b71022018-12-11 17:56:32 +09002609 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002610 kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002611 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), false));
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002612 } else if (config.mode == OPPORTUNISTIC_TLS || config.mode == OPPORTUNISTIC_FALLBACK_UDP) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002613 if (!tls.running()) {
2614 ASSERT_TRUE(tls.startServer());
2615 }
Xiao Ma09b71022018-12-11 17:56:32 +09002616 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002617 kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002618 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002619
2620 if (config.mode == OPPORTUNISTIC_FALLBACK_UDP) {
2621 // Force the resolver to fallback to cleartext queries.
2622 ASSERT_TRUE(tls.stopServer());
2623 }
Mike Yu4f3747b2018-12-02 17:54:29 +09002624 } else if (config.mode == STRICT) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002625 if (!tls.running()) {
2626 ASSERT_TRUE(tls.startServer());
2627 }
Xiao Ma09b71022018-12-11 17:56:32 +09002628 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002629 kDefaultParams, kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08002630 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Mike Yu4f3747b2018-12-02 17:54:29 +09002631 }
2632
2633 if (config.method == GETHOSTBYNAME) {
2634 const hostent* h_result = gethostbyname(host_name);
2635 if (config.expectResult == EXPECT_SUCCESS) {
2636 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2637 ASSERT_TRUE(h_result != nullptr);
2638 ASSERT_EQ(4, h_result->h_length);
2639 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
2640 EXPECT_EQ(ADDR4, ToString(h_result));
2641 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
2642 } else {
2643 EXPECT_EQ(0U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
2644 ASSERT_TRUE(h_result == nullptr);
2645 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2646 }
2647 } else if (config.method == GETADDRINFO) {
2648 ScopedAddrinfo ai_result;
2649 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2650 ai_result = safe_getaddrinfo(host_name, nullptr, &hints);
2651 if (config.expectResult == EXPECT_SUCCESS) {
2652 EXPECT_TRUE(ai_result != nullptr);
2653 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2654 const std::string result_str = ToString(ai_result);
2655 EXPECT_EQ(ADDR4, result_str);
2656 } else {
2657 EXPECT_TRUE(ai_result == nullptr);
2658 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
2659 }
2660 } else {
2661 FAIL() << "Unsupported query method: " << config.method;
2662 }
2663
Mike Yudd4ac2d2019-05-31 16:52:11 +08002664 tls.clearQueries();
Mike Yu4f3747b2018-12-02 17:54:29 +09002665 dns.clearQueries();
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002666
2667 // Clear the setup to force the resolver to validate private DNS servers in every test.
2668 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(paramsForCleanup));
Mike Yu4f3747b2018-12-02 17:54:29 +09002669 }
Mike Yu4f3747b2018-12-02 17:54:29 +09002670}
nuccachena26cc2a2018-07-17 18:07:23 +08002671
Ken Chen0a015532019-01-02 14:59:38 +08002672// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2673// Resolver should have a reasonable number of retries instead of spinning forever. We don't have
2674// an efficient way to know if resolver is stuck in an infinite loop. However, test case will be
2675// failed due to timeout.
2676TEST_F(ResolverTest, UnstableTls) {
2677 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2678 const char CLEARTEXT_PORT[] = "53";
2679 const char TLS_PORT[] = "853";
2680 const char* host_name1 = "nonexistent1.example.com.";
2681 const char* host_name2 = "nonexistent2.example.com.";
2682 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
2683
Mike Yufc125e42019-05-15 20:41:28 +08002684 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Ken Chen0a015532019-01-02 14:59:38 +08002685 ASSERT_TRUE(dns.startServer());
2686 dns.setEdns(test::DNSResponder::Edns::FORMERR_ON_EDNS);
2687 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2688 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08002689 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002690 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
2691
Ken Chen0a015532019-01-02 14:59:38 +08002692 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
2693 tls.stopServer();
2694
2695 const hostent* h_result = gethostbyname(host_name1);
2696 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
2697 ASSERT_TRUE(h_result == nullptr);
2698 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2699
2700 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2701 ScopedAddrinfo ai_result = safe_getaddrinfo(host_name2, nullptr, &hints);
2702 EXPECT_TRUE(ai_result == nullptr);
2703 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
2704}
2705
2706// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2707// Moreover, server responds RCODE=FORMERR even on non-EDNS query.
2708TEST_F(ResolverTest, BogusDnsServer) {
2709 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2710 const char CLEARTEXT_PORT[] = "53";
2711 const char TLS_PORT[] = "853";
2712 const char* host_name1 = "nonexistent1.example.com.";
2713 const char* host_name2 = "nonexistent2.example.com.";
2714 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
2715
Mike Yufc125e42019-05-15 20:41:28 +08002716 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Ken Chen0a015532019-01-02 14:59:38 +08002717 ASSERT_TRUE(dns.startServer());
2718 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2719 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08002720 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002721 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
2722
Ken Chen0a015532019-01-02 14:59:38 +08002723 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
2724 tls.stopServer();
2725 dns.setEdns(test::DNSResponder::Edns::FORMERR_UNCOND);
2726
2727 const hostent* h_result = gethostbyname(host_name1);
2728 EXPECT_EQ(0U, GetNumQueries(dns, host_name1));
2729 ASSERT_TRUE(h_result == nullptr);
2730 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2731
2732 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2733 ScopedAddrinfo ai_result = safe_getaddrinfo(host_name2, nullptr, &hints);
2734 EXPECT_TRUE(ai_result == nullptr);
2735 EXPECT_EQ(0U, GetNumQueries(dns, host_name2));
2736}
2737
nuccachena26cc2a2018-07-17 18:07:23 +08002738TEST_F(ResolverTest, GetAddrInfo_Dns64Synthesize) {
2739 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002740 constexpr char dns64_name[] = "ipv4only.arpa.";
2741 constexpr char host_name[] = "v4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002742 const std::vector<DnsRecord> records = {
2743 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2744 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2745 };
nuccachena26cc2a2018-07-17 18:07:23 +08002746
Xiao Ma09b71022018-12-11 17:56:32 +09002747 test::DNSResponder dns(listen_addr);
Xiao Ma09b71022018-12-11 17:56:32 +09002748 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002749
2750 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002751 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002752
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002753 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002754 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002755 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002756
2757 // hints are necessary in order to let netd know which type of addresses the caller is
2758 // interested in.
Xiao Ma09b71022018-12-11 17:56:32 +09002759 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08002760 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
2761 EXPECT_TRUE(result != nullptr);
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002762 // TODO: BUG: there should only be two queries, one AAAA (which returns no records) and one A
2763 // (which returns 1.2.3.4). But there is an extra AAAA.
2764 EXPECT_EQ(3U, GetNumQueries(dns, host_name));
nuccachena26cc2a2018-07-17 18:07:23 +08002765
2766 std::string result_str = ToString(result);
2767 EXPECT_EQ(result_str, "64:ff9b::102:304");
2768
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002769 // Stopping NAT64 prefix discovery disables synthesis.
Luke Huang5bd827c2019-03-14 16:10:04 +08002770 EXPECT_TRUE(mDnsClient.resolvService()->stopPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002771 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_NOT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002772
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002773 dns.clearQueries();
nuccachena26cc2a2018-07-17 18:07:23 +08002774
2775 result = safe_getaddrinfo("v4only", nullptr, &hints);
2776 EXPECT_TRUE(result != nullptr);
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002777 // TODO: BUG: there should only be one query, an AAAA (which returns no records), because the
2778 // A is already cached. But there is an extra AAAA.
2779 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
nuccachena26cc2a2018-07-17 18:07:23 +08002780
2781 result_str = ToString(result);
2782 EXPECT_EQ(result_str, "1.2.3.4");
2783}
2784
nuccachena26cc2a2018-07-17 18:07:23 +08002785TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecified) {
2786 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002787 constexpr char dns64_name[] = "ipv4only.arpa.";
2788 constexpr char host_name[] = "v4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002789 const std::vector<DnsRecord> records = {
2790 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2791 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2792 };
nuccachena26cc2a2018-07-17 18:07:23 +08002793
Xiao Ma09b71022018-12-11 17:56:32 +09002794 test::DNSResponder dns(listen_addr);
2795 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002796 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002797 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002798
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002799 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002800 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002801 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002802
2803 // Ensure to synthesize AAAA if AF_INET6 is specified, and not to synthesize AAAA
2804 // in AF_INET case.
2805 addrinfo hints;
2806 memset(&hints, 0, sizeof(hints));
2807 hints.ai_family = AF_INET6;
2808 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
2809 EXPECT_TRUE(result != nullptr);
2810 std::string result_str = ToString(result);
2811 EXPECT_EQ(result_str, "64:ff9b::102:304");
2812
2813 hints.ai_family = AF_INET;
2814 result = safe_getaddrinfo("v4only", nullptr, &hints);
2815 EXPECT_TRUE(result != nullptr);
2816 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2817 result_str = ToString(result);
2818 EXPECT_EQ(result_str, "1.2.3.4");
2819}
nuccachena26cc2a2018-07-17 18:07:23 +08002820
2821TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedV6) {
2822 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002823 constexpr char dns64_name[] = "ipv4only.arpa.";
2824 constexpr char host_name[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002825 const std::vector<DnsRecord> records = {
2826 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2827 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2828 {host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
2829 };
nuccachena26cc2a2018-07-17 18:07:23 +08002830
Xiao Ma09b71022018-12-11 17:56:32 +09002831 test::DNSResponder dns(listen_addr);
2832 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002833 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002834 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002835
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002836 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002837 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002838 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002839
Xiao Ma09b71022018-12-11 17:56:32 +09002840 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08002841 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
2842 EXPECT_TRUE(result != nullptr);
2843 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2844
2845 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
Xiao Ma09b71022018-12-11 17:56:32 +09002846 const std::vector<std::string> result_strs = ToStrings(result);
nuccachena26cc2a2018-07-17 18:07:23 +08002847 for (const auto& str : result_strs) {
2848 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
2849 << ", result_str='" << str << "'";
2850 }
2851}
2852
2853TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedNoV6) {
2854 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002855 constexpr char dns64_name[] = "ipv4only.arpa.";
2856 constexpr char host_name[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002857 const std::vector<DnsRecord> records = {
2858 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2859 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2860 };
nuccachena26cc2a2018-07-17 18:07:23 +08002861
Xiao Ma09b71022018-12-11 17:56:32 +09002862 test::DNSResponder dns(listen_addr);
2863 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002864 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002865 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002866
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002867 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002868 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002869 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002870
Xiao Ma09b71022018-12-11 17:56:32 +09002871 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08002872 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
2873 EXPECT_TRUE(result != nullptr);
2874 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2875
2876 // In AF_UNSPEC case, synthesize AAAA if there's no AAAA answer.
2877 std::string result_str = ToString(result);
2878 EXPECT_EQ(result_str, "64:ff9b::102:304");
2879}
2880
2881TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecialUseIPv4Addresses) {
2882 constexpr char THIS_NETWORK[] = "this_network";
2883 constexpr char LOOPBACK[] = "loopback";
2884 constexpr char LINK_LOCAL[] = "link_local";
2885 constexpr char MULTICAST[] = "multicast";
2886 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
2887
2888 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
2889 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
2890 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
2891 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
2892 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
2893
2894 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002895 constexpr char dns64_name[] = "ipv4only.arpa.";
2896
Xiao Ma09b71022018-12-11 17:56:32 +09002897 test::DNSResponder dns(listen_addr);
2898 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08002899 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002900 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002901
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002902 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002903 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002904 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002905
Luke Huangf8215372019-11-22 11:53:41 +08002906 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08002907 static const struct TestConfig {
2908 std::string name;
2909 std::string addr;
2910
2911 std::string asHostName() const { return StringPrintf("%s.example.com.", name.c_str()); }
2912 } testConfigs[]{
2913 {THIS_NETWORK, ADDR_THIS_NETWORK},
2914 {LOOPBACK, ADDR_LOOPBACK},
2915 {LINK_LOCAL, ADDR_LINK_LOCAL},
2916 {MULTICAST, ADDR_MULTICAST},
2917 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
2918 };
Luke Huangf8215372019-11-22 11:53:41 +08002919 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08002920
2921 for (const auto& config : testConfigs) {
2922 const std::string testHostName = config.asHostName();
2923 SCOPED_TRACE(testHostName);
2924
2925 const char* host_name = testHostName.c_str();
2926 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
2927
2928 addrinfo hints;
2929 memset(&hints, 0, sizeof(hints));
2930 hints.ai_family = AF_INET6;
2931 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
2932 // In AF_INET6 case, don't return IPv4 answers
2933 EXPECT_TRUE(result == nullptr);
2934 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2935 dns.clearQueries();
2936
2937 memset(&hints, 0, sizeof(hints));
2938 hints.ai_family = AF_UNSPEC;
2939 result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
2940 EXPECT_TRUE(result != nullptr);
2941 // Expect IPv6 query only. IPv4 answer has been cached in previous query.
2942 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2943 // In AF_UNSPEC case, don't synthesize special use IPv4 address.
2944 std::string result_str = ToString(result);
2945 EXPECT_EQ(result_str, config.addr.c_str());
2946 dns.clearQueries();
2947 }
2948}
2949
2950TEST_F(ResolverTest, GetAddrInfo_Dns64QueryWithNullArgumentHints) {
2951 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002952 constexpr char dns64_name[] = "ipv4only.arpa.";
2953 constexpr char host_name[] = "v4only.example.com.";
2954 constexpr char host_name2[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002955 const std::vector<DnsRecord> records = {
2956 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2957 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2958 {host_name2, ns_type::ns_t_a, "1.2.3.4"},
2959 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
2960 };
nuccachena26cc2a2018-07-17 18:07:23 +08002961
Xiao Ma09b71022018-12-11 17:56:32 +09002962 test::DNSResponder dns(listen_addr);
2963 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002964 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002965 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002966
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002967 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002968 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002969 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002970
2971 // Assign argument hints of getaddrinfo() as null is equivalent to set ai_family AF_UNSPEC.
2972 // In AF_UNSPEC case, synthesize AAAA if there has A answer only.
2973 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, nullptr);
2974 EXPECT_TRUE(result != nullptr);
2975 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2976 std::string result_str = ToString(result);
2977 EXPECT_EQ(result_str, "64:ff9b::102:304");
2978 dns.clearQueries();
2979
2980 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
2981 result = safe_getaddrinfo("v4v6", nullptr, nullptr);
2982 EXPECT_TRUE(result != nullptr);
2983 EXPECT_LE(2U, GetNumQueries(dns, host_name2));
2984 std::vector<std::string> result_strs = ToStrings(result);
2985 for (const auto& str : result_strs) {
2986 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
2987 << ", result_str='" << str << "'";
2988 }
2989}
2990
2991TEST_F(ResolverTest, GetAddrInfo_Dns64QueryNullArgumentNode) {
2992 constexpr char ADDR_ANYADDR_V4[] = "0.0.0.0";
2993 constexpr char ADDR_ANYADDR_V6[] = "::";
2994 constexpr char ADDR_LOCALHOST_V4[] = "127.0.0.1";
2995 constexpr char ADDR_LOCALHOST_V6[] = "::1";
2996
2997 constexpr char PORT_NAME_HTTP[] = "http";
2998 constexpr char PORT_NUMBER_HTTP[] = "80";
2999
3000 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003001 constexpr char dns64_name[] = "ipv4only.arpa.";
3002
Xiao Ma09b71022018-12-11 17:56:32 +09003003 test::DNSResponder dns(listen_addr);
3004 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003005 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003006 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003007
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003008 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003009 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003010 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003011
Luke Huangf8215372019-11-22 11:53:41 +08003012 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003013 // If node is null, return address is listed by libc/getaddrinfo.c as follows.
3014 // - passive socket -> anyaddr (0.0.0.0 or ::)
3015 // - non-passive socket -> localhost (127.0.0.1 or ::1)
3016 static const struct TestConfig {
3017 int flag;
3018 std::string addr_v4;
3019 std::string addr_v6;
3020
3021 std::string asParameters() const {
3022 return StringPrintf("flag=%d, addr_v4=%s, addr_v6=%s", flag, addr_v4.c_str(),
3023 addr_v6.c_str());
3024 }
3025 } testConfigs[]{
3026 {0 /* non-passive */, ADDR_LOCALHOST_V4, ADDR_LOCALHOST_V6},
3027 {AI_PASSIVE, ADDR_ANYADDR_V4, ADDR_ANYADDR_V6}
3028 };
Luke Huangf8215372019-11-22 11:53:41 +08003029 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003030
3031 for (const auto& config : testConfigs) {
3032 SCOPED_TRACE(config.asParameters());
3033
Xiao Ma09b71022018-12-11 17:56:32 +09003034 addrinfo hints = {
Nick Desaulnierscd6395a2019-10-11 09:15:24 -07003035 .ai_flags = config.flag,
Xiao Ma09b71022018-12-11 17:56:32 +09003036 .ai_family = AF_UNSPEC, // any address family
3037 .ai_socktype = 0, // any type
3038 .ai_protocol = 0, // any protocol
Xiao Ma09b71022018-12-11 17:56:32 +09003039 };
nuccachena26cc2a2018-07-17 18:07:23 +08003040
3041 // Assign hostname as null and service as port name.
3042 ScopedAddrinfo result = safe_getaddrinfo(nullptr, PORT_NAME_HTTP, &hints);
3043 ASSERT_TRUE(result != nullptr);
3044
3045 // Can't be synthesized because it should not get into Netd.
3046 std::vector<std::string> result_strs = ToStrings(result);
3047 for (const auto& str : result_strs) {
3048 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
3049 << ", result_str='" << str << "'";
3050 }
3051
3052 // Assign hostname as null and service as numeric port number.
3053 hints.ai_flags = config.flag | AI_NUMERICSERV;
3054 result = safe_getaddrinfo(nullptr, PORT_NUMBER_HTTP, &hints);
3055 ASSERT_TRUE(result != nullptr);
3056
3057 // Can't be synthesized because it should not get into Netd.
3058 result_strs = ToStrings(result);
3059 for (const auto& str : result_strs) {
3060 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
3061 << ", result_str='" << str << "'";
3062 }
3063 }
3064}
3065
3066TEST_F(ResolverTest, GetHostByAddr_ReverseDnsQueryWithHavingNat64Prefix) {
3067 struct hostent* result = nullptr;
3068 struct in_addr v4addr;
3069 struct in6_addr v6addr;
3070
3071 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003072 constexpr char dns64_name[] = "ipv4only.arpa.";
3073 constexpr char ptr_name[] = "v4v6.example.com.";
3074 // PTR record for IPv4 address 1.2.3.4
3075 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3076 // PTR record for IPv6 address 2001:db8::102:304
3077 constexpr char ptr_addr_v6[] =
3078 "4.0.3.0.2.0.1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa.";
Xiao Ma09b71022018-12-11 17:56:32 +09003079 const std::vector<DnsRecord> records = {
3080 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3081 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3082 {ptr_addr_v6, ns_type::ns_t_ptr, ptr_name},
3083 };
nuccachena26cc2a2018-07-17 18:07:23 +08003084
Xiao Ma09b71022018-12-11 17:56:32 +09003085 test::DNSResponder dns(listen_addr);
3086 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003087 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003088 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003089
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003090 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003091 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003092 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003093
3094 // Reverse IPv4 DNS query. Prefix should have no effect on it.
3095 inet_pton(AF_INET, "1.2.3.4", &v4addr);
3096 result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
3097 ASSERT_TRUE(result != nullptr);
3098 std::string result_str = result->h_name ? result->h_name : "null";
3099 EXPECT_EQ(result_str, "v4v6.example.com");
3100
3101 // Reverse IPv6 DNS query. Prefix should have no effect on it.
3102 inet_pton(AF_INET6, "2001:db8::102:304", &v6addr);
3103 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3104 ASSERT_TRUE(result != nullptr);
3105 result_str = result->h_name ? result->h_name : "null";
3106 EXPECT_EQ(result_str, "v4v6.example.com");
3107}
3108
3109TEST_F(ResolverTest, GetHostByAddr_ReverseDns64Query) {
3110 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003111 constexpr char dns64_name[] = "ipv4only.arpa.";
3112 constexpr char ptr_name[] = "v4only.example.com.";
3113 // PTR record for IPv4 address 1.2.3.4
3114 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3115 // PTR record for IPv6 address 64:ff9b::1.2.3.4
3116 constexpr char ptr_addr_v6_nomapping[] =
3117 "4.0.3.0.2.0.1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.b.9.f.f.4.6.0.0.ip6.arpa.";
3118 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
3119 // PTR record for IPv6 address 64:ff9b::5.6.7.8
3120 constexpr char ptr_addr_v6_synthesis[] =
3121 "8.0.7.0.6.0.5.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.b.9.f.f.4.6.0.0.ip6.arpa.";
Xiao Ma09b71022018-12-11 17:56:32 +09003122 const std::vector<DnsRecord> records = {
3123 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3124 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3125 {ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis},
3126 };
nuccachena26cc2a2018-07-17 18:07:23 +08003127
Xiao Ma09b71022018-12-11 17:56:32 +09003128 test::DNSResponder dns(listen_addr);
3129 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003130 // "ptr_addr_v6_nomapping" is not mapped in DNS server
nuccachena26cc2a2018-07-17 18:07:23 +08003131 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003132 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003133
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003134 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003135 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003136 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003137
3138 // Synthesized PTR record doesn't exist on DNS server
3139 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
3140 // After querying synthesized address failed, expect that prefix is removed from IPv6
3141 // synthesized address and do reverse IPv4 query instead.
3142 struct in6_addr v6addr;
3143 inet_pton(AF_INET6, "64:ff9b::1.2.3.4", &v6addr);
3144 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3145 ASSERT_TRUE(result != nullptr);
3146 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist
3147 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist
3148 std::string result_str = result->h_name ? result->h_name : "null";
3149 EXPECT_EQ(result_str, "v4only.example.com");
3150 // Check that return address has been mapped from IPv4 to IPv6 address because Netd
3151 // removes NAT64 prefix and does IPv4 DNS reverse lookup in this case. Then, Netd
3152 // fakes the return IPv4 address as original queried IPv6 address.
3153 result_str = ToString(result);
3154 EXPECT_EQ(result_str, "64:ff9b::102:304");
3155 dns.clearQueries();
3156
3157 // Synthesized PTR record exists on DNS server
3158 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
3159 // Expect to Netd pass through synthesized address for DNS queries.
3160 inet_pton(AF_INET6, "64:ff9b::5.6.7.8", &v6addr);
3161 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3162 ASSERT_TRUE(result != nullptr);
3163 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
3164 result_str = result->h_name ? result->h_name : "null";
3165 EXPECT_EQ(result_str, "v6synthesis.example.com");
3166}
3167
3168TEST_F(ResolverTest, GetHostByAddr_ReverseDns64QueryFromHostFile) {
3169 constexpr char dns64_name[] = "ipv4only.arpa.";
3170 constexpr char host_name[] = "localhost";
3171 // The address is synthesized by prefix64:localhost.
3172 constexpr char host_addr[] = "64:ff9b::7f00:1";
nuccachena26cc2a2018-07-17 18:07:23 +08003173 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003174
3175 test::DNSResponder dns(listen_addr);
3176 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003177 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003178 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003179
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003180 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003181 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003182 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003183
3184 // Using synthesized "localhost" address to be a trick for resolving host name
3185 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
3186 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
3187 struct in6_addr v6addr;
3188 inet_pton(AF_INET6, host_addr, &v6addr);
3189 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3190 ASSERT_TRUE(result != nullptr);
3191 // Expect no DNS queries; localhost is resolved via /etc/hosts.
3192 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
3193
Luke Huangf8215372019-11-22 11:53:41 +08003194 ASSERT_EQ(sizeof(in6_addr), (unsigned)result->h_length);
nuccachena26cc2a2018-07-17 18:07:23 +08003195 ASSERT_EQ(AF_INET6, result->h_addrtype);
3196 std::string result_str = ToString(result);
3197 EXPECT_EQ(result_str, host_addr);
3198 result_str = result->h_name ? result->h_name : "null";
3199 EXPECT_EQ(result_str, host_name);
3200}
3201
Hungming Chen9e6185a2019-06-04 16:09:19 +08003202TEST_F(ResolverTest, GetHostByAddr_cnamesClasslessReverseDelegation) {
3203 // IPv4 addresses in the subnet with notation '/' or '-'.
3204 constexpr char addr_slash[] = "192.0.2.1";
3205 constexpr char addr_hyphen[] = "192.0.3.1";
3206
3207 // Used to verify DNS reverse query for classless reverse lookup zone. See detail in RFC 2317
3208 // section 4.
3209 const static std::vector<DnsRecord> records = {
3210 // The records for reverse querying "192.0.2.1" in the subnet with notation '/'.
3211 {"1.2.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0/25.2.0.192.in-addr.arpa."},
3212 {"1.0/25.2.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3213
3214 // The records for reverse querying "192.0.3.1" in the subnet with notation '-'.
3215 {"1.3.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0-127.3.0.192.in-addr.arpa."},
3216 {"1.0-127.3.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3217 };
3218
3219 test::DNSResponder dns;
3220 StartDns(dns, records);
3221 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3222
3223 for (const auto& address : {addr_slash, addr_hyphen}) {
3224 SCOPED_TRACE(address);
3225
3226 in_addr v4addr;
3227 ASSERT_TRUE(inet_pton(AF_INET, address, &v4addr));
3228 hostent* result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
3229 ASSERT_TRUE(result != nullptr);
3230 EXPECT_STREQ("hello.example.com", result->h_name);
3231 }
3232}
3233
nuccachena26cc2a2018-07-17 18:07:23 +08003234TEST_F(ResolverTest, GetNameInfo_ReverseDnsQueryWithHavingNat64Prefix) {
3235 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003236 constexpr char dns64_name[] = "ipv4only.arpa.";
3237 constexpr char ptr_name[] = "v4v6.example.com.";
3238 // PTR record for IPv4 address 1.2.3.4
3239 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3240 // PTR record for IPv6 address 2001:db8::102:304
3241 constexpr char ptr_addr_v6[] =
3242 "4.0.3.0.2.0.1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa.";
Xiao Ma09b71022018-12-11 17:56:32 +09003243 const std::vector<DnsRecord> records = {
3244 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3245 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3246 {ptr_addr_v6, ns_type::ns_t_ptr, ptr_name},
3247 };
nuccachena26cc2a2018-07-17 18:07:23 +08003248
Xiao Ma09b71022018-12-11 17:56:32 +09003249 test::DNSResponder dns(listen_addr);
3250 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003251 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003252 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003253
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003254 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003255 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003256 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003257
Luke Huangf8215372019-11-22 11:53:41 +08003258 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003259 static const struct TestConfig {
3260 int flag;
3261 int family;
3262 std::string addr;
3263 std::string host;
3264
3265 std::string asParameters() const {
3266 return StringPrintf("flag=%d, family=%d, addr=%s, host=%s", flag, family, addr.c_str(),
3267 host.c_str());
3268 }
3269 } testConfigs[]{
3270 {NI_NAMEREQD, AF_INET, "1.2.3.4", "v4v6.example.com"},
3271 {NI_NUMERICHOST, AF_INET, "1.2.3.4", "1.2.3.4"},
3272 {0, AF_INET, "1.2.3.4", "v4v6.example.com"},
3273 {0, AF_INET, "5.6.7.8", "5.6.7.8"}, // unmapped
3274 {NI_NAMEREQD, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
3275 {NI_NUMERICHOST, AF_INET6, "2001:db8::102:304", "2001:db8::102:304"},
3276 {0, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
3277 {0, AF_INET6, "2001:db8::506:708", "2001:db8::506:708"}, // unmapped
3278 };
Luke Huangf8215372019-11-22 11:53:41 +08003279 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003280
3281 // Reverse IPv4/IPv6 DNS query. Prefix should have no effect on it.
3282 for (const auto& config : testConfigs) {
3283 SCOPED_TRACE(config.asParameters());
3284
3285 int rv;
3286 char host[NI_MAXHOST];
3287 struct sockaddr_in sin;
3288 struct sockaddr_in6 sin6;
3289 if (config.family == AF_INET) {
3290 memset(&sin, 0, sizeof(sin));
3291 sin.sin_family = AF_INET;
3292 inet_pton(AF_INET, config.addr.c_str(), &sin.sin_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003293 rv = getnameinfo((const struct sockaddr*)&sin, sizeof(sin), host, sizeof(host), nullptr,
3294 0, config.flag);
nuccachena26cc2a2018-07-17 18:07:23 +08003295 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4));
3296 } else if (config.family == AF_INET6) {
3297 memset(&sin6, 0, sizeof(sin6));
3298 sin6.sin6_family = AF_INET6;
3299 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003300 rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host),
nuccachena26cc2a2018-07-17 18:07:23 +08003301 nullptr, 0, config.flag);
3302 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6));
3303 }
3304 ASSERT_EQ(0, rv);
3305 std::string result_str = host;
3306 EXPECT_EQ(result_str, config.host);
3307 dns.clearQueries();
3308 }
3309}
3310
3311TEST_F(ResolverTest, GetNameInfo_ReverseDns64Query) {
3312 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003313 constexpr char dns64_name[] = "ipv4only.arpa.";
3314 constexpr char ptr_name[] = "v4only.example.com.";
3315 // PTR record for IPv4 address 1.2.3.4
3316 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3317 // PTR record for IPv6 address 64:ff9b::1.2.3.4
3318 constexpr char ptr_addr_v6_nomapping[] =
3319 "4.0.3.0.2.0.1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.b.9.f.f.4.6.0.0.ip6.arpa.";
3320 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
3321 // PTR record for IPv6 address 64:ff9b::5.6.7.8
3322 constexpr char ptr_addr_v6_synthesis[] =
3323 "8.0.7.0.6.0.5.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.b.9.f.f.4.6.0.0.ip6.arpa.";
Xiao Ma09b71022018-12-11 17:56:32 +09003324 const std::vector<DnsRecord> records = {
3325 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3326 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3327 {ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis},
3328 };
nuccachena26cc2a2018-07-17 18:07:23 +08003329
Xiao Ma09b71022018-12-11 17:56:32 +09003330 test::DNSResponder dns(listen_addr);
3331 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003332 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003333 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003334
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003335 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003336 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003337 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003338
Luke Huangf8215372019-11-22 11:53:41 +08003339 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003340 static const struct TestConfig {
3341 bool hasSynthesizedPtrRecord;
3342 int flag;
3343 std::string addr;
3344 std::string host;
3345
3346 std::string asParameters() const {
3347 return StringPrintf("hasSynthesizedPtrRecord=%d, flag=%d, addr=%s, host=%s",
3348 hasSynthesizedPtrRecord, flag, addr.c_str(), host.c_str());
3349 }
3350 } testConfigs[]{
3351 {false, NI_NAMEREQD, "64:ff9b::102:304", "v4only.example.com"},
3352 {false, NI_NUMERICHOST, "64:ff9b::102:304", "64:ff9b::102:304"},
3353 {false, 0, "64:ff9b::102:304", "v4only.example.com"},
3354 {true, NI_NAMEREQD, "64:ff9b::506:708", "v6synthesis.example.com"},
3355 {true, NI_NUMERICHOST, "64:ff9b::506:708", "64:ff9b::506:708"},
3356 {true, 0, "64:ff9b::506:708", "v6synthesis.example.com"}
3357 };
Luke Huangf8215372019-11-22 11:53:41 +08003358 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003359
3360 // hasSynthesizedPtrRecord = false
3361 // Synthesized PTR record doesn't exist on DNS server
3362 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
3363 // After querying synthesized address failed, expect that prefix is removed from IPv6
3364 // synthesized address and do reverse IPv4 query instead.
3365 //
3366 // hasSynthesizedPtrRecord = true
3367 // Synthesized PTR record exists on DNS server
3368 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
3369 // Expect to just pass through synthesized address for DNS queries.
3370 for (const auto& config : testConfigs) {
3371 SCOPED_TRACE(config.asParameters());
3372
3373 char host[NI_MAXHOST];
3374 struct sockaddr_in6 sin6;
3375 memset(&sin6, 0, sizeof(sin6));
3376 sin6.sin6_family = AF_INET6;
3377 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003378 int rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host),
nuccachena26cc2a2018-07-17 18:07:23 +08003379 nullptr, 0, config.flag);
3380 ASSERT_EQ(0, rv);
3381 if (config.flag == NI_NAMEREQD) {
3382 if (config.hasSynthesizedPtrRecord) {
3383 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
3384 } else {
3385 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist.
3386 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist.
3387 }
3388 }
3389 std::string result_str = host;
3390 EXPECT_EQ(result_str, config.host);
3391 dns.clearQueries();
3392 }
3393}
3394
3395TEST_F(ResolverTest, GetNameInfo_ReverseDns64QueryFromHostFile) {
3396 constexpr char dns64_name[] = "ipv4only.arpa.";
3397 constexpr char host_name[] = "localhost";
3398 // The address is synthesized by prefix64:localhost.
3399 constexpr char host_addr[] = "64:ff9b::7f00:1";
nuccachena26cc2a2018-07-17 18:07:23 +08003400 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003401
3402 test::DNSResponder dns(listen_addr);
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003403
Xiao Ma09b71022018-12-11 17:56:32 +09003404 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003405 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003406 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003407
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003408 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003409 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003410 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003411
3412 // Using synthesized "localhost" address to be a trick for resolving host name
3413 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
3414 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
3415 char host[NI_MAXHOST];
Xiao Ma09b71022018-12-11 17:56:32 +09003416 struct sockaddr_in6 sin6 = {.sin6_family = AF_INET6};
nuccachena26cc2a2018-07-17 18:07:23 +08003417 inet_pton(AF_INET6, host_addr, &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003418 int rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host), nullptr,
nuccachena26cc2a2018-07-17 18:07:23 +08003419 0, NI_NAMEREQD);
3420 ASSERT_EQ(0, rv);
3421 // Expect no DNS queries; localhost is resolved via /etc/hosts.
3422 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
3423
3424 std::string result_str = host;
3425 EXPECT_EQ(result_str, host_name);
3426}
3427
Hungming Chen9e6185a2019-06-04 16:09:19 +08003428TEST_F(ResolverTest, GetNameInfo_cnamesClasslessReverseDelegation) {
3429 // IPv4 addresses in the subnet with notation '/' or '-'.
3430 constexpr char addr_slash[] = "192.0.2.1";
3431 constexpr char addr_hyphen[] = "192.0.3.1";
3432
3433 // Used to verify DNS reverse query for classless reverse lookup zone. See detail in RFC 2317
3434 // section 4.
3435 const static std::vector<DnsRecord> records = {
3436 // The records for reverse querying "192.0.2.1" in the subnet with notation '/'.
3437 {"1.2.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0/25.2.0.192.in-addr.arpa."},
3438 {"1.0/25.2.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3439
3440 // The records for reverse querying "192.0.3.1" in the subnet with notation '-'.
3441 {"1.3.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0-127.3.0.192.in-addr.arpa."},
3442 {"1.0-127.3.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3443 };
3444
3445 test::DNSResponder dns;
3446 StartDns(dns, records);
3447 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3448
3449 for (const auto& address : {addr_slash, addr_hyphen}) {
3450 SCOPED_TRACE(address);
3451
3452 char host[NI_MAXHOST];
3453 sockaddr_in sin = {.sin_family = AF_INET};
3454 ASSERT_TRUE(inet_pton(AF_INET, address, &sin.sin_addr));
3455 int rv = getnameinfo((const sockaddr*)&sin, sizeof(sin), host, sizeof(host), nullptr, 0,
3456 NI_NAMEREQD);
3457 ASSERT_EQ(0, rv);
3458 EXPECT_STREQ("hello.example.com", host);
3459 }
3460}
3461
nuccachena26cc2a2018-07-17 18:07:23 +08003462TEST_F(ResolverTest, GetHostByName2_Dns64Synthesize) {
Xiao Ma09b71022018-12-11 17:56:32 +09003463 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003464 constexpr char dns64_name[] = "ipv4only.arpa.";
3465 constexpr char host_name[] = "ipv4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003466 const std::vector<DnsRecord> records = {
3467 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3468 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3469 };
nuccachena26cc2a2018-07-17 18:07:23 +08003470
Xiao Ma09b71022018-12-11 17:56:32 +09003471 test::DNSResponder dns(listen_addr);
3472 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003473 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003474 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003475
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003476 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003477 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003478 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003479
3480 // Query an IPv4-only hostname. Expect that gets a synthesized address.
3481 struct hostent* result = gethostbyname2("ipv4only", AF_INET6);
3482 ASSERT_TRUE(result != nullptr);
3483 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3484 std::string result_str = ToString(result);
3485 EXPECT_EQ(result_str, "64:ff9b::102:304");
3486}
nuccachena26cc2a2018-07-17 18:07:23 +08003487
3488TEST_F(ResolverTest, GetHostByName2_DnsQueryWithHavingNat64Prefix) {
3489 constexpr char dns64_name[] = "ipv4only.arpa.";
3490 constexpr char host_name[] = "v4v6.example.com.";
nuccachena26cc2a2018-07-17 18:07:23 +08003491 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003492 const std::vector<DnsRecord> records = {
3493 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3494 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3495 {host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
3496 };
3497
3498 test::DNSResponder dns(listen_addr);
3499 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003500 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003501 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003502
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003503 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003504 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003505 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003506
3507 // IPv4 DNS query. Prefix should have no effect on it.
3508 struct hostent* result = gethostbyname2("v4v6", AF_INET);
3509 ASSERT_TRUE(result != nullptr);
3510 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3511 std::string result_str = ToString(result);
3512 EXPECT_EQ(result_str, "1.2.3.4");
3513 dns.clearQueries();
3514
3515 // IPv6 DNS query. Prefix should have no effect on it.
3516 result = gethostbyname2("v4v6", AF_INET6);
3517 ASSERT_TRUE(result != nullptr);
3518 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3519 result_str = ToString(result);
3520 EXPECT_EQ(result_str, "2001:db8::102:304");
3521}
3522
3523TEST_F(ResolverTest, GetHostByName2_Dns64QuerySpecialUseIPv4Addresses) {
3524 constexpr char THIS_NETWORK[] = "this_network";
3525 constexpr char LOOPBACK[] = "loopback";
3526 constexpr char LINK_LOCAL[] = "link_local";
3527 constexpr char MULTICAST[] = "multicast";
3528 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
3529
3530 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
3531 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
3532 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
3533 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
3534 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
3535
3536 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003537 constexpr char dns64_name[] = "ipv4only.arpa.";
3538
Xiao Ma09b71022018-12-11 17:56:32 +09003539 test::DNSResponder dns(listen_addr);
3540 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003541 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003542 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003543
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003544 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003545 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003546 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003547
Luke Huangf8215372019-11-22 11:53:41 +08003548 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003549 static const struct TestConfig {
3550 std::string name;
3551 std::string addr;
3552
3553 std::string asHostName() const {
Luke Huangf8215372019-11-22 11:53:41 +08003554 return StringPrintf("%s.example.com.", name.c_str());
nuccachena26cc2a2018-07-17 18:07:23 +08003555 }
3556 } testConfigs[]{
3557 {THIS_NETWORK, ADDR_THIS_NETWORK},
3558 {LOOPBACK, ADDR_LOOPBACK},
3559 {LINK_LOCAL, ADDR_LINK_LOCAL},
3560 {MULTICAST, ADDR_MULTICAST},
3561 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
3562 };
Luke Huangf8215372019-11-22 11:53:41 +08003563 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003564
3565 for (const auto& config : testConfigs) {
3566 const std::string testHostName = config.asHostName();
3567 SCOPED_TRACE(testHostName);
3568
3569 const char* host_name = testHostName.c_str();
3570 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
3571
3572 struct hostent* result = gethostbyname2(config.name.c_str(), AF_INET6);
3573 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3574
3575 // In AF_INET6 case, don't synthesize special use IPv4 address.
3576 // Expect to have no answer
3577 EXPECT_EQ(nullptr, result);
3578
3579 dns.clearQueries();
3580 }
Bernie Innocenti2fef2b82018-12-20 15:56:40 +09003581}
Mike Yuf14e1a92019-05-10 13:54:58 +08003582
3583TEST_F(ResolverTest, PrefixDiscoveryBypassTls) {
3584 constexpr char listen_addr[] = "::1";
3585 constexpr char cleartext_port[] = "53";
3586 constexpr char tls_port[] = "853";
3587 constexpr char dns64_name[] = "ipv4only.arpa.";
3588 const std::vector<std::string> servers = {listen_addr};
3589
3590 test::DNSResponder dns(listen_addr);
3591 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
3592 test::DnsTlsFrontend tls(listen_addr, tls_port, listen_addr, cleartext_port);
3593 ASSERT_TRUE(tls.startServer());
3594
3595 // Setup OPPORTUNISTIC mode and wait for the validation complete.
waynema0e73c2e2019-07-31 15:04:08 +08003596 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08003597 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003598 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yuf14e1a92019-05-10 13:54:58 +08003599 tls.clearQueries();
3600
3601 // Start NAT64 prefix discovery and wait for it complete.
3602 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003603 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
Mike Yuf14e1a92019-05-10 13:54:58 +08003604
3605 // Verify it bypassed TLS even though there's a TLS server available.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003606 EXPECT_EQ(0, tls.queries()) << dns.dumpQueries();
3607 EXPECT_EQ(1U, GetNumQueries(dns, dns64_name)) << dns.dumpQueries();
Mike Yuf14e1a92019-05-10 13:54:58 +08003608
3609 // Restart the testing network to reset the cache.
3610 mDnsClient.TearDown();
3611 mDnsClient.SetUp();
3612 dns.clearQueries();
3613
3614 // Setup STRICT mode and wait for the validation complete.
waynema0e73c2e2019-07-31 15:04:08 +08003615 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
3616 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08003617 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003618 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yuf14e1a92019-05-10 13:54:58 +08003619 tls.clearQueries();
3620
3621 // Start NAT64 prefix discovery and wait for it to complete.
3622 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003623 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
Mike Yuf14e1a92019-05-10 13:54:58 +08003624
3625 // Verify it bypassed TLS despite STRICT mode.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003626 EXPECT_EQ(0, tls.queries()) << dns.dumpQueries();
3627 EXPECT_EQ(1U, GetNumQueries(dns, dns64_name)) << dns.dumpQueries();
Mike Yuf14e1a92019-05-10 13:54:58 +08003628}
Luke Huang9807e6b2019-05-20 16:17:12 +08003629
3630namespace {
3631
Luke Huang0d592bc2019-05-25 18:24:03 +08003632class ScopedSetNetworkForProcess {
3633 public:
3634 explicit ScopedSetNetworkForProcess(unsigned netId) {
3635 mStoredNetId = getNetworkForProcess();
3636 if (netId == mStoredNetId) return;
3637 EXPECT_EQ(0, setNetworkForProcess(netId));
3638 }
3639 ~ScopedSetNetworkForProcess() { EXPECT_EQ(0, setNetworkForProcess(mStoredNetId)); }
3640
3641 private:
3642 unsigned mStoredNetId;
3643};
3644
3645class ScopedSetNetworkForResolv {
3646 public:
3647 explicit ScopedSetNetworkForResolv(unsigned netId) { EXPECT_EQ(0, setNetworkForResolv(netId)); }
3648 ~ScopedSetNetworkForResolv() { EXPECT_EQ(0, setNetworkForResolv(NETID_UNSET)); }
3649};
3650
Luke Huang9807e6b2019-05-20 16:17:12 +08003651void sendCommand(int fd, const std::string& cmd) {
3652 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size() + 1));
3653 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size() + 1));
3654}
3655
3656int32_t readBE32(int fd) {
3657 int32_t tmp;
3658 int n = TEMP_FAILURE_RETRY(read(fd, &tmp, sizeof(tmp)));
3659 EXPECT_TRUE(n > 0);
3660 return ntohl(tmp);
3661}
3662
Luke Huang0d592bc2019-05-25 18:24:03 +08003663int readResponseCode(int fd) {
Luke Huang9807e6b2019-05-20 16:17:12 +08003664 char buf[4];
3665 int n = TEMP_FAILURE_RETRY(read(fd, &buf, sizeof(buf)));
3666 EXPECT_TRUE(n > 0);
3667 // The format of response code is that 4 bytes for the code & null.
3668 buf[3] = '\0';
3669 int result;
3670 EXPECT_TRUE(ParseInt(buf, &result));
3671 return result;
3672}
3673
Luke Huang0d592bc2019-05-25 18:24:03 +08003674bool checkAndClearUseLocalNameserversFlag(unsigned* netid) {
3675 if (netid == nullptr || ((*netid) & NETID_USE_LOCAL_NAMESERVERS) == 0) {
3676 return false;
3677 }
3678 *netid = (*netid) & ~NETID_USE_LOCAL_NAMESERVERS;
3679 return true;
3680}
3681
Luke Huangf8215372019-11-22 11:53:41 +08003682aidl::android::net::UidRangeParcel makeUidRangeParcel(int start, int stop) {
3683 aidl::android::net::UidRangeParcel res;
Luke Huang0d592bc2019-05-25 18:24:03 +08003684 res.start = start;
3685 res.stop = stop;
3686
3687 return res;
3688}
3689
3690void expectNetIdWithLocalNameserversFlag(unsigned netId) {
3691 unsigned dnsNetId = 0;
3692 EXPECT_EQ(0, getNetworkForDns(&dnsNetId));
3693 EXPECT_TRUE(checkAndClearUseLocalNameserversFlag(&dnsNetId));
3694 EXPECT_EQ(netId, static_cast<unsigned>(dnsNetId));
3695}
3696
3697void expectDnsNetIdEquals(unsigned netId) {
3698 unsigned dnsNetId = 0;
3699 EXPECT_EQ(0, getNetworkForDns(&dnsNetId));
3700 EXPECT_EQ(netId, static_cast<unsigned>(dnsNetId));
3701}
3702
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003703void expectDnsNetIdIsDefaultNetwork(INetd* netdService) {
Luke Huang0d592bc2019-05-25 18:24:03 +08003704 int currentNetid;
3705 EXPECT_TRUE(netdService->networkGetDefault(&currentNetid).isOk());
3706 expectDnsNetIdEquals(currentNetid);
3707}
3708
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003709void expectDnsNetIdWithVpn(INetd* netdService, unsigned vpnNetId, unsigned expectedNetId) {
Luke Huang0d592bc2019-05-25 18:24:03 +08003710 EXPECT_TRUE(netdService->networkCreateVpn(vpnNetId, false /* secure */).isOk());
3711 uid_t uid = getuid();
3712 // Add uid to VPN
3713 EXPECT_TRUE(netdService->networkAddUidRanges(vpnNetId, {makeUidRangeParcel(uid, uid)}).isOk());
3714 expectDnsNetIdEquals(expectedNetId);
3715 EXPECT_TRUE(netdService->networkDestroy(vpnNetId).isOk());
3716}
3717
Luke Huang9807e6b2019-05-20 16:17:12 +08003718} // namespace
3719
3720TEST_F(ResolverTest, getDnsNetId) {
3721 // We've called setNetworkForProcess in SetupOemNetwork, so reset to default first.
3722 setNetworkForProcess(NETID_UNSET);
Luke Huang0d592bc2019-05-25 18:24:03 +08003723
3724 expectDnsNetIdIsDefaultNetwork(mDnsClient.netdService());
3725 expectDnsNetIdWithVpn(mDnsClient.netdService(), TEST_VPN_NETID, TEST_VPN_NETID);
Luke Huang9807e6b2019-05-20 16:17:12 +08003726
3727 // Test with setNetworkForProcess
Luke Huang0d592bc2019-05-25 18:24:03 +08003728 {
3729 ScopedSetNetworkForProcess scopedSetNetworkForProcess(TEST_NETID);
3730 expectDnsNetIdEquals(TEST_NETID);
3731 }
3732
3733 // Test with setNetworkForProcess with NETID_USE_LOCAL_NAMESERVERS
3734 {
3735 ScopedSetNetworkForProcess scopedSetNetworkForProcess(TEST_NETID |
3736 NETID_USE_LOCAL_NAMESERVERS);
3737 expectNetIdWithLocalNameserversFlag(TEST_NETID);
3738 }
Luke Huang9807e6b2019-05-20 16:17:12 +08003739
3740 // Test with setNetworkForResolv
Luke Huang0d592bc2019-05-25 18:24:03 +08003741 {
3742 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID);
3743 expectDnsNetIdEquals(TEST_NETID);
3744 }
3745
3746 // Test with setNetworkForResolv with NETID_USE_LOCAL_NAMESERVERS
3747 {
3748 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID |
3749 NETID_USE_LOCAL_NAMESERVERS);
3750 expectNetIdWithLocalNameserversFlag(TEST_NETID);
3751 }
3752
3753 // Test with setNetworkForResolv under bypassable vpn
3754 {
3755 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID);
3756 expectDnsNetIdWithVpn(mDnsClient.netdService(), TEST_VPN_NETID, TEST_NETID);
3757 }
Luke Huang9807e6b2019-05-20 16:17:12 +08003758
3759 // Create socket connected to DnsProxyListener
3760 int fd = dns_open_proxy();
3761 EXPECT_TRUE(fd > 0);
3762 unique_fd ufd(fd);
3763
3764 // Test command with wrong netId
3765 sendCommand(fd, "getdnsnetid abc");
Luke Huang0d592bc2019-05-25 18:24:03 +08003766 EXPECT_EQ(ResponseCode::DnsProxyQueryResult, readResponseCode(fd));
Luke Huang9807e6b2019-05-20 16:17:12 +08003767 EXPECT_EQ(-EINVAL, readBE32(fd));
3768
3769 // Test unsupported command
3770 sendCommand(fd, "getdnsnetidNotSupported");
3771 // Keep in sync with FrameworkListener.cpp (500, "Command not recognized")
Luke Huang0d592bc2019-05-25 18:24:03 +08003772 EXPECT_EQ(500, readResponseCode(fd));
Luke Huang9807e6b2019-05-20 16:17:12 +08003773}
Sehee Park2c118782019-05-07 13:02:45 +09003774
3775TEST_F(ResolverTest, BlockDnsQueryWithUidRule) {
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003776 // This test relies on blocking traffic on loopback, which xt_qtaguid does not do.
3777 // See aosp/358413 and b/34444781 for why.
3778 SKIP_IF_BPF_NOT_SUPPORTED;
3779
Sehee Park2c118782019-05-07 13:02:45 +09003780 constexpr char listen_addr1[] = "127.0.0.4";
3781 constexpr char listen_addr2[] = "::1";
3782 constexpr char host_name[] = "howdy.example.com.";
3783 const std::vector<DnsRecord> records = {
3784 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3785 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
3786 };
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003787 INetd* netdService = mDnsClient.netdService();
Sehee Park2c118782019-05-07 13:02:45 +09003788
3789 test::DNSResponder dns1(listen_addr1);
3790 test::DNSResponder dns2(listen_addr2);
3791 StartDns(dns1, records);
3792 StartDns(dns2, records);
3793
3794 std::vector<std::string> servers = {listen_addr1, listen_addr2};
3795 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
3796 dns1.clearQueries();
3797 dns2.clearQueries();
3798
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003799 // Add drop rule for TEST_UID. Also enable the standby chain because it might not be enabled.
3800 // Unfortunately we cannot use FIREWALL_CHAIN_NONE, or custom iptables rules, for this purpose
3801 // because netd calls fchown() on the DNS query sockets, and "iptables -m owner" matches the
3802 // UID of the socket creator, not the UID set by fchown().
3803 //
3804 // TODO: migrate FIREWALL_CHAIN_NONE to eBPF as well.
3805 EXPECT_TRUE(netdService->firewallEnableChildChain(INetd::FIREWALL_CHAIN_STANDBY, true).isOk());
3806 EXPECT_TRUE(netdService
Sehee Park2c118782019-05-07 13:02:45 +09003807 ->firewallSetUidRule(INetd::FIREWALL_CHAIN_STANDBY, TEST_UID,
3808 INetd::FIREWALL_RULE_DENY)
3809 .isOk());
3810
3811 // Save uid
3812 int suid = getuid();
3813
3814 // Switch to TEST_UID
3815 EXPECT_TRUE(seteuid(TEST_UID) == 0);
3816
3817 // Dns Query
3818 int fd1 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_a, 0);
3819 int fd2 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_aaaa, 0);
3820 EXPECT_TRUE(fd1 != -1);
3821 EXPECT_TRUE(fd2 != -1);
3822
3823 uint8_t buf[MAXPACKET] = {};
3824 int rcode;
3825 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
3826 EXPECT_EQ(-ECONNREFUSED, res);
3827
3828 memset(buf, 0, MAXPACKET);
3829 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
3830 EXPECT_EQ(-ECONNREFUSED, res);
3831
3832 // Restore uid
3833 EXPECT_TRUE(seteuid(suid) == 0);
3834
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003835 // Remove drop rule for TEST_UID, and disable the standby chain.
3836 EXPECT_TRUE(netdService
Sehee Park2c118782019-05-07 13:02:45 +09003837 ->firewallSetUidRule(INetd::FIREWALL_CHAIN_STANDBY, TEST_UID,
3838 INetd::FIREWALL_RULE_ALLOW)
3839 .isOk());
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003840 EXPECT_TRUE(netdService->firewallEnableChildChain(INetd::FIREWALL_CHAIN_STANDBY, false).isOk());
Sehee Park2c118782019-05-07 13:02:45 +09003841}
Mike Yua772c202019-09-23 17:47:21 +08003842
Mike Yu40e67072019-10-09 21:14:09 +08003843namespace {
3844
3845const std::string kDotConnectTimeoutMsFlag(
3846 "persist.device_config.netd_native.dot_connect_timeout_ms");
3847
3848class ScopedSystemProperties {
3849 public:
3850 explicit ScopedSystemProperties(const std::string& key, const std::string& value)
3851 : mStoredKey(key) {
3852 mStoredValue = android::base::GetProperty(key, "");
3853 android::base::SetProperty(key, value);
3854 }
3855 ~ScopedSystemProperties() { android::base::SetProperty(mStoredKey, mStoredValue); }
3856
3857 private:
3858 std::string mStoredKey;
3859 std::string mStoredValue;
3860};
3861
3862} // namespace
3863
Mike Yua772c202019-09-23 17:47:21 +08003864TEST_F(ResolverTest, ConnectTlsServerTimeout) {
Mike Yu40e67072019-10-09 21:14:09 +08003865 constexpr int expectedTimeout = 1000;
3866 constexpr char hostname1[] = "query1.example.com.";
3867 constexpr char hostname2[] = "query2.example.com.";
Mike Yua772c202019-09-23 17:47:21 +08003868 const std::vector<DnsRecord> records = {
Mike Yu40e67072019-10-09 21:14:09 +08003869 {hostname1, ns_type::ns_t_a, "1.2.3.4"},
3870 {hostname2, ns_type::ns_t_a, "1.2.3.5"},
Mike Yua772c202019-09-23 17:47:21 +08003871 };
3872
3873 test::DNSResponder dns;
3874 StartDns(dns, records);
Mike Yu40e67072019-10-09 21:14:09 +08003875 test::DnsTlsFrontend tls;
Mike Yua772c202019-09-23 17:47:21 +08003876 ASSERT_TRUE(tls.startServer());
3877
Mike Yu40e67072019-10-09 21:14:09 +08003878 // The resolver will adjust the timeout value to 1000ms since the value is too small.
3879 ScopedSystemProperties scopedSystemProperties(kDotConnectTimeoutMsFlag, "100");
Mike Yua772c202019-09-23 17:47:21 +08003880
Mike Yu40e67072019-10-09 21:14:09 +08003881 // Set up resolver to opportunistic mode with the default configuration.
Mike Yu8ac63402019-12-02 15:28:38 +08003882 const ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
Mike Yu40e67072019-10-09 21:14:09 +08003883 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
Mike Yua772c202019-09-23 17:47:21 +08003884 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003885 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yua772c202019-09-23 17:47:21 +08003886 tls.clearQueries();
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003887 dns.clearQueries();
Mike Yua772c202019-09-23 17:47:21 +08003888
3889 // The server becomes unresponsive to the handshake request.
3890 tls.setHangOnHandshakeForTesting(true);
3891
3892 // Expect the things happening in getaddrinfo():
3893 // 1. Connect to the private DNS server.
3894 // 2. SSL handshake times out.
3895 // 3. Fallback to UDP transport, and then get the answer.
Mike Yu40e67072019-10-09 21:14:09 +08003896 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
3897 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(hostname1, nullptr, hints);
Mike Yua772c202019-09-23 17:47:21 +08003898
Mike Yu40e67072019-10-09 21:14:09 +08003899 EXPECT_NE(nullptr, result);
Mike Yua772c202019-09-23 17:47:21 +08003900 EXPECT_EQ(0, tls.queries());
Mike Yu40e67072019-10-09 21:14:09 +08003901 EXPECT_EQ(1U, GetNumQueries(dns, hostname1));
3902 EXPECT_EQ(records.at(0).addr, ToString(result));
Mike Yua772c202019-09-23 17:47:21 +08003903
Mike Yu40e67072019-10-09 21:14:09 +08003904 // A loose upper bound is set by adding 2000ms buffer time. Theoretically, getaddrinfo()
3905 // should just take a bit more than expetTimeout milliseconds.
3906 EXPECT_GE(timeTakenMs, expectedTimeout);
3907 EXPECT_LE(timeTakenMs, expectedTimeout + 2000);
3908
3909 // Set the server to be responsive. Verify that the resolver will attempt to reconnect
3910 // to the server and then get the result within the timeout.
3911 tls.setHangOnHandshakeForTesting(false);
3912 std::tie(result, timeTakenMs) = safe_getaddrinfo_time_taken(hostname2, nullptr, hints);
3913
3914 EXPECT_NE(nullptr, result);
3915 EXPECT_EQ(1, tls.queries());
3916 EXPECT_EQ(1U, GetNumQueries(dns, hostname2));
3917 EXPECT_EQ(records.at(1).addr, ToString(result));
3918
3919 EXPECT_LE(timeTakenMs, expectedTimeout);
Mike Yua772c202019-09-23 17:47:21 +08003920}
Hungming Chenbb90ab32019-10-28 18:20:31 +08003921
Ken Chen766feae2019-10-30 15:13:44 +08003922TEST_F(ResolverTest, FlushNetworkCache) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08003923 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08003924 test::DNSResponder dns;
3925 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
3926 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3927
3928 const hostent* result = gethostbyname("hello");
3929 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
3930
3931 // get result from cache
3932 result = gethostbyname("hello");
3933 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
3934
3935 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
3936
3937 result = gethostbyname("hello");
3938 EXPECT_EQ(2U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
3939}
3940
3941TEST_F(ResolverTest, FlushNetworkCache_random) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08003942 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08003943 constexpr int num_flush = 10;
3944 constexpr int num_queries = 20;
3945 test::DNSResponder dns;
3946 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
3947 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3948 const addrinfo hints = {.ai_family = AF_INET};
3949
3950 std::thread t([this]() {
3951 for (int i = 0; i < num_flush; ++i) {
3952 unsigned delay = arc4random_uniform(10 * 1000); // 10ms
3953 usleep(delay);
3954 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
3955 }
3956 });
3957
3958 for (int i = 0; i < num_queries; ++i) {
3959 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
3960 EXPECT_TRUE(result != nullptr);
3961 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
3962 }
3963 t.join();
3964}
3965
3966// flush cache while one query is wait-for-response, another is pending.
3967TEST_F(ResolverTest, FlushNetworkCache_concurrent) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08003968 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08003969 const char* listen_addr1 = "127.0.0.9";
3970 const char* listen_addr2 = "127.0.0.10";
3971 test::DNSResponder dns1(listen_addr1);
3972 test::DNSResponder dns2(listen_addr2);
3973 StartDns(dns1, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
3974 StartDns(dns2, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
3975 addrinfo hints = {.ai_family = AF_INET};
3976
3977 // step 1: set server#1 into deferred responding mode
3978 dns1.setDeferredResp(true);
3979 std::thread t1([&listen_addr1, &hints, this]() {
3980 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr1}));
3981 // step 3: query
3982 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
3983 // step 9: check result
3984 EXPECT_TRUE(result != nullptr);
3985 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
3986 });
3987
3988 // step 2: wait for the query to reach the server
3989 while (GetNumQueries(dns1, kHelloExampleCom) == 0) {
3990 usleep(1000); // 1ms
3991 }
3992
3993 std::thread t2([&listen_addr2, &hints, &dns2, this]() {
3994 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr2}));
3995 // step 5: query (should be blocked in resolver)
3996 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
3997 // step 7: check result
3998 EXPECT_TRUE(result != nullptr);
3999 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4000 EXPECT_EQ(1U, GetNumQueriesForType(dns2, ns_type::ns_t_a, kHelloExampleCom));
4001 });
4002
4003 // step 4: wait a bit for the 2nd query to enter pending state
4004 usleep(100 * 1000); // 100ms
4005 // step 6: flush cache (will unblock pending queries)
4006 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4007 t2.join();
4008
4009 // step 8: resume server#1
4010 dns1.setDeferredResp(false);
4011 t1.join();
4012
4013 // step 10: verify if result is correctly cached
4014 dns2.clearQueries();
4015 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4016 EXPECT_EQ(0U, GetNumQueries(dns2, kHelloExampleCom));
4017 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4018}
4019
waynema29253052019-08-20 11:26:08 +08004020// TODO: Perhaps to have a boundary conditions test for TCP and UDP.
4021TEST_F(ResolverTest, TcpQueryWithOversizePayload) {
4022 test::DNSResponder dns;
4023 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4024 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4025
4026 int fd = dns_open_proxy();
4027 ASSERT_TRUE(fd > 0);
4028
4029 // Sending DNS query over TCP once the packet sizes exceed 512 bytes.
4030 // The raw data is combined with Question section and Additional section
4031 // Question section : query "hello.example.com", type A, class IN
4032 // Additional section : type OPT (41), Option PADDING, Option Length 546
4033 // Padding option which allows DNS clients and servers to artificially
4034 // increase the size of a DNS message by a variable number of bytes.
4035 // See also RFC7830, section 3
4036 const std::string query =
4037 "+c0BAAABAAAAAAABBWhlbGxvB2V4YW1wbGUDY29tAAABAAEAACkgAAAAgAACJgAMAiIAAAAAAAAAAAAAAAAAA"
4038 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4039 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4040 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4041 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4042 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4043 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4044 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4045 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4046 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
4047 const std::string cmd =
4048 "resnsend " + std::to_string(TEST_NETID) + " 0 " /* ResNsendFlags */ + query + '\0';
4049 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
4050 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
4051 expectAnswersValid(fd, AF_INET, kHelloExampleComAddrV4);
4052 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom));
4053 EXPECT_EQ(0U, GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom));
4054}
4055
Ken Chen99344882020-01-01 14:59:38 +08004056TEST_F(ResolverTest, TruncatedRspMode) {
4057 constexpr char listen_addr[] = "127.0.0.4";
4058 constexpr char listen_addr2[] = "127.0.0.5";
4059 constexpr char listen_srv[] = "53";
4060
4061 test::DNSResponder dns(listen_addr, listen_srv, static_cast<ns_rcode>(-1));
4062 test::DNSResponder dns2(listen_addr2, listen_srv, static_cast<ns_rcode>(-1));
4063 // dns supports UDP only, dns2 support UDP and TCP
4064 dns.setResponseProbability(0.0, IPPROTO_TCP);
4065 StartDns(dns, kLargeCnameChainRecords);
4066 StartDns(dns2, kLargeCnameChainRecords);
4067
4068 const struct TestConfig {
4069 const std::optional<int32_t> tcMode;
4070 const bool ret;
4071 const unsigned numQueries;
4072 std::string asParameters() const {
4073 return StringPrintf("tcMode: %d, ret: %s, numQueries: %u", tcMode.value_or(-1),
4074 ret ? "true" : "false", numQueries);
4075 }
4076 } testConfigs[]{
4077 // clang-format off
4078 {std::nullopt, true, 0}, /* mode unset */
4079 {aidl::android::net::IDnsResolver::TC_MODE_DEFAULT, true, 0}, /* default mode */
4080 {aidl::android::net::IDnsResolver::TC_MODE_UDP_TCP, true, 1}, /* alternative mode */
4081 {-666, false, 1}, /* invalid input */
4082 // clang-format on
4083 };
4084
4085 for (const auto& config : testConfigs) {
4086 SCOPED_TRACE(config.asParameters());
4087
4088 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4089 parcel.servers = {listen_addr, listen_addr2};
4090 if (config.tcMode) {
4091 parcel.experimentalOptions.tcMode = config.tcMode.value();
4092 }
4093 ASSERT_EQ(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk(), config.ret);
4094
4095 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4096 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4097 ASSERT_TRUE(result != nullptr);
4098 EXPECT_EQ(ToString(result), kHelloExampleComAddrV4);
4099 // TC_MODE_DEFAULT: resolver retries on TCP-only on each name server.
4100 // TC_MODE_UDP_TCP: resolver retries on TCP on the same server, falls back to UDP from next.
4101 ASSERT_EQ(GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom), 1U);
4102 ASSERT_EQ(GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom), 1U);
4103 ASSERT_EQ(GetNumQueriesForProtocol(dns2, IPPROTO_UDP, kHelloExampleCom), config.numQueries);
4104 ASSERT_EQ(GetNumQueriesForProtocol(dns2, IPPROTO_TCP, kHelloExampleCom), 1U);
4105
4106 dns.clearQueries();
4107 dns2.clearQueries();
4108 ASSERT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4109 }
4110}
4111
Hungming Chenbb90ab32019-10-28 18:20:31 +08004112// Parameterized tests.
4113// TODO: Merge the existing tests as parameterized test if possible.
4114// TODO: Perhaps move parameterized tests to an independent file.
4115enum class CallType { GETADDRINFO, GETHOSTBYNAME };
4116class ResolverParameterizedTest : public ResolverTest,
Hungming Chen63779052019-10-30 15:06:13 +08004117 public testing::WithParamInterface<CallType> {
4118 protected:
Hungming Chen22617fd2019-12-06 12:15:45 +08004119 void VerifyQueryHelloExampleComV4(const test::DNSResponder& dns, const CallType calltype,
4120 const bool verifyNumQueries = true) {
Hungming Chen63779052019-10-30 15:06:13 +08004121 if (calltype == CallType::GETADDRINFO) {
4122 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4123 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4124 ASSERT_TRUE(result != nullptr);
4125 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4126 } else if (calltype == CallType::GETHOSTBYNAME) {
4127 const hostent* result = gethostbyname("hello");
4128 ASSERT_TRUE(result != nullptr);
4129 ASSERT_EQ(4, result->h_length);
4130 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
4131 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4132 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
4133 } else {
4134 FAIL() << "Unsupported call type: " << static_cast<uint32_t>(calltype);
4135 }
Hungming Chen22617fd2019-12-06 12:15:45 +08004136 if (verifyNumQueries) EXPECT_EQ(1U, GetNumQueries(dns, kHelloExampleCom));
Hungming Chen63779052019-10-30 15:06:13 +08004137 }
4138};
Hungming Chenbb90ab32019-10-28 18:20:31 +08004139
Hungming Chen63779052019-10-30 15:06:13 +08004140INSTANTIATE_TEST_SUITE_P(QueryCallTest, ResolverParameterizedTest,
Hungming Chenbb90ab32019-10-28 18:20:31 +08004141 testing::Values(CallType::GETADDRINFO, CallType::GETHOSTBYNAME),
4142 [](const testing::TestParamInfo<CallType>& info) {
Hungming Chenbb90ab32019-10-28 18:20:31 +08004143 switch (info.param) {
4144 case CallType::GETADDRINFO:
Hungming Chen63779052019-10-30 15:06:13 +08004145 return "GetAddrInfo";
Hungming Chenbb90ab32019-10-28 18:20:31 +08004146 case CallType::GETHOSTBYNAME:
Hungming Chen63779052019-10-30 15:06:13 +08004147 return "GetHostByName";
Hungming Chenbb90ab32019-10-28 18:20:31 +08004148 default:
Hungming Chen63779052019-10-30 15:06:13 +08004149 return "InvalidParameter"; // Should not happen.
Hungming Chenbb90ab32019-10-28 18:20:31 +08004150 }
Hungming Chenbb90ab32019-10-28 18:20:31 +08004151 });
4152
4153TEST_P(ResolverParameterizedTest, AuthoritySectionAndAdditionalSection) {
4154 // DNS response may have more information in authority section and additional section.
4155 // Currently, getanswer() of packages/modules/DnsResolver/getaddrinfo.cpp doesn't parse the
4156 // content of authority section and additional section. Test these sections if they crash
4157 // the resolver, just in case. See also RFC 1035 section 4.1.
4158 const auto& calltype = GetParam();
4159 test::DNSHeader header(kDefaultDnsHeader);
4160
4161 // Create a DNS response which has a authoritative nameserver record in authority
4162 // section and its relevant address record in additional section.
4163 //
4164 // Question
4165 // hello.example.com. IN A
4166 // Answer
4167 // hello.example.com. IN A 1.2.3.4
4168 // Authority:
4169 // hello.example.com. IN NS ns1.example.com.
4170 // Additional:
4171 // ns1.example.com. IN A 5.6.7.8
4172 //
4173 // A response may have only question, answer, and authority section. Current testing response
4174 // should be able to cover this condition.
4175
4176 // Question section.
4177 test::DNSQuestion question{
4178 .qname = {.name = kHelloExampleCom},
4179 .qtype = ns_type::ns_t_a,
4180 .qclass = ns_c_in,
4181 };
4182 header.questions.push_back(std::move(question));
4183
4184 // Answer section.
4185 test::DNSRecord recordAnswer{
4186 .name = {.name = kHelloExampleCom},
4187 .rtype = ns_type::ns_t_a,
4188 .rclass = ns_c_in,
4189 .ttl = 0, // no cache
4190 };
Hungming Chen63779052019-10-30 15:06:13 +08004191 EXPECT_TRUE(test::DNSResponder::fillRdata(kHelloExampleComAddrV4, recordAnswer));
Hungming Chenbb90ab32019-10-28 18:20:31 +08004192 header.answers.push_back(std::move(recordAnswer));
4193
4194 // Authority section.
4195 test::DNSRecord recordAuthority{
4196 .name = {.name = kHelloExampleCom},
4197 .rtype = ns_type::ns_t_ns,
4198 .rclass = ns_c_in,
4199 .ttl = 0, // no cache
4200 };
4201 EXPECT_TRUE(test::DNSResponder::fillRdata("ns1.example.com.", recordAuthority));
4202 header.authorities.push_back(std::move(recordAuthority));
4203
4204 // Additional section.
4205 test::DNSRecord recordAdditional{
4206 .name = {.name = "ns1.example.com."},
4207 .rtype = ns_type::ns_t_a,
4208 .rclass = ns_c_in,
4209 .ttl = 0, // no cache
4210 };
4211 EXPECT_TRUE(test::DNSResponder::fillRdata("5.6.7.8", recordAdditional));
4212 header.additionals.push_back(std::move(recordAdditional));
4213
4214 // Start DNS server.
4215 test::DNSResponder dns(test::DNSResponder::MappingType::DNS_HEADER);
4216 dns.addMappingDnsHeader(kHelloExampleCom, ns_type::ns_t_a, header);
4217 ASSERT_TRUE(dns.startServer());
4218 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4219 dns.clearQueries();
4220
4221 // Expect that get the address and the resolver doesn't crash.
Hungming Chen63779052019-10-30 15:06:13 +08004222 VerifyQueryHelloExampleComV4(dns, calltype);
4223}
4224
4225TEST_P(ResolverParameterizedTest, MessageCompression) {
4226 const auto& calltype = GetParam();
4227
4228 // The response with compressed domain name by a pointer. See RFC 1035 section 4.1.4.
4229 //
4230 // Ignoring the other fields of the message, the domain name of question section and answer
4231 // section are presented as:
4232 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4233 // 12 | 5 | h |
4234 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4235 // 14 | e | l |
4236 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4237 // 16 | l | o |
4238 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4239 // 18 | 7 | e |
4240 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4241 // 20 | x | a |
4242 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4243 // 22 | m | p |
4244 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4245 // 24 | l | e |
4246 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4247 // 26 | 3 | c |
4248 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4249 // 28 | o | m |
4250 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4251 // 30 | 0 | ... |
4252 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4253 //
4254 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4255 // 35 | 1 1| 12 |
4256 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4257 const std::vector<uint8_t> kResponseAPointer = {
4258 /* Header */
4259 0x00, 0x00, /* Transaction ID: 0x0000 */
4260 0x81, 0x80, /* Flags: qr rd ra */
4261 0x00, 0x01, /* Questions: 1 */
4262 0x00, 0x01, /* Answer RRs: 1 */
4263 0x00, 0x00, /* Authority RRs: 0 */
4264 0x00, 0x00, /* Additional RRs: 0 */
4265 /* Queries */
4266 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
4267 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name: hello.example.com */
4268 0x00, 0x01, /* Type: A */
4269 0x00, 0x01, /* Class: IN */
4270 /* Answers */
4271 0xc0, 0x0c, /* Name: hello.example.com (a pointer) */
4272 0x00, 0x01, /* Type: A */
4273 0x00, 0x01, /* Class: IN */
4274 0x00, 0x00, 0x00, 0x00, /* Time to live: 0 */
4275 0x00, 0x04, /* Data length: 4 */
4276 0x01, 0x02, 0x03, 0x04 /* Address: 1.2.3.4 */
4277 };
4278
4279 // The response with compressed domain name by a sequence of labels ending with a pointer. See
4280 // RFC 1035 section 4.1.4.
4281 //
4282 // Ignoring the other fields of the message, the domain name of question section and answer
4283 // section are presented as:
4284 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4285 // 12 | 5 | h |
4286 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4287 // 14 | e | l |
4288 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4289 // 16 | l | o |
4290 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4291 // 18 | 7 | e |
4292 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4293 // 20 | x | a |
4294 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4295 // 22 | m | p |
4296 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4297 // 24 | l | e |
4298 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4299 // 26 | 3 | c |
4300 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4301 // 28 | o | m |
4302 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4303 // 30 | 0 | ... |
4304 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4305 //
4306 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4307 // 35 | 5 | h |
4308 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4309 // 37 | e | l |
4310 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4311 // 39 | l | o |
4312 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4313 // 41 | 1 1| 18 |
4314 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4315 const std::vector<uint8_t> kResponseLabelEndingWithAPointer = {
4316 /* Header */
4317 0x00, 0x00, /* Transaction ID: 0x0000 */
4318 0x81, 0x80, /* Flags: qr rd ra */
4319 0x00, 0x01, /* Questions: 1 */
4320 0x00, 0x01, /* Answer RRs: 1 */
4321 0x00, 0x00, /* Authority RRs: 0 */
4322 0x00, 0x00, /* Additional RRs: 0 */
4323 /* Queries */
4324 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
4325 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name: hello.example.com */
4326 0x00, 0x01, /* Type: A */
4327 0x00, 0x01, /* Class: IN */
4328 /* Answers */
4329 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0xc0,
4330 0x12, /* Name: hello.example.com (a label ending with a pointer) */
4331 0x00, 0x01, /* Type: A */
4332 0x00, 0x01, /* Class: IN */
4333 0x00, 0x00, 0x00, 0x00, /* Time to live: 0 */
4334 0x00, 0x04, /* Data length: 4 */
4335 0x01, 0x02, 0x03, 0x04 /* Address: 1.2.3.4 */
4336 };
4337
4338 for (const auto& response : {kResponseAPointer, kResponseLabelEndingWithAPointer}) {
4339 SCOPED_TRACE(StringPrintf("Hex dump: %s", toHex(makeSlice(response)).c_str()));
4340
4341 test::DNSResponder dns(test::DNSResponder::MappingType::BINARY_PACKET);
4342 dns.addMappingBinaryPacket(kHelloExampleComQueryV4, response);
4343 StartDns(dns, {});
4344 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4345
4346 // Expect no cache because the TTL of testing responses are 0.
4347 VerifyQueryHelloExampleComV4(dns, calltype);
Hungming Chenbb90ab32019-10-28 18:20:31 +08004348 }
Mike Yu40e67072019-10-09 21:14:09 +08004349}
Hungming Chen22617fd2019-12-06 12:15:45 +08004350
4351TEST_P(ResolverParameterizedTest, TruncatedResponse) {
4352 const auto& calltype = GetParam();
4353
Hungming Chen22617fd2019-12-06 12:15:45 +08004354 test::DNSResponder dns;
Ken Chen99344882020-01-01 14:59:38 +08004355 StartDns(dns, kLargeCnameChainRecords);
Hungming Chen22617fd2019-12-06 12:15:45 +08004356 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4357
4358 // Expect UDP response is truncated. The resolver retries over TCP. See RFC 1035 section 4.2.1.
4359 VerifyQueryHelloExampleComV4(dns, calltype, false);
4360 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom));
4361 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom));
4362}