blob: cc033accaa179bc1bfdc92b9e57250a0bb013e76 [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,
Nick Desaulnierscd6395a2019-10-11 09:15:24 -0700566 .ai_protocol = ANY,
Luke Huangd8ac4752019-06-18 17:05:47 +0800567 };
568 addrinfo* result = nullptr;
569 // This is a valid hint, but the query won't be sent because the socket type is
570 // not supported.
571 EXPECT_EQ(EAI_NODATA, getaddrinfo("hello", nullptr, &hints, &result));
572 ScopedAddrinfo result_cleanup(result);
573 EXPECT_EQ(nullptr, result);
574}
575
Ken Chen92bed612018-12-22 21:46:55 +0800576// Verify if the resolver correctly handle multiple queries simultaneously
577// step 1: set dns server#1 into deferred responding mode.
578// step 2: thread#1 query "hello.example.com." --> resolver send query to server#1.
579// step 3: thread#2 query "hello.example.com." --> resolver hold the request and wait for
580// response of previous pending query sent by thread#1.
581// step 4: thread#3 query "konbanha.example.com." --> resolver send query to server#3. Server
582// respond to resolver immediately.
583// step 5: check if server#1 get 1 query by thread#1, server#2 get 0 query, server#3 get 1 query.
584// step 6: resume dns server#1 to respond dns query in step#2.
585// step 7: thread#1 and #2 should get returned from DNS query after step#6. Also, check the
586// number of queries in server#2 is 0 to ensure thread#2 does not wake up unexpectedly
587// before signaled by thread#1.
588TEST_F(ResolverTest, GetAddrInfoV4_deferred_resp) {
589 const char* listen_addr1 = "127.0.0.9";
590 const char* listen_addr2 = "127.0.0.10";
591 const char* listen_addr3 = "127.0.0.11";
592 const char* listen_srv = "53";
593 const char* host_name_deferred = "hello.example.com.";
594 const char* host_name_normal = "konbanha.example.com.";
Mike Yufc125e42019-05-15 20:41:28 +0800595 test::DNSResponder dns1(listen_addr1, listen_srv, ns_rcode::ns_r_servfail);
596 test::DNSResponder dns2(listen_addr2, listen_srv, ns_rcode::ns_r_servfail);
597 test::DNSResponder dns3(listen_addr3, listen_srv, ns_rcode::ns_r_servfail);
Ken Chen92bed612018-12-22 21:46:55 +0800598 dns1.addMapping(host_name_deferred, ns_type::ns_t_a, "1.2.3.4");
599 dns2.addMapping(host_name_deferred, ns_type::ns_t_a, "1.2.3.4");
600 dns3.addMapping(host_name_normal, ns_type::ns_t_a, "1.2.3.5");
601 ASSERT_TRUE(dns1.startServer());
602 ASSERT_TRUE(dns2.startServer());
603 ASSERT_TRUE(dns3.startServer());
604 const std::vector<std::string> servers_for_t1 = {listen_addr1};
605 const std::vector<std::string> servers_for_t2 = {listen_addr2};
606 const std::vector<std::string> servers_for_t3 = {listen_addr3};
607 addrinfo hints = {.ai_family = AF_INET};
608 const std::vector<int> params = {300, 25, 8, 8, 5000};
609 bool t3_task_done = false;
610
611 dns1.setDeferredResp(true);
612 std::thread t1([&, this]() {
613 ASSERT_TRUE(
614 mDnsClient.SetResolversForNetwork(servers_for_t1, kDefaultSearchDomains, params));
615 ScopedAddrinfo result = safe_getaddrinfo(host_name_deferred, nullptr, &hints);
616 // t3's dns query should got returned first
617 EXPECT_TRUE(t3_task_done);
618 EXPECT_EQ(1U, GetNumQueries(dns1, host_name_deferred));
619 EXPECT_TRUE(result != nullptr);
620 EXPECT_EQ("1.2.3.4", ToString(result));
621 });
622
623 // ensuring t1 and t2 handler functions are processed in order
624 usleep(100 * 1000);
625 std::thread t2([&, this]() {
626 ASSERT_TRUE(
627 mDnsClient.SetResolversForNetwork(servers_for_t2, kDefaultSearchDomains, params));
628 ScopedAddrinfo result = safe_getaddrinfo(host_name_deferred, nullptr, &hints);
629 EXPECT_TRUE(t3_task_done);
630 EXPECT_EQ(0U, GetNumQueries(dns2, host_name_deferred));
631 EXPECT_TRUE(result != nullptr);
632 EXPECT_EQ("1.2.3.4", ToString(result));
633
634 std::vector<std::string> res_servers;
635 std::vector<std::string> res_domains;
636 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +0900637 res_params res_params;
Ken Chen92bed612018-12-22 21:46:55 +0800638 std::vector<ResolverStats> res_stats;
639 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +0800640 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
641 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains,
642 &res_tls_servers, &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chen92bed612018-12-22 21:46:55 +0800643 EXPECT_EQ(0, wait_for_pending_req_timeout_count);
644 });
645
646 // ensuring t2 and t3 handler functions are processed in order
647 usleep(100 * 1000);
648 std::thread t3([&, this]() {
649 ASSERT_TRUE(
650 mDnsClient.SetResolversForNetwork(servers_for_t3, kDefaultSearchDomains, params));
651 ScopedAddrinfo result = safe_getaddrinfo(host_name_normal, nullptr, &hints);
652 EXPECT_EQ(1U, GetNumQueries(dns1, host_name_deferred));
653 EXPECT_EQ(0U, GetNumQueries(dns2, host_name_deferred));
654 EXPECT_EQ(1U, GetNumQueries(dns3, host_name_normal));
655 EXPECT_TRUE(result != nullptr);
656 EXPECT_EQ("1.2.3.5", ToString(result));
657
658 t3_task_done = true;
659 dns1.setDeferredResp(false);
660 });
661 t3.join();
662 t1.join();
663 t2.join();
664}
665
lifr4e4a2e02019-01-29 16:53:51 +0800666TEST_F(ResolverTest, GetAddrInfo_cnames) {
667 constexpr char host_name[] = "host.example.com.";
668 test::DNSResponder dns;
669 const std::vector<DnsRecord> records = {
670 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
671 {"a.example.com.", ns_type::ns_t_cname, "b.example.com."},
672 {"b.example.com.", ns_type::ns_t_cname, "c.example.com."},
673 {"c.example.com.", ns_type::ns_t_cname, "d.example.com."},
674 {"d.example.com.", ns_type::ns_t_cname, "e.example.com."},
675 {"e.example.com.", ns_type::ns_t_cname, host_name},
676 {host_name, ns_type::ns_t_a, "1.2.3.3"},
677 {host_name, ns_type::ns_t_aaaa, "2001:db8::42"},
678 };
679 StartDns(dns, records);
680 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
681
682 addrinfo hints = {.ai_family = AF_INET};
683 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
684 EXPECT_TRUE(result != nullptr);
685 EXPECT_EQ("1.2.3.3", ToString(result));
686
687 dns.clearQueries();
688 hints = {.ai_family = AF_INET6};
689 result = safe_getaddrinfo("hello", nullptr, &hints);
690 EXPECT_TRUE(result != nullptr);
691 EXPECT_EQ("2001:db8::42", ToString(result));
692}
693
694TEST_F(ResolverTest, GetAddrInfo_cnamesNoIpAddress) {
695 test::DNSResponder dns;
696 const std::vector<DnsRecord> records = {
697 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
698 };
699 StartDns(dns, records);
700 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
701
702 addrinfo hints = {.ai_family = AF_INET};
703 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
704 EXPECT_TRUE(result == nullptr);
705
706 dns.clearQueries();
707 hints = {.ai_family = AF_INET6};
708 result = safe_getaddrinfo("hello", nullptr, &hints);
709 EXPECT_TRUE(result == nullptr);
710}
711
712TEST_F(ResolverTest, GetAddrInfo_cnamesIllegalRdata) {
713 test::DNSResponder dns;
714 const std::vector<DnsRecord> records = {
715 {kHelloExampleCom, ns_type::ns_t_cname, ".!#?"},
716 };
717 StartDns(dns, records);
718 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
719
720 addrinfo hints = {.ai_family = AF_INET};
721 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
722 EXPECT_TRUE(result == nullptr);
723
724 dns.clearQueries();
725 hints = {.ai_family = AF_INET6};
726 result = safe_getaddrinfo("hello", nullptr, &hints);
727 EXPECT_TRUE(result == nullptr);
728}
729
Ken Chenb9fa2062018-11-13 21:51:13 +0800730TEST_F(ResolverTest, MultidomainResolution) {
Xiao Ma09b71022018-12-11 17:56:32 +0900731 constexpr char host_name[] = "nihao.example2.com.";
Luke Huangf8215372019-11-22 11:53:41 +0800732 std::vector<std::string> searchDomains = {"example1.com", "example2.com", "example3.com"};
Ken Chenb9fa2062018-11-13 21:51:13 +0800733
Xiao Ma09b71022018-12-11 17:56:32 +0900734 test::DNSResponder dns("127.0.0.6");
735 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.3"}});
736 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({"127.0.0.6"}, searchDomains));
737
Ken Chenb9fa2062018-11-13 21:51:13 +0800738 const hostent* result = gethostbyname("nihao");
Xiao Ma09b71022018-12-11 17:56:32 +0900739
Ken Chenb9fa2062018-11-13 21:51:13 +0800740 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
741 ASSERT_FALSE(result == nullptr);
742 ASSERT_EQ(4, result->h_length);
743 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
744 EXPECT_EQ("1.2.3.3", ToString(result));
745 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800746}
747
748TEST_F(ResolverTest, GetAddrInfoV6_numeric) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800749 constexpr char host_name[] = "ohayou.example.com.";
750 constexpr char numeric_addr[] = "fe80::1%lo";
751
Xiao Ma09b71022018-12-11 17:56:32 +0900752 test::DNSResponder dns;
Ken Chenb9fa2062018-11-13 21:51:13 +0800753 dns.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900754 StartDns(dns, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
755 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800756
757 addrinfo hints = {.ai_family = AF_INET6};
758 ScopedAddrinfo result = safe_getaddrinfo(numeric_addr, nullptr, &hints);
759 EXPECT_TRUE(result != nullptr);
760 EXPECT_EQ(numeric_addr, ToString(result));
761 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
762
763 // Now try a non-numeric hostname query with the AI_NUMERICHOST flag set.
764 // We should fail without sending out a DNS query.
765 hints.ai_flags |= AI_NUMERICHOST;
766 result = safe_getaddrinfo(host_name, nullptr, &hints);
767 EXPECT_TRUE(result == nullptr);
768 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
769}
770
771TEST_F(ResolverTest, GetAddrInfoV6_failing) {
Xiao Ma09b71022018-12-11 17:56:32 +0900772 constexpr char listen_addr0[] = "127.0.0.7";
773 constexpr char listen_addr1[] = "127.0.0.8";
Ken Chenb9fa2062018-11-13 21:51:13 +0800774 const char* host_name = "ohayou.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +0900775
776 test::DNSResponder dns0(listen_addr0);
777 test::DNSResponder dns1(listen_addr1);
Ken Chenb9fa2062018-11-13 21:51:13 +0800778 dns0.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900779 StartDns(dns0, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
780 StartDns(dns1, {{host_name, ns_type::ns_t_aaaa, "2001:db8::6"}});
781
Luke Huangf8215372019-11-22 11:53:41 +0800782 std::vector<std::string> servers = {listen_addr0, listen_addr1};
Ken Chenb9fa2062018-11-13 21:51:13 +0800783 // <sample validity in s> <success threshold in percent> <min samples> <max samples>
784 int sample_count = 8;
Luke Huangf8215372019-11-22 11:53:41 +0800785 const std::vector<int> params = {300, 25, sample_count, sample_count};
Xiao Ma09b71022018-12-11 17:56:32 +0900786 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, kDefaultSearchDomains, params));
Ken Chenb9fa2062018-11-13 21:51:13 +0800787
788 // Repeatedly perform resolutions for non-existing domains until MAXNSSAMPLES resolutions have
789 // reached the dns0, which is set to fail. No more requests should then arrive at that server
790 // for the next sample_lifetime seconds.
791 // TODO: This approach is implementation-dependent, change once metrics reporting is available.
Xiao Ma09b71022018-12-11 17:56:32 +0900792 const addrinfo hints = {.ai_family = AF_INET6};
Bernie Innocentib102dd22018-12-04 14:57:48 +0900793 for (int i = 0; i < sample_count; ++i) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800794 std::string domain = StringPrintf("nonexistent%d", i);
795 ScopedAddrinfo result = safe_getaddrinfo(domain.c_str(), nullptr, &hints);
796 }
797 // Due to 100% errors for all possible samples, the server should be ignored from now on and
798 // only the second one used for all following queries, until NSSAMPLE_VALIDITY is reached.
799 dns0.clearQueries();
800 dns1.clearQueries();
801 ScopedAddrinfo result = safe_getaddrinfo("ohayou", nullptr, &hints);
802 EXPECT_TRUE(result != nullptr);
803 EXPECT_EQ(0U, GetNumQueries(dns0, host_name));
804 EXPECT_EQ(1U, GetNumQueries(dns1, host_name));
805}
806
807TEST_F(ResolverTest, GetAddrInfoV6_nonresponsive) {
Xiao Ma09b71022018-12-11 17:56:32 +0900808 constexpr char listen_addr0[] = "127.0.0.7";
809 constexpr char listen_addr1[] = "127.0.0.8";
810 constexpr char listen_srv[] = "53";
811 constexpr char host_name1[] = "ohayou.example.com.";
812 constexpr char host_name2[] = "ciao.example.com.";
Luke Huang483cf332019-06-03 17:24:51 +0800813 const std::vector<std::string> defaultSearchDomain = {"example.com"};
814 // The minimal timeout is 1000ms, so we can't decrease timeout
815 // So reduce retry count.
816 const std::vector<int> reduceRetryParams = {
817 300, // sample validity in seconds
818 25, // success threshod in percent
819 8, 8, // {MIN,MAX}_SAMPLES
820 1000, // BASE_TIMEOUT_MSEC
821 1, // retry count
822 };
Xiao Ma09b71022018-12-11 17:56:32 +0900823 const std::vector<DnsRecord> records0 = {
824 {host_name1, ns_type::ns_t_aaaa, "2001:db8::5"},
825 {host_name2, ns_type::ns_t_aaaa, "2001:db8::5"},
826 };
827 const std::vector<DnsRecord> records1 = {
828 {host_name1, ns_type::ns_t_aaaa, "2001:db8::6"},
829 {host_name2, ns_type::ns_t_aaaa, "2001:db8::6"},
830 };
Ken Chenb9fa2062018-11-13 21:51:13 +0800831
832 // dns0 does not respond with 100% probability, while
833 // dns1 responds normally, at least initially.
Mike Yufc125e42019-05-15 20:41:28 +0800834 test::DNSResponder dns0(listen_addr0, listen_srv, static_cast<ns_rcode>(-1));
835 test::DNSResponder dns1(listen_addr1, listen_srv, static_cast<ns_rcode>(-1));
Ken Chenb9fa2062018-11-13 21:51:13 +0800836 dns0.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900837 StartDns(dns0, records0);
838 StartDns(dns1, records1);
Luke Huang483cf332019-06-03 17:24:51 +0800839 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr0, listen_addr1}, defaultSearchDomain,
840 reduceRetryParams));
Ken Chenb9fa2062018-11-13 21:51:13 +0800841
Luke Huang483cf332019-06-03 17:24:51 +0800842 // Specify ai_socktype to make getaddrinfo will only query 1 time
843 const addrinfo hints = {.ai_family = AF_INET6, .ai_socktype = SOCK_STREAM};
Ken Chenb9fa2062018-11-13 21:51:13 +0800844
845 // dns0 will ignore the request, and we'll fallback to dns1 after the first
846 // retry.
847 ScopedAddrinfo result = safe_getaddrinfo(host_name1, nullptr, &hints);
848 EXPECT_TRUE(result != nullptr);
849 EXPECT_EQ(1U, GetNumQueries(dns0, host_name1));
850 EXPECT_EQ(1U, GetNumQueries(dns1, host_name1));
851
852 // Now make dns1 also ignore 100% requests... The resolve should alternate
Luke Huang483cf332019-06-03 17:24:51 +0800853 // queries between the nameservers and fail
Ken Chenb9fa2062018-11-13 21:51:13 +0800854 dns1.setResponseProbability(0.0);
855 addrinfo* result2 = nullptr;
856 EXPECT_EQ(EAI_NODATA, getaddrinfo(host_name2, nullptr, &hints, &result2));
857 EXPECT_EQ(nullptr, result2);
Luke Huang483cf332019-06-03 17:24:51 +0800858 EXPECT_EQ(1U, GetNumQueries(dns0, host_name2));
859 EXPECT_EQ(1U, GetNumQueries(dns1, host_name2));
Ken Chenb9fa2062018-11-13 21:51:13 +0800860}
861
862TEST_F(ResolverTest, GetAddrInfoV6_concurrent) {
Xiao Ma09b71022018-12-11 17:56:32 +0900863 constexpr char listen_addr0[] = "127.0.0.9";
864 constexpr char listen_addr1[] = "127.0.0.10";
865 constexpr char listen_addr2[] = "127.0.0.11";
866 constexpr char host_name[] = "konbanha.example.com.";
867
868 test::DNSResponder dns0(listen_addr0);
869 test::DNSResponder dns1(listen_addr1);
870 test::DNSResponder dns2(listen_addr2);
871 StartDns(dns0, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
872 StartDns(dns1, {{host_name, ns_type::ns_t_aaaa, "2001:db8::6"}});
873 StartDns(dns2, {{host_name, ns_type::ns_t_aaaa, "2001:db8::7"}});
874
Luke Huangf8215372019-11-22 11:53:41 +0800875 const std::vector<std::string> servers = {listen_addr0, listen_addr1, listen_addr2};
Ken Chenb9fa2062018-11-13 21:51:13 +0800876 std::vector<std::thread> threads(10);
877 for (std::thread& thread : threads) {
Luke Huangf8215372019-11-22 11:53:41 +0800878 thread = std::thread([this, &servers]() {
879 unsigned delay = arc4random_uniform(1 * 1000 * 1000); // <= 1s
Ken Chenb9fa2062018-11-13 21:51:13 +0800880 usleep(delay);
881 std::vector<std::string> serverSubset;
882 for (const auto& server : servers) {
883 if (arc4random_uniform(2)) {
884 serverSubset.push_back(server);
885 }
886 }
887 if (serverSubset.empty()) serverSubset = servers;
Xiao Ma09b71022018-12-11 17:56:32 +0900888 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(serverSubset));
889 const addrinfo hints = {.ai_family = AF_INET6};
Ken Chenb9fa2062018-11-13 21:51:13 +0800890 addrinfo* result = nullptr;
891 int rv = getaddrinfo("konbanha", nullptr, &hints, &result);
892 EXPECT_EQ(0, rv) << "error [" << rv << "] " << gai_strerror(rv);
893 if (result) {
894 freeaddrinfo(result);
895 result = nullptr;
896 }
897 });
898 }
899 for (std::thread& thread : threads) {
900 thread.join();
901 }
Ken Chen92bed612018-12-22 21:46:55 +0800902
903 std::vector<std::string> res_servers;
904 std::vector<std::string> res_domains;
905 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +0900906 res_params res_params;
Ken Chen92bed612018-12-22 21:46:55 +0800907 std::vector<ResolverStats> res_stats;
908 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +0800909 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
910 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
911 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chen92bed612018-12-22 21:46:55 +0800912 EXPECT_EQ(0, wait_for_pending_req_timeout_count);
Ken Chenb9fa2062018-11-13 21:51:13 +0800913}
914
Mike Yu8ac63402019-12-02 15:28:38 +0800915TEST_F(ResolverTest, SkipBadServersDueToInternalError) {
916 constexpr char listen_addr1[] = "fe80::1";
917 constexpr char listen_addr2[] = "255.255.255.255";
918 constexpr char listen_addr3[] = "127.0.0.3";
919
920 test::DNSResponder dns(listen_addr3);
921 ASSERT_TRUE(dns.startServer());
922
923 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
924 parcel.servers = {listen_addr1, listen_addr2, listen_addr3};
925
926 // Bad servers can be distinguished after two attempts.
927 parcel.minSamples = 2;
928 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
929
930 // Start querying five times.
931 for (int i = 0; i < 5; i++) {
932 std::string hostName = StringPrintf("hello%d.com.", i);
933 dns.addMapping(hostName, ns_type::ns_t_a, "1.2.3.4");
934 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
935 EXPECT_TRUE(safe_getaddrinfo(hostName.c_str(), nullptr, &hints) != nullptr);
936 }
937
938 std::vector<std::string> res_servers;
939 std::vector<std::string> res_domains;
940 std::vector<std::string> res_tls_servers;
941 res_params res_params;
942 std::vector<ResolverStats> res_stats;
943 int wait_for_pending_req_timeout_count;
944 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
945 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
946 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
947
948 // Verify the result by means of the statistics.
949 EXPECT_EQ(res_stats[0].successes, 0);
950 EXPECT_EQ(res_stats[1].successes, 0);
951 EXPECT_EQ(res_stats[2].successes, 5);
952 EXPECT_EQ(res_stats[0].internal_errors, 2);
953 EXPECT_EQ(res_stats[1].internal_errors, 2);
954 EXPECT_EQ(res_stats[2].internal_errors, 0);
955}
956
957TEST_F(ResolverTest, SkipBadServersDueToTimeout) {
958 constexpr char listen_addr1[] = "127.0.0.3";
959 constexpr char listen_addr2[] = "127.0.0.4";
960
961 // Set dns1 non-responsive and dns2 workable.
962 test::DNSResponder dns1(listen_addr1, test::kDefaultListenService, static_cast<ns_rcode>(-1));
963 test::DNSResponder dns2(listen_addr2);
964 dns1.setResponseProbability(0.0);
965 ASSERT_TRUE(dns1.startServer());
966 ASSERT_TRUE(dns2.startServer());
967
968 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
969 parcel.servers = {listen_addr1, listen_addr2};
970
971 // Bad servers can be distinguished after two attempts.
972 parcel.minSamples = 2;
973 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
974
975 // Start querying five times.
976 for (int i = 0; i < 5; i++) {
977 std::string hostName = StringPrintf("hello%d.com.", i);
978 dns1.addMapping(hostName, ns_type::ns_t_a, "1.2.3.4");
979 dns2.addMapping(hostName, ns_type::ns_t_a, "1.2.3.5");
980 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
981 EXPECT_TRUE(safe_getaddrinfo(hostName.c_str(), nullptr, &hints) != nullptr);
982 }
983
984 std::vector<std::string> res_servers;
985 std::vector<std::string> res_domains;
986 std::vector<std::string> res_tls_servers;
987 res_params res_params;
988 std::vector<ResolverStats> res_stats;
989 int wait_for_pending_req_timeout_count;
990 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
991 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
992 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
993
994 // Verify the result by means of the statistics as well as the query counts.
995 EXPECT_EQ(res_stats[0].successes, 0);
996 EXPECT_EQ(res_stats[1].successes, 5);
997 EXPECT_EQ(res_stats[0].timeouts, 2);
998 EXPECT_EQ(res_stats[1].timeouts, 0);
999 EXPECT_EQ(dns1.queries().size(), 2U);
1000 EXPECT_EQ(dns2.queries().size(), 5U);
1001}
1002
chenbrucefd837fa2019-10-29 18:35:36 +08001003TEST_F(ResolverTest, GetAddrInfoFromCustTable_InvalidInput) {
1004 constexpr char hostnameNoip[] = "noip.example.com.";
1005 constexpr char hostnameInvalidip[] = "invalidip.example.com.";
1006 const std::vector<aidl::android::net::ResolverHostsParcel> invalidCustHosts = {
1007 {"", hostnameNoip},
1008 {"wrong IP", hostnameInvalidip},
1009 };
1010 test::DNSResponder dns;
1011 StartDns(dns, {});
1012 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1013 resolverParams.hosts = invalidCustHosts;
1014 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1015 for (const auto& hostname : {hostnameNoip, hostnameInvalidip}) {
1016 // The query won't get data from customized table because of invalid customized table
1017 // and DNSResponder also has no records. hostnameNoip has never registered and
1018 // hostnameInvalidip has registered but wrong IP.
1019 const addrinfo hints = {.ai_family = AF_UNSPEC};
1020 ScopedAddrinfo result = safe_getaddrinfo(hostname, nullptr, &hints);
1021 ASSERT_TRUE(result == nullptr);
1022 EXPECT_EQ(4U, GetNumQueries(dns, hostname));
1023 }
1024}
1025
1026TEST_F(ResolverTest, GetAddrInfoFromCustTable) {
1027 constexpr char hostnameV4[] = "v4only.example.com.";
1028 constexpr char hostnameV6[] = "v6only.example.com.";
1029 constexpr char hostnameV4V6[] = "v4v6.example.com.";
1030 constexpr char custAddrV4[] = "1.2.3.4";
1031 constexpr char custAddrV6[] = "::1.2.3.4";
1032 constexpr char dnsSvAddrV4[] = "1.2.3.5";
1033 constexpr char dnsSvAddrV6[] = "::1.2.3.5";
1034 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4 = {
1035 {custAddrV4, hostnameV4},
1036 };
1037 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV6 = {
1038 {custAddrV6, hostnameV6},
1039 };
1040 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4V6 = {
1041 {custAddrV4, hostnameV4V6},
1042 {custAddrV6, hostnameV4V6},
1043 };
1044 const std::vector<DnsRecord> dnsSvHostV4 = {
1045 {hostnameV4, ns_type::ns_t_a, dnsSvAddrV4},
1046 };
1047 const std::vector<DnsRecord> dnsSvHostV6 = {
1048 {hostnameV6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1049 };
1050 const std::vector<DnsRecord> dnsSvHostV4V6 = {
1051 {hostnameV4V6, ns_type::ns_t_a, dnsSvAddrV4},
1052 {hostnameV4V6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1053 };
1054 struct TestConfig {
1055 const std::string name;
1056 const std::vector<aidl::android::net::ResolverHostsParcel> customizedHosts;
1057 const std::vector<DnsRecord> dnsserverHosts;
1058 const std::vector<std::string> queryResult;
1059 std::string asParameters() const {
1060 return StringPrintf("name: %s, customizedHosts: %s, dnsserverHosts: %s", name.c_str(),
1061 customizedHosts.empty() ? "No" : "Yes",
1062 dnsserverHosts.empty() ? "No" : "Yes");
1063 }
1064 } testConfigs[]{
1065 // clang-format off
1066 {hostnameV4, {}, {}, {}},
1067 {hostnameV4, {}, dnsSvHostV4, {dnsSvAddrV4}},
1068 {hostnameV4, custHostV4, {}, {custAddrV4}},
1069 {hostnameV4, custHostV4, dnsSvHostV4, {custAddrV4}},
1070 {hostnameV6, {}, {}, {}},
1071 {hostnameV6, {}, dnsSvHostV6, {dnsSvAddrV6}},
1072 {hostnameV6, custHostV6, {}, {custAddrV6}},
1073 {hostnameV6, custHostV6, dnsSvHostV6, {custAddrV6}},
1074 {hostnameV4V6, {}, {}, {}},
1075 {hostnameV4V6, {}, dnsSvHostV4V6, {dnsSvAddrV4, dnsSvAddrV6}},
1076 {hostnameV4V6, custHostV4V6, {}, {custAddrV4, custAddrV6}},
1077 {hostnameV4V6, custHostV4V6, dnsSvHostV4V6, {custAddrV4, custAddrV6}},
1078 // clang-format on
1079 };
1080
1081 for (const auto& config : testConfigs) {
1082 SCOPED_TRACE(config.asParameters());
1083
1084 test::DNSResponder dns;
1085 StartDns(dns, config.dnsserverHosts);
1086
1087 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1088 resolverParams.hosts = config.customizedHosts;
1089 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1090 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM};
1091 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
1092 if (config.customizedHosts.empty() && config.dnsserverHosts.empty()) {
1093 ASSERT_TRUE(result == nullptr);
1094 EXPECT_EQ(2U, GetNumQueries(dns, config.name.c_str()));
1095 } else {
1096 ASSERT_TRUE(result != nullptr);
1097 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(config.queryResult));
1098 EXPECT_EQ(config.customizedHosts.empty() ? 2U : 0U,
1099 GetNumQueries(dns, config.name.c_str()));
1100 }
1101
1102 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
1103 }
1104}
1105
1106TEST_F(ResolverTest, GetAddrInfoFromCustTable_Modify) {
1107 constexpr char hostnameV4V6[] = "v4v6.example.com.";
1108 constexpr char custAddrV4[] = "1.2.3.4";
1109 constexpr char custAddrV6[] = "::1.2.3.4";
1110 constexpr char dnsSvAddrV4[] = "1.2.3.5";
1111 constexpr char dnsSvAddrV6[] = "::1.2.3.5";
1112 const std::vector<DnsRecord> dnsSvHostV4V6 = {
1113 {hostnameV4V6, ns_type::ns_t_a, dnsSvAddrV4},
1114 {hostnameV4V6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1115 };
1116 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4V6 = {
1117 {custAddrV4, hostnameV4V6},
1118 {custAddrV6, hostnameV4V6},
1119 };
1120 test::DNSResponder dns;
1121 StartDns(dns, dnsSvHostV4V6);
1122 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1123
1124 resolverParams.hosts = custHostV4V6;
1125 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1126 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM};
1127 ScopedAddrinfo result = safe_getaddrinfo(hostnameV4V6, nullptr, &hints);
1128 ASSERT_TRUE(result != nullptr);
1129 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray({custAddrV4, custAddrV6}));
1130 EXPECT_EQ(0U, GetNumQueries(dns, hostnameV4V6));
1131
1132 resolverParams.hosts = {};
1133 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1134 result = safe_getaddrinfo(hostnameV4V6, nullptr, &hints);
1135 ASSERT_TRUE(result != nullptr);
1136 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray({dnsSvAddrV4, dnsSvAddrV6}));
1137 EXPECT_EQ(2U, GetNumQueries(dns, hostnameV4V6));
1138}
1139
Ken Chenb9fa2062018-11-13 21:51:13 +08001140TEST_F(ResolverTest, EmptySetup) {
Ken Chenb9fa2062018-11-13 21:51:13 +08001141 std::vector<std::string> servers;
1142 std::vector<std::string> domains;
Xiao Ma09b71022018-12-11 17:56:32 +09001143 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001144 std::vector<std::string> res_servers;
1145 std::vector<std::string> res_domains;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001146 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001147 res_params res_params;
Ken Chenb9fa2062018-11-13 21:51:13 +08001148 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +08001149 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001150 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1151 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1152 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chenb9fa2062018-11-13 21:51:13 +08001153 EXPECT_EQ(0U, res_servers.size());
1154 EXPECT_EQ(0U, res_domains.size());
Mike Yu0a1c53d2018-11-26 13:26:21 +09001155 EXPECT_EQ(0U, res_tls_servers.size());
Luke Huang5bd827c2019-03-14 16:10:04 +08001156 ASSERT_EQ(static_cast<size_t>(IDnsResolver::RESOLVER_PARAMS_COUNT), kDefaultParams.size());
1157 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY],
1158 res_params.sample_validity);
1159 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001160 res_params.success_threshold);
Luke Huang5bd827c2019-03-14 16:10:04 +08001161 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
1162 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
1163 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
Ken Chenb9fa2062018-11-13 21:51:13 +08001164 res_params.base_timeout_msec);
Luke Huang5bd827c2019-03-14 16:10:04 +08001165 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_RETRY_COUNT], res_params.retry_count);
Ken Chenb9fa2062018-11-13 21:51:13 +08001166}
1167
1168TEST_F(ResolverTest, SearchPathChange) {
Xiao Ma09b71022018-12-11 17:56:32 +09001169 constexpr char listen_addr[] = "127.0.0.13";
1170 constexpr char host_name1[] = "test13.domain1.org.";
1171 constexpr char host_name2[] = "test13.domain2.org.";
Luke Huangf8215372019-11-22 11:53:41 +08001172 std::vector<std::string> servers = {listen_addr};
1173 std::vector<std::string> domains = {"domain1.org"};
Xiao Ma09b71022018-12-11 17:56:32 +09001174
1175 const std::vector<DnsRecord> records = {
1176 {host_name1, ns_type::ns_t_aaaa, "2001:db8::13"},
1177 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1:13"},
1178 };
1179 test::DNSResponder dns(listen_addr);
1180 StartDns(dns, records);
1181 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001182
1183 const addrinfo hints = {.ai_family = AF_INET6};
1184 ScopedAddrinfo result = safe_getaddrinfo("test13", nullptr, &hints);
1185 EXPECT_TRUE(result != nullptr);
1186 EXPECT_EQ(1U, dns.queries().size());
1187 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
1188 EXPECT_EQ("2001:db8::13", ToString(result));
1189
1190 // Test that changing the domain search path on its own works.
Luke Huangf8215372019-11-22 11:53:41 +08001191 domains = {"domain2.org"};
Xiao Ma09b71022018-12-11 17:56:32 +09001192 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001193 dns.clearQueries();
1194
1195 result = safe_getaddrinfo("test13", nullptr, &hints);
1196 EXPECT_TRUE(result != nullptr);
1197 EXPECT_EQ(1U, dns.queries().size());
1198 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
1199 EXPECT_EQ("2001:db8::1:13", ToString(result));
1200}
1201
Luke Huang2dac4382019-06-24 13:28:44 +08001202namespace {
1203
Luke Huangf8215372019-11-22 11:53:41 +08001204std::vector<std::string> getResolverDomains(aidl::android::net::IDnsResolver* dnsResolverService,
Luke Huang2dac4382019-06-24 13:28:44 +08001205 unsigned netId) {
1206 std::vector<std::string> res_servers;
1207 std::vector<std::string> res_domains;
1208 std::vector<std::string> res_tls_servers;
1209 res_params res_params;
1210 std::vector<ResolverStats> res_stats;
1211 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001212 DnsResponderClient::GetResolverInfo(dnsResolverService, netId, &res_servers, &res_domains,
1213 &res_tls_servers, &res_params, &res_stats,
1214 &wait_for_pending_req_timeout_count);
Luke Huang2dac4382019-06-24 13:28:44 +08001215 return res_domains;
1216}
1217
1218} // namespace
1219
1220TEST_F(ResolverTest, SearchPathPrune) {
1221 constexpr size_t DUPLICATED_DOMAIN_NUM = 3;
1222 constexpr char listen_addr[] = "127.0.0.13";
1223 constexpr char domian_name1[] = "domain13.org.";
1224 constexpr char domian_name2[] = "domain14.org.";
1225 constexpr char host_name1[] = "test13.domain13.org.";
1226 constexpr char host_name2[] = "test14.domain14.org.";
1227 std::vector<std::string> servers = {listen_addr};
1228
1229 std::vector<std::string> testDomains1;
1230 std::vector<std::string> testDomains2;
1231 // Domain length should be <= 255
1232 // Max number of domains in search path is 6
1233 for (size_t i = 0; i < MAXDNSRCH + 1; i++) {
1234 // Fill up with invalid domain
1235 testDomains1.push_back(std::string(300, i + '0'));
1236 // Fill up with valid but duplicated domain
1237 testDomains2.push_back(StringPrintf("domain%zu.org", i % DUPLICATED_DOMAIN_NUM));
1238 }
1239
1240 // Add valid domain used for query.
1241 testDomains1.push_back(domian_name1);
1242
1243 // Add valid domain twice used for query.
1244 testDomains2.push_back(domian_name2);
1245 testDomains2.push_back(domian_name2);
1246
1247 const std::vector<DnsRecord> records = {
1248 {host_name1, ns_type::ns_t_aaaa, "2001:db8::13"},
1249 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1:13"},
1250 };
1251 test::DNSResponder dns(listen_addr);
1252 StartDns(dns, records);
1253 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, testDomains1));
1254
1255 const addrinfo hints = {.ai_family = AF_INET6};
1256 ScopedAddrinfo result = safe_getaddrinfo("test13", nullptr, &hints);
1257
1258 EXPECT_TRUE(result != nullptr);
1259
1260 EXPECT_EQ(1U, dns.queries().size());
1261 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
1262 EXPECT_EQ("2001:db8::13", ToString(result));
1263
1264 const auto& res_domains1 = getResolverDomains(mDnsClient.resolvService(), TEST_NETID);
1265 // Expect 1 valid domain, invalid domains are removed.
1266 ASSERT_EQ(1U, res_domains1.size());
1267 EXPECT_EQ(domian_name1, res_domains1[0]);
1268
1269 dns.clearQueries();
1270
1271 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, testDomains2));
1272
1273 result = safe_getaddrinfo("test14", nullptr, &hints);
1274 EXPECT_TRUE(result != nullptr);
1275
1276 // (3 domains * 2 retries) + 1 success query = 7
1277 EXPECT_EQ(7U, dns.queries().size());
1278 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
1279 EXPECT_EQ("2001:db8::1:13", ToString(result));
1280
1281 const auto& res_domains2 = getResolverDomains(mDnsClient.resolvService(), TEST_NETID);
1282 // Expect 4 valid domain, duplicate domains are removed.
1283 EXPECT_EQ(DUPLICATED_DOMAIN_NUM + 1U, res_domains2.size());
1284 EXPECT_THAT(
1285 std::vector<std::string>({"domain0.org", "domain1.org", "domain2.org", domian_name2}),
1286 testing::ElementsAreArray(res_domains2));
1287}
1288
Mike Yu0a1c53d2018-11-26 13:26:21 +09001289// If we move this function to dns_responder_client, it will complicate the dependency need of
1290// dns_tls_frontend.h.
1291static void setupTlsServers(const std::vector<std::string>& servers,
waynema0e73c2e2019-07-31 15:04:08 +08001292 std::vector<std::unique_ptr<test::DnsTlsFrontend>>* tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001293 constexpr char listen_udp[] = "53";
1294 constexpr char listen_tls[] = "853";
Mike Yu0a1c53d2018-11-26 13:26:21 +09001295
1296 for (const auto& server : servers) {
1297 auto t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
1298 t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
1299 t->startServer();
Mike Yu0a1c53d2018-11-26 13:26:21 +09001300 tls->push_back(std::move(t));
1301 }
1302}
1303
Mike Yu0a1c53d2018-11-26 13:26:21 +09001304TEST_F(ResolverTest, MaxServerPrune_Binder) {
Mike Yu0a1c53d2018-11-26 13:26:21 +09001305 std::vector<std::string> domains;
1306 std::vector<std::unique_ptr<test::DNSResponder>> dns;
1307 std::vector<std::unique_ptr<test::DnsTlsFrontend>> tls;
1308 std::vector<std::string> servers;
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001309 std::vector<DnsResponderClient::Mapping> mappings;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001310
1311 for (unsigned i = 0; i < MAXDNSRCH + 1; i++) {
1312 domains.push_back(StringPrintf("example%u.com", i));
1313 }
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001314 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupMappings(1, domains, &mappings));
1315 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupDNSServers(MAXNS + 1, mappings, &dns, &servers));
waynema0e73c2e2019-07-31 15:04:08 +08001316 ASSERT_NO_FATAL_FAILURE(setupTlsServers(servers, &tls));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001317
waynema0e73c2e2019-07-31 15:04:08 +08001318 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, domains, kDefaultParams,
1319 kDefaultPrivateDnsHostName));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001320
Mike Yu383855b2019-01-15 17:53:27 +08001321 // If the private DNS validation hasn't completed yet before backend DNS servers stop,
1322 // TLS servers will get stuck in handleOneRequest(), which causes this test stuck in
1323 // ~DnsTlsFrontend() because the TLS server loop threads can't be terminated.
1324 // So, wait for private DNS validation done before stopping backend DNS servers.
1325 for (int i = 0; i < MAXNS; i++) {
chenbruceaff85842019-05-31 15:46:42 +08001326 LOG(INFO) << "Waiting for private DNS validation on " << tls[i]->listen_address() << ".";
Mike Yu724f77d2019-08-16 11:14:50 +08001327 EXPECT_TRUE(WaitForPrivateDnsValidation(tls[i]->listen_address(), true));
chenbruceaff85842019-05-31 15:46:42 +08001328 LOG(INFO) << "private DNS validation on " << tls[i]->listen_address() << " done.";
Mike Yu383855b2019-01-15 17:53:27 +08001329 }
1330
Mike Yu0a1c53d2018-11-26 13:26:21 +09001331 std::vector<std::string> res_servers;
1332 std::vector<std::string> res_domains;
1333 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001334 res_params res_params;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001335 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +08001336 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001337 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1338 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1339 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001340
1341 // Check the size of the stats and its contents.
1342 EXPECT_EQ(static_cast<size_t>(MAXNS), res_servers.size());
1343 EXPECT_EQ(static_cast<size_t>(MAXNS), res_tls_servers.size());
1344 EXPECT_EQ(static_cast<size_t>(MAXDNSRCH), res_domains.size());
1345 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_servers.begin()));
1346 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_tls_servers.begin()));
1347 EXPECT_TRUE(std::equal(domains.begin(), domains.begin() + MAXDNSRCH, res_domains.begin()));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001348}
1349
1350TEST_F(ResolverTest, ResolverStats) {
Xiao Ma09b71022018-12-11 17:56:32 +09001351 constexpr char listen_addr1[] = "127.0.0.4";
1352 constexpr char listen_addr2[] = "127.0.0.5";
1353 constexpr char listen_addr3[] = "127.0.0.6";
Mike Yu0a1c53d2018-11-26 13:26:21 +09001354
1355 // Set server 1 timeout.
Mike Yufc125e42019-05-15 20:41:28 +08001356 test::DNSResponder dns1(listen_addr1, "53", static_cast<ns_rcode>(-1));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001357 dns1.setResponseProbability(0.0);
1358 ASSERT_TRUE(dns1.startServer());
1359
1360 // Set server 2 responding server failure.
Xiao Ma09b71022018-12-11 17:56:32 +09001361 test::DNSResponder dns2(listen_addr2);
Mike Yu0a1c53d2018-11-26 13:26:21 +09001362 dns2.setResponseProbability(0.0);
1363 ASSERT_TRUE(dns2.startServer());
1364
1365 // Set server 3 workable.
Xiao Ma09b71022018-12-11 17:56:32 +09001366 test::DNSResponder dns3(listen_addr3);
1367 dns3.addMapping(kHelloExampleCom, ns_type::ns_t_a, "1.2.3.4");
Mike Yu0a1c53d2018-11-26 13:26:21 +09001368 ASSERT_TRUE(dns3.startServer());
1369
1370 std::vector<std::string> servers = {listen_addr1, listen_addr2, listen_addr3};
Xiao Ma09b71022018-12-11 17:56:32 +09001371 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001372
1373 dns3.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +09001374 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
Mike Yu0a1c53d2018-11-26 13:26:21 +09001375 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
Xiao Ma09b71022018-12-11 17:56:32 +09001376 size_t found = GetNumQueries(dns3, kHelloExampleCom);
Mike Yu0a1c53d2018-11-26 13:26:21 +09001377 EXPECT_LE(1U, found);
1378 std::string result_str = ToString(result);
1379 EXPECT_TRUE(result_str == "1.2.3.4") << ", result_str='" << result_str << "'";
1380
1381 std::vector<std::string> res_servers;
1382 std::vector<std::string> res_domains;
1383 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001384 res_params res_params;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001385 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +08001386 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001387 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1388 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1389 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001390
1391 EXPECT_EQ(1, res_stats[0].timeouts);
1392 EXPECT_EQ(1, res_stats[1].errors);
1393 EXPECT_EQ(1, res_stats[2].successes);
Mike Yu0a1c53d2018-11-26 13:26:21 +09001394}
1395
Ken Chenb9fa2062018-11-13 21:51:13 +08001396// Test what happens if the specified TLS server is nonexistent.
1397TEST_F(ResolverTest, GetHostByName_TlsMissing) {
Xiao Ma09b71022018-12-11 17:56:32 +09001398 constexpr char listen_addr[] = "127.0.0.3";
1399 constexpr char host_name[] = "tlsmissing.example.com.";
1400
1401 test::DNSResponder dns;
1402 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.3"}});
Luke Huangf8215372019-11-22 11:53:41 +08001403 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001404
1405 // There's nothing listening on this address, so validation will either fail or
1406 /// hang. Either way, queries will continue to flow to the DNSResponder.
waynema0e73c2e2019-07-31 15:04:08 +08001407 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Ken Chenb9fa2062018-11-13 21:51:13 +08001408
1409 const hostent* result;
1410
1411 result = gethostbyname("tlsmissing");
1412 ASSERT_FALSE(result == nullptr);
1413 EXPECT_EQ("1.2.3.3", ToString(result));
1414
1415 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001416 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001417}
1418
1419// Test what happens if the specified TLS server replies with garbage.
1420TEST_F(ResolverTest, GetHostByName_TlsBroken) {
Xiao Ma09b71022018-12-11 17:56:32 +09001421 constexpr char listen_addr[] = "127.0.0.3";
1422 constexpr char host_name1[] = "tlsbroken1.example.com.";
1423 constexpr char host_name2[] = "tlsbroken2.example.com.";
1424 const std::vector<DnsRecord> records = {
1425 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1426 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1427 };
1428
1429 test::DNSResponder dns;
1430 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001431 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001432
1433 // Bind the specified private DNS socket but don't respond to any client sockets yet.
1434 int s = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, IPPROTO_TCP);
1435 ASSERT_TRUE(s >= 0);
1436 struct sockaddr_in tlsServer = {
Luke Huangf8215372019-11-22 11:53:41 +08001437 .sin_family = AF_INET,
1438 .sin_port = htons(853),
Ken Chenb9fa2062018-11-13 21:51:13 +08001439 };
1440 ASSERT_TRUE(inet_pton(AF_INET, listen_addr, &tlsServer.sin_addr));
1441 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEPORT).ok());
1442 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEADDR).ok());
1443 ASSERT_FALSE(bind(s, reinterpret_cast<struct sockaddr*>(&tlsServer), sizeof(tlsServer)));
1444 ASSERT_FALSE(listen(s, 1));
1445
1446 // Trigger TLS validation.
waynema0e73c2e2019-07-31 15:04:08 +08001447 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Ken Chenb9fa2062018-11-13 21:51:13 +08001448
1449 struct sockaddr_storage cliaddr;
1450 socklen_t sin_size = sizeof(cliaddr);
Luke Huangf8215372019-11-22 11:53:41 +08001451 int new_fd = accept4(s, reinterpret_cast<struct sockaddr*>(&cliaddr), &sin_size, SOCK_CLOEXEC);
Ken Chenb9fa2062018-11-13 21:51:13 +08001452 ASSERT_TRUE(new_fd > 0);
1453
1454 // We've received the new file descriptor but not written to it or closed, so the
1455 // validation is still pending. Queries should still flow correctly because the
1456 // server is not used until validation succeeds.
1457 const hostent* result;
1458 result = gethostbyname("tlsbroken1");
1459 ASSERT_FALSE(result == nullptr);
1460 EXPECT_EQ("1.2.3.1", ToString(result));
1461
1462 // Now we cause the validation to fail.
1463 std::string garbage = "definitely not a valid TLS ServerHello";
1464 write(new_fd, garbage.data(), garbage.size());
1465 close(new_fd);
1466
1467 // Validation failure shouldn't interfere with lookups, because lookups won't be sent
1468 // to the TLS server unless validation succeeds.
1469 result = gethostbyname("tlsbroken2");
1470 ASSERT_FALSE(result == nullptr);
1471 EXPECT_EQ("1.2.3.2", ToString(result));
1472
1473 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001474 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001475 close(s);
1476}
1477
1478TEST_F(ResolverTest, GetHostByName_Tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001479 constexpr char listen_addr[] = "127.0.0.3";
1480 constexpr char listen_udp[] = "53";
1481 constexpr char listen_tls[] = "853";
1482 constexpr char host_name1[] = "tls1.example.com.";
1483 constexpr char host_name2[] = "tls2.example.com.";
1484 constexpr char host_name3[] = "tls3.example.com.";
1485 const std::vector<DnsRecord> records = {
1486 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1487 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1488 {host_name3, ns_type::ns_t_a, "1.2.3.3"},
1489 };
1490
1491 test::DNSResponder dns;
1492 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001493 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001494
1495 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1496 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001497 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08001498 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001499
Mike Yu724f77d2019-08-16 11:14:50 +08001500 const hostent* result = gethostbyname("tls1");
Ken Chenb9fa2062018-11-13 21:51:13 +08001501 ASSERT_FALSE(result == nullptr);
1502 EXPECT_EQ("1.2.3.1", ToString(result));
1503
1504 // Wait for query to get counted.
1505 EXPECT_TRUE(tls.waitForQueries(2, 5000));
1506
1507 // Stop the TLS server. Since we're in opportunistic mode, queries will
1508 // fall back to the locally-assigned (clear text) nameservers.
1509 tls.stopServer();
1510
1511 dns.clearQueries();
1512 result = gethostbyname("tls2");
1513 EXPECT_FALSE(result == nullptr);
1514 EXPECT_EQ("1.2.3.2", ToString(result));
1515 const auto queries = dns.queries();
1516 EXPECT_EQ(1U, queries.size());
waynema29253052019-08-20 11:26:08 +08001517 EXPECT_EQ("tls2.example.com.", queries[0].name);
1518 EXPECT_EQ(ns_t_a, queries[0].type);
Ken Chenb9fa2062018-11-13 21:51:13 +08001519
1520 // Reset the resolvers without enabling TLS. Queries should still be routed
1521 // to the UDP endpoint.
Xiao Ma09b71022018-12-11 17:56:32 +09001522 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001523
1524 result = gethostbyname("tls3");
1525 ASSERT_FALSE(result == nullptr);
1526 EXPECT_EQ("1.2.3.3", ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +08001527}
1528
Ken Chenb9fa2062018-11-13 21:51:13 +08001529TEST_F(ResolverTest, GetHostByName_TlsFailover) {
Xiao Ma09b71022018-12-11 17:56:32 +09001530 constexpr char listen_addr1[] = "127.0.0.3";
1531 constexpr char listen_addr2[] = "127.0.0.4";
1532 constexpr char listen_udp[] = "53";
1533 constexpr char listen_tls[] = "853";
1534 constexpr char host_name1[] = "tlsfailover1.example.com.";
1535 constexpr char host_name2[] = "tlsfailover2.example.com.";
1536 const std::vector<DnsRecord> records1 = {
1537 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1538 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1539 };
1540 const std::vector<DnsRecord> records2 = {
1541 {host_name1, ns_type::ns_t_a, "1.2.3.3"},
1542 {host_name2, ns_type::ns_t_a, "1.2.3.4"},
1543 };
1544
1545 test::DNSResponder dns1(listen_addr1);
1546 test::DNSResponder dns2(listen_addr2);
1547 StartDns(dns1, records1);
1548 StartDns(dns2, records2);
1549
Luke Huangf8215372019-11-22 11:53:41 +08001550 std::vector<std::string> servers = {listen_addr1, listen_addr2};
Ken Chenb9fa2062018-11-13 21:51:13 +08001551
1552 test::DnsTlsFrontend tls1(listen_addr1, listen_tls, listen_addr1, listen_udp);
1553 test::DnsTlsFrontend tls2(listen_addr2, listen_tls, listen_addr2, listen_udp);
1554 ASSERT_TRUE(tls1.startServer());
1555 ASSERT_TRUE(tls2.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001556 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1557 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08001558 EXPECT_TRUE(WaitForPrivateDnsValidation(tls1.listen_address(), true));
1559 EXPECT_TRUE(WaitForPrivateDnsValidation(tls2.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001560
Mike Yu724f77d2019-08-16 11:14:50 +08001561 const hostent* result = gethostbyname("tlsfailover1");
Ken Chenb9fa2062018-11-13 21:51:13 +08001562 ASSERT_FALSE(result == nullptr);
1563 EXPECT_EQ("1.2.3.1", ToString(result));
1564
1565 // Wait for query to get counted.
1566 EXPECT_TRUE(tls1.waitForQueries(2, 5000));
1567 // No new queries should have reached tls2.
1568 EXPECT_EQ(1, tls2.queries());
1569
1570 // Stop tls1. Subsequent queries should attempt to reach tls1, fail, and retry to tls2.
1571 tls1.stopServer();
1572
1573 result = gethostbyname("tlsfailover2");
1574 EXPECT_EQ("1.2.3.4", ToString(result));
1575
1576 // Wait for query to get counted.
1577 EXPECT_TRUE(tls2.waitForQueries(2, 5000));
1578
1579 // No additional queries should have reached the insecure servers.
1580 EXPECT_EQ(2U, dns1.queries().size());
1581 EXPECT_EQ(2U, dns2.queries().size());
1582
1583 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001584 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Ken Chenb9fa2062018-11-13 21:51:13 +08001585}
1586
1587TEST_F(ResolverTest, GetHostByName_BadTlsName) {
Xiao Ma09b71022018-12-11 17:56:32 +09001588 constexpr char listen_addr[] = "127.0.0.3";
1589 constexpr char listen_udp[] = "53";
1590 constexpr char listen_tls[] = "853";
1591 constexpr char host_name[] = "badtlsname.example.com.";
1592
1593 test::DNSResponder dns;
1594 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.1"}});
Luke Huangf8215372019-11-22 11:53:41 +08001595 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001596
1597 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1598 ASSERT_TRUE(tls.startServer());
Xiao Ma09b71022018-12-11 17:56:32 +09001599 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
waynema0e73c2e2019-07-31 15:04:08 +08001600 kDefaultIncorrectPrivateDnsHostName));
Ken Chenb9fa2062018-11-13 21:51:13 +08001601
waynema0e73c2e2019-07-31 15:04:08 +08001602 // The TLS handshake would fail because the name of TLS server doesn't
1603 // match with TLS server's certificate.
Mike Yu724f77d2019-08-16 11:14:50 +08001604 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), false));
Ken Chenb9fa2062018-11-13 21:51:13 +08001605
1606 // The query should fail hard, because a name was specified.
1607 EXPECT_EQ(nullptr, gethostbyname("badtlsname"));
1608
1609 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001610 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001611}
1612
1613TEST_F(ResolverTest, GetAddrInfo_Tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001614 constexpr char listen_addr[] = "127.0.0.3";
1615 constexpr char listen_udp[] = "53";
1616 constexpr char listen_tls[] = "853";
1617 constexpr char host_name[] = "addrinfotls.example.com.";
1618 const std::vector<DnsRecord> records = {
1619 {host_name, ns_type::ns_t_a, "1.2.3.4"},
1620 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
1621 };
1622
1623 test::DNSResponder dns;
1624 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001625 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001626
1627 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1628 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001629 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1630 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08001631 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001632
1633 dns.clearQueries();
1634 ScopedAddrinfo result = safe_getaddrinfo("addrinfotls", nullptr, nullptr);
1635 EXPECT_TRUE(result != nullptr);
1636 size_t found = GetNumQueries(dns, host_name);
1637 EXPECT_LE(1U, found);
1638 // Could be A or AAAA
1639 std::string result_str = ToString(result);
1640 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +08001641 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08001642 // Wait for both A and AAAA queries to get counted.
1643 EXPECT_TRUE(tls.waitForQueries(3, 5000));
1644
1645 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001646 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001647}
1648
1649TEST_F(ResolverTest, TlsBypass) {
1650 const char OFF[] = "off";
1651 const char OPPORTUNISTIC[] = "opportunistic";
1652 const char STRICT[] = "strict";
1653
1654 const char GETHOSTBYNAME[] = "gethostbyname";
1655 const char GETADDRINFO[] = "getaddrinfo";
1656 const char GETADDRINFOFORNET[] = "getaddrinfofornet";
1657
1658 const unsigned BYPASS_NETID = NETID_USE_LOCAL_NAMESERVERS | TEST_NETID;
1659
Ken Chenb9fa2062018-11-13 21:51:13 +08001660 const char ADDR4[] = "192.0.2.1";
1661 const char ADDR6[] = "2001:db8::1";
1662
1663 const char cleartext_addr[] = "127.0.0.53";
1664 const char cleartext_port[] = "53";
1665 const char tls_port[] = "853";
Luke Huangf8215372019-11-22 11:53:41 +08001666 const std::vector<std::string> servers = {cleartext_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001667
Xiao Ma09b71022018-12-11 17:56:32 +09001668 test::DNSResponder dns(cleartext_addr);
Ken Chenb9fa2062018-11-13 21:51:13 +08001669 ASSERT_TRUE(dns.startServer());
1670
1671 test::DnsTlsFrontend tls(cleartext_addr, tls_port, cleartext_addr, cleartext_port);
Mike Yudd4ac2d2019-05-31 16:52:11 +08001672 ASSERT_TRUE(tls.startServer());
Ken Chenb9fa2062018-11-13 21:51:13 +08001673
Luke Huangf8215372019-11-22 11:53:41 +08001674 // clang-format off
Ken Chenb9fa2062018-11-13 21:51:13 +08001675 struct TestConfig {
1676 const std::string mode;
1677 const bool withWorkingTLS;
1678 const std::string method;
1679
1680 std::string asHostName() const {
Luke Huangf8215372019-11-22 11:53:41 +08001681 return StringPrintf("%s.%s.%s.", mode.c_str(), withWorkingTLS ? "tlsOn" : "tlsOff",
Ken Chenb9fa2062018-11-13 21:51:13 +08001682 method.c_str());
1683 }
1684 } testConfigs[]{
Ken Chenb9fa2062018-11-13 21:51:13 +08001685 {OFF, true, GETHOSTBYNAME},
1686 {OPPORTUNISTIC, true, GETHOSTBYNAME},
1687 {STRICT, true, GETHOSTBYNAME},
Ken Chenb9fa2062018-11-13 21:51:13 +08001688 {OFF, true, GETADDRINFO},
1689 {OPPORTUNISTIC, true, GETADDRINFO},
1690 {STRICT, true, GETADDRINFO},
Ken Chenb9fa2062018-11-13 21:51:13 +08001691 {OFF, true, GETADDRINFOFORNET},
1692 {OPPORTUNISTIC, true, GETADDRINFOFORNET},
1693 {STRICT, true, GETADDRINFOFORNET},
Mike Yudd4ac2d2019-05-31 16:52:11 +08001694 {OFF, false, GETHOSTBYNAME},
1695 {OPPORTUNISTIC, false, GETHOSTBYNAME},
1696 {STRICT, false, GETHOSTBYNAME},
1697 {OFF, false, GETADDRINFO},
1698 {OPPORTUNISTIC, false, GETADDRINFO},
1699 {STRICT, false, GETADDRINFO},
1700 {OFF, false, GETADDRINFOFORNET},
1701 {OPPORTUNISTIC, false, GETADDRINFOFORNET},
1702 {STRICT, false, GETADDRINFOFORNET},
Ken Chenb9fa2062018-11-13 21:51:13 +08001703 };
Luke Huangf8215372019-11-22 11:53:41 +08001704 // clang-format on
Ken Chenb9fa2062018-11-13 21:51:13 +08001705
1706 for (const auto& config : testConfigs) {
1707 const std::string testHostName = config.asHostName();
1708 SCOPED_TRACE(testHostName);
1709
1710 // Don't tempt test bugs due to caching.
1711 const char* host_name = testHostName.c_str();
1712 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
1713 dns.addMapping(host_name, ns_type::ns_t_aaaa, ADDR6);
1714
Mike Yudd4ac2d2019-05-31 16:52:11 +08001715 if (config.withWorkingTLS) {
1716 if (!tls.running()) {
1717 ASSERT_TRUE(tls.startServer());
1718 }
1719 } else {
1720 if (tls.running()) {
1721 ASSERT_TRUE(tls.stopServer());
1722 }
1723 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001724
1725 if (config.mode == OFF) {
Xiao Ma09b71022018-12-11 17:56:32 +09001726 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, kDefaultSearchDomains,
1727 kDefaultParams));
Ken Chenb9fa2062018-11-13 21:51:13 +08001728 } else if (config.mode == OPPORTUNISTIC) {
Xiao Ma09b71022018-12-11 17:56:32 +09001729 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08001730 kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08001731
1732 // Wait for the validation event. If the server is running, the validation should
1733 // be successful; otherwise, the validation should be failed.
1734 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), config.withWorkingTLS));
Ken Chenb9fa2062018-11-13 21:51:13 +08001735 } else if (config.mode == STRICT) {
Xiao Ma09b71022018-12-11 17:56:32 +09001736 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08001737 kDefaultParams, kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08001738
1739 // Wait for the validation event.
1740 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), config.withWorkingTLS));
Ken Chenb9fa2062018-11-13 21:51:13 +08001741 }
Mike Yudd4ac2d2019-05-31 16:52:11 +08001742 tls.clearQueries();
Ken Chenb9fa2062018-11-13 21:51:13 +08001743
1744 const hostent* h_result = nullptr;
1745 ScopedAddrinfo ai_result;
1746
1747 if (config.method == GETHOSTBYNAME) {
1748 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
1749 h_result = gethostbyname(host_name);
1750
1751 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
1752 ASSERT_FALSE(h_result == nullptr);
1753 ASSERT_EQ(4, h_result->h_length);
1754 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
1755 EXPECT_EQ(ADDR4, ToString(h_result));
1756 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
1757 } else if (config.method == GETADDRINFO) {
1758 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
1759 ai_result = safe_getaddrinfo(host_name, nullptr, nullptr);
1760 EXPECT_TRUE(ai_result != nullptr);
1761
1762 EXPECT_LE(1U, GetNumQueries(dns, host_name));
1763 // Could be A or AAAA
1764 const std::string result_str = ToString(ai_result);
1765 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
Luke Huangf8215372019-11-22 11:53:41 +08001766 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08001767 } else if (config.method == GETADDRINFOFORNET) {
1768 addrinfo* raw_ai_result = nullptr;
1769 EXPECT_EQ(0, android_getaddrinfofornet(host_name, /*servname=*/nullptr,
1770 /*hints=*/nullptr, BYPASS_NETID, MARK_UNSET,
1771 &raw_ai_result));
1772 ai_result.reset(raw_ai_result);
1773
1774 EXPECT_LE(1U, GetNumQueries(dns, host_name));
1775 // Could be A or AAAA
1776 const std::string result_str = ToString(ai_result);
1777 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
Luke Huangf8215372019-11-22 11:53:41 +08001778 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08001779 }
1780
Mike Yudd4ac2d2019-05-31 16:52:11 +08001781 EXPECT_EQ(0, tls.queries());
Ken Chenb9fa2062018-11-13 21:51:13 +08001782
1783 // Clear per-process resolv netid.
1784 ASSERT_EQ(0, setNetworkForResolv(NETID_UNSET));
Ken Chenb9fa2062018-11-13 21:51:13 +08001785 dns.clearQueries();
1786 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001787}
1788
1789TEST_F(ResolverTest, StrictMode_NoTlsServers) {
Xiao Ma09b71022018-12-11 17:56:32 +09001790 constexpr char cleartext_addr[] = "127.0.0.53";
Luke Huangf8215372019-11-22 11:53:41 +08001791 const std::vector<std::string> servers = {cleartext_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09001792 constexpr char host_name[] = "strictmode.notlsips.example.com.";
1793 const std::vector<DnsRecord> records = {
1794 {host_name, ns_type::ns_t_a, "1.2.3.4"},
1795 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
1796 };
Ken Chenb9fa2062018-11-13 21:51:13 +08001797
Xiao Ma09b71022018-12-11 17:56:32 +09001798 test::DNSResponder dns(cleartext_addr);
1799 StartDns(dns, records);
Ken Chenb9fa2062018-11-13 21:51:13 +08001800
waynema0e73c2e2019-07-31 15:04:08 +08001801 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1802 kDefaultIncorrectPrivateDnsHostName));
Ken Chenb9fa2062018-11-13 21:51:13 +08001803
1804 addrinfo* ai_result = nullptr;
1805 EXPECT_NE(0, getaddrinfo(host_name, nullptr, nullptr, &ai_result));
1806 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
1807}
Luke Huang94b10b92018-11-21 20:13:38 +08001808
1809namespace {
1810
Luke Huang70931aa2019-01-31 11:57:41 +08001811int getAsyncResponse(int fd, int* rcode, uint8_t* buf, int bufLen) {
Luke Huang94b10b92018-11-21 20:13:38 +08001812 struct pollfd wait_fd[1];
1813 wait_fd[0].fd = fd;
1814 wait_fd[0].events = POLLIN;
1815 short revents;
1816 int ret;
1817
1818 ret = poll(wait_fd, 1, -1);
1819 revents = wait_fd[0].revents;
1820 if (revents & POLLIN) {
1821 int n = resNetworkResult(fd, rcode, buf, bufLen);
Luke Huangba7bef92018-12-26 16:53:03 +08001822 // Verify that resNetworkResult() closed the fd
1823 char dummy;
1824 EXPECT_EQ(-1, read(fd, &dummy, sizeof dummy));
1825 EXPECT_EQ(EBADF, errno);
Luke Huang94b10b92018-11-21 20:13:38 +08001826 return n;
1827 }
1828 return -1;
1829}
1830
Luke Huang70931aa2019-01-31 11:57:41 +08001831std::string toString(uint8_t* buf, int bufLen, int ipType) {
Luke Huang94b10b92018-11-21 20:13:38 +08001832 ns_msg handle;
1833 int ancount, n = 0;
1834 ns_rr rr;
1835
Luke Huangf8215372019-11-22 11:53:41 +08001836 if (ns_initparse((const uint8_t*)buf, bufLen, &handle) >= 0) {
Luke Huang94b10b92018-11-21 20:13:38 +08001837 ancount = ns_msg_count(handle, ns_s_an);
1838 if (ns_parserr(&handle, ns_s_an, n, &rr) == 0) {
Luke Huang70931aa2019-01-31 11:57:41 +08001839 const uint8_t* rdata = ns_rr_rdata(rr);
Luke Huang94b10b92018-11-21 20:13:38 +08001840 char buffer[INET6_ADDRSTRLEN];
Luke Huangf8215372019-11-22 11:53:41 +08001841 if (inet_ntop(ipType, (const char*)rdata, buffer, sizeof(buffer))) {
Luke Huang94b10b92018-11-21 20:13:38 +08001842 return buffer;
1843 }
1844 }
1845 }
1846 return "";
1847}
1848
1849int dns_open_proxy() {
1850 int s = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
1851 if (s == -1) {
1852 return -1;
1853 }
1854 const int one = 1;
1855 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
1856
1857 static const struct sockaddr_un proxy_addr = {
1858 .sun_family = AF_UNIX,
1859 .sun_path = "/dev/socket/dnsproxyd",
1860 };
1861
Luke Huangf8215372019-11-22 11:53:41 +08001862 if (TEMP_FAILURE_RETRY(connect(s, (const struct sockaddr*)&proxy_addr, sizeof(proxy_addr))) !=
Luke Huang94b10b92018-11-21 20:13:38 +08001863 0) {
1864 close(s);
1865 return -1;
1866 }
1867
1868 return s;
1869}
1870
Luke Huangba7bef92018-12-26 16:53:03 +08001871void expectAnswersValid(int fd, int ipType, const std::string& expectedAnswer) {
1872 int rcode = -1;
1873 uint8_t buf[MAXPACKET] = {};
1874
1875 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
1876 EXPECT_GT(res, 0);
1877 EXPECT_EQ(expectedAnswer, toString(buf, res, ipType));
1878}
1879
1880void expectAnswersNotValid(int fd, int expectedErrno) {
1881 int rcode = -1;
1882 uint8_t buf[MAXPACKET] = {};
1883
1884 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
1885 EXPECT_EQ(expectedErrno, res);
1886}
1887
Luke Huang94b10b92018-11-21 20:13:38 +08001888} // namespace
1889
1890TEST_F(ResolverTest, Async_NormalQueryV4V6) {
Xiao Ma09b71022018-12-11 17:56:32 +09001891 constexpr char listen_addr[] = "127.0.0.4";
1892 constexpr char host_name[] = "howdy.example.com.";
1893 const std::vector<DnsRecord> records = {
1894 {host_name, ns_type::ns_t_a, "1.2.3.4"},
1895 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
1896 };
1897
1898 test::DNSResponder dns(listen_addr);
1899 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08001900 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09001901 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08001902
Luke Huangba7bef92018-12-26 16:53:03 +08001903 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
1904 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08001905 EXPECT_TRUE(fd1 != -1);
1906 EXPECT_TRUE(fd2 != -1);
1907
Luke Huang70931aa2019-01-31 11:57:41 +08001908 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08001909 int rcode;
1910 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
1911 EXPECT_GT(res, 0);
1912 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
1913
1914 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
1915 EXPECT_GT(res, 0);
1916 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
1917
1918 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
1919
1920 // Re-query verify cache works
Luke Huangba7bef92018-12-26 16:53:03 +08001921 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
1922 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08001923
1924 EXPECT_TRUE(fd1 != -1);
1925 EXPECT_TRUE(fd2 != -1);
1926
1927 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
1928 EXPECT_GT(res, 0);
1929 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
1930
1931 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
1932 EXPECT_GT(res, 0);
1933 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
1934
1935 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
1936}
1937
1938TEST_F(ResolverTest, Async_BadQuery) {
Xiao Ma09b71022018-12-11 17:56:32 +09001939 constexpr char listen_addr[] = "127.0.0.4";
1940 constexpr char host_name[] = "howdy.example.com.";
1941 const std::vector<DnsRecord> records = {
1942 {host_name, ns_type::ns_t_a, "1.2.3.4"},
1943 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
1944 };
1945
1946 test::DNSResponder dns(listen_addr);
1947 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08001948 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09001949 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08001950
1951 static struct {
1952 int fd;
1953 const char* dname;
1954 const int queryType;
1955 const int expectRcode;
1956 } kTestData[] = {
Luke Huangba7bef92018-12-26 16:53:03 +08001957 {-1, "", ns_t_aaaa, 0},
1958 {-1, "as65ass46", ns_t_aaaa, 0},
1959 {-1, "454564564564", ns_t_aaaa, 0},
1960 {-1, "h645235", ns_t_a, 0},
1961 {-1, "www.google.com", ns_t_a, 0},
Luke Huang94b10b92018-11-21 20:13:38 +08001962 };
1963
1964 for (auto& td : kTestData) {
1965 SCOPED_TRACE(td.dname);
Luke Huangba7bef92018-12-26 16:53:03 +08001966 td.fd = resNetworkQuery(TEST_NETID, td.dname, ns_c_in, td.queryType, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08001967 EXPECT_TRUE(td.fd != -1);
1968 }
1969
1970 // dns_responder return empty resp(packet only contains query part) with no error currently
1971 for (const auto& td : kTestData) {
Luke Huang70931aa2019-01-31 11:57:41 +08001972 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08001973 int rcode;
1974 SCOPED_TRACE(td.dname);
1975 int res = getAsyncResponse(td.fd, &rcode, buf, MAXPACKET);
1976 EXPECT_GT(res, 0);
1977 EXPECT_EQ(rcode, td.expectRcode);
1978 }
1979}
1980
1981TEST_F(ResolverTest, Async_EmptyAnswer) {
Xiao Ma09b71022018-12-11 17:56:32 +09001982 constexpr char listen_addr[] = "127.0.0.4";
1983 constexpr char host_name[] = "howdy.example.com.";
1984 const std::vector<DnsRecord> records = {
1985 {host_name, ns_type::ns_t_a, "1.2.3.4"},
1986 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
1987 };
1988
1989 test::DNSResponder dns(listen_addr);
1990 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08001991 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09001992 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08001993
Luke Huang9c264bb2018-12-18 16:44:41 +08001994 // TODO: Disable retry to make this test explicit.
1995 auto& cv = dns.getCv();
1996 auto& cvMutex = dns.getCvMutex();
1997 int fd1;
1998 // Wait on the condition variable to ensure that the DNS server has handled our first query.
1999 {
2000 std::unique_lock lk(cvMutex);
Luke Huangba7bef92018-12-26 16:53:03 +08002001 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang9c264bb2018-12-18 16:44:41 +08002002 EXPECT_TRUE(fd1 != -1);
2003 EXPECT_EQ(std::cv_status::no_timeout, cv.wait_for(lk, std::chrono::seconds(1)));
2004 }
Luke Huang94b10b92018-11-21 20:13:38 +08002005
Luke Huang94b10b92018-11-21 20:13:38 +08002006 dns.setResponseProbability(0.0);
Luke Huang94b10b92018-11-21 20:13:38 +08002007
Luke Huangba7bef92018-12-26 16:53:03 +08002008 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002009 EXPECT_TRUE(fd2 != -1);
2010
Luke Huangba7bef92018-12-26 16:53:03 +08002011 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002012 EXPECT_TRUE(fd3 != -1);
2013
Luke Huang9c264bb2018-12-18 16:44:41 +08002014 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002015 int rcode;
2016
Luke Huang9c264bb2018-12-18 16:44:41 +08002017 // expect no response
2018 int res = getAsyncResponse(fd3, &rcode, buf, MAXPACKET);
2019 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huang94b10b92018-11-21 20:13:38 +08002020
Luke Huang9c264bb2018-12-18 16:44:41 +08002021 // expect no response
Luke Huang94b10b92018-11-21 20:13:38 +08002022 memset(buf, 0, MAXPACKET);
Luke Huang9c264bb2018-12-18 16:44:41 +08002023 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2024 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huang94b10b92018-11-21 20:13:38 +08002025
Luke Huang94b10b92018-11-21 20:13:38 +08002026 dns.setResponseProbability(1.0);
Luke Huang94b10b92018-11-21 20:13:38 +08002027
Luke Huangba7bef92018-12-26 16:53:03 +08002028 int fd4 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002029 EXPECT_TRUE(fd4 != -1);
2030
2031 memset(buf, 0, MAXPACKET);
2032 res = getAsyncResponse(fd4, &rcode, buf, MAXPACKET);
2033 EXPECT_GT(res, 0);
2034 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2035
2036 memset(buf, 0, MAXPACKET);
2037 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2038 EXPECT_GT(res, 0);
2039 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
2040}
2041
2042TEST_F(ResolverTest, Async_MalformedQuery) {
Xiao Ma09b71022018-12-11 17:56:32 +09002043 constexpr char listen_addr[] = "127.0.0.4";
2044 constexpr char host_name[] = "howdy.example.com.";
2045 const std::vector<DnsRecord> records = {
2046 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2047 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2048 };
2049
2050 test::DNSResponder dns(listen_addr);
2051 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002052 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002053 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002054
2055 int fd = dns_open_proxy();
2056 EXPECT_TRUE(fd > 0);
2057
2058 const std::string badMsg = "16-52512#";
Xiao Ma09b71022018-12-11 17:56:32 +09002059 static const struct {
Luke Huang94b10b92018-11-21 20:13:38 +08002060 const std::string cmd;
2061 const int expectErr;
2062 } kTestData[] = {
Luke Huangba7bef92018-12-26 16:53:03 +08002063 // Too few arguments
Luke Huang94b10b92018-11-21 20:13:38 +08002064 {"resnsend " + badMsg + '\0', -EINVAL},
2065 // Bad netId
Luke Huangba7bef92018-12-26 16:53:03 +08002066 {"resnsend badnetId 0 " + badMsg + '\0', -EINVAL},
Luke Huang94b10b92018-11-21 20:13:38 +08002067 // Bad raw data
Luke Huangba7bef92018-12-26 16:53:03 +08002068 {"resnsend " + std::to_string(TEST_NETID) + " 0 " + badMsg + '\0', -EILSEQ},
Luke Huang94b10b92018-11-21 20:13:38 +08002069 };
2070
2071 for (unsigned int i = 0; i < std::size(kTestData); i++) {
2072 auto& td = kTestData[i];
2073 SCOPED_TRACE(td.cmd);
2074 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, td.cmd.c_str(), td.cmd.size()));
2075 EXPECT_EQ(rc, static_cast<ssize_t>(td.cmd.size()));
2076
2077 int32_t tmp;
2078 rc = TEMP_FAILURE_RETRY(read(fd, &tmp, sizeof(tmp)));
2079 EXPECT_TRUE(rc > 0);
2080 EXPECT_EQ(static_cast<int>(ntohl(tmp)), td.expectErr);
2081 }
2082 // Normal query with answer buffer
2083 // This is raw data of query "howdy.example.com" type 1 class 1
2084 std::string query = "81sBAAABAAAAAAAABWhvd2R5B2V4YW1wbGUDY29tAAABAAE=";
Luke Huangba7bef92018-12-26 16:53:03 +08002085 std::string cmd = "resnsend " + std::to_string(TEST_NETID) + " 0 " + query + '\0';
Luke Huang94b10b92018-11-21 20:13:38 +08002086 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
2087 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
2088
Luke Huang70931aa2019-01-31 11:57:41 +08002089 uint8_t smallBuf[1] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002090 int rcode;
2091 rc = getAsyncResponse(fd, &rcode, smallBuf, 1);
Luke Huangba7bef92018-12-26 16:53:03 +08002092 EXPECT_EQ(-EMSGSIZE, rc);
Luke Huang94b10b92018-11-21 20:13:38 +08002093
2094 // Do the normal test with large buffer again
2095 fd = dns_open_proxy();
2096 EXPECT_TRUE(fd > 0);
2097 rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
2098 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
Luke Huang70931aa2019-01-31 11:57:41 +08002099 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002100 rc = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2101 EXPECT_EQ("1.2.3.4", toString(buf, rc, AF_INET));
Mike Yu4f3747b2018-12-02 17:54:29 +09002102}
2103
Luke Huangba7bef92018-12-26 16:53:03 +08002104TEST_F(ResolverTest, Async_CacheFlags) {
Xiao Ma09b71022018-12-11 17:56:32 +09002105 constexpr char listen_addr[] = "127.0.0.4";
2106 constexpr char host_name[] = "howdy.example.com.";
Luke Huang40f5f492019-05-09 19:37:35 +08002107 constexpr char another_host_name[] = "howdy.example2.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002108 const std::vector<DnsRecord> records = {
2109 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2110 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
Luke Huang40f5f492019-05-09 19:37:35 +08002111 {another_host_name, ns_type::ns_t_a, "1.2.3.5"},
2112 {another_host_name, ns_type::ns_t_aaaa, "::1.2.3.5"},
Xiao Ma09b71022018-12-11 17:56:32 +09002113 };
2114
2115 test::DNSResponder dns(listen_addr);
2116 StartDns(dns, records);
Luke Huangba7bef92018-12-26 16:53:03 +08002117 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002118 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huangba7bef92018-12-26 16:53:03 +08002119
2120 // ANDROID_RESOLV_NO_CACHE_STORE
2121 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2122 ANDROID_RESOLV_NO_CACHE_STORE);
2123 EXPECT_TRUE(fd1 != -1);
2124 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2125 ANDROID_RESOLV_NO_CACHE_STORE);
2126 EXPECT_TRUE(fd2 != -1);
2127 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2128 ANDROID_RESOLV_NO_CACHE_STORE);
2129 EXPECT_TRUE(fd3 != -1);
2130
2131 expectAnswersValid(fd3, AF_INET, "1.2.3.4");
2132 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
2133 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2134
2135 // No cache exists, expect 3 queries
2136 EXPECT_EQ(3U, GetNumQueries(dns, host_name));
2137
2138 // Re-query and cache
2139 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2140
2141 EXPECT_TRUE(fd1 != -1);
2142
2143 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2144
2145 // Now we have cache, expect 4 queries
2146 EXPECT_EQ(4U, GetNumQueries(dns, host_name));
2147
2148 // ANDROID_RESOLV_NO_CACHE_LOOKUP
2149 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2150 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2151 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2152 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2153
2154 EXPECT_TRUE(fd1 != -1);
2155 EXPECT_TRUE(fd2 != -1);
2156
2157 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
2158 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2159
2160 // Skip cache, expect 6 queries
2161 EXPECT_EQ(6U, GetNumQueries(dns, host_name));
2162
2163 // Re-query verify cache works
2164 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2165 ANDROID_RESOLV_NO_CACHE_STORE);
2166 EXPECT_TRUE(fd1 != -1);
2167 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2168
2169 // Cache hits, expect still 6 queries
2170 EXPECT_EQ(6U, GetNumQueries(dns, host_name));
Luke Huanga1d74182019-03-19 17:30:36 +08002171
2172 // Start to verify if ANDROID_RESOLV_NO_CACHE_LOOKUP does write response into cache
2173 dns.clearQueries();
2174
2175 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa,
2176 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2177 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa,
2178 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2179
2180 EXPECT_TRUE(fd1 != -1);
2181 EXPECT_TRUE(fd2 != -1);
2182
2183 expectAnswersValid(fd2, AF_INET6, "::1.2.3.4");
2184 expectAnswersValid(fd1, AF_INET6, "::1.2.3.4");
2185
2186 // Skip cache, expect 2 queries
2187 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
2188
2189 // Re-query without flags
2190 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
2191 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
2192
2193 EXPECT_TRUE(fd1 != -1);
2194 EXPECT_TRUE(fd2 != -1);
2195
2196 expectAnswersValid(fd2, AF_INET6, "::1.2.3.4");
2197 expectAnswersValid(fd1, AF_INET6, "::1.2.3.4");
2198
2199 // Cache hits, expect still 2 queries
2200 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
Luke Huang40f5f492019-05-09 19:37:35 +08002201
2202 // Test both ANDROID_RESOLV_NO_CACHE_STORE and ANDROID_RESOLV_NO_CACHE_LOOKUP are set
2203 dns.clearQueries();
2204
2205 // Make sure that the cache of "howdy.example2.com" exists.
2206 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa, 0);
2207 EXPECT_TRUE(fd1 != -1);
2208 expectAnswersValid(fd1, AF_INET6, "::1.2.3.5");
2209 EXPECT_EQ(1U, GetNumQueries(dns, another_host_name));
2210
2211 // Re-query with testFlags
2212 const int testFlag = ANDROID_RESOLV_NO_CACHE_STORE | ANDROID_RESOLV_NO_CACHE_LOOKUP;
2213 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa, testFlag);
2214 EXPECT_TRUE(fd1 != -1);
2215 expectAnswersValid(fd1, AF_INET6, "::1.2.3.5");
2216 // Expect cache lookup is skipped.
2217 EXPECT_EQ(2U, GetNumQueries(dns, another_host_name));
2218
2219 // Do another query with testFlags
2220 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_a, testFlag);
2221 EXPECT_TRUE(fd1 != -1);
2222 expectAnswersValid(fd1, AF_INET, "1.2.3.5");
2223 // Expect cache lookup is skipped.
2224 EXPECT_EQ(3U, GetNumQueries(dns, another_host_name));
2225
2226 // Re-query with no flags
2227 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_a, 0);
2228 EXPECT_TRUE(fd1 != -1);
2229 expectAnswersValid(fd1, AF_INET, "1.2.3.5");
2230 // Expect no cache hit because cache storing is also skipped in previous query.
2231 EXPECT_EQ(4U, GetNumQueries(dns, another_host_name));
Luke Huangba7bef92018-12-26 16:53:03 +08002232}
2233
2234TEST_F(ResolverTest, Async_NoRetryFlag) {
Luke Huang70931aa2019-01-31 11:57:41 +08002235 constexpr char listen_addr0[] = "127.0.0.4";
2236 constexpr char listen_addr1[] = "127.0.0.6";
Xiao Ma09b71022018-12-11 17:56:32 +09002237 constexpr char host_name[] = "howdy.example.com.";
2238 const std::vector<DnsRecord> records = {
2239 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2240 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2241 };
2242
Luke Huang70931aa2019-01-31 11:57:41 +08002243 test::DNSResponder dns0(listen_addr0);
2244 test::DNSResponder dns1(listen_addr1);
2245 StartDns(dns0, records);
2246 StartDns(dns1, records);
2247 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr0, listen_addr1}));
Luke Huangba7bef92018-12-26 16:53:03 +08002248
Luke Huang70931aa2019-01-31 11:57:41 +08002249 dns0.clearQueries();
2250 dns1.clearQueries();
2251
2252 dns0.setResponseProbability(0.0);
2253 dns1.setResponseProbability(0.0);
Luke Huangba7bef92018-12-26 16:53:03 +08002254
2255 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2256 ANDROID_RESOLV_NO_RETRY);
2257 EXPECT_TRUE(fd1 != -1);
2258
2259 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa,
2260 ANDROID_RESOLV_NO_RETRY);
2261 EXPECT_TRUE(fd2 != -1);
2262
2263 // expect no response
2264 expectAnswersNotValid(fd1, -ETIMEDOUT);
2265 expectAnswersNotValid(fd2, -ETIMEDOUT);
2266
Luke Huang70931aa2019-01-31 11:57:41 +08002267 // No retry case, expect total 2 queries. The server is selected randomly.
2268 EXPECT_EQ(2U, GetNumQueries(dns0, host_name) + GetNumQueries(dns1, host_name));
Luke Huangba7bef92018-12-26 16:53:03 +08002269
Luke Huang70931aa2019-01-31 11:57:41 +08002270 dns0.clearQueries();
2271 dns1.clearQueries();
Luke Huangba7bef92018-12-26 16:53:03 +08002272
2273 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2274 EXPECT_TRUE(fd1 != -1);
2275
2276 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
2277 EXPECT_TRUE(fd2 != -1);
2278
2279 // expect no response
2280 expectAnswersNotValid(fd1, -ETIMEDOUT);
2281 expectAnswersNotValid(fd2, -ETIMEDOUT);
2282
2283 // Retry case, expect 4 queries
Luke Huang70931aa2019-01-31 11:57:41 +08002284 EXPECT_EQ(4U, GetNumQueries(dns0, host_name));
2285 EXPECT_EQ(4U, GetNumQueries(dns1, host_name));
2286}
2287
2288TEST_F(ResolverTest, Async_VerifyQueryID) {
2289 constexpr char listen_addr[] = "127.0.0.4";
2290 constexpr char host_name[] = "howdy.example.com.";
2291 const std::vector<DnsRecord> records = {
2292 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2293 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2294 };
2295
2296 test::DNSResponder dns(listen_addr);
2297 StartDns(dns, records);
2298 std::vector<std::string> servers = {listen_addr};
2299 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
2300
2301 const uint8_t queryBuf1[] = {
2302 /* Header */
2303 0x55, 0x66, /* Transaction ID */
2304 0x01, 0x00, /* Flags */
2305 0x00, 0x01, /* Questions */
2306 0x00, 0x00, /* Answer RRs */
2307 0x00, 0x00, /* Authority RRs */
2308 0x00, 0x00, /* Additional RRs */
2309 /* Queries */
2310 0x05, 0x68, 0x6f, 0x77, 0x64, 0x79, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
2311 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name */
2312 0x00, 0x01, /* Type */
2313 0x00, 0x01 /* Class */
2314 };
2315
2316 int fd = resNetworkSend(TEST_NETID, queryBuf1, sizeof(queryBuf1), 0);
2317 EXPECT_TRUE(fd != -1);
2318
2319 uint8_t buf[MAXPACKET] = {};
2320 int rcode;
2321
2322 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2323 EXPECT_GT(res, 0);
2324 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2325
2326 auto hp = reinterpret_cast<HEADER*>(buf);
2327 EXPECT_EQ(21862U, htons(hp->id));
2328
2329 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2330
2331 const uint8_t queryBuf2[] = {
2332 /* Header */
2333 0x00, 0x53, /* Transaction ID */
2334 0x01, 0x00, /* Flags */
2335 0x00, 0x01, /* Questions */
2336 0x00, 0x00, /* Answer RRs */
2337 0x00, 0x00, /* Authority RRs */
2338 0x00, 0x00, /* Additional RRs */
2339 /* Queries */
2340 0x05, 0x68, 0x6f, 0x77, 0x64, 0x79, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
2341 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name */
2342 0x00, 0x01, /* Type */
2343 0x00, 0x01 /* Class */
2344 };
2345
2346 // Re-query verify cache works and query id is correct
2347 fd = resNetworkSend(TEST_NETID, queryBuf2, sizeof(queryBuf2), 0);
2348
2349 EXPECT_TRUE(fd != -1);
2350
2351 res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2352 EXPECT_GT(res, 0);
2353 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2354
2355 EXPECT_EQ(0x0053U, htons(hp->id));
2356
2357 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
Luke Huangba7bef92018-12-26 16:53:03 +08002358}
2359
Mike Yu4f3747b2018-12-02 17:54:29 +09002360// This test checks that the resolver should not generate the request containing OPT RR when using
Ken Chen0a015532019-01-02 14:59:38 +08002361// cleartext DNS. If we query the DNS server not supporting EDNS0 and it reponds with
2362// FORMERR_ON_EDNS, we will fallback to no EDNS0 and try again. If the server does no response, we
2363// won't retry so that we get no answer.
Mike Yu4f3747b2018-12-02 17:54:29 +09002364TEST_F(ResolverTest, BrokenEdns) {
2365 typedef test::DNSResponder::Edns Edns;
2366 enum ExpectResult { EXPECT_FAILURE, EXPECT_SUCCESS };
2367
2368 const char OFF[] = "off";
2369 const char OPPORTUNISTIC_UDP[] = "opportunistic_udp";
2370 const char OPPORTUNISTIC_TLS[] = "opportunistic_tls";
2371 const char STRICT[] = "strict";
2372 const char GETHOSTBYNAME[] = "gethostbyname";
2373 const char GETADDRINFO[] = "getaddrinfo";
Mike Yu4f3747b2018-12-02 17:54:29 +09002374 const char ADDR4[] = "192.0.2.1";
2375 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2376 const char CLEARTEXT_PORT[] = "53";
2377 const char TLS_PORT[] = "853";
Luke Huangf8215372019-11-22 11:53:41 +08002378 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
Mike Yu4f3747b2018-12-02 17:54:29 +09002379
Mike Yufc125e42019-05-15 20:41:28 +08002380 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Mike Yu4f3747b2018-12-02 17:54:29 +09002381 ASSERT_TRUE(dns.startServer());
2382
2383 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2384
Luke Huangf8215372019-11-22 11:53:41 +08002385 // clang-format off
Mike Yu4f3747b2018-12-02 17:54:29 +09002386 static const struct TestConfig {
2387 std::string mode;
2388 std::string method;
2389 Edns edns;
2390 ExpectResult expectResult;
2391
2392 std::string asHostName() const {
2393 const char* ednsString;
2394 switch (edns) {
2395 case Edns::ON:
2396 ednsString = "ednsOn";
2397 break;
Ken Chen0a015532019-01-02 14:59:38 +08002398 case Edns::FORMERR_ON_EDNS:
Mike Yu4f3747b2018-12-02 17:54:29 +09002399 ednsString = "ednsFormerr";
2400 break;
2401 case Edns::DROP:
2402 ednsString = "ednsDrop";
2403 break;
2404 default:
2405 ednsString = "";
2406 break;
2407 }
2408 return StringPrintf("%s.%s.%s.", mode.c_str(), method.c_str(), ednsString);
2409 }
2410 } testConfigs[] = {
2411 // In OPPORTUNISTIC_TLS, we get no answer if the DNS server supports TLS but not EDNS0.
2412 // Could such server exist? if so, we might need to fallback to query cleartext DNS.
2413 // Another thing is that {OPPORTUNISTIC_TLS, Edns::DROP} and {STRICT, Edns::DROP} are
2414 // commented out since TLS timeout is not configurable.
2415 // TODO: Uncomment them after TLS timeout is configurable.
2416 {OFF, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2417 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2418 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2419 {STRICT, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
Ken Chen0a015532019-01-02 14:59:38 +08002420 {OFF, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2421 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2422 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2423 {STRICT, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
Mike Yu4f3747b2018-12-02 17:54:29 +09002424 {OFF, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2425 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2426 //{OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2427 //{STRICT, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2428 {OFF, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2429 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2430 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2431 {STRICT, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
Ken Chen0a015532019-01-02 14:59:38 +08002432 {OFF, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2433 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2434 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2435 {STRICT, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
Mike Yu4f3747b2018-12-02 17:54:29 +09002436 {OFF, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2437 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2438 //{OPPORTUNISTIC_TLS, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2439 //{STRICT, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2440 };
Luke Huangf8215372019-11-22 11:53:41 +08002441 // clang-format on
Mike Yu4f3747b2018-12-02 17:54:29 +09002442
2443 for (const auto& config : testConfigs) {
2444 const std::string testHostName = config.asHostName();
2445 SCOPED_TRACE(testHostName);
2446
2447 const char* host_name = testHostName.c_str();
2448 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
2449 dns.setEdns(config.edns);
2450
2451 if (config.mode == OFF) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002452 if (tls.running()) {
2453 ASSERT_TRUE(tls.stopServer());
2454 }
Xiao Ma09b71022018-12-11 17:56:32 +09002455 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Mike Yu4f3747b2018-12-02 17:54:29 +09002456 } else if (config.mode == OPPORTUNISTIC_UDP) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002457 if (tls.running()) {
2458 ASSERT_TRUE(tls.stopServer());
2459 }
Xiao Ma09b71022018-12-11 17:56:32 +09002460 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002461 kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002462 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), false));
Mike Yu4f3747b2018-12-02 17:54:29 +09002463 } else if (config.mode == OPPORTUNISTIC_TLS) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002464 if (!tls.running()) {
2465 ASSERT_TRUE(tls.startServer());
2466 }
Xiao Ma09b71022018-12-11 17:56:32 +09002467 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002468 kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002469 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Mike Yu4f3747b2018-12-02 17:54:29 +09002470 } else if (config.mode == STRICT) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002471 if (!tls.running()) {
2472 ASSERT_TRUE(tls.startServer());
2473 }
Xiao Ma09b71022018-12-11 17:56:32 +09002474 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002475 kDefaultParams, kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08002476 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Mike Yu4f3747b2018-12-02 17:54:29 +09002477 }
2478
2479 if (config.method == GETHOSTBYNAME) {
2480 const hostent* h_result = gethostbyname(host_name);
2481 if (config.expectResult == EXPECT_SUCCESS) {
2482 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2483 ASSERT_TRUE(h_result != nullptr);
2484 ASSERT_EQ(4, h_result->h_length);
2485 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
2486 EXPECT_EQ(ADDR4, ToString(h_result));
2487 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
2488 } else {
2489 EXPECT_EQ(0U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
2490 ASSERT_TRUE(h_result == nullptr);
2491 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2492 }
2493 } else if (config.method == GETADDRINFO) {
2494 ScopedAddrinfo ai_result;
2495 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2496 ai_result = safe_getaddrinfo(host_name, nullptr, &hints);
2497 if (config.expectResult == EXPECT_SUCCESS) {
2498 EXPECT_TRUE(ai_result != nullptr);
2499 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2500 const std::string result_str = ToString(ai_result);
2501 EXPECT_EQ(ADDR4, result_str);
2502 } else {
2503 EXPECT_TRUE(ai_result == nullptr);
2504 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
2505 }
2506 } else {
2507 FAIL() << "Unsupported query method: " << config.method;
2508 }
2509
Mike Yudd4ac2d2019-05-31 16:52:11 +08002510 tls.clearQueries();
Mike Yu4f3747b2018-12-02 17:54:29 +09002511 dns.clearQueries();
2512 }
Mike Yu4f3747b2018-12-02 17:54:29 +09002513}
nuccachena26cc2a2018-07-17 18:07:23 +08002514
Ken Chen0a015532019-01-02 14:59:38 +08002515// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2516// Resolver should have a reasonable number of retries instead of spinning forever. We don't have
2517// an efficient way to know if resolver is stuck in an infinite loop. However, test case will be
2518// failed due to timeout.
2519TEST_F(ResolverTest, UnstableTls) {
2520 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2521 const char CLEARTEXT_PORT[] = "53";
2522 const char TLS_PORT[] = "853";
2523 const char* host_name1 = "nonexistent1.example.com.";
2524 const char* host_name2 = "nonexistent2.example.com.";
2525 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
2526
Mike Yufc125e42019-05-15 20:41:28 +08002527 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Ken Chen0a015532019-01-02 14:59:38 +08002528 ASSERT_TRUE(dns.startServer());
2529 dns.setEdns(test::DNSResponder::Edns::FORMERR_ON_EDNS);
2530 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2531 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08002532 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002533 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
2534
Ken Chen0a015532019-01-02 14:59:38 +08002535 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
2536 tls.stopServer();
2537
2538 const hostent* h_result = gethostbyname(host_name1);
2539 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
2540 ASSERT_TRUE(h_result == nullptr);
2541 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2542
2543 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2544 ScopedAddrinfo ai_result = safe_getaddrinfo(host_name2, nullptr, &hints);
2545 EXPECT_TRUE(ai_result == nullptr);
2546 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
2547}
2548
2549// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2550// Moreover, server responds RCODE=FORMERR even on non-EDNS query.
2551TEST_F(ResolverTest, BogusDnsServer) {
2552 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2553 const char CLEARTEXT_PORT[] = "53";
2554 const char TLS_PORT[] = "853";
2555 const char* host_name1 = "nonexistent1.example.com.";
2556 const char* host_name2 = "nonexistent2.example.com.";
2557 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
2558
Mike Yufc125e42019-05-15 20:41:28 +08002559 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Ken Chen0a015532019-01-02 14:59:38 +08002560 ASSERT_TRUE(dns.startServer());
2561 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2562 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08002563 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002564 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
2565
Ken Chen0a015532019-01-02 14:59:38 +08002566 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
2567 tls.stopServer();
2568 dns.setEdns(test::DNSResponder::Edns::FORMERR_UNCOND);
2569
2570 const hostent* h_result = gethostbyname(host_name1);
2571 EXPECT_EQ(0U, GetNumQueries(dns, host_name1));
2572 ASSERT_TRUE(h_result == nullptr);
2573 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2574
2575 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2576 ScopedAddrinfo ai_result = safe_getaddrinfo(host_name2, nullptr, &hints);
2577 EXPECT_TRUE(ai_result == nullptr);
2578 EXPECT_EQ(0U, GetNumQueries(dns, host_name2));
2579}
2580
nuccachena26cc2a2018-07-17 18:07:23 +08002581TEST_F(ResolverTest, GetAddrInfo_Dns64Synthesize) {
2582 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002583 constexpr char dns64_name[] = "ipv4only.arpa.";
2584 constexpr char host_name[] = "v4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002585 const std::vector<DnsRecord> records = {
2586 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2587 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2588 };
nuccachena26cc2a2018-07-17 18:07:23 +08002589
Xiao Ma09b71022018-12-11 17:56:32 +09002590 test::DNSResponder dns(listen_addr);
Xiao Ma09b71022018-12-11 17:56:32 +09002591 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002592
2593 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002594 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002595
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002596 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002597 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002598 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002599
2600 // hints are necessary in order to let netd know which type of addresses the caller is
2601 // interested in.
Xiao Ma09b71022018-12-11 17:56:32 +09002602 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08002603 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
2604 EXPECT_TRUE(result != nullptr);
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002605 // TODO: BUG: there should only be two queries, one AAAA (which returns no records) and one A
2606 // (which returns 1.2.3.4). But there is an extra AAAA.
2607 EXPECT_EQ(3U, GetNumQueries(dns, host_name));
nuccachena26cc2a2018-07-17 18:07:23 +08002608
2609 std::string result_str = ToString(result);
2610 EXPECT_EQ(result_str, "64:ff9b::102:304");
2611
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002612 // Stopping NAT64 prefix discovery disables synthesis.
Luke Huang5bd827c2019-03-14 16:10:04 +08002613 EXPECT_TRUE(mDnsClient.resolvService()->stopPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002614 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_NOT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002615
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002616 dns.clearQueries();
nuccachena26cc2a2018-07-17 18:07:23 +08002617
2618 result = safe_getaddrinfo("v4only", nullptr, &hints);
2619 EXPECT_TRUE(result != nullptr);
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002620 // TODO: BUG: there should only be one query, an AAAA (which returns no records), because the
2621 // A is already cached. But there is an extra AAAA.
2622 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
nuccachena26cc2a2018-07-17 18:07:23 +08002623
2624 result_str = ToString(result);
2625 EXPECT_EQ(result_str, "1.2.3.4");
2626}
2627
nuccachena26cc2a2018-07-17 18:07:23 +08002628TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecified) {
2629 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002630 constexpr char dns64_name[] = "ipv4only.arpa.";
2631 constexpr char host_name[] = "v4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002632 const std::vector<DnsRecord> records = {
2633 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2634 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2635 };
nuccachena26cc2a2018-07-17 18:07:23 +08002636
Xiao Ma09b71022018-12-11 17:56:32 +09002637 test::DNSResponder dns(listen_addr);
2638 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002639 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002640 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002641
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002642 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002643 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002644 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002645
2646 // Ensure to synthesize AAAA if AF_INET6 is specified, and not to synthesize AAAA
2647 // in AF_INET case.
2648 addrinfo hints;
2649 memset(&hints, 0, sizeof(hints));
2650 hints.ai_family = AF_INET6;
2651 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
2652 EXPECT_TRUE(result != nullptr);
2653 std::string result_str = ToString(result);
2654 EXPECT_EQ(result_str, "64:ff9b::102:304");
2655
2656 hints.ai_family = AF_INET;
2657 result = safe_getaddrinfo("v4only", nullptr, &hints);
2658 EXPECT_TRUE(result != nullptr);
2659 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2660 result_str = ToString(result);
2661 EXPECT_EQ(result_str, "1.2.3.4");
2662}
nuccachena26cc2a2018-07-17 18:07:23 +08002663
2664TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedV6) {
2665 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002666 constexpr char dns64_name[] = "ipv4only.arpa.";
2667 constexpr char host_name[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002668 const std::vector<DnsRecord> records = {
2669 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2670 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2671 {host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
2672 };
nuccachena26cc2a2018-07-17 18:07:23 +08002673
Xiao Ma09b71022018-12-11 17:56:32 +09002674 test::DNSResponder dns(listen_addr);
2675 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002676 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002677 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002678
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002679 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002680 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002681 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002682
Xiao Ma09b71022018-12-11 17:56:32 +09002683 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08002684 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
2685 EXPECT_TRUE(result != nullptr);
2686 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2687
2688 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
Xiao Ma09b71022018-12-11 17:56:32 +09002689 const std::vector<std::string> result_strs = ToStrings(result);
nuccachena26cc2a2018-07-17 18:07:23 +08002690 for (const auto& str : result_strs) {
2691 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
2692 << ", result_str='" << str << "'";
2693 }
2694}
2695
2696TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedNoV6) {
2697 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002698 constexpr char dns64_name[] = "ipv4only.arpa.";
2699 constexpr char host_name[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002700 const std::vector<DnsRecord> records = {
2701 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2702 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2703 };
nuccachena26cc2a2018-07-17 18:07:23 +08002704
Xiao Ma09b71022018-12-11 17:56:32 +09002705 test::DNSResponder dns(listen_addr);
2706 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002707 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002708 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002709
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002710 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002711 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002712 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002713
Xiao Ma09b71022018-12-11 17:56:32 +09002714 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08002715 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
2716 EXPECT_TRUE(result != nullptr);
2717 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2718
2719 // In AF_UNSPEC case, synthesize AAAA if there's no AAAA answer.
2720 std::string result_str = ToString(result);
2721 EXPECT_EQ(result_str, "64:ff9b::102:304");
2722}
2723
2724TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecialUseIPv4Addresses) {
2725 constexpr char THIS_NETWORK[] = "this_network";
2726 constexpr char LOOPBACK[] = "loopback";
2727 constexpr char LINK_LOCAL[] = "link_local";
2728 constexpr char MULTICAST[] = "multicast";
2729 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
2730
2731 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
2732 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
2733 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
2734 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
2735 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
2736
2737 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002738 constexpr char dns64_name[] = "ipv4only.arpa.";
2739
Xiao Ma09b71022018-12-11 17:56:32 +09002740 test::DNSResponder dns(listen_addr);
2741 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08002742 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002743 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002744
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002745 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002746 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002747 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002748
Luke Huangf8215372019-11-22 11:53:41 +08002749 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08002750 static const struct TestConfig {
2751 std::string name;
2752 std::string addr;
2753
2754 std::string asHostName() const { return StringPrintf("%s.example.com.", name.c_str()); }
2755 } testConfigs[]{
2756 {THIS_NETWORK, ADDR_THIS_NETWORK},
2757 {LOOPBACK, ADDR_LOOPBACK},
2758 {LINK_LOCAL, ADDR_LINK_LOCAL},
2759 {MULTICAST, ADDR_MULTICAST},
2760 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
2761 };
Luke Huangf8215372019-11-22 11:53:41 +08002762 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08002763
2764 for (const auto& config : testConfigs) {
2765 const std::string testHostName = config.asHostName();
2766 SCOPED_TRACE(testHostName);
2767
2768 const char* host_name = testHostName.c_str();
2769 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
2770
2771 addrinfo hints;
2772 memset(&hints, 0, sizeof(hints));
2773 hints.ai_family = AF_INET6;
2774 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
2775 // In AF_INET6 case, don't return IPv4 answers
2776 EXPECT_TRUE(result == nullptr);
2777 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2778 dns.clearQueries();
2779
2780 memset(&hints, 0, sizeof(hints));
2781 hints.ai_family = AF_UNSPEC;
2782 result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
2783 EXPECT_TRUE(result != nullptr);
2784 // Expect IPv6 query only. IPv4 answer has been cached in previous query.
2785 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2786 // In AF_UNSPEC case, don't synthesize special use IPv4 address.
2787 std::string result_str = ToString(result);
2788 EXPECT_EQ(result_str, config.addr.c_str());
2789 dns.clearQueries();
2790 }
2791}
2792
2793TEST_F(ResolverTest, GetAddrInfo_Dns64QueryWithNullArgumentHints) {
2794 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002795 constexpr char dns64_name[] = "ipv4only.arpa.";
2796 constexpr char host_name[] = "v4only.example.com.";
2797 constexpr char host_name2[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002798 const std::vector<DnsRecord> records = {
2799 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2800 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2801 {host_name2, ns_type::ns_t_a, "1.2.3.4"},
2802 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
2803 };
nuccachena26cc2a2018-07-17 18:07:23 +08002804
Xiao Ma09b71022018-12-11 17:56:32 +09002805 test::DNSResponder dns(listen_addr);
2806 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002807 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002808 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002809
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002810 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002811 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002812 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002813
2814 // Assign argument hints of getaddrinfo() as null is equivalent to set ai_family AF_UNSPEC.
2815 // In AF_UNSPEC case, synthesize AAAA if there has A answer only.
2816 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, nullptr);
2817 EXPECT_TRUE(result != nullptr);
2818 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2819 std::string result_str = ToString(result);
2820 EXPECT_EQ(result_str, "64:ff9b::102:304");
2821 dns.clearQueries();
2822
2823 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
2824 result = safe_getaddrinfo("v4v6", nullptr, nullptr);
2825 EXPECT_TRUE(result != nullptr);
2826 EXPECT_LE(2U, GetNumQueries(dns, host_name2));
2827 std::vector<std::string> result_strs = ToStrings(result);
2828 for (const auto& str : result_strs) {
2829 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
2830 << ", result_str='" << str << "'";
2831 }
2832}
2833
2834TEST_F(ResolverTest, GetAddrInfo_Dns64QueryNullArgumentNode) {
2835 constexpr char ADDR_ANYADDR_V4[] = "0.0.0.0";
2836 constexpr char ADDR_ANYADDR_V6[] = "::";
2837 constexpr char ADDR_LOCALHOST_V4[] = "127.0.0.1";
2838 constexpr char ADDR_LOCALHOST_V6[] = "::1";
2839
2840 constexpr char PORT_NAME_HTTP[] = "http";
2841 constexpr char PORT_NUMBER_HTTP[] = "80";
2842
2843 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002844 constexpr char dns64_name[] = "ipv4only.arpa.";
2845
Xiao Ma09b71022018-12-11 17:56:32 +09002846 test::DNSResponder dns(listen_addr);
2847 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08002848 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002849 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002850
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002851 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002852 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002853 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002854
Luke Huangf8215372019-11-22 11:53:41 +08002855 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08002856 // If node is null, return address is listed by libc/getaddrinfo.c as follows.
2857 // - passive socket -> anyaddr (0.0.0.0 or ::)
2858 // - non-passive socket -> localhost (127.0.0.1 or ::1)
2859 static const struct TestConfig {
2860 int flag;
2861 std::string addr_v4;
2862 std::string addr_v6;
2863
2864 std::string asParameters() const {
2865 return StringPrintf("flag=%d, addr_v4=%s, addr_v6=%s", flag, addr_v4.c_str(),
2866 addr_v6.c_str());
2867 }
2868 } testConfigs[]{
2869 {0 /* non-passive */, ADDR_LOCALHOST_V4, ADDR_LOCALHOST_V6},
2870 {AI_PASSIVE, ADDR_ANYADDR_V4, ADDR_ANYADDR_V6}
2871 };
Luke Huangf8215372019-11-22 11:53:41 +08002872 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08002873
2874 for (const auto& config : testConfigs) {
2875 SCOPED_TRACE(config.asParameters());
2876
Xiao Ma09b71022018-12-11 17:56:32 +09002877 addrinfo hints = {
Nick Desaulnierscd6395a2019-10-11 09:15:24 -07002878 .ai_flags = config.flag,
Xiao Ma09b71022018-12-11 17:56:32 +09002879 .ai_family = AF_UNSPEC, // any address family
2880 .ai_socktype = 0, // any type
2881 .ai_protocol = 0, // any protocol
Xiao Ma09b71022018-12-11 17:56:32 +09002882 };
nuccachena26cc2a2018-07-17 18:07:23 +08002883
2884 // Assign hostname as null and service as port name.
2885 ScopedAddrinfo result = safe_getaddrinfo(nullptr, PORT_NAME_HTTP, &hints);
2886 ASSERT_TRUE(result != nullptr);
2887
2888 // Can't be synthesized because it should not get into Netd.
2889 std::vector<std::string> result_strs = ToStrings(result);
2890 for (const auto& str : result_strs) {
2891 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
2892 << ", result_str='" << str << "'";
2893 }
2894
2895 // Assign hostname as null and service as numeric port number.
2896 hints.ai_flags = config.flag | AI_NUMERICSERV;
2897 result = safe_getaddrinfo(nullptr, PORT_NUMBER_HTTP, &hints);
2898 ASSERT_TRUE(result != nullptr);
2899
2900 // Can't be synthesized because it should not get into Netd.
2901 result_strs = ToStrings(result);
2902 for (const auto& str : result_strs) {
2903 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
2904 << ", result_str='" << str << "'";
2905 }
2906 }
2907}
2908
2909TEST_F(ResolverTest, GetHostByAddr_ReverseDnsQueryWithHavingNat64Prefix) {
2910 struct hostent* result = nullptr;
2911 struct in_addr v4addr;
2912 struct in6_addr v6addr;
2913
2914 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002915 constexpr char dns64_name[] = "ipv4only.arpa.";
2916 constexpr char ptr_name[] = "v4v6.example.com.";
2917 // PTR record for IPv4 address 1.2.3.4
2918 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
2919 // PTR record for IPv6 address 2001:db8::102:304
2920 constexpr char ptr_addr_v6[] =
2921 "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 +09002922 const std::vector<DnsRecord> records = {
2923 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2924 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
2925 {ptr_addr_v6, ns_type::ns_t_ptr, ptr_name},
2926 };
nuccachena26cc2a2018-07-17 18:07:23 +08002927
Xiao Ma09b71022018-12-11 17:56:32 +09002928 test::DNSResponder dns(listen_addr);
2929 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002930 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002931 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002932
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002933 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002934 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002935 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002936
2937 // Reverse IPv4 DNS query. Prefix should have no effect on it.
2938 inet_pton(AF_INET, "1.2.3.4", &v4addr);
2939 result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
2940 ASSERT_TRUE(result != nullptr);
2941 std::string result_str = result->h_name ? result->h_name : "null";
2942 EXPECT_EQ(result_str, "v4v6.example.com");
2943
2944 // Reverse IPv6 DNS query. Prefix should have no effect on it.
2945 inet_pton(AF_INET6, "2001:db8::102:304", &v6addr);
2946 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
2947 ASSERT_TRUE(result != nullptr);
2948 result_str = result->h_name ? result->h_name : "null";
2949 EXPECT_EQ(result_str, "v4v6.example.com");
2950}
2951
2952TEST_F(ResolverTest, GetHostByAddr_ReverseDns64Query) {
2953 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002954 constexpr char dns64_name[] = "ipv4only.arpa.";
2955 constexpr char ptr_name[] = "v4only.example.com.";
2956 // PTR record for IPv4 address 1.2.3.4
2957 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
2958 // PTR record for IPv6 address 64:ff9b::1.2.3.4
2959 constexpr char ptr_addr_v6_nomapping[] =
2960 "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.";
2961 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
2962 // PTR record for IPv6 address 64:ff9b::5.6.7.8
2963 constexpr char ptr_addr_v6_synthesis[] =
2964 "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 +09002965 const std::vector<DnsRecord> records = {
2966 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2967 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
2968 {ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis},
2969 };
nuccachena26cc2a2018-07-17 18:07:23 +08002970
Xiao Ma09b71022018-12-11 17:56:32 +09002971 test::DNSResponder dns(listen_addr);
2972 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002973 // "ptr_addr_v6_nomapping" is not mapped in DNS server
nuccachena26cc2a2018-07-17 18:07:23 +08002974 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002975 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002976
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002977 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002978 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002979 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002980
2981 // Synthesized PTR record doesn't exist on DNS server
2982 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
2983 // After querying synthesized address failed, expect that prefix is removed from IPv6
2984 // synthesized address and do reverse IPv4 query instead.
2985 struct in6_addr v6addr;
2986 inet_pton(AF_INET6, "64:ff9b::1.2.3.4", &v6addr);
2987 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
2988 ASSERT_TRUE(result != nullptr);
2989 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist
2990 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist
2991 std::string result_str = result->h_name ? result->h_name : "null";
2992 EXPECT_EQ(result_str, "v4only.example.com");
2993 // Check that return address has been mapped from IPv4 to IPv6 address because Netd
2994 // removes NAT64 prefix and does IPv4 DNS reverse lookup in this case. Then, Netd
2995 // fakes the return IPv4 address as original queried IPv6 address.
2996 result_str = ToString(result);
2997 EXPECT_EQ(result_str, "64:ff9b::102:304");
2998 dns.clearQueries();
2999
3000 // Synthesized PTR record exists on DNS server
3001 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
3002 // Expect to Netd pass through synthesized address for DNS queries.
3003 inet_pton(AF_INET6, "64:ff9b::5.6.7.8", &v6addr);
3004 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3005 ASSERT_TRUE(result != nullptr);
3006 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
3007 result_str = result->h_name ? result->h_name : "null";
3008 EXPECT_EQ(result_str, "v6synthesis.example.com");
3009}
3010
3011TEST_F(ResolverTest, GetHostByAddr_ReverseDns64QueryFromHostFile) {
3012 constexpr char dns64_name[] = "ipv4only.arpa.";
3013 constexpr char host_name[] = "localhost";
3014 // The address is synthesized by prefix64:localhost.
3015 constexpr char host_addr[] = "64:ff9b::7f00:1";
nuccachena26cc2a2018-07-17 18:07:23 +08003016 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003017
3018 test::DNSResponder dns(listen_addr);
3019 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003020 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003021 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003022
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003023 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003024 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003025 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003026
3027 // Using synthesized "localhost" address to be a trick for resolving host name
3028 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
3029 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
3030 struct in6_addr v6addr;
3031 inet_pton(AF_INET6, host_addr, &v6addr);
3032 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3033 ASSERT_TRUE(result != nullptr);
3034 // Expect no DNS queries; localhost is resolved via /etc/hosts.
3035 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
3036
Luke Huangf8215372019-11-22 11:53:41 +08003037 ASSERT_EQ(sizeof(in6_addr), (unsigned)result->h_length);
nuccachena26cc2a2018-07-17 18:07:23 +08003038 ASSERT_EQ(AF_INET6, result->h_addrtype);
3039 std::string result_str = ToString(result);
3040 EXPECT_EQ(result_str, host_addr);
3041 result_str = result->h_name ? result->h_name : "null";
3042 EXPECT_EQ(result_str, host_name);
3043}
3044
Hungming Chen9e6185a2019-06-04 16:09:19 +08003045TEST_F(ResolverTest, GetHostByAddr_cnamesClasslessReverseDelegation) {
3046 // IPv4 addresses in the subnet with notation '/' or '-'.
3047 constexpr char addr_slash[] = "192.0.2.1";
3048 constexpr char addr_hyphen[] = "192.0.3.1";
3049
3050 // Used to verify DNS reverse query for classless reverse lookup zone. See detail in RFC 2317
3051 // section 4.
3052 const static std::vector<DnsRecord> records = {
3053 // The records for reverse querying "192.0.2.1" in the subnet with notation '/'.
3054 {"1.2.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0/25.2.0.192.in-addr.arpa."},
3055 {"1.0/25.2.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3056
3057 // The records for reverse querying "192.0.3.1" in the subnet with notation '-'.
3058 {"1.3.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0-127.3.0.192.in-addr.arpa."},
3059 {"1.0-127.3.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3060 };
3061
3062 test::DNSResponder dns;
3063 StartDns(dns, records);
3064 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3065
3066 for (const auto& address : {addr_slash, addr_hyphen}) {
3067 SCOPED_TRACE(address);
3068
3069 in_addr v4addr;
3070 ASSERT_TRUE(inet_pton(AF_INET, address, &v4addr));
3071 hostent* result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
3072 ASSERT_TRUE(result != nullptr);
3073 EXPECT_STREQ("hello.example.com", result->h_name);
3074 }
3075}
3076
nuccachena26cc2a2018-07-17 18:07:23 +08003077TEST_F(ResolverTest, GetNameInfo_ReverseDnsQueryWithHavingNat64Prefix) {
3078 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003079 constexpr char dns64_name[] = "ipv4only.arpa.";
3080 constexpr char ptr_name[] = "v4v6.example.com.";
3081 // PTR record for IPv4 address 1.2.3.4
3082 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3083 // PTR record for IPv6 address 2001:db8::102:304
3084 constexpr char ptr_addr_v6[] =
3085 "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 +09003086 const std::vector<DnsRecord> records = {
3087 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3088 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3089 {ptr_addr_v6, ns_type::ns_t_ptr, ptr_name},
3090 };
nuccachena26cc2a2018-07-17 18:07:23 +08003091
Xiao Ma09b71022018-12-11 17:56:32 +09003092 test::DNSResponder dns(listen_addr);
3093 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003094 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003095 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003096
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003097 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003098 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003099 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003100
Luke Huangf8215372019-11-22 11:53:41 +08003101 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003102 static const struct TestConfig {
3103 int flag;
3104 int family;
3105 std::string addr;
3106 std::string host;
3107
3108 std::string asParameters() const {
3109 return StringPrintf("flag=%d, family=%d, addr=%s, host=%s", flag, family, addr.c_str(),
3110 host.c_str());
3111 }
3112 } testConfigs[]{
3113 {NI_NAMEREQD, AF_INET, "1.2.3.4", "v4v6.example.com"},
3114 {NI_NUMERICHOST, AF_INET, "1.2.3.4", "1.2.3.4"},
3115 {0, AF_INET, "1.2.3.4", "v4v6.example.com"},
3116 {0, AF_INET, "5.6.7.8", "5.6.7.8"}, // unmapped
3117 {NI_NAMEREQD, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
3118 {NI_NUMERICHOST, AF_INET6, "2001:db8::102:304", "2001:db8::102:304"},
3119 {0, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
3120 {0, AF_INET6, "2001:db8::506:708", "2001:db8::506:708"}, // unmapped
3121 };
Luke Huangf8215372019-11-22 11:53:41 +08003122 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003123
3124 // Reverse IPv4/IPv6 DNS query. Prefix should have no effect on it.
3125 for (const auto& config : testConfigs) {
3126 SCOPED_TRACE(config.asParameters());
3127
3128 int rv;
3129 char host[NI_MAXHOST];
3130 struct sockaddr_in sin;
3131 struct sockaddr_in6 sin6;
3132 if (config.family == AF_INET) {
3133 memset(&sin, 0, sizeof(sin));
3134 sin.sin_family = AF_INET;
3135 inet_pton(AF_INET, config.addr.c_str(), &sin.sin_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003136 rv = getnameinfo((const struct sockaddr*)&sin, sizeof(sin), host, sizeof(host), nullptr,
3137 0, config.flag);
nuccachena26cc2a2018-07-17 18:07:23 +08003138 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4));
3139 } else if (config.family == AF_INET6) {
3140 memset(&sin6, 0, sizeof(sin6));
3141 sin6.sin6_family = AF_INET6;
3142 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003143 rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host),
nuccachena26cc2a2018-07-17 18:07:23 +08003144 nullptr, 0, config.flag);
3145 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6));
3146 }
3147 ASSERT_EQ(0, rv);
3148 std::string result_str = host;
3149 EXPECT_EQ(result_str, config.host);
3150 dns.clearQueries();
3151 }
3152}
3153
3154TEST_F(ResolverTest, GetNameInfo_ReverseDns64Query) {
3155 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003156 constexpr char dns64_name[] = "ipv4only.arpa.";
3157 constexpr char ptr_name[] = "v4only.example.com.";
3158 // PTR record for IPv4 address 1.2.3.4
3159 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3160 // PTR record for IPv6 address 64:ff9b::1.2.3.4
3161 constexpr char ptr_addr_v6_nomapping[] =
3162 "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.";
3163 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
3164 // PTR record for IPv6 address 64:ff9b::5.6.7.8
3165 constexpr char ptr_addr_v6_synthesis[] =
3166 "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 +09003167 const std::vector<DnsRecord> records = {
3168 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3169 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3170 {ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis},
3171 };
nuccachena26cc2a2018-07-17 18:07:23 +08003172
Xiao Ma09b71022018-12-11 17:56:32 +09003173 test::DNSResponder dns(listen_addr);
3174 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003175 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003176 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003177
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003178 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003179 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003180 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003181
Luke Huangf8215372019-11-22 11:53:41 +08003182 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003183 static const struct TestConfig {
3184 bool hasSynthesizedPtrRecord;
3185 int flag;
3186 std::string addr;
3187 std::string host;
3188
3189 std::string asParameters() const {
3190 return StringPrintf("hasSynthesizedPtrRecord=%d, flag=%d, addr=%s, host=%s",
3191 hasSynthesizedPtrRecord, flag, addr.c_str(), host.c_str());
3192 }
3193 } testConfigs[]{
3194 {false, NI_NAMEREQD, "64:ff9b::102:304", "v4only.example.com"},
3195 {false, NI_NUMERICHOST, "64:ff9b::102:304", "64:ff9b::102:304"},
3196 {false, 0, "64:ff9b::102:304", "v4only.example.com"},
3197 {true, NI_NAMEREQD, "64:ff9b::506:708", "v6synthesis.example.com"},
3198 {true, NI_NUMERICHOST, "64:ff9b::506:708", "64:ff9b::506:708"},
3199 {true, 0, "64:ff9b::506:708", "v6synthesis.example.com"}
3200 };
Luke Huangf8215372019-11-22 11:53:41 +08003201 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003202
3203 // hasSynthesizedPtrRecord = false
3204 // Synthesized PTR record doesn't exist on DNS server
3205 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
3206 // After querying synthesized address failed, expect that prefix is removed from IPv6
3207 // synthesized address and do reverse IPv4 query instead.
3208 //
3209 // hasSynthesizedPtrRecord = true
3210 // Synthesized PTR record exists on DNS server
3211 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
3212 // Expect to just pass through synthesized address for DNS queries.
3213 for (const auto& config : testConfigs) {
3214 SCOPED_TRACE(config.asParameters());
3215
3216 char host[NI_MAXHOST];
3217 struct sockaddr_in6 sin6;
3218 memset(&sin6, 0, sizeof(sin6));
3219 sin6.sin6_family = AF_INET6;
3220 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003221 int rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host),
nuccachena26cc2a2018-07-17 18:07:23 +08003222 nullptr, 0, config.flag);
3223 ASSERT_EQ(0, rv);
3224 if (config.flag == NI_NAMEREQD) {
3225 if (config.hasSynthesizedPtrRecord) {
3226 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
3227 } else {
3228 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist.
3229 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist.
3230 }
3231 }
3232 std::string result_str = host;
3233 EXPECT_EQ(result_str, config.host);
3234 dns.clearQueries();
3235 }
3236}
3237
3238TEST_F(ResolverTest, GetNameInfo_ReverseDns64QueryFromHostFile) {
3239 constexpr char dns64_name[] = "ipv4only.arpa.";
3240 constexpr char host_name[] = "localhost";
3241 // The address is synthesized by prefix64:localhost.
3242 constexpr char host_addr[] = "64:ff9b::7f00:1";
nuccachena26cc2a2018-07-17 18:07:23 +08003243 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003244
3245 test::DNSResponder dns(listen_addr);
3246 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003247 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003248 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003249
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003250 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003251 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003252 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003253
3254 // Using synthesized "localhost" address to be a trick for resolving host name
3255 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
3256 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
3257 char host[NI_MAXHOST];
Xiao Ma09b71022018-12-11 17:56:32 +09003258 struct sockaddr_in6 sin6 = {.sin6_family = AF_INET6};
nuccachena26cc2a2018-07-17 18:07:23 +08003259 inet_pton(AF_INET6, host_addr, &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003260 int rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host), nullptr,
nuccachena26cc2a2018-07-17 18:07:23 +08003261 0, NI_NAMEREQD);
3262 ASSERT_EQ(0, rv);
3263 // Expect no DNS queries; localhost is resolved via /etc/hosts.
3264 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
3265
3266 std::string result_str = host;
3267 EXPECT_EQ(result_str, host_name);
3268}
3269
Hungming Chen9e6185a2019-06-04 16:09:19 +08003270TEST_F(ResolverTest, GetNameInfo_cnamesClasslessReverseDelegation) {
3271 // IPv4 addresses in the subnet with notation '/' or '-'.
3272 constexpr char addr_slash[] = "192.0.2.1";
3273 constexpr char addr_hyphen[] = "192.0.3.1";
3274
3275 // Used to verify DNS reverse query for classless reverse lookup zone. See detail in RFC 2317
3276 // section 4.
3277 const static std::vector<DnsRecord> records = {
3278 // The records for reverse querying "192.0.2.1" in the subnet with notation '/'.
3279 {"1.2.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0/25.2.0.192.in-addr.arpa."},
3280 {"1.0/25.2.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3281
3282 // The records for reverse querying "192.0.3.1" in the subnet with notation '-'.
3283 {"1.3.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0-127.3.0.192.in-addr.arpa."},
3284 {"1.0-127.3.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3285 };
3286
3287 test::DNSResponder dns;
3288 StartDns(dns, records);
3289 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3290
3291 for (const auto& address : {addr_slash, addr_hyphen}) {
3292 SCOPED_TRACE(address);
3293
3294 char host[NI_MAXHOST];
3295 sockaddr_in sin = {.sin_family = AF_INET};
3296 ASSERT_TRUE(inet_pton(AF_INET, address, &sin.sin_addr));
3297 int rv = getnameinfo((const sockaddr*)&sin, sizeof(sin), host, sizeof(host), nullptr, 0,
3298 NI_NAMEREQD);
3299 ASSERT_EQ(0, rv);
3300 EXPECT_STREQ("hello.example.com", host);
3301 }
3302}
3303
nuccachena26cc2a2018-07-17 18:07:23 +08003304TEST_F(ResolverTest, GetHostByName2_Dns64Synthesize) {
Xiao Ma09b71022018-12-11 17:56:32 +09003305 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003306 constexpr char dns64_name[] = "ipv4only.arpa.";
3307 constexpr char host_name[] = "ipv4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003308 const std::vector<DnsRecord> records = {
3309 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3310 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3311 };
nuccachena26cc2a2018-07-17 18:07:23 +08003312
Xiao Ma09b71022018-12-11 17:56:32 +09003313 test::DNSResponder dns(listen_addr);
3314 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003315 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003316 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003317
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003318 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003319 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003320 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003321
3322 // Query an IPv4-only hostname. Expect that gets a synthesized address.
3323 struct hostent* result = gethostbyname2("ipv4only", AF_INET6);
3324 ASSERT_TRUE(result != nullptr);
3325 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3326 std::string result_str = ToString(result);
3327 EXPECT_EQ(result_str, "64:ff9b::102:304");
3328}
nuccachena26cc2a2018-07-17 18:07:23 +08003329
3330TEST_F(ResolverTest, GetHostByName2_DnsQueryWithHavingNat64Prefix) {
3331 constexpr char dns64_name[] = "ipv4only.arpa.";
3332 constexpr char host_name[] = "v4v6.example.com.";
nuccachena26cc2a2018-07-17 18:07:23 +08003333 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003334 const std::vector<DnsRecord> records = {
3335 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3336 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3337 {host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
3338 };
3339
3340 test::DNSResponder dns(listen_addr);
3341 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003342 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003343 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003344
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003345 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003346 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003347 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003348
3349 // IPv4 DNS query. Prefix should have no effect on it.
3350 struct hostent* result = gethostbyname2("v4v6", AF_INET);
3351 ASSERT_TRUE(result != nullptr);
3352 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3353 std::string result_str = ToString(result);
3354 EXPECT_EQ(result_str, "1.2.3.4");
3355 dns.clearQueries();
3356
3357 // IPv6 DNS query. Prefix should have no effect on it.
3358 result = gethostbyname2("v4v6", AF_INET6);
3359 ASSERT_TRUE(result != nullptr);
3360 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3361 result_str = ToString(result);
3362 EXPECT_EQ(result_str, "2001:db8::102:304");
3363}
3364
3365TEST_F(ResolverTest, GetHostByName2_Dns64QuerySpecialUseIPv4Addresses) {
3366 constexpr char THIS_NETWORK[] = "this_network";
3367 constexpr char LOOPBACK[] = "loopback";
3368 constexpr char LINK_LOCAL[] = "link_local";
3369 constexpr char MULTICAST[] = "multicast";
3370 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
3371
3372 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
3373 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
3374 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
3375 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
3376 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
3377
3378 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003379 constexpr char dns64_name[] = "ipv4only.arpa.";
3380
Xiao Ma09b71022018-12-11 17:56:32 +09003381 test::DNSResponder dns(listen_addr);
3382 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003383 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003384 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003385
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003386 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003387 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003388 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003389
Luke Huangf8215372019-11-22 11:53:41 +08003390 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003391 static const struct TestConfig {
3392 std::string name;
3393 std::string addr;
3394
3395 std::string asHostName() const {
Luke Huangf8215372019-11-22 11:53:41 +08003396 return StringPrintf("%s.example.com.", name.c_str());
nuccachena26cc2a2018-07-17 18:07:23 +08003397 }
3398 } testConfigs[]{
3399 {THIS_NETWORK, ADDR_THIS_NETWORK},
3400 {LOOPBACK, ADDR_LOOPBACK},
3401 {LINK_LOCAL, ADDR_LINK_LOCAL},
3402 {MULTICAST, ADDR_MULTICAST},
3403 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
3404 };
Luke Huangf8215372019-11-22 11:53:41 +08003405 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003406
3407 for (const auto& config : testConfigs) {
3408 const std::string testHostName = config.asHostName();
3409 SCOPED_TRACE(testHostName);
3410
3411 const char* host_name = testHostName.c_str();
3412 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
3413
3414 struct hostent* result = gethostbyname2(config.name.c_str(), AF_INET6);
3415 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3416
3417 // In AF_INET6 case, don't synthesize special use IPv4 address.
3418 // Expect to have no answer
3419 EXPECT_EQ(nullptr, result);
3420
3421 dns.clearQueries();
3422 }
Bernie Innocenti2fef2b82018-12-20 15:56:40 +09003423}
Mike Yuf14e1a92019-05-10 13:54:58 +08003424
3425TEST_F(ResolverTest, PrefixDiscoveryBypassTls) {
3426 constexpr char listen_addr[] = "::1";
3427 constexpr char cleartext_port[] = "53";
3428 constexpr char tls_port[] = "853";
3429 constexpr char dns64_name[] = "ipv4only.arpa.";
3430 const std::vector<std::string> servers = {listen_addr};
3431
3432 test::DNSResponder dns(listen_addr);
3433 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
3434 test::DnsTlsFrontend tls(listen_addr, tls_port, listen_addr, cleartext_port);
3435 ASSERT_TRUE(tls.startServer());
3436
3437 // Setup OPPORTUNISTIC mode and wait for the validation complete.
waynema0e73c2e2019-07-31 15:04:08 +08003438 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08003439 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Mike Yuf14e1a92019-05-10 13:54:58 +08003440 tls.clearQueries();
3441
3442 // Start NAT64 prefix discovery and wait for it complete.
3443 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003444 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
Mike Yuf14e1a92019-05-10 13:54:58 +08003445
3446 // Verify it bypassed TLS even though there's a TLS server available.
3447 EXPECT_EQ(0, tls.queries());
3448 EXPECT_EQ(1U, GetNumQueries(dns, dns64_name));
3449
3450 // Restart the testing network to reset the cache.
3451 mDnsClient.TearDown();
3452 mDnsClient.SetUp();
3453 dns.clearQueries();
3454
3455 // Setup STRICT mode and wait for the validation complete.
waynema0e73c2e2019-07-31 15:04:08 +08003456 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
3457 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08003458 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Mike Yuf14e1a92019-05-10 13:54:58 +08003459 tls.clearQueries();
3460
3461 // Start NAT64 prefix discovery and wait for it to complete.
3462 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003463 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
Mike Yuf14e1a92019-05-10 13:54:58 +08003464
3465 // Verify it bypassed TLS despite STRICT mode.
3466 EXPECT_EQ(0, tls.queries());
3467 EXPECT_EQ(1U, GetNumQueries(dns, dns64_name));
3468}
Luke Huang9807e6b2019-05-20 16:17:12 +08003469
3470namespace {
3471
Luke Huang0d592bc2019-05-25 18:24:03 +08003472class ScopedSetNetworkForProcess {
3473 public:
3474 explicit ScopedSetNetworkForProcess(unsigned netId) {
3475 mStoredNetId = getNetworkForProcess();
3476 if (netId == mStoredNetId) return;
3477 EXPECT_EQ(0, setNetworkForProcess(netId));
3478 }
3479 ~ScopedSetNetworkForProcess() { EXPECT_EQ(0, setNetworkForProcess(mStoredNetId)); }
3480
3481 private:
3482 unsigned mStoredNetId;
3483};
3484
3485class ScopedSetNetworkForResolv {
3486 public:
3487 explicit ScopedSetNetworkForResolv(unsigned netId) { EXPECT_EQ(0, setNetworkForResolv(netId)); }
3488 ~ScopedSetNetworkForResolv() { EXPECT_EQ(0, setNetworkForResolv(NETID_UNSET)); }
3489};
3490
Luke Huang9807e6b2019-05-20 16:17:12 +08003491void sendCommand(int fd, const std::string& cmd) {
3492 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size() + 1));
3493 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size() + 1));
3494}
3495
3496int32_t readBE32(int fd) {
3497 int32_t tmp;
3498 int n = TEMP_FAILURE_RETRY(read(fd, &tmp, sizeof(tmp)));
3499 EXPECT_TRUE(n > 0);
3500 return ntohl(tmp);
3501}
3502
Luke Huang0d592bc2019-05-25 18:24:03 +08003503int readResponseCode(int fd) {
Luke Huang9807e6b2019-05-20 16:17:12 +08003504 char buf[4];
3505 int n = TEMP_FAILURE_RETRY(read(fd, &buf, sizeof(buf)));
3506 EXPECT_TRUE(n > 0);
3507 // The format of response code is that 4 bytes for the code & null.
3508 buf[3] = '\0';
3509 int result;
3510 EXPECT_TRUE(ParseInt(buf, &result));
3511 return result;
3512}
3513
Luke Huang0d592bc2019-05-25 18:24:03 +08003514bool checkAndClearUseLocalNameserversFlag(unsigned* netid) {
3515 if (netid == nullptr || ((*netid) & NETID_USE_LOCAL_NAMESERVERS) == 0) {
3516 return false;
3517 }
3518 *netid = (*netid) & ~NETID_USE_LOCAL_NAMESERVERS;
3519 return true;
3520}
3521
Luke Huangf8215372019-11-22 11:53:41 +08003522aidl::android::net::UidRangeParcel makeUidRangeParcel(int start, int stop) {
3523 aidl::android::net::UidRangeParcel res;
Luke Huang0d592bc2019-05-25 18:24:03 +08003524 res.start = start;
3525 res.stop = stop;
3526
3527 return res;
3528}
3529
3530void expectNetIdWithLocalNameserversFlag(unsigned netId) {
3531 unsigned dnsNetId = 0;
3532 EXPECT_EQ(0, getNetworkForDns(&dnsNetId));
3533 EXPECT_TRUE(checkAndClearUseLocalNameserversFlag(&dnsNetId));
3534 EXPECT_EQ(netId, static_cast<unsigned>(dnsNetId));
3535}
3536
3537void expectDnsNetIdEquals(unsigned netId) {
3538 unsigned dnsNetId = 0;
3539 EXPECT_EQ(0, getNetworkForDns(&dnsNetId));
3540 EXPECT_EQ(netId, static_cast<unsigned>(dnsNetId));
3541}
3542
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003543void expectDnsNetIdIsDefaultNetwork(INetd* netdService) {
Luke Huang0d592bc2019-05-25 18:24:03 +08003544 int currentNetid;
3545 EXPECT_TRUE(netdService->networkGetDefault(&currentNetid).isOk());
3546 expectDnsNetIdEquals(currentNetid);
3547}
3548
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003549void expectDnsNetIdWithVpn(INetd* netdService, unsigned vpnNetId, unsigned expectedNetId) {
Luke Huang0d592bc2019-05-25 18:24:03 +08003550 EXPECT_TRUE(netdService->networkCreateVpn(vpnNetId, false /* secure */).isOk());
3551 uid_t uid = getuid();
3552 // Add uid to VPN
3553 EXPECT_TRUE(netdService->networkAddUidRanges(vpnNetId, {makeUidRangeParcel(uid, uid)}).isOk());
3554 expectDnsNetIdEquals(expectedNetId);
3555 EXPECT_TRUE(netdService->networkDestroy(vpnNetId).isOk());
3556}
3557
Luke Huang9807e6b2019-05-20 16:17:12 +08003558} // namespace
3559
3560TEST_F(ResolverTest, getDnsNetId) {
3561 // We've called setNetworkForProcess in SetupOemNetwork, so reset to default first.
3562 setNetworkForProcess(NETID_UNSET);
Luke Huang0d592bc2019-05-25 18:24:03 +08003563
3564 expectDnsNetIdIsDefaultNetwork(mDnsClient.netdService());
3565 expectDnsNetIdWithVpn(mDnsClient.netdService(), TEST_VPN_NETID, TEST_VPN_NETID);
Luke Huang9807e6b2019-05-20 16:17:12 +08003566
3567 // Test with setNetworkForProcess
Luke Huang0d592bc2019-05-25 18:24:03 +08003568 {
3569 ScopedSetNetworkForProcess scopedSetNetworkForProcess(TEST_NETID);
3570 expectDnsNetIdEquals(TEST_NETID);
3571 }
3572
3573 // Test with setNetworkForProcess with NETID_USE_LOCAL_NAMESERVERS
3574 {
3575 ScopedSetNetworkForProcess scopedSetNetworkForProcess(TEST_NETID |
3576 NETID_USE_LOCAL_NAMESERVERS);
3577 expectNetIdWithLocalNameserversFlag(TEST_NETID);
3578 }
Luke Huang9807e6b2019-05-20 16:17:12 +08003579
3580 // Test with setNetworkForResolv
Luke Huang0d592bc2019-05-25 18:24:03 +08003581 {
3582 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID);
3583 expectDnsNetIdEquals(TEST_NETID);
3584 }
3585
3586 // Test with setNetworkForResolv with NETID_USE_LOCAL_NAMESERVERS
3587 {
3588 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID |
3589 NETID_USE_LOCAL_NAMESERVERS);
3590 expectNetIdWithLocalNameserversFlag(TEST_NETID);
3591 }
3592
3593 // Test with setNetworkForResolv under bypassable vpn
3594 {
3595 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID);
3596 expectDnsNetIdWithVpn(mDnsClient.netdService(), TEST_VPN_NETID, TEST_NETID);
3597 }
Luke Huang9807e6b2019-05-20 16:17:12 +08003598
3599 // Create socket connected to DnsProxyListener
3600 int fd = dns_open_proxy();
3601 EXPECT_TRUE(fd > 0);
3602 unique_fd ufd(fd);
3603
3604 // Test command with wrong netId
3605 sendCommand(fd, "getdnsnetid abc");
Luke Huang0d592bc2019-05-25 18:24:03 +08003606 EXPECT_EQ(ResponseCode::DnsProxyQueryResult, readResponseCode(fd));
Luke Huang9807e6b2019-05-20 16:17:12 +08003607 EXPECT_EQ(-EINVAL, readBE32(fd));
3608
3609 // Test unsupported command
3610 sendCommand(fd, "getdnsnetidNotSupported");
3611 // Keep in sync with FrameworkListener.cpp (500, "Command not recognized")
Luke Huang0d592bc2019-05-25 18:24:03 +08003612 EXPECT_EQ(500, readResponseCode(fd));
Luke Huang9807e6b2019-05-20 16:17:12 +08003613}
Sehee Park2c118782019-05-07 13:02:45 +09003614
3615TEST_F(ResolverTest, BlockDnsQueryWithUidRule) {
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003616 // This test relies on blocking traffic on loopback, which xt_qtaguid does not do.
3617 // See aosp/358413 and b/34444781 for why.
3618 SKIP_IF_BPF_NOT_SUPPORTED;
3619
Sehee Park2c118782019-05-07 13:02:45 +09003620 constexpr char listen_addr1[] = "127.0.0.4";
3621 constexpr char listen_addr2[] = "::1";
3622 constexpr char host_name[] = "howdy.example.com.";
3623 const std::vector<DnsRecord> records = {
3624 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3625 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
3626 };
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003627 INetd* netdService = mDnsClient.netdService();
Sehee Park2c118782019-05-07 13:02:45 +09003628
3629 test::DNSResponder dns1(listen_addr1);
3630 test::DNSResponder dns2(listen_addr2);
3631 StartDns(dns1, records);
3632 StartDns(dns2, records);
3633
3634 std::vector<std::string> servers = {listen_addr1, listen_addr2};
3635 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
3636 dns1.clearQueries();
3637 dns2.clearQueries();
3638
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003639 // Add drop rule for TEST_UID. Also enable the standby chain because it might not be enabled.
3640 // Unfortunately we cannot use FIREWALL_CHAIN_NONE, or custom iptables rules, for this purpose
3641 // because netd calls fchown() on the DNS query sockets, and "iptables -m owner" matches the
3642 // UID of the socket creator, not the UID set by fchown().
3643 //
3644 // TODO: migrate FIREWALL_CHAIN_NONE to eBPF as well.
3645 EXPECT_TRUE(netdService->firewallEnableChildChain(INetd::FIREWALL_CHAIN_STANDBY, true).isOk());
3646 EXPECT_TRUE(netdService
Sehee Park2c118782019-05-07 13:02:45 +09003647 ->firewallSetUidRule(INetd::FIREWALL_CHAIN_STANDBY, TEST_UID,
3648 INetd::FIREWALL_RULE_DENY)
3649 .isOk());
3650
3651 // Save uid
3652 int suid = getuid();
3653
3654 // Switch to TEST_UID
3655 EXPECT_TRUE(seteuid(TEST_UID) == 0);
3656
3657 // Dns Query
3658 int fd1 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_a, 0);
3659 int fd2 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_aaaa, 0);
3660 EXPECT_TRUE(fd1 != -1);
3661 EXPECT_TRUE(fd2 != -1);
3662
3663 uint8_t buf[MAXPACKET] = {};
3664 int rcode;
3665 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
3666 EXPECT_EQ(-ECONNREFUSED, res);
3667
3668 memset(buf, 0, MAXPACKET);
3669 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
3670 EXPECT_EQ(-ECONNREFUSED, res);
3671
3672 // Restore uid
3673 EXPECT_TRUE(seteuid(suid) == 0);
3674
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003675 // Remove drop rule for TEST_UID, and disable the standby chain.
3676 EXPECT_TRUE(netdService
Sehee Park2c118782019-05-07 13:02:45 +09003677 ->firewallSetUidRule(INetd::FIREWALL_CHAIN_STANDBY, TEST_UID,
3678 INetd::FIREWALL_RULE_ALLOW)
3679 .isOk());
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003680 EXPECT_TRUE(netdService->firewallEnableChildChain(INetd::FIREWALL_CHAIN_STANDBY, false).isOk());
Sehee Park2c118782019-05-07 13:02:45 +09003681}
Mike Yua772c202019-09-23 17:47:21 +08003682
Mike Yu40e67072019-10-09 21:14:09 +08003683namespace {
3684
3685const std::string kDotConnectTimeoutMsFlag(
3686 "persist.device_config.netd_native.dot_connect_timeout_ms");
3687
3688class ScopedSystemProperties {
3689 public:
3690 explicit ScopedSystemProperties(const std::string& key, const std::string& value)
3691 : mStoredKey(key) {
3692 mStoredValue = android::base::GetProperty(key, "");
3693 android::base::SetProperty(key, value);
3694 }
3695 ~ScopedSystemProperties() { android::base::SetProperty(mStoredKey, mStoredValue); }
3696
3697 private:
3698 std::string mStoredKey;
3699 std::string mStoredValue;
3700};
3701
3702} // namespace
3703
Mike Yua772c202019-09-23 17:47:21 +08003704TEST_F(ResolverTest, ConnectTlsServerTimeout) {
Mike Yu40e67072019-10-09 21:14:09 +08003705 constexpr int expectedTimeout = 1000;
3706 constexpr char hostname1[] = "query1.example.com.";
3707 constexpr char hostname2[] = "query2.example.com.";
Mike Yua772c202019-09-23 17:47:21 +08003708 const std::vector<DnsRecord> records = {
Mike Yu40e67072019-10-09 21:14:09 +08003709 {hostname1, ns_type::ns_t_a, "1.2.3.4"},
3710 {hostname2, ns_type::ns_t_a, "1.2.3.5"},
Mike Yua772c202019-09-23 17:47:21 +08003711 };
3712
3713 test::DNSResponder dns;
3714 StartDns(dns, records);
Mike Yu40e67072019-10-09 21:14:09 +08003715 test::DnsTlsFrontend tls;
Mike Yua772c202019-09-23 17:47:21 +08003716 ASSERT_TRUE(tls.startServer());
3717
Mike Yu40e67072019-10-09 21:14:09 +08003718 // The resolver will adjust the timeout value to 1000ms since the value is too small.
3719 ScopedSystemProperties scopedSystemProperties(kDotConnectTimeoutMsFlag, "100");
Mike Yua772c202019-09-23 17:47:21 +08003720
Mike Yu40e67072019-10-09 21:14:09 +08003721 // Set up resolver to opportunistic mode with the default configuration.
Mike Yu8ac63402019-12-02 15:28:38 +08003722 const ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
Mike Yu40e67072019-10-09 21:14:09 +08003723 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
Mike Yua772c202019-09-23 17:47:21 +08003724 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
3725 dns.clearQueries();
3726 tls.clearQueries();
3727
3728 // The server becomes unresponsive to the handshake request.
3729 tls.setHangOnHandshakeForTesting(true);
3730
3731 // Expect the things happening in getaddrinfo():
3732 // 1. Connect to the private DNS server.
3733 // 2. SSL handshake times out.
3734 // 3. Fallback to UDP transport, and then get the answer.
Mike Yu40e67072019-10-09 21:14:09 +08003735 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
3736 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(hostname1, nullptr, hints);
Mike Yua772c202019-09-23 17:47:21 +08003737
Mike Yu40e67072019-10-09 21:14:09 +08003738 EXPECT_NE(nullptr, result);
Mike Yua772c202019-09-23 17:47:21 +08003739 EXPECT_EQ(0, tls.queries());
Mike Yu40e67072019-10-09 21:14:09 +08003740 EXPECT_EQ(1U, GetNumQueries(dns, hostname1));
3741 EXPECT_EQ(records.at(0).addr, ToString(result));
Mike Yua772c202019-09-23 17:47:21 +08003742
Mike Yu40e67072019-10-09 21:14:09 +08003743 // A loose upper bound is set by adding 2000ms buffer time. Theoretically, getaddrinfo()
3744 // should just take a bit more than expetTimeout milliseconds.
3745 EXPECT_GE(timeTakenMs, expectedTimeout);
3746 EXPECT_LE(timeTakenMs, expectedTimeout + 2000);
3747
3748 // Set the server to be responsive. Verify that the resolver will attempt to reconnect
3749 // to the server and then get the result within the timeout.
3750 tls.setHangOnHandshakeForTesting(false);
3751 std::tie(result, timeTakenMs) = safe_getaddrinfo_time_taken(hostname2, nullptr, hints);
3752
3753 EXPECT_NE(nullptr, result);
3754 EXPECT_EQ(1, tls.queries());
3755 EXPECT_EQ(1U, GetNumQueries(dns, hostname2));
3756 EXPECT_EQ(records.at(1).addr, ToString(result));
3757
3758 EXPECT_LE(timeTakenMs, expectedTimeout);
Mike Yua772c202019-09-23 17:47:21 +08003759}
Hungming Chenbb90ab32019-10-28 18:20:31 +08003760
Ken Chen766feae2019-10-30 15:13:44 +08003761TEST_F(ResolverTest, FlushNetworkCache) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08003762 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08003763 test::DNSResponder dns;
3764 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
3765 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3766
3767 const hostent* result = gethostbyname("hello");
3768 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
3769
3770 // get result from cache
3771 result = gethostbyname("hello");
3772 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
3773
3774 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
3775
3776 result = gethostbyname("hello");
3777 EXPECT_EQ(2U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
3778}
3779
3780TEST_F(ResolverTest, FlushNetworkCache_random) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08003781 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08003782 constexpr int num_flush = 10;
3783 constexpr int num_queries = 20;
3784 test::DNSResponder dns;
3785 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
3786 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3787 const addrinfo hints = {.ai_family = AF_INET};
3788
3789 std::thread t([this]() {
3790 for (int i = 0; i < num_flush; ++i) {
3791 unsigned delay = arc4random_uniform(10 * 1000); // 10ms
3792 usleep(delay);
3793 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
3794 }
3795 });
3796
3797 for (int i = 0; i < num_queries; ++i) {
3798 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
3799 EXPECT_TRUE(result != nullptr);
3800 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
3801 }
3802 t.join();
3803}
3804
3805// flush cache while one query is wait-for-response, another is pending.
3806TEST_F(ResolverTest, FlushNetworkCache_concurrent) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08003807 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08003808 const char* listen_addr1 = "127.0.0.9";
3809 const char* listen_addr2 = "127.0.0.10";
3810 test::DNSResponder dns1(listen_addr1);
3811 test::DNSResponder dns2(listen_addr2);
3812 StartDns(dns1, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
3813 StartDns(dns2, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
3814 addrinfo hints = {.ai_family = AF_INET};
3815
3816 // step 1: set server#1 into deferred responding mode
3817 dns1.setDeferredResp(true);
3818 std::thread t1([&listen_addr1, &hints, this]() {
3819 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr1}));
3820 // step 3: query
3821 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
3822 // step 9: check result
3823 EXPECT_TRUE(result != nullptr);
3824 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
3825 });
3826
3827 // step 2: wait for the query to reach the server
3828 while (GetNumQueries(dns1, kHelloExampleCom) == 0) {
3829 usleep(1000); // 1ms
3830 }
3831
3832 std::thread t2([&listen_addr2, &hints, &dns2, this]() {
3833 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr2}));
3834 // step 5: query (should be blocked in resolver)
3835 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
3836 // step 7: check result
3837 EXPECT_TRUE(result != nullptr);
3838 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
3839 EXPECT_EQ(1U, GetNumQueriesForType(dns2, ns_type::ns_t_a, kHelloExampleCom));
3840 });
3841
3842 // step 4: wait a bit for the 2nd query to enter pending state
3843 usleep(100 * 1000); // 100ms
3844 // step 6: flush cache (will unblock pending queries)
3845 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
3846 t2.join();
3847
3848 // step 8: resume server#1
3849 dns1.setDeferredResp(false);
3850 t1.join();
3851
3852 // step 10: verify if result is correctly cached
3853 dns2.clearQueries();
3854 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
3855 EXPECT_EQ(0U, GetNumQueries(dns2, kHelloExampleCom));
3856 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
3857}
3858
waynema29253052019-08-20 11:26:08 +08003859// TODO: Perhaps to have a boundary conditions test for TCP and UDP.
3860TEST_F(ResolverTest, TcpQueryWithOversizePayload) {
3861 test::DNSResponder dns;
3862 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
3863 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3864
3865 int fd = dns_open_proxy();
3866 ASSERT_TRUE(fd > 0);
3867
3868 // Sending DNS query over TCP once the packet sizes exceed 512 bytes.
3869 // The raw data is combined with Question section and Additional section
3870 // Question section : query "hello.example.com", type A, class IN
3871 // Additional section : type OPT (41), Option PADDING, Option Length 546
3872 // Padding option which allows DNS clients and servers to artificially
3873 // increase the size of a DNS message by a variable number of bytes.
3874 // See also RFC7830, section 3
3875 const std::string query =
3876 "+c0BAAABAAAAAAABBWhlbGxvB2V4YW1wbGUDY29tAAABAAEAACkgAAAAgAACJgAMAiIAAAAAAAAAAAAAAAAAA"
3877 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
3878 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
3879 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
3880 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
3881 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
3882 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
3883 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
3884 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
3885 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
3886 const std::string cmd =
3887 "resnsend " + std::to_string(TEST_NETID) + " 0 " /* ResNsendFlags */ + query + '\0';
3888 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
3889 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
3890 expectAnswersValid(fd, AF_INET, kHelloExampleComAddrV4);
3891 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom));
3892 EXPECT_EQ(0U, GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom));
3893}
3894
Hungming Chenbb90ab32019-10-28 18:20:31 +08003895// Parameterized tests.
3896// TODO: Merge the existing tests as parameterized test if possible.
3897// TODO: Perhaps move parameterized tests to an independent file.
3898enum class CallType { GETADDRINFO, GETHOSTBYNAME };
3899class ResolverParameterizedTest : public ResolverTest,
Hungming Chen63779052019-10-30 15:06:13 +08003900 public testing::WithParamInterface<CallType> {
3901 protected:
Hungming Chen22617fd2019-12-06 12:15:45 +08003902 void VerifyQueryHelloExampleComV4(const test::DNSResponder& dns, const CallType calltype,
3903 const bool verifyNumQueries = true) {
Hungming Chen63779052019-10-30 15:06:13 +08003904 if (calltype == CallType::GETADDRINFO) {
3905 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
3906 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
3907 ASSERT_TRUE(result != nullptr);
3908 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
3909 } else if (calltype == CallType::GETHOSTBYNAME) {
3910 const hostent* result = gethostbyname("hello");
3911 ASSERT_TRUE(result != nullptr);
3912 ASSERT_EQ(4, result->h_length);
3913 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
3914 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
3915 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
3916 } else {
3917 FAIL() << "Unsupported call type: " << static_cast<uint32_t>(calltype);
3918 }
Hungming Chen22617fd2019-12-06 12:15:45 +08003919 if (verifyNumQueries) EXPECT_EQ(1U, GetNumQueries(dns, kHelloExampleCom));
Hungming Chen63779052019-10-30 15:06:13 +08003920 }
3921};
Hungming Chenbb90ab32019-10-28 18:20:31 +08003922
Hungming Chen63779052019-10-30 15:06:13 +08003923INSTANTIATE_TEST_SUITE_P(QueryCallTest, ResolverParameterizedTest,
Hungming Chenbb90ab32019-10-28 18:20:31 +08003924 testing::Values(CallType::GETADDRINFO, CallType::GETHOSTBYNAME),
3925 [](const testing::TestParamInfo<CallType>& info) {
Hungming Chenbb90ab32019-10-28 18:20:31 +08003926 switch (info.param) {
3927 case CallType::GETADDRINFO:
Hungming Chen63779052019-10-30 15:06:13 +08003928 return "GetAddrInfo";
Hungming Chenbb90ab32019-10-28 18:20:31 +08003929 case CallType::GETHOSTBYNAME:
Hungming Chen63779052019-10-30 15:06:13 +08003930 return "GetHostByName";
Hungming Chenbb90ab32019-10-28 18:20:31 +08003931 default:
Hungming Chen63779052019-10-30 15:06:13 +08003932 return "InvalidParameter"; // Should not happen.
Hungming Chenbb90ab32019-10-28 18:20:31 +08003933 }
Hungming Chenbb90ab32019-10-28 18:20:31 +08003934 });
3935
3936TEST_P(ResolverParameterizedTest, AuthoritySectionAndAdditionalSection) {
3937 // DNS response may have more information in authority section and additional section.
3938 // Currently, getanswer() of packages/modules/DnsResolver/getaddrinfo.cpp doesn't parse the
3939 // content of authority section and additional section. Test these sections if they crash
3940 // the resolver, just in case. See also RFC 1035 section 4.1.
3941 const auto& calltype = GetParam();
3942 test::DNSHeader header(kDefaultDnsHeader);
3943
3944 // Create a DNS response which has a authoritative nameserver record in authority
3945 // section and its relevant address record in additional section.
3946 //
3947 // Question
3948 // hello.example.com. IN A
3949 // Answer
3950 // hello.example.com. IN A 1.2.3.4
3951 // Authority:
3952 // hello.example.com. IN NS ns1.example.com.
3953 // Additional:
3954 // ns1.example.com. IN A 5.6.7.8
3955 //
3956 // A response may have only question, answer, and authority section. Current testing response
3957 // should be able to cover this condition.
3958
3959 // Question section.
3960 test::DNSQuestion question{
3961 .qname = {.name = kHelloExampleCom},
3962 .qtype = ns_type::ns_t_a,
3963 .qclass = ns_c_in,
3964 };
3965 header.questions.push_back(std::move(question));
3966
3967 // Answer section.
3968 test::DNSRecord recordAnswer{
3969 .name = {.name = kHelloExampleCom},
3970 .rtype = ns_type::ns_t_a,
3971 .rclass = ns_c_in,
3972 .ttl = 0, // no cache
3973 };
Hungming Chen63779052019-10-30 15:06:13 +08003974 EXPECT_TRUE(test::DNSResponder::fillRdata(kHelloExampleComAddrV4, recordAnswer));
Hungming Chenbb90ab32019-10-28 18:20:31 +08003975 header.answers.push_back(std::move(recordAnswer));
3976
3977 // Authority section.
3978 test::DNSRecord recordAuthority{
3979 .name = {.name = kHelloExampleCom},
3980 .rtype = ns_type::ns_t_ns,
3981 .rclass = ns_c_in,
3982 .ttl = 0, // no cache
3983 };
3984 EXPECT_TRUE(test::DNSResponder::fillRdata("ns1.example.com.", recordAuthority));
3985 header.authorities.push_back(std::move(recordAuthority));
3986
3987 // Additional section.
3988 test::DNSRecord recordAdditional{
3989 .name = {.name = "ns1.example.com."},
3990 .rtype = ns_type::ns_t_a,
3991 .rclass = ns_c_in,
3992 .ttl = 0, // no cache
3993 };
3994 EXPECT_TRUE(test::DNSResponder::fillRdata("5.6.7.8", recordAdditional));
3995 header.additionals.push_back(std::move(recordAdditional));
3996
3997 // Start DNS server.
3998 test::DNSResponder dns(test::DNSResponder::MappingType::DNS_HEADER);
3999 dns.addMappingDnsHeader(kHelloExampleCom, ns_type::ns_t_a, header);
4000 ASSERT_TRUE(dns.startServer());
4001 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4002 dns.clearQueries();
4003
4004 // Expect that get the address and the resolver doesn't crash.
Hungming Chen63779052019-10-30 15:06:13 +08004005 VerifyQueryHelloExampleComV4(dns, calltype);
4006}
4007
4008TEST_P(ResolverParameterizedTest, MessageCompression) {
4009 const auto& calltype = GetParam();
4010
4011 // The response with compressed domain name by a pointer. See RFC 1035 section 4.1.4.
4012 //
4013 // Ignoring the other fields of the message, the domain name of question section and answer
4014 // section are presented as:
4015 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4016 // 12 | 5 | h |
4017 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4018 // 14 | e | l |
4019 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4020 // 16 | l | o |
4021 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4022 // 18 | 7 | e |
4023 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4024 // 20 | x | a |
4025 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4026 // 22 | m | p |
4027 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4028 // 24 | l | e |
4029 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4030 // 26 | 3 | c |
4031 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4032 // 28 | o | m |
4033 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4034 // 30 | 0 | ... |
4035 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4036 //
4037 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4038 // 35 | 1 1| 12 |
4039 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4040 const std::vector<uint8_t> kResponseAPointer = {
4041 /* Header */
4042 0x00, 0x00, /* Transaction ID: 0x0000 */
4043 0x81, 0x80, /* Flags: qr rd ra */
4044 0x00, 0x01, /* Questions: 1 */
4045 0x00, 0x01, /* Answer RRs: 1 */
4046 0x00, 0x00, /* Authority RRs: 0 */
4047 0x00, 0x00, /* Additional RRs: 0 */
4048 /* Queries */
4049 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
4050 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name: hello.example.com */
4051 0x00, 0x01, /* Type: A */
4052 0x00, 0x01, /* Class: IN */
4053 /* Answers */
4054 0xc0, 0x0c, /* Name: hello.example.com (a pointer) */
4055 0x00, 0x01, /* Type: A */
4056 0x00, 0x01, /* Class: IN */
4057 0x00, 0x00, 0x00, 0x00, /* Time to live: 0 */
4058 0x00, 0x04, /* Data length: 4 */
4059 0x01, 0x02, 0x03, 0x04 /* Address: 1.2.3.4 */
4060 };
4061
4062 // The response with compressed domain name by a sequence of labels ending with a pointer. See
4063 // RFC 1035 section 4.1.4.
4064 //
4065 // Ignoring the other fields of the message, the domain name of question section and answer
4066 // section are presented as:
4067 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4068 // 12 | 5 | h |
4069 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4070 // 14 | e | l |
4071 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4072 // 16 | l | o |
4073 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4074 // 18 | 7 | e |
4075 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4076 // 20 | x | a |
4077 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4078 // 22 | m | p |
4079 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4080 // 24 | l | e |
4081 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4082 // 26 | 3 | c |
4083 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4084 // 28 | o | m |
4085 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4086 // 30 | 0 | ... |
4087 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4088 //
4089 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4090 // 35 | 5 | h |
4091 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4092 // 37 | e | l |
4093 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4094 // 39 | l | o |
4095 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4096 // 41 | 1 1| 18 |
4097 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4098 const std::vector<uint8_t> kResponseLabelEndingWithAPointer = {
4099 /* Header */
4100 0x00, 0x00, /* Transaction ID: 0x0000 */
4101 0x81, 0x80, /* Flags: qr rd ra */
4102 0x00, 0x01, /* Questions: 1 */
4103 0x00, 0x01, /* Answer RRs: 1 */
4104 0x00, 0x00, /* Authority RRs: 0 */
4105 0x00, 0x00, /* Additional RRs: 0 */
4106 /* Queries */
4107 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
4108 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name: hello.example.com */
4109 0x00, 0x01, /* Type: A */
4110 0x00, 0x01, /* Class: IN */
4111 /* Answers */
4112 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0xc0,
4113 0x12, /* Name: hello.example.com (a label ending with a pointer) */
4114 0x00, 0x01, /* Type: A */
4115 0x00, 0x01, /* Class: IN */
4116 0x00, 0x00, 0x00, 0x00, /* Time to live: 0 */
4117 0x00, 0x04, /* Data length: 4 */
4118 0x01, 0x02, 0x03, 0x04 /* Address: 1.2.3.4 */
4119 };
4120
4121 for (const auto& response : {kResponseAPointer, kResponseLabelEndingWithAPointer}) {
4122 SCOPED_TRACE(StringPrintf("Hex dump: %s", toHex(makeSlice(response)).c_str()));
4123
4124 test::DNSResponder dns(test::DNSResponder::MappingType::BINARY_PACKET);
4125 dns.addMappingBinaryPacket(kHelloExampleComQueryV4, response);
4126 StartDns(dns, {});
4127 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4128
4129 // Expect no cache because the TTL of testing responses are 0.
4130 VerifyQueryHelloExampleComV4(dns, calltype);
Hungming Chenbb90ab32019-10-28 18:20:31 +08004131 }
Mike Yu40e67072019-10-09 21:14:09 +08004132}
Hungming Chen22617fd2019-12-06 12:15:45 +08004133
4134TEST_P(ResolverParameterizedTest, TruncatedResponse) {
4135 const auto& calltype = GetParam();
4136
4137 const size_t kMaxmiumLabelSize = 63; // see RFC 1035 section 2.3.4.
4138 const std::string kDomainName = ".example.com.";
4139 const std::string kCnameA = std::string(kMaxmiumLabelSize, 'a') + kDomainName;
4140 const std::string kCnameB = std::string(kMaxmiumLabelSize, 'b') + kDomainName;
4141 const std::string kCnameC = std::string(kMaxmiumLabelSize, 'c') + kDomainName;
4142 const std::string kCnameD = std::string(kMaxmiumLabelSize, 'd') + kDomainName;
4143
4144 // Build a response message which exceeds 512 bytes by CNAME chain.
4145 //
4146 // Ignoring the other fields of the message, the response message has 8 CNAMEs in 5 answer RRs
4147 // and each CNAME has 77 bytes as the follows. The response message at least has 616 bytes in
4148 // answer section and has already exceeded 512 bytes totally.
4149 //
4150 // The CNAME is presented as:
4151 // 0 1 64 65 72 73 76 77
4152 // +---+--........--+---+---+---+---+---+---+---+---+---+---+---+---+---+
4153 // | 63| {x, .., x} | 7 | e | x | a | m | p | l | e | 3 | c | o | m | 0 |
4154 // +---+--........--+---+---+---+---+---+---+---+---+---+---+---+---+---+
4155 // ^-- x = {a, b, c, d}
4156 //
4157 const std::vector<DnsRecord> records = {
4158 {kHelloExampleCom, ns_type::ns_t_cname, kCnameA},
4159 {kCnameA, ns_type::ns_t_cname, kCnameB},
4160 {kCnameB, ns_type::ns_t_cname, kCnameC},
4161 {kCnameC, ns_type::ns_t_cname, kCnameD},
4162 {kCnameD, ns_type::ns_t_a, kHelloExampleComAddrV4},
4163 };
4164 test::DNSResponder dns;
4165 StartDns(dns, records);
4166 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4167
4168 // Expect UDP response is truncated. The resolver retries over TCP. See RFC 1035 section 4.2.1.
4169 VerifyQueryHelloExampleComV4(dns, calltype, false);
4170 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom));
4171 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom));
4172}