blob: 86ffb7258ecd992c0f530d984c67fabbdde2fed8 [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 Huang829511c2020-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
Mike Yu532405f2020-06-17 17:46:44 +080064#include "stats.h" // RCODE_TIMEOUT
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +090065#include "test_utils.h"
Hungming Chene8f970c2019-04-10 17:34:06 +080066#include "tests/dns_metrics_listener/dns_metrics_listener.h"
chenbruceb43ec752019-07-24 20:19:41 +080067#include "tests/dns_responder/dns_responder.h"
Luke Huangf8215372019-11-22 11:53:41 +080068#include "tests/dns_responder/dns_responder_client_ndk.h"
Hungming Chenc6556622019-10-02 16:01:07 +080069#include "tests/dns_responder/dns_tls_certificate.h"
chenbruceb43ec752019-07-24 20:19:41 +080070#include "tests/dns_responder/dns_tls_frontend.h"
Luke Huangfde82482019-06-04 01:04:53 +080071#include "tests/resolv_test_utils.h"
Ken Chenb9fa2062018-11-13 21:51:13 +080072
Luke Huang0d592bc2019-05-25 18:24:03 +080073// Valid VPN netId range is 100 ~ 65535
74constexpr int TEST_VPN_NETID = 65502;
Luke Huang94b10b92018-11-21 20:13:38 +080075constexpr int MAXPACKET = (8 * 1024);
Ken Chenb9fa2062018-11-13 21:51:13 +080076
77// Semi-public Bionic hook used by the NDK (frameworks/base/native/android/net.c)
78// Tested here for convenience.
79extern "C" int android_getaddrinfofornet(const char* hostname, const char* servname,
80 const addrinfo* hints, unsigned netid, unsigned mark,
81 struct addrinfo** result);
82
Mike Yu153b5b82020-03-04 19:53:54 +080083using namespace std::chrono_literals;
84
Luke Huang70070852019-11-25 18:25:50 +080085using aidl::android::net::IDnsResolver;
Luke Huangf8215372019-11-22 11:53:41 +080086using aidl::android::net::INetd;
Mike Yu8ac63402019-12-02 15:28:38 +080087using aidl::android::net::ResolverParamsParcel;
Mike Yu532405f2020-06-17 17:46:44 +080088using aidl::android::net::metrics::INetdEventListener;
Luke Huang9807e6b2019-05-20 16:17:12 +080089using android::base::ParseInt;
Ken Chenb9fa2062018-11-13 21:51:13 +080090using android::base::StringPrintf;
Luke Huang9807e6b2019-05-20 16:17:12 +080091using android::base::unique_fd;
Ken Chenb9fa2062018-11-13 21:51:13 +080092using android::net::ResolverStats;
Hungming Chene8f970c2019-04-10 17:34:06 +080093using android::net::metrics::DnsMetricsListener;
Ken Chenb9fa2062018-11-13 21:51:13 +080094using android::netdutils::enableSockopt;
Hungming Chen63779052019-10-30 15:06:13 +080095using android::netdutils::makeSlice;
Luke Huang9807e6b2019-05-20 16:17:12 +080096using android::netdutils::ResponseCode;
Luke Huang9d2d25b2019-06-14 00:34:05 +080097using android::netdutils::ScopedAddrinfo;
Mike Yu40e67072019-10-09 21:14:09 +080098using android::netdutils::Stopwatch;
Hungming Chen63779052019-10-30 15:06:13 +080099using android::netdutils::toHex;
Ken Chenb9fa2062018-11-13 21:51:13 +0800100
101// TODO: move into libnetdutils?
102namespace {
Luke Huangfde82482019-06-04 01:04:53 +0800103
Ken Chenb9fa2062018-11-13 21:51:13 +0800104ScopedAddrinfo safe_getaddrinfo(const char* node, const char* service,
105 const struct addrinfo* hints) {
106 addrinfo* result = nullptr;
107 if (getaddrinfo(node, service, hints, &result) != 0) {
108 result = nullptr; // Should already be the case, but...
109 }
110 return ScopedAddrinfo(result);
111}
Luke Huangfde82482019-06-04 01:04:53 +0800112
Mike Yu40e67072019-10-09 21:14:09 +0800113std::pair<ScopedAddrinfo, int> safe_getaddrinfo_time_taken(const char* node, const char* service,
114 const addrinfo& hints) {
115 Stopwatch s;
116 ScopedAddrinfo result = safe_getaddrinfo(node, service, &hints);
117 return {std::move(result), s.timeTakenUs() / 1000};
118}
119
Mike Yue2162e52020-03-04 18:43:46 +0800120struct NameserverStats {
121 NameserverStats() = delete;
122 NameserverStats(const std::string server) : server(server) {}
123 NameserverStats& setSuccesses(int val) {
124 successes = val;
125 return *this;
126 }
127 NameserverStats& setErrors(int val) {
128 errors = val;
129 return *this;
130 }
131 NameserverStats& setTimeouts(int val) {
132 timeouts = val;
133 return *this;
134 }
135 NameserverStats& setInternalErrors(int val) {
136 internal_errors = val;
137 return *this;
138 }
139
140 const std::string server;
141 int successes = 0;
142 int errors = 0;
143 int timeouts = 0;
144 int internal_errors = 0;
145};
146
Ken Chenb9fa2062018-11-13 21:51:13 +0800147} // namespace
148
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900149class ResolverTest : public ::testing::Test {
Hungming Chene8f970c2019-04-10 17:34:06 +0800150 public:
Hungming Chen473c4de2020-03-12 11:13:35 +0800151 static void SetUpTestSuite() {
Hungming Chen5bf09772019-04-25 11:16:13 +0800152 // Get binder service.
153 // Note that |mDnsClient| is not used for getting binder service in this static function.
154 // The reason is that wants to keep |mDnsClient| as a non-static data member. |mDnsClient|
155 // which sets up device network configuration could be independent from every test.
Luke Huangf8215372019-11-22 11:53:41 +0800156 // TODO: Perhaps add a static function in resolv_test_binder_utils.{cpp,h} to get binder
157 // service.
158
159 AIBinder* binder = AServiceManager_getService("dnsresolver");
160 ndk::SpAIBinder resolvBinder = ndk::SpAIBinder(binder);
161 auto resolvService = aidl::android::net::IDnsResolver::fromBinder(resolvBinder);
Hungming Chen5bf09772019-04-25 11:16:13 +0800162 ASSERT_NE(nullptr, resolvService.get());
163
164 // Subscribe the death recipient to the service IDnsResolver for detecting Netd death.
Luke Huang70070852019-11-25 18:25:50 +0800165 // GTEST assertion macros are not invoked for generating a test failure in the death
166 // recipient because the macros can't indicate failed test if Netd died between tests.
167 // Moreover, continuing testing may have no meaningful after Netd death. Therefore, the
168 // death recipient aborts process by GTEST_LOG_(FATAL) once Netd died.
Luke Huangf8215372019-11-22 11:53:41 +0800169 sResolvDeathRecipient = AIBinder_DeathRecipient_new([](void*) {
170 constexpr char errorMessage[] = "Netd died";
171 LOG(ERROR) << errorMessage;
172 GTEST_LOG_(FATAL) << errorMessage;
173 });
174 ASSERT_EQ(STATUS_OK, AIBinder_linkToDeath(binder, sResolvDeathRecipient, nullptr));
Hungming Chen5bf09772019-04-25 11:16:13 +0800175
176 // Subscribe the DNS listener for verifying DNS metrics event contents.
Luke Huangf8215372019-11-22 11:53:41 +0800177 sDnsMetricsListener = ndk::SharedRefBase::make<DnsMetricsListener>(
178 TEST_NETID /*monitor specific network*/);
Hungming Chen5bf09772019-04-25 11:16:13 +0800179 ASSERT_TRUE(resolvService->registerEventListener(sDnsMetricsListener).isOk());
180
181 // Start the binder thread pool for listening DNS metrics events and receiving death
182 // recipient.
Luke Huangf8215372019-11-22 11:53:41 +0800183 ABinderProcess_startThreadPool();
Hungming Chene8f970c2019-04-10 17:34:06 +0800184 }
Hungming Chen473c4de2020-03-12 11:13:35 +0800185 static void TearDownTestSuite() { AIBinder_DeathRecipient_delete(sResolvDeathRecipient); }
Hungming Chene8f970c2019-04-10 17:34:06 +0800186
Ken Chenb9fa2062018-11-13 21:51:13 +0800187 protected:
Lorenzo Colitti61f796b2020-05-21 00:57:49 +0900188 void SetUp() {
189 mDnsClient.SetUp();
190 sDnsMetricsListener->reset();
191 }
192
Mike Yu960243d2020-01-17 19:02:15 +0800193 void TearDown() {
194 // Ensure the dump works at the end of each test.
195 DumpResolverService();
196
197 mDnsClient.TearDown();
198 }
nuccachena26cc2a2018-07-17 18:07:23 +0800199
Luke Huangf40df9c2020-04-21 08:51:48 +0800200 void resetNetwork() {
201 mDnsClient.TearDown();
202 mDnsClient.SetupOemNetwork();
203 }
204
Xiao Ma09b71022018-12-11 17:56:32 +0900205 void StartDns(test::DNSResponder& dns, const std::vector<DnsRecord>& records) {
206 for (const auto& r : records) {
207 dns.addMapping(r.host_name, r.type, r.addr);
208 }
209
210 ASSERT_TRUE(dns.startServer());
211 dns.clearQueries();
212 }
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900213
Mike Yu960243d2020-01-17 19:02:15 +0800214 void DumpResolverService() {
215 unique_fd fd(open("/dev/null", O_WRONLY));
216 EXPECT_EQ(mDnsClient.resolvService()->dump(fd, nullptr, 0), 0);
217
218 const char* querylogCmd[] = {"querylog"}; // Keep it sync with DnsQueryLog::DUMP_KEYWORD.
219 EXPECT_EQ(mDnsClient.resolvService()->dump(fd, querylogCmd, std::size(querylogCmd)), 0);
220 }
221
Hungming Chene8f970c2019-04-10 17:34:06 +0800222 bool WaitForNat64Prefix(ExpectNat64PrefixStatus status,
223 std::chrono::milliseconds timeout = std::chrono::milliseconds(1000)) {
Hungming Chen5bf09772019-04-25 11:16:13 +0800224 return sDnsMetricsListener->waitForNat64Prefix(status, timeout);
Hungming Chene8f970c2019-04-10 17:34:06 +0800225 }
226
Mike Yu724f77d2019-08-16 11:14:50 +0800227 bool WaitForPrivateDnsValidation(std::string serverAddr, bool validated) {
228 return sDnsMetricsListener->waitForPrivateDnsValidation(serverAddr, validated);
229 }
230
Mike Yu153b5b82020-03-04 19:53:54 +0800231 bool hasUncaughtPrivateDnsValidation(const std::string& serverAddr) {
232 return sDnsMetricsListener->findValidationRecord(serverAddr);
233 }
234
Mike Yu532405f2020-06-17 17:46:44 +0800235 void ExpectDnsEvent(int32_t eventType, int32_t returnCode, const std::string& hostname,
236 const std::vector<std::string>& ipAddresses) {
237 const DnsMetricsListener::DnsEvent expect = {
238 TEST_NETID, eventType, returnCode,
239 hostname, ipAddresses, static_cast<int32_t>(ipAddresses.size())};
Mike Yub8faac42020-06-20 11:11:44 +0800240 do {
241 // Blocking call until timeout.
242 const auto dnsEvent = sDnsMetricsListener->popDnsEvent();
243 ASSERT_TRUE(dnsEvent.has_value()) << "Expected DnsEvent " << expect;
244 if (dnsEvent.value() == expect) break;
245 LOG(INFO) << "Skip unexpected DnsEvent: " << dnsEvent.value();
246 } while (true);
Mike Yu532405f2020-06-17 17:46:44 +0800247 }
248
Mike Yue2162e52020-03-04 18:43:46 +0800249 bool expectStatsFromGetResolverInfo(const std::vector<NameserverStats>& nameserversStats) {
250 std::vector<std::string> res_servers;
251 std::vector<std::string> res_domains;
252 std::vector<std::string> res_tls_servers;
253 res_params res_params;
254 std::vector<ResolverStats> res_stats;
255 int wait_for_pending_req_timeout_count;
256
257 if (!DnsResponderClient::GetResolverInfo(mDnsClient.resolvService(), TEST_NETID,
258 &res_servers, &res_domains, &res_tls_servers,
259 &res_params, &res_stats,
260 &wait_for_pending_req_timeout_count)) {
261 ADD_FAILURE() << "GetResolverInfo failed";
262 return false;
263 }
264
265 if (res_servers.size() != res_stats.size()) {
266 ADD_FAILURE() << fmt::format("res_servers.size() != res_stats.size(): {} != {}",
267 res_servers.size(), res_stats.size());
268 return false;
269 }
270 if (res_servers.size() != nameserversStats.size()) {
271 ADD_FAILURE() << fmt::format("res_servers.size() != nameserversStats.size(): {} != {}",
272 res_servers.size(), nameserversStats.size());
273 return false;
274 }
275
276 for (const auto& stats : nameserversStats) {
277 SCOPED_TRACE(stats.server);
278 const auto it = std::find(res_servers.begin(), res_servers.end(), stats.server);
279 if (it == res_servers.end()) {
280 ADD_FAILURE() << fmt::format("nameserver {} not found in the list {{{}}}",
281 stats.server, fmt::join(res_servers, ", "));
282 return false;
283 }
284 const int index = std::distance(res_servers.begin(), it);
285
286 // The check excludes rtt_avg, last_sample_time, and usable since they will be obsolete
287 // after |res_stats| is retrieved from NetConfig.dnsStats rather than NetConfig.nsstats.
288 EXPECT_EQ(res_stats[index].successes, stats.successes);
289 EXPECT_EQ(res_stats[index].errors, stats.errors);
290 EXPECT_EQ(res_stats[index].timeouts, stats.timeouts);
291 EXPECT_EQ(res_stats[index].internal_errors, stats.internal_errors);
292 }
293
294 return true;
295 }
296
Mike Yu153b5b82020-03-04 19:53:54 +0800297 // Since there's no way to terminate private DNS validation threads at any time. Tests that
298 // focus on the results of private DNS validation can interfere with each other if they use the
299 // same IP address for test servers. getUniqueIPv4Address() is a workaround to reduce the
300 // possibility of tests being flaky. A feasible solution is to forbid the validation threads,
301 // which are considered as outdated (e.g. switch the resolver to private DNS OFF mode), updating
302 // the result to the PrivateDnsConfiguration instance.
303 static std::string getUniqueIPv4Address() {
304 static int counter = 0;
305 return fmt::format("127.0.100.{}", (++counter & 0xff));
306 }
307
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900308 DnsResponderClient mDnsClient;
Xiao Ma09b71022018-12-11 17:56:32 +0900309
Hungming Chen5bf09772019-04-25 11:16:13 +0800310 // Use a shared static DNS listener for all tests to avoid registering lots of listeners
311 // which may be released late until process terminated. Currently, registered DNS listener
312 // is removed by binder death notification which is fired when the process hosting an
313 // IBinder has gone away. If every test in ResolverTest registers its DNS listener, Netd
314 // may temporarily hold lots of dead listeners until the unit test process terminates.
315 // TODO: Perhaps add an unregistering listener binder call or fork a listener process which
316 // could be terminated earlier.
Luke Huangf8215372019-11-22 11:53:41 +0800317 static std::shared_ptr<DnsMetricsListener>
Hungming Chen473c4de2020-03-12 11:13:35 +0800318 sDnsMetricsListener; // Initialized in SetUpTestSuite.
Hungming Chen5bf09772019-04-25 11:16:13 +0800319
320 // Use a shared static death recipient to monitor the service death. The static death
321 // recipient could monitor the death not only during the test but also between tests.
Hungming Chen473c4de2020-03-12 11:13:35 +0800322 static AIBinder_DeathRecipient* sResolvDeathRecipient; // Initialized in SetUpTestSuite.
Ken Chenb9fa2062018-11-13 21:51:13 +0800323};
324
Hungming Chen5bf09772019-04-25 11:16:13 +0800325// Initialize static member of class.
Luke Huangf8215372019-11-22 11:53:41 +0800326std::shared_ptr<DnsMetricsListener> ResolverTest::sDnsMetricsListener;
327AIBinder_DeathRecipient* ResolverTest::sResolvDeathRecipient;
Hungming Chen5bf09772019-04-25 11:16:13 +0800328
Ken Chenb9fa2062018-11-13 21:51:13 +0800329TEST_F(ResolverTest, GetHostByName) {
Xiao Ma09b71022018-12-11 17:56:32 +0900330 constexpr char nonexistent_host_name[] = "nonexistent.example.com.";
331
332 test::DNSResponder dns;
333 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.3"}});
334 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800335
336 const hostent* result;
Ken Chenb9fa2062018-11-13 21:51:13 +0800337 result = gethostbyname("nonexistent");
338 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, nonexistent_host_name));
339 ASSERT_TRUE(result == nullptr);
340 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
341
342 dns.clearQueries();
343 result = gethostbyname("hello");
Xiao Ma09b71022018-12-11 17:56:32 +0900344 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
Ken Chenb9fa2062018-11-13 21:51:13 +0800345 ASSERT_FALSE(result == nullptr);
346 ASSERT_EQ(4, result->h_length);
347 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
348 EXPECT_EQ("1.2.3.3", ToString(result));
349 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800350}
351
lifr4e4a2e02019-01-29 16:53:51 +0800352TEST_F(ResolverTest, GetHostByName_cnames) {
353 constexpr char host_name[] = "host.example.com.";
354 size_t cnamecount = 0;
355 test::DNSResponder dns;
356
357 const std::vector<DnsRecord> records = {
358 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
359 {"a.example.com.", ns_type::ns_t_cname, "b.example.com."},
360 {"b.example.com.", ns_type::ns_t_cname, "c.example.com."},
361 {"c.example.com.", ns_type::ns_t_cname, "d.example.com."},
362 {"d.example.com.", ns_type::ns_t_cname, "e.example.com."},
363 {"e.example.com.", ns_type::ns_t_cname, host_name},
364 {host_name, ns_type::ns_t_a, "1.2.3.3"},
365 {host_name, ns_type::ns_t_aaaa, "2001:db8::42"},
366 };
367 StartDns(dns, records);
368 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
369
370 // using gethostbyname2() to resolve ipv4 hello.example.com. to 1.2.3.3
371 // Ensure the v4 address and cnames are correct
372 const hostent* result;
373 result = gethostbyname2("hello", AF_INET);
374 ASSERT_FALSE(result == nullptr);
375
376 for (int i = 0; result != nullptr && result->h_aliases[i] != nullptr; i++) {
377 std::string domain_name = records[i].host_name.substr(0, records[i].host_name.size() - 1);
378 EXPECT_EQ(result->h_aliases[i], domain_name);
379 cnamecount++;
380 }
381 // The size of "Non-cname type" record in DNS records is 2
382 ASSERT_EQ(cnamecount, records.size() - 2);
383 ASSERT_EQ(4, result->h_length);
384 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
385 EXPECT_EQ("1.2.3.3", ToString(result));
386 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
387 EXPECT_EQ(1U, dns.queries().size()) << dns.dumpQueries();
388
389 // using gethostbyname2() to resolve ipv6 hello.example.com. to 2001:db8::42
390 // Ensure the v6 address and cnames are correct
391 cnamecount = 0;
392 dns.clearQueries();
393 result = gethostbyname2("hello", AF_INET6);
394 for (unsigned i = 0; result != nullptr && result->h_aliases[i] != nullptr; i++) {
395 std::string domain_name = records[i].host_name.substr(0, records[i].host_name.size() - 1);
396 EXPECT_EQ(result->h_aliases[i], domain_name);
397 cnamecount++;
398 }
399 // The size of "Non-cname type" DNS record in records is 2
400 ASSERT_EQ(cnamecount, records.size() - 2);
401 ASSERT_FALSE(result == nullptr);
402 ASSERT_EQ(16, result->h_length);
403 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
404 EXPECT_EQ("2001:db8::42", ToString(result));
405 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
406}
407
408TEST_F(ResolverTest, GetHostByName_cnamesInfiniteLoop) {
409 test::DNSResponder dns;
410 const std::vector<DnsRecord> records = {
411 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
412 {"a.example.com.", ns_type::ns_t_cname, kHelloExampleCom},
413 };
414 StartDns(dns, records);
415 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
416
417 const hostent* result;
418 result = gethostbyname2("hello", AF_INET);
419 ASSERT_TRUE(result == nullptr);
420
421 dns.clearQueries();
422 result = gethostbyname2("hello", AF_INET6);
423 ASSERT_TRUE(result == nullptr);
424}
425
Ken Chenb9fa2062018-11-13 21:51:13 +0800426TEST_F(ResolverTest, GetHostByName_localhost) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800427 constexpr char name_camelcase[] = "LocalHost";
Ken Chenb9fa2062018-11-13 21:51:13 +0800428 constexpr char name_ip6_dot[] = "ip6-localhost.";
429 constexpr char name_ip6_fqdn[] = "ip6-localhost.example.com.";
430
431 // Add a dummy nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900432 test::DNSResponder dns;
433 StartDns(dns, {});
434 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800435
436 // Expect no DNS queries; localhost is resolved via /etc/hosts
Xiao Ma09b71022018-12-11 17:56:32 +0900437 const hostent* result = gethostbyname(kLocalHost);
Ken Chenb9fa2062018-11-13 21:51:13 +0800438 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
439 ASSERT_FALSE(result == nullptr);
440 ASSERT_EQ(4, result->h_length);
441 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900442 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800443 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
444
445 // Ensure the hosts file resolver ignores case of hostnames
446 result = gethostbyname(name_camelcase);
447 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
448 ASSERT_FALSE(result == nullptr);
449 ASSERT_EQ(4, result->h_length);
450 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900451 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800452 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
453
454 // The hosts file also contains ip6-localhost, but gethostbyname() won't
chenbruce018fdb22019-06-12 18:08:04 +0800455 // return it. This would be easy to
Ken Chenb9fa2062018-11-13 21:51:13 +0800456 // change, but there's no point in changing the legacy behavior; new code
457 // should be calling getaddrinfo() anyway.
458 // So we check the legacy behavior, which results in amusing A-record
459 // lookups for ip6-localhost, with and without search domains appended.
460 dns.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900461 result = gethostbyname(kIp6LocalHost);
Sehee Parkbbca0202018-11-16 10:53:16 +0900462 EXPECT_EQ(2U, dns.queries().size()) << dns.dumpQueries();
463 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, name_ip6_dot)) << dns.dumpQueries();
464 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, name_ip6_fqdn)) << dns.dumpQueries();
Ken Chenb9fa2062018-11-13 21:51:13 +0800465 ASSERT_TRUE(result == nullptr);
466
467 // Finally, use gethostbyname2() to resolve ip6-localhost to ::1 from
468 // the hosts file.
469 dns.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900470 result = gethostbyname2(kIp6LocalHost, AF_INET6);
Ken Chenb9fa2062018-11-13 21:51:13 +0800471 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
472 ASSERT_FALSE(result == nullptr);
473 ASSERT_EQ(16, result->h_length);
474 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900475 EXPECT_EQ(kIp6LocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800476 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800477}
478
479TEST_F(ResolverTest, GetHostByName_numeric) {
480 // Add a dummy nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900481 test::DNSResponder dns;
482 StartDns(dns, {});
483 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800484
485 // Numeric v4 address: expect no DNS queries
486 constexpr char numeric_v4[] = "192.168.0.1";
Ken Chenb9fa2062018-11-13 21:51:13 +0800487 const hostent* result = gethostbyname(numeric_v4);
Sehee Parkbbca0202018-11-16 10:53:16 +0900488 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800489 ASSERT_FALSE(result == nullptr);
490 ASSERT_EQ(4, result->h_length); // v4
491 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
492 EXPECT_EQ(numeric_v4, ToString(result));
493 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
494
495 // gethostbyname() recognizes a v6 address, and fails with no DNS queries
496 constexpr char numeric_v6[] = "2001:db8::42";
497 dns.clearQueries();
498 result = gethostbyname(numeric_v6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900499 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800500 EXPECT_TRUE(result == nullptr);
501
502 // Numeric v6 address with gethostbyname2(): succeeds with no DNS queries
503 dns.clearQueries();
504 result = gethostbyname2(numeric_v6, AF_INET6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900505 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800506 ASSERT_FALSE(result == nullptr);
507 ASSERT_EQ(16, result->h_length); // v6
508 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
509 EXPECT_EQ(numeric_v6, ToString(result));
510 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
511
512 // Numeric v6 address with scope work with getaddrinfo(),
513 // but gethostbyname2() does not understand them; it issues two dns
514 // queries, then fails. This hardly ever happens, there's no point
515 // in fixing this. This test simply verifies the current (bogus)
516 // behavior to avoid further regressions (like crashes, or leaks).
517 constexpr char numeric_v6_scope[] = "fe80::1%lo";
518 dns.clearQueries();
519 result = gethostbyname2(numeric_v6_scope, AF_INET6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900520 EXPECT_EQ(2U, dns.queries().size()); // OUCH!
Ken Chenb9fa2062018-11-13 21:51:13 +0800521 ASSERT_TRUE(result == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800522}
523
524TEST_F(ResolverTest, BinderSerialization) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800525 std::vector<int> params_offsets = {
Luke Huang5bd827c2019-03-14 16:10:04 +0800526 IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY,
527 IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD,
528 IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES,
529 IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES,
530 IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC,
531 IDnsResolver::RESOLVER_PARAMS_RETRY_COUNT,
Ken Chenb9fa2062018-11-13 21:51:13 +0800532 };
Bernie Innocentib102dd22018-12-04 14:57:48 +0900533 const int size = static_cast<int>(params_offsets.size());
Luke Huang5bd827c2019-03-14 16:10:04 +0800534 EXPECT_EQ(size, IDnsResolver::RESOLVER_PARAMS_COUNT);
Ken Chenb9fa2062018-11-13 21:51:13 +0800535 std::sort(params_offsets.begin(), params_offsets.end());
Bernie Innocentib102dd22018-12-04 14:57:48 +0900536 for (int i = 0; i < size; ++i) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800537 EXPECT_EQ(params_offsets[i], i);
538 }
539}
540
541TEST_F(ResolverTest, GetHostByName_Binder) {
Luke Huangf8215372019-11-22 11:53:41 +0800542 std::vector<std::string> domains = {"example.com"};
Ken Chenb9fa2062018-11-13 21:51:13 +0800543 std::vector<std::unique_ptr<test::DNSResponder>> dns;
544 std::vector<std::string> servers;
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900545 std::vector<DnsResponderClient::Mapping> mappings;
546 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupMappings(1, domains, &mappings));
547 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupDNSServers(4, mappings, &dns, &servers));
Ken Chenb9fa2062018-11-13 21:51:13 +0800548 ASSERT_EQ(1U, mappings.size());
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900549 const DnsResponderClient::Mapping& mapping = mappings[0];
Ken Chenb9fa2062018-11-13 21:51:13 +0800550
Xiao Ma09b71022018-12-11 17:56:32 +0900551 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains, kDefaultParams));
Ken Chenb9fa2062018-11-13 21:51:13 +0800552
553 const hostent* result = gethostbyname(mapping.host.c_str());
Bernie Innocentib102dd22018-12-04 14:57:48 +0900554 const size_t total_queries =
Luke Huangfde82482019-06-04 01:04:53 +0800555 std::accumulate(dns.begin(), dns.end(), 0, [&mapping](size_t total, auto& d) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800556 return total + GetNumQueriesForType(*d, ns_type::ns_t_a, mapping.entry.c_str());
557 });
558
559 EXPECT_LE(1U, total_queries);
560 ASSERT_FALSE(result == nullptr);
561 ASSERT_EQ(4, result->h_length);
562 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
563 EXPECT_EQ(mapping.ip4, ToString(result));
564 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
565
566 std::vector<std::string> res_servers;
567 std::vector<std::string> res_domains;
Mike Yu0a1c53d2018-11-26 13:26:21 +0900568 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +0900569 res_params res_params;
Ken Chenb9fa2062018-11-13 21:51:13 +0800570 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +0800571 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +0800572 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
573 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
574 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chenb9fa2062018-11-13 21:51:13 +0800575 EXPECT_EQ(servers.size(), res_servers.size());
576 EXPECT_EQ(domains.size(), res_domains.size());
Mike Yu0a1c53d2018-11-26 13:26:21 +0900577 EXPECT_EQ(0U, res_tls_servers.size());
Luke Huang5bd827c2019-03-14 16:10:04 +0800578 ASSERT_EQ(static_cast<size_t>(IDnsResolver::RESOLVER_PARAMS_COUNT), kDefaultParams.size());
579 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY],
580 res_params.sample_validity);
581 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900582 res_params.success_threshold);
Luke Huang5bd827c2019-03-14 16:10:04 +0800583 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
584 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
585 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
Ken Chenb9fa2062018-11-13 21:51:13 +0800586 res_params.base_timeout_msec);
587 EXPECT_EQ(servers.size(), res_stats.size());
588
Bernie Innocenti0c067e42019-04-01 15:33:16 +0900589 EXPECT_THAT(res_servers, testing::UnorderedElementsAreArray(servers));
590 EXPECT_THAT(res_domains, testing::UnorderedElementsAreArray(domains));
Ken Chenb9fa2062018-11-13 21:51:13 +0800591}
592
593TEST_F(ResolverTest, GetAddrInfo) {
Xiao Ma09b71022018-12-11 17:56:32 +0900594 constexpr char listen_addr[] = "127.0.0.4";
595 constexpr char listen_addr2[] = "127.0.0.5";
596 constexpr char host_name[] = "howdy.example.com.";
Ken Chenb9fa2062018-11-13 21:51:13 +0800597
Xiao Ma09b71022018-12-11 17:56:32 +0900598 const std::vector<DnsRecord> records = {
599 {host_name, ns_type::ns_t_a, "1.2.3.4"},
600 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
601 };
602 test::DNSResponder dns(listen_addr);
603 test::DNSResponder dns2(listen_addr2);
604 StartDns(dns, records);
605 StartDns(dns2, records);
Ken Chenb9fa2062018-11-13 21:51:13 +0800606
Xiao Ma09b71022018-12-11 17:56:32 +0900607 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}));
Ken Chenb9fa2062018-11-13 21:51:13 +0800608 dns.clearQueries();
609 dns2.clearQueries();
610
611 ScopedAddrinfo result = safe_getaddrinfo("howdy", nullptr, nullptr);
612 EXPECT_TRUE(result != nullptr);
613 size_t found = GetNumQueries(dns, host_name);
614 EXPECT_LE(1U, found);
615 // Could be A or AAAA
616 std::string result_str = ToString(result);
617 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +0800618 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +0800619
620 // Verify that the name is cached.
621 size_t old_found = found;
622 result = safe_getaddrinfo("howdy", nullptr, nullptr);
623 EXPECT_TRUE(result != nullptr);
624 found = GetNumQueries(dns, host_name);
625 EXPECT_LE(1U, found);
626 EXPECT_EQ(old_found, found);
627 result_str = ToString(result);
Luke Huangf8215372019-11-22 11:53:41 +0800628 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4") << result_str;
Ken Chenb9fa2062018-11-13 21:51:13 +0800629
630 // Change the DNS resolver, ensure that queries are still cached.
Xiao Ma09b71022018-12-11 17:56:32 +0900631 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr2}));
Ken Chenb9fa2062018-11-13 21:51:13 +0800632 dns.clearQueries();
633 dns2.clearQueries();
634
635 result = safe_getaddrinfo("howdy", nullptr, nullptr);
636 EXPECT_TRUE(result != nullptr);
637 found = GetNumQueries(dns, host_name);
638 size_t found2 = GetNumQueries(dns2, host_name);
639 EXPECT_EQ(0U, found);
640 EXPECT_LE(0U, found2);
641
642 // Could be A or AAAA
643 result_str = ToString(result);
644 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +0800645 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +0800646}
647
648TEST_F(ResolverTest, GetAddrInfoV4) {
Xiao Ma09b71022018-12-11 17:56:32 +0900649 test::DNSResponder dns;
650 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.5"}});
651 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800652
Xiao Ma09b71022018-12-11 17:56:32 +0900653 const addrinfo hints = {.ai_family = AF_INET};
654 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
Ken Chenb9fa2062018-11-13 21:51:13 +0800655 EXPECT_TRUE(result != nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900656 EXPECT_EQ(1U, GetNumQueries(dns, kHelloExampleCom));
Ken Chenb9fa2062018-11-13 21:51:13 +0800657 EXPECT_EQ("1.2.3.5", ToString(result));
658}
659
660TEST_F(ResolverTest, GetAddrInfo_localhost) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800661 // Add a dummy nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900662 test::DNSResponder dns;
663 StartDns(dns, {});
664 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800665
Xiao Ma09b71022018-12-11 17:56:32 +0900666 ScopedAddrinfo result = safe_getaddrinfo(kLocalHost, nullptr, nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800667 EXPECT_TRUE(result != nullptr);
668 // Expect no DNS queries; localhost is resolved via /etc/hosts
669 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900670 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800671
Xiao Ma09b71022018-12-11 17:56:32 +0900672 result = safe_getaddrinfo(kIp6LocalHost, nullptr, nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800673 EXPECT_TRUE(result != nullptr);
674 // Expect no DNS queries; ip6-localhost is resolved via /etc/hosts
675 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900676 EXPECT_EQ(kIp6LocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800677}
678
Luke Huangd8ac4752019-06-18 17:05:47 +0800679TEST_F(ResolverTest, GetAddrInfo_InvalidSocketType) {
680 test::DNSResponder dns;
681 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.5"}});
682 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
683
684 // TODO: Test other invalid socket types.
685 const addrinfo hints = {
686 .ai_family = AF_UNSPEC,
Luke Huangd8ac4752019-06-18 17:05:47 +0800687 .ai_socktype = SOCK_PACKET,
688 };
689 addrinfo* result = nullptr;
690 // This is a valid hint, but the query won't be sent because the socket type is
691 // not supported.
692 EXPECT_EQ(EAI_NODATA, getaddrinfo("hello", nullptr, &hints, &result));
693 ScopedAddrinfo result_cleanup(result);
694 EXPECT_EQ(nullptr, result);
695}
696
Ken Chen92bed612018-12-22 21:46:55 +0800697// Verify if the resolver correctly handle multiple queries simultaneously
698// step 1: set dns server#1 into deferred responding mode.
699// step 2: thread#1 query "hello.example.com." --> resolver send query to server#1.
700// step 3: thread#2 query "hello.example.com." --> resolver hold the request and wait for
701// response of previous pending query sent by thread#1.
702// step 4: thread#3 query "konbanha.example.com." --> resolver send query to server#3. Server
703// respond to resolver immediately.
704// step 5: check if server#1 get 1 query by thread#1, server#2 get 0 query, server#3 get 1 query.
705// step 6: resume dns server#1 to respond dns query in step#2.
706// step 7: thread#1 and #2 should get returned from DNS query after step#6. Also, check the
707// number of queries in server#2 is 0 to ensure thread#2 does not wake up unexpectedly
708// before signaled by thread#1.
709TEST_F(ResolverTest, GetAddrInfoV4_deferred_resp) {
710 const char* listen_addr1 = "127.0.0.9";
711 const char* listen_addr2 = "127.0.0.10";
712 const char* listen_addr3 = "127.0.0.11";
713 const char* listen_srv = "53";
714 const char* host_name_deferred = "hello.example.com.";
715 const char* host_name_normal = "konbanha.example.com.";
Mike Yufc125e42019-05-15 20:41:28 +0800716 test::DNSResponder dns1(listen_addr1, listen_srv, ns_rcode::ns_r_servfail);
717 test::DNSResponder dns2(listen_addr2, listen_srv, ns_rcode::ns_r_servfail);
718 test::DNSResponder dns3(listen_addr3, listen_srv, ns_rcode::ns_r_servfail);
Ken Chen92bed612018-12-22 21:46:55 +0800719 dns1.addMapping(host_name_deferred, ns_type::ns_t_a, "1.2.3.4");
720 dns2.addMapping(host_name_deferred, ns_type::ns_t_a, "1.2.3.4");
721 dns3.addMapping(host_name_normal, ns_type::ns_t_a, "1.2.3.5");
722 ASSERT_TRUE(dns1.startServer());
723 ASSERT_TRUE(dns2.startServer());
724 ASSERT_TRUE(dns3.startServer());
725 const std::vector<std::string> servers_for_t1 = {listen_addr1};
726 const std::vector<std::string> servers_for_t2 = {listen_addr2};
727 const std::vector<std::string> servers_for_t3 = {listen_addr3};
728 addrinfo hints = {.ai_family = AF_INET};
729 const std::vector<int> params = {300, 25, 8, 8, 5000};
730 bool t3_task_done = false;
731
732 dns1.setDeferredResp(true);
733 std::thread t1([&, this]() {
734 ASSERT_TRUE(
735 mDnsClient.SetResolversForNetwork(servers_for_t1, kDefaultSearchDomains, params));
736 ScopedAddrinfo result = safe_getaddrinfo(host_name_deferred, nullptr, &hints);
737 // t3's dns query should got returned first
738 EXPECT_TRUE(t3_task_done);
739 EXPECT_EQ(1U, GetNumQueries(dns1, host_name_deferred));
740 EXPECT_TRUE(result != nullptr);
741 EXPECT_EQ("1.2.3.4", ToString(result));
742 });
743
744 // ensuring t1 and t2 handler functions are processed in order
745 usleep(100 * 1000);
746 std::thread t2([&, this]() {
747 ASSERT_TRUE(
748 mDnsClient.SetResolversForNetwork(servers_for_t2, kDefaultSearchDomains, params));
749 ScopedAddrinfo result = safe_getaddrinfo(host_name_deferred, nullptr, &hints);
750 EXPECT_TRUE(t3_task_done);
751 EXPECT_EQ(0U, GetNumQueries(dns2, host_name_deferred));
752 EXPECT_TRUE(result != nullptr);
753 EXPECT_EQ("1.2.3.4", ToString(result));
754
755 std::vector<std::string> res_servers;
756 std::vector<std::string> res_domains;
757 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +0900758 res_params res_params;
Ken Chen92bed612018-12-22 21:46:55 +0800759 std::vector<ResolverStats> res_stats;
760 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +0800761 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
762 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains,
763 &res_tls_servers, &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chen92bed612018-12-22 21:46:55 +0800764 EXPECT_EQ(0, wait_for_pending_req_timeout_count);
765 });
766
767 // ensuring t2 and t3 handler functions are processed in order
768 usleep(100 * 1000);
769 std::thread t3([&, this]() {
770 ASSERT_TRUE(
771 mDnsClient.SetResolversForNetwork(servers_for_t3, kDefaultSearchDomains, params));
772 ScopedAddrinfo result = safe_getaddrinfo(host_name_normal, nullptr, &hints);
773 EXPECT_EQ(1U, GetNumQueries(dns1, host_name_deferred));
774 EXPECT_EQ(0U, GetNumQueries(dns2, host_name_deferred));
775 EXPECT_EQ(1U, GetNumQueries(dns3, host_name_normal));
776 EXPECT_TRUE(result != nullptr);
777 EXPECT_EQ("1.2.3.5", ToString(result));
778
779 t3_task_done = true;
780 dns1.setDeferredResp(false);
781 });
782 t3.join();
783 t1.join();
784 t2.join();
785}
786
lifr4e4a2e02019-01-29 16:53:51 +0800787TEST_F(ResolverTest, GetAddrInfo_cnames) {
788 constexpr char host_name[] = "host.example.com.";
789 test::DNSResponder dns;
790 const std::vector<DnsRecord> records = {
791 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
792 {"a.example.com.", ns_type::ns_t_cname, "b.example.com."},
793 {"b.example.com.", ns_type::ns_t_cname, "c.example.com."},
794 {"c.example.com.", ns_type::ns_t_cname, "d.example.com."},
795 {"d.example.com.", ns_type::ns_t_cname, "e.example.com."},
796 {"e.example.com.", ns_type::ns_t_cname, host_name},
797 {host_name, ns_type::ns_t_a, "1.2.3.3"},
798 {host_name, ns_type::ns_t_aaaa, "2001:db8::42"},
799 };
800 StartDns(dns, records);
801 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
802
803 addrinfo hints = {.ai_family = AF_INET};
804 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
805 EXPECT_TRUE(result != nullptr);
806 EXPECT_EQ("1.2.3.3", ToString(result));
807
808 dns.clearQueries();
809 hints = {.ai_family = AF_INET6};
810 result = safe_getaddrinfo("hello", nullptr, &hints);
811 EXPECT_TRUE(result != nullptr);
812 EXPECT_EQ("2001:db8::42", ToString(result));
813}
814
815TEST_F(ResolverTest, GetAddrInfo_cnamesNoIpAddress) {
816 test::DNSResponder dns;
817 const std::vector<DnsRecord> records = {
818 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
819 };
820 StartDns(dns, records);
821 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
822
823 addrinfo hints = {.ai_family = AF_INET};
824 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
825 EXPECT_TRUE(result == nullptr);
826
827 dns.clearQueries();
828 hints = {.ai_family = AF_INET6};
829 result = safe_getaddrinfo("hello", nullptr, &hints);
830 EXPECT_TRUE(result == nullptr);
831}
832
833TEST_F(ResolverTest, GetAddrInfo_cnamesIllegalRdata) {
834 test::DNSResponder dns;
835 const std::vector<DnsRecord> records = {
836 {kHelloExampleCom, ns_type::ns_t_cname, ".!#?"},
837 };
838 StartDns(dns, records);
839 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
840
841 addrinfo hints = {.ai_family = AF_INET};
842 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
843 EXPECT_TRUE(result == nullptr);
844
845 dns.clearQueries();
846 hints = {.ai_family = AF_INET6};
847 result = safe_getaddrinfo("hello", nullptr, &hints);
848 EXPECT_TRUE(result == nullptr);
849}
850
Ken Chenb9fa2062018-11-13 21:51:13 +0800851TEST_F(ResolverTest, MultidomainResolution) {
Xiao Ma09b71022018-12-11 17:56:32 +0900852 constexpr char host_name[] = "nihao.example2.com.";
Luke Huangf8215372019-11-22 11:53:41 +0800853 std::vector<std::string> searchDomains = {"example1.com", "example2.com", "example3.com"};
Ken Chenb9fa2062018-11-13 21:51:13 +0800854
Xiao Ma09b71022018-12-11 17:56:32 +0900855 test::DNSResponder dns("127.0.0.6");
856 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.3"}});
857 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({"127.0.0.6"}, searchDomains));
858
Ken Chenb9fa2062018-11-13 21:51:13 +0800859 const hostent* result = gethostbyname("nihao");
Xiao Ma09b71022018-12-11 17:56:32 +0900860
Ken Chenb9fa2062018-11-13 21:51:13 +0800861 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
862 ASSERT_FALSE(result == nullptr);
863 ASSERT_EQ(4, result->h_length);
864 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
865 EXPECT_EQ("1.2.3.3", ToString(result));
866 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800867}
868
869TEST_F(ResolverTest, GetAddrInfoV6_numeric) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800870 constexpr char host_name[] = "ohayou.example.com.";
871 constexpr char numeric_addr[] = "fe80::1%lo";
872
Xiao Ma09b71022018-12-11 17:56:32 +0900873 test::DNSResponder dns;
Ken Chenb9fa2062018-11-13 21:51:13 +0800874 dns.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900875 StartDns(dns, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
876 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800877
878 addrinfo hints = {.ai_family = AF_INET6};
879 ScopedAddrinfo result = safe_getaddrinfo(numeric_addr, nullptr, &hints);
880 EXPECT_TRUE(result != nullptr);
881 EXPECT_EQ(numeric_addr, ToString(result));
882 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
883
884 // Now try a non-numeric hostname query with the AI_NUMERICHOST flag set.
885 // We should fail without sending out a DNS query.
886 hints.ai_flags |= AI_NUMERICHOST;
887 result = safe_getaddrinfo(host_name, nullptr, &hints);
888 EXPECT_TRUE(result == nullptr);
889 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
890}
891
892TEST_F(ResolverTest, GetAddrInfoV6_failing) {
Xiao Ma09b71022018-12-11 17:56:32 +0900893 constexpr char listen_addr0[] = "127.0.0.7";
894 constexpr char listen_addr1[] = "127.0.0.8";
Ken Chenb9fa2062018-11-13 21:51:13 +0800895 const char* host_name = "ohayou.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +0900896
897 test::DNSResponder dns0(listen_addr0);
898 test::DNSResponder dns1(listen_addr1);
Ken Chenb9fa2062018-11-13 21:51:13 +0800899 dns0.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900900 StartDns(dns0, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
901 StartDns(dns1, {{host_name, ns_type::ns_t_aaaa, "2001:db8::6"}});
902
Luke Huangf8215372019-11-22 11:53:41 +0800903 std::vector<std::string> servers = {listen_addr0, listen_addr1};
Ken Chenb9fa2062018-11-13 21:51:13 +0800904 // <sample validity in s> <success threshold in percent> <min samples> <max samples>
905 int sample_count = 8;
Luke Huangf8215372019-11-22 11:53:41 +0800906 const std::vector<int> params = {300, 25, sample_count, sample_count};
Xiao Ma09b71022018-12-11 17:56:32 +0900907 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, kDefaultSearchDomains, params));
Ken Chenb9fa2062018-11-13 21:51:13 +0800908
909 // Repeatedly perform resolutions for non-existing domains until MAXNSSAMPLES resolutions have
910 // reached the dns0, which is set to fail. No more requests should then arrive at that server
911 // for the next sample_lifetime seconds.
912 // TODO: This approach is implementation-dependent, change once metrics reporting is available.
Xiao Ma09b71022018-12-11 17:56:32 +0900913 const addrinfo hints = {.ai_family = AF_INET6};
Bernie Innocentib102dd22018-12-04 14:57:48 +0900914 for (int i = 0; i < sample_count; ++i) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800915 std::string domain = StringPrintf("nonexistent%d", i);
916 ScopedAddrinfo result = safe_getaddrinfo(domain.c_str(), nullptr, &hints);
917 }
918 // Due to 100% errors for all possible samples, the server should be ignored from now on and
919 // only the second one used for all following queries, until NSSAMPLE_VALIDITY is reached.
920 dns0.clearQueries();
921 dns1.clearQueries();
922 ScopedAddrinfo result = safe_getaddrinfo("ohayou", nullptr, &hints);
923 EXPECT_TRUE(result != nullptr);
924 EXPECT_EQ(0U, GetNumQueries(dns0, host_name));
925 EXPECT_EQ(1U, GetNumQueries(dns1, host_name));
926}
927
928TEST_F(ResolverTest, GetAddrInfoV6_nonresponsive) {
Xiao Ma09b71022018-12-11 17:56:32 +0900929 constexpr char listen_addr0[] = "127.0.0.7";
930 constexpr char listen_addr1[] = "127.0.0.8";
931 constexpr char listen_srv[] = "53";
932 constexpr char host_name1[] = "ohayou.example.com.";
933 constexpr char host_name2[] = "ciao.example.com.";
Luke Huang483cf332019-06-03 17:24:51 +0800934 const std::vector<std::string> defaultSearchDomain = {"example.com"};
935 // The minimal timeout is 1000ms, so we can't decrease timeout
936 // So reduce retry count.
937 const std::vector<int> reduceRetryParams = {
938 300, // sample validity in seconds
939 25, // success threshod in percent
940 8, 8, // {MIN,MAX}_SAMPLES
941 1000, // BASE_TIMEOUT_MSEC
942 1, // retry count
943 };
Xiao Ma09b71022018-12-11 17:56:32 +0900944 const std::vector<DnsRecord> records0 = {
945 {host_name1, ns_type::ns_t_aaaa, "2001:db8::5"},
946 {host_name2, ns_type::ns_t_aaaa, "2001:db8::5"},
947 };
948 const std::vector<DnsRecord> records1 = {
949 {host_name1, ns_type::ns_t_aaaa, "2001:db8::6"},
950 {host_name2, ns_type::ns_t_aaaa, "2001:db8::6"},
951 };
Ken Chenb9fa2062018-11-13 21:51:13 +0800952
953 // dns0 does not respond with 100% probability, while
954 // dns1 responds normally, at least initially.
Mike Yufc125e42019-05-15 20:41:28 +0800955 test::DNSResponder dns0(listen_addr0, listen_srv, static_cast<ns_rcode>(-1));
956 test::DNSResponder dns1(listen_addr1, listen_srv, static_cast<ns_rcode>(-1));
Ken Chenb9fa2062018-11-13 21:51:13 +0800957 dns0.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900958 StartDns(dns0, records0);
959 StartDns(dns1, records1);
Luke Huang483cf332019-06-03 17:24:51 +0800960 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr0, listen_addr1}, defaultSearchDomain,
961 reduceRetryParams));
Ken Chenb9fa2062018-11-13 21:51:13 +0800962
Luke Huang483cf332019-06-03 17:24:51 +0800963 // Specify ai_socktype to make getaddrinfo will only query 1 time
964 const addrinfo hints = {.ai_family = AF_INET6, .ai_socktype = SOCK_STREAM};
Ken Chenb9fa2062018-11-13 21:51:13 +0800965
966 // dns0 will ignore the request, and we'll fallback to dns1 after the first
967 // retry.
968 ScopedAddrinfo result = safe_getaddrinfo(host_name1, nullptr, &hints);
969 EXPECT_TRUE(result != nullptr);
970 EXPECT_EQ(1U, GetNumQueries(dns0, host_name1));
971 EXPECT_EQ(1U, GetNumQueries(dns1, host_name1));
Mike Yu532405f2020-06-17 17:46:44 +0800972 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, 0, host_name1, {"2001:db8::6"});
Ken Chenb9fa2062018-11-13 21:51:13 +0800973
974 // Now make dns1 also ignore 100% requests... The resolve should alternate
Luke Huang483cf332019-06-03 17:24:51 +0800975 // queries between the nameservers and fail
Ken Chenb9fa2062018-11-13 21:51:13 +0800976 dns1.setResponseProbability(0.0);
977 addrinfo* result2 = nullptr;
978 EXPECT_EQ(EAI_NODATA, getaddrinfo(host_name2, nullptr, &hints, &result2));
979 EXPECT_EQ(nullptr, result2);
Luke Huang483cf332019-06-03 17:24:51 +0800980 EXPECT_EQ(1U, GetNumQueries(dns0, host_name2));
981 EXPECT_EQ(1U, GetNumQueries(dns1, host_name2));
Mike Yu532405f2020-06-17 17:46:44 +0800982 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, RCODE_TIMEOUT, host_name2, {});
Ken Chenb9fa2062018-11-13 21:51:13 +0800983}
984
985TEST_F(ResolverTest, GetAddrInfoV6_concurrent) {
Xiao Ma09b71022018-12-11 17:56:32 +0900986 constexpr char listen_addr0[] = "127.0.0.9";
987 constexpr char listen_addr1[] = "127.0.0.10";
988 constexpr char listen_addr2[] = "127.0.0.11";
989 constexpr char host_name[] = "konbanha.example.com.";
990
991 test::DNSResponder dns0(listen_addr0);
992 test::DNSResponder dns1(listen_addr1);
993 test::DNSResponder dns2(listen_addr2);
994 StartDns(dns0, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
995 StartDns(dns1, {{host_name, ns_type::ns_t_aaaa, "2001:db8::6"}});
996 StartDns(dns2, {{host_name, ns_type::ns_t_aaaa, "2001:db8::7"}});
997
Luke Huangf8215372019-11-22 11:53:41 +0800998 const std::vector<std::string> servers = {listen_addr0, listen_addr1, listen_addr2};
Ken Chenb9fa2062018-11-13 21:51:13 +0800999 std::vector<std::thread> threads(10);
1000 for (std::thread& thread : threads) {
Luke Huangf8215372019-11-22 11:53:41 +08001001 thread = std::thread([this, &servers]() {
1002 unsigned delay = arc4random_uniform(1 * 1000 * 1000); // <= 1s
Ken Chenb9fa2062018-11-13 21:51:13 +08001003 usleep(delay);
1004 std::vector<std::string> serverSubset;
1005 for (const auto& server : servers) {
1006 if (arc4random_uniform(2)) {
1007 serverSubset.push_back(server);
1008 }
1009 }
1010 if (serverSubset.empty()) serverSubset = servers;
Xiao Ma09b71022018-12-11 17:56:32 +09001011 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(serverSubset));
1012 const addrinfo hints = {.ai_family = AF_INET6};
Ken Chenb9fa2062018-11-13 21:51:13 +08001013 addrinfo* result = nullptr;
1014 int rv = getaddrinfo("konbanha", nullptr, &hints, &result);
1015 EXPECT_EQ(0, rv) << "error [" << rv << "] " << gai_strerror(rv);
1016 if (result) {
1017 freeaddrinfo(result);
1018 result = nullptr;
1019 }
1020 });
1021 }
1022 for (std::thread& thread : threads) {
1023 thread.join();
1024 }
Ken Chen92bed612018-12-22 21:46:55 +08001025
1026 std::vector<std::string> res_servers;
1027 std::vector<std::string> res_domains;
1028 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001029 res_params res_params;
Ken Chen92bed612018-12-22 21:46:55 +08001030 std::vector<ResolverStats> res_stats;
1031 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001032 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1033 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1034 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chen92bed612018-12-22 21:46:55 +08001035 EXPECT_EQ(0, wait_for_pending_req_timeout_count);
Ken Chenb9fa2062018-11-13 21:51:13 +08001036}
1037
Mike Yu8ac63402019-12-02 15:28:38 +08001038TEST_F(ResolverTest, SkipBadServersDueToInternalError) {
1039 constexpr char listen_addr1[] = "fe80::1";
1040 constexpr char listen_addr2[] = "255.255.255.255";
1041 constexpr char listen_addr3[] = "127.0.0.3";
1042
1043 test::DNSResponder dns(listen_addr3);
1044 ASSERT_TRUE(dns.startServer());
1045
1046 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
1047 parcel.servers = {listen_addr1, listen_addr2, listen_addr3};
1048
1049 // Bad servers can be distinguished after two attempts.
1050 parcel.minSamples = 2;
1051 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1052
1053 // Start querying five times.
1054 for (int i = 0; i < 5; i++) {
1055 std::string hostName = StringPrintf("hello%d.com.", i);
1056 dns.addMapping(hostName, ns_type::ns_t_a, "1.2.3.4");
1057 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1058 EXPECT_TRUE(safe_getaddrinfo(hostName.c_str(), nullptr, &hints) != nullptr);
1059 }
1060
Mike Yue2162e52020-03-04 18:43:46 +08001061 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1062 NameserverStats(listen_addr1).setInternalErrors(2),
1063 NameserverStats(listen_addr2).setInternalErrors(2),
1064 NameserverStats(listen_addr3).setSuccesses(5),
1065 };
1066 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
Mike Yu8ac63402019-12-02 15:28:38 +08001067}
1068
1069TEST_F(ResolverTest, SkipBadServersDueToTimeout) {
1070 constexpr char listen_addr1[] = "127.0.0.3";
1071 constexpr char listen_addr2[] = "127.0.0.4";
1072
1073 // Set dns1 non-responsive and dns2 workable.
1074 test::DNSResponder dns1(listen_addr1, test::kDefaultListenService, static_cast<ns_rcode>(-1));
1075 test::DNSResponder dns2(listen_addr2);
1076 dns1.setResponseProbability(0.0);
1077 ASSERT_TRUE(dns1.startServer());
1078 ASSERT_TRUE(dns2.startServer());
1079
1080 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
1081 parcel.servers = {listen_addr1, listen_addr2};
1082
1083 // Bad servers can be distinguished after two attempts.
1084 parcel.minSamples = 2;
1085 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1086
1087 // Start querying five times.
1088 for (int i = 0; i < 5; i++) {
1089 std::string hostName = StringPrintf("hello%d.com.", i);
1090 dns1.addMapping(hostName, ns_type::ns_t_a, "1.2.3.4");
1091 dns2.addMapping(hostName, ns_type::ns_t_a, "1.2.3.5");
1092 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1093 EXPECT_TRUE(safe_getaddrinfo(hostName.c_str(), nullptr, &hints) != nullptr);
1094 }
1095
Mike Yue2162e52020-03-04 18:43:46 +08001096 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1097 NameserverStats(listen_addr1).setTimeouts(2),
1098 NameserverStats(listen_addr2).setSuccesses(5),
1099 };
1100 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
Mike Yu8ac63402019-12-02 15:28:38 +08001101 EXPECT_EQ(dns1.queries().size(), 2U);
1102 EXPECT_EQ(dns2.queries().size(), 5U);
1103}
1104
chenbrucefd837fa2019-10-29 18:35:36 +08001105TEST_F(ResolverTest, GetAddrInfoFromCustTable_InvalidInput) {
1106 constexpr char hostnameNoip[] = "noip.example.com.";
1107 constexpr char hostnameInvalidip[] = "invalidip.example.com.";
1108 const std::vector<aidl::android::net::ResolverHostsParcel> invalidCustHosts = {
1109 {"", hostnameNoip},
1110 {"wrong IP", hostnameInvalidip},
1111 };
1112 test::DNSResponder dns;
1113 StartDns(dns, {});
1114 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
Ken Chena6ac2a62020-04-07 17:25:56 +08001115 resolverParams.resolverOptions.hosts = invalidCustHosts;
chenbrucefd837fa2019-10-29 18:35:36 +08001116 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1117 for (const auto& hostname : {hostnameNoip, hostnameInvalidip}) {
1118 // The query won't get data from customized table because of invalid customized table
1119 // and DNSResponder also has no records. hostnameNoip has never registered and
1120 // hostnameInvalidip has registered but wrong IP.
1121 const addrinfo hints = {.ai_family = AF_UNSPEC};
1122 ScopedAddrinfo result = safe_getaddrinfo(hostname, nullptr, &hints);
1123 ASSERT_TRUE(result == nullptr);
1124 EXPECT_EQ(4U, GetNumQueries(dns, hostname));
1125 }
1126}
1127
1128TEST_F(ResolverTest, GetAddrInfoFromCustTable) {
1129 constexpr char hostnameV4[] = "v4only.example.com.";
1130 constexpr char hostnameV6[] = "v6only.example.com.";
1131 constexpr char hostnameV4V6[] = "v4v6.example.com.";
1132 constexpr char custAddrV4[] = "1.2.3.4";
1133 constexpr char custAddrV6[] = "::1.2.3.4";
1134 constexpr char dnsSvAddrV4[] = "1.2.3.5";
1135 constexpr char dnsSvAddrV6[] = "::1.2.3.5";
1136 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4 = {
1137 {custAddrV4, hostnameV4},
1138 };
1139 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV6 = {
1140 {custAddrV6, hostnameV6},
1141 };
1142 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4V6 = {
1143 {custAddrV4, hostnameV4V6},
1144 {custAddrV6, hostnameV4V6},
1145 };
1146 const std::vector<DnsRecord> dnsSvHostV4 = {
1147 {hostnameV4, ns_type::ns_t_a, dnsSvAddrV4},
1148 };
1149 const std::vector<DnsRecord> dnsSvHostV6 = {
1150 {hostnameV6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1151 };
1152 const std::vector<DnsRecord> dnsSvHostV4V6 = {
1153 {hostnameV4V6, ns_type::ns_t_a, dnsSvAddrV4},
1154 {hostnameV4V6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1155 };
1156 struct TestConfig {
1157 const std::string name;
1158 const std::vector<aidl::android::net::ResolverHostsParcel> customizedHosts;
1159 const std::vector<DnsRecord> dnsserverHosts;
1160 const std::vector<std::string> queryResult;
1161 std::string asParameters() const {
1162 return StringPrintf("name: %s, customizedHosts: %s, dnsserverHosts: %s", name.c_str(),
1163 customizedHosts.empty() ? "No" : "Yes",
1164 dnsserverHosts.empty() ? "No" : "Yes");
1165 }
1166 } testConfigs[]{
1167 // clang-format off
1168 {hostnameV4, {}, {}, {}},
1169 {hostnameV4, {}, dnsSvHostV4, {dnsSvAddrV4}},
1170 {hostnameV4, custHostV4, {}, {custAddrV4}},
1171 {hostnameV4, custHostV4, dnsSvHostV4, {custAddrV4}},
1172 {hostnameV6, {}, {}, {}},
1173 {hostnameV6, {}, dnsSvHostV6, {dnsSvAddrV6}},
1174 {hostnameV6, custHostV6, {}, {custAddrV6}},
1175 {hostnameV6, custHostV6, dnsSvHostV6, {custAddrV6}},
1176 {hostnameV4V6, {}, {}, {}},
1177 {hostnameV4V6, {}, dnsSvHostV4V6, {dnsSvAddrV4, dnsSvAddrV6}},
1178 {hostnameV4V6, custHostV4V6, {}, {custAddrV4, custAddrV6}},
1179 {hostnameV4V6, custHostV4V6, dnsSvHostV4V6, {custAddrV4, custAddrV6}},
1180 // clang-format on
1181 };
1182
1183 for (const auto& config : testConfigs) {
1184 SCOPED_TRACE(config.asParameters());
1185
1186 test::DNSResponder dns;
1187 StartDns(dns, config.dnsserverHosts);
1188
1189 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
Ken Chena6ac2a62020-04-07 17:25:56 +08001190 resolverParams.resolverOptions.hosts = config.customizedHosts;
chenbrucefd837fa2019-10-29 18:35:36 +08001191 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1192 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM};
1193 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
1194 if (config.customizedHosts.empty() && config.dnsserverHosts.empty()) {
1195 ASSERT_TRUE(result == nullptr);
1196 EXPECT_EQ(2U, GetNumQueries(dns, config.name.c_str()));
1197 } else {
1198 ASSERT_TRUE(result != nullptr);
1199 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(config.queryResult));
1200 EXPECT_EQ(config.customizedHosts.empty() ? 2U : 0U,
1201 GetNumQueries(dns, config.name.c_str()));
1202 }
1203
1204 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
1205 }
1206}
1207
1208TEST_F(ResolverTest, GetAddrInfoFromCustTable_Modify) {
1209 constexpr char hostnameV4V6[] = "v4v6.example.com.";
1210 constexpr char custAddrV4[] = "1.2.3.4";
1211 constexpr char custAddrV6[] = "::1.2.3.4";
1212 constexpr char dnsSvAddrV4[] = "1.2.3.5";
1213 constexpr char dnsSvAddrV6[] = "::1.2.3.5";
1214 const std::vector<DnsRecord> dnsSvHostV4V6 = {
1215 {hostnameV4V6, ns_type::ns_t_a, dnsSvAddrV4},
1216 {hostnameV4V6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1217 };
1218 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4V6 = {
1219 {custAddrV4, hostnameV4V6},
1220 {custAddrV6, hostnameV4V6},
1221 };
1222 test::DNSResponder dns;
1223 StartDns(dns, dnsSvHostV4V6);
1224 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1225
Ken Chena6ac2a62020-04-07 17:25:56 +08001226 resolverParams.resolverOptions.hosts = custHostV4V6;
chenbrucefd837fa2019-10-29 18:35:36 +08001227 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1228 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM};
1229 ScopedAddrinfo result = safe_getaddrinfo(hostnameV4V6, nullptr, &hints);
1230 ASSERT_TRUE(result != nullptr);
1231 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray({custAddrV4, custAddrV6}));
1232 EXPECT_EQ(0U, GetNumQueries(dns, hostnameV4V6));
1233
Ken Chena6ac2a62020-04-07 17:25:56 +08001234 resolverParams.resolverOptions.hosts = {};
chenbrucefd837fa2019-10-29 18:35:36 +08001235 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1236 result = safe_getaddrinfo(hostnameV4V6, nullptr, &hints);
1237 ASSERT_TRUE(result != nullptr);
1238 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray({dnsSvAddrV4, dnsSvAddrV6}));
1239 EXPECT_EQ(2U, GetNumQueries(dns, hostnameV4V6));
1240}
1241
Ken Chenb9fa2062018-11-13 21:51:13 +08001242TEST_F(ResolverTest, EmptySetup) {
Ken Chenb9fa2062018-11-13 21:51:13 +08001243 std::vector<std::string> servers;
1244 std::vector<std::string> domains;
Xiao Ma09b71022018-12-11 17:56:32 +09001245 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001246 std::vector<std::string> res_servers;
1247 std::vector<std::string> res_domains;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001248 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001249 res_params res_params;
Ken Chenb9fa2062018-11-13 21:51:13 +08001250 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +08001251 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001252 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1253 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1254 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chenb9fa2062018-11-13 21:51:13 +08001255 EXPECT_EQ(0U, res_servers.size());
1256 EXPECT_EQ(0U, res_domains.size());
Mike Yu0a1c53d2018-11-26 13:26:21 +09001257 EXPECT_EQ(0U, res_tls_servers.size());
Luke Huang5bd827c2019-03-14 16:10:04 +08001258 ASSERT_EQ(static_cast<size_t>(IDnsResolver::RESOLVER_PARAMS_COUNT), kDefaultParams.size());
1259 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY],
1260 res_params.sample_validity);
1261 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001262 res_params.success_threshold);
Luke Huang5bd827c2019-03-14 16:10:04 +08001263 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
1264 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
1265 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
Ken Chenb9fa2062018-11-13 21:51:13 +08001266 res_params.base_timeout_msec);
Luke Huang5bd827c2019-03-14 16:10:04 +08001267 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_RETRY_COUNT], res_params.retry_count);
Ken Chenb9fa2062018-11-13 21:51:13 +08001268}
1269
1270TEST_F(ResolverTest, SearchPathChange) {
Xiao Ma09b71022018-12-11 17:56:32 +09001271 constexpr char listen_addr[] = "127.0.0.13";
1272 constexpr char host_name1[] = "test13.domain1.org.";
1273 constexpr char host_name2[] = "test13.domain2.org.";
Luke Huangf8215372019-11-22 11:53:41 +08001274 std::vector<std::string> servers = {listen_addr};
1275 std::vector<std::string> domains = {"domain1.org"};
Xiao Ma09b71022018-12-11 17:56:32 +09001276
1277 const std::vector<DnsRecord> records = {
1278 {host_name1, ns_type::ns_t_aaaa, "2001:db8::13"},
1279 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1:13"},
1280 };
1281 test::DNSResponder dns(listen_addr);
1282 StartDns(dns, records);
1283 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001284
1285 const addrinfo hints = {.ai_family = AF_INET6};
1286 ScopedAddrinfo result = safe_getaddrinfo("test13", nullptr, &hints);
1287 EXPECT_TRUE(result != nullptr);
1288 EXPECT_EQ(1U, dns.queries().size());
1289 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
1290 EXPECT_EQ("2001:db8::13", ToString(result));
1291
1292 // Test that changing the domain search path on its own works.
Luke Huangf8215372019-11-22 11:53:41 +08001293 domains = {"domain2.org"};
Xiao Ma09b71022018-12-11 17:56:32 +09001294 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001295 dns.clearQueries();
1296
1297 result = safe_getaddrinfo("test13", nullptr, &hints);
1298 EXPECT_TRUE(result != nullptr);
1299 EXPECT_EQ(1U, dns.queries().size());
1300 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
1301 EXPECT_EQ("2001:db8::1:13", ToString(result));
1302}
1303
Luke Huang2dac4382019-06-24 13:28:44 +08001304namespace {
1305
Luke Huangf8215372019-11-22 11:53:41 +08001306std::vector<std::string> getResolverDomains(aidl::android::net::IDnsResolver* dnsResolverService,
Luke Huang2dac4382019-06-24 13:28:44 +08001307 unsigned netId) {
1308 std::vector<std::string> res_servers;
1309 std::vector<std::string> res_domains;
1310 std::vector<std::string> res_tls_servers;
1311 res_params res_params;
1312 std::vector<ResolverStats> res_stats;
1313 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001314 DnsResponderClient::GetResolverInfo(dnsResolverService, netId, &res_servers, &res_domains,
1315 &res_tls_servers, &res_params, &res_stats,
1316 &wait_for_pending_req_timeout_count);
Luke Huang2dac4382019-06-24 13:28:44 +08001317 return res_domains;
1318}
1319
1320} // namespace
1321
1322TEST_F(ResolverTest, SearchPathPrune) {
1323 constexpr size_t DUPLICATED_DOMAIN_NUM = 3;
1324 constexpr char listen_addr[] = "127.0.0.13";
1325 constexpr char domian_name1[] = "domain13.org.";
1326 constexpr char domian_name2[] = "domain14.org.";
1327 constexpr char host_name1[] = "test13.domain13.org.";
1328 constexpr char host_name2[] = "test14.domain14.org.";
1329 std::vector<std::string> servers = {listen_addr};
1330
1331 std::vector<std::string> testDomains1;
1332 std::vector<std::string> testDomains2;
1333 // Domain length should be <= 255
1334 // Max number of domains in search path is 6
1335 for (size_t i = 0; i < MAXDNSRCH + 1; i++) {
1336 // Fill up with invalid domain
1337 testDomains1.push_back(std::string(300, i + '0'));
1338 // Fill up with valid but duplicated domain
1339 testDomains2.push_back(StringPrintf("domain%zu.org", i % DUPLICATED_DOMAIN_NUM));
1340 }
1341
1342 // Add valid domain used for query.
1343 testDomains1.push_back(domian_name1);
1344
1345 // Add valid domain twice used for query.
1346 testDomains2.push_back(domian_name2);
1347 testDomains2.push_back(domian_name2);
1348
1349 const std::vector<DnsRecord> records = {
1350 {host_name1, ns_type::ns_t_aaaa, "2001:db8::13"},
1351 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1:13"},
1352 };
1353 test::DNSResponder dns(listen_addr);
1354 StartDns(dns, records);
1355 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, testDomains1));
1356
1357 const addrinfo hints = {.ai_family = AF_INET6};
1358 ScopedAddrinfo result = safe_getaddrinfo("test13", nullptr, &hints);
1359
1360 EXPECT_TRUE(result != nullptr);
1361
1362 EXPECT_EQ(1U, dns.queries().size());
1363 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
1364 EXPECT_EQ("2001:db8::13", ToString(result));
1365
1366 const auto& res_domains1 = getResolverDomains(mDnsClient.resolvService(), TEST_NETID);
1367 // Expect 1 valid domain, invalid domains are removed.
1368 ASSERT_EQ(1U, res_domains1.size());
1369 EXPECT_EQ(domian_name1, res_domains1[0]);
1370
1371 dns.clearQueries();
1372
1373 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, testDomains2));
1374
1375 result = safe_getaddrinfo("test14", nullptr, &hints);
1376 EXPECT_TRUE(result != nullptr);
1377
1378 // (3 domains * 2 retries) + 1 success query = 7
1379 EXPECT_EQ(7U, dns.queries().size());
1380 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
1381 EXPECT_EQ("2001:db8::1:13", ToString(result));
1382
1383 const auto& res_domains2 = getResolverDomains(mDnsClient.resolvService(), TEST_NETID);
1384 // Expect 4 valid domain, duplicate domains are removed.
1385 EXPECT_EQ(DUPLICATED_DOMAIN_NUM + 1U, res_domains2.size());
1386 EXPECT_THAT(
1387 std::vector<std::string>({"domain0.org", "domain1.org", "domain2.org", domian_name2}),
1388 testing::ElementsAreArray(res_domains2));
1389}
1390
Mike Yu0a1c53d2018-11-26 13:26:21 +09001391// If we move this function to dns_responder_client, it will complicate the dependency need of
1392// dns_tls_frontend.h.
1393static void setupTlsServers(const std::vector<std::string>& servers,
waynema0e73c2e2019-07-31 15:04:08 +08001394 std::vector<std::unique_ptr<test::DnsTlsFrontend>>* tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001395 constexpr char listen_udp[] = "53";
1396 constexpr char listen_tls[] = "853";
Mike Yu0a1c53d2018-11-26 13:26:21 +09001397
1398 for (const auto& server : servers) {
1399 auto t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
1400 t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
1401 t->startServer();
Mike Yu0a1c53d2018-11-26 13:26:21 +09001402 tls->push_back(std::move(t));
1403 }
1404}
1405
Mike Yu0a1c53d2018-11-26 13:26:21 +09001406TEST_F(ResolverTest, MaxServerPrune_Binder) {
Mike Yu0a1c53d2018-11-26 13:26:21 +09001407 std::vector<std::string> domains;
1408 std::vector<std::unique_ptr<test::DNSResponder>> dns;
1409 std::vector<std::unique_ptr<test::DnsTlsFrontend>> tls;
1410 std::vector<std::string> servers;
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001411 std::vector<DnsResponderClient::Mapping> mappings;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001412
1413 for (unsigned i = 0; i < MAXDNSRCH + 1; i++) {
1414 domains.push_back(StringPrintf("example%u.com", i));
1415 }
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001416 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupMappings(1, domains, &mappings));
1417 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupDNSServers(MAXNS + 1, mappings, &dns, &servers));
waynema0e73c2e2019-07-31 15:04:08 +08001418 ASSERT_NO_FATAL_FAILURE(setupTlsServers(servers, &tls));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001419
waynema0e73c2e2019-07-31 15:04:08 +08001420 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, domains, kDefaultParams,
1421 kDefaultPrivateDnsHostName));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001422
Mike Yu383855b2019-01-15 17:53:27 +08001423 // If the private DNS validation hasn't completed yet before backend DNS servers stop,
1424 // TLS servers will get stuck in handleOneRequest(), which causes this test stuck in
1425 // ~DnsTlsFrontend() because the TLS server loop threads can't be terminated.
1426 // So, wait for private DNS validation done before stopping backend DNS servers.
1427 for (int i = 0; i < MAXNS; i++) {
chenbruceaff85842019-05-31 15:46:42 +08001428 LOG(INFO) << "Waiting for private DNS validation on " << tls[i]->listen_address() << ".";
Mike Yu724f77d2019-08-16 11:14:50 +08001429 EXPECT_TRUE(WaitForPrivateDnsValidation(tls[i]->listen_address(), true));
chenbruceaff85842019-05-31 15:46:42 +08001430 LOG(INFO) << "private DNS validation on " << tls[i]->listen_address() << " done.";
Mike Yu383855b2019-01-15 17:53:27 +08001431 }
1432
Mike Yu0a1c53d2018-11-26 13:26:21 +09001433 std::vector<std::string> res_servers;
1434 std::vector<std::string> res_domains;
1435 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001436 res_params res_params;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001437 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +08001438 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001439 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1440 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1441 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001442
1443 // Check the size of the stats and its contents.
1444 EXPECT_EQ(static_cast<size_t>(MAXNS), res_servers.size());
1445 EXPECT_EQ(static_cast<size_t>(MAXNS), res_tls_servers.size());
1446 EXPECT_EQ(static_cast<size_t>(MAXDNSRCH), res_domains.size());
1447 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_servers.begin()));
1448 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_tls_servers.begin()));
1449 EXPECT_TRUE(std::equal(domains.begin(), domains.begin() + MAXDNSRCH, res_domains.begin()));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001450}
1451
1452TEST_F(ResolverTest, ResolverStats) {
Xiao Ma09b71022018-12-11 17:56:32 +09001453 constexpr char listen_addr1[] = "127.0.0.4";
1454 constexpr char listen_addr2[] = "127.0.0.5";
1455 constexpr char listen_addr3[] = "127.0.0.6";
Mike Yu0a1c53d2018-11-26 13:26:21 +09001456
1457 // Set server 1 timeout.
Mike Yufc125e42019-05-15 20:41:28 +08001458 test::DNSResponder dns1(listen_addr1, "53", static_cast<ns_rcode>(-1));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001459 dns1.setResponseProbability(0.0);
1460 ASSERT_TRUE(dns1.startServer());
1461
1462 // Set server 2 responding server failure.
Xiao Ma09b71022018-12-11 17:56:32 +09001463 test::DNSResponder dns2(listen_addr2);
Mike Yu0a1c53d2018-11-26 13:26:21 +09001464 dns2.setResponseProbability(0.0);
1465 ASSERT_TRUE(dns2.startServer());
1466
1467 // Set server 3 workable.
Xiao Ma09b71022018-12-11 17:56:32 +09001468 test::DNSResponder dns3(listen_addr3);
1469 dns3.addMapping(kHelloExampleCom, ns_type::ns_t_a, "1.2.3.4");
Mike Yu0a1c53d2018-11-26 13:26:21 +09001470 ASSERT_TRUE(dns3.startServer());
1471
1472 std::vector<std::string> servers = {listen_addr1, listen_addr2, listen_addr3};
Xiao Ma09b71022018-12-11 17:56:32 +09001473 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001474
1475 dns3.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +09001476 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
Mike Yu0a1c53d2018-11-26 13:26:21 +09001477 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
Xiao Ma09b71022018-12-11 17:56:32 +09001478 size_t found = GetNumQueries(dns3, kHelloExampleCom);
Mike Yu0a1c53d2018-11-26 13:26:21 +09001479 EXPECT_LE(1U, found);
1480 std::string result_str = ToString(result);
1481 EXPECT_TRUE(result_str == "1.2.3.4") << ", result_str='" << result_str << "'";
1482
Mike Yue2162e52020-03-04 18:43:46 +08001483 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1484 NameserverStats(listen_addr1).setTimeouts(1),
1485 NameserverStats(listen_addr2).setErrors(1),
1486 NameserverStats(listen_addr3).setSuccesses(1),
1487 };
1488 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001489}
1490
Mike Yu15791832020-02-11 13:38:48 +08001491TEST_F(ResolverTest, AlwaysUseLatestSetupParamsInLookups) {
1492 constexpr char listen_addr1[] = "127.0.0.3";
1493 constexpr char listen_addr2[] = "255.255.255.255";
1494 constexpr char listen_addr3[] = "127.0.0.4";
1495 constexpr char hostname[] = "hello";
1496 constexpr char fqdn_with_search_domain[] = "hello.domain2.com.";
1497
1498 test::DNSResponder dns1(listen_addr1, test::kDefaultListenService, static_cast<ns_rcode>(-1));
1499 dns1.setResponseProbability(0.0);
1500 ASSERT_TRUE(dns1.startServer());
1501
1502 test::DNSResponder dns3(listen_addr3);
1503 StartDns(dns3, {{fqdn_with_search_domain, ns_type::ns_t_a, "1.2.3.4"}});
1504
1505 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
1506 parcel.tlsServers.clear();
1507 parcel.servers = {listen_addr1, listen_addr2};
1508 parcel.domains = {"domain1.com", "domain2.com"};
1509 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1510
1511 // Expect the things happening in t1:
1512 // 1. The lookup starts using the first domain for query. It sends queries to the populated
1513 // nameserver list {listen_addr1, listen_addr2} for the hostname "hello.domain1.com".
1514 // 2. A different list of nameservers is updated to the resolver. Revision ID is incremented.
1515 // 3. The query for the hostname times out. The lookup fails to add the timeout record to the
1516 // the stats because of the unmatched revision ID.
1517 // 4. The lookup starts using the second domain for query. It sends queries to the populated
1518 // nameserver list {listen_addr3, listen_addr1, listen_addr2} for another hostname
1519 // "hello.domain2.com".
1520 // 5. The lookup gets the answer and updates a success record to the stats.
1521 std::thread t1([&hostname]() {
1522 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1523 ScopedAddrinfo result = safe_getaddrinfo(hostname, nullptr, &hints);
1524 EXPECT_NE(result.get(), nullptr);
1525 EXPECT_EQ(ToString(result), "1.2.3.4");
1526 });
1527
1528 // Wait for t1 to start the step 1.
1529 while (dns1.queries().size() == 0) {
1530 usleep(1000);
1531 }
1532
1533 // Update the resolver with three nameservers. This will increment the revision ID.
1534 parcel.servers = {listen_addr3, listen_addr1, listen_addr2};
1535 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1536
1537 t1.join();
1538 EXPECT_EQ(0U, GetNumQueriesForType(dns3, ns_type::ns_t_aaaa, fqdn_with_search_domain));
1539 EXPECT_EQ(1U, GetNumQueriesForType(dns3, ns_type::ns_t_a, fqdn_with_search_domain));
1540
Mike Yue2162e52020-03-04 18:43:46 +08001541 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1542 NameserverStats(listen_addr1),
1543 NameserverStats(listen_addr2),
1544 NameserverStats(listen_addr3).setSuccesses(1),
1545 };
1546 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
Mike Yu15791832020-02-11 13:38:48 +08001547}
1548
Ken Chenb9fa2062018-11-13 21:51:13 +08001549// Test what happens if the specified TLS server is nonexistent.
1550TEST_F(ResolverTest, GetHostByName_TlsMissing) {
Xiao Ma09b71022018-12-11 17:56:32 +09001551 constexpr char listen_addr[] = "127.0.0.3";
1552 constexpr char host_name[] = "tlsmissing.example.com.";
1553
1554 test::DNSResponder dns;
1555 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.3"}});
Luke Huangf8215372019-11-22 11:53:41 +08001556 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001557
1558 // There's nothing listening on this address, so validation will either fail or
1559 /// hang. Either way, queries will continue to flow to the DNSResponder.
waynema0e73c2e2019-07-31 15:04:08 +08001560 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Ken Chenb9fa2062018-11-13 21:51:13 +08001561
1562 const hostent* result;
1563
1564 result = gethostbyname("tlsmissing");
1565 ASSERT_FALSE(result == nullptr);
1566 EXPECT_EQ("1.2.3.3", ToString(result));
1567
1568 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001569 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001570}
1571
1572// Test what happens if the specified TLS server replies with garbage.
1573TEST_F(ResolverTest, GetHostByName_TlsBroken) {
Xiao Ma09b71022018-12-11 17:56:32 +09001574 constexpr char listen_addr[] = "127.0.0.3";
1575 constexpr char host_name1[] = "tlsbroken1.example.com.";
1576 constexpr char host_name2[] = "tlsbroken2.example.com.";
1577 const std::vector<DnsRecord> records = {
1578 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1579 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1580 };
1581
1582 test::DNSResponder dns;
1583 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001584 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001585
1586 // Bind the specified private DNS socket but don't respond to any client sockets yet.
1587 int s = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, IPPROTO_TCP);
1588 ASSERT_TRUE(s >= 0);
1589 struct sockaddr_in tlsServer = {
Luke Huangf8215372019-11-22 11:53:41 +08001590 .sin_family = AF_INET,
1591 .sin_port = htons(853),
Ken Chenb9fa2062018-11-13 21:51:13 +08001592 };
1593 ASSERT_TRUE(inet_pton(AF_INET, listen_addr, &tlsServer.sin_addr));
1594 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEPORT).ok());
1595 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEADDR).ok());
1596 ASSERT_FALSE(bind(s, reinterpret_cast<struct sockaddr*>(&tlsServer), sizeof(tlsServer)));
1597 ASSERT_FALSE(listen(s, 1));
1598
1599 // Trigger TLS validation.
waynema0e73c2e2019-07-31 15:04:08 +08001600 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Ken Chenb9fa2062018-11-13 21:51:13 +08001601
1602 struct sockaddr_storage cliaddr;
1603 socklen_t sin_size = sizeof(cliaddr);
Luke Huangf8215372019-11-22 11:53:41 +08001604 int new_fd = accept4(s, reinterpret_cast<struct sockaddr*>(&cliaddr), &sin_size, SOCK_CLOEXEC);
Ken Chenb9fa2062018-11-13 21:51:13 +08001605 ASSERT_TRUE(new_fd > 0);
1606
1607 // We've received the new file descriptor but not written to it or closed, so the
1608 // validation is still pending. Queries should still flow correctly because the
1609 // server is not used until validation succeeds.
1610 const hostent* result;
1611 result = gethostbyname("tlsbroken1");
1612 ASSERT_FALSE(result == nullptr);
1613 EXPECT_EQ("1.2.3.1", ToString(result));
1614
1615 // Now we cause the validation to fail.
1616 std::string garbage = "definitely not a valid TLS ServerHello";
1617 write(new_fd, garbage.data(), garbage.size());
1618 close(new_fd);
1619
1620 // Validation failure shouldn't interfere with lookups, because lookups won't be sent
1621 // to the TLS server unless validation succeeds.
1622 result = gethostbyname("tlsbroken2");
1623 ASSERT_FALSE(result == nullptr);
1624 EXPECT_EQ("1.2.3.2", ToString(result));
1625
1626 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001627 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001628 close(s);
1629}
1630
1631TEST_F(ResolverTest, GetHostByName_Tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001632 constexpr char listen_addr[] = "127.0.0.3";
1633 constexpr char listen_udp[] = "53";
1634 constexpr char listen_tls[] = "853";
1635 constexpr char host_name1[] = "tls1.example.com.";
1636 constexpr char host_name2[] = "tls2.example.com.";
1637 constexpr char host_name3[] = "tls3.example.com.";
1638 const std::vector<DnsRecord> records = {
1639 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1640 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1641 {host_name3, ns_type::ns_t_a, "1.2.3.3"},
1642 };
1643
1644 test::DNSResponder dns;
1645 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001646 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001647
1648 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1649 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001650 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08001651 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001652
Mike Yu724f77d2019-08-16 11:14:50 +08001653 const hostent* result = gethostbyname("tls1");
Ken Chenb9fa2062018-11-13 21:51:13 +08001654 ASSERT_FALSE(result == nullptr);
1655 EXPECT_EQ("1.2.3.1", ToString(result));
1656
1657 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001658 EXPECT_TRUE(tls.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001659
1660 // Stop the TLS server. Since we're in opportunistic mode, queries will
1661 // fall back to the locally-assigned (clear text) nameservers.
1662 tls.stopServer();
1663
1664 dns.clearQueries();
1665 result = gethostbyname("tls2");
1666 EXPECT_FALSE(result == nullptr);
1667 EXPECT_EQ("1.2.3.2", ToString(result));
1668 const auto queries = dns.queries();
1669 EXPECT_EQ(1U, queries.size());
waynema29253052019-08-20 11:26:08 +08001670 EXPECT_EQ("tls2.example.com.", queries[0].name);
1671 EXPECT_EQ(ns_t_a, queries[0].type);
Ken Chenb9fa2062018-11-13 21:51:13 +08001672
1673 // Reset the resolvers without enabling TLS. Queries should still be routed
1674 // to the UDP endpoint.
Xiao Ma09b71022018-12-11 17:56:32 +09001675 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001676
1677 result = gethostbyname("tls3");
1678 ASSERT_FALSE(result == nullptr);
1679 EXPECT_EQ("1.2.3.3", ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +08001680}
1681
Ken Chenb9fa2062018-11-13 21:51:13 +08001682TEST_F(ResolverTest, GetHostByName_TlsFailover) {
Xiao Ma09b71022018-12-11 17:56:32 +09001683 constexpr char listen_addr1[] = "127.0.0.3";
1684 constexpr char listen_addr2[] = "127.0.0.4";
1685 constexpr char listen_udp[] = "53";
1686 constexpr char listen_tls[] = "853";
1687 constexpr char host_name1[] = "tlsfailover1.example.com.";
1688 constexpr char host_name2[] = "tlsfailover2.example.com.";
1689 const std::vector<DnsRecord> records1 = {
1690 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1691 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1692 };
1693 const std::vector<DnsRecord> records2 = {
1694 {host_name1, ns_type::ns_t_a, "1.2.3.3"},
1695 {host_name2, ns_type::ns_t_a, "1.2.3.4"},
1696 };
1697
1698 test::DNSResponder dns1(listen_addr1);
1699 test::DNSResponder dns2(listen_addr2);
1700 StartDns(dns1, records1);
1701 StartDns(dns2, records2);
1702
Luke Huangf8215372019-11-22 11:53:41 +08001703 std::vector<std::string> servers = {listen_addr1, listen_addr2};
Ken Chenb9fa2062018-11-13 21:51:13 +08001704
1705 test::DnsTlsFrontend tls1(listen_addr1, listen_tls, listen_addr1, listen_udp);
1706 test::DnsTlsFrontend tls2(listen_addr2, listen_tls, listen_addr2, listen_udp);
1707 ASSERT_TRUE(tls1.startServer());
1708 ASSERT_TRUE(tls2.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001709 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1710 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08001711 EXPECT_TRUE(WaitForPrivateDnsValidation(tls1.listen_address(), true));
1712 EXPECT_TRUE(WaitForPrivateDnsValidation(tls2.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001713
Mike Yu724f77d2019-08-16 11:14:50 +08001714 const hostent* result = gethostbyname("tlsfailover1");
Ken Chenb9fa2062018-11-13 21:51:13 +08001715 ASSERT_FALSE(result == nullptr);
1716 EXPECT_EQ("1.2.3.1", ToString(result));
1717
1718 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001719 EXPECT_TRUE(tls1.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001720 // No new queries should have reached tls2.
Luke Huang0a0870d2020-02-12 20:41:10 +08001721 EXPECT_TRUE(tls2.waitForQueries(1));
Ken Chenb9fa2062018-11-13 21:51:13 +08001722
1723 // Stop tls1. Subsequent queries should attempt to reach tls1, fail, and retry to tls2.
1724 tls1.stopServer();
1725
1726 result = gethostbyname("tlsfailover2");
1727 EXPECT_EQ("1.2.3.4", ToString(result));
1728
1729 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001730 EXPECT_TRUE(tls2.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001731
1732 // No additional queries should have reached the insecure servers.
1733 EXPECT_EQ(2U, dns1.queries().size());
1734 EXPECT_EQ(2U, dns2.queries().size());
1735
1736 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001737 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Ken Chenb9fa2062018-11-13 21:51:13 +08001738}
1739
1740TEST_F(ResolverTest, GetHostByName_BadTlsName) {
Xiao Ma09b71022018-12-11 17:56:32 +09001741 constexpr char listen_addr[] = "127.0.0.3";
1742 constexpr char listen_udp[] = "53";
1743 constexpr char listen_tls[] = "853";
1744 constexpr char host_name[] = "badtlsname.example.com.";
1745
1746 test::DNSResponder dns;
1747 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.1"}});
Luke Huangf8215372019-11-22 11:53:41 +08001748 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001749
1750 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1751 ASSERT_TRUE(tls.startServer());
Xiao Ma09b71022018-12-11 17:56:32 +09001752 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
waynema0e73c2e2019-07-31 15:04:08 +08001753 kDefaultIncorrectPrivateDnsHostName));
Ken Chenb9fa2062018-11-13 21:51:13 +08001754
waynema0e73c2e2019-07-31 15:04:08 +08001755 // The TLS handshake would fail because the name of TLS server doesn't
1756 // match with TLS server's certificate.
Mike Yu724f77d2019-08-16 11:14:50 +08001757 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), false));
Ken Chenb9fa2062018-11-13 21:51:13 +08001758
1759 // The query should fail hard, because a name was specified.
1760 EXPECT_EQ(nullptr, gethostbyname("badtlsname"));
1761
1762 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001763 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001764}
1765
1766TEST_F(ResolverTest, GetAddrInfo_Tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001767 constexpr char listen_addr[] = "127.0.0.3";
1768 constexpr char listen_udp[] = "53";
1769 constexpr char listen_tls[] = "853";
1770 constexpr char host_name[] = "addrinfotls.example.com.";
1771 const std::vector<DnsRecord> records = {
1772 {host_name, ns_type::ns_t_a, "1.2.3.4"},
1773 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
1774 };
1775
1776 test::DNSResponder dns;
1777 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001778 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001779
1780 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1781 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001782 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1783 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08001784 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001785
1786 dns.clearQueries();
1787 ScopedAddrinfo result = safe_getaddrinfo("addrinfotls", nullptr, nullptr);
1788 EXPECT_TRUE(result != nullptr);
1789 size_t found = GetNumQueries(dns, host_name);
1790 EXPECT_LE(1U, found);
1791 // Could be A or AAAA
1792 std::string result_str = ToString(result);
1793 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +08001794 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08001795 // Wait for both A and AAAA queries to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001796 EXPECT_TRUE(tls.waitForQueries(3));
Ken Chenb9fa2062018-11-13 21:51:13 +08001797
1798 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001799 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001800}
1801
1802TEST_F(ResolverTest, TlsBypass) {
1803 const char OFF[] = "off";
1804 const char OPPORTUNISTIC[] = "opportunistic";
1805 const char STRICT[] = "strict";
1806
1807 const char GETHOSTBYNAME[] = "gethostbyname";
1808 const char GETADDRINFO[] = "getaddrinfo";
1809 const char GETADDRINFOFORNET[] = "getaddrinfofornet";
1810
1811 const unsigned BYPASS_NETID = NETID_USE_LOCAL_NAMESERVERS | TEST_NETID;
1812
Ken Chenb9fa2062018-11-13 21:51:13 +08001813 const char ADDR4[] = "192.0.2.1";
1814 const char ADDR6[] = "2001:db8::1";
1815
1816 const char cleartext_addr[] = "127.0.0.53";
1817 const char cleartext_port[] = "53";
1818 const char tls_port[] = "853";
Luke Huangf8215372019-11-22 11:53:41 +08001819 const std::vector<std::string> servers = {cleartext_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001820
Xiao Ma09b71022018-12-11 17:56:32 +09001821 test::DNSResponder dns(cleartext_addr);
Ken Chenb9fa2062018-11-13 21:51:13 +08001822 ASSERT_TRUE(dns.startServer());
1823
1824 test::DnsTlsFrontend tls(cleartext_addr, tls_port, cleartext_addr, cleartext_port);
Mike Yudd4ac2d2019-05-31 16:52:11 +08001825 ASSERT_TRUE(tls.startServer());
Ken Chenb9fa2062018-11-13 21:51:13 +08001826
Luke Huangf8215372019-11-22 11:53:41 +08001827 // clang-format off
Ken Chenb9fa2062018-11-13 21:51:13 +08001828 struct TestConfig {
1829 const std::string mode;
1830 const bool withWorkingTLS;
1831 const std::string method;
1832
1833 std::string asHostName() const {
Luke Huangf8215372019-11-22 11:53:41 +08001834 return StringPrintf("%s.%s.%s.", mode.c_str(), withWorkingTLS ? "tlsOn" : "tlsOff",
Ken Chenb9fa2062018-11-13 21:51:13 +08001835 method.c_str());
1836 }
1837 } testConfigs[]{
Ken Chenb9fa2062018-11-13 21:51:13 +08001838 {OFF, true, GETHOSTBYNAME},
1839 {OPPORTUNISTIC, true, GETHOSTBYNAME},
1840 {STRICT, true, GETHOSTBYNAME},
Ken Chenb9fa2062018-11-13 21:51:13 +08001841 {OFF, true, GETADDRINFO},
1842 {OPPORTUNISTIC, true, GETADDRINFO},
1843 {STRICT, true, GETADDRINFO},
Ken Chenb9fa2062018-11-13 21:51:13 +08001844 {OFF, true, GETADDRINFOFORNET},
1845 {OPPORTUNISTIC, true, GETADDRINFOFORNET},
1846 {STRICT, true, GETADDRINFOFORNET},
Mike Yudd4ac2d2019-05-31 16:52:11 +08001847 {OFF, false, GETHOSTBYNAME},
1848 {OPPORTUNISTIC, false, GETHOSTBYNAME},
1849 {STRICT, false, GETHOSTBYNAME},
1850 {OFF, false, GETADDRINFO},
1851 {OPPORTUNISTIC, false, GETADDRINFO},
1852 {STRICT, false, GETADDRINFO},
1853 {OFF, false, GETADDRINFOFORNET},
1854 {OPPORTUNISTIC, false, GETADDRINFOFORNET},
1855 {STRICT, false, GETADDRINFOFORNET},
Ken Chenb9fa2062018-11-13 21:51:13 +08001856 };
Luke Huangf8215372019-11-22 11:53:41 +08001857 // clang-format on
Ken Chenb9fa2062018-11-13 21:51:13 +08001858
1859 for (const auto& config : testConfigs) {
1860 const std::string testHostName = config.asHostName();
1861 SCOPED_TRACE(testHostName);
1862
1863 // Don't tempt test bugs due to caching.
1864 const char* host_name = testHostName.c_str();
1865 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
1866 dns.addMapping(host_name, ns_type::ns_t_aaaa, ADDR6);
1867
Mike Yudd4ac2d2019-05-31 16:52:11 +08001868 if (config.withWorkingTLS) {
1869 if (!tls.running()) {
1870 ASSERT_TRUE(tls.startServer());
1871 }
1872 } else {
1873 if (tls.running()) {
1874 ASSERT_TRUE(tls.stopServer());
1875 }
1876 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001877
1878 if (config.mode == OFF) {
Xiao Ma09b71022018-12-11 17:56:32 +09001879 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, kDefaultSearchDomains,
1880 kDefaultParams));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001881 } else /* OPPORTUNISTIC or STRICT */ {
1882 const char* tls_hostname = (config.mode == STRICT) ? kDefaultPrivateDnsHostName : "";
Xiao Ma09b71022018-12-11 17:56:32 +09001883 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001884 kDefaultParams, tls_hostname));
Mike Yu724f77d2019-08-16 11:14:50 +08001885
1886 // Wait for the validation event. If the server is running, the validation should
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001887 // succeed; otherwise, the validation should fail.
Mike Yu724f77d2019-08-16 11:14:50 +08001888 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), config.withWorkingTLS));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001889 if (config.withWorkingTLS) {
1890 EXPECT_TRUE(tls.waitForQueries(1));
1891 tls.clearQueries();
1892 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001893 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001894
1895 const hostent* h_result = nullptr;
1896 ScopedAddrinfo ai_result;
1897
1898 if (config.method == GETHOSTBYNAME) {
1899 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
1900 h_result = gethostbyname(host_name);
1901
1902 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
1903 ASSERT_FALSE(h_result == nullptr);
1904 ASSERT_EQ(4, h_result->h_length);
1905 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
1906 EXPECT_EQ(ADDR4, ToString(h_result));
1907 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
1908 } else if (config.method == GETADDRINFO) {
1909 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
1910 ai_result = safe_getaddrinfo(host_name, nullptr, nullptr);
1911 EXPECT_TRUE(ai_result != nullptr);
1912
1913 EXPECT_LE(1U, GetNumQueries(dns, host_name));
1914 // Could be A or AAAA
1915 const std::string result_str = ToString(ai_result);
1916 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
Luke Huangf8215372019-11-22 11:53:41 +08001917 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08001918 } else if (config.method == GETADDRINFOFORNET) {
1919 addrinfo* raw_ai_result = nullptr;
1920 EXPECT_EQ(0, android_getaddrinfofornet(host_name, /*servname=*/nullptr,
1921 /*hints=*/nullptr, BYPASS_NETID, MARK_UNSET,
1922 &raw_ai_result));
1923 ai_result.reset(raw_ai_result);
1924
1925 EXPECT_LE(1U, GetNumQueries(dns, host_name));
1926 // Could be A or AAAA
1927 const std::string result_str = ToString(ai_result);
1928 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
Luke Huangf8215372019-11-22 11:53:41 +08001929 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08001930 }
1931
Mike Yudd4ac2d2019-05-31 16:52:11 +08001932 EXPECT_EQ(0, tls.queries());
Ken Chenb9fa2062018-11-13 21:51:13 +08001933
1934 // Clear per-process resolv netid.
1935 ASSERT_EQ(0, setNetworkForResolv(NETID_UNSET));
Ken Chenb9fa2062018-11-13 21:51:13 +08001936 dns.clearQueries();
1937 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001938}
1939
1940TEST_F(ResolverTest, StrictMode_NoTlsServers) {
Xiao Ma09b71022018-12-11 17:56:32 +09001941 constexpr char cleartext_addr[] = "127.0.0.53";
Luke Huangf8215372019-11-22 11:53:41 +08001942 const std::vector<std::string> servers = {cleartext_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09001943 constexpr char host_name[] = "strictmode.notlsips.example.com.";
1944 const std::vector<DnsRecord> records = {
1945 {host_name, ns_type::ns_t_a, "1.2.3.4"},
1946 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
1947 };
Ken Chenb9fa2062018-11-13 21:51:13 +08001948
Xiao Ma09b71022018-12-11 17:56:32 +09001949 test::DNSResponder dns(cleartext_addr);
1950 StartDns(dns, records);
Ken Chenb9fa2062018-11-13 21:51:13 +08001951
waynema0e73c2e2019-07-31 15:04:08 +08001952 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1953 kDefaultIncorrectPrivateDnsHostName));
Ken Chenb9fa2062018-11-13 21:51:13 +08001954
1955 addrinfo* ai_result = nullptr;
1956 EXPECT_NE(0, getaddrinfo(host_name, nullptr, nullptr, &ai_result));
1957 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
1958}
Luke Huang94b10b92018-11-21 20:13:38 +08001959
1960namespace {
1961
Luke Huang70931aa2019-01-31 11:57:41 +08001962int getAsyncResponse(int fd, int* rcode, uint8_t* buf, int bufLen) {
Luke Huang94b10b92018-11-21 20:13:38 +08001963 struct pollfd wait_fd[1];
1964 wait_fd[0].fd = fd;
1965 wait_fd[0].events = POLLIN;
1966 short revents;
1967 int ret;
1968
1969 ret = poll(wait_fd, 1, -1);
1970 revents = wait_fd[0].revents;
1971 if (revents & POLLIN) {
1972 int n = resNetworkResult(fd, rcode, buf, bufLen);
Luke Huangba7bef92018-12-26 16:53:03 +08001973 // Verify that resNetworkResult() closed the fd
1974 char dummy;
1975 EXPECT_EQ(-1, read(fd, &dummy, sizeof dummy));
1976 EXPECT_EQ(EBADF, errno);
Luke Huang94b10b92018-11-21 20:13:38 +08001977 return n;
1978 }
1979 return -1;
1980}
1981
Luke Huang70931aa2019-01-31 11:57:41 +08001982std::string toString(uint8_t* buf, int bufLen, int ipType) {
Luke Huang94b10b92018-11-21 20:13:38 +08001983 ns_msg handle;
1984 int ancount, n = 0;
1985 ns_rr rr;
1986
Luke Huangf8215372019-11-22 11:53:41 +08001987 if (ns_initparse((const uint8_t*)buf, bufLen, &handle) >= 0) {
Luke Huang94b10b92018-11-21 20:13:38 +08001988 ancount = ns_msg_count(handle, ns_s_an);
1989 if (ns_parserr(&handle, ns_s_an, n, &rr) == 0) {
Luke Huang70931aa2019-01-31 11:57:41 +08001990 const uint8_t* rdata = ns_rr_rdata(rr);
Luke Huang94b10b92018-11-21 20:13:38 +08001991 char buffer[INET6_ADDRSTRLEN];
Luke Huangf8215372019-11-22 11:53:41 +08001992 if (inet_ntop(ipType, (const char*)rdata, buffer, sizeof(buffer))) {
Luke Huang94b10b92018-11-21 20:13:38 +08001993 return buffer;
1994 }
1995 }
1996 }
1997 return "";
1998}
1999
2000int dns_open_proxy() {
2001 int s = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
2002 if (s == -1) {
2003 return -1;
2004 }
2005 const int one = 1;
2006 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
2007
2008 static const struct sockaddr_un proxy_addr = {
2009 .sun_family = AF_UNIX,
2010 .sun_path = "/dev/socket/dnsproxyd",
2011 };
2012
Luke Huangf8215372019-11-22 11:53:41 +08002013 if (TEMP_FAILURE_RETRY(connect(s, (const struct sockaddr*)&proxy_addr, sizeof(proxy_addr))) !=
Luke Huang94b10b92018-11-21 20:13:38 +08002014 0) {
2015 close(s);
2016 return -1;
2017 }
2018
2019 return s;
2020}
2021
Luke Huangba7bef92018-12-26 16:53:03 +08002022void expectAnswersValid(int fd, int ipType, const std::string& expectedAnswer) {
2023 int rcode = -1;
2024 uint8_t buf[MAXPACKET] = {};
2025
2026 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2027 EXPECT_GT(res, 0);
2028 EXPECT_EQ(expectedAnswer, toString(buf, res, ipType));
2029}
2030
2031void expectAnswersNotValid(int fd, int expectedErrno) {
2032 int rcode = -1;
2033 uint8_t buf[MAXPACKET] = {};
2034
2035 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2036 EXPECT_EQ(expectedErrno, res);
2037}
2038
Luke Huang94b10b92018-11-21 20:13:38 +08002039} // namespace
2040
2041TEST_F(ResolverTest, Async_NormalQueryV4V6) {
Xiao Ma09b71022018-12-11 17:56:32 +09002042 constexpr char listen_addr[] = "127.0.0.4";
2043 constexpr char host_name[] = "howdy.example.com.";
2044 const std::vector<DnsRecord> records = {
2045 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2046 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2047 };
2048
2049 test::DNSResponder dns(listen_addr);
2050 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002051 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002052 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002053
Luke Huangba7bef92018-12-26 16:53:03 +08002054 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2055 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002056 EXPECT_TRUE(fd1 != -1);
2057 EXPECT_TRUE(fd2 != -1);
2058
Luke Huang70931aa2019-01-31 11:57:41 +08002059 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002060 int rcode;
2061 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2062 EXPECT_GT(res, 0);
2063 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
2064
2065 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2066 EXPECT_GT(res, 0);
2067 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2068
2069 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
2070
2071 // Re-query verify cache works
Luke Huangba7bef92018-12-26 16:53:03 +08002072 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2073 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002074
2075 EXPECT_TRUE(fd1 != -1);
2076 EXPECT_TRUE(fd2 != -1);
2077
2078 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2079 EXPECT_GT(res, 0);
2080 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
2081
2082 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2083 EXPECT_GT(res, 0);
2084 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2085
2086 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
2087}
2088
2089TEST_F(ResolverTest, Async_BadQuery) {
Xiao Ma09b71022018-12-11 17:56:32 +09002090 constexpr char listen_addr[] = "127.0.0.4";
2091 constexpr char host_name[] = "howdy.example.com.";
2092 const std::vector<DnsRecord> records = {
2093 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2094 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2095 };
2096
2097 test::DNSResponder dns(listen_addr);
2098 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002099 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002100 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002101
2102 static struct {
2103 int fd;
2104 const char* dname;
2105 const int queryType;
2106 const int expectRcode;
2107 } kTestData[] = {
Luke Huangba7bef92018-12-26 16:53:03 +08002108 {-1, "", ns_t_aaaa, 0},
2109 {-1, "as65ass46", ns_t_aaaa, 0},
2110 {-1, "454564564564", ns_t_aaaa, 0},
2111 {-1, "h645235", ns_t_a, 0},
2112 {-1, "www.google.com", ns_t_a, 0},
Luke Huang94b10b92018-11-21 20:13:38 +08002113 };
2114
2115 for (auto& td : kTestData) {
2116 SCOPED_TRACE(td.dname);
Luke Huangba7bef92018-12-26 16:53:03 +08002117 td.fd = resNetworkQuery(TEST_NETID, td.dname, ns_c_in, td.queryType, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002118 EXPECT_TRUE(td.fd != -1);
2119 }
2120
2121 // dns_responder return empty resp(packet only contains query part) with no error currently
2122 for (const auto& td : kTestData) {
Luke Huang70931aa2019-01-31 11:57:41 +08002123 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002124 int rcode;
2125 SCOPED_TRACE(td.dname);
2126 int res = getAsyncResponse(td.fd, &rcode, buf, MAXPACKET);
2127 EXPECT_GT(res, 0);
2128 EXPECT_EQ(rcode, td.expectRcode);
2129 }
2130}
2131
2132TEST_F(ResolverTest, Async_EmptyAnswer) {
Xiao Ma09b71022018-12-11 17:56:32 +09002133 constexpr char listen_addr[] = "127.0.0.4";
2134 constexpr char host_name[] = "howdy.example.com.";
2135 const std::vector<DnsRecord> records = {
2136 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2137 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2138 };
2139
2140 test::DNSResponder dns(listen_addr);
2141 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002142 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002143 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002144
Luke Huang9c264bb2018-12-18 16:44:41 +08002145 // TODO: Disable retry to make this test explicit.
2146 auto& cv = dns.getCv();
2147 auto& cvMutex = dns.getCvMutex();
2148 int fd1;
2149 // Wait on the condition variable to ensure that the DNS server has handled our first query.
2150 {
2151 std::unique_lock lk(cvMutex);
Luke Huangba7bef92018-12-26 16:53:03 +08002152 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang9c264bb2018-12-18 16:44:41 +08002153 EXPECT_TRUE(fd1 != -1);
2154 EXPECT_EQ(std::cv_status::no_timeout, cv.wait_for(lk, std::chrono::seconds(1)));
2155 }
Luke Huang94b10b92018-11-21 20:13:38 +08002156
Luke Huang94b10b92018-11-21 20:13:38 +08002157 dns.setResponseProbability(0.0);
Luke Huang94b10b92018-11-21 20:13:38 +08002158
Luke Huangba7bef92018-12-26 16:53:03 +08002159 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002160 EXPECT_TRUE(fd2 != -1);
2161
Luke Huangba7bef92018-12-26 16:53:03 +08002162 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002163 EXPECT_TRUE(fd3 != -1);
2164
Luke Huang9c264bb2018-12-18 16:44:41 +08002165 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002166 int rcode;
2167
Luke Huang9c264bb2018-12-18 16:44:41 +08002168 // expect no response
2169 int res = getAsyncResponse(fd3, &rcode, buf, MAXPACKET);
2170 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huang94b10b92018-11-21 20:13:38 +08002171
Luke Huang9c264bb2018-12-18 16:44:41 +08002172 // expect no response
Luke Huang94b10b92018-11-21 20:13:38 +08002173 memset(buf, 0, MAXPACKET);
Luke Huang9c264bb2018-12-18 16:44:41 +08002174 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2175 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huang94b10b92018-11-21 20:13:38 +08002176
Luke Huang94b10b92018-11-21 20:13:38 +08002177 dns.setResponseProbability(1.0);
Luke Huang94b10b92018-11-21 20:13:38 +08002178
Luke Huangba7bef92018-12-26 16:53:03 +08002179 int fd4 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002180 EXPECT_TRUE(fd4 != -1);
2181
2182 memset(buf, 0, MAXPACKET);
2183 res = getAsyncResponse(fd4, &rcode, buf, MAXPACKET);
2184 EXPECT_GT(res, 0);
2185 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2186
2187 memset(buf, 0, MAXPACKET);
2188 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2189 EXPECT_GT(res, 0);
2190 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
Mike Yu532405f2020-06-17 17:46:44 +08002191
2192 // Trailing dot is removed. Is it intended?
2193 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, 0, "howdy.example.com", {"::1.2.3.4"});
2194 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2195 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2196 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, 0, "howdy.example.com", {"1.2.3.4"});
Luke Huang94b10b92018-11-21 20:13:38 +08002197}
2198
2199TEST_F(ResolverTest, Async_MalformedQuery) {
Xiao Ma09b71022018-12-11 17:56:32 +09002200 constexpr char listen_addr[] = "127.0.0.4";
2201 constexpr char host_name[] = "howdy.example.com.";
2202 const std::vector<DnsRecord> records = {
2203 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2204 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2205 };
2206
2207 test::DNSResponder dns(listen_addr);
2208 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002209 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002210 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002211
2212 int fd = dns_open_proxy();
2213 EXPECT_TRUE(fd > 0);
2214
2215 const std::string badMsg = "16-52512#";
Xiao Ma09b71022018-12-11 17:56:32 +09002216 static const struct {
Luke Huang94b10b92018-11-21 20:13:38 +08002217 const std::string cmd;
2218 const int expectErr;
2219 } kTestData[] = {
Luke Huangba7bef92018-12-26 16:53:03 +08002220 // Too few arguments
Luke Huang94b10b92018-11-21 20:13:38 +08002221 {"resnsend " + badMsg + '\0', -EINVAL},
2222 // Bad netId
Luke Huangba7bef92018-12-26 16:53:03 +08002223 {"resnsend badnetId 0 " + badMsg + '\0', -EINVAL},
Luke Huang94b10b92018-11-21 20:13:38 +08002224 // Bad raw data
Luke Huangba7bef92018-12-26 16:53:03 +08002225 {"resnsend " + std::to_string(TEST_NETID) + " 0 " + badMsg + '\0', -EILSEQ},
Luke Huang94b10b92018-11-21 20:13:38 +08002226 };
2227
2228 for (unsigned int i = 0; i < std::size(kTestData); i++) {
2229 auto& td = kTestData[i];
2230 SCOPED_TRACE(td.cmd);
2231 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, td.cmd.c_str(), td.cmd.size()));
2232 EXPECT_EQ(rc, static_cast<ssize_t>(td.cmd.size()));
2233
2234 int32_t tmp;
2235 rc = TEMP_FAILURE_RETRY(read(fd, &tmp, sizeof(tmp)));
2236 EXPECT_TRUE(rc > 0);
2237 EXPECT_EQ(static_cast<int>(ntohl(tmp)), td.expectErr);
2238 }
2239 // Normal query with answer buffer
2240 // This is raw data of query "howdy.example.com" type 1 class 1
2241 std::string query = "81sBAAABAAAAAAAABWhvd2R5B2V4YW1wbGUDY29tAAABAAE=";
Luke Huangba7bef92018-12-26 16:53:03 +08002242 std::string cmd = "resnsend " + std::to_string(TEST_NETID) + " 0 " + query + '\0';
Luke Huang94b10b92018-11-21 20:13:38 +08002243 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
2244 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
2245
Luke Huang70931aa2019-01-31 11:57:41 +08002246 uint8_t smallBuf[1] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002247 int rcode;
2248 rc = getAsyncResponse(fd, &rcode, smallBuf, 1);
Luke Huangba7bef92018-12-26 16:53:03 +08002249 EXPECT_EQ(-EMSGSIZE, rc);
Luke Huang94b10b92018-11-21 20:13:38 +08002250
2251 // Do the normal test with large buffer again
2252 fd = dns_open_proxy();
2253 EXPECT_TRUE(fd > 0);
2254 rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
2255 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
Luke Huang70931aa2019-01-31 11:57:41 +08002256 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002257 rc = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2258 EXPECT_EQ("1.2.3.4", toString(buf, rc, AF_INET));
Mike Yu4f3747b2018-12-02 17:54:29 +09002259}
2260
Luke Huangba7bef92018-12-26 16:53:03 +08002261TEST_F(ResolverTest, Async_CacheFlags) {
Xiao Ma09b71022018-12-11 17:56:32 +09002262 constexpr char listen_addr[] = "127.0.0.4";
Luke Huang4eabbe32020-05-28 03:17:32 +08002263 constexpr char host_name1[] = "howdy.example.com.";
2264 constexpr char host_name2[] = "howdy.example2.com.";
2265 constexpr char host_name3[] = "howdy.example3.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002266 const std::vector<DnsRecord> records = {
Luke Huang4eabbe32020-05-28 03:17:32 +08002267 {host_name1, ns_type::ns_t_a, "1.2.3.4"}, {host_name1, ns_type::ns_t_aaaa, "::1.2.3.4"},
2268 {host_name2, ns_type::ns_t_a, "1.2.3.5"}, {host_name2, ns_type::ns_t_aaaa, "::1.2.3.5"},
2269 {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 +09002270 };
2271
2272 test::DNSResponder dns(listen_addr);
2273 StartDns(dns, records);
Luke Huangba7bef92018-12-26 16:53:03 +08002274 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002275 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huangba7bef92018-12-26 16:53:03 +08002276
2277 // ANDROID_RESOLV_NO_CACHE_STORE
2278 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2279 ANDROID_RESOLV_NO_CACHE_STORE);
2280 EXPECT_TRUE(fd1 != -1);
2281 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2282 ANDROID_RESOLV_NO_CACHE_STORE);
2283 EXPECT_TRUE(fd2 != -1);
2284 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2285 ANDROID_RESOLV_NO_CACHE_STORE);
2286 EXPECT_TRUE(fd3 != -1);
2287
2288 expectAnswersValid(fd3, AF_INET, "1.2.3.4");
2289 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
2290 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2291
2292 // No cache exists, expect 3 queries
Luke Huang4eabbe32020-05-28 03:17:32 +08002293 EXPECT_EQ(3U, GetNumQueries(dns, host_name1));
Luke Huangba7bef92018-12-26 16:53:03 +08002294
Luke Huang4eabbe32020-05-28 03:17:32 +08002295 // Raise a query with no flags to ensure no cache exists. Also make an cache entry for the
2296 // query.
Luke Huangba7bef92018-12-26 16:53:03 +08002297 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2298
2299 EXPECT_TRUE(fd1 != -1);
2300
2301 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2302
Luke Huang4eabbe32020-05-28 03:17:32 +08002303 // Expect 4 queries because there should be no cache before this query.
2304 EXPECT_EQ(4U, GetNumQueries(dns, host_name1));
2305
2306 // Now we have the cache entry, re-query with ANDROID_RESOLV_NO_CACHE_STORE to ensure
2307 // that ANDROID_RESOLV_NO_CACHE_STORE implied ANDROID_RESOLV_NO_CACHE_LOOKUP.
2308 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2309 ANDROID_RESOLV_NO_CACHE_STORE);
2310 EXPECT_TRUE(fd1 != -1);
2311 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2312 // Expect 5 queries because we shouldn't do cache lookup for the query which has
2313 // ANDROID_RESOLV_NO_CACHE_STORE.
2314 EXPECT_EQ(5U, GetNumQueries(dns, host_name1));
Luke Huangba7bef92018-12-26 16:53:03 +08002315
2316 // ANDROID_RESOLV_NO_CACHE_LOOKUP
2317 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2318 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2319 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2320 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2321
2322 EXPECT_TRUE(fd1 != -1);
2323 EXPECT_TRUE(fd2 != -1);
2324
2325 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
2326 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2327
Luke Huang4eabbe32020-05-28 03:17:32 +08002328 // Cache was skipped, expect 2 more queries.
2329 EXPECT_EQ(7U, GetNumQueries(dns, host_name1));
Luke Huangba7bef92018-12-26 16:53:03 +08002330
2331 // Re-query verify cache works
Luke Huang4eabbe32020-05-28 03:17:32 +08002332 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huangba7bef92018-12-26 16:53:03 +08002333 EXPECT_TRUE(fd1 != -1);
2334 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2335
Luke Huang4eabbe32020-05-28 03:17:32 +08002336 // Cache hits, expect still 7 queries
2337 EXPECT_EQ(7U, GetNumQueries(dns, host_name1));
Luke Huanga1d74182019-03-19 17:30:36 +08002338
2339 // Start to verify if ANDROID_RESOLV_NO_CACHE_LOOKUP does write response into cache
2340 dns.clearQueries();
2341
Luke Huang4eabbe32020-05-28 03:17:32 +08002342 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa,
Luke Huanga1d74182019-03-19 17:30:36 +08002343 ANDROID_RESOLV_NO_CACHE_LOOKUP);
Luke Huang4eabbe32020-05-28 03:17:32 +08002344 fd2 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa,
Luke Huanga1d74182019-03-19 17:30:36 +08002345 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2346
2347 EXPECT_TRUE(fd1 != -1);
2348 EXPECT_TRUE(fd2 != -1);
2349
Luke Huang4eabbe32020-05-28 03:17:32 +08002350 expectAnswersValid(fd2, AF_INET6, "::1.2.3.5");
2351 expectAnswersValid(fd1, AF_INET6, "::1.2.3.5");
Luke Huanga1d74182019-03-19 17:30:36 +08002352
2353 // Skip cache, expect 2 queries
Luke Huang4eabbe32020-05-28 03:17:32 +08002354 EXPECT_EQ(2U, GetNumQueries(dns, host_name2));
Luke Huanga1d74182019-03-19 17:30:36 +08002355
2356 // Re-query without flags
Luke Huang4eabbe32020-05-28 03:17:32 +08002357 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa, 0);
2358 fd2 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa, 0);
Luke Huanga1d74182019-03-19 17:30:36 +08002359
2360 EXPECT_TRUE(fd1 != -1);
2361 EXPECT_TRUE(fd2 != -1);
2362
Luke Huang4eabbe32020-05-28 03:17:32 +08002363 expectAnswersValid(fd2, AF_INET6, "::1.2.3.5");
2364 expectAnswersValid(fd1, AF_INET6, "::1.2.3.5");
Luke Huanga1d74182019-03-19 17:30:36 +08002365
2366 // Cache hits, expect still 2 queries
Luke Huang4eabbe32020-05-28 03:17:32 +08002367 EXPECT_EQ(2U, GetNumQueries(dns, host_name2));
Luke Huang40f5f492019-05-09 19:37:35 +08002368
2369 // Test both ANDROID_RESOLV_NO_CACHE_STORE and ANDROID_RESOLV_NO_CACHE_LOOKUP are set
2370 dns.clearQueries();
2371
Luke Huang4eabbe32020-05-28 03:17:32 +08002372 // Make sure that the cache of "howdy.example3.com" exists.
2373 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang40f5f492019-05-09 19:37:35 +08002374 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002375 expectAnswersValid(fd1, AF_INET6, "::1.2.3.6");
2376 EXPECT_EQ(1U, GetNumQueries(dns, host_name3));
Luke Huang40f5f492019-05-09 19:37:35 +08002377
2378 // Re-query with testFlags
2379 const int testFlag = ANDROID_RESOLV_NO_CACHE_STORE | ANDROID_RESOLV_NO_CACHE_LOOKUP;
Luke Huang4eabbe32020-05-28 03:17:32 +08002380 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_aaaa, testFlag);
Luke Huang40f5f492019-05-09 19:37:35 +08002381 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002382 expectAnswersValid(fd1, AF_INET6, "::1.2.3.6");
Luke Huang40f5f492019-05-09 19:37:35 +08002383 // Expect cache lookup is skipped.
Luke Huang4eabbe32020-05-28 03:17:32 +08002384 EXPECT_EQ(2U, GetNumQueries(dns, host_name3));
Luke Huang40f5f492019-05-09 19:37:35 +08002385
2386 // Do another query with testFlags
Luke Huang4eabbe32020-05-28 03:17:32 +08002387 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_a, testFlag);
Luke Huang40f5f492019-05-09 19:37:35 +08002388 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002389 expectAnswersValid(fd1, AF_INET, "1.2.3.6");
Luke Huang40f5f492019-05-09 19:37:35 +08002390 // Expect cache lookup is skipped.
Luke Huang4eabbe32020-05-28 03:17:32 +08002391 EXPECT_EQ(3U, GetNumQueries(dns, host_name3));
Luke Huang40f5f492019-05-09 19:37:35 +08002392
2393 // Re-query with no flags
Luke Huang4eabbe32020-05-28 03:17:32 +08002394 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_a, 0);
Luke Huang40f5f492019-05-09 19:37:35 +08002395 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002396 expectAnswersValid(fd1, AF_INET, "1.2.3.6");
Luke Huang40f5f492019-05-09 19:37:35 +08002397 // Expect no cache hit because cache storing is also skipped in previous query.
Luke Huang4eabbe32020-05-28 03:17:32 +08002398 EXPECT_EQ(4U, GetNumQueries(dns, host_name3));
Luke Huangba7bef92018-12-26 16:53:03 +08002399}
2400
Luke Huang08b13d22020-02-05 14:46:21 +08002401TEST_F(ResolverTest, Async_NoCacheStoreFlagDoesNotRefreshStaleCacheEntry) {
2402 constexpr char listen_addr[] = "127.0.0.4";
2403 constexpr char host_name[] = "howdy.example.com.";
2404 const std::vector<DnsRecord> records = {
2405 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2406 };
2407
2408 test::DNSResponder dns(listen_addr);
2409 StartDns(dns, records);
2410 std::vector<std::string> servers = {listen_addr};
2411 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
2412
2413 const unsigned SHORT_TTL_SEC = 1;
2414 dns.setTtl(SHORT_TTL_SEC);
2415
2416 // Refer to b/148842821 for the purpose of below test steps.
2417 // Basically, this test is used to ensure stale cache case is handled
2418 // correctly with ANDROID_RESOLV_NO_CACHE_STORE.
2419 int fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2420 EXPECT_TRUE(fd != -1);
2421 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2422
2423 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2424 dns.clearQueries();
2425
2426 // Wait until cache expired
2427 sleep(SHORT_TTL_SEC + 0.5);
2428
2429 // Now request the same hostname again.
2430 // We should see a new DNS query because the entry in cache has become stale.
2431 // Due to ANDROID_RESOLV_NO_CACHE_STORE, this query must *not* refresh that stale entry.
2432 fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2433 ANDROID_RESOLV_NO_CACHE_STORE);
2434 EXPECT_TRUE(fd != -1);
2435 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2436 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2437 dns.clearQueries();
2438
2439 // If the cache is still stale, we expect to see one more DNS query
2440 // (this time the cache will be refreshed, but we're not checking for it).
2441 fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2442 EXPECT_TRUE(fd != -1);
2443 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2444 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2445}
2446
Luke Huangba7bef92018-12-26 16:53:03 +08002447TEST_F(ResolverTest, Async_NoRetryFlag) {
Luke Huang70931aa2019-01-31 11:57:41 +08002448 constexpr char listen_addr0[] = "127.0.0.4";
2449 constexpr char listen_addr1[] = "127.0.0.6";
Xiao Ma09b71022018-12-11 17:56:32 +09002450 constexpr char host_name[] = "howdy.example.com.";
2451 const std::vector<DnsRecord> records = {
2452 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2453 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2454 };
2455
Luke Huang70931aa2019-01-31 11:57:41 +08002456 test::DNSResponder dns0(listen_addr0);
2457 test::DNSResponder dns1(listen_addr1);
2458 StartDns(dns0, records);
2459 StartDns(dns1, records);
2460 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr0, listen_addr1}));
Luke Huangba7bef92018-12-26 16:53:03 +08002461
Luke Huang70931aa2019-01-31 11:57:41 +08002462 dns0.clearQueries();
2463 dns1.clearQueries();
2464
2465 dns0.setResponseProbability(0.0);
2466 dns1.setResponseProbability(0.0);
Luke Huangba7bef92018-12-26 16:53:03 +08002467
2468 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2469 ANDROID_RESOLV_NO_RETRY);
2470 EXPECT_TRUE(fd1 != -1);
2471
2472 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa,
2473 ANDROID_RESOLV_NO_RETRY);
2474 EXPECT_TRUE(fd2 != -1);
2475
2476 // expect no response
2477 expectAnswersNotValid(fd1, -ETIMEDOUT);
2478 expectAnswersNotValid(fd2, -ETIMEDOUT);
Mike Yu532405f2020-06-17 17:46:44 +08002479 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2480 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
Luke Huangba7bef92018-12-26 16:53:03 +08002481
Luke Huang70931aa2019-01-31 11:57:41 +08002482 // No retry case, expect total 2 queries. The server is selected randomly.
2483 EXPECT_EQ(2U, GetNumQueries(dns0, host_name) + GetNumQueries(dns1, host_name));
Luke Huangba7bef92018-12-26 16:53:03 +08002484
Luke Huang70931aa2019-01-31 11:57:41 +08002485 dns0.clearQueries();
2486 dns1.clearQueries();
Luke Huangba7bef92018-12-26 16:53:03 +08002487
2488 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2489 EXPECT_TRUE(fd1 != -1);
2490
2491 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
2492 EXPECT_TRUE(fd2 != -1);
2493
2494 // expect no response
2495 expectAnswersNotValid(fd1, -ETIMEDOUT);
2496 expectAnswersNotValid(fd2, -ETIMEDOUT);
Mike Yu532405f2020-06-17 17:46:44 +08002497 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2498 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
Luke Huangba7bef92018-12-26 16:53:03 +08002499
2500 // Retry case, expect 4 queries
Luke Huang70931aa2019-01-31 11:57:41 +08002501 EXPECT_EQ(4U, GetNumQueries(dns0, host_name));
2502 EXPECT_EQ(4U, GetNumQueries(dns1, host_name));
2503}
2504
2505TEST_F(ResolverTest, Async_VerifyQueryID) {
2506 constexpr char listen_addr[] = "127.0.0.4";
2507 constexpr char host_name[] = "howdy.example.com.";
2508 const std::vector<DnsRecord> records = {
2509 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2510 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2511 };
2512
2513 test::DNSResponder dns(listen_addr);
2514 StartDns(dns, records);
2515 std::vector<std::string> servers = {listen_addr};
2516 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
2517
2518 const uint8_t queryBuf1[] = {
2519 /* Header */
2520 0x55, 0x66, /* Transaction ID */
2521 0x01, 0x00, /* Flags */
2522 0x00, 0x01, /* Questions */
2523 0x00, 0x00, /* Answer RRs */
2524 0x00, 0x00, /* Authority RRs */
2525 0x00, 0x00, /* Additional RRs */
2526 /* Queries */
2527 0x05, 0x68, 0x6f, 0x77, 0x64, 0x79, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
2528 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name */
2529 0x00, 0x01, /* Type */
2530 0x00, 0x01 /* Class */
2531 };
2532
2533 int fd = resNetworkSend(TEST_NETID, queryBuf1, sizeof(queryBuf1), 0);
2534 EXPECT_TRUE(fd != -1);
2535
2536 uint8_t buf[MAXPACKET] = {};
2537 int rcode;
2538
2539 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2540 EXPECT_GT(res, 0);
2541 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2542
2543 auto hp = reinterpret_cast<HEADER*>(buf);
2544 EXPECT_EQ(21862U, htons(hp->id));
2545
2546 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2547
2548 const uint8_t queryBuf2[] = {
2549 /* Header */
2550 0x00, 0x53, /* Transaction ID */
2551 0x01, 0x00, /* Flags */
2552 0x00, 0x01, /* Questions */
2553 0x00, 0x00, /* Answer RRs */
2554 0x00, 0x00, /* Authority RRs */
2555 0x00, 0x00, /* Additional RRs */
2556 /* Queries */
2557 0x05, 0x68, 0x6f, 0x77, 0x64, 0x79, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
2558 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name */
2559 0x00, 0x01, /* Type */
2560 0x00, 0x01 /* Class */
2561 };
2562
2563 // Re-query verify cache works and query id is correct
2564 fd = resNetworkSend(TEST_NETID, queryBuf2, sizeof(queryBuf2), 0);
2565
2566 EXPECT_TRUE(fd != -1);
2567
2568 res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2569 EXPECT_GT(res, 0);
2570 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2571
2572 EXPECT_EQ(0x0053U, htons(hp->id));
2573
2574 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
Luke Huangba7bef92018-12-26 16:53:03 +08002575}
2576
Mike Yu4f3747b2018-12-02 17:54:29 +09002577// This test checks that the resolver should not generate the request containing OPT RR when using
Ken Chen0a015532019-01-02 14:59:38 +08002578// cleartext DNS. If we query the DNS server not supporting EDNS0 and it reponds with
2579// FORMERR_ON_EDNS, we will fallback to no EDNS0 and try again. If the server does no response, we
2580// won't retry so that we get no answer.
Mike Yu4f3747b2018-12-02 17:54:29 +09002581TEST_F(ResolverTest, BrokenEdns) {
2582 typedef test::DNSResponder::Edns Edns;
2583 enum ExpectResult { EXPECT_FAILURE, EXPECT_SUCCESS };
2584
Mike Yu3977d482020-02-26 17:18:57 +08002585 // Perform cleartext query in off mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002586 const char OFF[] = "off";
Mike Yu3977d482020-02-26 17:18:57 +08002587
2588 // Perform cleartext query when there's no private DNS server validated in opportunistic mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002589 const char OPPORTUNISTIC_UDP[] = "opportunistic_udp";
Mike Yu3977d482020-02-26 17:18:57 +08002590
2591 // Perform cleartext query when there is a private DNS server validated in opportunistic mode.
2592 const char OPPORTUNISTIC_FALLBACK_UDP[] = "opportunistic_fallback_udp";
2593
2594 // Perform cyphertext query in opportunistic mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002595 const char OPPORTUNISTIC_TLS[] = "opportunistic_tls";
Mike Yu3977d482020-02-26 17:18:57 +08002596
2597 // Perform cyphertext query in strict mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002598 const char STRICT[] = "strict";
Mike Yu3977d482020-02-26 17:18:57 +08002599
Mike Yu4f3747b2018-12-02 17:54:29 +09002600 const char GETHOSTBYNAME[] = "gethostbyname";
2601 const char GETADDRINFO[] = "getaddrinfo";
Mike Yu4f3747b2018-12-02 17:54:29 +09002602 const char ADDR4[] = "192.0.2.1";
2603 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2604 const char CLEARTEXT_PORT[] = "53";
2605 const char TLS_PORT[] = "853";
Luke Huangf8215372019-11-22 11:53:41 +08002606 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
Mike Yu3977d482020-02-26 17:18:57 +08002607 ResolverParamsParcel paramsForCleanup = DnsResponderClient::GetDefaultResolverParamsParcel();
2608 paramsForCleanup.servers.clear();
2609 paramsForCleanup.tlsServers.clear();
Mike Yu4f3747b2018-12-02 17:54:29 +09002610
Mike Yufc125e42019-05-15 20:41:28 +08002611 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Mike Yu4f3747b2018-12-02 17:54:29 +09002612 ASSERT_TRUE(dns.startServer());
2613
2614 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2615
Luke Huangf8215372019-11-22 11:53:41 +08002616 // clang-format off
Mike Yu4f3747b2018-12-02 17:54:29 +09002617 static const struct TestConfig {
2618 std::string mode;
2619 std::string method;
2620 Edns edns;
2621 ExpectResult expectResult;
2622
2623 std::string asHostName() const {
2624 const char* ednsString;
2625 switch (edns) {
2626 case Edns::ON:
2627 ednsString = "ednsOn";
2628 break;
Ken Chen0a015532019-01-02 14:59:38 +08002629 case Edns::FORMERR_ON_EDNS:
Mike Yu4f3747b2018-12-02 17:54:29 +09002630 ednsString = "ednsFormerr";
2631 break;
2632 case Edns::DROP:
2633 ednsString = "ednsDrop";
2634 break;
2635 default:
2636 ednsString = "";
2637 break;
2638 }
2639 return StringPrintf("%s.%s.%s.", mode.c_str(), method.c_str(), ednsString);
2640 }
2641 } testConfigs[] = {
Mike Yu3977d482020-02-26 17:18:57 +08002642 // In OPPORTUNISTIC_TLS, if the DNS server doesn't support EDNS0 but TLS, the lookup
2643 // fails. Could such server exist? if so, we might need to fix it to fallback to
2644 // cleartext query. If the server still make no response for the queries with EDNS0, we
2645 // might also need to fix it to retry without EDNS0.
Mike Yu4f3747b2018-12-02 17:54:29 +09002646 // Another thing is that {OPPORTUNISTIC_TLS, Edns::DROP} and {STRICT, Edns::DROP} are
2647 // commented out since TLS timeout is not configurable.
2648 // TODO: Uncomment them after TLS timeout is configurable.
Mike Yu3977d482020-02-26 17:18:57 +08002649 {OFF, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2650 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2651 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2652 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2653 {STRICT, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2654 {OFF, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2655 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2656 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2657 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2658 {STRICT, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2659 {OFF, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2660 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2661
2662 // The failure is due to no retry on timeout. Maybe fix it?
2663 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2664
2665 //{OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2666 //{STRICT, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2667 {OFF, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2668 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2669 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2670 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2671 {STRICT, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2672 {OFF, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2673 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2674 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2675 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2676 {STRICT, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2677 {OFF, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2678 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2679
2680 // The failure is due to no retry on timeout. Maybe fix it?
2681 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2682
Mike Yu4f3747b2018-12-02 17:54:29 +09002683 //{OPPORTUNISTIC_TLS, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2684 //{STRICT, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2685 };
Luke Huangf8215372019-11-22 11:53:41 +08002686 // clang-format on
Mike Yu4f3747b2018-12-02 17:54:29 +09002687
2688 for (const auto& config : testConfigs) {
2689 const std::string testHostName = config.asHostName();
2690 SCOPED_TRACE(testHostName);
2691
2692 const char* host_name = testHostName.c_str();
2693 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
2694 dns.setEdns(config.edns);
2695
2696 if (config.mode == OFF) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002697 if (tls.running()) {
2698 ASSERT_TRUE(tls.stopServer());
2699 }
Xiao Ma09b71022018-12-11 17:56:32 +09002700 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Mike Yu4f3747b2018-12-02 17:54:29 +09002701 } else if (config.mode == OPPORTUNISTIC_UDP) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002702 if (tls.running()) {
2703 ASSERT_TRUE(tls.stopServer());
2704 }
Xiao Ma09b71022018-12-11 17:56:32 +09002705 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002706 kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002707 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), false));
Mike Yu3977d482020-02-26 17:18:57 +08002708 } else if (config.mode == OPPORTUNISTIC_TLS || config.mode == OPPORTUNISTIC_FALLBACK_UDP) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002709 if (!tls.running()) {
2710 ASSERT_TRUE(tls.startServer());
2711 }
Xiao Ma09b71022018-12-11 17:56:32 +09002712 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002713 kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002714 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Mike Yu3977d482020-02-26 17:18:57 +08002715
2716 if (config.mode == OPPORTUNISTIC_FALLBACK_UDP) {
2717 // Force the resolver to fallback to cleartext queries.
2718 ASSERT_TRUE(tls.stopServer());
2719 }
Mike Yu4f3747b2018-12-02 17:54:29 +09002720 } else if (config.mode == STRICT) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002721 if (!tls.running()) {
2722 ASSERT_TRUE(tls.startServer());
2723 }
Xiao Ma09b71022018-12-11 17:56:32 +09002724 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002725 kDefaultParams, kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08002726 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Mike Yu4f3747b2018-12-02 17:54:29 +09002727 }
2728
2729 if (config.method == GETHOSTBYNAME) {
2730 const hostent* h_result = gethostbyname(host_name);
2731 if (config.expectResult == EXPECT_SUCCESS) {
2732 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2733 ASSERT_TRUE(h_result != nullptr);
2734 ASSERT_EQ(4, h_result->h_length);
2735 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
2736 EXPECT_EQ(ADDR4, ToString(h_result));
2737 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
Mike Yu532405f2020-06-17 17:46:44 +08002738 ExpectDnsEvent(INetdEventListener::EVENT_GETHOSTBYNAME, 0, host_name, {ADDR4});
Mike Yu4f3747b2018-12-02 17:54:29 +09002739 } else {
2740 EXPECT_EQ(0U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
2741 ASSERT_TRUE(h_result == nullptr);
2742 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
Mike Yu532405f2020-06-17 17:46:44 +08002743 int returnCode = (config.edns == Edns::DROP) ? RCODE_TIMEOUT : EAI_FAIL;
2744 ExpectDnsEvent(INetdEventListener::EVENT_GETHOSTBYNAME, returnCode, host_name, {});
Mike Yu4f3747b2018-12-02 17:54:29 +09002745 }
2746 } else if (config.method == GETADDRINFO) {
2747 ScopedAddrinfo ai_result;
2748 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2749 ai_result = safe_getaddrinfo(host_name, nullptr, &hints);
2750 if (config.expectResult == EXPECT_SUCCESS) {
2751 EXPECT_TRUE(ai_result != nullptr);
2752 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2753 const std::string result_str = ToString(ai_result);
2754 EXPECT_EQ(ADDR4, result_str);
Mike Yu532405f2020-06-17 17:46:44 +08002755 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, 0, host_name, {ADDR4});
Mike Yu4f3747b2018-12-02 17:54:29 +09002756 } else {
2757 EXPECT_TRUE(ai_result == nullptr);
2758 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
Mike Yu532405f2020-06-17 17:46:44 +08002759 int returnCode = (config.edns == Edns::DROP) ? RCODE_TIMEOUT : EAI_FAIL;
2760 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, returnCode, host_name, {});
Mike Yu4f3747b2018-12-02 17:54:29 +09002761 }
2762 } else {
2763 FAIL() << "Unsupported query method: " << config.method;
2764 }
2765
Mike Yudd4ac2d2019-05-31 16:52:11 +08002766 tls.clearQueries();
Mike Yu4f3747b2018-12-02 17:54:29 +09002767 dns.clearQueries();
Mike Yu3977d482020-02-26 17:18:57 +08002768
2769 // Clear the setup to force the resolver to validate private DNS servers in every test.
2770 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(paramsForCleanup));
Mike Yu4f3747b2018-12-02 17:54:29 +09002771 }
Mike Yu4f3747b2018-12-02 17:54:29 +09002772}
nuccachena26cc2a2018-07-17 18:07:23 +08002773
Ken Chen0a015532019-01-02 14:59:38 +08002774// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2775// Resolver should have a reasonable number of retries instead of spinning forever. We don't have
2776// an efficient way to know if resolver is stuck in an infinite loop. However, test case will be
2777// failed due to timeout.
2778TEST_F(ResolverTest, UnstableTls) {
2779 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2780 const char CLEARTEXT_PORT[] = "53";
2781 const char TLS_PORT[] = "853";
2782 const char* host_name1 = "nonexistent1.example.com.";
2783 const char* host_name2 = "nonexistent2.example.com.";
2784 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
2785
Mike Yufc125e42019-05-15 20:41:28 +08002786 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Ken Chen0a015532019-01-02 14:59:38 +08002787 ASSERT_TRUE(dns.startServer());
2788 dns.setEdns(test::DNSResponder::Edns::FORMERR_ON_EDNS);
2789 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2790 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08002791 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002792 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
2793
Ken Chen0a015532019-01-02 14:59:38 +08002794 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
2795 tls.stopServer();
2796
2797 const hostent* h_result = gethostbyname(host_name1);
2798 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
2799 ASSERT_TRUE(h_result == nullptr);
2800 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2801
2802 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2803 ScopedAddrinfo ai_result = safe_getaddrinfo(host_name2, nullptr, &hints);
2804 EXPECT_TRUE(ai_result == nullptr);
2805 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
2806}
2807
2808// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2809// Moreover, server responds RCODE=FORMERR even on non-EDNS query.
2810TEST_F(ResolverTest, BogusDnsServer) {
2811 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2812 const char CLEARTEXT_PORT[] = "53";
2813 const char TLS_PORT[] = "853";
2814 const char* host_name1 = "nonexistent1.example.com.";
2815 const char* host_name2 = "nonexistent2.example.com.";
2816 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
2817
Mike Yufc125e42019-05-15 20:41:28 +08002818 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Ken Chen0a015532019-01-02 14:59:38 +08002819 ASSERT_TRUE(dns.startServer());
2820 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2821 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08002822 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002823 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
2824
Ken Chen0a015532019-01-02 14:59:38 +08002825 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
2826 tls.stopServer();
2827 dns.setEdns(test::DNSResponder::Edns::FORMERR_UNCOND);
2828
2829 const hostent* h_result = gethostbyname(host_name1);
2830 EXPECT_EQ(0U, GetNumQueries(dns, host_name1));
2831 ASSERT_TRUE(h_result == nullptr);
2832 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2833
2834 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2835 ScopedAddrinfo ai_result = safe_getaddrinfo(host_name2, nullptr, &hints);
2836 EXPECT_TRUE(ai_result == nullptr);
2837 EXPECT_EQ(0U, GetNumQueries(dns, host_name2));
2838}
2839
nuccachena26cc2a2018-07-17 18:07:23 +08002840TEST_F(ResolverTest, GetAddrInfo_Dns64Synthesize) {
2841 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002842 constexpr char dns64_name[] = "ipv4only.arpa.";
2843 constexpr char host_name[] = "v4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002844 const std::vector<DnsRecord> records = {
2845 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2846 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2847 };
nuccachena26cc2a2018-07-17 18:07:23 +08002848
Xiao Ma09b71022018-12-11 17:56:32 +09002849 test::DNSResponder dns(listen_addr);
Xiao Ma09b71022018-12-11 17:56:32 +09002850 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002851
2852 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002853 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002854
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002855 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002856 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002857 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002858
2859 // hints are necessary in order to let netd know which type of addresses the caller is
2860 // interested in.
Xiao Ma09b71022018-12-11 17:56:32 +09002861 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08002862 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
2863 EXPECT_TRUE(result != nullptr);
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002864 // TODO: BUG: there should only be two queries, one AAAA (which returns no records) and one A
2865 // (which returns 1.2.3.4). But there is an extra AAAA.
2866 EXPECT_EQ(3U, GetNumQueries(dns, host_name));
nuccachena26cc2a2018-07-17 18:07:23 +08002867
2868 std::string result_str = ToString(result);
2869 EXPECT_EQ(result_str, "64:ff9b::102:304");
2870
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002871 // Stopping NAT64 prefix discovery disables synthesis.
Luke Huang5bd827c2019-03-14 16:10:04 +08002872 EXPECT_TRUE(mDnsClient.resolvService()->stopPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002873 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_NOT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002874
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002875 dns.clearQueries();
nuccachena26cc2a2018-07-17 18:07:23 +08002876
2877 result = safe_getaddrinfo("v4only", nullptr, &hints);
2878 EXPECT_TRUE(result != nullptr);
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002879 // TODO: BUG: there should only be one query, an AAAA (which returns no records), because the
2880 // A is already cached. But there is an extra AAAA.
2881 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
nuccachena26cc2a2018-07-17 18:07:23 +08002882
2883 result_str = ToString(result);
2884 EXPECT_EQ(result_str, "1.2.3.4");
2885}
2886
nuccachena26cc2a2018-07-17 18:07:23 +08002887TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecified) {
2888 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002889 constexpr char dns64_name[] = "ipv4only.arpa.";
2890 constexpr char host_name[] = "v4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002891 const std::vector<DnsRecord> records = {
2892 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2893 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2894 };
nuccachena26cc2a2018-07-17 18:07:23 +08002895
Xiao Ma09b71022018-12-11 17:56:32 +09002896 test::DNSResponder dns(listen_addr);
2897 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002898 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002899 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002900
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002901 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002902 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002903 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002904
2905 // Ensure to synthesize AAAA if AF_INET6 is specified, and not to synthesize AAAA
2906 // in AF_INET case.
2907 addrinfo hints;
2908 memset(&hints, 0, sizeof(hints));
2909 hints.ai_family = AF_INET6;
2910 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
2911 EXPECT_TRUE(result != nullptr);
2912 std::string result_str = ToString(result);
2913 EXPECT_EQ(result_str, "64:ff9b::102:304");
2914
2915 hints.ai_family = AF_INET;
2916 result = safe_getaddrinfo("v4only", nullptr, &hints);
2917 EXPECT_TRUE(result != nullptr);
2918 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2919 result_str = ToString(result);
2920 EXPECT_EQ(result_str, "1.2.3.4");
2921}
nuccachena26cc2a2018-07-17 18:07:23 +08002922
2923TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedV6) {
2924 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002925 constexpr char dns64_name[] = "ipv4only.arpa.";
2926 constexpr char host_name[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002927 const std::vector<DnsRecord> records = {
2928 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2929 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2930 {host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
2931 };
nuccachena26cc2a2018-07-17 18:07:23 +08002932
Xiao Ma09b71022018-12-11 17:56:32 +09002933 test::DNSResponder dns(listen_addr);
2934 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002935 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002936 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002937
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002938 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002939 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002940 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002941
Xiao Ma09b71022018-12-11 17:56:32 +09002942 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08002943 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
2944 EXPECT_TRUE(result != nullptr);
2945 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2946
2947 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
Xiao Ma09b71022018-12-11 17:56:32 +09002948 const std::vector<std::string> result_strs = ToStrings(result);
nuccachena26cc2a2018-07-17 18:07:23 +08002949 for (const auto& str : result_strs) {
2950 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
2951 << ", result_str='" << str << "'";
2952 }
2953}
2954
2955TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedNoV6) {
2956 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002957 constexpr char dns64_name[] = "ipv4only.arpa.";
2958 constexpr char host_name[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002959 const std::vector<DnsRecord> records = {
2960 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2961 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2962 };
nuccachena26cc2a2018-07-17 18:07:23 +08002963
Xiao Ma09b71022018-12-11 17:56:32 +09002964 test::DNSResponder dns(listen_addr);
2965 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002966 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002967 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002968
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002969 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002970 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002971 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002972
Xiao Ma09b71022018-12-11 17:56:32 +09002973 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08002974 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
2975 EXPECT_TRUE(result != nullptr);
2976 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2977
2978 // In AF_UNSPEC case, synthesize AAAA if there's no AAAA answer.
2979 std::string result_str = ToString(result);
2980 EXPECT_EQ(result_str, "64:ff9b::102:304");
2981}
2982
2983TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecialUseIPv4Addresses) {
2984 constexpr char THIS_NETWORK[] = "this_network";
2985 constexpr char LOOPBACK[] = "loopback";
2986 constexpr char LINK_LOCAL[] = "link_local";
2987 constexpr char MULTICAST[] = "multicast";
2988 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
2989
2990 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
2991 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
2992 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
2993 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
2994 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
2995
2996 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002997 constexpr char dns64_name[] = "ipv4only.arpa.";
2998
Xiao Ma09b71022018-12-11 17:56:32 +09002999 test::DNSResponder dns(listen_addr);
3000 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003001 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003002 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003003
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003004 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003005 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003006 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003007
Luke Huangf8215372019-11-22 11:53:41 +08003008 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003009 static const struct TestConfig {
3010 std::string name;
3011 std::string addr;
3012
3013 std::string asHostName() const { return StringPrintf("%s.example.com.", name.c_str()); }
3014 } testConfigs[]{
3015 {THIS_NETWORK, ADDR_THIS_NETWORK},
3016 {LOOPBACK, ADDR_LOOPBACK},
3017 {LINK_LOCAL, ADDR_LINK_LOCAL},
3018 {MULTICAST, ADDR_MULTICAST},
3019 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
3020 };
Luke Huangf8215372019-11-22 11:53:41 +08003021 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003022
3023 for (const auto& config : testConfigs) {
3024 const std::string testHostName = config.asHostName();
3025 SCOPED_TRACE(testHostName);
3026
3027 const char* host_name = testHostName.c_str();
3028 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
3029
3030 addrinfo hints;
3031 memset(&hints, 0, sizeof(hints));
3032 hints.ai_family = AF_INET6;
3033 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
3034 // In AF_INET6 case, don't return IPv4 answers
3035 EXPECT_TRUE(result == nullptr);
3036 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3037 dns.clearQueries();
3038
3039 memset(&hints, 0, sizeof(hints));
3040 hints.ai_family = AF_UNSPEC;
3041 result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
3042 EXPECT_TRUE(result != nullptr);
3043 // Expect IPv6 query only. IPv4 answer has been cached in previous query.
3044 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3045 // In AF_UNSPEC case, don't synthesize special use IPv4 address.
3046 std::string result_str = ToString(result);
3047 EXPECT_EQ(result_str, config.addr.c_str());
3048 dns.clearQueries();
3049 }
3050}
3051
3052TEST_F(ResolverTest, GetAddrInfo_Dns64QueryWithNullArgumentHints) {
3053 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003054 constexpr char dns64_name[] = "ipv4only.arpa.";
3055 constexpr char host_name[] = "v4only.example.com.";
3056 constexpr char host_name2[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003057 const std::vector<DnsRecord> records = {
3058 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3059 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3060 {host_name2, ns_type::ns_t_a, "1.2.3.4"},
3061 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
3062 };
nuccachena26cc2a2018-07-17 18:07:23 +08003063
Xiao Ma09b71022018-12-11 17:56:32 +09003064 test::DNSResponder dns(listen_addr);
3065 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003066 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003067 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003068
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003069 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003070 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003071 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003072
3073 // Assign argument hints of getaddrinfo() as null is equivalent to set ai_family AF_UNSPEC.
3074 // In AF_UNSPEC case, synthesize AAAA if there has A answer only.
3075 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, nullptr);
3076 EXPECT_TRUE(result != nullptr);
3077 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3078 std::string result_str = ToString(result);
3079 EXPECT_EQ(result_str, "64:ff9b::102:304");
3080 dns.clearQueries();
3081
3082 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
3083 result = safe_getaddrinfo("v4v6", nullptr, nullptr);
3084 EXPECT_TRUE(result != nullptr);
3085 EXPECT_LE(2U, GetNumQueries(dns, host_name2));
3086 std::vector<std::string> result_strs = ToStrings(result);
3087 for (const auto& str : result_strs) {
3088 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
3089 << ", result_str='" << str << "'";
3090 }
3091}
3092
3093TEST_F(ResolverTest, GetAddrInfo_Dns64QueryNullArgumentNode) {
3094 constexpr char ADDR_ANYADDR_V4[] = "0.0.0.0";
3095 constexpr char ADDR_ANYADDR_V6[] = "::";
3096 constexpr char ADDR_LOCALHOST_V4[] = "127.0.0.1";
3097 constexpr char ADDR_LOCALHOST_V6[] = "::1";
3098
3099 constexpr char PORT_NAME_HTTP[] = "http";
3100 constexpr char PORT_NUMBER_HTTP[] = "80";
3101
3102 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003103 constexpr char dns64_name[] = "ipv4only.arpa.";
3104
Xiao Ma09b71022018-12-11 17:56:32 +09003105 test::DNSResponder dns(listen_addr);
3106 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003107 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003108 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003109
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003110 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003111 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003112 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003113
Luke Huangf8215372019-11-22 11:53:41 +08003114 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003115 // If node is null, return address is listed by libc/getaddrinfo.c as follows.
3116 // - passive socket -> anyaddr (0.0.0.0 or ::)
3117 // - non-passive socket -> localhost (127.0.0.1 or ::1)
3118 static const struct TestConfig {
3119 int flag;
3120 std::string addr_v4;
3121 std::string addr_v6;
3122
3123 std::string asParameters() const {
3124 return StringPrintf("flag=%d, addr_v4=%s, addr_v6=%s", flag, addr_v4.c_str(),
3125 addr_v6.c_str());
3126 }
3127 } testConfigs[]{
3128 {0 /* non-passive */, ADDR_LOCALHOST_V4, ADDR_LOCALHOST_V6},
3129 {AI_PASSIVE, ADDR_ANYADDR_V4, ADDR_ANYADDR_V6}
3130 };
Luke Huangf8215372019-11-22 11:53:41 +08003131 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003132
3133 for (const auto& config : testConfigs) {
3134 SCOPED_TRACE(config.asParameters());
3135
Xiao Ma09b71022018-12-11 17:56:32 +09003136 addrinfo hints = {
Nick Desaulnierscd6395a2019-10-11 09:15:24 -07003137 .ai_flags = config.flag,
Xiao Ma09b71022018-12-11 17:56:32 +09003138 .ai_family = AF_UNSPEC, // any address family
3139 .ai_socktype = 0, // any type
3140 .ai_protocol = 0, // any protocol
Xiao Ma09b71022018-12-11 17:56:32 +09003141 };
nuccachena26cc2a2018-07-17 18:07:23 +08003142
3143 // Assign hostname as null and service as port name.
3144 ScopedAddrinfo result = safe_getaddrinfo(nullptr, PORT_NAME_HTTP, &hints);
3145 ASSERT_TRUE(result != nullptr);
3146
3147 // Can't be synthesized because it should not get into Netd.
3148 std::vector<std::string> result_strs = ToStrings(result);
3149 for (const auto& str : result_strs) {
3150 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
3151 << ", result_str='" << str << "'";
3152 }
3153
3154 // Assign hostname as null and service as numeric port number.
3155 hints.ai_flags = config.flag | AI_NUMERICSERV;
3156 result = safe_getaddrinfo(nullptr, PORT_NUMBER_HTTP, &hints);
3157 ASSERT_TRUE(result != nullptr);
3158
3159 // Can't be synthesized because it should not get into Netd.
3160 result_strs = ToStrings(result);
3161 for (const auto& str : result_strs) {
3162 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
3163 << ", result_str='" << str << "'";
3164 }
3165 }
3166}
3167
3168TEST_F(ResolverTest, GetHostByAddr_ReverseDnsQueryWithHavingNat64Prefix) {
3169 struct hostent* result = nullptr;
3170 struct in_addr v4addr;
3171 struct in6_addr v6addr;
3172
3173 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003174 constexpr char dns64_name[] = "ipv4only.arpa.";
3175 constexpr char ptr_name[] = "v4v6.example.com.";
3176 // PTR record for IPv4 address 1.2.3.4
3177 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3178 // PTR record for IPv6 address 2001:db8::102:304
3179 constexpr char ptr_addr_v6[] =
3180 "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 +09003181 const std::vector<DnsRecord> records = {
3182 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3183 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3184 {ptr_addr_v6, ns_type::ns_t_ptr, ptr_name},
3185 };
nuccachena26cc2a2018-07-17 18:07:23 +08003186
Xiao Ma09b71022018-12-11 17:56:32 +09003187 test::DNSResponder dns(listen_addr);
3188 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003189 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003190 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003191
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003192 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003193 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003194 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003195
3196 // Reverse IPv4 DNS query. Prefix should have no effect on it.
3197 inet_pton(AF_INET, "1.2.3.4", &v4addr);
3198 result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
3199 ASSERT_TRUE(result != nullptr);
3200 std::string result_str = result->h_name ? result->h_name : "null";
3201 EXPECT_EQ(result_str, "v4v6.example.com");
3202
3203 // Reverse IPv6 DNS query. Prefix should have no effect on it.
3204 inet_pton(AF_INET6, "2001:db8::102:304", &v6addr);
3205 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3206 ASSERT_TRUE(result != nullptr);
3207 result_str = result->h_name ? result->h_name : "null";
3208 EXPECT_EQ(result_str, "v4v6.example.com");
3209}
3210
3211TEST_F(ResolverTest, GetHostByAddr_ReverseDns64Query) {
3212 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003213 constexpr char dns64_name[] = "ipv4only.arpa.";
3214 constexpr char ptr_name[] = "v4only.example.com.";
3215 // PTR record for IPv4 address 1.2.3.4
3216 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3217 // PTR record for IPv6 address 64:ff9b::1.2.3.4
3218 constexpr char ptr_addr_v6_nomapping[] =
3219 "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.";
3220 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
3221 // PTR record for IPv6 address 64:ff9b::5.6.7.8
3222 constexpr char ptr_addr_v6_synthesis[] =
3223 "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 +09003224 const std::vector<DnsRecord> records = {
3225 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3226 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3227 {ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis},
3228 };
nuccachena26cc2a2018-07-17 18:07:23 +08003229
Xiao Ma09b71022018-12-11 17:56:32 +09003230 test::DNSResponder dns(listen_addr);
3231 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003232 // "ptr_addr_v6_nomapping" is not mapped in DNS server
nuccachena26cc2a2018-07-17 18:07:23 +08003233 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003234 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003235
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003236 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003237 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003238 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003239
3240 // Synthesized PTR record doesn't exist on DNS server
3241 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
3242 // After querying synthesized address failed, expect that prefix is removed from IPv6
3243 // synthesized address and do reverse IPv4 query instead.
3244 struct in6_addr v6addr;
3245 inet_pton(AF_INET6, "64:ff9b::1.2.3.4", &v6addr);
3246 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3247 ASSERT_TRUE(result != nullptr);
3248 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist
3249 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist
3250 std::string result_str = result->h_name ? result->h_name : "null";
3251 EXPECT_EQ(result_str, "v4only.example.com");
3252 // Check that return address has been mapped from IPv4 to IPv6 address because Netd
3253 // removes NAT64 prefix and does IPv4 DNS reverse lookup in this case. Then, Netd
3254 // fakes the return IPv4 address as original queried IPv6 address.
3255 result_str = ToString(result);
3256 EXPECT_EQ(result_str, "64:ff9b::102:304");
3257 dns.clearQueries();
3258
3259 // Synthesized PTR record exists on DNS server
3260 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
3261 // Expect to Netd pass through synthesized address for DNS queries.
3262 inet_pton(AF_INET6, "64:ff9b::5.6.7.8", &v6addr);
3263 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3264 ASSERT_TRUE(result != nullptr);
3265 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
3266 result_str = result->h_name ? result->h_name : "null";
3267 EXPECT_EQ(result_str, "v6synthesis.example.com");
3268}
3269
3270TEST_F(ResolverTest, GetHostByAddr_ReverseDns64QueryFromHostFile) {
3271 constexpr char dns64_name[] = "ipv4only.arpa.";
3272 constexpr char host_name[] = "localhost";
3273 // The address is synthesized by prefix64:localhost.
3274 constexpr char host_addr[] = "64:ff9b::7f00:1";
nuccachena26cc2a2018-07-17 18:07:23 +08003275 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003276
3277 test::DNSResponder dns(listen_addr);
3278 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003279 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003280 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003281
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003282 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003283 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003284 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003285
3286 // Using synthesized "localhost" address to be a trick for resolving host name
3287 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
3288 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
3289 struct in6_addr v6addr;
3290 inet_pton(AF_INET6, host_addr, &v6addr);
3291 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3292 ASSERT_TRUE(result != nullptr);
3293 // Expect no DNS queries; localhost is resolved via /etc/hosts.
3294 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
3295
Luke Huangf8215372019-11-22 11:53:41 +08003296 ASSERT_EQ(sizeof(in6_addr), (unsigned)result->h_length);
nuccachena26cc2a2018-07-17 18:07:23 +08003297 ASSERT_EQ(AF_INET6, result->h_addrtype);
3298 std::string result_str = ToString(result);
3299 EXPECT_EQ(result_str, host_addr);
3300 result_str = result->h_name ? result->h_name : "null";
3301 EXPECT_EQ(result_str, host_name);
3302}
3303
Hungming Chen9e6185a2019-06-04 16:09:19 +08003304TEST_F(ResolverTest, GetHostByAddr_cnamesClasslessReverseDelegation) {
3305 // IPv4 addresses in the subnet with notation '/' or '-'.
3306 constexpr char addr_slash[] = "192.0.2.1";
3307 constexpr char addr_hyphen[] = "192.0.3.1";
3308
3309 // Used to verify DNS reverse query for classless reverse lookup zone. See detail in RFC 2317
3310 // section 4.
3311 const static std::vector<DnsRecord> records = {
3312 // The records for reverse querying "192.0.2.1" in the subnet with notation '/'.
3313 {"1.2.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0/25.2.0.192.in-addr.arpa."},
3314 {"1.0/25.2.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3315
3316 // The records for reverse querying "192.0.3.1" in the subnet with notation '-'.
3317 {"1.3.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0-127.3.0.192.in-addr.arpa."},
3318 {"1.0-127.3.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3319 };
3320
3321 test::DNSResponder dns;
3322 StartDns(dns, records);
3323 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3324
3325 for (const auto& address : {addr_slash, addr_hyphen}) {
3326 SCOPED_TRACE(address);
3327
3328 in_addr v4addr;
3329 ASSERT_TRUE(inet_pton(AF_INET, address, &v4addr));
3330 hostent* result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
3331 ASSERT_TRUE(result != nullptr);
3332 EXPECT_STREQ("hello.example.com", result->h_name);
3333 }
3334}
3335
nuccachena26cc2a2018-07-17 18:07:23 +08003336TEST_F(ResolverTest, GetNameInfo_ReverseDnsQueryWithHavingNat64Prefix) {
3337 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003338 constexpr char dns64_name[] = "ipv4only.arpa.";
3339 constexpr char ptr_name[] = "v4v6.example.com.";
3340 // PTR record for IPv4 address 1.2.3.4
3341 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3342 // PTR record for IPv6 address 2001:db8::102:304
3343 constexpr char ptr_addr_v6[] =
3344 "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 +09003345 const std::vector<DnsRecord> records = {
3346 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3347 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3348 {ptr_addr_v6, ns_type::ns_t_ptr, ptr_name},
3349 };
nuccachena26cc2a2018-07-17 18:07:23 +08003350
Xiao Ma09b71022018-12-11 17:56:32 +09003351 test::DNSResponder dns(listen_addr);
3352 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003353 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003354 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003355
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003356 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003357 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003358 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003359
Luke Huangf8215372019-11-22 11:53:41 +08003360 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003361 static const struct TestConfig {
3362 int flag;
3363 int family;
3364 std::string addr;
3365 std::string host;
3366
3367 std::string asParameters() const {
3368 return StringPrintf("flag=%d, family=%d, addr=%s, host=%s", flag, family, addr.c_str(),
3369 host.c_str());
3370 }
3371 } testConfigs[]{
3372 {NI_NAMEREQD, AF_INET, "1.2.3.4", "v4v6.example.com"},
3373 {NI_NUMERICHOST, AF_INET, "1.2.3.4", "1.2.3.4"},
3374 {0, AF_INET, "1.2.3.4", "v4v6.example.com"},
3375 {0, AF_INET, "5.6.7.8", "5.6.7.8"}, // unmapped
3376 {NI_NAMEREQD, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
3377 {NI_NUMERICHOST, AF_INET6, "2001:db8::102:304", "2001:db8::102:304"},
3378 {0, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
3379 {0, AF_INET6, "2001:db8::506:708", "2001:db8::506:708"}, // unmapped
3380 };
Luke Huangf8215372019-11-22 11:53:41 +08003381 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003382
3383 // Reverse IPv4/IPv6 DNS query. Prefix should have no effect on it.
3384 for (const auto& config : testConfigs) {
3385 SCOPED_TRACE(config.asParameters());
3386
3387 int rv;
3388 char host[NI_MAXHOST];
3389 struct sockaddr_in sin;
3390 struct sockaddr_in6 sin6;
3391 if (config.family == AF_INET) {
3392 memset(&sin, 0, sizeof(sin));
3393 sin.sin_family = AF_INET;
3394 inet_pton(AF_INET, config.addr.c_str(), &sin.sin_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003395 rv = getnameinfo((const struct sockaddr*)&sin, sizeof(sin), host, sizeof(host), nullptr,
3396 0, config.flag);
nuccachena26cc2a2018-07-17 18:07:23 +08003397 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4));
3398 } else if (config.family == AF_INET6) {
3399 memset(&sin6, 0, sizeof(sin6));
3400 sin6.sin6_family = AF_INET6;
3401 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003402 rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host),
nuccachena26cc2a2018-07-17 18:07:23 +08003403 nullptr, 0, config.flag);
3404 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6));
3405 }
3406 ASSERT_EQ(0, rv);
3407 std::string result_str = host;
3408 EXPECT_EQ(result_str, config.host);
3409 dns.clearQueries();
3410 }
3411}
3412
3413TEST_F(ResolverTest, GetNameInfo_ReverseDns64Query) {
3414 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003415 constexpr char dns64_name[] = "ipv4only.arpa.";
3416 constexpr char ptr_name[] = "v4only.example.com.";
3417 // PTR record for IPv4 address 1.2.3.4
3418 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3419 // PTR record for IPv6 address 64:ff9b::1.2.3.4
3420 constexpr char ptr_addr_v6_nomapping[] =
3421 "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.";
3422 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
3423 // PTR record for IPv6 address 64:ff9b::5.6.7.8
3424 constexpr char ptr_addr_v6_synthesis[] =
3425 "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 +09003426 const std::vector<DnsRecord> records = {
3427 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3428 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3429 {ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis},
3430 };
nuccachena26cc2a2018-07-17 18:07:23 +08003431
Xiao Ma09b71022018-12-11 17:56:32 +09003432 test::DNSResponder dns(listen_addr);
3433 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003434 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003435 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003436
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003437 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003438 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003439 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003440
Luke Huangf8215372019-11-22 11:53:41 +08003441 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003442 static const struct TestConfig {
3443 bool hasSynthesizedPtrRecord;
3444 int flag;
3445 std::string addr;
3446 std::string host;
3447
3448 std::string asParameters() const {
3449 return StringPrintf("hasSynthesizedPtrRecord=%d, flag=%d, addr=%s, host=%s",
3450 hasSynthesizedPtrRecord, flag, addr.c_str(), host.c_str());
3451 }
3452 } testConfigs[]{
3453 {false, NI_NAMEREQD, "64:ff9b::102:304", "v4only.example.com"},
3454 {false, NI_NUMERICHOST, "64:ff9b::102:304", "64:ff9b::102:304"},
3455 {false, 0, "64:ff9b::102:304", "v4only.example.com"},
3456 {true, NI_NAMEREQD, "64:ff9b::506:708", "v6synthesis.example.com"},
3457 {true, NI_NUMERICHOST, "64:ff9b::506:708", "64:ff9b::506:708"},
3458 {true, 0, "64:ff9b::506:708", "v6synthesis.example.com"}
3459 };
Luke Huangf8215372019-11-22 11:53:41 +08003460 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003461
3462 // hasSynthesizedPtrRecord = false
3463 // Synthesized PTR record doesn't exist on DNS server
3464 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
3465 // After querying synthesized address failed, expect that prefix is removed from IPv6
3466 // synthesized address and do reverse IPv4 query instead.
3467 //
3468 // hasSynthesizedPtrRecord = true
3469 // Synthesized PTR record exists on DNS server
3470 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
3471 // Expect to just pass through synthesized address for DNS queries.
3472 for (const auto& config : testConfigs) {
3473 SCOPED_TRACE(config.asParameters());
3474
3475 char host[NI_MAXHOST];
3476 struct sockaddr_in6 sin6;
3477 memset(&sin6, 0, sizeof(sin6));
3478 sin6.sin6_family = AF_INET6;
3479 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003480 int rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host),
nuccachena26cc2a2018-07-17 18:07:23 +08003481 nullptr, 0, config.flag);
3482 ASSERT_EQ(0, rv);
3483 if (config.flag == NI_NAMEREQD) {
3484 if (config.hasSynthesizedPtrRecord) {
3485 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
3486 } else {
3487 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist.
3488 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist.
3489 }
3490 }
3491 std::string result_str = host;
3492 EXPECT_EQ(result_str, config.host);
3493 dns.clearQueries();
3494 }
3495}
3496
3497TEST_F(ResolverTest, GetNameInfo_ReverseDns64QueryFromHostFile) {
3498 constexpr char dns64_name[] = "ipv4only.arpa.";
3499 constexpr char host_name[] = "localhost";
3500 // The address is synthesized by prefix64:localhost.
3501 constexpr char host_addr[] = "64:ff9b::7f00:1";
nuccachena26cc2a2018-07-17 18:07:23 +08003502 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003503
3504 test::DNSResponder dns(listen_addr);
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003505
Xiao Ma09b71022018-12-11 17:56:32 +09003506 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003507 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003508 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003509
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003510 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003511 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003512 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003513
3514 // Using synthesized "localhost" address to be a trick for resolving host name
3515 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
3516 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
3517 char host[NI_MAXHOST];
Xiao Ma09b71022018-12-11 17:56:32 +09003518 struct sockaddr_in6 sin6 = {.sin6_family = AF_INET6};
nuccachena26cc2a2018-07-17 18:07:23 +08003519 inet_pton(AF_INET6, host_addr, &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003520 int rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host), nullptr,
nuccachena26cc2a2018-07-17 18:07:23 +08003521 0, NI_NAMEREQD);
3522 ASSERT_EQ(0, rv);
3523 // Expect no DNS queries; localhost is resolved via /etc/hosts.
3524 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
3525
3526 std::string result_str = host;
3527 EXPECT_EQ(result_str, host_name);
3528}
3529
Hungming Chen9e6185a2019-06-04 16:09:19 +08003530TEST_F(ResolverTest, GetNameInfo_cnamesClasslessReverseDelegation) {
3531 // IPv4 addresses in the subnet with notation '/' or '-'.
3532 constexpr char addr_slash[] = "192.0.2.1";
3533 constexpr char addr_hyphen[] = "192.0.3.1";
3534
3535 // Used to verify DNS reverse query for classless reverse lookup zone. See detail in RFC 2317
3536 // section 4.
3537 const static std::vector<DnsRecord> records = {
3538 // The records for reverse querying "192.0.2.1" in the subnet with notation '/'.
3539 {"1.2.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0/25.2.0.192.in-addr.arpa."},
3540 {"1.0/25.2.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3541
3542 // The records for reverse querying "192.0.3.1" in the subnet with notation '-'.
3543 {"1.3.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0-127.3.0.192.in-addr.arpa."},
3544 {"1.0-127.3.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3545 };
3546
3547 test::DNSResponder dns;
3548 StartDns(dns, records);
3549 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3550
3551 for (const auto& address : {addr_slash, addr_hyphen}) {
3552 SCOPED_TRACE(address);
3553
3554 char host[NI_MAXHOST];
3555 sockaddr_in sin = {.sin_family = AF_INET};
3556 ASSERT_TRUE(inet_pton(AF_INET, address, &sin.sin_addr));
3557 int rv = getnameinfo((const sockaddr*)&sin, sizeof(sin), host, sizeof(host), nullptr, 0,
3558 NI_NAMEREQD);
3559 ASSERT_EQ(0, rv);
3560 EXPECT_STREQ("hello.example.com", host);
3561 }
3562}
3563
nuccachena26cc2a2018-07-17 18:07:23 +08003564TEST_F(ResolverTest, GetHostByName2_Dns64Synthesize) {
Xiao Ma09b71022018-12-11 17:56:32 +09003565 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003566 constexpr char dns64_name[] = "ipv4only.arpa.";
3567 constexpr char host_name[] = "ipv4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003568 const std::vector<DnsRecord> records = {
3569 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3570 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3571 };
nuccachena26cc2a2018-07-17 18:07:23 +08003572
Xiao Ma09b71022018-12-11 17:56:32 +09003573 test::DNSResponder dns(listen_addr);
3574 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003575 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003576 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003577
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003578 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003579 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003580 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003581
3582 // Query an IPv4-only hostname. Expect that gets a synthesized address.
3583 struct hostent* result = gethostbyname2("ipv4only", AF_INET6);
3584 ASSERT_TRUE(result != nullptr);
3585 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3586 std::string result_str = ToString(result);
3587 EXPECT_EQ(result_str, "64:ff9b::102:304");
3588}
nuccachena26cc2a2018-07-17 18:07:23 +08003589
3590TEST_F(ResolverTest, GetHostByName2_DnsQueryWithHavingNat64Prefix) {
3591 constexpr char dns64_name[] = "ipv4only.arpa.";
3592 constexpr char host_name[] = "v4v6.example.com.";
nuccachena26cc2a2018-07-17 18:07:23 +08003593 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003594 const std::vector<DnsRecord> records = {
3595 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3596 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3597 {host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
3598 };
3599
3600 test::DNSResponder dns(listen_addr);
3601 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003602 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003603 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003604
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003605 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003606 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003607 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003608
3609 // IPv4 DNS query. Prefix should have no effect on it.
3610 struct hostent* result = gethostbyname2("v4v6", AF_INET);
3611 ASSERT_TRUE(result != nullptr);
3612 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3613 std::string result_str = ToString(result);
3614 EXPECT_EQ(result_str, "1.2.3.4");
3615 dns.clearQueries();
3616
3617 // IPv6 DNS query. Prefix should have no effect on it.
3618 result = gethostbyname2("v4v6", AF_INET6);
3619 ASSERT_TRUE(result != nullptr);
3620 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3621 result_str = ToString(result);
3622 EXPECT_EQ(result_str, "2001:db8::102:304");
3623}
3624
3625TEST_F(ResolverTest, GetHostByName2_Dns64QuerySpecialUseIPv4Addresses) {
3626 constexpr char THIS_NETWORK[] = "this_network";
3627 constexpr char LOOPBACK[] = "loopback";
3628 constexpr char LINK_LOCAL[] = "link_local";
3629 constexpr char MULTICAST[] = "multicast";
3630 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
3631
3632 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
3633 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
3634 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
3635 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
3636 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
3637
3638 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003639 constexpr char dns64_name[] = "ipv4only.arpa.";
3640
Xiao Ma09b71022018-12-11 17:56:32 +09003641 test::DNSResponder dns(listen_addr);
3642 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003643 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003644 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003645
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003646 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003647 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003648 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003649
Luke Huangf8215372019-11-22 11:53:41 +08003650 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003651 static const struct TestConfig {
3652 std::string name;
3653 std::string addr;
3654
3655 std::string asHostName() const {
Luke Huangf8215372019-11-22 11:53:41 +08003656 return StringPrintf("%s.example.com.", name.c_str());
nuccachena26cc2a2018-07-17 18:07:23 +08003657 }
3658 } testConfigs[]{
3659 {THIS_NETWORK, ADDR_THIS_NETWORK},
3660 {LOOPBACK, ADDR_LOOPBACK},
3661 {LINK_LOCAL, ADDR_LINK_LOCAL},
3662 {MULTICAST, ADDR_MULTICAST},
3663 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
3664 };
Luke Huangf8215372019-11-22 11:53:41 +08003665 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003666
3667 for (const auto& config : testConfigs) {
3668 const std::string testHostName = config.asHostName();
3669 SCOPED_TRACE(testHostName);
3670
3671 const char* host_name = testHostName.c_str();
3672 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
3673
3674 struct hostent* result = gethostbyname2(config.name.c_str(), AF_INET6);
3675 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3676
3677 // In AF_INET6 case, don't synthesize special use IPv4 address.
3678 // Expect to have no answer
3679 EXPECT_EQ(nullptr, result);
3680
3681 dns.clearQueries();
3682 }
Bernie Innocenti2fef2b82018-12-20 15:56:40 +09003683}
Mike Yuf14e1a92019-05-10 13:54:58 +08003684
3685TEST_F(ResolverTest, PrefixDiscoveryBypassTls) {
3686 constexpr char listen_addr[] = "::1";
3687 constexpr char cleartext_port[] = "53";
3688 constexpr char tls_port[] = "853";
3689 constexpr char dns64_name[] = "ipv4only.arpa.";
3690 const std::vector<std::string> servers = {listen_addr};
3691
3692 test::DNSResponder dns(listen_addr);
3693 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
3694 test::DnsTlsFrontend tls(listen_addr, tls_port, listen_addr, cleartext_port);
3695 ASSERT_TRUE(tls.startServer());
3696
3697 // Setup OPPORTUNISTIC mode and wait for the validation complete.
waynema0e73c2e2019-07-31 15:04:08 +08003698 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08003699 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003700 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yuf14e1a92019-05-10 13:54:58 +08003701 tls.clearQueries();
3702
3703 // Start NAT64 prefix discovery and wait for it complete.
3704 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003705 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
Mike Yuf14e1a92019-05-10 13:54:58 +08003706
3707 // Verify it bypassed TLS even though there's a TLS server available.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003708 EXPECT_EQ(0, tls.queries()) << dns.dumpQueries();
3709 EXPECT_EQ(1U, GetNumQueries(dns, dns64_name)) << dns.dumpQueries();
Mike Yuf14e1a92019-05-10 13:54:58 +08003710
3711 // Restart the testing network to reset the cache.
3712 mDnsClient.TearDown();
3713 mDnsClient.SetUp();
3714 dns.clearQueries();
3715
3716 // Setup STRICT mode and wait for the validation complete.
waynema0e73c2e2019-07-31 15:04:08 +08003717 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
3718 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08003719 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003720 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yuf14e1a92019-05-10 13:54:58 +08003721 tls.clearQueries();
3722
3723 // Start NAT64 prefix discovery and wait for it to complete.
3724 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003725 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
Mike Yuf14e1a92019-05-10 13:54:58 +08003726
3727 // Verify it bypassed TLS despite STRICT mode.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003728 EXPECT_EQ(0, tls.queries()) << dns.dumpQueries();
3729 EXPECT_EQ(1U, GetNumQueries(dns, dns64_name)) << dns.dumpQueries();
Mike Yuf14e1a92019-05-10 13:54:58 +08003730}
Luke Huang9807e6b2019-05-20 16:17:12 +08003731
Lorenzo Colittie51091d2020-05-20 02:48:44 +09003732TEST_F(ResolverTest, SetAndClearNat64Prefix) {
3733 constexpr char host_name[] = "v4.example.com.";
3734 constexpr char listen_addr[] = "::1";
3735 const std::vector<DnsRecord> records = {
3736 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3737 };
3738 const std::string kNat64Prefix1 = "64:ff9b::/96";
3739 const std::string kNat64Prefix2 = "2001:db8:6464::/96";
3740
3741 test::DNSResponder dns(listen_addr);
3742 StartDns(dns, records);
3743 const std::vector<std::string> servers = {listen_addr};
3744 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
3745
3746 auto resolvService = mDnsClient.resolvService();
3747 addrinfo hints = {.ai_family = AF_INET6};
3748
3749 // No NAT64 prefix, no AAAA record.
3750 ScopedAddrinfo result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3751 ASSERT_TRUE(result == nullptr);
3752
3753 // Set the prefix, and expect to get a synthesized AAAA record.
3754 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix2).isOk());
3755 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3756 ASSERT_FALSE(result == nullptr);
3757 EXPECT_EQ("2001:db8:6464::102:304", ToString(result));
3758
3759 // Update the prefix, expect to see AAAA records from the new prefix.
3760 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3761 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3762 ASSERT_FALSE(result == nullptr);
3763 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3764
3765 // Non-/96 prefixes are ignored.
3766 auto status = resolvService->setPrefix64(TEST_NETID, "64:ff9b::/64");
3767 EXPECT_FALSE(status.isOk());
3768 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3769 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3770
3771 // Invalid prefixes are ignored.
3772 status = resolvService->setPrefix64(TEST_NETID, "192.0.2.0/24");
3773 EXPECT_FALSE(status.isOk());
3774 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3775 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3776
3777 status = resolvService->setPrefix64(TEST_NETID, "192.0.2.1");
3778 EXPECT_FALSE(status.isOk());
3779 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3780 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3781
3782 status = resolvService->setPrefix64(TEST_NETID, "hello");
3783 EXPECT_FALSE(status.isOk());
3784 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3785 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3786
3787 // DNS64 synthesis is still working.
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 // Clear the prefix. No AAAA records any more.
3793 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, "").isOk());
3794 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3795 EXPECT_TRUE(result == nullptr);
3796
3797 // Calling startPrefix64Discovery clears the prefix.
3798 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3799 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3800 ASSERT_FALSE(result == nullptr);
3801 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3802
3803 EXPECT_TRUE(resolvService->startPrefix64Discovery(TEST_NETID).isOk());
3804 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3805 ASSERT_TRUE(result == nullptr);
3806
3807 // setPrefix64 fails if prefix discovery is started, even if no prefix is yet discovered...
3808 status = resolvService->setPrefix64(TEST_NETID, kNat64Prefix1);
3809 EXPECT_FALSE(status.isOk());
3810 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3811 EXPECT_EQ(EEXIST, status.getServiceSpecificError());
3812
3813 // .. and clearing the prefix also has no effect.
3814 status = resolvService->setPrefix64(TEST_NETID, "");
3815 EXPECT_FALSE(status.isOk());
3816 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3817 EXPECT_EQ(ENOENT, status.getServiceSpecificError());
3818
3819 // setPrefix64 succeeds again when prefix discovery is stopped.
3820 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
3821 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3822 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3823 ASSERT_FALSE(result == nullptr);
3824 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3825
3826 // Calling stopPrefix64Discovery clears the prefix.
3827 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
3828 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3829 ASSERT_TRUE(result == nullptr);
3830
3831 // Set up NAT64 prefix discovery.
3832 constexpr char dns64_name[] = "ipv4only.arpa.";
3833 const std::vector<DnsRecord> newRecords = {
3834 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3835 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3836 };
3837 dns.stopServer();
3838 StartDns(dns, newRecords);
3839
3840 EXPECT_TRUE(resolvService->startPrefix64Discovery(TEST_NETID).isOk());
3841 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
3842 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3843 ASSERT_FALSE(result == nullptr);
3844 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3845
3846 // setPrefix64 fails if NAT64 prefix discovery has succeeded, and the discovered prefix
3847 // continues to be used.
3848 status = resolvService->setPrefix64(TEST_NETID, kNat64Prefix2);
3849 EXPECT_FALSE(status.isOk());
3850 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3851 EXPECT_EQ(EEXIST, status.getServiceSpecificError());
3852
3853 // Clearing the prefix also has no effect if discovery is started.
3854 status = resolvService->setPrefix64(TEST_NETID, "");
3855 EXPECT_FALSE(status.isOk());
3856 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3857 EXPECT_EQ(ENOENT, status.getServiceSpecificError());
3858
3859 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3860 ASSERT_FALSE(result == nullptr);
3861 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3862
3863 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
3864 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_NOT_FOUND));
Lorenzo Colitti61f796b2020-05-21 00:57:49 +09003865
3866 EXPECT_EQ(0, sDnsMetricsListener->getUnexpectedNat64PrefixUpdates());
Lorenzo Colittie51091d2020-05-20 02:48:44 +09003867}
3868
Luke Huang9807e6b2019-05-20 16:17:12 +08003869namespace {
3870
Luke Huang0d592bc2019-05-25 18:24:03 +08003871class ScopedSetNetworkForProcess {
3872 public:
3873 explicit ScopedSetNetworkForProcess(unsigned netId) {
3874 mStoredNetId = getNetworkForProcess();
3875 if (netId == mStoredNetId) return;
3876 EXPECT_EQ(0, setNetworkForProcess(netId));
3877 }
3878 ~ScopedSetNetworkForProcess() { EXPECT_EQ(0, setNetworkForProcess(mStoredNetId)); }
3879
3880 private:
3881 unsigned mStoredNetId;
3882};
3883
3884class ScopedSetNetworkForResolv {
3885 public:
3886 explicit ScopedSetNetworkForResolv(unsigned netId) { EXPECT_EQ(0, setNetworkForResolv(netId)); }
3887 ~ScopedSetNetworkForResolv() { EXPECT_EQ(0, setNetworkForResolv(NETID_UNSET)); }
3888};
3889
Luke Huang9807e6b2019-05-20 16:17:12 +08003890void sendCommand(int fd, const std::string& cmd) {
3891 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size() + 1));
3892 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size() + 1));
3893}
3894
3895int32_t readBE32(int fd) {
3896 int32_t tmp;
3897 int n = TEMP_FAILURE_RETRY(read(fd, &tmp, sizeof(tmp)));
3898 EXPECT_TRUE(n > 0);
3899 return ntohl(tmp);
3900}
3901
Luke Huang0d592bc2019-05-25 18:24:03 +08003902int readResponseCode(int fd) {
Luke Huang9807e6b2019-05-20 16:17:12 +08003903 char buf[4];
3904 int n = TEMP_FAILURE_RETRY(read(fd, &buf, sizeof(buf)));
3905 EXPECT_TRUE(n > 0);
3906 // The format of response code is that 4 bytes for the code & null.
3907 buf[3] = '\0';
3908 int result;
3909 EXPECT_TRUE(ParseInt(buf, &result));
3910 return result;
3911}
3912
Luke Huang0d592bc2019-05-25 18:24:03 +08003913bool checkAndClearUseLocalNameserversFlag(unsigned* netid) {
3914 if (netid == nullptr || ((*netid) & NETID_USE_LOCAL_NAMESERVERS) == 0) {
3915 return false;
3916 }
3917 *netid = (*netid) & ~NETID_USE_LOCAL_NAMESERVERS;
3918 return true;
3919}
3920
Luke Huangf8215372019-11-22 11:53:41 +08003921aidl::android::net::UidRangeParcel makeUidRangeParcel(int start, int stop) {
3922 aidl::android::net::UidRangeParcel res;
Luke Huang0d592bc2019-05-25 18:24:03 +08003923 res.start = start;
3924 res.stop = stop;
3925
3926 return res;
3927}
3928
3929void expectNetIdWithLocalNameserversFlag(unsigned netId) {
3930 unsigned dnsNetId = 0;
3931 EXPECT_EQ(0, getNetworkForDns(&dnsNetId));
3932 EXPECT_TRUE(checkAndClearUseLocalNameserversFlag(&dnsNetId));
3933 EXPECT_EQ(netId, static_cast<unsigned>(dnsNetId));
3934}
3935
3936void expectDnsNetIdEquals(unsigned netId) {
3937 unsigned dnsNetId = 0;
3938 EXPECT_EQ(0, getNetworkForDns(&dnsNetId));
3939 EXPECT_EQ(netId, static_cast<unsigned>(dnsNetId));
3940}
3941
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003942void expectDnsNetIdIsDefaultNetwork(INetd* netdService) {
Luke Huang0d592bc2019-05-25 18:24:03 +08003943 int currentNetid;
3944 EXPECT_TRUE(netdService->networkGetDefault(&currentNetid).isOk());
3945 expectDnsNetIdEquals(currentNetid);
3946}
3947
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003948void expectDnsNetIdWithVpn(INetd* netdService, unsigned vpnNetId, unsigned expectedNetId) {
Luke Huang0d592bc2019-05-25 18:24:03 +08003949 EXPECT_TRUE(netdService->networkCreateVpn(vpnNetId, false /* secure */).isOk());
3950 uid_t uid = getuid();
3951 // Add uid to VPN
3952 EXPECT_TRUE(netdService->networkAddUidRanges(vpnNetId, {makeUidRangeParcel(uid, uid)}).isOk());
3953 expectDnsNetIdEquals(expectedNetId);
3954 EXPECT_TRUE(netdService->networkDestroy(vpnNetId).isOk());
3955}
3956
Luke Huang9807e6b2019-05-20 16:17:12 +08003957} // namespace
3958
3959TEST_F(ResolverTest, getDnsNetId) {
3960 // We've called setNetworkForProcess in SetupOemNetwork, so reset to default first.
3961 setNetworkForProcess(NETID_UNSET);
Luke Huang0d592bc2019-05-25 18:24:03 +08003962
3963 expectDnsNetIdIsDefaultNetwork(mDnsClient.netdService());
3964 expectDnsNetIdWithVpn(mDnsClient.netdService(), TEST_VPN_NETID, TEST_VPN_NETID);
Luke Huang9807e6b2019-05-20 16:17:12 +08003965
3966 // Test with setNetworkForProcess
Luke Huang0d592bc2019-05-25 18:24:03 +08003967 {
3968 ScopedSetNetworkForProcess scopedSetNetworkForProcess(TEST_NETID);
3969 expectDnsNetIdEquals(TEST_NETID);
3970 }
3971
3972 // Test with setNetworkForProcess with NETID_USE_LOCAL_NAMESERVERS
3973 {
3974 ScopedSetNetworkForProcess scopedSetNetworkForProcess(TEST_NETID |
3975 NETID_USE_LOCAL_NAMESERVERS);
3976 expectNetIdWithLocalNameserversFlag(TEST_NETID);
3977 }
Luke Huang9807e6b2019-05-20 16:17:12 +08003978
3979 // Test with setNetworkForResolv
Luke Huang0d592bc2019-05-25 18:24:03 +08003980 {
3981 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID);
3982 expectDnsNetIdEquals(TEST_NETID);
3983 }
3984
3985 // Test with setNetworkForResolv with NETID_USE_LOCAL_NAMESERVERS
3986 {
3987 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID |
3988 NETID_USE_LOCAL_NAMESERVERS);
3989 expectNetIdWithLocalNameserversFlag(TEST_NETID);
3990 }
3991
3992 // Test with setNetworkForResolv under bypassable vpn
3993 {
3994 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID);
3995 expectDnsNetIdWithVpn(mDnsClient.netdService(), TEST_VPN_NETID, TEST_NETID);
3996 }
Luke Huang9807e6b2019-05-20 16:17:12 +08003997
3998 // Create socket connected to DnsProxyListener
3999 int fd = dns_open_proxy();
4000 EXPECT_TRUE(fd > 0);
4001 unique_fd ufd(fd);
4002
4003 // Test command with wrong netId
4004 sendCommand(fd, "getdnsnetid abc");
Luke Huang0d592bc2019-05-25 18:24:03 +08004005 EXPECT_EQ(ResponseCode::DnsProxyQueryResult, readResponseCode(fd));
Luke Huang9807e6b2019-05-20 16:17:12 +08004006 EXPECT_EQ(-EINVAL, readBE32(fd));
4007
4008 // Test unsupported command
4009 sendCommand(fd, "getdnsnetidNotSupported");
4010 // Keep in sync with FrameworkListener.cpp (500, "Command not recognized")
Luke Huang0d592bc2019-05-25 18:24:03 +08004011 EXPECT_EQ(500, readResponseCode(fd));
Luke Huang9807e6b2019-05-20 16:17:12 +08004012}
Sehee Park2c118782019-05-07 13:02:45 +09004013
4014TEST_F(ResolverTest, BlockDnsQueryWithUidRule) {
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004015 // This test relies on blocking traffic on loopback, which xt_qtaguid does not do.
4016 // See aosp/358413 and b/34444781 for why.
4017 SKIP_IF_BPF_NOT_SUPPORTED;
4018
Sehee Park2c118782019-05-07 13:02:45 +09004019 constexpr char listen_addr1[] = "127.0.0.4";
4020 constexpr char listen_addr2[] = "::1";
4021 constexpr char host_name[] = "howdy.example.com.";
4022 const std::vector<DnsRecord> records = {
4023 {host_name, ns_type::ns_t_a, "1.2.3.4"},
4024 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
4025 };
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004026 INetd* netdService = mDnsClient.netdService();
Sehee Park2c118782019-05-07 13:02:45 +09004027
4028 test::DNSResponder dns1(listen_addr1);
4029 test::DNSResponder dns2(listen_addr2);
4030 StartDns(dns1, records);
4031 StartDns(dns2, records);
4032
4033 std::vector<std::string> servers = {listen_addr1, listen_addr2};
4034 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
4035 dns1.clearQueries();
4036 dns2.clearQueries();
4037
Luke Huangeb618ef2020-05-26 14:17:02 +08004038 ScopeBlockedUIDRule scopeBlockUidRule(netdService, TEST_UID);
Sehee Park2c118782019-05-07 13:02:45 +09004039 // Dns Query
4040 int fd1 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_a, 0);
4041 int fd2 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_aaaa, 0);
4042 EXPECT_TRUE(fd1 != -1);
4043 EXPECT_TRUE(fd2 != -1);
4044
4045 uint8_t buf[MAXPACKET] = {};
4046 int rcode;
4047 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
4048 EXPECT_EQ(-ECONNREFUSED, res);
4049
4050 memset(buf, 0, MAXPACKET);
4051 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
4052 EXPECT_EQ(-ECONNREFUSED, res);
Mike Yu532405f2020-06-17 17:46:44 +08004053
4054 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, EAI_SYSTEM, "howdy.example.com", {});
4055 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, EAI_SYSTEM, "howdy.example.com", {});
Sehee Park2c118782019-05-07 13:02:45 +09004056}
Mike Yua772c202019-09-23 17:47:21 +08004057
Mike Yu40e67072019-10-09 21:14:09 +08004058namespace {
4059
4060const std::string kDotConnectTimeoutMsFlag(
4061 "persist.device_config.netd_native.dot_connect_timeout_ms");
4062
4063class ScopedSystemProperties {
4064 public:
4065 explicit ScopedSystemProperties(const std::string& key, const std::string& value)
4066 : mStoredKey(key) {
4067 mStoredValue = android::base::GetProperty(key, "");
4068 android::base::SetProperty(key, value);
4069 }
4070 ~ScopedSystemProperties() { android::base::SetProperty(mStoredKey, mStoredValue); }
4071
4072 private:
4073 std::string mStoredKey;
4074 std::string mStoredValue;
4075};
4076
4077} // namespace
4078
Mike Yua772c202019-09-23 17:47:21 +08004079TEST_F(ResolverTest, ConnectTlsServerTimeout) {
Mike Yu40e67072019-10-09 21:14:09 +08004080 constexpr int expectedTimeout = 1000;
4081 constexpr char hostname1[] = "query1.example.com.";
4082 constexpr char hostname2[] = "query2.example.com.";
Mike Yua772c202019-09-23 17:47:21 +08004083 const std::vector<DnsRecord> records = {
Mike Yu40e67072019-10-09 21:14:09 +08004084 {hostname1, ns_type::ns_t_a, "1.2.3.4"},
4085 {hostname2, ns_type::ns_t_a, "1.2.3.5"},
Mike Yua772c202019-09-23 17:47:21 +08004086 };
4087
4088 test::DNSResponder dns;
4089 StartDns(dns, records);
Mike Yu40e67072019-10-09 21:14:09 +08004090 test::DnsTlsFrontend tls;
Mike Yua772c202019-09-23 17:47:21 +08004091 ASSERT_TRUE(tls.startServer());
4092
Mike Yu40e67072019-10-09 21:14:09 +08004093 // The resolver will adjust the timeout value to 1000ms since the value is too small.
4094 ScopedSystemProperties scopedSystemProperties(kDotConnectTimeoutMsFlag, "100");
Mike Yua772c202019-09-23 17:47:21 +08004095
Mike Yu40e67072019-10-09 21:14:09 +08004096 // Set up resolver to opportunistic mode with the default configuration.
Mike Yu8ac63402019-12-02 15:28:38 +08004097 const ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
Mike Yu40e67072019-10-09 21:14:09 +08004098 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
Mike Yua772c202019-09-23 17:47:21 +08004099 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09004100 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yua772c202019-09-23 17:47:21 +08004101 tls.clearQueries();
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09004102 dns.clearQueries();
Mike Yua772c202019-09-23 17:47:21 +08004103
4104 // The server becomes unresponsive to the handshake request.
4105 tls.setHangOnHandshakeForTesting(true);
4106
4107 // Expect the things happening in getaddrinfo():
4108 // 1. Connect to the private DNS server.
4109 // 2. SSL handshake times out.
4110 // 3. Fallback to UDP transport, and then get the answer.
Mike Yu40e67072019-10-09 21:14:09 +08004111 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4112 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(hostname1, nullptr, hints);
Mike Yua772c202019-09-23 17:47:21 +08004113
Mike Yu40e67072019-10-09 21:14:09 +08004114 EXPECT_NE(nullptr, result);
Mike Yua772c202019-09-23 17:47:21 +08004115 EXPECT_EQ(0, tls.queries());
Mike Yu40e67072019-10-09 21:14:09 +08004116 EXPECT_EQ(1U, GetNumQueries(dns, hostname1));
4117 EXPECT_EQ(records.at(0).addr, ToString(result));
Mike Yua772c202019-09-23 17:47:21 +08004118
Mike Yu40e67072019-10-09 21:14:09 +08004119 // A loose upper bound is set by adding 2000ms buffer time. Theoretically, getaddrinfo()
4120 // should just take a bit more than expetTimeout milliseconds.
4121 EXPECT_GE(timeTakenMs, expectedTimeout);
4122 EXPECT_LE(timeTakenMs, expectedTimeout + 2000);
4123
4124 // Set the server to be responsive. Verify that the resolver will attempt to reconnect
4125 // to the server and then get the result within the timeout.
4126 tls.setHangOnHandshakeForTesting(false);
4127 std::tie(result, timeTakenMs) = safe_getaddrinfo_time_taken(hostname2, nullptr, hints);
4128
4129 EXPECT_NE(nullptr, result);
Luke Huang0a0870d2020-02-12 20:41:10 +08004130 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yu40e67072019-10-09 21:14:09 +08004131 EXPECT_EQ(1U, GetNumQueries(dns, hostname2));
4132 EXPECT_EQ(records.at(1).addr, ToString(result));
4133
4134 EXPECT_LE(timeTakenMs, expectedTimeout);
Mike Yua772c202019-09-23 17:47:21 +08004135}
Hungming Chenbb90ab32019-10-28 18:20:31 +08004136
Ken Chen766feae2019-10-30 15:13:44 +08004137TEST_F(ResolverTest, FlushNetworkCache) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004138 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004139 test::DNSResponder dns;
4140 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4141 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4142
4143 const hostent* result = gethostbyname("hello");
4144 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4145
4146 // get result from cache
4147 result = gethostbyname("hello");
4148 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4149
4150 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4151
4152 result = gethostbyname("hello");
4153 EXPECT_EQ(2U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4154}
4155
4156TEST_F(ResolverTest, FlushNetworkCache_random) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004157 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004158 constexpr int num_flush = 10;
4159 constexpr int num_queries = 20;
4160 test::DNSResponder dns;
4161 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4162 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4163 const addrinfo hints = {.ai_family = AF_INET};
4164
4165 std::thread t([this]() {
4166 for (int i = 0; i < num_flush; ++i) {
4167 unsigned delay = arc4random_uniform(10 * 1000); // 10ms
4168 usleep(delay);
4169 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4170 }
4171 });
4172
4173 for (int i = 0; i < num_queries; ++i) {
4174 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4175 EXPECT_TRUE(result != nullptr);
4176 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4177 }
4178 t.join();
4179}
4180
4181// flush cache while one query is wait-for-response, another is pending.
4182TEST_F(ResolverTest, FlushNetworkCache_concurrent) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004183 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004184 const char* listen_addr1 = "127.0.0.9";
4185 const char* listen_addr2 = "127.0.0.10";
4186 test::DNSResponder dns1(listen_addr1);
4187 test::DNSResponder dns2(listen_addr2);
4188 StartDns(dns1, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4189 StartDns(dns2, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4190 addrinfo hints = {.ai_family = AF_INET};
4191
4192 // step 1: set server#1 into deferred responding mode
4193 dns1.setDeferredResp(true);
4194 std::thread t1([&listen_addr1, &hints, this]() {
4195 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr1}));
4196 // step 3: query
4197 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4198 // step 9: check result
4199 EXPECT_TRUE(result != nullptr);
4200 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4201 });
4202
4203 // step 2: wait for the query to reach the server
4204 while (GetNumQueries(dns1, kHelloExampleCom) == 0) {
4205 usleep(1000); // 1ms
4206 }
4207
4208 std::thread t2([&listen_addr2, &hints, &dns2, this]() {
4209 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr2}));
4210 // step 5: query (should be blocked in resolver)
4211 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4212 // step 7: check result
4213 EXPECT_TRUE(result != nullptr);
4214 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4215 EXPECT_EQ(1U, GetNumQueriesForType(dns2, ns_type::ns_t_a, kHelloExampleCom));
4216 });
4217
4218 // step 4: wait a bit for the 2nd query to enter pending state
4219 usleep(100 * 1000); // 100ms
4220 // step 6: flush cache (will unblock pending queries)
4221 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4222 t2.join();
4223
4224 // step 8: resume server#1
4225 dns1.setDeferredResp(false);
4226 t1.join();
4227
4228 // step 10: verify if result is correctly cached
4229 dns2.clearQueries();
4230 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4231 EXPECT_EQ(0U, GetNumQueries(dns2, kHelloExampleCom));
4232 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4233}
4234
waynema29253052019-08-20 11:26:08 +08004235// TODO: Perhaps to have a boundary conditions test for TCP and UDP.
4236TEST_F(ResolverTest, TcpQueryWithOversizePayload) {
4237 test::DNSResponder dns;
4238 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4239 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4240
4241 int fd = dns_open_proxy();
4242 ASSERT_TRUE(fd > 0);
4243
4244 // Sending DNS query over TCP once the packet sizes exceed 512 bytes.
4245 // The raw data is combined with Question section and Additional section
4246 // Question section : query "hello.example.com", type A, class IN
4247 // Additional section : type OPT (41), Option PADDING, Option Length 546
4248 // Padding option which allows DNS clients and servers to artificially
4249 // increase the size of a DNS message by a variable number of bytes.
4250 // See also RFC7830, section 3
4251 const std::string query =
4252 "+c0BAAABAAAAAAABBWhlbGxvB2V4YW1wbGUDY29tAAABAAEAACkgAAAAgAACJgAMAiIAAAAAAAAAAAAAAAAAA"
4253 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4254 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4255 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4256 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4257 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4258 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4259 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4260 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4261 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
4262 const std::string cmd =
4263 "resnsend " + std::to_string(TEST_NETID) + " 0 " /* ResNsendFlags */ + query + '\0';
4264 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
4265 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
4266 expectAnswersValid(fd, AF_INET, kHelloExampleComAddrV4);
4267 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom));
4268 EXPECT_EQ(0U, GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom));
4269}
4270
Ken Chen99344882020-01-01 14:59:38 +08004271TEST_F(ResolverTest, TruncatedRspMode) {
4272 constexpr char listen_addr[] = "127.0.0.4";
4273 constexpr char listen_addr2[] = "127.0.0.5";
4274 constexpr char listen_srv[] = "53";
4275
4276 test::DNSResponder dns(listen_addr, listen_srv, static_cast<ns_rcode>(-1));
4277 test::DNSResponder dns2(listen_addr2, listen_srv, static_cast<ns_rcode>(-1));
4278 // dns supports UDP only, dns2 support UDP and TCP
4279 dns.setResponseProbability(0.0, IPPROTO_TCP);
4280 StartDns(dns, kLargeCnameChainRecords);
4281 StartDns(dns2, kLargeCnameChainRecords);
4282
4283 const struct TestConfig {
4284 const std::optional<int32_t> tcMode;
4285 const bool ret;
4286 const unsigned numQueries;
4287 std::string asParameters() const {
4288 return StringPrintf("tcMode: %d, ret: %s, numQueries: %u", tcMode.value_or(-1),
4289 ret ? "true" : "false", numQueries);
4290 }
4291 } testConfigs[]{
4292 // clang-format off
4293 {std::nullopt, true, 0}, /* mode unset */
4294 {aidl::android::net::IDnsResolver::TC_MODE_DEFAULT, true, 0}, /* default mode */
4295 {aidl::android::net::IDnsResolver::TC_MODE_UDP_TCP, true, 1}, /* alternative mode */
4296 {-666, false, 1}, /* invalid input */
4297 // clang-format on
4298 };
4299
4300 for (const auto& config : testConfigs) {
4301 SCOPED_TRACE(config.asParameters());
4302
4303 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4304 parcel.servers = {listen_addr, listen_addr2};
4305 if (config.tcMode) {
Ken Chena6ac2a62020-04-07 17:25:56 +08004306 parcel.resolverOptions.tcMode = config.tcMode.value();
Ken Chen99344882020-01-01 14:59:38 +08004307 }
4308 ASSERT_EQ(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk(), config.ret);
4309
4310 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4311 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4312 ASSERT_TRUE(result != nullptr);
4313 EXPECT_EQ(ToString(result), kHelloExampleComAddrV4);
4314 // TC_MODE_DEFAULT: resolver retries on TCP-only on each name server.
4315 // TC_MODE_UDP_TCP: resolver retries on TCP on the same server, falls back to UDP from next.
4316 ASSERT_EQ(GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom), 1U);
4317 ASSERT_EQ(GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom), 1U);
4318 ASSERT_EQ(GetNumQueriesForProtocol(dns2, IPPROTO_UDP, kHelloExampleCom), config.numQueries);
4319 ASSERT_EQ(GetNumQueriesForProtocol(dns2, IPPROTO_TCP, kHelloExampleCom), 1U);
4320
4321 dns.clearQueries();
4322 dns2.clearQueries();
4323 ASSERT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4324 }
4325}
4326
Mike Yu153b5b82020-03-04 19:53:54 +08004327TEST_F(ResolverTest, RepeatedSetup_ResolverStatusRemains) {
4328 constexpr char unusable_listen_addr[] = "127.0.0.3";
4329 constexpr char listen_addr[] = "127.0.0.4";
4330 constexpr char hostname[] = "a.hello.query.";
4331 const auto repeatedSetResolversFromParcel = [&](const ResolverParamsParcel& parcel) {
4332 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4333 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4334 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4335 };
4336
4337 test::DNSResponder dns(listen_addr);
4338 StartDns(dns, {{hostname, ns_type::ns_t_a, "1.2.3.3"}});
4339 test::DnsTlsFrontend tls1(listen_addr, "853", listen_addr, "53");
4340 ASSERT_TRUE(tls1.startServer());
4341
4342 // Private DNS off mode.
4343 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4344 parcel.servers = {unusable_listen_addr, listen_addr};
4345 parcel.tlsServers.clear();
4346 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4347
4348 // Send a query.
4349 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4350 EXPECT_NE(safe_getaddrinfo(hostname, nullptr, &hints), nullptr);
4351
4352 // Check the stats as expected.
4353 const std::vector<NameserverStats> expectedCleartextDnsStats = {
4354 NameserverStats(unusable_listen_addr).setInternalErrors(1),
4355 NameserverStats(listen_addr).setSuccesses(1),
4356 };
4357 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
4358 EXPECT_EQ(GetNumQueries(dns, hostname), 1U);
4359
4360 // The stats is supposed to remain as long as the list of cleartext DNS servers is unchanged.
4361 static const struct TestConfig {
4362 std::vector<std::string> servers;
4363 std::vector<std::string> tlsServers;
4364 std::string tlsName;
4365 } testConfigs[] = {
4366 // Private DNS opportunistic mode.
4367 {{listen_addr, unusable_listen_addr}, {listen_addr, unusable_listen_addr}, ""},
4368 {{unusable_listen_addr, listen_addr}, {unusable_listen_addr, listen_addr}, ""},
4369
4370 // Private DNS strict mode.
4371 {{listen_addr, unusable_listen_addr}, {"127.0.0.100"}, kDefaultPrivateDnsHostName},
4372 {{unusable_listen_addr, listen_addr}, {"127.0.0.100"}, kDefaultPrivateDnsHostName},
4373
4374 // Private DNS off mode.
4375 {{unusable_listen_addr, listen_addr}, {}, ""},
4376 {{listen_addr, unusable_listen_addr}, {}, ""},
4377 };
4378
4379 for (const auto& config : testConfigs) {
4380 SCOPED_TRACE(fmt::format("testConfig: [{}] [{}] [{}]", fmt::join(config.servers, ","),
4381 fmt::join(config.tlsServers, ","), config.tlsName));
4382 parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4383 parcel.servers = config.servers;
4384 parcel.tlsServers = config.tlsServers;
4385 parcel.tlsName = config.tlsName;
4386 repeatedSetResolversFromParcel(parcel);
4387 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
4388
4389 // The stats remains when the list of search domains changes.
4390 parcel.domains.push_back("tmp.domains");
4391 repeatedSetResolversFromParcel(parcel);
4392 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
4393
4394 // The stats remains when the parameters change (except maxSamples).
4395 parcel.sampleValiditySeconds++;
4396 parcel.successThreshold++;
4397 parcel.minSamples++;
4398 parcel.baseTimeoutMsec++;
4399 parcel.retryCount++;
4400 repeatedSetResolversFromParcel(parcel);
4401 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
4402 }
4403
4404 // The cache remains.
4405 EXPECT_NE(safe_getaddrinfo(hostname, nullptr, &hints), nullptr);
4406 EXPECT_EQ(GetNumQueries(dns, hostname), 1U);
4407}
4408
4409TEST_F(ResolverTest, RepeatedSetup_NoRedundantPrivateDnsValidation) {
4410 const std::string addr1 = getUniqueIPv4Address(); // For a workable DNS server.
4411 const std::string addr2 = getUniqueIPv4Address(); // For an unresponsive DNS server.
4412 const std::string unusable_addr = getUniqueIPv4Address();
Mike Yubc4b9502020-03-20 13:14:00 +08004413 const auto waitForPrivateDnsStateUpdated = []() {
4414 // A buffer time for the PrivateDnsConfiguration instance to update its map,
4415 // mPrivateDnsValidateThreads, which is used for tracking validation threads.
4416 // Since there is a time gap between when PrivateDnsConfiguration reports
4417 // onPrivateDnsValidationEvent and when PrivateDnsConfiguration updates the map, this is a
4418 // workaround to avoid the test starts a subsequent resolver setup during the time gap.
4419 // TODO: Report onPrivateDnsValidationEvent after all the relevant updates are complete.
4420 // Reference to b/152009023.
4421 std::this_thread::sleep_for(20ms);
4422 };
Mike Yu153b5b82020-03-04 19:53:54 +08004423
4424 test::DNSResponder dns1(addr1);
4425 test::DNSResponder dns2(addr2);
4426 StartDns(dns1, {});
4427 StartDns(dns2, {});
4428 test::DnsTlsFrontend workableTls(addr1, "853", addr1, "53");
4429 test::DnsTlsFrontend unresponsiveTls(addr2, "853", addr2, "53");
4430 unresponsiveTls.setHangOnHandshakeForTesting(true);
4431 ASSERT_TRUE(workableTls.startServer());
4432 ASSERT_TRUE(unresponsiveTls.startServer());
4433
4434 // First setup.
4435 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4436 parcel.servers = {addr1, addr2, unusable_addr};
4437 parcel.tlsServers = {addr1, addr2, unusable_addr};
4438 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4439
4440 // Check the validation results.
4441 EXPECT_TRUE(WaitForPrivateDnsValidation(workableTls.listen_address(), true));
4442 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4443 EXPECT_EQ(unresponsiveTls.acceptConnectionsCount(), 1); // The validation is still in progress.
4444
4445 static const struct TestConfig {
4446 std::vector<std::string> tlsServers;
4447 std::string tlsName;
4448 } testConfigs[] = {
4449 {{addr1, addr2, unusable_addr}, ""},
4450 {{unusable_addr, addr1, addr2}, ""},
4451 {{unusable_addr, addr1, addr2}, kDefaultPrivateDnsHostName},
4452 {{addr1, addr2, unusable_addr}, kDefaultPrivateDnsHostName},
4453 };
4454
4455 std::string TlsNameLastTime;
4456 for (const auto& config : testConfigs) {
4457 SCOPED_TRACE(fmt::format("testConfig: [{}] [{}]", fmt::join(config.tlsServers, ","),
4458 config.tlsName));
4459 parcel.servers = config.tlsServers;
4460 parcel.tlsServers = config.tlsServers;
4461 parcel.tlsName = config.tlsName;
4462 parcel.caCertificate = config.tlsName.empty() ? "" : kCaCert;
4463
4464 const bool dnsModeChanged = (TlsNameLastTime != config.tlsName);
Mike Yubc4b9502020-03-20 13:14:00 +08004465
4466 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004467 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4468
4469 for (const auto& serverAddr : parcel.tlsServers) {
4470 SCOPED_TRACE(serverAddr);
4471 if (serverAddr == workableTls.listen_address()) {
4472 if (dnsModeChanged) {
4473 // In despite of the identical IP address, the server is regarded as a different
4474 // server when DnsTlsServer.name is different. The resolver treats it as a
4475 // different object and begins the validation process.
4476 EXPECT_TRUE(WaitForPrivateDnsValidation(serverAddr, true));
4477 }
4478 } else if (serverAddr == unresponsiveTls.listen_address()) {
4479 // No revalidation needed for the server which have been marked as in_progesss.
4480 } else {
4481 // Must be unusable_addr.
4482 // In opportunistic mode, when a validation for a private DNS server fails, the
4483 // resolver just marks the server as failed and doesn't re-evaluate it, but the
4484 // server can be re-evaluated when setResolverConfiguration() is called.
4485 // However, in strict mode, the resolver automatically re-evaluates the server and
4486 // marks the server as in_progress until the validation succeeds, so repeated setup
4487 // makes no effect.
4488 if (dnsModeChanged || config.tlsName.empty() /* not in strict mode */) {
4489 EXPECT_TRUE(WaitForPrivateDnsValidation(serverAddr, false));
4490 }
4491 }
4492 }
4493
4494 // Repeated setups make no effect in strict mode.
Mike Yubc4b9502020-03-20 13:14:00 +08004495 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004496 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4497 if (config.tlsName.empty()) {
4498 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4499 }
Mike Yubc4b9502020-03-20 13:14:00 +08004500 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004501 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4502 if (config.tlsName.empty()) {
4503 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4504 }
4505
4506 EXPECT_EQ(unresponsiveTls.acceptConnectionsCount(), 1);
4507
4508 TlsNameLastTime = config.tlsName;
4509 }
4510
4511 // Check that all the validation results are caught.
4512 // Note: it doesn't mean no validation being in progress.
4513 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr1));
4514 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr2));
4515 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(unusable_addr));
4516}
4517
4518TEST_F(ResolverTest, RepeatedSetup_KeepChangingPrivateDnsServers) {
4519 enum TlsServerState { WORKING, UNSUPPORTED, UNRESPONSIVE };
4520 const std::string addr1 = getUniqueIPv4Address();
4521 const std::string addr2 = getUniqueIPv4Address();
Mike Yu9a185882020-03-25 16:02:36 +08004522 const auto waitForPrivateDnsStateUpdated = []() {
4523 // A buffer time for PrivateDnsConfiguration to update its state. It prevents this test
4524 // being flaky. See b/152009023 for the reason.
4525 std::this_thread::sleep_for(20ms);
4526 };
Mike Yu153b5b82020-03-04 19:53:54 +08004527
4528 test::DNSResponder dns1(addr1);
4529 test::DNSResponder dns2(addr2);
4530 StartDns(dns1, {});
4531 StartDns(dns2, {});
4532 test::DnsTlsFrontend tls1(addr1, "853", addr1, "53");
4533 test::DnsTlsFrontend tls2(addr2, "853", addr2, "53");
4534 ASSERT_TRUE(tls1.startServer());
4535 ASSERT_TRUE(tls2.startServer());
4536
4537 static const struct TestConfig {
4538 std::string tlsServer;
4539 std::string tlsName;
4540 bool expectNothingHappenWhenServerUnsupported;
4541 bool expectNothingHappenWhenServerUnresponsive;
4542 std::string asTestName() const {
4543 return fmt::format("{}, {}, {}, {}", tlsServer, tlsName,
4544 expectNothingHappenWhenServerUnsupported,
4545 expectNothingHappenWhenServerUnresponsive);
4546 }
4547 } testConfigs[] = {
4548 {{addr1}, "", false, false},
4549 {{addr2}, "", false, false},
4550 {{addr1}, "", false, true},
4551 {{addr2}, "", false, true},
4552 {{addr1}, kDefaultPrivateDnsHostName, false, true},
4553 {{addr2}, kDefaultPrivateDnsHostName, false, true},
4554 {{addr1}, kDefaultPrivateDnsHostName, true, true},
4555 {{addr2}, kDefaultPrivateDnsHostName, true, true},
4556
4557 // There's no new validation to start because there are already two validation threads
4558 // running (one is for addr1, the other is for addr2). This is because the comparator
4559 // doesn't compare DnsTlsServer.name. Keep the design as-is until it's known to be
4560 // harmful.
4561 {{addr1}, "", true, true},
4562 {{addr2}, "", true, true},
4563 {{addr1}, "", true, true},
4564 {{addr2}, "", true, true},
4565 };
4566
4567 for (const auto& serverState : {WORKING, UNSUPPORTED, UNRESPONSIVE}) {
4568 int testIndex = 0;
4569 for (const auto& config : testConfigs) {
4570 SCOPED_TRACE(fmt::format("serverState:{} testIndex:{} testConfig:[{}]", serverState,
4571 testIndex++, config.asTestName()));
4572 auto& tls = (config.tlsServer == addr1) ? tls1 : tls2;
4573
4574 if (serverState == UNSUPPORTED && tls.running()) ASSERT_TRUE(tls.stopServer());
4575 if (serverState != UNSUPPORTED && !tls.running()) ASSERT_TRUE(tls.startServer());
4576
4577 tls.setHangOnHandshakeForTesting(serverState == UNRESPONSIVE);
4578 const int connectCountsBefore = tls.acceptConnectionsCount();
4579
Mike Yu9a185882020-03-25 16:02:36 +08004580 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004581 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4582 parcel.servers = {config.tlsServer};
4583 parcel.tlsServers = {config.tlsServer};
4584 parcel.tlsName = config.tlsName;
4585 parcel.caCertificate = config.tlsName.empty() ? "" : kCaCert;
4586 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4587
4588 if (serverState == WORKING) {
4589 EXPECT_TRUE(WaitForPrivateDnsValidation(config.tlsServer, true));
4590 } else if (serverState == UNSUPPORTED) {
4591 if (config.expectNothingHappenWhenServerUnsupported) {
4592 // It's possible that the resolver hasn't yet started to
4593 // connect. Wait a while.
4594 // TODO: See if we can get rid of the hard waiting time, such as comparing
4595 // the CountDiff across two tests.
4596 std::this_thread::sleep_for(100ms);
4597 EXPECT_EQ(tls.acceptConnectionsCount(), connectCountsBefore);
4598 } else {
4599 EXPECT_TRUE(WaitForPrivateDnsValidation(config.tlsServer, false));
4600 }
4601 } else {
4602 // Must be UNRESPONSIVE.
4603 // DnsTlsFrontend is the only signal for checking whether or not the resolver starts
4604 // another validation when the server is unresponsive.
4605 const int expectCountDiff =
4606 config.expectNothingHappenWhenServerUnresponsive ? 0 : 1;
4607 if (expectCountDiff == 0) {
4608 // It's possible that the resolver hasn't yet started to
4609 // connect. Wait a while.
4610 std::this_thread::sleep_for(100ms);
4611 }
4612 const auto condition = [&]() {
4613 return tls.acceptConnectionsCount() == connectCountsBefore + expectCountDiff;
4614 };
4615 EXPECT_TRUE(PollForCondition(condition));
4616 }
4617 }
4618
4619 // Set to off mode to reset the PrivateDnsConfiguration state.
4620 ResolverParamsParcel setupOffmode = DnsResponderClient::GetDefaultResolverParamsParcel();
4621 setupOffmode.tlsServers.clear();
4622 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(setupOffmode));
4623 }
4624
4625 // Check that all the validation results are caught.
4626 // Note: it doesn't mean no validation being in progress.
4627 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr1));
4628 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr2));
4629}
4630
Ken Chen26dc2b02020-06-16 18:49:39 +08004631TEST_F(ResolverTest, PermissionCheckOnCertificateInjection) {
4632 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4633 parcel.caCertificate = kCaCert;
4634 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk());
4635
4636 for (const uid_t uid : {AID_SYSTEM, TEST_UID}) {
4637 ScopedChangeUID scopedChangeUID(uid);
4638 auto status = mDnsClient.resolvService()->setResolverConfiguration(parcel);
4639 EXPECT_EQ(status.getExceptionCode(), EX_SECURITY);
4640 }
4641}
4642
Hungming Chenbb90ab32019-10-28 18:20:31 +08004643// Parameterized tests.
4644// TODO: Merge the existing tests as parameterized test if possible.
4645// TODO: Perhaps move parameterized tests to an independent file.
4646enum class CallType { GETADDRINFO, GETHOSTBYNAME };
4647class ResolverParameterizedTest : public ResolverTest,
Hungming Chen63779052019-10-30 15:06:13 +08004648 public testing::WithParamInterface<CallType> {
4649 protected:
Hungming Chen22617fd2019-12-06 12:15:45 +08004650 void VerifyQueryHelloExampleComV4(const test::DNSResponder& dns, const CallType calltype,
4651 const bool verifyNumQueries = true) {
Hungming Chen63779052019-10-30 15:06:13 +08004652 if (calltype == CallType::GETADDRINFO) {
4653 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4654 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4655 ASSERT_TRUE(result != nullptr);
4656 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4657 } else if (calltype == CallType::GETHOSTBYNAME) {
4658 const hostent* result = gethostbyname("hello");
4659 ASSERT_TRUE(result != nullptr);
4660 ASSERT_EQ(4, result->h_length);
4661 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
4662 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4663 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
4664 } else {
4665 FAIL() << "Unsupported call type: " << static_cast<uint32_t>(calltype);
4666 }
Hungming Chen22617fd2019-12-06 12:15:45 +08004667 if (verifyNumQueries) EXPECT_EQ(1U, GetNumQueries(dns, kHelloExampleCom));
Hungming Chen63779052019-10-30 15:06:13 +08004668 }
4669};
Hungming Chenbb90ab32019-10-28 18:20:31 +08004670
Hungming Chen63779052019-10-30 15:06:13 +08004671INSTANTIATE_TEST_SUITE_P(QueryCallTest, ResolverParameterizedTest,
Hungming Chenbb90ab32019-10-28 18:20:31 +08004672 testing::Values(CallType::GETADDRINFO, CallType::GETHOSTBYNAME),
4673 [](const testing::TestParamInfo<CallType>& info) {
Hungming Chenbb90ab32019-10-28 18:20:31 +08004674 switch (info.param) {
4675 case CallType::GETADDRINFO:
Hungming Chen63779052019-10-30 15:06:13 +08004676 return "GetAddrInfo";
Hungming Chenbb90ab32019-10-28 18:20:31 +08004677 case CallType::GETHOSTBYNAME:
Hungming Chen63779052019-10-30 15:06:13 +08004678 return "GetHostByName";
Hungming Chenbb90ab32019-10-28 18:20:31 +08004679 default:
Hungming Chen63779052019-10-30 15:06:13 +08004680 return "InvalidParameter"; // Should not happen.
Hungming Chenbb90ab32019-10-28 18:20:31 +08004681 }
Hungming Chenbb90ab32019-10-28 18:20:31 +08004682 });
4683
4684TEST_P(ResolverParameterizedTest, AuthoritySectionAndAdditionalSection) {
4685 // DNS response may have more information in authority section and additional section.
4686 // Currently, getanswer() of packages/modules/DnsResolver/getaddrinfo.cpp doesn't parse the
4687 // content of authority section and additional section. Test these sections if they crash
4688 // the resolver, just in case. See also RFC 1035 section 4.1.
4689 const auto& calltype = GetParam();
4690 test::DNSHeader header(kDefaultDnsHeader);
4691
4692 // Create a DNS response which has a authoritative nameserver record in authority
4693 // section and its relevant address record in additional section.
4694 //
4695 // Question
4696 // hello.example.com. IN A
4697 // Answer
4698 // hello.example.com. IN A 1.2.3.4
4699 // Authority:
4700 // hello.example.com. IN NS ns1.example.com.
4701 // Additional:
4702 // ns1.example.com. IN A 5.6.7.8
4703 //
4704 // A response may have only question, answer, and authority section. Current testing response
4705 // should be able to cover this condition.
4706
4707 // Question section.
4708 test::DNSQuestion question{
4709 .qname = {.name = kHelloExampleCom},
4710 .qtype = ns_type::ns_t_a,
4711 .qclass = ns_c_in,
4712 };
4713 header.questions.push_back(std::move(question));
4714
4715 // Answer section.
4716 test::DNSRecord recordAnswer{
4717 .name = {.name = kHelloExampleCom},
4718 .rtype = ns_type::ns_t_a,
4719 .rclass = ns_c_in,
4720 .ttl = 0, // no cache
4721 };
Hungming Chen63779052019-10-30 15:06:13 +08004722 EXPECT_TRUE(test::DNSResponder::fillRdata(kHelloExampleComAddrV4, recordAnswer));
Hungming Chenbb90ab32019-10-28 18:20:31 +08004723 header.answers.push_back(std::move(recordAnswer));
4724
4725 // Authority section.
4726 test::DNSRecord recordAuthority{
4727 .name = {.name = kHelloExampleCom},
4728 .rtype = ns_type::ns_t_ns,
4729 .rclass = ns_c_in,
4730 .ttl = 0, // no cache
4731 };
4732 EXPECT_TRUE(test::DNSResponder::fillRdata("ns1.example.com.", recordAuthority));
4733 header.authorities.push_back(std::move(recordAuthority));
4734
4735 // Additional section.
4736 test::DNSRecord recordAdditional{
4737 .name = {.name = "ns1.example.com."},
4738 .rtype = ns_type::ns_t_a,
4739 .rclass = ns_c_in,
4740 .ttl = 0, // no cache
4741 };
4742 EXPECT_TRUE(test::DNSResponder::fillRdata("5.6.7.8", recordAdditional));
4743 header.additionals.push_back(std::move(recordAdditional));
4744
4745 // Start DNS server.
4746 test::DNSResponder dns(test::DNSResponder::MappingType::DNS_HEADER);
4747 dns.addMappingDnsHeader(kHelloExampleCom, ns_type::ns_t_a, header);
4748 ASSERT_TRUE(dns.startServer());
4749 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4750 dns.clearQueries();
4751
4752 // Expect that get the address and the resolver doesn't crash.
Hungming Chen63779052019-10-30 15:06:13 +08004753 VerifyQueryHelloExampleComV4(dns, calltype);
4754}
4755
4756TEST_P(ResolverParameterizedTest, MessageCompression) {
4757 const auto& calltype = GetParam();
4758
4759 // The response with compressed domain name by a pointer. See RFC 1035 section 4.1.4.
4760 //
4761 // Ignoring the other fields of the message, the domain name of question section and answer
4762 // section are presented as:
4763 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4764 // 12 | 5 | h |
4765 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4766 // 14 | e | l |
4767 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4768 // 16 | l | o |
4769 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4770 // 18 | 7 | e |
4771 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4772 // 20 | x | a |
4773 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4774 // 22 | m | p |
4775 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4776 // 24 | l | e |
4777 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4778 // 26 | 3 | c |
4779 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4780 // 28 | o | m |
4781 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4782 // 30 | 0 | ... |
4783 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4784 //
4785 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4786 // 35 | 1 1| 12 |
4787 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4788 const std::vector<uint8_t> kResponseAPointer = {
4789 /* Header */
4790 0x00, 0x00, /* Transaction ID: 0x0000 */
4791 0x81, 0x80, /* Flags: qr rd ra */
4792 0x00, 0x01, /* Questions: 1 */
4793 0x00, 0x01, /* Answer RRs: 1 */
4794 0x00, 0x00, /* Authority RRs: 0 */
4795 0x00, 0x00, /* Additional RRs: 0 */
4796 /* Queries */
4797 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
4798 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name: hello.example.com */
4799 0x00, 0x01, /* Type: A */
4800 0x00, 0x01, /* Class: IN */
4801 /* Answers */
4802 0xc0, 0x0c, /* Name: hello.example.com (a pointer) */
4803 0x00, 0x01, /* Type: A */
4804 0x00, 0x01, /* Class: IN */
4805 0x00, 0x00, 0x00, 0x00, /* Time to live: 0 */
4806 0x00, 0x04, /* Data length: 4 */
4807 0x01, 0x02, 0x03, 0x04 /* Address: 1.2.3.4 */
4808 };
4809
4810 // The response with compressed domain name by a sequence of labels ending with a pointer. See
4811 // RFC 1035 section 4.1.4.
4812 //
4813 // Ignoring the other fields of the message, the domain name of question section and answer
4814 // section are presented as:
4815 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4816 // 12 | 5 | h |
4817 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4818 // 14 | e | l |
4819 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4820 // 16 | l | o |
4821 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4822 // 18 | 7 | e |
4823 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4824 // 20 | x | a |
4825 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4826 // 22 | m | p |
4827 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4828 // 24 | l | e |
4829 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4830 // 26 | 3 | c |
4831 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4832 // 28 | o | m |
4833 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4834 // 30 | 0 | ... |
4835 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4836 //
4837 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4838 // 35 | 5 | h |
4839 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4840 // 37 | e | l |
4841 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4842 // 39 | l | o |
4843 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4844 // 41 | 1 1| 18 |
4845 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4846 const std::vector<uint8_t> kResponseLabelEndingWithAPointer = {
4847 /* Header */
4848 0x00, 0x00, /* Transaction ID: 0x0000 */
4849 0x81, 0x80, /* Flags: qr rd ra */
4850 0x00, 0x01, /* Questions: 1 */
4851 0x00, 0x01, /* Answer RRs: 1 */
4852 0x00, 0x00, /* Authority RRs: 0 */
4853 0x00, 0x00, /* Additional RRs: 0 */
4854 /* Queries */
4855 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
4856 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name: hello.example.com */
4857 0x00, 0x01, /* Type: A */
4858 0x00, 0x01, /* Class: IN */
4859 /* Answers */
4860 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0xc0,
4861 0x12, /* Name: hello.example.com (a label ending with a pointer) */
4862 0x00, 0x01, /* Type: A */
4863 0x00, 0x01, /* Class: IN */
4864 0x00, 0x00, 0x00, 0x00, /* Time to live: 0 */
4865 0x00, 0x04, /* Data length: 4 */
4866 0x01, 0x02, 0x03, 0x04 /* Address: 1.2.3.4 */
4867 };
4868
4869 for (const auto& response : {kResponseAPointer, kResponseLabelEndingWithAPointer}) {
4870 SCOPED_TRACE(StringPrintf("Hex dump: %s", toHex(makeSlice(response)).c_str()));
4871
4872 test::DNSResponder dns(test::DNSResponder::MappingType::BINARY_PACKET);
4873 dns.addMappingBinaryPacket(kHelloExampleComQueryV4, response);
4874 StartDns(dns, {});
4875 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4876
4877 // Expect no cache because the TTL of testing responses are 0.
4878 VerifyQueryHelloExampleComV4(dns, calltype);
Hungming Chenbb90ab32019-10-28 18:20:31 +08004879 }
Mike Yu40e67072019-10-09 21:14:09 +08004880}
Hungming Chen22617fd2019-12-06 12:15:45 +08004881
4882TEST_P(ResolverParameterizedTest, TruncatedResponse) {
4883 const auto& calltype = GetParam();
4884
Hungming Chen22617fd2019-12-06 12:15:45 +08004885 test::DNSResponder dns;
Ken Chen99344882020-01-01 14:59:38 +08004886 StartDns(dns, kLargeCnameChainRecords);
Hungming Chen22617fd2019-12-06 12:15:45 +08004887 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4888
4889 // Expect UDP response is truncated. The resolver retries over TCP. See RFC 1035 section 4.2.1.
4890 VerifyQueryHelloExampleComV4(dns, calltype, false);
4891 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom));
4892 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom));
4893}
Luke Huang420ee622019-11-27 17:52:44 +08004894
4895TEST_F(ResolverTest, KeepListeningUDP) {
4896 constexpr char listen_addr1[] = "127.0.0.4";
4897 constexpr char listen_addr2[] = "127.0.0.5";
4898 constexpr char host_name[] = "howdy.example.com.";
4899 const std::vector<DnsRecord> records = {
4900 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
4901 };
4902 const std::vector<int> params = {300, 25, 8, 8, 1000 /* BASE_TIMEOUT_MSEC */,
4903 1 /* retry count */};
4904 const int delayTimeMs = 1500;
4905
4906 test::DNSResponder neverRespondDns(listen_addr2, "53", static_cast<ns_rcode>(-1));
4907 neverRespondDns.setResponseProbability(0.0);
4908 StartDns(neverRespondDns, records);
Luke Huangf40df9c2020-04-21 08:51:48 +08004909 ScopedSystemProperties scopedSystemProperties(
4910 "persist.device_config.netd_native.keep_listening_udp", "1");
4911 // Re-setup test network to make experiment flag take effect.
4912 resetNetwork();
Luke Huang420ee622019-11-27 17:52:44 +08004913
4914 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr1, listen_addr2},
4915 kDefaultSearchDomains, params));
4916 // There are 2 DNS servers for this test.
4917 // |delayedDns| will be blocked for |delayTimeMs|, then start to respond to requests.
4918 // |neverRespondDns| will never respond.
4919 // In the first try, resolver will send query to |delayedDns| but get timeout error
4920 // because |delayTimeMs| > DNS timeout.
4921 // Then it's the second try, resolver will send query to |neverRespondDns| and
4922 // listen on both servers. Resolver will receive the answer coming from |delayedDns|.
Luke Huang420ee622019-11-27 17:52:44 +08004923
Luke Huang420ee622019-11-27 17:52:44 +08004924 test::DNSResponder delayedDns(listen_addr1);
4925 delayedDns.setResponseDelayMs(delayTimeMs);
4926 StartDns(delayedDns, records);
4927
4928 // Specify hints to ensure resolver doing query only 1 round.
4929 const addrinfo hints = {.ai_family = AF_INET6, .ai_socktype = SOCK_DGRAM};
4930 ScopedAddrinfo result = safe_getaddrinfo(host_name, nullptr, &hints);
4931 EXPECT_TRUE(result != nullptr);
4932
4933 std::string result_str = ToString(result);
4934 EXPECT_TRUE(result_str == "::1.2.3.4") << ", result_str='" << result_str << "'";
4935}
Luke Huang0a0870d2020-02-12 20:41:10 +08004936
4937TEST_F(ResolverTest, GetAddrInfoParallelLookupTimeout) {
4938 constexpr char listen_addr[] = "127.0.0.4";
4939 constexpr char host_name[] = "howdy.example.com.";
4940 constexpr int TIMING_TOLERANCE_MS = 200;
4941 constexpr int DNS_TIMEOUT_MS = 1000;
4942 const std::vector<DnsRecord> records = {
4943 {host_name, ns_type::ns_t_a, "1.2.3.4"},
4944 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
4945 };
4946 const std::vector<int> params = {300, 25, 8, 8, DNS_TIMEOUT_MS /* BASE_TIMEOUT_MSEC */,
4947 1 /* retry count */};
4948 test::DNSResponder neverRespondDns(listen_addr, "53", static_cast<ns_rcode>(-1));
4949 neverRespondDns.setResponseProbability(0.0);
4950 StartDns(neverRespondDns, records);
Luke Huangf40df9c2020-04-21 08:51:48 +08004951 ScopedSystemProperties scopedSystemProperties(
4952 "persist.device_config.netd_native.parallel_lookup", "1");
Luke Huangd1d734f2020-04-30 12:25:40 +08004953 // The default value of parallel_lookup_sleep_time should be very small
4954 // that we can ignore in this test case.
Luke Huangf40df9c2020-04-21 08:51:48 +08004955 // Re-setup test network to make experiment flag take effect.
4956 resetNetwork();
Luke Huang0a0870d2020-02-12 20:41:10 +08004957
4958 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}, kDefaultSearchDomains, params));
4959 neverRespondDns.clearQueries();
4960
Luke Huang0a0870d2020-02-12 20:41:10 +08004961 // Use a never respond DNS server to verify if the A/AAAA queries are sent in parallel.
4962 // The resolver parameters are set to timeout 1s and retry 1 times.
4963 // So we expect the safe_getaddrinfo_time_taken() might take ~1s to
4964 // return when parallel lookup is enabled. And the DNS server should receive 2 queries.
4965 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_DGRAM};
4966 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(host_name, nullptr, hints);
4967
4968 EXPECT_TRUE(result == nullptr);
4969 EXPECT_NEAR(DNS_TIMEOUT_MS, timeTakenMs, TIMING_TOLERANCE_MS)
4970 << "took time should approximate equal timeout";
4971 EXPECT_EQ(2U, GetNumQueries(neverRespondDns, host_name));
Mike Yu532405f2020-06-17 17:46:44 +08004972 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, RCODE_TIMEOUT, host_name, {});
Luke Huang0a0870d2020-02-12 20:41:10 +08004973}
Luke Huangd1d734f2020-04-30 12:25:40 +08004974
4975TEST_F(ResolverTest, GetAddrInfoParallelLookupSleepTime) {
4976 constexpr char listen_addr[] = "127.0.0.4";
4977 constexpr int TIMING_TOLERANCE_MS = 200;
4978 const std::vector<DnsRecord> records = {
4979 {kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4},
4980 {kHelloExampleCom, ns_type::ns_t_aaaa, kHelloExampleComAddrV6},
4981 };
4982 const std::vector<int> params = {300, 25, 8, 8, 1000 /* BASE_TIMEOUT_MSEC */,
4983 1 /* retry count */};
4984 test::DNSResponder dns(listen_addr);
4985 StartDns(dns, records);
4986 ScopedSystemProperties scopedSystemProperties1(
4987 "persist.device_config.netd_native.parallel_lookup", "1");
4988 constexpr int PARALLEL_LOOKUP_SLEEP_TIME_MS = 500;
4989 ScopedSystemProperties scopedSystemProperties2(
4990 "persist.device_config.netd_native.parallel_lookup_sleep_time",
4991 std::to_string(PARALLEL_LOOKUP_SLEEP_TIME_MS));
4992 // Re-setup test network to make experiment flag take effect.
4993 resetNetwork();
4994
4995 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}, kDefaultSearchDomains, params));
4996 dns.clearQueries();
4997
4998 // Expect the safe_getaddrinfo_time_taken() might take ~500ms to return because we set
4999 // parallel_lookup_sleep_time to 500ms.
5000 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_DGRAM};
5001 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(kHelloExampleCom, nullptr, hints);
5002
5003 EXPECT_NE(nullptr, result);
5004 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(
5005 {kHelloExampleComAddrV4, kHelloExampleComAddrV6}));
5006 EXPECT_NEAR(PARALLEL_LOOKUP_SLEEP_TIME_MS, timeTakenMs, TIMING_TOLERANCE_MS)
5007 << "took time should approximate equal timeout";
5008 EXPECT_EQ(2U, GetNumQueries(dns, kHelloExampleCom));
5009
5010 // Expect the PARALLEL_LOOKUP_SLEEP_TIME_MS won't affect the query under cache hit case.
5011 dns.clearQueries();
5012 std::tie(result, timeTakenMs) = safe_getaddrinfo_time_taken(kHelloExampleCom, nullptr, hints);
5013 EXPECT_NE(nullptr, result);
5014 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(
5015 {kHelloExampleComAddrV4, kHelloExampleComAddrV6}));
5016 EXPECT_GT(PARALLEL_LOOKUP_SLEEP_TIME_MS, timeTakenMs);
5017 EXPECT_EQ(0U, GetNumQueries(dns, kHelloExampleCom));
5018}
Luke Huangeb618ef2020-05-26 14:17:02 +08005019
5020TEST_F(ResolverTest, BlockDnsQueryUidDoesNotLeadToBadServer) {
5021 // This test relies on blocking traffic on loopback, which xt_qtaguid does not do.
5022 // See aosp/358413 and b/34444781 for why.
5023 SKIP_IF_BPF_NOT_SUPPORTED;
5024
5025 constexpr char listen_addr1[] = "127.0.0.4";
5026 constexpr char listen_addr2[] = "::1";
5027 test::DNSResponder dns1(listen_addr1);
5028 test::DNSResponder dns2(listen_addr2);
5029 StartDns(dns1, {});
5030 StartDns(dns2, {});
5031
5032 std::vector<std::string> servers = {listen_addr1, listen_addr2};
5033 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
5034 dns1.clearQueries();
5035 dns2.clearQueries();
5036 {
5037 ScopeBlockedUIDRule scopeBlockUidRule(mDnsClient.netdService(), TEST_UID);
5038 // Start querying ten times.
5039 for (int i = 0; i < 10; i++) {
5040 std::string hostName = fmt::format("blocked{}.com", i);
5041 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
5042 EXPECT_EQ(safe_getaddrinfo(hostName.c_str(), nullptr, &hints), nullptr);
5043 }
5044 }
5045 // Since all query packets are blocked, we should not see any stats of them.
5046 const std::vector<NameserverStats> expectedEmptyDnsStats = {
5047 NameserverStats(listen_addr1),
5048 NameserverStats(listen_addr2),
5049 };
5050 expectStatsFromGetResolverInfo(expectedEmptyDnsStats);
5051 EXPECT_EQ(dns1.queries().size(), 0U);
5052 EXPECT_EQ(dns2.queries().size(), 0U);
5053}