blob: 236b0315ea30767b914216c8fa757e49839d792e [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 Huang27616fe2020-05-26 17:31:15 +080056#include <DnsProxydProtocol.h> // NETID_USE_LOCAL_NAMESERVERS
Luke Huangf8215372019-11-22 11:53:41 +080057#include <aidl/android/net/IDnsResolver.h>
58#include <android/binder_manager.h>
59#include <android/binder_process.h>
Bernie Innocenti41b82c42019-06-05 22:38:25 +090060#include "NetdClient.h"
Bernie Innocenti41b82c42019-06-05 22:38:25 +090061#include "ResolverStats.h"
Luke Huangf8215372019-11-22 11:53:41 +080062#include "netid_client.h" // NETID_UNSET
63#include "params.h" // MAXNS
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +090064#include "test_utils.h"
Hungming Chene8f970c2019-04-10 17:34:06 +080065#include "tests/dns_metrics_listener/dns_metrics_listener.h"
chenbruceb43ec752019-07-24 20:19:41 +080066#include "tests/dns_responder/dns_responder.h"
Luke Huangf8215372019-11-22 11:53:41 +080067#include "tests/dns_responder/dns_responder_client_ndk.h"
Hungming Chenc6556622019-10-02 16:01:07 +080068#include "tests/dns_responder/dns_tls_certificate.h"
chenbruceb43ec752019-07-24 20:19:41 +080069#include "tests/dns_responder/dns_tls_frontend.h"
Luke Huangfde82482019-06-04 01:04:53 +080070#include "tests/resolv_test_utils.h"
Ken Chenb9fa2062018-11-13 21:51:13 +080071
Luke Huang0d592bc2019-05-25 18:24:03 +080072// Valid VPN netId range is 100 ~ 65535
73constexpr int TEST_VPN_NETID = 65502;
Luke Huang94b10b92018-11-21 20:13:38 +080074constexpr int MAXPACKET = (8 * 1024);
Ken Chenb9fa2062018-11-13 21:51:13 +080075
76// Semi-public Bionic hook used by the NDK (frameworks/base/native/android/net.c)
77// Tested here for convenience.
78extern "C" int android_getaddrinfofornet(const char* hostname, const char* servname,
79 const addrinfo* hints, unsigned netid, unsigned mark,
80 struct addrinfo** result);
81
Mike Yuc0000252020-03-19 07:14:23 +000082using namespace std::chrono_literals;
83
Luke Huang70070852019-11-25 18:25:50 +080084using aidl::android::net::IDnsResolver;
Luke Huangf8215372019-11-22 11:53:41 +080085using aidl::android::net::INetd;
Mike Yu8ac63402019-12-02 15:28:38 +080086using aidl::android::net::ResolverParamsParcel;
Luke Huang9807e6b2019-05-20 16:17:12 +080087using android::base::ParseInt;
Ken Chenb9fa2062018-11-13 21:51:13 +080088using android::base::StringPrintf;
Luke Huang9807e6b2019-05-20 16:17:12 +080089using android::base::unique_fd;
Ken Chenb9fa2062018-11-13 21:51:13 +080090using android::net::ResolverStats;
Hungming Chene8f970c2019-04-10 17:34:06 +080091using android::net::metrics::DnsMetricsListener;
Ken Chenb9fa2062018-11-13 21:51:13 +080092using android::netdutils::enableSockopt;
Hungming Chen63779052019-10-30 15:06:13 +080093using android::netdutils::makeSlice;
Luke Huang9807e6b2019-05-20 16:17:12 +080094using android::netdutils::ResponseCode;
Luke Huang9d2d25b2019-06-14 00:34:05 +080095using android::netdutils::ScopedAddrinfo;
Mike Yu40e67072019-10-09 21:14:09 +080096using android::netdutils::Stopwatch;
Hungming Chen63779052019-10-30 15:06:13 +080097using android::netdutils::toHex;
Ken Chenb9fa2062018-11-13 21:51:13 +080098
99// TODO: move into libnetdutils?
100namespace {
Luke Huangfde82482019-06-04 01:04:53 +0800101
Ken Chenb9fa2062018-11-13 21:51:13 +0800102ScopedAddrinfo safe_getaddrinfo(const char* node, const char* service,
103 const struct addrinfo* hints) {
104 addrinfo* result = nullptr;
105 if (getaddrinfo(node, service, hints, &result) != 0) {
106 result = nullptr; // Should already be the case, but...
107 }
108 return ScopedAddrinfo(result);
109}
Luke Huangfde82482019-06-04 01:04:53 +0800110
Mike Yu40e67072019-10-09 21:14:09 +0800111std::pair<ScopedAddrinfo, int> safe_getaddrinfo_time_taken(const char* node, const char* service,
112 const addrinfo& hints) {
113 Stopwatch s;
114 ScopedAddrinfo result = safe_getaddrinfo(node, service, &hints);
115 return {std::move(result), s.timeTakenUs() / 1000};
116}
117
Mike Yuc0000252020-03-19 07:14:23 +0000118struct NameserverStats {
119 NameserverStats() = delete;
120 NameserverStats(const std::string server) : server(server) {}
121 NameserverStats& setSuccesses(int val) {
122 successes = val;
123 return *this;
124 }
125 NameserverStats& setErrors(int val) {
126 errors = val;
127 return *this;
128 }
129 NameserverStats& setTimeouts(int val) {
130 timeouts = val;
131 return *this;
132 }
133 NameserverStats& setInternalErrors(int val) {
134 internal_errors = val;
135 return *this;
136 }
137
138 const std::string server;
139 int successes = 0;
140 int errors = 0;
141 int timeouts = 0;
142 int internal_errors = 0;
143};
144
Ken Chenb9fa2062018-11-13 21:51:13 +0800145} // namespace
146
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900147class ResolverTest : public ::testing::Test {
Hungming Chene8f970c2019-04-10 17:34:06 +0800148 public:
Automerger Merge Worker19a291b2020-03-17 02:41:30 +0000149 static void SetUpTestSuite() {
Hungming Chen5bf09772019-04-25 11:16:13 +0800150 // Get binder service.
151 // Note that |mDnsClient| is not used for getting binder service in this static function.
152 // The reason is that wants to keep |mDnsClient| as a non-static data member. |mDnsClient|
153 // which sets up device network configuration could be independent from every test.
Luke Huangf8215372019-11-22 11:53:41 +0800154 // TODO: Perhaps add a static function in resolv_test_binder_utils.{cpp,h} to get binder
155 // service.
156
157 AIBinder* binder = AServiceManager_getService("dnsresolver");
158 ndk::SpAIBinder resolvBinder = ndk::SpAIBinder(binder);
159 auto resolvService = aidl::android::net::IDnsResolver::fromBinder(resolvBinder);
Hungming Chen5bf09772019-04-25 11:16:13 +0800160 ASSERT_NE(nullptr, resolvService.get());
161
162 // Subscribe the death recipient to the service IDnsResolver for detecting Netd death.
Luke Huang70070852019-11-25 18:25:50 +0800163 // GTEST assertion macros are not invoked for generating a test failure in the death
164 // recipient because the macros can't indicate failed test if Netd died between tests.
165 // Moreover, continuing testing may have no meaningful after Netd death. Therefore, the
166 // death recipient aborts process by GTEST_LOG_(FATAL) once Netd died.
Luke Huangf8215372019-11-22 11:53:41 +0800167 sResolvDeathRecipient = AIBinder_DeathRecipient_new([](void*) {
168 constexpr char errorMessage[] = "Netd died";
169 LOG(ERROR) << errorMessage;
170 GTEST_LOG_(FATAL) << errorMessage;
171 });
172 ASSERT_EQ(STATUS_OK, AIBinder_linkToDeath(binder, sResolvDeathRecipient, nullptr));
Hungming Chen5bf09772019-04-25 11:16:13 +0800173
174 // Subscribe the DNS listener for verifying DNS metrics event contents.
Luke Huangf8215372019-11-22 11:53:41 +0800175 sDnsMetricsListener = ndk::SharedRefBase::make<DnsMetricsListener>(
176 TEST_NETID /*monitor specific network*/);
Hungming Chen5bf09772019-04-25 11:16:13 +0800177 ASSERT_TRUE(resolvService->registerEventListener(sDnsMetricsListener).isOk());
178
179 // Start the binder thread pool for listening DNS metrics events and receiving death
180 // recipient.
Luke Huangf8215372019-11-22 11:53:41 +0800181 ABinderProcess_startThreadPool();
Hungming Chene8f970c2019-04-10 17:34:06 +0800182 }
Automerger Merge Worker19a291b2020-03-17 02:41:30 +0000183 static void TearDownTestSuite() { AIBinder_DeathRecipient_delete(sResolvDeathRecipient); }
Hungming Chene8f970c2019-04-10 17:34:06 +0800184
Ken Chenb9fa2062018-11-13 21:51:13 +0800185 protected:
Lorenzo Colitti5be8bf22020-05-26 10:55:21 +0000186 void SetUp() {
187 mDnsClient.SetUp();
188 sDnsMetricsListener->reset();
189 }
190
Mike Yu960243d2020-01-17 19:02:15 +0800191 void TearDown() {
192 // Ensure the dump works at the end of each test.
193 DumpResolverService();
194
195 mDnsClient.TearDown();
196 }
nuccachena26cc2a2018-07-17 18:07:23 +0800197
Luke Huang68fa5002020-04-23 15:48:47 +0000198 void resetNetwork() {
199 mDnsClient.TearDown();
200 mDnsClient.SetupOemNetwork();
201 }
202
Xiao Ma09b71022018-12-11 17:56:32 +0900203 void StartDns(test::DNSResponder& dns, const std::vector<DnsRecord>& records) {
204 for (const auto& r : records) {
205 dns.addMapping(r.host_name, r.type, r.addr);
206 }
207
208 ASSERT_TRUE(dns.startServer());
209 dns.clearQueries();
210 }
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900211
Mike Yu960243d2020-01-17 19:02:15 +0800212 void DumpResolverService() {
213 unique_fd fd(open("/dev/null", O_WRONLY));
214 EXPECT_EQ(mDnsClient.resolvService()->dump(fd, nullptr, 0), 0);
215
216 const char* querylogCmd[] = {"querylog"}; // Keep it sync with DnsQueryLog::DUMP_KEYWORD.
217 EXPECT_EQ(mDnsClient.resolvService()->dump(fd, querylogCmd, std::size(querylogCmd)), 0);
218 }
219
Hungming Chene8f970c2019-04-10 17:34:06 +0800220 bool WaitForNat64Prefix(ExpectNat64PrefixStatus status,
221 std::chrono::milliseconds timeout = std::chrono::milliseconds(1000)) {
Hungming Chen5bf09772019-04-25 11:16:13 +0800222 return sDnsMetricsListener->waitForNat64Prefix(status, timeout);
Hungming Chene8f970c2019-04-10 17:34:06 +0800223 }
224
Mike Yu724f77d2019-08-16 11:14:50 +0800225 bool WaitForPrivateDnsValidation(std::string serverAddr, bool validated) {
226 return sDnsMetricsListener->waitForPrivateDnsValidation(serverAddr, validated);
227 }
228
Mike Yuc0000252020-03-19 07:14:23 +0000229 bool hasUncaughtPrivateDnsValidation(const std::string& serverAddr) {
230 return sDnsMetricsListener->findValidationRecord(serverAddr);
231 }
232
233 bool expectStatsFromGetResolverInfo(const std::vector<NameserverStats>& nameserversStats) {
234 std::vector<std::string> res_servers;
235 std::vector<std::string> res_domains;
236 std::vector<std::string> res_tls_servers;
237 res_params res_params;
238 std::vector<ResolverStats> res_stats;
239 int wait_for_pending_req_timeout_count;
240
241 if (!DnsResponderClient::GetResolverInfo(mDnsClient.resolvService(), TEST_NETID,
242 &res_servers, &res_domains, &res_tls_servers,
243 &res_params, &res_stats,
244 &wait_for_pending_req_timeout_count)) {
245 ADD_FAILURE() << "GetResolverInfo failed";
246 return false;
247 }
248
249 if (res_servers.size() != res_stats.size()) {
250 ADD_FAILURE() << fmt::format("res_servers.size() != res_stats.size(): {} != {}",
251 res_servers.size(), res_stats.size());
252 return false;
253 }
254 if (res_servers.size() != nameserversStats.size()) {
255 ADD_FAILURE() << fmt::format("res_servers.size() != nameserversStats.size(): {} != {}",
256 res_servers.size(), nameserversStats.size());
257 return false;
258 }
259
260 for (const auto& stats : nameserversStats) {
261 SCOPED_TRACE(stats.server);
262 const auto it = std::find(res_servers.begin(), res_servers.end(), stats.server);
263 if (it == res_servers.end()) {
264 ADD_FAILURE() << fmt::format("nameserver {} not found in the list {{{}}}",
265 stats.server, fmt::join(res_servers, ", "));
266 return false;
267 }
268 const int index = std::distance(res_servers.begin(), it);
269
270 // The check excludes rtt_avg, last_sample_time, and usable since they will be obsolete
271 // after |res_stats| is retrieved from NetConfig.dnsStats rather than NetConfig.nsstats.
272 EXPECT_EQ(res_stats[index].successes, stats.successes);
273 EXPECT_EQ(res_stats[index].errors, stats.errors);
274 EXPECT_EQ(res_stats[index].timeouts, stats.timeouts);
275 EXPECT_EQ(res_stats[index].internal_errors, stats.internal_errors);
276 }
277
278 return true;
279 }
280
281 // Since there's no way to terminate private DNS validation threads at any time. Tests that
282 // focus on the results of private DNS validation can interfere with each other if they use the
283 // same IP address for test servers. getUniqueIPv4Address() is a workaround to reduce the
284 // possibility of tests being flaky. A feasible solution is to forbid the validation threads,
285 // which are considered as outdated (e.g. switch the resolver to private DNS OFF mode), updating
286 // the result to the PrivateDnsConfiguration instance.
287 static std::string getUniqueIPv4Address() {
288 static int counter = 0;
289 return fmt::format("127.0.100.{}", (++counter & 0xff));
290 }
291
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900292 DnsResponderClient mDnsClient;
Xiao Ma09b71022018-12-11 17:56:32 +0900293
Hungming Chen5bf09772019-04-25 11:16:13 +0800294 // Use a shared static DNS listener for all tests to avoid registering lots of listeners
295 // which may be released late until process terminated. Currently, registered DNS listener
296 // is removed by binder death notification which is fired when the process hosting an
297 // IBinder has gone away. If every test in ResolverTest registers its DNS listener, Netd
298 // may temporarily hold lots of dead listeners until the unit test process terminates.
299 // TODO: Perhaps add an unregistering listener binder call or fork a listener process which
300 // could be terminated earlier.
Luke Huangf8215372019-11-22 11:53:41 +0800301 static std::shared_ptr<DnsMetricsListener>
Automerger Merge Worker19a291b2020-03-17 02:41:30 +0000302 sDnsMetricsListener; // Initialized in SetUpTestSuite.
Hungming Chen5bf09772019-04-25 11:16:13 +0800303
304 // Use a shared static death recipient to monitor the service death. The static death
305 // recipient could monitor the death not only during the test but also between tests.
Automerger Merge Worker19a291b2020-03-17 02:41:30 +0000306 static AIBinder_DeathRecipient* sResolvDeathRecipient; // Initialized in SetUpTestSuite.
Ken Chenb9fa2062018-11-13 21:51:13 +0800307};
308
Hungming Chen5bf09772019-04-25 11:16:13 +0800309// Initialize static member of class.
Luke Huangf8215372019-11-22 11:53:41 +0800310std::shared_ptr<DnsMetricsListener> ResolverTest::sDnsMetricsListener;
311AIBinder_DeathRecipient* ResolverTest::sResolvDeathRecipient;
Hungming Chen5bf09772019-04-25 11:16:13 +0800312
Ken Chenb9fa2062018-11-13 21:51:13 +0800313TEST_F(ResolverTest, GetHostByName) {
Xiao Ma09b71022018-12-11 17:56:32 +0900314 constexpr char nonexistent_host_name[] = "nonexistent.example.com.";
315
316 test::DNSResponder dns;
317 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.3"}});
318 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800319
320 const hostent* result;
Ken Chenb9fa2062018-11-13 21:51:13 +0800321 result = gethostbyname("nonexistent");
322 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, nonexistent_host_name));
323 ASSERT_TRUE(result == nullptr);
324 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
325
326 dns.clearQueries();
327 result = gethostbyname("hello");
Xiao Ma09b71022018-12-11 17:56:32 +0900328 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
Ken Chenb9fa2062018-11-13 21:51:13 +0800329 ASSERT_FALSE(result == nullptr);
330 ASSERT_EQ(4, result->h_length);
331 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
332 EXPECT_EQ("1.2.3.3", ToString(result));
333 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800334}
335
lifr4e4a2e02019-01-29 16:53:51 +0800336TEST_F(ResolverTest, GetHostByName_cnames) {
337 constexpr char host_name[] = "host.example.com.";
338 size_t cnamecount = 0;
339 test::DNSResponder dns;
340
341 const std::vector<DnsRecord> records = {
342 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
343 {"a.example.com.", ns_type::ns_t_cname, "b.example.com."},
344 {"b.example.com.", ns_type::ns_t_cname, "c.example.com."},
345 {"c.example.com.", ns_type::ns_t_cname, "d.example.com."},
346 {"d.example.com.", ns_type::ns_t_cname, "e.example.com."},
347 {"e.example.com.", ns_type::ns_t_cname, host_name},
348 {host_name, ns_type::ns_t_a, "1.2.3.3"},
349 {host_name, ns_type::ns_t_aaaa, "2001:db8::42"},
350 };
351 StartDns(dns, records);
352 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
353
354 // using gethostbyname2() to resolve ipv4 hello.example.com. to 1.2.3.3
355 // Ensure the v4 address and cnames are correct
356 const hostent* result;
357 result = gethostbyname2("hello", AF_INET);
358 ASSERT_FALSE(result == nullptr);
359
360 for (int i = 0; result != nullptr && result->h_aliases[i] != nullptr; i++) {
361 std::string domain_name = records[i].host_name.substr(0, records[i].host_name.size() - 1);
362 EXPECT_EQ(result->h_aliases[i], domain_name);
363 cnamecount++;
364 }
365 // The size of "Non-cname type" record in DNS records is 2
366 ASSERT_EQ(cnamecount, records.size() - 2);
367 ASSERT_EQ(4, result->h_length);
368 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
369 EXPECT_EQ("1.2.3.3", ToString(result));
370 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
371 EXPECT_EQ(1U, dns.queries().size()) << dns.dumpQueries();
372
373 // using gethostbyname2() to resolve ipv6 hello.example.com. to 2001:db8::42
374 // Ensure the v6 address and cnames are correct
375 cnamecount = 0;
376 dns.clearQueries();
377 result = gethostbyname2("hello", AF_INET6);
378 for (unsigned i = 0; result != nullptr && result->h_aliases[i] != nullptr; i++) {
379 std::string domain_name = records[i].host_name.substr(0, records[i].host_name.size() - 1);
380 EXPECT_EQ(result->h_aliases[i], domain_name);
381 cnamecount++;
382 }
383 // The size of "Non-cname type" DNS record in records is 2
384 ASSERT_EQ(cnamecount, records.size() - 2);
385 ASSERT_FALSE(result == nullptr);
386 ASSERT_EQ(16, result->h_length);
387 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
388 EXPECT_EQ("2001:db8::42", ToString(result));
389 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
390}
391
392TEST_F(ResolverTest, GetHostByName_cnamesInfiniteLoop) {
393 test::DNSResponder dns;
394 const std::vector<DnsRecord> records = {
395 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
396 {"a.example.com.", ns_type::ns_t_cname, kHelloExampleCom},
397 };
398 StartDns(dns, records);
399 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
400
401 const hostent* result;
402 result = gethostbyname2("hello", AF_INET);
403 ASSERT_TRUE(result == nullptr);
404
405 dns.clearQueries();
406 result = gethostbyname2("hello", AF_INET6);
407 ASSERT_TRUE(result == nullptr);
408}
409
Ken Chenb9fa2062018-11-13 21:51:13 +0800410TEST_F(ResolverTest, GetHostByName_localhost) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800411 constexpr char name_camelcase[] = "LocalHost";
Ken Chenb9fa2062018-11-13 21:51:13 +0800412 constexpr char name_ip6_dot[] = "ip6-localhost.";
413 constexpr char name_ip6_fqdn[] = "ip6-localhost.example.com.";
414
415 // Add a dummy nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900416 test::DNSResponder dns;
417 StartDns(dns, {});
418 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800419
420 // Expect no DNS queries; localhost is resolved via /etc/hosts
Xiao Ma09b71022018-12-11 17:56:32 +0900421 const hostent* result = gethostbyname(kLocalHost);
Ken Chenb9fa2062018-11-13 21:51:13 +0800422 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
423 ASSERT_FALSE(result == nullptr);
424 ASSERT_EQ(4, result->h_length);
425 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900426 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800427 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
428
429 // Ensure the hosts file resolver ignores case of hostnames
430 result = gethostbyname(name_camelcase);
431 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
432 ASSERT_FALSE(result == nullptr);
433 ASSERT_EQ(4, result->h_length);
434 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900435 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800436 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
437
438 // The hosts file also contains ip6-localhost, but gethostbyname() won't
chenbruce018fdb22019-06-12 18:08:04 +0800439 // return it. This would be easy to
Ken Chenb9fa2062018-11-13 21:51:13 +0800440 // change, but there's no point in changing the legacy behavior; new code
441 // should be calling getaddrinfo() anyway.
442 // So we check the legacy behavior, which results in amusing A-record
443 // lookups for ip6-localhost, with and without search domains appended.
444 dns.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900445 result = gethostbyname(kIp6LocalHost);
Sehee Parkbbca0202018-11-16 10:53:16 +0900446 EXPECT_EQ(2U, dns.queries().size()) << dns.dumpQueries();
447 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, name_ip6_dot)) << dns.dumpQueries();
448 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, name_ip6_fqdn)) << dns.dumpQueries();
Ken Chenb9fa2062018-11-13 21:51:13 +0800449 ASSERT_TRUE(result == nullptr);
450
451 // Finally, use gethostbyname2() to resolve ip6-localhost to ::1 from
452 // the hosts file.
453 dns.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900454 result = gethostbyname2(kIp6LocalHost, AF_INET6);
Ken Chenb9fa2062018-11-13 21:51:13 +0800455 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
456 ASSERT_FALSE(result == nullptr);
457 ASSERT_EQ(16, result->h_length);
458 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900459 EXPECT_EQ(kIp6LocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800460 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800461}
462
463TEST_F(ResolverTest, GetHostByName_numeric) {
464 // Add a dummy nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900465 test::DNSResponder dns;
466 StartDns(dns, {});
467 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800468
469 // Numeric v4 address: expect no DNS queries
470 constexpr char numeric_v4[] = "192.168.0.1";
Ken Chenb9fa2062018-11-13 21:51:13 +0800471 const hostent* result = gethostbyname(numeric_v4);
Sehee Parkbbca0202018-11-16 10:53:16 +0900472 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800473 ASSERT_FALSE(result == nullptr);
474 ASSERT_EQ(4, result->h_length); // v4
475 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
476 EXPECT_EQ(numeric_v4, ToString(result));
477 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
478
479 // gethostbyname() recognizes a v6 address, and fails with no DNS queries
480 constexpr char numeric_v6[] = "2001:db8::42";
481 dns.clearQueries();
482 result = gethostbyname(numeric_v6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900483 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800484 EXPECT_TRUE(result == nullptr);
485
486 // Numeric v6 address with gethostbyname2(): succeeds with no DNS queries
487 dns.clearQueries();
488 result = gethostbyname2(numeric_v6, AF_INET6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900489 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800490 ASSERT_FALSE(result == nullptr);
491 ASSERT_EQ(16, result->h_length); // v6
492 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
493 EXPECT_EQ(numeric_v6, ToString(result));
494 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
495
496 // Numeric v6 address with scope work with getaddrinfo(),
497 // but gethostbyname2() does not understand them; it issues two dns
498 // queries, then fails. This hardly ever happens, there's no point
499 // in fixing this. This test simply verifies the current (bogus)
500 // behavior to avoid further regressions (like crashes, or leaks).
501 constexpr char numeric_v6_scope[] = "fe80::1%lo";
502 dns.clearQueries();
503 result = gethostbyname2(numeric_v6_scope, AF_INET6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900504 EXPECT_EQ(2U, dns.queries().size()); // OUCH!
Ken Chenb9fa2062018-11-13 21:51:13 +0800505 ASSERT_TRUE(result == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800506}
507
508TEST_F(ResolverTest, BinderSerialization) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800509 std::vector<int> params_offsets = {
Luke Huang5bd827c2019-03-14 16:10:04 +0800510 IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY,
511 IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD,
512 IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES,
513 IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES,
514 IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC,
515 IDnsResolver::RESOLVER_PARAMS_RETRY_COUNT,
Ken Chenb9fa2062018-11-13 21:51:13 +0800516 };
Bernie Innocentib102dd22018-12-04 14:57:48 +0900517 const int size = static_cast<int>(params_offsets.size());
Luke Huang5bd827c2019-03-14 16:10:04 +0800518 EXPECT_EQ(size, IDnsResolver::RESOLVER_PARAMS_COUNT);
Ken Chenb9fa2062018-11-13 21:51:13 +0800519 std::sort(params_offsets.begin(), params_offsets.end());
Bernie Innocentib102dd22018-12-04 14:57:48 +0900520 for (int i = 0; i < size; ++i) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800521 EXPECT_EQ(params_offsets[i], i);
522 }
523}
524
525TEST_F(ResolverTest, GetHostByName_Binder) {
Luke Huangf8215372019-11-22 11:53:41 +0800526 std::vector<std::string> domains = {"example.com"};
Ken Chenb9fa2062018-11-13 21:51:13 +0800527 std::vector<std::unique_ptr<test::DNSResponder>> dns;
528 std::vector<std::string> servers;
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900529 std::vector<DnsResponderClient::Mapping> mappings;
530 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupMappings(1, domains, &mappings));
531 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupDNSServers(4, mappings, &dns, &servers));
Ken Chenb9fa2062018-11-13 21:51:13 +0800532 ASSERT_EQ(1U, mappings.size());
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900533 const DnsResponderClient::Mapping& mapping = mappings[0];
Ken Chenb9fa2062018-11-13 21:51:13 +0800534
Xiao Ma09b71022018-12-11 17:56:32 +0900535 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains, kDefaultParams));
Ken Chenb9fa2062018-11-13 21:51:13 +0800536
537 const hostent* result = gethostbyname(mapping.host.c_str());
Bernie Innocentib102dd22018-12-04 14:57:48 +0900538 const size_t total_queries =
Luke Huangfde82482019-06-04 01:04:53 +0800539 std::accumulate(dns.begin(), dns.end(), 0, [&mapping](size_t total, auto& d) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800540 return total + GetNumQueriesForType(*d, ns_type::ns_t_a, mapping.entry.c_str());
541 });
542
543 EXPECT_LE(1U, total_queries);
544 ASSERT_FALSE(result == nullptr);
545 ASSERT_EQ(4, result->h_length);
546 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
547 EXPECT_EQ(mapping.ip4, ToString(result));
548 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
549
550 std::vector<std::string> res_servers;
551 std::vector<std::string> res_domains;
Mike Yu0a1c53d2018-11-26 13:26:21 +0900552 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +0900553 res_params res_params;
Ken Chenb9fa2062018-11-13 21:51:13 +0800554 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +0800555 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +0800556 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
557 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
558 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chenb9fa2062018-11-13 21:51:13 +0800559 EXPECT_EQ(servers.size(), res_servers.size());
560 EXPECT_EQ(domains.size(), res_domains.size());
Mike Yu0a1c53d2018-11-26 13:26:21 +0900561 EXPECT_EQ(0U, res_tls_servers.size());
Luke Huang5bd827c2019-03-14 16:10:04 +0800562 ASSERT_EQ(static_cast<size_t>(IDnsResolver::RESOLVER_PARAMS_COUNT), kDefaultParams.size());
563 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY],
564 res_params.sample_validity);
565 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900566 res_params.success_threshold);
Luke Huang5bd827c2019-03-14 16:10:04 +0800567 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
568 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
569 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
Ken Chenb9fa2062018-11-13 21:51:13 +0800570 res_params.base_timeout_msec);
571 EXPECT_EQ(servers.size(), res_stats.size());
572
Bernie Innocenti0c067e42019-04-01 15:33:16 +0900573 EXPECT_THAT(res_servers, testing::UnorderedElementsAreArray(servers));
574 EXPECT_THAT(res_domains, testing::UnorderedElementsAreArray(domains));
Ken Chenb9fa2062018-11-13 21:51:13 +0800575}
576
577TEST_F(ResolverTest, GetAddrInfo) {
Xiao Ma09b71022018-12-11 17:56:32 +0900578 constexpr char listen_addr[] = "127.0.0.4";
579 constexpr char listen_addr2[] = "127.0.0.5";
580 constexpr char host_name[] = "howdy.example.com.";
Ken Chenb9fa2062018-11-13 21:51:13 +0800581
Xiao Ma09b71022018-12-11 17:56:32 +0900582 const std::vector<DnsRecord> records = {
583 {host_name, ns_type::ns_t_a, "1.2.3.4"},
584 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
585 };
586 test::DNSResponder dns(listen_addr);
587 test::DNSResponder dns2(listen_addr2);
588 StartDns(dns, records);
589 StartDns(dns2, records);
Ken Chenb9fa2062018-11-13 21:51:13 +0800590
Xiao Ma09b71022018-12-11 17:56:32 +0900591 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}));
Ken Chenb9fa2062018-11-13 21:51:13 +0800592 dns.clearQueries();
593 dns2.clearQueries();
594
595 ScopedAddrinfo result = safe_getaddrinfo("howdy", nullptr, nullptr);
596 EXPECT_TRUE(result != nullptr);
597 size_t found = GetNumQueries(dns, host_name);
598 EXPECT_LE(1U, found);
599 // Could be A or AAAA
600 std::string result_str = ToString(result);
601 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +0800602 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +0800603
604 // Verify that the name is cached.
605 size_t old_found = found;
606 result = safe_getaddrinfo("howdy", nullptr, nullptr);
607 EXPECT_TRUE(result != nullptr);
608 found = GetNumQueries(dns, host_name);
609 EXPECT_LE(1U, found);
610 EXPECT_EQ(old_found, found);
611 result_str = ToString(result);
Luke Huangf8215372019-11-22 11:53:41 +0800612 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4") << result_str;
Ken Chenb9fa2062018-11-13 21:51:13 +0800613
614 // Change the DNS resolver, ensure that queries are still cached.
Xiao Ma09b71022018-12-11 17:56:32 +0900615 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr2}));
Ken Chenb9fa2062018-11-13 21:51:13 +0800616 dns.clearQueries();
617 dns2.clearQueries();
618
619 result = safe_getaddrinfo("howdy", nullptr, nullptr);
620 EXPECT_TRUE(result != nullptr);
621 found = GetNumQueries(dns, host_name);
622 size_t found2 = GetNumQueries(dns2, host_name);
623 EXPECT_EQ(0U, found);
624 EXPECT_LE(0U, found2);
625
626 // Could be A or AAAA
627 result_str = ToString(result);
628 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +0800629 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +0800630}
631
632TEST_F(ResolverTest, GetAddrInfoV4) {
Xiao Ma09b71022018-12-11 17:56:32 +0900633 test::DNSResponder dns;
634 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.5"}});
635 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800636
Xiao Ma09b71022018-12-11 17:56:32 +0900637 const addrinfo hints = {.ai_family = AF_INET};
638 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
Ken Chenb9fa2062018-11-13 21:51:13 +0800639 EXPECT_TRUE(result != nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900640 EXPECT_EQ(1U, GetNumQueries(dns, kHelloExampleCom));
Ken Chenb9fa2062018-11-13 21:51:13 +0800641 EXPECT_EQ("1.2.3.5", ToString(result));
642}
643
644TEST_F(ResolverTest, GetAddrInfo_localhost) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800645 // Add a dummy nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900646 test::DNSResponder dns;
647 StartDns(dns, {});
648 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800649
Xiao Ma09b71022018-12-11 17:56:32 +0900650 ScopedAddrinfo result = safe_getaddrinfo(kLocalHost, nullptr, nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800651 EXPECT_TRUE(result != nullptr);
652 // Expect no DNS queries; localhost is resolved via /etc/hosts
653 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900654 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800655
Xiao Ma09b71022018-12-11 17:56:32 +0900656 result = safe_getaddrinfo(kIp6LocalHost, nullptr, nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800657 EXPECT_TRUE(result != nullptr);
658 // Expect no DNS queries; ip6-localhost is resolved via /etc/hosts
659 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900660 EXPECT_EQ(kIp6LocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800661}
662
Luke Huangd8ac4752019-06-18 17:05:47 +0800663TEST_F(ResolverTest, GetAddrInfo_InvalidSocketType) {
664 test::DNSResponder dns;
665 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.5"}});
666 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
667
668 // TODO: Test other invalid socket types.
669 const addrinfo hints = {
670 .ai_family = AF_UNSPEC,
Luke Huangd8ac4752019-06-18 17:05:47 +0800671 .ai_socktype = SOCK_PACKET,
672 };
673 addrinfo* result = nullptr;
674 // This is a valid hint, but the query won't be sent because the socket type is
675 // not supported.
676 EXPECT_EQ(EAI_NODATA, getaddrinfo("hello", nullptr, &hints, &result));
677 ScopedAddrinfo result_cleanup(result);
678 EXPECT_EQ(nullptr, result);
679}
680
Ken Chen92bed612018-12-22 21:46:55 +0800681// Verify if the resolver correctly handle multiple queries simultaneously
682// step 1: set dns server#1 into deferred responding mode.
683// step 2: thread#1 query "hello.example.com." --> resolver send query to server#1.
684// step 3: thread#2 query "hello.example.com." --> resolver hold the request and wait for
685// response of previous pending query sent by thread#1.
686// step 4: thread#3 query "konbanha.example.com." --> resolver send query to server#3. Server
687// respond to resolver immediately.
688// step 5: check if server#1 get 1 query by thread#1, server#2 get 0 query, server#3 get 1 query.
689// step 6: resume dns server#1 to respond dns query in step#2.
690// step 7: thread#1 and #2 should get returned from DNS query after step#6. Also, check the
691// number of queries in server#2 is 0 to ensure thread#2 does not wake up unexpectedly
692// before signaled by thread#1.
693TEST_F(ResolverTest, GetAddrInfoV4_deferred_resp) {
694 const char* listen_addr1 = "127.0.0.9";
695 const char* listen_addr2 = "127.0.0.10";
696 const char* listen_addr3 = "127.0.0.11";
697 const char* listen_srv = "53";
698 const char* host_name_deferred = "hello.example.com.";
699 const char* host_name_normal = "konbanha.example.com.";
Mike Yufc125e42019-05-15 20:41:28 +0800700 test::DNSResponder dns1(listen_addr1, listen_srv, ns_rcode::ns_r_servfail);
701 test::DNSResponder dns2(listen_addr2, listen_srv, ns_rcode::ns_r_servfail);
702 test::DNSResponder dns3(listen_addr3, listen_srv, ns_rcode::ns_r_servfail);
Ken Chen92bed612018-12-22 21:46:55 +0800703 dns1.addMapping(host_name_deferred, ns_type::ns_t_a, "1.2.3.4");
704 dns2.addMapping(host_name_deferred, ns_type::ns_t_a, "1.2.3.4");
705 dns3.addMapping(host_name_normal, ns_type::ns_t_a, "1.2.3.5");
706 ASSERT_TRUE(dns1.startServer());
707 ASSERT_TRUE(dns2.startServer());
708 ASSERT_TRUE(dns3.startServer());
709 const std::vector<std::string> servers_for_t1 = {listen_addr1};
710 const std::vector<std::string> servers_for_t2 = {listen_addr2};
711 const std::vector<std::string> servers_for_t3 = {listen_addr3};
712 addrinfo hints = {.ai_family = AF_INET};
713 const std::vector<int> params = {300, 25, 8, 8, 5000};
714 bool t3_task_done = false;
715
716 dns1.setDeferredResp(true);
717 std::thread t1([&, this]() {
718 ASSERT_TRUE(
719 mDnsClient.SetResolversForNetwork(servers_for_t1, kDefaultSearchDomains, params));
720 ScopedAddrinfo result = safe_getaddrinfo(host_name_deferred, nullptr, &hints);
721 // t3's dns query should got returned first
722 EXPECT_TRUE(t3_task_done);
723 EXPECT_EQ(1U, GetNumQueries(dns1, host_name_deferred));
724 EXPECT_TRUE(result != nullptr);
725 EXPECT_EQ("1.2.3.4", ToString(result));
726 });
727
728 // ensuring t1 and t2 handler functions are processed in order
729 usleep(100 * 1000);
730 std::thread t2([&, this]() {
731 ASSERT_TRUE(
732 mDnsClient.SetResolversForNetwork(servers_for_t2, kDefaultSearchDomains, params));
733 ScopedAddrinfo result = safe_getaddrinfo(host_name_deferred, nullptr, &hints);
734 EXPECT_TRUE(t3_task_done);
735 EXPECT_EQ(0U, GetNumQueries(dns2, host_name_deferred));
736 EXPECT_TRUE(result != nullptr);
737 EXPECT_EQ("1.2.3.4", ToString(result));
738
739 std::vector<std::string> res_servers;
740 std::vector<std::string> res_domains;
741 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +0900742 res_params res_params;
Ken Chen92bed612018-12-22 21:46:55 +0800743 std::vector<ResolverStats> res_stats;
744 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +0800745 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
746 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains,
747 &res_tls_servers, &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chen92bed612018-12-22 21:46:55 +0800748 EXPECT_EQ(0, wait_for_pending_req_timeout_count);
749 });
750
751 // ensuring t2 and t3 handler functions are processed in order
752 usleep(100 * 1000);
753 std::thread t3([&, this]() {
754 ASSERT_TRUE(
755 mDnsClient.SetResolversForNetwork(servers_for_t3, kDefaultSearchDomains, params));
756 ScopedAddrinfo result = safe_getaddrinfo(host_name_normal, nullptr, &hints);
757 EXPECT_EQ(1U, GetNumQueries(dns1, host_name_deferred));
758 EXPECT_EQ(0U, GetNumQueries(dns2, host_name_deferred));
759 EXPECT_EQ(1U, GetNumQueries(dns3, host_name_normal));
760 EXPECT_TRUE(result != nullptr);
761 EXPECT_EQ("1.2.3.5", ToString(result));
762
763 t3_task_done = true;
764 dns1.setDeferredResp(false);
765 });
766 t3.join();
767 t1.join();
768 t2.join();
769}
770
lifr4e4a2e02019-01-29 16:53:51 +0800771TEST_F(ResolverTest, GetAddrInfo_cnames) {
772 constexpr char host_name[] = "host.example.com.";
773 test::DNSResponder dns;
774 const std::vector<DnsRecord> records = {
775 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
776 {"a.example.com.", ns_type::ns_t_cname, "b.example.com."},
777 {"b.example.com.", ns_type::ns_t_cname, "c.example.com."},
778 {"c.example.com.", ns_type::ns_t_cname, "d.example.com."},
779 {"d.example.com.", ns_type::ns_t_cname, "e.example.com."},
780 {"e.example.com.", ns_type::ns_t_cname, host_name},
781 {host_name, ns_type::ns_t_a, "1.2.3.3"},
782 {host_name, ns_type::ns_t_aaaa, "2001:db8::42"},
783 };
784 StartDns(dns, records);
785 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
786
787 addrinfo hints = {.ai_family = AF_INET};
788 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
789 EXPECT_TRUE(result != nullptr);
790 EXPECT_EQ("1.2.3.3", ToString(result));
791
792 dns.clearQueries();
793 hints = {.ai_family = AF_INET6};
794 result = safe_getaddrinfo("hello", nullptr, &hints);
795 EXPECT_TRUE(result != nullptr);
796 EXPECT_EQ("2001:db8::42", ToString(result));
797}
798
799TEST_F(ResolverTest, GetAddrInfo_cnamesNoIpAddress) {
800 test::DNSResponder dns;
801 const std::vector<DnsRecord> records = {
802 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
803 };
804 StartDns(dns, records);
805 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
806
807 addrinfo hints = {.ai_family = AF_INET};
808 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
809 EXPECT_TRUE(result == nullptr);
810
811 dns.clearQueries();
812 hints = {.ai_family = AF_INET6};
813 result = safe_getaddrinfo("hello", nullptr, &hints);
814 EXPECT_TRUE(result == nullptr);
815}
816
817TEST_F(ResolverTest, GetAddrInfo_cnamesIllegalRdata) {
818 test::DNSResponder dns;
819 const std::vector<DnsRecord> records = {
820 {kHelloExampleCom, ns_type::ns_t_cname, ".!#?"},
821 };
822 StartDns(dns, records);
823 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
824
825 addrinfo hints = {.ai_family = AF_INET};
826 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
827 EXPECT_TRUE(result == nullptr);
828
829 dns.clearQueries();
830 hints = {.ai_family = AF_INET6};
831 result = safe_getaddrinfo("hello", nullptr, &hints);
832 EXPECT_TRUE(result == nullptr);
833}
834
Ken Chenb9fa2062018-11-13 21:51:13 +0800835TEST_F(ResolverTest, MultidomainResolution) {
Xiao Ma09b71022018-12-11 17:56:32 +0900836 constexpr char host_name[] = "nihao.example2.com.";
Luke Huangf8215372019-11-22 11:53:41 +0800837 std::vector<std::string> searchDomains = {"example1.com", "example2.com", "example3.com"};
Ken Chenb9fa2062018-11-13 21:51:13 +0800838
Xiao Ma09b71022018-12-11 17:56:32 +0900839 test::DNSResponder dns("127.0.0.6");
840 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.3"}});
841 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({"127.0.0.6"}, searchDomains));
842
Ken Chenb9fa2062018-11-13 21:51:13 +0800843 const hostent* result = gethostbyname("nihao");
Xiao Ma09b71022018-12-11 17:56:32 +0900844
Ken Chenb9fa2062018-11-13 21:51:13 +0800845 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
846 ASSERT_FALSE(result == nullptr);
847 ASSERT_EQ(4, result->h_length);
848 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
849 EXPECT_EQ("1.2.3.3", ToString(result));
850 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800851}
852
853TEST_F(ResolverTest, GetAddrInfoV6_numeric) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800854 constexpr char host_name[] = "ohayou.example.com.";
855 constexpr char numeric_addr[] = "fe80::1%lo";
856
Xiao Ma09b71022018-12-11 17:56:32 +0900857 test::DNSResponder dns;
Ken Chenb9fa2062018-11-13 21:51:13 +0800858 dns.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900859 StartDns(dns, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
860 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800861
862 addrinfo hints = {.ai_family = AF_INET6};
863 ScopedAddrinfo result = safe_getaddrinfo(numeric_addr, nullptr, &hints);
864 EXPECT_TRUE(result != nullptr);
865 EXPECT_EQ(numeric_addr, ToString(result));
866 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
867
868 // Now try a non-numeric hostname query with the AI_NUMERICHOST flag set.
869 // We should fail without sending out a DNS query.
870 hints.ai_flags |= AI_NUMERICHOST;
871 result = safe_getaddrinfo(host_name, nullptr, &hints);
872 EXPECT_TRUE(result == nullptr);
873 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
874}
875
876TEST_F(ResolverTest, GetAddrInfoV6_failing) {
Xiao Ma09b71022018-12-11 17:56:32 +0900877 constexpr char listen_addr0[] = "127.0.0.7";
878 constexpr char listen_addr1[] = "127.0.0.8";
Ken Chenb9fa2062018-11-13 21:51:13 +0800879 const char* host_name = "ohayou.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +0900880
881 test::DNSResponder dns0(listen_addr0);
882 test::DNSResponder dns1(listen_addr1);
Ken Chenb9fa2062018-11-13 21:51:13 +0800883 dns0.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900884 StartDns(dns0, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
885 StartDns(dns1, {{host_name, ns_type::ns_t_aaaa, "2001:db8::6"}});
886
Luke Huangf8215372019-11-22 11:53:41 +0800887 std::vector<std::string> servers = {listen_addr0, listen_addr1};
Ken Chenb9fa2062018-11-13 21:51:13 +0800888 // <sample validity in s> <success threshold in percent> <min samples> <max samples>
889 int sample_count = 8;
Luke Huangf8215372019-11-22 11:53:41 +0800890 const std::vector<int> params = {300, 25, sample_count, sample_count};
Xiao Ma09b71022018-12-11 17:56:32 +0900891 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, kDefaultSearchDomains, params));
Ken Chenb9fa2062018-11-13 21:51:13 +0800892
893 // Repeatedly perform resolutions for non-existing domains until MAXNSSAMPLES resolutions have
894 // reached the dns0, which is set to fail. No more requests should then arrive at that server
895 // for the next sample_lifetime seconds.
896 // TODO: This approach is implementation-dependent, change once metrics reporting is available.
Xiao Ma09b71022018-12-11 17:56:32 +0900897 const addrinfo hints = {.ai_family = AF_INET6};
Bernie Innocentib102dd22018-12-04 14:57:48 +0900898 for (int i = 0; i < sample_count; ++i) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800899 std::string domain = StringPrintf("nonexistent%d", i);
900 ScopedAddrinfo result = safe_getaddrinfo(domain.c_str(), nullptr, &hints);
901 }
902 // Due to 100% errors for all possible samples, the server should be ignored from now on and
903 // only the second one used for all following queries, until NSSAMPLE_VALIDITY is reached.
904 dns0.clearQueries();
905 dns1.clearQueries();
906 ScopedAddrinfo result = safe_getaddrinfo("ohayou", nullptr, &hints);
907 EXPECT_TRUE(result != nullptr);
908 EXPECT_EQ(0U, GetNumQueries(dns0, host_name));
909 EXPECT_EQ(1U, GetNumQueries(dns1, host_name));
910}
911
912TEST_F(ResolverTest, GetAddrInfoV6_nonresponsive) {
Xiao Ma09b71022018-12-11 17:56:32 +0900913 constexpr char listen_addr0[] = "127.0.0.7";
914 constexpr char listen_addr1[] = "127.0.0.8";
915 constexpr char listen_srv[] = "53";
916 constexpr char host_name1[] = "ohayou.example.com.";
917 constexpr char host_name2[] = "ciao.example.com.";
Luke Huang483cf332019-06-03 17:24:51 +0800918 const std::vector<std::string> defaultSearchDomain = {"example.com"};
919 // The minimal timeout is 1000ms, so we can't decrease timeout
920 // So reduce retry count.
921 const std::vector<int> reduceRetryParams = {
922 300, // sample validity in seconds
923 25, // success threshod in percent
924 8, 8, // {MIN,MAX}_SAMPLES
925 1000, // BASE_TIMEOUT_MSEC
926 1, // retry count
927 };
Xiao Ma09b71022018-12-11 17:56:32 +0900928 const std::vector<DnsRecord> records0 = {
929 {host_name1, ns_type::ns_t_aaaa, "2001:db8::5"},
930 {host_name2, ns_type::ns_t_aaaa, "2001:db8::5"},
931 };
932 const std::vector<DnsRecord> records1 = {
933 {host_name1, ns_type::ns_t_aaaa, "2001:db8::6"},
934 {host_name2, ns_type::ns_t_aaaa, "2001:db8::6"},
935 };
Ken Chenb9fa2062018-11-13 21:51:13 +0800936
937 // dns0 does not respond with 100% probability, while
938 // dns1 responds normally, at least initially.
Mike Yufc125e42019-05-15 20:41:28 +0800939 test::DNSResponder dns0(listen_addr0, listen_srv, static_cast<ns_rcode>(-1));
940 test::DNSResponder dns1(listen_addr1, listen_srv, static_cast<ns_rcode>(-1));
Ken Chenb9fa2062018-11-13 21:51:13 +0800941 dns0.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900942 StartDns(dns0, records0);
943 StartDns(dns1, records1);
Luke Huang483cf332019-06-03 17:24:51 +0800944 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr0, listen_addr1}, defaultSearchDomain,
945 reduceRetryParams));
Ken Chenb9fa2062018-11-13 21:51:13 +0800946
Luke Huang483cf332019-06-03 17:24:51 +0800947 // Specify ai_socktype to make getaddrinfo will only query 1 time
948 const addrinfo hints = {.ai_family = AF_INET6, .ai_socktype = SOCK_STREAM};
Ken Chenb9fa2062018-11-13 21:51:13 +0800949
950 // dns0 will ignore the request, and we'll fallback to dns1 after the first
951 // retry.
952 ScopedAddrinfo result = safe_getaddrinfo(host_name1, nullptr, &hints);
953 EXPECT_TRUE(result != nullptr);
954 EXPECT_EQ(1U, GetNumQueries(dns0, host_name1));
955 EXPECT_EQ(1U, GetNumQueries(dns1, host_name1));
956
957 // Now make dns1 also ignore 100% requests... The resolve should alternate
Luke Huang483cf332019-06-03 17:24:51 +0800958 // queries between the nameservers and fail
Ken Chenb9fa2062018-11-13 21:51:13 +0800959 dns1.setResponseProbability(0.0);
960 addrinfo* result2 = nullptr;
961 EXPECT_EQ(EAI_NODATA, getaddrinfo(host_name2, nullptr, &hints, &result2));
962 EXPECT_EQ(nullptr, result2);
Luke Huang483cf332019-06-03 17:24:51 +0800963 EXPECT_EQ(1U, GetNumQueries(dns0, host_name2));
964 EXPECT_EQ(1U, GetNumQueries(dns1, host_name2));
Ken Chenb9fa2062018-11-13 21:51:13 +0800965}
966
967TEST_F(ResolverTest, GetAddrInfoV6_concurrent) {
Xiao Ma09b71022018-12-11 17:56:32 +0900968 constexpr char listen_addr0[] = "127.0.0.9";
969 constexpr char listen_addr1[] = "127.0.0.10";
970 constexpr char listen_addr2[] = "127.0.0.11";
971 constexpr char host_name[] = "konbanha.example.com.";
972
973 test::DNSResponder dns0(listen_addr0);
974 test::DNSResponder dns1(listen_addr1);
975 test::DNSResponder dns2(listen_addr2);
976 StartDns(dns0, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
977 StartDns(dns1, {{host_name, ns_type::ns_t_aaaa, "2001:db8::6"}});
978 StartDns(dns2, {{host_name, ns_type::ns_t_aaaa, "2001:db8::7"}});
979
Luke Huangf8215372019-11-22 11:53:41 +0800980 const std::vector<std::string> servers = {listen_addr0, listen_addr1, listen_addr2};
Ken Chenb9fa2062018-11-13 21:51:13 +0800981 std::vector<std::thread> threads(10);
982 for (std::thread& thread : threads) {
Luke Huangf8215372019-11-22 11:53:41 +0800983 thread = std::thread([this, &servers]() {
984 unsigned delay = arc4random_uniform(1 * 1000 * 1000); // <= 1s
Ken Chenb9fa2062018-11-13 21:51:13 +0800985 usleep(delay);
986 std::vector<std::string> serverSubset;
987 for (const auto& server : servers) {
988 if (arc4random_uniform(2)) {
989 serverSubset.push_back(server);
990 }
991 }
992 if (serverSubset.empty()) serverSubset = servers;
Xiao Ma09b71022018-12-11 17:56:32 +0900993 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(serverSubset));
994 const addrinfo hints = {.ai_family = AF_INET6};
Ken Chenb9fa2062018-11-13 21:51:13 +0800995 addrinfo* result = nullptr;
996 int rv = getaddrinfo("konbanha", nullptr, &hints, &result);
997 EXPECT_EQ(0, rv) << "error [" << rv << "] " << gai_strerror(rv);
998 if (result) {
999 freeaddrinfo(result);
1000 result = nullptr;
1001 }
1002 });
1003 }
1004 for (std::thread& thread : threads) {
1005 thread.join();
1006 }
Ken Chen92bed612018-12-22 21:46:55 +08001007
1008 std::vector<std::string> res_servers;
1009 std::vector<std::string> res_domains;
1010 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001011 res_params res_params;
Ken Chen92bed612018-12-22 21:46:55 +08001012 std::vector<ResolverStats> res_stats;
1013 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001014 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1015 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1016 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chen92bed612018-12-22 21:46:55 +08001017 EXPECT_EQ(0, wait_for_pending_req_timeout_count);
Ken Chenb9fa2062018-11-13 21:51:13 +08001018}
1019
Mike Yu8ac63402019-12-02 15:28:38 +08001020TEST_F(ResolverTest, SkipBadServersDueToInternalError) {
1021 constexpr char listen_addr1[] = "fe80::1";
1022 constexpr char listen_addr2[] = "255.255.255.255";
1023 constexpr char listen_addr3[] = "127.0.0.3";
1024
1025 test::DNSResponder dns(listen_addr3);
1026 ASSERT_TRUE(dns.startServer());
1027
1028 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
1029 parcel.servers = {listen_addr1, listen_addr2, listen_addr3};
1030
1031 // Bad servers can be distinguished after two attempts.
1032 parcel.minSamples = 2;
1033 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1034
1035 // Start querying five times.
1036 for (int i = 0; i < 5; i++) {
1037 std::string hostName = StringPrintf("hello%d.com.", i);
1038 dns.addMapping(hostName, ns_type::ns_t_a, "1.2.3.4");
1039 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1040 EXPECT_TRUE(safe_getaddrinfo(hostName.c_str(), nullptr, &hints) != nullptr);
1041 }
1042
Mike Yuc0000252020-03-19 07:14:23 +00001043 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1044 NameserverStats(listen_addr1).setInternalErrors(2),
1045 NameserverStats(listen_addr2).setInternalErrors(2),
1046 NameserverStats(listen_addr3).setSuccesses(5),
1047 };
1048 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
Mike Yu8ac63402019-12-02 15:28:38 +08001049}
1050
1051TEST_F(ResolverTest, SkipBadServersDueToTimeout) {
1052 constexpr char listen_addr1[] = "127.0.0.3";
1053 constexpr char listen_addr2[] = "127.0.0.4";
1054
1055 // Set dns1 non-responsive and dns2 workable.
1056 test::DNSResponder dns1(listen_addr1, test::kDefaultListenService, static_cast<ns_rcode>(-1));
1057 test::DNSResponder dns2(listen_addr2);
1058 dns1.setResponseProbability(0.0);
1059 ASSERT_TRUE(dns1.startServer());
1060 ASSERT_TRUE(dns2.startServer());
1061
1062 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
1063 parcel.servers = {listen_addr1, listen_addr2};
1064
1065 // Bad servers can be distinguished after two attempts.
1066 parcel.minSamples = 2;
1067 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1068
1069 // Start querying five times.
1070 for (int i = 0; i < 5; i++) {
1071 std::string hostName = StringPrintf("hello%d.com.", i);
1072 dns1.addMapping(hostName, ns_type::ns_t_a, "1.2.3.4");
1073 dns2.addMapping(hostName, ns_type::ns_t_a, "1.2.3.5");
1074 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1075 EXPECT_TRUE(safe_getaddrinfo(hostName.c_str(), nullptr, &hints) != nullptr);
1076 }
1077
Mike Yuc0000252020-03-19 07:14:23 +00001078 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1079 NameserverStats(listen_addr1).setTimeouts(2),
1080 NameserverStats(listen_addr2).setSuccesses(5),
1081 };
1082 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
Mike Yu8ac63402019-12-02 15:28:38 +08001083 EXPECT_EQ(dns1.queries().size(), 2U);
1084 EXPECT_EQ(dns2.queries().size(), 5U);
1085}
1086
chenbrucefd837fa2019-10-29 18:35:36 +08001087TEST_F(ResolverTest, GetAddrInfoFromCustTable_InvalidInput) {
1088 constexpr char hostnameNoip[] = "noip.example.com.";
1089 constexpr char hostnameInvalidip[] = "invalidip.example.com.";
1090 const std::vector<aidl::android::net::ResolverHostsParcel> invalidCustHosts = {
1091 {"", hostnameNoip},
1092 {"wrong IP", hostnameInvalidip},
1093 };
1094 test::DNSResponder dns;
1095 StartDns(dns, {});
1096 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
Ken Chen05420812020-04-07 18:58:38 +00001097 resolverParams.resolverOptions.hosts = invalidCustHosts;
chenbrucefd837fa2019-10-29 18:35:36 +08001098 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1099 for (const auto& hostname : {hostnameNoip, hostnameInvalidip}) {
1100 // The query won't get data from customized table because of invalid customized table
1101 // and DNSResponder also has no records. hostnameNoip has never registered and
1102 // hostnameInvalidip has registered but wrong IP.
1103 const addrinfo hints = {.ai_family = AF_UNSPEC};
1104 ScopedAddrinfo result = safe_getaddrinfo(hostname, nullptr, &hints);
1105 ASSERT_TRUE(result == nullptr);
1106 EXPECT_EQ(4U, GetNumQueries(dns, hostname));
1107 }
1108}
1109
1110TEST_F(ResolverTest, GetAddrInfoFromCustTable) {
1111 constexpr char hostnameV4[] = "v4only.example.com.";
1112 constexpr char hostnameV6[] = "v6only.example.com.";
1113 constexpr char hostnameV4V6[] = "v4v6.example.com.";
1114 constexpr char custAddrV4[] = "1.2.3.4";
1115 constexpr char custAddrV6[] = "::1.2.3.4";
1116 constexpr char dnsSvAddrV4[] = "1.2.3.5";
1117 constexpr char dnsSvAddrV6[] = "::1.2.3.5";
1118 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4 = {
1119 {custAddrV4, hostnameV4},
1120 };
1121 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV6 = {
1122 {custAddrV6, hostnameV6},
1123 };
1124 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4V6 = {
1125 {custAddrV4, hostnameV4V6},
1126 {custAddrV6, hostnameV4V6},
1127 };
1128 const std::vector<DnsRecord> dnsSvHostV4 = {
1129 {hostnameV4, ns_type::ns_t_a, dnsSvAddrV4},
1130 };
1131 const std::vector<DnsRecord> dnsSvHostV6 = {
1132 {hostnameV6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1133 };
1134 const std::vector<DnsRecord> dnsSvHostV4V6 = {
1135 {hostnameV4V6, ns_type::ns_t_a, dnsSvAddrV4},
1136 {hostnameV4V6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1137 };
1138 struct TestConfig {
1139 const std::string name;
1140 const std::vector<aidl::android::net::ResolverHostsParcel> customizedHosts;
1141 const std::vector<DnsRecord> dnsserverHosts;
1142 const std::vector<std::string> queryResult;
1143 std::string asParameters() const {
1144 return StringPrintf("name: %s, customizedHosts: %s, dnsserverHosts: %s", name.c_str(),
1145 customizedHosts.empty() ? "No" : "Yes",
1146 dnsserverHosts.empty() ? "No" : "Yes");
1147 }
1148 } testConfigs[]{
1149 // clang-format off
1150 {hostnameV4, {}, {}, {}},
1151 {hostnameV4, {}, dnsSvHostV4, {dnsSvAddrV4}},
1152 {hostnameV4, custHostV4, {}, {custAddrV4}},
1153 {hostnameV4, custHostV4, dnsSvHostV4, {custAddrV4}},
1154 {hostnameV6, {}, {}, {}},
1155 {hostnameV6, {}, dnsSvHostV6, {dnsSvAddrV6}},
1156 {hostnameV6, custHostV6, {}, {custAddrV6}},
1157 {hostnameV6, custHostV6, dnsSvHostV6, {custAddrV6}},
1158 {hostnameV4V6, {}, {}, {}},
1159 {hostnameV4V6, {}, dnsSvHostV4V6, {dnsSvAddrV4, dnsSvAddrV6}},
1160 {hostnameV4V6, custHostV4V6, {}, {custAddrV4, custAddrV6}},
1161 {hostnameV4V6, custHostV4V6, dnsSvHostV4V6, {custAddrV4, custAddrV6}},
1162 // clang-format on
1163 };
1164
1165 for (const auto& config : testConfigs) {
1166 SCOPED_TRACE(config.asParameters());
1167
1168 test::DNSResponder dns;
1169 StartDns(dns, config.dnsserverHosts);
1170
1171 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
Ken Chen05420812020-04-07 18:58:38 +00001172 resolverParams.resolverOptions.hosts = config.customizedHosts;
chenbrucefd837fa2019-10-29 18:35:36 +08001173 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1174 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM};
1175 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
1176 if (config.customizedHosts.empty() && config.dnsserverHosts.empty()) {
1177 ASSERT_TRUE(result == nullptr);
1178 EXPECT_EQ(2U, GetNumQueries(dns, config.name.c_str()));
1179 } else {
1180 ASSERT_TRUE(result != nullptr);
1181 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(config.queryResult));
1182 EXPECT_EQ(config.customizedHosts.empty() ? 2U : 0U,
1183 GetNumQueries(dns, config.name.c_str()));
1184 }
1185
1186 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
1187 }
1188}
1189
1190TEST_F(ResolverTest, GetAddrInfoFromCustTable_Modify) {
1191 constexpr char hostnameV4V6[] = "v4v6.example.com.";
1192 constexpr char custAddrV4[] = "1.2.3.4";
1193 constexpr char custAddrV6[] = "::1.2.3.4";
1194 constexpr char dnsSvAddrV4[] = "1.2.3.5";
1195 constexpr char dnsSvAddrV6[] = "::1.2.3.5";
1196 const std::vector<DnsRecord> dnsSvHostV4V6 = {
1197 {hostnameV4V6, ns_type::ns_t_a, dnsSvAddrV4},
1198 {hostnameV4V6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1199 };
1200 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4V6 = {
1201 {custAddrV4, hostnameV4V6},
1202 {custAddrV6, hostnameV4V6},
1203 };
1204 test::DNSResponder dns;
1205 StartDns(dns, dnsSvHostV4V6);
1206 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1207
Ken Chen05420812020-04-07 18:58:38 +00001208 resolverParams.resolverOptions.hosts = custHostV4V6;
chenbrucefd837fa2019-10-29 18:35:36 +08001209 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1210 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM};
1211 ScopedAddrinfo result = safe_getaddrinfo(hostnameV4V6, nullptr, &hints);
1212 ASSERT_TRUE(result != nullptr);
1213 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray({custAddrV4, custAddrV6}));
1214 EXPECT_EQ(0U, GetNumQueries(dns, hostnameV4V6));
1215
Ken Chen05420812020-04-07 18:58:38 +00001216 resolverParams.resolverOptions.hosts = {};
chenbrucefd837fa2019-10-29 18:35:36 +08001217 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1218 result = safe_getaddrinfo(hostnameV4V6, nullptr, &hints);
1219 ASSERT_TRUE(result != nullptr);
1220 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray({dnsSvAddrV4, dnsSvAddrV6}));
1221 EXPECT_EQ(2U, GetNumQueries(dns, hostnameV4V6));
1222}
1223
Ken Chenb9fa2062018-11-13 21:51:13 +08001224TEST_F(ResolverTest, EmptySetup) {
Ken Chenb9fa2062018-11-13 21:51:13 +08001225 std::vector<std::string> servers;
1226 std::vector<std::string> domains;
Xiao Ma09b71022018-12-11 17:56:32 +09001227 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001228 std::vector<std::string> res_servers;
1229 std::vector<std::string> res_domains;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001230 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001231 res_params res_params;
Ken Chenb9fa2062018-11-13 21:51:13 +08001232 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +08001233 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001234 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1235 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1236 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chenb9fa2062018-11-13 21:51:13 +08001237 EXPECT_EQ(0U, res_servers.size());
1238 EXPECT_EQ(0U, res_domains.size());
Mike Yu0a1c53d2018-11-26 13:26:21 +09001239 EXPECT_EQ(0U, res_tls_servers.size());
Luke Huang5bd827c2019-03-14 16:10:04 +08001240 ASSERT_EQ(static_cast<size_t>(IDnsResolver::RESOLVER_PARAMS_COUNT), kDefaultParams.size());
1241 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY],
1242 res_params.sample_validity);
1243 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001244 res_params.success_threshold);
Luke Huang5bd827c2019-03-14 16:10:04 +08001245 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
1246 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
1247 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
Ken Chenb9fa2062018-11-13 21:51:13 +08001248 res_params.base_timeout_msec);
Luke Huang5bd827c2019-03-14 16:10:04 +08001249 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_RETRY_COUNT], res_params.retry_count);
Ken Chenb9fa2062018-11-13 21:51:13 +08001250}
1251
1252TEST_F(ResolverTest, SearchPathChange) {
Xiao Ma09b71022018-12-11 17:56:32 +09001253 constexpr char listen_addr[] = "127.0.0.13";
1254 constexpr char host_name1[] = "test13.domain1.org.";
1255 constexpr char host_name2[] = "test13.domain2.org.";
Luke Huangf8215372019-11-22 11:53:41 +08001256 std::vector<std::string> servers = {listen_addr};
1257 std::vector<std::string> domains = {"domain1.org"};
Xiao Ma09b71022018-12-11 17:56:32 +09001258
1259 const std::vector<DnsRecord> records = {
1260 {host_name1, ns_type::ns_t_aaaa, "2001:db8::13"},
1261 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1:13"},
1262 };
1263 test::DNSResponder dns(listen_addr);
1264 StartDns(dns, records);
1265 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001266
1267 const addrinfo hints = {.ai_family = AF_INET6};
1268 ScopedAddrinfo result = safe_getaddrinfo("test13", nullptr, &hints);
1269 EXPECT_TRUE(result != nullptr);
1270 EXPECT_EQ(1U, dns.queries().size());
1271 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
1272 EXPECT_EQ("2001:db8::13", ToString(result));
1273
1274 // Test that changing the domain search path on its own works.
Luke Huangf8215372019-11-22 11:53:41 +08001275 domains = {"domain2.org"};
Xiao Ma09b71022018-12-11 17:56:32 +09001276 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001277 dns.clearQueries();
1278
1279 result = safe_getaddrinfo("test13", nullptr, &hints);
1280 EXPECT_TRUE(result != nullptr);
1281 EXPECT_EQ(1U, dns.queries().size());
1282 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
1283 EXPECT_EQ("2001:db8::1:13", ToString(result));
1284}
1285
Luke Huang2dac4382019-06-24 13:28:44 +08001286namespace {
1287
Luke Huangf8215372019-11-22 11:53:41 +08001288std::vector<std::string> getResolverDomains(aidl::android::net::IDnsResolver* dnsResolverService,
Luke Huang2dac4382019-06-24 13:28:44 +08001289 unsigned netId) {
1290 std::vector<std::string> res_servers;
1291 std::vector<std::string> res_domains;
1292 std::vector<std::string> res_tls_servers;
1293 res_params res_params;
1294 std::vector<ResolverStats> res_stats;
1295 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001296 DnsResponderClient::GetResolverInfo(dnsResolverService, netId, &res_servers, &res_domains,
1297 &res_tls_servers, &res_params, &res_stats,
1298 &wait_for_pending_req_timeout_count);
Luke Huang2dac4382019-06-24 13:28:44 +08001299 return res_domains;
1300}
1301
1302} // namespace
1303
1304TEST_F(ResolverTest, SearchPathPrune) {
1305 constexpr size_t DUPLICATED_DOMAIN_NUM = 3;
1306 constexpr char listen_addr[] = "127.0.0.13";
1307 constexpr char domian_name1[] = "domain13.org.";
1308 constexpr char domian_name2[] = "domain14.org.";
1309 constexpr char host_name1[] = "test13.domain13.org.";
1310 constexpr char host_name2[] = "test14.domain14.org.";
1311 std::vector<std::string> servers = {listen_addr};
1312
1313 std::vector<std::string> testDomains1;
1314 std::vector<std::string> testDomains2;
1315 // Domain length should be <= 255
1316 // Max number of domains in search path is 6
1317 for (size_t i = 0; i < MAXDNSRCH + 1; i++) {
1318 // Fill up with invalid domain
1319 testDomains1.push_back(std::string(300, i + '0'));
1320 // Fill up with valid but duplicated domain
1321 testDomains2.push_back(StringPrintf("domain%zu.org", i % DUPLICATED_DOMAIN_NUM));
1322 }
1323
1324 // Add valid domain used for query.
1325 testDomains1.push_back(domian_name1);
1326
1327 // Add valid domain twice used for query.
1328 testDomains2.push_back(domian_name2);
1329 testDomains2.push_back(domian_name2);
1330
1331 const std::vector<DnsRecord> records = {
1332 {host_name1, ns_type::ns_t_aaaa, "2001:db8::13"},
1333 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1:13"},
1334 };
1335 test::DNSResponder dns(listen_addr);
1336 StartDns(dns, records);
1337 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, testDomains1));
1338
1339 const addrinfo hints = {.ai_family = AF_INET6};
1340 ScopedAddrinfo result = safe_getaddrinfo("test13", nullptr, &hints);
1341
1342 EXPECT_TRUE(result != nullptr);
1343
1344 EXPECT_EQ(1U, dns.queries().size());
1345 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
1346 EXPECT_EQ("2001:db8::13", ToString(result));
1347
1348 const auto& res_domains1 = getResolverDomains(mDnsClient.resolvService(), TEST_NETID);
1349 // Expect 1 valid domain, invalid domains are removed.
1350 ASSERT_EQ(1U, res_domains1.size());
1351 EXPECT_EQ(domian_name1, res_domains1[0]);
1352
1353 dns.clearQueries();
1354
1355 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, testDomains2));
1356
1357 result = safe_getaddrinfo("test14", nullptr, &hints);
1358 EXPECT_TRUE(result != nullptr);
1359
1360 // (3 domains * 2 retries) + 1 success query = 7
1361 EXPECT_EQ(7U, dns.queries().size());
1362 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
1363 EXPECT_EQ("2001:db8::1:13", ToString(result));
1364
1365 const auto& res_domains2 = getResolverDomains(mDnsClient.resolvService(), TEST_NETID);
1366 // Expect 4 valid domain, duplicate domains are removed.
1367 EXPECT_EQ(DUPLICATED_DOMAIN_NUM + 1U, res_domains2.size());
1368 EXPECT_THAT(
1369 std::vector<std::string>({"domain0.org", "domain1.org", "domain2.org", domian_name2}),
1370 testing::ElementsAreArray(res_domains2));
1371}
1372
Mike Yu0a1c53d2018-11-26 13:26:21 +09001373// If we move this function to dns_responder_client, it will complicate the dependency need of
1374// dns_tls_frontend.h.
1375static void setupTlsServers(const std::vector<std::string>& servers,
waynema0e73c2e2019-07-31 15:04:08 +08001376 std::vector<std::unique_ptr<test::DnsTlsFrontend>>* tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001377 constexpr char listen_udp[] = "53";
1378 constexpr char listen_tls[] = "853";
Mike Yu0a1c53d2018-11-26 13:26:21 +09001379
1380 for (const auto& server : servers) {
1381 auto t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
1382 t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
1383 t->startServer();
Mike Yu0a1c53d2018-11-26 13:26:21 +09001384 tls->push_back(std::move(t));
1385 }
1386}
1387
Mike Yu0a1c53d2018-11-26 13:26:21 +09001388TEST_F(ResolverTest, MaxServerPrune_Binder) {
Mike Yu0a1c53d2018-11-26 13:26:21 +09001389 std::vector<std::string> domains;
1390 std::vector<std::unique_ptr<test::DNSResponder>> dns;
1391 std::vector<std::unique_ptr<test::DnsTlsFrontend>> tls;
1392 std::vector<std::string> servers;
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001393 std::vector<DnsResponderClient::Mapping> mappings;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001394
1395 for (unsigned i = 0; i < MAXDNSRCH + 1; i++) {
1396 domains.push_back(StringPrintf("example%u.com", i));
1397 }
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001398 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupMappings(1, domains, &mappings));
1399 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupDNSServers(MAXNS + 1, mappings, &dns, &servers));
waynema0e73c2e2019-07-31 15:04:08 +08001400 ASSERT_NO_FATAL_FAILURE(setupTlsServers(servers, &tls));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001401
waynema0e73c2e2019-07-31 15:04:08 +08001402 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, domains, kDefaultParams,
1403 kDefaultPrivateDnsHostName));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001404
Mike Yu383855b2019-01-15 17:53:27 +08001405 // If the private DNS validation hasn't completed yet before backend DNS servers stop,
1406 // TLS servers will get stuck in handleOneRequest(), which causes this test stuck in
1407 // ~DnsTlsFrontend() because the TLS server loop threads can't be terminated.
1408 // So, wait for private DNS validation done before stopping backend DNS servers.
1409 for (int i = 0; i < MAXNS; i++) {
chenbruceaff85842019-05-31 15:46:42 +08001410 LOG(INFO) << "Waiting for private DNS validation on " << tls[i]->listen_address() << ".";
Mike Yu724f77d2019-08-16 11:14:50 +08001411 EXPECT_TRUE(WaitForPrivateDnsValidation(tls[i]->listen_address(), true));
chenbruceaff85842019-05-31 15:46:42 +08001412 LOG(INFO) << "private DNS validation on " << tls[i]->listen_address() << " done.";
Mike Yu383855b2019-01-15 17:53:27 +08001413 }
1414
Mike Yu0a1c53d2018-11-26 13:26:21 +09001415 std::vector<std::string> res_servers;
1416 std::vector<std::string> res_domains;
1417 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001418 res_params res_params;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001419 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +08001420 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001421 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1422 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1423 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001424
1425 // Check the size of the stats and its contents.
1426 EXPECT_EQ(static_cast<size_t>(MAXNS), res_servers.size());
1427 EXPECT_EQ(static_cast<size_t>(MAXNS), res_tls_servers.size());
1428 EXPECT_EQ(static_cast<size_t>(MAXDNSRCH), res_domains.size());
1429 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_servers.begin()));
1430 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_tls_servers.begin()));
1431 EXPECT_TRUE(std::equal(domains.begin(), domains.begin() + MAXDNSRCH, res_domains.begin()));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001432}
1433
1434TEST_F(ResolverTest, ResolverStats) {
Xiao Ma09b71022018-12-11 17:56:32 +09001435 constexpr char listen_addr1[] = "127.0.0.4";
1436 constexpr char listen_addr2[] = "127.0.0.5";
1437 constexpr char listen_addr3[] = "127.0.0.6";
Mike Yu0a1c53d2018-11-26 13:26:21 +09001438
1439 // Set server 1 timeout.
Mike Yufc125e42019-05-15 20:41:28 +08001440 test::DNSResponder dns1(listen_addr1, "53", static_cast<ns_rcode>(-1));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001441 dns1.setResponseProbability(0.0);
1442 ASSERT_TRUE(dns1.startServer());
1443
1444 // Set server 2 responding server failure.
Xiao Ma09b71022018-12-11 17:56:32 +09001445 test::DNSResponder dns2(listen_addr2);
Mike Yu0a1c53d2018-11-26 13:26:21 +09001446 dns2.setResponseProbability(0.0);
1447 ASSERT_TRUE(dns2.startServer());
1448
1449 // Set server 3 workable.
Xiao Ma09b71022018-12-11 17:56:32 +09001450 test::DNSResponder dns3(listen_addr3);
1451 dns3.addMapping(kHelloExampleCom, ns_type::ns_t_a, "1.2.3.4");
Mike Yu0a1c53d2018-11-26 13:26:21 +09001452 ASSERT_TRUE(dns3.startServer());
1453
1454 std::vector<std::string> servers = {listen_addr1, listen_addr2, listen_addr3};
Xiao Ma09b71022018-12-11 17:56:32 +09001455 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001456
1457 dns3.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +09001458 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
Mike Yu0a1c53d2018-11-26 13:26:21 +09001459 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
Xiao Ma09b71022018-12-11 17:56:32 +09001460 size_t found = GetNumQueries(dns3, kHelloExampleCom);
Mike Yu0a1c53d2018-11-26 13:26:21 +09001461 EXPECT_LE(1U, found);
1462 std::string result_str = ToString(result);
1463 EXPECT_TRUE(result_str == "1.2.3.4") << ", result_str='" << result_str << "'";
1464
Mike Yuc0000252020-03-19 07:14:23 +00001465 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1466 NameserverStats(listen_addr1).setTimeouts(1),
1467 NameserverStats(listen_addr2).setErrors(1),
1468 NameserverStats(listen_addr3).setSuccesses(1),
1469 };
1470 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001471}
1472
Mike Yu15791832020-02-11 13:38:48 +08001473TEST_F(ResolverTest, AlwaysUseLatestSetupParamsInLookups) {
1474 constexpr char listen_addr1[] = "127.0.0.3";
1475 constexpr char listen_addr2[] = "255.255.255.255";
1476 constexpr char listen_addr3[] = "127.0.0.4";
1477 constexpr char hostname[] = "hello";
1478 constexpr char fqdn_with_search_domain[] = "hello.domain2.com.";
1479
1480 test::DNSResponder dns1(listen_addr1, test::kDefaultListenService, static_cast<ns_rcode>(-1));
1481 dns1.setResponseProbability(0.0);
1482 ASSERT_TRUE(dns1.startServer());
1483
1484 test::DNSResponder dns3(listen_addr3);
1485 StartDns(dns3, {{fqdn_with_search_domain, ns_type::ns_t_a, "1.2.3.4"}});
1486
1487 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
1488 parcel.tlsServers.clear();
1489 parcel.servers = {listen_addr1, listen_addr2};
1490 parcel.domains = {"domain1.com", "domain2.com"};
1491 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1492
1493 // Expect the things happening in t1:
1494 // 1. The lookup starts using the first domain for query. It sends queries to the populated
1495 // nameserver list {listen_addr1, listen_addr2} for the hostname "hello.domain1.com".
1496 // 2. A different list of nameservers is updated to the resolver. Revision ID is incremented.
1497 // 3. The query for the hostname times out. The lookup fails to add the timeout record to the
1498 // the stats because of the unmatched revision ID.
1499 // 4. The lookup starts using the second domain for query. It sends queries to the populated
1500 // nameserver list {listen_addr3, listen_addr1, listen_addr2} for another hostname
1501 // "hello.domain2.com".
1502 // 5. The lookup gets the answer and updates a success record to the stats.
1503 std::thread t1([&hostname]() {
1504 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1505 ScopedAddrinfo result = safe_getaddrinfo(hostname, nullptr, &hints);
1506 EXPECT_NE(result.get(), nullptr);
1507 EXPECT_EQ(ToString(result), "1.2.3.4");
1508 });
1509
1510 // Wait for t1 to start the step 1.
1511 while (dns1.queries().size() == 0) {
1512 usleep(1000);
1513 }
1514
1515 // Update the resolver with three nameservers. This will increment the revision ID.
1516 parcel.servers = {listen_addr3, listen_addr1, listen_addr2};
1517 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1518
1519 t1.join();
1520 EXPECT_EQ(0U, GetNumQueriesForType(dns3, ns_type::ns_t_aaaa, fqdn_with_search_domain));
1521 EXPECT_EQ(1U, GetNumQueriesForType(dns3, ns_type::ns_t_a, fqdn_with_search_domain));
1522
Mike Yuc0000252020-03-19 07:14:23 +00001523 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1524 NameserverStats(listen_addr1),
1525 NameserverStats(listen_addr2),
1526 NameserverStats(listen_addr3).setSuccesses(1),
1527 };
1528 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
Mike Yu15791832020-02-11 13:38:48 +08001529}
1530
Ken Chenb9fa2062018-11-13 21:51:13 +08001531// Test what happens if the specified TLS server is nonexistent.
1532TEST_F(ResolverTest, GetHostByName_TlsMissing) {
Xiao Ma09b71022018-12-11 17:56:32 +09001533 constexpr char listen_addr[] = "127.0.0.3";
1534 constexpr char host_name[] = "tlsmissing.example.com.";
1535
1536 test::DNSResponder dns;
1537 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.3"}});
Luke Huangf8215372019-11-22 11:53:41 +08001538 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001539
1540 // There's nothing listening on this address, so validation will either fail or
1541 /// hang. Either way, queries will continue to flow to the DNSResponder.
waynema0e73c2e2019-07-31 15:04:08 +08001542 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Ken Chenb9fa2062018-11-13 21:51:13 +08001543
1544 const hostent* result;
1545
1546 result = gethostbyname("tlsmissing");
1547 ASSERT_FALSE(result == nullptr);
1548 EXPECT_EQ("1.2.3.3", ToString(result));
1549
1550 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001551 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001552}
1553
1554// Test what happens if the specified TLS server replies with garbage.
1555TEST_F(ResolverTest, GetHostByName_TlsBroken) {
Xiao Ma09b71022018-12-11 17:56:32 +09001556 constexpr char listen_addr[] = "127.0.0.3";
1557 constexpr char host_name1[] = "tlsbroken1.example.com.";
1558 constexpr char host_name2[] = "tlsbroken2.example.com.";
1559 const std::vector<DnsRecord> records = {
1560 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1561 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1562 };
1563
1564 test::DNSResponder dns;
1565 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001566 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001567
1568 // Bind the specified private DNS socket but don't respond to any client sockets yet.
1569 int s = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, IPPROTO_TCP);
1570 ASSERT_TRUE(s >= 0);
1571 struct sockaddr_in tlsServer = {
Luke Huangf8215372019-11-22 11:53:41 +08001572 .sin_family = AF_INET,
1573 .sin_port = htons(853),
Ken Chenb9fa2062018-11-13 21:51:13 +08001574 };
1575 ASSERT_TRUE(inet_pton(AF_INET, listen_addr, &tlsServer.sin_addr));
1576 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEPORT).ok());
1577 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEADDR).ok());
1578 ASSERT_FALSE(bind(s, reinterpret_cast<struct sockaddr*>(&tlsServer), sizeof(tlsServer)));
1579 ASSERT_FALSE(listen(s, 1));
1580
1581 // Trigger TLS validation.
waynema0e73c2e2019-07-31 15:04:08 +08001582 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Ken Chenb9fa2062018-11-13 21:51:13 +08001583
1584 struct sockaddr_storage cliaddr;
1585 socklen_t sin_size = sizeof(cliaddr);
Luke Huangf8215372019-11-22 11:53:41 +08001586 int new_fd = accept4(s, reinterpret_cast<struct sockaddr*>(&cliaddr), &sin_size, SOCK_CLOEXEC);
Ken Chenb9fa2062018-11-13 21:51:13 +08001587 ASSERT_TRUE(new_fd > 0);
1588
1589 // We've received the new file descriptor but not written to it or closed, so the
1590 // validation is still pending. Queries should still flow correctly because the
1591 // server is not used until validation succeeds.
1592 const hostent* result;
1593 result = gethostbyname("tlsbroken1");
1594 ASSERT_FALSE(result == nullptr);
1595 EXPECT_EQ("1.2.3.1", ToString(result));
1596
1597 // Now we cause the validation to fail.
1598 std::string garbage = "definitely not a valid TLS ServerHello";
1599 write(new_fd, garbage.data(), garbage.size());
1600 close(new_fd);
1601
1602 // Validation failure shouldn't interfere with lookups, because lookups won't be sent
1603 // to the TLS server unless validation succeeds.
1604 result = gethostbyname("tlsbroken2");
1605 ASSERT_FALSE(result == nullptr);
1606 EXPECT_EQ("1.2.3.2", ToString(result));
1607
1608 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001609 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001610 close(s);
1611}
1612
1613TEST_F(ResolverTest, GetHostByName_Tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001614 constexpr char listen_addr[] = "127.0.0.3";
1615 constexpr char listen_udp[] = "53";
1616 constexpr char listen_tls[] = "853";
1617 constexpr char host_name1[] = "tls1.example.com.";
1618 constexpr char host_name2[] = "tls2.example.com.";
1619 constexpr char host_name3[] = "tls3.example.com.";
1620 const std::vector<DnsRecord> records = {
1621 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1622 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1623 {host_name3, ns_type::ns_t_a, "1.2.3.3"},
1624 };
1625
1626 test::DNSResponder dns;
1627 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001628 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001629
1630 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1631 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001632 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08001633 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001634
Mike Yu724f77d2019-08-16 11:14:50 +08001635 const hostent* result = gethostbyname("tls1");
Ken Chenb9fa2062018-11-13 21:51:13 +08001636 ASSERT_FALSE(result == nullptr);
1637 EXPECT_EQ("1.2.3.1", ToString(result));
1638
1639 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001640 EXPECT_TRUE(tls.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001641
1642 // Stop the TLS server. Since we're in opportunistic mode, queries will
1643 // fall back to the locally-assigned (clear text) nameservers.
1644 tls.stopServer();
1645
1646 dns.clearQueries();
1647 result = gethostbyname("tls2");
1648 EXPECT_FALSE(result == nullptr);
1649 EXPECT_EQ("1.2.3.2", ToString(result));
1650 const auto queries = dns.queries();
1651 EXPECT_EQ(1U, queries.size());
waynema29253052019-08-20 11:26:08 +08001652 EXPECT_EQ("tls2.example.com.", queries[0].name);
1653 EXPECT_EQ(ns_t_a, queries[0].type);
Ken Chenb9fa2062018-11-13 21:51:13 +08001654
1655 // Reset the resolvers without enabling TLS. Queries should still be routed
1656 // to the UDP endpoint.
Xiao Ma09b71022018-12-11 17:56:32 +09001657 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001658
1659 result = gethostbyname("tls3");
1660 ASSERT_FALSE(result == nullptr);
1661 EXPECT_EQ("1.2.3.3", ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +08001662}
1663
Ken Chenb9fa2062018-11-13 21:51:13 +08001664TEST_F(ResolverTest, GetHostByName_TlsFailover) {
Xiao Ma09b71022018-12-11 17:56:32 +09001665 constexpr char listen_addr1[] = "127.0.0.3";
1666 constexpr char listen_addr2[] = "127.0.0.4";
1667 constexpr char listen_udp[] = "53";
1668 constexpr char listen_tls[] = "853";
1669 constexpr char host_name1[] = "tlsfailover1.example.com.";
1670 constexpr char host_name2[] = "tlsfailover2.example.com.";
1671 const std::vector<DnsRecord> records1 = {
1672 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1673 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1674 };
1675 const std::vector<DnsRecord> records2 = {
1676 {host_name1, ns_type::ns_t_a, "1.2.3.3"},
1677 {host_name2, ns_type::ns_t_a, "1.2.3.4"},
1678 };
1679
1680 test::DNSResponder dns1(listen_addr1);
1681 test::DNSResponder dns2(listen_addr2);
1682 StartDns(dns1, records1);
1683 StartDns(dns2, records2);
1684
Luke Huangf8215372019-11-22 11:53:41 +08001685 std::vector<std::string> servers = {listen_addr1, listen_addr2};
Ken Chenb9fa2062018-11-13 21:51:13 +08001686
1687 test::DnsTlsFrontend tls1(listen_addr1, listen_tls, listen_addr1, listen_udp);
1688 test::DnsTlsFrontend tls2(listen_addr2, listen_tls, listen_addr2, listen_udp);
1689 ASSERT_TRUE(tls1.startServer());
1690 ASSERT_TRUE(tls2.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001691 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1692 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08001693 EXPECT_TRUE(WaitForPrivateDnsValidation(tls1.listen_address(), true));
1694 EXPECT_TRUE(WaitForPrivateDnsValidation(tls2.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001695
Mike Yu724f77d2019-08-16 11:14:50 +08001696 const hostent* result = gethostbyname("tlsfailover1");
Ken Chenb9fa2062018-11-13 21:51:13 +08001697 ASSERT_FALSE(result == nullptr);
1698 EXPECT_EQ("1.2.3.1", ToString(result));
1699
1700 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001701 EXPECT_TRUE(tls1.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001702 // No new queries should have reached tls2.
Luke Huang3caa42b2020-04-23 14:18:04 +00001703 EXPECT_TRUE(tls2.waitForQueries(1));
Ken Chenb9fa2062018-11-13 21:51:13 +08001704
1705 // Stop tls1. Subsequent queries should attempt to reach tls1, fail, and retry to tls2.
1706 tls1.stopServer();
1707
1708 result = gethostbyname("tlsfailover2");
1709 EXPECT_EQ("1.2.3.4", ToString(result));
1710
1711 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001712 EXPECT_TRUE(tls2.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001713
1714 // No additional queries should have reached the insecure servers.
1715 EXPECT_EQ(2U, dns1.queries().size());
1716 EXPECT_EQ(2U, dns2.queries().size());
1717
1718 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001719 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Ken Chenb9fa2062018-11-13 21:51:13 +08001720}
1721
1722TEST_F(ResolverTest, GetHostByName_BadTlsName) {
Xiao Ma09b71022018-12-11 17:56:32 +09001723 constexpr char listen_addr[] = "127.0.0.3";
1724 constexpr char listen_udp[] = "53";
1725 constexpr char listen_tls[] = "853";
1726 constexpr char host_name[] = "badtlsname.example.com.";
1727
1728 test::DNSResponder dns;
1729 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.1"}});
Luke Huangf8215372019-11-22 11:53:41 +08001730 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001731
1732 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1733 ASSERT_TRUE(tls.startServer());
Xiao Ma09b71022018-12-11 17:56:32 +09001734 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
waynema0e73c2e2019-07-31 15:04:08 +08001735 kDefaultIncorrectPrivateDnsHostName));
Ken Chenb9fa2062018-11-13 21:51:13 +08001736
waynema0e73c2e2019-07-31 15:04:08 +08001737 // The TLS handshake would fail because the name of TLS server doesn't
1738 // match with TLS server's certificate.
Mike Yu724f77d2019-08-16 11:14:50 +08001739 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), false));
Ken Chenb9fa2062018-11-13 21:51:13 +08001740
1741 // The query should fail hard, because a name was specified.
1742 EXPECT_EQ(nullptr, gethostbyname("badtlsname"));
1743
1744 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001745 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001746}
1747
1748TEST_F(ResolverTest, GetAddrInfo_Tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001749 constexpr char listen_addr[] = "127.0.0.3";
1750 constexpr char listen_udp[] = "53";
1751 constexpr char listen_tls[] = "853";
1752 constexpr char host_name[] = "addrinfotls.example.com.";
1753 const std::vector<DnsRecord> records = {
1754 {host_name, ns_type::ns_t_a, "1.2.3.4"},
1755 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
1756 };
1757
1758 test::DNSResponder dns;
1759 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001760 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001761
1762 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1763 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001764 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1765 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08001766 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001767
1768 dns.clearQueries();
1769 ScopedAddrinfo result = safe_getaddrinfo("addrinfotls", nullptr, nullptr);
1770 EXPECT_TRUE(result != nullptr);
1771 size_t found = GetNumQueries(dns, host_name);
1772 EXPECT_LE(1U, found);
1773 // Could be A or AAAA
1774 std::string result_str = ToString(result);
1775 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +08001776 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08001777 // Wait for both A and AAAA queries to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001778 EXPECT_TRUE(tls.waitForQueries(3));
Ken Chenb9fa2062018-11-13 21:51:13 +08001779
1780 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001781 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001782}
1783
1784TEST_F(ResolverTest, TlsBypass) {
1785 const char OFF[] = "off";
1786 const char OPPORTUNISTIC[] = "opportunistic";
1787 const char STRICT[] = "strict";
1788
1789 const char GETHOSTBYNAME[] = "gethostbyname";
1790 const char GETADDRINFO[] = "getaddrinfo";
1791 const char GETADDRINFOFORNET[] = "getaddrinfofornet";
1792
1793 const unsigned BYPASS_NETID = NETID_USE_LOCAL_NAMESERVERS | TEST_NETID;
1794
Ken Chenb9fa2062018-11-13 21:51:13 +08001795 const char ADDR4[] = "192.0.2.1";
1796 const char ADDR6[] = "2001:db8::1";
1797
1798 const char cleartext_addr[] = "127.0.0.53";
1799 const char cleartext_port[] = "53";
1800 const char tls_port[] = "853";
Luke Huangf8215372019-11-22 11:53:41 +08001801 const std::vector<std::string> servers = {cleartext_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001802
Xiao Ma09b71022018-12-11 17:56:32 +09001803 test::DNSResponder dns(cleartext_addr);
Ken Chenb9fa2062018-11-13 21:51:13 +08001804 ASSERT_TRUE(dns.startServer());
1805
1806 test::DnsTlsFrontend tls(cleartext_addr, tls_port, cleartext_addr, cleartext_port);
Mike Yudd4ac2d2019-05-31 16:52:11 +08001807 ASSERT_TRUE(tls.startServer());
Ken Chenb9fa2062018-11-13 21:51:13 +08001808
Luke Huangf8215372019-11-22 11:53:41 +08001809 // clang-format off
Ken Chenb9fa2062018-11-13 21:51:13 +08001810 struct TestConfig {
1811 const std::string mode;
1812 const bool withWorkingTLS;
1813 const std::string method;
1814
1815 std::string asHostName() const {
Luke Huangf8215372019-11-22 11:53:41 +08001816 return StringPrintf("%s.%s.%s.", mode.c_str(), withWorkingTLS ? "tlsOn" : "tlsOff",
Ken Chenb9fa2062018-11-13 21:51:13 +08001817 method.c_str());
1818 }
1819 } testConfigs[]{
Ken Chenb9fa2062018-11-13 21:51:13 +08001820 {OFF, true, GETHOSTBYNAME},
1821 {OPPORTUNISTIC, true, GETHOSTBYNAME},
1822 {STRICT, true, GETHOSTBYNAME},
Ken Chenb9fa2062018-11-13 21:51:13 +08001823 {OFF, true, GETADDRINFO},
1824 {OPPORTUNISTIC, true, GETADDRINFO},
1825 {STRICT, true, GETADDRINFO},
Ken Chenb9fa2062018-11-13 21:51:13 +08001826 {OFF, true, GETADDRINFOFORNET},
1827 {OPPORTUNISTIC, true, GETADDRINFOFORNET},
1828 {STRICT, true, GETADDRINFOFORNET},
Mike Yudd4ac2d2019-05-31 16:52:11 +08001829 {OFF, false, GETHOSTBYNAME},
1830 {OPPORTUNISTIC, false, GETHOSTBYNAME},
1831 {STRICT, false, GETHOSTBYNAME},
1832 {OFF, false, GETADDRINFO},
1833 {OPPORTUNISTIC, false, GETADDRINFO},
1834 {STRICT, false, GETADDRINFO},
1835 {OFF, false, GETADDRINFOFORNET},
1836 {OPPORTUNISTIC, false, GETADDRINFOFORNET},
1837 {STRICT, false, GETADDRINFOFORNET},
Ken Chenb9fa2062018-11-13 21:51:13 +08001838 };
Luke Huangf8215372019-11-22 11:53:41 +08001839 // clang-format on
Ken Chenb9fa2062018-11-13 21:51:13 +08001840
1841 for (const auto& config : testConfigs) {
1842 const std::string testHostName = config.asHostName();
1843 SCOPED_TRACE(testHostName);
1844
1845 // Don't tempt test bugs due to caching.
1846 const char* host_name = testHostName.c_str();
1847 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
1848 dns.addMapping(host_name, ns_type::ns_t_aaaa, ADDR6);
1849
Mike Yudd4ac2d2019-05-31 16:52:11 +08001850 if (config.withWorkingTLS) {
1851 if (!tls.running()) {
1852 ASSERT_TRUE(tls.startServer());
1853 }
1854 } else {
1855 if (tls.running()) {
1856 ASSERT_TRUE(tls.stopServer());
1857 }
1858 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001859
1860 if (config.mode == OFF) {
Xiao Ma09b71022018-12-11 17:56:32 +09001861 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, kDefaultSearchDomains,
1862 kDefaultParams));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001863 } else /* OPPORTUNISTIC or STRICT */ {
1864 const char* tls_hostname = (config.mode == STRICT) ? kDefaultPrivateDnsHostName : "";
Xiao Ma09b71022018-12-11 17:56:32 +09001865 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001866 kDefaultParams, tls_hostname));
Mike Yu724f77d2019-08-16 11:14:50 +08001867
1868 // Wait for the validation event. If the server is running, the validation should
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001869 // succeed; otherwise, the validation should fail.
Mike Yu724f77d2019-08-16 11:14:50 +08001870 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), config.withWorkingTLS));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001871 if (config.withWorkingTLS) {
1872 EXPECT_TRUE(tls.waitForQueries(1));
1873 tls.clearQueries();
1874 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001875 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001876
1877 const hostent* h_result = nullptr;
1878 ScopedAddrinfo ai_result;
1879
1880 if (config.method == GETHOSTBYNAME) {
1881 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
1882 h_result = gethostbyname(host_name);
1883
1884 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
1885 ASSERT_FALSE(h_result == nullptr);
1886 ASSERT_EQ(4, h_result->h_length);
1887 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
1888 EXPECT_EQ(ADDR4, ToString(h_result));
1889 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
1890 } else if (config.method == GETADDRINFO) {
1891 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
1892 ai_result = safe_getaddrinfo(host_name, nullptr, nullptr);
1893 EXPECT_TRUE(ai_result != nullptr);
1894
1895 EXPECT_LE(1U, GetNumQueries(dns, host_name));
1896 // Could be A or AAAA
1897 const std::string result_str = ToString(ai_result);
1898 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
Luke Huangf8215372019-11-22 11:53:41 +08001899 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08001900 } else if (config.method == GETADDRINFOFORNET) {
1901 addrinfo* raw_ai_result = nullptr;
1902 EXPECT_EQ(0, android_getaddrinfofornet(host_name, /*servname=*/nullptr,
1903 /*hints=*/nullptr, BYPASS_NETID, MARK_UNSET,
1904 &raw_ai_result));
1905 ai_result.reset(raw_ai_result);
1906
1907 EXPECT_LE(1U, GetNumQueries(dns, host_name));
1908 // Could be A or AAAA
1909 const std::string result_str = ToString(ai_result);
1910 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
Luke Huangf8215372019-11-22 11:53:41 +08001911 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08001912 }
1913
Mike Yudd4ac2d2019-05-31 16:52:11 +08001914 EXPECT_EQ(0, tls.queries());
Ken Chenb9fa2062018-11-13 21:51:13 +08001915
1916 // Clear per-process resolv netid.
1917 ASSERT_EQ(0, setNetworkForResolv(NETID_UNSET));
Ken Chenb9fa2062018-11-13 21:51:13 +08001918 dns.clearQueries();
1919 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001920}
1921
1922TEST_F(ResolverTest, StrictMode_NoTlsServers) {
Xiao Ma09b71022018-12-11 17:56:32 +09001923 constexpr char cleartext_addr[] = "127.0.0.53";
Luke Huangf8215372019-11-22 11:53:41 +08001924 const std::vector<std::string> servers = {cleartext_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09001925 constexpr char host_name[] = "strictmode.notlsips.example.com.";
1926 const std::vector<DnsRecord> records = {
1927 {host_name, ns_type::ns_t_a, "1.2.3.4"},
1928 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
1929 };
Ken Chenb9fa2062018-11-13 21:51:13 +08001930
Xiao Ma09b71022018-12-11 17:56:32 +09001931 test::DNSResponder dns(cleartext_addr);
1932 StartDns(dns, records);
Ken Chenb9fa2062018-11-13 21:51:13 +08001933
waynema0e73c2e2019-07-31 15:04:08 +08001934 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1935 kDefaultIncorrectPrivateDnsHostName));
Ken Chenb9fa2062018-11-13 21:51:13 +08001936
1937 addrinfo* ai_result = nullptr;
1938 EXPECT_NE(0, getaddrinfo(host_name, nullptr, nullptr, &ai_result));
1939 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
1940}
Luke Huang94b10b92018-11-21 20:13:38 +08001941
1942namespace {
1943
Luke Huang70931aa2019-01-31 11:57:41 +08001944int getAsyncResponse(int fd, int* rcode, uint8_t* buf, int bufLen) {
Luke Huang94b10b92018-11-21 20:13:38 +08001945 struct pollfd wait_fd[1];
1946 wait_fd[0].fd = fd;
1947 wait_fd[0].events = POLLIN;
1948 short revents;
1949 int ret;
1950
1951 ret = poll(wait_fd, 1, -1);
1952 revents = wait_fd[0].revents;
1953 if (revents & POLLIN) {
1954 int n = resNetworkResult(fd, rcode, buf, bufLen);
Luke Huangba7bef92018-12-26 16:53:03 +08001955 // Verify that resNetworkResult() closed the fd
1956 char dummy;
1957 EXPECT_EQ(-1, read(fd, &dummy, sizeof dummy));
1958 EXPECT_EQ(EBADF, errno);
Luke Huang94b10b92018-11-21 20:13:38 +08001959 return n;
1960 }
1961 return -1;
1962}
1963
Luke Huang70931aa2019-01-31 11:57:41 +08001964std::string toString(uint8_t* buf, int bufLen, int ipType) {
Luke Huang94b10b92018-11-21 20:13:38 +08001965 ns_msg handle;
1966 int ancount, n = 0;
1967 ns_rr rr;
1968
Luke Huangf8215372019-11-22 11:53:41 +08001969 if (ns_initparse((const uint8_t*)buf, bufLen, &handle) >= 0) {
Luke Huang94b10b92018-11-21 20:13:38 +08001970 ancount = ns_msg_count(handle, ns_s_an);
1971 if (ns_parserr(&handle, ns_s_an, n, &rr) == 0) {
Luke Huang70931aa2019-01-31 11:57:41 +08001972 const uint8_t* rdata = ns_rr_rdata(rr);
Luke Huang94b10b92018-11-21 20:13:38 +08001973 char buffer[INET6_ADDRSTRLEN];
Luke Huangf8215372019-11-22 11:53:41 +08001974 if (inet_ntop(ipType, (const char*)rdata, buffer, sizeof(buffer))) {
Luke Huang94b10b92018-11-21 20:13:38 +08001975 return buffer;
1976 }
1977 }
1978 }
1979 return "";
1980}
1981
1982int dns_open_proxy() {
1983 int s = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
1984 if (s == -1) {
1985 return -1;
1986 }
1987 const int one = 1;
1988 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
1989
1990 static const struct sockaddr_un proxy_addr = {
1991 .sun_family = AF_UNIX,
1992 .sun_path = "/dev/socket/dnsproxyd",
1993 };
1994
Luke Huangf8215372019-11-22 11:53:41 +08001995 if (TEMP_FAILURE_RETRY(connect(s, (const struct sockaddr*)&proxy_addr, sizeof(proxy_addr))) !=
Luke Huang94b10b92018-11-21 20:13:38 +08001996 0) {
1997 close(s);
1998 return -1;
1999 }
2000
2001 return s;
2002}
2003
Luke Huangba7bef92018-12-26 16:53:03 +08002004void expectAnswersValid(int fd, int ipType, const std::string& expectedAnswer) {
2005 int rcode = -1;
2006 uint8_t buf[MAXPACKET] = {};
2007
2008 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2009 EXPECT_GT(res, 0);
2010 EXPECT_EQ(expectedAnswer, toString(buf, res, ipType));
2011}
2012
2013void expectAnswersNotValid(int fd, int expectedErrno) {
2014 int rcode = -1;
2015 uint8_t buf[MAXPACKET] = {};
2016
2017 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2018 EXPECT_EQ(expectedErrno, res);
2019}
2020
Luke Huang94b10b92018-11-21 20:13:38 +08002021} // namespace
2022
2023TEST_F(ResolverTest, Async_NormalQueryV4V6) {
Xiao Ma09b71022018-12-11 17:56:32 +09002024 constexpr char listen_addr[] = "127.0.0.4";
2025 constexpr char host_name[] = "howdy.example.com.";
2026 const std::vector<DnsRecord> records = {
2027 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2028 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2029 };
2030
2031 test::DNSResponder dns(listen_addr);
2032 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002033 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002034 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002035
Luke Huangba7bef92018-12-26 16:53:03 +08002036 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2037 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002038 EXPECT_TRUE(fd1 != -1);
2039 EXPECT_TRUE(fd2 != -1);
2040
Luke Huang70931aa2019-01-31 11:57:41 +08002041 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002042 int rcode;
2043 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2044 EXPECT_GT(res, 0);
2045 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
2046
2047 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2048 EXPECT_GT(res, 0);
2049 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2050
2051 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
2052
2053 // Re-query verify cache works
Luke Huangba7bef92018-12-26 16:53:03 +08002054 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2055 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002056
2057 EXPECT_TRUE(fd1 != -1);
2058 EXPECT_TRUE(fd2 != -1);
2059
2060 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2061 EXPECT_GT(res, 0);
2062 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
2063
2064 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2065 EXPECT_GT(res, 0);
2066 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2067
2068 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
2069}
2070
2071TEST_F(ResolverTest, Async_BadQuery) {
Xiao Ma09b71022018-12-11 17:56:32 +09002072 constexpr char listen_addr[] = "127.0.0.4";
2073 constexpr char host_name[] = "howdy.example.com.";
2074 const std::vector<DnsRecord> records = {
2075 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2076 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2077 };
2078
2079 test::DNSResponder dns(listen_addr);
2080 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002081 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002082 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002083
2084 static struct {
2085 int fd;
2086 const char* dname;
2087 const int queryType;
2088 const int expectRcode;
2089 } kTestData[] = {
Luke Huangba7bef92018-12-26 16:53:03 +08002090 {-1, "", ns_t_aaaa, 0},
2091 {-1, "as65ass46", ns_t_aaaa, 0},
2092 {-1, "454564564564", ns_t_aaaa, 0},
2093 {-1, "h645235", ns_t_a, 0},
2094 {-1, "www.google.com", ns_t_a, 0},
Luke Huang94b10b92018-11-21 20:13:38 +08002095 };
2096
2097 for (auto& td : kTestData) {
2098 SCOPED_TRACE(td.dname);
Luke Huangba7bef92018-12-26 16:53:03 +08002099 td.fd = resNetworkQuery(TEST_NETID, td.dname, ns_c_in, td.queryType, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002100 EXPECT_TRUE(td.fd != -1);
2101 }
2102
2103 // dns_responder return empty resp(packet only contains query part) with no error currently
2104 for (const auto& td : kTestData) {
Luke Huang70931aa2019-01-31 11:57:41 +08002105 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002106 int rcode;
2107 SCOPED_TRACE(td.dname);
2108 int res = getAsyncResponse(td.fd, &rcode, buf, MAXPACKET);
2109 EXPECT_GT(res, 0);
2110 EXPECT_EQ(rcode, td.expectRcode);
2111 }
2112}
2113
2114TEST_F(ResolverTest, Async_EmptyAnswer) {
Xiao Ma09b71022018-12-11 17:56:32 +09002115 constexpr char listen_addr[] = "127.0.0.4";
2116 constexpr char host_name[] = "howdy.example.com.";
2117 const std::vector<DnsRecord> records = {
2118 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2119 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2120 };
2121
2122 test::DNSResponder dns(listen_addr);
2123 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002124 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002125 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002126
Luke Huang9c264bb2018-12-18 16:44:41 +08002127 // TODO: Disable retry to make this test explicit.
2128 auto& cv = dns.getCv();
2129 auto& cvMutex = dns.getCvMutex();
2130 int fd1;
2131 // Wait on the condition variable to ensure that the DNS server has handled our first query.
2132 {
2133 std::unique_lock lk(cvMutex);
Luke Huangba7bef92018-12-26 16:53:03 +08002134 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang9c264bb2018-12-18 16:44:41 +08002135 EXPECT_TRUE(fd1 != -1);
2136 EXPECT_EQ(std::cv_status::no_timeout, cv.wait_for(lk, std::chrono::seconds(1)));
2137 }
Luke Huang94b10b92018-11-21 20:13:38 +08002138
Luke Huang94b10b92018-11-21 20:13:38 +08002139 dns.setResponseProbability(0.0);
Luke Huang94b10b92018-11-21 20:13:38 +08002140
Luke Huangba7bef92018-12-26 16:53:03 +08002141 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002142 EXPECT_TRUE(fd2 != -1);
2143
Luke Huangba7bef92018-12-26 16:53:03 +08002144 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002145 EXPECT_TRUE(fd3 != -1);
2146
Luke Huang9c264bb2018-12-18 16:44:41 +08002147 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002148 int rcode;
2149
Luke Huang9c264bb2018-12-18 16:44:41 +08002150 // expect no response
2151 int res = getAsyncResponse(fd3, &rcode, buf, MAXPACKET);
2152 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huang94b10b92018-11-21 20:13:38 +08002153
Luke Huang9c264bb2018-12-18 16:44:41 +08002154 // expect no response
Luke Huang94b10b92018-11-21 20:13:38 +08002155 memset(buf, 0, MAXPACKET);
Luke Huang9c264bb2018-12-18 16:44:41 +08002156 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2157 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huang94b10b92018-11-21 20:13:38 +08002158
Luke Huang94b10b92018-11-21 20:13:38 +08002159 dns.setResponseProbability(1.0);
Luke Huang94b10b92018-11-21 20:13:38 +08002160
Luke Huangba7bef92018-12-26 16:53:03 +08002161 int fd4 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002162 EXPECT_TRUE(fd4 != -1);
2163
2164 memset(buf, 0, MAXPACKET);
2165 res = getAsyncResponse(fd4, &rcode, buf, MAXPACKET);
2166 EXPECT_GT(res, 0);
2167 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2168
2169 memset(buf, 0, MAXPACKET);
2170 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2171 EXPECT_GT(res, 0);
2172 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
2173}
2174
2175TEST_F(ResolverTest, Async_MalformedQuery) {
Xiao Ma09b71022018-12-11 17:56:32 +09002176 constexpr char listen_addr[] = "127.0.0.4";
2177 constexpr char host_name[] = "howdy.example.com.";
2178 const std::vector<DnsRecord> records = {
2179 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2180 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2181 };
2182
2183 test::DNSResponder dns(listen_addr);
2184 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002185 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002186 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002187
2188 int fd = dns_open_proxy();
2189 EXPECT_TRUE(fd > 0);
2190
2191 const std::string badMsg = "16-52512#";
Xiao Ma09b71022018-12-11 17:56:32 +09002192 static const struct {
Luke Huang94b10b92018-11-21 20:13:38 +08002193 const std::string cmd;
2194 const int expectErr;
2195 } kTestData[] = {
Luke Huangba7bef92018-12-26 16:53:03 +08002196 // Too few arguments
Luke Huang94b10b92018-11-21 20:13:38 +08002197 {"resnsend " + badMsg + '\0', -EINVAL},
2198 // Bad netId
Luke Huangba7bef92018-12-26 16:53:03 +08002199 {"resnsend badnetId 0 " + badMsg + '\0', -EINVAL},
Luke Huang94b10b92018-11-21 20:13:38 +08002200 // Bad raw data
Luke Huangba7bef92018-12-26 16:53:03 +08002201 {"resnsend " + std::to_string(TEST_NETID) + " 0 " + badMsg + '\0', -EILSEQ},
Luke Huang94b10b92018-11-21 20:13:38 +08002202 };
2203
2204 for (unsigned int i = 0; i < std::size(kTestData); i++) {
2205 auto& td = kTestData[i];
2206 SCOPED_TRACE(td.cmd);
2207 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, td.cmd.c_str(), td.cmd.size()));
2208 EXPECT_EQ(rc, static_cast<ssize_t>(td.cmd.size()));
2209
2210 int32_t tmp;
2211 rc = TEMP_FAILURE_RETRY(read(fd, &tmp, sizeof(tmp)));
2212 EXPECT_TRUE(rc > 0);
2213 EXPECT_EQ(static_cast<int>(ntohl(tmp)), td.expectErr);
2214 }
2215 // Normal query with answer buffer
2216 // This is raw data of query "howdy.example.com" type 1 class 1
2217 std::string query = "81sBAAABAAAAAAAABWhvd2R5B2V4YW1wbGUDY29tAAABAAE=";
Luke Huangba7bef92018-12-26 16:53:03 +08002218 std::string cmd = "resnsend " + std::to_string(TEST_NETID) + " 0 " + query + '\0';
Luke Huang94b10b92018-11-21 20:13:38 +08002219 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
2220 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
2221
Luke Huang70931aa2019-01-31 11:57:41 +08002222 uint8_t smallBuf[1] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002223 int rcode;
2224 rc = getAsyncResponse(fd, &rcode, smallBuf, 1);
Luke Huangba7bef92018-12-26 16:53:03 +08002225 EXPECT_EQ(-EMSGSIZE, rc);
Luke Huang94b10b92018-11-21 20:13:38 +08002226
2227 // Do the normal test with large buffer again
2228 fd = dns_open_proxy();
2229 EXPECT_TRUE(fd > 0);
2230 rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
2231 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
Luke Huang70931aa2019-01-31 11:57:41 +08002232 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002233 rc = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2234 EXPECT_EQ("1.2.3.4", toString(buf, rc, AF_INET));
Mike Yu4f3747b2018-12-02 17:54:29 +09002235}
2236
Luke Huangba7bef92018-12-26 16:53:03 +08002237TEST_F(ResolverTest, Async_CacheFlags) {
Xiao Ma09b71022018-12-11 17:56:32 +09002238 constexpr char listen_addr[] = "127.0.0.4";
Luke Huangb9a10a82020-05-28 10:40:22 +00002239 constexpr char host_name1[] = "howdy.example.com.";
2240 constexpr char host_name2[] = "howdy.example2.com.";
2241 constexpr char host_name3[] = "howdy.example3.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002242 const std::vector<DnsRecord> records = {
Luke Huangb9a10a82020-05-28 10:40:22 +00002243 {host_name1, ns_type::ns_t_a, "1.2.3.4"}, {host_name1, ns_type::ns_t_aaaa, "::1.2.3.4"},
2244 {host_name2, ns_type::ns_t_a, "1.2.3.5"}, {host_name2, ns_type::ns_t_aaaa, "::1.2.3.5"},
2245 {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 +09002246 };
2247
2248 test::DNSResponder dns(listen_addr);
2249 StartDns(dns, records);
Luke Huangba7bef92018-12-26 16:53:03 +08002250 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002251 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huangba7bef92018-12-26 16:53:03 +08002252
2253 // ANDROID_RESOLV_NO_CACHE_STORE
2254 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2255 ANDROID_RESOLV_NO_CACHE_STORE);
2256 EXPECT_TRUE(fd1 != -1);
2257 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2258 ANDROID_RESOLV_NO_CACHE_STORE);
2259 EXPECT_TRUE(fd2 != -1);
2260 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2261 ANDROID_RESOLV_NO_CACHE_STORE);
2262 EXPECT_TRUE(fd3 != -1);
2263
2264 expectAnswersValid(fd3, AF_INET, "1.2.3.4");
2265 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
2266 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2267
2268 // No cache exists, expect 3 queries
Luke Huangb9a10a82020-05-28 10:40:22 +00002269 EXPECT_EQ(3U, GetNumQueries(dns, host_name1));
Luke Huangba7bef92018-12-26 16:53:03 +08002270
Luke Huangb9a10a82020-05-28 10:40:22 +00002271 // Raise a query with no flags to ensure no cache exists. Also make an cache entry for the
2272 // query.
Luke Huangba7bef92018-12-26 16:53:03 +08002273 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2274
2275 EXPECT_TRUE(fd1 != -1);
2276
2277 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2278
Luke Huangb9a10a82020-05-28 10:40:22 +00002279 // Expect 4 queries because there should be no cache before this query.
2280 EXPECT_EQ(4U, GetNumQueries(dns, host_name1));
2281
2282 // Now we have the cache entry, re-query with ANDROID_RESOLV_NO_CACHE_STORE to ensure
2283 // that ANDROID_RESOLV_NO_CACHE_STORE implied ANDROID_RESOLV_NO_CACHE_LOOKUP.
2284 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2285 ANDROID_RESOLV_NO_CACHE_STORE);
2286 EXPECT_TRUE(fd1 != -1);
2287 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2288 // Expect 5 queries because we shouldn't do cache lookup for the query which has
2289 // ANDROID_RESOLV_NO_CACHE_STORE.
2290 EXPECT_EQ(5U, GetNumQueries(dns, host_name1));
Luke Huangba7bef92018-12-26 16:53:03 +08002291
2292 // ANDROID_RESOLV_NO_CACHE_LOOKUP
2293 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2294 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2295 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2296 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2297
2298 EXPECT_TRUE(fd1 != -1);
2299 EXPECT_TRUE(fd2 != -1);
2300
2301 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
2302 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2303
Luke Huangb9a10a82020-05-28 10:40:22 +00002304 // Cache was skipped, expect 2 more queries.
2305 EXPECT_EQ(7U, GetNumQueries(dns, host_name1));
Luke Huangba7bef92018-12-26 16:53:03 +08002306
2307 // Re-query verify cache works
Luke Huangb9a10a82020-05-28 10:40:22 +00002308 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huangba7bef92018-12-26 16:53:03 +08002309 EXPECT_TRUE(fd1 != -1);
2310 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2311
Luke Huangb9a10a82020-05-28 10:40:22 +00002312 // Cache hits, expect still 7 queries
2313 EXPECT_EQ(7U, GetNumQueries(dns, host_name1));
Luke Huanga1d74182019-03-19 17:30:36 +08002314
2315 // Start to verify if ANDROID_RESOLV_NO_CACHE_LOOKUP does write response into cache
2316 dns.clearQueries();
2317
Luke Huangb9a10a82020-05-28 10:40:22 +00002318 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa,
Luke Huanga1d74182019-03-19 17:30:36 +08002319 ANDROID_RESOLV_NO_CACHE_LOOKUP);
Luke Huangb9a10a82020-05-28 10:40:22 +00002320 fd2 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa,
Luke Huanga1d74182019-03-19 17:30:36 +08002321 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2322
2323 EXPECT_TRUE(fd1 != -1);
2324 EXPECT_TRUE(fd2 != -1);
2325
Luke Huangb9a10a82020-05-28 10:40:22 +00002326 expectAnswersValid(fd2, AF_INET6, "::1.2.3.5");
2327 expectAnswersValid(fd1, AF_INET6, "::1.2.3.5");
Luke Huanga1d74182019-03-19 17:30:36 +08002328
2329 // Skip cache, expect 2 queries
Luke Huangb9a10a82020-05-28 10:40:22 +00002330 EXPECT_EQ(2U, GetNumQueries(dns, host_name2));
Luke Huanga1d74182019-03-19 17:30:36 +08002331
2332 // Re-query without flags
Luke Huangb9a10a82020-05-28 10:40:22 +00002333 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa, 0);
2334 fd2 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa, 0);
Luke Huanga1d74182019-03-19 17:30:36 +08002335
2336 EXPECT_TRUE(fd1 != -1);
2337 EXPECT_TRUE(fd2 != -1);
2338
Luke Huangb9a10a82020-05-28 10:40:22 +00002339 expectAnswersValid(fd2, AF_INET6, "::1.2.3.5");
2340 expectAnswersValid(fd1, AF_INET6, "::1.2.3.5");
Luke Huanga1d74182019-03-19 17:30:36 +08002341
2342 // Cache hits, expect still 2 queries
Luke Huangb9a10a82020-05-28 10:40:22 +00002343 EXPECT_EQ(2U, GetNumQueries(dns, host_name2));
Luke Huang40f5f492019-05-09 19:37:35 +08002344
2345 // Test both ANDROID_RESOLV_NO_CACHE_STORE and ANDROID_RESOLV_NO_CACHE_LOOKUP are set
2346 dns.clearQueries();
2347
Luke Huangb9a10a82020-05-28 10:40:22 +00002348 // Make sure that the cache of "howdy.example3.com" exists.
2349 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang40f5f492019-05-09 19:37:35 +08002350 EXPECT_TRUE(fd1 != -1);
Luke Huangb9a10a82020-05-28 10:40:22 +00002351 expectAnswersValid(fd1, AF_INET6, "::1.2.3.6");
2352 EXPECT_EQ(1U, GetNumQueries(dns, host_name3));
Luke Huang40f5f492019-05-09 19:37:35 +08002353
2354 // Re-query with testFlags
2355 const int testFlag = ANDROID_RESOLV_NO_CACHE_STORE | ANDROID_RESOLV_NO_CACHE_LOOKUP;
Luke Huangb9a10a82020-05-28 10:40:22 +00002356 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_aaaa, testFlag);
Luke Huang40f5f492019-05-09 19:37:35 +08002357 EXPECT_TRUE(fd1 != -1);
Luke Huangb9a10a82020-05-28 10:40:22 +00002358 expectAnswersValid(fd1, AF_INET6, "::1.2.3.6");
Luke Huang40f5f492019-05-09 19:37:35 +08002359 // Expect cache lookup is skipped.
Luke Huangb9a10a82020-05-28 10:40:22 +00002360 EXPECT_EQ(2U, GetNumQueries(dns, host_name3));
Luke Huang40f5f492019-05-09 19:37:35 +08002361
2362 // Do another query with testFlags
Luke Huangb9a10a82020-05-28 10:40:22 +00002363 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_a, testFlag);
Luke Huang40f5f492019-05-09 19:37:35 +08002364 EXPECT_TRUE(fd1 != -1);
Luke Huangb9a10a82020-05-28 10:40:22 +00002365 expectAnswersValid(fd1, AF_INET, "1.2.3.6");
Luke Huang40f5f492019-05-09 19:37:35 +08002366 // Expect cache lookup is skipped.
Luke Huangb9a10a82020-05-28 10:40:22 +00002367 EXPECT_EQ(3U, GetNumQueries(dns, host_name3));
Luke Huang40f5f492019-05-09 19:37:35 +08002368
2369 // Re-query with no flags
Luke Huangb9a10a82020-05-28 10:40:22 +00002370 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_a, 0);
Luke Huang40f5f492019-05-09 19:37:35 +08002371 EXPECT_TRUE(fd1 != -1);
Luke Huangb9a10a82020-05-28 10:40:22 +00002372 expectAnswersValid(fd1, AF_INET, "1.2.3.6");
Luke Huang40f5f492019-05-09 19:37:35 +08002373 // Expect no cache hit because cache storing is also skipped in previous query.
Luke Huangb9a10a82020-05-28 10:40:22 +00002374 EXPECT_EQ(4U, GetNumQueries(dns, host_name3));
Luke Huangba7bef92018-12-26 16:53:03 +08002375}
2376
Luke Huang08b13d22020-02-05 14:46:21 +08002377TEST_F(ResolverTest, Async_NoCacheStoreFlagDoesNotRefreshStaleCacheEntry) {
2378 constexpr char listen_addr[] = "127.0.0.4";
2379 constexpr char host_name[] = "howdy.example.com.";
2380 const std::vector<DnsRecord> records = {
2381 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2382 };
2383
2384 test::DNSResponder dns(listen_addr);
2385 StartDns(dns, records);
2386 std::vector<std::string> servers = {listen_addr};
2387 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
2388
2389 const unsigned SHORT_TTL_SEC = 1;
2390 dns.setTtl(SHORT_TTL_SEC);
2391
2392 // Refer to b/148842821 for the purpose of below test steps.
2393 // Basically, this test is used to ensure stale cache case is handled
2394 // correctly with ANDROID_RESOLV_NO_CACHE_STORE.
2395 int fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2396 EXPECT_TRUE(fd != -1);
2397 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2398
2399 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2400 dns.clearQueries();
2401
2402 // Wait until cache expired
2403 sleep(SHORT_TTL_SEC + 0.5);
2404
2405 // Now request the same hostname again.
2406 // We should see a new DNS query because the entry in cache has become stale.
2407 // Due to ANDROID_RESOLV_NO_CACHE_STORE, this query must *not* refresh that stale entry.
2408 fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2409 ANDROID_RESOLV_NO_CACHE_STORE);
2410 EXPECT_TRUE(fd != -1);
2411 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2412 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2413 dns.clearQueries();
2414
2415 // If the cache is still stale, we expect to see one more DNS query
2416 // (this time the cache will be refreshed, but we're not checking for it).
2417 fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2418 EXPECT_TRUE(fd != -1);
2419 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2420 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2421}
2422
Luke Huangba7bef92018-12-26 16:53:03 +08002423TEST_F(ResolverTest, Async_NoRetryFlag) {
Luke Huang70931aa2019-01-31 11:57:41 +08002424 constexpr char listen_addr0[] = "127.0.0.4";
2425 constexpr char listen_addr1[] = "127.0.0.6";
Xiao Ma09b71022018-12-11 17:56:32 +09002426 constexpr char host_name[] = "howdy.example.com.";
2427 const std::vector<DnsRecord> records = {
2428 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2429 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2430 };
2431
Luke Huang70931aa2019-01-31 11:57:41 +08002432 test::DNSResponder dns0(listen_addr0);
2433 test::DNSResponder dns1(listen_addr1);
2434 StartDns(dns0, records);
2435 StartDns(dns1, records);
2436 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr0, listen_addr1}));
Luke Huangba7bef92018-12-26 16:53:03 +08002437
Luke Huang70931aa2019-01-31 11:57:41 +08002438 dns0.clearQueries();
2439 dns1.clearQueries();
2440
2441 dns0.setResponseProbability(0.0);
2442 dns1.setResponseProbability(0.0);
Luke Huangba7bef92018-12-26 16:53:03 +08002443
2444 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2445 ANDROID_RESOLV_NO_RETRY);
2446 EXPECT_TRUE(fd1 != -1);
2447
2448 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa,
2449 ANDROID_RESOLV_NO_RETRY);
2450 EXPECT_TRUE(fd2 != -1);
2451
2452 // expect no response
2453 expectAnswersNotValid(fd1, -ETIMEDOUT);
2454 expectAnswersNotValid(fd2, -ETIMEDOUT);
2455
Luke Huang70931aa2019-01-31 11:57:41 +08002456 // No retry case, expect total 2 queries. The server is selected randomly.
2457 EXPECT_EQ(2U, GetNumQueries(dns0, host_name) + GetNumQueries(dns1, host_name));
Luke Huangba7bef92018-12-26 16:53:03 +08002458
Luke Huang70931aa2019-01-31 11:57:41 +08002459 dns0.clearQueries();
2460 dns1.clearQueries();
Luke Huangba7bef92018-12-26 16:53:03 +08002461
2462 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2463 EXPECT_TRUE(fd1 != -1);
2464
2465 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
2466 EXPECT_TRUE(fd2 != -1);
2467
2468 // expect no response
2469 expectAnswersNotValid(fd1, -ETIMEDOUT);
2470 expectAnswersNotValid(fd2, -ETIMEDOUT);
2471
2472 // Retry case, expect 4 queries
Luke Huang70931aa2019-01-31 11:57:41 +08002473 EXPECT_EQ(4U, GetNumQueries(dns0, host_name));
2474 EXPECT_EQ(4U, GetNumQueries(dns1, host_name));
2475}
2476
2477TEST_F(ResolverTest, Async_VerifyQueryID) {
2478 constexpr char listen_addr[] = "127.0.0.4";
2479 constexpr char host_name[] = "howdy.example.com.";
2480 const std::vector<DnsRecord> records = {
2481 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2482 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2483 };
2484
2485 test::DNSResponder dns(listen_addr);
2486 StartDns(dns, records);
2487 std::vector<std::string> servers = {listen_addr};
2488 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
2489
2490 const uint8_t queryBuf1[] = {
2491 /* Header */
2492 0x55, 0x66, /* Transaction ID */
2493 0x01, 0x00, /* Flags */
2494 0x00, 0x01, /* Questions */
2495 0x00, 0x00, /* Answer RRs */
2496 0x00, 0x00, /* Authority RRs */
2497 0x00, 0x00, /* Additional RRs */
2498 /* Queries */
2499 0x05, 0x68, 0x6f, 0x77, 0x64, 0x79, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
2500 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name */
2501 0x00, 0x01, /* Type */
2502 0x00, 0x01 /* Class */
2503 };
2504
2505 int fd = resNetworkSend(TEST_NETID, queryBuf1, sizeof(queryBuf1), 0);
2506 EXPECT_TRUE(fd != -1);
2507
2508 uint8_t buf[MAXPACKET] = {};
2509 int rcode;
2510
2511 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2512 EXPECT_GT(res, 0);
2513 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2514
2515 auto hp = reinterpret_cast<HEADER*>(buf);
2516 EXPECT_EQ(21862U, htons(hp->id));
2517
2518 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2519
2520 const uint8_t queryBuf2[] = {
2521 /* Header */
2522 0x00, 0x53, /* Transaction ID */
2523 0x01, 0x00, /* Flags */
2524 0x00, 0x01, /* Questions */
2525 0x00, 0x00, /* Answer RRs */
2526 0x00, 0x00, /* Authority RRs */
2527 0x00, 0x00, /* Additional RRs */
2528 /* Queries */
2529 0x05, 0x68, 0x6f, 0x77, 0x64, 0x79, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
2530 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name */
2531 0x00, 0x01, /* Type */
2532 0x00, 0x01 /* Class */
2533 };
2534
2535 // Re-query verify cache works and query id is correct
2536 fd = resNetworkSend(TEST_NETID, queryBuf2, sizeof(queryBuf2), 0);
2537
2538 EXPECT_TRUE(fd != -1);
2539
2540 res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2541 EXPECT_GT(res, 0);
2542 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2543
2544 EXPECT_EQ(0x0053U, htons(hp->id));
2545
2546 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
Luke Huangba7bef92018-12-26 16:53:03 +08002547}
2548
Mike Yu4f3747b2018-12-02 17:54:29 +09002549// This test checks that the resolver should not generate the request containing OPT RR when using
Ken Chen0a015532019-01-02 14:59:38 +08002550// cleartext DNS. If we query the DNS server not supporting EDNS0 and it reponds with
2551// FORMERR_ON_EDNS, we will fallback to no EDNS0 and try again. If the server does no response, we
2552// won't retry so that we get no answer.
Mike Yu4f3747b2018-12-02 17:54:29 +09002553TEST_F(ResolverTest, BrokenEdns) {
2554 typedef test::DNSResponder::Edns Edns;
2555 enum ExpectResult { EXPECT_FAILURE, EXPECT_SUCCESS };
2556
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002557 // Perform cleartext query in off mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002558 const char OFF[] = "off";
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002559
2560 // Perform cleartext query when there's no private DNS server validated in opportunistic mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002561 const char OPPORTUNISTIC_UDP[] = "opportunistic_udp";
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002562
2563 // Perform cleartext query when there is a private DNS server validated in opportunistic mode.
2564 const char OPPORTUNISTIC_FALLBACK_UDP[] = "opportunistic_fallback_udp";
2565
2566 // Perform cyphertext query in opportunistic mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002567 const char OPPORTUNISTIC_TLS[] = "opportunistic_tls";
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002568
2569 // Perform cyphertext query in strict mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002570 const char STRICT[] = "strict";
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002571
Mike Yu4f3747b2018-12-02 17:54:29 +09002572 const char GETHOSTBYNAME[] = "gethostbyname";
2573 const char GETADDRINFO[] = "getaddrinfo";
Mike Yu4f3747b2018-12-02 17:54:29 +09002574 const char ADDR4[] = "192.0.2.1";
2575 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2576 const char CLEARTEXT_PORT[] = "53";
2577 const char TLS_PORT[] = "853";
Luke Huangf8215372019-11-22 11:53:41 +08002578 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002579 ResolverParamsParcel paramsForCleanup = DnsResponderClient::GetDefaultResolverParamsParcel();
2580 paramsForCleanup.servers.clear();
2581 paramsForCleanup.tlsServers.clear();
Mike Yu4f3747b2018-12-02 17:54:29 +09002582
Mike Yufc125e42019-05-15 20:41:28 +08002583 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Mike Yu4f3747b2018-12-02 17:54:29 +09002584 ASSERT_TRUE(dns.startServer());
2585
2586 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2587
Luke Huangf8215372019-11-22 11:53:41 +08002588 // clang-format off
Mike Yu4f3747b2018-12-02 17:54:29 +09002589 static const struct TestConfig {
2590 std::string mode;
2591 std::string method;
2592 Edns edns;
2593 ExpectResult expectResult;
2594
2595 std::string asHostName() const {
2596 const char* ednsString;
2597 switch (edns) {
2598 case Edns::ON:
2599 ednsString = "ednsOn";
2600 break;
Ken Chen0a015532019-01-02 14:59:38 +08002601 case Edns::FORMERR_ON_EDNS:
Mike Yu4f3747b2018-12-02 17:54:29 +09002602 ednsString = "ednsFormerr";
2603 break;
2604 case Edns::DROP:
2605 ednsString = "ednsDrop";
2606 break;
2607 default:
2608 ednsString = "";
2609 break;
2610 }
2611 return StringPrintf("%s.%s.%s.", mode.c_str(), method.c_str(), ednsString);
2612 }
2613 } testConfigs[] = {
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002614 // In OPPORTUNISTIC_TLS, if the DNS server doesn't support EDNS0 but TLS, the lookup
2615 // fails. Could such server exist? if so, we might need to fix it to fallback to
2616 // cleartext query. If the server still make no response for the queries with EDNS0, we
2617 // might also need to fix it to retry without EDNS0.
Mike Yu4f3747b2018-12-02 17:54:29 +09002618 // Another thing is that {OPPORTUNISTIC_TLS, Edns::DROP} and {STRICT, Edns::DROP} are
2619 // commented out since TLS timeout is not configurable.
2620 // TODO: Uncomment them after TLS timeout is configurable.
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002621 {OFF, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2622 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2623 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2624 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2625 {STRICT, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2626 {OFF, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2627 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2628 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2629 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2630 {STRICT, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2631 {OFF, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2632 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2633
2634 // The failure is due to no retry on timeout. Maybe fix it?
2635 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2636
2637 //{OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2638 //{STRICT, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2639 {OFF, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2640 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2641 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2642 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2643 {STRICT, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2644 {OFF, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2645 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2646 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2647 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2648 {STRICT, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2649 {OFF, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2650 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2651
2652 // The failure is due to no retry on timeout. Maybe fix it?
2653 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2654
Mike Yu4f3747b2018-12-02 17:54:29 +09002655 //{OPPORTUNISTIC_TLS, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2656 //{STRICT, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2657 };
Luke Huangf8215372019-11-22 11:53:41 +08002658 // clang-format on
Mike Yu4f3747b2018-12-02 17:54:29 +09002659
2660 for (const auto& config : testConfigs) {
2661 const std::string testHostName = config.asHostName();
2662 SCOPED_TRACE(testHostName);
2663
2664 const char* host_name = testHostName.c_str();
2665 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
2666 dns.setEdns(config.edns);
2667
2668 if (config.mode == OFF) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002669 if (tls.running()) {
2670 ASSERT_TRUE(tls.stopServer());
2671 }
Xiao Ma09b71022018-12-11 17:56:32 +09002672 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Mike Yu4f3747b2018-12-02 17:54:29 +09002673 } else if (config.mode == OPPORTUNISTIC_UDP) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002674 if (tls.running()) {
2675 ASSERT_TRUE(tls.stopServer());
2676 }
Xiao Ma09b71022018-12-11 17:56:32 +09002677 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002678 kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002679 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), false));
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002680 } else if (config.mode == OPPORTUNISTIC_TLS || config.mode == OPPORTUNISTIC_FALLBACK_UDP) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002681 if (!tls.running()) {
2682 ASSERT_TRUE(tls.startServer());
2683 }
Xiao Ma09b71022018-12-11 17:56:32 +09002684 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002685 kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002686 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002687
2688 if (config.mode == OPPORTUNISTIC_FALLBACK_UDP) {
2689 // Force the resolver to fallback to cleartext queries.
2690 ASSERT_TRUE(tls.stopServer());
2691 }
Mike Yu4f3747b2018-12-02 17:54:29 +09002692 } else if (config.mode == STRICT) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002693 if (!tls.running()) {
2694 ASSERT_TRUE(tls.startServer());
2695 }
Xiao Ma09b71022018-12-11 17:56:32 +09002696 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002697 kDefaultParams, kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08002698 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Mike Yu4f3747b2018-12-02 17:54:29 +09002699 }
2700
2701 if (config.method == GETHOSTBYNAME) {
2702 const hostent* h_result = gethostbyname(host_name);
2703 if (config.expectResult == EXPECT_SUCCESS) {
2704 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2705 ASSERT_TRUE(h_result != nullptr);
2706 ASSERT_EQ(4, h_result->h_length);
2707 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
2708 EXPECT_EQ(ADDR4, ToString(h_result));
2709 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
2710 } else {
2711 EXPECT_EQ(0U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
2712 ASSERT_TRUE(h_result == nullptr);
2713 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2714 }
2715 } else if (config.method == GETADDRINFO) {
2716 ScopedAddrinfo ai_result;
2717 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2718 ai_result = safe_getaddrinfo(host_name, nullptr, &hints);
2719 if (config.expectResult == EXPECT_SUCCESS) {
2720 EXPECT_TRUE(ai_result != nullptr);
2721 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2722 const std::string result_str = ToString(ai_result);
2723 EXPECT_EQ(ADDR4, result_str);
2724 } else {
2725 EXPECT_TRUE(ai_result == nullptr);
2726 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
2727 }
2728 } else {
2729 FAIL() << "Unsupported query method: " << config.method;
2730 }
2731
Mike Yudd4ac2d2019-05-31 16:52:11 +08002732 tls.clearQueries();
Mike Yu4f3747b2018-12-02 17:54:29 +09002733 dns.clearQueries();
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002734
2735 // Clear the setup to force the resolver to validate private DNS servers in every test.
2736 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(paramsForCleanup));
Mike Yu4f3747b2018-12-02 17:54:29 +09002737 }
Mike Yu4f3747b2018-12-02 17:54:29 +09002738}
nuccachena26cc2a2018-07-17 18:07:23 +08002739
Ken Chen0a015532019-01-02 14:59:38 +08002740// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2741// Resolver should have a reasonable number of retries instead of spinning forever. We don't have
2742// an efficient way to know if resolver is stuck in an infinite loop. However, test case will be
2743// failed due to timeout.
2744TEST_F(ResolverTest, UnstableTls) {
2745 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2746 const char CLEARTEXT_PORT[] = "53";
2747 const char TLS_PORT[] = "853";
2748 const char* host_name1 = "nonexistent1.example.com.";
2749 const char* host_name2 = "nonexistent2.example.com.";
2750 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
2751
Mike Yufc125e42019-05-15 20:41:28 +08002752 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Ken Chen0a015532019-01-02 14:59:38 +08002753 ASSERT_TRUE(dns.startServer());
2754 dns.setEdns(test::DNSResponder::Edns::FORMERR_ON_EDNS);
2755 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2756 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08002757 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002758 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
2759
Ken Chen0a015532019-01-02 14:59:38 +08002760 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
2761 tls.stopServer();
2762
2763 const hostent* h_result = gethostbyname(host_name1);
2764 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
2765 ASSERT_TRUE(h_result == nullptr);
2766 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2767
2768 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2769 ScopedAddrinfo ai_result = safe_getaddrinfo(host_name2, nullptr, &hints);
2770 EXPECT_TRUE(ai_result == nullptr);
2771 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
2772}
2773
2774// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2775// Moreover, server responds RCODE=FORMERR even on non-EDNS query.
2776TEST_F(ResolverTest, BogusDnsServer) {
2777 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2778 const char CLEARTEXT_PORT[] = "53";
2779 const char TLS_PORT[] = "853";
2780 const char* host_name1 = "nonexistent1.example.com.";
2781 const char* host_name2 = "nonexistent2.example.com.";
2782 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
2783
Mike Yufc125e42019-05-15 20:41:28 +08002784 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Ken Chen0a015532019-01-02 14:59:38 +08002785 ASSERT_TRUE(dns.startServer());
2786 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2787 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08002788 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002789 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
2790
Ken Chen0a015532019-01-02 14:59:38 +08002791 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
2792 tls.stopServer();
2793 dns.setEdns(test::DNSResponder::Edns::FORMERR_UNCOND);
2794
2795 const hostent* h_result = gethostbyname(host_name1);
2796 EXPECT_EQ(0U, GetNumQueries(dns, host_name1));
2797 ASSERT_TRUE(h_result == nullptr);
2798 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2799
2800 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2801 ScopedAddrinfo ai_result = safe_getaddrinfo(host_name2, nullptr, &hints);
2802 EXPECT_TRUE(ai_result == nullptr);
2803 EXPECT_EQ(0U, GetNumQueries(dns, host_name2));
2804}
2805
nuccachena26cc2a2018-07-17 18:07:23 +08002806TEST_F(ResolverTest, GetAddrInfo_Dns64Synthesize) {
2807 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002808 constexpr char dns64_name[] = "ipv4only.arpa.";
2809 constexpr char host_name[] = "v4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002810 const std::vector<DnsRecord> records = {
2811 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2812 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2813 };
nuccachena26cc2a2018-07-17 18:07:23 +08002814
Xiao Ma09b71022018-12-11 17:56:32 +09002815 test::DNSResponder dns(listen_addr);
Xiao Ma09b71022018-12-11 17:56:32 +09002816 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002817
2818 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002819 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002820
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002821 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002822 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002823 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002824
2825 // hints are necessary in order to let netd know which type of addresses the caller is
2826 // interested in.
Xiao Ma09b71022018-12-11 17:56:32 +09002827 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08002828 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
2829 EXPECT_TRUE(result != nullptr);
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002830 // TODO: BUG: there should only be two queries, one AAAA (which returns no records) and one A
2831 // (which returns 1.2.3.4). But there is an extra AAAA.
2832 EXPECT_EQ(3U, GetNumQueries(dns, host_name));
nuccachena26cc2a2018-07-17 18:07:23 +08002833
2834 std::string result_str = ToString(result);
2835 EXPECT_EQ(result_str, "64:ff9b::102:304");
2836
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002837 // Stopping NAT64 prefix discovery disables synthesis.
Luke Huang5bd827c2019-03-14 16:10:04 +08002838 EXPECT_TRUE(mDnsClient.resolvService()->stopPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002839 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_NOT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002840
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002841 dns.clearQueries();
nuccachena26cc2a2018-07-17 18:07:23 +08002842
2843 result = safe_getaddrinfo("v4only", nullptr, &hints);
2844 EXPECT_TRUE(result != nullptr);
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002845 // TODO: BUG: there should only be one query, an AAAA (which returns no records), because the
2846 // A is already cached. But there is an extra AAAA.
2847 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
nuccachena26cc2a2018-07-17 18:07:23 +08002848
2849 result_str = ToString(result);
2850 EXPECT_EQ(result_str, "1.2.3.4");
2851}
2852
nuccachena26cc2a2018-07-17 18:07:23 +08002853TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecified) {
2854 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002855 constexpr char dns64_name[] = "ipv4only.arpa.";
2856 constexpr char host_name[] = "v4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002857 const std::vector<DnsRecord> records = {
2858 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2859 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2860 };
nuccachena26cc2a2018-07-17 18:07:23 +08002861
Xiao Ma09b71022018-12-11 17:56:32 +09002862 test::DNSResponder dns(listen_addr);
2863 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002864 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002865 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002866
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002867 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002868 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002869 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002870
2871 // Ensure to synthesize AAAA if AF_INET6 is specified, and not to synthesize AAAA
2872 // in AF_INET case.
2873 addrinfo hints;
2874 memset(&hints, 0, sizeof(hints));
2875 hints.ai_family = AF_INET6;
2876 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
2877 EXPECT_TRUE(result != nullptr);
2878 std::string result_str = ToString(result);
2879 EXPECT_EQ(result_str, "64:ff9b::102:304");
2880
2881 hints.ai_family = AF_INET;
2882 result = safe_getaddrinfo("v4only", nullptr, &hints);
2883 EXPECT_TRUE(result != nullptr);
2884 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2885 result_str = ToString(result);
2886 EXPECT_EQ(result_str, "1.2.3.4");
2887}
nuccachena26cc2a2018-07-17 18:07:23 +08002888
2889TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedV6) {
2890 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002891 constexpr char dns64_name[] = "ipv4only.arpa.";
2892 constexpr char host_name[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002893 const std::vector<DnsRecord> records = {
2894 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2895 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2896 {host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
2897 };
nuccachena26cc2a2018-07-17 18:07:23 +08002898
Xiao Ma09b71022018-12-11 17:56:32 +09002899 test::DNSResponder dns(listen_addr);
2900 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002901 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002902 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002903
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002904 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002905 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002906 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002907
Xiao Ma09b71022018-12-11 17:56:32 +09002908 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08002909 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
2910 EXPECT_TRUE(result != nullptr);
2911 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2912
2913 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
Xiao Ma09b71022018-12-11 17:56:32 +09002914 const std::vector<std::string> result_strs = ToStrings(result);
nuccachena26cc2a2018-07-17 18:07:23 +08002915 for (const auto& str : result_strs) {
2916 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
2917 << ", result_str='" << str << "'";
2918 }
2919}
2920
2921TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedNoV6) {
2922 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002923 constexpr char dns64_name[] = "ipv4only.arpa.";
2924 constexpr char host_name[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002925 const std::vector<DnsRecord> records = {
2926 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2927 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2928 };
nuccachena26cc2a2018-07-17 18:07:23 +08002929
Xiao Ma09b71022018-12-11 17:56:32 +09002930 test::DNSResponder dns(listen_addr);
2931 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002932 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002933 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002934
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002935 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002936 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002937 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002938
Xiao Ma09b71022018-12-11 17:56:32 +09002939 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08002940 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
2941 EXPECT_TRUE(result != nullptr);
2942 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2943
2944 // In AF_UNSPEC case, synthesize AAAA if there's no AAAA answer.
2945 std::string result_str = ToString(result);
2946 EXPECT_EQ(result_str, "64:ff9b::102:304");
2947}
2948
2949TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecialUseIPv4Addresses) {
2950 constexpr char THIS_NETWORK[] = "this_network";
2951 constexpr char LOOPBACK[] = "loopback";
2952 constexpr char LINK_LOCAL[] = "link_local";
2953 constexpr char MULTICAST[] = "multicast";
2954 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
2955
2956 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
2957 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
2958 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
2959 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
2960 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
2961
2962 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002963 constexpr char dns64_name[] = "ipv4only.arpa.";
2964
Xiao Ma09b71022018-12-11 17:56:32 +09002965 test::DNSResponder dns(listen_addr);
2966 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08002967 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002968 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002969
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002970 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002971 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002972 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002973
Luke Huangf8215372019-11-22 11:53:41 +08002974 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08002975 static const struct TestConfig {
2976 std::string name;
2977 std::string addr;
2978
2979 std::string asHostName() const { return StringPrintf("%s.example.com.", name.c_str()); }
2980 } testConfigs[]{
2981 {THIS_NETWORK, ADDR_THIS_NETWORK},
2982 {LOOPBACK, ADDR_LOOPBACK},
2983 {LINK_LOCAL, ADDR_LINK_LOCAL},
2984 {MULTICAST, ADDR_MULTICAST},
2985 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
2986 };
Luke Huangf8215372019-11-22 11:53:41 +08002987 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08002988
2989 for (const auto& config : testConfigs) {
2990 const std::string testHostName = config.asHostName();
2991 SCOPED_TRACE(testHostName);
2992
2993 const char* host_name = testHostName.c_str();
2994 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
2995
2996 addrinfo hints;
2997 memset(&hints, 0, sizeof(hints));
2998 hints.ai_family = AF_INET6;
2999 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
3000 // In AF_INET6 case, don't return IPv4 answers
3001 EXPECT_TRUE(result == nullptr);
3002 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3003 dns.clearQueries();
3004
3005 memset(&hints, 0, sizeof(hints));
3006 hints.ai_family = AF_UNSPEC;
3007 result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
3008 EXPECT_TRUE(result != nullptr);
3009 // Expect IPv6 query only. IPv4 answer has been cached in previous query.
3010 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3011 // In AF_UNSPEC case, don't synthesize special use IPv4 address.
3012 std::string result_str = ToString(result);
3013 EXPECT_EQ(result_str, config.addr.c_str());
3014 dns.clearQueries();
3015 }
3016}
3017
3018TEST_F(ResolverTest, GetAddrInfo_Dns64QueryWithNullArgumentHints) {
3019 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003020 constexpr char dns64_name[] = "ipv4only.arpa.";
3021 constexpr char host_name[] = "v4only.example.com.";
3022 constexpr char host_name2[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003023 const std::vector<DnsRecord> records = {
3024 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3025 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3026 {host_name2, ns_type::ns_t_a, "1.2.3.4"},
3027 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
3028 };
nuccachena26cc2a2018-07-17 18:07:23 +08003029
Xiao Ma09b71022018-12-11 17:56:32 +09003030 test::DNSResponder dns(listen_addr);
3031 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003032 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003033 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003034
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003035 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003036 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003037 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003038
3039 // Assign argument hints of getaddrinfo() as null is equivalent to set ai_family AF_UNSPEC.
3040 // In AF_UNSPEC case, synthesize AAAA if there has A answer only.
3041 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, nullptr);
3042 EXPECT_TRUE(result != nullptr);
3043 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3044 std::string result_str = ToString(result);
3045 EXPECT_EQ(result_str, "64:ff9b::102:304");
3046 dns.clearQueries();
3047
3048 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
3049 result = safe_getaddrinfo("v4v6", nullptr, nullptr);
3050 EXPECT_TRUE(result != nullptr);
3051 EXPECT_LE(2U, GetNumQueries(dns, host_name2));
3052 std::vector<std::string> result_strs = ToStrings(result);
3053 for (const auto& str : result_strs) {
3054 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
3055 << ", result_str='" << str << "'";
3056 }
3057}
3058
3059TEST_F(ResolverTest, GetAddrInfo_Dns64QueryNullArgumentNode) {
3060 constexpr char ADDR_ANYADDR_V4[] = "0.0.0.0";
3061 constexpr char ADDR_ANYADDR_V6[] = "::";
3062 constexpr char ADDR_LOCALHOST_V4[] = "127.0.0.1";
3063 constexpr char ADDR_LOCALHOST_V6[] = "::1";
3064
3065 constexpr char PORT_NAME_HTTP[] = "http";
3066 constexpr char PORT_NUMBER_HTTP[] = "80";
3067
3068 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003069 constexpr char dns64_name[] = "ipv4only.arpa.";
3070
Xiao Ma09b71022018-12-11 17:56:32 +09003071 test::DNSResponder dns(listen_addr);
3072 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003073 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003074 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003075
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003076 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003077 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003078 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003079
Luke Huangf8215372019-11-22 11:53:41 +08003080 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003081 // If node is null, return address is listed by libc/getaddrinfo.c as follows.
3082 // - passive socket -> anyaddr (0.0.0.0 or ::)
3083 // - non-passive socket -> localhost (127.0.0.1 or ::1)
3084 static const struct TestConfig {
3085 int flag;
3086 std::string addr_v4;
3087 std::string addr_v6;
3088
3089 std::string asParameters() const {
3090 return StringPrintf("flag=%d, addr_v4=%s, addr_v6=%s", flag, addr_v4.c_str(),
3091 addr_v6.c_str());
3092 }
3093 } testConfigs[]{
3094 {0 /* non-passive */, ADDR_LOCALHOST_V4, ADDR_LOCALHOST_V6},
3095 {AI_PASSIVE, ADDR_ANYADDR_V4, ADDR_ANYADDR_V6}
3096 };
Luke Huangf8215372019-11-22 11:53:41 +08003097 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003098
3099 for (const auto& config : testConfigs) {
3100 SCOPED_TRACE(config.asParameters());
3101
Xiao Ma09b71022018-12-11 17:56:32 +09003102 addrinfo hints = {
Nick Desaulnierscd6395a2019-10-11 09:15:24 -07003103 .ai_flags = config.flag,
Xiao Ma09b71022018-12-11 17:56:32 +09003104 .ai_family = AF_UNSPEC, // any address family
3105 .ai_socktype = 0, // any type
3106 .ai_protocol = 0, // any protocol
Xiao Ma09b71022018-12-11 17:56:32 +09003107 };
nuccachena26cc2a2018-07-17 18:07:23 +08003108
3109 // Assign hostname as null and service as port name.
3110 ScopedAddrinfo result = safe_getaddrinfo(nullptr, PORT_NAME_HTTP, &hints);
3111 ASSERT_TRUE(result != nullptr);
3112
3113 // Can't be synthesized because it should not get into Netd.
3114 std::vector<std::string> result_strs = ToStrings(result);
3115 for (const auto& str : result_strs) {
3116 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
3117 << ", result_str='" << str << "'";
3118 }
3119
3120 // Assign hostname as null and service as numeric port number.
3121 hints.ai_flags = config.flag | AI_NUMERICSERV;
3122 result = safe_getaddrinfo(nullptr, PORT_NUMBER_HTTP, &hints);
3123 ASSERT_TRUE(result != nullptr);
3124
3125 // Can't be synthesized because it should not get into Netd.
3126 result_strs = ToStrings(result);
3127 for (const auto& str : result_strs) {
3128 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
3129 << ", result_str='" << str << "'";
3130 }
3131 }
3132}
3133
3134TEST_F(ResolverTest, GetHostByAddr_ReverseDnsQueryWithHavingNat64Prefix) {
3135 struct hostent* result = nullptr;
3136 struct in_addr v4addr;
3137 struct in6_addr v6addr;
3138
3139 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003140 constexpr char dns64_name[] = "ipv4only.arpa.";
3141 constexpr char ptr_name[] = "v4v6.example.com.";
3142 // PTR record for IPv4 address 1.2.3.4
3143 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3144 // PTR record for IPv6 address 2001:db8::102:304
3145 constexpr char ptr_addr_v6[] =
3146 "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 +09003147 const std::vector<DnsRecord> records = {
3148 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3149 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3150 {ptr_addr_v6, ns_type::ns_t_ptr, ptr_name},
3151 };
nuccachena26cc2a2018-07-17 18:07:23 +08003152
Xiao Ma09b71022018-12-11 17:56:32 +09003153 test::DNSResponder dns(listen_addr);
3154 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003155 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003156 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003157
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003158 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003159 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003160 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003161
3162 // Reverse IPv4 DNS query. Prefix should have no effect on it.
3163 inet_pton(AF_INET, "1.2.3.4", &v4addr);
3164 result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
3165 ASSERT_TRUE(result != nullptr);
3166 std::string result_str = result->h_name ? result->h_name : "null";
3167 EXPECT_EQ(result_str, "v4v6.example.com");
3168
3169 // Reverse IPv6 DNS query. Prefix should have no effect on it.
3170 inet_pton(AF_INET6, "2001:db8::102:304", &v6addr);
3171 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3172 ASSERT_TRUE(result != nullptr);
3173 result_str = result->h_name ? result->h_name : "null";
3174 EXPECT_EQ(result_str, "v4v6.example.com");
3175}
3176
3177TEST_F(ResolverTest, GetHostByAddr_ReverseDns64Query) {
3178 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003179 constexpr char dns64_name[] = "ipv4only.arpa.";
3180 constexpr char ptr_name[] = "v4only.example.com.";
3181 // PTR record for IPv4 address 1.2.3.4
3182 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3183 // PTR record for IPv6 address 64:ff9b::1.2.3.4
3184 constexpr char ptr_addr_v6_nomapping[] =
3185 "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.";
3186 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
3187 // PTR record for IPv6 address 64:ff9b::5.6.7.8
3188 constexpr char ptr_addr_v6_synthesis[] =
3189 "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 +09003190 const std::vector<DnsRecord> records = {
3191 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3192 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3193 {ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis},
3194 };
nuccachena26cc2a2018-07-17 18:07:23 +08003195
Xiao Ma09b71022018-12-11 17:56:32 +09003196 test::DNSResponder dns(listen_addr);
3197 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003198 // "ptr_addr_v6_nomapping" is not mapped in DNS server
nuccachena26cc2a2018-07-17 18:07:23 +08003199 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003200 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003201
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003202 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003203 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003204 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003205
3206 // Synthesized PTR record doesn't exist on DNS server
3207 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
3208 // After querying synthesized address failed, expect that prefix is removed from IPv6
3209 // synthesized address and do reverse IPv4 query instead.
3210 struct in6_addr v6addr;
3211 inet_pton(AF_INET6, "64:ff9b::1.2.3.4", &v6addr);
3212 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3213 ASSERT_TRUE(result != nullptr);
3214 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist
3215 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist
3216 std::string result_str = result->h_name ? result->h_name : "null";
3217 EXPECT_EQ(result_str, "v4only.example.com");
3218 // Check that return address has been mapped from IPv4 to IPv6 address because Netd
3219 // removes NAT64 prefix and does IPv4 DNS reverse lookup in this case. Then, Netd
3220 // fakes the return IPv4 address as original queried IPv6 address.
3221 result_str = ToString(result);
3222 EXPECT_EQ(result_str, "64:ff9b::102:304");
3223 dns.clearQueries();
3224
3225 // Synthesized PTR record exists on DNS server
3226 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
3227 // Expect to Netd pass through synthesized address for DNS queries.
3228 inet_pton(AF_INET6, "64:ff9b::5.6.7.8", &v6addr);
3229 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3230 ASSERT_TRUE(result != nullptr);
3231 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
3232 result_str = result->h_name ? result->h_name : "null";
3233 EXPECT_EQ(result_str, "v6synthesis.example.com");
3234}
3235
3236TEST_F(ResolverTest, GetHostByAddr_ReverseDns64QueryFromHostFile) {
3237 constexpr char dns64_name[] = "ipv4only.arpa.";
3238 constexpr char host_name[] = "localhost";
3239 // The address is synthesized by prefix64:localhost.
3240 constexpr char host_addr[] = "64:ff9b::7f00:1";
nuccachena26cc2a2018-07-17 18:07:23 +08003241 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003242
3243 test::DNSResponder dns(listen_addr);
3244 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003245 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003246 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003247
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003248 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003249 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003250 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003251
3252 // Using synthesized "localhost" address to be a trick for resolving host name
3253 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
3254 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
3255 struct in6_addr v6addr;
3256 inet_pton(AF_INET6, host_addr, &v6addr);
3257 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3258 ASSERT_TRUE(result != nullptr);
3259 // Expect no DNS queries; localhost is resolved via /etc/hosts.
3260 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
3261
Luke Huangf8215372019-11-22 11:53:41 +08003262 ASSERT_EQ(sizeof(in6_addr), (unsigned)result->h_length);
nuccachena26cc2a2018-07-17 18:07:23 +08003263 ASSERT_EQ(AF_INET6, result->h_addrtype);
3264 std::string result_str = ToString(result);
3265 EXPECT_EQ(result_str, host_addr);
3266 result_str = result->h_name ? result->h_name : "null";
3267 EXPECT_EQ(result_str, host_name);
3268}
3269
Hungming Chen9e6185a2019-06-04 16:09:19 +08003270TEST_F(ResolverTest, GetHostByAddr_cnamesClasslessReverseDelegation) {
3271 // IPv4 addresses in the subnet with notation '/' or '-'.
3272 constexpr char addr_slash[] = "192.0.2.1";
3273 constexpr char addr_hyphen[] = "192.0.3.1";
3274
3275 // Used to verify DNS reverse query for classless reverse lookup zone. See detail in RFC 2317
3276 // section 4.
3277 const static std::vector<DnsRecord> records = {
3278 // The records for reverse querying "192.0.2.1" in the subnet with notation '/'.
3279 {"1.2.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0/25.2.0.192.in-addr.arpa."},
3280 {"1.0/25.2.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3281
3282 // The records for reverse querying "192.0.3.1" in the subnet with notation '-'.
3283 {"1.3.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0-127.3.0.192.in-addr.arpa."},
3284 {"1.0-127.3.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3285 };
3286
3287 test::DNSResponder dns;
3288 StartDns(dns, records);
3289 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3290
3291 for (const auto& address : {addr_slash, addr_hyphen}) {
3292 SCOPED_TRACE(address);
3293
3294 in_addr v4addr;
3295 ASSERT_TRUE(inet_pton(AF_INET, address, &v4addr));
3296 hostent* result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
3297 ASSERT_TRUE(result != nullptr);
3298 EXPECT_STREQ("hello.example.com", result->h_name);
3299 }
3300}
3301
nuccachena26cc2a2018-07-17 18:07:23 +08003302TEST_F(ResolverTest, GetNameInfo_ReverseDnsQueryWithHavingNat64Prefix) {
3303 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003304 constexpr char dns64_name[] = "ipv4only.arpa.";
3305 constexpr char ptr_name[] = "v4v6.example.com.";
3306 // PTR record for IPv4 address 1.2.3.4
3307 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3308 // PTR record for IPv6 address 2001:db8::102:304
3309 constexpr char ptr_addr_v6[] =
3310 "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 +09003311 const std::vector<DnsRecord> records = {
3312 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3313 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3314 {ptr_addr_v6, ns_type::ns_t_ptr, ptr_name},
3315 };
nuccachena26cc2a2018-07-17 18:07:23 +08003316
Xiao Ma09b71022018-12-11 17:56:32 +09003317 test::DNSResponder dns(listen_addr);
3318 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003319 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003320 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003321
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003322 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003323 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003324 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003325
Luke Huangf8215372019-11-22 11:53:41 +08003326 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003327 static const struct TestConfig {
3328 int flag;
3329 int family;
3330 std::string addr;
3331 std::string host;
3332
3333 std::string asParameters() const {
3334 return StringPrintf("flag=%d, family=%d, addr=%s, host=%s", flag, family, addr.c_str(),
3335 host.c_str());
3336 }
3337 } testConfigs[]{
3338 {NI_NAMEREQD, AF_INET, "1.2.3.4", "v4v6.example.com"},
3339 {NI_NUMERICHOST, AF_INET, "1.2.3.4", "1.2.3.4"},
3340 {0, AF_INET, "1.2.3.4", "v4v6.example.com"},
3341 {0, AF_INET, "5.6.7.8", "5.6.7.8"}, // unmapped
3342 {NI_NAMEREQD, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
3343 {NI_NUMERICHOST, AF_INET6, "2001:db8::102:304", "2001:db8::102:304"},
3344 {0, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
3345 {0, AF_INET6, "2001:db8::506:708", "2001:db8::506:708"}, // unmapped
3346 };
Luke Huangf8215372019-11-22 11:53:41 +08003347 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003348
3349 // Reverse IPv4/IPv6 DNS query. Prefix should have no effect on it.
3350 for (const auto& config : testConfigs) {
3351 SCOPED_TRACE(config.asParameters());
3352
3353 int rv;
3354 char host[NI_MAXHOST];
3355 struct sockaddr_in sin;
3356 struct sockaddr_in6 sin6;
3357 if (config.family == AF_INET) {
3358 memset(&sin, 0, sizeof(sin));
3359 sin.sin_family = AF_INET;
3360 inet_pton(AF_INET, config.addr.c_str(), &sin.sin_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003361 rv = getnameinfo((const struct sockaddr*)&sin, sizeof(sin), host, sizeof(host), nullptr,
3362 0, config.flag);
nuccachena26cc2a2018-07-17 18:07:23 +08003363 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4));
3364 } else if (config.family == AF_INET6) {
3365 memset(&sin6, 0, sizeof(sin6));
3366 sin6.sin6_family = AF_INET6;
3367 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003368 rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host),
nuccachena26cc2a2018-07-17 18:07:23 +08003369 nullptr, 0, config.flag);
3370 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6));
3371 }
3372 ASSERT_EQ(0, rv);
3373 std::string result_str = host;
3374 EXPECT_EQ(result_str, config.host);
3375 dns.clearQueries();
3376 }
3377}
3378
3379TEST_F(ResolverTest, GetNameInfo_ReverseDns64Query) {
3380 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003381 constexpr char dns64_name[] = "ipv4only.arpa.";
3382 constexpr char ptr_name[] = "v4only.example.com.";
3383 // PTR record for IPv4 address 1.2.3.4
3384 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3385 // PTR record for IPv6 address 64:ff9b::1.2.3.4
3386 constexpr char ptr_addr_v6_nomapping[] =
3387 "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.";
3388 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
3389 // PTR record for IPv6 address 64:ff9b::5.6.7.8
3390 constexpr char ptr_addr_v6_synthesis[] =
3391 "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 +09003392 const std::vector<DnsRecord> records = {
3393 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3394 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3395 {ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis},
3396 };
nuccachena26cc2a2018-07-17 18:07:23 +08003397
Xiao Ma09b71022018-12-11 17:56:32 +09003398 test::DNSResponder dns(listen_addr);
3399 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003400 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003401 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003402
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003403 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003404 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003405 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003406
Luke Huangf8215372019-11-22 11:53:41 +08003407 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003408 static const struct TestConfig {
3409 bool hasSynthesizedPtrRecord;
3410 int flag;
3411 std::string addr;
3412 std::string host;
3413
3414 std::string asParameters() const {
3415 return StringPrintf("hasSynthesizedPtrRecord=%d, flag=%d, addr=%s, host=%s",
3416 hasSynthesizedPtrRecord, flag, addr.c_str(), host.c_str());
3417 }
3418 } testConfigs[]{
3419 {false, NI_NAMEREQD, "64:ff9b::102:304", "v4only.example.com"},
3420 {false, NI_NUMERICHOST, "64:ff9b::102:304", "64:ff9b::102:304"},
3421 {false, 0, "64:ff9b::102:304", "v4only.example.com"},
3422 {true, NI_NAMEREQD, "64:ff9b::506:708", "v6synthesis.example.com"},
3423 {true, NI_NUMERICHOST, "64:ff9b::506:708", "64:ff9b::506:708"},
3424 {true, 0, "64:ff9b::506:708", "v6synthesis.example.com"}
3425 };
Luke Huangf8215372019-11-22 11:53:41 +08003426 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003427
3428 // hasSynthesizedPtrRecord = false
3429 // Synthesized PTR record doesn't exist on DNS server
3430 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
3431 // After querying synthesized address failed, expect that prefix is removed from IPv6
3432 // synthesized address and do reverse IPv4 query instead.
3433 //
3434 // hasSynthesizedPtrRecord = true
3435 // Synthesized PTR record exists on DNS server
3436 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
3437 // Expect to just pass through synthesized address for DNS queries.
3438 for (const auto& config : testConfigs) {
3439 SCOPED_TRACE(config.asParameters());
3440
3441 char host[NI_MAXHOST];
3442 struct sockaddr_in6 sin6;
3443 memset(&sin6, 0, sizeof(sin6));
3444 sin6.sin6_family = AF_INET6;
3445 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003446 int rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host),
nuccachena26cc2a2018-07-17 18:07:23 +08003447 nullptr, 0, config.flag);
3448 ASSERT_EQ(0, rv);
3449 if (config.flag == NI_NAMEREQD) {
3450 if (config.hasSynthesizedPtrRecord) {
3451 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
3452 } else {
3453 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist.
3454 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist.
3455 }
3456 }
3457 std::string result_str = host;
3458 EXPECT_EQ(result_str, config.host);
3459 dns.clearQueries();
3460 }
3461}
3462
3463TEST_F(ResolverTest, GetNameInfo_ReverseDns64QueryFromHostFile) {
3464 constexpr char dns64_name[] = "ipv4only.arpa.";
3465 constexpr char host_name[] = "localhost";
3466 // The address is synthesized by prefix64:localhost.
3467 constexpr char host_addr[] = "64:ff9b::7f00:1";
nuccachena26cc2a2018-07-17 18:07:23 +08003468 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003469
3470 test::DNSResponder dns(listen_addr);
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003471
Xiao Ma09b71022018-12-11 17:56:32 +09003472 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003473 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003474 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003475
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003476 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003477 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003478 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003479
3480 // Using synthesized "localhost" address to be a trick for resolving host name
3481 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
3482 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
3483 char host[NI_MAXHOST];
Xiao Ma09b71022018-12-11 17:56:32 +09003484 struct sockaddr_in6 sin6 = {.sin6_family = AF_INET6};
nuccachena26cc2a2018-07-17 18:07:23 +08003485 inet_pton(AF_INET6, host_addr, &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003486 int rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host), nullptr,
nuccachena26cc2a2018-07-17 18:07:23 +08003487 0, NI_NAMEREQD);
3488 ASSERT_EQ(0, rv);
3489 // Expect no DNS queries; localhost is resolved via /etc/hosts.
3490 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
3491
3492 std::string result_str = host;
3493 EXPECT_EQ(result_str, host_name);
3494}
3495
Hungming Chen9e6185a2019-06-04 16:09:19 +08003496TEST_F(ResolverTest, GetNameInfo_cnamesClasslessReverseDelegation) {
3497 // IPv4 addresses in the subnet with notation '/' or '-'.
3498 constexpr char addr_slash[] = "192.0.2.1";
3499 constexpr char addr_hyphen[] = "192.0.3.1";
3500
3501 // Used to verify DNS reverse query for classless reverse lookup zone. See detail in RFC 2317
3502 // section 4.
3503 const static std::vector<DnsRecord> records = {
3504 // The records for reverse querying "192.0.2.1" in the subnet with notation '/'.
3505 {"1.2.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0/25.2.0.192.in-addr.arpa."},
3506 {"1.0/25.2.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3507
3508 // The records for reverse querying "192.0.3.1" in the subnet with notation '-'.
3509 {"1.3.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0-127.3.0.192.in-addr.arpa."},
3510 {"1.0-127.3.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3511 };
3512
3513 test::DNSResponder dns;
3514 StartDns(dns, records);
3515 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3516
3517 for (const auto& address : {addr_slash, addr_hyphen}) {
3518 SCOPED_TRACE(address);
3519
3520 char host[NI_MAXHOST];
3521 sockaddr_in sin = {.sin_family = AF_INET};
3522 ASSERT_TRUE(inet_pton(AF_INET, address, &sin.sin_addr));
3523 int rv = getnameinfo((const sockaddr*)&sin, sizeof(sin), host, sizeof(host), nullptr, 0,
3524 NI_NAMEREQD);
3525 ASSERT_EQ(0, rv);
3526 EXPECT_STREQ("hello.example.com", host);
3527 }
3528}
3529
nuccachena26cc2a2018-07-17 18:07:23 +08003530TEST_F(ResolverTest, GetHostByName2_Dns64Synthesize) {
Xiao Ma09b71022018-12-11 17:56:32 +09003531 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003532 constexpr char dns64_name[] = "ipv4only.arpa.";
3533 constexpr char host_name[] = "ipv4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003534 const std::vector<DnsRecord> records = {
3535 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3536 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3537 };
nuccachena26cc2a2018-07-17 18:07:23 +08003538
Xiao Ma09b71022018-12-11 17:56:32 +09003539 test::DNSResponder dns(listen_addr);
3540 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003541 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003542 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003543
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003544 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003545 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003546 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003547
3548 // Query an IPv4-only hostname. Expect that gets a synthesized address.
3549 struct hostent* result = gethostbyname2("ipv4only", AF_INET6);
3550 ASSERT_TRUE(result != nullptr);
3551 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3552 std::string result_str = ToString(result);
3553 EXPECT_EQ(result_str, "64:ff9b::102:304");
3554}
nuccachena26cc2a2018-07-17 18:07:23 +08003555
3556TEST_F(ResolverTest, GetHostByName2_DnsQueryWithHavingNat64Prefix) {
3557 constexpr char dns64_name[] = "ipv4only.arpa.";
3558 constexpr char host_name[] = "v4v6.example.com.";
nuccachena26cc2a2018-07-17 18:07:23 +08003559 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003560 const std::vector<DnsRecord> records = {
3561 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3562 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3563 {host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
3564 };
3565
3566 test::DNSResponder dns(listen_addr);
3567 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003568 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003569 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003570
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003571 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003572 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003573 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003574
3575 // IPv4 DNS query. Prefix should have no effect on it.
3576 struct hostent* result = gethostbyname2("v4v6", AF_INET);
3577 ASSERT_TRUE(result != nullptr);
3578 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3579 std::string result_str = ToString(result);
3580 EXPECT_EQ(result_str, "1.2.3.4");
3581 dns.clearQueries();
3582
3583 // IPv6 DNS query. Prefix should have no effect on it.
3584 result = gethostbyname2("v4v6", AF_INET6);
3585 ASSERT_TRUE(result != nullptr);
3586 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3587 result_str = ToString(result);
3588 EXPECT_EQ(result_str, "2001:db8::102:304");
3589}
3590
3591TEST_F(ResolverTest, GetHostByName2_Dns64QuerySpecialUseIPv4Addresses) {
3592 constexpr char THIS_NETWORK[] = "this_network";
3593 constexpr char LOOPBACK[] = "loopback";
3594 constexpr char LINK_LOCAL[] = "link_local";
3595 constexpr char MULTICAST[] = "multicast";
3596 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
3597
3598 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
3599 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
3600 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
3601 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
3602 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
3603
3604 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003605 constexpr char dns64_name[] = "ipv4only.arpa.";
3606
Xiao Ma09b71022018-12-11 17:56:32 +09003607 test::DNSResponder dns(listen_addr);
3608 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003609 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003610 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003611
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003612 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003613 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003614 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003615
Luke Huangf8215372019-11-22 11:53:41 +08003616 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003617 static const struct TestConfig {
3618 std::string name;
3619 std::string addr;
3620
3621 std::string asHostName() const {
Luke Huangf8215372019-11-22 11:53:41 +08003622 return StringPrintf("%s.example.com.", name.c_str());
nuccachena26cc2a2018-07-17 18:07:23 +08003623 }
3624 } testConfigs[]{
3625 {THIS_NETWORK, ADDR_THIS_NETWORK},
3626 {LOOPBACK, ADDR_LOOPBACK},
3627 {LINK_LOCAL, ADDR_LINK_LOCAL},
3628 {MULTICAST, ADDR_MULTICAST},
3629 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
3630 };
Luke Huangf8215372019-11-22 11:53:41 +08003631 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003632
3633 for (const auto& config : testConfigs) {
3634 const std::string testHostName = config.asHostName();
3635 SCOPED_TRACE(testHostName);
3636
3637 const char* host_name = testHostName.c_str();
3638 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
3639
3640 struct hostent* result = gethostbyname2(config.name.c_str(), AF_INET6);
3641 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3642
3643 // In AF_INET6 case, don't synthesize special use IPv4 address.
3644 // Expect to have no answer
3645 EXPECT_EQ(nullptr, result);
3646
3647 dns.clearQueries();
3648 }
Bernie Innocenti2fef2b82018-12-20 15:56:40 +09003649}
Mike Yuf14e1a92019-05-10 13:54:58 +08003650
3651TEST_F(ResolverTest, PrefixDiscoveryBypassTls) {
3652 constexpr char listen_addr[] = "::1";
3653 constexpr char cleartext_port[] = "53";
3654 constexpr char tls_port[] = "853";
3655 constexpr char dns64_name[] = "ipv4only.arpa.";
3656 const std::vector<std::string> servers = {listen_addr};
3657
3658 test::DNSResponder dns(listen_addr);
3659 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
3660 test::DnsTlsFrontend tls(listen_addr, tls_port, listen_addr, cleartext_port);
3661 ASSERT_TRUE(tls.startServer());
3662
3663 // Setup OPPORTUNISTIC mode and wait for the validation complete.
waynema0e73c2e2019-07-31 15:04:08 +08003664 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08003665 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003666 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yuf14e1a92019-05-10 13:54:58 +08003667 tls.clearQueries();
3668
3669 // Start NAT64 prefix discovery and wait for it complete.
3670 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003671 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
Mike Yuf14e1a92019-05-10 13:54:58 +08003672
3673 // Verify it bypassed TLS even though there's a TLS server available.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003674 EXPECT_EQ(0, tls.queries()) << dns.dumpQueries();
3675 EXPECT_EQ(1U, GetNumQueries(dns, dns64_name)) << dns.dumpQueries();
Mike Yuf14e1a92019-05-10 13:54:58 +08003676
3677 // Restart the testing network to reset the cache.
3678 mDnsClient.TearDown();
3679 mDnsClient.SetUp();
3680 dns.clearQueries();
3681
3682 // Setup STRICT mode and wait for the validation complete.
waynema0e73c2e2019-07-31 15:04:08 +08003683 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
3684 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08003685 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003686 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yuf14e1a92019-05-10 13:54:58 +08003687 tls.clearQueries();
3688
3689 // Start NAT64 prefix discovery and wait for it to complete.
3690 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003691 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
Mike Yuf14e1a92019-05-10 13:54:58 +08003692
3693 // Verify it bypassed TLS despite STRICT mode.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003694 EXPECT_EQ(0, tls.queries()) << dns.dumpQueries();
3695 EXPECT_EQ(1U, GetNumQueries(dns, dns64_name)) << dns.dumpQueries();
Mike Yuf14e1a92019-05-10 13:54:58 +08003696}
Luke Huang9807e6b2019-05-20 16:17:12 +08003697
Lorenzo Colitti346737c2020-05-21 13:56:22 +00003698TEST_F(ResolverTest, SetAndClearNat64Prefix) {
3699 constexpr char host_name[] = "v4.example.com.";
3700 constexpr char listen_addr[] = "::1";
3701 const std::vector<DnsRecord> records = {
3702 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3703 };
3704 const std::string kNat64Prefix1 = "64:ff9b::/96";
3705 const std::string kNat64Prefix2 = "2001:db8:6464::/96";
3706
3707 test::DNSResponder dns(listen_addr);
3708 StartDns(dns, records);
3709 const std::vector<std::string> servers = {listen_addr};
3710 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
3711
3712 auto resolvService = mDnsClient.resolvService();
3713 addrinfo hints = {.ai_family = AF_INET6};
3714
3715 // No NAT64 prefix, no AAAA record.
3716 ScopedAddrinfo result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3717 ASSERT_TRUE(result == nullptr);
3718
3719 // Set the prefix, and expect to get a synthesized AAAA record.
3720 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix2).isOk());
3721 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3722 ASSERT_FALSE(result == nullptr);
3723 EXPECT_EQ("2001:db8:6464::102:304", ToString(result));
3724
3725 // Update the prefix, expect to see AAAA records from the new prefix.
3726 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3727 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3728 ASSERT_FALSE(result == nullptr);
3729 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3730
3731 // Non-/96 prefixes are ignored.
3732 auto status = resolvService->setPrefix64(TEST_NETID, "64:ff9b::/64");
3733 EXPECT_FALSE(status.isOk());
3734 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3735 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3736
3737 // Invalid prefixes are ignored.
3738 status = resolvService->setPrefix64(TEST_NETID, "192.0.2.0/24");
3739 EXPECT_FALSE(status.isOk());
3740 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3741 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3742
3743 status = resolvService->setPrefix64(TEST_NETID, "192.0.2.1");
3744 EXPECT_FALSE(status.isOk());
3745 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3746 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3747
3748 status = resolvService->setPrefix64(TEST_NETID, "hello");
3749 EXPECT_FALSE(status.isOk());
3750 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3751 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3752
3753 // DNS64 synthesis is still working.
3754 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3755 ASSERT_FALSE(result == nullptr);
3756 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3757
3758 // Clear the prefix. No AAAA records any more.
3759 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, "").isOk());
3760 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3761 EXPECT_TRUE(result == nullptr);
3762
3763 // Calling startPrefix64Discovery clears the prefix.
3764 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3765 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3766 ASSERT_FALSE(result == nullptr);
3767 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3768
3769 EXPECT_TRUE(resolvService->startPrefix64Discovery(TEST_NETID).isOk());
3770 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3771 ASSERT_TRUE(result == nullptr);
3772
3773 // setPrefix64 fails if prefix discovery is started, even if no prefix is yet discovered...
3774 status = resolvService->setPrefix64(TEST_NETID, kNat64Prefix1);
3775 EXPECT_FALSE(status.isOk());
3776 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3777 EXPECT_EQ(EEXIST, status.getServiceSpecificError());
3778
3779 // .. and clearing the prefix also has no effect.
3780 status = resolvService->setPrefix64(TEST_NETID, "");
3781 EXPECT_FALSE(status.isOk());
3782 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3783 EXPECT_EQ(ENOENT, status.getServiceSpecificError());
3784
3785 // setPrefix64 succeeds again when prefix discovery is stopped.
3786 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
3787 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3788 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3789 ASSERT_FALSE(result == nullptr);
3790 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3791
3792 // Calling stopPrefix64Discovery clears the prefix.
3793 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
3794 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3795 ASSERT_TRUE(result == nullptr);
3796
3797 // Set up NAT64 prefix discovery.
3798 constexpr char dns64_name[] = "ipv4only.arpa.";
3799 const std::vector<DnsRecord> newRecords = {
3800 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3801 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3802 };
3803 dns.stopServer();
3804 StartDns(dns, newRecords);
3805
3806 EXPECT_TRUE(resolvService->startPrefix64Discovery(TEST_NETID).isOk());
3807 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
3808 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3809 ASSERT_FALSE(result == nullptr);
3810 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3811
3812 // setPrefix64 fails if NAT64 prefix discovery has succeeded, and the discovered prefix
3813 // continues to be used.
3814 status = resolvService->setPrefix64(TEST_NETID, kNat64Prefix2);
3815 EXPECT_FALSE(status.isOk());
3816 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3817 EXPECT_EQ(EEXIST, status.getServiceSpecificError());
3818
3819 // Clearing the prefix also has no effect if discovery is started.
3820 status = resolvService->setPrefix64(TEST_NETID, "");
3821 EXPECT_FALSE(status.isOk());
3822 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3823 EXPECT_EQ(ENOENT, status.getServiceSpecificError());
3824
3825 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3826 ASSERT_FALSE(result == nullptr);
3827 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3828
3829 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
3830 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_NOT_FOUND));
Lorenzo Colitti5be8bf22020-05-26 10:55:21 +00003831
3832 EXPECT_EQ(0, sDnsMetricsListener->getUnexpectedNat64PrefixUpdates());
Lorenzo Colitti346737c2020-05-21 13:56:22 +00003833}
3834
Luke Huang9807e6b2019-05-20 16:17:12 +08003835namespace {
3836
Luke Huang0d592bc2019-05-25 18:24:03 +08003837class ScopedSetNetworkForProcess {
3838 public:
3839 explicit ScopedSetNetworkForProcess(unsigned netId) {
3840 mStoredNetId = getNetworkForProcess();
3841 if (netId == mStoredNetId) return;
3842 EXPECT_EQ(0, setNetworkForProcess(netId));
3843 }
3844 ~ScopedSetNetworkForProcess() { EXPECT_EQ(0, setNetworkForProcess(mStoredNetId)); }
3845
3846 private:
3847 unsigned mStoredNetId;
3848};
3849
3850class ScopedSetNetworkForResolv {
3851 public:
3852 explicit ScopedSetNetworkForResolv(unsigned netId) { EXPECT_EQ(0, setNetworkForResolv(netId)); }
3853 ~ScopedSetNetworkForResolv() { EXPECT_EQ(0, setNetworkForResolv(NETID_UNSET)); }
3854};
3855
Luke Huang9807e6b2019-05-20 16:17:12 +08003856void sendCommand(int fd, const std::string& cmd) {
3857 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size() + 1));
3858 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size() + 1));
3859}
3860
3861int32_t readBE32(int fd) {
3862 int32_t tmp;
3863 int n = TEMP_FAILURE_RETRY(read(fd, &tmp, sizeof(tmp)));
3864 EXPECT_TRUE(n > 0);
3865 return ntohl(tmp);
3866}
3867
Luke Huang0d592bc2019-05-25 18:24:03 +08003868int readResponseCode(int fd) {
Luke Huang9807e6b2019-05-20 16:17:12 +08003869 char buf[4];
3870 int n = TEMP_FAILURE_RETRY(read(fd, &buf, sizeof(buf)));
3871 EXPECT_TRUE(n > 0);
3872 // The format of response code is that 4 bytes for the code & null.
3873 buf[3] = '\0';
3874 int result;
3875 EXPECT_TRUE(ParseInt(buf, &result));
3876 return result;
3877}
3878
Luke Huang0d592bc2019-05-25 18:24:03 +08003879bool checkAndClearUseLocalNameserversFlag(unsigned* netid) {
3880 if (netid == nullptr || ((*netid) & NETID_USE_LOCAL_NAMESERVERS) == 0) {
3881 return false;
3882 }
3883 *netid = (*netid) & ~NETID_USE_LOCAL_NAMESERVERS;
3884 return true;
3885}
3886
Luke Huangf8215372019-11-22 11:53:41 +08003887aidl::android::net::UidRangeParcel makeUidRangeParcel(int start, int stop) {
3888 aidl::android::net::UidRangeParcel res;
Luke Huang0d592bc2019-05-25 18:24:03 +08003889 res.start = start;
3890 res.stop = stop;
3891
3892 return res;
3893}
3894
3895void expectNetIdWithLocalNameserversFlag(unsigned netId) {
3896 unsigned dnsNetId = 0;
3897 EXPECT_EQ(0, getNetworkForDns(&dnsNetId));
3898 EXPECT_TRUE(checkAndClearUseLocalNameserversFlag(&dnsNetId));
3899 EXPECT_EQ(netId, static_cast<unsigned>(dnsNetId));
3900}
3901
3902void expectDnsNetIdEquals(unsigned netId) {
3903 unsigned dnsNetId = 0;
3904 EXPECT_EQ(0, getNetworkForDns(&dnsNetId));
3905 EXPECT_EQ(netId, static_cast<unsigned>(dnsNetId));
3906}
3907
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003908void expectDnsNetIdIsDefaultNetwork(INetd* netdService) {
Luke Huang0d592bc2019-05-25 18:24:03 +08003909 int currentNetid;
3910 EXPECT_TRUE(netdService->networkGetDefault(&currentNetid).isOk());
3911 expectDnsNetIdEquals(currentNetid);
3912}
3913
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003914void expectDnsNetIdWithVpn(INetd* netdService, unsigned vpnNetId, unsigned expectedNetId) {
Luke Huang0d592bc2019-05-25 18:24:03 +08003915 EXPECT_TRUE(netdService->networkCreateVpn(vpnNetId, false /* secure */).isOk());
3916 uid_t uid = getuid();
3917 // Add uid to VPN
3918 EXPECT_TRUE(netdService->networkAddUidRanges(vpnNetId, {makeUidRangeParcel(uid, uid)}).isOk());
3919 expectDnsNetIdEquals(expectedNetId);
3920 EXPECT_TRUE(netdService->networkDestroy(vpnNetId).isOk());
3921}
3922
Luke Huang9807e6b2019-05-20 16:17:12 +08003923} // namespace
3924
3925TEST_F(ResolverTest, getDnsNetId) {
3926 // We've called setNetworkForProcess in SetupOemNetwork, so reset to default first.
3927 setNetworkForProcess(NETID_UNSET);
Luke Huang0d592bc2019-05-25 18:24:03 +08003928
3929 expectDnsNetIdIsDefaultNetwork(mDnsClient.netdService());
3930 expectDnsNetIdWithVpn(mDnsClient.netdService(), TEST_VPN_NETID, TEST_VPN_NETID);
Luke Huang9807e6b2019-05-20 16:17:12 +08003931
3932 // Test with setNetworkForProcess
Luke Huang0d592bc2019-05-25 18:24:03 +08003933 {
3934 ScopedSetNetworkForProcess scopedSetNetworkForProcess(TEST_NETID);
3935 expectDnsNetIdEquals(TEST_NETID);
3936 }
3937
3938 // Test with setNetworkForProcess with NETID_USE_LOCAL_NAMESERVERS
3939 {
3940 ScopedSetNetworkForProcess scopedSetNetworkForProcess(TEST_NETID |
3941 NETID_USE_LOCAL_NAMESERVERS);
3942 expectNetIdWithLocalNameserversFlag(TEST_NETID);
3943 }
Luke Huang9807e6b2019-05-20 16:17:12 +08003944
3945 // Test with setNetworkForResolv
Luke Huang0d592bc2019-05-25 18:24:03 +08003946 {
3947 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID);
3948 expectDnsNetIdEquals(TEST_NETID);
3949 }
3950
3951 // Test with setNetworkForResolv with NETID_USE_LOCAL_NAMESERVERS
3952 {
3953 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID |
3954 NETID_USE_LOCAL_NAMESERVERS);
3955 expectNetIdWithLocalNameserversFlag(TEST_NETID);
3956 }
3957
3958 // Test with setNetworkForResolv under bypassable vpn
3959 {
3960 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID);
3961 expectDnsNetIdWithVpn(mDnsClient.netdService(), TEST_VPN_NETID, TEST_NETID);
3962 }
Luke Huang9807e6b2019-05-20 16:17:12 +08003963
3964 // Create socket connected to DnsProxyListener
3965 int fd = dns_open_proxy();
3966 EXPECT_TRUE(fd > 0);
3967 unique_fd ufd(fd);
3968
3969 // Test command with wrong netId
3970 sendCommand(fd, "getdnsnetid abc");
Luke Huang0d592bc2019-05-25 18:24:03 +08003971 EXPECT_EQ(ResponseCode::DnsProxyQueryResult, readResponseCode(fd));
Luke Huang9807e6b2019-05-20 16:17:12 +08003972 EXPECT_EQ(-EINVAL, readBE32(fd));
3973
3974 // Test unsupported command
3975 sendCommand(fd, "getdnsnetidNotSupported");
3976 // Keep in sync with FrameworkListener.cpp (500, "Command not recognized")
Luke Huang0d592bc2019-05-25 18:24:03 +08003977 EXPECT_EQ(500, readResponseCode(fd));
Luke Huang9807e6b2019-05-20 16:17:12 +08003978}
Sehee Park2c118782019-05-07 13:02:45 +09003979
3980TEST_F(ResolverTest, BlockDnsQueryWithUidRule) {
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003981 // This test relies on blocking traffic on loopback, which xt_qtaguid does not do.
3982 // See aosp/358413 and b/34444781 for why.
3983 SKIP_IF_BPF_NOT_SUPPORTED;
3984
Sehee Park2c118782019-05-07 13:02:45 +09003985 constexpr char listen_addr1[] = "127.0.0.4";
3986 constexpr char listen_addr2[] = "::1";
3987 constexpr char host_name[] = "howdy.example.com.";
3988 const std::vector<DnsRecord> records = {
3989 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3990 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
3991 };
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003992 INetd* netdService = mDnsClient.netdService();
Sehee Park2c118782019-05-07 13:02:45 +09003993
3994 test::DNSResponder dns1(listen_addr1);
3995 test::DNSResponder dns2(listen_addr2);
3996 StartDns(dns1, records);
3997 StartDns(dns2, records);
3998
3999 std::vector<std::string> servers = {listen_addr1, listen_addr2};
4000 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
4001 dns1.clearQueries();
4002 dns2.clearQueries();
4003
Luke Huang8c45bfb2020-05-29 06:10:31 +00004004 ScopeBlockedUIDRule scopeBlockUidRule(netdService, TEST_UID);
Sehee Park2c118782019-05-07 13:02:45 +09004005 // Dns Query
4006 int fd1 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_a, 0);
4007 int fd2 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_aaaa, 0);
4008 EXPECT_TRUE(fd1 != -1);
4009 EXPECT_TRUE(fd2 != -1);
4010
4011 uint8_t buf[MAXPACKET] = {};
4012 int rcode;
4013 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
4014 EXPECT_EQ(-ECONNREFUSED, res);
4015
4016 memset(buf, 0, MAXPACKET);
4017 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
4018 EXPECT_EQ(-ECONNREFUSED, res);
Sehee Park2c118782019-05-07 13:02:45 +09004019}
Mike Yua772c202019-09-23 17:47:21 +08004020
Mike Yu40e67072019-10-09 21:14:09 +08004021namespace {
4022
4023const std::string kDotConnectTimeoutMsFlag(
4024 "persist.device_config.netd_native.dot_connect_timeout_ms");
4025
4026class ScopedSystemProperties {
4027 public:
4028 explicit ScopedSystemProperties(const std::string& key, const std::string& value)
4029 : mStoredKey(key) {
4030 mStoredValue = android::base::GetProperty(key, "");
4031 android::base::SetProperty(key, value);
4032 }
4033 ~ScopedSystemProperties() { android::base::SetProperty(mStoredKey, mStoredValue); }
4034
4035 private:
4036 std::string mStoredKey;
4037 std::string mStoredValue;
4038};
4039
4040} // namespace
4041
Mike Yua772c202019-09-23 17:47:21 +08004042TEST_F(ResolverTest, ConnectTlsServerTimeout) {
Mike Yu40e67072019-10-09 21:14:09 +08004043 constexpr int expectedTimeout = 1000;
4044 constexpr char hostname1[] = "query1.example.com.";
4045 constexpr char hostname2[] = "query2.example.com.";
Mike Yua772c202019-09-23 17:47:21 +08004046 const std::vector<DnsRecord> records = {
Mike Yu40e67072019-10-09 21:14:09 +08004047 {hostname1, ns_type::ns_t_a, "1.2.3.4"},
4048 {hostname2, ns_type::ns_t_a, "1.2.3.5"},
Mike Yua772c202019-09-23 17:47:21 +08004049 };
4050
4051 test::DNSResponder dns;
4052 StartDns(dns, records);
Mike Yu40e67072019-10-09 21:14:09 +08004053 test::DnsTlsFrontend tls;
Mike Yua772c202019-09-23 17:47:21 +08004054 ASSERT_TRUE(tls.startServer());
4055
Mike Yu40e67072019-10-09 21:14:09 +08004056 // The resolver will adjust the timeout value to 1000ms since the value is too small.
4057 ScopedSystemProperties scopedSystemProperties(kDotConnectTimeoutMsFlag, "100");
Mike Yua772c202019-09-23 17:47:21 +08004058
Mike Yu40e67072019-10-09 21:14:09 +08004059 // Set up resolver to opportunistic mode with the default configuration.
Mike Yu8ac63402019-12-02 15:28:38 +08004060 const ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
Mike Yu40e67072019-10-09 21:14:09 +08004061 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
Mike Yua772c202019-09-23 17:47:21 +08004062 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09004063 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yua772c202019-09-23 17:47:21 +08004064 tls.clearQueries();
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09004065 dns.clearQueries();
Mike Yua772c202019-09-23 17:47:21 +08004066
4067 // The server becomes unresponsive to the handshake request.
4068 tls.setHangOnHandshakeForTesting(true);
4069
4070 // Expect the things happening in getaddrinfo():
4071 // 1. Connect to the private DNS server.
4072 // 2. SSL handshake times out.
4073 // 3. Fallback to UDP transport, and then get the answer.
Mike Yu40e67072019-10-09 21:14:09 +08004074 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4075 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(hostname1, nullptr, hints);
Mike Yua772c202019-09-23 17:47:21 +08004076
Mike Yu40e67072019-10-09 21:14:09 +08004077 EXPECT_NE(nullptr, result);
Mike Yua772c202019-09-23 17:47:21 +08004078 EXPECT_EQ(0, tls.queries());
Mike Yu40e67072019-10-09 21:14:09 +08004079 EXPECT_EQ(1U, GetNumQueries(dns, hostname1));
4080 EXPECT_EQ(records.at(0).addr, ToString(result));
Mike Yua772c202019-09-23 17:47:21 +08004081
Mike Yu40e67072019-10-09 21:14:09 +08004082 // A loose upper bound is set by adding 2000ms buffer time. Theoretically, getaddrinfo()
4083 // should just take a bit more than expetTimeout milliseconds.
4084 EXPECT_GE(timeTakenMs, expectedTimeout);
4085 EXPECT_LE(timeTakenMs, expectedTimeout + 2000);
4086
4087 // Set the server to be responsive. Verify that the resolver will attempt to reconnect
4088 // to the server and then get the result within the timeout.
4089 tls.setHangOnHandshakeForTesting(false);
4090 std::tie(result, timeTakenMs) = safe_getaddrinfo_time_taken(hostname2, nullptr, hints);
4091
4092 EXPECT_NE(nullptr, result);
Luke Huang3caa42b2020-04-23 14:18:04 +00004093 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yu40e67072019-10-09 21:14:09 +08004094 EXPECT_EQ(1U, GetNumQueries(dns, hostname2));
4095 EXPECT_EQ(records.at(1).addr, ToString(result));
4096
4097 EXPECT_LE(timeTakenMs, expectedTimeout);
Mike Yua772c202019-09-23 17:47:21 +08004098}
Hungming Chenbb90ab32019-10-28 18:20:31 +08004099
Ken Chen766feae2019-10-30 15:13:44 +08004100TEST_F(ResolverTest, FlushNetworkCache) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004101 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004102 test::DNSResponder dns;
4103 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4104 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4105
4106 const hostent* result = gethostbyname("hello");
4107 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4108
4109 // get result from cache
4110 result = gethostbyname("hello");
4111 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4112
4113 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4114
4115 result = gethostbyname("hello");
4116 EXPECT_EQ(2U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4117}
4118
4119TEST_F(ResolverTest, FlushNetworkCache_random) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004120 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004121 constexpr int num_flush = 10;
4122 constexpr int num_queries = 20;
4123 test::DNSResponder dns;
4124 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4125 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4126 const addrinfo hints = {.ai_family = AF_INET};
4127
4128 std::thread t([this]() {
4129 for (int i = 0; i < num_flush; ++i) {
4130 unsigned delay = arc4random_uniform(10 * 1000); // 10ms
4131 usleep(delay);
4132 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4133 }
4134 });
4135
4136 for (int i = 0; i < num_queries; ++i) {
4137 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4138 EXPECT_TRUE(result != nullptr);
4139 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4140 }
4141 t.join();
4142}
4143
4144// flush cache while one query is wait-for-response, another is pending.
4145TEST_F(ResolverTest, FlushNetworkCache_concurrent) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004146 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004147 const char* listen_addr1 = "127.0.0.9";
4148 const char* listen_addr2 = "127.0.0.10";
4149 test::DNSResponder dns1(listen_addr1);
4150 test::DNSResponder dns2(listen_addr2);
4151 StartDns(dns1, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4152 StartDns(dns2, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4153 addrinfo hints = {.ai_family = AF_INET};
4154
4155 // step 1: set server#1 into deferred responding mode
4156 dns1.setDeferredResp(true);
4157 std::thread t1([&listen_addr1, &hints, this]() {
4158 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr1}));
4159 // step 3: query
4160 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4161 // step 9: check result
4162 EXPECT_TRUE(result != nullptr);
4163 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4164 });
4165
4166 // step 2: wait for the query to reach the server
4167 while (GetNumQueries(dns1, kHelloExampleCom) == 0) {
4168 usleep(1000); // 1ms
4169 }
4170
4171 std::thread t2([&listen_addr2, &hints, &dns2, this]() {
4172 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr2}));
4173 // step 5: query (should be blocked in resolver)
4174 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4175 // step 7: check result
4176 EXPECT_TRUE(result != nullptr);
4177 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4178 EXPECT_EQ(1U, GetNumQueriesForType(dns2, ns_type::ns_t_a, kHelloExampleCom));
4179 });
4180
4181 // step 4: wait a bit for the 2nd query to enter pending state
4182 usleep(100 * 1000); // 100ms
4183 // step 6: flush cache (will unblock pending queries)
4184 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4185 t2.join();
4186
4187 // step 8: resume server#1
4188 dns1.setDeferredResp(false);
4189 t1.join();
4190
4191 // step 10: verify if result is correctly cached
4192 dns2.clearQueries();
4193 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4194 EXPECT_EQ(0U, GetNumQueries(dns2, kHelloExampleCom));
4195 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4196}
4197
waynema29253052019-08-20 11:26:08 +08004198// TODO: Perhaps to have a boundary conditions test for TCP and UDP.
4199TEST_F(ResolverTest, TcpQueryWithOversizePayload) {
4200 test::DNSResponder dns;
4201 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4202 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4203
4204 int fd = dns_open_proxy();
4205 ASSERT_TRUE(fd > 0);
4206
4207 // Sending DNS query over TCP once the packet sizes exceed 512 bytes.
4208 // The raw data is combined with Question section and Additional section
4209 // Question section : query "hello.example.com", type A, class IN
4210 // Additional section : type OPT (41), Option PADDING, Option Length 546
4211 // Padding option which allows DNS clients and servers to artificially
4212 // increase the size of a DNS message by a variable number of bytes.
4213 // See also RFC7830, section 3
4214 const std::string query =
4215 "+c0BAAABAAAAAAABBWhlbGxvB2V4YW1wbGUDY29tAAABAAEAACkgAAAAgAACJgAMAiIAAAAAAAAAAAAAAAAAA"
4216 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4217 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4218 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4219 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4220 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4221 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4222 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4223 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4224 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
4225 const std::string cmd =
4226 "resnsend " + std::to_string(TEST_NETID) + " 0 " /* ResNsendFlags */ + query + '\0';
4227 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
4228 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
4229 expectAnswersValid(fd, AF_INET, kHelloExampleComAddrV4);
4230 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom));
4231 EXPECT_EQ(0U, GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom));
4232}
4233
Ken Chen99344882020-01-01 14:59:38 +08004234TEST_F(ResolverTest, TruncatedRspMode) {
4235 constexpr char listen_addr[] = "127.0.0.4";
4236 constexpr char listen_addr2[] = "127.0.0.5";
4237 constexpr char listen_srv[] = "53";
4238
4239 test::DNSResponder dns(listen_addr, listen_srv, static_cast<ns_rcode>(-1));
4240 test::DNSResponder dns2(listen_addr2, listen_srv, static_cast<ns_rcode>(-1));
4241 // dns supports UDP only, dns2 support UDP and TCP
4242 dns.setResponseProbability(0.0, IPPROTO_TCP);
4243 StartDns(dns, kLargeCnameChainRecords);
4244 StartDns(dns2, kLargeCnameChainRecords);
4245
4246 const struct TestConfig {
4247 const std::optional<int32_t> tcMode;
4248 const bool ret;
4249 const unsigned numQueries;
4250 std::string asParameters() const {
4251 return StringPrintf("tcMode: %d, ret: %s, numQueries: %u", tcMode.value_or(-1),
4252 ret ? "true" : "false", numQueries);
4253 }
4254 } testConfigs[]{
4255 // clang-format off
4256 {std::nullopt, true, 0}, /* mode unset */
4257 {aidl::android::net::IDnsResolver::TC_MODE_DEFAULT, true, 0}, /* default mode */
4258 {aidl::android::net::IDnsResolver::TC_MODE_UDP_TCP, true, 1}, /* alternative mode */
4259 {-666, false, 1}, /* invalid input */
4260 // clang-format on
4261 };
4262
4263 for (const auto& config : testConfigs) {
4264 SCOPED_TRACE(config.asParameters());
4265
4266 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4267 parcel.servers = {listen_addr, listen_addr2};
4268 if (config.tcMode) {
Ken Chen05420812020-04-07 18:58:38 +00004269 parcel.resolverOptions.tcMode = config.tcMode.value();
Ken Chen99344882020-01-01 14:59:38 +08004270 }
4271 ASSERT_EQ(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk(), config.ret);
4272
4273 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4274 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4275 ASSERT_TRUE(result != nullptr);
4276 EXPECT_EQ(ToString(result), kHelloExampleComAddrV4);
4277 // TC_MODE_DEFAULT: resolver retries on TCP-only on each name server.
4278 // TC_MODE_UDP_TCP: resolver retries on TCP on the same server, falls back to UDP from next.
4279 ASSERT_EQ(GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom), 1U);
4280 ASSERT_EQ(GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom), 1U);
4281 ASSERT_EQ(GetNumQueriesForProtocol(dns2, IPPROTO_UDP, kHelloExampleCom), config.numQueries);
4282 ASSERT_EQ(GetNumQueriesForProtocol(dns2, IPPROTO_TCP, kHelloExampleCom), 1U);
4283
4284 dns.clearQueries();
4285 dns2.clearQueries();
4286 ASSERT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4287 }
4288}
4289
Mike Yuc0000252020-03-19 07:14:23 +00004290TEST_F(ResolverTest, RepeatedSetup_ResolverStatusRemains) {
4291 constexpr char unusable_listen_addr[] = "127.0.0.3";
4292 constexpr char listen_addr[] = "127.0.0.4";
4293 constexpr char hostname[] = "a.hello.query.";
4294 const auto repeatedSetResolversFromParcel = [&](const ResolverParamsParcel& parcel) {
4295 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4296 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4297 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4298 };
4299
4300 test::DNSResponder dns(listen_addr);
4301 StartDns(dns, {{hostname, ns_type::ns_t_a, "1.2.3.3"}});
4302 test::DnsTlsFrontend tls1(listen_addr, "853", listen_addr, "53");
4303 ASSERT_TRUE(tls1.startServer());
4304
4305 // Private DNS off mode.
4306 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4307 parcel.servers = {unusable_listen_addr, listen_addr};
4308 parcel.tlsServers.clear();
4309 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4310
4311 // Send a query.
4312 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4313 EXPECT_NE(safe_getaddrinfo(hostname, nullptr, &hints), nullptr);
4314
4315 // Check the stats as expected.
4316 const std::vector<NameserverStats> expectedCleartextDnsStats = {
4317 NameserverStats(unusable_listen_addr).setInternalErrors(1),
4318 NameserverStats(listen_addr).setSuccesses(1),
4319 };
4320 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
4321 EXPECT_EQ(GetNumQueries(dns, hostname), 1U);
4322
4323 // The stats is supposed to remain as long as the list of cleartext DNS servers is unchanged.
4324 static const struct TestConfig {
4325 std::vector<std::string> servers;
4326 std::vector<std::string> tlsServers;
4327 std::string tlsName;
4328 } testConfigs[] = {
4329 // Private DNS opportunistic mode.
4330 {{listen_addr, unusable_listen_addr}, {listen_addr, unusable_listen_addr}, ""},
4331 {{unusable_listen_addr, listen_addr}, {unusable_listen_addr, listen_addr}, ""},
4332
4333 // Private DNS strict mode.
4334 {{listen_addr, unusable_listen_addr}, {"127.0.0.100"}, kDefaultPrivateDnsHostName},
4335 {{unusable_listen_addr, listen_addr}, {"127.0.0.100"}, kDefaultPrivateDnsHostName},
4336
4337 // Private DNS off mode.
4338 {{unusable_listen_addr, listen_addr}, {}, ""},
4339 {{listen_addr, unusable_listen_addr}, {}, ""},
4340 };
4341
4342 for (const auto& config : testConfigs) {
4343 SCOPED_TRACE(fmt::format("testConfig: [{}] [{}] [{}]", fmt::join(config.servers, ","),
4344 fmt::join(config.tlsServers, ","), config.tlsName));
4345 parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4346 parcel.servers = config.servers;
4347 parcel.tlsServers = config.tlsServers;
4348 parcel.tlsName = config.tlsName;
4349 repeatedSetResolversFromParcel(parcel);
4350 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
4351
4352 // The stats remains when the list of search domains changes.
4353 parcel.domains.push_back("tmp.domains");
4354 repeatedSetResolversFromParcel(parcel);
4355 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
4356
4357 // The stats remains when the parameters change (except maxSamples).
4358 parcel.sampleValiditySeconds++;
4359 parcel.successThreshold++;
4360 parcel.minSamples++;
4361 parcel.baseTimeoutMsec++;
4362 parcel.retryCount++;
4363 repeatedSetResolversFromParcel(parcel);
4364 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
4365 }
4366
4367 // The cache remains.
4368 EXPECT_NE(safe_getaddrinfo(hostname, nullptr, &hints), nullptr);
4369 EXPECT_EQ(GetNumQueries(dns, hostname), 1U);
4370}
4371
4372TEST_F(ResolverTest, RepeatedSetup_NoRedundantPrivateDnsValidation) {
4373 const std::string addr1 = getUniqueIPv4Address(); // For a workable DNS server.
4374 const std::string addr2 = getUniqueIPv4Address(); // For an unresponsive DNS server.
4375 const std::string unusable_addr = getUniqueIPv4Address();
Mike Yu1ec523a2020-03-20 12:22:24 +00004376 const auto waitForPrivateDnsStateUpdated = []() {
4377 // A buffer time for the PrivateDnsConfiguration instance to update its map,
4378 // mPrivateDnsValidateThreads, which is used for tracking validation threads.
4379 // Since there is a time gap between when PrivateDnsConfiguration reports
4380 // onPrivateDnsValidationEvent and when PrivateDnsConfiguration updates the map, this is a
4381 // workaround to avoid the test starts a subsequent resolver setup during the time gap.
4382 // TODO: Report onPrivateDnsValidationEvent after all the relevant updates are complete.
4383 // Reference to b/152009023.
4384 std::this_thread::sleep_for(20ms);
4385 };
Mike Yuc0000252020-03-19 07:14:23 +00004386
4387 test::DNSResponder dns1(addr1);
4388 test::DNSResponder dns2(addr2);
4389 StartDns(dns1, {});
4390 StartDns(dns2, {});
4391 test::DnsTlsFrontend workableTls(addr1, "853", addr1, "53");
4392 test::DnsTlsFrontend unresponsiveTls(addr2, "853", addr2, "53");
4393 unresponsiveTls.setHangOnHandshakeForTesting(true);
4394 ASSERT_TRUE(workableTls.startServer());
4395 ASSERT_TRUE(unresponsiveTls.startServer());
4396
4397 // First setup.
4398 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4399 parcel.servers = {addr1, addr2, unusable_addr};
4400 parcel.tlsServers = {addr1, addr2, unusable_addr};
4401 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4402
4403 // Check the validation results.
4404 EXPECT_TRUE(WaitForPrivateDnsValidation(workableTls.listen_address(), true));
4405 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4406 EXPECT_EQ(unresponsiveTls.acceptConnectionsCount(), 1); // The validation is still in progress.
4407
4408 static const struct TestConfig {
4409 std::vector<std::string> tlsServers;
4410 std::string tlsName;
4411 } testConfigs[] = {
4412 {{addr1, addr2, unusable_addr}, ""},
4413 {{unusable_addr, addr1, addr2}, ""},
4414 {{unusable_addr, addr1, addr2}, kDefaultPrivateDnsHostName},
4415 {{addr1, addr2, unusable_addr}, kDefaultPrivateDnsHostName},
4416 };
4417
4418 std::string TlsNameLastTime;
4419 for (const auto& config : testConfigs) {
4420 SCOPED_TRACE(fmt::format("testConfig: [{}] [{}]", fmt::join(config.tlsServers, ","),
4421 config.tlsName));
4422 parcel.servers = config.tlsServers;
4423 parcel.tlsServers = config.tlsServers;
4424 parcel.tlsName = config.tlsName;
4425 parcel.caCertificate = config.tlsName.empty() ? "" : kCaCert;
4426
4427 const bool dnsModeChanged = (TlsNameLastTime != config.tlsName);
Mike Yu1ec523a2020-03-20 12:22:24 +00004428
4429 waitForPrivateDnsStateUpdated();
Mike Yuc0000252020-03-19 07:14:23 +00004430 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4431
4432 for (const auto& serverAddr : parcel.tlsServers) {
4433 SCOPED_TRACE(serverAddr);
4434 if (serverAddr == workableTls.listen_address()) {
4435 if (dnsModeChanged) {
4436 // In despite of the identical IP address, the server is regarded as a different
4437 // server when DnsTlsServer.name is different. The resolver treats it as a
4438 // different object and begins the validation process.
4439 EXPECT_TRUE(WaitForPrivateDnsValidation(serverAddr, true));
4440 }
4441 } else if (serverAddr == unresponsiveTls.listen_address()) {
4442 // No revalidation needed for the server which have been marked as in_progesss.
4443 } else {
4444 // Must be unusable_addr.
4445 // In opportunistic mode, when a validation for a private DNS server fails, the
4446 // resolver just marks the server as failed and doesn't re-evaluate it, but the
4447 // server can be re-evaluated when setResolverConfiguration() is called.
4448 // However, in strict mode, the resolver automatically re-evaluates the server and
4449 // marks the server as in_progress until the validation succeeds, so repeated setup
4450 // makes no effect.
4451 if (dnsModeChanged || config.tlsName.empty() /* not in strict mode */) {
4452 EXPECT_TRUE(WaitForPrivateDnsValidation(serverAddr, false));
4453 }
4454 }
4455 }
4456
4457 // Repeated setups make no effect in strict mode.
Mike Yu1ec523a2020-03-20 12:22:24 +00004458 waitForPrivateDnsStateUpdated();
Mike Yuc0000252020-03-19 07:14:23 +00004459 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4460 if (config.tlsName.empty()) {
4461 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4462 }
Mike Yu1ec523a2020-03-20 12:22:24 +00004463 waitForPrivateDnsStateUpdated();
Mike Yuc0000252020-03-19 07:14:23 +00004464 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4465 if (config.tlsName.empty()) {
4466 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4467 }
4468
4469 EXPECT_EQ(unresponsiveTls.acceptConnectionsCount(), 1);
4470
4471 TlsNameLastTime = config.tlsName;
4472 }
4473
4474 // Check that all the validation results are caught.
4475 // Note: it doesn't mean no validation being in progress.
4476 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr1));
4477 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr2));
4478 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(unusable_addr));
4479}
4480
4481TEST_F(ResolverTest, RepeatedSetup_KeepChangingPrivateDnsServers) {
4482 enum TlsServerState { WORKING, UNSUPPORTED, UNRESPONSIVE };
4483 const std::string addr1 = getUniqueIPv4Address();
4484 const std::string addr2 = getUniqueIPv4Address();
Mike Yubad95cf2020-03-26 03:19:38 +00004485 const auto waitForPrivateDnsStateUpdated = []() {
4486 // A buffer time for PrivateDnsConfiguration to update its state. It prevents this test
4487 // being flaky. See b/152009023 for the reason.
4488 std::this_thread::sleep_for(20ms);
4489 };
Mike Yuc0000252020-03-19 07:14:23 +00004490
4491 test::DNSResponder dns1(addr1);
4492 test::DNSResponder dns2(addr2);
4493 StartDns(dns1, {});
4494 StartDns(dns2, {});
4495 test::DnsTlsFrontend tls1(addr1, "853", addr1, "53");
4496 test::DnsTlsFrontend tls2(addr2, "853", addr2, "53");
4497 ASSERT_TRUE(tls1.startServer());
4498 ASSERT_TRUE(tls2.startServer());
4499
4500 static const struct TestConfig {
4501 std::string tlsServer;
4502 std::string tlsName;
4503 bool expectNothingHappenWhenServerUnsupported;
4504 bool expectNothingHappenWhenServerUnresponsive;
4505 std::string asTestName() const {
4506 return fmt::format("{}, {}, {}, {}", tlsServer, tlsName,
4507 expectNothingHappenWhenServerUnsupported,
4508 expectNothingHappenWhenServerUnresponsive);
4509 }
4510 } testConfigs[] = {
4511 {{addr1}, "", false, false},
4512 {{addr2}, "", false, false},
4513 {{addr1}, "", false, true},
4514 {{addr2}, "", false, true},
4515 {{addr1}, kDefaultPrivateDnsHostName, false, true},
4516 {{addr2}, kDefaultPrivateDnsHostName, false, true},
4517 {{addr1}, kDefaultPrivateDnsHostName, true, true},
4518 {{addr2}, kDefaultPrivateDnsHostName, true, true},
4519
4520 // There's no new validation to start because there are already two validation threads
4521 // running (one is for addr1, the other is for addr2). This is because the comparator
4522 // doesn't compare DnsTlsServer.name. Keep the design as-is until it's known to be
4523 // harmful.
4524 {{addr1}, "", true, true},
4525 {{addr2}, "", true, true},
4526 {{addr1}, "", true, true},
4527 {{addr2}, "", true, true},
4528 };
4529
4530 for (const auto& serverState : {WORKING, UNSUPPORTED, UNRESPONSIVE}) {
4531 int testIndex = 0;
4532 for (const auto& config : testConfigs) {
4533 SCOPED_TRACE(fmt::format("serverState:{} testIndex:{} testConfig:[{}]", serverState,
4534 testIndex++, config.asTestName()));
4535 auto& tls = (config.tlsServer == addr1) ? tls1 : tls2;
4536
4537 if (serverState == UNSUPPORTED && tls.running()) ASSERT_TRUE(tls.stopServer());
4538 if (serverState != UNSUPPORTED && !tls.running()) ASSERT_TRUE(tls.startServer());
4539
4540 tls.setHangOnHandshakeForTesting(serverState == UNRESPONSIVE);
4541 const int connectCountsBefore = tls.acceptConnectionsCount();
4542
Mike Yubad95cf2020-03-26 03:19:38 +00004543 waitForPrivateDnsStateUpdated();
Mike Yuc0000252020-03-19 07:14:23 +00004544 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4545 parcel.servers = {config.tlsServer};
4546 parcel.tlsServers = {config.tlsServer};
4547 parcel.tlsName = config.tlsName;
4548 parcel.caCertificate = config.tlsName.empty() ? "" : kCaCert;
4549 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4550
4551 if (serverState == WORKING) {
4552 EXPECT_TRUE(WaitForPrivateDnsValidation(config.tlsServer, true));
4553 } else if (serverState == UNSUPPORTED) {
4554 if (config.expectNothingHappenWhenServerUnsupported) {
4555 // It's possible that the resolver hasn't yet started to
4556 // connect. Wait a while.
4557 // TODO: See if we can get rid of the hard waiting time, such as comparing
4558 // the CountDiff across two tests.
4559 std::this_thread::sleep_for(100ms);
4560 EXPECT_EQ(tls.acceptConnectionsCount(), connectCountsBefore);
4561 } else {
4562 EXPECT_TRUE(WaitForPrivateDnsValidation(config.tlsServer, false));
4563 }
4564 } else {
4565 // Must be UNRESPONSIVE.
4566 // DnsTlsFrontend is the only signal for checking whether or not the resolver starts
4567 // another validation when the server is unresponsive.
4568 const int expectCountDiff =
4569 config.expectNothingHappenWhenServerUnresponsive ? 0 : 1;
4570 if (expectCountDiff == 0) {
4571 // It's possible that the resolver hasn't yet started to
4572 // connect. Wait a while.
4573 std::this_thread::sleep_for(100ms);
4574 }
4575 const auto condition = [&]() {
4576 return tls.acceptConnectionsCount() == connectCountsBefore + expectCountDiff;
4577 };
4578 EXPECT_TRUE(PollForCondition(condition));
4579 }
4580 }
4581
4582 // Set to off mode to reset the PrivateDnsConfiguration state.
4583 ResolverParamsParcel setupOffmode = DnsResponderClient::GetDefaultResolverParamsParcel();
4584 setupOffmode.tlsServers.clear();
4585 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(setupOffmode));
4586 }
4587
4588 // Check that all the validation results are caught.
4589 // Note: it doesn't mean no validation being in progress.
4590 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr1));
4591 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr2));
4592}
4593
Ken Chene9516852020-06-17 12:09:06 +00004594TEST_F(ResolverTest, PermissionCheckOnCertificateInjection) {
4595 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4596 parcel.caCertificate = kCaCert;
4597 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk());
4598
4599 for (const uid_t uid : {AID_SYSTEM, TEST_UID}) {
4600 ScopedChangeUID scopedChangeUID(uid);
4601 auto status = mDnsClient.resolvService()->setResolverConfiguration(parcel);
4602 EXPECT_EQ(status.getExceptionCode(), EX_SECURITY);
4603 }
4604}
4605
Hungming Chenbb90ab32019-10-28 18:20:31 +08004606// Parameterized tests.
4607// TODO: Merge the existing tests as parameterized test if possible.
4608// TODO: Perhaps move parameterized tests to an independent file.
4609enum class CallType { GETADDRINFO, GETHOSTBYNAME };
4610class ResolverParameterizedTest : public ResolverTest,
Hungming Chen63779052019-10-30 15:06:13 +08004611 public testing::WithParamInterface<CallType> {
4612 protected:
Hungming Chen22617fd2019-12-06 12:15:45 +08004613 void VerifyQueryHelloExampleComV4(const test::DNSResponder& dns, const CallType calltype,
4614 const bool verifyNumQueries = true) {
Hungming Chen63779052019-10-30 15:06:13 +08004615 if (calltype == CallType::GETADDRINFO) {
4616 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4617 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4618 ASSERT_TRUE(result != nullptr);
4619 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4620 } else if (calltype == CallType::GETHOSTBYNAME) {
4621 const hostent* result = gethostbyname("hello");
4622 ASSERT_TRUE(result != nullptr);
4623 ASSERT_EQ(4, result->h_length);
4624 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
4625 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4626 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
4627 } else {
4628 FAIL() << "Unsupported call type: " << static_cast<uint32_t>(calltype);
4629 }
Hungming Chen22617fd2019-12-06 12:15:45 +08004630 if (verifyNumQueries) EXPECT_EQ(1U, GetNumQueries(dns, kHelloExampleCom));
Hungming Chen63779052019-10-30 15:06:13 +08004631 }
4632};
Hungming Chenbb90ab32019-10-28 18:20:31 +08004633
Hungming Chen63779052019-10-30 15:06:13 +08004634INSTANTIATE_TEST_SUITE_P(QueryCallTest, ResolverParameterizedTest,
Hungming Chenbb90ab32019-10-28 18:20:31 +08004635 testing::Values(CallType::GETADDRINFO, CallType::GETHOSTBYNAME),
4636 [](const testing::TestParamInfo<CallType>& info) {
Hungming Chenbb90ab32019-10-28 18:20:31 +08004637 switch (info.param) {
4638 case CallType::GETADDRINFO:
Hungming Chen63779052019-10-30 15:06:13 +08004639 return "GetAddrInfo";
Hungming Chenbb90ab32019-10-28 18:20:31 +08004640 case CallType::GETHOSTBYNAME:
Hungming Chen63779052019-10-30 15:06:13 +08004641 return "GetHostByName";
Hungming Chenbb90ab32019-10-28 18:20:31 +08004642 default:
Hungming Chen63779052019-10-30 15:06:13 +08004643 return "InvalidParameter"; // Should not happen.
Hungming Chenbb90ab32019-10-28 18:20:31 +08004644 }
Hungming Chenbb90ab32019-10-28 18:20:31 +08004645 });
4646
4647TEST_P(ResolverParameterizedTest, AuthoritySectionAndAdditionalSection) {
4648 // DNS response may have more information in authority section and additional section.
4649 // Currently, getanswer() of packages/modules/DnsResolver/getaddrinfo.cpp doesn't parse the
4650 // content of authority section and additional section. Test these sections if they crash
4651 // the resolver, just in case. See also RFC 1035 section 4.1.
4652 const auto& calltype = GetParam();
4653 test::DNSHeader header(kDefaultDnsHeader);
4654
4655 // Create a DNS response which has a authoritative nameserver record in authority
4656 // section and its relevant address record in additional section.
4657 //
4658 // Question
4659 // hello.example.com. IN A
4660 // Answer
4661 // hello.example.com. IN A 1.2.3.4
4662 // Authority:
4663 // hello.example.com. IN NS ns1.example.com.
4664 // Additional:
4665 // ns1.example.com. IN A 5.6.7.8
4666 //
4667 // A response may have only question, answer, and authority section. Current testing response
4668 // should be able to cover this condition.
4669
4670 // Question section.
4671 test::DNSQuestion question{
4672 .qname = {.name = kHelloExampleCom},
4673 .qtype = ns_type::ns_t_a,
4674 .qclass = ns_c_in,
4675 };
4676 header.questions.push_back(std::move(question));
4677
4678 // Answer section.
4679 test::DNSRecord recordAnswer{
4680 .name = {.name = kHelloExampleCom},
4681 .rtype = ns_type::ns_t_a,
4682 .rclass = ns_c_in,
4683 .ttl = 0, // no cache
4684 };
Hungming Chen63779052019-10-30 15:06:13 +08004685 EXPECT_TRUE(test::DNSResponder::fillRdata(kHelloExampleComAddrV4, recordAnswer));
Hungming Chenbb90ab32019-10-28 18:20:31 +08004686 header.answers.push_back(std::move(recordAnswer));
4687
4688 // Authority section.
4689 test::DNSRecord recordAuthority{
4690 .name = {.name = kHelloExampleCom},
4691 .rtype = ns_type::ns_t_ns,
4692 .rclass = ns_c_in,
4693 .ttl = 0, // no cache
4694 };
4695 EXPECT_TRUE(test::DNSResponder::fillRdata("ns1.example.com.", recordAuthority));
4696 header.authorities.push_back(std::move(recordAuthority));
4697
4698 // Additional section.
4699 test::DNSRecord recordAdditional{
4700 .name = {.name = "ns1.example.com."},
4701 .rtype = ns_type::ns_t_a,
4702 .rclass = ns_c_in,
4703 .ttl = 0, // no cache
4704 };
4705 EXPECT_TRUE(test::DNSResponder::fillRdata("5.6.7.8", recordAdditional));
4706 header.additionals.push_back(std::move(recordAdditional));
4707
4708 // Start DNS server.
4709 test::DNSResponder dns(test::DNSResponder::MappingType::DNS_HEADER);
4710 dns.addMappingDnsHeader(kHelloExampleCom, ns_type::ns_t_a, header);
4711 ASSERT_TRUE(dns.startServer());
4712 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4713 dns.clearQueries();
4714
4715 // Expect that get the address and the resolver doesn't crash.
Hungming Chen63779052019-10-30 15:06:13 +08004716 VerifyQueryHelloExampleComV4(dns, calltype);
4717}
4718
4719TEST_P(ResolverParameterizedTest, MessageCompression) {
4720 const auto& calltype = GetParam();
4721
4722 // The response with compressed domain name by a pointer. See RFC 1035 section 4.1.4.
4723 //
4724 // Ignoring the other fields of the message, the domain name of question section and answer
4725 // section are presented as:
4726 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4727 // 12 | 5 | h |
4728 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4729 // 14 | e | l |
4730 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4731 // 16 | l | o |
4732 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4733 // 18 | 7 | e |
4734 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4735 // 20 | x | a |
4736 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4737 // 22 | m | p |
4738 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4739 // 24 | l | e |
4740 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4741 // 26 | 3 | c |
4742 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4743 // 28 | o | m |
4744 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4745 // 30 | 0 | ... |
4746 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4747 //
4748 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4749 // 35 | 1 1| 12 |
4750 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4751 const std::vector<uint8_t> kResponseAPointer = {
4752 /* Header */
4753 0x00, 0x00, /* Transaction ID: 0x0000 */
4754 0x81, 0x80, /* Flags: qr rd ra */
4755 0x00, 0x01, /* Questions: 1 */
4756 0x00, 0x01, /* Answer RRs: 1 */
4757 0x00, 0x00, /* Authority RRs: 0 */
4758 0x00, 0x00, /* Additional RRs: 0 */
4759 /* Queries */
4760 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
4761 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name: hello.example.com */
4762 0x00, 0x01, /* Type: A */
4763 0x00, 0x01, /* Class: IN */
4764 /* Answers */
4765 0xc0, 0x0c, /* Name: hello.example.com (a pointer) */
4766 0x00, 0x01, /* Type: A */
4767 0x00, 0x01, /* Class: IN */
4768 0x00, 0x00, 0x00, 0x00, /* Time to live: 0 */
4769 0x00, 0x04, /* Data length: 4 */
4770 0x01, 0x02, 0x03, 0x04 /* Address: 1.2.3.4 */
4771 };
4772
4773 // The response with compressed domain name by a sequence of labels ending with a pointer. See
4774 // RFC 1035 section 4.1.4.
4775 //
4776 // Ignoring the other fields of the message, the domain name of question section and answer
4777 // section are presented as:
4778 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4779 // 12 | 5 | h |
4780 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4781 // 14 | e | l |
4782 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4783 // 16 | l | o |
4784 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4785 // 18 | 7 | e |
4786 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4787 // 20 | x | a |
4788 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4789 // 22 | m | p |
4790 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4791 // 24 | l | e |
4792 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4793 // 26 | 3 | c |
4794 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4795 // 28 | o | m |
4796 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4797 // 30 | 0 | ... |
4798 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4799 //
4800 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4801 // 35 | 5 | h |
4802 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4803 // 37 | e | l |
4804 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4805 // 39 | l | o |
4806 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4807 // 41 | 1 1| 18 |
4808 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4809 const std::vector<uint8_t> kResponseLabelEndingWithAPointer = {
4810 /* Header */
4811 0x00, 0x00, /* Transaction ID: 0x0000 */
4812 0x81, 0x80, /* Flags: qr rd ra */
4813 0x00, 0x01, /* Questions: 1 */
4814 0x00, 0x01, /* Answer RRs: 1 */
4815 0x00, 0x00, /* Authority RRs: 0 */
4816 0x00, 0x00, /* Additional RRs: 0 */
4817 /* Queries */
4818 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
4819 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name: hello.example.com */
4820 0x00, 0x01, /* Type: A */
4821 0x00, 0x01, /* Class: IN */
4822 /* Answers */
4823 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0xc0,
4824 0x12, /* Name: hello.example.com (a label ending with a pointer) */
4825 0x00, 0x01, /* Type: A */
4826 0x00, 0x01, /* Class: IN */
4827 0x00, 0x00, 0x00, 0x00, /* Time to live: 0 */
4828 0x00, 0x04, /* Data length: 4 */
4829 0x01, 0x02, 0x03, 0x04 /* Address: 1.2.3.4 */
4830 };
4831
4832 for (const auto& response : {kResponseAPointer, kResponseLabelEndingWithAPointer}) {
4833 SCOPED_TRACE(StringPrintf("Hex dump: %s", toHex(makeSlice(response)).c_str()));
4834
4835 test::DNSResponder dns(test::DNSResponder::MappingType::BINARY_PACKET);
4836 dns.addMappingBinaryPacket(kHelloExampleComQueryV4, response);
4837 StartDns(dns, {});
4838 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4839
4840 // Expect no cache because the TTL of testing responses are 0.
4841 VerifyQueryHelloExampleComV4(dns, calltype);
Hungming Chenbb90ab32019-10-28 18:20:31 +08004842 }
Mike Yu40e67072019-10-09 21:14:09 +08004843}
Hungming Chen22617fd2019-12-06 12:15:45 +08004844
4845TEST_P(ResolverParameterizedTest, TruncatedResponse) {
4846 const auto& calltype = GetParam();
4847
Hungming Chen22617fd2019-12-06 12:15:45 +08004848 test::DNSResponder dns;
Ken Chen99344882020-01-01 14:59:38 +08004849 StartDns(dns, kLargeCnameChainRecords);
Hungming Chen22617fd2019-12-06 12:15:45 +08004850 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4851
4852 // Expect UDP response is truncated. The resolver retries over TCP. See RFC 1035 section 4.2.1.
4853 VerifyQueryHelloExampleComV4(dns, calltype, false);
4854 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom));
4855 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom));
4856}
Luke Huang3caa42b2020-04-23 14:18:04 +00004857
4858TEST_F(ResolverTest, KeepListeningUDP) {
4859 constexpr char listen_addr1[] = "127.0.0.4";
4860 constexpr char listen_addr2[] = "127.0.0.5";
4861 constexpr char host_name[] = "howdy.example.com.";
4862 const std::vector<DnsRecord> records = {
4863 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
4864 };
4865 const std::vector<int> params = {300, 25, 8, 8, 1000 /* BASE_TIMEOUT_MSEC */,
4866 1 /* retry count */};
4867 const int delayTimeMs = 1500;
4868
4869 test::DNSResponder neverRespondDns(listen_addr2, "53", static_cast<ns_rcode>(-1));
4870 neverRespondDns.setResponseProbability(0.0);
4871 StartDns(neverRespondDns, records);
Luke Huang68fa5002020-04-23 15:48:47 +00004872 ScopedSystemProperties scopedSystemProperties(
4873 "persist.device_config.netd_native.keep_listening_udp", "1");
4874 // Re-setup test network to make experiment flag take effect.
4875 resetNetwork();
Luke Huang3caa42b2020-04-23 14:18:04 +00004876
4877 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr1, listen_addr2},
4878 kDefaultSearchDomains, params));
4879 // There are 2 DNS servers for this test.
4880 // |delayedDns| will be blocked for |delayTimeMs|, then start to respond to requests.
4881 // |neverRespondDns| will never respond.
4882 // In the first try, resolver will send query to |delayedDns| but get timeout error
4883 // because |delayTimeMs| > DNS timeout.
4884 // Then it's the second try, resolver will send query to |neverRespondDns| and
4885 // listen on both servers. Resolver will receive the answer coming from |delayedDns|.
Luke Huang3caa42b2020-04-23 14:18:04 +00004886
Luke Huang3caa42b2020-04-23 14:18:04 +00004887 test::DNSResponder delayedDns(listen_addr1);
4888 delayedDns.setResponseDelayMs(delayTimeMs);
4889 StartDns(delayedDns, records);
4890
4891 // Specify hints to ensure resolver doing query only 1 round.
4892 const addrinfo hints = {.ai_family = AF_INET6, .ai_socktype = SOCK_DGRAM};
4893 ScopedAddrinfo result = safe_getaddrinfo(host_name, nullptr, &hints);
4894 EXPECT_TRUE(result != nullptr);
4895
4896 std::string result_str = ToString(result);
4897 EXPECT_TRUE(result_str == "::1.2.3.4") << ", result_str='" << result_str << "'";
4898}
4899
4900TEST_F(ResolverTest, GetAddrInfoParallelLookupTimeout) {
4901 constexpr char listen_addr[] = "127.0.0.4";
4902 constexpr char host_name[] = "howdy.example.com.";
4903 constexpr int TIMING_TOLERANCE_MS = 200;
4904 constexpr int DNS_TIMEOUT_MS = 1000;
4905 const std::vector<DnsRecord> records = {
4906 {host_name, ns_type::ns_t_a, "1.2.3.4"},
4907 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
4908 };
4909 const std::vector<int> params = {300, 25, 8, 8, DNS_TIMEOUT_MS /* BASE_TIMEOUT_MSEC */,
4910 1 /* retry count */};
4911 test::DNSResponder neverRespondDns(listen_addr, "53", static_cast<ns_rcode>(-1));
4912 neverRespondDns.setResponseProbability(0.0);
4913 StartDns(neverRespondDns, records);
Luke Huang68fa5002020-04-23 15:48:47 +00004914 ScopedSystemProperties scopedSystemProperties(
4915 "persist.device_config.netd_native.parallel_lookup", "1");
Luke Huang5b30e712020-05-01 11:09:42 +00004916 // The default value of parallel_lookup_sleep_time should be very small
4917 // that we can ignore in this test case.
Luke Huang68fa5002020-04-23 15:48:47 +00004918 // Re-setup test network to make experiment flag take effect.
4919 resetNetwork();
Luke Huang3caa42b2020-04-23 14:18:04 +00004920
4921 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}, kDefaultSearchDomains, params));
4922 neverRespondDns.clearQueries();
4923
Luke Huang3caa42b2020-04-23 14:18:04 +00004924 // Use a never respond DNS server to verify if the A/AAAA queries are sent in parallel.
4925 // The resolver parameters are set to timeout 1s and retry 1 times.
4926 // So we expect the safe_getaddrinfo_time_taken() might take ~1s to
4927 // return when parallel lookup is enabled. And the DNS server should receive 2 queries.
4928 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_DGRAM};
4929 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(host_name, nullptr, hints);
4930
4931 EXPECT_TRUE(result == nullptr);
4932 EXPECT_NEAR(DNS_TIMEOUT_MS, timeTakenMs, TIMING_TOLERANCE_MS)
4933 << "took time should approximate equal timeout";
4934 EXPECT_EQ(2U, GetNumQueries(neverRespondDns, host_name));
4935}
Luke Huang5b30e712020-05-01 11:09:42 +00004936
4937TEST_F(ResolverTest, GetAddrInfoParallelLookupSleepTime) {
4938 constexpr char listen_addr[] = "127.0.0.4";
4939 constexpr int TIMING_TOLERANCE_MS = 200;
4940 const std::vector<DnsRecord> records = {
4941 {kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4},
4942 {kHelloExampleCom, ns_type::ns_t_aaaa, kHelloExampleComAddrV6},
4943 };
4944 const std::vector<int> params = {300, 25, 8, 8, 1000 /* BASE_TIMEOUT_MSEC */,
4945 1 /* retry count */};
4946 test::DNSResponder dns(listen_addr);
4947 StartDns(dns, records);
4948 ScopedSystemProperties scopedSystemProperties1(
4949 "persist.device_config.netd_native.parallel_lookup", "1");
4950 constexpr int PARALLEL_LOOKUP_SLEEP_TIME_MS = 500;
4951 ScopedSystemProperties scopedSystemProperties2(
4952 "persist.device_config.netd_native.parallel_lookup_sleep_time",
4953 std::to_string(PARALLEL_LOOKUP_SLEEP_TIME_MS));
4954 // Re-setup test network to make experiment flag take effect.
4955 resetNetwork();
4956
4957 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}, kDefaultSearchDomains, params));
4958 dns.clearQueries();
4959
4960 // Expect the safe_getaddrinfo_time_taken() might take ~500ms to return because we set
4961 // parallel_lookup_sleep_time to 500ms.
4962 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_DGRAM};
4963 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(kHelloExampleCom, nullptr, hints);
4964
4965 EXPECT_NE(nullptr, result);
4966 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(
4967 {kHelloExampleComAddrV4, kHelloExampleComAddrV6}));
4968 EXPECT_NEAR(PARALLEL_LOOKUP_SLEEP_TIME_MS, timeTakenMs, TIMING_TOLERANCE_MS)
4969 << "took time should approximate equal timeout";
4970 EXPECT_EQ(2U, GetNumQueries(dns, kHelloExampleCom));
4971
4972 // Expect the PARALLEL_LOOKUP_SLEEP_TIME_MS won't affect the query under cache hit case.
4973 dns.clearQueries();
4974 std::tie(result, timeTakenMs) = safe_getaddrinfo_time_taken(kHelloExampleCom, nullptr, hints);
4975 EXPECT_NE(nullptr, result);
4976 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(
4977 {kHelloExampleComAddrV4, kHelloExampleComAddrV6}));
4978 EXPECT_GT(PARALLEL_LOOKUP_SLEEP_TIME_MS, timeTakenMs);
4979 EXPECT_EQ(0U, GetNumQueries(dns, kHelloExampleCom));
4980}
Luke Huang8c45bfb2020-05-29 06:10:31 +00004981
4982TEST_F(ResolverTest, BlockDnsQueryUidDoesNotLeadToBadServer) {
4983 // This test relies on blocking traffic on loopback, which xt_qtaguid does not do.
4984 // See aosp/358413 and b/34444781 for why.
4985 SKIP_IF_BPF_NOT_SUPPORTED;
4986
4987 constexpr char listen_addr1[] = "127.0.0.4";
4988 constexpr char listen_addr2[] = "::1";
4989 test::DNSResponder dns1(listen_addr1);
4990 test::DNSResponder dns2(listen_addr2);
4991 StartDns(dns1, {});
4992 StartDns(dns2, {});
4993
4994 std::vector<std::string> servers = {listen_addr1, listen_addr2};
4995 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
4996 dns1.clearQueries();
4997 dns2.clearQueries();
4998 {
4999 ScopeBlockedUIDRule scopeBlockUidRule(mDnsClient.netdService(), TEST_UID);
5000 // Start querying ten times.
5001 for (int i = 0; i < 10; i++) {
5002 std::string hostName = fmt::format("blocked{}.com", i);
5003 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
5004 EXPECT_EQ(safe_getaddrinfo(hostName.c_str(), nullptr, &hints), nullptr);
5005 }
5006 }
5007 // Since all query packets are blocked, we should not see any stats of them.
5008 const std::vector<NameserverStats> expectedEmptyDnsStats = {
5009 NameserverStats(listen_addr1),
5010 NameserverStats(listen_addr2),
5011 };
5012 expectStatsFromGetResolverInfo(expectedEmptyDnsStats);
5013 EXPECT_EQ(dns1.queries().size(), 0U);
5014 EXPECT_EQ(dns2.queries().size(), 0U);
5015}