blob: 5d05eb387cd4a09c269cfceec3313183faab4e41 [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
75// Semi-public Bionic hook used by the NDK (frameworks/base/native/android/net.c)
76// Tested here for convenience.
77extern "C" int android_getaddrinfofornet(const char* hostname, const char* servname,
78 const addrinfo* hints, unsigned netid, unsigned mark,
79 struct addrinfo** result);
80
Mike Yu153b5b82020-03-04 19:53:54 +080081using namespace std::chrono_literals;
82
Luke Huang70070852019-11-25 18:25:50 +080083using aidl::android::net::IDnsResolver;
Luke Huangf8215372019-11-22 11:53:41 +080084using aidl::android::net::INetd;
Mike Yu8ac63402019-12-02 15:28:38 +080085using aidl::android::net::ResolverParamsParcel;
Luke Huang9807e6b2019-05-20 16:17:12 +080086using android::base::ParseInt;
Ken Chenb9fa2062018-11-13 21:51:13 +080087using android::base::StringPrintf;
Luke Huang9807e6b2019-05-20 16:17:12 +080088using android::base::unique_fd;
Ken Chenb9fa2062018-11-13 21:51:13 +080089using android::net::ResolverStats;
Hungming Chene8f970c2019-04-10 17:34:06 +080090using android::net::metrics::DnsMetricsListener;
Ken Chenb9fa2062018-11-13 21:51:13 +080091using android::netdutils::enableSockopt;
Hungming Chen63779052019-10-30 15:06:13 +080092using android::netdutils::makeSlice;
Luke Huang9807e6b2019-05-20 16:17:12 +080093using android::netdutils::ResponseCode;
Luke Huang9d2d25b2019-06-14 00:34:05 +080094using android::netdutils::ScopedAddrinfo;
Mike Yu40e67072019-10-09 21:14:09 +080095using android::netdutils::Stopwatch;
Hungming Chen63779052019-10-30 15:06:13 +080096using android::netdutils::toHex;
Ken Chenb9fa2062018-11-13 21:51:13 +080097
98// TODO: move into libnetdutils?
99namespace {
Luke Huangfde82482019-06-04 01:04:53 +0800100
Ken Chenb9fa2062018-11-13 21:51:13 +0800101ScopedAddrinfo safe_getaddrinfo(const char* node, const char* service,
102 const struct addrinfo* hints) {
103 addrinfo* result = nullptr;
104 if (getaddrinfo(node, service, hints, &result) != 0) {
105 result = nullptr; // Should already be the case, but...
106 }
107 return ScopedAddrinfo(result);
108}
Luke Huangfde82482019-06-04 01:04:53 +0800109
Mike Yu40e67072019-10-09 21:14:09 +0800110std::pair<ScopedAddrinfo, int> safe_getaddrinfo_time_taken(const char* node, const char* service,
111 const addrinfo& hints) {
112 Stopwatch s;
113 ScopedAddrinfo result = safe_getaddrinfo(node, service, &hints);
114 return {std::move(result), s.timeTakenUs() / 1000};
115}
116
Mike Yue2162e52020-03-04 18:43:46 +0800117struct NameserverStats {
118 NameserverStats() = delete;
119 NameserverStats(const std::string server) : server(server) {}
120 NameserverStats& setSuccesses(int val) {
121 successes = val;
122 return *this;
123 }
124 NameserverStats& setErrors(int val) {
125 errors = val;
126 return *this;
127 }
128 NameserverStats& setTimeouts(int val) {
129 timeouts = val;
130 return *this;
131 }
132 NameserverStats& setInternalErrors(int val) {
133 internal_errors = val;
134 return *this;
135 }
136
137 const std::string server;
138 int successes = 0;
139 int errors = 0;
140 int timeouts = 0;
141 int internal_errors = 0;
142};
143
Ken Chenb9fa2062018-11-13 21:51:13 +0800144} // namespace
145
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900146class ResolverTest : public ::testing::Test {
Hungming Chene8f970c2019-04-10 17:34:06 +0800147 public:
Hungming Chen473c4de2020-03-12 11:13:35 +0800148 static void SetUpTestSuite() {
Hungming Chen5bf09772019-04-25 11:16:13 +0800149 // Get binder service.
150 // Note that |mDnsClient| is not used for getting binder service in this static function.
151 // The reason is that wants to keep |mDnsClient| as a non-static data member. |mDnsClient|
152 // which sets up device network configuration could be independent from every test.
Luke Huangf8215372019-11-22 11:53:41 +0800153 // TODO: Perhaps add a static function in resolv_test_binder_utils.{cpp,h} to get binder
154 // service.
155
156 AIBinder* binder = AServiceManager_getService("dnsresolver");
157 ndk::SpAIBinder resolvBinder = ndk::SpAIBinder(binder);
158 auto resolvService = aidl::android::net::IDnsResolver::fromBinder(resolvBinder);
Hungming Chen5bf09772019-04-25 11:16:13 +0800159 ASSERT_NE(nullptr, resolvService.get());
160
161 // Subscribe the death recipient to the service IDnsResolver for detecting Netd death.
Luke Huang70070852019-11-25 18:25:50 +0800162 // GTEST assertion macros are not invoked for generating a test failure in the death
163 // recipient because the macros can't indicate failed test if Netd died between tests.
164 // Moreover, continuing testing may have no meaningful after Netd death. Therefore, the
165 // death recipient aborts process by GTEST_LOG_(FATAL) once Netd died.
Luke Huangf8215372019-11-22 11:53:41 +0800166 sResolvDeathRecipient = AIBinder_DeathRecipient_new([](void*) {
167 constexpr char errorMessage[] = "Netd died";
168 LOG(ERROR) << errorMessage;
169 GTEST_LOG_(FATAL) << errorMessage;
170 });
171 ASSERT_EQ(STATUS_OK, AIBinder_linkToDeath(binder, sResolvDeathRecipient, nullptr));
Hungming Chen5bf09772019-04-25 11:16:13 +0800172
173 // Subscribe the DNS listener for verifying DNS metrics event contents.
Luke Huangf8215372019-11-22 11:53:41 +0800174 sDnsMetricsListener = ndk::SharedRefBase::make<DnsMetricsListener>(
175 TEST_NETID /*monitor specific network*/);
Hungming Chen5bf09772019-04-25 11:16:13 +0800176 ASSERT_TRUE(resolvService->registerEventListener(sDnsMetricsListener).isOk());
177
178 // Start the binder thread pool for listening DNS metrics events and receiving death
179 // recipient.
Luke Huangf8215372019-11-22 11:53:41 +0800180 ABinderProcess_startThreadPool();
Hungming Chene8f970c2019-04-10 17:34:06 +0800181 }
Hungming Chen473c4de2020-03-12 11:13:35 +0800182 static void TearDownTestSuite() { AIBinder_DeathRecipient_delete(sResolvDeathRecipient); }
Hungming Chene8f970c2019-04-10 17:34:06 +0800183
Ken Chenb9fa2062018-11-13 21:51:13 +0800184 protected:
Lorenzo Colitti61f796b2020-05-21 00:57:49 +0900185 void SetUp() {
186 mDnsClient.SetUp();
187 sDnsMetricsListener->reset();
188 }
189
Mike Yu960243d2020-01-17 19:02:15 +0800190 void TearDown() {
191 // Ensure the dump works at the end of each test.
192 DumpResolverService();
193
194 mDnsClient.TearDown();
195 }
nuccachena26cc2a2018-07-17 18:07:23 +0800196
Luke Huangf40df9c2020-04-21 08:51:48 +0800197 void resetNetwork() {
198 mDnsClient.TearDown();
199 mDnsClient.SetupOemNetwork();
200 }
201
Xiao Ma09b71022018-12-11 17:56:32 +0900202 void StartDns(test::DNSResponder& dns, const std::vector<DnsRecord>& records) {
203 for (const auto& r : records) {
204 dns.addMapping(r.host_name, r.type, r.addr);
205 }
206
207 ASSERT_TRUE(dns.startServer());
208 dns.clearQueries();
209 }
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900210
Mike Yu960243d2020-01-17 19:02:15 +0800211 void DumpResolverService() {
212 unique_fd fd(open("/dev/null", O_WRONLY));
213 EXPECT_EQ(mDnsClient.resolvService()->dump(fd, nullptr, 0), 0);
214
215 const char* querylogCmd[] = {"querylog"}; // Keep it sync with DnsQueryLog::DUMP_KEYWORD.
216 EXPECT_EQ(mDnsClient.resolvService()->dump(fd, querylogCmd, std::size(querylogCmd)), 0);
217 }
218
Hungming Chene8f970c2019-04-10 17:34:06 +0800219 bool WaitForNat64Prefix(ExpectNat64PrefixStatus status,
220 std::chrono::milliseconds timeout = std::chrono::milliseconds(1000)) {
Hungming Chen5bf09772019-04-25 11:16:13 +0800221 return sDnsMetricsListener->waitForNat64Prefix(status, timeout);
Hungming Chene8f970c2019-04-10 17:34:06 +0800222 }
223
Mike Yu724f77d2019-08-16 11:14:50 +0800224 bool WaitForPrivateDnsValidation(std::string serverAddr, bool validated) {
225 return sDnsMetricsListener->waitForPrivateDnsValidation(serverAddr, validated);
226 }
227
Mike Yu153b5b82020-03-04 19:53:54 +0800228 bool hasUncaughtPrivateDnsValidation(const std::string& serverAddr) {
229 return sDnsMetricsListener->findValidationRecord(serverAddr);
230 }
231
Mike Yue2162e52020-03-04 18:43:46 +0800232 bool expectStatsFromGetResolverInfo(const std::vector<NameserverStats>& nameserversStats) {
233 std::vector<std::string> res_servers;
234 std::vector<std::string> res_domains;
235 std::vector<std::string> res_tls_servers;
236 res_params res_params;
237 std::vector<ResolverStats> res_stats;
238 int wait_for_pending_req_timeout_count;
239
240 if (!DnsResponderClient::GetResolverInfo(mDnsClient.resolvService(), TEST_NETID,
241 &res_servers, &res_domains, &res_tls_servers,
242 &res_params, &res_stats,
243 &wait_for_pending_req_timeout_count)) {
244 ADD_FAILURE() << "GetResolverInfo failed";
245 return false;
246 }
247
248 if (res_servers.size() != res_stats.size()) {
249 ADD_FAILURE() << fmt::format("res_servers.size() != res_stats.size(): {} != {}",
250 res_servers.size(), res_stats.size());
251 return false;
252 }
253 if (res_servers.size() != nameserversStats.size()) {
254 ADD_FAILURE() << fmt::format("res_servers.size() != nameserversStats.size(): {} != {}",
255 res_servers.size(), nameserversStats.size());
256 return false;
257 }
258
259 for (const auto& stats : nameserversStats) {
260 SCOPED_TRACE(stats.server);
261 const auto it = std::find(res_servers.begin(), res_servers.end(), stats.server);
262 if (it == res_servers.end()) {
263 ADD_FAILURE() << fmt::format("nameserver {} not found in the list {{{}}}",
264 stats.server, fmt::join(res_servers, ", "));
265 return false;
266 }
267 const int index = std::distance(res_servers.begin(), it);
268
269 // The check excludes rtt_avg, last_sample_time, and usable since they will be obsolete
270 // after |res_stats| is retrieved from NetConfig.dnsStats rather than NetConfig.nsstats.
271 EXPECT_EQ(res_stats[index].successes, stats.successes);
272 EXPECT_EQ(res_stats[index].errors, stats.errors);
273 EXPECT_EQ(res_stats[index].timeouts, stats.timeouts);
274 EXPECT_EQ(res_stats[index].internal_errors, stats.internal_errors);
275 }
276
277 return true;
278 }
279
Mike Yu153b5b82020-03-04 19:53:54 +0800280 // Since there's no way to terminate private DNS validation threads at any time. Tests that
281 // focus on the results of private DNS validation can interfere with each other if they use the
282 // same IP address for test servers. getUniqueIPv4Address() is a workaround to reduce the
283 // possibility of tests being flaky. A feasible solution is to forbid the validation threads,
284 // which are considered as outdated (e.g. switch the resolver to private DNS OFF mode), updating
285 // the result to the PrivateDnsConfiguration instance.
286 static std::string getUniqueIPv4Address() {
287 static int counter = 0;
288 return fmt::format("127.0.100.{}", (++counter & 0xff));
289 }
290
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900291 DnsResponderClient mDnsClient;
Xiao Ma09b71022018-12-11 17:56:32 +0900292
Hungming Chen5bf09772019-04-25 11:16:13 +0800293 // Use a shared static DNS listener for all tests to avoid registering lots of listeners
294 // which may be released late until process terminated. Currently, registered DNS listener
295 // is removed by binder death notification which is fired when the process hosting an
296 // IBinder has gone away. If every test in ResolverTest registers its DNS listener, Netd
297 // may temporarily hold lots of dead listeners until the unit test process terminates.
298 // TODO: Perhaps add an unregistering listener binder call or fork a listener process which
299 // could be terminated earlier.
Luke Huangf8215372019-11-22 11:53:41 +0800300 static std::shared_ptr<DnsMetricsListener>
Hungming Chen473c4de2020-03-12 11:13:35 +0800301 sDnsMetricsListener; // Initialized in SetUpTestSuite.
Hungming Chen5bf09772019-04-25 11:16:13 +0800302
303 // Use a shared static death recipient to monitor the service death. The static death
304 // recipient could monitor the death not only during the test but also between tests.
Hungming Chen473c4de2020-03-12 11:13:35 +0800305 static AIBinder_DeathRecipient* sResolvDeathRecipient; // Initialized in SetUpTestSuite.
Ken Chenb9fa2062018-11-13 21:51:13 +0800306};
307
Hungming Chen5bf09772019-04-25 11:16:13 +0800308// Initialize static member of class.
Luke Huangf8215372019-11-22 11:53:41 +0800309std::shared_ptr<DnsMetricsListener> ResolverTest::sDnsMetricsListener;
310AIBinder_DeathRecipient* ResolverTest::sResolvDeathRecipient;
Hungming Chen5bf09772019-04-25 11:16:13 +0800311
Ken Chenb9fa2062018-11-13 21:51:13 +0800312TEST_F(ResolverTest, GetHostByName) {
Xiao Ma09b71022018-12-11 17:56:32 +0900313 constexpr char nonexistent_host_name[] = "nonexistent.example.com.";
314
315 test::DNSResponder dns;
316 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.3"}});
317 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800318
319 const hostent* result;
Ken Chenb9fa2062018-11-13 21:51:13 +0800320 result = gethostbyname("nonexistent");
321 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, nonexistent_host_name));
322 ASSERT_TRUE(result == nullptr);
323 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
324
325 dns.clearQueries();
326 result = gethostbyname("hello");
Xiao Ma09b71022018-12-11 17:56:32 +0900327 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
Ken Chenb9fa2062018-11-13 21:51:13 +0800328 ASSERT_FALSE(result == nullptr);
329 ASSERT_EQ(4, result->h_length);
330 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
331 EXPECT_EQ("1.2.3.3", ToString(result));
332 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800333}
334
lifr4e4a2e02019-01-29 16:53:51 +0800335TEST_F(ResolverTest, GetHostByName_cnames) {
336 constexpr char host_name[] = "host.example.com.";
337 size_t cnamecount = 0;
338 test::DNSResponder dns;
339
340 const std::vector<DnsRecord> records = {
341 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
342 {"a.example.com.", ns_type::ns_t_cname, "b.example.com."},
343 {"b.example.com.", ns_type::ns_t_cname, "c.example.com."},
344 {"c.example.com.", ns_type::ns_t_cname, "d.example.com."},
345 {"d.example.com.", ns_type::ns_t_cname, "e.example.com."},
346 {"e.example.com.", ns_type::ns_t_cname, host_name},
347 {host_name, ns_type::ns_t_a, "1.2.3.3"},
348 {host_name, ns_type::ns_t_aaaa, "2001:db8::42"},
349 };
350 StartDns(dns, records);
351 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
352
353 // using gethostbyname2() to resolve ipv4 hello.example.com. to 1.2.3.3
354 // Ensure the v4 address and cnames are correct
355 const hostent* result;
356 result = gethostbyname2("hello", AF_INET);
357 ASSERT_FALSE(result == nullptr);
358
359 for (int i = 0; result != nullptr && result->h_aliases[i] != nullptr; i++) {
360 std::string domain_name = records[i].host_name.substr(0, records[i].host_name.size() - 1);
361 EXPECT_EQ(result->h_aliases[i], domain_name);
362 cnamecount++;
363 }
364 // The size of "Non-cname type" record in DNS records is 2
365 ASSERT_EQ(cnamecount, records.size() - 2);
366 ASSERT_EQ(4, result->h_length);
367 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
368 EXPECT_EQ("1.2.3.3", ToString(result));
369 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
370 EXPECT_EQ(1U, dns.queries().size()) << dns.dumpQueries();
371
372 // using gethostbyname2() to resolve ipv6 hello.example.com. to 2001:db8::42
373 // Ensure the v6 address and cnames are correct
374 cnamecount = 0;
375 dns.clearQueries();
376 result = gethostbyname2("hello", AF_INET6);
377 for (unsigned i = 0; result != nullptr && result->h_aliases[i] != nullptr; i++) {
378 std::string domain_name = records[i].host_name.substr(0, records[i].host_name.size() - 1);
379 EXPECT_EQ(result->h_aliases[i], domain_name);
380 cnamecount++;
381 }
382 // The size of "Non-cname type" DNS record in records is 2
383 ASSERT_EQ(cnamecount, records.size() - 2);
384 ASSERT_FALSE(result == nullptr);
385 ASSERT_EQ(16, result->h_length);
386 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
387 EXPECT_EQ("2001:db8::42", ToString(result));
388 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
389}
390
391TEST_F(ResolverTest, GetHostByName_cnamesInfiniteLoop) {
392 test::DNSResponder dns;
393 const std::vector<DnsRecord> records = {
394 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
395 {"a.example.com.", ns_type::ns_t_cname, kHelloExampleCom},
396 };
397 StartDns(dns, records);
398 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
399
400 const hostent* result;
401 result = gethostbyname2("hello", AF_INET);
402 ASSERT_TRUE(result == nullptr);
403
404 dns.clearQueries();
405 result = gethostbyname2("hello", AF_INET6);
406 ASSERT_TRUE(result == nullptr);
407}
408
Ken Chenb9fa2062018-11-13 21:51:13 +0800409TEST_F(ResolverTest, GetHostByName_localhost) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800410 constexpr char name_camelcase[] = "LocalHost";
Ken Chenb9fa2062018-11-13 21:51:13 +0800411 constexpr char name_ip6_dot[] = "ip6-localhost.";
412 constexpr char name_ip6_fqdn[] = "ip6-localhost.example.com.";
413
414 // Add a dummy nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900415 test::DNSResponder dns;
416 StartDns(dns, {});
417 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800418
419 // Expect no DNS queries; localhost is resolved via /etc/hosts
Xiao Ma09b71022018-12-11 17:56:32 +0900420 const hostent* result = gethostbyname(kLocalHost);
Ken Chenb9fa2062018-11-13 21:51:13 +0800421 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
422 ASSERT_FALSE(result == nullptr);
423 ASSERT_EQ(4, result->h_length);
424 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900425 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800426 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
427
428 // Ensure the hosts file resolver ignores case of hostnames
429 result = gethostbyname(name_camelcase);
430 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
431 ASSERT_FALSE(result == nullptr);
432 ASSERT_EQ(4, result->h_length);
433 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900434 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800435 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
436
437 // The hosts file also contains ip6-localhost, but gethostbyname() won't
chenbruce018fdb22019-06-12 18:08:04 +0800438 // return it. This would be easy to
Ken Chenb9fa2062018-11-13 21:51:13 +0800439 // change, but there's no point in changing the legacy behavior; new code
440 // should be calling getaddrinfo() anyway.
441 // So we check the legacy behavior, which results in amusing A-record
442 // lookups for ip6-localhost, with and without search domains appended.
443 dns.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900444 result = gethostbyname(kIp6LocalHost);
Sehee Parkbbca0202018-11-16 10:53:16 +0900445 EXPECT_EQ(2U, dns.queries().size()) << dns.dumpQueries();
446 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, name_ip6_dot)) << dns.dumpQueries();
447 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, name_ip6_fqdn)) << dns.dumpQueries();
Ken Chenb9fa2062018-11-13 21:51:13 +0800448 ASSERT_TRUE(result == nullptr);
449
450 // Finally, use gethostbyname2() to resolve ip6-localhost to ::1 from
451 // the hosts file.
452 dns.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900453 result = gethostbyname2(kIp6LocalHost, AF_INET6);
Ken Chenb9fa2062018-11-13 21:51:13 +0800454 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
455 ASSERT_FALSE(result == nullptr);
456 ASSERT_EQ(16, result->h_length);
457 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900458 EXPECT_EQ(kIp6LocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800459 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800460}
461
462TEST_F(ResolverTest, GetHostByName_numeric) {
463 // Add a dummy nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900464 test::DNSResponder dns;
465 StartDns(dns, {});
466 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800467
468 // Numeric v4 address: expect no DNS queries
469 constexpr char numeric_v4[] = "192.168.0.1";
Ken Chenb9fa2062018-11-13 21:51:13 +0800470 const hostent* result = gethostbyname(numeric_v4);
Sehee Parkbbca0202018-11-16 10:53:16 +0900471 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800472 ASSERT_FALSE(result == nullptr);
473 ASSERT_EQ(4, result->h_length); // v4
474 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
475 EXPECT_EQ(numeric_v4, ToString(result));
476 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
477
478 // gethostbyname() recognizes a v6 address, and fails with no DNS queries
479 constexpr char numeric_v6[] = "2001:db8::42";
480 dns.clearQueries();
481 result = gethostbyname(numeric_v6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900482 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800483 EXPECT_TRUE(result == nullptr);
484
485 // Numeric v6 address with gethostbyname2(): succeeds with no DNS queries
486 dns.clearQueries();
487 result = gethostbyname2(numeric_v6, AF_INET6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900488 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800489 ASSERT_FALSE(result == nullptr);
490 ASSERT_EQ(16, result->h_length); // v6
491 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
492 EXPECT_EQ(numeric_v6, ToString(result));
493 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
494
495 // Numeric v6 address with scope work with getaddrinfo(),
496 // but gethostbyname2() does not understand them; it issues two dns
497 // queries, then fails. This hardly ever happens, there's no point
498 // in fixing this. This test simply verifies the current (bogus)
499 // behavior to avoid further regressions (like crashes, or leaks).
500 constexpr char numeric_v6_scope[] = "fe80::1%lo";
501 dns.clearQueries();
502 result = gethostbyname2(numeric_v6_scope, AF_INET6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900503 EXPECT_EQ(2U, dns.queries().size()); // OUCH!
Ken Chenb9fa2062018-11-13 21:51:13 +0800504 ASSERT_TRUE(result == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800505}
506
507TEST_F(ResolverTest, BinderSerialization) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800508 std::vector<int> params_offsets = {
Luke Huang5bd827c2019-03-14 16:10:04 +0800509 IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY,
510 IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD,
511 IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES,
512 IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES,
513 IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC,
514 IDnsResolver::RESOLVER_PARAMS_RETRY_COUNT,
Ken Chenb9fa2062018-11-13 21:51:13 +0800515 };
Bernie Innocentib102dd22018-12-04 14:57:48 +0900516 const int size = static_cast<int>(params_offsets.size());
Luke Huang5bd827c2019-03-14 16:10:04 +0800517 EXPECT_EQ(size, IDnsResolver::RESOLVER_PARAMS_COUNT);
Ken Chenb9fa2062018-11-13 21:51:13 +0800518 std::sort(params_offsets.begin(), params_offsets.end());
Bernie Innocentib102dd22018-12-04 14:57:48 +0900519 for (int i = 0; i < size; ++i) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800520 EXPECT_EQ(params_offsets[i], i);
521 }
522}
523
524TEST_F(ResolverTest, GetHostByName_Binder) {
Luke Huangf8215372019-11-22 11:53:41 +0800525 std::vector<std::string> domains = {"example.com"};
Ken Chenb9fa2062018-11-13 21:51:13 +0800526 std::vector<std::unique_ptr<test::DNSResponder>> dns;
527 std::vector<std::string> servers;
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900528 std::vector<DnsResponderClient::Mapping> mappings;
529 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupMappings(1, domains, &mappings));
530 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupDNSServers(4, mappings, &dns, &servers));
Ken Chenb9fa2062018-11-13 21:51:13 +0800531 ASSERT_EQ(1U, mappings.size());
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900532 const DnsResponderClient::Mapping& mapping = mappings[0];
Ken Chenb9fa2062018-11-13 21:51:13 +0800533
Xiao Ma09b71022018-12-11 17:56:32 +0900534 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains, kDefaultParams));
Ken Chenb9fa2062018-11-13 21:51:13 +0800535
536 const hostent* result = gethostbyname(mapping.host.c_str());
Bernie Innocentib102dd22018-12-04 14:57:48 +0900537 const size_t total_queries =
Luke Huangfde82482019-06-04 01:04:53 +0800538 std::accumulate(dns.begin(), dns.end(), 0, [&mapping](size_t total, auto& d) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800539 return total + GetNumQueriesForType(*d, ns_type::ns_t_a, mapping.entry.c_str());
540 });
541
542 EXPECT_LE(1U, total_queries);
543 ASSERT_FALSE(result == nullptr);
544 ASSERT_EQ(4, result->h_length);
545 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
546 EXPECT_EQ(mapping.ip4, ToString(result));
547 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
548
549 std::vector<std::string> res_servers;
550 std::vector<std::string> res_domains;
Mike Yu0a1c53d2018-11-26 13:26:21 +0900551 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +0900552 res_params res_params;
Ken Chenb9fa2062018-11-13 21:51:13 +0800553 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +0800554 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +0800555 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
556 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
557 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chenb9fa2062018-11-13 21:51:13 +0800558 EXPECT_EQ(servers.size(), res_servers.size());
559 EXPECT_EQ(domains.size(), res_domains.size());
Mike Yu0a1c53d2018-11-26 13:26:21 +0900560 EXPECT_EQ(0U, res_tls_servers.size());
Luke Huang5bd827c2019-03-14 16:10:04 +0800561 ASSERT_EQ(static_cast<size_t>(IDnsResolver::RESOLVER_PARAMS_COUNT), kDefaultParams.size());
562 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY],
563 res_params.sample_validity);
564 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900565 res_params.success_threshold);
Luke Huang5bd827c2019-03-14 16:10:04 +0800566 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
567 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
568 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
Ken Chenb9fa2062018-11-13 21:51:13 +0800569 res_params.base_timeout_msec);
570 EXPECT_EQ(servers.size(), res_stats.size());
571
Bernie Innocenti0c067e42019-04-01 15:33:16 +0900572 EXPECT_THAT(res_servers, testing::UnorderedElementsAreArray(servers));
573 EXPECT_THAT(res_domains, testing::UnorderedElementsAreArray(domains));
Ken Chenb9fa2062018-11-13 21:51:13 +0800574}
575
576TEST_F(ResolverTest, GetAddrInfo) {
Xiao Ma09b71022018-12-11 17:56:32 +0900577 constexpr char listen_addr[] = "127.0.0.4";
578 constexpr char listen_addr2[] = "127.0.0.5";
579 constexpr char host_name[] = "howdy.example.com.";
Ken Chenb9fa2062018-11-13 21:51:13 +0800580
Xiao Ma09b71022018-12-11 17:56:32 +0900581 const std::vector<DnsRecord> records = {
582 {host_name, ns_type::ns_t_a, "1.2.3.4"},
583 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
584 };
585 test::DNSResponder dns(listen_addr);
586 test::DNSResponder dns2(listen_addr2);
587 StartDns(dns, records);
588 StartDns(dns2, records);
Ken Chenb9fa2062018-11-13 21:51:13 +0800589
Xiao Ma09b71022018-12-11 17:56:32 +0900590 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}));
Ken Chenb9fa2062018-11-13 21:51:13 +0800591 dns.clearQueries();
592 dns2.clearQueries();
593
594 ScopedAddrinfo result = safe_getaddrinfo("howdy", nullptr, nullptr);
595 EXPECT_TRUE(result != nullptr);
596 size_t found = GetNumQueries(dns, host_name);
597 EXPECT_LE(1U, found);
598 // Could be A or AAAA
599 std::string result_str = ToString(result);
600 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +0800601 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +0800602
603 // Verify that the name is cached.
604 size_t old_found = found;
605 result = safe_getaddrinfo("howdy", nullptr, nullptr);
606 EXPECT_TRUE(result != nullptr);
607 found = GetNumQueries(dns, host_name);
608 EXPECT_LE(1U, found);
609 EXPECT_EQ(old_found, found);
610 result_str = ToString(result);
Luke Huangf8215372019-11-22 11:53:41 +0800611 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4") << result_str;
Ken Chenb9fa2062018-11-13 21:51:13 +0800612
613 // Change the DNS resolver, ensure that queries are still cached.
Xiao Ma09b71022018-12-11 17:56:32 +0900614 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr2}));
Ken Chenb9fa2062018-11-13 21:51:13 +0800615 dns.clearQueries();
616 dns2.clearQueries();
617
618 result = safe_getaddrinfo("howdy", nullptr, nullptr);
619 EXPECT_TRUE(result != nullptr);
620 found = GetNumQueries(dns, host_name);
621 size_t found2 = GetNumQueries(dns2, host_name);
622 EXPECT_EQ(0U, found);
623 EXPECT_LE(0U, found2);
624
625 // Could be A or AAAA
626 result_str = ToString(result);
627 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +0800628 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +0800629}
630
631TEST_F(ResolverTest, GetAddrInfoV4) {
Xiao Ma09b71022018-12-11 17:56:32 +0900632 test::DNSResponder dns;
633 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.5"}});
634 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800635
Xiao Ma09b71022018-12-11 17:56:32 +0900636 const addrinfo hints = {.ai_family = AF_INET};
637 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
Ken Chenb9fa2062018-11-13 21:51:13 +0800638 EXPECT_TRUE(result != nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900639 EXPECT_EQ(1U, GetNumQueries(dns, kHelloExampleCom));
Ken Chenb9fa2062018-11-13 21:51:13 +0800640 EXPECT_EQ("1.2.3.5", ToString(result));
641}
642
643TEST_F(ResolverTest, GetAddrInfo_localhost) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800644 // Add a dummy nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900645 test::DNSResponder dns;
646 StartDns(dns, {});
647 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800648
Xiao Ma09b71022018-12-11 17:56:32 +0900649 ScopedAddrinfo result = safe_getaddrinfo(kLocalHost, nullptr, nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800650 EXPECT_TRUE(result != nullptr);
651 // Expect no DNS queries; localhost is resolved via /etc/hosts
652 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900653 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800654
Xiao Ma09b71022018-12-11 17:56:32 +0900655 result = safe_getaddrinfo(kIp6LocalHost, nullptr, nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800656 EXPECT_TRUE(result != nullptr);
657 // Expect no DNS queries; ip6-localhost is resolved via /etc/hosts
658 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900659 EXPECT_EQ(kIp6LocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800660}
661
Luke Huangd8ac4752019-06-18 17:05:47 +0800662TEST_F(ResolverTest, GetAddrInfo_InvalidSocketType) {
663 test::DNSResponder dns;
664 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.5"}});
665 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
666
667 // TODO: Test other invalid socket types.
668 const addrinfo hints = {
669 .ai_family = AF_UNSPEC,
Luke Huangd8ac4752019-06-18 17:05:47 +0800670 .ai_socktype = SOCK_PACKET,
671 };
672 addrinfo* result = nullptr;
673 // This is a valid hint, but the query won't be sent because the socket type is
674 // not supported.
675 EXPECT_EQ(EAI_NODATA, getaddrinfo("hello", nullptr, &hints, &result));
676 ScopedAddrinfo result_cleanup(result);
677 EXPECT_EQ(nullptr, result);
678}
679
Ken Chen92bed612018-12-22 21:46:55 +0800680// Verify if the resolver correctly handle multiple queries simultaneously
681// step 1: set dns server#1 into deferred responding mode.
682// step 2: thread#1 query "hello.example.com." --> resolver send query to server#1.
683// step 3: thread#2 query "hello.example.com." --> resolver hold the request and wait for
684// response of previous pending query sent by thread#1.
685// step 4: thread#3 query "konbanha.example.com." --> resolver send query to server#3. Server
686// respond to resolver immediately.
687// step 5: check if server#1 get 1 query by thread#1, server#2 get 0 query, server#3 get 1 query.
688// step 6: resume dns server#1 to respond dns query in step#2.
689// step 7: thread#1 and #2 should get returned from DNS query after step#6. Also, check the
690// number of queries in server#2 is 0 to ensure thread#2 does not wake up unexpectedly
691// before signaled by thread#1.
692TEST_F(ResolverTest, GetAddrInfoV4_deferred_resp) {
693 const char* listen_addr1 = "127.0.0.9";
694 const char* listen_addr2 = "127.0.0.10";
695 const char* listen_addr3 = "127.0.0.11";
696 const char* listen_srv = "53";
697 const char* host_name_deferred = "hello.example.com.";
698 const char* host_name_normal = "konbanha.example.com.";
Mike Yufc125e42019-05-15 20:41:28 +0800699 test::DNSResponder dns1(listen_addr1, listen_srv, ns_rcode::ns_r_servfail);
700 test::DNSResponder dns2(listen_addr2, listen_srv, ns_rcode::ns_r_servfail);
701 test::DNSResponder dns3(listen_addr3, listen_srv, ns_rcode::ns_r_servfail);
Ken Chen92bed612018-12-22 21:46:55 +0800702 dns1.addMapping(host_name_deferred, ns_type::ns_t_a, "1.2.3.4");
703 dns2.addMapping(host_name_deferred, ns_type::ns_t_a, "1.2.3.4");
704 dns3.addMapping(host_name_normal, ns_type::ns_t_a, "1.2.3.5");
705 ASSERT_TRUE(dns1.startServer());
706 ASSERT_TRUE(dns2.startServer());
707 ASSERT_TRUE(dns3.startServer());
708 const std::vector<std::string> servers_for_t1 = {listen_addr1};
709 const std::vector<std::string> servers_for_t2 = {listen_addr2};
710 const std::vector<std::string> servers_for_t3 = {listen_addr3};
711 addrinfo hints = {.ai_family = AF_INET};
712 const std::vector<int> params = {300, 25, 8, 8, 5000};
713 bool t3_task_done = false;
714
715 dns1.setDeferredResp(true);
716 std::thread t1([&, this]() {
717 ASSERT_TRUE(
718 mDnsClient.SetResolversForNetwork(servers_for_t1, kDefaultSearchDomains, params));
719 ScopedAddrinfo result = safe_getaddrinfo(host_name_deferred, nullptr, &hints);
720 // t3's dns query should got returned first
721 EXPECT_TRUE(t3_task_done);
722 EXPECT_EQ(1U, GetNumQueries(dns1, host_name_deferred));
723 EXPECT_TRUE(result != nullptr);
724 EXPECT_EQ("1.2.3.4", ToString(result));
725 });
726
727 // ensuring t1 and t2 handler functions are processed in order
728 usleep(100 * 1000);
729 std::thread t2([&, this]() {
730 ASSERT_TRUE(
731 mDnsClient.SetResolversForNetwork(servers_for_t2, kDefaultSearchDomains, params));
732 ScopedAddrinfo result = safe_getaddrinfo(host_name_deferred, nullptr, &hints);
733 EXPECT_TRUE(t3_task_done);
734 EXPECT_EQ(0U, GetNumQueries(dns2, host_name_deferred));
735 EXPECT_TRUE(result != nullptr);
736 EXPECT_EQ("1.2.3.4", ToString(result));
737
738 std::vector<std::string> res_servers;
739 std::vector<std::string> res_domains;
740 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +0900741 res_params res_params;
Ken Chen92bed612018-12-22 21:46:55 +0800742 std::vector<ResolverStats> res_stats;
743 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +0800744 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
745 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains,
746 &res_tls_servers, &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chen92bed612018-12-22 21:46:55 +0800747 EXPECT_EQ(0, wait_for_pending_req_timeout_count);
748 });
749
750 // ensuring t2 and t3 handler functions are processed in order
751 usleep(100 * 1000);
752 std::thread t3([&, this]() {
753 ASSERT_TRUE(
754 mDnsClient.SetResolversForNetwork(servers_for_t3, kDefaultSearchDomains, params));
755 ScopedAddrinfo result = safe_getaddrinfo(host_name_normal, nullptr, &hints);
756 EXPECT_EQ(1U, GetNumQueries(dns1, host_name_deferred));
757 EXPECT_EQ(0U, GetNumQueries(dns2, host_name_deferred));
758 EXPECT_EQ(1U, GetNumQueries(dns3, host_name_normal));
759 EXPECT_TRUE(result != nullptr);
760 EXPECT_EQ("1.2.3.5", ToString(result));
761
762 t3_task_done = true;
763 dns1.setDeferredResp(false);
764 });
765 t3.join();
766 t1.join();
767 t2.join();
768}
769
lifr4e4a2e02019-01-29 16:53:51 +0800770TEST_F(ResolverTest, GetAddrInfo_cnames) {
771 constexpr char host_name[] = "host.example.com.";
772 test::DNSResponder dns;
773 const std::vector<DnsRecord> records = {
774 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
775 {"a.example.com.", ns_type::ns_t_cname, "b.example.com."},
776 {"b.example.com.", ns_type::ns_t_cname, "c.example.com."},
777 {"c.example.com.", ns_type::ns_t_cname, "d.example.com."},
778 {"d.example.com.", ns_type::ns_t_cname, "e.example.com."},
779 {"e.example.com.", ns_type::ns_t_cname, host_name},
780 {host_name, ns_type::ns_t_a, "1.2.3.3"},
781 {host_name, ns_type::ns_t_aaaa, "2001:db8::42"},
782 };
783 StartDns(dns, records);
784 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
785
786 addrinfo hints = {.ai_family = AF_INET};
787 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
788 EXPECT_TRUE(result != nullptr);
789 EXPECT_EQ("1.2.3.3", ToString(result));
790
791 dns.clearQueries();
792 hints = {.ai_family = AF_INET6};
793 result = safe_getaddrinfo("hello", nullptr, &hints);
794 EXPECT_TRUE(result != nullptr);
795 EXPECT_EQ("2001:db8::42", ToString(result));
796}
797
798TEST_F(ResolverTest, GetAddrInfo_cnamesNoIpAddress) {
799 test::DNSResponder dns;
800 const std::vector<DnsRecord> records = {
801 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
802 };
803 StartDns(dns, records);
804 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
805
806 addrinfo hints = {.ai_family = AF_INET};
807 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
808 EXPECT_TRUE(result == nullptr);
809
810 dns.clearQueries();
811 hints = {.ai_family = AF_INET6};
812 result = safe_getaddrinfo("hello", nullptr, &hints);
813 EXPECT_TRUE(result == nullptr);
814}
815
816TEST_F(ResolverTest, GetAddrInfo_cnamesIllegalRdata) {
817 test::DNSResponder dns;
818 const std::vector<DnsRecord> records = {
819 {kHelloExampleCom, ns_type::ns_t_cname, ".!#?"},
820 };
821 StartDns(dns, records);
822 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
823
824 addrinfo hints = {.ai_family = AF_INET};
825 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
826 EXPECT_TRUE(result == nullptr);
827
828 dns.clearQueries();
829 hints = {.ai_family = AF_INET6};
830 result = safe_getaddrinfo("hello", nullptr, &hints);
831 EXPECT_TRUE(result == nullptr);
832}
833
Ken Chenb9fa2062018-11-13 21:51:13 +0800834TEST_F(ResolverTest, MultidomainResolution) {
Xiao Ma09b71022018-12-11 17:56:32 +0900835 constexpr char host_name[] = "nihao.example2.com.";
Luke Huangf8215372019-11-22 11:53:41 +0800836 std::vector<std::string> searchDomains = {"example1.com", "example2.com", "example3.com"};
Ken Chenb9fa2062018-11-13 21:51:13 +0800837
Xiao Ma09b71022018-12-11 17:56:32 +0900838 test::DNSResponder dns("127.0.0.6");
839 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.3"}});
840 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({"127.0.0.6"}, searchDomains));
841
Ken Chenb9fa2062018-11-13 21:51:13 +0800842 const hostent* result = gethostbyname("nihao");
Xiao Ma09b71022018-12-11 17:56:32 +0900843
Ken Chenb9fa2062018-11-13 21:51:13 +0800844 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
845 ASSERT_FALSE(result == nullptr);
846 ASSERT_EQ(4, result->h_length);
847 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
848 EXPECT_EQ("1.2.3.3", ToString(result));
849 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800850}
851
852TEST_F(ResolverTest, GetAddrInfoV6_numeric) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800853 constexpr char host_name[] = "ohayou.example.com.";
854 constexpr char numeric_addr[] = "fe80::1%lo";
855
Xiao Ma09b71022018-12-11 17:56:32 +0900856 test::DNSResponder dns;
Ken Chenb9fa2062018-11-13 21:51:13 +0800857 dns.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900858 StartDns(dns, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
859 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800860
861 addrinfo hints = {.ai_family = AF_INET6};
862 ScopedAddrinfo result = safe_getaddrinfo(numeric_addr, nullptr, &hints);
863 EXPECT_TRUE(result != nullptr);
864 EXPECT_EQ(numeric_addr, ToString(result));
865 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
866
867 // Now try a non-numeric hostname query with the AI_NUMERICHOST flag set.
868 // We should fail without sending out a DNS query.
869 hints.ai_flags |= AI_NUMERICHOST;
870 result = safe_getaddrinfo(host_name, nullptr, &hints);
871 EXPECT_TRUE(result == nullptr);
872 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
873}
874
875TEST_F(ResolverTest, GetAddrInfoV6_failing) {
Xiao Ma09b71022018-12-11 17:56:32 +0900876 constexpr char listen_addr0[] = "127.0.0.7";
877 constexpr char listen_addr1[] = "127.0.0.8";
Ken Chenb9fa2062018-11-13 21:51:13 +0800878 const char* host_name = "ohayou.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +0900879
880 test::DNSResponder dns0(listen_addr0);
881 test::DNSResponder dns1(listen_addr1);
Ken Chenb9fa2062018-11-13 21:51:13 +0800882 dns0.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900883 StartDns(dns0, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
884 StartDns(dns1, {{host_name, ns_type::ns_t_aaaa, "2001:db8::6"}});
885
Luke Huangf8215372019-11-22 11:53:41 +0800886 std::vector<std::string> servers = {listen_addr0, listen_addr1};
Ken Chenb9fa2062018-11-13 21:51:13 +0800887 // <sample validity in s> <success threshold in percent> <min samples> <max samples>
888 int sample_count = 8;
Luke Huangf8215372019-11-22 11:53:41 +0800889 const std::vector<int> params = {300, 25, sample_count, sample_count};
Xiao Ma09b71022018-12-11 17:56:32 +0900890 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, kDefaultSearchDomains, params));
Ken Chenb9fa2062018-11-13 21:51:13 +0800891
892 // Repeatedly perform resolutions for non-existing domains until MAXNSSAMPLES resolutions have
893 // reached the dns0, which is set to fail. No more requests should then arrive at that server
894 // for the next sample_lifetime seconds.
895 // TODO: This approach is implementation-dependent, change once metrics reporting is available.
Xiao Ma09b71022018-12-11 17:56:32 +0900896 const addrinfo hints = {.ai_family = AF_INET6};
Bernie Innocentib102dd22018-12-04 14:57:48 +0900897 for (int i = 0; i < sample_count; ++i) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800898 std::string domain = StringPrintf("nonexistent%d", i);
899 ScopedAddrinfo result = safe_getaddrinfo(domain.c_str(), nullptr, &hints);
900 }
901 // Due to 100% errors for all possible samples, the server should be ignored from now on and
902 // only the second one used for all following queries, until NSSAMPLE_VALIDITY is reached.
903 dns0.clearQueries();
904 dns1.clearQueries();
905 ScopedAddrinfo result = safe_getaddrinfo("ohayou", nullptr, &hints);
906 EXPECT_TRUE(result != nullptr);
907 EXPECT_EQ(0U, GetNumQueries(dns0, host_name));
908 EXPECT_EQ(1U, GetNumQueries(dns1, host_name));
909}
910
911TEST_F(ResolverTest, GetAddrInfoV6_nonresponsive) {
Xiao Ma09b71022018-12-11 17:56:32 +0900912 constexpr char listen_addr0[] = "127.0.0.7";
913 constexpr char listen_addr1[] = "127.0.0.8";
914 constexpr char listen_srv[] = "53";
915 constexpr char host_name1[] = "ohayou.example.com.";
916 constexpr char host_name2[] = "ciao.example.com.";
Luke Huang483cf332019-06-03 17:24:51 +0800917 const std::vector<std::string> defaultSearchDomain = {"example.com"};
918 // The minimal timeout is 1000ms, so we can't decrease timeout
919 // So reduce retry count.
920 const std::vector<int> reduceRetryParams = {
921 300, // sample validity in seconds
922 25, // success threshod in percent
923 8, 8, // {MIN,MAX}_SAMPLES
924 1000, // BASE_TIMEOUT_MSEC
925 1, // retry count
926 };
Xiao Ma09b71022018-12-11 17:56:32 +0900927 const std::vector<DnsRecord> records0 = {
928 {host_name1, ns_type::ns_t_aaaa, "2001:db8::5"},
929 {host_name2, ns_type::ns_t_aaaa, "2001:db8::5"},
930 };
931 const std::vector<DnsRecord> records1 = {
932 {host_name1, ns_type::ns_t_aaaa, "2001:db8::6"},
933 {host_name2, ns_type::ns_t_aaaa, "2001:db8::6"},
934 };
Ken Chenb9fa2062018-11-13 21:51:13 +0800935
936 // dns0 does not respond with 100% probability, while
937 // dns1 responds normally, at least initially.
Mike Yufc125e42019-05-15 20:41:28 +0800938 test::DNSResponder dns0(listen_addr0, listen_srv, static_cast<ns_rcode>(-1));
939 test::DNSResponder dns1(listen_addr1, listen_srv, static_cast<ns_rcode>(-1));
Ken Chenb9fa2062018-11-13 21:51:13 +0800940 dns0.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900941 StartDns(dns0, records0);
942 StartDns(dns1, records1);
Luke Huang483cf332019-06-03 17:24:51 +0800943 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr0, listen_addr1}, defaultSearchDomain,
944 reduceRetryParams));
Ken Chenb9fa2062018-11-13 21:51:13 +0800945
Luke Huang483cf332019-06-03 17:24:51 +0800946 // Specify ai_socktype to make getaddrinfo will only query 1 time
947 const addrinfo hints = {.ai_family = AF_INET6, .ai_socktype = SOCK_STREAM};
Ken Chenb9fa2062018-11-13 21:51:13 +0800948
949 // dns0 will ignore the request, and we'll fallback to dns1 after the first
950 // retry.
951 ScopedAddrinfo result = safe_getaddrinfo(host_name1, nullptr, &hints);
952 EXPECT_TRUE(result != nullptr);
953 EXPECT_EQ(1U, GetNumQueries(dns0, host_name1));
954 EXPECT_EQ(1U, GetNumQueries(dns1, host_name1));
955
956 // Now make dns1 also ignore 100% requests... The resolve should alternate
Luke Huang483cf332019-06-03 17:24:51 +0800957 // queries between the nameservers and fail
Ken Chenb9fa2062018-11-13 21:51:13 +0800958 dns1.setResponseProbability(0.0);
959 addrinfo* result2 = nullptr;
960 EXPECT_EQ(EAI_NODATA, getaddrinfo(host_name2, nullptr, &hints, &result2));
961 EXPECT_EQ(nullptr, result2);
Luke Huang483cf332019-06-03 17:24:51 +0800962 EXPECT_EQ(1U, GetNumQueries(dns0, host_name2));
963 EXPECT_EQ(1U, GetNumQueries(dns1, host_name2));
Ken Chenb9fa2062018-11-13 21:51:13 +0800964}
965
966TEST_F(ResolverTest, GetAddrInfoV6_concurrent) {
Xiao Ma09b71022018-12-11 17:56:32 +0900967 constexpr char listen_addr0[] = "127.0.0.9";
968 constexpr char listen_addr1[] = "127.0.0.10";
969 constexpr char listen_addr2[] = "127.0.0.11";
970 constexpr char host_name[] = "konbanha.example.com.";
971
972 test::DNSResponder dns0(listen_addr0);
973 test::DNSResponder dns1(listen_addr1);
974 test::DNSResponder dns2(listen_addr2);
975 StartDns(dns0, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
976 StartDns(dns1, {{host_name, ns_type::ns_t_aaaa, "2001:db8::6"}});
977 StartDns(dns2, {{host_name, ns_type::ns_t_aaaa, "2001:db8::7"}});
978
Luke Huangf8215372019-11-22 11:53:41 +0800979 const std::vector<std::string> servers = {listen_addr0, listen_addr1, listen_addr2};
Ken Chenb9fa2062018-11-13 21:51:13 +0800980 std::vector<std::thread> threads(10);
981 for (std::thread& thread : threads) {
Luke Huangf8215372019-11-22 11:53:41 +0800982 thread = std::thread([this, &servers]() {
983 unsigned delay = arc4random_uniform(1 * 1000 * 1000); // <= 1s
Ken Chenb9fa2062018-11-13 21:51:13 +0800984 usleep(delay);
985 std::vector<std::string> serverSubset;
986 for (const auto& server : servers) {
987 if (arc4random_uniform(2)) {
988 serverSubset.push_back(server);
989 }
990 }
991 if (serverSubset.empty()) serverSubset = servers;
Xiao Ma09b71022018-12-11 17:56:32 +0900992 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(serverSubset));
993 const addrinfo hints = {.ai_family = AF_INET6};
Ken Chenb9fa2062018-11-13 21:51:13 +0800994 addrinfo* result = nullptr;
995 int rv = getaddrinfo("konbanha", nullptr, &hints, &result);
996 EXPECT_EQ(0, rv) << "error [" << rv << "] " << gai_strerror(rv);
997 if (result) {
998 freeaddrinfo(result);
999 result = nullptr;
1000 }
1001 });
1002 }
1003 for (std::thread& thread : threads) {
1004 thread.join();
1005 }
Ken Chen92bed612018-12-22 21:46:55 +08001006
1007 std::vector<std::string> res_servers;
1008 std::vector<std::string> res_domains;
1009 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001010 res_params res_params;
Ken Chen92bed612018-12-22 21:46:55 +08001011 std::vector<ResolverStats> res_stats;
1012 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001013 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1014 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1015 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chen92bed612018-12-22 21:46:55 +08001016 EXPECT_EQ(0, wait_for_pending_req_timeout_count);
Ken Chenb9fa2062018-11-13 21:51:13 +08001017}
1018
Mike Yu8ac63402019-12-02 15:28:38 +08001019TEST_F(ResolverTest, SkipBadServersDueToInternalError) {
1020 constexpr char listen_addr1[] = "fe80::1";
1021 constexpr char listen_addr2[] = "255.255.255.255";
1022 constexpr char listen_addr3[] = "127.0.0.3";
1023
1024 test::DNSResponder dns(listen_addr3);
1025 ASSERT_TRUE(dns.startServer());
1026
1027 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
1028 parcel.servers = {listen_addr1, listen_addr2, listen_addr3};
1029
1030 // Bad servers can be distinguished after two attempts.
1031 parcel.minSamples = 2;
1032 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1033
1034 // Start querying five times.
1035 for (int i = 0; i < 5; i++) {
1036 std::string hostName = StringPrintf("hello%d.com.", i);
1037 dns.addMapping(hostName, ns_type::ns_t_a, "1.2.3.4");
1038 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1039 EXPECT_TRUE(safe_getaddrinfo(hostName.c_str(), nullptr, &hints) != nullptr);
1040 }
1041
Mike Yue2162e52020-03-04 18:43:46 +08001042 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1043 NameserverStats(listen_addr1).setInternalErrors(2),
1044 NameserverStats(listen_addr2).setInternalErrors(2),
1045 NameserverStats(listen_addr3).setSuccesses(5),
1046 };
1047 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
Mike Yu8ac63402019-12-02 15:28:38 +08001048}
1049
1050TEST_F(ResolverTest, SkipBadServersDueToTimeout) {
1051 constexpr char listen_addr1[] = "127.0.0.3";
1052 constexpr char listen_addr2[] = "127.0.0.4";
1053
1054 // Set dns1 non-responsive and dns2 workable.
1055 test::DNSResponder dns1(listen_addr1, test::kDefaultListenService, static_cast<ns_rcode>(-1));
1056 test::DNSResponder dns2(listen_addr2);
1057 dns1.setResponseProbability(0.0);
1058 ASSERT_TRUE(dns1.startServer());
1059 ASSERT_TRUE(dns2.startServer());
1060
1061 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
1062 parcel.servers = {listen_addr1, listen_addr2};
1063
1064 // Bad servers can be distinguished after two attempts.
1065 parcel.minSamples = 2;
1066 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1067
1068 // Start querying five times.
1069 for (int i = 0; i < 5; i++) {
1070 std::string hostName = StringPrintf("hello%d.com.", i);
1071 dns1.addMapping(hostName, ns_type::ns_t_a, "1.2.3.4");
1072 dns2.addMapping(hostName, ns_type::ns_t_a, "1.2.3.5");
1073 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1074 EXPECT_TRUE(safe_getaddrinfo(hostName.c_str(), nullptr, &hints) != nullptr);
1075 }
1076
Mike Yue2162e52020-03-04 18:43:46 +08001077 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1078 NameserverStats(listen_addr1).setTimeouts(2),
1079 NameserverStats(listen_addr2).setSuccesses(5),
1080 };
1081 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
Mike Yu8ac63402019-12-02 15:28:38 +08001082 EXPECT_EQ(dns1.queries().size(), 2U);
1083 EXPECT_EQ(dns2.queries().size(), 5U);
1084}
1085
chenbrucefd837fa2019-10-29 18:35:36 +08001086TEST_F(ResolverTest, GetAddrInfoFromCustTable_InvalidInput) {
1087 constexpr char hostnameNoip[] = "noip.example.com.";
1088 constexpr char hostnameInvalidip[] = "invalidip.example.com.";
1089 const std::vector<aidl::android::net::ResolverHostsParcel> invalidCustHosts = {
1090 {"", hostnameNoip},
1091 {"wrong IP", hostnameInvalidip},
1092 };
1093 test::DNSResponder dns;
1094 StartDns(dns, {});
1095 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
Ken Chena6ac2a62020-04-07 17:25:56 +08001096 resolverParams.resolverOptions.hosts = invalidCustHosts;
chenbrucefd837fa2019-10-29 18:35:36 +08001097 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1098 for (const auto& hostname : {hostnameNoip, hostnameInvalidip}) {
1099 // The query won't get data from customized table because of invalid customized table
1100 // and DNSResponder also has no records. hostnameNoip has never registered and
1101 // hostnameInvalidip has registered but wrong IP.
1102 const addrinfo hints = {.ai_family = AF_UNSPEC};
1103 ScopedAddrinfo result = safe_getaddrinfo(hostname, nullptr, &hints);
1104 ASSERT_TRUE(result == nullptr);
1105 EXPECT_EQ(4U, GetNumQueries(dns, hostname));
1106 }
1107}
1108
1109TEST_F(ResolverTest, GetAddrInfoFromCustTable) {
1110 constexpr char hostnameV4[] = "v4only.example.com.";
1111 constexpr char hostnameV6[] = "v6only.example.com.";
1112 constexpr char hostnameV4V6[] = "v4v6.example.com.";
1113 constexpr char custAddrV4[] = "1.2.3.4";
1114 constexpr char custAddrV6[] = "::1.2.3.4";
1115 constexpr char dnsSvAddrV4[] = "1.2.3.5";
1116 constexpr char dnsSvAddrV6[] = "::1.2.3.5";
1117 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4 = {
1118 {custAddrV4, hostnameV4},
1119 };
1120 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV6 = {
1121 {custAddrV6, hostnameV6},
1122 };
1123 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4V6 = {
1124 {custAddrV4, hostnameV4V6},
1125 {custAddrV6, hostnameV4V6},
1126 };
1127 const std::vector<DnsRecord> dnsSvHostV4 = {
1128 {hostnameV4, ns_type::ns_t_a, dnsSvAddrV4},
1129 };
1130 const std::vector<DnsRecord> dnsSvHostV6 = {
1131 {hostnameV6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1132 };
1133 const std::vector<DnsRecord> dnsSvHostV4V6 = {
1134 {hostnameV4V6, ns_type::ns_t_a, dnsSvAddrV4},
1135 {hostnameV4V6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1136 };
1137 struct TestConfig {
1138 const std::string name;
1139 const std::vector<aidl::android::net::ResolverHostsParcel> customizedHosts;
1140 const std::vector<DnsRecord> dnsserverHosts;
1141 const std::vector<std::string> queryResult;
1142 std::string asParameters() const {
1143 return StringPrintf("name: %s, customizedHosts: %s, dnsserverHosts: %s", name.c_str(),
1144 customizedHosts.empty() ? "No" : "Yes",
1145 dnsserverHosts.empty() ? "No" : "Yes");
1146 }
1147 } testConfigs[]{
1148 // clang-format off
1149 {hostnameV4, {}, {}, {}},
1150 {hostnameV4, {}, dnsSvHostV4, {dnsSvAddrV4}},
1151 {hostnameV4, custHostV4, {}, {custAddrV4}},
1152 {hostnameV4, custHostV4, dnsSvHostV4, {custAddrV4}},
1153 {hostnameV6, {}, {}, {}},
1154 {hostnameV6, {}, dnsSvHostV6, {dnsSvAddrV6}},
1155 {hostnameV6, custHostV6, {}, {custAddrV6}},
1156 {hostnameV6, custHostV6, dnsSvHostV6, {custAddrV6}},
1157 {hostnameV4V6, {}, {}, {}},
1158 {hostnameV4V6, {}, dnsSvHostV4V6, {dnsSvAddrV4, dnsSvAddrV6}},
1159 {hostnameV4V6, custHostV4V6, {}, {custAddrV4, custAddrV6}},
1160 {hostnameV4V6, custHostV4V6, dnsSvHostV4V6, {custAddrV4, custAddrV6}},
1161 // clang-format on
1162 };
1163
1164 for (const auto& config : testConfigs) {
1165 SCOPED_TRACE(config.asParameters());
1166
1167 test::DNSResponder dns;
1168 StartDns(dns, config.dnsserverHosts);
1169
1170 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
Ken Chena6ac2a62020-04-07 17:25:56 +08001171 resolverParams.resolverOptions.hosts = config.customizedHosts;
chenbrucefd837fa2019-10-29 18:35:36 +08001172 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1173 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM};
1174 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
1175 if (config.customizedHosts.empty() && config.dnsserverHosts.empty()) {
1176 ASSERT_TRUE(result == nullptr);
1177 EXPECT_EQ(2U, GetNumQueries(dns, config.name.c_str()));
1178 } else {
1179 ASSERT_TRUE(result != nullptr);
1180 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(config.queryResult));
1181 EXPECT_EQ(config.customizedHosts.empty() ? 2U : 0U,
1182 GetNumQueries(dns, config.name.c_str()));
1183 }
1184
1185 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
1186 }
1187}
1188
1189TEST_F(ResolverTest, GetAddrInfoFromCustTable_Modify) {
1190 constexpr char hostnameV4V6[] = "v4v6.example.com.";
1191 constexpr char custAddrV4[] = "1.2.3.4";
1192 constexpr char custAddrV6[] = "::1.2.3.4";
1193 constexpr char dnsSvAddrV4[] = "1.2.3.5";
1194 constexpr char dnsSvAddrV6[] = "::1.2.3.5";
1195 const std::vector<DnsRecord> dnsSvHostV4V6 = {
1196 {hostnameV4V6, ns_type::ns_t_a, dnsSvAddrV4},
1197 {hostnameV4V6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1198 };
1199 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4V6 = {
1200 {custAddrV4, hostnameV4V6},
1201 {custAddrV6, hostnameV4V6},
1202 };
1203 test::DNSResponder dns;
1204 StartDns(dns, dnsSvHostV4V6);
1205 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1206
Ken Chena6ac2a62020-04-07 17:25:56 +08001207 resolverParams.resolverOptions.hosts = custHostV4V6;
chenbrucefd837fa2019-10-29 18:35:36 +08001208 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1209 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM};
1210 ScopedAddrinfo result = safe_getaddrinfo(hostnameV4V6, nullptr, &hints);
1211 ASSERT_TRUE(result != nullptr);
1212 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray({custAddrV4, custAddrV6}));
1213 EXPECT_EQ(0U, GetNumQueries(dns, hostnameV4V6));
1214
Ken Chena6ac2a62020-04-07 17:25:56 +08001215 resolverParams.resolverOptions.hosts = {};
chenbrucefd837fa2019-10-29 18:35:36 +08001216 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1217 result = safe_getaddrinfo(hostnameV4V6, nullptr, &hints);
1218 ASSERT_TRUE(result != nullptr);
1219 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray({dnsSvAddrV4, dnsSvAddrV6}));
1220 EXPECT_EQ(2U, GetNumQueries(dns, hostnameV4V6));
1221}
1222
Ken Chenb9fa2062018-11-13 21:51:13 +08001223TEST_F(ResolverTest, EmptySetup) {
Ken Chenb9fa2062018-11-13 21:51:13 +08001224 std::vector<std::string> servers;
1225 std::vector<std::string> domains;
Xiao Ma09b71022018-12-11 17:56:32 +09001226 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001227 std::vector<std::string> res_servers;
1228 std::vector<std::string> res_domains;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001229 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001230 res_params res_params;
Ken Chenb9fa2062018-11-13 21:51:13 +08001231 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +08001232 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001233 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1234 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1235 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chenb9fa2062018-11-13 21:51:13 +08001236 EXPECT_EQ(0U, res_servers.size());
1237 EXPECT_EQ(0U, res_domains.size());
Mike Yu0a1c53d2018-11-26 13:26:21 +09001238 EXPECT_EQ(0U, res_tls_servers.size());
Luke Huang5bd827c2019-03-14 16:10:04 +08001239 ASSERT_EQ(static_cast<size_t>(IDnsResolver::RESOLVER_PARAMS_COUNT), kDefaultParams.size());
1240 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY],
1241 res_params.sample_validity);
1242 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001243 res_params.success_threshold);
Luke Huang5bd827c2019-03-14 16:10:04 +08001244 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
1245 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
1246 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
Ken Chenb9fa2062018-11-13 21:51:13 +08001247 res_params.base_timeout_msec);
Luke Huang5bd827c2019-03-14 16:10:04 +08001248 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_RETRY_COUNT], res_params.retry_count);
Ken Chenb9fa2062018-11-13 21:51:13 +08001249}
1250
1251TEST_F(ResolverTest, SearchPathChange) {
Xiao Ma09b71022018-12-11 17:56:32 +09001252 constexpr char listen_addr[] = "127.0.0.13";
1253 constexpr char host_name1[] = "test13.domain1.org.";
1254 constexpr char host_name2[] = "test13.domain2.org.";
Luke Huangf8215372019-11-22 11:53:41 +08001255 std::vector<std::string> servers = {listen_addr};
1256 std::vector<std::string> domains = {"domain1.org"};
Xiao Ma09b71022018-12-11 17:56:32 +09001257
1258 const std::vector<DnsRecord> records = {
1259 {host_name1, ns_type::ns_t_aaaa, "2001:db8::13"},
1260 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1:13"},
1261 };
1262 test::DNSResponder dns(listen_addr);
1263 StartDns(dns, records);
1264 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001265
1266 const addrinfo hints = {.ai_family = AF_INET6};
1267 ScopedAddrinfo result = safe_getaddrinfo("test13", nullptr, &hints);
1268 EXPECT_TRUE(result != nullptr);
1269 EXPECT_EQ(1U, dns.queries().size());
1270 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
1271 EXPECT_EQ("2001:db8::13", ToString(result));
1272
1273 // Test that changing the domain search path on its own works.
Luke Huangf8215372019-11-22 11:53:41 +08001274 domains = {"domain2.org"};
Xiao Ma09b71022018-12-11 17:56:32 +09001275 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001276 dns.clearQueries();
1277
1278 result = safe_getaddrinfo("test13", nullptr, &hints);
1279 EXPECT_TRUE(result != nullptr);
1280 EXPECT_EQ(1U, dns.queries().size());
1281 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
1282 EXPECT_EQ("2001:db8::1:13", ToString(result));
1283}
1284
Luke Huang2dac4382019-06-24 13:28:44 +08001285namespace {
1286
Luke Huangf8215372019-11-22 11:53:41 +08001287std::vector<std::string> getResolverDomains(aidl::android::net::IDnsResolver* dnsResolverService,
Luke Huang2dac4382019-06-24 13:28:44 +08001288 unsigned netId) {
1289 std::vector<std::string> res_servers;
1290 std::vector<std::string> res_domains;
1291 std::vector<std::string> res_tls_servers;
1292 res_params res_params;
1293 std::vector<ResolverStats> res_stats;
1294 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001295 DnsResponderClient::GetResolverInfo(dnsResolverService, netId, &res_servers, &res_domains,
1296 &res_tls_servers, &res_params, &res_stats,
1297 &wait_for_pending_req_timeout_count);
Luke Huang2dac4382019-06-24 13:28:44 +08001298 return res_domains;
1299}
1300
1301} // namespace
1302
1303TEST_F(ResolverTest, SearchPathPrune) {
1304 constexpr size_t DUPLICATED_DOMAIN_NUM = 3;
1305 constexpr char listen_addr[] = "127.0.0.13";
1306 constexpr char domian_name1[] = "domain13.org.";
1307 constexpr char domian_name2[] = "domain14.org.";
1308 constexpr char host_name1[] = "test13.domain13.org.";
1309 constexpr char host_name2[] = "test14.domain14.org.";
1310 std::vector<std::string> servers = {listen_addr};
1311
1312 std::vector<std::string> testDomains1;
1313 std::vector<std::string> testDomains2;
1314 // Domain length should be <= 255
1315 // Max number of domains in search path is 6
1316 for (size_t i = 0; i < MAXDNSRCH + 1; i++) {
1317 // Fill up with invalid domain
1318 testDomains1.push_back(std::string(300, i + '0'));
1319 // Fill up with valid but duplicated domain
1320 testDomains2.push_back(StringPrintf("domain%zu.org", i % DUPLICATED_DOMAIN_NUM));
1321 }
1322
1323 // Add valid domain used for query.
1324 testDomains1.push_back(domian_name1);
1325
1326 // Add valid domain twice used for query.
1327 testDomains2.push_back(domian_name2);
1328 testDomains2.push_back(domian_name2);
1329
1330 const std::vector<DnsRecord> records = {
1331 {host_name1, ns_type::ns_t_aaaa, "2001:db8::13"},
1332 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1:13"},
1333 };
1334 test::DNSResponder dns(listen_addr);
1335 StartDns(dns, records);
1336 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, testDomains1));
1337
1338 const addrinfo hints = {.ai_family = AF_INET6};
1339 ScopedAddrinfo result = safe_getaddrinfo("test13", nullptr, &hints);
1340
1341 EXPECT_TRUE(result != nullptr);
1342
1343 EXPECT_EQ(1U, dns.queries().size());
1344 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
1345 EXPECT_EQ("2001:db8::13", ToString(result));
1346
1347 const auto& res_domains1 = getResolverDomains(mDnsClient.resolvService(), TEST_NETID);
1348 // Expect 1 valid domain, invalid domains are removed.
1349 ASSERT_EQ(1U, res_domains1.size());
1350 EXPECT_EQ(domian_name1, res_domains1[0]);
1351
1352 dns.clearQueries();
1353
1354 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, testDomains2));
1355
1356 result = safe_getaddrinfo("test14", nullptr, &hints);
1357 EXPECT_TRUE(result != nullptr);
1358
1359 // (3 domains * 2 retries) + 1 success query = 7
1360 EXPECT_EQ(7U, dns.queries().size());
1361 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
1362 EXPECT_EQ("2001:db8::1:13", ToString(result));
1363
1364 const auto& res_domains2 = getResolverDomains(mDnsClient.resolvService(), TEST_NETID);
1365 // Expect 4 valid domain, duplicate domains are removed.
1366 EXPECT_EQ(DUPLICATED_DOMAIN_NUM + 1U, res_domains2.size());
1367 EXPECT_THAT(
1368 std::vector<std::string>({"domain0.org", "domain1.org", "domain2.org", domian_name2}),
1369 testing::ElementsAreArray(res_domains2));
1370}
1371
Mike Yu0a1c53d2018-11-26 13:26:21 +09001372// If we move this function to dns_responder_client, it will complicate the dependency need of
1373// dns_tls_frontend.h.
1374static void setupTlsServers(const std::vector<std::string>& servers,
waynema0e73c2e2019-07-31 15:04:08 +08001375 std::vector<std::unique_ptr<test::DnsTlsFrontend>>* tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001376 constexpr char listen_udp[] = "53";
1377 constexpr char listen_tls[] = "853";
Mike Yu0a1c53d2018-11-26 13:26:21 +09001378
1379 for (const auto& server : servers) {
1380 auto t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
1381 t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
1382 t->startServer();
Mike Yu0a1c53d2018-11-26 13:26:21 +09001383 tls->push_back(std::move(t));
1384 }
1385}
1386
Mike Yu0a1c53d2018-11-26 13:26:21 +09001387TEST_F(ResolverTest, MaxServerPrune_Binder) {
Mike Yu0a1c53d2018-11-26 13:26:21 +09001388 std::vector<std::string> domains;
1389 std::vector<std::unique_ptr<test::DNSResponder>> dns;
1390 std::vector<std::unique_ptr<test::DnsTlsFrontend>> tls;
1391 std::vector<std::string> servers;
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001392 std::vector<DnsResponderClient::Mapping> mappings;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001393
1394 for (unsigned i = 0; i < MAXDNSRCH + 1; i++) {
1395 domains.push_back(StringPrintf("example%u.com", i));
1396 }
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001397 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupMappings(1, domains, &mappings));
1398 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupDNSServers(MAXNS + 1, mappings, &dns, &servers));
waynema0e73c2e2019-07-31 15:04:08 +08001399 ASSERT_NO_FATAL_FAILURE(setupTlsServers(servers, &tls));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001400
waynema0e73c2e2019-07-31 15:04:08 +08001401 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, domains, kDefaultParams,
1402 kDefaultPrivateDnsHostName));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001403
Mike Yu383855b2019-01-15 17:53:27 +08001404 // If the private DNS validation hasn't completed yet before backend DNS servers stop,
1405 // TLS servers will get stuck in handleOneRequest(), which causes this test stuck in
1406 // ~DnsTlsFrontend() because the TLS server loop threads can't be terminated.
1407 // So, wait for private DNS validation done before stopping backend DNS servers.
1408 for (int i = 0; i < MAXNS; i++) {
chenbruceaff85842019-05-31 15:46:42 +08001409 LOG(INFO) << "Waiting for private DNS validation on " << tls[i]->listen_address() << ".";
Mike Yu724f77d2019-08-16 11:14:50 +08001410 EXPECT_TRUE(WaitForPrivateDnsValidation(tls[i]->listen_address(), true));
chenbruceaff85842019-05-31 15:46:42 +08001411 LOG(INFO) << "private DNS validation on " << tls[i]->listen_address() << " done.";
Mike Yu383855b2019-01-15 17:53:27 +08001412 }
1413
Mike Yu0a1c53d2018-11-26 13:26:21 +09001414 std::vector<std::string> res_servers;
1415 std::vector<std::string> res_domains;
1416 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001417 res_params res_params;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001418 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +08001419 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001420 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1421 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1422 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001423
1424 // Check the size of the stats and its contents.
1425 EXPECT_EQ(static_cast<size_t>(MAXNS), res_servers.size());
1426 EXPECT_EQ(static_cast<size_t>(MAXNS), res_tls_servers.size());
1427 EXPECT_EQ(static_cast<size_t>(MAXDNSRCH), res_domains.size());
1428 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_servers.begin()));
1429 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_tls_servers.begin()));
1430 EXPECT_TRUE(std::equal(domains.begin(), domains.begin() + MAXDNSRCH, res_domains.begin()));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001431}
1432
1433TEST_F(ResolverTest, ResolverStats) {
Xiao Ma09b71022018-12-11 17:56:32 +09001434 constexpr char listen_addr1[] = "127.0.0.4";
1435 constexpr char listen_addr2[] = "127.0.0.5";
1436 constexpr char listen_addr3[] = "127.0.0.6";
Mike Yu0a1c53d2018-11-26 13:26:21 +09001437
1438 // Set server 1 timeout.
Mike Yufc125e42019-05-15 20:41:28 +08001439 test::DNSResponder dns1(listen_addr1, "53", static_cast<ns_rcode>(-1));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001440 dns1.setResponseProbability(0.0);
1441 ASSERT_TRUE(dns1.startServer());
1442
1443 // Set server 2 responding server failure.
Xiao Ma09b71022018-12-11 17:56:32 +09001444 test::DNSResponder dns2(listen_addr2);
Mike Yu0a1c53d2018-11-26 13:26:21 +09001445 dns2.setResponseProbability(0.0);
1446 ASSERT_TRUE(dns2.startServer());
1447
1448 // Set server 3 workable.
Xiao Ma09b71022018-12-11 17:56:32 +09001449 test::DNSResponder dns3(listen_addr3);
1450 dns3.addMapping(kHelloExampleCom, ns_type::ns_t_a, "1.2.3.4");
Mike Yu0a1c53d2018-11-26 13:26:21 +09001451 ASSERT_TRUE(dns3.startServer());
1452
1453 std::vector<std::string> servers = {listen_addr1, listen_addr2, listen_addr3};
Xiao Ma09b71022018-12-11 17:56:32 +09001454 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001455
1456 dns3.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +09001457 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
Mike Yu0a1c53d2018-11-26 13:26:21 +09001458 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
Xiao Ma09b71022018-12-11 17:56:32 +09001459 size_t found = GetNumQueries(dns3, kHelloExampleCom);
Mike Yu0a1c53d2018-11-26 13:26:21 +09001460 EXPECT_LE(1U, found);
1461 std::string result_str = ToString(result);
1462 EXPECT_TRUE(result_str == "1.2.3.4") << ", result_str='" << result_str << "'";
1463
Mike Yue2162e52020-03-04 18:43:46 +08001464 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1465 NameserverStats(listen_addr1).setTimeouts(1),
1466 NameserverStats(listen_addr2).setErrors(1),
1467 NameserverStats(listen_addr3).setSuccesses(1),
1468 };
1469 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001470}
1471
Mike Yu15791832020-02-11 13:38:48 +08001472TEST_F(ResolverTest, AlwaysUseLatestSetupParamsInLookups) {
1473 constexpr char listen_addr1[] = "127.0.0.3";
1474 constexpr char listen_addr2[] = "255.255.255.255";
1475 constexpr char listen_addr3[] = "127.0.0.4";
1476 constexpr char hostname[] = "hello";
1477 constexpr char fqdn_with_search_domain[] = "hello.domain2.com.";
1478
1479 test::DNSResponder dns1(listen_addr1, test::kDefaultListenService, static_cast<ns_rcode>(-1));
1480 dns1.setResponseProbability(0.0);
1481 ASSERT_TRUE(dns1.startServer());
1482
1483 test::DNSResponder dns3(listen_addr3);
1484 StartDns(dns3, {{fqdn_with_search_domain, ns_type::ns_t_a, "1.2.3.4"}});
1485
1486 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
1487 parcel.tlsServers.clear();
1488 parcel.servers = {listen_addr1, listen_addr2};
1489 parcel.domains = {"domain1.com", "domain2.com"};
1490 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1491
1492 // Expect the things happening in t1:
1493 // 1. The lookup starts using the first domain for query. It sends queries to the populated
1494 // nameserver list {listen_addr1, listen_addr2} for the hostname "hello.domain1.com".
1495 // 2. A different list of nameservers is updated to the resolver. Revision ID is incremented.
1496 // 3. The query for the hostname times out. The lookup fails to add the timeout record to the
1497 // the stats because of the unmatched revision ID.
1498 // 4. The lookup starts using the second domain for query. It sends queries to the populated
1499 // nameserver list {listen_addr3, listen_addr1, listen_addr2} for another hostname
1500 // "hello.domain2.com".
1501 // 5. The lookup gets the answer and updates a success record to the stats.
1502 std::thread t1([&hostname]() {
1503 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1504 ScopedAddrinfo result = safe_getaddrinfo(hostname, nullptr, &hints);
1505 EXPECT_NE(result.get(), nullptr);
1506 EXPECT_EQ(ToString(result), "1.2.3.4");
1507 });
1508
1509 // Wait for t1 to start the step 1.
1510 while (dns1.queries().size() == 0) {
1511 usleep(1000);
1512 }
1513
1514 // Update the resolver with three nameservers. This will increment the revision ID.
1515 parcel.servers = {listen_addr3, listen_addr1, listen_addr2};
1516 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1517
1518 t1.join();
1519 EXPECT_EQ(0U, GetNumQueriesForType(dns3, ns_type::ns_t_aaaa, fqdn_with_search_domain));
1520 EXPECT_EQ(1U, GetNumQueriesForType(dns3, ns_type::ns_t_a, fqdn_with_search_domain));
1521
Mike Yue2162e52020-03-04 18:43:46 +08001522 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1523 NameserverStats(listen_addr1),
1524 NameserverStats(listen_addr2),
1525 NameserverStats(listen_addr3).setSuccesses(1),
1526 };
1527 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
Mike Yu15791832020-02-11 13:38:48 +08001528}
1529
Ken Chenb9fa2062018-11-13 21:51:13 +08001530// Test what happens if the specified TLS server is nonexistent.
1531TEST_F(ResolverTest, GetHostByName_TlsMissing) {
Xiao Ma09b71022018-12-11 17:56:32 +09001532 constexpr char listen_addr[] = "127.0.0.3";
1533 constexpr char host_name[] = "tlsmissing.example.com.";
1534
1535 test::DNSResponder dns;
1536 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.3"}});
Luke Huangf8215372019-11-22 11:53:41 +08001537 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001538
1539 // There's nothing listening on this address, so validation will either fail or
1540 /// hang. Either way, queries will continue to flow to the DNSResponder.
waynema0e73c2e2019-07-31 15:04:08 +08001541 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Ken Chenb9fa2062018-11-13 21:51:13 +08001542
1543 const hostent* result;
1544
1545 result = gethostbyname("tlsmissing");
1546 ASSERT_FALSE(result == nullptr);
1547 EXPECT_EQ("1.2.3.3", ToString(result));
1548
1549 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001550 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001551}
1552
1553// Test what happens if the specified TLS server replies with garbage.
1554TEST_F(ResolverTest, GetHostByName_TlsBroken) {
Xiao Ma09b71022018-12-11 17:56:32 +09001555 constexpr char listen_addr[] = "127.0.0.3";
1556 constexpr char host_name1[] = "tlsbroken1.example.com.";
1557 constexpr char host_name2[] = "tlsbroken2.example.com.";
1558 const std::vector<DnsRecord> records = {
1559 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1560 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1561 };
1562
1563 test::DNSResponder dns;
1564 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001565 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001566
1567 // Bind the specified private DNS socket but don't respond to any client sockets yet.
1568 int s = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, IPPROTO_TCP);
1569 ASSERT_TRUE(s >= 0);
1570 struct sockaddr_in tlsServer = {
Luke Huangf8215372019-11-22 11:53:41 +08001571 .sin_family = AF_INET,
1572 .sin_port = htons(853),
Ken Chenb9fa2062018-11-13 21:51:13 +08001573 };
1574 ASSERT_TRUE(inet_pton(AF_INET, listen_addr, &tlsServer.sin_addr));
1575 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEPORT).ok());
1576 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEADDR).ok());
1577 ASSERT_FALSE(bind(s, reinterpret_cast<struct sockaddr*>(&tlsServer), sizeof(tlsServer)));
1578 ASSERT_FALSE(listen(s, 1));
1579
1580 // Trigger TLS validation.
waynema0e73c2e2019-07-31 15:04:08 +08001581 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Ken Chenb9fa2062018-11-13 21:51:13 +08001582
1583 struct sockaddr_storage cliaddr;
1584 socklen_t sin_size = sizeof(cliaddr);
Luke Huangf8215372019-11-22 11:53:41 +08001585 int new_fd = accept4(s, reinterpret_cast<struct sockaddr*>(&cliaddr), &sin_size, SOCK_CLOEXEC);
Ken Chenb9fa2062018-11-13 21:51:13 +08001586 ASSERT_TRUE(new_fd > 0);
1587
1588 // We've received the new file descriptor but not written to it or closed, so the
1589 // validation is still pending. Queries should still flow correctly because the
1590 // server is not used until validation succeeds.
1591 const hostent* result;
1592 result = gethostbyname("tlsbroken1");
1593 ASSERT_FALSE(result == nullptr);
1594 EXPECT_EQ("1.2.3.1", ToString(result));
1595
1596 // Now we cause the validation to fail.
1597 std::string garbage = "definitely not a valid TLS ServerHello";
1598 write(new_fd, garbage.data(), garbage.size());
1599 close(new_fd);
1600
1601 // Validation failure shouldn't interfere with lookups, because lookups won't be sent
1602 // to the TLS server unless validation succeeds.
1603 result = gethostbyname("tlsbroken2");
1604 ASSERT_FALSE(result == nullptr);
1605 EXPECT_EQ("1.2.3.2", ToString(result));
1606
1607 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001608 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001609 close(s);
1610}
1611
1612TEST_F(ResolverTest, GetHostByName_Tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001613 constexpr char listen_addr[] = "127.0.0.3";
1614 constexpr char listen_udp[] = "53";
1615 constexpr char listen_tls[] = "853";
1616 constexpr char host_name1[] = "tls1.example.com.";
1617 constexpr char host_name2[] = "tls2.example.com.";
1618 constexpr char host_name3[] = "tls3.example.com.";
1619 const std::vector<DnsRecord> records = {
1620 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1621 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1622 {host_name3, ns_type::ns_t_a, "1.2.3.3"},
1623 };
1624
1625 test::DNSResponder dns;
1626 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001627 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001628
1629 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1630 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001631 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08001632 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001633
Mike Yu724f77d2019-08-16 11:14:50 +08001634 const hostent* result = gethostbyname("tls1");
Ken Chenb9fa2062018-11-13 21:51:13 +08001635 ASSERT_FALSE(result == nullptr);
1636 EXPECT_EQ("1.2.3.1", ToString(result));
1637
1638 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001639 EXPECT_TRUE(tls.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001640
1641 // Stop the TLS server. Since we're in opportunistic mode, queries will
1642 // fall back to the locally-assigned (clear text) nameservers.
1643 tls.stopServer();
1644
1645 dns.clearQueries();
1646 result = gethostbyname("tls2");
1647 EXPECT_FALSE(result == nullptr);
1648 EXPECT_EQ("1.2.3.2", ToString(result));
1649 const auto queries = dns.queries();
1650 EXPECT_EQ(1U, queries.size());
waynema29253052019-08-20 11:26:08 +08001651 EXPECT_EQ("tls2.example.com.", queries[0].name);
1652 EXPECT_EQ(ns_t_a, queries[0].type);
Ken Chenb9fa2062018-11-13 21:51:13 +08001653
1654 // Reset the resolvers without enabling TLS. Queries should still be routed
1655 // to the UDP endpoint.
Xiao Ma09b71022018-12-11 17:56:32 +09001656 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001657
1658 result = gethostbyname("tls3");
1659 ASSERT_FALSE(result == nullptr);
1660 EXPECT_EQ("1.2.3.3", ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +08001661}
1662
Ken Chenb9fa2062018-11-13 21:51:13 +08001663TEST_F(ResolverTest, GetHostByName_TlsFailover) {
Xiao Ma09b71022018-12-11 17:56:32 +09001664 constexpr char listen_addr1[] = "127.0.0.3";
1665 constexpr char listen_addr2[] = "127.0.0.4";
1666 constexpr char listen_udp[] = "53";
1667 constexpr char listen_tls[] = "853";
1668 constexpr char host_name1[] = "tlsfailover1.example.com.";
1669 constexpr char host_name2[] = "tlsfailover2.example.com.";
1670 const std::vector<DnsRecord> records1 = {
1671 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1672 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1673 };
1674 const std::vector<DnsRecord> records2 = {
1675 {host_name1, ns_type::ns_t_a, "1.2.3.3"},
1676 {host_name2, ns_type::ns_t_a, "1.2.3.4"},
1677 };
1678
1679 test::DNSResponder dns1(listen_addr1);
1680 test::DNSResponder dns2(listen_addr2);
1681 StartDns(dns1, records1);
1682 StartDns(dns2, records2);
1683
Luke Huangf8215372019-11-22 11:53:41 +08001684 std::vector<std::string> servers = {listen_addr1, listen_addr2};
Ken Chenb9fa2062018-11-13 21:51:13 +08001685
1686 test::DnsTlsFrontend tls1(listen_addr1, listen_tls, listen_addr1, listen_udp);
1687 test::DnsTlsFrontend tls2(listen_addr2, listen_tls, listen_addr2, listen_udp);
1688 ASSERT_TRUE(tls1.startServer());
1689 ASSERT_TRUE(tls2.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001690 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1691 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08001692 EXPECT_TRUE(WaitForPrivateDnsValidation(tls1.listen_address(), true));
1693 EXPECT_TRUE(WaitForPrivateDnsValidation(tls2.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001694
Mike Yu724f77d2019-08-16 11:14:50 +08001695 const hostent* result = gethostbyname("tlsfailover1");
Ken Chenb9fa2062018-11-13 21:51:13 +08001696 ASSERT_FALSE(result == nullptr);
1697 EXPECT_EQ("1.2.3.1", ToString(result));
1698
1699 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001700 EXPECT_TRUE(tls1.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001701 // No new queries should have reached tls2.
Luke Huang0a0870d2020-02-12 20:41:10 +08001702 EXPECT_TRUE(tls2.waitForQueries(1));
Ken Chenb9fa2062018-11-13 21:51:13 +08001703
1704 // Stop tls1. Subsequent queries should attempt to reach tls1, fail, and retry to tls2.
1705 tls1.stopServer();
1706
1707 result = gethostbyname("tlsfailover2");
1708 EXPECT_EQ("1.2.3.4", ToString(result));
1709
1710 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001711 EXPECT_TRUE(tls2.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001712
1713 // No additional queries should have reached the insecure servers.
1714 EXPECT_EQ(2U, dns1.queries().size());
1715 EXPECT_EQ(2U, dns2.queries().size());
1716
1717 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001718 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Ken Chenb9fa2062018-11-13 21:51:13 +08001719}
1720
1721TEST_F(ResolverTest, GetHostByName_BadTlsName) {
Xiao Ma09b71022018-12-11 17:56:32 +09001722 constexpr char listen_addr[] = "127.0.0.3";
1723 constexpr char listen_udp[] = "53";
1724 constexpr char listen_tls[] = "853";
1725 constexpr char host_name[] = "badtlsname.example.com.";
1726
1727 test::DNSResponder dns;
1728 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.1"}});
Luke Huangf8215372019-11-22 11:53:41 +08001729 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001730
1731 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1732 ASSERT_TRUE(tls.startServer());
Xiao Ma09b71022018-12-11 17:56:32 +09001733 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
waynema0e73c2e2019-07-31 15:04:08 +08001734 kDefaultIncorrectPrivateDnsHostName));
Ken Chenb9fa2062018-11-13 21:51:13 +08001735
waynema0e73c2e2019-07-31 15:04:08 +08001736 // The TLS handshake would fail because the name of TLS server doesn't
1737 // match with TLS server's certificate.
Mike Yu724f77d2019-08-16 11:14:50 +08001738 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), false));
Ken Chenb9fa2062018-11-13 21:51:13 +08001739
1740 // The query should fail hard, because a name was specified.
1741 EXPECT_EQ(nullptr, gethostbyname("badtlsname"));
1742
1743 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001744 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001745}
1746
1747TEST_F(ResolverTest, GetAddrInfo_Tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001748 constexpr char listen_addr[] = "127.0.0.3";
1749 constexpr char listen_udp[] = "53";
1750 constexpr char listen_tls[] = "853";
1751 constexpr char host_name[] = "addrinfotls.example.com.";
1752 const std::vector<DnsRecord> records = {
1753 {host_name, ns_type::ns_t_a, "1.2.3.4"},
1754 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
1755 };
1756
1757 test::DNSResponder dns;
1758 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001759 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001760
1761 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1762 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001763 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1764 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08001765 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001766
1767 dns.clearQueries();
1768 ScopedAddrinfo result = safe_getaddrinfo("addrinfotls", nullptr, nullptr);
1769 EXPECT_TRUE(result != nullptr);
1770 size_t found = GetNumQueries(dns, host_name);
1771 EXPECT_LE(1U, found);
1772 // Could be A or AAAA
1773 std::string result_str = ToString(result);
1774 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +08001775 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08001776 // Wait for both A and AAAA queries to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001777 EXPECT_TRUE(tls.waitForQueries(3));
Ken Chenb9fa2062018-11-13 21:51:13 +08001778
1779 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001780 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001781}
1782
1783TEST_F(ResolverTest, TlsBypass) {
1784 const char OFF[] = "off";
1785 const char OPPORTUNISTIC[] = "opportunistic";
1786 const char STRICT[] = "strict";
1787
1788 const char GETHOSTBYNAME[] = "gethostbyname";
1789 const char GETADDRINFO[] = "getaddrinfo";
1790 const char GETADDRINFOFORNET[] = "getaddrinfofornet";
1791
1792 const unsigned BYPASS_NETID = NETID_USE_LOCAL_NAMESERVERS | TEST_NETID;
1793
Ken Chenb9fa2062018-11-13 21:51:13 +08001794 const char ADDR4[] = "192.0.2.1";
1795 const char ADDR6[] = "2001:db8::1";
1796
1797 const char cleartext_addr[] = "127.0.0.53";
1798 const char cleartext_port[] = "53";
1799 const char tls_port[] = "853";
Luke Huangf8215372019-11-22 11:53:41 +08001800 const std::vector<std::string> servers = {cleartext_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001801
Xiao Ma09b71022018-12-11 17:56:32 +09001802 test::DNSResponder dns(cleartext_addr);
Ken Chenb9fa2062018-11-13 21:51:13 +08001803 ASSERT_TRUE(dns.startServer());
1804
1805 test::DnsTlsFrontend tls(cleartext_addr, tls_port, cleartext_addr, cleartext_port);
Mike Yudd4ac2d2019-05-31 16:52:11 +08001806 ASSERT_TRUE(tls.startServer());
Ken Chenb9fa2062018-11-13 21:51:13 +08001807
Luke Huangf8215372019-11-22 11:53:41 +08001808 // clang-format off
Ken Chenb9fa2062018-11-13 21:51:13 +08001809 struct TestConfig {
1810 const std::string mode;
1811 const bool withWorkingTLS;
1812 const std::string method;
1813
1814 std::string asHostName() const {
Luke Huangf8215372019-11-22 11:53:41 +08001815 return StringPrintf("%s.%s.%s.", mode.c_str(), withWorkingTLS ? "tlsOn" : "tlsOff",
Ken Chenb9fa2062018-11-13 21:51:13 +08001816 method.c_str());
1817 }
1818 } testConfigs[]{
Ken Chenb9fa2062018-11-13 21:51:13 +08001819 {OFF, true, GETHOSTBYNAME},
1820 {OPPORTUNISTIC, true, GETHOSTBYNAME},
1821 {STRICT, true, GETHOSTBYNAME},
Ken Chenb9fa2062018-11-13 21:51:13 +08001822 {OFF, true, GETADDRINFO},
1823 {OPPORTUNISTIC, true, GETADDRINFO},
1824 {STRICT, true, GETADDRINFO},
Ken Chenb9fa2062018-11-13 21:51:13 +08001825 {OFF, true, GETADDRINFOFORNET},
1826 {OPPORTUNISTIC, true, GETADDRINFOFORNET},
1827 {STRICT, true, GETADDRINFOFORNET},
Mike Yudd4ac2d2019-05-31 16:52:11 +08001828 {OFF, false, GETHOSTBYNAME},
1829 {OPPORTUNISTIC, false, GETHOSTBYNAME},
1830 {STRICT, false, GETHOSTBYNAME},
1831 {OFF, false, GETADDRINFO},
1832 {OPPORTUNISTIC, false, GETADDRINFO},
1833 {STRICT, false, GETADDRINFO},
1834 {OFF, false, GETADDRINFOFORNET},
1835 {OPPORTUNISTIC, false, GETADDRINFOFORNET},
1836 {STRICT, false, GETADDRINFOFORNET},
Ken Chenb9fa2062018-11-13 21:51:13 +08001837 };
Luke Huangf8215372019-11-22 11:53:41 +08001838 // clang-format on
Ken Chenb9fa2062018-11-13 21:51:13 +08001839
1840 for (const auto& config : testConfigs) {
1841 const std::string testHostName = config.asHostName();
1842 SCOPED_TRACE(testHostName);
1843
1844 // Don't tempt test bugs due to caching.
1845 const char* host_name = testHostName.c_str();
1846 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
1847 dns.addMapping(host_name, ns_type::ns_t_aaaa, ADDR6);
1848
Mike Yudd4ac2d2019-05-31 16:52:11 +08001849 if (config.withWorkingTLS) {
1850 if (!tls.running()) {
1851 ASSERT_TRUE(tls.startServer());
1852 }
1853 } else {
1854 if (tls.running()) {
1855 ASSERT_TRUE(tls.stopServer());
1856 }
1857 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001858
1859 if (config.mode == OFF) {
Xiao Ma09b71022018-12-11 17:56:32 +09001860 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, kDefaultSearchDomains,
1861 kDefaultParams));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001862 } else /* OPPORTUNISTIC or STRICT */ {
1863 const char* tls_hostname = (config.mode == STRICT) ? kDefaultPrivateDnsHostName : "";
Xiao Ma09b71022018-12-11 17:56:32 +09001864 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001865 kDefaultParams, tls_hostname));
Mike Yu724f77d2019-08-16 11:14:50 +08001866
1867 // Wait for the validation event. If the server is running, the validation should
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001868 // succeed; otherwise, the validation should fail.
Mike Yu724f77d2019-08-16 11:14:50 +08001869 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), config.withWorkingTLS));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001870 if (config.withWorkingTLS) {
1871 EXPECT_TRUE(tls.waitForQueries(1));
1872 tls.clearQueries();
1873 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001874 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001875
1876 const hostent* h_result = nullptr;
1877 ScopedAddrinfo ai_result;
1878
1879 if (config.method == GETHOSTBYNAME) {
1880 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
1881 h_result = gethostbyname(host_name);
1882
1883 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
1884 ASSERT_FALSE(h_result == nullptr);
1885 ASSERT_EQ(4, h_result->h_length);
1886 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
1887 EXPECT_EQ(ADDR4, ToString(h_result));
1888 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
1889 } else if (config.method == GETADDRINFO) {
1890 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
1891 ai_result = safe_getaddrinfo(host_name, nullptr, nullptr);
1892 EXPECT_TRUE(ai_result != nullptr);
1893
1894 EXPECT_LE(1U, GetNumQueries(dns, host_name));
1895 // Could be A or AAAA
1896 const std::string result_str = ToString(ai_result);
1897 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
Luke Huangf8215372019-11-22 11:53:41 +08001898 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08001899 } else if (config.method == GETADDRINFOFORNET) {
1900 addrinfo* raw_ai_result = nullptr;
1901 EXPECT_EQ(0, android_getaddrinfofornet(host_name, /*servname=*/nullptr,
1902 /*hints=*/nullptr, BYPASS_NETID, MARK_UNSET,
1903 &raw_ai_result));
1904 ai_result.reset(raw_ai_result);
1905
1906 EXPECT_LE(1U, GetNumQueries(dns, host_name));
1907 // Could be A or AAAA
1908 const std::string result_str = ToString(ai_result);
1909 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
Luke Huangf8215372019-11-22 11:53:41 +08001910 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08001911 }
1912
Mike Yudd4ac2d2019-05-31 16:52:11 +08001913 EXPECT_EQ(0, tls.queries());
Ken Chenb9fa2062018-11-13 21:51:13 +08001914
1915 // Clear per-process resolv netid.
1916 ASSERT_EQ(0, setNetworkForResolv(NETID_UNSET));
Ken Chenb9fa2062018-11-13 21:51:13 +08001917 dns.clearQueries();
1918 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001919}
1920
1921TEST_F(ResolverTest, StrictMode_NoTlsServers) {
Xiao Ma09b71022018-12-11 17:56:32 +09001922 constexpr char cleartext_addr[] = "127.0.0.53";
Luke Huangf8215372019-11-22 11:53:41 +08001923 const std::vector<std::string> servers = {cleartext_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09001924 constexpr char host_name[] = "strictmode.notlsips.example.com.";
1925 const std::vector<DnsRecord> records = {
1926 {host_name, ns_type::ns_t_a, "1.2.3.4"},
1927 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
1928 };
Ken Chenb9fa2062018-11-13 21:51:13 +08001929
Xiao Ma09b71022018-12-11 17:56:32 +09001930 test::DNSResponder dns(cleartext_addr);
1931 StartDns(dns, records);
Ken Chenb9fa2062018-11-13 21:51:13 +08001932
waynema0e73c2e2019-07-31 15:04:08 +08001933 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1934 kDefaultIncorrectPrivateDnsHostName));
Ken Chenb9fa2062018-11-13 21:51:13 +08001935
1936 addrinfo* ai_result = nullptr;
1937 EXPECT_NE(0, getaddrinfo(host_name, nullptr, nullptr, &ai_result));
1938 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
1939}
Luke Huang94b10b92018-11-21 20:13:38 +08001940
1941namespace {
1942
Luke Huang70931aa2019-01-31 11:57:41 +08001943int getAsyncResponse(int fd, int* rcode, uint8_t* buf, int bufLen) {
Luke Huang94b10b92018-11-21 20:13:38 +08001944 struct pollfd wait_fd[1];
1945 wait_fd[0].fd = fd;
1946 wait_fd[0].events = POLLIN;
1947 short revents;
1948 int ret;
1949
1950 ret = poll(wait_fd, 1, -1);
1951 revents = wait_fd[0].revents;
1952 if (revents & POLLIN) {
1953 int n = resNetworkResult(fd, rcode, buf, bufLen);
Luke Huangba7bef92018-12-26 16:53:03 +08001954 // Verify that resNetworkResult() closed the fd
1955 char dummy;
1956 EXPECT_EQ(-1, read(fd, &dummy, sizeof dummy));
1957 EXPECT_EQ(EBADF, errno);
Luke Huang94b10b92018-11-21 20:13:38 +08001958 return n;
1959 }
1960 return -1;
1961}
1962
Luke Huang70931aa2019-01-31 11:57:41 +08001963std::string toString(uint8_t* buf, int bufLen, int ipType) {
Luke Huang94b10b92018-11-21 20:13:38 +08001964 ns_msg handle;
1965 int ancount, n = 0;
1966 ns_rr rr;
1967
Luke Huangf8215372019-11-22 11:53:41 +08001968 if (ns_initparse((const uint8_t*)buf, bufLen, &handle) >= 0) {
Luke Huang94b10b92018-11-21 20:13:38 +08001969 ancount = ns_msg_count(handle, ns_s_an);
1970 if (ns_parserr(&handle, ns_s_an, n, &rr) == 0) {
Luke Huang70931aa2019-01-31 11:57:41 +08001971 const uint8_t* rdata = ns_rr_rdata(rr);
Luke Huang94b10b92018-11-21 20:13:38 +08001972 char buffer[INET6_ADDRSTRLEN];
Luke Huangf8215372019-11-22 11:53:41 +08001973 if (inet_ntop(ipType, (const char*)rdata, buffer, sizeof(buffer))) {
Luke Huang94b10b92018-11-21 20:13:38 +08001974 return buffer;
1975 }
1976 }
1977 }
1978 return "";
1979}
1980
1981int dns_open_proxy() {
1982 int s = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
1983 if (s == -1) {
1984 return -1;
1985 }
1986 const int one = 1;
1987 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
1988
1989 static const struct sockaddr_un proxy_addr = {
1990 .sun_family = AF_UNIX,
1991 .sun_path = "/dev/socket/dnsproxyd",
1992 };
1993
Luke Huangf8215372019-11-22 11:53:41 +08001994 if (TEMP_FAILURE_RETRY(connect(s, (const struct sockaddr*)&proxy_addr, sizeof(proxy_addr))) !=
Luke Huang94b10b92018-11-21 20:13:38 +08001995 0) {
1996 close(s);
1997 return -1;
1998 }
1999
2000 return s;
2001}
2002
Luke Huangba7bef92018-12-26 16:53:03 +08002003void expectAnswersValid(int fd, int ipType, const std::string& expectedAnswer) {
2004 int rcode = -1;
2005 uint8_t buf[MAXPACKET] = {};
2006
2007 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2008 EXPECT_GT(res, 0);
2009 EXPECT_EQ(expectedAnswer, toString(buf, res, ipType));
2010}
2011
2012void expectAnswersNotValid(int fd, int expectedErrno) {
2013 int rcode = -1;
2014 uint8_t buf[MAXPACKET] = {};
2015
2016 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2017 EXPECT_EQ(expectedErrno, res);
2018}
2019
Luke Huang94b10b92018-11-21 20:13:38 +08002020} // namespace
2021
2022TEST_F(ResolverTest, Async_NormalQueryV4V6) {
Xiao Ma09b71022018-12-11 17:56:32 +09002023 constexpr char listen_addr[] = "127.0.0.4";
2024 constexpr char host_name[] = "howdy.example.com.";
2025 const std::vector<DnsRecord> records = {
2026 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2027 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2028 };
2029
2030 test::DNSResponder dns(listen_addr);
2031 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002032 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002033 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002034
Luke Huangba7bef92018-12-26 16:53:03 +08002035 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2036 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002037 EXPECT_TRUE(fd1 != -1);
2038 EXPECT_TRUE(fd2 != -1);
2039
Luke Huang70931aa2019-01-31 11:57:41 +08002040 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002041 int rcode;
2042 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2043 EXPECT_GT(res, 0);
2044 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
2045
2046 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2047 EXPECT_GT(res, 0);
2048 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2049
2050 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
2051
2052 // Re-query verify cache works
Luke Huangba7bef92018-12-26 16:53:03 +08002053 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2054 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002055
2056 EXPECT_TRUE(fd1 != -1);
2057 EXPECT_TRUE(fd2 != -1);
2058
2059 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2060 EXPECT_GT(res, 0);
2061 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
2062
2063 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2064 EXPECT_GT(res, 0);
2065 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2066
2067 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
2068}
2069
2070TEST_F(ResolverTest, Async_BadQuery) {
Xiao Ma09b71022018-12-11 17:56:32 +09002071 constexpr char listen_addr[] = "127.0.0.4";
2072 constexpr char host_name[] = "howdy.example.com.";
2073 const std::vector<DnsRecord> records = {
2074 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2075 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2076 };
2077
2078 test::DNSResponder dns(listen_addr);
2079 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002080 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002081 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002082
2083 static struct {
2084 int fd;
2085 const char* dname;
2086 const int queryType;
2087 const int expectRcode;
2088 } kTestData[] = {
Luke Huangba7bef92018-12-26 16:53:03 +08002089 {-1, "", ns_t_aaaa, 0},
2090 {-1, "as65ass46", ns_t_aaaa, 0},
2091 {-1, "454564564564", ns_t_aaaa, 0},
2092 {-1, "h645235", ns_t_a, 0},
2093 {-1, "www.google.com", ns_t_a, 0},
Luke Huang94b10b92018-11-21 20:13:38 +08002094 };
2095
2096 for (auto& td : kTestData) {
2097 SCOPED_TRACE(td.dname);
Luke Huangba7bef92018-12-26 16:53:03 +08002098 td.fd = resNetworkQuery(TEST_NETID, td.dname, ns_c_in, td.queryType, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002099 EXPECT_TRUE(td.fd != -1);
2100 }
2101
2102 // dns_responder return empty resp(packet only contains query part) with no error currently
2103 for (const auto& td : kTestData) {
Luke Huang70931aa2019-01-31 11:57:41 +08002104 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002105 int rcode;
2106 SCOPED_TRACE(td.dname);
2107 int res = getAsyncResponse(td.fd, &rcode, buf, MAXPACKET);
2108 EXPECT_GT(res, 0);
2109 EXPECT_EQ(rcode, td.expectRcode);
2110 }
2111}
2112
2113TEST_F(ResolverTest, Async_EmptyAnswer) {
Xiao Ma09b71022018-12-11 17:56:32 +09002114 constexpr char listen_addr[] = "127.0.0.4";
2115 constexpr char host_name[] = "howdy.example.com.";
2116 const std::vector<DnsRecord> records = {
2117 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2118 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2119 };
2120
2121 test::DNSResponder dns(listen_addr);
2122 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002123 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002124 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002125
Luke Huang9c264bb2018-12-18 16:44:41 +08002126 // TODO: Disable retry to make this test explicit.
2127 auto& cv = dns.getCv();
2128 auto& cvMutex = dns.getCvMutex();
2129 int fd1;
2130 // Wait on the condition variable to ensure that the DNS server has handled our first query.
2131 {
2132 std::unique_lock lk(cvMutex);
Luke Huangba7bef92018-12-26 16:53:03 +08002133 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang9c264bb2018-12-18 16:44:41 +08002134 EXPECT_TRUE(fd1 != -1);
2135 EXPECT_EQ(std::cv_status::no_timeout, cv.wait_for(lk, std::chrono::seconds(1)));
2136 }
Luke Huang94b10b92018-11-21 20:13:38 +08002137
Luke Huang94b10b92018-11-21 20:13:38 +08002138 dns.setResponseProbability(0.0);
Luke Huang94b10b92018-11-21 20:13:38 +08002139
Luke Huangba7bef92018-12-26 16:53:03 +08002140 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002141 EXPECT_TRUE(fd2 != -1);
2142
Luke Huangba7bef92018-12-26 16:53:03 +08002143 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002144 EXPECT_TRUE(fd3 != -1);
2145
Luke Huang9c264bb2018-12-18 16:44:41 +08002146 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002147 int rcode;
2148
Luke Huang9c264bb2018-12-18 16:44:41 +08002149 // expect no response
2150 int res = getAsyncResponse(fd3, &rcode, buf, MAXPACKET);
2151 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huang94b10b92018-11-21 20:13:38 +08002152
Luke Huang9c264bb2018-12-18 16:44:41 +08002153 // expect no response
Luke Huang94b10b92018-11-21 20:13:38 +08002154 memset(buf, 0, MAXPACKET);
Luke Huang9c264bb2018-12-18 16:44:41 +08002155 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2156 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huang94b10b92018-11-21 20:13:38 +08002157
Luke Huang94b10b92018-11-21 20:13:38 +08002158 dns.setResponseProbability(1.0);
Luke Huang94b10b92018-11-21 20:13:38 +08002159
Luke Huangba7bef92018-12-26 16:53:03 +08002160 int fd4 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002161 EXPECT_TRUE(fd4 != -1);
2162
2163 memset(buf, 0, MAXPACKET);
2164 res = getAsyncResponse(fd4, &rcode, buf, MAXPACKET);
2165 EXPECT_GT(res, 0);
2166 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2167
2168 memset(buf, 0, MAXPACKET);
2169 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2170 EXPECT_GT(res, 0);
2171 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
2172}
2173
2174TEST_F(ResolverTest, Async_MalformedQuery) {
Xiao Ma09b71022018-12-11 17:56:32 +09002175 constexpr char listen_addr[] = "127.0.0.4";
2176 constexpr char host_name[] = "howdy.example.com.";
2177 const std::vector<DnsRecord> records = {
2178 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2179 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2180 };
2181
2182 test::DNSResponder dns(listen_addr);
2183 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002184 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002185 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002186
2187 int fd = dns_open_proxy();
2188 EXPECT_TRUE(fd > 0);
2189
2190 const std::string badMsg = "16-52512#";
Xiao Ma09b71022018-12-11 17:56:32 +09002191 static const struct {
Luke Huang94b10b92018-11-21 20:13:38 +08002192 const std::string cmd;
2193 const int expectErr;
2194 } kTestData[] = {
Luke Huangba7bef92018-12-26 16:53:03 +08002195 // Too few arguments
Luke Huang94b10b92018-11-21 20:13:38 +08002196 {"resnsend " + badMsg + '\0', -EINVAL},
2197 // Bad netId
Luke Huangba7bef92018-12-26 16:53:03 +08002198 {"resnsend badnetId 0 " + badMsg + '\0', -EINVAL},
Luke Huang94b10b92018-11-21 20:13:38 +08002199 // Bad raw data
Luke Huangba7bef92018-12-26 16:53:03 +08002200 {"resnsend " + std::to_string(TEST_NETID) + " 0 " + badMsg + '\0', -EILSEQ},
Luke Huang94b10b92018-11-21 20:13:38 +08002201 };
2202
2203 for (unsigned int i = 0; i < std::size(kTestData); i++) {
2204 auto& td = kTestData[i];
2205 SCOPED_TRACE(td.cmd);
2206 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, td.cmd.c_str(), td.cmd.size()));
2207 EXPECT_EQ(rc, static_cast<ssize_t>(td.cmd.size()));
2208
2209 int32_t tmp;
2210 rc = TEMP_FAILURE_RETRY(read(fd, &tmp, sizeof(tmp)));
2211 EXPECT_TRUE(rc > 0);
2212 EXPECT_EQ(static_cast<int>(ntohl(tmp)), td.expectErr);
2213 }
2214 // Normal query with answer buffer
2215 // This is raw data of query "howdy.example.com" type 1 class 1
2216 std::string query = "81sBAAABAAAAAAAABWhvd2R5B2V4YW1wbGUDY29tAAABAAE=";
Luke Huangba7bef92018-12-26 16:53:03 +08002217 std::string cmd = "resnsend " + std::to_string(TEST_NETID) + " 0 " + query + '\0';
Luke Huang94b10b92018-11-21 20:13:38 +08002218 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
2219 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
2220
Luke Huang70931aa2019-01-31 11:57:41 +08002221 uint8_t smallBuf[1] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002222 int rcode;
2223 rc = getAsyncResponse(fd, &rcode, smallBuf, 1);
Luke Huangba7bef92018-12-26 16:53:03 +08002224 EXPECT_EQ(-EMSGSIZE, rc);
Luke Huang94b10b92018-11-21 20:13:38 +08002225
2226 // Do the normal test with large buffer again
2227 fd = dns_open_proxy();
2228 EXPECT_TRUE(fd > 0);
2229 rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
2230 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
Luke Huang70931aa2019-01-31 11:57:41 +08002231 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002232 rc = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2233 EXPECT_EQ("1.2.3.4", toString(buf, rc, AF_INET));
Mike Yu4f3747b2018-12-02 17:54:29 +09002234}
2235
Luke Huangba7bef92018-12-26 16:53:03 +08002236TEST_F(ResolverTest, Async_CacheFlags) {
Xiao Ma09b71022018-12-11 17:56:32 +09002237 constexpr char listen_addr[] = "127.0.0.4";
Luke Huang4eabbe32020-05-28 03:17:32 +08002238 constexpr char host_name1[] = "howdy.example.com.";
2239 constexpr char host_name2[] = "howdy.example2.com.";
2240 constexpr char host_name3[] = "howdy.example3.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002241 const std::vector<DnsRecord> records = {
Luke Huang4eabbe32020-05-28 03:17:32 +08002242 {host_name1, ns_type::ns_t_a, "1.2.3.4"}, {host_name1, ns_type::ns_t_aaaa, "::1.2.3.4"},
2243 {host_name2, ns_type::ns_t_a, "1.2.3.5"}, {host_name2, ns_type::ns_t_aaaa, "::1.2.3.5"},
2244 {host_name3, ns_type::ns_t_a, "1.2.3.6"}, {host_name3, ns_type::ns_t_aaaa, "::1.2.3.6"},
Xiao Ma09b71022018-12-11 17:56:32 +09002245 };
2246
2247 test::DNSResponder dns(listen_addr);
2248 StartDns(dns, records);
Luke Huangba7bef92018-12-26 16:53:03 +08002249 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002250 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huangba7bef92018-12-26 16:53:03 +08002251
2252 // ANDROID_RESOLV_NO_CACHE_STORE
2253 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2254 ANDROID_RESOLV_NO_CACHE_STORE);
2255 EXPECT_TRUE(fd1 != -1);
2256 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2257 ANDROID_RESOLV_NO_CACHE_STORE);
2258 EXPECT_TRUE(fd2 != -1);
2259 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2260 ANDROID_RESOLV_NO_CACHE_STORE);
2261 EXPECT_TRUE(fd3 != -1);
2262
2263 expectAnswersValid(fd3, AF_INET, "1.2.3.4");
2264 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
2265 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2266
2267 // No cache exists, expect 3 queries
Luke Huang4eabbe32020-05-28 03:17:32 +08002268 EXPECT_EQ(3U, GetNumQueries(dns, host_name1));
Luke Huangba7bef92018-12-26 16:53:03 +08002269
Luke Huang4eabbe32020-05-28 03:17:32 +08002270 // Raise a query with no flags to ensure no cache exists. Also make an cache entry for the
2271 // query.
Luke Huangba7bef92018-12-26 16:53:03 +08002272 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2273
2274 EXPECT_TRUE(fd1 != -1);
2275
2276 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2277
Luke Huang4eabbe32020-05-28 03:17:32 +08002278 // Expect 4 queries because there should be no cache before this query.
2279 EXPECT_EQ(4U, GetNumQueries(dns, host_name1));
2280
2281 // Now we have the cache entry, re-query with ANDROID_RESOLV_NO_CACHE_STORE to ensure
2282 // that ANDROID_RESOLV_NO_CACHE_STORE implied ANDROID_RESOLV_NO_CACHE_LOOKUP.
2283 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2284 ANDROID_RESOLV_NO_CACHE_STORE);
2285 EXPECT_TRUE(fd1 != -1);
2286 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2287 // Expect 5 queries because we shouldn't do cache lookup for the query which has
2288 // ANDROID_RESOLV_NO_CACHE_STORE.
2289 EXPECT_EQ(5U, GetNumQueries(dns, host_name1));
Luke Huangba7bef92018-12-26 16:53:03 +08002290
2291 // ANDROID_RESOLV_NO_CACHE_LOOKUP
2292 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2293 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2294 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2295 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2296
2297 EXPECT_TRUE(fd1 != -1);
2298 EXPECT_TRUE(fd2 != -1);
2299
2300 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
2301 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2302
Luke Huang4eabbe32020-05-28 03:17:32 +08002303 // Cache was skipped, expect 2 more queries.
2304 EXPECT_EQ(7U, GetNumQueries(dns, host_name1));
Luke Huangba7bef92018-12-26 16:53:03 +08002305
2306 // Re-query verify cache works
Luke Huang4eabbe32020-05-28 03:17:32 +08002307 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huangba7bef92018-12-26 16:53:03 +08002308 EXPECT_TRUE(fd1 != -1);
2309 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2310
Luke Huang4eabbe32020-05-28 03:17:32 +08002311 // Cache hits, expect still 7 queries
2312 EXPECT_EQ(7U, GetNumQueries(dns, host_name1));
Luke Huanga1d74182019-03-19 17:30:36 +08002313
2314 // Start to verify if ANDROID_RESOLV_NO_CACHE_LOOKUP does write response into cache
2315 dns.clearQueries();
2316
Luke Huang4eabbe32020-05-28 03:17:32 +08002317 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa,
Luke Huanga1d74182019-03-19 17:30:36 +08002318 ANDROID_RESOLV_NO_CACHE_LOOKUP);
Luke Huang4eabbe32020-05-28 03:17:32 +08002319 fd2 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa,
Luke Huanga1d74182019-03-19 17:30:36 +08002320 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2321
2322 EXPECT_TRUE(fd1 != -1);
2323 EXPECT_TRUE(fd2 != -1);
2324
Luke Huang4eabbe32020-05-28 03:17:32 +08002325 expectAnswersValid(fd2, AF_INET6, "::1.2.3.5");
2326 expectAnswersValid(fd1, AF_INET6, "::1.2.3.5");
Luke Huanga1d74182019-03-19 17:30:36 +08002327
2328 // Skip cache, expect 2 queries
Luke Huang4eabbe32020-05-28 03:17:32 +08002329 EXPECT_EQ(2U, GetNumQueries(dns, host_name2));
Luke Huanga1d74182019-03-19 17:30:36 +08002330
2331 // Re-query without flags
Luke Huang4eabbe32020-05-28 03:17:32 +08002332 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa, 0);
2333 fd2 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa, 0);
Luke Huanga1d74182019-03-19 17:30:36 +08002334
2335 EXPECT_TRUE(fd1 != -1);
2336 EXPECT_TRUE(fd2 != -1);
2337
Luke Huang4eabbe32020-05-28 03:17:32 +08002338 expectAnswersValid(fd2, AF_INET6, "::1.2.3.5");
2339 expectAnswersValid(fd1, AF_INET6, "::1.2.3.5");
Luke Huanga1d74182019-03-19 17:30:36 +08002340
2341 // Cache hits, expect still 2 queries
Luke Huang4eabbe32020-05-28 03:17:32 +08002342 EXPECT_EQ(2U, GetNumQueries(dns, host_name2));
Luke Huang40f5f492019-05-09 19:37:35 +08002343
2344 // Test both ANDROID_RESOLV_NO_CACHE_STORE and ANDROID_RESOLV_NO_CACHE_LOOKUP are set
2345 dns.clearQueries();
2346
Luke Huang4eabbe32020-05-28 03:17:32 +08002347 // Make sure that the cache of "howdy.example3.com" exists.
2348 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang40f5f492019-05-09 19:37:35 +08002349 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002350 expectAnswersValid(fd1, AF_INET6, "::1.2.3.6");
2351 EXPECT_EQ(1U, GetNumQueries(dns, host_name3));
Luke Huang40f5f492019-05-09 19:37:35 +08002352
2353 // Re-query with testFlags
2354 const int testFlag = ANDROID_RESOLV_NO_CACHE_STORE | ANDROID_RESOLV_NO_CACHE_LOOKUP;
Luke Huang4eabbe32020-05-28 03:17:32 +08002355 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_aaaa, testFlag);
Luke Huang40f5f492019-05-09 19:37:35 +08002356 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002357 expectAnswersValid(fd1, AF_INET6, "::1.2.3.6");
Luke Huang40f5f492019-05-09 19:37:35 +08002358 // Expect cache lookup is skipped.
Luke Huang4eabbe32020-05-28 03:17:32 +08002359 EXPECT_EQ(2U, GetNumQueries(dns, host_name3));
Luke Huang40f5f492019-05-09 19:37:35 +08002360
2361 // Do another query with testFlags
Luke Huang4eabbe32020-05-28 03:17:32 +08002362 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_a, testFlag);
Luke Huang40f5f492019-05-09 19:37:35 +08002363 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002364 expectAnswersValid(fd1, AF_INET, "1.2.3.6");
Luke Huang40f5f492019-05-09 19:37:35 +08002365 // Expect cache lookup is skipped.
Luke Huang4eabbe32020-05-28 03:17:32 +08002366 EXPECT_EQ(3U, GetNumQueries(dns, host_name3));
Luke Huang40f5f492019-05-09 19:37:35 +08002367
2368 // Re-query with no flags
Luke Huang4eabbe32020-05-28 03:17:32 +08002369 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_a, 0);
Luke Huang40f5f492019-05-09 19:37:35 +08002370 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002371 expectAnswersValid(fd1, AF_INET, "1.2.3.6");
Luke Huang40f5f492019-05-09 19:37:35 +08002372 // Expect no cache hit because cache storing is also skipped in previous query.
Luke Huang4eabbe32020-05-28 03:17:32 +08002373 EXPECT_EQ(4U, GetNumQueries(dns, host_name3));
Luke Huangba7bef92018-12-26 16:53:03 +08002374}
2375
Luke Huang08b13d22020-02-05 14:46:21 +08002376TEST_F(ResolverTest, Async_NoCacheStoreFlagDoesNotRefreshStaleCacheEntry) {
2377 constexpr char listen_addr[] = "127.0.0.4";
2378 constexpr char host_name[] = "howdy.example.com.";
2379 const std::vector<DnsRecord> records = {
2380 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2381 };
2382
2383 test::DNSResponder dns(listen_addr);
2384 StartDns(dns, records);
2385 std::vector<std::string> servers = {listen_addr};
2386 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
2387
2388 const unsigned SHORT_TTL_SEC = 1;
2389 dns.setTtl(SHORT_TTL_SEC);
2390
2391 // Refer to b/148842821 for the purpose of below test steps.
2392 // Basically, this test is used to ensure stale cache case is handled
2393 // correctly with ANDROID_RESOLV_NO_CACHE_STORE.
2394 int fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2395 EXPECT_TRUE(fd != -1);
2396 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2397
2398 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2399 dns.clearQueries();
2400
2401 // Wait until cache expired
2402 sleep(SHORT_TTL_SEC + 0.5);
2403
2404 // Now request the same hostname again.
2405 // We should see a new DNS query because the entry in cache has become stale.
2406 // Due to ANDROID_RESOLV_NO_CACHE_STORE, this query must *not* refresh that stale entry.
2407 fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2408 ANDROID_RESOLV_NO_CACHE_STORE);
2409 EXPECT_TRUE(fd != -1);
2410 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2411 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2412 dns.clearQueries();
2413
2414 // If the cache is still stale, we expect to see one more DNS query
2415 // (this time the cache will be refreshed, but we're not checking for it).
2416 fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2417 EXPECT_TRUE(fd != -1);
2418 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2419 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2420}
2421
Luke Huangba7bef92018-12-26 16:53:03 +08002422TEST_F(ResolverTest, Async_NoRetryFlag) {
Luke Huang70931aa2019-01-31 11:57:41 +08002423 constexpr char listen_addr0[] = "127.0.0.4";
2424 constexpr char listen_addr1[] = "127.0.0.6";
Xiao Ma09b71022018-12-11 17:56:32 +09002425 constexpr char host_name[] = "howdy.example.com.";
2426 const std::vector<DnsRecord> records = {
2427 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2428 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2429 };
2430
Luke Huang70931aa2019-01-31 11:57:41 +08002431 test::DNSResponder dns0(listen_addr0);
2432 test::DNSResponder dns1(listen_addr1);
2433 StartDns(dns0, records);
2434 StartDns(dns1, records);
2435 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr0, listen_addr1}));
Luke Huangba7bef92018-12-26 16:53:03 +08002436
Luke Huang70931aa2019-01-31 11:57:41 +08002437 dns0.clearQueries();
2438 dns1.clearQueries();
2439
2440 dns0.setResponseProbability(0.0);
2441 dns1.setResponseProbability(0.0);
Luke Huangba7bef92018-12-26 16:53:03 +08002442
2443 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2444 ANDROID_RESOLV_NO_RETRY);
2445 EXPECT_TRUE(fd1 != -1);
2446
2447 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa,
2448 ANDROID_RESOLV_NO_RETRY);
2449 EXPECT_TRUE(fd2 != -1);
2450
2451 // expect no response
2452 expectAnswersNotValid(fd1, -ETIMEDOUT);
2453 expectAnswersNotValid(fd2, -ETIMEDOUT);
2454
Luke Huang70931aa2019-01-31 11:57:41 +08002455 // No retry case, expect total 2 queries. The server is selected randomly.
2456 EXPECT_EQ(2U, GetNumQueries(dns0, host_name) + GetNumQueries(dns1, host_name));
Luke Huangba7bef92018-12-26 16:53:03 +08002457
Luke Huang70931aa2019-01-31 11:57:41 +08002458 dns0.clearQueries();
2459 dns1.clearQueries();
Luke Huangba7bef92018-12-26 16:53:03 +08002460
2461 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2462 EXPECT_TRUE(fd1 != -1);
2463
2464 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
2465 EXPECT_TRUE(fd2 != -1);
2466
2467 // expect no response
2468 expectAnswersNotValid(fd1, -ETIMEDOUT);
2469 expectAnswersNotValid(fd2, -ETIMEDOUT);
2470
2471 // Retry case, expect 4 queries
Luke Huang70931aa2019-01-31 11:57:41 +08002472 EXPECT_EQ(4U, GetNumQueries(dns0, host_name));
2473 EXPECT_EQ(4U, GetNumQueries(dns1, host_name));
2474}
2475
2476TEST_F(ResolverTest, Async_VerifyQueryID) {
2477 constexpr char listen_addr[] = "127.0.0.4";
2478 constexpr char host_name[] = "howdy.example.com.";
2479 const std::vector<DnsRecord> records = {
2480 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2481 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2482 };
2483
2484 test::DNSResponder dns(listen_addr);
2485 StartDns(dns, records);
2486 std::vector<std::string> servers = {listen_addr};
2487 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
2488
2489 const uint8_t queryBuf1[] = {
2490 /* Header */
2491 0x55, 0x66, /* Transaction ID */
2492 0x01, 0x00, /* Flags */
2493 0x00, 0x01, /* Questions */
2494 0x00, 0x00, /* Answer RRs */
2495 0x00, 0x00, /* Authority RRs */
2496 0x00, 0x00, /* Additional RRs */
2497 /* Queries */
2498 0x05, 0x68, 0x6f, 0x77, 0x64, 0x79, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
2499 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name */
2500 0x00, 0x01, /* Type */
2501 0x00, 0x01 /* Class */
2502 };
2503
2504 int fd = resNetworkSend(TEST_NETID, queryBuf1, sizeof(queryBuf1), 0);
2505 EXPECT_TRUE(fd != -1);
2506
2507 uint8_t buf[MAXPACKET] = {};
2508 int rcode;
2509
2510 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2511 EXPECT_GT(res, 0);
2512 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2513
2514 auto hp = reinterpret_cast<HEADER*>(buf);
2515 EXPECT_EQ(21862U, htons(hp->id));
2516
2517 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2518
2519 const uint8_t queryBuf2[] = {
2520 /* Header */
2521 0x00, 0x53, /* Transaction ID */
2522 0x01, 0x00, /* Flags */
2523 0x00, 0x01, /* Questions */
2524 0x00, 0x00, /* Answer RRs */
2525 0x00, 0x00, /* Authority RRs */
2526 0x00, 0x00, /* Additional RRs */
2527 /* Queries */
2528 0x05, 0x68, 0x6f, 0x77, 0x64, 0x79, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
2529 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name */
2530 0x00, 0x01, /* Type */
2531 0x00, 0x01 /* Class */
2532 };
2533
2534 // Re-query verify cache works and query id is correct
2535 fd = resNetworkSend(TEST_NETID, queryBuf2, sizeof(queryBuf2), 0);
2536
2537 EXPECT_TRUE(fd != -1);
2538
2539 res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2540 EXPECT_GT(res, 0);
2541 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2542
2543 EXPECT_EQ(0x0053U, htons(hp->id));
2544
2545 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
Luke Huangba7bef92018-12-26 16:53:03 +08002546}
2547
Mike Yu4f3747b2018-12-02 17:54:29 +09002548// This test checks that the resolver should not generate the request containing OPT RR when using
Ken Chen0a015532019-01-02 14:59:38 +08002549// cleartext DNS. If we query the DNS server not supporting EDNS0 and it reponds with
2550// FORMERR_ON_EDNS, we will fallback to no EDNS0 and try again. If the server does no response, we
2551// won't retry so that we get no answer.
Mike Yu4f3747b2018-12-02 17:54:29 +09002552TEST_F(ResolverTest, BrokenEdns) {
2553 typedef test::DNSResponder::Edns Edns;
2554 enum ExpectResult { EXPECT_FAILURE, EXPECT_SUCCESS };
2555
Mike Yu3977d482020-02-26 17:18:57 +08002556 // Perform cleartext query in off mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002557 const char OFF[] = "off";
Mike Yu3977d482020-02-26 17:18:57 +08002558
2559 // Perform cleartext query when there's no private DNS server validated in opportunistic mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002560 const char OPPORTUNISTIC_UDP[] = "opportunistic_udp";
Mike Yu3977d482020-02-26 17:18:57 +08002561
2562 // Perform cleartext query when there is a private DNS server validated in opportunistic mode.
2563 const char OPPORTUNISTIC_FALLBACK_UDP[] = "opportunistic_fallback_udp";
2564
2565 // Perform cyphertext query in opportunistic mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002566 const char OPPORTUNISTIC_TLS[] = "opportunistic_tls";
Mike Yu3977d482020-02-26 17:18:57 +08002567
2568 // Perform cyphertext query in strict mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002569 const char STRICT[] = "strict";
Mike Yu3977d482020-02-26 17:18:57 +08002570
Mike Yu4f3747b2018-12-02 17:54:29 +09002571 const char GETHOSTBYNAME[] = "gethostbyname";
2572 const char GETADDRINFO[] = "getaddrinfo";
Mike Yu4f3747b2018-12-02 17:54:29 +09002573 const char ADDR4[] = "192.0.2.1";
2574 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2575 const char CLEARTEXT_PORT[] = "53";
2576 const char TLS_PORT[] = "853";
Luke Huangf8215372019-11-22 11:53:41 +08002577 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
Mike Yu3977d482020-02-26 17:18:57 +08002578 ResolverParamsParcel paramsForCleanup = DnsResponderClient::GetDefaultResolverParamsParcel();
2579 paramsForCleanup.servers.clear();
2580 paramsForCleanup.tlsServers.clear();
Mike Yu4f3747b2018-12-02 17:54:29 +09002581
Mike Yufc125e42019-05-15 20:41:28 +08002582 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Mike Yu4f3747b2018-12-02 17:54:29 +09002583 ASSERT_TRUE(dns.startServer());
2584
2585 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2586
Luke Huangf8215372019-11-22 11:53:41 +08002587 // clang-format off
Mike Yu4f3747b2018-12-02 17:54:29 +09002588 static const struct TestConfig {
2589 std::string mode;
2590 std::string method;
2591 Edns edns;
2592 ExpectResult expectResult;
2593
2594 std::string asHostName() const {
2595 const char* ednsString;
2596 switch (edns) {
2597 case Edns::ON:
2598 ednsString = "ednsOn";
2599 break;
Ken Chen0a015532019-01-02 14:59:38 +08002600 case Edns::FORMERR_ON_EDNS:
Mike Yu4f3747b2018-12-02 17:54:29 +09002601 ednsString = "ednsFormerr";
2602 break;
2603 case Edns::DROP:
2604 ednsString = "ednsDrop";
2605 break;
2606 default:
2607 ednsString = "";
2608 break;
2609 }
2610 return StringPrintf("%s.%s.%s.", mode.c_str(), method.c_str(), ednsString);
2611 }
2612 } testConfigs[] = {
Mike Yu3977d482020-02-26 17:18:57 +08002613 // In OPPORTUNISTIC_TLS, if the DNS server doesn't support EDNS0 but TLS, the lookup
2614 // fails. Could such server exist? if so, we might need to fix it to fallback to
2615 // cleartext query. If the server still make no response for the queries with EDNS0, we
2616 // might also need to fix it to retry without EDNS0.
Mike Yu4f3747b2018-12-02 17:54:29 +09002617 // Another thing is that {OPPORTUNISTIC_TLS, Edns::DROP} and {STRICT, Edns::DROP} are
2618 // commented out since TLS timeout is not configurable.
2619 // TODO: Uncomment them after TLS timeout is configurable.
Mike Yu3977d482020-02-26 17:18:57 +08002620 {OFF, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2621 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2622 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2623 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2624 {STRICT, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2625 {OFF, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2626 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2627 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2628 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2629 {STRICT, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2630 {OFF, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2631 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2632
2633 // The failure is due to no retry on timeout. Maybe fix it?
2634 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2635
2636 //{OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2637 //{STRICT, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2638 {OFF, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2639 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2640 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2641 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2642 {STRICT, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2643 {OFF, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2644 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2645 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2646 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2647 {STRICT, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2648 {OFF, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2649 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2650
2651 // The failure is due to no retry on timeout. Maybe fix it?
2652 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2653
Mike Yu4f3747b2018-12-02 17:54:29 +09002654 //{OPPORTUNISTIC_TLS, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2655 //{STRICT, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2656 };
Luke Huangf8215372019-11-22 11:53:41 +08002657 // clang-format on
Mike Yu4f3747b2018-12-02 17:54:29 +09002658
2659 for (const auto& config : testConfigs) {
2660 const std::string testHostName = config.asHostName();
2661 SCOPED_TRACE(testHostName);
2662
2663 const char* host_name = testHostName.c_str();
2664 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
2665 dns.setEdns(config.edns);
2666
2667 if (config.mode == OFF) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002668 if (tls.running()) {
2669 ASSERT_TRUE(tls.stopServer());
2670 }
Xiao Ma09b71022018-12-11 17:56:32 +09002671 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Mike Yu4f3747b2018-12-02 17:54:29 +09002672 } else if (config.mode == OPPORTUNISTIC_UDP) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002673 if (tls.running()) {
2674 ASSERT_TRUE(tls.stopServer());
2675 }
Xiao Ma09b71022018-12-11 17:56:32 +09002676 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002677 kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002678 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), false));
Mike Yu3977d482020-02-26 17:18:57 +08002679 } else if (config.mode == OPPORTUNISTIC_TLS || config.mode == OPPORTUNISTIC_FALLBACK_UDP) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002680 if (!tls.running()) {
2681 ASSERT_TRUE(tls.startServer());
2682 }
Xiao Ma09b71022018-12-11 17:56:32 +09002683 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002684 kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002685 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Mike Yu3977d482020-02-26 17:18:57 +08002686
2687 if (config.mode == OPPORTUNISTIC_FALLBACK_UDP) {
2688 // Force the resolver to fallback to cleartext queries.
2689 ASSERT_TRUE(tls.stopServer());
2690 }
Mike Yu4f3747b2018-12-02 17:54:29 +09002691 } else if (config.mode == STRICT) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002692 if (!tls.running()) {
2693 ASSERT_TRUE(tls.startServer());
2694 }
Xiao Ma09b71022018-12-11 17:56:32 +09002695 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002696 kDefaultParams, kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08002697 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Mike Yu4f3747b2018-12-02 17:54:29 +09002698 }
2699
2700 if (config.method == GETHOSTBYNAME) {
2701 const hostent* h_result = gethostbyname(host_name);
2702 if (config.expectResult == EXPECT_SUCCESS) {
2703 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2704 ASSERT_TRUE(h_result != nullptr);
2705 ASSERT_EQ(4, h_result->h_length);
2706 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
2707 EXPECT_EQ(ADDR4, ToString(h_result));
2708 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
2709 } else {
2710 EXPECT_EQ(0U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
2711 ASSERT_TRUE(h_result == nullptr);
2712 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2713 }
2714 } else if (config.method == GETADDRINFO) {
2715 ScopedAddrinfo ai_result;
2716 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2717 ai_result = safe_getaddrinfo(host_name, nullptr, &hints);
2718 if (config.expectResult == EXPECT_SUCCESS) {
2719 EXPECT_TRUE(ai_result != nullptr);
2720 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2721 const std::string result_str = ToString(ai_result);
2722 EXPECT_EQ(ADDR4, result_str);
2723 } else {
2724 EXPECT_TRUE(ai_result == nullptr);
2725 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
2726 }
2727 } else {
2728 FAIL() << "Unsupported query method: " << config.method;
2729 }
2730
Mike Yudd4ac2d2019-05-31 16:52:11 +08002731 tls.clearQueries();
Mike Yu4f3747b2018-12-02 17:54:29 +09002732 dns.clearQueries();
Mike Yu3977d482020-02-26 17:18:57 +08002733
2734 // Clear the setup to force the resolver to validate private DNS servers in every test.
2735 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(paramsForCleanup));
Mike Yu4f3747b2018-12-02 17:54:29 +09002736 }
Mike Yu4f3747b2018-12-02 17:54:29 +09002737}
nuccachena26cc2a2018-07-17 18:07:23 +08002738
Ken Chen0a015532019-01-02 14:59:38 +08002739// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2740// Resolver should have a reasonable number of retries instead of spinning forever. We don't have
2741// an efficient way to know if resolver is stuck in an infinite loop. However, test case will be
2742// failed due to timeout.
2743TEST_F(ResolverTest, UnstableTls) {
2744 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2745 const char CLEARTEXT_PORT[] = "53";
2746 const char TLS_PORT[] = "853";
2747 const char* host_name1 = "nonexistent1.example.com.";
2748 const char* host_name2 = "nonexistent2.example.com.";
2749 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
2750
Mike Yufc125e42019-05-15 20:41:28 +08002751 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Ken Chen0a015532019-01-02 14:59:38 +08002752 ASSERT_TRUE(dns.startServer());
2753 dns.setEdns(test::DNSResponder::Edns::FORMERR_ON_EDNS);
2754 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2755 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08002756 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002757 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
2758
Ken Chen0a015532019-01-02 14:59:38 +08002759 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
2760 tls.stopServer();
2761
2762 const hostent* h_result = gethostbyname(host_name1);
2763 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
2764 ASSERT_TRUE(h_result == nullptr);
2765 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2766
2767 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2768 ScopedAddrinfo ai_result = safe_getaddrinfo(host_name2, nullptr, &hints);
2769 EXPECT_TRUE(ai_result == nullptr);
2770 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
2771}
2772
2773// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2774// Moreover, server responds RCODE=FORMERR even on non-EDNS query.
2775TEST_F(ResolverTest, BogusDnsServer) {
2776 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2777 const char CLEARTEXT_PORT[] = "53";
2778 const char TLS_PORT[] = "853";
2779 const char* host_name1 = "nonexistent1.example.com.";
2780 const char* host_name2 = "nonexistent2.example.com.";
2781 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
2782
Mike Yufc125e42019-05-15 20:41:28 +08002783 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Ken Chen0a015532019-01-02 14:59:38 +08002784 ASSERT_TRUE(dns.startServer());
2785 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2786 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08002787 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002788 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
2789
Ken Chen0a015532019-01-02 14:59:38 +08002790 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
2791 tls.stopServer();
2792 dns.setEdns(test::DNSResponder::Edns::FORMERR_UNCOND);
2793
2794 const hostent* h_result = gethostbyname(host_name1);
2795 EXPECT_EQ(0U, GetNumQueries(dns, host_name1));
2796 ASSERT_TRUE(h_result == nullptr);
2797 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2798
2799 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2800 ScopedAddrinfo ai_result = safe_getaddrinfo(host_name2, nullptr, &hints);
2801 EXPECT_TRUE(ai_result == nullptr);
2802 EXPECT_EQ(0U, GetNumQueries(dns, host_name2));
2803}
2804
nuccachena26cc2a2018-07-17 18:07:23 +08002805TEST_F(ResolverTest, GetAddrInfo_Dns64Synthesize) {
2806 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002807 constexpr char dns64_name[] = "ipv4only.arpa.";
2808 constexpr char host_name[] = "v4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002809 const std::vector<DnsRecord> records = {
2810 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2811 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2812 };
nuccachena26cc2a2018-07-17 18:07:23 +08002813
Xiao Ma09b71022018-12-11 17:56:32 +09002814 test::DNSResponder dns(listen_addr);
Xiao Ma09b71022018-12-11 17:56:32 +09002815 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002816
2817 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002818 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002819
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002820 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002821 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002822 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002823
2824 // hints are necessary in order to let netd know which type of addresses the caller is
2825 // interested in.
Xiao Ma09b71022018-12-11 17:56:32 +09002826 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08002827 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
2828 EXPECT_TRUE(result != nullptr);
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002829 // TODO: BUG: there should only be two queries, one AAAA (which returns no records) and one A
2830 // (which returns 1.2.3.4). But there is an extra AAAA.
2831 EXPECT_EQ(3U, GetNumQueries(dns, host_name));
nuccachena26cc2a2018-07-17 18:07:23 +08002832
2833 std::string result_str = ToString(result);
2834 EXPECT_EQ(result_str, "64:ff9b::102:304");
2835
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002836 // Stopping NAT64 prefix discovery disables synthesis.
Luke Huang5bd827c2019-03-14 16:10:04 +08002837 EXPECT_TRUE(mDnsClient.resolvService()->stopPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002838 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_NOT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002839
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002840 dns.clearQueries();
nuccachena26cc2a2018-07-17 18:07:23 +08002841
2842 result = safe_getaddrinfo("v4only", nullptr, &hints);
2843 EXPECT_TRUE(result != nullptr);
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002844 // TODO: BUG: there should only be one query, an AAAA (which returns no records), because the
2845 // A is already cached. But there is an extra AAAA.
2846 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
nuccachena26cc2a2018-07-17 18:07:23 +08002847
2848 result_str = ToString(result);
2849 EXPECT_EQ(result_str, "1.2.3.4");
2850}
2851
nuccachena26cc2a2018-07-17 18:07:23 +08002852TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecified) {
2853 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002854 constexpr char dns64_name[] = "ipv4only.arpa.";
2855 constexpr char host_name[] = "v4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002856 const std::vector<DnsRecord> records = {
2857 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2858 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2859 };
nuccachena26cc2a2018-07-17 18:07:23 +08002860
Xiao Ma09b71022018-12-11 17:56:32 +09002861 test::DNSResponder dns(listen_addr);
2862 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002863 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002864 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002865
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002866 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002867 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002868 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002869
2870 // Ensure to synthesize AAAA if AF_INET6 is specified, and not to synthesize AAAA
2871 // in AF_INET case.
2872 addrinfo hints;
2873 memset(&hints, 0, sizeof(hints));
2874 hints.ai_family = AF_INET6;
2875 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
2876 EXPECT_TRUE(result != nullptr);
2877 std::string result_str = ToString(result);
2878 EXPECT_EQ(result_str, "64:ff9b::102:304");
2879
2880 hints.ai_family = AF_INET;
2881 result = safe_getaddrinfo("v4only", nullptr, &hints);
2882 EXPECT_TRUE(result != nullptr);
2883 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2884 result_str = ToString(result);
2885 EXPECT_EQ(result_str, "1.2.3.4");
2886}
nuccachena26cc2a2018-07-17 18:07:23 +08002887
2888TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedV6) {
2889 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002890 constexpr char dns64_name[] = "ipv4only.arpa.";
2891 constexpr char host_name[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002892 const std::vector<DnsRecord> records = {
2893 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2894 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2895 {host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
2896 };
nuccachena26cc2a2018-07-17 18:07:23 +08002897
Xiao Ma09b71022018-12-11 17:56:32 +09002898 test::DNSResponder dns(listen_addr);
2899 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002900 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002901 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002902
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002903 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002904 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002905 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002906
Xiao Ma09b71022018-12-11 17:56:32 +09002907 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08002908 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
2909 EXPECT_TRUE(result != nullptr);
2910 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2911
2912 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
Xiao Ma09b71022018-12-11 17:56:32 +09002913 const std::vector<std::string> result_strs = ToStrings(result);
nuccachena26cc2a2018-07-17 18:07:23 +08002914 for (const auto& str : result_strs) {
2915 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
2916 << ", result_str='" << str << "'";
2917 }
2918}
2919
2920TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedNoV6) {
2921 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002922 constexpr char dns64_name[] = "ipv4only.arpa.";
2923 constexpr char host_name[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002924 const std::vector<DnsRecord> records = {
2925 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2926 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2927 };
nuccachena26cc2a2018-07-17 18:07:23 +08002928
Xiao Ma09b71022018-12-11 17:56:32 +09002929 test::DNSResponder dns(listen_addr);
2930 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002931 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002932 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002933
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002934 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002935 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002936 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002937
Xiao Ma09b71022018-12-11 17:56:32 +09002938 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08002939 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
2940 EXPECT_TRUE(result != nullptr);
2941 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2942
2943 // In AF_UNSPEC case, synthesize AAAA if there's no AAAA answer.
2944 std::string result_str = ToString(result);
2945 EXPECT_EQ(result_str, "64:ff9b::102:304");
2946}
2947
2948TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecialUseIPv4Addresses) {
2949 constexpr char THIS_NETWORK[] = "this_network";
2950 constexpr char LOOPBACK[] = "loopback";
2951 constexpr char LINK_LOCAL[] = "link_local";
2952 constexpr char MULTICAST[] = "multicast";
2953 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
2954
2955 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
2956 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
2957 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
2958 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
2959 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
2960
2961 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002962 constexpr char dns64_name[] = "ipv4only.arpa.";
2963
Xiao Ma09b71022018-12-11 17:56:32 +09002964 test::DNSResponder dns(listen_addr);
2965 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08002966 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002967 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002968
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002969 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002970 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002971 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002972
Luke Huangf8215372019-11-22 11:53:41 +08002973 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08002974 static const struct TestConfig {
2975 std::string name;
2976 std::string addr;
2977
2978 std::string asHostName() const { return StringPrintf("%s.example.com.", name.c_str()); }
2979 } testConfigs[]{
2980 {THIS_NETWORK, ADDR_THIS_NETWORK},
2981 {LOOPBACK, ADDR_LOOPBACK},
2982 {LINK_LOCAL, ADDR_LINK_LOCAL},
2983 {MULTICAST, ADDR_MULTICAST},
2984 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
2985 };
Luke Huangf8215372019-11-22 11:53:41 +08002986 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08002987
2988 for (const auto& config : testConfigs) {
2989 const std::string testHostName = config.asHostName();
2990 SCOPED_TRACE(testHostName);
2991
2992 const char* host_name = testHostName.c_str();
2993 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
2994
2995 addrinfo hints;
2996 memset(&hints, 0, sizeof(hints));
2997 hints.ai_family = AF_INET6;
2998 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
2999 // In AF_INET6 case, don't return IPv4 answers
3000 EXPECT_TRUE(result == nullptr);
3001 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3002 dns.clearQueries();
3003
3004 memset(&hints, 0, sizeof(hints));
3005 hints.ai_family = AF_UNSPEC;
3006 result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
3007 EXPECT_TRUE(result != nullptr);
3008 // Expect IPv6 query only. IPv4 answer has been cached in previous query.
3009 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3010 // In AF_UNSPEC case, don't synthesize special use IPv4 address.
3011 std::string result_str = ToString(result);
3012 EXPECT_EQ(result_str, config.addr.c_str());
3013 dns.clearQueries();
3014 }
3015}
3016
3017TEST_F(ResolverTest, GetAddrInfo_Dns64QueryWithNullArgumentHints) {
3018 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003019 constexpr char dns64_name[] = "ipv4only.arpa.";
3020 constexpr char host_name[] = "v4only.example.com.";
3021 constexpr char host_name2[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003022 const std::vector<DnsRecord> records = {
3023 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3024 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3025 {host_name2, ns_type::ns_t_a, "1.2.3.4"},
3026 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
3027 };
nuccachena26cc2a2018-07-17 18:07:23 +08003028
Xiao Ma09b71022018-12-11 17:56:32 +09003029 test::DNSResponder dns(listen_addr);
3030 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003031 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003032 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003033
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003034 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003035 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003036 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003037
3038 // Assign argument hints of getaddrinfo() as null is equivalent to set ai_family AF_UNSPEC.
3039 // In AF_UNSPEC case, synthesize AAAA if there has A answer only.
3040 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, nullptr);
3041 EXPECT_TRUE(result != nullptr);
3042 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3043 std::string result_str = ToString(result);
3044 EXPECT_EQ(result_str, "64:ff9b::102:304");
3045 dns.clearQueries();
3046
3047 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
3048 result = safe_getaddrinfo("v4v6", nullptr, nullptr);
3049 EXPECT_TRUE(result != nullptr);
3050 EXPECT_LE(2U, GetNumQueries(dns, host_name2));
3051 std::vector<std::string> result_strs = ToStrings(result);
3052 for (const auto& str : result_strs) {
3053 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
3054 << ", result_str='" << str << "'";
3055 }
3056}
3057
3058TEST_F(ResolverTest, GetAddrInfo_Dns64QueryNullArgumentNode) {
3059 constexpr char ADDR_ANYADDR_V4[] = "0.0.0.0";
3060 constexpr char ADDR_ANYADDR_V6[] = "::";
3061 constexpr char ADDR_LOCALHOST_V4[] = "127.0.0.1";
3062 constexpr char ADDR_LOCALHOST_V6[] = "::1";
3063
3064 constexpr char PORT_NAME_HTTP[] = "http";
3065 constexpr char PORT_NUMBER_HTTP[] = "80";
3066
3067 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003068 constexpr char dns64_name[] = "ipv4only.arpa.";
3069
Xiao Ma09b71022018-12-11 17:56:32 +09003070 test::DNSResponder dns(listen_addr);
3071 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003072 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003073 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003074
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003075 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003076 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003077 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003078
Luke Huangf8215372019-11-22 11:53:41 +08003079 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003080 // If node is null, return address is listed by libc/getaddrinfo.c as follows.
3081 // - passive socket -> anyaddr (0.0.0.0 or ::)
3082 // - non-passive socket -> localhost (127.0.0.1 or ::1)
3083 static const struct TestConfig {
3084 int flag;
3085 std::string addr_v4;
3086 std::string addr_v6;
3087
3088 std::string asParameters() const {
3089 return StringPrintf("flag=%d, addr_v4=%s, addr_v6=%s", flag, addr_v4.c_str(),
3090 addr_v6.c_str());
3091 }
3092 } testConfigs[]{
3093 {0 /* non-passive */, ADDR_LOCALHOST_V4, ADDR_LOCALHOST_V6},
3094 {AI_PASSIVE, ADDR_ANYADDR_V4, ADDR_ANYADDR_V6}
3095 };
Luke Huangf8215372019-11-22 11:53:41 +08003096 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003097
3098 for (const auto& config : testConfigs) {
3099 SCOPED_TRACE(config.asParameters());
3100
Xiao Ma09b71022018-12-11 17:56:32 +09003101 addrinfo hints = {
Nick Desaulnierscd6395a2019-10-11 09:15:24 -07003102 .ai_flags = config.flag,
Xiao Ma09b71022018-12-11 17:56:32 +09003103 .ai_family = AF_UNSPEC, // any address family
3104 .ai_socktype = 0, // any type
3105 .ai_protocol = 0, // any protocol
Xiao Ma09b71022018-12-11 17:56:32 +09003106 };
nuccachena26cc2a2018-07-17 18:07:23 +08003107
3108 // Assign hostname as null and service as port name.
3109 ScopedAddrinfo result = safe_getaddrinfo(nullptr, PORT_NAME_HTTP, &hints);
3110 ASSERT_TRUE(result != nullptr);
3111
3112 // Can't be synthesized because it should not get into Netd.
3113 std::vector<std::string> result_strs = ToStrings(result);
3114 for (const auto& str : result_strs) {
3115 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
3116 << ", result_str='" << str << "'";
3117 }
3118
3119 // Assign hostname as null and service as numeric port number.
3120 hints.ai_flags = config.flag | AI_NUMERICSERV;
3121 result = safe_getaddrinfo(nullptr, PORT_NUMBER_HTTP, &hints);
3122 ASSERT_TRUE(result != nullptr);
3123
3124 // Can't be synthesized because it should not get into Netd.
3125 result_strs = ToStrings(result);
3126 for (const auto& str : result_strs) {
3127 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
3128 << ", result_str='" << str << "'";
3129 }
3130 }
3131}
3132
3133TEST_F(ResolverTest, GetHostByAddr_ReverseDnsQueryWithHavingNat64Prefix) {
3134 struct hostent* result = nullptr;
3135 struct in_addr v4addr;
3136 struct in6_addr v6addr;
3137
3138 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003139 constexpr char dns64_name[] = "ipv4only.arpa.";
3140 constexpr char ptr_name[] = "v4v6.example.com.";
3141 // PTR record for IPv4 address 1.2.3.4
3142 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3143 // PTR record for IPv6 address 2001:db8::102:304
3144 constexpr char ptr_addr_v6[] =
3145 "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 +09003146 const std::vector<DnsRecord> records = {
3147 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3148 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3149 {ptr_addr_v6, ns_type::ns_t_ptr, ptr_name},
3150 };
nuccachena26cc2a2018-07-17 18:07:23 +08003151
Xiao Ma09b71022018-12-11 17:56:32 +09003152 test::DNSResponder dns(listen_addr);
3153 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003154 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003155 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003156
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003157 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003158 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003159 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003160
3161 // Reverse IPv4 DNS query. Prefix should have no effect on it.
3162 inet_pton(AF_INET, "1.2.3.4", &v4addr);
3163 result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
3164 ASSERT_TRUE(result != nullptr);
3165 std::string result_str = result->h_name ? result->h_name : "null";
3166 EXPECT_EQ(result_str, "v4v6.example.com");
3167
3168 // Reverse IPv6 DNS query. Prefix should have no effect on it.
3169 inet_pton(AF_INET6, "2001:db8::102:304", &v6addr);
3170 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3171 ASSERT_TRUE(result != nullptr);
3172 result_str = result->h_name ? result->h_name : "null";
3173 EXPECT_EQ(result_str, "v4v6.example.com");
3174}
3175
3176TEST_F(ResolverTest, GetHostByAddr_ReverseDns64Query) {
3177 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003178 constexpr char dns64_name[] = "ipv4only.arpa.";
3179 constexpr char ptr_name[] = "v4only.example.com.";
3180 // PTR record for IPv4 address 1.2.3.4
3181 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3182 // PTR record for IPv6 address 64:ff9b::1.2.3.4
3183 constexpr char ptr_addr_v6_nomapping[] =
3184 "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.";
3185 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
3186 // PTR record for IPv6 address 64:ff9b::5.6.7.8
3187 constexpr char ptr_addr_v6_synthesis[] =
3188 "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 +09003189 const std::vector<DnsRecord> records = {
3190 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3191 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3192 {ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis},
3193 };
nuccachena26cc2a2018-07-17 18:07:23 +08003194
Xiao Ma09b71022018-12-11 17:56:32 +09003195 test::DNSResponder dns(listen_addr);
3196 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003197 // "ptr_addr_v6_nomapping" is not mapped in DNS server
nuccachena26cc2a2018-07-17 18:07:23 +08003198 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003199 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003200
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003201 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003202 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003203 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003204
3205 // Synthesized PTR record doesn't exist on DNS server
3206 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
3207 // After querying synthesized address failed, expect that prefix is removed from IPv6
3208 // synthesized address and do reverse IPv4 query instead.
3209 struct in6_addr v6addr;
3210 inet_pton(AF_INET6, "64:ff9b::1.2.3.4", &v6addr);
3211 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3212 ASSERT_TRUE(result != nullptr);
3213 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist
3214 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist
3215 std::string result_str = result->h_name ? result->h_name : "null";
3216 EXPECT_EQ(result_str, "v4only.example.com");
3217 // Check that return address has been mapped from IPv4 to IPv6 address because Netd
3218 // removes NAT64 prefix and does IPv4 DNS reverse lookup in this case. Then, Netd
3219 // fakes the return IPv4 address as original queried IPv6 address.
3220 result_str = ToString(result);
3221 EXPECT_EQ(result_str, "64:ff9b::102:304");
3222 dns.clearQueries();
3223
3224 // Synthesized PTR record exists on DNS server
3225 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
3226 // Expect to Netd pass through synthesized address for DNS queries.
3227 inet_pton(AF_INET6, "64:ff9b::5.6.7.8", &v6addr);
3228 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3229 ASSERT_TRUE(result != nullptr);
3230 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
3231 result_str = result->h_name ? result->h_name : "null";
3232 EXPECT_EQ(result_str, "v6synthesis.example.com");
3233}
3234
3235TEST_F(ResolverTest, GetHostByAddr_ReverseDns64QueryFromHostFile) {
3236 constexpr char dns64_name[] = "ipv4only.arpa.";
3237 constexpr char host_name[] = "localhost";
3238 // The address is synthesized by prefix64:localhost.
3239 constexpr char host_addr[] = "64:ff9b::7f00:1";
nuccachena26cc2a2018-07-17 18:07:23 +08003240 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003241
3242 test::DNSResponder dns(listen_addr);
3243 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003244 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003245 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003246
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003247 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003248 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003249 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003250
3251 // Using synthesized "localhost" address to be a trick for resolving host name
3252 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
3253 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
3254 struct in6_addr v6addr;
3255 inet_pton(AF_INET6, host_addr, &v6addr);
3256 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3257 ASSERT_TRUE(result != nullptr);
3258 // Expect no DNS queries; localhost is resolved via /etc/hosts.
3259 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
3260
Luke Huangf8215372019-11-22 11:53:41 +08003261 ASSERT_EQ(sizeof(in6_addr), (unsigned)result->h_length);
nuccachena26cc2a2018-07-17 18:07:23 +08003262 ASSERT_EQ(AF_INET6, result->h_addrtype);
3263 std::string result_str = ToString(result);
3264 EXPECT_EQ(result_str, host_addr);
3265 result_str = result->h_name ? result->h_name : "null";
3266 EXPECT_EQ(result_str, host_name);
3267}
3268
Hungming Chen9e6185a2019-06-04 16:09:19 +08003269TEST_F(ResolverTest, GetHostByAddr_cnamesClasslessReverseDelegation) {
3270 // IPv4 addresses in the subnet with notation '/' or '-'.
3271 constexpr char addr_slash[] = "192.0.2.1";
3272 constexpr char addr_hyphen[] = "192.0.3.1";
3273
3274 // Used to verify DNS reverse query for classless reverse lookup zone. See detail in RFC 2317
3275 // section 4.
3276 const static std::vector<DnsRecord> records = {
3277 // The records for reverse querying "192.0.2.1" in the subnet with notation '/'.
3278 {"1.2.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0/25.2.0.192.in-addr.arpa."},
3279 {"1.0/25.2.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3280
3281 // The records for reverse querying "192.0.3.1" in the subnet with notation '-'.
3282 {"1.3.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0-127.3.0.192.in-addr.arpa."},
3283 {"1.0-127.3.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3284 };
3285
3286 test::DNSResponder dns;
3287 StartDns(dns, records);
3288 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3289
3290 for (const auto& address : {addr_slash, addr_hyphen}) {
3291 SCOPED_TRACE(address);
3292
3293 in_addr v4addr;
3294 ASSERT_TRUE(inet_pton(AF_INET, address, &v4addr));
3295 hostent* result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
3296 ASSERT_TRUE(result != nullptr);
3297 EXPECT_STREQ("hello.example.com", result->h_name);
3298 }
3299}
3300
nuccachena26cc2a2018-07-17 18:07:23 +08003301TEST_F(ResolverTest, GetNameInfo_ReverseDnsQueryWithHavingNat64Prefix) {
3302 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003303 constexpr char dns64_name[] = "ipv4only.arpa.";
3304 constexpr char ptr_name[] = "v4v6.example.com.";
3305 // PTR record for IPv4 address 1.2.3.4
3306 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3307 // PTR record for IPv6 address 2001:db8::102:304
3308 constexpr char ptr_addr_v6[] =
3309 "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 +09003310 const std::vector<DnsRecord> records = {
3311 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3312 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3313 {ptr_addr_v6, ns_type::ns_t_ptr, ptr_name},
3314 };
nuccachena26cc2a2018-07-17 18:07:23 +08003315
Xiao Ma09b71022018-12-11 17:56:32 +09003316 test::DNSResponder dns(listen_addr);
3317 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003318 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003319 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003320
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003321 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003322 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003323 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003324
Luke Huangf8215372019-11-22 11:53:41 +08003325 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003326 static const struct TestConfig {
3327 int flag;
3328 int family;
3329 std::string addr;
3330 std::string host;
3331
3332 std::string asParameters() const {
3333 return StringPrintf("flag=%d, family=%d, addr=%s, host=%s", flag, family, addr.c_str(),
3334 host.c_str());
3335 }
3336 } testConfigs[]{
3337 {NI_NAMEREQD, AF_INET, "1.2.3.4", "v4v6.example.com"},
3338 {NI_NUMERICHOST, AF_INET, "1.2.3.4", "1.2.3.4"},
3339 {0, AF_INET, "1.2.3.4", "v4v6.example.com"},
3340 {0, AF_INET, "5.6.7.8", "5.6.7.8"}, // unmapped
3341 {NI_NAMEREQD, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
3342 {NI_NUMERICHOST, AF_INET6, "2001:db8::102:304", "2001:db8::102:304"},
3343 {0, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
3344 {0, AF_INET6, "2001:db8::506:708", "2001:db8::506:708"}, // unmapped
3345 };
Luke Huangf8215372019-11-22 11:53:41 +08003346 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003347
3348 // Reverse IPv4/IPv6 DNS query. Prefix should have no effect on it.
3349 for (const auto& config : testConfigs) {
3350 SCOPED_TRACE(config.asParameters());
3351
3352 int rv;
3353 char host[NI_MAXHOST];
3354 struct sockaddr_in sin;
3355 struct sockaddr_in6 sin6;
3356 if (config.family == AF_INET) {
3357 memset(&sin, 0, sizeof(sin));
3358 sin.sin_family = AF_INET;
3359 inet_pton(AF_INET, config.addr.c_str(), &sin.sin_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003360 rv = getnameinfo((const struct sockaddr*)&sin, sizeof(sin), host, sizeof(host), nullptr,
3361 0, config.flag);
nuccachena26cc2a2018-07-17 18:07:23 +08003362 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4));
3363 } else if (config.family == AF_INET6) {
3364 memset(&sin6, 0, sizeof(sin6));
3365 sin6.sin6_family = AF_INET6;
3366 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003367 rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host),
nuccachena26cc2a2018-07-17 18:07:23 +08003368 nullptr, 0, config.flag);
3369 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6));
3370 }
3371 ASSERT_EQ(0, rv);
3372 std::string result_str = host;
3373 EXPECT_EQ(result_str, config.host);
3374 dns.clearQueries();
3375 }
3376}
3377
3378TEST_F(ResolverTest, GetNameInfo_ReverseDns64Query) {
3379 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003380 constexpr char dns64_name[] = "ipv4only.arpa.";
3381 constexpr char ptr_name[] = "v4only.example.com.";
3382 // PTR record for IPv4 address 1.2.3.4
3383 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3384 // PTR record for IPv6 address 64:ff9b::1.2.3.4
3385 constexpr char ptr_addr_v6_nomapping[] =
3386 "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.";
3387 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
3388 // PTR record for IPv6 address 64:ff9b::5.6.7.8
3389 constexpr char ptr_addr_v6_synthesis[] =
3390 "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 +09003391 const std::vector<DnsRecord> records = {
3392 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3393 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3394 {ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis},
3395 };
nuccachena26cc2a2018-07-17 18:07:23 +08003396
Xiao Ma09b71022018-12-11 17:56:32 +09003397 test::DNSResponder dns(listen_addr);
3398 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003399 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003400 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003401
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003402 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003403 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003404 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003405
Luke Huangf8215372019-11-22 11:53:41 +08003406 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003407 static const struct TestConfig {
3408 bool hasSynthesizedPtrRecord;
3409 int flag;
3410 std::string addr;
3411 std::string host;
3412
3413 std::string asParameters() const {
3414 return StringPrintf("hasSynthesizedPtrRecord=%d, flag=%d, addr=%s, host=%s",
3415 hasSynthesizedPtrRecord, flag, addr.c_str(), host.c_str());
3416 }
3417 } testConfigs[]{
3418 {false, NI_NAMEREQD, "64:ff9b::102:304", "v4only.example.com"},
3419 {false, NI_NUMERICHOST, "64:ff9b::102:304", "64:ff9b::102:304"},
3420 {false, 0, "64:ff9b::102:304", "v4only.example.com"},
3421 {true, NI_NAMEREQD, "64:ff9b::506:708", "v6synthesis.example.com"},
3422 {true, NI_NUMERICHOST, "64:ff9b::506:708", "64:ff9b::506:708"},
3423 {true, 0, "64:ff9b::506:708", "v6synthesis.example.com"}
3424 };
Luke Huangf8215372019-11-22 11:53:41 +08003425 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003426
3427 // hasSynthesizedPtrRecord = false
3428 // Synthesized PTR record doesn't exist on DNS server
3429 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
3430 // After querying synthesized address failed, expect that prefix is removed from IPv6
3431 // synthesized address and do reverse IPv4 query instead.
3432 //
3433 // hasSynthesizedPtrRecord = true
3434 // Synthesized PTR record exists on DNS server
3435 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
3436 // Expect to just pass through synthesized address for DNS queries.
3437 for (const auto& config : testConfigs) {
3438 SCOPED_TRACE(config.asParameters());
3439
3440 char host[NI_MAXHOST];
3441 struct sockaddr_in6 sin6;
3442 memset(&sin6, 0, sizeof(sin6));
3443 sin6.sin6_family = AF_INET6;
3444 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003445 int rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host),
nuccachena26cc2a2018-07-17 18:07:23 +08003446 nullptr, 0, config.flag);
3447 ASSERT_EQ(0, rv);
3448 if (config.flag == NI_NAMEREQD) {
3449 if (config.hasSynthesizedPtrRecord) {
3450 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
3451 } else {
3452 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist.
3453 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist.
3454 }
3455 }
3456 std::string result_str = host;
3457 EXPECT_EQ(result_str, config.host);
3458 dns.clearQueries();
3459 }
3460}
3461
3462TEST_F(ResolverTest, GetNameInfo_ReverseDns64QueryFromHostFile) {
3463 constexpr char dns64_name[] = "ipv4only.arpa.";
3464 constexpr char host_name[] = "localhost";
3465 // The address is synthesized by prefix64:localhost.
3466 constexpr char host_addr[] = "64:ff9b::7f00:1";
nuccachena26cc2a2018-07-17 18:07:23 +08003467 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003468
3469 test::DNSResponder dns(listen_addr);
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003470
Xiao Ma09b71022018-12-11 17:56:32 +09003471 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003472 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003473 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003474
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003475 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003476 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003477 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003478
3479 // Using synthesized "localhost" address to be a trick for resolving host name
3480 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
3481 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
3482 char host[NI_MAXHOST];
Xiao Ma09b71022018-12-11 17:56:32 +09003483 struct sockaddr_in6 sin6 = {.sin6_family = AF_INET6};
nuccachena26cc2a2018-07-17 18:07:23 +08003484 inet_pton(AF_INET6, host_addr, &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003485 int rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host), nullptr,
nuccachena26cc2a2018-07-17 18:07:23 +08003486 0, NI_NAMEREQD);
3487 ASSERT_EQ(0, rv);
3488 // Expect no DNS queries; localhost is resolved via /etc/hosts.
3489 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
3490
3491 std::string result_str = host;
3492 EXPECT_EQ(result_str, host_name);
3493}
3494
Hungming Chen9e6185a2019-06-04 16:09:19 +08003495TEST_F(ResolverTest, GetNameInfo_cnamesClasslessReverseDelegation) {
3496 // IPv4 addresses in the subnet with notation '/' or '-'.
3497 constexpr char addr_slash[] = "192.0.2.1";
3498 constexpr char addr_hyphen[] = "192.0.3.1";
3499
3500 // Used to verify DNS reverse query for classless reverse lookup zone. See detail in RFC 2317
3501 // section 4.
3502 const static std::vector<DnsRecord> records = {
3503 // The records for reverse querying "192.0.2.1" in the subnet with notation '/'.
3504 {"1.2.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0/25.2.0.192.in-addr.arpa."},
3505 {"1.0/25.2.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3506
3507 // The records for reverse querying "192.0.3.1" in the subnet with notation '-'.
3508 {"1.3.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0-127.3.0.192.in-addr.arpa."},
3509 {"1.0-127.3.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3510 };
3511
3512 test::DNSResponder dns;
3513 StartDns(dns, records);
3514 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3515
3516 for (const auto& address : {addr_slash, addr_hyphen}) {
3517 SCOPED_TRACE(address);
3518
3519 char host[NI_MAXHOST];
3520 sockaddr_in sin = {.sin_family = AF_INET};
3521 ASSERT_TRUE(inet_pton(AF_INET, address, &sin.sin_addr));
3522 int rv = getnameinfo((const sockaddr*)&sin, sizeof(sin), host, sizeof(host), nullptr, 0,
3523 NI_NAMEREQD);
3524 ASSERT_EQ(0, rv);
3525 EXPECT_STREQ("hello.example.com", host);
3526 }
3527}
3528
nuccachena26cc2a2018-07-17 18:07:23 +08003529TEST_F(ResolverTest, GetHostByName2_Dns64Synthesize) {
Xiao Ma09b71022018-12-11 17:56:32 +09003530 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003531 constexpr char dns64_name[] = "ipv4only.arpa.";
3532 constexpr char host_name[] = "ipv4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003533 const std::vector<DnsRecord> records = {
3534 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3535 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3536 };
nuccachena26cc2a2018-07-17 18:07:23 +08003537
Xiao Ma09b71022018-12-11 17:56:32 +09003538 test::DNSResponder dns(listen_addr);
3539 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003540 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003541 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003542
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003543 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003544 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003545 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003546
3547 // Query an IPv4-only hostname. Expect that gets a synthesized address.
3548 struct hostent* result = gethostbyname2("ipv4only", AF_INET6);
3549 ASSERT_TRUE(result != nullptr);
3550 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3551 std::string result_str = ToString(result);
3552 EXPECT_EQ(result_str, "64:ff9b::102:304");
3553}
nuccachena26cc2a2018-07-17 18:07:23 +08003554
3555TEST_F(ResolverTest, GetHostByName2_DnsQueryWithHavingNat64Prefix) {
3556 constexpr char dns64_name[] = "ipv4only.arpa.";
3557 constexpr char host_name[] = "v4v6.example.com.";
nuccachena26cc2a2018-07-17 18:07:23 +08003558 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003559 const std::vector<DnsRecord> records = {
3560 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3561 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3562 {host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
3563 };
3564
3565 test::DNSResponder dns(listen_addr);
3566 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003567 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003568 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003569
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003570 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003571 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003572 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003573
3574 // IPv4 DNS query. Prefix should have no effect on it.
3575 struct hostent* result = gethostbyname2("v4v6", AF_INET);
3576 ASSERT_TRUE(result != nullptr);
3577 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3578 std::string result_str = ToString(result);
3579 EXPECT_EQ(result_str, "1.2.3.4");
3580 dns.clearQueries();
3581
3582 // IPv6 DNS query. Prefix should have no effect on it.
3583 result = gethostbyname2("v4v6", AF_INET6);
3584 ASSERT_TRUE(result != nullptr);
3585 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3586 result_str = ToString(result);
3587 EXPECT_EQ(result_str, "2001:db8::102:304");
3588}
3589
3590TEST_F(ResolverTest, GetHostByName2_Dns64QuerySpecialUseIPv4Addresses) {
3591 constexpr char THIS_NETWORK[] = "this_network";
3592 constexpr char LOOPBACK[] = "loopback";
3593 constexpr char LINK_LOCAL[] = "link_local";
3594 constexpr char MULTICAST[] = "multicast";
3595 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
3596
3597 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
3598 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
3599 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
3600 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
3601 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
3602
3603 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003604 constexpr char dns64_name[] = "ipv4only.arpa.";
3605
Xiao Ma09b71022018-12-11 17:56:32 +09003606 test::DNSResponder dns(listen_addr);
3607 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003608 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003609 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003610
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003611 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003612 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003613 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003614
Luke Huangf8215372019-11-22 11:53:41 +08003615 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003616 static const struct TestConfig {
3617 std::string name;
3618 std::string addr;
3619
3620 std::string asHostName() const {
Luke Huangf8215372019-11-22 11:53:41 +08003621 return StringPrintf("%s.example.com.", name.c_str());
nuccachena26cc2a2018-07-17 18:07:23 +08003622 }
3623 } testConfigs[]{
3624 {THIS_NETWORK, ADDR_THIS_NETWORK},
3625 {LOOPBACK, ADDR_LOOPBACK},
3626 {LINK_LOCAL, ADDR_LINK_LOCAL},
3627 {MULTICAST, ADDR_MULTICAST},
3628 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
3629 };
Luke Huangf8215372019-11-22 11:53:41 +08003630 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003631
3632 for (const auto& config : testConfigs) {
3633 const std::string testHostName = config.asHostName();
3634 SCOPED_TRACE(testHostName);
3635
3636 const char* host_name = testHostName.c_str();
3637 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
3638
3639 struct hostent* result = gethostbyname2(config.name.c_str(), AF_INET6);
3640 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3641
3642 // In AF_INET6 case, don't synthesize special use IPv4 address.
3643 // Expect to have no answer
3644 EXPECT_EQ(nullptr, result);
3645
3646 dns.clearQueries();
3647 }
Bernie Innocenti2fef2b82018-12-20 15:56:40 +09003648}
Mike Yuf14e1a92019-05-10 13:54:58 +08003649
3650TEST_F(ResolverTest, PrefixDiscoveryBypassTls) {
3651 constexpr char listen_addr[] = "::1";
3652 constexpr char cleartext_port[] = "53";
3653 constexpr char tls_port[] = "853";
3654 constexpr char dns64_name[] = "ipv4only.arpa.";
3655 const std::vector<std::string> servers = {listen_addr};
3656
3657 test::DNSResponder dns(listen_addr);
3658 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
3659 test::DnsTlsFrontend tls(listen_addr, tls_port, listen_addr, cleartext_port);
3660 ASSERT_TRUE(tls.startServer());
3661
3662 // Setup OPPORTUNISTIC mode and wait for the validation complete.
waynema0e73c2e2019-07-31 15:04:08 +08003663 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08003664 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003665 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yuf14e1a92019-05-10 13:54:58 +08003666 tls.clearQueries();
3667
3668 // Start NAT64 prefix discovery and wait for it complete.
3669 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003670 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
Mike Yuf14e1a92019-05-10 13:54:58 +08003671
3672 // Verify it bypassed TLS even though there's a TLS server available.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003673 EXPECT_EQ(0, tls.queries()) << dns.dumpQueries();
3674 EXPECT_EQ(1U, GetNumQueries(dns, dns64_name)) << dns.dumpQueries();
Mike Yuf14e1a92019-05-10 13:54:58 +08003675
3676 // Restart the testing network to reset the cache.
3677 mDnsClient.TearDown();
3678 mDnsClient.SetUp();
3679 dns.clearQueries();
3680
3681 // Setup STRICT mode and wait for the validation complete.
waynema0e73c2e2019-07-31 15:04:08 +08003682 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
3683 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08003684 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003685 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yuf14e1a92019-05-10 13:54:58 +08003686 tls.clearQueries();
3687
3688 // Start NAT64 prefix discovery and wait for it to complete.
3689 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003690 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
Mike Yuf14e1a92019-05-10 13:54:58 +08003691
3692 // Verify it bypassed TLS despite STRICT mode.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003693 EXPECT_EQ(0, tls.queries()) << dns.dumpQueries();
3694 EXPECT_EQ(1U, GetNumQueries(dns, dns64_name)) << dns.dumpQueries();
Mike Yuf14e1a92019-05-10 13:54:58 +08003695}
Luke Huang9807e6b2019-05-20 16:17:12 +08003696
Lorenzo Colittie51091d2020-05-20 02:48:44 +09003697TEST_F(ResolverTest, SetAndClearNat64Prefix) {
3698 constexpr char host_name[] = "v4.example.com.";
3699 constexpr char listen_addr[] = "::1";
3700 const std::vector<DnsRecord> records = {
3701 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3702 };
3703 const std::string kNat64Prefix1 = "64:ff9b::/96";
3704 const std::string kNat64Prefix2 = "2001:db8:6464::/96";
3705
3706 test::DNSResponder dns(listen_addr);
3707 StartDns(dns, records);
3708 const std::vector<std::string> servers = {listen_addr};
3709 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
3710
3711 auto resolvService = mDnsClient.resolvService();
3712 addrinfo hints = {.ai_family = AF_INET6};
3713
3714 // No NAT64 prefix, no AAAA record.
3715 ScopedAddrinfo result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3716 ASSERT_TRUE(result == nullptr);
3717
3718 // Set the prefix, and expect to get a synthesized AAAA record.
3719 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix2).isOk());
3720 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3721 ASSERT_FALSE(result == nullptr);
3722 EXPECT_EQ("2001:db8:6464::102:304", ToString(result));
3723
3724 // Update the prefix, expect to see AAAA records from the new prefix.
3725 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3726 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3727 ASSERT_FALSE(result == nullptr);
3728 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3729
3730 // Non-/96 prefixes are ignored.
3731 auto status = resolvService->setPrefix64(TEST_NETID, "64:ff9b::/64");
3732 EXPECT_FALSE(status.isOk());
3733 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3734 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3735
3736 // Invalid prefixes are ignored.
3737 status = resolvService->setPrefix64(TEST_NETID, "192.0.2.0/24");
3738 EXPECT_FALSE(status.isOk());
3739 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3740 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3741
3742 status = resolvService->setPrefix64(TEST_NETID, "192.0.2.1");
3743 EXPECT_FALSE(status.isOk());
3744 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3745 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3746
3747 status = resolvService->setPrefix64(TEST_NETID, "hello");
3748 EXPECT_FALSE(status.isOk());
3749 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3750 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3751
3752 // DNS64 synthesis is still working.
3753 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3754 ASSERT_FALSE(result == nullptr);
3755 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3756
3757 // Clear the prefix. No AAAA records any more.
3758 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, "").isOk());
3759 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3760 EXPECT_TRUE(result == nullptr);
3761
3762 // Calling startPrefix64Discovery clears the prefix.
3763 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3764 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3765 ASSERT_FALSE(result == nullptr);
3766 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3767
3768 EXPECT_TRUE(resolvService->startPrefix64Discovery(TEST_NETID).isOk());
3769 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3770 ASSERT_TRUE(result == nullptr);
3771
3772 // setPrefix64 fails if prefix discovery is started, even if no prefix is yet discovered...
3773 status = resolvService->setPrefix64(TEST_NETID, kNat64Prefix1);
3774 EXPECT_FALSE(status.isOk());
3775 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3776 EXPECT_EQ(EEXIST, status.getServiceSpecificError());
3777
3778 // .. and clearing the prefix also has no effect.
3779 status = resolvService->setPrefix64(TEST_NETID, "");
3780 EXPECT_FALSE(status.isOk());
3781 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3782 EXPECT_EQ(ENOENT, status.getServiceSpecificError());
3783
3784 // setPrefix64 succeeds again when prefix discovery is stopped.
3785 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
3786 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3787 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3788 ASSERT_FALSE(result == nullptr);
3789 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3790
3791 // Calling stopPrefix64Discovery clears the prefix.
3792 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
3793 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3794 ASSERT_TRUE(result == nullptr);
3795
3796 // Set up NAT64 prefix discovery.
3797 constexpr char dns64_name[] = "ipv4only.arpa.";
3798 const std::vector<DnsRecord> newRecords = {
3799 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3800 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3801 };
3802 dns.stopServer();
3803 StartDns(dns, newRecords);
3804
3805 EXPECT_TRUE(resolvService->startPrefix64Discovery(TEST_NETID).isOk());
3806 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
3807 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3808 ASSERT_FALSE(result == nullptr);
3809 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3810
3811 // setPrefix64 fails if NAT64 prefix discovery has succeeded, and the discovered prefix
3812 // continues to be used.
3813 status = resolvService->setPrefix64(TEST_NETID, kNat64Prefix2);
3814 EXPECT_FALSE(status.isOk());
3815 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3816 EXPECT_EQ(EEXIST, status.getServiceSpecificError());
3817
3818 // Clearing the prefix also has no effect if discovery is started.
3819 status = resolvService->setPrefix64(TEST_NETID, "");
3820 EXPECT_FALSE(status.isOk());
3821 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3822 EXPECT_EQ(ENOENT, status.getServiceSpecificError());
3823
3824 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3825 ASSERT_FALSE(result == nullptr);
3826 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3827
3828 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
3829 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_NOT_FOUND));
Lorenzo Colitti61f796b2020-05-21 00:57:49 +09003830
3831 EXPECT_EQ(0, sDnsMetricsListener->getUnexpectedNat64PrefixUpdates());
Lorenzo Colittie51091d2020-05-20 02:48:44 +09003832}
3833
Luke Huang9807e6b2019-05-20 16:17:12 +08003834namespace {
3835
Luke Huang0d592bc2019-05-25 18:24:03 +08003836class ScopedSetNetworkForProcess {
3837 public:
3838 explicit ScopedSetNetworkForProcess(unsigned netId) {
3839 mStoredNetId = getNetworkForProcess();
3840 if (netId == mStoredNetId) return;
3841 EXPECT_EQ(0, setNetworkForProcess(netId));
3842 }
3843 ~ScopedSetNetworkForProcess() { EXPECT_EQ(0, setNetworkForProcess(mStoredNetId)); }
3844
3845 private:
3846 unsigned mStoredNetId;
3847};
3848
3849class ScopedSetNetworkForResolv {
3850 public:
3851 explicit ScopedSetNetworkForResolv(unsigned netId) { EXPECT_EQ(0, setNetworkForResolv(netId)); }
3852 ~ScopedSetNetworkForResolv() { EXPECT_EQ(0, setNetworkForResolv(NETID_UNSET)); }
3853};
3854
Luke Huang9807e6b2019-05-20 16:17:12 +08003855void sendCommand(int fd, const std::string& cmd) {
3856 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size() + 1));
3857 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size() + 1));
3858}
3859
3860int32_t readBE32(int fd) {
3861 int32_t tmp;
3862 int n = TEMP_FAILURE_RETRY(read(fd, &tmp, sizeof(tmp)));
3863 EXPECT_TRUE(n > 0);
3864 return ntohl(tmp);
3865}
3866
Luke Huang0d592bc2019-05-25 18:24:03 +08003867int readResponseCode(int fd) {
Luke Huang9807e6b2019-05-20 16:17:12 +08003868 char buf[4];
3869 int n = TEMP_FAILURE_RETRY(read(fd, &buf, sizeof(buf)));
3870 EXPECT_TRUE(n > 0);
3871 // The format of response code is that 4 bytes for the code & null.
3872 buf[3] = '\0';
3873 int result;
3874 EXPECT_TRUE(ParseInt(buf, &result));
3875 return result;
3876}
3877
Luke Huang0d592bc2019-05-25 18:24:03 +08003878bool checkAndClearUseLocalNameserversFlag(unsigned* netid) {
3879 if (netid == nullptr || ((*netid) & NETID_USE_LOCAL_NAMESERVERS) == 0) {
3880 return false;
3881 }
3882 *netid = (*netid) & ~NETID_USE_LOCAL_NAMESERVERS;
3883 return true;
3884}
3885
Luke Huangf8215372019-11-22 11:53:41 +08003886aidl::android::net::UidRangeParcel makeUidRangeParcel(int start, int stop) {
3887 aidl::android::net::UidRangeParcel res;
Luke Huang0d592bc2019-05-25 18:24:03 +08003888 res.start = start;
3889 res.stop = stop;
3890
3891 return res;
3892}
3893
3894void expectNetIdWithLocalNameserversFlag(unsigned netId) {
3895 unsigned dnsNetId = 0;
3896 EXPECT_EQ(0, getNetworkForDns(&dnsNetId));
3897 EXPECT_TRUE(checkAndClearUseLocalNameserversFlag(&dnsNetId));
3898 EXPECT_EQ(netId, static_cast<unsigned>(dnsNetId));
3899}
3900
3901void expectDnsNetIdEquals(unsigned netId) {
3902 unsigned dnsNetId = 0;
3903 EXPECT_EQ(0, getNetworkForDns(&dnsNetId));
3904 EXPECT_EQ(netId, static_cast<unsigned>(dnsNetId));
3905}
3906
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003907void expectDnsNetIdIsDefaultNetwork(INetd* netdService) {
Luke Huang0d592bc2019-05-25 18:24:03 +08003908 int currentNetid;
3909 EXPECT_TRUE(netdService->networkGetDefault(&currentNetid).isOk());
3910 expectDnsNetIdEquals(currentNetid);
3911}
3912
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003913void expectDnsNetIdWithVpn(INetd* netdService, unsigned vpnNetId, unsigned expectedNetId) {
Luke Huang0d592bc2019-05-25 18:24:03 +08003914 EXPECT_TRUE(netdService->networkCreateVpn(vpnNetId, false /* secure */).isOk());
3915 uid_t uid = getuid();
3916 // Add uid to VPN
3917 EXPECT_TRUE(netdService->networkAddUidRanges(vpnNetId, {makeUidRangeParcel(uid, uid)}).isOk());
3918 expectDnsNetIdEquals(expectedNetId);
3919 EXPECT_TRUE(netdService->networkDestroy(vpnNetId).isOk());
3920}
3921
Luke Huang9807e6b2019-05-20 16:17:12 +08003922} // namespace
3923
3924TEST_F(ResolverTest, getDnsNetId) {
3925 // We've called setNetworkForProcess in SetupOemNetwork, so reset to default first.
3926 setNetworkForProcess(NETID_UNSET);
Luke Huang0d592bc2019-05-25 18:24:03 +08003927
3928 expectDnsNetIdIsDefaultNetwork(mDnsClient.netdService());
3929 expectDnsNetIdWithVpn(mDnsClient.netdService(), TEST_VPN_NETID, TEST_VPN_NETID);
Luke Huang9807e6b2019-05-20 16:17:12 +08003930
3931 // Test with setNetworkForProcess
Luke Huang0d592bc2019-05-25 18:24:03 +08003932 {
3933 ScopedSetNetworkForProcess scopedSetNetworkForProcess(TEST_NETID);
3934 expectDnsNetIdEquals(TEST_NETID);
3935 }
3936
3937 // Test with setNetworkForProcess with NETID_USE_LOCAL_NAMESERVERS
3938 {
3939 ScopedSetNetworkForProcess scopedSetNetworkForProcess(TEST_NETID |
3940 NETID_USE_LOCAL_NAMESERVERS);
3941 expectNetIdWithLocalNameserversFlag(TEST_NETID);
3942 }
Luke Huang9807e6b2019-05-20 16:17:12 +08003943
3944 // Test with setNetworkForResolv
Luke Huang0d592bc2019-05-25 18:24:03 +08003945 {
3946 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID);
3947 expectDnsNetIdEquals(TEST_NETID);
3948 }
3949
3950 // Test with setNetworkForResolv with NETID_USE_LOCAL_NAMESERVERS
3951 {
3952 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID |
3953 NETID_USE_LOCAL_NAMESERVERS);
3954 expectNetIdWithLocalNameserversFlag(TEST_NETID);
3955 }
3956
3957 // Test with setNetworkForResolv under bypassable vpn
3958 {
3959 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID);
3960 expectDnsNetIdWithVpn(mDnsClient.netdService(), TEST_VPN_NETID, TEST_NETID);
3961 }
Luke Huang9807e6b2019-05-20 16:17:12 +08003962
3963 // Create socket connected to DnsProxyListener
3964 int fd = dns_open_proxy();
3965 EXPECT_TRUE(fd > 0);
3966 unique_fd ufd(fd);
3967
3968 // Test command with wrong netId
3969 sendCommand(fd, "getdnsnetid abc");
Luke Huang0d592bc2019-05-25 18:24:03 +08003970 EXPECT_EQ(ResponseCode::DnsProxyQueryResult, readResponseCode(fd));
Luke Huang9807e6b2019-05-20 16:17:12 +08003971 EXPECT_EQ(-EINVAL, readBE32(fd));
3972
3973 // Test unsupported command
3974 sendCommand(fd, "getdnsnetidNotSupported");
3975 // Keep in sync with FrameworkListener.cpp (500, "Command not recognized")
Luke Huang0d592bc2019-05-25 18:24:03 +08003976 EXPECT_EQ(500, readResponseCode(fd));
Luke Huang9807e6b2019-05-20 16:17:12 +08003977}
Sehee Park2c118782019-05-07 13:02:45 +09003978
3979TEST_F(ResolverTest, BlockDnsQueryWithUidRule) {
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003980 // This test relies on blocking traffic on loopback, which xt_qtaguid does not do.
3981 // See aosp/358413 and b/34444781 for why.
3982 SKIP_IF_BPF_NOT_SUPPORTED;
3983
Sehee Park2c118782019-05-07 13:02:45 +09003984 constexpr char listen_addr1[] = "127.0.0.4";
3985 constexpr char listen_addr2[] = "::1";
3986 constexpr char host_name[] = "howdy.example.com.";
3987 const std::vector<DnsRecord> records = {
3988 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3989 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
3990 };
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003991 INetd* netdService = mDnsClient.netdService();
Sehee Park2c118782019-05-07 13:02:45 +09003992
3993 test::DNSResponder dns1(listen_addr1);
3994 test::DNSResponder dns2(listen_addr2);
3995 StartDns(dns1, records);
3996 StartDns(dns2, records);
3997
3998 std::vector<std::string> servers = {listen_addr1, listen_addr2};
3999 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
4000 dns1.clearQueries();
4001 dns2.clearQueries();
4002
Luke Huangeb618ef2020-05-26 14:17:02 +08004003 ScopeBlockedUIDRule scopeBlockUidRule(netdService, TEST_UID);
Sehee Park2c118782019-05-07 13:02:45 +09004004 // Dns Query
4005 int fd1 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_a, 0);
4006 int fd2 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_aaaa, 0);
4007 EXPECT_TRUE(fd1 != -1);
4008 EXPECT_TRUE(fd2 != -1);
4009
4010 uint8_t buf[MAXPACKET] = {};
4011 int rcode;
4012 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
4013 EXPECT_EQ(-ECONNREFUSED, res);
4014
4015 memset(buf, 0, MAXPACKET);
4016 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
4017 EXPECT_EQ(-ECONNREFUSED, res);
Sehee Park2c118782019-05-07 13:02:45 +09004018}
Mike Yua772c202019-09-23 17:47:21 +08004019
Mike Yu40e67072019-10-09 21:14:09 +08004020namespace {
4021
4022const std::string kDotConnectTimeoutMsFlag(
4023 "persist.device_config.netd_native.dot_connect_timeout_ms");
4024
4025class ScopedSystemProperties {
4026 public:
4027 explicit ScopedSystemProperties(const std::string& key, const std::string& value)
4028 : mStoredKey(key) {
4029 mStoredValue = android::base::GetProperty(key, "");
4030 android::base::SetProperty(key, value);
4031 }
4032 ~ScopedSystemProperties() { android::base::SetProperty(mStoredKey, mStoredValue); }
4033
4034 private:
4035 std::string mStoredKey;
4036 std::string mStoredValue;
4037};
4038
4039} // namespace
4040
Mike Yua772c202019-09-23 17:47:21 +08004041TEST_F(ResolverTest, ConnectTlsServerTimeout) {
Mike Yu40e67072019-10-09 21:14:09 +08004042 constexpr int expectedTimeout = 1000;
4043 constexpr char hostname1[] = "query1.example.com.";
4044 constexpr char hostname2[] = "query2.example.com.";
Mike Yua772c202019-09-23 17:47:21 +08004045 const std::vector<DnsRecord> records = {
Mike Yu40e67072019-10-09 21:14:09 +08004046 {hostname1, ns_type::ns_t_a, "1.2.3.4"},
4047 {hostname2, ns_type::ns_t_a, "1.2.3.5"},
Mike Yua772c202019-09-23 17:47:21 +08004048 };
4049
4050 test::DNSResponder dns;
4051 StartDns(dns, records);
Mike Yu40e67072019-10-09 21:14:09 +08004052 test::DnsTlsFrontend tls;
Mike Yua772c202019-09-23 17:47:21 +08004053 ASSERT_TRUE(tls.startServer());
4054
Mike Yu40e67072019-10-09 21:14:09 +08004055 // The resolver will adjust the timeout value to 1000ms since the value is too small.
4056 ScopedSystemProperties scopedSystemProperties(kDotConnectTimeoutMsFlag, "100");
Mike Yua772c202019-09-23 17:47:21 +08004057
Mike Yu40e67072019-10-09 21:14:09 +08004058 // Set up resolver to opportunistic mode with the default configuration.
Mike Yu8ac63402019-12-02 15:28:38 +08004059 const ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
Mike Yu40e67072019-10-09 21:14:09 +08004060 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
Mike Yua772c202019-09-23 17:47:21 +08004061 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09004062 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yua772c202019-09-23 17:47:21 +08004063 tls.clearQueries();
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09004064 dns.clearQueries();
Mike Yua772c202019-09-23 17:47:21 +08004065
4066 // The server becomes unresponsive to the handshake request.
4067 tls.setHangOnHandshakeForTesting(true);
4068
4069 // Expect the things happening in getaddrinfo():
4070 // 1. Connect to the private DNS server.
4071 // 2. SSL handshake times out.
4072 // 3. Fallback to UDP transport, and then get the answer.
Mike Yu40e67072019-10-09 21:14:09 +08004073 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4074 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(hostname1, nullptr, hints);
Mike Yua772c202019-09-23 17:47:21 +08004075
Mike Yu40e67072019-10-09 21:14:09 +08004076 EXPECT_NE(nullptr, result);
Mike Yua772c202019-09-23 17:47:21 +08004077 EXPECT_EQ(0, tls.queries());
Mike Yu40e67072019-10-09 21:14:09 +08004078 EXPECT_EQ(1U, GetNumQueries(dns, hostname1));
4079 EXPECT_EQ(records.at(0).addr, ToString(result));
Mike Yua772c202019-09-23 17:47:21 +08004080
Mike Yu40e67072019-10-09 21:14:09 +08004081 // A loose upper bound is set by adding 2000ms buffer time. Theoretically, getaddrinfo()
4082 // should just take a bit more than expetTimeout milliseconds.
4083 EXPECT_GE(timeTakenMs, expectedTimeout);
4084 EXPECT_LE(timeTakenMs, expectedTimeout + 2000);
4085
4086 // Set the server to be responsive. Verify that the resolver will attempt to reconnect
4087 // to the server and then get the result within the timeout.
4088 tls.setHangOnHandshakeForTesting(false);
4089 std::tie(result, timeTakenMs) = safe_getaddrinfo_time_taken(hostname2, nullptr, hints);
4090
4091 EXPECT_NE(nullptr, result);
Luke Huang0a0870d2020-02-12 20:41:10 +08004092 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yu40e67072019-10-09 21:14:09 +08004093 EXPECT_EQ(1U, GetNumQueries(dns, hostname2));
4094 EXPECT_EQ(records.at(1).addr, ToString(result));
4095
4096 EXPECT_LE(timeTakenMs, expectedTimeout);
Mike Yua772c202019-09-23 17:47:21 +08004097}
Hungming Chenbb90ab32019-10-28 18:20:31 +08004098
Ken Chen766feae2019-10-30 15:13:44 +08004099TEST_F(ResolverTest, FlushNetworkCache) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004100 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004101 test::DNSResponder dns;
4102 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4103 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4104
4105 const hostent* result = gethostbyname("hello");
4106 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4107
4108 // get result from cache
4109 result = gethostbyname("hello");
4110 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4111
4112 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4113
4114 result = gethostbyname("hello");
4115 EXPECT_EQ(2U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4116}
4117
4118TEST_F(ResolverTest, FlushNetworkCache_random) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004119 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004120 constexpr int num_flush = 10;
4121 constexpr int num_queries = 20;
4122 test::DNSResponder dns;
4123 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4124 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4125 const addrinfo hints = {.ai_family = AF_INET};
4126
4127 std::thread t([this]() {
4128 for (int i = 0; i < num_flush; ++i) {
4129 unsigned delay = arc4random_uniform(10 * 1000); // 10ms
4130 usleep(delay);
4131 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4132 }
4133 });
4134
4135 for (int i = 0; i < num_queries; ++i) {
4136 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4137 EXPECT_TRUE(result != nullptr);
4138 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4139 }
4140 t.join();
4141}
4142
4143// flush cache while one query is wait-for-response, another is pending.
4144TEST_F(ResolverTest, FlushNetworkCache_concurrent) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004145 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004146 const char* listen_addr1 = "127.0.0.9";
4147 const char* listen_addr2 = "127.0.0.10";
4148 test::DNSResponder dns1(listen_addr1);
4149 test::DNSResponder dns2(listen_addr2);
4150 StartDns(dns1, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4151 StartDns(dns2, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4152 addrinfo hints = {.ai_family = AF_INET};
4153
4154 // step 1: set server#1 into deferred responding mode
4155 dns1.setDeferredResp(true);
4156 std::thread t1([&listen_addr1, &hints, this]() {
4157 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr1}));
4158 // step 3: query
4159 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4160 // step 9: check result
4161 EXPECT_TRUE(result != nullptr);
4162 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4163 });
4164
4165 // step 2: wait for the query to reach the server
4166 while (GetNumQueries(dns1, kHelloExampleCom) == 0) {
4167 usleep(1000); // 1ms
4168 }
4169
4170 std::thread t2([&listen_addr2, &hints, &dns2, this]() {
4171 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr2}));
4172 // step 5: query (should be blocked in resolver)
4173 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4174 // step 7: check result
4175 EXPECT_TRUE(result != nullptr);
4176 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4177 EXPECT_EQ(1U, GetNumQueriesForType(dns2, ns_type::ns_t_a, kHelloExampleCom));
4178 });
4179
4180 // step 4: wait a bit for the 2nd query to enter pending state
4181 usleep(100 * 1000); // 100ms
4182 // step 6: flush cache (will unblock pending queries)
4183 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4184 t2.join();
4185
4186 // step 8: resume server#1
4187 dns1.setDeferredResp(false);
4188 t1.join();
4189
4190 // step 10: verify if result is correctly cached
4191 dns2.clearQueries();
4192 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4193 EXPECT_EQ(0U, GetNumQueries(dns2, kHelloExampleCom));
4194 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4195}
4196
waynema29253052019-08-20 11:26:08 +08004197// TODO: Perhaps to have a boundary conditions test for TCP and UDP.
4198TEST_F(ResolverTest, TcpQueryWithOversizePayload) {
4199 test::DNSResponder dns;
4200 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4201 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4202
4203 int fd = dns_open_proxy();
4204 ASSERT_TRUE(fd > 0);
4205
4206 // Sending DNS query over TCP once the packet sizes exceed 512 bytes.
4207 // The raw data is combined with Question section and Additional section
4208 // Question section : query "hello.example.com", type A, class IN
4209 // Additional section : type OPT (41), Option PADDING, Option Length 546
4210 // Padding option which allows DNS clients and servers to artificially
4211 // increase the size of a DNS message by a variable number of bytes.
4212 // See also RFC7830, section 3
4213 const std::string query =
4214 "+c0BAAABAAAAAAABBWhlbGxvB2V4YW1wbGUDY29tAAABAAEAACkgAAAAgAACJgAMAiIAAAAAAAAAAAAAAAAAA"
4215 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4216 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4217 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4218 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4219 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4220 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4221 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4222 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4223 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
4224 const std::string cmd =
4225 "resnsend " + std::to_string(TEST_NETID) + " 0 " /* ResNsendFlags */ + query + '\0';
4226 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
4227 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
4228 expectAnswersValid(fd, AF_INET, kHelloExampleComAddrV4);
4229 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom));
4230 EXPECT_EQ(0U, GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom));
4231}
4232
Ken Chen99344882020-01-01 14:59:38 +08004233TEST_F(ResolverTest, TruncatedRspMode) {
4234 constexpr char listen_addr[] = "127.0.0.4";
4235 constexpr char listen_addr2[] = "127.0.0.5";
4236 constexpr char listen_srv[] = "53";
4237
4238 test::DNSResponder dns(listen_addr, listen_srv, static_cast<ns_rcode>(-1));
4239 test::DNSResponder dns2(listen_addr2, listen_srv, static_cast<ns_rcode>(-1));
4240 // dns supports UDP only, dns2 support UDP and TCP
4241 dns.setResponseProbability(0.0, IPPROTO_TCP);
4242 StartDns(dns, kLargeCnameChainRecords);
4243 StartDns(dns2, kLargeCnameChainRecords);
4244
4245 const struct TestConfig {
4246 const std::optional<int32_t> tcMode;
4247 const bool ret;
4248 const unsigned numQueries;
4249 std::string asParameters() const {
4250 return StringPrintf("tcMode: %d, ret: %s, numQueries: %u", tcMode.value_or(-1),
4251 ret ? "true" : "false", numQueries);
4252 }
4253 } testConfigs[]{
4254 // clang-format off
4255 {std::nullopt, true, 0}, /* mode unset */
4256 {aidl::android::net::IDnsResolver::TC_MODE_DEFAULT, true, 0}, /* default mode */
4257 {aidl::android::net::IDnsResolver::TC_MODE_UDP_TCP, true, 1}, /* alternative mode */
4258 {-666, false, 1}, /* invalid input */
4259 // clang-format on
4260 };
4261
4262 for (const auto& config : testConfigs) {
4263 SCOPED_TRACE(config.asParameters());
4264
4265 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4266 parcel.servers = {listen_addr, listen_addr2};
4267 if (config.tcMode) {
Ken Chena6ac2a62020-04-07 17:25:56 +08004268 parcel.resolverOptions.tcMode = config.tcMode.value();
Ken Chen99344882020-01-01 14:59:38 +08004269 }
4270 ASSERT_EQ(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk(), config.ret);
4271
4272 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4273 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4274 ASSERT_TRUE(result != nullptr);
4275 EXPECT_EQ(ToString(result), kHelloExampleComAddrV4);
4276 // TC_MODE_DEFAULT: resolver retries on TCP-only on each name server.
4277 // TC_MODE_UDP_TCP: resolver retries on TCP on the same server, falls back to UDP from next.
4278 ASSERT_EQ(GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom), 1U);
4279 ASSERT_EQ(GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom), 1U);
4280 ASSERT_EQ(GetNumQueriesForProtocol(dns2, IPPROTO_UDP, kHelloExampleCom), config.numQueries);
4281 ASSERT_EQ(GetNumQueriesForProtocol(dns2, IPPROTO_TCP, kHelloExampleCom), 1U);
4282
4283 dns.clearQueries();
4284 dns2.clearQueries();
4285 ASSERT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4286 }
4287}
4288
Mike Yu153b5b82020-03-04 19:53:54 +08004289TEST_F(ResolverTest, RepeatedSetup_ResolverStatusRemains) {
4290 constexpr char unusable_listen_addr[] = "127.0.0.3";
4291 constexpr char listen_addr[] = "127.0.0.4";
4292 constexpr char hostname[] = "a.hello.query.";
4293 const auto repeatedSetResolversFromParcel = [&](const ResolverParamsParcel& parcel) {
4294 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4295 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4296 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4297 };
4298
4299 test::DNSResponder dns(listen_addr);
4300 StartDns(dns, {{hostname, ns_type::ns_t_a, "1.2.3.3"}});
4301 test::DnsTlsFrontend tls1(listen_addr, "853", listen_addr, "53");
4302 ASSERT_TRUE(tls1.startServer());
4303
4304 // Private DNS off mode.
4305 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4306 parcel.servers = {unusable_listen_addr, listen_addr};
4307 parcel.tlsServers.clear();
4308 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4309
4310 // Send a query.
4311 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4312 EXPECT_NE(safe_getaddrinfo(hostname, nullptr, &hints), nullptr);
4313
4314 // Check the stats as expected.
4315 const std::vector<NameserverStats> expectedCleartextDnsStats = {
4316 NameserverStats(unusable_listen_addr).setInternalErrors(1),
4317 NameserverStats(listen_addr).setSuccesses(1),
4318 };
4319 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
4320 EXPECT_EQ(GetNumQueries(dns, hostname), 1U);
4321
4322 // The stats is supposed to remain as long as the list of cleartext DNS servers is unchanged.
4323 static const struct TestConfig {
4324 std::vector<std::string> servers;
4325 std::vector<std::string> tlsServers;
4326 std::string tlsName;
4327 } testConfigs[] = {
4328 // Private DNS opportunistic mode.
4329 {{listen_addr, unusable_listen_addr}, {listen_addr, unusable_listen_addr}, ""},
4330 {{unusable_listen_addr, listen_addr}, {unusable_listen_addr, listen_addr}, ""},
4331
4332 // Private DNS strict mode.
4333 {{listen_addr, unusable_listen_addr}, {"127.0.0.100"}, kDefaultPrivateDnsHostName},
4334 {{unusable_listen_addr, listen_addr}, {"127.0.0.100"}, kDefaultPrivateDnsHostName},
4335
4336 // Private DNS off mode.
4337 {{unusable_listen_addr, listen_addr}, {}, ""},
4338 {{listen_addr, unusable_listen_addr}, {}, ""},
4339 };
4340
4341 for (const auto& config : testConfigs) {
4342 SCOPED_TRACE(fmt::format("testConfig: [{}] [{}] [{}]", fmt::join(config.servers, ","),
4343 fmt::join(config.tlsServers, ","), config.tlsName));
4344 parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4345 parcel.servers = config.servers;
4346 parcel.tlsServers = config.tlsServers;
4347 parcel.tlsName = config.tlsName;
4348 repeatedSetResolversFromParcel(parcel);
4349 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
4350
4351 // The stats remains when the list of search domains changes.
4352 parcel.domains.push_back("tmp.domains");
4353 repeatedSetResolversFromParcel(parcel);
4354 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
4355
4356 // The stats remains when the parameters change (except maxSamples).
4357 parcel.sampleValiditySeconds++;
4358 parcel.successThreshold++;
4359 parcel.minSamples++;
4360 parcel.baseTimeoutMsec++;
4361 parcel.retryCount++;
4362 repeatedSetResolversFromParcel(parcel);
4363 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
4364 }
4365
4366 // The cache remains.
4367 EXPECT_NE(safe_getaddrinfo(hostname, nullptr, &hints), nullptr);
4368 EXPECT_EQ(GetNumQueries(dns, hostname), 1U);
4369}
4370
4371TEST_F(ResolverTest, RepeatedSetup_NoRedundantPrivateDnsValidation) {
4372 const std::string addr1 = getUniqueIPv4Address(); // For a workable DNS server.
4373 const std::string addr2 = getUniqueIPv4Address(); // For an unresponsive DNS server.
4374 const std::string unusable_addr = getUniqueIPv4Address();
Mike Yubc4b9502020-03-20 13:14:00 +08004375 const auto waitForPrivateDnsStateUpdated = []() {
4376 // A buffer time for the PrivateDnsConfiguration instance to update its map,
4377 // mPrivateDnsValidateThreads, which is used for tracking validation threads.
4378 // Since there is a time gap between when PrivateDnsConfiguration reports
4379 // onPrivateDnsValidationEvent and when PrivateDnsConfiguration updates the map, this is a
4380 // workaround to avoid the test starts a subsequent resolver setup during the time gap.
4381 // TODO: Report onPrivateDnsValidationEvent after all the relevant updates are complete.
4382 // Reference to b/152009023.
4383 std::this_thread::sleep_for(20ms);
4384 };
Mike Yu153b5b82020-03-04 19:53:54 +08004385
4386 test::DNSResponder dns1(addr1);
4387 test::DNSResponder dns2(addr2);
4388 StartDns(dns1, {});
4389 StartDns(dns2, {});
4390 test::DnsTlsFrontend workableTls(addr1, "853", addr1, "53");
4391 test::DnsTlsFrontend unresponsiveTls(addr2, "853", addr2, "53");
4392 unresponsiveTls.setHangOnHandshakeForTesting(true);
4393 ASSERT_TRUE(workableTls.startServer());
4394 ASSERT_TRUE(unresponsiveTls.startServer());
4395
4396 // First setup.
4397 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4398 parcel.servers = {addr1, addr2, unusable_addr};
4399 parcel.tlsServers = {addr1, addr2, unusable_addr};
4400 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4401
4402 // Check the validation results.
4403 EXPECT_TRUE(WaitForPrivateDnsValidation(workableTls.listen_address(), true));
4404 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4405 EXPECT_EQ(unresponsiveTls.acceptConnectionsCount(), 1); // The validation is still in progress.
4406
4407 static const struct TestConfig {
4408 std::vector<std::string> tlsServers;
4409 std::string tlsName;
4410 } testConfigs[] = {
4411 {{addr1, addr2, unusable_addr}, ""},
4412 {{unusable_addr, addr1, addr2}, ""},
4413 {{unusable_addr, addr1, addr2}, kDefaultPrivateDnsHostName},
4414 {{addr1, addr2, unusable_addr}, kDefaultPrivateDnsHostName},
4415 };
4416
4417 std::string TlsNameLastTime;
4418 for (const auto& config : testConfigs) {
4419 SCOPED_TRACE(fmt::format("testConfig: [{}] [{}]", fmt::join(config.tlsServers, ","),
4420 config.tlsName));
4421 parcel.servers = config.tlsServers;
4422 parcel.tlsServers = config.tlsServers;
4423 parcel.tlsName = config.tlsName;
4424 parcel.caCertificate = config.tlsName.empty() ? "" : kCaCert;
4425
4426 const bool dnsModeChanged = (TlsNameLastTime != config.tlsName);
Mike Yubc4b9502020-03-20 13:14:00 +08004427
4428 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004429 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4430
4431 for (const auto& serverAddr : parcel.tlsServers) {
4432 SCOPED_TRACE(serverAddr);
4433 if (serverAddr == workableTls.listen_address()) {
4434 if (dnsModeChanged) {
4435 // In despite of the identical IP address, the server is regarded as a different
4436 // server when DnsTlsServer.name is different. The resolver treats it as a
4437 // different object and begins the validation process.
4438 EXPECT_TRUE(WaitForPrivateDnsValidation(serverAddr, true));
4439 }
4440 } else if (serverAddr == unresponsiveTls.listen_address()) {
4441 // No revalidation needed for the server which have been marked as in_progesss.
4442 } else {
4443 // Must be unusable_addr.
4444 // In opportunistic mode, when a validation for a private DNS server fails, the
4445 // resolver just marks the server as failed and doesn't re-evaluate it, but the
4446 // server can be re-evaluated when setResolverConfiguration() is called.
4447 // However, in strict mode, the resolver automatically re-evaluates the server and
4448 // marks the server as in_progress until the validation succeeds, so repeated setup
4449 // makes no effect.
4450 if (dnsModeChanged || config.tlsName.empty() /* not in strict mode */) {
4451 EXPECT_TRUE(WaitForPrivateDnsValidation(serverAddr, false));
4452 }
4453 }
4454 }
4455
4456 // Repeated setups make no effect in strict mode.
Mike Yubc4b9502020-03-20 13:14:00 +08004457 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004458 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4459 if (config.tlsName.empty()) {
4460 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4461 }
Mike Yubc4b9502020-03-20 13:14:00 +08004462 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004463 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4464 if (config.tlsName.empty()) {
4465 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4466 }
4467
4468 EXPECT_EQ(unresponsiveTls.acceptConnectionsCount(), 1);
4469
4470 TlsNameLastTime = config.tlsName;
4471 }
4472
4473 // Check that all the validation results are caught.
4474 // Note: it doesn't mean no validation being in progress.
4475 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr1));
4476 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr2));
4477 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(unusable_addr));
4478}
4479
4480TEST_F(ResolverTest, RepeatedSetup_KeepChangingPrivateDnsServers) {
4481 enum TlsServerState { WORKING, UNSUPPORTED, UNRESPONSIVE };
4482 const std::string addr1 = getUniqueIPv4Address();
4483 const std::string addr2 = getUniqueIPv4Address();
Mike Yu9a185882020-03-25 16:02:36 +08004484 const auto waitForPrivateDnsStateUpdated = []() {
4485 // A buffer time for PrivateDnsConfiguration to update its state. It prevents this test
4486 // being flaky. See b/152009023 for the reason.
4487 std::this_thread::sleep_for(20ms);
4488 };
Mike Yu153b5b82020-03-04 19:53:54 +08004489
4490 test::DNSResponder dns1(addr1);
4491 test::DNSResponder dns2(addr2);
4492 StartDns(dns1, {});
4493 StartDns(dns2, {});
4494 test::DnsTlsFrontend tls1(addr1, "853", addr1, "53");
4495 test::DnsTlsFrontend tls2(addr2, "853", addr2, "53");
4496 ASSERT_TRUE(tls1.startServer());
4497 ASSERT_TRUE(tls2.startServer());
4498
4499 static const struct TestConfig {
4500 std::string tlsServer;
4501 std::string tlsName;
4502 bool expectNothingHappenWhenServerUnsupported;
4503 bool expectNothingHappenWhenServerUnresponsive;
4504 std::string asTestName() const {
4505 return fmt::format("{}, {}, {}, {}", tlsServer, tlsName,
4506 expectNothingHappenWhenServerUnsupported,
4507 expectNothingHappenWhenServerUnresponsive);
4508 }
4509 } testConfigs[] = {
4510 {{addr1}, "", false, false},
4511 {{addr2}, "", false, false},
4512 {{addr1}, "", false, true},
4513 {{addr2}, "", false, true},
4514 {{addr1}, kDefaultPrivateDnsHostName, false, true},
4515 {{addr2}, kDefaultPrivateDnsHostName, false, true},
4516 {{addr1}, kDefaultPrivateDnsHostName, true, true},
4517 {{addr2}, kDefaultPrivateDnsHostName, true, true},
4518
4519 // There's no new validation to start because there are already two validation threads
4520 // running (one is for addr1, the other is for addr2). This is because the comparator
4521 // doesn't compare DnsTlsServer.name. Keep the design as-is until it's known to be
4522 // harmful.
4523 {{addr1}, "", true, true},
4524 {{addr2}, "", true, true},
4525 {{addr1}, "", true, true},
4526 {{addr2}, "", true, true},
4527 };
4528
4529 for (const auto& serverState : {WORKING, UNSUPPORTED, UNRESPONSIVE}) {
4530 int testIndex = 0;
4531 for (const auto& config : testConfigs) {
4532 SCOPED_TRACE(fmt::format("serverState:{} testIndex:{} testConfig:[{}]", serverState,
4533 testIndex++, config.asTestName()));
4534 auto& tls = (config.tlsServer == addr1) ? tls1 : tls2;
4535
4536 if (serverState == UNSUPPORTED && tls.running()) ASSERT_TRUE(tls.stopServer());
4537 if (serverState != UNSUPPORTED && !tls.running()) ASSERT_TRUE(tls.startServer());
4538
4539 tls.setHangOnHandshakeForTesting(serverState == UNRESPONSIVE);
4540 const int connectCountsBefore = tls.acceptConnectionsCount();
4541
Mike Yu9a185882020-03-25 16:02:36 +08004542 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004543 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4544 parcel.servers = {config.tlsServer};
4545 parcel.tlsServers = {config.tlsServer};
4546 parcel.tlsName = config.tlsName;
4547 parcel.caCertificate = config.tlsName.empty() ? "" : kCaCert;
4548 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4549
4550 if (serverState == WORKING) {
4551 EXPECT_TRUE(WaitForPrivateDnsValidation(config.tlsServer, true));
4552 } else if (serverState == UNSUPPORTED) {
4553 if (config.expectNothingHappenWhenServerUnsupported) {
4554 // It's possible that the resolver hasn't yet started to
4555 // connect. Wait a while.
4556 // TODO: See if we can get rid of the hard waiting time, such as comparing
4557 // the CountDiff across two tests.
4558 std::this_thread::sleep_for(100ms);
4559 EXPECT_EQ(tls.acceptConnectionsCount(), connectCountsBefore);
4560 } else {
4561 EXPECT_TRUE(WaitForPrivateDnsValidation(config.tlsServer, false));
4562 }
4563 } else {
4564 // Must be UNRESPONSIVE.
4565 // DnsTlsFrontend is the only signal for checking whether or not the resolver starts
4566 // another validation when the server is unresponsive.
4567 const int expectCountDiff =
4568 config.expectNothingHappenWhenServerUnresponsive ? 0 : 1;
4569 if (expectCountDiff == 0) {
4570 // It's possible that the resolver hasn't yet started to
4571 // connect. Wait a while.
4572 std::this_thread::sleep_for(100ms);
4573 }
4574 const auto condition = [&]() {
4575 return tls.acceptConnectionsCount() == connectCountsBefore + expectCountDiff;
4576 };
4577 EXPECT_TRUE(PollForCondition(condition));
4578 }
4579 }
4580
4581 // Set to off mode to reset the PrivateDnsConfiguration state.
4582 ResolverParamsParcel setupOffmode = DnsResponderClient::GetDefaultResolverParamsParcel();
4583 setupOffmode.tlsServers.clear();
4584 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(setupOffmode));
4585 }
4586
4587 // Check that all the validation results are caught.
4588 // Note: it doesn't mean no validation being in progress.
4589 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr1));
4590 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr2));
4591}
4592
Hungming Chenbb90ab32019-10-28 18:20:31 +08004593// Parameterized tests.
4594// TODO: Merge the existing tests as parameterized test if possible.
4595// TODO: Perhaps move parameterized tests to an independent file.
4596enum class CallType { GETADDRINFO, GETHOSTBYNAME };
4597class ResolverParameterizedTest : public ResolverTest,
Hungming Chen63779052019-10-30 15:06:13 +08004598 public testing::WithParamInterface<CallType> {
4599 protected:
Hungming Chen22617fd2019-12-06 12:15:45 +08004600 void VerifyQueryHelloExampleComV4(const test::DNSResponder& dns, const CallType calltype,
4601 const bool verifyNumQueries = true) {
Hungming Chen63779052019-10-30 15:06:13 +08004602 if (calltype == CallType::GETADDRINFO) {
4603 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4604 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4605 ASSERT_TRUE(result != nullptr);
4606 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4607 } else if (calltype == CallType::GETHOSTBYNAME) {
4608 const hostent* result = gethostbyname("hello");
4609 ASSERT_TRUE(result != nullptr);
4610 ASSERT_EQ(4, result->h_length);
4611 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
4612 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4613 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
4614 } else {
4615 FAIL() << "Unsupported call type: " << static_cast<uint32_t>(calltype);
4616 }
Hungming Chen22617fd2019-12-06 12:15:45 +08004617 if (verifyNumQueries) EXPECT_EQ(1U, GetNumQueries(dns, kHelloExampleCom));
Hungming Chen63779052019-10-30 15:06:13 +08004618 }
4619};
Hungming Chenbb90ab32019-10-28 18:20:31 +08004620
Hungming Chen63779052019-10-30 15:06:13 +08004621INSTANTIATE_TEST_SUITE_P(QueryCallTest, ResolverParameterizedTest,
Hungming Chenbb90ab32019-10-28 18:20:31 +08004622 testing::Values(CallType::GETADDRINFO, CallType::GETHOSTBYNAME),
4623 [](const testing::TestParamInfo<CallType>& info) {
Hungming Chenbb90ab32019-10-28 18:20:31 +08004624 switch (info.param) {
4625 case CallType::GETADDRINFO:
Hungming Chen63779052019-10-30 15:06:13 +08004626 return "GetAddrInfo";
Hungming Chenbb90ab32019-10-28 18:20:31 +08004627 case CallType::GETHOSTBYNAME:
Hungming Chen63779052019-10-30 15:06:13 +08004628 return "GetHostByName";
Hungming Chenbb90ab32019-10-28 18:20:31 +08004629 default:
Hungming Chen63779052019-10-30 15:06:13 +08004630 return "InvalidParameter"; // Should not happen.
Hungming Chenbb90ab32019-10-28 18:20:31 +08004631 }
Hungming Chenbb90ab32019-10-28 18:20:31 +08004632 });
4633
4634TEST_P(ResolverParameterizedTest, AuthoritySectionAndAdditionalSection) {
4635 // DNS response may have more information in authority section and additional section.
4636 // Currently, getanswer() of packages/modules/DnsResolver/getaddrinfo.cpp doesn't parse the
4637 // content of authority section and additional section. Test these sections if they crash
4638 // the resolver, just in case. See also RFC 1035 section 4.1.
4639 const auto& calltype = GetParam();
4640 test::DNSHeader header(kDefaultDnsHeader);
4641
4642 // Create a DNS response which has a authoritative nameserver record in authority
4643 // section and its relevant address record in additional section.
4644 //
4645 // Question
4646 // hello.example.com. IN A
4647 // Answer
4648 // hello.example.com. IN A 1.2.3.4
4649 // Authority:
4650 // hello.example.com. IN NS ns1.example.com.
4651 // Additional:
4652 // ns1.example.com. IN A 5.6.7.8
4653 //
4654 // A response may have only question, answer, and authority section. Current testing response
4655 // should be able to cover this condition.
4656
4657 // Question section.
4658 test::DNSQuestion question{
4659 .qname = {.name = kHelloExampleCom},
4660 .qtype = ns_type::ns_t_a,
4661 .qclass = ns_c_in,
4662 };
4663 header.questions.push_back(std::move(question));
4664
4665 // Answer section.
4666 test::DNSRecord recordAnswer{
4667 .name = {.name = kHelloExampleCom},
4668 .rtype = ns_type::ns_t_a,
4669 .rclass = ns_c_in,
4670 .ttl = 0, // no cache
4671 };
Hungming Chen63779052019-10-30 15:06:13 +08004672 EXPECT_TRUE(test::DNSResponder::fillRdata(kHelloExampleComAddrV4, recordAnswer));
Hungming Chenbb90ab32019-10-28 18:20:31 +08004673 header.answers.push_back(std::move(recordAnswer));
4674
4675 // Authority section.
4676 test::DNSRecord recordAuthority{
4677 .name = {.name = kHelloExampleCom},
4678 .rtype = ns_type::ns_t_ns,
4679 .rclass = ns_c_in,
4680 .ttl = 0, // no cache
4681 };
4682 EXPECT_TRUE(test::DNSResponder::fillRdata("ns1.example.com.", recordAuthority));
4683 header.authorities.push_back(std::move(recordAuthority));
4684
4685 // Additional section.
4686 test::DNSRecord recordAdditional{
4687 .name = {.name = "ns1.example.com."},
4688 .rtype = ns_type::ns_t_a,
4689 .rclass = ns_c_in,
4690 .ttl = 0, // no cache
4691 };
4692 EXPECT_TRUE(test::DNSResponder::fillRdata("5.6.7.8", recordAdditional));
4693 header.additionals.push_back(std::move(recordAdditional));
4694
4695 // Start DNS server.
4696 test::DNSResponder dns(test::DNSResponder::MappingType::DNS_HEADER);
4697 dns.addMappingDnsHeader(kHelloExampleCom, ns_type::ns_t_a, header);
4698 ASSERT_TRUE(dns.startServer());
4699 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4700 dns.clearQueries();
4701
4702 // Expect that get the address and the resolver doesn't crash.
Hungming Chen63779052019-10-30 15:06:13 +08004703 VerifyQueryHelloExampleComV4(dns, calltype);
4704}
4705
4706TEST_P(ResolverParameterizedTest, MessageCompression) {
4707 const auto& calltype = GetParam();
4708
4709 // The response with compressed domain name by a pointer. See RFC 1035 section 4.1.4.
4710 //
4711 // Ignoring the other fields of the message, the domain name of question section and answer
4712 // section are presented as:
4713 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4714 // 12 | 5 | h |
4715 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4716 // 14 | e | l |
4717 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4718 // 16 | l | o |
4719 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4720 // 18 | 7 | e |
4721 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4722 // 20 | x | a |
4723 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4724 // 22 | m | p |
4725 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4726 // 24 | l | e |
4727 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4728 // 26 | 3 | c |
4729 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4730 // 28 | o | m |
4731 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4732 // 30 | 0 | ... |
4733 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4734 //
4735 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4736 // 35 | 1 1| 12 |
4737 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4738 const std::vector<uint8_t> kResponseAPointer = {
4739 /* Header */
4740 0x00, 0x00, /* Transaction ID: 0x0000 */
4741 0x81, 0x80, /* Flags: qr rd ra */
4742 0x00, 0x01, /* Questions: 1 */
4743 0x00, 0x01, /* Answer RRs: 1 */
4744 0x00, 0x00, /* Authority RRs: 0 */
4745 0x00, 0x00, /* Additional RRs: 0 */
4746 /* Queries */
4747 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
4748 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name: hello.example.com */
4749 0x00, 0x01, /* Type: A */
4750 0x00, 0x01, /* Class: IN */
4751 /* Answers */
4752 0xc0, 0x0c, /* Name: hello.example.com (a pointer) */
4753 0x00, 0x01, /* Type: A */
4754 0x00, 0x01, /* Class: IN */
4755 0x00, 0x00, 0x00, 0x00, /* Time to live: 0 */
4756 0x00, 0x04, /* Data length: 4 */
4757 0x01, 0x02, 0x03, 0x04 /* Address: 1.2.3.4 */
4758 };
4759
4760 // The response with compressed domain name by a sequence of labels ending with a pointer. See
4761 // RFC 1035 section 4.1.4.
4762 //
4763 // Ignoring the other fields of the message, the domain name of question section and answer
4764 // section are presented as:
4765 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4766 // 12 | 5 | h |
4767 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4768 // 14 | e | l |
4769 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4770 // 16 | l | o |
4771 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4772 // 18 | 7 | e |
4773 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4774 // 20 | x | a |
4775 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4776 // 22 | m | p |
4777 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4778 // 24 | l | e |
4779 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4780 // 26 | 3 | c |
4781 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4782 // 28 | o | m |
4783 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4784 // 30 | 0 | ... |
4785 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4786 //
4787 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4788 // 35 | 5 | h |
4789 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4790 // 37 | e | l |
4791 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4792 // 39 | l | o |
4793 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4794 // 41 | 1 1| 18 |
4795 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4796 const std::vector<uint8_t> kResponseLabelEndingWithAPointer = {
4797 /* Header */
4798 0x00, 0x00, /* Transaction ID: 0x0000 */
4799 0x81, 0x80, /* Flags: qr rd ra */
4800 0x00, 0x01, /* Questions: 1 */
4801 0x00, 0x01, /* Answer RRs: 1 */
4802 0x00, 0x00, /* Authority RRs: 0 */
4803 0x00, 0x00, /* Additional RRs: 0 */
4804 /* Queries */
4805 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
4806 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name: hello.example.com */
4807 0x00, 0x01, /* Type: A */
4808 0x00, 0x01, /* Class: IN */
4809 /* Answers */
4810 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0xc0,
4811 0x12, /* Name: hello.example.com (a label ending with a pointer) */
4812 0x00, 0x01, /* Type: A */
4813 0x00, 0x01, /* Class: IN */
4814 0x00, 0x00, 0x00, 0x00, /* Time to live: 0 */
4815 0x00, 0x04, /* Data length: 4 */
4816 0x01, 0x02, 0x03, 0x04 /* Address: 1.2.3.4 */
4817 };
4818
4819 for (const auto& response : {kResponseAPointer, kResponseLabelEndingWithAPointer}) {
4820 SCOPED_TRACE(StringPrintf("Hex dump: %s", toHex(makeSlice(response)).c_str()));
4821
4822 test::DNSResponder dns(test::DNSResponder::MappingType::BINARY_PACKET);
4823 dns.addMappingBinaryPacket(kHelloExampleComQueryV4, response);
4824 StartDns(dns, {});
4825 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4826
4827 // Expect no cache because the TTL of testing responses are 0.
4828 VerifyQueryHelloExampleComV4(dns, calltype);
Hungming Chenbb90ab32019-10-28 18:20:31 +08004829 }
Mike Yu40e67072019-10-09 21:14:09 +08004830}
Hungming Chen22617fd2019-12-06 12:15:45 +08004831
4832TEST_P(ResolverParameterizedTest, TruncatedResponse) {
4833 const auto& calltype = GetParam();
4834
Hungming Chen22617fd2019-12-06 12:15:45 +08004835 test::DNSResponder dns;
Ken Chen99344882020-01-01 14:59:38 +08004836 StartDns(dns, kLargeCnameChainRecords);
Hungming Chen22617fd2019-12-06 12:15:45 +08004837 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4838
4839 // Expect UDP response is truncated. The resolver retries over TCP. See RFC 1035 section 4.2.1.
4840 VerifyQueryHelloExampleComV4(dns, calltype, false);
4841 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom));
4842 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom));
4843}
Luke Huang420ee622019-11-27 17:52:44 +08004844
4845TEST_F(ResolverTest, KeepListeningUDP) {
4846 constexpr char listen_addr1[] = "127.0.0.4";
4847 constexpr char listen_addr2[] = "127.0.0.5";
4848 constexpr char host_name[] = "howdy.example.com.";
4849 const std::vector<DnsRecord> records = {
4850 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
4851 };
4852 const std::vector<int> params = {300, 25, 8, 8, 1000 /* BASE_TIMEOUT_MSEC */,
4853 1 /* retry count */};
4854 const int delayTimeMs = 1500;
4855
4856 test::DNSResponder neverRespondDns(listen_addr2, "53", static_cast<ns_rcode>(-1));
4857 neverRespondDns.setResponseProbability(0.0);
4858 StartDns(neverRespondDns, records);
Luke Huangf40df9c2020-04-21 08:51:48 +08004859 ScopedSystemProperties scopedSystemProperties(
4860 "persist.device_config.netd_native.keep_listening_udp", "1");
4861 // Re-setup test network to make experiment flag take effect.
4862 resetNetwork();
Luke Huang420ee622019-11-27 17:52:44 +08004863
4864 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr1, listen_addr2},
4865 kDefaultSearchDomains, params));
4866 // There are 2 DNS servers for this test.
4867 // |delayedDns| will be blocked for |delayTimeMs|, then start to respond to requests.
4868 // |neverRespondDns| will never respond.
4869 // In the first try, resolver will send query to |delayedDns| but get timeout error
4870 // because |delayTimeMs| > DNS timeout.
4871 // Then it's the second try, resolver will send query to |neverRespondDns| and
4872 // listen on both servers. Resolver will receive the answer coming from |delayedDns|.
Luke Huang420ee622019-11-27 17:52:44 +08004873
Luke Huang420ee622019-11-27 17:52:44 +08004874 test::DNSResponder delayedDns(listen_addr1);
4875 delayedDns.setResponseDelayMs(delayTimeMs);
4876 StartDns(delayedDns, records);
4877
4878 // Specify hints to ensure resolver doing query only 1 round.
4879 const addrinfo hints = {.ai_family = AF_INET6, .ai_socktype = SOCK_DGRAM};
4880 ScopedAddrinfo result = safe_getaddrinfo(host_name, nullptr, &hints);
4881 EXPECT_TRUE(result != nullptr);
4882
4883 std::string result_str = ToString(result);
4884 EXPECT_TRUE(result_str == "::1.2.3.4") << ", result_str='" << result_str << "'";
4885}
Luke Huang0a0870d2020-02-12 20:41:10 +08004886
4887TEST_F(ResolverTest, GetAddrInfoParallelLookupTimeout) {
4888 constexpr char listen_addr[] = "127.0.0.4";
4889 constexpr char host_name[] = "howdy.example.com.";
4890 constexpr int TIMING_TOLERANCE_MS = 200;
4891 constexpr int DNS_TIMEOUT_MS = 1000;
4892 const std::vector<DnsRecord> records = {
4893 {host_name, ns_type::ns_t_a, "1.2.3.4"},
4894 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
4895 };
4896 const std::vector<int> params = {300, 25, 8, 8, DNS_TIMEOUT_MS /* BASE_TIMEOUT_MSEC */,
4897 1 /* retry count */};
4898 test::DNSResponder neverRespondDns(listen_addr, "53", static_cast<ns_rcode>(-1));
4899 neverRespondDns.setResponseProbability(0.0);
4900 StartDns(neverRespondDns, records);
Luke Huangf40df9c2020-04-21 08:51:48 +08004901 ScopedSystemProperties scopedSystemProperties(
4902 "persist.device_config.netd_native.parallel_lookup", "1");
Luke Huangd1d734f2020-04-30 12:25:40 +08004903 // The default value of parallel_lookup_sleep_time should be very small
4904 // that we can ignore in this test case.
Luke Huangf40df9c2020-04-21 08:51:48 +08004905 // Re-setup test network to make experiment flag take effect.
4906 resetNetwork();
Luke Huang0a0870d2020-02-12 20:41:10 +08004907
4908 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}, kDefaultSearchDomains, params));
4909 neverRespondDns.clearQueries();
4910
Luke Huang0a0870d2020-02-12 20:41:10 +08004911 // Use a never respond DNS server to verify if the A/AAAA queries are sent in parallel.
4912 // The resolver parameters are set to timeout 1s and retry 1 times.
4913 // So we expect the safe_getaddrinfo_time_taken() might take ~1s to
4914 // return when parallel lookup is enabled. And the DNS server should receive 2 queries.
4915 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_DGRAM};
4916 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(host_name, nullptr, hints);
4917
4918 EXPECT_TRUE(result == nullptr);
4919 EXPECT_NEAR(DNS_TIMEOUT_MS, timeTakenMs, TIMING_TOLERANCE_MS)
4920 << "took time should approximate equal timeout";
4921 EXPECT_EQ(2U, GetNumQueries(neverRespondDns, host_name));
4922}
Luke Huangd1d734f2020-04-30 12:25:40 +08004923
4924TEST_F(ResolverTest, GetAddrInfoParallelLookupSleepTime) {
4925 constexpr char listen_addr[] = "127.0.0.4";
4926 constexpr int TIMING_TOLERANCE_MS = 200;
4927 const std::vector<DnsRecord> records = {
4928 {kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4},
4929 {kHelloExampleCom, ns_type::ns_t_aaaa, kHelloExampleComAddrV6},
4930 };
4931 const std::vector<int> params = {300, 25, 8, 8, 1000 /* BASE_TIMEOUT_MSEC */,
4932 1 /* retry count */};
4933 test::DNSResponder dns(listen_addr);
4934 StartDns(dns, records);
4935 ScopedSystemProperties scopedSystemProperties1(
4936 "persist.device_config.netd_native.parallel_lookup", "1");
4937 constexpr int PARALLEL_LOOKUP_SLEEP_TIME_MS = 500;
4938 ScopedSystemProperties scopedSystemProperties2(
4939 "persist.device_config.netd_native.parallel_lookup_sleep_time",
4940 std::to_string(PARALLEL_LOOKUP_SLEEP_TIME_MS));
4941 // Re-setup test network to make experiment flag take effect.
4942 resetNetwork();
4943
4944 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}, kDefaultSearchDomains, params));
4945 dns.clearQueries();
4946
4947 // Expect the safe_getaddrinfo_time_taken() might take ~500ms to return because we set
4948 // parallel_lookup_sleep_time to 500ms.
4949 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_DGRAM};
4950 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(kHelloExampleCom, nullptr, hints);
4951
4952 EXPECT_NE(nullptr, result);
4953 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(
4954 {kHelloExampleComAddrV4, kHelloExampleComAddrV6}));
4955 EXPECT_NEAR(PARALLEL_LOOKUP_SLEEP_TIME_MS, timeTakenMs, TIMING_TOLERANCE_MS)
4956 << "took time should approximate equal timeout";
4957 EXPECT_EQ(2U, GetNumQueries(dns, kHelloExampleCom));
4958
4959 // Expect the PARALLEL_LOOKUP_SLEEP_TIME_MS won't affect the query under cache hit case.
4960 dns.clearQueries();
4961 std::tie(result, timeTakenMs) = safe_getaddrinfo_time_taken(kHelloExampleCom, nullptr, hints);
4962 EXPECT_NE(nullptr, result);
4963 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(
4964 {kHelloExampleComAddrV4, kHelloExampleComAddrV6}));
4965 EXPECT_GT(PARALLEL_LOOKUP_SLEEP_TIME_MS, timeTakenMs);
4966 EXPECT_EQ(0U, GetNumQueries(dns, kHelloExampleCom));
4967}
Luke Huangeb618ef2020-05-26 14:17:02 +08004968
4969TEST_F(ResolverTest, BlockDnsQueryUidDoesNotLeadToBadServer) {
4970 // This test relies on blocking traffic on loopback, which xt_qtaguid does not do.
4971 // See aosp/358413 and b/34444781 for why.
4972 SKIP_IF_BPF_NOT_SUPPORTED;
4973
4974 constexpr char listen_addr1[] = "127.0.0.4";
4975 constexpr char listen_addr2[] = "::1";
4976 test::DNSResponder dns1(listen_addr1);
4977 test::DNSResponder dns2(listen_addr2);
4978 StartDns(dns1, {});
4979 StartDns(dns2, {});
4980
4981 std::vector<std::string> servers = {listen_addr1, listen_addr2};
4982 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
4983 dns1.clearQueries();
4984 dns2.clearQueries();
4985 {
4986 ScopeBlockedUIDRule scopeBlockUidRule(mDnsClient.netdService(), TEST_UID);
4987 // Start querying ten times.
4988 for (int i = 0; i < 10; i++) {
4989 std::string hostName = fmt::format("blocked{}.com", i);
4990 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4991 EXPECT_EQ(safe_getaddrinfo(hostName.c_str(), nullptr, &hints), nullptr);
4992 }
4993 }
4994 // Since all query packets are blocked, we should not see any stats of them.
4995 const std::vector<NameserverStats> expectedEmptyDnsStats = {
4996 NameserverStats(listen_addr1),
4997 NameserverStats(listen_addr2),
4998 };
4999 expectStatsFromGetResolverInfo(expectedEmptyDnsStats);
5000 EXPECT_EQ(dns1.queries().size(), 0U);
5001 EXPECT_EQ(dns2.queries().size(), 0U);
5002}