blob: 27778858686ffbc7e7d2628253a187cd49a3d3b3 [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())};
240 const auto dnsEvent = sDnsMetricsListener->popDnsEvent();
241 ASSERT_TRUE(dnsEvent.has_value());
242 EXPECT_EQ(dnsEvent.value(), expect);
243 }
244
Mike Yue2162e52020-03-04 18:43:46 +0800245 bool expectStatsFromGetResolverInfo(const std::vector<NameserverStats>& nameserversStats) {
246 std::vector<std::string> res_servers;
247 std::vector<std::string> res_domains;
248 std::vector<std::string> res_tls_servers;
249 res_params res_params;
250 std::vector<ResolverStats> res_stats;
251 int wait_for_pending_req_timeout_count;
252
253 if (!DnsResponderClient::GetResolverInfo(mDnsClient.resolvService(), TEST_NETID,
254 &res_servers, &res_domains, &res_tls_servers,
255 &res_params, &res_stats,
256 &wait_for_pending_req_timeout_count)) {
257 ADD_FAILURE() << "GetResolverInfo failed";
258 return false;
259 }
260
261 if (res_servers.size() != res_stats.size()) {
262 ADD_FAILURE() << fmt::format("res_servers.size() != res_stats.size(): {} != {}",
263 res_servers.size(), res_stats.size());
264 return false;
265 }
266 if (res_servers.size() != nameserversStats.size()) {
267 ADD_FAILURE() << fmt::format("res_servers.size() != nameserversStats.size(): {} != {}",
268 res_servers.size(), nameserversStats.size());
269 return false;
270 }
271
272 for (const auto& stats : nameserversStats) {
273 SCOPED_TRACE(stats.server);
274 const auto it = std::find(res_servers.begin(), res_servers.end(), stats.server);
275 if (it == res_servers.end()) {
276 ADD_FAILURE() << fmt::format("nameserver {} not found in the list {{{}}}",
277 stats.server, fmt::join(res_servers, ", "));
278 return false;
279 }
280 const int index = std::distance(res_servers.begin(), it);
281
282 // The check excludes rtt_avg, last_sample_time, and usable since they will be obsolete
283 // after |res_stats| is retrieved from NetConfig.dnsStats rather than NetConfig.nsstats.
284 EXPECT_EQ(res_stats[index].successes, stats.successes);
285 EXPECT_EQ(res_stats[index].errors, stats.errors);
286 EXPECT_EQ(res_stats[index].timeouts, stats.timeouts);
287 EXPECT_EQ(res_stats[index].internal_errors, stats.internal_errors);
288 }
289
290 return true;
291 }
292
Mike Yu153b5b82020-03-04 19:53:54 +0800293 // Since there's no way to terminate private DNS validation threads at any time. Tests that
294 // focus on the results of private DNS validation can interfere with each other if they use the
295 // same IP address for test servers. getUniqueIPv4Address() is a workaround to reduce the
296 // possibility of tests being flaky. A feasible solution is to forbid the validation threads,
297 // which are considered as outdated (e.g. switch the resolver to private DNS OFF mode), updating
298 // the result to the PrivateDnsConfiguration instance.
299 static std::string getUniqueIPv4Address() {
300 static int counter = 0;
301 return fmt::format("127.0.100.{}", (++counter & 0xff));
302 }
303
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900304 DnsResponderClient mDnsClient;
Xiao Ma09b71022018-12-11 17:56:32 +0900305
Hungming Chen5bf09772019-04-25 11:16:13 +0800306 // Use a shared static DNS listener for all tests to avoid registering lots of listeners
307 // which may be released late until process terminated. Currently, registered DNS listener
308 // is removed by binder death notification which is fired when the process hosting an
309 // IBinder has gone away. If every test in ResolverTest registers its DNS listener, Netd
310 // may temporarily hold lots of dead listeners until the unit test process terminates.
311 // TODO: Perhaps add an unregistering listener binder call or fork a listener process which
312 // could be terminated earlier.
Luke Huangf8215372019-11-22 11:53:41 +0800313 static std::shared_ptr<DnsMetricsListener>
Hungming Chen473c4de2020-03-12 11:13:35 +0800314 sDnsMetricsListener; // Initialized in SetUpTestSuite.
Hungming Chen5bf09772019-04-25 11:16:13 +0800315
316 // Use a shared static death recipient to monitor the service death. The static death
317 // recipient could monitor the death not only during the test but also between tests.
Hungming Chen473c4de2020-03-12 11:13:35 +0800318 static AIBinder_DeathRecipient* sResolvDeathRecipient; // Initialized in SetUpTestSuite.
Ken Chenb9fa2062018-11-13 21:51:13 +0800319};
320
Hungming Chen5bf09772019-04-25 11:16:13 +0800321// Initialize static member of class.
Luke Huangf8215372019-11-22 11:53:41 +0800322std::shared_ptr<DnsMetricsListener> ResolverTest::sDnsMetricsListener;
323AIBinder_DeathRecipient* ResolverTest::sResolvDeathRecipient;
Hungming Chen5bf09772019-04-25 11:16:13 +0800324
Ken Chenb9fa2062018-11-13 21:51:13 +0800325TEST_F(ResolverTest, GetHostByName) {
Xiao Ma09b71022018-12-11 17:56:32 +0900326 constexpr char nonexistent_host_name[] = "nonexistent.example.com.";
327
328 test::DNSResponder dns;
329 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.3"}});
330 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800331
332 const hostent* result;
Ken Chenb9fa2062018-11-13 21:51:13 +0800333 result = gethostbyname("nonexistent");
334 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, nonexistent_host_name));
335 ASSERT_TRUE(result == nullptr);
336 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
337
338 dns.clearQueries();
339 result = gethostbyname("hello");
Xiao Ma09b71022018-12-11 17:56:32 +0900340 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
Ken Chenb9fa2062018-11-13 21:51:13 +0800341 ASSERT_FALSE(result == nullptr);
342 ASSERT_EQ(4, result->h_length);
343 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
344 EXPECT_EQ("1.2.3.3", ToString(result));
345 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800346}
347
lifr4e4a2e02019-01-29 16:53:51 +0800348TEST_F(ResolverTest, GetHostByName_cnames) {
349 constexpr char host_name[] = "host.example.com.";
350 size_t cnamecount = 0;
351 test::DNSResponder dns;
352
353 const std::vector<DnsRecord> records = {
354 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
355 {"a.example.com.", ns_type::ns_t_cname, "b.example.com."},
356 {"b.example.com.", ns_type::ns_t_cname, "c.example.com."},
357 {"c.example.com.", ns_type::ns_t_cname, "d.example.com."},
358 {"d.example.com.", ns_type::ns_t_cname, "e.example.com."},
359 {"e.example.com.", ns_type::ns_t_cname, host_name},
360 {host_name, ns_type::ns_t_a, "1.2.3.3"},
361 {host_name, ns_type::ns_t_aaaa, "2001:db8::42"},
362 };
363 StartDns(dns, records);
364 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
365
366 // using gethostbyname2() to resolve ipv4 hello.example.com. to 1.2.3.3
367 // Ensure the v4 address and cnames are correct
368 const hostent* result;
369 result = gethostbyname2("hello", AF_INET);
370 ASSERT_FALSE(result == nullptr);
371
372 for (int i = 0; result != nullptr && result->h_aliases[i] != nullptr; i++) {
373 std::string domain_name = records[i].host_name.substr(0, records[i].host_name.size() - 1);
374 EXPECT_EQ(result->h_aliases[i], domain_name);
375 cnamecount++;
376 }
377 // The size of "Non-cname type" record in DNS records is 2
378 ASSERT_EQ(cnamecount, records.size() - 2);
379 ASSERT_EQ(4, result->h_length);
380 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
381 EXPECT_EQ("1.2.3.3", ToString(result));
382 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
383 EXPECT_EQ(1U, dns.queries().size()) << dns.dumpQueries();
384
385 // using gethostbyname2() to resolve ipv6 hello.example.com. to 2001:db8::42
386 // Ensure the v6 address and cnames are correct
387 cnamecount = 0;
388 dns.clearQueries();
389 result = gethostbyname2("hello", AF_INET6);
390 for (unsigned i = 0; result != nullptr && result->h_aliases[i] != nullptr; i++) {
391 std::string domain_name = records[i].host_name.substr(0, records[i].host_name.size() - 1);
392 EXPECT_EQ(result->h_aliases[i], domain_name);
393 cnamecount++;
394 }
395 // The size of "Non-cname type" DNS record in records is 2
396 ASSERT_EQ(cnamecount, records.size() - 2);
397 ASSERT_FALSE(result == nullptr);
398 ASSERT_EQ(16, result->h_length);
399 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
400 EXPECT_EQ("2001:db8::42", ToString(result));
401 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
402}
403
404TEST_F(ResolverTest, GetHostByName_cnamesInfiniteLoop) {
405 test::DNSResponder dns;
406 const std::vector<DnsRecord> records = {
407 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
408 {"a.example.com.", ns_type::ns_t_cname, kHelloExampleCom},
409 };
410 StartDns(dns, records);
411 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
412
413 const hostent* result;
414 result = gethostbyname2("hello", AF_INET);
415 ASSERT_TRUE(result == nullptr);
416
417 dns.clearQueries();
418 result = gethostbyname2("hello", AF_INET6);
419 ASSERT_TRUE(result == nullptr);
420}
421
Ken Chenb9fa2062018-11-13 21:51:13 +0800422TEST_F(ResolverTest, GetHostByName_localhost) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800423 constexpr char name_camelcase[] = "LocalHost";
Ken Chenb9fa2062018-11-13 21:51:13 +0800424 constexpr char name_ip6_dot[] = "ip6-localhost.";
425 constexpr char name_ip6_fqdn[] = "ip6-localhost.example.com.";
426
427 // Add a dummy nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900428 test::DNSResponder dns;
429 StartDns(dns, {});
430 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800431
432 // Expect no DNS queries; localhost is resolved via /etc/hosts
Xiao Ma09b71022018-12-11 17:56:32 +0900433 const hostent* result = gethostbyname(kLocalHost);
Ken Chenb9fa2062018-11-13 21:51:13 +0800434 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
435 ASSERT_FALSE(result == nullptr);
436 ASSERT_EQ(4, result->h_length);
437 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900438 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800439 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
440
441 // Ensure the hosts file resolver ignores case of hostnames
442 result = gethostbyname(name_camelcase);
443 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
444 ASSERT_FALSE(result == nullptr);
445 ASSERT_EQ(4, result->h_length);
446 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900447 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800448 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
449
450 // The hosts file also contains ip6-localhost, but gethostbyname() won't
chenbruce018fdb22019-06-12 18:08:04 +0800451 // return it. This would be easy to
Ken Chenb9fa2062018-11-13 21:51:13 +0800452 // change, but there's no point in changing the legacy behavior; new code
453 // should be calling getaddrinfo() anyway.
454 // So we check the legacy behavior, which results in amusing A-record
455 // lookups for ip6-localhost, with and without search domains appended.
456 dns.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900457 result = gethostbyname(kIp6LocalHost);
Sehee Parkbbca0202018-11-16 10:53:16 +0900458 EXPECT_EQ(2U, dns.queries().size()) << dns.dumpQueries();
459 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, name_ip6_dot)) << dns.dumpQueries();
460 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, name_ip6_fqdn)) << dns.dumpQueries();
Ken Chenb9fa2062018-11-13 21:51:13 +0800461 ASSERT_TRUE(result == nullptr);
462
463 // Finally, use gethostbyname2() to resolve ip6-localhost to ::1 from
464 // the hosts file.
465 dns.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900466 result = gethostbyname2(kIp6LocalHost, AF_INET6);
Ken Chenb9fa2062018-11-13 21:51:13 +0800467 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
468 ASSERT_FALSE(result == nullptr);
469 ASSERT_EQ(16, result->h_length);
470 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900471 EXPECT_EQ(kIp6LocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800472 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800473}
474
475TEST_F(ResolverTest, GetHostByName_numeric) {
476 // Add a dummy nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900477 test::DNSResponder dns;
478 StartDns(dns, {});
479 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800480
481 // Numeric v4 address: expect no DNS queries
482 constexpr char numeric_v4[] = "192.168.0.1";
Ken Chenb9fa2062018-11-13 21:51:13 +0800483 const hostent* result = gethostbyname(numeric_v4);
Sehee Parkbbca0202018-11-16 10:53:16 +0900484 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800485 ASSERT_FALSE(result == nullptr);
486 ASSERT_EQ(4, result->h_length); // v4
487 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
488 EXPECT_EQ(numeric_v4, ToString(result));
489 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
490
491 // gethostbyname() recognizes a v6 address, and fails with no DNS queries
492 constexpr char numeric_v6[] = "2001:db8::42";
493 dns.clearQueries();
494 result = gethostbyname(numeric_v6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900495 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800496 EXPECT_TRUE(result == nullptr);
497
498 // Numeric v6 address with gethostbyname2(): succeeds with no DNS queries
499 dns.clearQueries();
500 result = gethostbyname2(numeric_v6, AF_INET6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900501 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800502 ASSERT_FALSE(result == nullptr);
503 ASSERT_EQ(16, result->h_length); // v6
504 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
505 EXPECT_EQ(numeric_v6, ToString(result));
506 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
507
508 // Numeric v6 address with scope work with getaddrinfo(),
509 // but gethostbyname2() does not understand them; it issues two dns
510 // queries, then fails. This hardly ever happens, there's no point
511 // in fixing this. This test simply verifies the current (bogus)
512 // behavior to avoid further regressions (like crashes, or leaks).
513 constexpr char numeric_v6_scope[] = "fe80::1%lo";
514 dns.clearQueries();
515 result = gethostbyname2(numeric_v6_scope, AF_INET6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900516 EXPECT_EQ(2U, dns.queries().size()); // OUCH!
Ken Chenb9fa2062018-11-13 21:51:13 +0800517 ASSERT_TRUE(result == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800518}
519
520TEST_F(ResolverTest, BinderSerialization) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800521 std::vector<int> params_offsets = {
Luke Huang5bd827c2019-03-14 16:10:04 +0800522 IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY,
523 IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD,
524 IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES,
525 IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES,
526 IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC,
527 IDnsResolver::RESOLVER_PARAMS_RETRY_COUNT,
Ken Chenb9fa2062018-11-13 21:51:13 +0800528 };
Bernie Innocentib102dd22018-12-04 14:57:48 +0900529 const int size = static_cast<int>(params_offsets.size());
Luke Huang5bd827c2019-03-14 16:10:04 +0800530 EXPECT_EQ(size, IDnsResolver::RESOLVER_PARAMS_COUNT);
Ken Chenb9fa2062018-11-13 21:51:13 +0800531 std::sort(params_offsets.begin(), params_offsets.end());
Bernie Innocentib102dd22018-12-04 14:57:48 +0900532 for (int i = 0; i < size; ++i) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800533 EXPECT_EQ(params_offsets[i], i);
534 }
535}
536
537TEST_F(ResolverTest, GetHostByName_Binder) {
Luke Huangf8215372019-11-22 11:53:41 +0800538 std::vector<std::string> domains = {"example.com"};
Ken Chenb9fa2062018-11-13 21:51:13 +0800539 std::vector<std::unique_ptr<test::DNSResponder>> dns;
540 std::vector<std::string> servers;
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900541 std::vector<DnsResponderClient::Mapping> mappings;
542 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupMappings(1, domains, &mappings));
543 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupDNSServers(4, mappings, &dns, &servers));
Ken Chenb9fa2062018-11-13 21:51:13 +0800544 ASSERT_EQ(1U, mappings.size());
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900545 const DnsResponderClient::Mapping& mapping = mappings[0];
Ken Chenb9fa2062018-11-13 21:51:13 +0800546
Xiao Ma09b71022018-12-11 17:56:32 +0900547 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains, kDefaultParams));
Ken Chenb9fa2062018-11-13 21:51:13 +0800548
549 const hostent* result = gethostbyname(mapping.host.c_str());
Bernie Innocentib102dd22018-12-04 14:57:48 +0900550 const size_t total_queries =
Luke Huangfde82482019-06-04 01:04:53 +0800551 std::accumulate(dns.begin(), dns.end(), 0, [&mapping](size_t total, auto& d) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800552 return total + GetNumQueriesForType(*d, ns_type::ns_t_a, mapping.entry.c_str());
553 });
554
555 EXPECT_LE(1U, total_queries);
556 ASSERT_FALSE(result == nullptr);
557 ASSERT_EQ(4, result->h_length);
558 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
559 EXPECT_EQ(mapping.ip4, ToString(result));
560 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
561
562 std::vector<std::string> res_servers;
563 std::vector<std::string> res_domains;
Mike Yu0a1c53d2018-11-26 13:26:21 +0900564 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +0900565 res_params res_params;
Ken Chenb9fa2062018-11-13 21:51:13 +0800566 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +0800567 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +0800568 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
569 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
570 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chenb9fa2062018-11-13 21:51:13 +0800571 EXPECT_EQ(servers.size(), res_servers.size());
572 EXPECT_EQ(domains.size(), res_domains.size());
Mike Yu0a1c53d2018-11-26 13:26:21 +0900573 EXPECT_EQ(0U, res_tls_servers.size());
Luke Huang5bd827c2019-03-14 16:10:04 +0800574 ASSERT_EQ(static_cast<size_t>(IDnsResolver::RESOLVER_PARAMS_COUNT), kDefaultParams.size());
575 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY],
576 res_params.sample_validity);
577 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900578 res_params.success_threshold);
Luke Huang5bd827c2019-03-14 16:10:04 +0800579 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
580 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
581 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
Ken Chenb9fa2062018-11-13 21:51:13 +0800582 res_params.base_timeout_msec);
583 EXPECT_EQ(servers.size(), res_stats.size());
584
Bernie Innocenti0c067e42019-04-01 15:33:16 +0900585 EXPECT_THAT(res_servers, testing::UnorderedElementsAreArray(servers));
586 EXPECT_THAT(res_domains, testing::UnorderedElementsAreArray(domains));
Ken Chenb9fa2062018-11-13 21:51:13 +0800587}
588
589TEST_F(ResolverTest, GetAddrInfo) {
Xiao Ma09b71022018-12-11 17:56:32 +0900590 constexpr char listen_addr[] = "127.0.0.4";
591 constexpr char listen_addr2[] = "127.0.0.5";
592 constexpr char host_name[] = "howdy.example.com.";
Ken Chenb9fa2062018-11-13 21:51:13 +0800593
Xiao Ma09b71022018-12-11 17:56:32 +0900594 const std::vector<DnsRecord> records = {
595 {host_name, ns_type::ns_t_a, "1.2.3.4"},
596 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
597 };
598 test::DNSResponder dns(listen_addr);
599 test::DNSResponder dns2(listen_addr2);
600 StartDns(dns, records);
601 StartDns(dns2, records);
Ken Chenb9fa2062018-11-13 21:51:13 +0800602
Xiao Ma09b71022018-12-11 17:56:32 +0900603 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}));
Ken Chenb9fa2062018-11-13 21:51:13 +0800604 dns.clearQueries();
605 dns2.clearQueries();
606
607 ScopedAddrinfo result = safe_getaddrinfo("howdy", nullptr, nullptr);
608 EXPECT_TRUE(result != nullptr);
609 size_t found = GetNumQueries(dns, host_name);
610 EXPECT_LE(1U, found);
611 // Could be A or AAAA
612 std::string result_str = ToString(result);
613 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +0800614 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +0800615
616 // Verify that the name is cached.
617 size_t old_found = found;
618 result = safe_getaddrinfo("howdy", nullptr, nullptr);
619 EXPECT_TRUE(result != nullptr);
620 found = GetNumQueries(dns, host_name);
621 EXPECT_LE(1U, found);
622 EXPECT_EQ(old_found, found);
623 result_str = ToString(result);
Luke Huangf8215372019-11-22 11:53:41 +0800624 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4") << result_str;
Ken Chenb9fa2062018-11-13 21:51:13 +0800625
626 // Change the DNS resolver, ensure that queries are still cached.
Xiao Ma09b71022018-12-11 17:56:32 +0900627 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr2}));
Ken Chenb9fa2062018-11-13 21:51:13 +0800628 dns.clearQueries();
629 dns2.clearQueries();
630
631 result = safe_getaddrinfo("howdy", nullptr, nullptr);
632 EXPECT_TRUE(result != nullptr);
633 found = GetNumQueries(dns, host_name);
634 size_t found2 = GetNumQueries(dns2, host_name);
635 EXPECT_EQ(0U, found);
636 EXPECT_LE(0U, found2);
637
638 // Could be A or AAAA
639 result_str = ToString(result);
640 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +0800641 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +0800642}
643
644TEST_F(ResolverTest, GetAddrInfoV4) {
Xiao Ma09b71022018-12-11 17:56:32 +0900645 test::DNSResponder dns;
646 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.5"}});
647 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800648
Xiao Ma09b71022018-12-11 17:56:32 +0900649 const addrinfo hints = {.ai_family = AF_INET};
650 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
Ken Chenb9fa2062018-11-13 21:51:13 +0800651 EXPECT_TRUE(result != nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900652 EXPECT_EQ(1U, GetNumQueries(dns, kHelloExampleCom));
Ken Chenb9fa2062018-11-13 21:51:13 +0800653 EXPECT_EQ("1.2.3.5", ToString(result));
654}
655
656TEST_F(ResolverTest, GetAddrInfo_localhost) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800657 // Add a dummy nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900658 test::DNSResponder dns;
659 StartDns(dns, {});
660 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800661
Xiao Ma09b71022018-12-11 17:56:32 +0900662 ScopedAddrinfo result = safe_getaddrinfo(kLocalHost, nullptr, nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800663 EXPECT_TRUE(result != nullptr);
664 // Expect no DNS queries; localhost is resolved via /etc/hosts
665 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900666 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800667
Xiao Ma09b71022018-12-11 17:56:32 +0900668 result = safe_getaddrinfo(kIp6LocalHost, nullptr, nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800669 EXPECT_TRUE(result != nullptr);
670 // Expect no DNS queries; ip6-localhost is resolved via /etc/hosts
671 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900672 EXPECT_EQ(kIp6LocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800673}
674
Luke Huangd8ac4752019-06-18 17:05:47 +0800675TEST_F(ResolverTest, GetAddrInfo_InvalidSocketType) {
676 test::DNSResponder dns;
677 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.5"}});
678 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
679
680 // TODO: Test other invalid socket types.
681 const addrinfo hints = {
682 .ai_family = AF_UNSPEC,
Luke Huangd8ac4752019-06-18 17:05:47 +0800683 .ai_socktype = SOCK_PACKET,
684 };
685 addrinfo* result = nullptr;
686 // This is a valid hint, but the query won't be sent because the socket type is
687 // not supported.
688 EXPECT_EQ(EAI_NODATA, getaddrinfo("hello", nullptr, &hints, &result));
689 ScopedAddrinfo result_cleanup(result);
690 EXPECT_EQ(nullptr, result);
691}
692
Ken Chen92bed612018-12-22 21:46:55 +0800693// Verify if the resolver correctly handle multiple queries simultaneously
694// step 1: set dns server#1 into deferred responding mode.
695// step 2: thread#1 query "hello.example.com." --> resolver send query to server#1.
696// step 3: thread#2 query "hello.example.com." --> resolver hold the request and wait for
697// response of previous pending query sent by thread#1.
698// step 4: thread#3 query "konbanha.example.com." --> resolver send query to server#3. Server
699// respond to resolver immediately.
700// step 5: check if server#1 get 1 query by thread#1, server#2 get 0 query, server#3 get 1 query.
701// step 6: resume dns server#1 to respond dns query in step#2.
702// step 7: thread#1 and #2 should get returned from DNS query after step#6. Also, check the
703// number of queries in server#2 is 0 to ensure thread#2 does not wake up unexpectedly
704// before signaled by thread#1.
705TEST_F(ResolverTest, GetAddrInfoV4_deferred_resp) {
706 const char* listen_addr1 = "127.0.0.9";
707 const char* listen_addr2 = "127.0.0.10";
708 const char* listen_addr3 = "127.0.0.11";
709 const char* listen_srv = "53";
710 const char* host_name_deferred = "hello.example.com.";
711 const char* host_name_normal = "konbanha.example.com.";
Mike Yufc125e42019-05-15 20:41:28 +0800712 test::DNSResponder dns1(listen_addr1, listen_srv, ns_rcode::ns_r_servfail);
713 test::DNSResponder dns2(listen_addr2, listen_srv, ns_rcode::ns_r_servfail);
714 test::DNSResponder dns3(listen_addr3, listen_srv, ns_rcode::ns_r_servfail);
Ken Chen92bed612018-12-22 21:46:55 +0800715 dns1.addMapping(host_name_deferred, ns_type::ns_t_a, "1.2.3.4");
716 dns2.addMapping(host_name_deferred, ns_type::ns_t_a, "1.2.3.4");
717 dns3.addMapping(host_name_normal, ns_type::ns_t_a, "1.2.3.5");
718 ASSERT_TRUE(dns1.startServer());
719 ASSERT_TRUE(dns2.startServer());
720 ASSERT_TRUE(dns3.startServer());
721 const std::vector<std::string> servers_for_t1 = {listen_addr1};
722 const std::vector<std::string> servers_for_t2 = {listen_addr2};
723 const std::vector<std::string> servers_for_t3 = {listen_addr3};
724 addrinfo hints = {.ai_family = AF_INET};
725 const std::vector<int> params = {300, 25, 8, 8, 5000};
726 bool t3_task_done = false;
727
728 dns1.setDeferredResp(true);
729 std::thread t1([&, this]() {
730 ASSERT_TRUE(
731 mDnsClient.SetResolversForNetwork(servers_for_t1, kDefaultSearchDomains, params));
732 ScopedAddrinfo result = safe_getaddrinfo(host_name_deferred, nullptr, &hints);
733 // t3's dns query should got returned first
734 EXPECT_TRUE(t3_task_done);
735 EXPECT_EQ(1U, GetNumQueries(dns1, host_name_deferred));
736 EXPECT_TRUE(result != nullptr);
737 EXPECT_EQ("1.2.3.4", ToString(result));
738 });
739
740 // ensuring t1 and t2 handler functions are processed in order
741 usleep(100 * 1000);
742 std::thread t2([&, this]() {
743 ASSERT_TRUE(
744 mDnsClient.SetResolversForNetwork(servers_for_t2, kDefaultSearchDomains, params));
745 ScopedAddrinfo result = safe_getaddrinfo(host_name_deferred, nullptr, &hints);
746 EXPECT_TRUE(t3_task_done);
747 EXPECT_EQ(0U, GetNumQueries(dns2, host_name_deferred));
748 EXPECT_TRUE(result != nullptr);
749 EXPECT_EQ("1.2.3.4", ToString(result));
750
751 std::vector<std::string> res_servers;
752 std::vector<std::string> res_domains;
753 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +0900754 res_params res_params;
Ken Chen92bed612018-12-22 21:46:55 +0800755 std::vector<ResolverStats> res_stats;
756 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +0800757 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
758 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains,
759 &res_tls_servers, &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chen92bed612018-12-22 21:46:55 +0800760 EXPECT_EQ(0, wait_for_pending_req_timeout_count);
761 });
762
763 // ensuring t2 and t3 handler functions are processed in order
764 usleep(100 * 1000);
765 std::thread t3([&, this]() {
766 ASSERT_TRUE(
767 mDnsClient.SetResolversForNetwork(servers_for_t3, kDefaultSearchDomains, params));
768 ScopedAddrinfo result = safe_getaddrinfo(host_name_normal, nullptr, &hints);
769 EXPECT_EQ(1U, GetNumQueries(dns1, host_name_deferred));
770 EXPECT_EQ(0U, GetNumQueries(dns2, host_name_deferred));
771 EXPECT_EQ(1U, GetNumQueries(dns3, host_name_normal));
772 EXPECT_TRUE(result != nullptr);
773 EXPECT_EQ("1.2.3.5", ToString(result));
774
775 t3_task_done = true;
776 dns1.setDeferredResp(false);
777 });
778 t3.join();
779 t1.join();
780 t2.join();
781}
782
lifr4e4a2e02019-01-29 16:53:51 +0800783TEST_F(ResolverTest, GetAddrInfo_cnames) {
784 constexpr char host_name[] = "host.example.com.";
785 test::DNSResponder dns;
786 const std::vector<DnsRecord> records = {
787 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
788 {"a.example.com.", ns_type::ns_t_cname, "b.example.com."},
789 {"b.example.com.", ns_type::ns_t_cname, "c.example.com."},
790 {"c.example.com.", ns_type::ns_t_cname, "d.example.com."},
791 {"d.example.com.", ns_type::ns_t_cname, "e.example.com."},
792 {"e.example.com.", ns_type::ns_t_cname, host_name},
793 {host_name, ns_type::ns_t_a, "1.2.3.3"},
794 {host_name, ns_type::ns_t_aaaa, "2001:db8::42"},
795 };
796 StartDns(dns, records);
797 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
798
799 addrinfo hints = {.ai_family = AF_INET};
800 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
801 EXPECT_TRUE(result != nullptr);
802 EXPECT_EQ("1.2.3.3", ToString(result));
803
804 dns.clearQueries();
805 hints = {.ai_family = AF_INET6};
806 result = safe_getaddrinfo("hello", nullptr, &hints);
807 EXPECT_TRUE(result != nullptr);
808 EXPECT_EQ("2001:db8::42", ToString(result));
809}
810
811TEST_F(ResolverTest, GetAddrInfo_cnamesNoIpAddress) {
812 test::DNSResponder dns;
813 const std::vector<DnsRecord> records = {
814 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
815 };
816 StartDns(dns, records);
817 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
818
819 addrinfo hints = {.ai_family = AF_INET};
820 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
821 EXPECT_TRUE(result == nullptr);
822
823 dns.clearQueries();
824 hints = {.ai_family = AF_INET6};
825 result = safe_getaddrinfo("hello", nullptr, &hints);
826 EXPECT_TRUE(result == nullptr);
827}
828
829TEST_F(ResolverTest, GetAddrInfo_cnamesIllegalRdata) {
830 test::DNSResponder dns;
831 const std::vector<DnsRecord> records = {
832 {kHelloExampleCom, ns_type::ns_t_cname, ".!#?"},
833 };
834 StartDns(dns, records);
835 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
836
837 addrinfo hints = {.ai_family = AF_INET};
838 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
839 EXPECT_TRUE(result == nullptr);
840
841 dns.clearQueries();
842 hints = {.ai_family = AF_INET6};
843 result = safe_getaddrinfo("hello", nullptr, &hints);
844 EXPECT_TRUE(result == nullptr);
845}
846
Ken Chenb9fa2062018-11-13 21:51:13 +0800847TEST_F(ResolverTest, MultidomainResolution) {
Xiao Ma09b71022018-12-11 17:56:32 +0900848 constexpr char host_name[] = "nihao.example2.com.";
Luke Huangf8215372019-11-22 11:53:41 +0800849 std::vector<std::string> searchDomains = {"example1.com", "example2.com", "example3.com"};
Ken Chenb9fa2062018-11-13 21:51:13 +0800850
Xiao Ma09b71022018-12-11 17:56:32 +0900851 test::DNSResponder dns("127.0.0.6");
852 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.3"}});
853 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({"127.0.0.6"}, searchDomains));
854
Ken Chenb9fa2062018-11-13 21:51:13 +0800855 const hostent* result = gethostbyname("nihao");
Xiao Ma09b71022018-12-11 17:56:32 +0900856
Ken Chenb9fa2062018-11-13 21:51:13 +0800857 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
858 ASSERT_FALSE(result == nullptr);
859 ASSERT_EQ(4, result->h_length);
860 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
861 EXPECT_EQ("1.2.3.3", ToString(result));
862 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800863}
864
865TEST_F(ResolverTest, GetAddrInfoV6_numeric) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800866 constexpr char host_name[] = "ohayou.example.com.";
867 constexpr char numeric_addr[] = "fe80::1%lo";
868
Xiao Ma09b71022018-12-11 17:56:32 +0900869 test::DNSResponder dns;
Ken Chenb9fa2062018-11-13 21:51:13 +0800870 dns.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900871 StartDns(dns, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
872 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800873
874 addrinfo hints = {.ai_family = AF_INET6};
875 ScopedAddrinfo result = safe_getaddrinfo(numeric_addr, nullptr, &hints);
876 EXPECT_TRUE(result != nullptr);
877 EXPECT_EQ(numeric_addr, ToString(result));
878 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
879
880 // Now try a non-numeric hostname query with the AI_NUMERICHOST flag set.
881 // We should fail without sending out a DNS query.
882 hints.ai_flags |= AI_NUMERICHOST;
883 result = safe_getaddrinfo(host_name, nullptr, &hints);
884 EXPECT_TRUE(result == nullptr);
885 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
886}
887
888TEST_F(ResolverTest, GetAddrInfoV6_failing) {
Xiao Ma09b71022018-12-11 17:56:32 +0900889 constexpr char listen_addr0[] = "127.0.0.7";
890 constexpr char listen_addr1[] = "127.0.0.8";
Ken Chenb9fa2062018-11-13 21:51:13 +0800891 const char* host_name = "ohayou.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +0900892
893 test::DNSResponder dns0(listen_addr0);
894 test::DNSResponder dns1(listen_addr1);
Ken Chenb9fa2062018-11-13 21:51:13 +0800895 dns0.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900896 StartDns(dns0, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
897 StartDns(dns1, {{host_name, ns_type::ns_t_aaaa, "2001:db8::6"}});
898
Luke Huangf8215372019-11-22 11:53:41 +0800899 std::vector<std::string> servers = {listen_addr0, listen_addr1};
Ken Chenb9fa2062018-11-13 21:51:13 +0800900 // <sample validity in s> <success threshold in percent> <min samples> <max samples>
901 int sample_count = 8;
Luke Huangf8215372019-11-22 11:53:41 +0800902 const std::vector<int> params = {300, 25, sample_count, sample_count};
Xiao Ma09b71022018-12-11 17:56:32 +0900903 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, kDefaultSearchDomains, params));
Ken Chenb9fa2062018-11-13 21:51:13 +0800904
905 // Repeatedly perform resolutions for non-existing domains until MAXNSSAMPLES resolutions have
906 // reached the dns0, which is set to fail. No more requests should then arrive at that server
907 // for the next sample_lifetime seconds.
908 // TODO: This approach is implementation-dependent, change once metrics reporting is available.
Xiao Ma09b71022018-12-11 17:56:32 +0900909 const addrinfo hints = {.ai_family = AF_INET6};
Bernie Innocentib102dd22018-12-04 14:57:48 +0900910 for (int i = 0; i < sample_count; ++i) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800911 std::string domain = StringPrintf("nonexistent%d", i);
912 ScopedAddrinfo result = safe_getaddrinfo(domain.c_str(), nullptr, &hints);
913 }
914 // Due to 100% errors for all possible samples, the server should be ignored from now on and
915 // only the second one used for all following queries, until NSSAMPLE_VALIDITY is reached.
916 dns0.clearQueries();
917 dns1.clearQueries();
918 ScopedAddrinfo result = safe_getaddrinfo("ohayou", nullptr, &hints);
919 EXPECT_TRUE(result != nullptr);
920 EXPECT_EQ(0U, GetNumQueries(dns0, host_name));
921 EXPECT_EQ(1U, GetNumQueries(dns1, host_name));
922}
923
924TEST_F(ResolverTest, GetAddrInfoV6_nonresponsive) {
Xiao Ma09b71022018-12-11 17:56:32 +0900925 constexpr char listen_addr0[] = "127.0.0.7";
926 constexpr char listen_addr1[] = "127.0.0.8";
927 constexpr char listen_srv[] = "53";
928 constexpr char host_name1[] = "ohayou.example.com.";
929 constexpr char host_name2[] = "ciao.example.com.";
Luke Huang483cf332019-06-03 17:24:51 +0800930 const std::vector<std::string> defaultSearchDomain = {"example.com"};
931 // The minimal timeout is 1000ms, so we can't decrease timeout
932 // So reduce retry count.
933 const std::vector<int> reduceRetryParams = {
934 300, // sample validity in seconds
935 25, // success threshod in percent
936 8, 8, // {MIN,MAX}_SAMPLES
937 1000, // BASE_TIMEOUT_MSEC
938 1, // retry count
939 };
Xiao Ma09b71022018-12-11 17:56:32 +0900940 const std::vector<DnsRecord> records0 = {
941 {host_name1, ns_type::ns_t_aaaa, "2001:db8::5"},
942 {host_name2, ns_type::ns_t_aaaa, "2001:db8::5"},
943 };
944 const std::vector<DnsRecord> records1 = {
945 {host_name1, ns_type::ns_t_aaaa, "2001:db8::6"},
946 {host_name2, ns_type::ns_t_aaaa, "2001:db8::6"},
947 };
Ken Chenb9fa2062018-11-13 21:51:13 +0800948
949 // dns0 does not respond with 100% probability, while
950 // dns1 responds normally, at least initially.
Mike Yufc125e42019-05-15 20:41:28 +0800951 test::DNSResponder dns0(listen_addr0, listen_srv, static_cast<ns_rcode>(-1));
952 test::DNSResponder dns1(listen_addr1, listen_srv, static_cast<ns_rcode>(-1));
Ken Chenb9fa2062018-11-13 21:51:13 +0800953 dns0.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900954 StartDns(dns0, records0);
955 StartDns(dns1, records1);
Luke Huang483cf332019-06-03 17:24:51 +0800956 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr0, listen_addr1}, defaultSearchDomain,
957 reduceRetryParams));
Ken Chenb9fa2062018-11-13 21:51:13 +0800958
Luke Huang483cf332019-06-03 17:24:51 +0800959 // Specify ai_socktype to make getaddrinfo will only query 1 time
960 const addrinfo hints = {.ai_family = AF_INET6, .ai_socktype = SOCK_STREAM};
Ken Chenb9fa2062018-11-13 21:51:13 +0800961
962 // dns0 will ignore the request, and we'll fallback to dns1 after the first
963 // retry.
964 ScopedAddrinfo result = safe_getaddrinfo(host_name1, nullptr, &hints);
965 EXPECT_TRUE(result != nullptr);
966 EXPECT_EQ(1U, GetNumQueries(dns0, host_name1));
967 EXPECT_EQ(1U, GetNumQueries(dns1, host_name1));
Mike Yu532405f2020-06-17 17:46:44 +0800968 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, 0, host_name1, {"2001:db8::6"});
Ken Chenb9fa2062018-11-13 21:51:13 +0800969
970 // Now make dns1 also ignore 100% requests... The resolve should alternate
Luke Huang483cf332019-06-03 17:24:51 +0800971 // queries between the nameservers and fail
Ken Chenb9fa2062018-11-13 21:51:13 +0800972 dns1.setResponseProbability(0.0);
973 addrinfo* result2 = nullptr;
974 EXPECT_EQ(EAI_NODATA, getaddrinfo(host_name2, nullptr, &hints, &result2));
975 EXPECT_EQ(nullptr, result2);
Luke Huang483cf332019-06-03 17:24:51 +0800976 EXPECT_EQ(1U, GetNumQueries(dns0, host_name2));
977 EXPECT_EQ(1U, GetNumQueries(dns1, host_name2));
Mike Yu532405f2020-06-17 17:46:44 +0800978 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, RCODE_TIMEOUT, host_name2, {});
Ken Chenb9fa2062018-11-13 21:51:13 +0800979}
980
981TEST_F(ResolverTest, GetAddrInfoV6_concurrent) {
Xiao Ma09b71022018-12-11 17:56:32 +0900982 constexpr char listen_addr0[] = "127.0.0.9";
983 constexpr char listen_addr1[] = "127.0.0.10";
984 constexpr char listen_addr2[] = "127.0.0.11";
985 constexpr char host_name[] = "konbanha.example.com.";
986
987 test::DNSResponder dns0(listen_addr0);
988 test::DNSResponder dns1(listen_addr1);
989 test::DNSResponder dns2(listen_addr2);
990 StartDns(dns0, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
991 StartDns(dns1, {{host_name, ns_type::ns_t_aaaa, "2001:db8::6"}});
992 StartDns(dns2, {{host_name, ns_type::ns_t_aaaa, "2001:db8::7"}});
993
Luke Huangf8215372019-11-22 11:53:41 +0800994 const std::vector<std::string> servers = {listen_addr0, listen_addr1, listen_addr2};
Ken Chenb9fa2062018-11-13 21:51:13 +0800995 std::vector<std::thread> threads(10);
996 for (std::thread& thread : threads) {
Luke Huangf8215372019-11-22 11:53:41 +0800997 thread = std::thread([this, &servers]() {
998 unsigned delay = arc4random_uniform(1 * 1000 * 1000); // <= 1s
Ken Chenb9fa2062018-11-13 21:51:13 +0800999 usleep(delay);
1000 std::vector<std::string> serverSubset;
1001 for (const auto& server : servers) {
1002 if (arc4random_uniform(2)) {
1003 serverSubset.push_back(server);
1004 }
1005 }
1006 if (serverSubset.empty()) serverSubset = servers;
Xiao Ma09b71022018-12-11 17:56:32 +09001007 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(serverSubset));
1008 const addrinfo hints = {.ai_family = AF_INET6};
Ken Chenb9fa2062018-11-13 21:51:13 +08001009 addrinfo* result = nullptr;
1010 int rv = getaddrinfo("konbanha", nullptr, &hints, &result);
1011 EXPECT_EQ(0, rv) << "error [" << rv << "] " << gai_strerror(rv);
1012 if (result) {
1013 freeaddrinfo(result);
1014 result = nullptr;
1015 }
1016 });
1017 }
1018 for (std::thread& thread : threads) {
1019 thread.join();
1020 }
Ken Chen92bed612018-12-22 21:46:55 +08001021
1022 std::vector<std::string> res_servers;
1023 std::vector<std::string> res_domains;
1024 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001025 res_params res_params;
Ken Chen92bed612018-12-22 21:46:55 +08001026 std::vector<ResolverStats> res_stats;
1027 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001028 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1029 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1030 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chen92bed612018-12-22 21:46:55 +08001031 EXPECT_EQ(0, wait_for_pending_req_timeout_count);
Ken Chenb9fa2062018-11-13 21:51:13 +08001032}
1033
Mike Yu8ac63402019-12-02 15:28:38 +08001034TEST_F(ResolverTest, SkipBadServersDueToInternalError) {
1035 constexpr char listen_addr1[] = "fe80::1";
1036 constexpr char listen_addr2[] = "255.255.255.255";
1037 constexpr char listen_addr3[] = "127.0.0.3";
1038
1039 test::DNSResponder dns(listen_addr3);
1040 ASSERT_TRUE(dns.startServer());
1041
1042 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
1043 parcel.servers = {listen_addr1, listen_addr2, listen_addr3};
1044
1045 // Bad servers can be distinguished after two attempts.
1046 parcel.minSamples = 2;
1047 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1048
1049 // Start querying five times.
1050 for (int i = 0; i < 5; i++) {
1051 std::string hostName = StringPrintf("hello%d.com.", i);
1052 dns.addMapping(hostName, ns_type::ns_t_a, "1.2.3.4");
1053 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1054 EXPECT_TRUE(safe_getaddrinfo(hostName.c_str(), nullptr, &hints) != nullptr);
1055 }
1056
Mike Yue2162e52020-03-04 18:43:46 +08001057 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1058 NameserverStats(listen_addr1).setInternalErrors(2),
1059 NameserverStats(listen_addr2).setInternalErrors(2),
1060 NameserverStats(listen_addr3).setSuccesses(5),
1061 };
1062 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
Mike Yu8ac63402019-12-02 15:28:38 +08001063}
1064
1065TEST_F(ResolverTest, SkipBadServersDueToTimeout) {
1066 constexpr char listen_addr1[] = "127.0.0.3";
1067 constexpr char listen_addr2[] = "127.0.0.4";
1068
1069 // Set dns1 non-responsive and dns2 workable.
1070 test::DNSResponder dns1(listen_addr1, test::kDefaultListenService, static_cast<ns_rcode>(-1));
1071 test::DNSResponder dns2(listen_addr2);
1072 dns1.setResponseProbability(0.0);
1073 ASSERT_TRUE(dns1.startServer());
1074 ASSERT_TRUE(dns2.startServer());
1075
1076 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
1077 parcel.servers = {listen_addr1, listen_addr2};
1078
1079 // Bad servers can be distinguished after two attempts.
1080 parcel.minSamples = 2;
1081 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1082
1083 // Start querying five times.
1084 for (int i = 0; i < 5; i++) {
1085 std::string hostName = StringPrintf("hello%d.com.", i);
1086 dns1.addMapping(hostName, ns_type::ns_t_a, "1.2.3.4");
1087 dns2.addMapping(hostName, ns_type::ns_t_a, "1.2.3.5");
1088 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1089 EXPECT_TRUE(safe_getaddrinfo(hostName.c_str(), nullptr, &hints) != nullptr);
1090 }
1091
Mike Yue2162e52020-03-04 18:43:46 +08001092 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1093 NameserverStats(listen_addr1).setTimeouts(2),
1094 NameserverStats(listen_addr2).setSuccesses(5),
1095 };
1096 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
Mike Yu8ac63402019-12-02 15:28:38 +08001097 EXPECT_EQ(dns1.queries().size(), 2U);
1098 EXPECT_EQ(dns2.queries().size(), 5U);
1099}
1100
chenbrucefd837fa2019-10-29 18:35:36 +08001101TEST_F(ResolverTest, GetAddrInfoFromCustTable_InvalidInput) {
1102 constexpr char hostnameNoip[] = "noip.example.com.";
1103 constexpr char hostnameInvalidip[] = "invalidip.example.com.";
1104 const std::vector<aidl::android::net::ResolverHostsParcel> invalidCustHosts = {
1105 {"", hostnameNoip},
1106 {"wrong IP", hostnameInvalidip},
1107 };
1108 test::DNSResponder dns;
1109 StartDns(dns, {});
1110 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
Ken Chena6ac2a62020-04-07 17:25:56 +08001111 resolverParams.resolverOptions.hosts = invalidCustHosts;
chenbrucefd837fa2019-10-29 18:35:36 +08001112 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1113 for (const auto& hostname : {hostnameNoip, hostnameInvalidip}) {
1114 // The query won't get data from customized table because of invalid customized table
1115 // and DNSResponder also has no records. hostnameNoip has never registered and
1116 // hostnameInvalidip has registered but wrong IP.
1117 const addrinfo hints = {.ai_family = AF_UNSPEC};
1118 ScopedAddrinfo result = safe_getaddrinfo(hostname, nullptr, &hints);
1119 ASSERT_TRUE(result == nullptr);
1120 EXPECT_EQ(4U, GetNumQueries(dns, hostname));
1121 }
1122}
1123
1124TEST_F(ResolverTest, GetAddrInfoFromCustTable) {
1125 constexpr char hostnameV4[] = "v4only.example.com.";
1126 constexpr char hostnameV6[] = "v6only.example.com.";
1127 constexpr char hostnameV4V6[] = "v4v6.example.com.";
1128 constexpr char custAddrV4[] = "1.2.3.4";
1129 constexpr char custAddrV6[] = "::1.2.3.4";
1130 constexpr char dnsSvAddrV4[] = "1.2.3.5";
1131 constexpr char dnsSvAddrV6[] = "::1.2.3.5";
1132 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4 = {
1133 {custAddrV4, hostnameV4},
1134 };
1135 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV6 = {
1136 {custAddrV6, hostnameV6},
1137 };
1138 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4V6 = {
1139 {custAddrV4, hostnameV4V6},
1140 {custAddrV6, hostnameV4V6},
1141 };
1142 const std::vector<DnsRecord> dnsSvHostV4 = {
1143 {hostnameV4, ns_type::ns_t_a, dnsSvAddrV4},
1144 };
1145 const std::vector<DnsRecord> dnsSvHostV6 = {
1146 {hostnameV6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1147 };
1148 const std::vector<DnsRecord> dnsSvHostV4V6 = {
1149 {hostnameV4V6, ns_type::ns_t_a, dnsSvAddrV4},
1150 {hostnameV4V6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1151 };
1152 struct TestConfig {
1153 const std::string name;
1154 const std::vector<aidl::android::net::ResolverHostsParcel> customizedHosts;
1155 const std::vector<DnsRecord> dnsserverHosts;
1156 const std::vector<std::string> queryResult;
1157 std::string asParameters() const {
1158 return StringPrintf("name: %s, customizedHosts: %s, dnsserverHosts: %s", name.c_str(),
1159 customizedHosts.empty() ? "No" : "Yes",
1160 dnsserverHosts.empty() ? "No" : "Yes");
1161 }
1162 } testConfigs[]{
1163 // clang-format off
1164 {hostnameV4, {}, {}, {}},
1165 {hostnameV4, {}, dnsSvHostV4, {dnsSvAddrV4}},
1166 {hostnameV4, custHostV4, {}, {custAddrV4}},
1167 {hostnameV4, custHostV4, dnsSvHostV4, {custAddrV4}},
1168 {hostnameV6, {}, {}, {}},
1169 {hostnameV6, {}, dnsSvHostV6, {dnsSvAddrV6}},
1170 {hostnameV6, custHostV6, {}, {custAddrV6}},
1171 {hostnameV6, custHostV6, dnsSvHostV6, {custAddrV6}},
1172 {hostnameV4V6, {}, {}, {}},
1173 {hostnameV4V6, {}, dnsSvHostV4V6, {dnsSvAddrV4, dnsSvAddrV6}},
1174 {hostnameV4V6, custHostV4V6, {}, {custAddrV4, custAddrV6}},
1175 {hostnameV4V6, custHostV4V6, dnsSvHostV4V6, {custAddrV4, custAddrV6}},
1176 // clang-format on
1177 };
1178
1179 for (const auto& config : testConfigs) {
1180 SCOPED_TRACE(config.asParameters());
1181
1182 test::DNSResponder dns;
1183 StartDns(dns, config.dnsserverHosts);
1184
1185 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
Ken Chena6ac2a62020-04-07 17:25:56 +08001186 resolverParams.resolverOptions.hosts = config.customizedHosts;
chenbrucefd837fa2019-10-29 18:35:36 +08001187 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1188 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM};
1189 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
1190 if (config.customizedHosts.empty() && config.dnsserverHosts.empty()) {
1191 ASSERT_TRUE(result == nullptr);
1192 EXPECT_EQ(2U, GetNumQueries(dns, config.name.c_str()));
1193 } else {
1194 ASSERT_TRUE(result != nullptr);
1195 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(config.queryResult));
1196 EXPECT_EQ(config.customizedHosts.empty() ? 2U : 0U,
1197 GetNumQueries(dns, config.name.c_str()));
1198 }
1199
1200 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
1201 }
1202}
1203
1204TEST_F(ResolverTest, GetAddrInfoFromCustTable_Modify) {
1205 constexpr char hostnameV4V6[] = "v4v6.example.com.";
1206 constexpr char custAddrV4[] = "1.2.3.4";
1207 constexpr char custAddrV6[] = "::1.2.3.4";
1208 constexpr char dnsSvAddrV4[] = "1.2.3.5";
1209 constexpr char dnsSvAddrV6[] = "::1.2.3.5";
1210 const std::vector<DnsRecord> dnsSvHostV4V6 = {
1211 {hostnameV4V6, ns_type::ns_t_a, dnsSvAddrV4},
1212 {hostnameV4V6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1213 };
1214 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4V6 = {
1215 {custAddrV4, hostnameV4V6},
1216 {custAddrV6, hostnameV4V6},
1217 };
1218 test::DNSResponder dns;
1219 StartDns(dns, dnsSvHostV4V6);
1220 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1221
Ken Chena6ac2a62020-04-07 17:25:56 +08001222 resolverParams.resolverOptions.hosts = custHostV4V6;
chenbrucefd837fa2019-10-29 18:35:36 +08001223 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1224 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM};
1225 ScopedAddrinfo result = safe_getaddrinfo(hostnameV4V6, nullptr, &hints);
1226 ASSERT_TRUE(result != nullptr);
1227 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray({custAddrV4, custAddrV6}));
1228 EXPECT_EQ(0U, GetNumQueries(dns, hostnameV4V6));
1229
Ken Chena6ac2a62020-04-07 17:25:56 +08001230 resolverParams.resolverOptions.hosts = {};
chenbrucefd837fa2019-10-29 18:35:36 +08001231 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1232 result = safe_getaddrinfo(hostnameV4V6, nullptr, &hints);
1233 ASSERT_TRUE(result != nullptr);
1234 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray({dnsSvAddrV4, dnsSvAddrV6}));
1235 EXPECT_EQ(2U, GetNumQueries(dns, hostnameV4V6));
1236}
1237
Ken Chenb9fa2062018-11-13 21:51:13 +08001238TEST_F(ResolverTest, EmptySetup) {
Ken Chenb9fa2062018-11-13 21:51:13 +08001239 std::vector<std::string> servers;
1240 std::vector<std::string> domains;
Xiao Ma09b71022018-12-11 17:56:32 +09001241 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001242 std::vector<std::string> res_servers;
1243 std::vector<std::string> res_domains;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001244 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001245 res_params res_params;
Ken Chenb9fa2062018-11-13 21:51:13 +08001246 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +08001247 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001248 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1249 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1250 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chenb9fa2062018-11-13 21:51:13 +08001251 EXPECT_EQ(0U, res_servers.size());
1252 EXPECT_EQ(0U, res_domains.size());
Mike Yu0a1c53d2018-11-26 13:26:21 +09001253 EXPECT_EQ(0U, res_tls_servers.size());
Luke Huang5bd827c2019-03-14 16:10:04 +08001254 ASSERT_EQ(static_cast<size_t>(IDnsResolver::RESOLVER_PARAMS_COUNT), kDefaultParams.size());
1255 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY],
1256 res_params.sample_validity);
1257 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001258 res_params.success_threshold);
Luke Huang5bd827c2019-03-14 16:10:04 +08001259 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
1260 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
1261 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
Ken Chenb9fa2062018-11-13 21:51:13 +08001262 res_params.base_timeout_msec);
Luke Huang5bd827c2019-03-14 16:10:04 +08001263 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_RETRY_COUNT], res_params.retry_count);
Ken Chenb9fa2062018-11-13 21:51:13 +08001264}
1265
1266TEST_F(ResolverTest, SearchPathChange) {
Xiao Ma09b71022018-12-11 17:56:32 +09001267 constexpr char listen_addr[] = "127.0.0.13";
1268 constexpr char host_name1[] = "test13.domain1.org.";
1269 constexpr char host_name2[] = "test13.domain2.org.";
Luke Huangf8215372019-11-22 11:53:41 +08001270 std::vector<std::string> servers = {listen_addr};
1271 std::vector<std::string> domains = {"domain1.org"};
Xiao Ma09b71022018-12-11 17:56:32 +09001272
1273 const std::vector<DnsRecord> records = {
1274 {host_name1, ns_type::ns_t_aaaa, "2001:db8::13"},
1275 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1:13"},
1276 };
1277 test::DNSResponder dns(listen_addr);
1278 StartDns(dns, records);
1279 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001280
1281 const addrinfo hints = {.ai_family = AF_INET6};
1282 ScopedAddrinfo result = safe_getaddrinfo("test13", nullptr, &hints);
1283 EXPECT_TRUE(result != nullptr);
1284 EXPECT_EQ(1U, dns.queries().size());
1285 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
1286 EXPECT_EQ("2001:db8::13", ToString(result));
1287
1288 // Test that changing the domain search path on its own works.
Luke Huangf8215372019-11-22 11:53:41 +08001289 domains = {"domain2.org"};
Xiao Ma09b71022018-12-11 17:56:32 +09001290 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001291 dns.clearQueries();
1292
1293 result = safe_getaddrinfo("test13", nullptr, &hints);
1294 EXPECT_TRUE(result != nullptr);
1295 EXPECT_EQ(1U, dns.queries().size());
1296 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
1297 EXPECT_EQ("2001:db8::1:13", ToString(result));
1298}
1299
Luke Huang2dac4382019-06-24 13:28:44 +08001300namespace {
1301
Luke Huangf8215372019-11-22 11:53:41 +08001302std::vector<std::string> getResolverDomains(aidl::android::net::IDnsResolver* dnsResolverService,
Luke Huang2dac4382019-06-24 13:28:44 +08001303 unsigned netId) {
1304 std::vector<std::string> res_servers;
1305 std::vector<std::string> res_domains;
1306 std::vector<std::string> res_tls_servers;
1307 res_params res_params;
1308 std::vector<ResolverStats> res_stats;
1309 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001310 DnsResponderClient::GetResolverInfo(dnsResolverService, netId, &res_servers, &res_domains,
1311 &res_tls_servers, &res_params, &res_stats,
1312 &wait_for_pending_req_timeout_count);
Luke Huang2dac4382019-06-24 13:28:44 +08001313 return res_domains;
1314}
1315
1316} // namespace
1317
1318TEST_F(ResolverTest, SearchPathPrune) {
1319 constexpr size_t DUPLICATED_DOMAIN_NUM = 3;
1320 constexpr char listen_addr[] = "127.0.0.13";
1321 constexpr char domian_name1[] = "domain13.org.";
1322 constexpr char domian_name2[] = "domain14.org.";
1323 constexpr char host_name1[] = "test13.domain13.org.";
1324 constexpr char host_name2[] = "test14.domain14.org.";
1325 std::vector<std::string> servers = {listen_addr};
1326
1327 std::vector<std::string> testDomains1;
1328 std::vector<std::string> testDomains2;
1329 // Domain length should be <= 255
1330 // Max number of domains in search path is 6
1331 for (size_t i = 0; i < MAXDNSRCH + 1; i++) {
1332 // Fill up with invalid domain
1333 testDomains1.push_back(std::string(300, i + '0'));
1334 // Fill up with valid but duplicated domain
1335 testDomains2.push_back(StringPrintf("domain%zu.org", i % DUPLICATED_DOMAIN_NUM));
1336 }
1337
1338 // Add valid domain used for query.
1339 testDomains1.push_back(domian_name1);
1340
1341 // Add valid domain twice used for query.
1342 testDomains2.push_back(domian_name2);
1343 testDomains2.push_back(domian_name2);
1344
1345 const std::vector<DnsRecord> records = {
1346 {host_name1, ns_type::ns_t_aaaa, "2001:db8::13"},
1347 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1:13"},
1348 };
1349 test::DNSResponder dns(listen_addr);
1350 StartDns(dns, records);
1351 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, testDomains1));
1352
1353 const addrinfo hints = {.ai_family = AF_INET6};
1354 ScopedAddrinfo result = safe_getaddrinfo("test13", nullptr, &hints);
1355
1356 EXPECT_TRUE(result != nullptr);
1357
1358 EXPECT_EQ(1U, dns.queries().size());
1359 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
1360 EXPECT_EQ("2001:db8::13", ToString(result));
1361
1362 const auto& res_domains1 = getResolverDomains(mDnsClient.resolvService(), TEST_NETID);
1363 // Expect 1 valid domain, invalid domains are removed.
1364 ASSERT_EQ(1U, res_domains1.size());
1365 EXPECT_EQ(domian_name1, res_domains1[0]);
1366
1367 dns.clearQueries();
1368
1369 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, testDomains2));
1370
1371 result = safe_getaddrinfo("test14", nullptr, &hints);
1372 EXPECT_TRUE(result != nullptr);
1373
1374 // (3 domains * 2 retries) + 1 success query = 7
1375 EXPECT_EQ(7U, dns.queries().size());
1376 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
1377 EXPECT_EQ("2001:db8::1:13", ToString(result));
1378
1379 const auto& res_domains2 = getResolverDomains(mDnsClient.resolvService(), TEST_NETID);
1380 // Expect 4 valid domain, duplicate domains are removed.
1381 EXPECT_EQ(DUPLICATED_DOMAIN_NUM + 1U, res_domains2.size());
1382 EXPECT_THAT(
1383 std::vector<std::string>({"domain0.org", "domain1.org", "domain2.org", domian_name2}),
1384 testing::ElementsAreArray(res_domains2));
1385}
1386
Mike Yu0a1c53d2018-11-26 13:26:21 +09001387// If we move this function to dns_responder_client, it will complicate the dependency need of
1388// dns_tls_frontend.h.
1389static void setupTlsServers(const std::vector<std::string>& servers,
waynema0e73c2e2019-07-31 15:04:08 +08001390 std::vector<std::unique_ptr<test::DnsTlsFrontend>>* tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001391 constexpr char listen_udp[] = "53";
1392 constexpr char listen_tls[] = "853";
Mike Yu0a1c53d2018-11-26 13:26:21 +09001393
1394 for (const auto& server : servers) {
1395 auto t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
1396 t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
1397 t->startServer();
Mike Yu0a1c53d2018-11-26 13:26:21 +09001398 tls->push_back(std::move(t));
1399 }
1400}
1401
Mike Yu0a1c53d2018-11-26 13:26:21 +09001402TEST_F(ResolverTest, MaxServerPrune_Binder) {
Mike Yu0a1c53d2018-11-26 13:26:21 +09001403 std::vector<std::string> domains;
1404 std::vector<std::unique_ptr<test::DNSResponder>> dns;
1405 std::vector<std::unique_ptr<test::DnsTlsFrontend>> tls;
1406 std::vector<std::string> servers;
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001407 std::vector<DnsResponderClient::Mapping> mappings;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001408
1409 for (unsigned i = 0; i < MAXDNSRCH + 1; i++) {
1410 domains.push_back(StringPrintf("example%u.com", i));
1411 }
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001412 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupMappings(1, domains, &mappings));
1413 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupDNSServers(MAXNS + 1, mappings, &dns, &servers));
waynema0e73c2e2019-07-31 15:04:08 +08001414 ASSERT_NO_FATAL_FAILURE(setupTlsServers(servers, &tls));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001415
waynema0e73c2e2019-07-31 15:04:08 +08001416 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, domains, kDefaultParams,
1417 kDefaultPrivateDnsHostName));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001418
Mike Yu383855b2019-01-15 17:53:27 +08001419 // If the private DNS validation hasn't completed yet before backend DNS servers stop,
1420 // TLS servers will get stuck in handleOneRequest(), which causes this test stuck in
1421 // ~DnsTlsFrontend() because the TLS server loop threads can't be terminated.
1422 // So, wait for private DNS validation done before stopping backend DNS servers.
1423 for (int i = 0; i < MAXNS; i++) {
chenbruceaff85842019-05-31 15:46:42 +08001424 LOG(INFO) << "Waiting for private DNS validation on " << tls[i]->listen_address() << ".";
Mike Yu724f77d2019-08-16 11:14:50 +08001425 EXPECT_TRUE(WaitForPrivateDnsValidation(tls[i]->listen_address(), true));
chenbruceaff85842019-05-31 15:46:42 +08001426 LOG(INFO) << "private DNS validation on " << tls[i]->listen_address() << " done.";
Mike Yu383855b2019-01-15 17:53:27 +08001427 }
1428
Mike Yu0a1c53d2018-11-26 13:26:21 +09001429 std::vector<std::string> res_servers;
1430 std::vector<std::string> res_domains;
1431 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001432 res_params res_params;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001433 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +08001434 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001435 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1436 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1437 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001438
1439 // Check the size of the stats and its contents.
1440 EXPECT_EQ(static_cast<size_t>(MAXNS), res_servers.size());
1441 EXPECT_EQ(static_cast<size_t>(MAXNS), res_tls_servers.size());
1442 EXPECT_EQ(static_cast<size_t>(MAXDNSRCH), res_domains.size());
1443 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_servers.begin()));
1444 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_tls_servers.begin()));
1445 EXPECT_TRUE(std::equal(domains.begin(), domains.begin() + MAXDNSRCH, res_domains.begin()));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001446}
1447
1448TEST_F(ResolverTest, ResolverStats) {
Xiao Ma09b71022018-12-11 17:56:32 +09001449 constexpr char listen_addr1[] = "127.0.0.4";
1450 constexpr char listen_addr2[] = "127.0.0.5";
1451 constexpr char listen_addr3[] = "127.0.0.6";
Mike Yu0a1c53d2018-11-26 13:26:21 +09001452
1453 // Set server 1 timeout.
Mike Yufc125e42019-05-15 20:41:28 +08001454 test::DNSResponder dns1(listen_addr1, "53", static_cast<ns_rcode>(-1));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001455 dns1.setResponseProbability(0.0);
1456 ASSERT_TRUE(dns1.startServer());
1457
1458 // Set server 2 responding server failure.
Xiao Ma09b71022018-12-11 17:56:32 +09001459 test::DNSResponder dns2(listen_addr2);
Mike Yu0a1c53d2018-11-26 13:26:21 +09001460 dns2.setResponseProbability(0.0);
1461 ASSERT_TRUE(dns2.startServer());
1462
1463 // Set server 3 workable.
Xiao Ma09b71022018-12-11 17:56:32 +09001464 test::DNSResponder dns3(listen_addr3);
1465 dns3.addMapping(kHelloExampleCom, ns_type::ns_t_a, "1.2.3.4");
Mike Yu0a1c53d2018-11-26 13:26:21 +09001466 ASSERT_TRUE(dns3.startServer());
1467
1468 std::vector<std::string> servers = {listen_addr1, listen_addr2, listen_addr3};
Xiao Ma09b71022018-12-11 17:56:32 +09001469 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001470
1471 dns3.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +09001472 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
Mike Yu0a1c53d2018-11-26 13:26:21 +09001473 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
Xiao Ma09b71022018-12-11 17:56:32 +09001474 size_t found = GetNumQueries(dns3, kHelloExampleCom);
Mike Yu0a1c53d2018-11-26 13:26:21 +09001475 EXPECT_LE(1U, found);
1476 std::string result_str = ToString(result);
1477 EXPECT_TRUE(result_str == "1.2.3.4") << ", result_str='" << result_str << "'";
1478
Mike Yue2162e52020-03-04 18:43:46 +08001479 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1480 NameserverStats(listen_addr1).setTimeouts(1),
1481 NameserverStats(listen_addr2).setErrors(1),
1482 NameserverStats(listen_addr3).setSuccesses(1),
1483 };
1484 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001485}
1486
Mike Yu15791832020-02-11 13:38:48 +08001487TEST_F(ResolverTest, AlwaysUseLatestSetupParamsInLookups) {
1488 constexpr char listen_addr1[] = "127.0.0.3";
1489 constexpr char listen_addr2[] = "255.255.255.255";
1490 constexpr char listen_addr3[] = "127.0.0.4";
1491 constexpr char hostname[] = "hello";
1492 constexpr char fqdn_with_search_domain[] = "hello.domain2.com.";
1493
1494 test::DNSResponder dns1(listen_addr1, test::kDefaultListenService, static_cast<ns_rcode>(-1));
1495 dns1.setResponseProbability(0.0);
1496 ASSERT_TRUE(dns1.startServer());
1497
1498 test::DNSResponder dns3(listen_addr3);
1499 StartDns(dns3, {{fqdn_with_search_domain, ns_type::ns_t_a, "1.2.3.4"}});
1500
1501 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
1502 parcel.tlsServers.clear();
1503 parcel.servers = {listen_addr1, listen_addr2};
1504 parcel.domains = {"domain1.com", "domain2.com"};
1505 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1506
1507 // Expect the things happening in t1:
1508 // 1. The lookup starts using the first domain for query. It sends queries to the populated
1509 // nameserver list {listen_addr1, listen_addr2} for the hostname "hello.domain1.com".
1510 // 2. A different list of nameservers is updated to the resolver. Revision ID is incremented.
1511 // 3. The query for the hostname times out. The lookup fails to add the timeout record to the
1512 // the stats because of the unmatched revision ID.
1513 // 4. The lookup starts using the second domain for query. It sends queries to the populated
1514 // nameserver list {listen_addr3, listen_addr1, listen_addr2} for another hostname
1515 // "hello.domain2.com".
1516 // 5. The lookup gets the answer and updates a success record to the stats.
1517 std::thread t1([&hostname]() {
1518 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1519 ScopedAddrinfo result = safe_getaddrinfo(hostname, nullptr, &hints);
1520 EXPECT_NE(result.get(), nullptr);
1521 EXPECT_EQ(ToString(result), "1.2.3.4");
1522 });
1523
1524 // Wait for t1 to start the step 1.
1525 while (dns1.queries().size() == 0) {
1526 usleep(1000);
1527 }
1528
1529 // Update the resolver with three nameservers. This will increment the revision ID.
1530 parcel.servers = {listen_addr3, listen_addr1, listen_addr2};
1531 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1532
1533 t1.join();
1534 EXPECT_EQ(0U, GetNumQueriesForType(dns3, ns_type::ns_t_aaaa, fqdn_with_search_domain));
1535 EXPECT_EQ(1U, GetNumQueriesForType(dns3, ns_type::ns_t_a, fqdn_with_search_domain));
1536
Mike Yue2162e52020-03-04 18:43:46 +08001537 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1538 NameserverStats(listen_addr1),
1539 NameserverStats(listen_addr2),
1540 NameserverStats(listen_addr3).setSuccesses(1),
1541 };
1542 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
Mike Yu15791832020-02-11 13:38:48 +08001543}
1544
Ken Chenb9fa2062018-11-13 21:51:13 +08001545// Test what happens if the specified TLS server is nonexistent.
1546TEST_F(ResolverTest, GetHostByName_TlsMissing) {
Xiao Ma09b71022018-12-11 17:56:32 +09001547 constexpr char listen_addr[] = "127.0.0.3";
1548 constexpr char host_name[] = "tlsmissing.example.com.";
1549
1550 test::DNSResponder dns;
1551 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.3"}});
Luke Huangf8215372019-11-22 11:53:41 +08001552 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001553
1554 // There's nothing listening on this address, so validation will either fail or
1555 /// hang. Either way, queries will continue to flow to the DNSResponder.
waynema0e73c2e2019-07-31 15:04:08 +08001556 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Ken Chenb9fa2062018-11-13 21:51:13 +08001557
1558 const hostent* result;
1559
1560 result = gethostbyname("tlsmissing");
1561 ASSERT_FALSE(result == nullptr);
1562 EXPECT_EQ("1.2.3.3", ToString(result));
1563
1564 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001565 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001566}
1567
1568// Test what happens if the specified TLS server replies with garbage.
1569TEST_F(ResolverTest, GetHostByName_TlsBroken) {
Xiao Ma09b71022018-12-11 17:56:32 +09001570 constexpr char listen_addr[] = "127.0.0.3";
1571 constexpr char host_name1[] = "tlsbroken1.example.com.";
1572 constexpr char host_name2[] = "tlsbroken2.example.com.";
1573 const std::vector<DnsRecord> records = {
1574 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1575 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1576 };
1577
1578 test::DNSResponder dns;
1579 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001580 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001581
1582 // Bind the specified private DNS socket but don't respond to any client sockets yet.
1583 int s = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, IPPROTO_TCP);
1584 ASSERT_TRUE(s >= 0);
1585 struct sockaddr_in tlsServer = {
Luke Huangf8215372019-11-22 11:53:41 +08001586 .sin_family = AF_INET,
1587 .sin_port = htons(853),
Ken Chenb9fa2062018-11-13 21:51:13 +08001588 };
1589 ASSERT_TRUE(inet_pton(AF_INET, listen_addr, &tlsServer.sin_addr));
1590 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEPORT).ok());
1591 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEADDR).ok());
1592 ASSERT_FALSE(bind(s, reinterpret_cast<struct sockaddr*>(&tlsServer), sizeof(tlsServer)));
1593 ASSERT_FALSE(listen(s, 1));
1594
1595 // Trigger TLS validation.
waynema0e73c2e2019-07-31 15:04:08 +08001596 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Ken Chenb9fa2062018-11-13 21:51:13 +08001597
1598 struct sockaddr_storage cliaddr;
1599 socklen_t sin_size = sizeof(cliaddr);
Luke Huangf8215372019-11-22 11:53:41 +08001600 int new_fd = accept4(s, reinterpret_cast<struct sockaddr*>(&cliaddr), &sin_size, SOCK_CLOEXEC);
Ken Chenb9fa2062018-11-13 21:51:13 +08001601 ASSERT_TRUE(new_fd > 0);
1602
1603 // We've received the new file descriptor but not written to it or closed, so the
1604 // validation is still pending. Queries should still flow correctly because the
1605 // server is not used until validation succeeds.
1606 const hostent* result;
1607 result = gethostbyname("tlsbroken1");
1608 ASSERT_FALSE(result == nullptr);
1609 EXPECT_EQ("1.2.3.1", ToString(result));
1610
1611 // Now we cause the validation to fail.
1612 std::string garbage = "definitely not a valid TLS ServerHello";
1613 write(new_fd, garbage.data(), garbage.size());
1614 close(new_fd);
1615
1616 // Validation failure shouldn't interfere with lookups, because lookups won't be sent
1617 // to the TLS server unless validation succeeds.
1618 result = gethostbyname("tlsbroken2");
1619 ASSERT_FALSE(result == nullptr);
1620 EXPECT_EQ("1.2.3.2", ToString(result));
1621
1622 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001623 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001624 close(s);
1625}
1626
1627TEST_F(ResolverTest, GetHostByName_Tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001628 constexpr char listen_addr[] = "127.0.0.3";
1629 constexpr char listen_udp[] = "53";
1630 constexpr char listen_tls[] = "853";
1631 constexpr char host_name1[] = "tls1.example.com.";
1632 constexpr char host_name2[] = "tls2.example.com.";
1633 constexpr char host_name3[] = "tls3.example.com.";
1634 const std::vector<DnsRecord> records = {
1635 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1636 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1637 {host_name3, ns_type::ns_t_a, "1.2.3.3"},
1638 };
1639
1640 test::DNSResponder dns;
1641 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001642 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001643
1644 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1645 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001646 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08001647 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001648
Mike Yu724f77d2019-08-16 11:14:50 +08001649 const hostent* result = gethostbyname("tls1");
Ken Chenb9fa2062018-11-13 21:51:13 +08001650 ASSERT_FALSE(result == nullptr);
1651 EXPECT_EQ("1.2.3.1", ToString(result));
1652
1653 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001654 EXPECT_TRUE(tls.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001655
1656 // Stop the TLS server. Since we're in opportunistic mode, queries will
1657 // fall back to the locally-assigned (clear text) nameservers.
1658 tls.stopServer();
1659
1660 dns.clearQueries();
1661 result = gethostbyname("tls2");
1662 EXPECT_FALSE(result == nullptr);
1663 EXPECT_EQ("1.2.3.2", ToString(result));
1664 const auto queries = dns.queries();
1665 EXPECT_EQ(1U, queries.size());
waynema29253052019-08-20 11:26:08 +08001666 EXPECT_EQ("tls2.example.com.", queries[0].name);
1667 EXPECT_EQ(ns_t_a, queries[0].type);
Ken Chenb9fa2062018-11-13 21:51:13 +08001668
1669 // Reset the resolvers without enabling TLS. Queries should still be routed
1670 // to the UDP endpoint.
Xiao Ma09b71022018-12-11 17:56:32 +09001671 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001672
1673 result = gethostbyname("tls3");
1674 ASSERT_FALSE(result == nullptr);
1675 EXPECT_EQ("1.2.3.3", ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +08001676}
1677
Ken Chenb9fa2062018-11-13 21:51:13 +08001678TEST_F(ResolverTest, GetHostByName_TlsFailover) {
Xiao Ma09b71022018-12-11 17:56:32 +09001679 constexpr char listen_addr1[] = "127.0.0.3";
1680 constexpr char listen_addr2[] = "127.0.0.4";
1681 constexpr char listen_udp[] = "53";
1682 constexpr char listen_tls[] = "853";
1683 constexpr char host_name1[] = "tlsfailover1.example.com.";
1684 constexpr char host_name2[] = "tlsfailover2.example.com.";
1685 const std::vector<DnsRecord> records1 = {
1686 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1687 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1688 };
1689 const std::vector<DnsRecord> records2 = {
1690 {host_name1, ns_type::ns_t_a, "1.2.3.3"},
1691 {host_name2, ns_type::ns_t_a, "1.2.3.4"},
1692 };
1693
1694 test::DNSResponder dns1(listen_addr1);
1695 test::DNSResponder dns2(listen_addr2);
1696 StartDns(dns1, records1);
1697 StartDns(dns2, records2);
1698
Luke Huangf8215372019-11-22 11:53:41 +08001699 std::vector<std::string> servers = {listen_addr1, listen_addr2};
Ken Chenb9fa2062018-11-13 21:51:13 +08001700
1701 test::DnsTlsFrontend tls1(listen_addr1, listen_tls, listen_addr1, listen_udp);
1702 test::DnsTlsFrontend tls2(listen_addr2, listen_tls, listen_addr2, listen_udp);
1703 ASSERT_TRUE(tls1.startServer());
1704 ASSERT_TRUE(tls2.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001705 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1706 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08001707 EXPECT_TRUE(WaitForPrivateDnsValidation(tls1.listen_address(), true));
1708 EXPECT_TRUE(WaitForPrivateDnsValidation(tls2.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001709
Mike Yu724f77d2019-08-16 11:14:50 +08001710 const hostent* result = gethostbyname("tlsfailover1");
Ken Chenb9fa2062018-11-13 21:51:13 +08001711 ASSERT_FALSE(result == nullptr);
1712 EXPECT_EQ("1.2.3.1", ToString(result));
1713
1714 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001715 EXPECT_TRUE(tls1.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001716 // No new queries should have reached tls2.
Luke Huang0a0870d2020-02-12 20:41:10 +08001717 EXPECT_TRUE(tls2.waitForQueries(1));
Ken Chenb9fa2062018-11-13 21:51:13 +08001718
1719 // Stop tls1. Subsequent queries should attempt to reach tls1, fail, and retry to tls2.
1720 tls1.stopServer();
1721
1722 result = gethostbyname("tlsfailover2");
1723 EXPECT_EQ("1.2.3.4", ToString(result));
1724
1725 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001726 EXPECT_TRUE(tls2.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001727
1728 // No additional queries should have reached the insecure servers.
1729 EXPECT_EQ(2U, dns1.queries().size());
1730 EXPECT_EQ(2U, dns2.queries().size());
1731
1732 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001733 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Ken Chenb9fa2062018-11-13 21:51:13 +08001734}
1735
1736TEST_F(ResolverTest, GetHostByName_BadTlsName) {
Xiao Ma09b71022018-12-11 17:56:32 +09001737 constexpr char listen_addr[] = "127.0.0.3";
1738 constexpr char listen_udp[] = "53";
1739 constexpr char listen_tls[] = "853";
1740 constexpr char host_name[] = "badtlsname.example.com.";
1741
1742 test::DNSResponder dns;
1743 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.1"}});
Luke Huangf8215372019-11-22 11:53:41 +08001744 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001745
1746 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1747 ASSERT_TRUE(tls.startServer());
Xiao Ma09b71022018-12-11 17:56:32 +09001748 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
waynema0e73c2e2019-07-31 15:04:08 +08001749 kDefaultIncorrectPrivateDnsHostName));
Ken Chenb9fa2062018-11-13 21:51:13 +08001750
waynema0e73c2e2019-07-31 15:04:08 +08001751 // The TLS handshake would fail because the name of TLS server doesn't
1752 // match with TLS server's certificate.
Mike Yu724f77d2019-08-16 11:14:50 +08001753 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), false));
Ken Chenb9fa2062018-11-13 21:51:13 +08001754
1755 // The query should fail hard, because a name was specified.
1756 EXPECT_EQ(nullptr, gethostbyname("badtlsname"));
1757
1758 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001759 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001760}
1761
1762TEST_F(ResolverTest, GetAddrInfo_Tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001763 constexpr char listen_addr[] = "127.0.0.3";
1764 constexpr char listen_udp[] = "53";
1765 constexpr char listen_tls[] = "853";
1766 constexpr char host_name[] = "addrinfotls.example.com.";
1767 const std::vector<DnsRecord> records = {
1768 {host_name, ns_type::ns_t_a, "1.2.3.4"},
1769 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
1770 };
1771
1772 test::DNSResponder dns;
1773 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001774 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001775
1776 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1777 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001778 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1779 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08001780 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001781
1782 dns.clearQueries();
1783 ScopedAddrinfo result = safe_getaddrinfo("addrinfotls", nullptr, nullptr);
1784 EXPECT_TRUE(result != nullptr);
1785 size_t found = GetNumQueries(dns, host_name);
1786 EXPECT_LE(1U, found);
1787 // Could be A or AAAA
1788 std::string result_str = ToString(result);
1789 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +08001790 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08001791 // Wait for both A and AAAA queries to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001792 EXPECT_TRUE(tls.waitForQueries(3));
Ken Chenb9fa2062018-11-13 21:51:13 +08001793
1794 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001795 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001796}
1797
1798TEST_F(ResolverTest, TlsBypass) {
1799 const char OFF[] = "off";
1800 const char OPPORTUNISTIC[] = "opportunistic";
1801 const char STRICT[] = "strict";
1802
1803 const char GETHOSTBYNAME[] = "gethostbyname";
1804 const char GETADDRINFO[] = "getaddrinfo";
1805 const char GETADDRINFOFORNET[] = "getaddrinfofornet";
1806
1807 const unsigned BYPASS_NETID = NETID_USE_LOCAL_NAMESERVERS | TEST_NETID;
1808
Ken Chenb9fa2062018-11-13 21:51:13 +08001809 const char ADDR4[] = "192.0.2.1";
1810 const char ADDR6[] = "2001:db8::1";
1811
1812 const char cleartext_addr[] = "127.0.0.53";
1813 const char cleartext_port[] = "53";
1814 const char tls_port[] = "853";
Luke Huangf8215372019-11-22 11:53:41 +08001815 const std::vector<std::string> servers = {cleartext_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001816
Xiao Ma09b71022018-12-11 17:56:32 +09001817 test::DNSResponder dns(cleartext_addr);
Ken Chenb9fa2062018-11-13 21:51:13 +08001818 ASSERT_TRUE(dns.startServer());
1819
1820 test::DnsTlsFrontend tls(cleartext_addr, tls_port, cleartext_addr, cleartext_port);
Mike Yudd4ac2d2019-05-31 16:52:11 +08001821 ASSERT_TRUE(tls.startServer());
Ken Chenb9fa2062018-11-13 21:51:13 +08001822
Luke Huangf8215372019-11-22 11:53:41 +08001823 // clang-format off
Ken Chenb9fa2062018-11-13 21:51:13 +08001824 struct TestConfig {
1825 const std::string mode;
1826 const bool withWorkingTLS;
1827 const std::string method;
1828
1829 std::string asHostName() const {
Luke Huangf8215372019-11-22 11:53:41 +08001830 return StringPrintf("%s.%s.%s.", mode.c_str(), withWorkingTLS ? "tlsOn" : "tlsOff",
Ken Chenb9fa2062018-11-13 21:51:13 +08001831 method.c_str());
1832 }
1833 } testConfigs[]{
Ken Chenb9fa2062018-11-13 21:51:13 +08001834 {OFF, true, GETHOSTBYNAME},
1835 {OPPORTUNISTIC, true, GETHOSTBYNAME},
1836 {STRICT, true, GETHOSTBYNAME},
Ken Chenb9fa2062018-11-13 21:51:13 +08001837 {OFF, true, GETADDRINFO},
1838 {OPPORTUNISTIC, true, GETADDRINFO},
1839 {STRICT, true, GETADDRINFO},
Ken Chenb9fa2062018-11-13 21:51:13 +08001840 {OFF, true, GETADDRINFOFORNET},
1841 {OPPORTUNISTIC, true, GETADDRINFOFORNET},
1842 {STRICT, true, GETADDRINFOFORNET},
Mike Yudd4ac2d2019-05-31 16:52:11 +08001843 {OFF, false, GETHOSTBYNAME},
1844 {OPPORTUNISTIC, false, GETHOSTBYNAME},
1845 {STRICT, false, GETHOSTBYNAME},
1846 {OFF, false, GETADDRINFO},
1847 {OPPORTUNISTIC, false, GETADDRINFO},
1848 {STRICT, false, GETADDRINFO},
1849 {OFF, false, GETADDRINFOFORNET},
1850 {OPPORTUNISTIC, false, GETADDRINFOFORNET},
1851 {STRICT, false, GETADDRINFOFORNET},
Ken Chenb9fa2062018-11-13 21:51:13 +08001852 };
Luke Huangf8215372019-11-22 11:53:41 +08001853 // clang-format on
Ken Chenb9fa2062018-11-13 21:51:13 +08001854
1855 for (const auto& config : testConfigs) {
1856 const std::string testHostName = config.asHostName();
1857 SCOPED_TRACE(testHostName);
1858
1859 // Don't tempt test bugs due to caching.
1860 const char* host_name = testHostName.c_str();
1861 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
1862 dns.addMapping(host_name, ns_type::ns_t_aaaa, ADDR6);
1863
Mike Yudd4ac2d2019-05-31 16:52:11 +08001864 if (config.withWorkingTLS) {
1865 if (!tls.running()) {
1866 ASSERT_TRUE(tls.startServer());
1867 }
1868 } else {
1869 if (tls.running()) {
1870 ASSERT_TRUE(tls.stopServer());
1871 }
1872 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001873
1874 if (config.mode == OFF) {
Xiao Ma09b71022018-12-11 17:56:32 +09001875 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, kDefaultSearchDomains,
1876 kDefaultParams));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001877 } else /* OPPORTUNISTIC or STRICT */ {
1878 const char* tls_hostname = (config.mode == STRICT) ? kDefaultPrivateDnsHostName : "";
Xiao Ma09b71022018-12-11 17:56:32 +09001879 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001880 kDefaultParams, tls_hostname));
Mike Yu724f77d2019-08-16 11:14:50 +08001881
1882 // Wait for the validation event. If the server is running, the validation should
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001883 // succeed; otherwise, the validation should fail.
Mike Yu724f77d2019-08-16 11:14:50 +08001884 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), config.withWorkingTLS));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001885 if (config.withWorkingTLS) {
1886 EXPECT_TRUE(tls.waitForQueries(1));
1887 tls.clearQueries();
1888 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001889 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001890
1891 const hostent* h_result = nullptr;
1892 ScopedAddrinfo ai_result;
1893
1894 if (config.method == GETHOSTBYNAME) {
1895 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
1896 h_result = gethostbyname(host_name);
1897
1898 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
1899 ASSERT_FALSE(h_result == nullptr);
1900 ASSERT_EQ(4, h_result->h_length);
1901 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
1902 EXPECT_EQ(ADDR4, ToString(h_result));
1903 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
1904 } else if (config.method == GETADDRINFO) {
1905 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
1906 ai_result = safe_getaddrinfo(host_name, nullptr, nullptr);
1907 EXPECT_TRUE(ai_result != nullptr);
1908
1909 EXPECT_LE(1U, GetNumQueries(dns, host_name));
1910 // Could be A or AAAA
1911 const std::string result_str = ToString(ai_result);
1912 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
Luke Huangf8215372019-11-22 11:53:41 +08001913 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08001914 } else if (config.method == GETADDRINFOFORNET) {
1915 addrinfo* raw_ai_result = nullptr;
1916 EXPECT_EQ(0, android_getaddrinfofornet(host_name, /*servname=*/nullptr,
1917 /*hints=*/nullptr, BYPASS_NETID, MARK_UNSET,
1918 &raw_ai_result));
1919 ai_result.reset(raw_ai_result);
1920
1921 EXPECT_LE(1U, GetNumQueries(dns, host_name));
1922 // Could be A or AAAA
1923 const std::string result_str = ToString(ai_result);
1924 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
Luke Huangf8215372019-11-22 11:53:41 +08001925 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08001926 }
1927
Mike Yudd4ac2d2019-05-31 16:52:11 +08001928 EXPECT_EQ(0, tls.queries());
Ken Chenb9fa2062018-11-13 21:51:13 +08001929
1930 // Clear per-process resolv netid.
1931 ASSERT_EQ(0, setNetworkForResolv(NETID_UNSET));
Ken Chenb9fa2062018-11-13 21:51:13 +08001932 dns.clearQueries();
1933 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001934}
1935
1936TEST_F(ResolverTest, StrictMode_NoTlsServers) {
Xiao Ma09b71022018-12-11 17:56:32 +09001937 constexpr char cleartext_addr[] = "127.0.0.53";
Luke Huangf8215372019-11-22 11:53:41 +08001938 const std::vector<std::string> servers = {cleartext_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09001939 constexpr char host_name[] = "strictmode.notlsips.example.com.";
1940 const std::vector<DnsRecord> records = {
1941 {host_name, ns_type::ns_t_a, "1.2.3.4"},
1942 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
1943 };
Ken Chenb9fa2062018-11-13 21:51:13 +08001944
Xiao Ma09b71022018-12-11 17:56:32 +09001945 test::DNSResponder dns(cleartext_addr);
1946 StartDns(dns, records);
Ken Chenb9fa2062018-11-13 21:51:13 +08001947
waynema0e73c2e2019-07-31 15:04:08 +08001948 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1949 kDefaultIncorrectPrivateDnsHostName));
Ken Chenb9fa2062018-11-13 21:51:13 +08001950
1951 addrinfo* ai_result = nullptr;
1952 EXPECT_NE(0, getaddrinfo(host_name, nullptr, nullptr, &ai_result));
1953 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
1954}
Luke Huang94b10b92018-11-21 20:13:38 +08001955
1956namespace {
1957
Luke Huang70931aa2019-01-31 11:57:41 +08001958int getAsyncResponse(int fd, int* rcode, uint8_t* buf, int bufLen) {
Luke Huang94b10b92018-11-21 20:13:38 +08001959 struct pollfd wait_fd[1];
1960 wait_fd[0].fd = fd;
1961 wait_fd[0].events = POLLIN;
1962 short revents;
1963 int ret;
1964
1965 ret = poll(wait_fd, 1, -1);
1966 revents = wait_fd[0].revents;
1967 if (revents & POLLIN) {
1968 int n = resNetworkResult(fd, rcode, buf, bufLen);
Luke Huangba7bef92018-12-26 16:53:03 +08001969 // Verify that resNetworkResult() closed the fd
1970 char dummy;
1971 EXPECT_EQ(-1, read(fd, &dummy, sizeof dummy));
1972 EXPECT_EQ(EBADF, errno);
Luke Huang94b10b92018-11-21 20:13:38 +08001973 return n;
1974 }
1975 return -1;
1976}
1977
Luke Huang70931aa2019-01-31 11:57:41 +08001978std::string toString(uint8_t* buf, int bufLen, int ipType) {
Luke Huang94b10b92018-11-21 20:13:38 +08001979 ns_msg handle;
1980 int ancount, n = 0;
1981 ns_rr rr;
1982
Luke Huangf8215372019-11-22 11:53:41 +08001983 if (ns_initparse((const uint8_t*)buf, bufLen, &handle) >= 0) {
Luke Huang94b10b92018-11-21 20:13:38 +08001984 ancount = ns_msg_count(handle, ns_s_an);
1985 if (ns_parserr(&handle, ns_s_an, n, &rr) == 0) {
Luke Huang70931aa2019-01-31 11:57:41 +08001986 const uint8_t* rdata = ns_rr_rdata(rr);
Luke Huang94b10b92018-11-21 20:13:38 +08001987 char buffer[INET6_ADDRSTRLEN];
Luke Huangf8215372019-11-22 11:53:41 +08001988 if (inet_ntop(ipType, (const char*)rdata, buffer, sizeof(buffer))) {
Luke Huang94b10b92018-11-21 20:13:38 +08001989 return buffer;
1990 }
1991 }
1992 }
1993 return "";
1994}
1995
1996int dns_open_proxy() {
1997 int s = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
1998 if (s == -1) {
1999 return -1;
2000 }
2001 const int one = 1;
2002 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
2003
2004 static const struct sockaddr_un proxy_addr = {
2005 .sun_family = AF_UNIX,
2006 .sun_path = "/dev/socket/dnsproxyd",
2007 };
2008
Luke Huangf8215372019-11-22 11:53:41 +08002009 if (TEMP_FAILURE_RETRY(connect(s, (const struct sockaddr*)&proxy_addr, sizeof(proxy_addr))) !=
Luke Huang94b10b92018-11-21 20:13:38 +08002010 0) {
2011 close(s);
2012 return -1;
2013 }
2014
2015 return s;
2016}
2017
Luke Huangba7bef92018-12-26 16:53:03 +08002018void expectAnswersValid(int fd, int ipType, const std::string& expectedAnswer) {
2019 int rcode = -1;
2020 uint8_t buf[MAXPACKET] = {};
2021
2022 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2023 EXPECT_GT(res, 0);
2024 EXPECT_EQ(expectedAnswer, toString(buf, res, ipType));
2025}
2026
2027void expectAnswersNotValid(int fd, int expectedErrno) {
2028 int rcode = -1;
2029 uint8_t buf[MAXPACKET] = {};
2030
2031 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2032 EXPECT_EQ(expectedErrno, res);
2033}
2034
Luke Huang94b10b92018-11-21 20:13:38 +08002035} // namespace
2036
2037TEST_F(ResolverTest, Async_NormalQueryV4V6) {
Xiao Ma09b71022018-12-11 17:56:32 +09002038 constexpr char listen_addr[] = "127.0.0.4";
2039 constexpr char host_name[] = "howdy.example.com.";
2040 const std::vector<DnsRecord> records = {
2041 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2042 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2043 };
2044
2045 test::DNSResponder dns(listen_addr);
2046 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002047 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002048 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002049
Luke Huangba7bef92018-12-26 16:53:03 +08002050 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2051 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002052 EXPECT_TRUE(fd1 != -1);
2053 EXPECT_TRUE(fd2 != -1);
2054
Luke Huang70931aa2019-01-31 11:57:41 +08002055 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002056 int rcode;
2057 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2058 EXPECT_GT(res, 0);
2059 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
2060
2061 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2062 EXPECT_GT(res, 0);
2063 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2064
2065 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
2066
2067 // Re-query verify cache works
Luke Huangba7bef92018-12-26 16:53:03 +08002068 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2069 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002070
2071 EXPECT_TRUE(fd1 != -1);
2072 EXPECT_TRUE(fd2 != -1);
2073
2074 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2075 EXPECT_GT(res, 0);
2076 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
2077
2078 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2079 EXPECT_GT(res, 0);
2080 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2081
2082 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
2083}
2084
2085TEST_F(ResolverTest, Async_BadQuery) {
Xiao Ma09b71022018-12-11 17:56:32 +09002086 constexpr char listen_addr[] = "127.0.0.4";
2087 constexpr char host_name[] = "howdy.example.com.";
2088 const std::vector<DnsRecord> records = {
2089 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2090 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2091 };
2092
2093 test::DNSResponder dns(listen_addr);
2094 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002095 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002096 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002097
2098 static struct {
2099 int fd;
2100 const char* dname;
2101 const int queryType;
2102 const int expectRcode;
2103 } kTestData[] = {
Luke Huangba7bef92018-12-26 16:53:03 +08002104 {-1, "", ns_t_aaaa, 0},
2105 {-1, "as65ass46", ns_t_aaaa, 0},
2106 {-1, "454564564564", ns_t_aaaa, 0},
2107 {-1, "h645235", ns_t_a, 0},
2108 {-1, "www.google.com", ns_t_a, 0},
Luke Huang94b10b92018-11-21 20:13:38 +08002109 };
2110
2111 for (auto& td : kTestData) {
2112 SCOPED_TRACE(td.dname);
Luke Huangba7bef92018-12-26 16:53:03 +08002113 td.fd = resNetworkQuery(TEST_NETID, td.dname, ns_c_in, td.queryType, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002114 EXPECT_TRUE(td.fd != -1);
2115 }
2116
2117 // dns_responder return empty resp(packet only contains query part) with no error currently
2118 for (const auto& td : kTestData) {
Luke Huang70931aa2019-01-31 11:57:41 +08002119 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002120 int rcode;
2121 SCOPED_TRACE(td.dname);
2122 int res = getAsyncResponse(td.fd, &rcode, buf, MAXPACKET);
2123 EXPECT_GT(res, 0);
2124 EXPECT_EQ(rcode, td.expectRcode);
2125 }
2126}
2127
2128TEST_F(ResolverTest, Async_EmptyAnswer) {
Xiao Ma09b71022018-12-11 17:56:32 +09002129 constexpr char listen_addr[] = "127.0.0.4";
2130 constexpr char host_name[] = "howdy.example.com.";
2131 const std::vector<DnsRecord> records = {
2132 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2133 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2134 };
2135
2136 test::DNSResponder dns(listen_addr);
2137 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002138 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002139 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002140
Luke Huang9c264bb2018-12-18 16:44:41 +08002141 // TODO: Disable retry to make this test explicit.
2142 auto& cv = dns.getCv();
2143 auto& cvMutex = dns.getCvMutex();
2144 int fd1;
2145 // Wait on the condition variable to ensure that the DNS server has handled our first query.
2146 {
2147 std::unique_lock lk(cvMutex);
Luke Huangba7bef92018-12-26 16:53:03 +08002148 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang9c264bb2018-12-18 16:44:41 +08002149 EXPECT_TRUE(fd1 != -1);
2150 EXPECT_EQ(std::cv_status::no_timeout, cv.wait_for(lk, std::chrono::seconds(1)));
2151 }
Luke Huang94b10b92018-11-21 20:13:38 +08002152
Luke Huang94b10b92018-11-21 20:13:38 +08002153 dns.setResponseProbability(0.0);
Luke Huang94b10b92018-11-21 20:13:38 +08002154
Luke Huangba7bef92018-12-26 16:53:03 +08002155 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002156 EXPECT_TRUE(fd2 != -1);
2157
Luke Huangba7bef92018-12-26 16:53:03 +08002158 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002159 EXPECT_TRUE(fd3 != -1);
2160
Luke Huang9c264bb2018-12-18 16:44:41 +08002161 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002162 int rcode;
2163
Luke Huang9c264bb2018-12-18 16:44:41 +08002164 // expect no response
2165 int res = getAsyncResponse(fd3, &rcode, buf, MAXPACKET);
2166 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huang94b10b92018-11-21 20:13:38 +08002167
Luke Huang9c264bb2018-12-18 16:44:41 +08002168 // expect no response
Luke Huang94b10b92018-11-21 20:13:38 +08002169 memset(buf, 0, MAXPACKET);
Luke Huang9c264bb2018-12-18 16:44:41 +08002170 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2171 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huang94b10b92018-11-21 20:13:38 +08002172
Luke Huang94b10b92018-11-21 20:13:38 +08002173 dns.setResponseProbability(1.0);
Luke Huang94b10b92018-11-21 20:13:38 +08002174
Luke Huangba7bef92018-12-26 16:53:03 +08002175 int fd4 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002176 EXPECT_TRUE(fd4 != -1);
2177
2178 memset(buf, 0, MAXPACKET);
2179 res = getAsyncResponse(fd4, &rcode, buf, MAXPACKET);
2180 EXPECT_GT(res, 0);
2181 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2182
2183 memset(buf, 0, MAXPACKET);
2184 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2185 EXPECT_GT(res, 0);
2186 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
Mike Yu532405f2020-06-17 17:46:44 +08002187
2188 // Trailing dot is removed. Is it intended?
2189 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, 0, "howdy.example.com", {"::1.2.3.4"});
2190 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2191 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2192 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, 0, "howdy.example.com", {"1.2.3.4"});
Luke Huang94b10b92018-11-21 20:13:38 +08002193}
2194
2195TEST_F(ResolverTest, Async_MalformedQuery) {
Xiao Ma09b71022018-12-11 17:56:32 +09002196 constexpr char listen_addr[] = "127.0.0.4";
2197 constexpr char host_name[] = "howdy.example.com.";
2198 const std::vector<DnsRecord> records = {
2199 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2200 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2201 };
2202
2203 test::DNSResponder dns(listen_addr);
2204 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002205 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002206 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002207
2208 int fd = dns_open_proxy();
2209 EXPECT_TRUE(fd > 0);
2210
2211 const std::string badMsg = "16-52512#";
Xiao Ma09b71022018-12-11 17:56:32 +09002212 static const struct {
Luke Huang94b10b92018-11-21 20:13:38 +08002213 const std::string cmd;
2214 const int expectErr;
2215 } kTestData[] = {
Luke Huangba7bef92018-12-26 16:53:03 +08002216 // Too few arguments
Luke Huang94b10b92018-11-21 20:13:38 +08002217 {"resnsend " + badMsg + '\0', -EINVAL},
2218 // Bad netId
Luke Huangba7bef92018-12-26 16:53:03 +08002219 {"resnsend badnetId 0 " + badMsg + '\0', -EINVAL},
Luke Huang94b10b92018-11-21 20:13:38 +08002220 // Bad raw data
Luke Huangba7bef92018-12-26 16:53:03 +08002221 {"resnsend " + std::to_string(TEST_NETID) + " 0 " + badMsg + '\0', -EILSEQ},
Luke Huang94b10b92018-11-21 20:13:38 +08002222 };
2223
2224 for (unsigned int i = 0; i < std::size(kTestData); i++) {
2225 auto& td = kTestData[i];
2226 SCOPED_TRACE(td.cmd);
2227 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, td.cmd.c_str(), td.cmd.size()));
2228 EXPECT_EQ(rc, static_cast<ssize_t>(td.cmd.size()));
2229
2230 int32_t tmp;
2231 rc = TEMP_FAILURE_RETRY(read(fd, &tmp, sizeof(tmp)));
2232 EXPECT_TRUE(rc > 0);
2233 EXPECT_EQ(static_cast<int>(ntohl(tmp)), td.expectErr);
2234 }
2235 // Normal query with answer buffer
2236 // This is raw data of query "howdy.example.com" type 1 class 1
2237 std::string query = "81sBAAABAAAAAAAABWhvd2R5B2V4YW1wbGUDY29tAAABAAE=";
Luke Huangba7bef92018-12-26 16:53:03 +08002238 std::string cmd = "resnsend " + std::to_string(TEST_NETID) + " 0 " + query + '\0';
Luke Huang94b10b92018-11-21 20:13:38 +08002239 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
2240 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
2241
Luke Huang70931aa2019-01-31 11:57:41 +08002242 uint8_t smallBuf[1] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002243 int rcode;
2244 rc = getAsyncResponse(fd, &rcode, smallBuf, 1);
Luke Huangba7bef92018-12-26 16:53:03 +08002245 EXPECT_EQ(-EMSGSIZE, rc);
Luke Huang94b10b92018-11-21 20:13:38 +08002246
2247 // Do the normal test with large buffer again
2248 fd = dns_open_proxy();
2249 EXPECT_TRUE(fd > 0);
2250 rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
2251 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
Luke Huang70931aa2019-01-31 11:57:41 +08002252 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002253 rc = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2254 EXPECT_EQ("1.2.3.4", toString(buf, rc, AF_INET));
Mike Yu4f3747b2018-12-02 17:54:29 +09002255}
2256
Luke Huangba7bef92018-12-26 16:53:03 +08002257TEST_F(ResolverTest, Async_CacheFlags) {
Xiao Ma09b71022018-12-11 17:56:32 +09002258 constexpr char listen_addr[] = "127.0.0.4";
Luke Huang4eabbe32020-05-28 03:17:32 +08002259 constexpr char host_name1[] = "howdy.example.com.";
2260 constexpr char host_name2[] = "howdy.example2.com.";
2261 constexpr char host_name3[] = "howdy.example3.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002262 const std::vector<DnsRecord> records = {
Luke Huang4eabbe32020-05-28 03:17:32 +08002263 {host_name1, ns_type::ns_t_a, "1.2.3.4"}, {host_name1, ns_type::ns_t_aaaa, "::1.2.3.4"},
2264 {host_name2, ns_type::ns_t_a, "1.2.3.5"}, {host_name2, ns_type::ns_t_aaaa, "::1.2.3.5"},
2265 {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 +09002266 };
2267
2268 test::DNSResponder dns(listen_addr);
2269 StartDns(dns, records);
Luke Huangba7bef92018-12-26 16:53:03 +08002270 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002271 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huangba7bef92018-12-26 16:53:03 +08002272
2273 // ANDROID_RESOLV_NO_CACHE_STORE
2274 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2275 ANDROID_RESOLV_NO_CACHE_STORE);
2276 EXPECT_TRUE(fd1 != -1);
2277 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2278 ANDROID_RESOLV_NO_CACHE_STORE);
2279 EXPECT_TRUE(fd2 != -1);
2280 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2281 ANDROID_RESOLV_NO_CACHE_STORE);
2282 EXPECT_TRUE(fd3 != -1);
2283
2284 expectAnswersValid(fd3, AF_INET, "1.2.3.4");
2285 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
2286 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2287
2288 // No cache exists, expect 3 queries
Luke Huang4eabbe32020-05-28 03:17:32 +08002289 EXPECT_EQ(3U, GetNumQueries(dns, host_name1));
Luke Huangba7bef92018-12-26 16:53:03 +08002290
Luke Huang4eabbe32020-05-28 03:17:32 +08002291 // Raise a query with no flags to ensure no cache exists. Also make an cache entry for the
2292 // query.
Luke Huangba7bef92018-12-26 16:53:03 +08002293 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2294
2295 EXPECT_TRUE(fd1 != -1);
2296
2297 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2298
Luke Huang4eabbe32020-05-28 03:17:32 +08002299 // Expect 4 queries because there should be no cache before this query.
2300 EXPECT_EQ(4U, GetNumQueries(dns, host_name1));
2301
2302 // Now we have the cache entry, re-query with ANDROID_RESOLV_NO_CACHE_STORE to ensure
2303 // that ANDROID_RESOLV_NO_CACHE_STORE implied ANDROID_RESOLV_NO_CACHE_LOOKUP.
2304 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2305 ANDROID_RESOLV_NO_CACHE_STORE);
2306 EXPECT_TRUE(fd1 != -1);
2307 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2308 // Expect 5 queries because we shouldn't do cache lookup for the query which has
2309 // ANDROID_RESOLV_NO_CACHE_STORE.
2310 EXPECT_EQ(5U, GetNumQueries(dns, host_name1));
Luke Huangba7bef92018-12-26 16:53:03 +08002311
2312 // ANDROID_RESOLV_NO_CACHE_LOOKUP
2313 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2314 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2315 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2316 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2317
2318 EXPECT_TRUE(fd1 != -1);
2319 EXPECT_TRUE(fd2 != -1);
2320
2321 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
2322 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2323
Luke Huang4eabbe32020-05-28 03:17:32 +08002324 // Cache was skipped, expect 2 more queries.
2325 EXPECT_EQ(7U, GetNumQueries(dns, host_name1));
Luke Huangba7bef92018-12-26 16:53:03 +08002326
2327 // Re-query verify cache works
Luke Huang4eabbe32020-05-28 03:17:32 +08002328 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huangba7bef92018-12-26 16:53:03 +08002329 EXPECT_TRUE(fd1 != -1);
2330 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2331
Luke Huang4eabbe32020-05-28 03:17:32 +08002332 // Cache hits, expect still 7 queries
2333 EXPECT_EQ(7U, GetNumQueries(dns, host_name1));
Luke Huanga1d74182019-03-19 17:30:36 +08002334
2335 // Start to verify if ANDROID_RESOLV_NO_CACHE_LOOKUP does write response into cache
2336 dns.clearQueries();
2337
Luke Huang4eabbe32020-05-28 03:17:32 +08002338 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa,
Luke Huanga1d74182019-03-19 17:30:36 +08002339 ANDROID_RESOLV_NO_CACHE_LOOKUP);
Luke Huang4eabbe32020-05-28 03:17:32 +08002340 fd2 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa,
Luke Huanga1d74182019-03-19 17:30:36 +08002341 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2342
2343 EXPECT_TRUE(fd1 != -1);
2344 EXPECT_TRUE(fd2 != -1);
2345
Luke Huang4eabbe32020-05-28 03:17:32 +08002346 expectAnswersValid(fd2, AF_INET6, "::1.2.3.5");
2347 expectAnswersValid(fd1, AF_INET6, "::1.2.3.5");
Luke Huanga1d74182019-03-19 17:30:36 +08002348
2349 // Skip cache, expect 2 queries
Luke Huang4eabbe32020-05-28 03:17:32 +08002350 EXPECT_EQ(2U, GetNumQueries(dns, host_name2));
Luke Huanga1d74182019-03-19 17:30:36 +08002351
2352 // Re-query without flags
Luke Huang4eabbe32020-05-28 03:17:32 +08002353 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa, 0);
2354 fd2 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa, 0);
Luke Huanga1d74182019-03-19 17:30:36 +08002355
2356 EXPECT_TRUE(fd1 != -1);
2357 EXPECT_TRUE(fd2 != -1);
2358
Luke Huang4eabbe32020-05-28 03:17:32 +08002359 expectAnswersValid(fd2, AF_INET6, "::1.2.3.5");
2360 expectAnswersValid(fd1, AF_INET6, "::1.2.3.5");
Luke Huanga1d74182019-03-19 17:30:36 +08002361
2362 // Cache hits, expect still 2 queries
Luke Huang4eabbe32020-05-28 03:17:32 +08002363 EXPECT_EQ(2U, GetNumQueries(dns, host_name2));
Luke Huang40f5f492019-05-09 19:37:35 +08002364
2365 // Test both ANDROID_RESOLV_NO_CACHE_STORE and ANDROID_RESOLV_NO_CACHE_LOOKUP are set
2366 dns.clearQueries();
2367
Luke Huang4eabbe32020-05-28 03:17:32 +08002368 // Make sure that the cache of "howdy.example3.com" exists.
2369 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang40f5f492019-05-09 19:37:35 +08002370 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002371 expectAnswersValid(fd1, AF_INET6, "::1.2.3.6");
2372 EXPECT_EQ(1U, GetNumQueries(dns, host_name3));
Luke Huang40f5f492019-05-09 19:37:35 +08002373
2374 // Re-query with testFlags
2375 const int testFlag = ANDROID_RESOLV_NO_CACHE_STORE | ANDROID_RESOLV_NO_CACHE_LOOKUP;
Luke Huang4eabbe32020-05-28 03:17:32 +08002376 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_aaaa, testFlag);
Luke Huang40f5f492019-05-09 19:37:35 +08002377 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002378 expectAnswersValid(fd1, AF_INET6, "::1.2.3.6");
Luke Huang40f5f492019-05-09 19:37:35 +08002379 // Expect cache lookup is skipped.
Luke Huang4eabbe32020-05-28 03:17:32 +08002380 EXPECT_EQ(2U, GetNumQueries(dns, host_name3));
Luke Huang40f5f492019-05-09 19:37:35 +08002381
2382 // Do another query with testFlags
Luke Huang4eabbe32020-05-28 03:17:32 +08002383 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_a, testFlag);
Luke Huang40f5f492019-05-09 19:37:35 +08002384 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002385 expectAnswersValid(fd1, AF_INET, "1.2.3.6");
Luke Huang40f5f492019-05-09 19:37:35 +08002386 // Expect cache lookup is skipped.
Luke Huang4eabbe32020-05-28 03:17:32 +08002387 EXPECT_EQ(3U, GetNumQueries(dns, host_name3));
Luke Huang40f5f492019-05-09 19:37:35 +08002388
2389 // Re-query with no flags
Luke Huang4eabbe32020-05-28 03:17:32 +08002390 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_a, 0);
Luke Huang40f5f492019-05-09 19:37:35 +08002391 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002392 expectAnswersValid(fd1, AF_INET, "1.2.3.6");
Luke Huang40f5f492019-05-09 19:37:35 +08002393 // Expect no cache hit because cache storing is also skipped in previous query.
Luke Huang4eabbe32020-05-28 03:17:32 +08002394 EXPECT_EQ(4U, GetNumQueries(dns, host_name3));
Luke Huangba7bef92018-12-26 16:53:03 +08002395}
2396
Luke Huang08b13d22020-02-05 14:46:21 +08002397TEST_F(ResolverTest, Async_NoCacheStoreFlagDoesNotRefreshStaleCacheEntry) {
2398 constexpr char listen_addr[] = "127.0.0.4";
2399 constexpr char host_name[] = "howdy.example.com.";
2400 const std::vector<DnsRecord> records = {
2401 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2402 };
2403
2404 test::DNSResponder dns(listen_addr);
2405 StartDns(dns, records);
2406 std::vector<std::string> servers = {listen_addr};
2407 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
2408
2409 const unsigned SHORT_TTL_SEC = 1;
2410 dns.setTtl(SHORT_TTL_SEC);
2411
2412 // Refer to b/148842821 for the purpose of below test steps.
2413 // Basically, this test is used to ensure stale cache case is handled
2414 // correctly with ANDROID_RESOLV_NO_CACHE_STORE.
2415 int fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2416 EXPECT_TRUE(fd != -1);
2417 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2418
2419 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2420 dns.clearQueries();
2421
2422 // Wait until cache expired
2423 sleep(SHORT_TTL_SEC + 0.5);
2424
2425 // Now request the same hostname again.
2426 // We should see a new DNS query because the entry in cache has become stale.
2427 // Due to ANDROID_RESOLV_NO_CACHE_STORE, this query must *not* refresh that stale entry.
2428 fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2429 ANDROID_RESOLV_NO_CACHE_STORE);
2430 EXPECT_TRUE(fd != -1);
2431 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2432 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2433 dns.clearQueries();
2434
2435 // If the cache is still stale, we expect to see one more DNS query
2436 // (this time the cache will be refreshed, but we're not checking for it).
2437 fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2438 EXPECT_TRUE(fd != -1);
2439 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2440 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2441}
2442
Luke Huangba7bef92018-12-26 16:53:03 +08002443TEST_F(ResolverTest, Async_NoRetryFlag) {
Luke Huang70931aa2019-01-31 11:57:41 +08002444 constexpr char listen_addr0[] = "127.0.0.4";
2445 constexpr char listen_addr1[] = "127.0.0.6";
Xiao Ma09b71022018-12-11 17:56:32 +09002446 constexpr char host_name[] = "howdy.example.com.";
2447 const std::vector<DnsRecord> records = {
2448 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2449 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2450 };
2451
Luke Huang70931aa2019-01-31 11:57:41 +08002452 test::DNSResponder dns0(listen_addr0);
2453 test::DNSResponder dns1(listen_addr1);
2454 StartDns(dns0, records);
2455 StartDns(dns1, records);
2456 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr0, listen_addr1}));
Luke Huangba7bef92018-12-26 16:53:03 +08002457
Luke Huang70931aa2019-01-31 11:57:41 +08002458 dns0.clearQueries();
2459 dns1.clearQueries();
2460
2461 dns0.setResponseProbability(0.0);
2462 dns1.setResponseProbability(0.0);
Luke Huangba7bef92018-12-26 16:53:03 +08002463
2464 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2465 ANDROID_RESOLV_NO_RETRY);
2466 EXPECT_TRUE(fd1 != -1);
2467
2468 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa,
2469 ANDROID_RESOLV_NO_RETRY);
2470 EXPECT_TRUE(fd2 != -1);
2471
2472 // expect no response
2473 expectAnswersNotValid(fd1, -ETIMEDOUT);
2474 expectAnswersNotValid(fd2, -ETIMEDOUT);
Mike Yu532405f2020-06-17 17:46:44 +08002475 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2476 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
Luke Huangba7bef92018-12-26 16:53:03 +08002477
Luke Huang70931aa2019-01-31 11:57:41 +08002478 // No retry case, expect total 2 queries. The server is selected randomly.
2479 EXPECT_EQ(2U, GetNumQueries(dns0, host_name) + GetNumQueries(dns1, host_name));
Luke Huangba7bef92018-12-26 16:53:03 +08002480
Luke Huang70931aa2019-01-31 11:57:41 +08002481 dns0.clearQueries();
2482 dns1.clearQueries();
Luke Huangba7bef92018-12-26 16:53:03 +08002483
2484 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2485 EXPECT_TRUE(fd1 != -1);
2486
2487 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
2488 EXPECT_TRUE(fd2 != -1);
2489
2490 // expect no response
2491 expectAnswersNotValid(fd1, -ETIMEDOUT);
2492 expectAnswersNotValid(fd2, -ETIMEDOUT);
Mike Yu532405f2020-06-17 17:46:44 +08002493 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2494 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
Luke Huangba7bef92018-12-26 16:53:03 +08002495
2496 // Retry case, expect 4 queries
Luke Huang70931aa2019-01-31 11:57:41 +08002497 EXPECT_EQ(4U, GetNumQueries(dns0, host_name));
2498 EXPECT_EQ(4U, GetNumQueries(dns1, host_name));
2499}
2500
2501TEST_F(ResolverTest, Async_VerifyQueryID) {
2502 constexpr char listen_addr[] = "127.0.0.4";
2503 constexpr char host_name[] = "howdy.example.com.";
2504 const std::vector<DnsRecord> records = {
2505 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2506 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2507 };
2508
2509 test::DNSResponder dns(listen_addr);
2510 StartDns(dns, records);
2511 std::vector<std::string> servers = {listen_addr};
2512 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
2513
2514 const uint8_t queryBuf1[] = {
2515 /* Header */
2516 0x55, 0x66, /* Transaction ID */
2517 0x01, 0x00, /* Flags */
2518 0x00, 0x01, /* Questions */
2519 0x00, 0x00, /* Answer RRs */
2520 0x00, 0x00, /* Authority RRs */
2521 0x00, 0x00, /* Additional RRs */
2522 /* Queries */
2523 0x05, 0x68, 0x6f, 0x77, 0x64, 0x79, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
2524 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name */
2525 0x00, 0x01, /* Type */
2526 0x00, 0x01 /* Class */
2527 };
2528
2529 int fd = resNetworkSend(TEST_NETID, queryBuf1, sizeof(queryBuf1), 0);
2530 EXPECT_TRUE(fd != -1);
2531
2532 uint8_t buf[MAXPACKET] = {};
2533 int rcode;
2534
2535 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2536 EXPECT_GT(res, 0);
2537 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2538
2539 auto hp = reinterpret_cast<HEADER*>(buf);
2540 EXPECT_EQ(21862U, htons(hp->id));
2541
2542 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2543
2544 const uint8_t queryBuf2[] = {
2545 /* Header */
2546 0x00, 0x53, /* Transaction ID */
2547 0x01, 0x00, /* Flags */
2548 0x00, 0x01, /* Questions */
2549 0x00, 0x00, /* Answer RRs */
2550 0x00, 0x00, /* Authority RRs */
2551 0x00, 0x00, /* Additional RRs */
2552 /* Queries */
2553 0x05, 0x68, 0x6f, 0x77, 0x64, 0x79, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
2554 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name */
2555 0x00, 0x01, /* Type */
2556 0x00, 0x01 /* Class */
2557 };
2558
2559 // Re-query verify cache works and query id is correct
2560 fd = resNetworkSend(TEST_NETID, queryBuf2, sizeof(queryBuf2), 0);
2561
2562 EXPECT_TRUE(fd != -1);
2563
2564 res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2565 EXPECT_GT(res, 0);
2566 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2567
2568 EXPECT_EQ(0x0053U, htons(hp->id));
2569
2570 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
Luke Huangba7bef92018-12-26 16:53:03 +08002571}
2572
Mike Yu4f3747b2018-12-02 17:54:29 +09002573// This test checks that the resolver should not generate the request containing OPT RR when using
Ken Chen0a015532019-01-02 14:59:38 +08002574// cleartext DNS. If we query the DNS server not supporting EDNS0 and it reponds with
2575// FORMERR_ON_EDNS, we will fallback to no EDNS0 and try again. If the server does no response, we
2576// won't retry so that we get no answer.
Mike Yu4f3747b2018-12-02 17:54:29 +09002577TEST_F(ResolverTest, BrokenEdns) {
2578 typedef test::DNSResponder::Edns Edns;
2579 enum ExpectResult { EXPECT_FAILURE, EXPECT_SUCCESS };
2580
Mike Yu3977d482020-02-26 17:18:57 +08002581 // Perform cleartext query in off mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002582 const char OFF[] = "off";
Mike Yu3977d482020-02-26 17:18:57 +08002583
2584 // Perform cleartext query when there's no private DNS server validated in opportunistic mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002585 const char OPPORTUNISTIC_UDP[] = "opportunistic_udp";
Mike Yu3977d482020-02-26 17:18:57 +08002586
2587 // Perform cleartext query when there is a private DNS server validated in opportunistic mode.
2588 const char OPPORTUNISTIC_FALLBACK_UDP[] = "opportunistic_fallback_udp";
2589
2590 // Perform cyphertext query in opportunistic mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002591 const char OPPORTUNISTIC_TLS[] = "opportunistic_tls";
Mike Yu3977d482020-02-26 17:18:57 +08002592
2593 // Perform cyphertext query in strict mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002594 const char STRICT[] = "strict";
Mike Yu3977d482020-02-26 17:18:57 +08002595
Mike Yu4f3747b2018-12-02 17:54:29 +09002596 const char GETHOSTBYNAME[] = "gethostbyname";
2597 const char GETADDRINFO[] = "getaddrinfo";
Mike Yu4f3747b2018-12-02 17:54:29 +09002598 const char ADDR4[] = "192.0.2.1";
2599 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2600 const char CLEARTEXT_PORT[] = "53";
2601 const char TLS_PORT[] = "853";
Luke Huangf8215372019-11-22 11:53:41 +08002602 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
Mike Yu3977d482020-02-26 17:18:57 +08002603 ResolverParamsParcel paramsForCleanup = DnsResponderClient::GetDefaultResolverParamsParcel();
2604 paramsForCleanup.servers.clear();
2605 paramsForCleanup.tlsServers.clear();
Mike Yu4f3747b2018-12-02 17:54:29 +09002606
Mike Yufc125e42019-05-15 20:41:28 +08002607 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Mike Yu4f3747b2018-12-02 17:54:29 +09002608 ASSERT_TRUE(dns.startServer());
2609
2610 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2611
Luke Huangf8215372019-11-22 11:53:41 +08002612 // clang-format off
Mike Yu4f3747b2018-12-02 17:54:29 +09002613 static const struct TestConfig {
2614 std::string mode;
2615 std::string method;
2616 Edns edns;
2617 ExpectResult expectResult;
2618
2619 std::string asHostName() const {
2620 const char* ednsString;
2621 switch (edns) {
2622 case Edns::ON:
2623 ednsString = "ednsOn";
2624 break;
Ken Chen0a015532019-01-02 14:59:38 +08002625 case Edns::FORMERR_ON_EDNS:
Mike Yu4f3747b2018-12-02 17:54:29 +09002626 ednsString = "ednsFormerr";
2627 break;
2628 case Edns::DROP:
2629 ednsString = "ednsDrop";
2630 break;
2631 default:
2632 ednsString = "";
2633 break;
2634 }
2635 return StringPrintf("%s.%s.%s.", mode.c_str(), method.c_str(), ednsString);
2636 }
2637 } testConfigs[] = {
Mike Yu3977d482020-02-26 17:18:57 +08002638 // In OPPORTUNISTIC_TLS, if the DNS server doesn't support EDNS0 but TLS, the lookup
2639 // fails. Could such server exist? if so, we might need to fix it to fallback to
2640 // cleartext query. If the server still make no response for the queries with EDNS0, we
2641 // might also need to fix it to retry without EDNS0.
Mike Yu4f3747b2018-12-02 17:54:29 +09002642 // Another thing is that {OPPORTUNISTIC_TLS, Edns::DROP} and {STRICT, Edns::DROP} are
2643 // commented out since TLS timeout is not configurable.
2644 // TODO: Uncomment them after TLS timeout is configurable.
Mike Yu3977d482020-02-26 17:18:57 +08002645 {OFF, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2646 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2647 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2648 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2649 {STRICT, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2650 {OFF, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2651 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2652 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2653 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2654 {STRICT, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2655 {OFF, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2656 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2657
2658 // The failure is due to no retry on timeout. Maybe fix it?
2659 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2660
2661 //{OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2662 //{STRICT, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2663 {OFF, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2664 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2665 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2666 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2667 {STRICT, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2668 {OFF, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2669 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2670 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2671 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2672 {STRICT, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2673 {OFF, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2674 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2675
2676 // The failure is due to no retry on timeout. Maybe fix it?
2677 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2678
Mike Yu4f3747b2018-12-02 17:54:29 +09002679 //{OPPORTUNISTIC_TLS, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2680 //{STRICT, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2681 };
Luke Huangf8215372019-11-22 11:53:41 +08002682 // clang-format on
Mike Yu4f3747b2018-12-02 17:54:29 +09002683
2684 for (const auto& config : testConfigs) {
2685 const std::string testHostName = config.asHostName();
2686 SCOPED_TRACE(testHostName);
2687
2688 const char* host_name = testHostName.c_str();
2689 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
2690 dns.setEdns(config.edns);
2691
2692 if (config.mode == OFF) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002693 if (tls.running()) {
2694 ASSERT_TRUE(tls.stopServer());
2695 }
Xiao Ma09b71022018-12-11 17:56:32 +09002696 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Mike Yu4f3747b2018-12-02 17:54:29 +09002697 } else if (config.mode == OPPORTUNISTIC_UDP) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002698 if (tls.running()) {
2699 ASSERT_TRUE(tls.stopServer());
2700 }
Xiao Ma09b71022018-12-11 17:56:32 +09002701 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002702 kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002703 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), false));
Mike Yu3977d482020-02-26 17:18:57 +08002704 } else if (config.mode == OPPORTUNISTIC_TLS || config.mode == OPPORTUNISTIC_FALLBACK_UDP) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002705 if (!tls.running()) {
2706 ASSERT_TRUE(tls.startServer());
2707 }
Xiao Ma09b71022018-12-11 17:56:32 +09002708 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002709 kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002710 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Mike Yu3977d482020-02-26 17:18:57 +08002711
2712 if (config.mode == OPPORTUNISTIC_FALLBACK_UDP) {
2713 // Force the resolver to fallback to cleartext queries.
2714 ASSERT_TRUE(tls.stopServer());
2715 }
Mike Yu4f3747b2018-12-02 17:54:29 +09002716 } else if (config.mode == STRICT) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002717 if (!tls.running()) {
2718 ASSERT_TRUE(tls.startServer());
2719 }
Xiao Ma09b71022018-12-11 17:56:32 +09002720 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002721 kDefaultParams, kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08002722 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Mike Yu4f3747b2018-12-02 17:54:29 +09002723 }
2724
2725 if (config.method == GETHOSTBYNAME) {
2726 const hostent* h_result = gethostbyname(host_name);
2727 if (config.expectResult == EXPECT_SUCCESS) {
2728 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2729 ASSERT_TRUE(h_result != nullptr);
2730 ASSERT_EQ(4, h_result->h_length);
2731 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
2732 EXPECT_EQ(ADDR4, ToString(h_result));
2733 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
Mike Yu532405f2020-06-17 17:46:44 +08002734 ExpectDnsEvent(INetdEventListener::EVENT_GETHOSTBYNAME, 0, host_name, {ADDR4});
Mike Yu4f3747b2018-12-02 17:54:29 +09002735 } else {
2736 EXPECT_EQ(0U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
2737 ASSERT_TRUE(h_result == nullptr);
2738 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
Mike Yu532405f2020-06-17 17:46:44 +08002739 int returnCode = (config.edns == Edns::DROP) ? RCODE_TIMEOUT : EAI_FAIL;
2740 ExpectDnsEvent(INetdEventListener::EVENT_GETHOSTBYNAME, returnCode, host_name, {});
Mike Yu4f3747b2018-12-02 17:54:29 +09002741 }
2742 } else if (config.method == GETADDRINFO) {
2743 ScopedAddrinfo ai_result;
2744 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2745 ai_result = safe_getaddrinfo(host_name, nullptr, &hints);
2746 if (config.expectResult == EXPECT_SUCCESS) {
2747 EXPECT_TRUE(ai_result != nullptr);
2748 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2749 const std::string result_str = ToString(ai_result);
2750 EXPECT_EQ(ADDR4, result_str);
Mike Yu532405f2020-06-17 17:46:44 +08002751 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, 0, host_name, {ADDR4});
Mike Yu4f3747b2018-12-02 17:54:29 +09002752 } else {
2753 EXPECT_TRUE(ai_result == nullptr);
2754 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
Mike Yu532405f2020-06-17 17:46:44 +08002755 int returnCode = (config.edns == Edns::DROP) ? RCODE_TIMEOUT : EAI_FAIL;
2756 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, returnCode, host_name, {});
Mike Yu4f3747b2018-12-02 17:54:29 +09002757 }
2758 } else {
2759 FAIL() << "Unsupported query method: " << config.method;
2760 }
2761
Mike Yudd4ac2d2019-05-31 16:52:11 +08002762 tls.clearQueries();
Mike Yu4f3747b2018-12-02 17:54:29 +09002763 dns.clearQueries();
Mike Yu3977d482020-02-26 17:18:57 +08002764
2765 // Clear the setup to force the resolver to validate private DNS servers in every test.
2766 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(paramsForCleanup));
Mike Yu4f3747b2018-12-02 17:54:29 +09002767 }
Mike Yu4f3747b2018-12-02 17:54:29 +09002768}
nuccachena26cc2a2018-07-17 18:07:23 +08002769
Ken Chen0a015532019-01-02 14:59:38 +08002770// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2771// Resolver should have a reasonable number of retries instead of spinning forever. We don't have
2772// an efficient way to know if resolver is stuck in an infinite loop. However, test case will be
2773// failed due to timeout.
2774TEST_F(ResolverTest, UnstableTls) {
2775 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2776 const char CLEARTEXT_PORT[] = "53";
2777 const char TLS_PORT[] = "853";
2778 const char* host_name1 = "nonexistent1.example.com.";
2779 const char* host_name2 = "nonexistent2.example.com.";
2780 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
2781
Mike Yufc125e42019-05-15 20:41:28 +08002782 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Ken Chen0a015532019-01-02 14:59:38 +08002783 ASSERT_TRUE(dns.startServer());
2784 dns.setEdns(test::DNSResponder::Edns::FORMERR_ON_EDNS);
2785 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2786 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08002787 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002788 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
2789
Ken Chen0a015532019-01-02 14:59:38 +08002790 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
2791 tls.stopServer();
2792
2793 const hostent* h_result = gethostbyname(host_name1);
2794 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
2795 ASSERT_TRUE(h_result == nullptr);
2796 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2797
2798 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2799 ScopedAddrinfo ai_result = safe_getaddrinfo(host_name2, nullptr, &hints);
2800 EXPECT_TRUE(ai_result == nullptr);
2801 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
2802}
2803
2804// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2805// Moreover, server responds RCODE=FORMERR even on non-EDNS query.
2806TEST_F(ResolverTest, BogusDnsServer) {
2807 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2808 const char CLEARTEXT_PORT[] = "53";
2809 const char TLS_PORT[] = "853";
2810 const char* host_name1 = "nonexistent1.example.com.";
2811 const char* host_name2 = "nonexistent2.example.com.";
2812 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
2813
Mike Yufc125e42019-05-15 20:41:28 +08002814 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Ken Chen0a015532019-01-02 14:59:38 +08002815 ASSERT_TRUE(dns.startServer());
2816 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2817 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08002818 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002819 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
2820
Ken Chen0a015532019-01-02 14:59:38 +08002821 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
2822 tls.stopServer();
2823 dns.setEdns(test::DNSResponder::Edns::FORMERR_UNCOND);
2824
2825 const hostent* h_result = gethostbyname(host_name1);
2826 EXPECT_EQ(0U, GetNumQueries(dns, host_name1));
2827 ASSERT_TRUE(h_result == nullptr);
2828 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2829
2830 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2831 ScopedAddrinfo ai_result = safe_getaddrinfo(host_name2, nullptr, &hints);
2832 EXPECT_TRUE(ai_result == nullptr);
2833 EXPECT_EQ(0U, GetNumQueries(dns, host_name2));
2834}
2835
nuccachena26cc2a2018-07-17 18:07:23 +08002836TEST_F(ResolverTest, GetAddrInfo_Dns64Synthesize) {
2837 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002838 constexpr char dns64_name[] = "ipv4only.arpa.";
2839 constexpr char host_name[] = "v4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002840 const std::vector<DnsRecord> records = {
2841 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2842 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2843 };
nuccachena26cc2a2018-07-17 18:07:23 +08002844
Xiao Ma09b71022018-12-11 17:56:32 +09002845 test::DNSResponder dns(listen_addr);
Xiao Ma09b71022018-12-11 17:56:32 +09002846 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002847
2848 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002849 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002850
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002851 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002852 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002853 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002854
2855 // hints are necessary in order to let netd know which type of addresses the caller is
2856 // interested in.
Xiao Ma09b71022018-12-11 17:56:32 +09002857 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08002858 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
2859 EXPECT_TRUE(result != nullptr);
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002860 // TODO: BUG: there should only be two queries, one AAAA (which returns no records) and one A
2861 // (which returns 1.2.3.4). But there is an extra AAAA.
2862 EXPECT_EQ(3U, GetNumQueries(dns, host_name));
nuccachena26cc2a2018-07-17 18:07:23 +08002863
2864 std::string result_str = ToString(result);
2865 EXPECT_EQ(result_str, "64:ff9b::102:304");
2866
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002867 // Stopping NAT64 prefix discovery disables synthesis.
Luke Huang5bd827c2019-03-14 16:10:04 +08002868 EXPECT_TRUE(mDnsClient.resolvService()->stopPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002869 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_NOT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002870
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002871 dns.clearQueries();
nuccachena26cc2a2018-07-17 18:07:23 +08002872
2873 result = safe_getaddrinfo("v4only", nullptr, &hints);
2874 EXPECT_TRUE(result != nullptr);
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002875 // TODO: BUG: there should only be one query, an AAAA (which returns no records), because the
2876 // A is already cached. But there is an extra AAAA.
2877 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
nuccachena26cc2a2018-07-17 18:07:23 +08002878
2879 result_str = ToString(result);
2880 EXPECT_EQ(result_str, "1.2.3.4");
2881}
2882
nuccachena26cc2a2018-07-17 18:07:23 +08002883TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecified) {
2884 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002885 constexpr char dns64_name[] = "ipv4only.arpa.";
2886 constexpr char host_name[] = "v4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002887 const std::vector<DnsRecord> records = {
2888 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2889 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2890 };
nuccachena26cc2a2018-07-17 18:07:23 +08002891
Xiao Ma09b71022018-12-11 17:56:32 +09002892 test::DNSResponder dns(listen_addr);
2893 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002894 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002895 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002896
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002897 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002898 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002899 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002900
2901 // Ensure to synthesize AAAA if AF_INET6 is specified, and not to synthesize AAAA
2902 // in AF_INET case.
2903 addrinfo hints;
2904 memset(&hints, 0, sizeof(hints));
2905 hints.ai_family = AF_INET6;
2906 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
2907 EXPECT_TRUE(result != nullptr);
2908 std::string result_str = ToString(result);
2909 EXPECT_EQ(result_str, "64:ff9b::102:304");
2910
2911 hints.ai_family = AF_INET;
2912 result = safe_getaddrinfo("v4only", nullptr, &hints);
2913 EXPECT_TRUE(result != nullptr);
2914 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2915 result_str = ToString(result);
2916 EXPECT_EQ(result_str, "1.2.3.4");
2917}
nuccachena26cc2a2018-07-17 18:07:23 +08002918
2919TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedV6) {
2920 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002921 constexpr char dns64_name[] = "ipv4only.arpa.";
2922 constexpr char host_name[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002923 const std::vector<DnsRecord> records = {
2924 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2925 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2926 {host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
2927 };
nuccachena26cc2a2018-07-17 18:07:23 +08002928
Xiao Ma09b71022018-12-11 17:56:32 +09002929 test::DNSResponder dns(listen_addr);
2930 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002931 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002932 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002933
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002934 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002935 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002936 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002937
Xiao Ma09b71022018-12-11 17:56:32 +09002938 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08002939 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
2940 EXPECT_TRUE(result != nullptr);
2941 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2942
2943 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
Xiao Ma09b71022018-12-11 17:56:32 +09002944 const std::vector<std::string> result_strs = ToStrings(result);
nuccachena26cc2a2018-07-17 18:07:23 +08002945 for (const auto& str : result_strs) {
2946 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
2947 << ", result_str='" << str << "'";
2948 }
2949}
2950
2951TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedNoV6) {
2952 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002953 constexpr char dns64_name[] = "ipv4only.arpa.";
2954 constexpr char host_name[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002955 const std::vector<DnsRecord> records = {
2956 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2957 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2958 };
nuccachena26cc2a2018-07-17 18:07:23 +08002959
Xiao Ma09b71022018-12-11 17:56:32 +09002960 test::DNSResponder dns(listen_addr);
2961 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002962 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002963 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002964
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002965 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002966 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002967 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002968
Xiao Ma09b71022018-12-11 17:56:32 +09002969 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08002970 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
2971 EXPECT_TRUE(result != nullptr);
2972 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2973
2974 // In AF_UNSPEC case, synthesize AAAA if there's no AAAA answer.
2975 std::string result_str = ToString(result);
2976 EXPECT_EQ(result_str, "64:ff9b::102:304");
2977}
2978
2979TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecialUseIPv4Addresses) {
2980 constexpr char THIS_NETWORK[] = "this_network";
2981 constexpr char LOOPBACK[] = "loopback";
2982 constexpr char LINK_LOCAL[] = "link_local";
2983 constexpr char MULTICAST[] = "multicast";
2984 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
2985
2986 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
2987 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
2988 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
2989 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
2990 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
2991
2992 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002993 constexpr char dns64_name[] = "ipv4only.arpa.";
2994
Xiao Ma09b71022018-12-11 17:56:32 +09002995 test::DNSResponder dns(listen_addr);
2996 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08002997 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002998 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002999
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003000 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003001 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003002 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003003
Luke Huangf8215372019-11-22 11:53:41 +08003004 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003005 static const struct TestConfig {
3006 std::string name;
3007 std::string addr;
3008
3009 std::string asHostName() const { return StringPrintf("%s.example.com.", name.c_str()); }
3010 } testConfigs[]{
3011 {THIS_NETWORK, ADDR_THIS_NETWORK},
3012 {LOOPBACK, ADDR_LOOPBACK},
3013 {LINK_LOCAL, ADDR_LINK_LOCAL},
3014 {MULTICAST, ADDR_MULTICAST},
3015 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
3016 };
Luke Huangf8215372019-11-22 11:53:41 +08003017 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003018
3019 for (const auto& config : testConfigs) {
3020 const std::string testHostName = config.asHostName();
3021 SCOPED_TRACE(testHostName);
3022
3023 const char* host_name = testHostName.c_str();
3024 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
3025
3026 addrinfo hints;
3027 memset(&hints, 0, sizeof(hints));
3028 hints.ai_family = AF_INET6;
3029 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
3030 // In AF_INET6 case, don't return IPv4 answers
3031 EXPECT_TRUE(result == nullptr);
3032 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3033 dns.clearQueries();
3034
3035 memset(&hints, 0, sizeof(hints));
3036 hints.ai_family = AF_UNSPEC;
3037 result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
3038 EXPECT_TRUE(result != nullptr);
3039 // Expect IPv6 query only. IPv4 answer has been cached in previous query.
3040 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3041 // In AF_UNSPEC case, don't synthesize special use IPv4 address.
3042 std::string result_str = ToString(result);
3043 EXPECT_EQ(result_str, config.addr.c_str());
3044 dns.clearQueries();
3045 }
3046}
3047
3048TEST_F(ResolverTest, GetAddrInfo_Dns64QueryWithNullArgumentHints) {
3049 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003050 constexpr char dns64_name[] = "ipv4only.arpa.";
3051 constexpr char host_name[] = "v4only.example.com.";
3052 constexpr char host_name2[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003053 const std::vector<DnsRecord> records = {
3054 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3055 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3056 {host_name2, ns_type::ns_t_a, "1.2.3.4"},
3057 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
3058 };
nuccachena26cc2a2018-07-17 18:07:23 +08003059
Xiao Ma09b71022018-12-11 17:56:32 +09003060 test::DNSResponder dns(listen_addr);
3061 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003062 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003063 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003064
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003065 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003066 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003067 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003068
3069 // Assign argument hints of getaddrinfo() as null is equivalent to set ai_family AF_UNSPEC.
3070 // In AF_UNSPEC case, synthesize AAAA if there has A answer only.
3071 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, nullptr);
3072 EXPECT_TRUE(result != nullptr);
3073 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3074 std::string result_str = ToString(result);
3075 EXPECT_EQ(result_str, "64:ff9b::102:304");
3076 dns.clearQueries();
3077
3078 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
3079 result = safe_getaddrinfo("v4v6", nullptr, nullptr);
3080 EXPECT_TRUE(result != nullptr);
3081 EXPECT_LE(2U, GetNumQueries(dns, host_name2));
3082 std::vector<std::string> result_strs = ToStrings(result);
3083 for (const auto& str : result_strs) {
3084 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
3085 << ", result_str='" << str << "'";
3086 }
3087}
3088
3089TEST_F(ResolverTest, GetAddrInfo_Dns64QueryNullArgumentNode) {
3090 constexpr char ADDR_ANYADDR_V4[] = "0.0.0.0";
3091 constexpr char ADDR_ANYADDR_V6[] = "::";
3092 constexpr char ADDR_LOCALHOST_V4[] = "127.0.0.1";
3093 constexpr char ADDR_LOCALHOST_V6[] = "::1";
3094
3095 constexpr char PORT_NAME_HTTP[] = "http";
3096 constexpr char PORT_NUMBER_HTTP[] = "80";
3097
3098 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003099 constexpr char dns64_name[] = "ipv4only.arpa.";
3100
Xiao Ma09b71022018-12-11 17:56:32 +09003101 test::DNSResponder dns(listen_addr);
3102 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003103 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003104 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003105
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003106 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003107 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003108 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003109
Luke Huangf8215372019-11-22 11:53:41 +08003110 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003111 // If node is null, return address is listed by libc/getaddrinfo.c as follows.
3112 // - passive socket -> anyaddr (0.0.0.0 or ::)
3113 // - non-passive socket -> localhost (127.0.0.1 or ::1)
3114 static const struct TestConfig {
3115 int flag;
3116 std::string addr_v4;
3117 std::string addr_v6;
3118
3119 std::string asParameters() const {
3120 return StringPrintf("flag=%d, addr_v4=%s, addr_v6=%s", flag, addr_v4.c_str(),
3121 addr_v6.c_str());
3122 }
3123 } testConfigs[]{
3124 {0 /* non-passive */, ADDR_LOCALHOST_V4, ADDR_LOCALHOST_V6},
3125 {AI_PASSIVE, ADDR_ANYADDR_V4, ADDR_ANYADDR_V6}
3126 };
Luke Huangf8215372019-11-22 11:53:41 +08003127 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003128
3129 for (const auto& config : testConfigs) {
3130 SCOPED_TRACE(config.asParameters());
3131
Xiao Ma09b71022018-12-11 17:56:32 +09003132 addrinfo hints = {
Nick Desaulnierscd6395a2019-10-11 09:15:24 -07003133 .ai_flags = config.flag,
Xiao Ma09b71022018-12-11 17:56:32 +09003134 .ai_family = AF_UNSPEC, // any address family
3135 .ai_socktype = 0, // any type
3136 .ai_protocol = 0, // any protocol
Xiao Ma09b71022018-12-11 17:56:32 +09003137 };
nuccachena26cc2a2018-07-17 18:07:23 +08003138
3139 // Assign hostname as null and service as port name.
3140 ScopedAddrinfo result = safe_getaddrinfo(nullptr, PORT_NAME_HTTP, &hints);
3141 ASSERT_TRUE(result != nullptr);
3142
3143 // Can't be synthesized because it should not get into Netd.
3144 std::vector<std::string> result_strs = ToStrings(result);
3145 for (const auto& str : result_strs) {
3146 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
3147 << ", result_str='" << str << "'";
3148 }
3149
3150 // Assign hostname as null and service as numeric port number.
3151 hints.ai_flags = config.flag | AI_NUMERICSERV;
3152 result = safe_getaddrinfo(nullptr, PORT_NUMBER_HTTP, &hints);
3153 ASSERT_TRUE(result != nullptr);
3154
3155 // Can't be synthesized because it should not get into Netd.
3156 result_strs = ToStrings(result);
3157 for (const auto& str : result_strs) {
3158 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
3159 << ", result_str='" << str << "'";
3160 }
3161 }
3162}
3163
3164TEST_F(ResolverTest, GetHostByAddr_ReverseDnsQueryWithHavingNat64Prefix) {
3165 struct hostent* result = nullptr;
3166 struct in_addr v4addr;
3167 struct in6_addr v6addr;
3168
3169 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003170 constexpr char dns64_name[] = "ipv4only.arpa.";
3171 constexpr char ptr_name[] = "v4v6.example.com.";
3172 // PTR record for IPv4 address 1.2.3.4
3173 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3174 // PTR record for IPv6 address 2001:db8::102:304
3175 constexpr char ptr_addr_v6[] =
3176 "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 +09003177 const std::vector<DnsRecord> records = {
3178 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3179 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3180 {ptr_addr_v6, ns_type::ns_t_ptr, ptr_name},
3181 };
nuccachena26cc2a2018-07-17 18:07:23 +08003182
Xiao Ma09b71022018-12-11 17:56:32 +09003183 test::DNSResponder dns(listen_addr);
3184 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003185 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003186 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003187
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003188 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003189 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003190 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003191
3192 // Reverse IPv4 DNS query. Prefix should have no effect on it.
3193 inet_pton(AF_INET, "1.2.3.4", &v4addr);
3194 result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
3195 ASSERT_TRUE(result != nullptr);
3196 std::string result_str = result->h_name ? result->h_name : "null";
3197 EXPECT_EQ(result_str, "v4v6.example.com");
3198
3199 // Reverse IPv6 DNS query. Prefix should have no effect on it.
3200 inet_pton(AF_INET6, "2001:db8::102:304", &v6addr);
3201 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3202 ASSERT_TRUE(result != nullptr);
3203 result_str = result->h_name ? result->h_name : "null";
3204 EXPECT_EQ(result_str, "v4v6.example.com");
3205}
3206
3207TEST_F(ResolverTest, GetHostByAddr_ReverseDns64Query) {
3208 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003209 constexpr char dns64_name[] = "ipv4only.arpa.";
3210 constexpr char ptr_name[] = "v4only.example.com.";
3211 // PTR record for IPv4 address 1.2.3.4
3212 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3213 // PTR record for IPv6 address 64:ff9b::1.2.3.4
3214 constexpr char ptr_addr_v6_nomapping[] =
3215 "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.";
3216 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
3217 // PTR record for IPv6 address 64:ff9b::5.6.7.8
3218 constexpr char ptr_addr_v6_synthesis[] =
3219 "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 +09003220 const std::vector<DnsRecord> records = {
3221 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3222 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3223 {ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis},
3224 };
nuccachena26cc2a2018-07-17 18:07:23 +08003225
Xiao Ma09b71022018-12-11 17:56:32 +09003226 test::DNSResponder dns(listen_addr);
3227 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003228 // "ptr_addr_v6_nomapping" is not mapped in DNS server
nuccachena26cc2a2018-07-17 18:07:23 +08003229 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003230 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003231
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003232 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003233 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003234 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003235
3236 // Synthesized PTR record doesn't exist on DNS server
3237 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
3238 // After querying synthesized address failed, expect that prefix is removed from IPv6
3239 // synthesized address and do reverse IPv4 query instead.
3240 struct in6_addr v6addr;
3241 inet_pton(AF_INET6, "64:ff9b::1.2.3.4", &v6addr);
3242 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3243 ASSERT_TRUE(result != nullptr);
3244 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist
3245 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist
3246 std::string result_str = result->h_name ? result->h_name : "null";
3247 EXPECT_EQ(result_str, "v4only.example.com");
3248 // Check that return address has been mapped from IPv4 to IPv6 address because Netd
3249 // removes NAT64 prefix and does IPv4 DNS reverse lookup in this case. Then, Netd
3250 // fakes the return IPv4 address as original queried IPv6 address.
3251 result_str = ToString(result);
3252 EXPECT_EQ(result_str, "64:ff9b::102:304");
3253 dns.clearQueries();
3254
3255 // Synthesized PTR record exists on DNS server
3256 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
3257 // Expect to Netd pass through synthesized address for DNS queries.
3258 inet_pton(AF_INET6, "64:ff9b::5.6.7.8", &v6addr);
3259 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3260 ASSERT_TRUE(result != nullptr);
3261 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
3262 result_str = result->h_name ? result->h_name : "null";
3263 EXPECT_EQ(result_str, "v6synthesis.example.com");
3264}
3265
3266TEST_F(ResolverTest, GetHostByAddr_ReverseDns64QueryFromHostFile) {
3267 constexpr char dns64_name[] = "ipv4only.arpa.";
3268 constexpr char host_name[] = "localhost";
3269 // The address is synthesized by prefix64:localhost.
3270 constexpr char host_addr[] = "64:ff9b::7f00:1";
nuccachena26cc2a2018-07-17 18:07:23 +08003271 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003272
3273 test::DNSResponder dns(listen_addr);
3274 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003275 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003276 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003277
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003278 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003279 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003280 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003281
3282 // Using synthesized "localhost" address to be a trick for resolving host name
3283 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
3284 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
3285 struct in6_addr v6addr;
3286 inet_pton(AF_INET6, host_addr, &v6addr);
3287 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3288 ASSERT_TRUE(result != nullptr);
3289 // Expect no DNS queries; localhost is resolved via /etc/hosts.
3290 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
3291
Luke Huangf8215372019-11-22 11:53:41 +08003292 ASSERT_EQ(sizeof(in6_addr), (unsigned)result->h_length);
nuccachena26cc2a2018-07-17 18:07:23 +08003293 ASSERT_EQ(AF_INET6, result->h_addrtype);
3294 std::string result_str = ToString(result);
3295 EXPECT_EQ(result_str, host_addr);
3296 result_str = result->h_name ? result->h_name : "null";
3297 EXPECT_EQ(result_str, host_name);
3298}
3299
Hungming Chen9e6185a2019-06-04 16:09:19 +08003300TEST_F(ResolverTest, GetHostByAddr_cnamesClasslessReverseDelegation) {
3301 // IPv4 addresses in the subnet with notation '/' or '-'.
3302 constexpr char addr_slash[] = "192.0.2.1";
3303 constexpr char addr_hyphen[] = "192.0.3.1";
3304
3305 // Used to verify DNS reverse query for classless reverse lookup zone. See detail in RFC 2317
3306 // section 4.
3307 const static std::vector<DnsRecord> records = {
3308 // The records for reverse querying "192.0.2.1" in the subnet with notation '/'.
3309 {"1.2.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0/25.2.0.192.in-addr.arpa."},
3310 {"1.0/25.2.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3311
3312 // The records for reverse querying "192.0.3.1" in the subnet with notation '-'.
3313 {"1.3.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0-127.3.0.192.in-addr.arpa."},
3314 {"1.0-127.3.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3315 };
3316
3317 test::DNSResponder dns;
3318 StartDns(dns, records);
3319 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3320
3321 for (const auto& address : {addr_slash, addr_hyphen}) {
3322 SCOPED_TRACE(address);
3323
3324 in_addr v4addr;
3325 ASSERT_TRUE(inet_pton(AF_INET, address, &v4addr));
3326 hostent* result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
3327 ASSERT_TRUE(result != nullptr);
3328 EXPECT_STREQ("hello.example.com", result->h_name);
3329 }
3330}
3331
nuccachena26cc2a2018-07-17 18:07:23 +08003332TEST_F(ResolverTest, GetNameInfo_ReverseDnsQueryWithHavingNat64Prefix) {
3333 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003334 constexpr char dns64_name[] = "ipv4only.arpa.";
3335 constexpr char ptr_name[] = "v4v6.example.com.";
3336 // PTR record for IPv4 address 1.2.3.4
3337 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3338 // PTR record for IPv6 address 2001:db8::102:304
3339 constexpr char ptr_addr_v6[] =
3340 "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 +09003341 const std::vector<DnsRecord> records = {
3342 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3343 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3344 {ptr_addr_v6, ns_type::ns_t_ptr, ptr_name},
3345 };
nuccachena26cc2a2018-07-17 18:07:23 +08003346
Xiao Ma09b71022018-12-11 17:56:32 +09003347 test::DNSResponder dns(listen_addr);
3348 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003349 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003350 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003351
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003352 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003353 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003354 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003355
Luke Huangf8215372019-11-22 11:53:41 +08003356 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003357 static const struct TestConfig {
3358 int flag;
3359 int family;
3360 std::string addr;
3361 std::string host;
3362
3363 std::string asParameters() const {
3364 return StringPrintf("flag=%d, family=%d, addr=%s, host=%s", flag, family, addr.c_str(),
3365 host.c_str());
3366 }
3367 } testConfigs[]{
3368 {NI_NAMEREQD, AF_INET, "1.2.3.4", "v4v6.example.com"},
3369 {NI_NUMERICHOST, AF_INET, "1.2.3.4", "1.2.3.4"},
3370 {0, AF_INET, "1.2.3.4", "v4v6.example.com"},
3371 {0, AF_INET, "5.6.7.8", "5.6.7.8"}, // unmapped
3372 {NI_NAMEREQD, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
3373 {NI_NUMERICHOST, AF_INET6, "2001:db8::102:304", "2001:db8::102:304"},
3374 {0, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
3375 {0, AF_INET6, "2001:db8::506:708", "2001:db8::506:708"}, // unmapped
3376 };
Luke Huangf8215372019-11-22 11:53:41 +08003377 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003378
3379 // Reverse IPv4/IPv6 DNS query. Prefix should have no effect on it.
3380 for (const auto& config : testConfigs) {
3381 SCOPED_TRACE(config.asParameters());
3382
3383 int rv;
3384 char host[NI_MAXHOST];
3385 struct sockaddr_in sin;
3386 struct sockaddr_in6 sin6;
3387 if (config.family == AF_INET) {
3388 memset(&sin, 0, sizeof(sin));
3389 sin.sin_family = AF_INET;
3390 inet_pton(AF_INET, config.addr.c_str(), &sin.sin_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003391 rv = getnameinfo((const struct sockaddr*)&sin, sizeof(sin), host, sizeof(host), nullptr,
3392 0, config.flag);
nuccachena26cc2a2018-07-17 18:07:23 +08003393 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4));
3394 } else if (config.family == AF_INET6) {
3395 memset(&sin6, 0, sizeof(sin6));
3396 sin6.sin6_family = AF_INET6;
3397 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003398 rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host),
nuccachena26cc2a2018-07-17 18:07:23 +08003399 nullptr, 0, config.flag);
3400 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6));
3401 }
3402 ASSERT_EQ(0, rv);
3403 std::string result_str = host;
3404 EXPECT_EQ(result_str, config.host);
3405 dns.clearQueries();
3406 }
3407}
3408
3409TEST_F(ResolverTest, GetNameInfo_ReverseDns64Query) {
3410 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003411 constexpr char dns64_name[] = "ipv4only.arpa.";
3412 constexpr char ptr_name[] = "v4only.example.com.";
3413 // PTR record for IPv4 address 1.2.3.4
3414 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3415 // PTR record for IPv6 address 64:ff9b::1.2.3.4
3416 constexpr char ptr_addr_v6_nomapping[] =
3417 "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.";
3418 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
3419 // PTR record for IPv6 address 64:ff9b::5.6.7.8
3420 constexpr char ptr_addr_v6_synthesis[] =
3421 "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 +09003422 const std::vector<DnsRecord> records = {
3423 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3424 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3425 {ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis},
3426 };
nuccachena26cc2a2018-07-17 18:07:23 +08003427
Xiao Ma09b71022018-12-11 17:56:32 +09003428 test::DNSResponder dns(listen_addr);
3429 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003430 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003431 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003432
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003433 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003434 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003435 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003436
Luke Huangf8215372019-11-22 11:53:41 +08003437 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003438 static const struct TestConfig {
3439 bool hasSynthesizedPtrRecord;
3440 int flag;
3441 std::string addr;
3442 std::string host;
3443
3444 std::string asParameters() const {
3445 return StringPrintf("hasSynthesizedPtrRecord=%d, flag=%d, addr=%s, host=%s",
3446 hasSynthesizedPtrRecord, flag, addr.c_str(), host.c_str());
3447 }
3448 } testConfigs[]{
3449 {false, NI_NAMEREQD, "64:ff9b::102:304", "v4only.example.com"},
3450 {false, NI_NUMERICHOST, "64:ff9b::102:304", "64:ff9b::102:304"},
3451 {false, 0, "64:ff9b::102:304", "v4only.example.com"},
3452 {true, NI_NAMEREQD, "64:ff9b::506:708", "v6synthesis.example.com"},
3453 {true, NI_NUMERICHOST, "64:ff9b::506:708", "64:ff9b::506:708"},
3454 {true, 0, "64:ff9b::506:708", "v6synthesis.example.com"}
3455 };
Luke Huangf8215372019-11-22 11:53:41 +08003456 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003457
3458 // hasSynthesizedPtrRecord = false
3459 // Synthesized PTR record doesn't exist on DNS server
3460 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
3461 // After querying synthesized address failed, expect that prefix is removed from IPv6
3462 // synthesized address and do reverse IPv4 query instead.
3463 //
3464 // hasSynthesizedPtrRecord = true
3465 // Synthesized PTR record exists on DNS server
3466 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
3467 // Expect to just pass through synthesized address for DNS queries.
3468 for (const auto& config : testConfigs) {
3469 SCOPED_TRACE(config.asParameters());
3470
3471 char host[NI_MAXHOST];
3472 struct sockaddr_in6 sin6;
3473 memset(&sin6, 0, sizeof(sin6));
3474 sin6.sin6_family = AF_INET6;
3475 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003476 int rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host),
nuccachena26cc2a2018-07-17 18:07:23 +08003477 nullptr, 0, config.flag);
3478 ASSERT_EQ(0, rv);
3479 if (config.flag == NI_NAMEREQD) {
3480 if (config.hasSynthesizedPtrRecord) {
3481 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
3482 } else {
3483 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist.
3484 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist.
3485 }
3486 }
3487 std::string result_str = host;
3488 EXPECT_EQ(result_str, config.host);
3489 dns.clearQueries();
3490 }
3491}
3492
3493TEST_F(ResolverTest, GetNameInfo_ReverseDns64QueryFromHostFile) {
3494 constexpr char dns64_name[] = "ipv4only.arpa.";
3495 constexpr char host_name[] = "localhost";
3496 // The address is synthesized by prefix64:localhost.
3497 constexpr char host_addr[] = "64:ff9b::7f00:1";
nuccachena26cc2a2018-07-17 18:07:23 +08003498 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003499
3500 test::DNSResponder dns(listen_addr);
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003501
Xiao Ma09b71022018-12-11 17:56:32 +09003502 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003503 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003504 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003505
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003506 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003507 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003508 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003509
3510 // Using synthesized "localhost" address to be a trick for resolving host name
3511 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
3512 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
3513 char host[NI_MAXHOST];
Xiao Ma09b71022018-12-11 17:56:32 +09003514 struct sockaddr_in6 sin6 = {.sin6_family = AF_INET6};
nuccachena26cc2a2018-07-17 18:07:23 +08003515 inet_pton(AF_INET6, host_addr, &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003516 int rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host), nullptr,
nuccachena26cc2a2018-07-17 18:07:23 +08003517 0, NI_NAMEREQD);
3518 ASSERT_EQ(0, rv);
3519 // Expect no DNS queries; localhost is resolved via /etc/hosts.
3520 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
3521
3522 std::string result_str = host;
3523 EXPECT_EQ(result_str, host_name);
3524}
3525
Hungming Chen9e6185a2019-06-04 16:09:19 +08003526TEST_F(ResolverTest, GetNameInfo_cnamesClasslessReverseDelegation) {
3527 // IPv4 addresses in the subnet with notation '/' or '-'.
3528 constexpr char addr_slash[] = "192.0.2.1";
3529 constexpr char addr_hyphen[] = "192.0.3.1";
3530
3531 // Used to verify DNS reverse query for classless reverse lookup zone. See detail in RFC 2317
3532 // section 4.
3533 const static std::vector<DnsRecord> records = {
3534 // The records for reverse querying "192.0.2.1" in the subnet with notation '/'.
3535 {"1.2.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0/25.2.0.192.in-addr.arpa."},
3536 {"1.0/25.2.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3537
3538 // The records for reverse querying "192.0.3.1" in the subnet with notation '-'.
3539 {"1.3.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0-127.3.0.192.in-addr.arpa."},
3540 {"1.0-127.3.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3541 };
3542
3543 test::DNSResponder dns;
3544 StartDns(dns, records);
3545 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3546
3547 for (const auto& address : {addr_slash, addr_hyphen}) {
3548 SCOPED_TRACE(address);
3549
3550 char host[NI_MAXHOST];
3551 sockaddr_in sin = {.sin_family = AF_INET};
3552 ASSERT_TRUE(inet_pton(AF_INET, address, &sin.sin_addr));
3553 int rv = getnameinfo((const sockaddr*)&sin, sizeof(sin), host, sizeof(host), nullptr, 0,
3554 NI_NAMEREQD);
3555 ASSERT_EQ(0, rv);
3556 EXPECT_STREQ("hello.example.com", host);
3557 }
3558}
3559
nuccachena26cc2a2018-07-17 18:07:23 +08003560TEST_F(ResolverTest, GetHostByName2_Dns64Synthesize) {
Xiao Ma09b71022018-12-11 17:56:32 +09003561 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003562 constexpr char dns64_name[] = "ipv4only.arpa.";
3563 constexpr char host_name[] = "ipv4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003564 const std::vector<DnsRecord> records = {
3565 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3566 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3567 };
nuccachena26cc2a2018-07-17 18:07:23 +08003568
Xiao Ma09b71022018-12-11 17:56:32 +09003569 test::DNSResponder dns(listen_addr);
3570 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003571 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003572 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003573
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003574 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003575 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003576 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003577
3578 // Query an IPv4-only hostname. Expect that gets a synthesized address.
3579 struct hostent* result = gethostbyname2("ipv4only", AF_INET6);
3580 ASSERT_TRUE(result != nullptr);
3581 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3582 std::string result_str = ToString(result);
3583 EXPECT_EQ(result_str, "64:ff9b::102:304");
3584}
nuccachena26cc2a2018-07-17 18:07:23 +08003585
3586TEST_F(ResolverTest, GetHostByName2_DnsQueryWithHavingNat64Prefix) {
3587 constexpr char dns64_name[] = "ipv4only.arpa.";
3588 constexpr char host_name[] = "v4v6.example.com.";
nuccachena26cc2a2018-07-17 18:07:23 +08003589 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003590 const std::vector<DnsRecord> records = {
3591 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3592 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3593 {host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
3594 };
3595
3596 test::DNSResponder dns(listen_addr);
3597 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003598 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003599 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003600
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003601 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003602 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003603 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003604
3605 // IPv4 DNS query. Prefix should have no effect on it.
3606 struct hostent* result = gethostbyname2("v4v6", AF_INET);
3607 ASSERT_TRUE(result != nullptr);
3608 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3609 std::string result_str = ToString(result);
3610 EXPECT_EQ(result_str, "1.2.3.4");
3611 dns.clearQueries();
3612
3613 // IPv6 DNS query. Prefix should have no effect on it.
3614 result = gethostbyname2("v4v6", AF_INET6);
3615 ASSERT_TRUE(result != nullptr);
3616 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3617 result_str = ToString(result);
3618 EXPECT_EQ(result_str, "2001:db8::102:304");
3619}
3620
3621TEST_F(ResolverTest, GetHostByName2_Dns64QuerySpecialUseIPv4Addresses) {
3622 constexpr char THIS_NETWORK[] = "this_network";
3623 constexpr char LOOPBACK[] = "loopback";
3624 constexpr char LINK_LOCAL[] = "link_local";
3625 constexpr char MULTICAST[] = "multicast";
3626 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
3627
3628 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
3629 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
3630 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
3631 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
3632 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
3633
3634 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003635 constexpr char dns64_name[] = "ipv4only.arpa.";
3636
Xiao Ma09b71022018-12-11 17:56:32 +09003637 test::DNSResponder dns(listen_addr);
3638 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003639 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003640 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003641
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003642 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003643 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003644 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003645
Luke Huangf8215372019-11-22 11:53:41 +08003646 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003647 static const struct TestConfig {
3648 std::string name;
3649 std::string addr;
3650
3651 std::string asHostName() const {
Luke Huangf8215372019-11-22 11:53:41 +08003652 return StringPrintf("%s.example.com.", name.c_str());
nuccachena26cc2a2018-07-17 18:07:23 +08003653 }
3654 } testConfigs[]{
3655 {THIS_NETWORK, ADDR_THIS_NETWORK},
3656 {LOOPBACK, ADDR_LOOPBACK},
3657 {LINK_LOCAL, ADDR_LINK_LOCAL},
3658 {MULTICAST, ADDR_MULTICAST},
3659 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
3660 };
Luke Huangf8215372019-11-22 11:53:41 +08003661 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003662
3663 for (const auto& config : testConfigs) {
3664 const std::string testHostName = config.asHostName();
3665 SCOPED_TRACE(testHostName);
3666
3667 const char* host_name = testHostName.c_str();
3668 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
3669
3670 struct hostent* result = gethostbyname2(config.name.c_str(), AF_INET6);
3671 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3672
3673 // In AF_INET6 case, don't synthesize special use IPv4 address.
3674 // Expect to have no answer
3675 EXPECT_EQ(nullptr, result);
3676
3677 dns.clearQueries();
3678 }
Bernie Innocenti2fef2b82018-12-20 15:56:40 +09003679}
Mike Yuf14e1a92019-05-10 13:54:58 +08003680
3681TEST_F(ResolverTest, PrefixDiscoveryBypassTls) {
3682 constexpr char listen_addr[] = "::1";
3683 constexpr char cleartext_port[] = "53";
3684 constexpr char tls_port[] = "853";
3685 constexpr char dns64_name[] = "ipv4only.arpa.";
3686 const std::vector<std::string> servers = {listen_addr};
3687
3688 test::DNSResponder dns(listen_addr);
3689 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
3690 test::DnsTlsFrontend tls(listen_addr, tls_port, listen_addr, cleartext_port);
3691 ASSERT_TRUE(tls.startServer());
3692
3693 // Setup OPPORTUNISTIC mode and wait for the validation complete.
waynema0e73c2e2019-07-31 15:04:08 +08003694 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08003695 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003696 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yuf14e1a92019-05-10 13:54:58 +08003697 tls.clearQueries();
3698
3699 // Start NAT64 prefix discovery and wait for it complete.
3700 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003701 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
Mike Yuf14e1a92019-05-10 13:54:58 +08003702
3703 // Verify it bypassed TLS even though there's a TLS server available.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003704 EXPECT_EQ(0, tls.queries()) << dns.dumpQueries();
3705 EXPECT_EQ(1U, GetNumQueries(dns, dns64_name)) << dns.dumpQueries();
Mike Yuf14e1a92019-05-10 13:54:58 +08003706
3707 // Restart the testing network to reset the cache.
3708 mDnsClient.TearDown();
3709 mDnsClient.SetUp();
3710 dns.clearQueries();
3711
3712 // Setup STRICT mode and wait for the validation complete.
waynema0e73c2e2019-07-31 15:04:08 +08003713 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
3714 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08003715 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003716 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yuf14e1a92019-05-10 13:54:58 +08003717 tls.clearQueries();
3718
3719 // Start NAT64 prefix discovery and wait for it to complete.
3720 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003721 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
Mike Yuf14e1a92019-05-10 13:54:58 +08003722
3723 // Verify it bypassed TLS despite STRICT mode.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003724 EXPECT_EQ(0, tls.queries()) << dns.dumpQueries();
3725 EXPECT_EQ(1U, GetNumQueries(dns, dns64_name)) << dns.dumpQueries();
Mike Yuf14e1a92019-05-10 13:54:58 +08003726}
Luke Huang9807e6b2019-05-20 16:17:12 +08003727
Lorenzo Colittie51091d2020-05-20 02:48:44 +09003728TEST_F(ResolverTest, SetAndClearNat64Prefix) {
3729 constexpr char host_name[] = "v4.example.com.";
3730 constexpr char listen_addr[] = "::1";
3731 const std::vector<DnsRecord> records = {
3732 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3733 };
3734 const std::string kNat64Prefix1 = "64:ff9b::/96";
3735 const std::string kNat64Prefix2 = "2001:db8:6464::/96";
3736
3737 test::DNSResponder dns(listen_addr);
3738 StartDns(dns, records);
3739 const std::vector<std::string> servers = {listen_addr};
3740 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
3741
3742 auto resolvService = mDnsClient.resolvService();
3743 addrinfo hints = {.ai_family = AF_INET6};
3744
3745 // No NAT64 prefix, no AAAA record.
3746 ScopedAddrinfo result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3747 ASSERT_TRUE(result == nullptr);
3748
3749 // Set the prefix, and expect to get a synthesized AAAA record.
3750 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix2).isOk());
3751 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3752 ASSERT_FALSE(result == nullptr);
3753 EXPECT_EQ("2001:db8:6464::102:304", ToString(result));
3754
3755 // Update the prefix, expect to see AAAA records from the new prefix.
3756 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3757 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3758 ASSERT_FALSE(result == nullptr);
3759 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3760
3761 // Non-/96 prefixes are ignored.
3762 auto status = resolvService->setPrefix64(TEST_NETID, "64:ff9b::/64");
3763 EXPECT_FALSE(status.isOk());
3764 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3765 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3766
3767 // Invalid prefixes are ignored.
3768 status = resolvService->setPrefix64(TEST_NETID, "192.0.2.0/24");
3769 EXPECT_FALSE(status.isOk());
3770 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3771 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3772
3773 status = resolvService->setPrefix64(TEST_NETID, "192.0.2.1");
3774 EXPECT_FALSE(status.isOk());
3775 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3776 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3777
3778 status = resolvService->setPrefix64(TEST_NETID, "hello");
3779 EXPECT_FALSE(status.isOk());
3780 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3781 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3782
3783 // DNS64 synthesis is still working.
3784 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3785 ASSERT_FALSE(result == nullptr);
3786 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3787
3788 // Clear the prefix. No AAAA records any more.
3789 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, "").isOk());
3790 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3791 EXPECT_TRUE(result == nullptr);
3792
3793 // Calling startPrefix64Discovery clears the prefix.
3794 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3795 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3796 ASSERT_FALSE(result == nullptr);
3797 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3798
3799 EXPECT_TRUE(resolvService->startPrefix64Discovery(TEST_NETID).isOk());
3800 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3801 ASSERT_TRUE(result == nullptr);
3802
3803 // setPrefix64 fails if prefix discovery is started, even if no prefix is yet discovered...
3804 status = resolvService->setPrefix64(TEST_NETID, kNat64Prefix1);
3805 EXPECT_FALSE(status.isOk());
3806 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3807 EXPECT_EQ(EEXIST, status.getServiceSpecificError());
3808
3809 // .. and clearing the prefix also has no effect.
3810 status = resolvService->setPrefix64(TEST_NETID, "");
3811 EXPECT_FALSE(status.isOk());
3812 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3813 EXPECT_EQ(ENOENT, status.getServiceSpecificError());
3814
3815 // setPrefix64 succeeds again when prefix discovery is stopped.
3816 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
3817 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3818 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3819 ASSERT_FALSE(result == nullptr);
3820 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3821
3822 // Calling stopPrefix64Discovery clears the prefix.
3823 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
3824 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3825 ASSERT_TRUE(result == nullptr);
3826
3827 // Set up NAT64 prefix discovery.
3828 constexpr char dns64_name[] = "ipv4only.arpa.";
3829 const std::vector<DnsRecord> newRecords = {
3830 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3831 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3832 };
3833 dns.stopServer();
3834 StartDns(dns, newRecords);
3835
3836 EXPECT_TRUE(resolvService->startPrefix64Discovery(TEST_NETID).isOk());
3837 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
3838 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3839 ASSERT_FALSE(result == nullptr);
3840 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3841
3842 // setPrefix64 fails if NAT64 prefix discovery has succeeded, and the discovered prefix
3843 // continues to be used.
3844 status = resolvService->setPrefix64(TEST_NETID, kNat64Prefix2);
3845 EXPECT_FALSE(status.isOk());
3846 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3847 EXPECT_EQ(EEXIST, status.getServiceSpecificError());
3848
3849 // Clearing the prefix also has no effect if discovery is started.
3850 status = resolvService->setPrefix64(TEST_NETID, "");
3851 EXPECT_FALSE(status.isOk());
3852 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3853 EXPECT_EQ(ENOENT, status.getServiceSpecificError());
3854
3855 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3856 ASSERT_FALSE(result == nullptr);
3857 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3858
3859 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
3860 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_NOT_FOUND));
Lorenzo Colitti61f796b2020-05-21 00:57:49 +09003861
3862 EXPECT_EQ(0, sDnsMetricsListener->getUnexpectedNat64PrefixUpdates());
Lorenzo Colittie51091d2020-05-20 02:48:44 +09003863}
3864
Luke Huang9807e6b2019-05-20 16:17:12 +08003865namespace {
3866
Luke Huang0d592bc2019-05-25 18:24:03 +08003867class ScopedSetNetworkForProcess {
3868 public:
3869 explicit ScopedSetNetworkForProcess(unsigned netId) {
3870 mStoredNetId = getNetworkForProcess();
3871 if (netId == mStoredNetId) return;
3872 EXPECT_EQ(0, setNetworkForProcess(netId));
3873 }
3874 ~ScopedSetNetworkForProcess() { EXPECT_EQ(0, setNetworkForProcess(mStoredNetId)); }
3875
3876 private:
3877 unsigned mStoredNetId;
3878};
3879
3880class ScopedSetNetworkForResolv {
3881 public:
3882 explicit ScopedSetNetworkForResolv(unsigned netId) { EXPECT_EQ(0, setNetworkForResolv(netId)); }
3883 ~ScopedSetNetworkForResolv() { EXPECT_EQ(0, setNetworkForResolv(NETID_UNSET)); }
3884};
3885
Luke Huang9807e6b2019-05-20 16:17:12 +08003886void sendCommand(int fd, const std::string& cmd) {
3887 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size() + 1));
3888 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size() + 1));
3889}
3890
3891int32_t readBE32(int fd) {
3892 int32_t tmp;
3893 int n = TEMP_FAILURE_RETRY(read(fd, &tmp, sizeof(tmp)));
3894 EXPECT_TRUE(n > 0);
3895 return ntohl(tmp);
3896}
3897
Luke Huang0d592bc2019-05-25 18:24:03 +08003898int readResponseCode(int fd) {
Luke Huang9807e6b2019-05-20 16:17:12 +08003899 char buf[4];
3900 int n = TEMP_FAILURE_RETRY(read(fd, &buf, sizeof(buf)));
3901 EXPECT_TRUE(n > 0);
3902 // The format of response code is that 4 bytes for the code & null.
3903 buf[3] = '\0';
3904 int result;
3905 EXPECT_TRUE(ParseInt(buf, &result));
3906 return result;
3907}
3908
Luke Huang0d592bc2019-05-25 18:24:03 +08003909bool checkAndClearUseLocalNameserversFlag(unsigned* netid) {
3910 if (netid == nullptr || ((*netid) & NETID_USE_LOCAL_NAMESERVERS) == 0) {
3911 return false;
3912 }
3913 *netid = (*netid) & ~NETID_USE_LOCAL_NAMESERVERS;
3914 return true;
3915}
3916
Luke Huangf8215372019-11-22 11:53:41 +08003917aidl::android::net::UidRangeParcel makeUidRangeParcel(int start, int stop) {
3918 aidl::android::net::UidRangeParcel res;
Luke Huang0d592bc2019-05-25 18:24:03 +08003919 res.start = start;
3920 res.stop = stop;
3921
3922 return res;
3923}
3924
3925void expectNetIdWithLocalNameserversFlag(unsigned netId) {
3926 unsigned dnsNetId = 0;
3927 EXPECT_EQ(0, getNetworkForDns(&dnsNetId));
3928 EXPECT_TRUE(checkAndClearUseLocalNameserversFlag(&dnsNetId));
3929 EXPECT_EQ(netId, static_cast<unsigned>(dnsNetId));
3930}
3931
3932void expectDnsNetIdEquals(unsigned netId) {
3933 unsigned dnsNetId = 0;
3934 EXPECT_EQ(0, getNetworkForDns(&dnsNetId));
3935 EXPECT_EQ(netId, static_cast<unsigned>(dnsNetId));
3936}
3937
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003938void expectDnsNetIdIsDefaultNetwork(INetd* netdService) {
Luke Huang0d592bc2019-05-25 18:24:03 +08003939 int currentNetid;
3940 EXPECT_TRUE(netdService->networkGetDefault(&currentNetid).isOk());
3941 expectDnsNetIdEquals(currentNetid);
3942}
3943
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003944void expectDnsNetIdWithVpn(INetd* netdService, unsigned vpnNetId, unsigned expectedNetId) {
Luke Huang0d592bc2019-05-25 18:24:03 +08003945 EXPECT_TRUE(netdService->networkCreateVpn(vpnNetId, false /* secure */).isOk());
3946 uid_t uid = getuid();
3947 // Add uid to VPN
3948 EXPECT_TRUE(netdService->networkAddUidRanges(vpnNetId, {makeUidRangeParcel(uid, uid)}).isOk());
3949 expectDnsNetIdEquals(expectedNetId);
3950 EXPECT_TRUE(netdService->networkDestroy(vpnNetId).isOk());
3951}
3952
Luke Huang9807e6b2019-05-20 16:17:12 +08003953} // namespace
3954
3955TEST_F(ResolverTest, getDnsNetId) {
3956 // We've called setNetworkForProcess in SetupOemNetwork, so reset to default first.
3957 setNetworkForProcess(NETID_UNSET);
Luke Huang0d592bc2019-05-25 18:24:03 +08003958
3959 expectDnsNetIdIsDefaultNetwork(mDnsClient.netdService());
3960 expectDnsNetIdWithVpn(mDnsClient.netdService(), TEST_VPN_NETID, TEST_VPN_NETID);
Luke Huang9807e6b2019-05-20 16:17:12 +08003961
3962 // Test with setNetworkForProcess
Luke Huang0d592bc2019-05-25 18:24:03 +08003963 {
3964 ScopedSetNetworkForProcess scopedSetNetworkForProcess(TEST_NETID);
3965 expectDnsNetIdEquals(TEST_NETID);
3966 }
3967
3968 // Test with setNetworkForProcess with NETID_USE_LOCAL_NAMESERVERS
3969 {
3970 ScopedSetNetworkForProcess scopedSetNetworkForProcess(TEST_NETID |
3971 NETID_USE_LOCAL_NAMESERVERS);
3972 expectNetIdWithLocalNameserversFlag(TEST_NETID);
3973 }
Luke Huang9807e6b2019-05-20 16:17:12 +08003974
3975 // Test with setNetworkForResolv
Luke Huang0d592bc2019-05-25 18:24:03 +08003976 {
3977 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID);
3978 expectDnsNetIdEquals(TEST_NETID);
3979 }
3980
3981 // Test with setNetworkForResolv with NETID_USE_LOCAL_NAMESERVERS
3982 {
3983 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID |
3984 NETID_USE_LOCAL_NAMESERVERS);
3985 expectNetIdWithLocalNameserversFlag(TEST_NETID);
3986 }
3987
3988 // Test with setNetworkForResolv under bypassable vpn
3989 {
3990 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID);
3991 expectDnsNetIdWithVpn(mDnsClient.netdService(), TEST_VPN_NETID, TEST_NETID);
3992 }
Luke Huang9807e6b2019-05-20 16:17:12 +08003993
3994 // Create socket connected to DnsProxyListener
3995 int fd = dns_open_proxy();
3996 EXPECT_TRUE(fd > 0);
3997 unique_fd ufd(fd);
3998
3999 // Test command with wrong netId
4000 sendCommand(fd, "getdnsnetid abc");
Luke Huang0d592bc2019-05-25 18:24:03 +08004001 EXPECT_EQ(ResponseCode::DnsProxyQueryResult, readResponseCode(fd));
Luke Huang9807e6b2019-05-20 16:17:12 +08004002 EXPECT_EQ(-EINVAL, readBE32(fd));
4003
4004 // Test unsupported command
4005 sendCommand(fd, "getdnsnetidNotSupported");
4006 // Keep in sync with FrameworkListener.cpp (500, "Command not recognized")
Luke Huang0d592bc2019-05-25 18:24:03 +08004007 EXPECT_EQ(500, readResponseCode(fd));
Luke Huang9807e6b2019-05-20 16:17:12 +08004008}
Sehee Park2c118782019-05-07 13:02:45 +09004009
4010TEST_F(ResolverTest, BlockDnsQueryWithUidRule) {
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004011 // This test relies on blocking traffic on loopback, which xt_qtaguid does not do.
4012 // See aosp/358413 and b/34444781 for why.
4013 SKIP_IF_BPF_NOT_SUPPORTED;
4014
Sehee Park2c118782019-05-07 13:02:45 +09004015 constexpr char listen_addr1[] = "127.0.0.4";
4016 constexpr char listen_addr2[] = "::1";
4017 constexpr char host_name[] = "howdy.example.com.";
4018 const std::vector<DnsRecord> records = {
4019 {host_name, ns_type::ns_t_a, "1.2.3.4"},
4020 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
4021 };
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004022 INetd* netdService = mDnsClient.netdService();
Sehee Park2c118782019-05-07 13:02:45 +09004023
4024 test::DNSResponder dns1(listen_addr1);
4025 test::DNSResponder dns2(listen_addr2);
4026 StartDns(dns1, records);
4027 StartDns(dns2, records);
4028
4029 std::vector<std::string> servers = {listen_addr1, listen_addr2};
4030 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
4031 dns1.clearQueries();
4032 dns2.clearQueries();
4033
Luke Huangeb618ef2020-05-26 14:17:02 +08004034 ScopeBlockedUIDRule scopeBlockUidRule(netdService, TEST_UID);
Sehee Park2c118782019-05-07 13:02:45 +09004035 // Dns Query
4036 int fd1 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_a, 0);
4037 int fd2 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_aaaa, 0);
4038 EXPECT_TRUE(fd1 != -1);
4039 EXPECT_TRUE(fd2 != -1);
4040
4041 uint8_t buf[MAXPACKET] = {};
4042 int rcode;
4043 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
4044 EXPECT_EQ(-ECONNREFUSED, res);
4045
4046 memset(buf, 0, MAXPACKET);
4047 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
4048 EXPECT_EQ(-ECONNREFUSED, res);
Mike Yu532405f2020-06-17 17:46:44 +08004049
4050 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, EAI_SYSTEM, "howdy.example.com", {});
4051 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, EAI_SYSTEM, "howdy.example.com", {});
Sehee Park2c118782019-05-07 13:02:45 +09004052}
Mike Yua772c202019-09-23 17:47:21 +08004053
Ken Chenbc481b82020-05-21 23:30:01 +08004054TEST_F(ResolverTest, EnforceDnsUid) {
4055 SKIP_IF_BPF_NOT_SUPPORTED;
4056
4057 constexpr char listen_addr1[] = "127.0.0.4";
4058 constexpr char listen_addr2[] = "::1";
4059 constexpr char host_name[] = "howdy.example.com.";
4060 const std::vector<DnsRecord> records = {
4061 {host_name, ns_type::ns_t_a, "1.2.3.4"},
4062 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
4063 };
4064 INetd* netdService = mDnsClient.netdService();
4065
4066 test::DNSResponder dns1(listen_addr1);
4067 test::DNSResponder dns2(listen_addr2);
4068 StartDns(dns1, records);
4069 StartDns(dns2, records);
4070
4071 // switch uid of DNS queries from applications to AID_DNS
4072 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4073 parcel.servers = {listen_addr1, listen_addr2};
4074 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk());
4075
4076 uint8_t buf[MAXPACKET] = {};
4077 int rcode;
4078 {
4079 ScopeBlockedUIDRule scopeBlockUidRule(netdService, TEST_UID);
4080 // Dns Queries should be blocked
4081 int fd1 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_a, 0);
4082 int fd2 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_aaaa, 0);
4083 EXPECT_TRUE(fd1 != -1);
4084 EXPECT_TRUE(fd2 != -1);
4085
4086 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
4087 EXPECT_EQ(-ECONNREFUSED, res);
4088
4089 memset(buf, 0, MAXPACKET);
4090 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
4091 EXPECT_EQ(-ECONNREFUSED, res);
4092 }
4093
4094 parcel.resolverOptions.enforceDnsUid = true;
4095 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk());
4096 {
4097 ScopeBlockedUIDRule scopeBlockUidRule(netdService, TEST_UID);
4098 // Dns Queries should NOT be blocked
4099 int fd1 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_a, 0);
4100 int fd2 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_aaaa, 0);
4101 EXPECT_TRUE(fd1 != -1);
4102 EXPECT_TRUE(fd2 != -1);
4103
4104 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
4105 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
4106
4107 memset(buf, 0, MAXPACKET);
4108 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
4109 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
4110
4111 // @TODO: So far we know that uid of DNS queries are no more set to DNS requester. But we
4112 // don't check if they are actually being set to AID_DNS, because system uids are always
4113 // allowed in bpf_owner_match(). Audit by firewallSetUidRule(AID_DNS) + sending queries is
4114 // infeasible. Fix it if the behavior of bpf_owner_match() is changed in the future, or if
4115 // we have better idea to deal with this.
4116 }
4117}
4118
Mike Yu40e67072019-10-09 21:14:09 +08004119namespace {
4120
4121const std::string kDotConnectTimeoutMsFlag(
4122 "persist.device_config.netd_native.dot_connect_timeout_ms");
4123
4124class ScopedSystemProperties {
4125 public:
4126 explicit ScopedSystemProperties(const std::string& key, const std::string& value)
4127 : mStoredKey(key) {
4128 mStoredValue = android::base::GetProperty(key, "");
4129 android::base::SetProperty(key, value);
4130 }
4131 ~ScopedSystemProperties() { android::base::SetProperty(mStoredKey, mStoredValue); }
4132
4133 private:
4134 std::string mStoredKey;
4135 std::string mStoredValue;
4136};
4137
4138} // namespace
4139
Mike Yua772c202019-09-23 17:47:21 +08004140TEST_F(ResolverTest, ConnectTlsServerTimeout) {
Mike Yu40e67072019-10-09 21:14:09 +08004141 constexpr int expectedTimeout = 1000;
4142 constexpr char hostname1[] = "query1.example.com.";
4143 constexpr char hostname2[] = "query2.example.com.";
Mike Yua772c202019-09-23 17:47:21 +08004144 const std::vector<DnsRecord> records = {
Mike Yu40e67072019-10-09 21:14:09 +08004145 {hostname1, ns_type::ns_t_a, "1.2.3.4"},
4146 {hostname2, ns_type::ns_t_a, "1.2.3.5"},
Mike Yua772c202019-09-23 17:47:21 +08004147 };
4148
4149 test::DNSResponder dns;
4150 StartDns(dns, records);
Mike Yu40e67072019-10-09 21:14:09 +08004151 test::DnsTlsFrontend tls;
Mike Yua772c202019-09-23 17:47:21 +08004152 ASSERT_TRUE(tls.startServer());
4153
Mike Yu40e67072019-10-09 21:14:09 +08004154 // The resolver will adjust the timeout value to 1000ms since the value is too small.
4155 ScopedSystemProperties scopedSystemProperties(kDotConnectTimeoutMsFlag, "100");
Mike Yua772c202019-09-23 17:47:21 +08004156
Mike Yu40e67072019-10-09 21:14:09 +08004157 // Set up resolver to opportunistic mode with the default configuration.
Mike Yu8ac63402019-12-02 15:28:38 +08004158 const ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
Mike Yu40e67072019-10-09 21:14:09 +08004159 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
Mike Yua772c202019-09-23 17:47:21 +08004160 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09004161 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yua772c202019-09-23 17:47:21 +08004162 tls.clearQueries();
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09004163 dns.clearQueries();
Mike Yua772c202019-09-23 17:47:21 +08004164
4165 // The server becomes unresponsive to the handshake request.
4166 tls.setHangOnHandshakeForTesting(true);
4167
4168 // Expect the things happening in getaddrinfo():
4169 // 1. Connect to the private DNS server.
4170 // 2. SSL handshake times out.
4171 // 3. Fallback to UDP transport, and then get the answer.
Mike Yu40e67072019-10-09 21:14:09 +08004172 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4173 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(hostname1, nullptr, hints);
Mike Yua772c202019-09-23 17:47:21 +08004174
Mike Yu40e67072019-10-09 21:14:09 +08004175 EXPECT_NE(nullptr, result);
Mike Yua772c202019-09-23 17:47:21 +08004176 EXPECT_EQ(0, tls.queries());
Mike Yu40e67072019-10-09 21:14:09 +08004177 EXPECT_EQ(1U, GetNumQueries(dns, hostname1));
4178 EXPECT_EQ(records.at(0).addr, ToString(result));
Mike Yua772c202019-09-23 17:47:21 +08004179
Mike Yu40e67072019-10-09 21:14:09 +08004180 // A loose upper bound is set by adding 2000ms buffer time. Theoretically, getaddrinfo()
4181 // should just take a bit more than expetTimeout milliseconds.
4182 EXPECT_GE(timeTakenMs, expectedTimeout);
4183 EXPECT_LE(timeTakenMs, expectedTimeout + 2000);
4184
4185 // Set the server to be responsive. Verify that the resolver will attempt to reconnect
4186 // to the server and then get the result within the timeout.
4187 tls.setHangOnHandshakeForTesting(false);
4188 std::tie(result, timeTakenMs) = safe_getaddrinfo_time_taken(hostname2, nullptr, hints);
4189
4190 EXPECT_NE(nullptr, result);
Luke Huang0a0870d2020-02-12 20:41:10 +08004191 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yu40e67072019-10-09 21:14:09 +08004192 EXPECT_EQ(1U, GetNumQueries(dns, hostname2));
4193 EXPECT_EQ(records.at(1).addr, ToString(result));
4194
4195 EXPECT_LE(timeTakenMs, expectedTimeout);
Mike Yua772c202019-09-23 17:47:21 +08004196}
Hungming Chenbb90ab32019-10-28 18:20:31 +08004197
Ken Chen766feae2019-10-30 15:13:44 +08004198TEST_F(ResolverTest, FlushNetworkCache) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004199 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004200 test::DNSResponder dns;
4201 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4202 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4203
4204 const hostent* result = gethostbyname("hello");
4205 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4206
4207 // get result from cache
4208 result = gethostbyname("hello");
4209 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4210
4211 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4212
4213 result = gethostbyname("hello");
4214 EXPECT_EQ(2U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4215}
4216
4217TEST_F(ResolverTest, FlushNetworkCache_random) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004218 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004219 constexpr int num_flush = 10;
4220 constexpr int num_queries = 20;
4221 test::DNSResponder dns;
4222 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4223 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4224 const addrinfo hints = {.ai_family = AF_INET};
4225
4226 std::thread t([this]() {
4227 for (int i = 0; i < num_flush; ++i) {
4228 unsigned delay = arc4random_uniform(10 * 1000); // 10ms
4229 usleep(delay);
4230 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4231 }
4232 });
4233
4234 for (int i = 0; i < num_queries; ++i) {
4235 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4236 EXPECT_TRUE(result != nullptr);
4237 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4238 }
4239 t.join();
4240}
4241
4242// flush cache while one query is wait-for-response, another is pending.
4243TEST_F(ResolverTest, FlushNetworkCache_concurrent) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004244 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004245 const char* listen_addr1 = "127.0.0.9";
4246 const char* listen_addr2 = "127.0.0.10";
4247 test::DNSResponder dns1(listen_addr1);
4248 test::DNSResponder dns2(listen_addr2);
4249 StartDns(dns1, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4250 StartDns(dns2, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4251 addrinfo hints = {.ai_family = AF_INET};
4252
4253 // step 1: set server#1 into deferred responding mode
4254 dns1.setDeferredResp(true);
4255 std::thread t1([&listen_addr1, &hints, this]() {
4256 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr1}));
4257 // step 3: query
4258 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4259 // step 9: check result
4260 EXPECT_TRUE(result != nullptr);
4261 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4262 });
4263
4264 // step 2: wait for the query to reach the server
4265 while (GetNumQueries(dns1, kHelloExampleCom) == 0) {
4266 usleep(1000); // 1ms
4267 }
4268
4269 std::thread t2([&listen_addr2, &hints, &dns2, this]() {
4270 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr2}));
4271 // step 5: query (should be blocked in resolver)
4272 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4273 // step 7: check result
4274 EXPECT_TRUE(result != nullptr);
4275 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4276 EXPECT_EQ(1U, GetNumQueriesForType(dns2, ns_type::ns_t_a, kHelloExampleCom));
4277 });
4278
4279 // step 4: wait a bit for the 2nd query to enter pending state
4280 usleep(100 * 1000); // 100ms
4281 // step 6: flush cache (will unblock pending queries)
4282 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4283 t2.join();
4284
4285 // step 8: resume server#1
4286 dns1.setDeferredResp(false);
4287 t1.join();
4288
4289 // step 10: verify if result is correctly cached
4290 dns2.clearQueries();
4291 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4292 EXPECT_EQ(0U, GetNumQueries(dns2, kHelloExampleCom));
4293 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4294}
4295
waynema29253052019-08-20 11:26:08 +08004296// TODO: Perhaps to have a boundary conditions test for TCP and UDP.
4297TEST_F(ResolverTest, TcpQueryWithOversizePayload) {
4298 test::DNSResponder dns;
4299 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4300 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4301
4302 int fd = dns_open_proxy();
4303 ASSERT_TRUE(fd > 0);
4304
4305 // Sending DNS query over TCP once the packet sizes exceed 512 bytes.
4306 // The raw data is combined with Question section and Additional section
4307 // Question section : query "hello.example.com", type A, class IN
4308 // Additional section : type OPT (41), Option PADDING, Option Length 546
4309 // Padding option which allows DNS clients and servers to artificially
4310 // increase the size of a DNS message by a variable number of bytes.
4311 // See also RFC7830, section 3
4312 const std::string query =
4313 "+c0BAAABAAAAAAABBWhlbGxvB2V4YW1wbGUDY29tAAABAAEAACkgAAAAgAACJgAMAiIAAAAAAAAAAAAAAAAAA"
4314 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4315 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4316 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4317 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4318 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4319 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4320 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4321 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4322 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
4323 const std::string cmd =
4324 "resnsend " + std::to_string(TEST_NETID) + " 0 " /* ResNsendFlags */ + query + '\0';
4325 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
4326 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
4327 expectAnswersValid(fd, AF_INET, kHelloExampleComAddrV4);
4328 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom));
4329 EXPECT_EQ(0U, GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom));
4330}
4331
Ken Chen99344882020-01-01 14:59:38 +08004332TEST_F(ResolverTest, TruncatedRspMode) {
4333 constexpr char listen_addr[] = "127.0.0.4";
4334 constexpr char listen_addr2[] = "127.0.0.5";
4335 constexpr char listen_srv[] = "53";
4336
4337 test::DNSResponder dns(listen_addr, listen_srv, static_cast<ns_rcode>(-1));
4338 test::DNSResponder dns2(listen_addr2, listen_srv, static_cast<ns_rcode>(-1));
4339 // dns supports UDP only, dns2 support UDP and TCP
4340 dns.setResponseProbability(0.0, IPPROTO_TCP);
4341 StartDns(dns, kLargeCnameChainRecords);
4342 StartDns(dns2, kLargeCnameChainRecords);
4343
4344 const struct TestConfig {
4345 const std::optional<int32_t> tcMode;
4346 const bool ret;
4347 const unsigned numQueries;
4348 std::string asParameters() const {
4349 return StringPrintf("tcMode: %d, ret: %s, numQueries: %u", tcMode.value_or(-1),
4350 ret ? "true" : "false", numQueries);
4351 }
4352 } testConfigs[]{
4353 // clang-format off
4354 {std::nullopt, true, 0}, /* mode unset */
4355 {aidl::android::net::IDnsResolver::TC_MODE_DEFAULT, true, 0}, /* default mode */
4356 {aidl::android::net::IDnsResolver::TC_MODE_UDP_TCP, true, 1}, /* alternative mode */
4357 {-666, false, 1}, /* invalid input */
4358 // clang-format on
4359 };
4360
4361 for (const auto& config : testConfigs) {
4362 SCOPED_TRACE(config.asParameters());
4363
4364 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4365 parcel.servers = {listen_addr, listen_addr2};
4366 if (config.tcMode) {
Ken Chena6ac2a62020-04-07 17:25:56 +08004367 parcel.resolverOptions.tcMode = config.tcMode.value();
Ken Chen99344882020-01-01 14:59:38 +08004368 }
4369 ASSERT_EQ(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk(), config.ret);
4370
4371 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4372 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4373 ASSERT_TRUE(result != nullptr);
4374 EXPECT_EQ(ToString(result), kHelloExampleComAddrV4);
4375 // TC_MODE_DEFAULT: resolver retries on TCP-only on each name server.
4376 // TC_MODE_UDP_TCP: resolver retries on TCP on the same server, falls back to UDP from next.
4377 ASSERT_EQ(GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom), 1U);
4378 ASSERT_EQ(GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom), 1U);
4379 ASSERT_EQ(GetNumQueriesForProtocol(dns2, IPPROTO_UDP, kHelloExampleCom), config.numQueries);
4380 ASSERT_EQ(GetNumQueriesForProtocol(dns2, IPPROTO_TCP, kHelloExampleCom), 1U);
4381
4382 dns.clearQueries();
4383 dns2.clearQueries();
4384 ASSERT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4385 }
4386}
4387
Mike Yu153b5b82020-03-04 19:53:54 +08004388TEST_F(ResolverTest, RepeatedSetup_ResolverStatusRemains) {
4389 constexpr char unusable_listen_addr[] = "127.0.0.3";
4390 constexpr char listen_addr[] = "127.0.0.4";
4391 constexpr char hostname[] = "a.hello.query.";
4392 const auto repeatedSetResolversFromParcel = [&](const ResolverParamsParcel& parcel) {
4393 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4394 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4395 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4396 };
4397
4398 test::DNSResponder dns(listen_addr);
4399 StartDns(dns, {{hostname, ns_type::ns_t_a, "1.2.3.3"}});
4400 test::DnsTlsFrontend tls1(listen_addr, "853", listen_addr, "53");
4401 ASSERT_TRUE(tls1.startServer());
4402
4403 // Private DNS off mode.
4404 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4405 parcel.servers = {unusable_listen_addr, listen_addr};
4406 parcel.tlsServers.clear();
4407 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4408
4409 // Send a query.
4410 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4411 EXPECT_NE(safe_getaddrinfo(hostname, nullptr, &hints), nullptr);
4412
4413 // Check the stats as expected.
4414 const std::vector<NameserverStats> expectedCleartextDnsStats = {
4415 NameserverStats(unusable_listen_addr).setInternalErrors(1),
4416 NameserverStats(listen_addr).setSuccesses(1),
4417 };
4418 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
4419 EXPECT_EQ(GetNumQueries(dns, hostname), 1U);
4420
4421 // The stats is supposed to remain as long as the list of cleartext DNS servers is unchanged.
4422 static const struct TestConfig {
4423 std::vector<std::string> servers;
4424 std::vector<std::string> tlsServers;
4425 std::string tlsName;
4426 } testConfigs[] = {
4427 // Private DNS opportunistic mode.
4428 {{listen_addr, unusable_listen_addr}, {listen_addr, unusable_listen_addr}, ""},
4429 {{unusable_listen_addr, listen_addr}, {unusable_listen_addr, listen_addr}, ""},
4430
4431 // Private DNS strict mode.
4432 {{listen_addr, unusable_listen_addr}, {"127.0.0.100"}, kDefaultPrivateDnsHostName},
4433 {{unusable_listen_addr, listen_addr}, {"127.0.0.100"}, kDefaultPrivateDnsHostName},
4434
4435 // Private DNS off mode.
4436 {{unusable_listen_addr, listen_addr}, {}, ""},
4437 {{listen_addr, unusable_listen_addr}, {}, ""},
4438 };
4439
4440 for (const auto& config : testConfigs) {
4441 SCOPED_TRACE(fmt::format("testConfig: [{}] [{}] [{}]", fmt::join(config.servers, ","),
4442 fmt::join(config.tlsServers, ","), config.tlsName));
4443 parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4444 parcel.servers = config.servers;
4445 parcel.tlsServers = config.tlsServers;
4446 parcel.tlsName = config.tlsName;
4447 repeatedSetResolversFromParcel(parcel);
4448 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
4449
4450 // The stats remains when the list of search domains changes.
4451 parcel.domains.push_back("tmp.domains");
4452 repeatedSetResolversFromParcel(parcel);
4453 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
4454
4455 // The stats remains when the parameters change (except maxSamples).
4456 parcel.sampleValiditySeconds++;
4457 parcel.successThreshold++;
4458 parcel.minSamples++;
4459 parcel.baseTimeoutMsec++;
4460 parcel.retryCount++;
4461 repeatedSetResolversFromParcel(parcel);
4462 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
4463 }
4464
4465 // The cache remains.
4466 EXPECT_NE(safe_getaddrinfo(hostname, nullptr, &hints), nullptr);
4467 EXPECT_EQ(GetNumQueries(dns, hostname), 1U);
4468}
4469
4470TEST_F(ResolverTest, RepeatedSetup_NoRedundantPrivateDnsValidation) {
4471 const std::string addr1 = getUniqueIPv4Address(); // For a workable DNS server.
4472 const std::string addr2 = getUniqueIPv4Address(); // For an unresponsive DNS server.
4473 const std::string unusable_addr = getUniqueIPv4Address();
Mike Yubc4b9502020-03-20 13:14:00 +08004474 const auto waitForPrivateDnsStateUpdated = []() {
4475 // A buffer time for the PrivateDnsConfiguration instance to update its map,
4476 // mPrivateDnsValidateThreads, which is used for tracking validation threads.
4477 // Since there is a time gap between when PrivateDnsConfiguration reports
4478 // onPrivateDnsValidationEvent and when PrivateDnsConfiguration updates the map, this is a
4479 // workaround to avoid the test starts a subsequent resolver setup during the time gap.
4480 // TODO: Report onPrivateDnsValidationEvent after all the relevant updates are complete.
4481 // Reference to b/152009023.
4482 std::this_thread::sleep_for(20ms);
4483 };
Mike Yu153b5b82020-03-04 19:53:54 +08004484
4485 test::DNSResponder dns1(addr1);
4486 test::DNSResponder dns2(addr2);
4487 StartDns(dns1, {});
4488 StartDns(dns2, {});
4489 test::DnsTlsFrontend workableTls(addr1, "853", addr1, "53");
4490 test::DnsTlsFrontend unresponsiveTls(addr2, "853", addr2, "53");
4491 unresponsiveTls.setHangOnHandshakeForTesting(true);
4492 ASSERT_TRUE(workableTls.startServer());
4493 ASSERT_TRUE(unresponsiveTls.startServer());
4494
4495 // First setup.
4496 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4497 parcel.servers = {addr1, addr2, unusable_addr};
4498 parcel.tlsServers = {addr1, addr2, unusable_addr};
4499 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4500
4501 // Check the validation results.
4502 EXPECT_TRUE(WaitForPrivateDnsValidation(workableTls.listen_address(), true));
4503 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4504 EXPECT_EQ(unresponsiveTls.acceptConnectionsCount(), 1); // The validation is still in progress.
4505
4506 static const struct TestConfig {
4507 std::vector<std::string> tlsServers;
4508 std::string tlsName;
4509 } testConfigs[] = {
4510 {{addr1, addr2, unusable_addr}, ""},
4511 {{unusable_addr, addr1, addr2}, ""},
4512 {{unusable_addr, addr1, addr2}, kDefaultPrivateDnsHostName},
4513 {{addr1, addr2, unusable_addr}, kDefaultPrivateDnsHostName},
4514 };
4515
4516 std::string TlsNameLastTime;
4517 for (const auto& config : testConfigs) {
4518 SCOPED_TRACE(fmt::format("testConfig: [{}] [{}]", fmt::join(config.tlsServers, ","),
4519 config.tlsName));
4520 parcel.servers = config.tlsServers;
4521 parcel.tlsServers = config.tlsServers;
4522 parcel.tlsName = config.tlsName;
4523 parcel.caCertificate = config.tlsName.empty() ? "" : kCaCert;
4524
4525 const bool dnsModeChanged = (TlsNameLastTime != config.tlsName);
Mike Yubc4b9502020-03-20 13:14:00 +08004526
4527 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004528 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4529
4530 for (const auto& serverAddr : parcel.tlsServers) {
4531 SCOPED_TRACE(serverAddr);
4532 if (serverAddr == workableTls.listen_address()) {
4533 if (dnsModeChanged) {
4534 // In despite of the identical IP address, the server is regarded as a different
4535 // server when DnsTlsServer.name is different. The resolver treats it as a
4536 // different object and begins the validation process.
4537 EXPECT_TRUE(WaitForPrivateDnsValidation(serverAddr, true));
4538 }
4539 } else if (serverAddr == unresponsiveTls.listen_address()) {
4540 // No revalidation needed for the server which have been marked as in_progesss.
4541 } else {
4542 // Must be unusable_addr.
4543 // In opportunistic mode, when a validation for a private DNS server fails, the
4544 // resolver just marks the server as failed and doesn't re-evaluate it, but the
4545 // server can be re-evaluated when setResolverConfiguration() is called.
4546 // However, in strict mode, the resolver automatically re-evaluates the server and
4547 // marks the server as in_progress until the validation succeeds, so repeated setup
4548 // makes no effect.
4549 if (dnsModeChanged || config.tlsName.empty() /* not in strict mode */) {
4550 EXPECT_TRUE(WaitForPrivateDnsValidation(serverAddr, false));
4551 }
4552 }
4553 }
4554
4555 // Repeated setups make no effect in strict mode.
Mike Yubc4b9502020-03-20 13:14:00 +08004556 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004557 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4558 if (config.tlsName.empty()) {
4559 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4560 }
Mike Yubc4b9502020-03-20 13:14:00 +08004561 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004562 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4563 if (config.tlsName.empty()) {
4564 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4565 }
4566
4567 EXPECT_EQ(unresponsiveTls.acceptConnectionsCount(), 1);
4568
4569 TlsNameLastTime = config.tlsName;
4570 }
4571
4572 // Check that all the validation results are caught.
4573 // Note: it doesn't mean no validation being in progress.
4574 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr1));
4575 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr2));
4576 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(unusable_addr));
4577}
4578
4579TEST_F(ResolverTest, RepeatedSetup_KeepChangingPrivateDnsServers) {
4580 enum TlsServerState { WORKING, UNSUPPORTED, UNRESPONSIVE };
4581 const std::string addr1 = getUniqueIPv4Address();
4582 const std::string addr2 = getUniqueIPv4Address();
Mike Yu9a185882020-03-25 16:02:36 +08004583 const auto waitForPrivateDnsStateUpdated = []() {
4584 // A buffer time for PrivateDnsConfiguration to update its state. It prevents this test
4585 // being flaky. See b/152009023 for the reason.
4586 std::this_thread::sleep_for(20ms);
4587 };
Mike Yu153b5b82020-03-04 19:53:54 +08004588
4589 test::DNSResponder dns1(addr1);
4590 test::DNSResponder dns2(addr2);
4591 StartDns(dns1, {});
4592 StartDns(dns2, {});
4593 test::DnsTlsFrontend tls1(addr1, "853", addr1, "53");
4594 test::DnsTlsFrontend tls2(addr2, "853", addr2, "53");
4595 ASSERT_TRUE(tls1.startServer());
4596 ASSERT_TRUE(tls2.startServer());
4597
4598 static const struct TestConfig {
4599 std::string tlsServer;
4600 std::string tlsName;
4601 bool expectNothingHappenWhenServerUnsupported;
4602 bool expectNothingHappenWhenServerUnresponsive;
4603 std::string asTestName() const {
4604 return fmt::format("{}, {}, {}, {}", tlsServer, tlsName,
4605 expectNothingHappenWhenServerUnsupported,
4606 expectNothingHappenWhenServerUnresponsive);
4607 }
4608 } testConfigs[] = {
4609 {{addr1}, "", false, false},
4610 {{addr2}, "", false, false},
4611 {{addr1}, "", false, true},
4612 {{addr2}, "", false, true},
4613 {{addr1}, kDefaultPrivateDnsHostName, false, true},
4614 {{addr2}, kDefaultPrivateDnsHostName, false, true},
4615 {{addr1}, kDefaultPrivateDnsHostName, true, true},
4616 {{addr2}, kDefaultPrivateDnsHostName, true, true},
4617
4618 // There's no new validation to start because there are already two validation threads
4619 // running (one is for addr1, the other is for addr2). This is because the comparator
4620 // doesn't compare DnsTlsServer.name. Keep the design as-is until it's known to be
4621 // harmful.
4622 {{addr1}, "", true, true},
4623 {{addr2}, "", true, true},
4624 {{addr1}, "", true, true},
4625 {{addr2}, "", true, true},
4626 };
4627
4628 for (const auto& serverState : {WORKING, UNSUPPORTED, UNRESPONSIVE}) {
4629 int testIndex = 0;
4630 for (const auto& config : testConfigs) {
4631 SCOPED_TRACE(fmt::format("serverState:{} testIndex:{} testConfig:[{}]", serverState,
4632 testIndex++, config.asTestName()));
4633 auto& tls = (config.tlsServer == addr1) ? tls1 : tls2;
4634
4635 if (serverState == UNSUPPORTED && tls.running()) ASSERT_TRUE(tls.stopServer());
4636 if (serverState != UNSUPPORTED && !tls.running()) ASSERT_TRUE(tls.startServer());
4637
4638 tls.setHangOnHandshakeForTesting(serverState == UNRESPONSIVE);
4639 const int connectCountsBefore = tls.acceptConnectionsCount();
4640
Mike Yu9a185882020-03-25 16:02:36 +08004641 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004642 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4643 parcel.servers = {config.tlsServer};
4644 parcel.tlsServers = {config.tlsServer};
4645 parcel.tlsName = config.tlsName;
4646 parcel.caCertificate = config.tlsName.empty() ? "" : kCaCert;
4647 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4648
4649 if (serverState == WORKING) {
4650 EXPECT_TRUE(WaitForPrivateDnsValidation(config.tlsServer, true));
4651 } else if (serverState == UNSUPPORTED) {
4652 if (config.expectNothingHappenWhenServerUnsupported) {
4653 // It's possible that the resolver hasn't yet started to
4654 // connect. Wait a while.
4655 // TODO: See if we can get rid of the hard waiting time, such as comparing
4656 // the CountDiff across two tests.
4657 std::this_thread::sleep_for(100ms);
4658 EXPECT_EQ(tls.acceptConnectionsCount(), connectCountsBefore);
4659 } else {
4660 EXPECT_TRUE(WaitForPrivateDnsValidation(config.tlsServer, false));
4661 }
4662 } else {
4663 // Must be UNRESPONSIVE.
4664 // DnsTlsFrontend is the only signal for checking whether or not the resolver starts
4665 // another validation when the server is unresponsive.
4666 const int expectCountDiff =
4667 config.expectNothingHappenWhenServerUnresponsive ? 0 : 1;
4668 if (expectCountDiff == 0) {
4669 // It's possible that the resolver hasn't yet started to
4670 // connect. Wait a while.
4671 std::this_thread::sleep_for(100ms);
4672 }
4673 const auto condition = [&]() {
4674 return tls.acceptConnectionsCount() == connectCountsBefore + expectCountDiff;
4675 };
4676 EXPECT_TRUE(PollForCondition(condition));
4677 }
4678 }
4679
4680 // Set to off mode to reset the PrivateDnsConfiguration state.
4681 ResolverParamsParcel setupOffmode = DnsResponderClient::GetDefaultResolverParamsParcel();
4682 setupOffmode.tlsServers.clear();
4683 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(setupOffmode));
4684 }
4685
4686 // Check that all the validation results are caught.
4687 // Note: it doesn't mean no validation being in progress.
4688 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr1));
4689 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr2));
4690}
4691
Ken Chen26dc2b02020-06-16 18:49:39 +08004692TEST_F(ResolverTest, PermissionCheckOnCertificateInjection) {
4693 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4694 parcel.caCertificate = kCaCert;
4695 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk());
4696
4697 for (const uid_t uid : {AID_SYSTEM, TEST_UID}) {
4698 ScopedChangeUID scopedChangeUID(uid);
4699 auto status = mDnsClient.resolvService()->setResolverConfiguration(parcel);
4700 EXPECT_EQ(status.getExceptionCode(), EX_SECURITY);
4701 }
4702}
4703
Hungming Chenbb90ab32019-10-28 18:20:31 +08004704// Parameterized tests.
4705// TODO: Merge the existing tests as parameterized test if possible.
4706// TODO: Perhaps move parameterized tests to an independent file.
4707enum class CallType { GETADDRINFO, GETHOSTBYNAME };
4708class ResolverParameterizedTest : public ResolverTest,
Hungming Chen63779052019-10-30 15:06:13 +08004709 public testing::WithParamInterface<CallType> {
4710 protected:
Hungming Chen22617fd2019-12-06 12:15:45 +08004711 void VerifyQueryHelloExampleComV4(const test::DNSResponder& dns, const CallType calltype,
4712 const bool verifyNumQueries = true) {
Hungming Chen63779052019-10-30 15:06:13 +08004713 if (calltype == CallType::GETADDRINFO) {
4714 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4715 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4716 ASSERT_TRUE(result != nullptr);
4717 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4718 } else if (calltype == CallType::GETHOSTBYNAME) {
4719 const hostent* result = gethostbyname("hello");
4720 ASSERT_TRUE(result != nullptr);
4721 ASSERT_EQ(4, result->h_length);
4722 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
4723 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4724 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
4725 } else {
4726 FAIL() << "Unsupported call type: " << static_cast<uint32_t>(calltype);
4727 }
Hungming Chen22617fd2019-12-06 12:15:45 +08004728 if (verifyNumQueries) EXPECT_EQ(1U, GetNumQueries(dns, kHelloExampleCom));
Hungming Chen63779052019-10-30 15:06:13 +08004729 }
4730};
Hungming Chenbb90ab32019-10-28 18:20:31 +08004731
Hungming Chen63779052019-10-30 15:06:13 +08004732INSTANTIATE_TEST_SUITE_P(QueryCallTest, ResolverParameterizedTest,
Hungming Chenbb90ab32019-10-28 18:20:31 +08004733 testing::Values(CallType::GETADDRINFO, CallType::GETHOSTBYNAME),
4734 [](const testing::TestParamInfo<CallType>& info) {
Hungming Chenbb90ab32019-10-28 18:20:31 +08004735 switch (info.param) {
4736 case CallType::GETADDRINFO:
Hungming Chen63779052019-10-30 15:06:13 +08004737 return "GetAddrInfo";
Hungming Chenbb90ab32019-10-28 18:20:31 +08004738 case CallType::GETHOSTBYNAME:
Hungming Chen63779052019-10-30 15:06:13 +08004739 return "GetHostByName";
Hungming Chenbb90ab32019-10-28 18:20:31 +08004740 default:
Hungming Chen63779052019-10-30 15:06:13 +08004741 return "InvalidParameter"; // Should not happen.
Hungming Chenbb90ab32019-10-28 18:20:31 +08004742 }
Hungming Chenbb90ab32019-10-28 18:20:31 +08004743 });
4744
4745TEST_P(ResolverParameterizedTest, AuthoritySectionAndAdditionalSection) {
4746 // DNS response may have more information in authority section and additional section.
4747 // Currently, getanswer() of packages/modules/DnsResolver/getaddrinfo.cpp doesn't parse the
4748 // content of authority section and additional section. Test these sections if they crash
4749 // the resolver, just in case. See also RFC 1035 section 4.1.
4750 const auto& calltype = GetParam();
4751 test::DNSHeader header(kDefaultDnsHeader);
4752
4753 // Create a DNS response which has a authoritative nameserver record in authority
4754 // section and its relevant address record in additional section.
4755 //
4756 // Question
4757 // hello.example.com. IN A
4758 // Answer
4759 // hello.example.com. IN A 1.2.3.4
4760 // Authority:
4761 // hello.example.com. IN NS ns1.example.com.
4762 // Additional:
4763 // ns1.example.com. IN A 5.6.7.8
4764 //
4765 // A response may have only question, answer, and authority section. Current testing response
4766 // should be able to cover this condition.
4767
4768 // Question section.
4769 test::DNSQuestion question{
4770 .qname = {.name = kHelloExampleCom},
4771 .qtype = ns_type::ns_t_a,
4772 .qclass = ns_c_in,
4773 };
4774 header.questions.push_back(std::move(question));
4775
4776 // Answer section.
4777 test::DNSRecord recordAnswer{
4778 .name = {.name = kHelloExampleCom},
4779 .rtype = ns_type::ns_t_a,
4780 .rclass = ns_c_in,
4781 .ttl = 0, // no cache
4782 };
Hungming Chen63779052019-10-30 15:06:13 +08004783 EXPECT_TRUE(test::DNSResponder::fillRdata(kHelloExampleComAddrV4, recordAnswer));
Hungming Chenbb90ab32019-10-28 18:20:31 +08004784 header.answers.push_back(std::move(recordAnswer));
4785
4786 // Authority section.
4787 test::DNSRecord recordAuthority{
4788 .name = {.name = kHelloExampleCom},
4789 .rtype = ns_type::ns_t_ns,
4790 .rclass = ns_c_in,
4791 .ttl = 0, // no cache
4792 };
4793 EXPECT_TRUE(test::DNSResponder::fillRdata("ns1.example.com.", recordAuthority));
4794 header.authorities.push_back(std::move(recordAuthority));
4795
4796 // Additional section.
4797 test::DNSRecord recordAdditional{
4798 .name = {.name = "ns1.example.com."},
4799 .rtype = ns_type::ns_t_a,
4800 .rclass = ns_c_in,
4801 .ttl = 0, // no cache
4802 };
4803 EXPECT_TRUE(test::DNSResponder::fillRdata("5.6.7.8", recordAdditional));
4804 header.additionals.push_back(std::move(recordAdditional));
4805
4806 // Start DNS server.
4807 test::DNSResponder dns(test::DNSResponder::MappingType::DNS_HEADER);
4808 dns.addMappingDnsHeader(kHelloExampleCom, ns_type::ns_t_a, header);
4809 ASSERT_TRUE(dns.startServer());
4810 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4811 dns.clearQueries();
4812
4813 // Expect that get the address and the resolver doesn't crash.
Hungming Chen63779052019-10-30 15:06:13 +08004814 VerifyQueryHelloExampleComV4(dns, calltype);
4815}
4816
4817TEST_P(ResolverParameterizedTest, MessageCompression) {
4818 const auto& calltype = GetParam();
4819
4820 // The response with compressed domain name by a pointer. See RFC 1035 section 4.1.4.
4821 //
4822 // Ignoring the other fields of the message, the domain name of question section and answer
4823 // section are presented as:
4824 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4825 // 12 | 5 | h |
4826 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4827 // 14 | e | l |
4828 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4829 // 16 | l | o |
4830 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4831 // 18 | 7 | e |
4832 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4833 // 20 | x | a |
4834 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4835 // 22 | m | p |
4836 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4837 // 24 | l | e |
4838 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4839 // 26 | 3 | c |
4840 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4841 // 28 | o | m |
4842 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4843 // 30 | 0 | ... |
4844 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4845 //
4846 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4847 // 35 | 1 1| 12 |
4848 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4849 const std::vector<uint8_t> kResponseAPointer = {
4850 /* Header */
4851 0x00, 0x00, /* Transaction ID: 0x0000 */
4852 0x81, 0x80, /* Flags: qr rd ra */
4853 0x00, 0x01, /* Questions: 1 */
4854 0x00, 0x01, /* Answer RRs: 1 */
4855 0x00, 0x00, /* Authority RRs: 0 */
4856 0x00, 0x00, /* Additional RRs: 0 */
4857 /* Queries */
4858 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
4859 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name: hello.example.com */
4860 0x00, 0x01, /* Type: A */
4861 0x00, 0x01, /* Class: IN */
4862 /* Answers */
4863 0xc0, 0x0c, /* Name: hello.example.com (a pointer) */
4864 0x00, 0x01, /* Type: A */
4865 0x00, 0x01, /* Class: IN */
4866 0x00, 0x00, 0x00, 0x00, /* Time to live: 0 */
4867 0x00, 0x04, /* Data length: 4 */
4868 0x01, 0x02, 0x03, 0x04 /* Address: 1.2.3.4 */
4869 };
4870
4871 // The response with compressed domain name by a sequence of labels ending with a pointer. See
4872 // RFC 1035 section 4.1.4.
4873 //
4874 // Ignoring the other fields of the message, the domain name of question section and answer
4875 // section are presented as:
4876 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4877 // 12 | 5 | h |
4878 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4879 // 14 | e | l |
4880 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4881 // 16 | l | o |
4882 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4883 // 18 | 7 | e |
4884 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4885 // 20 | x | a |
4886 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4887 // 22 | m | p |
4888 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4889 // 24 | l | e |
4890 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4891 // 26 | 3 | c |
4892 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4893 // 28 | o | m |
4894 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4895 // 30 | 0 | ... |
4896 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4897 //
4898 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4899 // 35 | 5 | h |
4900 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4901 // 37 | e | l |
4902 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4903 // 39 | l | o |
4904 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4905 // 41 | 1 1| 18 |
4906 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4907 const std::vector<uint8_t> kResponseLabelEndingWithAPointer = {
4908 /* Header */
4909 0x00, 0x00, /* Transaction ID: 0x0000 */
4910 0x81, 0x80, /* Flags: qr rd ra */
4911 0x00, 0x01, /* Questions: 1 */
4912 0x00, 0x01, /* Answer RRs: 1 */
4913 0x00, 0x00, /* Authority RRs: 0 */
4914 0x00, 0x00, /* Additional RRs: 0 */
4915 /* Queries */
4916 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
4917 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name: hello.example.com */
4918 0x00, 0x01, /* Type: A */
4919 0x00, 0x01, /* Class: IN */
4920 /* Answers */
4921 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0xc0,
4922 0x12, /* Name: hello.example.com (a label ending with a pointer) */
4923 0x00, 0x01, /* Type: A */
4924 0x00, 0x01, /* Class: IN */
4925 0x00, 0x00, 0x00, 0x00, /* Time to live: 0 */
4926 0x00, 0x04, /* Data length: 4 */
4927 0x01, 0x02, 0x03, 0x04 /* Address: 1.2.3.4 */
4928 };
4929
4930 for (const auto& response : {kResponseAPointer, kResponseLabelEndingWithAPointer}) {
4931 SCOPED_TRACE(StringPrintf("Hex dump: %s", toHex(makeSlice(response)).c_str()));
4932
4933 test::DNSResponder dns(test::DNSResponder::MappingType::BINARY_PACKET);
4934 dns.addMappingBinaryPacket(kHelloExampleComQueryV4, response);
4935 StartDns(dns, {});
4936 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4937
4938 // Expect no cache because the TTL of testing responses are 0.
4939 VerifyQueryHelloExampleComV4(dns, calltype);
Hungming Chenbb90ab32019-10-28 18:20:31 +08004940 }
Mike Yu40e67072019-10-09 21:14:09 +08004941}
Hungming Chen22617fd2019-12-06 12:15:45 +08004942
4943TEST_P(ResolverParameterizedTest, TruncatedResponse) {
4944 const auto& calltype = GetParam();
4945
Hungming Chen22617fd2019-12-06 12:15:45 +08004946 test::DNSResponder dns;
Ken Chen99344882020-01-01 14:59:38 +08004947 StartDns(dns, kLargeCnameChainRecords);
Hungming Chen22617fd2019-12-06 12:15:45 +08004948 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4949
4950 // Expect UDP response is truncated. The resolver retries over TCP. See RFC 1035 section 4.2.1.
4951 VerifyQueryHelloExampleComV4(dns, calltype, false);
4952 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom));
4953 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom));
4954}
Luke Huang420ee622019-11-27 17:52:44 +08004955
4956TEST_F(ResolverTest, KeepListeningUDP) {
4957 constexpr char listen_addr1[] = "127.0.0.4";
4958 constexpr char listen_addr2[] = "127.0.0.5";
4959 constexpr char host_name[] = "howdy.example.com.";
4960 const std::vector<DnsRecord> records = {
4961 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
4962 };
4963 const std::vector<int> params = {300, 25, 8, 8, 1000 /* BASE_TIMEOUT_MSEC */,
4964 1 /* retry count */};
4965 const int delayTimeMs = 1500;
4966
4967 test::DNSResponder neverRespondDns(listen_addr2, "53", static_cast<ns_rcode>(-1));
4968 neverRespondDns.setResponseProbability(0.0);
4969 StartDns(neverRespondDns, records);
Luke Huangf40df9c2020-04-21 08:51:48 +08004970 ScopedSystemProperties scopedSystemProperties(
4971 "persist.device_config.netd_native.keep_listening_udp", "1");
4972 // Re-setup test network to make experiment flag take effect.
4973 resetNetwork();
Luke Huang420ee622019-11-27 17:52:44 +08004974
4975 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr1, listen_addr2},
4976 kDefaultSearchDomains, params));
4977 // There are 2 DNS servers for this test.
4978 // |delayedDns| will be blocked for |delayTimeMs|, then start to respond to requests.
4979 // |neverRespondDns| will never respond.
4980 // In the first try, resolver will send query to |delayedDns| but get timeout error
4981 // because |delayTimeMs| > DNS timeout.
4982 // Then it's the second try, resolver will send query to |neverRespondDns| and
4983 // listen on both servers. Resolver will receive the answer coming from |delayedDns|.
Luke Huang420ee622019-11-27 17:52:44 +08004984
Luke Huang420ee622019-11-27 17:52:44 +08004985 test::DNSResponder delayedDns(listen_addr1);
4986 delayedDns.setResponseDelayMs(delayTimeMs);
4987 StartDns(delayedDns, records);
4988
4989 // Specify hints to ensure resolver doing query only 1 round.
4990 const addrinfo hints = {.ai_family = AF_INET6, .ai_socktype = SOCK_DGRAM};
4991 ScopedAddrinfo result = safe_getaddrinfo(host_name, nullptr, &hints);
4992 EXPECT_TRUE(result != nullptr);
4993
4994 std::string result_str = ToString(result);
4995 EXPECT_TRUE(result_str == "::1.2.3.4") << ", result_str='" << result_str << "'";
4996}
Luke Huang0a0870d2020-02-12 20:41:10 +08004997
4998TEST_F(ResolverTest, GetAddrInfoParallelLookupTimeout) {
4999 constexpr char listen_addr[] = "127.0.0.4";
5000 constexpr char host_name[] = "howdy.example.com.";
5001 constexpr int TIMING_TOLERANCE_MS = 200;
5002 constexpr int DNS_TIMEOUT_MS = 1000;
5003 const std::vector<DnsRecord> records = {
5004 {host_name, ns_type::ns_t_a, "1.2.3.4"},
5005 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
5006 };
5007 const std::vector<int> params = {300, 25, 8, 8, DNS_TIMEOUT_MS /* BASE_TIMEOUT_MSEC */,
5008 1 /* retry count */};
5009 test::DNSResponder neverRespondDns(listen_addr, "53", static_cast<ns_rcode>(-1));
5010 neverRespondDns.setResponseProbability(0.0);
5011 StartDns(neverRespondDns, records);
Luke Huangf40df9c2020-04-21 08:51:48 +08005012 ScopedSystemProperties scopedSystemProperties(
5013 "persist.device_config.netd_native.parallel_lookup", "1");
Luke Huangd1d734f2020-04-30 12:25:40 +08005014 // The default value of parallel_lookup_sleep_time should be very small
5015 // that we can ignore in this test case.
Luke Huangf40df9c2020-04-21 08:51:48 +08005016 // Re-setup test network to make experiment flag take effect.
5017 resetNetwork();
Luke Huang0a0870d2020-02-12 20:41:10 +08005018
5019 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}, kDefaultSearchDomains, params));
5020 neverRespondDns.clearQueries();
5021
Luke Huang0a0870d2020-02-12 20:41:10 +08005022 // Use a never respond DNS server to verify if the A/AAAA queries are sent in parallel.
5023 // The resolver parameters are set to timeout 1s and retry 1 times.
5024 // So we expect the safe_getaddrinfo_time_taken() might take ~1s to
5025 // return when parallel lookup is enabled. And the DNS server should receive 2 queries.
5026 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_DGRAM};
5027 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(host_name, nullptr, hints);
5028
5029 EXPECT_TRUE(result == nullptr);
5030 EXPECT_NEAR(DNS_TIMEOUT_MS, timeTakenMs, TIMING_TOLERANCE_MS)
5031 << "took time should approximate equal timeout";
5032 EXPECT_EQ(2U, GetNumQueries(neverRespondDns, host_name));
Mike Yu532405f2020-06-17 17:46:44 +08005033 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, RCODE_TIMEOUT, host_name, {});
Luke Huang0a0870d2020-02-12 20:41:10 +08005034}
Luke Huangd1d734f2020-04-30 12:25:40 +08005035
5036TEST_F(ResolverTest, GetAddrInfoParallelLookupSleepTime) {
5037 constexpr char listen_addr[] = "127.0.0.4";
5038 constexpr int TIMING_TOLERANCE_MS = 200;
5039 const std::vector<DnsRecord> records = {
5040 {kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4},
5041 {kHelloExampleCom, ns_type::ns_t_aaaa, kHelloExampleComAddrV6},
5042 };
5043 const std::vector<int> params = {300, 25, 8, 8, 1000 /* BASE_TIMEOUT_MSEC */,
5044 1 /* retry count */};
5045 test::DNSResponder dns(listen_addr);
5046 StartDns(dns, records);
5047 ScopedSystemProperties scopedSystemProperties1(
5048 "persist.device_config.netd_native.parallel_lookup", "1");
5049 constexpr int PARALLEL_LOOKUP_SLEEP_TIME_MS = 500;
5050 ScopedSystemProperties scopedSystemProperties2(
5051 "persist.device_config.netd_native.parallel_lookup_sleep_time",
5052 std::to_string(PARALLEL_LOOKUP_SLEEP_TIME_MS));
5053 // Re-setup test network to make experiment flag take effect.
5054 resetNetwork();
5055
5056 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}, kDefaultSearchDomains, params));
5057 dns.clearQueries();
5058
5059 // Expect the safe_getaddrinfo_time_taken() might take ~500ms to return because we set
5060 // parallel_lookup_sleep_time to 500ms.
5061 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_DGRAM};
5062 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(kHelloExampleCom, nullptr, hints);
5063
5064 EXPECT_NE(nullptr, result);
5065 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(
5066 {kHelloExampleComAddrV4, kHelloExampleComAddrV6}));
5067 EXPECT_NEAR(PARALLEL_LOOKUP_SLEEP_TIME_MS, timeTakenMs, TIMING_TOLERANCE_MS)
5068 << "took time should approximate equal timeout";
5069 EXPECT_EQ(2U, GetNumQueries(dns, kHelloExampleCom));
5070
5071 // Expect the PARALLEL_LOOKUP_SLEEP_TIME_MS won't affect the query under cache hit case.
5072 dns.clearQueries();
5073 std::tie(result, timeTakenMs) = safe_getaddrinfo_time_taken(kHelloExampleCom, nullptr, hints);
5074 EXPECT_NE(nullptr, result);
5075 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(
5076 {kHelloExampleComAddrV4, kHelloExampleComAddrV6}));
5077 EXPECT_GT(PARALLEL_LOOKUP_SLEEP_TIME_MS, timeTakenMs);
5078 EXPECT_EQ(0U, GetNumQueries(dns, kHelloExampleCom));
5079}
Luke Huangeb618ef2020-05-26 14:17:02 +08005080
5081TEST_F(ResolverTest, BlockDnsQueryUidDoesNotLeadToBadServer) {
5082 // This test relies on blocking traffic on loopback, which xt_qtaguid does not do.
5083 // See aosp/358413 and b/34444781 for why.
5084 SKIP_IF_BPF_NOT_SUPPORTED;
5085
5086 constexpr char listen_addr1[] = "127.0.0.4";
5087 constexpr char listen_addr2[] = "::1";
5088 test::DNSResponder dns1(listen_addr1);
5089 test::DNSResponder dns2(listen_addr2);
5090 StartDns(dns1, {});
5091 StartDns(dns2, {});
5092
5093 std::vector<std::string> servers = {listen_addr1, listen_addr2};
5094 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
5095 dns1.clearQueries();
5096 dns2.clearQueries();
5097 {
5098 ScopeBlockedUIDRule scopeBlockUidRule(mDnsClient.netdService(), TEST_UID);
5099 // Start querying ten times.
5100 for (int i = 0; i < 10; i++) {
5101 std::string hostName = fmt::format("blocked{}.com", i);
5102 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
5103 EXPECT_EQ(safe_getaddrinfo(hostName.c_str(), nullptr, &hints), nullptr);
5104 }
5105 }
5106 // Since all query packets are blocked, we should not see any stats of them.
5107 const std::vector<NameserverStats> expectedEmptyDnsStats = {
5108 NameserverStats(listen_addr1),
5109 NameserverStats(listen_addr2),
5110 };
5111 expectStatsFromGetResolverInfo(expectedEmptyDnsStats);
5112 EXPECT_EQ(dns1.queries().size(), 0U);
5113 EXPECT_EQ(dns2.queries().size(), 0U);
5114}