blob: a9bce8b40ce03d0f655e8fb176f8f110fe31fba5 [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:
Hungming Chen5bf09772019-04-25 11:16:13 +0800122 static void SetUpTestCase() {
123 // 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 }
Luke Huangf8215372019-11-22 11:53:41 +0800156 static void TearDownTestCase() { AIBinder_DeathRecipient_delete(sResolvDeathRecipient); }
Hungming Chene8f970c2019-04-10 17:34:06 +0800157
Ken Chenb9fa2062018-11-13 21:51:13 +0800158 protected:
Xiao Ma09b71022018-12-11 17:56:32 +0900159 struct DnsRecord {
160 std::string host_name; // host name
161 ns_type type; // record type
162 std::string addr; // ipv4/v6 address
163 };
164
Hungming Chen5bf09772019-04-25 11:16:13 +0800165 void SetUp() { mDnsClient.SetUp(); }
Hungming Chene8f970c2019-04-10 17:34:06 +0800166 void TearDown() { mDnsClient.TearDown(); }
nuccachena26cc2a2018-07-17 18:07:23 +0800167
Xiao Ma09b71022018-12-11 17:56:32 +0900168 void StartDns(test::DNSResponder& dns, const std::vector<DnsRecord>& records) {
169 for (const auto& r : records) {
170 dns.addMapping(r.host_name, r.type, r.addr);
171 }
172
173 ASSERT_TRUE(dns.startServer());
174 dns.clearQueries();
175 }
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900176
Hungming Chene8f970c2019-04-10 17:34:06 +0800177 bool WaitForNat64Prefix(ExpectNat64PrefixStatus status,
178 std::chrono::milliseconds timeout = std::chrono::milliseconds(1000)) {
Hungming Chen5bf09772019-04-25 11:16:13 +0800179 return sDnsMetricsListener->waitForNat64Prefix(status, timeout);
Hungming Chene8f970c2019-04-10 17:34:06 +0800180 }
181
Mike Yu724f77d2019-08-16 11:14:50 +0800182 bool WaitForPrivateDnsValidation(std::string serverAddr, bool validated) {
183 return sDnsMetricsListener->waitForPrivateDnsValidation(serverAddr, validated);
184 }
185
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900186 DnsResponderClient mDnsClient;
Xiao Ma09b71022018-12-11 17:56:32 +0900187
Hungming Chen5bf09772019-04-25 11:16:13 +0800188 // Use a shared static DNS listener for all tests to avoid registering lots of listeners
189 // which may be released late until process terminated. Currently, registered DNS listener
190 // is removed by binder death notification which is fired when the process hosting an
191 // IBinder has gone away. If every test in ResolverTest registers its DNS listener, Netd
192 // may temporarily hold lots of dead listeners until the unit test process terminates.
193 // TODO: Perhaps add an unregistering listener binder call or fork a listener process which
194 // could be terminated earlier.
Luke Huangf8215372019-11-22 11:53:41 +0800195 static std::shared_ptr<DnsMetricsListener>
196 sDnsMetricsListener; // Initialized in SetUpTestCase.
Hungming Chen5bf09772019-04-25 11:16:13 +0800197
198 // Use a shared static death recipient to monitor the service death. The static death
199 // recipient could monitor the death not only during the test but also between tests.
Luke Huangf8215372019-11-22 11:53:41 +0800200 static AIBinder_DeathRecipient* sResolvDeathRecipient; // Initialized in SetUpTestCase.
Ken Chenb9fa2062018-11-13 21:51:13 +0800201};
202
Hungming Chen5bf09772019-04-25 11:16:13 +0800203// Initialize static member of class.
Luke Huangf8215372019-11-22 11:53:41 +0800204std::shared_ptr<DnsMetricsListener> ResolverTest::sDnsMetricsListener;
205AIBinder_DeathRecipient* ResolverTest::sResolvDeathRecipient;
Hungming Chen5bf09772019-04-25 11:16:13 +0800206
Ken Chenb9fa2062018-11-13 21:51:13 +0800207TEST_F(ResolverTest, GetHostByName) {
Xiao Ma09b71022018-12-11 17:56:32 +0900208 constexpr char nonexistent_host_name[] = "nonexistent.example.com.";
209
210 test::DNSResponder dns;
211 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.3"}});
212 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800213
214 const hostent* result;
Ken Chenb9fa2062018-11-13 21:51:13 +0800215 result = gethostbyname("nonexistent");
216 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, nonexistent_host_name));
217 ASSERT_TRUE(result == nullptr);
218 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
219
220 dns.clearQueries();
221 result = gethostbyname("hello");
Xiao Ma09b71022018-12-11 17:56:32 +0900222 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
Ken Chenb9fa2062018-11-13 21:51:13 +0800223 ASSERT_FALSE(result == nullptr);
224 ASSERT_EQ(4, result->h_length);
225 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
226 EXPECT_EQ("1.2.3.3", ToString(result));
227 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800228}
229
lifr4e4a2e02019-01-29 16:53:51 +0800230TEST_F(ResolverTest, GetHostByName_cnames) {
231 constexpr char host_name[] = "host.example.com.";
232 size_t cnamecount = 0;
233 test::DNSResponder dns;
234
235 const std::vector<DnsRecord> records = {
236 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
237 {"a.example.com.", ns_type::ns_t_cname, "b.example.com."},
238 {"b.example.com.", ns_type::ns_t_cname, "c.example.com."},
239 {"c.example.com.", ns_type::ns_t_cname, "d.example.com."},
240 {"d.example.com.", ns_type::ns_t_cname, "e.example.com."},
241 {"e.example.com.", ns_type::ns_t_cname, host_name},
242 {host_name, ns_type::ns_t_a, "1.2.3.3"},
243 {host_name, ns_type::ns_t_aaaa, "2001:db8::42"},
244 };
245 StartDns(dns, records);
246 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
247
248 // using gethostbyname2() to resolve ipv4 hello.example.com. to 1.2.3.3
249 // Ensure the v4 address and cnames are correct
250 const hostent* result;
251 result = gethostbyname2("hello", AF_INET);
252 ASSERT_FALSE(result == nullptr);
253
254 for (int i = 0; result != nullptr && result->h_aliases[i] != nullptr; i++) {
255 std::string domain_name = records[i].host_name.substr(0, records[i].host_name.size() - 1);
256 EXPECT_EQ(result->h_aliases[i], domain_name);
257 cnamecount++;
258 }
259 // The size of "Non-cname type" record in DNS records is 2
260 ASSERT_EQ(cnamecount, records.size() - 2);
261 ASSERT_EQ(4, result->h_length);
262 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
263 EXPECT_EQ("1.2.3.3", ToString(result));
264 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
265 EXPECT_EQ(1U, dns.queries().size()) << dns.dumpQueries();
266
267 // using gethostbyname2() to resolve ipv6 hello.example.com. to 2001:db8::42
268 // Ensure the v6 address and cnames are correct
269 cnamecount = 0;
270 dns.clearQueries();
271 result = gethostbyname2("hello", AF_INET6);
272 for (unsigned i = 0; result != nullptr && result->h_aliases[i] != nullptr; i++) {
273 std::string domain_name = records[i].host_name.substr(0, records[i].host_name.size() - 1);
274 EXPECT_EQ(result->h_aliases[i], domain_name);
275 cnamecount++;
276 }
277 // The size of "Non-cname type" DNS record in records is 2
278 ASSERT_EQ(cnamecount, records.size() - 2);
279 ASSERT_FALSE(result == nullptr);
280 ASSERT_EQ(16, result->h_length);
281 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
282 EXPECT_EQ("2001:db8::42", ToString(result));
283 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
284}
285
286TEST_F(ResolverTest, GetHostByName_cnamesInfiniteLoop) {
287 test::DNSResponder dns;
288 const std::vector<DnsRecord> records = {
289 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
290 {"a.example.com.", ns_type::ns_t_cname, kHelloExampleCom},
291 };
292 StartDns(dns, records);
293 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
294
295 const hostent* result;
296 result = gethostbyname2("hello", AF_INET);
297 ASSERT_TRUE(result == nullptr);
298
299 dns.clearQueries();
300 result = gethostbyname2("hello", AF_INET6);
301 ASSERT_TRUE(result == nullptr);
302}
303
Ken Chenb9fa2062018-11-13 21:51:13 +0800304TEST_F(ResolverTest, GetHostByName_localhost) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800305 constexpr char name_camelcase[] = "LocalHost";
Ken Chenb9fa2062018-11-13 21:51:13 +0800306 constexpr char name_ip6_dot[] = "ip6-localhost.";
307 constexpr char name_ip6_fqdn[] = "ip6-localhost.example.com.";
308
309 // Add a dummy nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900310 test::DNSResponder dns;
311 StartDns(dns, {});
312 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800313
314 // Expect no DNS queries; localhost is resolved via /etc/hosts
Xiao Ma09b71022018-12-11 17:56:32 +0900315 const hostent* result = gethostbyname(kLocalHost);
Ken Chenb9fa2062018-11-13 21:51:13 +0800316 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
317 ASSERT_FALSE(result == nullptr);
318 ASSERT_EQ(4, result->h_length);
319 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900320 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800321 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
322
323 // Ensure the hosts file resolver ignores case of hostnames
324 result = gethostbyname(name_camelcase);
325 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
326 ASSERT_FALSE(result == nullptr);
327 ASSERT_EQ(4, result->h_length);
328 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900329 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800330 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
331
332 // The hosts file also contains ip6-localhost, but gethostbyname() won't
chenbruce018fdb22019-06-12 18:08:04 +0800333 // return it. This would be easy to
Ken Chenb9fa2062018-11-13 21:51:13 +0800334 // change, but there's no point in changing the legacy behavior; new code
335 // should be calling getaddrinfo() anyway.
336 // So we check the legacy behavior, which results in amusing A-record
337 // lookups for ip6-localhost, with and without search domains appended.
338 dns.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900339 result = gethostbyname(kIp6LocalHost);
Sehee Parkbbca0202018-11-16 10:53:16 +0900340 EXPECT_EQ(2U, dns.queries().size()) << dns.dumpQueries();
341 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, name_ip6_dot)) << dns.dumpQueries();
342 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, name_ip6_fqdn)) << dns.dumpQueries();
Ken Chenb9fa2062018-11-13 21:51:13 +0800343 ASSERT_TRUE(result == nullptr);
344
345 // Finally, use gethostbyname2() to resolve ip6-localhost to ::1 from
346 // the hosts file.
347 dns.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900348 result = gethostbyname2(kIp6LocalHost, AF_INET6);
Ken Chenb9fa2062018-11-13 21:51:13 +0800349 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
350 ASSERT_FALSE(result == nullptr);
351 ASSERT_EQ(16, result->h_length);
352 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900353 EXPECT_EQ(kIp6LocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800354 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800355}
356
357TEST_F(ResolverTest, GetHostByName_numeric) {
358 // Add a dummy nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900359 test::DNSResponder dns;
360 StartDns(dns, {});
361 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800362
363 // Numeric v4 address: expect no DNS queries
364 constexpr char numeric_v4[] = "192.168.0.1";
Ken Chenb9fa2062018-11-13 21:51:13 +0800365 const hostent* result = gethostbyname(numeric_v4);
Sehee Parkbbca0202018-11-16 10:53:16 +0900366 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800367 ASSERT_FALSE(result == nullptr);
368 ASSERT_EQ(4, result->h_length); // v4
369 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
370 EXPECT_EQ(numeric_v4, ToString(result));
371 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
372
373 // gethostbyname() recognizes a v6 address, and fails with no DNS queries
374 constexpr char numeric_v6[] = "2001:db8::42";
375 dns.clearQueries();
376 result = gethostbyname(numeric_v6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900377 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800378 EXPECT_TRUE(result == nullptr);
379
380 // Numeric v6 address with gethostbyname2(): succeeds with no DNS queries
381 dns.clearQueries();
382 result = gethostbyname2(numeric_v6, AF_INET6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900383 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800384 ASSERT_FALSE(result == nullptr);
385 ASSERT_EQ(16, result->h_length); // v6
386 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
387 EXPECT_EQ(numeric_v6, ToString(result));
388 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
389
390 // Numeric v6 address with scope work with getaddrinfo(),
391 // but gethostbyname2() does not understand them; it issues two dns
392 // queries, then fails. This hardly ever happens, there's no point
393 // in fixing this. This test simply verifies the current (bogus)
394 // behavior to avoid further regressions (like crashes, or leaks).
395 constexpr char numeric_v6_scope[] = "fe80::1%lo";
396 dns.clearQueries();
397 result = gethostbyname2(numeric_v6_scope, AF_INET6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900398 EXPECT_EQ(2U, dns.queries().size()); // OUCH!
Ken Chenb9fa2062018-11-13 21:51:13 +0800399 ASSERT_TRUE(result == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800400}
401
402TEST_F(ResolverTest, BinderSerialization) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800403 std::vector<int> params_offsets = {
Luke Huang5bd827c2019-03-14 16:10:04 +0800404 IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY,
405 IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD,
406 IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES,
407 IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES,
408 IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC,
409 IDnsResolver::RESOLVER_PARAMS_RETRY_COUNT,
Ken Chenb9fa2062018-11-13 21:51:13 +0800410 };
Bernie Innocentib102dd22018-12-04 14:57:48 +0900411 const int size = static_cast<int>(params_offsets.size());
Luke Huang5bd827c2019-03-14 16:10:04 +0800412 EXPECT_EQ(size, IDnsResolver::RESOLVER_PARAMS_COUNT);
Ken Chenb9fa2062018-11-13 21:51:13 +0800413 std::sort(params_offsets.begin(), params_offsets.end());
Bernie Innocentib102dd22018-12-04 14:57:48 +0900414 for (int i = 0; i < size; ++i) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800415 EXPECT_EQ(params_offsets[i], i);
416 }
417}
418
419TEST_F(ResolverTest, GetHostByName_Binder) {
Luke Huangf8215372019-11-22 11:53:41 +0800420 std::vector<std::string> domains = {"example.com"};
Ken Chenb9fa2062018-11-13 21:51:13 +0800421 std::vector<std::unique_ptr<test::DNSResponder>> dns;
422 std::vector<std::string> servers;
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900423 std::vector<DnsResponderClient::Mapping> mappings;
424 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupMappings(1, domains, &mappings));
425 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupDNSServers(4, mappings, &dns, &servers));
Ken Chenb9fa2062018-11-13 21:51:13 +0800426 ASSERT_EQ(1U, mappings.size());
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900427 const DnsResponderClient::Mapping& mapping = mappings[0];
Ken Chenb9fa2062018-11-13 21:51:13 +0800428
Xiao Ma09b71022018-12-11 17:56:32 +0900429 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains, kDefaultParams));
Ken Chenb9fa2062018-11-13 21:51:13 +0800430
431 const hostent* result = gethostbyname(mapping.host.c_str());
Bernie Innocentib102dd22018-12-04 14:57:48 +0900432 const size_t total_queries =
Luke Huangfde82482019-06-04 01:04:53 +0800433 std::accumulate(dns.begin(), dns.end(), 0, [&mapping](size_t total, auto& d) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800434 return total + GetNumQueriesForType(*d, ns_type::ns_t_a, mapping.entry.c_str());
435 });
436
437 EXPECT_LE(1U, total_queries);
438 ASSERT_FALSE(result == nullptr);
439 ASSERT_EQ(4, result->h_length);
440 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
441 EXPECT_EQ(mapping.ip4, ToString(result));
442 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
443
444 std::vector<std::string> res_servers;
445 std::vector<std::string> res_domains;
Mike Yu0a1c53d2018-11-26 13:26:21 +0900446 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +0900447 res_params res_params;
Ken Chenb9fa2062018-11-13 21:51:13 +0800448 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +0800449 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +0800450 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
451 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
452 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chenb9fa2062018-11-13 21:51:13 +0800453 EXPECT_EQ(servers.size(), res_servers.size());
454 EXPECT_EQ(domains.size(), res_domains.size());
Mike Yu0a1c53d2018-11-26 13:26:21 +0900455 EXPECT_EQ(0U, res_tls_servers.size());
Luke Huang5bd827c2019-03-14 16:10:04 +0800456 ASSERT_EQ(static_cast<size_t>(IDnsResolver::RESOLVER_PARAMS_COUNT), kDefaultParams.size());
457 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY],
458 res_params.sample_validity);
459 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900460 res_params.success_threshold);
Luke Huang5bd827c2019-03-14 16:10:04 +0800461 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
462 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
463 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
Ken Chenb9fa2062018-11-13 21:51:13 +0800464 res_params.base_timeout_msec);
465 EXPECT_EQ(servers.size(), res_stats.size());
466
Bernie Innocenti0c067e42019-04-01 15:33:16 +0900467 EXPECT_THAT(res_servers, testing::UnorderedElementsAreArray(servers));
468 EXPECT_THAT(res_domains, testing::UnorderedElementsAreArray(domains));
Ken Chenb9fa2062018-11-13 21:51:13 +0800469}
470
471TEST_F(ResolverTest, GetAddrInfo) {
Xiao Ma09b71022018-12-11 17:56:32 +0900472 constexpr char listen_addr[] = "127.0.0.4";
473 constexpr char listen_addr2[] = "127.0.0.5";
474 constexpr char host_name[] = "howdy.example.com.";
Ken Chenb9fa2062018-11-13 21:51:13 +0800475
Xiao Ma09b71022018-12-11 17:56:32 +0900476 const std::vector<DnsRecord> records = {
477 {host_name, ns_type::ns_t_a, "1.2.3.4"},
478 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
479 };
480 test::DNSResponder dns(listen_addr);
481 test::DNSResponder dns2(listen_addr2);
482 StartDns(dns, records);
483 StartDns(dns2, records);
Ken Chenb9fa2062018-11-13 21:51:13 +0800484
Xiao Ma09b71022018-12-11 17:56:32 +0900485 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}));
Ken Chenb9fa2062018-11-13 21:51:13 +0800486 dns.clearQueries();
487 dns2.clearQueries();
488
489 ScopedAddrinfo result = safe_getaddrinfo("howdy", nullptr, nullptr);
490 EXPECT_TRUE(result != nullptr);
491 size_t found = GetNumQueries(dns, host_name);
492 EXPECT_LE(1U, found);
493 // Could be A or AAAA
494 std::string result_str = ToString(result);
495 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +0800496 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +0800497
498 // Verify that the name is cached.
499 size_t old_found = found;
500 result = safe_getaddrinfo("howdy", nullptr, nullptr);
501 EXPECT_TRUE(result != nullptr);
502 found = GetNumQueries(dns, host_name);
503 EXPECT_LE(1U, found);
504 EXPECT_EQ(old_found, found);
505 result_str = ToString(result);
Luke Huangf8215372019-11-22 11:53:41 +0800506 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4") << result_str;
Ken Chenb9fa2062018-11-13 21:51:13 +0800507
508 // Change the DNS resolver, ensure that queries are still cached.
Xiao Ma09b71022018-12-11 17:56:32 +0900509 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr2}));
Ken Chenb9fa2062018-11-13 21:51:13 +0800510 dns.clearQueries();
511 dns2.clearQueries();
512
513 result = safe_getaddrinfo("howdy", nullptr, nullptr);
514 EXPECT_TRUE(result != nullptr);
515 found = GetNumQueries(dns, host_name);
516 size_t found2 = GetNumQueries(dns2, host_name);
517 EXPECT_EQ(0U, found);
518 EXPECT_LE(0U, found2);
519
520 // Could be A or AAAA
521 result_str = ToString(result);
522 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +0800523 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +0800524}
525
526TEST_F(ResolverTest, GetAddrInfoV4) {
Xiao Ma09b71022018-12-11 17:56:32 +0900527 test::DNSResponder dns;
528 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.5"}});
529 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800530
Xiao Ma09b71022018-12-11 17:56:32 +0900531 const addrinfo hints = {.ai_family = AF_INET};
532 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
Ken Chenb9fa2062018-11-13 21:51:13 +0800533 EXPECT_TRUE(result != nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900534 EXPECT_EQ(1U, GetNumQueries(dns, kHelloExampleCom));
Ken Chenb9fa2062018-11-13 21:51:13 +0800535 EXPECT_EQ("1.2.3.5", ToString(result));
536}
537
538TEST_F(ResolverTest, GetAddrInfo_localhost) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800539 // Add a dummy nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900540 test::DNSResponder dns;
541 StartDns(dns, {});
542 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800543
Xiao Ma09b71022018-12-11 17:56:32 +0900544 ScopedAddrinfo result = safe_getaddrinfo(kLocalHost, nullptr, nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800545 EXPECT_TRUE(result != nullptr);
546 // Expect no DNS queries; localhost is resolved via /etc/hosts
547 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900548 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800549
Xiao Ma09b71022018-12-11 17:56:32 +0900550 result = safe_getaddrinfo(kIp6LocalHost, nullptr, nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800551 EXPECT_TRUE(result != nullptr);
552 // Expect no DNS queries; ip6-localhost is resolved via /etc/hosts
553 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900554 EXPECT_EQ(kIp6LocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800555}
556
Luke Huangd8ac4752019-06-18 17:05:47 +0800557TEST_F(ResolverTest, GetAddrInfo_InvalidSocketType) {
558 test::DNSResponder dns;
559 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.5"}});
560 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
561
562 // TODO: Test other invalid socket types.
563 const addrinfo hints = {
564 .ai_family = AF_UNSPEC,
Luke Huangd8ac4752019-06-18 17:05:47 +0800565 .ai_socktype = SOCK_PACKET,
566 };
567 addrinfo* result = nullptr;
568 // This is a valid hint, but the query won't be sent because the socket type is
569 // not supported.
570 EXPECT_EQ(EAI_NODATA, getaddrinfo("hello", nullptr, &hints, &result));
571 ScopedAddrinfo result_cleanup(result);
572 EXPECT_EQ(nullptr, result);
573}
574
Ken Chen92bed612018-12-22 21:46:55 +0800575// Verify if the resolver correctly handle multiple queries simultaneously
576// step 1: set dns server#1 into deferred responding mode.
577// step 2: thread#1 query "hello.example.com." --> resolver send query to server#1.
578// step 3: thread#2 query "hello.example.com." --> resolver hold the request and wait for
579// response of previous pending query sent by thread#1.
580// step 4: thread#3 query "konbanha.example.com." --> resolver send query to server#3. Server
581// respond to resolver immediately.
582// step 5: check if server#1 get 1 query by thread#1, server#2 get 0 query, server#3 get 1 query.
583// step 6: resume dns server#1 to respond dns query in step#2.
584// step 7: thread#1 and #2 should get returned from DNS query after step#6. Also, check the
585// number of queries in server#2 is 0 to ensure thread#2 does not wake up unexpectedly
586// before signaled by thread#1.
587TEST_F(ResolverTest, GetAddrInfoV4_deferred_resp) {
588 const char* listen_addr1 = "127.0.0.9";
589 const char* listen_addr2 = "127.0.0.10";
590 const char* listen_addr3 = "127.0.0.11";
591 const char* listen_srv = "53";
592 const char* host_name_deferred = "hello.example.com.";
593 const char* host_name_normal = "konbanha.example.com.";
Mike Yufc125e42019-05-15 20:41:28 +0800594 test::DNSResponder dns1(listen_addr1, listen_srv, ns_rcode::ns_r_servfail);
595 test::DNSResponder dns2(listen_addr2, listen_srv, ns_rcode::ns_r_servfail);
596 test::DNSResponder dns3(listen_addr3, listen_srv, ns_rcode::ns_r_servfail);
Ken Chen92bed612018-12-22 21:46:55 +0800597 dns1.addMapping(host_name_deferred, ns_type::ns_t_a, "1.2.3.4");
598 dns2.addMapping(host_name_deferred, ns_type::ns_t_a, "1.2.3.4");
599 dns3.addMapping(host_name_normal, ns_type::ns_t_a, "1.2.3.5");
600 ASSERT_TRUE(dns1.startServer());
601 ASSERT_TRUE(dns2.startServer());
602 ASSERT_TRUE(dns3.startServer());
603 const std::vector<std::string> servers_for_t1 = {listen_addr1};
604 const std::vector<std::string> servers_for_t2 = {listen_addr2};
605 const std::vector<std::string> servers_for_t3 = {listen_addr3};
606 addrinfo hints = {.ai_family = AF_INET};
607 const std::vector<int> params = {300, 25, 8, 8, 5000};
608 bool t3_task_done = false;
609
610 dns1.setDeferredResp(true);
611 std::thread t1([&, this]() {
612 ASSERT_TRUE(
613 mDnsClient.SetResolversForNetwork(servers_for_t1, kDefaultSearchDomains, params));
614 ScopedAddrinfo result = safe_getaddrinfo(host_name_deferred, nullptr, &hints);
615 // t3's dns query should got returned first
616 EXPECT_TRUE(t3_task_done);
617 EXPECT_EQ(1U, GetNumQueries(dns1, host_name_deferred));
618 EXPECT_TRUE(result != nullptr);
619 EXPECT_EQ("1.2.3.4", ToString(result));
620 });
621
622 // ensuring t1 and t2 handler functions are processed in order
623 usleep(100 * 1000);
624 std::thread t2([&, this]() {
625 ASSERT_TRUE(
626 mDnsClient.SetResolversForNetwork(servers_for_t2, kDefaultSearchDomains, params));
627 ScopedAddrinfo result = safe_getaddrinfo(host_name_deferred, nullptr, &hints);
628 EXPECT_TRUE(t3_task_done);
629 EXPECT_EQ(0U, GetNumQueries(dns2, host_name_deferred));
630 EXPECT_TRUE(result != nullptr);
631 EXPECT_EQ("1.2.3.4", ToString(result));
632
633 std::vector<std::string> res_servers;
634 std::vector<std::string> res_domains;
635 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +0900636 res_params res_params;
Ken Chen92bed612018-12-22 21:46:55 +0800637 std::vector<ResolverStats> res_stats;
638 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +0800639 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
640 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains,
641 &res_tls_servers, &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chen92bed612018-12-22 21:46:55 +0800642 EXPECT_EQ(0, wait_for_pending_req_timeout_count);
643 });
644
645 // ensuring t2 and t3 handler functions are processed in order
646 usleep(100 * 1000);
647 std::thread t3([&, this]() {
648 ASSERT_TRUE(
649 mDnsClient.SetResolversForNetwork(servers_for_t3, kDefaultSearchDomains, params));
650 ScopedAddrinfo result = safe_getaddrinfo(host_name_normal, nullptr, &hints);
651 EXPECT_EQ(1U, GetNumQueries(dns1, host_name_deferred));
652 EXPECT_EQ(0U, GetNumQueries(dns2, host_name_deferred));
653 EXPECT_EQ(1U, GetNumQueries(dns3, host_name_normal));
654 EXPECT_TRUE(result != nullptr);
655 EXPECT_EQ("1.2.3.5", ToString(result));
656
657 t3_task_done = true;
658 dns1.setDeferredResp(false);
659 });
660 t3.join();
661 t1.join();
662 t2.join();
663}
664
lifr4e4a2e02019-01-29 16:53:51 +0800665TEST_F(ResolverTest, GetAddrInfo_cnames) {
666 constexpr char host_name[] = "host.example.com.";
667 test::DNSResponder dns;
668 const std::vector<DnsRecord> records = {
669 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
670 {"a.example.com.", ns_type::ns_t_cname, "b.example.com."},
671 {"b.example.com.", ns_type::ns_t_cname, "c.example.com."},
672 {"c.example.com.", ns_type::ns_t_cname, "d.example.com."},
673 {"d.example.com.", ns_type::ns_t_cname, "e.example.com."},
674 {"e.example.com.", ns_type::ns_t_cname, host_name},
675 {host_name, ns_type::ns_t_a, "1.2.3.3"},
676 {host_name, ns_type::ns_t_aaaa, "2001:db8::42"},
677 };
678 StartDns(dns, records);
679 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
680
681 addrinfo hints = {.ai_family = AF_INET};
682 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
683 EXPECT_TRUE(result != nullptr);
684 EXPECT_EQ("1.2.3.3", ToString(result));
685
686 dns.clearQueries();
687 hints = {.ai_family = AF_INET6};
688 result = safe_getaddrinfo("hello", nullptr, &hints);
689 EXPECT_TRUE(result != nullptr);
690 EXPECT_EQ("2001:db8::42", ToString(result));
691}
692
693TEST_F(ResolverTest, GetAddrInfo_cnamesNoIpAddress) {
694 test::DNSResponder dns;
695 const std::vector<DnsRecord> records = {
696 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
697 };
698 StartDns(dns, records);
699 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
700
701 addrinfo hints = {.ai_family = AF_INET};
702 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
703 EXPECT_TRUE(result == nullptr);
704
705 dns.clearQueries();
706 hints = {.ai_family = AF_INET6};
707 result = safe_getaddrinfo("hello", nullptr, &hints);
708 EXPECT_TRUE(result == nullptr);
709}
710
711TEST_F(ResolverTest, GetAddrInfo_cnamesIllegalRdata) {
712 test::DNSResponder dns;
713 const std::vector<DnsRecord> records = {
714 {kHelloExampleCom, ns_type::ns_t_cname, ".!#?"},
715 };
716 StartDns(dns, records);
717 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
718
719 addrinfo hints = {.ai_family = AF_INET};
720 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
721 EXPECT_TRUE(result == nullptr);
722
723 dns.clearQueries();
724 hints = {.ai_family = AF_INET6};
725 result = safe_getaddrinfo("hello", nullptr, &hints);
726 EXPECT_TRUE(result == nullptr);
727}
728
Ken Chenb9fa2062018-11-13 21:51:13 +0800729TEST_F(ResolverTest, MultidomainResolution) {
Xiao Ma09b71022018-12-11 17:56:32 +0900730 constexpr char host_name[] = "nihao.example2.com.";
Luke Huangf8215372019-11-22 11:53:41 +0800731 std::vector<std::string> searchDomains = {"example1.com", "example2.com", "example3.com"};
Ken Chenb9fa2062018-11-13 21:51:13 +0800732
Xiao Ma09b71022018-12-11 17:56:32 +0900733 test::DNSResponder dns("127.0.0.6");
734 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.3"}});
735 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({"127.0.0.6"}, searchDomains));
736
Ken Chenb9fa2062018-11-13 21:51:13 +0800737 const hostent* result = gethostbyname("nihao");
Xiao Ma09b71022018-12-11 17:56:32 +0900738
Ken Chenb9fa2062018-11-13 21:51:13 +0800739 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
740 ASSERT_FALSE(result == nullptr);
741 ASSERT_EQ(4, result->h_length);
742 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
743 EXPECT_EQ("1.2.3.3", ToString(result));
744 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800745}
746
747TEST_F(ResolverTest, GetAddrInfoV6_numeric) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800748 constexpr char host_name[] = "ohayou.example.com.";
749 constexpr char numeric_addr[] = "fe80::1%lo";
750
Xiao Ma09b71022018-12-11 17:56:32 +0900751 test::DNSResponder dns;
Ken Chenb9fa2062018-11-13 21:51:13 +0800752 dns.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900753 StartDns(dns, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
754 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800755
756 addrinfo hints = {.ai_family = AF_INET6};
757 ScopedAddrinfo result = safe_getaddrinfo(numeric_addr, nullptr, &hints);
758 EXPECT_TRUE(result != nullptr);
759 EXPECT_EQ(numeric_addr, ToString(result));
760 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
761
762 // Now try a non-numeric hostname query with the AI_NUMERICHOST flag set.
763 // We should fail without sending out a DNS query.
764 hints.ai_flags |= AI_NUMERICHOST;
765 result = safe_getaddrinfo(host_name, nullptr, &hints);
766 EXPECT_TRUE(result == nullptr);
767 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
768}
769
770TEST_F(ResolverTest, GetAddrInfoV6_failing) {
Xiao Ma09b71022018-12-11 17:56:32 +0900771 constexpr char listen_addr0[] = "127.0.0.7";
772 constexpr char listen_addr1[] = "127.0.0.8";
Ken Chenb9fa2062018-11-13 21:51:13 +0800773 const char* host_name = "ohayou.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +0900774
775 test::DNSResponder dns0(listen_addr0);
776 test::DNSResponder dns1(listen_addr1);
Ken Chenb9fa2062018-11-13 21:51:13 +0800777 dns0.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900778 StartDns(dns0, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
779 StartDns(dns1, {{host_name, ns_type::ns_t_aaaa, "2001:db8::6"}});
780
Luke Huangf8215372019-11-22 11:53:41 +0800781 std::vector<std::string> servers = {listen_addr0, listen_addr1};
Ken Chenb9fa2062018-11-13 21:51:13 +0800782 // <sample validity in s> <success threshold in percent> <min samples> <max samples>
783 int sample_count = 8;
Luke Huangf8215372019-11-22 11:53:41 +0800784 const std::vector<int> params = {300, 25, sample_count, sample_count};
Xiao Ma09b71022018-12-11 17:56:32 +0900785 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, kDefaultSearchDomains, params));
Ken Chenb9fa2062018-11-13 21:51:13 +0800786
787 // Repeatedly perform resolutions for non-existing domains until MAXNSSAMPLES resolutions have
788 // reached the dns0, which is set to fail. No more requests should then arrive at that server
789 // for the next sample_lifetime seconds.
790 // TODO: This approach is implementation-dependent, change once metrics reporting is available.
Xiao Ma09b71022018-12-11 17:56:32 +0900791 const addrinfo hints = {.ai_family = AF_INET6};
Bernie Innocentib102dd22018-12-04 14:57:48 +0900792 for (int i = 0; i < sample_count; ++i) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800793 std::string domain = StringPrintf("nonexistent%d", i);
794 ScopedAddrinfo result = safe_getaddrinfo(domain.c_str(), nullptr, &hints);
795 }
796 // Due to 100% errors for all possible samples, the server should be ignored from now on and
797 // only the second one used for all following queries, until NSSAMPLE_VALIDITY is reached.
798 dns0.clearQueries();
799 dns1.clearQueries();
800 ScopedAddrinfo result = safe_getaddrinfo("ohayou", nullptr, &hints);
801 EXPECT_TRUE(result != nullptr);
802 EXPECT_EQ(0U, GetNumQueries(dns0, host_name));
803 EXPECT_EQ(1U, GetNumQueries(dns1, host_name));
804}
805
806TEST_F(ResolverTest, GetAddrInfoV6_nonresponsive) {
Xiao Ma09b71022018-12-11 17:56:32 +0900807 constexpr char listen_addr0[] = "127.0.0.7";
808 constexpr char listen_addr1[] = "127.0.0.8";
809 constexpr char listen_srv[] = "53";
810 constexpr char host_name1[] = "ohayou.example.com.";
811 constexpr char host_name2[] = "ciao.example.com.";
Luke Huang483cf332019-06-03 17:24:51 +0800812 const std::vector<std::string> defaultSearchDomain = {"example.com"};
813 // The minimal timeout is 1000ms, so we can't decrease timeout
814 // So reduce retry count.
815 const std::vector<int> reduceRetryParams = {
816 300, // sample validity in seconds
817 25, // success threshod in percent
818 8, 8, // {MIN,MAX}_SAMPLES
819 1000, // BASE_TIMEOUT_MSEC
820 1, // retry count
821 };
Xiao Ma09b71022018-12-11 17:56:32 +0900822 const std::vector<DnsRecord> records0 = {
823 {host_name1, ns_type::ns_t_aaaa, "2001:db8::5"},
824 {host_name2, ns_type::ns_t_aaaa, "2001:db8::5"},
825 };
826 const std::vector<DnsRecord> records1 = {
827 {host_name1, ns_type::ns_t_aaaa, "2001:db8::6"},
828 {host_name2, ns_type::ns_t_aaaa, "2001:db8::6"},
829 };
Ken Chenb9fa2062018-11-13 21:51:13 +0800830
831 // dns0 does not respond with 100% probability, while
832 // dns1 responds normally, at least initially.
Mike Yufc125e42019-05-15 20:41:28 +0800833 test::DNSResponder dns0(listen_addr0, listen_srv, static_cast<ns_rcode>(-1));
834 test::DNSResponder dns1(listen_addr1, listen_srv, static_cast<ns_rcode>(-1));
Ken Chenb9fa2062018-11-13 21:51:13 +0800835 dns0.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900836 StartDns(dns0, records0);
837 StartDns(dns1, records1);
Luke Huang483cf332019-06-03 17:24:51 +0800838 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr0, listen_addr1}, defaultSearchDomain,
839 reduceRetryParams));
Ken Chenb9fa2062018-11-13 21:51:13 +0800840
Luke Huang483cf332019-06-03 17:24:51 +0800841 // Specify ai_socktype to make getaddrinfo will only query 1 time
842 const addrinfo hints = {.ai_family = AF_INET6, .ai_socktype = SOCK_STREAM};
Ken Chenb9fa2062018-11-13 21:51:13 +0800843
844 // dns0 will ignore the request, and we'll fallback to dns1 after the first
845 // retry.
846 ScopedAddrinfo result = safe_getaddrinfo(host_name1, nullptr, &hints);
847 EXPECT_TRUE(result != nullptr);
848 EXPECT_EQ(1U, GetNumQueries(dns0, host_name1));
849 EXPECT_EQ(1U, GetNumQueries(dns1, host_name1));
850
851 // Now make dns1 also ignore 100% requests... The resolve should alternate
Luke Huang483cf332019-06-03 17:24:51 +0800852 // queries between the nameservers and fail
Ken Chenb9fa2062018-11-13 21:51:13 +0800853 dns1.setResponseProbability(0.0);
854 addrinfo* result2 = nullptr;
855 EXPECT_EQ(EAI_NODATA, getaddrinfo(host_name2, nullptr, &hints, &result2));
856 EXPECT_EQ(nullptr, result2);
Luke Huang483cf332019-06-03 17:24:51 +0800857 EXPECT_EQ(1U, GetNumQueries(dns0, host_name2));
858 EXPECT_EQ(1U, GetNumQueries(dns1, host_name2));
Ken Chenb9fa2062018-11-13 21:51:13 +0800859}
860
861TEST_F(ResolverTest, GetAddrInfoV6_concurrent) {
Xiao Ma09b71022018-12-11 17:56:32 +0900862 constexpr char listen_addr0[] = "127.0.0.9";
863 constexpr char listen_addr1[] = "127.0.0.10";
864 constexpr char listen_addr2[] = "127.0.0.11";
865 constexpr char host_name[] = "konbanha.example.com.";
866
867 test::DNSResponder dns0(listen_addr0);
868 test::DNSResponder dns1(listen_addr1);
869 test::DNSResponder dns2(listen_addr2);
870 StartDns(dns0, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
871 StartDns(dns1, {{host_name, ns_type::ns_t_aaaa, "2001:db8::6"}});
872 StartDns(dns2, {{host_name, ns_type::ns_t_aaaa, "2001:db8::7"}});
873
Luke Huangf8215372019-11-22 11:53:41 +0800874 const std::vector<std::string> servers = {listen_addr0, listen_addr1, listen_addr2};
Ken Chenb9fa2062018-11-13 21:51:13 +0800875 std::vector<std::thread> threads(10);
876 for (std::thread& thread : threads) {
Luke Huangf8215372019-11-22 11:53:41 +0800877 thread = std::thread([this, &servers]() {
878 unsigned delay = arc4random_uniform(1 * 1000 * 1000); // <= 1s
Ken Chenb9fa2062018-11-13 21:51:13 +0800879 usleep(delay);
880 std::vector<std::string> serverSubset;
881 for (const auto& server : servers) {
882 if (arc4random_uniform(2)) {
883 serverSubset.push_back(server);
884 }
885 }
886 if (serverSubset.empty()) serverSubset = servers;
Xiao Ma09b71022018-12-11 17:56:32 +0900887 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(serverSubset));
888 const addrinfo hints = {.ai_family = AF_INET6};
Ken Chenb9fa2062018-11-13 21:51:13 +0800889 addrinfo* result = nullptr;
890 int rv = getaddrinfo("konbanha", nullptr, &hints, &result);
891 EXPECT_EQ(0, rv) << "error [" << rv << "] " << gai_strerror(rv);
892 if (result) {
893 freeaddrinfo(result);
894 result = nullptr;
895 }
896 });
897 }
898 for (std::thread& thread : threads) {
899 thread.join();
900 }
Ken Chen92bed612018-12-22 21:46:55 +0800901
902 std::vector<std::string> res_servers;
903 std::vector<std::string> res_domains;
904 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +0900905 res_params res_params;
Ken Chen92bed612018-12-22 21:46:55 +0800906 std::vector<ResolverStats> res_stats;
907 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +0800908 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
909 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
910 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chen92bed612018-12-22 21:46:55 +0800911 EXPECT_EQ(0, wait_for_pending_req_timeout_count);
Ken Chenb9fa2062018-11-13 21:51:13 +0800912}
913
Mike Yu8ac63402019-12-02 15:28:38 +0800914TEST_F(ResolverTest, SkipBadServersDueToInternalError) {
915 constexpr char listen_addr1[] = "fe80::1";
916 constexpr char listen_addr2[] = "255.255.255.255";
917 constexpr char listen_addr3[] = "127.0.0.3";
918
919 test::DNSResponder dns(listen_addr3);
920 ASSERT_TRUE(dns.startServer());
921
922 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
923 parcel.servers = {listen_addr1, listen_addr2, listen_addr3};
924
925 // Bad servers can be distinguished after two attempts.
926 parcel.minSamples = 2;
927 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
928
929 // Start querying five times.
930 for (int i = 0; i < 5; i++) {
931 std::string hostName = StringPrintf("hello%d.com.", i);
932 dns.addMapping(hostName, ns_type::ns_t_a, "1.2.3.4");
933 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
934 EXPECT_TRUE(safe_getaddrinfo(hostName.c_str(), nullptr, &hints) != nullptr);
935 }
936
937 std::vector<std::string> res_servers;
938 std::vector<std::string> res_domains;
939 std::vector<std::string> res_tls_servers;
940 res_params res_params;
941 std::vector<ResolverStats> res_stats;
942 int wait_for_pending_req_timeout_count;
943 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
944 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
945 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
946
947 // Verify the result by means of the statistics.
948 EXPECT_EQ(res_stats[0].successes, 0);
949 EXPECT_EQ(res_stats[1].successes, 0);
950 EXPECT_EQ(res_stats[2].successes, 5);
951 EXPECT_EQ(res_stats[0].internal_errors, 2);
952 EXPECT_EQ(res_stats[1].internal_errors, 2);
953 EXPECT_EQ(res_stats[2].internal_errors, 0);
954}
955
956TEST_F(ResolverTest, SkipBadServersDueToTimeout) {
957 constexpr char listen_addr1[] = "127.0.0.3";
958 constexpr char listen_addr2[] = "127.0.0.4";
959
960 // Set dns1 non-responsive and dns2 workable.
961 test::DNSResponder dns1(listen_addr1, test::kDefaultListenService, static_cast<ns_rcode>(-1));
962 test::DNSResponder dns2(listen_addr2);
963 dns1.setResponseProbability(0.0);
964 ASSERT_TRUE(dns1.startServer());
965 ASSERT_TRUE(dns2.startServer());
966
967 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
968 parcel.servers = {listen_addr1, listen_addr2};
969
970 // Bad servers can be distinguished after two attempts.
971 parcel.minSamples = 2;
972 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
973
974 // Start querying five times.
975 for (int i = 0; i < 5; i++) {
976 std::string hostName = StringPrintf("hello%d.com.", i);
977 dns1.addMapping(hostName, ns_type::ns_t_a, "1.2.3.4");
978 dns2.addMapping(hostName, ns_type::ns_t_a, "1.2.3.5");
979 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
980 EXPECT_TRUE(safe_getaddrinfo(hostName.c_str(), nullptr, &hints) != nullptr);
981 }
982
983 std::vector<std::string> res_servers;
984 std::vector<std::string> res_domains;
985 std::vector<std::string> res_tls_servers;
986 res_params res_params;
987 std::vector<ResolverStats> res_stats;
988 int wait_for_pending_req_timeout_count;
989 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
990 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
991 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
992
993 // Verify the result by means of the statistics as well as the query counts.
994 EXPECT_EQ(res_stats[0].successes, 0);
995 EXPECT_EQ(res_stats[1].successes, 5);
996 EXPECT_EQ(res_stats[0].timeouts, 2);
997 EXPECT_EQ(res_stats[1].timeouts, 0);
998 EXPECT_EQ(dns1.queries().size(), 2U);
999 EXPECT_EQ(dns2.queries().size(), 5U);
1000}
1001
chenbrucefd837fa2019-10-29 18:35:36 +08001002TEST_F(ResolverTest, GetAddrInfoFromCustTable_InvalidInput) {
1003 constexpr char hostnameNoip[] = "noip.example.com.";
1004 constexpr char hostnameInvalidip[] = "invalidip.example.com.";
1005 const std::vector<aidl::android::net::ResolverHostsParcel> invalidCustHosts = {
1006 {"", hostnameNoip},
1007 {"wrong IP", hostnameInvalidip},
1008 };
1009 test::DNSResponder dns;
1010 StartDns(dns, {});
1011 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1012 resolverParams.hosts = invalidCustHosts;
1013 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1014 for (const auto& hostname : {hostnameNoip, hostnameInvalidip}) {
1015 // The query won't get data from customized table because of invalid customized table
1016 // and DNSResponder also has no records. hostnameNoip has never registered and
1017 // hostnameInvalidip has registered but wrong IP.
1018 const addrinfo hints = {.ai_family = AF_UNSPEC};
1019 ScopedAddrinfo result = safe_getaddrinfo(hostname, nullptr, &hints);
1020 ASSERT_TRUE(result == nullptr);
1021 EXPECT_EQ(4U, GetNumQueries(dns, hostname));
1022 }
1023}
1024
1025TEST_F(ResolverTest, GetAddrInfoFromCustTable) {
1026 constexpr char hostnameV4[] = "v4only.example.com.";
1027 constexpr char hostnameV6[] = "v6only.example.com.";
1028 constexpr char hostnameV4V6[] = "v4v6.example.com.";
1029 constexpr char custAddrV4[] = "1.2.3.4";
1030 constexpr char custAddrV6[] = "::1.2.3.4";
1031 constexpr char dnsSvAddrV4[] = "1.2.3.5";
1032 constexpr char dnsSvAddrV6[] = "::1.2.3.5";
1033 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4 = {
1034 {custAddrV4, hostnameV4},
1035 };
1036 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV6 = {
1037 {custAddrV6, hostnameV6},
1038 };
1039 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4V6 = {
1040 {custAddrV4, hostnameV4V6},
1041 {custAddrV6, hostnameV4V6},
1042 };
1043 const std::vector<DnsRecord> dnsSvHostV4 = {
1044 {hostnameV4, ns_type::ns_t_a, dnsSvAddrV4},
1045 };
1046 const std::vector<DnsRecord> dnsSvHostV6 = {
1047 {hostnameV6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1048 };
1049 const std::vector<DnsRecord> dnsSvHostV4V6 = {
1050 {hostnameV4V6, ns_type::ns_t_a, dnsSvAddrV4},
1051 {hostnameV4V6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1052 };
1053 struct TestConfig {
1054 const std::string name;
1055 const std::vector<aidl::android::net::ResolverHostsParcel> customizedHosts;
1056 const std::vector<DnsRecord> dnsserverHosts;
1057 const std::vector<std::string> queryResult;
1058 std::string asParameters() const {
1059 return StringPrintf("name: %s, customizedHosts: %s, dnsserverHosts: %s", name.c_str(),
1060 customizedHosts.empty() ? "No" : "Yes",
1061 dnsserverHosts.empty() ? "No" : "Yes");
1062 }
1063 } testConfigs[]{
1064 // clang-format off
1065 {hostnameV4, {}, {}, {}},
1066 {hostnameV4, {}, dnsSvHostV4, {dnsSvAddrV4}},
1067 {hostnameV4, custHostV4, {}, {custAddrV4}},
1068 {hostnameV4, custHostV4, dnsSvHostV4, {custAddrV4}},
1069 {hostnameV6, {}, {}, {}},
1070 {hostnameV6, {}, dnsSvHostV6, {dnsSvAddrV6}},
1071 {hostnameV6, custHostV6, {}, {custAddrV6}},
1072 {hostnameV6, custHostV6, dnsSvHostV6, {custAddrV6}},
1073 {hostnameV4V6, {}, {}, {}},
1074 {hostnameV4V6, {}, dnsSvHostV4V6, {dnsSvAddrV4, dnsSvAddrV6}},
1075 {hostnameV4V6, custHostV4V6, {}, {custAddrV4, custAddrV6}},
1076 {hostnameV4V6, custHostV4V6, dnsSvHostV4V6, {custAddrV4, custAddrV6}},
1077 // clang-format on
1078 };
1079
1080 for (const auto& config : testConfigs) {
1081 SCOPED_TRACE(config.asParameters());
1082
1083 test::DNSResponder dns;
1084 StartDns(dns, config.dnsserverHosts);
1085
1086 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1087 resolverParams.hosts = config.customizedHosts;
1088 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1089 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM};
1090 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
1091 if (config.customizedHosts.empty() && config.dnsserverHosts.empty()) {
1092 ASSERT_TRUE(result == nullptr);
1093 EXPECT_EQ(2U, GetNumQueries(dns, config.name.c_str()));
1094 } else {
1095 ASSERT_TRUE(result != nullptr);
1096 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(config.queryResult));
1097 EXPECT_EQ(config.customizedHosts.empty() ? 2U : 0U,
1098 GetNumQueries(dns, config.name.c_str()));
1099 }
1100
1101 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
1102 }
1103}
1104
1105TEST_F(ResolverTest, GetAddrInfoFromCustTable_Modify) {
1106 constexpr char hostnameV4V6[] = "v4v6.example.com.";
1107 constexpr char custAddrV4[] = "1.2.3.4";
1108 constexpr char custAddrV6[] = "::1.2.3.4";
1109 constexpr char dnsSvAddrV4[] = "1.2.3.5";
1110 constexpr char dnsSvAddrV6[] = "::1.2.3.5";
1111 const std::vector<DnsRecord> dnsSvHostV4V6 = {
1112 {hostnameV4V6, ns_type::ns_t_a, dnsSvAddrV4},
1113 {hostnameV4V6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1114 };
1115 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4V6 = {
1116 {custAddrV4, hostnameV4V6},
1117 {custAddrV6, hostnameV4V6},
1118 };
1119 test::DNSResponder dns;
1120 StartDns(dns, dnsSvHostV4V6);
1121 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1122
1123 resolverParams.hosts = custHostV4V6;
1124 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1125 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM};
1126 ScopedAddrinfo result = safe_getaddrinfo(hostnameV4V6, nullptr, &hints);
1127 ASSERT_TRUE(result != nullptr);
1128 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray({custAddrV4, custAddrV6}));
1129 EXPECT_EQ(0U, GetNumQueries(dns, hostnameV4V6));
1130
1131 resolverParams.hosts = {};
1132 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1133 result = safe_getaddrinfo(hostnameV4V6, nullptr, &hints);
1134 ASSERT_TRUE(result != nullptr);
1135 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray({dnsSvAddrV4, dnsSvAddrV6}));
1136 EXPECT_EQ(2U, GetNumQueries(dns, hostnameV4V6));
1137}
1138
Ken Chenb9fa2062018-11-13 21:51:13 +08001139TEST_F(ResolverTest, EmptySetup) {
Ken Chenb9fa2062018-11-13 21:51:13 +08001140 std::vector<std::string> servers;
1141 std::vector<std::string> domains;
Xiao Ma09b71022018-12-11 17:56:32 +09001142 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001143 std::vector<std::string> res_servers;
1144 std::vector<std::string> res_domains;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001145 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001146 res_params res_params;
Ken Chenb9fa2062018-11-13 21:51:13 +08001147 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +08001148 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001149 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1150 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1151 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chenb9fa2062018-11-13 21:51:13 +08001152 EXPECT_EQ(0U, res_servers.size());
1153 EXPECT_EQ(0U, res_domains.size());
Mike Yu0a1c53d2018-11-26 13:26:21 +09001154 EXPECT_EQ(0U, res_tls_servers.size());
Luke Huang5bd827c2019-03-14 16:10:04 +08001155 ASSERT_EQ(static_cast<size_t>(IDnsResolver::RESOLVER_PARAMS_COUNT), kDefaultParams.size());
1156 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY],
1157 res_params.sample_validity);
1158 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001159 res_params.success_threshold);
Luke Huang5bd827c2019-03-14 16:10:04 +08001160 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
1161 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
1162 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
Ken Chenb9fa2062018-11-13 21:51:13 +08001163 res_params.base_timeout_msec);
Luke Huang5bd827c2019-03-14 16:10:04 +08001164 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_RETRY_COUNT], res_params.retry_count);
Ken Chenb9fa2062018-11-13 21:51:13 +08001165}
1166
1167TEST_F(ResolverTest, SearchPathChange) {
Xiao Ma09b71022018-12-11 17:56:32 +09001168 constexpr char listen_addr[] = "127.0.0.13";
1169 constexpr char host_name1[] = "test13.domain1.org.";
1170 constexpr char host_name2[] = "test13.domain2.org.";
Luke Huangf8215372019-11-22 11:53:41 +08001171 std::vector<std::string> servers = {listen_addr};
1172 std::vector<std::string> domains = {"domain1.org"};
Xiao Ma09b71022018-12-11 17:56:32 +09001173
1174 const std::vector<DnsRecord> records = {
1175 {host_name1, ns_type::ns_t_aaaa, "2001:db8::13"},
1176 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1:13"},
1177 };
1178 test::DNSResponder dns(listen_addr);
1179 StartDns(dns, records);
1180 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001181
1182 const addrinfo hints = {.ai_family = AF_INET6};
1183 ScopedAddrinfo result = safe_getaddrinfo("test13", nullptr, &hints);
1184 EXPECT_TRUE(result != nullptr);
1185 EXPECT_EQ(1U, dns.queries().size());
1186 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
1187 EXPECT_EQ("2001:db8::13", ToString(result));
1188
1189 // Test that changing the domain search path on its own works.
Luke Huangf8215372019-11-22 11:53:41 +08001190 domains = {"domain2.org"};
Xiao Ma09b71022018-12-11 17:56:32 +09001191 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001192 dns.clearQueries();
1193
1194 result = safe_getaddrinfo("test13", nullptr, &hints);
1195 EXPECT_TRUE(result != nullptr);
1196 EXPECT_EQ(1U, dns.queries().size());
1197 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
1198 EXPECT_EQ("2001:db8::1:13", ToString(result));
1199}
1200
Luke Huang2dac4382019-06-24 13:28:44 +08001201namespace {
1202
Luke Huangf8215372019-11-22 11:53:41 +08001203std::vector<std::string> getResolverDomains(aidl::android::net::IDnsResolver* dnsResolverService,
Luke Huang2dac4382019-06-24 13:28:44 +08001204 unsigned netId) {
1205 std::vector<std::string> res_servers;
1206 std::vector<std::string> res_domains;
1207 std::vector<std::string> res_tls_servers;
1208 res_params res_params;
1209 std::vector<ResolverStats> res_stats;
1210 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001211 DnsResponderClient::GetResolverInfo(dnsResolverService, netId, &res_servers, &res_domains,
1212 &res_tls_servers, &res_params, &res_stats,
1213 &wait_for_pending_req_timeout_count);
Luke Huang2dac4382019-06-24 13:28:44 +08001214 return res_domains;
1215}
1216
1217} // namespace
1218
1219TEST_F(ResolverTest, SearchPathPrune) {
1220 constexpr size_t DUPLICATED_DOMAIN_NUM = 3;
1221 constexpr char listen_addr[] = "127.0.0.13";
1222 constexpr char domian_name1[] = "domain13.org.";
1223 constexpr char domian_name2[] = "domain14.org.";
1224 constexpr char host_name1[] = "test13.domain13.org.";
1225 constexpr char host_name2[] = "test14.domain14.org.";
1226 std::vector<std::string> servers = {listen_addr};
1227
1228 std::vector<std::string> testDomains1;
1229 std::vector<std::string> testDomains2;
1230 // Domain length should be <= 255
1231 // Max number of domains in search path is 6
1232 for (size_t i = 0; i < MAXDNSRCH + 1; i++) {
1233 // Fill up with invalid domain
1234 testDomains1.push_back(std::string(300, i + '0'));
1235 // Fill up with valid but duplicated domain
1236 testDomains2.push_back(StringPrintf("domain%zu.org", i % DUPLICATED_DOMAIN_NUM));
1237 }
1238
1239 // Add valid domain used for query.
1240 testDomains1.push_back(domian_name1);
1241
1242 // Add valid domain twice used for query.
1243 testDomains2.push_back(domian_name2);
1244 testDomains2.push_back(domian_name2);
1245
1246 const std::vector<DnsRecord> records = {
1247 {host_name1, ns_type::ns_t_aaaa, "2001:db8::13"},
1248 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1:13"},
1249 };
1250 test::DNSResponder dns(listen_addr);
1251 StartDns(dns, records);
1252 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, testDomains1));
1253
1254 const addrinfo hints = {.ai_family = AF_INET6};
1255 ScopedAddrinfo result = safe_getaddrinfo("test13", nullptr, &hints);
1256
1257 EXPECT_TRUE(result != nullptr);
1258
1259 EXPECT_EQ(1U, dns.queries().size());
1260 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
1261 EXPECT_EQ("2001:db8::13", ToString(result));
1262
1263 const auto& res_domains1 = getResolverDomains(mDnsClient.resolvService(), TEST_NETID);
1264 // Expect 1 valid domain, invalid domains are removed.
1265 ASSERT_EQ(1U, res_domains1.size());
1266 EXPECT_EQ(domian_name1, res_domains1[0]);
1267
1268 dns.clearQueries();
1269
1270 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, testDomains2));
1271
1272 result = safe_getaddrinfo("test14", nullptr, &hints);
1273 EXPECT_TRUE(result != nullptr);
1274
1275 // (3 domains * 2 retries) + 1 success query = 7
1276 EXPECT_EQ(7U, dns.queries().size());
1277 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
1278 EXPECT_EQ("2001:db8::1:13", ToString(result));
1279
1280 const auto& res_domains2 = getResolverDomains(mDnsClient.resolvService(), TEST_NETID);
1281 // Expect 4 valid domain, duplicate domains are removed.
1282 EXPECT_EQ(DUPLICATED_DOMAIN_NUM + 1U, res_domains2.size());
1283 EXPECT_THAT(
1284 std::vector<std::string>({"domain0.org", "domain1.org", "domain2.org", domian_name2}),
1285 testing::ElementsAreArray(res_domains2));
1286}
1287
Mike Yu0a1c53d2018-11-26 13:26:21 +09001288// If we move this function to dns_responder_client, it will complicate the dependency need of
1289// dns_tls_frontend.h.
1290static void setupTlsServers(const std::vector<std::string>& servers,
waynema0e73c2e2019-07-31 15:04:08 +08001291 std::vector<std::unique_ptr<test::DnsTlsFrontend>>* tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001292 constexpr char listen_udp[] = "53";
1293 constexpr char listen_tls[] = "853";
Mike Yu0a1c53d2018-11-26 13:26:21 +09001294
1295 for (const auto& server : servers) {
1296 auto t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
1297 t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
1298 t->startServer();
Mike Yu0a1c53d2018-11-26 13:26:21 +09001299 tls->push_back(std::move(t));
1300 }
1301}
1302
Mike Yu0a1c53d2018-11-26 13:26:21 +09001303TEST_F(ResolverTest, MaxServerPrune_Binder) {
Mike Yu0a1c53d2018-11-26 13:26:21 +09001304 std::vector<std::string> domains;
1305 std::vector<std::unique_ptr<test::DNSResponder>> dns;
1306 std::vector<std::unique_ptr<test::DnsTlsFrontend>> tls;
1307 std::vector<std::string> servers;
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001308 std::vector<DnsResponderClient::Mapping> mappings;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001309
1310 for (unsigned i = 0; i < MAXDNSRCH + 1; i++) {
1311 domains.push_back(StringPrintf("example%u.com", i));
1312 }
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001313 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupMappings(1, domains, &mappings));
1314 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupDNSServers(MAXNS + 1, mappings, &dns, &servers));
waynema0e73c2e2019-07-31 15:04:08 +08001315 ASSERT_NO_FATAL_FAILURE(setupTlsServers(servers, &tls));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001316
waynema0e73c2e2019-07-31 15:04:08 +08001317 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, domains, kDefaultParams,
1318 kDefaultPrivateDnsHostName));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001319
Mike Yu383855b2019-01-15 17:53:27 +08001320 // If the private DNS validation hasn't completed yet before backend DNS servers stop,
1321 // TLS servers will get stuck in handleOneRequest(), which causes this test stuck in
1322 // ~DnsTlsFrontend() because the TLS server loop threads can't be terminated.
1323 // So, wait for private DNS validation done before stopping backend DNS servers.
1324 for (int i = 0; i < MAXNS; i++) {
chenbruceaff85842019-05-31 15:46:42 +08001325 LOG(INFO) << "Waiting for private DNS validation on " << tls[i]->listen_address() << ".";
Mike Yu724f77d2019-08-16 11:14:50 +08001326 EXPECT_TRUE(WaitForPrivateDnsValidation(tls[i]->listen_address(), true));
chenbruceaff85842019-05-31 15:46:42 +08001327 LOG(INFO) << "private DNS validation on " << tls[i]->listen_address() << " done.";
Mike Yu383855b2019-01-15 17:53:27 +08001328 }
1329
Mike Yu0a1c53d2018-11-26 13:26:21 +09001330 std::vector<std::string> res_servers;
1331 std::vector<std::string> res_domains;
1332 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001333 res_params res_params;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001334 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +08001335 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001336 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1337 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1338 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001339
1340 // Check the size of the stats and its contents.
1341 EXPECT_EQ(static_cast<size_t>(MAXNS), res_servers.size());
1342 EXPECT_EQ(static_cast<size_t>(MAXNS), res_tls_servers.size());
1343 EXPECT_EQ(static_cast<size_t>(MAXDNSRCH), res_domains.size());
1344 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_servers.begin()));
1345 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_tls_servers.begin()));
1346 EXPECT_TRUE(std::equal(domains.begin(), domains.begin() + MAXDNSRCH, res_domains.begin()));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001347}
1348
1349TEST_F(ResolverTest, ResolverStats) {
Xiao Ma09b71022018-12-11 17:56:32 +09001350 constexpr char listen_addr1[] = "127.0.0.4";
1351 constexpr char listen_addr2[] = "127.0.0.5";
1352 constexpr char listen_addr3[] = "127.0.0.6";
Mike Yu0a1c53d2018-11-26 13:26:21 +09001353
1354 // Set server 1 timeout.
Mike Yufc125e42019-05-15 20:41:28 +08001355 test::DNSResponder dns1(listen_addr1, "53", static_cast<ns_rcode>(-1));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001356 dns1.setResponseProbability(0.0);
1357 ASSERT_TRUE(dns1.startServer());
1358
1359 // Set server 2 responding server failure.
Xiao Ma09b71022018-12-11 17:56:32 +09001360 test::DNSResponder dns2(listen_addr2);
Mike Yu0a1c53d2018-11-26 13:26:21 +09001361 dns2.setResponseProbability(0.0);
1362 ASSERT_TRUE(dns2.startServer());
1363
1364 // Set server 3 workable.
Xiao Ma09b71022018-12-11 17:56:32 +09001365 test::DNSResponder dns3(listen_addr3);
1366 dns3.addMapping(kHelloExampleCom, ns_type::ns_t_a, "1.2.3.4");
Mike Yu0a1c53d2018-11-26 13:26:21 +09001367 ASSERT_TRUE(dns3.startServer());
1368
1369 std::vector<std::string> servers = {listen_addr1, listen_addr2, listen_addr3};
Xiao Ma09b71022018-12-11 17:56:32 +09001370 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001371
1372 dns3.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +09001373 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
Mike Yu0a1c53d2018-11-26 13:26:21 +09001374 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
Xiao Ma09b71022018-12-11 17:56:32 +09001375 size_t found = GetNumQueries(dns3, kHelloExampleCom);
Mike Yu0a1c53d2018-11-26 13:26:21 +09001376 EXPECT_LE(1U, found);
1377 std::string result_str = ToString(result);
1378 EXPECT_TRUE(result_str == "1.2.3.4") << ", result_str='" << result_str << "'";
1379
1380 std::vector<std::string> res_servers;
1381 std::vector<std::string> res_domains;
1382 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001383 res_params res_params;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001384 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +08001385 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001386 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1387 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1388 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001389
1390 EXPECT_EQ(1, res_stats[0].timeouts);
1391 EXPECT_EQ(1, res_stats[1].errors);
1392 EXPECT_EQ(1, res_stats[2].successes);
Mike Yu0a1c53d2018-11-26 13:26:21 +09001393}
1394
Ken Chenb9fa2062018-11-13 21:51:13 +08001395// Test what happens if the specified TLS server is nonexistent.
1396TEST_F(ResolverTest, GetHostByName_TlsMissing) {
Xiao Ma09b71022018-12-11 17:56:32 +09001397 constexpr char listen_addr[] = "127.0.0.3";
1398 constexpr char host_name[] = "tlsmissing.example.com.";
1399
1400 test::DNSResponder dns;
1401 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.3"}});
Luke Huangf8215372019-11-22 11:53:41 +08001402 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001403
1404 // There's nothing listening on this address, so validation will either fail or
1405 /// hang. Either way, queries will continue to flow to the DNSResponder.
waynema0e73c2e2019-07-31 15:04:08 +08001406 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Ken Chenb9fa2062018-11-13 21:51:13 +08001407
1408 const hostent* result;
1409
1410 result = gethostbyname("tlsmissing");
1411 ASSERT_FALSE(result == nullptr);
1412 EXPECT_EQ("1.2.3.3", ToString(result));
1413
1414 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001415 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001416}
1417
1418// Test what happens if the specified TLS server replies with garbage.
1419TEST_F(ResolverTest, GetHostByName_TlsBroken) {
Xiao Ma09b71022018-12-11 17:56:32 +09001420 constexpr char listen_addr[] = "127.0.0.3";
1421 constexpr char host_name1[] = "tlsbroken1.example.com.";
1422 constexpr char host_name2[] = "tlsbroken2.example.com.";
1423 const std::vector<DnsRecord> records = {
1424 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1425 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1426 };
1427
1428 test::DNSResponder dns;
1429 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001430 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001431
1432 // Bind the specified private DNS socket but don't respond to any client sockets yet.
1433 int s = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, IPPROTO_TCP);
1434 ASSERT_TRUE(s >= 0);
1435 struct sockaddr_in tlsServer = {
Luke Huangf8215372019-11-22 11:53:41 +08001436 .sin_family = AF_INET,
1437 .sin_port = htons(853),
Ken Chenb9fa2062018-11-13 21:51:13 +08001438 };
1439 ASSERT_TRUE(inet_pton(AF_INET, listen_addr, &tlsServer.sin_addr));
1440 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEPORT).ok());
1441 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEADDR).ok());
1442 ASSERT_FALSE(bind(s, reinterpret_cast<struct sockaddr*>(&tlsServer), sizeof(tlsServer)));
1443 ASSERT_FALSE(listen(s, 1));
1444
1445 // Trigger TLS validation.
waynema0e73c2e2019-07-31 15:04:08 +08001446 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Ken Chenb9fa2062018-11-13 21:51:13 +08001447
1448 struct sockaddr_storage cliaddr;
1449 socklen_t sin_size = sizeof(cliaddr);
Luke Huangf8215372019-11-22 11:53:41 +08001450 int new_fd = accept4(s, reinterpret_cast<struct sockaddr*>(&cliaddr), &sin_size, SOCK_CLOEXEC);
Ken Chenb9fa2062018-11-13 21:51:13 +08001451 ASSERT_TRUE(new_fd > 0);
1452
1453 // We've received the new file descriptor but not written to it or closed, so the
1454 // validation is still pending. Queries should still flow correctly because the
1455 // server is not used until validation succeeds.
1456 const hostent* result;
1457 result = gethostbyname("tlsbroken1");
1458 ASSERT_FALSE(result == nullptr);
1459 EXPECT_EQ("1.2.3.1", ToString(result));
1460
1461 // Now we cause the validation to fail.
1462 std::string garbage = "definitely not a valid TLS ServerHello";
1463 write(new_fd, garbage.data(), garbage.size());
1464 close(new_fd);
1465
1466 // Validation failure shouldn't interfere with lookups, because lookups won't be sent
1467 // to the TLS server unless validation succeeds.
1468 result = gethostbyname("tlsbroken2");
1469 ASSERT_FALSE(result == nullptr);
1470 EXPECT_EQ("1.2.3.2", ToString(result));
1471
1472 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001473 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001474 close(s);
1475}
1476
1477TEST_F(ResolverTest, GetHostByName_Tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001478 constexpr char listen_addr[] = "127.0.0.3";
1479 constexpr char listen_udp[] = "53";
1480 constexpr char listen_tls[] = "853";
1481 constexpr char host_name1[] = "tls1.example.com.";
1482 constexpr char host_name2[] = "tls2.example.com.";
1483 constexpr char host_name3[] = "tls3.example.com.";
1484 const std::vector<DnsRecord> records = {
1485 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1486 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1487 {host_name3, ns_type::ns_t_a, "1.2.3.3"},
1488 };
1489
1490 test::DNSResponder dns;
1491 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001492 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001493
1494 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1495 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001496 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08001497 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001498
Mike Yu724f77d2019-08-16 11:14:50 +08001499 const hostent* result = gethostbyname("tls1");
Ken Chenb9fa2062018-11-13 21:51:13 +08001500 ASSERT_FALSE(result == nullptr);
1501 EXPECT_EQ("1.2.3.1", ToString(result));
1502
1503 // Wait for query to get counted.
1504 EXPECT_TRUE(tls.waitForQueries(2, 5000));
1505
1506 // Stop the TLS server. Since we're in opportunistic mode, queries will
1507 // fall back to the locally-assigned (clear text) nameservers.
1508 tls.stopServer();
1509
1510 dns.clearQueries();
1511 result = gethostbyname("tls2");
1512 EXPECT_FALSE(result == nullptr);
1513 EXPECT_EQ("1.2.3.2", ToString(result));
1514 const auto queries = dns.queries();
1515 EXPECT_EQ(1U, queries.size());
waynema29253052019-08-20 11:26:08 +08001516 EXPECT_EQ("tls2.example.com.", queries[0].name);
1517 EXPECT_EQ(ns_t_a, queries[0].type);
Ken Chenb9fa2062018-11-13 21:51:13 +08001518
1519 // Reset the resolvers without enabling TLS. Queries should still be routed
1520 // to the UDP endpoint.
Xiao Ma09b71022018-12-11 17:56:32 +09001521 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001522
1523 result = gethostbyname("tls3");
1524 ASSERT_FALSE(result == nullptr);
1525 EXPECT_EQ("1.2.3.3", ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +08001526}
1527
Ken Chenb9fa2062018-11-13 21:51:13 +08001528TEST_F(ResolverTest, GetHostByName_TlsFailover) {
Xiao Ma09b71022018-12-11 17:56:32 +09001529 constexpr char listen_addr1[] = "127.0.0.3";
1530 constexpr char listen_addr2[] = "127.0.0.4";
1531 constexpr char listen_udp[] = "53";
1532 constexpr char listen_tls[] = "853";
1533 constexpr char host_name1[] = "tlsfailover1.example.com.";
1534 constexpr char host_name2[] = "tlsfailover2.example.com.";
1535 const std::vector<DnsRecord> records1 = {
1536 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1537 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1538 };
1539 const std::vector<DnsRecord> records2 = {
1540 {host_name1, ns_type::ns_t_a, "1.2.3.3"},
1541 {host_name2, ns_type::ns_t_a, "1.2.3.4"},
1542 };
1543
1544 test::DNSResponder dns1(listen_addr1);
1545 test::DNSResponder dns2(listen_addr2);
1546 StartDns(dns1, records1);
1547 StartDns(dns2, records2);
1548
Luke Huangf8215372019-11-22 11:53:41 +08001549 std::vector<std::string> servers = {listen_addr1, listen_addr2};
Ken Chenb9fa2062018-11-13 21:51:13 +08001550
1551 test::DnsTlsFrontend tls1(listen_addr1, listen_tls, listen_addr1, listen_udp);
1552 test::DnsTlsFrontend tls2(listen_addr2, listen_tls, listen_addr2, listen_udp);
1553 ASSERT_TRUE(tls1.startServer());
1554 ASSERT_TRUE(tls2.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001555 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1556 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08001557 EXPECT_TRUE(WaitForPrivateDnsValidation(tls1.listen_address(), true));
1558 EXPECT_TRUE(WaitForPrivateDnsValidation(tls2.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001559
Mike Yu724f77d2019-08-16 11:14:50 +08001560 const hostent* result = gethostbyname("tlsfailover1");
Ken Chenb9fa2062018-11-13 21:51:13 +08001561 ASSERT_FALSE(result == nullptr);
1562 EXPECT_EQ("1.2.3.1", ToString(result));
1563
1564 // Wait for query to get counted.
1565 EXPECT_TRUE(tls1.waitForQueries(2, 5000));
1566 // No new queries should have reached tls2.
1567 EXPECT_EQ(1, tls2.queries());
1568
1569 // Stop tls1. Subsequent queries should attempt to reach tls1, fail, and retry to tls2.
1570 tls1.stopServer();
1571
1572 result = gethostbyname("tlsfailover2");
1573 EXPECT_EQ("1.2.3.4", ToString(result));
1574
1575 // Wait for query to get counted.
1576 EXPECT_TRUE(tls2.waitForQueries(2, 5000));
1577
1578 // No additional queries should have reached the insecure servers.
1579 EXPECT_EQ(2U, dns1.queries().size());
1580 EXPECT_EQ(2U, dns2.queries().size());
1581
1582 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001583 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Ken Chenb9fa2062018-11-13 21:51:13 +08001584}
1585
1586TEST_F(ResolverTest, GetHostByName_BadTlsName) {
Xiao Ma09b71022018-12-11 17:56:32 +09001587 constexpr char listen_addr[] = "127.0.0.3";
1588 constexpr char listen_udp[] = "53";
1589 constexpr char listen_tls[] = "853";
1590 constexpr char host_name[] = "badtlsname.example.com.";
1591
1592 test::DNSResponder dns;
1593 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.1"}});
Luke Huangf8215372019-11-22 11:53:41 +08001594 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001595
1596 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1597 ASSERT_TRUE(tls.startServer());
Xiao Ma09b71022018-12-11 17:56:32 +09001598 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
waynema0e73c2e2019-07-31 15:04:08 +08001599 kDefaultIncorrectPrivateDnsHostName));
Ken Chenb9fa2062018-11-13 21:51:13 +08001600
waynema0e73c2e2019-07-31 15:04:08 +08001601 // The TLS handshake would fail because the name of TLS server doesn't
1602 // match with TLS server's certificate.
Mike Yu724f77d2019-08-16 11:14:50 +08001603 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), false));
Ken Chenb9fa2062018-11-13 21:51:13 +08001604
1605 // The query should fail hard, because a name was specified.
1606 EXPECT_EQ(nullptr, gethostbyname("badtlsname"));
1607
1608 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001609 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001610}
1611
1612TEST_F(ResolverTest, GetAddrInfo_Tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001613 constexpr char listen_addr[] = "127.0.0.3";
1614 constexpr char listen_udp[] = "53";
1615 constexpr char listen_tls[] = "853";
1616 constexpr char host_name[] = "addrinfotls.example.com.";
1617 const std::vector<DnsRecord> records = {
1618 {host_name, ns_type::ns_t_a, "1.2.3.4"},
1619 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
1620 };
1621
1622 test::DNSResponder dns;
1623 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001624 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001625
1626 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1627 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001628 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1629 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08001630 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001631
1632 dns.clearQueries();
1633 ScopedAddrinfo result = safe_getaddrinfo("addrinfotls", nullptr, nullptr);
1634 EXPECT_TRUE(result != nullptr);
1635 size_t found = GetNumQueries(dns, host_name);
1636 EXPECT_LE(1U, found);
1637 // Could be A or AAAA
1638 std::string result_str = ToString(result);
1639 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +08001640 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08001641 // Wait for both A and AAAA queries to get counted.
1642 EXPECT_TRUE(tls.waitForQueries(3, 5000));
1643
1644 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001645 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001646}
1647
1648TEST_F(ResolverTest, TlsBypass) {
1649 const char OFF[] = "off";
1650 const char OPPORTUNISTIC[] = "opportunistic";
1651 const char STRICT[] = "strict";
1652
1653 const char GETHOSTBYNAME[] = "gethostbyname";
1654 const char GETADDRINFO[] = "getaddrinfo";
1655 const char GETADDRINFOFORNET[] = "getaddrinfofornet";
1656
1657 const unsigned BYPASS_NETID = NETID_USE_LOCAL_NAMESERVERS | TEST_NETID;
1658
Ken Chenb9fa2062018-11-13 21:51:13 +08001659 const char ADDR4[] = "192.0.2.1";
1660 const char ADDR6[] = "2001:db8::1";
1661
1662 const char cleartext_addr[] = "127.0.0.53";
1663 const char cleartext_port[] = "53";
1664 const char tls_port[] = "853";
Luke Huangf8215372019-11-22 11:53:41 +08001665 const std::vector<std::string> servers = {cleartext_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001666
Xiao Ma09b71022018-12-11 17:56:32 +09001667 test::DNSResponder dns(cleartext_addr);
Ken Chenb9fa2062018-11-13 21:51:13 +08001668 ASSERT_TRUE(dns.startServer());
1669
1670 test::DnsTlsFrontend tls(cleartext_addr, tls_port, cleartext_addr, cleartext_port);
Mike Yudd4ac2d2019-05-31 16:52:11 +08001671 ASSERT_TRUE(tls.startServer());
Ken Chenb9fa2062018-11-13 21:51:13 +08001672
Luke Huangf8215372019-11-22 11:53:41 +08001673 // clang-format off
Ken Chenb9fa2062018-11-13 21:51:13 +08001674 struct TestConfig {
1675 const std::string mode;
1676 const bool withWorkingTLS;
1677 const std::string method;
1678
1679 std::string asHostName() const {
Luke Huangf8215372019-11-22 11:53:41 +08001680 return StringPrintf("%s.%s.%s.", mode.c_str(), withWorkingTLS ? "tlsOn" : "tlsOff",
Ken Chenb9fa2062018-11-13 21:51:13 +08001681 method.c_str());
1682 }
1683 } testConfigs[]{
Ken Chenb9fa2062018-11-13 21:51:13 +08001684 {OFF, true, GETHOSTBYNAME},
1685 {OPPORTUNISTIC, true, GETHOSTBYNAME},
1686 {STRICT, true, GETHOSTBYNAME},
Ken Chenb9fa2062018-11-13 21:51:13 +08001687 {OFF, true, GETADDRINFO},
1688 {OPPORTUNISTIC, true, GETADDRINFO},
1689 {STRICT, true, GETADDRINFO},
Ken Chenb9fa2062018-11-13 21:51:13 +08001690 {OFF, true, GETADDRINFOFORNET},
1691 {OPPORTUNISTIC, true, GETADDRINFOFORNET},
1692 {STRICT, true, GETADDRINFOFORNET},
Mike Yudd4ac2d2019-05-31 16:52:11 +08001693 {OFF, false, GETHOSTBYNAME},
1694 {OPPORTUNISTIC, false, GETHOSTBYNAME},
1695 {STRICT, false, GETHOSTBYNAME},
1696 {OFF, false, GETADDRINFO},
1697 {OPPORTUNISTIC, false, GETADDRINFO},
1698 {STRICT, false, GETADDRINFO},
1699 {OFF, false, GETADDRINFOFORNET},
1700 {OPPORTUNISTIC, false, GETADDRINFOFORNET},
1701 {STRICT, false, GETADDRINFOFORNET},
Ken Chenb9fa2062018-11-13 21:51:13 +08001702 };
Luke Huangf8215372019-11-22 11:53:41 +08001703 // clang-format on
Ken Chenb9fa2062018-11-13 21:51:13 +08001704
1705 for (const auto& config : testConfigs) {
1706 const std::string testHostName = config.asHostName();
1707 SCOPED_TRACE(testHostName);
1708
1709 // Don't tempt test bugs due to caching.
1710 const char* host_name = testHostName.c_str();
1711 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
1712 dns.addMapping(host_name, ns_type::ns_t_aaaa, ADDR6);
1713
Mike Yudd4ac2d2019-05-31 16:52:11 +08001714 if (config.withWorkingTLS) {
1715 if (!tls.running()) {
1716 ASSERT_TRUE(tls.startServer());
1717 }
1718 } else {
1719 if (tls.running()) {
1720 ASSERT_TRUE(tls.stopServer());
1721 }
1722 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001723
1724 if (config.mode == OFF) {
Xiao Ma09b71022018-12-11 17:56:32 +09001725 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, kDefaultSearchDomains,
1726 kDefaultParams));
Ken Chenb9fa2062018-11-13 21:51:13 +08001727 } else if (config.mode == OPPORTUNISTIC) {
Xiao Ma09b71022018-12-11 17:56:32 +09001728 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08001729 kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08001730
1731 // Wait for the validation event. If the server is running, the validation should
1732 // be successful; otherwise, the validation should be failed.
1733 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), config.withWorkingTLS));
Ken Chenb9fa2062018-11-13 21:51:13 +08001734 } else if (config.mode == STRICT) {
Xiao Ma09b71022018-12-11 17:56:32 +09001735 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08001736 kDefaultParams, kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08001737
1738 // Wait for the validation event.
1739 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), config.withWorkingTLS));
Ken Chenb9fa2062018-11-13 21:51:13 +08001740 }
Mike Yudd4ac2d2019-05-31 16:52:11 +08001741 tls.clearQueries();
Ken Chenb9fa2062018-11-13 21:51:13 +08001742
1743 const hostent* h_result = nullptr;
1744 ScopedAddrinfo ai_result;
1745
1746 if (config.method == GETHOSTBYNAME) {
1747 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
1748 h_result = gethostbyname(host_name);
1749
1750 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
1751 ASSERT_FALSE(h_result == nullptr);
1752 ASSERT_EQ(4, h_result->h_length);
1753 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
1754 EXPECT_EQ(ADDR4, ToString(h_result));
1755 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
1756 } else if (config.method == GETADDRINFO) {
1757 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
1758 ai_result = safe_getaddrinfo(host_name, nullptr, nullptr);
1759 EXPECT_TRUE(ai_result != nullptr);
1760
1761 EXPECT_LE(1U, GetNumQueries(dns, host_name));
1762 // Could be A or AAAA
1763 const std::string result_str = ToString(ai_result);
1764 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
Luke Huangf8215372019-11-22 11:53:41 +08001765 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08001766 } else if (config.method == GETADDRINFOFORNET) {
1767 addrinfo* raw_ai_result = nullptr;
1768 EXPECT_EQ(0, android_getaddrinfofornet(host_name, /*servname=*/nullptr,
1769 /*hints=*/nullptr, BYPASS_NETID, MARK_UNSET,
1770 &raw_ai_result));
1771 ai_result.reset(raw_ai_result);
1772
1773 EXPECT_LE(1U, GetNumQueries(dns, host_name));
1774 // Could be A or AAAA
1775 const std::string result_str = ToString(ai_result);
1776 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
Luke Huangf8215372019-11-22 11:53:41 +08001777 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08001778 }
1779
Mike Yudd4ac2d2019-05-31 16:52:11 +08001780 EXPECT_EQ(0, tls.queries());
Ken Chenb9fa2062018-11-13 21:51:13 +08001781
1782 // Clear per-process resolv netid.
1783 ASSERT_EQ(0, setNetworkForResolv(NETID_UNSET));
Ken Chenb9fa2062018-11-13 21:51:13 +08001784 dns.clearQueries();
1785 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001786}
1787
1788TEST_F(ResolverTest, StrictMode_NoTlsServers) {
Xiao Ma09b71022018-12-11 17:56:32 +09001789 constexpr char cleartext_addr[] = "127.0.0.53";
Luke Huangf8215372019-11-22 11:53:41 +08001790 const std::vector<std::string> servers = {cleartext_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09001791 constexpr char host_name[] = "strictmode.notlsips.example.com.";
1792 const std::vector<DnsRecord> records = {
1793 {host_name, ns_type::ns_t_a, "1.2.3.4"},
1794 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
1795 };
Ken Chenb9fa2062018-11-13 21:51:13 +08001796
Xiao Ma09b71022018-12-11 17:56:32 +09001797 test::DNSResponder dns(cleartext_addr);
1798 StartDns(dns, records);
Ken Chenb9fa2062018-11-13 21:51:13 +08001799
waynema0e73c2e2019-07-31 15:04:08 +08001800 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1801 kDefaultIncorrectPrivateDnsHostName));
Ken Chenb9fa2062018-11-13 21:51:13 +08001802
1803 addrinfo* ai_result = nullptr;
1804 EXPECT_NE(0, getaddrinfo(host_name, nullptr, nullptr, &ai_result));
1805 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
1806}
Luke Huang94b10b92018-11-21 20:13:38 +08001807
1808namespace {
1809
Luke Huang70931aa2019-01-31 11:57:41 +08001810int getAsyncResponse(int fd, int* rcode, uint8_t* buf, int bufLen) {
Luke Huang94b10b92018-11-21 20:13:38 +08001811 struct pollfd wait_fd[1];
1812 wait_fd[0].fd = fd;
1813 wait_fd[0].events = POLLIN;
1814 short revents;
1815 int ret;
1816
1817 ret = poll(wait_fd, 1, -1);
1818 revents = wait_fd[0].revents;
1819 if (revents & POLLIN) {
1820 int n = resNetworkResult(fd, rcode, buf, bufLen);
Luke Huangba7bef92018-12-26 16:53:03 +08001821 // Verify that resNetworkResult() closed the fd
1822 char dummy;
1823 EXPECT_EQ(-1, read(fd, &dummy, sizeof dummy));
1824 EXPECT_EQ(EBADF, errno);
Luke Huang94b10b92018-11-21 20:13:38 +08001825 return n;
1826 }
1827 return -1;
1828}
1829
Luke Huang70931aa2019-01-31 11:57:41 +08001830std::string toString(uint8_t* buf, int bufLen, int ipType) {
Luke Huang94b10b92018-11-21 20:13:38 +08001831 ns_msg handle;
1832 int ancount, n = 0;
1833 ns_rr rr;
1834
Luke Huangf8215372019-11-22 11:53:41 +08001835 if (ns_initparse((const uint8_t*)buf, bufLen, &handle) >= 0) {
Luke Huang94b10b92018-11-21 20:13:38 +08001836 ancount = ns_msg_count(handle, ns_s_an);
1837 if (ns_parserr(&handle, ns_s_an, n, &rr) == 0) {
Luke Huang70931aa2019-01-31 11:57:41 +08001838 const uint8_t* rdata = ns_rr_rdata(rr);
Luke Huang94b10b92018-11-21 20:13:38 +08001839 char buffer[INET6_ADDRSTRLEN];
Luke Huangf8215372019-11-22 11:53:41 +08001840 if (inet_ntop(ipType, (const char*)rdata, buffer, sizeof(buffer))) {
Luke Huang94b10b92018-11-21 20:13:38 +08001841 return buffer;
1842 }
1843 }
1844 }
1845 return "";
1846}
1847
1848int dns_open_proxy() {
1849 int s = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
1850 if (s == -1) {
1851 return -1;
1852 }
1853 const int one = 1;
1854 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
1855
1856 static const struct sockaddr_un proxy_addr = {
1857 .sun_family = AF_UNIX,
1858 .sun_path = "/dev/socket/dnsproxyd",
1859 };
1860
Luke Huangf8215372019-11-22 11:53:41 +08001861 if (TEMP_FAILURE_RETRY(connect(s, (const struct sockaddr*)&proxy_addr, sizeof(proxy_addr))) !=
Luke Huang94b10b92018-11-21 20:13:38 +08001862 0) {
1863 close(s);
1864 return -1;
1865 }
1866
1867 return s;
1868}
1869
Luke Huangba7bef92018-12-26 16:53:03 +08001870void expectAnswersValid(int fd, int ipType, const std::string& expectedAnswer) {
1871 int rcode = -1;
1872 uint8_t buf[MAXPACKET] = {};
1873
1874 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
1875 EXPECT_GT(res, 0);
1876 EXPECT_EQ(expectedAnswer, toString(buf, res, ipType));
1877}
1878
1879void expectAnswersNotValid(int fd, int expectedErrno) {
1880 int rcode = -1;
1881 uint8_t buf[MAXPACKET] = {};
1882
1883 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
1884 EXPECT_EQ(expectedErrno, res);
1885}
1886
Luke Huang94b10b92018-11-21 20:13:38 +08001887} // namespace
1888
1889TEST_F(ResolverTest, Async_NormalQueryV4V6) {
Xiao Ma09b71022018-12-11 17:56:32 +09001890 constexpr char listen_addr[] = "127.0.0.4";
1891 constexpr char host_name[] = "howdy.example.com.";
1892 const std::vector<DnsRecord> records = {
1893 {host_name, ns_type::ns_t_a, "1.2.3.4"},
1894 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
1895 };
1896
1897 test::DNSResponder dns(listen_addr);
1898 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08001899 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09001900 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08001901
Luke Huangba7bef92018-12-26 16:53:03 +08001902 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
1903 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08001904 EXPECT_TRUE(fd1 != -1);
1905 EXPECT_TRUE(fd2 != -1);
1906
Luke Huang70931aa2019-01-31 11:57:41 +08001907 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08001908 int rcode;
1909 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
1910 EXPECT_GT(res, 0);
1911 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
1912
1913 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
1914 EXPECT_GT(res, 0);
1915 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
1916
1917 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
1918
1919 // Re-query verify cache works
Luke Huangba7bef92018-12-26 16:53:03 +08001920 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
1921 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08001922
1923 EXPECT_TRUE(fd1 != -1);
1924 EXPECT_TRUE(fd2 != -1);
1925
1926 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
1927 EXPECT_GT(res, 0);
1928 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
1929
1930 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
1931 EXPECT_GT(res, 0);
1932 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
1933
1934 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
1935}
1936
1937TEST_F(ResolverTest, Async_BadQuery) {
Xiao Ma09b71022018-12-11 17:56:32 +09001938 constexpr char listen_addr[] = "127.0.0.4";
1939 constexpr char host_name[] = "howdy.example.com.";
1940 const std::vector<DnsRecord> records = {
1941 {host_name, ns_type::ns_t_a, "1.2.3.4"},
1942 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
1943 };
1944
1945 test::DNSResponder dns(listen_addr);
1946 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08001947 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09001948 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08001949
1950 static struct {
1951 int fd;
1952 const char* dname;
1953 const int queryType;
1954 const int expectRcode;
1955 } kTestData[] = {
Luke Huangba7bef92018-12-26 16:53:03 +08001956 {-1, "", ns_t_aaaa, 0},
1957 {-1, "as65ass46", ns_t_aaaa, 0},
1958 {-1, "454564564564", ns_t_aaaa, 0},
1959 {-1, "h645235", ns_t_a, 0},
1960 {-1, "www.google.com", ns_t_a, 0},
Luke Huang94b10b92018-11-21 20:13:38 +08001961 };
1962
1963 for (auto& td : kTestData) {
1964 SCOPED_TRACE(td.dname);
Luke Huangba7bef92018-12-26 16:53:03 +08001965 td.fd = resNetworkQuery(TEST_NETID, td.dname, ns_c_in, td.queryType, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08001966 EXPECT_TRUE(td.fd != -1);
1967 }
1968
1969 // dns_responder return empty resp(packet only contains query part) with no error currently
1970 for (const auto& td : kTestData) {
Luke Huang70931aa2019-01-31 11:57:41 +08001971 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08001972 int rcode;
1973 SCOPED_TRACE(td.dname);
1974 int res = getAsyncResponse(td.fd, &rcode, buf, MAXPACKET);
1975 EXPECT_GT(res, 0);
1976 EXPECT_EQ(rcode, td.expectRcode);
1977 }
1978}
1979
1980TEST_F(ResolverTest, Async_EmptyAnswer) {
Xiao Ma09b71022018-12-11 17:56:32 +09001981 constexpr char listen_addr[] = "127.0.0.4";
1982 constexpr char host_name[] = "howdy.example.com.";
1983 const std::vector<DnsRecord> records = {
1984 {host_name, ns_type::ns_t_a, "1.2.3.4"},
1985 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
1986 };
1987
1988 test::DNSResponder dns(listen_addr);
1989 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08001990 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09001991 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08001992
Luke Huang9c264bb2018-12-18 16:44:41 +08001993 // TODO: Disable retry to make this test explicit.
1994 auto& cv = dns.getCv();
1995 auto& cvMutex = dns.getCvMutex();
1996 int fd1;
1997 // Wait on the condition variable to ensure that the DNS server has handled our first query.
1998 {
1999 std::unique_lock lk(cvMutex);
Luke Huangba7bef92018-12-26 16:53:03 +08002000 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang9c264bb2018-12-18 16:44:41 +08002001 EXPECT_TRUE(fd1 != -1);
2002 EXPECT_EQ(std::cv_status::no_timeout, cv.wait_for(lk, std::chrono::seconds(1)));
2003 }
Luke Huang94b10b92018-11-21 20:13:38 +08002004
Luke Huang94b10b92018-11-21 20:13:38 +08002005 dns.setResponseProbability(0.0);
Luke Huang94b10b92018-11-21 20:13:38 +08002006
Luke Huangba7bef92018-12-26 16:53:03 +08002007 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002008 EXPECT_TRUE(fd2 != -1);
2009
Luke Huangba7bef92018-12-26 16:53:03 +08002010 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002011 EXPECT_TRUE(fd3 != -1);
2012
Luke Huang9c264bb2018-12-18 16:44:41 +08002013 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002014 int rcode;
2015
Luke Huang9c264bb2018-12-18 16:44:41 +08002016 // expect no response
2017 int res = getAsyncResponse(fd3, &rcode, buf, MAXPACKET);
2018 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huang94b10b92018-11-21 20:13:38 +08002019
Luke Huang9c264bb2018-12-18 16:44:41 +08002020 // expect no response
Luke Huang94b10b92018-11-21 20:13:38 +08002021 memset(buf, 0, MAXPACKET);
Luke Huang9c264bb2018-12-18 16:44:41 +08002022 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2023 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huang94b10b92018-11-21 20:13:38 +08002024
Luke Huang94b10b92018-11-21 20:13:38 +08002025 dns.setResponseProbability(1.0);
Luke Huang94b10b92018-11-21 20:13:38 +08002026
Luke Huangba7bef92018-12-26 16:53:03 +08002027 int fd4 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002028 EXPECT_TRUE(fd4 != -1);
2029
2030 memset(buf, 0, MAXPACKET);
2031 res = getAsyncResponse(fd4, &rcode, buf, MAXPACKET);
2032 EXPECT_GT(res, 0);
2033 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2034
2035 memset(buf, 0, MAXPACKET);
2036 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2037 EXPECT_GT(res, 0);
2038 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
2039}
2040
2041TEST_F(ResolverTest, Async_MalformedQuery) {
Xiao Ma09b71022018-12-11 17:56:32 +09002042 constexpr char listen_addr[] = "127.0.0.4";
2043 constexpr char host_name[] = "howdy.example.com.";
2044 const std::vector<DnsRecord> records = {
2045 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2046 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2047 };
2048
2049 test::DNSResponder dns(listen_addr);
2050 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002051 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002052 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002053
2054 int fd = dns_open_proxy();
2055 EXPECT_TRUE(fd > 0);
2056
2057 const std::string badMsg = "16-52512#";
Xiao Ma09b71022018-12-11 17:56:32 +09002058 static const struct {
Luke Huang94b10b92018-11-21 20:13:38 +08002059 const std::string cmd;
2060 const int expectErr;
2061 } kTestData[] = {
Luke Huangba7bef92018-12-26 16:53:03 +08002062 // Too few arguments
Luke Huang94b10b92018-11-21 20:13:38 +08002063 {"resnsend " + badMsg + '\0', -EINVAL},
2064 // Bad netId
Luke Huangba7bef92018-12-26 16:53:03 +08002065 {"resnsend badnetId 0 " + badMsg + '\0', -EINVAL},
Luke Huang94b10b92018-11-21 20:13:38 +08002066 // Bad raw data
Luke Huangba7bef92018-12-26 16:53:03 +08002067 {"resnsend " + std::to_string(TEST_NETID) + " 0 " + badMsg + '\0', -EILSEQ},
Luke Huang94b10b92018-11-21 20:13:38 +08002068 };
2069
2070 for (unsigned int i = 0; i < std::size(kTestData); i++) {
2071 auto& td = kTestData[i];
2072 SCOPED_TRACE(td.cmd);
2073 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, td.cmd.c_str(), td.cmd.size()));
2074 EXPECT_EQ(rc, static_cast<ssize_t>(td.cmd.size()));
2075
2076 int32_t tmp;
2077 rc = TEMP_FAILURE_RETRY(read(fd, &tmp, sizeof(tmp)));
2078 EXPECT_TRUE(rc > 0);
2079 EXPECT_EQ(static_cast<int>(ntohl(tmp)), td.expectErr);
2080 }
2081 // Normal query with answer buffer
2082 // This is raw data of query "howdy.example.com" type 1 class 1
2083 std::string query = "81sBAAABAAAAAAAABWhvd2R5B2V4YW1wbGUDY29tAAABAAE=";
Luke Huangba7bef92018-12-26 16:53:03 +08002084 std::string cmd = "resnsend " + std::to_string(TEST_NETID) + " 0 " + query + '\0';
Luke Huang94b10b92018-11-21 20:13:38 +08002085 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
2086 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
2087
Luke Huang70931aa2019-01-31 11:57:41 +08002088 uint8_t smallBuf[1] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002089 int rcode;
2090 rc = getAsyncResponse(fd, &rcode, smallBuf, 1);
Luke Huangba7bef92018-12-26 16:53:03 +08002091 EXPECT_EQ(-EMSGSIZE, rc);
Luke Huang94b10b92018-11-21 20:13:38 +08002092
2093 // Do the normal test with large buffer again
2094 fd = dns_open_proxy();
2095 EXPECT_TRUE(fd > 0);
2096 rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
2097 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
Luke Huang70931aa2019-01-31 11:57:41 +08002098 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002099 rc = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2100 EXPECT_EQ("1.2.3.4", toString(buf, rc, AF_INET));
Mike Yu4f3747b2018-12-02 17:54:29 +09002101}
2102
Luke Huangba7bef92018-12-26 16:53:03 +08002103TEST_F(ResolverTest, Async_CacheFlags) {
Xiao Ma09b71022018-12-11 17:56:32 +09002104 constexpr char listen_addr[] = "127.0.0.4";
2105 constexpr char host_name[] = "howdy.example.com.";
Luke Huang40f5f492019-05-09 19:37:35 +08002106 constexpr char another_host_name[] = "howdy.example2.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002107 const std::vector<DnsRecord> records = {
2108 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2109 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
Luke Huang40f5f492019-05-09 19:37:35 +08002110 {another_host_name, ns_type::ns_t_a, "1.2.3.5"},
2111 {another_host_name, ns_type::ns_t_aaaa, "::1.2.3.5"},
Xiao Ma09b71022018-12-11 17:56:32 +09002112 };
2113
2114 test::DNSResponder dns(listen_addr);
2115 StartDns(dns, records);
Luke Huangba7bef92018-12-26 16:53:03 +08002116 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002117 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huangba7bef92018-12-26 16:53:03 +08002118
2119 // ANDROID_RESOLV_NO_CACHE_STORE
2120 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2121 ANDROID_RESOLV_NO_CACHE_STORE);
2122 EXPECT_TRUE(fd1 != -1);
2123 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2124 ANDROID_RESOLV_NO_CACHE_STORE);
2125 EXPECT_TRUE(fd2 != -1);
2126 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2127 ANDROID_RESOLV_NO_CACHE_STORE);
2128 EXPECT_TRUE(fd3 != -1);
2129
2130 expectAnswersValid(fd3, AF_INET, "1.2.3.4");
2131 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
2132 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2133
2134 // No cache exists, expect 3 queries
2135 EXPECT_EQ(3U, GetNumQueries(dns, host_name));
2136
2137 // Re-query and cache
2138 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2139
2140 EXPECT_TRUE(fd1 != -1);
2141
2142 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2143
2144 // Now we have cache, expect 4 queries
2145 EXPECT_EQ(4U, GetNumQueries(dns, host_name));
2146
2147 // ANDROID_RESOLV_NO_CACHE_LOOKUP
2148 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2149 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2150 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2151 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2152
2153 EXPECT_TRUE(fd1 != -1);
2154 EXPECT_TRUE(fd2 != -1);
2155
2156 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
2157 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2158
2159 // Skip cache, expect 6 queries
2160 EXPECT_EQ(6U, GetNumQueries(dns, host_name));
2161
2162 // Re-query verify cache works
2163 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2164 ANDROID_RESOLV_NO_CACHE_STORE);
2165 EXPECT_TRUE(fd1 != -1);
2166 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2167
2168 // Cache hits, expect still 6 queries
2169 EXPECT_EQ(6U, GetNumQueries(dns, host_name));
Luke Huanga1d74182019-03-19 17:30:36 +08002170
2171 // Start to verify if ANDROID_RESOLV_NO_CACHE_LOOKUP does write response into cache
2172 dns.clearQueries();
2173
2174 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa,
2175 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2176 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa,
2177 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2178
2179 EXPECT_TRUE(fd1 != -1);
2180 EXPECT_TRUE(fd2 != -1);
2181
2182 expectAnswersValid(fd2, AF_INET6, "::1.2.3.4");
2183 expectAnswersValid(fd1, AF_INET6, "::1.2.3.4");
2184
2185 // Skip cache, expect 2 queries
2186 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
2187
2188 // Re-query without flags
2189 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
2190 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
2191
2192 EXPECT_TRUE(fd1 != -1);
2193 EXPECT_TRUE(fd2 != -1);
2194
2195 expectAnswersValid(fd2, AF_INET6, "::1.2.3.4");
2196 expectAnswersValid(fd1, AF_INET6, "::1.2.3.4");
2197
2198 // Cache hits, expect still 2 queries
2199 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
Luke Huang40f5f492019-05-09 19:37:35 +08002200
2201 // Test both ANDROID_RESOLV_NO_CACHE_STORE and ANDROID_RESOLV_NO_CACHE_LOOKUP are set
2202 dns.clearQueries();
2203
2204 // Make sure that the cache of "howdy.example2.com" exists.
2205 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa, 0);
2206 EXPECT_TRUE(fd1 != -1);
2207 expectAnswersValid(fd1, AF_INET6, "::1.2.3.5");
2208 EXPECT_EQ(1U, GetNumQueries(dns, another_host_name));
2209
2210 // Re-query with testFlags
2211 const int testFlag = ANDROID_RESOLV_NO_CACHE_STORE | ANDROID_RESOLV_NO_CACHE_LOOKUP;
2212 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa, testFlag);
2213 EXPECT_TRUE(fd1 != -1);
2214 expectAnswersValid(fd1, AF_INET6, "::1.2.3.5");
2215 // Expect cache lookup is skipped.
2216 EXPECT_EQ(2U, GetNumQueries(dns, another_host_name));
2217
2218 // Do another query with testFlags
2219 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_a, testFlag);
2220 EXPECT_TRUE(fd1 != -1);
2221 expectAnswersValid(fd1, AF_INET, "1.2.3.5");
2222 // Expect cache lookup is skipped.
2223 EXPECT_EQ(3U, GetNumQueries(dns, another_host_name));
2224
2225 // Re-query with no flags
2226 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_a, 0);
2227 EXPECT_TRUE(fd1 != -1);
2228 expectAnswersValid(fd1, AF_INET, "1.2.3.5");
2229 // Expect no cache hit because cache storing is also skipped in previous query.
2230 EXPECT_EQ(4U, GetNumQueries(dns, another_host_name));
Luke Huangba7bef92018-12-26 16:53:03 +08002231}
2232
2233TEST_F(ResolverTest, Async_NoRetryFlag) {
Luke Huang70931aa2019-01-31 11:57:41 +08002234 constexpr char listen_addr0[] = "127.0.0.4";
2235 constexpr char listen_addr1[] = "127.0.0.6";
Xiao Ma09b71022018-12-11 17:56:32 +09002236 constexpr char host_name[] = "howdy.example.com.";
2237 const std::vector<DnsRecord> records = {
2238 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2239 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2240 };
2241
Luke Huang70931aa2019-01-31 11:57:41 +08002242 test::DNSResponder dns0(listen_addr0);
2243 test::DNSResponder dns1(listen_addr1);
2244 StartDns(dns0, records);
2245 StartDns(dns1, records);
2246 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr0, listen_addr1}));
Luke Huangba7bef92018-12-26 16:53:03 +08002247
Luke Huang70931aa2019-01-31 11:57:41 +08002248 dns0.clearQueries();
2249 dns1.clearQueries();
2250
2251 dns0.setResponseProbability(0.0);
2252 dns1.setResponseProbability(0.0);
Luke Huangba7bef92018-12-26 16:53:03 +08002253
2254 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2255 ANDROID_RESOLV_NO_RETRY);
2256 EXPECT_TRUE(fd1 != -1);
2257
2258 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa,
2259 ANDROID_RESOLV_NO_RETRY);
2260 EXPECT_TRUE(fd2 != -1);
2261
2262 // expect no response
2263 expectAnswersNotValid(fd1, -ETIMEDOUT);
2264 expectAnswersNotValid(fd2, -ETIMEDOUT);
2265
Luke Huang70931aa2019-01-31 11:57:41 +08002266 // No retry case, expect total 2 queries. The server is selected randomly.
2267 EXPECT_EQ(2U, GetNumQueries(dns0, host_name) + GetNumQueries(dns1, host_name));
Luke Huangba7bef92018-12-26 16:53:03 +08002268
Luke Huang70931aa2019-01-31 11:57:41 +08002269 dns0.clearQueries();
2270 dns1.clearQueries();
Luke Huangba7bef92018-12-26 16:53:03 +08002271
2272 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2273 EXPECT_TRUE(fd1 != -1);
2274
2275 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
2276 EXPECT_TRUE(fd2 != -1);
2277
2278 // expect no response
2279 expectAnswersNotValid(fd1, -ETIMEDOUT);
2280 expectAnswersNotValid(fd2, -ETIMEDOUT);
2281
2282 // Retry case, expect 4 queries
Luke Huang70931aa2019-01-31 11:57:41 +08002283 EXPECT_EQ(4U, GetNumQueries(dns0, host_name));
2284 EXPECT_EQ(4U, GetNumQueries(dns1, host_name));
2285}
2286
2287TEST_F(ResolverTest, Async_VerifyQueryID) {
2288 constexpr char listen_addr[] = "127.0.0.4";
2289 constexpr char host_name[] = "howdy.example.com.";
2290 const std::vector<DnsRecord> records = {
2291 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2292 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2293 };
2294
2295 test::DNSResponder dns(listen_addr);
2296 StartDns(dns, records);
2297 std::vector<std::string> servers = {listen_addr};
2298 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
2299
2300 const uint8_t queryBuf1[] = {
2301 /* Header */
2302 0x55, 0x66, /* Transaction ID */
2303 0x01, 0x00, /* Flags */
2304 0x00, 0x01, /* Questions */
2305 0x00, 0x00, /* Answer RRs */
2306 0x00, 0x00, /* Authority RRs */
2307 0x00, 0x00, /* Additional RRs */
2308 /* Queries */
2309 0x05, 0x68, 0x6f, 0x77, 0x64, 0x79, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
2310 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name */
2311 0x00, 0x01, /* Type */
2312 0x00, 0x01 /* Class */
2313 };
2314
2315 int fd = resNetworkSend(TEST_NETID, queryBuf1, sizeof(queryBuf1), 0);
2316 EXPECT_TRUE(fd != -1);
2317
2318 uint8_t buf[MAXPACKET] = {};
2319 int rcode;
2320
2321 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2322 EXPECT_GT(res, 0);
2323 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2324
2325 auto hp = reinterpret_cast<HEADER*>(buf);
2326 EXPECT_EQ(21862U, htons(hp->id));
2327
2328 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2329
2330 const uint8_t queryBuf2[] = {
2331 /* Header */
2332 0x00, 0x53, /* Transaction ID */
2333 0x01, 0x00, /* Flags */
2334 0x00, 0x01, /* Questions */
2335 0x00, 0x00, /* Answer RRs */
2336 0x00, 0x00, /* Authority RRs */
2337 0x00, 0x00, /* Additional RRs */
2338 /* Queries */
2339 0x05, 0x68, 0x6f, 0x77, 0x64, 0x79, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
2340 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name */
2341 0x00, 0x01, /* Type */
2342 0x00, 0x01 /* Class */
2343 };
2344
2345 // Re-query verify cache works and query id is correct
2346 fd = resNetworkSend(TEST_NETID, queryBuf2, sizeof(queryBuf2), 0);
2347
2348 EXPECT_TRUE(fd != -1);
2349
2350 res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2351 EXPECT_GT(res, 0);
2352 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2353
2354 EXPECT_EQ(0x0053U, htons(hp->id));
2355
2356 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
Luke Huangba7bef92018-12-26 16:53:03 +08002357}
2358
Mike Yu4f3747b2018-12-02 17:54:29 +09002359// This test checks that the resolver should not generate the request containing OPT RR when using
Ken Chen0a015532019-01-02 14:59:38 +08002360// cleartext DNS. If we query the DNS server not supporting EDNS0 and it reponds with
2361// FORMERR_ON_EDNS, we will fallback to no EDNS0 and try again. If the server does no response, we
2362// won't retry so that we get no answer.
Mike Yu4f3747b2018-12-02 17:54:29 +09002363TEST_F(ResolverTest, BrokenEdns) {
2364 typedef test::DNSResponder::Edns Edns;
2365 enum ExpectResult { EXPECT_FAILURE, EXPECT_SUCCESS };
2366
2367 const char OFF[] = "off";
2368 const char OPPORTUNISTIC_UDP[] = "opportunistic_udp";
2369 const char OPPORTUNISTIC_TLS[] = "opportunistic_tls";
2370 const char STRICT[] = "strict";
2371 const char GETHOSTBYNAME[] = "gethostbyname";
2372 const char GETADDRINFO[] = "getaddrinfo";
Mike Yu4f3747b2018-12-02 17:54:29 +09002373 const char ADDR4[] = "192.0.2.1";
2374 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2375 const char CLEARTEXT_PORT[] = "53";
2376 const char TLS_PORT[] = "853";
Luke Huangf8215372019-11-22 11:53:41 +08002377 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
Mike Yu4f3747b2018-12-02 17:54:29 +09002378
Mike Yufc125e42019-05-15 20:41:28 +08002379 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Mike Yu4f3747b2018-12-02 17:54:29 +09002380 ASSERT_TRUE(dns.startServer());
2381
2382 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2383
Luke Huangf8215372019-11-22 11:53:41 +08002384 // clang-format off
Mike Yu4f3747b2018-12-02 17:54:29 +09002385 static const struct TestConfig {
2386 std::string mode;
2387 std::string method;
2388 Edns edns;
2389 ExpectResult expectResult;
2390
2391 std::string asHostName() const {
2392 const char* ednsString;
2393 switch (edns) {
2394 case Edns::ON:
2395 ednsString = "ednsOn";
2396 break;
Ken Chen0a015532019-01-02 14:59:38 +08002397 case Edns::FORMERR_ON_EDNS:
Mike Yu4f3747b2018-12-02 17:54:29 +09002398 ednsString = "ednsFormerr";
2399 break;
2400 case Edns::DROP:
2401 ednsString = "ednsDrop";
2402 break;
2403 default:
2404 ednsString = "";
2405 break;
2406 }
2407 return StringPrintf("%s.%s.%s.", mode.c_str(), method.c_str(), ednsString);
2408 }
2409 } testConfigs[] = {
2410 // In OPPORTUNISTIC_TLS, we get no answer if the DNS server supports TLS but not EDNS0.
2411 // Could such server exist? if so, we might need to fallback to query cleartext DNS.
2412 // Another thing is that {OPPORTUNISTIC_TLS, Edns::DROP} and {STRICT, Edns::DROP} are
2413 // commented out since TLS timeout is not configurable.
2414 // TODO: Uncomment them after TLS timeout is configurable.
2415 {OFF, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2416 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2417 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2418 {STRICT, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
Ken Chen0a015532019-01-02 14:59:38 +08002419 {OFF, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2420 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2421 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2422 {STRICT, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
Mike Yu4f3747b2018-12-02 17:54:29 +09002423 {OFF, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2424 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2425 //{OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2426 //{STRICT, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2427 {OFF, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2428 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2429 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2430 {STRICT, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
Ken Chen0a015532019-01-02 14:59:38 +08002431 {OFF, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2432 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2433 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2434 {STRICT, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
Mike Yu4f3747b2018-12-02 17:54:29 +09002435 {OFF, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2436 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2437 //{OPPORTUNISTIC_TLS, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2438 //{STRICT, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2439 };
Luke Huangf8215372019-11-22 11:53:41 +08002440 // clang-format on
Mike Yu4f3747b2018-12-02 17:54:29 +09002441
2442 for (const auto& config : testConfigs) {
2443 const std::string testHostName = config.asHostName();
2444 SCOPED_TRACE(testHostName);
2445
2446 const char* host_name = testHostName.c_str();
2447 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
2448 dns.setEdns(config.edns);
2449
2450 if (config.mode == OFF) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002451 if (tls.running()) {
2452 ASSERT_TRUE(tls.stopServer());
2453 }
Xiao Ma09b71022018-12-11 17:56:32 +09002454 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Mike Yu4f3747b2018-12-02 17:54:29 +09002455 } else if (config.mode == OPPORTUNISTIC_UDP) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002456 if (tls.running()) {
2457 ASSERT_TRUE(tls.stopServer());
2458 }
Xiao Ma09b71022018-12-11 17:56:32 +09002459 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002460 kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002461 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), false));
Mike Yu4f3747b2018-12-02 17:54:29 +09002462 } else if (config.mode == OPPORTUNISTIC_TLS) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002463 if (!tls.running()) {
2464 ASSERT_TRUE(tls.startServer());
2465 }
Xiao Ma09b71022018-12-11 17:56:32 +09002466 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002467 kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002468 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Mike Yu4f3747b2018-12-02 17:54:29 +09002469 } else if (config.mode == STRICT) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002470 if (!tls.running()) {
2471 ASSERT_TRUE(tls.startServer());
2472 }
Xiao Ma09b71022018-12-11 17:56:32 +09002473 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002474 kDefaultParams, kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08002475 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Mike Yu4f3747b2018-12-02 17:54:29 +09002476 }
2477
2478 if (config.method == GETHOSTBYNAME) {
2479 const hostent* h_result = gethostbyname(host_name);
2480 if (config.expectResult == EXPECT_SUCCESS) {
2481 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2482 ASSERT_TRUE(h_result != nullptr);
2483 ASSERT_EQ(4, h_result->h_length);
2484 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
2485 EXPECT_EQ(ADDR4, ToString(h_result));
2486 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
2487 } else {
2488 EXPECT_EQ(0U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
2489 ASSERT_TRUE(h_result == nullptr);
2490 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2491 }
2492 } else if (config.method == GETADDRINFO) {
2493 ScopedAddrinfo ai_result;
2494 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2495 ai_result = safe_getaddrinfo(host_name, nullptr, &hints);
2496 if (config.expectResult == EXPECT_SUCCESS) {
2497 EXPECT_TRUE(ai_result != nullptr);
2498 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2499 const std::string result_str = ToString(ai_result);
2500 EXPECT_EQ(ADDR4, result_str);
2501 } else {
2502 EXPECT_TRUE(ai_result == nullptr);
2503 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
2504 }
2505 } else {
2506 FAIL() << "Unsupported query method: " << config.method;
2507 }
2508
Mike Yudd4ac2d2019-05-31 16:52:11 +08002509 tls.clearQueries();
Mike Yu4f3747b2018-12-02 17:54:29 +09002510 dns.clearQueries();
2511 }
Mike Yu4f3747b2018-12-02 17:54:29 +09002512}
nuccachena26cc2a2018-07-17 18:07:23 +08002513
Ken Chen0a015532019-01-02 14:59:38 +08002514// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2515// Resolver should have a reasonable number of retries instead of spinning forever. We don't have
2516// an efficient way to know if resolver is stuck in an infinite loop. However, test case will be
2517// failed due to timeout.
2518TEST_F(ResolverTest, UnstableTls) {
2519 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2520 const char CLEARTEXT_PORT[] = "53";
2521 const char TLS_PORT[] = "853";
2522 const char* host_name1 = "nonexistent1.example.com.";
2523 const char* host_name2 = "nonexistent2.example.com.";
2524 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
2525
Mike Yufc125e42019-05-15 20:41:28 +08002526 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Ken Chen0a015532019-01-02 14:59:38 +08002527 ASSERT_TRUE(dns.startServer());
2528 dns.setEdns(test::DNSResponder::Edns::FORMERR_ON_EDNS);
2529 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2530 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08002531 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002532 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
2533
Ken Chen0a015532019-01-02 14:59:38 +08002534 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
2535 tls.stopServer();
2536
2537 const hostent* h_result = gethostbyname(host_name1);
2538 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
2539 ASSERT_TRUE(h_result == nullptr);
2540 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2541
2542 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2543 ScopedAddrinfo ai_result = safe_getaddrinfo(host_name2, nullptr, &hints);
2544 EXPECT_TRUE(ai_result == nullptr);
2545 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
2546}
2547
2548// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2549// Moreover, server responds RCODE=FORMERR even on non-EDNS query.
2550TEST_F(ResolverTest, BogusDnsServer) {
2551 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2552 const char CLEARTEXT_PORT[] = "53";
2553 const char TLS_PORT[] = "853";
2554 const char* host_name1 = "nonexistent1.example.com.";
2555 const char* host_name2 = "nonexistent2.example.com.";
2556 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
2557
Mike Yufc125e42019-05-15 20:41:28 +08002558 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Ken Chen0a015532019-01-02 14:59:38 +08002559 ASSERT_TRUE(dns.startServer());
2560 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2561 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08002562 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002563 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
2564
Ken Chen0a015532019-01-02 14:59:38 +08002565 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
2566 tls.stopServer();
2567 dns.setEdns(test::DNSResponder::Edns::FORMERR_UNCOND);
2568
2569 const hostent* h_result = gethostbyname(host_name1);
2570 EXPECT_EQ(0U, GetNumQueries(dns, host_name1));
2571 ASSERT_TRUE(h_result == nullptr);
2572 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2573
2574 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2575 ScopedAddrinfo ai_result = safe_getaddrinfo(host_name2, nullptr, &hints);
2576 EXPECT_TRUE(ai_result == nullptr);
2577 EXPECT_EQ(0U, GetNumQueries(dns, host_name2));
2578}
2579
nuccachena26cc2a2018-07-17 18:07:23 +08002580TEST_F(ResolverTest, GetAddrInfo_Dns64Synthesize) {
2581 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002582 constexpr char dns64_name[] = "ipv4only.arpa.";
2583 constexpr char host_name[] = "v4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002584 const std::vector<DnsRecord> records = {
2585 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2586 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2587 };
nuccachena26cc2a2018-07-17 18:07:23 +08002588
Xiao Ma09b71022018-12-11 17:56:32 +09002589 test::DNSResponder dns(listen_addr);
Xiao Ma09b71022018-12-11 17:56:32 +09002590 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002591
2592 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002593 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002594
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002595 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002596 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002597 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002598
2599 // hints are necessary in order to let netd know which type of addresses the caller is
2600 // interested in.
Xiao Ma09b71022018-12-11 17:56:32 +09002601 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08002602 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
2603 EXPECT_TRUE(result != nullptr);
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002604 // TODO: BUG: there should only be two queries, one AAAA (which returns no records) and one A
2605 // (which returns 1.2.3.4). But there is an extra AAAA.
2606 EXPECT_EQ(3U, GetNumQueries(dns, host_name));
nuccachena26cc2a2018-07-17 18:07:23 +08002607
2608 std::string result_str = ToString(result);
2609 EXPECT_EQ(result_str, "64:ff9b::102:304");
2610
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002611 // Stopping NAT64 prefix discovery disables synthesis.
Luke Huang5bd827c2019-03-14 16:10:04 +08002612 EXPECT_TRUE(mDnsClient.resolvService()->stopPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002613 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_NOT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002614
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002615 dns.clearQueries();
nuccachena26cc2a2018-07-17 18:07:23 +08002616
2617 result = safe_getaddrinfo("v4only", nullptr, &hints);
2618 EXPECT_TRUE(result != nullptr);
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002619 // TODO: BUG: there should only be one query, an AAAA (which returns no records), because the
2620 // A is already cached. But there is an extra AAAA.
2621 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
nuccachena26cc2a2018-07-17 18:07:23 +08002622
2623 result_str = ToString(result);
2624 EXPECT_EQ(result_str, "1.2.3.4");
2625}
2626
nuccachena26cc2a2018-07-17 18:07:23 +08002627TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecified) {
2628 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002629 constexpr char dns64_name[] = "ipv4only.arpa.";
2630 constexpr char host_name[] = "v4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002631 const std::vector<DnsRecord> records = {
2632 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2633 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2634 };
nuccachena26cc2a2018-07-17 18:07:23 +08002635
Xiao Ma09b71022018-12-11 17:56:32 +09002636 test::DNSResponder dns(listen_addr);
2637 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002638 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002639 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002640
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002641 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002642 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002643 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002644
2645 // Ensure to synthesize AAAA if AF_INET6 is specified, and not to synthesize AAAA
2646 // in AF_INET case.
2647 addrinfo hints;
2648 memset(&hints, 0, sizeof(hints));
2649 hints.ai_family = AF_INET6;
2650 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
2651 EXPECT_TRUE(result != nullptr);
2652 std::string result_str = ToString(result);
2653 EXPECT_EQ(result_str, "64:ff9b::102:304");
2654
2655 hints.ai_family = AF_INET;
2656 result = safe_getaddrinfo("v4only", nullptr, &hints);
2657 EXPECT_TRUE(result != nullptr);
2658 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2659 result_str = ToString(result);
2660 EXPECT_EQ(result_str, "1.2.3.4");
2661}
nuccachena26cc2a2018-07-17 18:07:23 +08002662
2663TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedV6) {
2664 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002665 constexpr char dns64_name[] = "ipv4only.arpa.";
2666 constexpr char host_name[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002667 const std::vector<DnsRecord> records = {
2668 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2669 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2670 {host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
2671 };
nuccachena26cc2a2018-07-17 18:07:23 +08002672
Xiao Ma09b71022018-12-11 17:56:32 +09002673 test::DNSResponder dns(listen_addr);
2674 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002675 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002676 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002677
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002678 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002679 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002680 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002681
Xiao Ma09b71022018-12-11 17:56:32 +09002682 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08002683 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
2684 EXPECT_TRUE(result != nullptr);
2685 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2686
2687 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
Xiao Ma09b71022018-12-11 17:56:32 +09002688 const std::vector<std::string> result_strs = ToStrings(result);
nuccachena26cc2a2018-07-17 18:07:23 +08002689 for (const auto& str : result_strs) {
2690 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
2691 << ", result_str='" << str << "'";
2692 }
2693}
2694
2695TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedNoV6) {
2696 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002697 constexpr char dns64_name[] = "ipv4only.arpa.";
2698 constexpr char host_name[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002699 const std::vector<DnsRecord> records = {
2700 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2701 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2702 };
nuccachena26cc2a2018-07-17 18:07:23 +08002703
Xiao Ma09b71022018-12-11 17:56:32 +09002704 test::DNSResponder dns(listen_addr);
2705 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002706 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002707 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002708
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002709 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002710 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002711 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002712
Xiao Ma09b71022018-12-11 17:56:32 +09002713 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08002714 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
2715 EXPECT_TRUE(result != nullptr);
2716 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2717
2718 // In AF_UNSPEC case, synthesize AAAA if there's no AAAA answer.
2719 std::string result_str = ToString(result);
2720 EXPECT_EQ(result_str, "64:ff9b::102:304");
2721}
2722
2723TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecialUseIPv4Addresses) {
2724 constexpr char THIS_NETWORK[] = "this_network";
2725 constexpr char LOOPBACK[] = "loopback";
2726 constexpr char LINK_LOCAL[] = "link_local";
2727 constexpr char MULTICAST[] = "multicast";
2728 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
2729
2730 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
2731 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
2732 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
2733 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
2734 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
2735
2736 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002737 constexpr char dns64_name[] = "ipv4only.arpa.";
2738
Xiao Ma09b71022018-12-11 17:56:32 +09002739 test::DNSResponder dns(listen_addr);
2740 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08002741 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002742 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002743
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002744 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002745 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002746 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002747
Luke Huangf8215372019-11-22 11:53:41 +08002748 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08002749 static const struct TestConfig {
2750 std::string name;
2751 std::string addr;
2752
2753 std::string asHostName() const { return StringPrintf("%s.example.com.", name.c_str()); }
2754 } testConfigs[]{
2755 {THIS_NETWORK, ADDR_THIS_NETWORK},
2756 {LOOPBACK, ADDR_LOOPBACK},
2757 {LINK_LOCAL, ADDR_LINK_LOCAL},
2758 {MULTICAST, ADDR_MULTICAST},
2759 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
2760 };
Luke Huangf8215372019-11-22 11:53:41 +08002761 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08002762
2763 for (const auto& config : testConfigs) {
2764 const std::string testHostName = config.asHostName();
2765 SCOPED_TRACE(testHostName);
2766
2767 const char* host_name = testHostName.c_str();
2768 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
2769
2770 addrinfo hints;
2771 memset(&hints, 0, sizeof(hints));
2772 hints.ai_family = AF_INET6;
2773 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
2774 // In AF_INET6 case, don't return IPv4 answers
2775 EXPECT_TRUE(result == nullptr);
2776 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2777 dns.clearQueries();
2778
2779 memset(&hints, 0, sizeof(hints));
2780 hints.ai_family = AF_UNSPEC;
2781 result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
2782 EXPECT_TRUE(result != nullptr);
2783 // Expect IPv6 query only. IPv4 answer has been cached in previous query.
2784 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2785 // In AF_UNSPEC case, don't synthesize special use IPv4 address.
2786 std::string result_str = ToString(result);
2787 EXPECT_EQ(result_str, config.addr.c_str());
2788 dns.clearQueries();
2789 }
2790}
2791
2792TEST_F(ResolverTest, GetAddrInfo_Dns64QueryWithNullArgumentHints) {
2793 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002794 constexpr char dns64_name[] = "ipv4only.arpa.";
2795 constexpr char host_name[] = "v4only.example.com.";
2796 constexpr char host_name2[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002797 const std::vector<DnsRecord> records = {
2798 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2799 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2800 {host_name2, ns_type::ns_t_a, "1.2.3.4"},
2801 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
2802 };
nuccachena26cc2a2018-07-17 18:07:23 +08002803
Xiao Ma09b71022018-12-11 17:56:32 +09002804 test::DNSResponder dns(listen_addr);
2805 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002806 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002807 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002808
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002809 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002810 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002811 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002812
2813 // Assign argument hints of getaddrinfo() as null is equivalent to set ai_family AF_UNSPEC.
2814 // In AF_UNSPEC case, synthesize AAAA if there has A answer only.
2815 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, nullptr);
2816 EXPECT_TRUE(result != nullptr);
2817 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2818 std::string result_str = ToString(result);
2819 EXPECT_EQ(result_str, "64:ff9b::102:304");
2820 dns.clearQueries();
2821
2822 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
2823 result = safe_getaddrinfo("v4v6", nullptr, nullptr);
2824 EXPECT_TRUE(result != nullptr);
2825 EXPECT_LE(2U, GetNumQueries(dns, host_name2));
2826 std::vector<std::string> result_strs = ToStrings(result);
2827 for (const auto& str : result_strs) {
2828 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
2829 << ", result_str='" << str << "'";
2830 }
2831}
2832
2833TEST_F(ResolverTest, GetAddrInfo_Dns64QueryNullArgumentNode) {
2834 constexpr char ADDR_ANYADDR_V4[] = "0.0.0.0";
2835 constexpr char ADDR_ANYADDR_V6[] = "::";
2836 constexpr char ADDR_LOCALHOST_V4[] = "127.0.0.1";
2837 constexpr char ADDR_LOCALHOST_V6[] = "::1";
2838
2839 constexpr char PORT_NAME_HTTP[] = "http";
2840 constexpr char PORT_NUMBER_HTTP[] = "80";
2841
2842 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002843 constexpr char dns64_name[] = "ipv4only.arpa.";
2844
Xiao Ma09b71022018-12-11 17:56:32 +09002845 test::DNSResponder dns(listen_addr);
2846 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08002847 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002848 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002849
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002850 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002851 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002852 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002853
Luke Huangf8215372019-11-22 11:53:41 +08002854 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08002855 // If node is null, return address is listed by libc/getaddrinfo.c as follows.
2856 // - passive socket -> anyaddr (0.0.0.0 or ::)
2857 // - non-passive socket -> localhost (127.0.0.1 or ::1)
2858 static const struct TestConfig {
2859 int flag;
2860 std::string addr_v4;
2861 std::string addr_v6;
2862
2863 std::string asParameters() const {
2864 return StringPrintf("flag=%d, addr_v4=%s, addr_v6=%s", flag, addr_v4.c_str(),
2865 addr_v6.c_str());
2866 }
2867 } testConfigs[]{
2868 {0 /* non-passive */, ADDR_LOCALHOST_V4, ADDR_LOCALHOST_V6},
2869 {AI_PASSIVE, ADDR_ANYADDR_V4, ADDR_ANYADDR_V6}
2870 };
Luke Huangf8215372019-11-22 11:53:41 +08002871 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08002872
2873 for (const auto& config : testConfigs) {
2874 SCOPED_TRACE(config.asParameters());
2875
Xiao Ma09b71022018-12-11 17:56:32 +09002876 addrinfo hints = {
Nick Desaulnierscd6395a2019-10-11 09:15:24 -07002877 .ai_flags = config.flag,
Xiao Ma09b71022018-12-11 17:56:32 +09002878 .ai_family = AF_UNSPEC, // any address family
2879 .ai_socktype = 0, // any type
2880 .ai_protocol = 0, // any protocol
Xiao Ma09b71022018-12-11 17:56:32 +09002881 };
nuccachena26cc2a2018-07-17 18:07:23 +08002882
2883 // Assign hostname as null and service as port name.
2884 ScopedAddrinfo result = safe_getaddrinfo(nullptr, PORT_NAME_HTTP, &hints);
2885 ASSERT_TRUE(result != nullptr);
2886
2887 // Can't be synthesized because it should not get into Netd.
2888 std::vector<std::string> result_strs = ToStrings(result);
2889 for (const auto& str : result_strs) {
2890 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
2891 << ", result_str='" << str << "'";
2892 }
2893
2894 // Assign hostname as null and service as numeric port number.
2895 hints.ai_flags = config.flag | AI_NUMERICSERV;
2896 result = safe_getaddrinfo(nullptr, PORT_NUMBER_HTTP, &hints);
2897 ASSERT_TRUE(result != nullptr);
2898
2899 // Can't be synthesized because it should not get into Netd.
2900 result_strs = ToStrings(result);
2901 for (const auto& str : result_strs) {
2902 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
2903 << ", result_str='" << str << "'";
2904 }
2905 }
2906}
2907
2908TEST_F(ResolverTest, GetHostByAddr_ReverseDnsQueryWithHavingNat64Prefix) {
2909 struct hostent* result = nullptr;
2910 struct in_addr v4addr;
2911 struct in6_addr v6addr;
2912
2913 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002914 constexpr char dns64_name[] = "ipv4only.arpa.";
2915 constexpr char ptr_name[] = "v4v6.example.com.";
2916 // PTR record for IPv4 address 1.2.3.4
2917 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
2918 // PTR record for IPv6 address 2001:db8::102:304
2919 constexpr char ptr_addr_v6[] =
2920 "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 +09002921 const std::vector<DnsRecord> records = {
2922 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2923 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
2924 {ptr_addr_v6, ns_type::ns_t_ptr, ptr_name},
2925 };
nuccachena26cc2a2018-07-17 18:07:23 +08002926
Xiao Ma09b71022018-12-11 17:56:32 +09002927 test::DNSResponder dns(listen_addr);
2928 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002929 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002930 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002931
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002932 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002933 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002934 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002935
2936 // Reverse IPv4 DNS query. Prefix should have no effect on it.
2937 inet_pton(AF_INET, "1.2.3.4", &v4addr);
2938 result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
2939 ASSERT_TRUE(result != nullptr);
2940 std::string result_str = result->h_name ? result->h_name : "null";
2941 EXPECT_EQ(result_str, "v4v6.example.com");
2942
2943 // Reverse IPv6 DNS query. Prefix should have no effect on it.
2944 inet_pton(AF_INET6, "2001:db8::102:304", &v6addr);
2945 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
2946 ASSERT_TRUE(result != nullptr);
2947 result_str = result->h_name ? result->h_name : "null";
2948 EXPECT_EQ(result_str, "v4v6.example.com");
2949}
2950
2951TEST_F(ResolverTest, GetHostByAddr_ReverseDns64Query) {
2952 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002953 constexpr char dns64_name[] = "ipv4only.arpa.";
2954 constexpr char ptr_name[] = "v4only.example.com.";
2955 // PTR record for IPv4 address 1.2.3.4
2956 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
2957 // PTR record for IPv6 address 64:ff9b::1.2.3.4
2958 constexpr char ptr_addr_v6_nomapping[] =
2959 "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.";
2960 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
2961 // PTR record for IPv6 address 64:ff9b::5.6.7.8
2962 constexpr char ptr_addr_v6_synthesis[] =
2963 "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 +09002964 const std::vector<DnsRecord> records = {
2965 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2966 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
2967 {ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis},
2968 };
nuccachena26cc2a2018-07-17 18:07:23 +08002969
Xiao Ma09b71022018-12-11 17:56:32 +09002970 test::DNSResponder dns(listen_addr);
2971 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002972 // "ptr_addr_v6_nomapping" is not mapped in DNS server
nuccachena26cc2a2018-07-17 18:07:23 +08002973 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002974 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002975
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002976 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002977 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002978 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002979
2980 // Synthesized PTR record doesn't exist on DNS server
2981 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
2982 // After querying synthesized address failed, expect that prefix is removed from IPv6
2983 // synthesized address and do reverse IPv4 query instead.
2984 struct in6_addr v6addr;
2985 inet_pton(AF_INET6, "64:ff9b::1.2.3.4", &v6addr);
2986 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
2987 ASSERT_TRUE(result != nullptr);
2988 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist
2989 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist
2990 std::string result_str = result->h_name ? result->h_name : "null";
2991 EXPECT_EQ(result_str, "v4only.example.com");
2992 // Check that return address has been mapped from IPv4 to IPv6 address because Netd
2993 // removes NAT64 prefix and does IPv4 DNS reverse lookup in this case. Then, Netd
2994 // fakes the return IPv4 address as original queried IPv6 address.
2995 result_str = ToString(result);
2996 EXPECT_EQ(result_str, "64:ff9b::102:304");
2997 dns.clearQueries();
2998
2999 // Synthesized PTR record exists on DNS server
3000 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
3001 // Expect to Netd pass through synthesized address for DNS queries.
3002 inet_pton(AF_INET6, "64:ff9b::5.6.7.8", &v6addr);
3003 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3004 ASSERT_TRUE(result != nullptr);
3005 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
3006 result_str = result->h_name ? result->h_name : "null";
3007 EXPECT_EQ(result_str, "v6synthesis.example.com");
3008}
3009
3010TEST_F(ResolverTest, GetHostByAddr_ReverseDns64QueryFromHostFile) {
3011 constexpr char dns64_name[] = "ipv4only.arpa.";
3012 constexpr char host_name[] = "localhost";
3013 // The address is synthesized by prefix64:localhost.
3014 constexpr char host_addr[] = "64:ff9b::7f00:1";
nuccachena26cc2a2018-07-17 18:07:23 +08003015 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003016
3017 test::DNSResponder dns(listen_addr);
3018 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003019 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003020 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003021
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003022 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003023 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003024 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003025
3026 // Using synthesized "localhost" address to be a trick for resolving host name
3027 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
3028 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
3029 struct in6_addr v6addr;
3030 inet_pton(AF_INET6, host_addr, &v6addr);
3031 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3032 ASSERT_TRUE(result != nullptr);
3033 // Expect no DNS queries; localhost is resolved via /etc/hosts.
3034 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
3035
Luke Huangf8215372019-11-22 11:53:41 +08003036 ASSERT_EQ(sizeof(in6_addr), (unsigned)result->h_length);
nuccachena26cc2a2018-07-17 18:07:23 +08003037 ASSERT_EQ(AF_INET6, result->h_addrtype);
3038 std::string result_str = ToString(result);
3039 EXPECT_EQ(result_str, host_addr);
3040 result_str = result->h_name ? result->h_name : "null";
3041 EXPECT_EQ(result_str, host_name);
3042}
3043
Hungming Chen9e6185a2019-06-04 16:09:19 +08003044TEST_F(ResolverTest, GetHostByAddr_cnamesClasslessReverseDelegation) {
3045 // IPv4 addresses in the subnet with notation '/' or '-'.
3046 constexpr char addr_slash[] = "192.0.2.1";
3047 constexpr char addr_hyphen[] = "192.0.3.1";
3048
3049 // Used to verify DNS reverse query for classless reverse lookup zone. See detail in RFC 2317
3050 // section 4.
3051 const static std::vector<DnsRecord> records = {
3052 // The records for reverse querying "192.0.2.1" in the subnet with notation '/'.
3053 {"1.2.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0/25.2.0.192.in-addr.arpa."},
3054 {"1.0/25.2.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3055
3056 // The records for reverse querying "192.0.3.1" in the subnet with notation '-'.
3057 {"1.3.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0-127.3.0.192.in-addr.arpa."},
3058 {"1.0-127.3.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3059 };
3060
3061 test::DNSResponder dns;
3062 StartDns(dns, records);
3063 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3064
3065 for (const auto& address : {addr_slash, addr_hyphen}) {
3066 SCOPED_TRACE(address);
3067
3068 in_addr v4addr;
3069 ASSERT_TRUE(inet_pton(AF_INET, address, &v4addr));
3070 hostent* result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
3071 ASSERT_TRUE(result != nullptr);
3072 EXPECT_STREQ("hello.example.com", result->h_name);
3073 }
3074}
3075
nuccachena26cc2a2018-07-17 18:07:23 +08003076TEST_F(ResolverTest, GetNameInfo_ReverseDnsQueryWithHavingNat64Prefix) {
3077 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003078 constexpr char dns64_name[] = "ipv4only.arpa.";
3079 constexpr char ptr_name[] = "v4v6.example.com.";
3080 // PTR record for IPv4 address 1.2.3.4
3081 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3082 // PTR record for IPv6 address 2001:db8::102:304
3083 constexpr char ptr_addr_v6[] =
3084 "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 +09003085 const std::vector<DnsRecord> records = {
3086 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3087 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3088 {ptr_addr_v6, ns_type::ns_t_ptr, ptr_name},
3089 };
nuccachena26cc2a2018-07-17 18:07:23 +08003090
Xiao Ma09b71022018-12-11 17:56:32 +09003091 test::DNSResponder dns(listen_addr);
3092 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003093 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003094 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003095
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003096 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003097 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003098 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003099
Luke Huangf8215372019-11-22 11:53:41 +08003100 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003101 static const struct TestConfig {
3102 int flag;
3103 int family;
3104 std::string addr;
3105 std::string host;
3106
3107 std::string asParameters() const {
3108 return StringPrintf("flag=%d, family=%d, addr=%s, host=%s", flag, family, addr.c_str(),
3109 host.c_str());
3110 }
3111 } testConfigs[]{
3112 {NI_NAMEREQD, AF_INET, "1.2.3.4", "v4v6.example.com"},
3113 {NI_NUMERICHOST, AF_INET, "1.2.3.4", "1.2.3.4"},
3114 {0, AF_INET, "1.2.3.4", "v4v6.example.com"},
3115 {0, AF_INET, "5.6.7.8", "5.6.7.8"}, // unmapped
3116 {NI_NAMEREQD, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
3117 {NI_NUMERICHOST, AF_INET6, "2001:db8::102:304", "2001:db8::102:304"},
3118 {0, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
3119 {0, AF_INET6, "2001:db8::506:708", "2001:db8::506:708"}, // unmapped
3120 };
Luke Huangf8215372019-11-22 11:53:41 +08003121 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003122
3123 // Reverse IPv4/IPv6 DNS query. Prefix should have no effect on it.
3124 for (const auto& config : testConfigs) {
3125 SCOPED_TRACE(config.asParameters());
3126
3127 int rv;
3128 char host[NI_MAXHOST];
3129 struct sockaddr_in sin;
3130 struct sockaddr_in6 sin6;
3131 if (config.family == AF_INET) {
3132 memset(&sin, 0, sizeof(sin));
3133 sin.sin_family = AF_INET;
3134 inet_pton(AF_INET, config.addr.c_str(), &sin.sin_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003135 rv = getnameinfo((const struct sockaddr*)&sin, sizeof(sin), host, sizeof(host), nullptr,
3136 0, config.flag);
nuccachena26cc2a2018-07-17 18:07:23 +08003137 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4));
3138 } else if (config.family == AF_INET6) {
3139 memset(&sin6, 0, sizeof(sin6));
3140 sin6.sin6_family = AF_INET6;
3141 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003142 rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host),
nuccachena26cc2a2018-07-17 18:07:23 +08003143 nullptr, 0, config.flag);
3144 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6));
3145 }
3146 ASSERT_EQ(0, rv);
3147 std::string result_str = host;
3148 EXPECT_EQ(result_str, config.host);
3149 dns.clearQueries();
3150 }
3151}
3152
3153TEST_F(ResolverTest, GetNameInfo_ReverseDns64Query) {
3154 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003155 constexpr char dns64_name[] = "ipv4only.arpa.";
3156 constexpr char ptr_name[] = "v4only.example.com.";
3157 // PTR record for IPv4 address 1.2.3.4
3158 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3159 // PTR record for IPv6 address 64:ff9b::1.2.3.4
3160 constexpr char ptr_addr_v6_nomapping[] =
3161 "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.";
3162 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
3163 // PTR record for IPv6 address 64:ff9b::5.6.7.8
3164 constexpr char ptr_addr_v6_synthesis[] =
3165 "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 +09003166 const std::vector<DnsRecord> records = {
3167 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3168 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3169 {ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis},
3170 };
nuccachena26cc2a2018-07-17 18:07:23 +08003171
Xiao Ma09b71022018-12-11 17:56:32 +09003172 test::DNSResponder dns(listen_addr);
3173 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003174 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003175 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003176
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003177 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003178 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003179 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003180
Luke Huangf8215372019-11-22 11:53:41 +08003181 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003182 static const struct TestConfig {
3183 bool hasSynthesizedPtrRecord;
3184 int flag;
3185 std::string addr;
3186 std::string host;
3187
3188 std::string asParameters() const {
3189 return StringPrintf("hasSynthesizedPtrRecord=%d, flag=%d, addr=%s, host=%s",
3190 hasSynthesizedPtrRecord, flag, addr.c_str(), host.c_str());
3191 }
3192 } testConfigs[]{
3193 {false, NI_NAMEREQD, "64:ff9b::102:304", "v4only.example.com"},
3194 {false, NI_NUMERICHOST, "64:ff9b::102:304", "64:ff9b::102:304"},
3195 {false, 0, "64:ff9b::102:304", "v4only.example.com"},
3196 {true, NI_NAMEREQD, "64:ff9b::506:708", "v6synthesis.example.com"},
3197 {true, NI_NUMERICHOST, "64:ff9b::506:708", "64:ff9b::506:708"},
3198 {true, 0, "64:ff9b::506:708", "v6synthesis.example.com"}
3199 };
Luke Huangf8215372019-11-22 11:53:41 +08003200 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003201
3202 // hasSynthesizedPtrRecord = false
3203 // Synthesized PTR record doesn't exist on DNS server
3204 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
3205 // After querying synthesized address failed, expect that prefix is removed from IPv6
3206 // synthesized address and do reverse IPv4 query instead.
3207 //
3208 // hasSynthesizedPtrRecord = true
3209 // Synthesized PTR record exists on DNS server
3210 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
3211 // Expect to just pass through synthesized address for DNS queries.
3212 for (const auto& config : testConfigs) {
3213 SCOPED_TRACE(config.asParameters());
3214
3215 char host[NI_MAXHOST];
3216 struct sockaddr_in6 sin6;
3217 memset(&sin6, 0, sizeof(sin6));
3218 sin6.sin6_family = AF_INET6;
3219 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003220 int rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host),
nuccachena26cc2a2018-07-17 18:07:23 +08003221 nullptr, 0, config.flag);
3222 ASSERT_EQ(0, rv);
3223 if (config.flag == NI_NAMEREQD) {
3224 if (config.hasSynthesizedPtrRecord) {
3225 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
3226 } else {
3227 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist.
3228 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist.
3229 }
3230 }
3231 std::string result_str = host;
3232 EXPECT_EQ(result_str, config.host);
3233 dns.clearQueries();
3234 }
3235}
3236
3237TEST_F(ResolverTest, GetNameInfo_ReverseDns64QueryFromHostFile) {
3238 constexpr char dns64_name[] = "ipv4only.arpa.";
3239 constexpr char host_name[] = "localhost";
3240 // The address is synthesized by prefix64:localhost.
3241 constexpr char host_addr[] = "64:ff9b::7f00:1";
nuccachena26cc2a2018-07-17 18:07:23 +08003242 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003243
3244 test::DNSResponder dns(listen_addr);
3245 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003246 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003247 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003248
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003249 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003250 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003251 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003252
3253 // Using synthesized "localhost" address to be a trick for resolving host name
3254 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
3255 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
3256 char host[NI_MAXHOST];
Xiao Ma09b71022018-12-11 17:56:32 +09003257 struct sockaddr_in6 sin6 = {.sin6_family = AF_INET6};
nuccachena26cc2a2018-07-17 18:07:23 +08003258 inet_pton(AF_INET6, host_addr, &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003259 int rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host), nullptr,
nuccachena26cc2a2018-07-17 18:07:23 +08003260 0, NI_NAMEREQD);
3261 ASSERT_EQ(0, rv);
3262 // Expect no DNS queries; localhost is resolved via /etc/hosts.
3263 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
3264
3265 std::string result_str = host;
3266 EXPECT_EQ(result_str, host_name);
3267}
3268
Hungming Chen9e6185a2019-06-04 16:09:19 +08003269TEST_F(ResolverTest, GetNameInfo_cnamesClasslessReverseDelegation) {
3270 // IPv4 addresses in the subnet with notation '/' or '-'.
3271 constexpr char addr_slash[] = "192.0.2.1";
3272 constexpr char addr_hyphen[] = "192.0.3.1";
3273
3274 // Used to verify DNS reverse query for classless reverse lookup zone. See detail in RFC 2317
3275 // section 4.
3276 const static std::vector<DnsRecord> records = {
3277 // The records for reverse querying "192.0.2.1" in the subnet with notation '/'.
3278 {"1.2.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0/25.2.0.192.in-addr.arpa."},
3279 {"1.0/25.2.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3280
3281 // The records for reverse querying "192.0.3.1" in the subnet with notation '-'.
3282 {"1.3.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0-127.3.0.192.in-addr.arpa."},
3283 {"1.0-127.3.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3284 };
3285
3286 test::DNSResponder dns;
3287 StartDns(dns, records);
3288 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3289
3290 for (const auto& address : {addr_slash, addr_hyphen}) {
3291 SCOPED_TRACE(address);
3292
3293 char host[NI_MAXHOST];
3294 sockaddr_in sin = {.sin_family = AF_INET};
3295 ASSERT_TRUE(inet_pton(AF_INET, address, &sin.sin_addr));
3296 int rv = getnameinfo((const sockaddr*)&sin, sizeof(sin), host, sizeof(host), nullptr, 0,
3297 NI_NAMEREQD);
3298 ASSERT_EQ(0, rv);
3299 EXPECT_STREQ("hello.example.com", host);
3300 }
3301}
3302
nuccachena26cc2a2018-07-17 18:07:23 +08003303TEST_F(ResolverTest, GetHostByName2_Dns64Synthesize) {
Xiao Ma09b71022018-12-11 17:56:32 +09003304 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003305 constexpr char dns64_name[] = "ipv4only.arpa.";
3306 constexpr char host_name[] = "ipv4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003307 const std::vector<DnsRecord> records = {
3308 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3309 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3310 };
nuccachena26cc2a2018-07-17 18:07:23 +08003311
Xiao Ma09b71022018-12-11 17:56:32 +09003312 test::DNSResponder dns(listen_addr);
3313 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003314 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003315 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003316
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003317 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003318 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003319 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003320
3321 // Query an IPv4-only hostname. Expect that gets a synthesized address.
3322 struct hostent* result = gethostbyname2("ipv4only", AF_INET6);
3323 ASSERT_TRUE(result != nullptr);
3324 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3325 std::string result_str = ToString(result);
3326 EXPECT_EQ(result_str, "64:ff9b::102:304");
3327}
nuccachena26cc2a2018-07-17 18:07:23 +08003328
3329TEST_F(ResolverTest, GetHostByName2_DnsQueryWithHavingNat64Prefix) {
3330 constexpr char dns64_name[] = "ipv4only.arpa.";
3331 constexpr char host_name[] = "v4v6.example.com.";
nuccachena26cc2a2018-07-17 18:07:23 +08003332 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003333 const std::vector<DnsRecord> records = {
3334 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3335 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3336 {host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
3337 };
3338
3339 test::DNSResponder dns(listen_addr);
3340 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003341 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003342 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003343
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003344 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003345 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003346 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003347
3348 // IPv4 DNS query. Prefix should have no effect on it.
3349 struct hostent* result = gethostbyname2("v4v6", AF_INET);
3350 ASSERT_TRUE(result != nullptr);
3351 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3352 std::string result_str = ToString(result);
3353 EXPECT_EQ(result_str, "1.2.3.4");
3354 dns.clearQueries();
3355
3356 // IPv6 DNS query. Prefix should have no effect on it.
3357 result = gethostbyname2("v4v6", AF_INET6);
3358 ASSERT_TRUE(result != nullptr);
3359 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3360 result_str = ToString(result);
3361 EXPECT_EQ(result_str, "2001:db8::102:304");
3362}
3363
3364TEST_F(ResolverTest, GetHostByName2_Dns64QuerySpecialUseIPv4Addresses) {
3365 constexpr char THIS_NETWORK[] = "this_network";
3366 constexpr char LOOPBACK[] = "loopback";
3367 constexpr char LINK_LOCAL[] = "link_local";
3368 constexpr char MULTICAST[] = "multicast";
3369 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
3370
3371 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
3372 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
3373 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
3374 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
3375 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
3376
3377 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003378 constexpr char dns64_name[] = "ipv4only.arpa.";
3379
Xiao Ma09b71022018-12-11 17:56:32 +09003380 test::DNSResponder dns(listen_addr);
3381 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003382 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003383 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003384
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003385 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003386 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003387 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003388
Luke Huangf8215372019-11-22 11:53:41 +08003389 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003390 static const struct TestConfig {
3391 std::string name;
3392 std::string addr;
3393
3394 std::string asHostName() const {
Luke Huangf8215372019-11-22 11:53:41 +08003395 return StringPrintf("%s.example.com.", name.c_str());
nuccachena26cc2a2018-07-17 18:07:23 +08003396 }
3397 } testConfigs[]{
3398 {THIS_NETWORK, ADDR_THIS_NETWORK},
3399 {LOOPBACK, ADDR_LOOPBACK},
3400 {LINK_LOCAL, ADDR_LINK_LOCAL},
3401 {MULTICAST, ADDR_MULTICAST},
3402 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
3403 };
Luke Huangf8215372019-11-22 11:53:41 +08003404 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003405
3406 for (const auto& config : testConfigs) {
3407 const std::string testHostName = config.asHostName();
3408 SCOPED_TRACE(testHostName);
3409
3410 const char* host_name = testHostName.c_str();
3411 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
3412
3413 struct hostent* result = gethostbyname2(config.name.c_str(), AF_INET6);
3414 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3415
3416 // In AF_INET6 case, don't synthesize special use IPv4 address.
3417 // Expect to have no answer
3418 EXPECT_EQ(nullptr, result);
3419
3420 dns.clearQueries();
3421 }
Bernie Innocenti2fef2b82018-12-20 15:56:40 +09003422}
Mike Yuf14e1a92019-05-10 13:54:58 +08003423
3424TEST_F(ResolverTest, PrefixDiscoveryBypassTls) {
3425 constexpr char listen_addr[] = "::1";
3426 constexpr char cleartext_port[] = "53";
3427 constexpr char tls_port[] = "853";
3428 constexpr char dns64_name[] = "ipv4only.arpa.";
3429 const std::vector<std::string> servers = {listen_addr};
3430
3431 test::DNSResponder dns(listen_addr);
3432 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
3433 test::DnsTlsFrontend tls(listen_addr, tls_port, listen_addr, cleartext_port);
3434 ASSERT_TRUE(tls.startServer());
3435
3436 // Setup OPPORTUNISTIC mode and wait for the validation complete.
waynema0e73c2e2019-07-31 15:04:08 +08003437 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08003438 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Mike Yuf14e1a92019-05-10 13:54:58 +08003439 tls.clearQueries();
3440
3441 // Start NAT64 prefix discovery and wait for it complete.
3442 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003443 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
Mike Yuf14e1a92019-05-10 13:54:58 +08003444
3445 // Verify it bypassed TLS even though there's a TLS server available.
3446 EXPECT_EQ(0, tls.queries());
3447 EXPECT_EQ(1U, GetNumQueries(dns, dns64_name));
3448
3449 // Restart the testing network to reset the cache.
3450 mDnsClient.TearDown();
3451 mDnsClient.SetUp();
3452 dns.clearQueries();
3453
3454 // Setup STRICT mode and wait for the validation complete.
waynema0e73c2e2019-07-31 15:04:08 +08003455 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
3456 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08003457 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Mike Yuf14e1a92019-05-10 13:54:58 +08003458 tls.clearQueries();
3459
3460 // Start NAT64 prefix discovery and wait for it to complete.
3461 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003462 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
Mike Yuf14e1a92019-05-10 13:54:58 +08003463
3464 // Verify it bypassed TLS despite STRICT mode.
3465 EXPECT_EQ(0, tls.queries());
3466 EXPECT_EQ(1U, GetNumQueries(dns, dns64_name));
3467}
Luke Huang9807e6b2019-05-20 16:17:12 +08003468
3469namespace {
3470
Luke Huang0d592bc2019-05-25 18:24:03 +08003471class ScopedSetNetworkForProcess {
3472 public:
3473 explicit ScopedSetNetworkForProcess(unsigned netId) {
3474 mStoredNetId = getNetworkForProcess();
3475 if (netId == mStoredNetId) return;
3476 EXPECT_EQ(0, setNetworkForProcess(netId));
3477 }
3478 ~ScopedSetNetworkForProcess() { EXPECT_EQ(0, setNetworkForProcess(mStoredNetId)); }
3479
3480 private:
3481 unsigned mStoredNetId;
3482};
3483
3484class ScopedSetNetworkForResolv {
3485 public:
3486 explicit ScopedSetNetworkForResolv(unsigned netId) { EXPECT_EQ(0, setNetworkForResolv(netId)); }
3487 ~ScopedSetNetworkForResolv() { EXPECT_EQ(0, setNetworkForResolv(NETID_UNSET)); }
3488};
3489
Luke Huang9807e6b2019-05-20 16:17:12 +08003490void sendCommand(int fd, const std::string& cmd) {
3491 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size() + 1));
3492 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size() + 1));
3493}
3494
3495int32_t readBE32(int fd) {
3496 int32_t tmp;
3497 int n = TEMP_FAILURE_RETRY(read(fd, &tmp, sizeof(tmp)));
3498 EXPECT_TRUE(n > 0);
3499 return ntohl(tmp);
3500}
3501
Luke Huang0d592bc2019-05-25 18:24:03 +08003502int readResponseCode(int fd) {
Luke Huang9807e6b2019-05-20 16:17:12 +08003503 char buf[4];
3504 int n = TEMP_FAILURE_RETRY(read(fd, &buf, sizeof(buf)));
3505 EXPECT_TRUE(n > 0);
3506 // The format of response code is that 4 bytes for the code & null.
3507 buf[3] = '\0';
3508 int result;
3509 EXPECT_TRUE(ParseInt(buf, &result));
3510 return result;
3511}
3512
Luke Huang0d592bc2019-05-25 18:24:03 +08003513bool checkAndClearUseLocalNameserversFlag(unsigned* netid) {
3514 if (netid == nullptr || ((*netid) & NETID_USE_LOCAL_NAMESERVERS) == 0) {
3515 return false;
3516 }
3517 *netid = (*netid) & ~NETID_USE_LOCAL_NAMESERVERS;
3518 return true;
3519}
3520
Luke Huangf8215372019-11-22 11:53:41 +08003521aidl::android::net::UidRangeParcel makeUidRangeParcel(int start, int stop) {
3522 aidl::android::net::UidRangeParcel res;
Luke Huang0d592bc2019-05-25 18:24:03 +08003523 res.start = start;
3524 res.stop = stop;
3525
3526 return res;
3527}
3528
3529void expectNetIdWithLocalNameserversFlag(unsigned netId) {
3530 unsigned dnsNetId = 0;
3531 EXPECT_EQ(0, getNetworkForDns(&dnsNetId));
3532 EXPECT_TRUE(checkAndClearUseLocalNameserversFlag(&dnsNetId));
3533 EXPECT_EQ(netId, static_cast<unsigned>(dnsNetId));
3534}
3535
3536void expectDnsNetIdEquals(unsigned netId) {
3537 unsigned dnsNetId = 0;
3538 EXPECT_EQ(0, getNetworkForDns(&dnsNetId));
3539 EXPECT_EQ(netId, static_cast<unsigned>(dnsNetId));
3540}
3541
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003542void expectDnsNetIdIsDefaultNetwork(INetd* netdService) {
Luke Huang0d592bc2019-05-25 18:24:03 +08003543 int currentNetid;
3544 EXPECT_TRUE(netdService->networkGetDefault(&currentNetid).isOk());
3545 expectDnsNetIdEquals(currentNetid);
3546}
3547
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003548void expectDnsNetIdWithVpn(INetd* netdService, unsigned vpnNetId, unsigned expectedNetId) {
Luke Huang0d592bc2019-05-25 18:24:03 +08003549 EXPECT_TRUE(netdService->networkCreateVpn(vpnNetId, false /* secure */).isOk());
3550 uid_t uid = getuid();
3551 // Add uid to VPN
3552 EXPECT_TRUE(netdService->networkAddUidRanges(vpnNetId, {makeUidRangeParcel(uid, uid)}).isOk());
3553 expectDnsNetIdEquals(expectedNetId);
3554 EXPECT_TRUE(netdService->networkDestroy(vpnNetId).isOk());
3555}
3556
Luke Huang9807e6b2019-05-20 16:17:12 +08003557} // namespace
3558
3559TEST_F(ResolverTest, getDnsNetId) {
3560 // We've called setNetworkForProcess in SetupOemNetwork, so reset to default first.
3561 setNetworkForProcess(NETID_UNSET);
Luke Huang0d592bc2019-05-25 18:24:03 +08003562
3563 expectDnsNetIdIsDefaultNetwork(mDnsClient.netdService());
3564 expectDnsNetIdWithVpn(mDnsClient.netdService(), TEST_VPN_NETID, TEST_VPN_NETID);
Luke Huang9807e6b2019-05-20 16:17:12 +08003565
3566 // Test with setNetworkForProcess
Luke Huang0d592bc2019-05-25 18:24:03 +08003567 {
3568 ScopedSetNetworkForProcess scopedSetNetworkForProcess(TEST_NETID);
3569 expectDnsNetIdEquals(TEST_NETID);
3570 }
3571
3572 // Test with setNetworkForProcess with NETID_USE_LOCAL_NAMESERVERS
3573 {
3574 ScopedSetNetworkForProcess scopedSetNetworkForProcess(TEST_NETID |
3575 NETID_USE_LOCAL_NAMESERVERS);
3576 expectNetIdWithLocalNameserversFlag(TEST_NETID);
3577 }
Luke Huang9807e6b2019-05-20 16:17:12 +08003578
3579 // Test with setNetworkForResolv
Luke Huang0d592bc2019-05-25 18:24:03 +08003580 {
3581 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID);
3582 expectDnsNetIdEquals(TEST_NETID);
3583 }
3584
3585 // Test with setNetworkForResolv with NETID_USE_LOCAL_NAMESERVERS
3586 {
3587 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID |
3588 NETID_USE_LOCAL_NAMESERVERS);
3589 expectNetIdWithLocalNameserversFlag(TEST_NETID);
3590 }
3591
3592 // Test with setNetworkForResolv under bypassable vpn
3593 {
3594 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID);
3595 expectDnsNetIdWithVpn(mDnsClient.netdService(), TEST_VPN_NETID, TEST_NETID);
3596 }
Luke Huang9807e6b2019-05-20 16:17:12 +08003597
3598 // Create socket connected to DnsProxyListener
3599 int fd = dns_open_proxy();
3600 EXPECT_TRUE(fd > 0);
3601 unique_fd ufd(fd);
3602
3603 // Test command with wrong netId
3604 sendCommand(fd, "getdnsnetid abc");
Luke Huang0d592bc2019-05-25 18:24:03 +08003605 EXPECT_EQ(ResponseCode::DnsProxyQueryResult, readResponseCode(fd));
Luke Huang9807e6b2019-05-20 16:17:12 +08003606 EXPECT_EQ(-EINVAL, readBE32(fd));
3607
3608 // Test unsupported command
3609 sendCommand(fd, "getdnsnetidNotSupported");
3610 // Keep in sync with FrameworkListener.cpp (500, "Command not recognized")
Luke Huang0d592bc2019-05-25 18:24:03 +08003611 EXPECT_EQ(500, readResponseCode(fd));
Luke Huang9807e6b2019-05-20 16:17:12 +08003612}
Sehee Park2c118782019-05-07 13:02:45 +09003613
3614TEST_F(ResolverTest, BlockDnsQueryWithUidRule) {
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003615 // This test relies on blocking traffic on loopback, which xt_qtaguid does not do.
3616 // See aosp/358413 and b/34444781 for why.
3617 SKIP_IF_BPF_NOT_SUPPORTED;
3618
Sehee Park2c118782019-05-07 13:02:45 +09003619 constexpr char listen_addr1[] = "127.0.0.4";
3620 constexpr char listen_addr2[] = "::1";
3621 constexpr char host_name[] = "howdy.example.com.";
3622 const std::vector<DnsRecord> records = {
3623 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3624 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
3625 };
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003626 INetd* netdService = mDnsClient.netdService();
Sehee Park2c118782019-05-07 13:02:45 +09003627
3628 test::DNSResponder dns1(listen_addr1);
3629 test::DNSResponder dns2(listen_addr2);
3630 StartDns(dns1, records);
3631 StartDns(dns2, records);
3632
3633 std::vector<std::string> servers = {listen_addr1, listen_addr2};
3634 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
3635 dns1.clearQueries();
3636 dns2.clearQueries();
3637
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003638 // Add drop rule for TEST_UID. Also enable the standby chain because it might not be enabled.
3639 // Unfortunately we cannot use FIREWALL_CHAIN_NONE, or custom iptables rules, for this purpose
3640 // because netd calls fchown() on the DNS query sockets, and "iptables -m owner" matches the
3641 // UID of the socket creator, not the UID set by fchown().
3642 //
3643 // TODO: migrate FIREWALL_CHAIN_NONE to eBPF as well.
3644 EXPECT_TRUE(netdService->firewallEnableChildChain(INetd::FIREWALL_CHAIN_STANDBY, true).isOk());
3645 EXPECT_TRUE(netdService
Sehee Park2c118782019-05-07 13:02:45 +09003646 ->firewallSetUidRule(INetd::FIREWALL_CHAIN_STANDBY, TEST_UID,
3647 INetd::FIREWALL_RULE_DENY)
3648 .isOk());
3649
3650 // Save uid
3651 int suid = getuid();
3652
3653 // Switch to TEST_UID
3654 EXPECT_TRUE(seteuid(TEST_UID) == 0);
3655
3656 // Dns Query
3657 int fd1 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_a, 0);
3658 int fd2 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_aaaa, 0);
3659 EXPECT_TRUE(fd1 != -1);
3660 EXPECT_TRUE(fd2 != -1);
3661
3662 uint8_t buf[MAXPACKET] = {};
3663 int rcode;
3664 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
3665 EXPECT_EQ(-ECONNREFUSED, res);
3666
3667 memset(buf, 0, MAXPACKET);
3668 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
3669 EXPECT_EQ(-ECONNREFUSED, res);
3670
3671 // Restore uid
3672 EXPECT_TRUE(seteuid(suid) == 0);
3673
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003674 // Remove drop rule for TEST_UID, and disable the standby chain.
3675 EXPECT_TRUE(netdService
Sehee Park2c118782019-05-07 13:02:45 +09003676 ->firewallSetUidRule(INetd::FIREWALL_CHAIN_STANDBY, TEST_UID,
3677 INetd::FIREWALL_RULE_ALLOW)
3678 .isOk());
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003679 EXPECT_TRUE(netdService->firewallEnableChildChain(INetd::FIREWALL_CHAIN_STANDBY, false).isOk());
Sehee Park2c118782019-05-07 13:02:45 +09003680}
Mike Yua772c202019-09-23 17:47:21 +08003681
Mike Yu40e67072019-10-09 21:14:09 +08003682namespace {
3683
3684const std::string kDotConnectTimeoutMsFlag(
3685 "persist.device_config.netd_native.dot_connect_timeout_ms");
3686
3687class ScopedSystemProperties {
3688 public:
3689 explicit ScopedSystemProperties(const std::string& key, const std::string& value)
3690 : mStoredKey(key) {
3691 mStoredValue = android::base::GetProperty(key, "");
3692 android::base::SetProperty(key, value);
3693 }
3694 ~ScopedSystemProperties() { android::base::SetProperty(mStoredKey, mStoredValue); }
3695
3696 private:
3697 std::string mStoredKey;
3698 std::string mStoredValue;
3699};
3700
3701} // namespace
3702
Mike Yua772c202019-09-23 17:47:21 +08003703TEST_F(ResolverTest, ConnectTlsServerTimeout) {
Mike Yu40e67072019-10-09 21:14:09 +08003704 constexpr int expectedTimeout = 1000;
3705 constexpr char hostname1[] = "query1.example.com.";
3706 constexpr char hostname2[] = "query2.example.com.";
Mike Yua772c202019-09-23 17:47:21 +08003707 const std::vector<DnsRecord> records = {
Mike Yu40e67072019-10-09 21:14:09 +08003708 {hostname1, ns_type::ns_t_a, "1.2.3.4"},
3709 {hostname2, ns_type::ns_t_a, "1.2.3.5"},
Mike Yua772c202019-09-23 17:47:21 +08003710 };
3711
3712 test::DNSResponder dns;
3713 StartDns(dns, records);
Mike Yu40e67072019-10-09 21:14:09 +08003714 test::DnsTlsFrontend tls;
Mike Yua772c202019-09-23 17:47:21 +08003715 ASSERT_TRUE(tls.startServer());
3716
Mike Yu40e67072019-10-09 21:14:09 +08003717 // The resolver will adjust the timeout value to 1000ms since the value is too small.
3718 ScopedSystemProperties scopedSystemProperties(kDotConnectTimeoutMsFlag, "100");
Mike Yua772c202019-09-23 17:47:21 +08003719
Mike Yu40e67072019-10-09 21:14:09 +08003720 // Set up resolver to opportunistic mode with the default configuration.
Mike Yu8ac63402019-12-02 15:28:38 +08003721 const ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
Mike Yu40e67072019-10-09 21:14:09 +08003722 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
Mike Yua772c202019-09-23 17:47:21 +08003723 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
3724 dns.clearQueries();
3725 tls.clearQueries();
3726
3727 // The server becomes unresponsive to the handshake request.
3728 tls.setHangOnHandshakeForTesting(true);
3729
3730 // Expect the things happening in getaddrinfo():
3731 // 1. Connect to the private DNS server.
3732 // 2. SSL handshake times out.
3733 // 3. Fallback to UDP transport, and then get the answer.
Mike Yu40e67072019-10-09 21:14:09 +08003734 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
3735 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(hostname1, nullptr, hints);
Mike Yua772c202019-09-23 17:47:21 +08003736
Mike Yu40e67072019-10-09 21:14:09 +08003737 EXPECT_NE(nullptr, result);
Mike Yua772c202019-09-23 17:47:21 +08003738 EXPECT_EQ(0, tls.queries());
Mike Yu40e67072019-10-09 21:14:09 +08003739 EXPECT_EQ(1U, GetNumQueries(dns, hostname1));
3740 EXPECT_EQ(records.at(0).addr, ToString(result));
Mike Yua772c202019-09-23 17:47:21 +08003741
Mike Yu40e67072019-10-09 21:14:09 +08003742 // A loose upper bound is set by adding 2000ms buffer time. Theoretically, getaddrinfo()
3743 // should just take a bit more than expetTimeout milliseconds.
3744 EXPECT_GE(timeTakenMs, expectedTimeout);
3745 EXPECT_LE(timeTakenMs, expectedTimeout + 2000);
3746
3747 // Set the server to be responsive. Verify that the resolver will attempt to reconnect
3748 // to the server and then get the result within the timeout.
3749 tls.setHangOnHandshakeForTesting(false);
3750 std::tie(result, timeTakenMs) = safe_getaddrinfo_time_taken(hostname2, nullptr, hints);
3751
3752 EXPECT_NE(nullptr, result);
3753 EXPECT_EQ(1, tls.queries());
3754 EXPECT_EQ(1U, GetNumQueries(dns, hostname2));
3755 EXPECT_EQ(records.at(1).addr, ToString(result));
3756
3757 EXPECT_LE(timeTakenMs, expectedTimeout);
Mike Yua772c202019-09-23 17:47:21 +08003758}
Hungming Chenbb90ab32019-10-28 18:20:31 +08003759
Ken Chen766feae2019-10-30 15:13:44 +08003760TEST_F(ResolverTest, FlushNetworkCache) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08003761 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08003762 test::DNSResponder dns;
3763 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
3764 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3765
3766 const hostent* result = gethostbyname("hello");
3767 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
3768
3769 // get result from cache
3770 result = gethostbyname("hello");
3771 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
3772
3773 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
3774
3775 result = gethostbyname("hello");
3776 EXPECT_EQ(2U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
3777}
3778
3779TEST_F(ResolverTest, FlushNetworkCache_random) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08003780 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08003781 constexpr int num_flush = 10;
3782 constexpr int num_queries = 20;
3783 test::DNSResponder dns;
3784 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
3785 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3786 const addrinfo hints = {.ai_family = AF_INET};
3787
3788 std::thread t([this]() {
3789 for (int i = 0; i < num_flush; ++i) {
3790 unsigned delay = arc4random_uniform(10 * 1000); // 10ms
3791 usleep(delay);
3792 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
3793 }
3794 });
3795
3796 for (int i = 0; i < num_queries; ++i) {
3797 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
3798 EXPECT_TRUE(result != nullptr);
3799 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
3800 }
3801 t.join();
3802}
3803
3804// flush cache while one query is wait-for-response, another is pending.
3805TEST_F(ResolverTest, FlushNetworkCache_concurrent) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08003806 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08003807 const char* listen_addr1 = "127.0.0.9";
3808 const char* listen_addr2 = "127.0.0.10";
3809 test::DNSResponder dns1(listen_addr1);
3810 test::DNSResponder dns2(listen_addr2);
3811 StartDns(dns1, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
3812 StartDns(dns2, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
3813 addrinfo hints = {.ai_family = AF_INET};
3814
3815 // step 1: set server#1 into deferred responding mode
3816 dns1.setDeferredResp(true);
3817 std::thread t1([&listen_addr1, &hints, this]() {
3818 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr1}));
3819 // step 3: query
3820 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
3821 // step 9: check result
3822 EXPECT_TRUE(result != nullptr);
3823 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
3824 });
3825
3826 // step 2: wait for the query to reach the server
3827 while (GetNumQueries(dns1, kHelloExampleCom) == 0) {
3828 usleep(1000); // 1ms
3829 }
3830
3831 std::thread t2([&listen_addr2, &hints, &dns2, this]() {
3832 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr2}));
3833 // step 5: query (should be blocked in resolver)
3834 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
3835 // step 7: check result
3836 EXPECT_TRUE(result != nullptr);
3837 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
3838 EXPECT_EQ(1U, GetNumQueriesForType(dns2, ns_type::ns_t_a, kHelloExampleCom));
3839 });
3840
3841 // step 4: wait a bit for the 2nd query to enter pending state
3842 usleep(100 * 1000); // 100ms
3843 // step 6: flush cache (will unblock pending queries)
3844 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
3845 t2.join();
3846
3847 // step 8: resume server#1
3848 dns1.setDeferredResp(false);
3849 t1.join();
3850
3851 // step 10: verify if result is correctly cached
3852 dns2.clearQueries();
3853 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
3854 EXPECT_EQ(0U, GetNumQueries(dns2, kHelloExampleCom));
3855 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
3856}
3857
waynema29253052019-08-20 11:26:08 +08003858// TODO: Perhaps to have a boundary conditions test for TCP and UDP.
3859TEST_F(ResolverTest, TcpQueryWithOversizePayload) {
3860 test::DNSResponder dns;
3861 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
3862 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3863
3864 int fd = dns_open_proxy();
3865 ASSERT_TRUE(fd > 0);
3866
3867 // Sending DNS query over TCP once the packet sizes exceed 512 bytes.
3868 // The raw data is combined with Question section and Additional section
3869 // Question section : query "hello.example.com", type A, class IN
3870 // Additional section : type OPT (41), Option PADDING, Option Length 546
3871 // Padding option which allows DNS clients and servers to artificially
3872 // increase the size of a DNS message by a variable number of bytes.
3873 // See also RFC7830, section 3
3874 const std::string query =
3875 "+c0BAAABAAAAAAABBWhlbGxvB2V4YW1wbGUDY29tAAABAAEAACkgAAAAgAACJgAMAiIAAAAAAAAAAAAAAAAAA"
3876 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
3877 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
3878 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
3879 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
3880 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
3881 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
3882 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
3883 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
3884 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
3885 const std::string cmd =
3886 "resnsend " + std::to_string(TEST_NETID) + " 0 " /* ResNsendFlags */ + query + '\0';
3887 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
3888 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
3889 expectAnswersValid(fd, AF_INET, kHelloExampleComAddrV4);
3890 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom));
3891 EXPECT_EQ(0U, GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom));
3892}
3893
Hungming Chenbb90ab32019-10-28 18:20:31 +08003894// Parameterized tests.
3895// TODO: Merge the existing tests as parameterized test if possible.
3896// TODO: Perhaps move parameterized tests to an independent file.
3897enum class CallType { GETADDRINFO, GETHOSTBYNAME };
3898class ResolverParameterizedTest : public ResolverTest,
Hungming Chen63779052019-10-30 15:06:13 +08003899 public testing::WithParamInterface<CallType> {
3900 protected:
Hungming Chen22617fd2019-12-06 12:15:45 +08003901 void VerifyQueryHelloExampleComV4(const test::DNSResponder& dns, const CallType calltype,
3902 const bool verifyNumQueries = true) {
Hungming Chen63779052019-10-30 15:06:13 +08003903 if (calltype == CallType::GETADDRINFO) {
3904 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
3905 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
3906 ASSERT_TRUE(result != nullptr);
3907 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
3908 } else if (calltype == CallType::GETHOSTBYNAME) {
3909 const hostent* result = gethostbyname("hello");
3910 ASSERT_TRUE(result != nullptr);
3911 ASSERT_EQ(4, result->h_length);
3912 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
3913 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
3914 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
3915 } else {
3916 FAIL() << "Unsupported call type: " << static_cast<uint32_t>(calltype);
3917 }
Hungming Chen22617fd2019-12-06 12:15:45 +08003918 if (verifyNumQueries) EXPECT_EQ(1U, GetNumQueries(dns, kHelloExampleCom));
Hungming Chen63779052019-10-30 15:06:13 +08003919 }
3920};
Hungming Chenbb90ab32019-10-28 18:20:31 +08003921
Hungming Chen63779052019-10-30 15:06:13 +08003922INSTANTIATE_TEST_SUITE_P(QueryCallTest, ResolverParameterizedTest,
Hungming Chenbb90ab32019-10-28 18:20:31 +08003923 testing::Values(CallType::GETADDRINFO, CallType::GETHOSTBYNAME),
3924 [](const testing::TestParamInfo<CallType>& info) {
Hungming Chenbb90ab32019-10-28 18:20:31 +08003925 switch (info.param) {
3926 case CallType::GETADDRINFO:
Hungming Chen63779052019-10-30 15:06:13 +08003927 return "GetAddrInfo";
Hungming Chenbb90ab32019-10-28 18:20:31 +08003928 case CallType::GETHOSTBYNAME:
Hungming Chen63779052019-10-30 15:06:13 +08003929 return "GetHostByName";
Hungming Chenbb90ab32019-10-28 18:20:31 +08003930 default:
Hungming Chen63779052019-10-30 15:06:13 +08003931 return "InvalidParameter"; // Should not happen.
Hungming Chenbb90ab32019-10-28 18:20:31 +08003932 }
Hungming Chenbb90ab32019-10-28 18:20:31 +08003933 });
3934
3935TEST_P(ResolverParameterizedTest, AuthoritySectionAndAdditionalSection) {
3936 // DNS response may have more information in authority section and additional section.
3937 // Currently, getanswer() of packages/modules/DnsResolver/getaddrinfo.cpp doesn't parse the
3938 // content of authority section and additional section. Test these sections if they crash
3939 // the resolver, just in case. See also RFC 1035 section 4.1.
3940 const auto& calltype = GetParam();
3941 test::DNSHeader header(kDefaultDnsHeader);
3942
3943 // Create a DNS response which has a authoritative nameserver record in authority
3944 // section and its relevant address record in additional section.
3945 //
3946 // Question
3947 // hello.example.com. IN A
3948 // Answer
3949 // hello.example.com. IN A 1.2.3.4
3950 // Authority:
3951 // hello.example.com. IN NS ns1.example.com.
3952 // Additional:
3953 // ns1.example.com. IN A 5.6.7.8
3954 //
3955 // A response may have only question, answer, and authority section. Current testing response
3956 // should be able to cover this condition.
3957
3958 // Question section.
3959 test::DNSQuestion question{
3960 .qname = {.name = kHelloExampleCom},
3961 .qtype = ns_type::ns_t_a,
3962 .qclass = ns_c_in,
3963 };
3964 header.questions.push_back(std::move(question));
3965
3966 // Answer section.
3967 test::DNSRecord recordAnswer{
3968 .name = {.name = kHelloExampleCom},
3969 .rtype = ns_type::ns_t_a,
3970 .rclass = ns_c_in,
3971 .ttl = 0, // no cache
3972 };
Hungming Chen63779052019-10-30 15:06:13 +08003973 EXPECT_TRUE(test::DNSResponder::fillRdata(kHelloExampleComAddrV4, recordAnswer));
Hungming Chenbb90ab32019-10-28 18:20:31 +08003974 header.answers.push_back(std::move(recordAnswer));
3975
3976 // Authority section.
3977 test::DNSRecord recordAuthority{
3978 .name = {.name = kHelloExampleCom},
3979 .rtype = ns_type::ns_t_ns,
3980 .rclass = ns_c_in,
3981 .ttl = 0, // no cache
3982 };
3983 EXPECT_TRUE(test::DNSResponder::fillRdata("ns1.example.com.", recordAuthority));
3984 header.authorities.push_back(std::move(recordAuthority));
3985
3986 // Additional section.
3987 test::DNSRecord recordAdditional{
3988 .name = {.name = "ns1.example.com."},
3989 .rtype = ns_type::ns_t_a,
3990 .rclass = ns_c_in,
3991 .ttl = 0, // no cache
3992 };
3993 EXPECT_TRUE(test::DNSResponder::fillRdata("5.6.7.8", recordAdditional));
3994 header.additionals.push_back(std::move(recordAdditional));
3995
3996 // Start DNS server.
3997 test::DNSResponder dns(test::DNSResponder::MappingType::DNS_HEADER);
3998 dns.addMappingDnsHeader(kHelloExampleCom, ns_type::ns_t_a, header);
3999 ASSERT_TRUE(dns.startServer());
4000 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4001 dns.clearQueries();
4002
4003 // Expect that get the address and the resolver doesn't crash.
Hungming Chen63779052019-10-30 15:06:13 +08004004 VerifyQueryHelloExampleComV4(dns, calltype);
4005}
4006
4007TEST_P(ResolverParameterizedTest, MessageCompression) {
4008 const auto& calltype = GetParam();
4009
4010 // The response with compressed domain name by a pointer. See RFC 1035 section 4.1.4.
4011 //
4012 // Ignoring the other fields of the message, the domain name of question section and answer
4013 // section are presented as:
4014 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4015 // 12 | 5 | h |
4016 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4017 // 14 | e | l |
4018 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4019 // 16 | l | o |
4020 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4021 // 18 | 7 | e |
4022 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4023 // 20 | x | a |
4024 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4025 // 22 | m | p |
4026 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4027 // 24 | l | e |
4028 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4029 // 26 | 3 | c |
4030 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4031 // 28 | o | m |
4032 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4033 // 30 | 0 | ... |
4034 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4035 //
4036 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4037 // 35 | 1 1| 12 |
4038 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4039 const std::vector<uint8_t> kResponseAPointer = {
4040 /* Header */
4041 0x00, 0x00, /* Transaction ID: 0x0000 */
4042 0x81, 0x80, /* Flags: qr rd ra */
4043 0x00, 0x01, /* Questions: 1 */
4044 0x00, 0x01, /* Answer RRs: 1 */
4045 0x00, 0x00, /* Authority RRs: 0 */
4046 0x00, 0x00, /* Additional RRs: 0 */
4047 /* Queries */
4048 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
4049 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name: hello.example.com */
4050 0x00, 0x01, /* Type: A */
4051 0x00, 0x01, /* Class: IN */
4052 /* Answers */
4053 0xc0, 0x0c, /* Name: hello.example.com (a pointer) */
4054 0x00, 0x01, /* Type: A */
4055 0x00, 0x01, /* Class: IN */
4056 0x00, 0x00, 0x00, 0x00, /* Time to live: 0 */
4057 0x00, 0x04, /* Data length: 4 */
4058 0x01, 0x02, 0x03, 0x04 /* Address: 1.2.3.4 */
4059 };
4060
4061 // The response with compressed domain name by a sequence of labels ending with a pointer. See
4062 // RFC 1035 section 4.1.4.
4063 //
4064 // Ignoring the other fields of the message, the domain name of question section and answer
4065 // section are presented as:
4066 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4067 // 12 | 5 | h |
4068 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4069 // 14 | e | l |
4070 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4071 // 16 | l | o |
4072 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4073 // 18 | 7 | e |
4074 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4075 // 20 | x | a |
4076 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4077 // 22 | m | p |
4078 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4079 // 24 | l | e |
4080 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4081 // 26 | 3 | c |
4082 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4083 // 28 | o | m |
4084 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4085 // 30 | 0 | ... |
4086 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4087 //
4088 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4089 // 35 | 5 | h |
4090 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4091 // 37 | e | l |
4092 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4093 // 39 | l | o |
4094 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4095 // 41 | 1 1| 18 |
4096 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4097 const std::vector<uint8_t> kResponseLabelEndingWithAPointer = {
4098 /* Header */
4099 0x00, 0x00, /* Transaction ID: 0x0000 */
4100 0x81, 0x80, /* Flags: qr rd ra */
4101 0x00, 0x01, /* Questions: 1 */
4102 0x00, 0x01, /* Answer RRs: 1 */
4103 0x00, 0x00, /* Authority RRs: 0 */
4104 0x00, 0x00, /* Additional RRs: 0 */
4105 /* Queries */
4106 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
4107 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name: hello.example.com */
4108 0x00, 0x01, /* Type: A */
4109 0x00, 0x01, /* Class: IN */
4110 /* Answers */
4111 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0xc0,
4112 0x12, /* Name: hello.example.com (a label ending with a pointer) */
4113 0x00, 0x01, /* Type: A */
4114 0x00, 0x01, /* Class: IN */
4115 0x00, 0x00, 0x00, 0x00, /* Time to live: 0 */
4116 0x00, 0x04, /* Data length: 4 */
4117 0x01, 0x02, 0x03, 0x04 /* Address: 1.2.3.4 */
4118 };
4119
4120 for (const auto& response : {kResponseAPointer, kResponseLabelEndingWithAPointer}) {
4121 SCOPED_TRACE(StringPrintf("Hex dump: %s", toHex(makeSlice(response)).c_str()));
4122
4123 test::DNSResponder dns(test::DNSResponder::MappingType::BINARY_PACKET);
4124 dns.addMappingBinaryPacket(kHelloExampleComQueryV4, response);
4125 StartDns(dns, {});
4126 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4127
4128 // Expect no cache because the TTL of testing responses are 0.
4129 VerifyQueryHelloExampleComV4(dns, calltype);
Hungming Chenbb90ab32019-10-28 18:20:31 +08004130 }
Mike Yu40e67072019-10-09 21:14:09 +08004131}
Hungming Chen22617fd2019-12-06 12:15:45 +08004132
4133TEST_P(ResolverParameterizedTest, TruncatedResponse) {
4134 const auto& calltype = GetParam();
4135
4136 const size_t kMaxmiumLabelSize = 63; // see RFC 1035 section 2.3.4.
4137 const std::string kDomainName = ".example.com.";
4138 const std::string kCnameA = std::string(kMaxmiumLabelSize, 'a') + kDomainName;
4139 const std::string kCnameB = std::string(kMaxmiumLabelSize, 'b') + kDomainName;
4140 const std::string kCnameC = std::string(kMaxmiumLabelSize, 'c') + kDomainName;
4141 const std::string kCnameD = std::string(kMaxmiumLabelSize, 'd') + kDomainName;
4142
4143 // Build a response message which exceeds 512 bytes by CNAME chain.
4144 //
4145 // Ignoring the other fields of the message, the response message has 8 CNAMEs in 5 answer RRs
4146 // and each CNAME has 77 bytes as the follows. The response message at least has 616 bytes in
4147 // answer section and has already exceeded 512 bytes totally.
4148 //
4149 // The CNAME is presented as:
4150 // 0 1 64 65 72 73 76 77
4151 // +---+--........--+---+---+---+---+---+---+---+---+---+---+---+---+---+
4152 // | 63| {x, .., x} | 7 | e | x | a | m | p | l | e | 3 | c | o | m | 0 |
4153 // +---+--........--+---+---+---+---+---+---+---+---+---+---+---+---+---+
4154 // ^-- x = {a, b, c, d}
4155 //
4156 const std::vector<DnsRecord> records = {
4157 {kHelloExampleCom, ns_type::ns_t_cname, kCnameA},
4158 {kCnameA, ns_type::ns_t_cname, kCnameB},
4159 {kCnameB, ns_type::ns_t_cname, kCnameC},
4160 {kCnameC, ns_type::ns_t_cname, kCnameD},
4161 {kCnameD, ns_type::ns_t_a, kHelloExampleComAddrV4},
4162 };
4163 test::DNSResponder dns;
4164 StartDns(dns, records);
4165 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4166
4167 // Expect UDP response is truncated. The resolver retries over TCP. See RFC 1035 section 4.2.1.
4168 VerifyQueryHelloExampleComV4(dns, calltype, false);
4169 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom));
4170 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom));
4171}