blob: a2a694e199bd48eb116d76cc6b43428a12d9cf56 [file] [log] [blame]
Ken Chenb9fa2062018-11-13 21:51:13 +08001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
Lorenzo Colitti0a8b4aa2019-06-26 22:31:03 +090010 * Unless required by applicable law or agreed to in writing, software
Ken Chenb9fa2062018-11-13 21:51:13 +080011 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *
16 */
17
Bernie Innocenti3952ccc2019-03-03 19:39:53 +090018#define LOG_TAG "resolv_integration_test"
Ken Chenb9fa2062018-11-13 21:51:13 +080019
Hungming Chen5bf09772019-04-25 11:16:13 +080020#include <android-base/logging.h>
Bernie Innocenti41b82c42019-06-05 22:38:25 +090021#include <android-base/parseint.h>
Mike Yu40e67072019-10-09 21:14:09 +080022#include <android-base/properties.h>
Bernie Innocenti41b82c42019-06-05 22:38:25 +090023#include <android-base/stringprintf.h>
24#include <android-base/unique_fd.h>
25#include <android/multinetwork.h> // ResNsendFlags
Ken Chenb9fa2062018-11-13 21:51:13 +080026#include <arpa/inet.h>
Luke Huang94b10b92018-11-21 20:13:38 +080027#include <arpa/nameser.h>
Hungming Chene8f970c2019-04-10 17:34:06 +080028#include <binder/ProcessState.h>
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +090029#include <bpf/BpfUtils.h>
Bernie Innocenti41b82c42019-06-05 22:38:25 +090030#include <cutils/sockets.h>
31#include <gmock/gmock-matchers.h>
32#include <gtest/gtest.h>
Ken Chenb9fa2062018-11-13 21:51:13 +080033#include <netdb.h>
Luke Huang9d2d25b2019-06-14 00:34:05 +080034#include <netdutils/InternetAddresses.h>
Luke Huang579ddc72019-06-14 00:59:39 +080035#include <netdutils/NetworkConstants.h> // SHA256_SIZE
Luke Huang9d2d25b2019-06-14 00:34:05 +080036#include <netdutils/ResponseCode.h>
Hungming Chen63779052019-10-30 15:06:13 +080037#include <netdutils/Slice.h>
Luke Huang9d2d25b2019-06-14 00:34:05 +080038#include <netdutils/SocketOption.h>
Mike Yu40e67072019-10-09 21:14:09 +080039#include <netdutils/Stopwatch.h>
Luke Huang94b10b92018-11-21 20:13:38 +080040#include <netinet/in.h>
41#include <poll.h> /* poll */
Bernie Innocenti41b82c42019-06-05 22:38:25 +090042#include <private/android_filesystem_config.h>
Luke Huang94b10b92018-11-21 20:13:38 +080043#include <resolv.h>
Ken Chenb9fa2062018-11-13 21:51:13 +080044#include <stdarg.h>
Ken Chenb9fa2062018-11-13 21:51:13 +080045#include <stdlib.h>
Luke Huang94b10b92018-11-21 20:13:38 +080046#include <sys/socket.h>
47#include <sys/un.h>
Ken Chenb9fa2062018-11-13 21:51:13 +080048#include <unistd.h>
49
50#include <algorithm>
51#include <chrono>
52#include <iterator>
53#include <numeric>
54#include <thread>
55
Luke Huang27616fe2020-05-26 17:31:15 +080056#include <DnsProxydProtocol.h> // NETID_USE_LOCAL_NAMESERVERS
Luke Huangf8215372019-11-22 11:53:41 +080057#include <aidl/android/net/IDnsResolver.h>
58#include <android/binder_manager.h>
59#include <android/binder_process.h>
Bernie Innocenti41b82c42019-06-05 22:38:25 +090060#include "NetdClient.h"
Bernie Innocenti41b82c42019-06-05 22:38:25 +090061#include "ResolverStats.h"
Luke Huangf8215372019-11-22 11:53:41 +080062#include "netid_client.h" // NETID_UNSET
63#include "params.h" // MAXNS
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +090064#include "test_utils.h"
Hungming Chene8f970c2019-04-10 17:34:06 +080065#include "tests/dns_metrics_listener/dns_metrics_listener.h"
chenbruceb43ec752019-07-24 20:19:41 +080066#include "tests/dns_responder/dns_responder.h"
Luke Huangf8215372019-11-22 11:53:41 +080067#include "tests/dns_responder/dns_responder_client_ndk.h"
Hungming Chenc6556622019-10-02 16:01:07 +080068#include "tests/dns_responder/dns_tls_certificate.h"
chenbruceb43ec752019-07-24 20:19:41 +080069#include "tests/dns_responder/dns_tls_frontend.h"
Luke Huangfde82482019-06-04 01:04:53 +080070#include "tests/resolv_test_utils.h"
Ken Chenb9fa2062018-11-13 21:51:13 +080071
Luke Huang0d592bc2019-05-25 18:24:03 +080072// Valid VPN netId range is 100 ~ 65535
73constexpr int TEST_VPN_NETID = 65502;
Luke Huang94b10b92018-11-21 20:13:38 +080074constexpr int MAXPACKET = (8 * 1024);
Ken Chenb9fa2062018-11-13 21:51:13 +080075
Sehee Park2c118782019-05-07 13:02:45 +090076// Use maximum reserved appId for applications to avoid conflict with existing uids.
77static const int TEST_UID = 99999;
78
Ken Chenb9fa2062018-11-13 21:51:13 +080079// Semi-public Bionic hook used by the NDK (frameworks/base/native/android/net.c)
80// Tested here for convenience.
81extern "C" int android_getaddrinfofornet(const char* hostname, const char* servname,
82 const addrinfo* hints, unsigned netid, unsigned mark,
83 struct addrinfo** result);
84
Mike Yuc0000252020-03-19 07:14:23 +000085using namespace std::chrono_literals;
86
Luke Huang70070852019-11-25 18:25:50 +080087using aidl::android::net::IDnsResolver;
Luke Huangf8215372019-11-22 11:53:41 +080088using aidl::android::net::INetd;
Mike Yu8ac63402019-12-02 15:28:38 +080089using aidl::android::net::ResolverParamsParcel;
Luke Huang9807e6b2019-05-20 16:17:12 +080090using android::base::ParseInt;
Ken Chenb9fa2062018-11-13 21:51:13 +080091using android::base::StringPrintf;
Luke Huang9807e6b2019-05-20 16:17:12 +080092using android::base::unique_fd;
Ken Chenb9fa2062018-11-13 21:51:13 +080093using android::net::ResolverStats;
Hungming Chene8f970c2019-04-10 17:34:06 +080094using android::net::metrics::DnsMetricsListener;
Ken Chenb9fa2062018-11-13 21:51:13 +080095using android::netdutils::enableSockopt;
Hungming Chen63779052019-10-30 15:06:13 +080096using android::netdutils::makeSlice;
Luke Huang9807e6b2019-05-20 16:17:12 +080097using android::netdutils::ResponseCode;
Luke Huang9d2d25b2019-06-14 00:34:05 +080098using android::netdutils::ScopedAddrinfo;
Mike Yu40e67072019-10-09 21:14:09 +080099using android::netdutils::Stopwatch;
Hungming Chen63779052019-10-30 15:06:13 +0800100using android::netdutils::toHex;
Ken Chenb9fa2062018-11-13 21:51:13 +0800101
102// TODO: move into libnetdutils?
103namespace {
Luke Huangfde82482019-06-04 01:04:53 +0800104
Ken Chenb9fa2062018-11-13 21:51:13 +0800105ScopedAddrinfo safe_getaddrinfo(const char* node, const char* service,
106 const struct addrinfo* hints) {
107 addrinfo* result = nullptr;
108 if (getaddrinfo(node, service, hints, &result) != 0) {
109 result = nullptr; // Should already be the case, but...
110 }
111 return ScopedAddrinfo(result);
112}
Luke Huangfde82482019-06-04 01:04:53 +0800113
Mike Yu40e67072019-10-09 21:14:09 +0800114std::pair<ScopedAddrinfo, int> safe_getaddrinfo_time_taken(const char* node, const char* service,
115 const addrinfo& hints) {
116 Stopwatch s;
117 ScopedAddrinfo result = safe_getaddrinfo(node, service, &hints);
118 return {std::move(result), s.timeTakenUs() / 1000};
119}
120
Mike Yuc0000252020-03-19 07:14:23 +0000121struct NameserverStats {
122 NameserverStats() = delete;
123 NameserverStats(const std::string server) : server(server) {}
124 NameserverStats& setSuccesses(int val) {
125 successes = val;
126 return *this;
127 }
128 NameserverStats& setErrors(int val) {
129 errors = val;
130 return *this;
131 }
132 NameserverStats& setTimeouts(int val) {
133 timeouts = val;
134 return *this;
135 }
136 NameserverStats& setInternalErrors(int val) {
137 internal_errors = val;
138 return *this;
139 }
140
141 const std::string server;
142 int successes = 0;
143 int errors = 0;
144 int timeouts = 0;
145 int internal_errors = 0;
146};
147
Ken Chenb9fa2062018-11-13 21:51:13 +0800148} // namespace
149
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900150class ResolverTest : public ::testing::Test {
Hungming Chene8f970c2019-04-10 17:34:06 +0800151 public:
Automerger Merge Worker19a291b2020-03-17 02:41:30 +0000152 static void SetUpTestSuite() {
Hungming Chen5bf09772019-04-25 11:16:13 +0800153 // Get binder service.
154 // Note that |mDnsClient| is not used for getting binder service in this static function.
155 // The reason is that wants to keep |mDnsClient| as a non-static data member. |mDnsClient|
156 // which sets up device network configuration could be independent from every test.
Luke Huangf8215372019-11-22 11:53:41 +0800157 // TODO: Perhaps add a static function in resolv_test_binder_utils.{cpp,h} to get binder
158 // service.
159
160 AIBinder* binder = AServiceManager_getService("dnsresolver");
161 ndk::SpAIBinder resolvBinder = ndk::SpAIBinder(binder);
162 auto resolvService = aidl::android::net::IDnsResolver::fromBinder(resolvBinder);
Hungming Chen5bf09772019-04-25 11:16:13 +0800163 ASSERT_NE(nullptr, resolvService.get());
164
165 // Subscribe the death recipient to the service IDnsResolver for detecting Netd death.
Luke Huang70070852019-11-25 18:25:50 +0800166 // GTEST assertion macros are not invoked for generating a test failure in the death
167 // recipient because the macros can't indicate failed test if Netd died between tests.
168 // Moreover, continuing testing may have no meaningful after Netd death. Therefore, the
169 // death recipient aborts process by GTEST_LOG_(FATAL) once Netd died.
Luke Huangf8215372019-11-22 11:53:41 +0800170 sResolvDeathRecipient = AIBinder_DeathRecipient_new([](void*) {
171 constexpr char errorMessage[] = "Netd died";
172 LOG(ERROR) << errorMessage;
173 GTEST_LOG_(FATAL) << errorMessage;
174 });
175 ASSERT_EQ(STATUS_OK, AIBinder_linkToDeath(binder, sResolvDeathRecipient, nullptr));
Hungming Chen5bf09772019-04-25 11:16:13 +0800176
177 // Subscribe the DNS listener for verifying DNS metrics event contents.
Luke Huangf8215372019-11-22 11:53:41 +0800178 sDnsMetricsListener = ndk::SharedRefBase::make<DnsMetricsListener>(
179 TEST_NETID /*monitor specific network*/);
Hungming Chen5bf09772019-04-25 11:16:13 +0800180 ASSERT_TRUE(resolvService->registerEventListener(sDnsMetricsListener).isOk());
181
182 // Start the binder thread pool for listening DNS metrics events and receiving death
183 // recipient.
Luke Huangf8215372019-11-22 11:53:41 +0800184 ABinderProcess_startThreadPool();
Hungming Chene8f970c2019-04-10 17:34:06 +0800185 }
Automerger Merge Worker19a291b2020-03-17 02:41:30 +0000186 static void TearDownTestSuite() { AIBinder_DeathRecipient_delete(sResolvDeathRecipient); }
Hungming Chene8f970c2019-04-10 17:34:06 +0800187
Ken Chenb9fa2062018-11-13 21:51:13 +0800188 protected:
Lorenzo Colitti5be8bf22020-05-26 10:55:21 +0000189 void SetUp() {
190 mDnsClient.SetUp();
191 sDnsMetricsListener->reset();
192 }
193
Mike Yu960243d2020-01-17 19:02:15 +0800194 void TearDown() {
195 // Ensure the dump works at the end of each test.
196 DumpResolverService();
197
198 mDnsClient.TearDown();
199 }
nuccachena26cc2a2018-07-17 18:07:23 +0800200
Luke Huang68fa5002020-04-23 15:48:47 +0000201 void resetNetwork() {
202 mDnsClient.TearDown();
203 mDnsClient.SetupOemNetwork();
204 }
205
Xiao Ma09b71022018-12-11 17:56:32 +0900206 void StartDns(test::DNSResponder& dns, const std::vector<DnsRecord>& records) {
207 for (const auto& r : records) {
208 dns.addMapping(r.host_name, r.type, r.addr);
209 }
210
211 ASSERT_TRUE(dns.startServer());
212 dns.clearQueries();
213 }
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900214
Mike Yu960243d2020-01-17 19:02:15 +0800215 void DumpResolverService() {
216 unique_fd fd(open("/dev/null", O_WRONLY));
217 EXPECT_EQ(mDnsClient.resolvService()->dump(fd, nullptr, 0), 0);
218
219 const char* querylogCmd[] = {"querylog"}; // Keep it sync with DnsQueryLog::DUMP_KEYWORD.
220 EXPECT_EQ(mDnsClient.resolvService()->dump(fd, querylogCmd, std::size(querylogCmd)), 0);
221 }
222
Hungming Chene8f970c2019-04-10 17:34:06 +0800223 bool WaitForNat64Prefix(ExpectNat64PrefixStatus status,
224 std::chrono::milliseconds timeout = std::chrono::milliseconds(1000)) {
Hungming Chen5bf09772019-04-25 11:16:13 +0800225 return sDnsMetricsListener->waitForNat64Prefix(status, timeout);
Hungming Chene8f970c2019-04-10 17:34:06 +0800226 }
227
Mike Yu724f77d2019-08-16 11:14:50 +0800228 bool WaitForPrivateDnsValidation(std::string serverAddr, bool validated) {
229 return sDnsMetricsListener->waitForPrivateDnsValidation(serverAddr, validated);
230 }
231
Mike Yuc0000252020-03-19 07:14:23 +0000232 bool hasUncaughtPrivateDnsValidation(const std::string& serverAddr) {
233 return sDnsMetricsListener->findValidationRecord(serverAddr);
234 }
235
236 bool expectStatsFromGetResolverInfo(const std::vector<NameserverStats>& nameserversStats) {
237 std::vector<std::string> res_servers;
238 std::vector<std::string> res_domains;
239 std::vector<std::string> res_tls_servers;
240 res_params res_params;
241 std::vector<ResolverStats> res_stats;
242 int wait_for_pending_req_timeout_count;
243
244 if (!DnsResponderClient::GetResolverInfo(mDnsClient.resolvService(), TEST_NETID,
245 &res_servers, &res_domains, &res_tls_servers,
246 &res_params, &res_stats,
247 &wait_for_pending_req_timeout_count)) {
248 ADD_FAILURE() << "GetResolverInfo failed";
249 return false;
250 }
251
252 if (res_servers.size() != res_stats.size()) {
253 ADD_FAILURE() << fmt::format("res_servers.size() != res_stats.size(): {} != {}",
254 res_servers.size(), res_stats.size());
255 return false;
256 }
257 if (res_servers.size() != nameserversStats.size()) {
258 ADD_FAILURE() << fmt::format("res_servers.size() != nameserversStats.size(): {} != {}",
259 res_servers.size(), nameserversStats.size());
260 return false;
261 }
262
263 for (const auto& stats : nameserversStats) {
264 SCOPED_TRACE(stats.server);
265 const auto it = std::find(res_servers.begin(), res_servers.end(), stats.server);
266 if (it == res_servers.end()) {
267 ADD_FAILURE() << fmt::format("nameserver {} not found in the list {{{}}}",
268 stats.server, fmt::join(res_servers, ", "));
269 return false;
270 }
271 const int index = std::distance(res_servers.begin(), it);
272
273 // The check excludes rtt_avg, last_sample_time, and usable since they will be obsolete
274 // after |res_stats| is retrieved from NetConfig.dnsStats rather than NetConfig.nsstats.
275 EXPECT_EQ(res_stats[index].successes, stats.successes);
276 EXPECT_EQ(res_stats[index].errors, stats.errors);
277 EXPECT_EQ(res_stats[index].timeouts, stats.timeouts);
278 EXPECT_EQ(res_stats[index].internal_errors, stats.internal_errors);
279 }
280
281 return true;
282 }
283
284 // Since there's no way to terminate private DNS validation threads at any time. Tests that
285 // focus on the results of private DNS validation can interfere with each other if they use the
286 // same IP address for test servers. getUniqueIPv4Address() is a workaround to reduce the
287 // possibility of tests being flaky. A feasible solution is to forbid the validation threads,
288 // which are considered as outdated (e.g. switch the resolver to private DNS OFF mode), updating
289 // the result to the PrivateDnsConfiguration instance.
290 static std::string getUniqueIPv4Address() {
291 static int counter = 0;
292 return fmt::format("127.0.100.{}", (++counter & 0xff));
293 }
294
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900295 DnsResponderClient mDnsClient;
Xiao Ma09b71022018-12-11 17:56:32 +0900296
Hungming Chen5bf09772019-04-25 11:16:13 +0800297 // Use a shared static DNS listener for all tests to avoid registering lots of listeners
298 // which may be released late until process terminated. Currently, registered DNS listener
299 // is removed by binder death notification which is fired when the process hosting an
300 // IBinder has gone away. If every test in ResolverTest registers its DNS listener, Netd
301 // may temporarily hold lots of dead listeners until the unit test process terminates.
302 // TODO: Perhaps add an unregistering listener binder call or fork a listener process which
303 // could be terminated earlier.
Luke Huangf8215372019-11-22 11:53:41 +0800304 static std::shared_ptr<DnsMetricsListener>
Automerger Merge Worker19a291b2020-03-17 02:41:30 +0000305 sDnsMetricsListener; // Initialized in SetUpTestSuite.
Hungming Chen5bf09772019-04-25 11:16:13 +0800306
307 // Use a shared static death recipient to monitor the service death. The static death
308 // recipient could monitor the death not only during the test but also between tests.
Automerger Merge Worker19a291b2020-03-17 02:41:30 +0000309 static AIBinder_DeathRecipient* sResolvDeathRecipient; // Initialized in SetUpTestSuite.
Ken Chenb9fa2062018-11-13 21:51:13 +0800310};
311
Hungming Chen5bf09772019-04-25 11:16:13 +0800312// Initialize static member of class.
Luke Huangf8215372019-11-22 11:53:41 +0800313std::shared_ptr<DnsMetricsListener> ResolverTest::sDnsMetricsListener;
314AIBinder_DeathRecipient* ResolverTest::sResolvDeathRecipient;
Hungming Chen5bf09772019-04-25 11:16:13 +0800315
Ken Chenb9fa2062018-11-13 21:51:13 +0800316TEST_F(ResolverTest, GetHostByName) {
Xiao Ma09b71022018-12-11 17:56:32 +0900317 constexpr char nonexistent_host_name[] = "nonexistent.example.com.";
318
319 test::DNSResponder dns;
320 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.3"}});
321 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800322
323 const hostent* result;
Ken Chenb9fa2062018-11-13 21:51:13 +0800324 result = gethostbyname("nonexistent");
325 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, nonexistent_host_name));
326 ASSERT_TRUE(result == nullptr);
327 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
328
329 dns.clearQueries();
330 result = gethostbyname("hello");
Xiao Ma09b71022018-12-11 17:56:32 +0900331 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
Ken Chenb9fa2062018-11-13 21:51:13 +0800332 ASSERT_FALSE(result == nullptr);
333 ASSERT_EQ(4, result->h_length);
334 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
335 EXPECT_EQ("1.2.3.3", ToString(result));
336 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800337}
338
lifr4e4a2e02019-01-29 16:53:51 +0800339TEST_F(ResolverTest, GetHostByName_cnames) {
340 constexpr char host_name[] = "host.example.com.";
341 size_t cnamecount = 0;
342 test::DNSResponder dns;
343
344 const std::vector<DnsRecord> records = {
345 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
346 {"a.example.com.", ns_type::ns_t_cname, "b.example.com."},
347 {"b.example.com.", ns_type::ns_t_cname, "c.example.com."},
348 {"c.example.com.", ns_type::ns_t_cname, "d.example.com."},
349 {"d.example.com.", ns_type::ns_t_cname, "e.example.com."},
350 {"e.example.com.", ns_type::ns_t_cname, host_name},
351 {host_name, ns_type::ns_t_a, "1.2.3.3"},
352 {host_name, ns_type::ns_t_aaaa, "2001:db8::42"},
353 };
354 StartDns(dns, records);
355 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
356
357 // using gethostbyname2() to resolve ipv4 hello.example.com. to 1.2.3.3
358 // Ensure the v4 address and cnames are correct
359 const hostent* result;
360 result = gethostbyname2("hello", AF_INET);
361 ASSERT_FALSE(result == nullptr);
362
363 for (int i = 0; result != nullptr && result->h_aliases[i] != nullptr; i++) {
364 std::string domain_name = records[i].host_name.substr(0, records[i].host_name.size() - 1);
365 EXPECT_EQ(result->h_aliases[i], domain_name);
366 cnamecount++;
367 }
368 // The size of "Non-cname type" record in DNS records is 2
369 ASSERT_EQ(cnamecount, records.size() - 2);
370 ASSERT_EQ(4, result->h_length);
371 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
372 EXPECT_EQ("1.2.3.3", ToString(result));
373 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
374 EXPECT_EQ(1U, dns.queries().size()) << dns.dumpQueries();
375
376 // using gethostbyname2() to resolve ipv6 hello.example.com. to 2001:db8::42
377 // Ensure the v6 address and cnames are correct
378 cnamecount = 0;
379 dns.clearQueries();
380 result = gethostbyname2("hello", AF_INET6);
381 for (unsigned i = 0; result != nullptr && result->h_aliases[i] != nullptr; i++) {
382 std::string domain_name = records[i].host_name.substr(0, records[i].host_name.size() - 1);
383 EXPECT_EQ(result->h_aliases[i], domain_name);
384 cnamecount++;
385 }
386 // The size of "Non-cname type" DNS record in records is 2
387 ASSERT_EQ(cnamecount, records.size() - 2);
388 ASSERT_FALSE(result == nullptr);
389 ASSERT_EQ(16, result->h_length);
390 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
391 EXPECT_EQ("2001:db8::42", ToString(result));
392 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
393}
394
395TEST_F(ResolverTest, GetHostByName_cnamesInfiniteLoop) {
396 test::DNSResponder dns;
397 const std::vector<DnsRecord> records = {
398 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
399 {"a.example.com.", ns_type::ns_t_cname, kHelloExampleCom},
400 };
401 StartDns(dns, records);
402 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
403
404 const hostent* result;
405 result = gethostbyname2("hello", AF_INET);
406 ASSERT_TRUE(result == nullptr);
407
408 dns.clearQueries();
409 result = gethostbyname2("hello", AF_INET6);
410 ASSERT_TRUE(result == nullptr);
411}
412
Ken Chenb9fa2062018-11-13 21:51:13 +0800413TEST_F(ResolverTest, GetHostByName_localhost) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800414 constexpr char name_camelcase[] = "LocalHost";
Ken Chenb9fa2062018-11-13 21:51:13 +0800415 constexpr char name_ip6_dot[] = "ip6-localhost.";
416 constexpr char name_ip6_fqdn[] = "ip6-localhost.example.com.";
417
418 // Add a dummy nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900419 test::DNSResponder dns;
420 StartDns(dns, {});
421 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800422
423 // Expect no DNS queries; localhost is resolved via /etc/hosts
Xiao Ma09b71022018-12-11 17:56:32 +0900424 const hostent* result = gethostbyname(kLocalHost);
Ken Chenb9fa2062018-11-13 21:51:13 +0800425 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
426 ASSERT_FALSE(result == nullptr);
427 ASSERT_EQ(4, result->h_length);
428 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900429 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800430 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
431
432 // Ensure the hosts file resolver ignores case of hostnames
433 result = gethostbyname(name_camelcase);
434 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 // The hosts file also contains ip6-localhost, but gethostbyname() won't
chenbruce018fdb22019-06-12 18:08:04 +0800442 // return it. This would be easy to
Ken Chenb9fa2062018-11-13 21:51:13 +0800443 // change, but there's no point in changing the legacy behavior; new code
444 // should be calling getaddrinfo() anyway.
445 // So we check the legacy behavior, which results in amusing A-record
446 // lookups for ip6-localhost, with and without search domains appended.
447 dns.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900448 result = gethostbyname(kIp6LocalHost);
Sehee Parkbbca0202018-11-16 10:53:16 +0900449 EXPECT_EQ(2U, dns.queries().size()) << dns.dumpQueries();
450 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, name_ip6_dot)) << dns.dumpQueries();
451 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, name_ip6_fqdn)) << dns.dumpQueries();
Ken Chenb9fa2062018-11-13 21:51:13 +0800452 ASSERT_TRUE(result == nullptr);
453
454 // Finally, use gethostbyname2() to resolve ip6-localhost to ::1 from
455 // the hosts file.
456 dns.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900457 result = gethostbyname2(kIp6LocalHost, AF_INET6);
Ken Chenb9fa2062018-11-13 21:51:13 +0800458 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
459 ASSERT_FALSE(result == nullptr);
460 ASSERT_EQ(16, result->h_length);
461 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900462 EXPECT_EQ(kIp6LocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800463 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800464}
465
466TEST_F(ResolverTest, GetHostByName_numeric) {
467 // Add a dummy nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900468 test::DNSResponder dns;
469 StartDns(dns, {});
470 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800471
472 // Numeric v4 address: expect no DNS queries
473 constexpr char numeric_v4[] = "192.168.0.1";
Ken Chenb9fa2062018-11-13 21:51:13 +0800474 const hostent* result = gethostbyname(numeric_v4);
Sehee Parkbbca0202018-11-16 10:53:16 +0900475 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800476 ASSERT_FALSE(result == nullptr);
477 ASSERT_EQ(4, result->h_length); // v4
478 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
479 EXPECT_EQ(numeric_v4, ToString(result));
480 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
481
482 // gethostbyname() recognizes a v6 address, and fails with no DNS queries
483 constexpr char numeric_v6[] = "2001:db8::42";
484 dns.clearQueries();
485 result = gethostbyname(numeric_v6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900486 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800487 EXPECT_TRUE(result == nullptr);
488
489 // Numeric v6 address with gethostbyname2(): succeeds with no DNS queries
490 dns.clearQueries();
491 result = gethostbyname2(numeric_v6, AF_INET6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900492 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800493 ASSERT_FALSE(result == nullptr);
494 ASSERT_EQ(16, result->h_length); // v6
495 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
496 EXPECT_EQ(numeric_v6, ToString(result));
497 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
498
499 // Numeric v6 address with scope work with getaddrinfo(),
500 // but gethostbyname2() does not understand them; it issues two dns
501 // queries, then fails. This hardly ever happens, there's no point
502 // in fixing this. This test simply verifies the current (bogus)
503 // behavior to avoid further regressions (like crashes, or leaks).
504 constexpr char numeric_v6_scope[] = "fe80::1%lo";
505 dns.clearQueries();
506 result = gethostbyname2(numeric_v6_scope, AF_INET6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900507 EXPECT_EQ(2U, dns.queries().size()); // OUCH!
Ken Chenb9fa2062018-11-13 21:51:13 +0800508 ASSERT_TRUE(result == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800509}
510
511TEST_F(ResolverTest, BinderSerialization) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800512 std::vector<int> params_offsets = {
Luke Huang5bd827c2019-03-14 16:10:04 +0800513 IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY,
514 IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD,
515 IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES,
516 IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES,
517 IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC,
518 IDnsResolver::RESOLVER_PARAMS_RETRY_COUNT,
Ken Chenb9fa2062018-11-13 21:51:13 +0800519 };
Bernie Innocentib102dd22018-12-04 14:57:48 +0900520 const int size = static_cast<int>(params_offsets.size());
Luke Huang5bd827c2019-03-14 16:10:04 +0800521 EXPECT_EQ(size, IDnsResolver::RESOLVER_PARAMS_COUNT);
Ken Chenb9fa2062018-11-13 21:51:13 +0800522 std::sort(params_offsets.begin(), params_offsets.end());
Bernie Innocentib102dd22018-12-04 14:57:48 +0900523 for (int i = 0; i < size; ++i) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800524 EXPECT_EQ(params_offsets[i], i);
525 }
526}
527
528TEST_F(ResolverTest, GetHostByName_Binder) {
Luke Huangf8215372019-11-22 11:53:41 +0800529 std::vector<std::string> domains = {"example.com"};
Ken Chenb9fa2062018-11-13 21:51:13 +0800530 std::vector<std::unique_ptr<test::DNSResponder>> dns;
531 std::vector<std::string> servers;
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900532 std::vector<DnsResponderClient::Mapping> mappings;
533 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupMappings(1, domains, &mappings));
534 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupDNSServers(4, mappings, &dns, &servers));
Ken Chenb9fa2062018-11-13 21:51:13 +0800535 ASSERT_EQ(1U, mappings.size());
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900536 const DnsResponderClient::Mapping& mapping = mappings[0];
Ken Chenb9fa2062018-11-13 21:51:13 +0800537
Xiao Ma09b71022018-12-11 17:56:32 +0900538 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains, kDefaultParams));
Ken Chenb9fa2062018-11-13 21:51:13 +0800539
540 const hostent* result = gethostbyname(mapping.host.c_str());
Bernie Innocentib102dd22018-12-04 14:57:48 +0900541 const size_t total_queries =
Luke Huangfde82482019-06-04 01:04:53 +0800542 std::accumulate(dns.begin(), dns.end(), 0, [&mapping](size_t total, auto& d) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800543 return total + GetNumQueriesForType(*d, ns_type::ns_t_a, mapping.entry.c_str());
544 });
545
546 EXPECT_LE(1U, total_queries);
547 ASSERT_FALSE(result == nullptr);
548 ASSERT_EQ(4, result->h_length);
549 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
550 EXPECT_EQ(mapping.ip4, ToString(result));
551 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
552
553 std::vector<std::string> res_servers;
554 std::vector<std::string> res_domains;
Mike Yu0a1c53d2018-11-26 13:26:21 +0900555 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +0900556 res_params res_params;
Ken Chenb9fa2062018-11-13 21:51:13 +0800557 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +0800558 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +0800559 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
560 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
561 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chenb9fa2062018-11-13 21:51:13 +0800562 EXPECT_EQ(servers.size(), res_servers.size());
563 EXPECT_EQ(domains.size(), res_domains.size());
Mike Yu0a1c53d2018-11-26 13:26:21 +0900564 EXPECT_EQ(0U, res_tls_servers.size());
Luke Huang5bd827c2019-03-14 16:10:04 +0800565 ASSERT_EQ(static_cast<size_t>(IDnsResolver::RESOLVER_PARAMS_COUNT), kDefaultParams.size());
566 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY],
567 res_params.sample_validity);
568 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900569 res_params.success_threshold);
Luke Huang5bd827c2019-03-14 16:10:04 +0800570 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
571 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
572 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
Ken Chenb9fa2062018-11-13 21:51:13 +0800573 res_params.base_timeout_msec);
574 EXPECT_EQ(servers.size(), res_stats.size());
575
Bernie Innocenti0c067e42019-04-01 15:33:16 +0900576 EXPECT_THAT(res_servers, testing::UnorderedElementsAreArray(servers));
577 EXPECT_THAT(res_domains, testing::UnorderedElementsAreArray(domains));
Ken Chenb9fa2062018-11-13 21:51:13 +0800578}
579
580TEST_F(ResolverTest, GetAddrInfo) {
Xiao Ma09b71022018-12-11 17:56:32 +0900581 constexpr char listen_addr[] = "127.0.0.4";
582 constexpr char listen_addr2[] = "127.0.0.5";
583 constexpr char host_name[] = "howdy.example.com.";
Ken Chenb9fa2062018-11-13 21:51:13 +0800584
Xiao Ma09b71022018-12-11 17:56:32 +0900585 const std::vector<DnsRecord> records = {
586 {host_name, ns_type::ns_t_a, "1.2.3.4"},
587 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
588 };
589 test::DNSResponder dns(listen_addr);
590 test::DNSResponder dns2(listen_addr2);
591 StartDns(dns, records);
592 StartDns(dns2, records);
Ken Chenb9fa2062018-11-13 21:51:13 +0800593
Xiao Ma09b71022018-12-11 17:56:32 +0900594 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}));
Ken Chenb9fa2062018-11-13 21:51:13 +0800595 dns.clearQueries();
596 dns2.clearQueries();
597
598 ScopedAddrinfo result = safe_getaddrinfo("howdy", nullptr, nullptr);
599 EXPECT_TRUE(result != nullptr);
600 size_t found = GetNumQueries(dns, host_name);
601 EXPECT_LE(1U, found);
602 // Could be A or AAAA
603 std::string result_str = ToString(result);
604 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +0800605 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +0800606
607 // Verify that the name is cached.
608 size_t old_found = found;
609 result = safe_getaddrinfo("howdy", nullptr, nullptr);
610 EXPECT_TRUE(result != nullptr);
611 found = GetNumQueries(dns, host_name);
612 EXPECT_LE(1U, found);
613 EXPECT_EQ(old_found, found);
614 result_str = ToString(result);
Luke Huangf8215372019-11-22 11:53:41 +0800615 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4") << result_str;
Ken Chenb9fa2062018-11-13 21:51:13 +0800616
617 // Change the DNS resolver, ensure that queries are still cached.
Xiao Ma09b71022018-12-11 17:56:32 +0900618 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr2}));
Ken Chenb9fa2062018-11-13 21:51:13 +0800619 dns.clearQueries();
620 dns2.clearQueries();
621
622 result = safe_getaddrinfo("howdy", nullptr, nullptr);
623 EXPECT_TRUE(result != nullptr);
624 found = GetNumQueries(dns, host_name);
625 size_t found2 = GetNumQueries(dns2, host_name);
626 EXPECT_EQ(0U, found);
627 EXPECT_LE(0U, found2);
628
629 // Could be A or AAAA
630 result_str = ToString(result);
631 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +0800632 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +0800633}
634
635TEST_F(ResolverTest, GetAddrInfoV4) {
Xiao Ma09b71022018-12-11 17:56:32 +0900636 test::DNSResponder dns;
637 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.5"}});
638 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800639
Xiao Ma09b71022018-12-11 17:56:32 +0900640 const addrinfo hints = {.ai_family = AF_INET};
641 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
Ken Chenb9fa2062018-11-13 21:51:13 +0800642 EXPECT_TRUE(result != nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900643 EXPECT_EQ(1U, GetNumQueries(dns, kHelloExampleCom));
Ken Chenb9fa2062018-11-13 21:51:13 +0800644 EXPECT_EQ("1.2.3.5", ToString(result));
645}
646
647TEST_F(ResolverTest, GetAddrInfo_localhost) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800648 // Add a dummy nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900649 test::DNSResponder dns;
650 StartDns(dns, {});
651 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800652
Xiao Ma09b71022018-12-11 17:56:32 +0900653 ScopedAddrinfo result = safe_getaddrinfo(kLocalHost, nullptr, nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800654 EXPECT_TRUE(result != nullptr);
655 // Expect no DNS queries; localhost is resolved via /etc/hosts
656 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900657 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800658
Xiao Ma09b71022018-12-11 17:56:32 +0900659 result = safe_getaddrinfo(kIp6LocalHost, nullptr, nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800660 EXPECT_TRUE(result != nullptr);
661 // Expect no DNS queries; ip6-localhost is resolved via /etc/hosts
662 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900663 EXPECT_EQ(kIp6LocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800664}
665
Luke Huangd8ac4752019-06-18 17:05:47 +0800666TEST_F(ResolverTest, GetAddrInfo_InvalidSocketType) {
667 test::DNSResponder dns;
668 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.5"}});
669 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
670
671 // TODO: Test other invalid socket types.
672 const addrinfo hints = {
673 .ai_family = AF_UNSPEC,
Luke Huangd8ac4752019-06-18 17:05:47 +0800674 .ai_socktype = SOCK_PACKET,
675 };
676 addrinfo* result = nullptr;
677 // This is a valid hint, but the query won't be sent because the socket type is
678 // not supported.
679 EXPECT_EQ(EAI_NODATA, getaddrinfo("hello", nullptr, &hints, &result));
680 ScopedAddrinfo result_cleanup(result);
681 EXPECT_EQ(nullptr, result);
682}
683
Ken Chen92bed612018-12-22 21:46:55 +0800684// Verify if the resolver correctly handle multiple queries simultaneously
685// step 1: set dns server#1 into deferred responding mode.
686// step 2: thread#1 query "hello.example.com." --> resolver send query to server#1.
687// step 3: thread#2 query "hello.example.com." --> resolver hold the request and wait for
688// response of previous pending query sent by thread#1.
689// step 4: thread#3 query "konbanha.example.com." --> resolver send query to server#3. Server
690// respond to resolver immediately.
691// step 5: check if server#1 get 1 query by thread#1, server#2 get 0 query, server#3 get 1 query.
692// step 6: resume dns server#1 to respond dns query in step#2.
693// step 7: thread#1 and #2 should get returned from DNS query after step#6. Also, check the
694// number of queries in server#2 is 0 to ensure thread#2 does not wake up unexpectedly
695// before signaled by thread#1.
696TEST_F(ResolverTest, GetAddrInfoV4_deferred_resp) {
697 const char* listen_addr1 = "127.0.0.9";
698 const char* listen_addr2 = "127.0.0.10";
699 const char* listen_addr3 = "127.0.0.11";
700 const char* listen_srv = "53";
701 const char* host_name_deferred = "hello.example.com.";
702 const char* host_name_normal = "konbanha.example.com.";
Mike Yufc125e42019-05-15 20:41:28 +0800703 test::DNSResponder dns1(listen_addr1, listen_srv, ns_rcode::ns_r_servfail);
704 test::DNSResponder dns2(listen_addr2, listen_srv, ns_rcode::ns_r_servfail);
705 test::DNSResponder dns3(listen_addr3, listen_srv, ns_rcode::ns_r_servfail);
Ken Chen92bed612018-12-22 21:46:55 +0800706 dns1.addMapping(host_name_deferred, ns_type::ns_t_a, "1.2.3.4");
707 dns2.addMapping(host_name_deferred, ns_type::ns_t_a, "1.2.3.4");
708 dns3.addMapping(host_name_normal, ns_type::ns_t_a, "1.2.3.5");
709 ASSERT_TRUE(dns1.startServer());
710 ASSERT_TRUE(dns2.startServer());
711 ASSERT_TRUE(dns3.startServer());
712 const std::vector<std::string> servers_for_t1 = {listen_addr1};
713 const std::vector<std::string> servers_for_t2 = {listen_addr2};
714 const std::vector<std::string> servers_for_t3 = {listen_addr3};
715 addrinfo hints = {.ai_family = AF_INET};
716 const std::vector<int> params = {300, 25, 8, 8, 5000};
717 bool t3_task_done = false;
718
719 dns1.setDeferredResp(true);
720 std::thread t1([&, this]() {
721 ASSERT_TRUE(
722 mDnsClient.SetResolversForNetwork(servers_for_t1, kDefaultSearchDomains, params));
723 ScopedAddrinfo result = safe_getaddrinfo(host_name_deferred, nullptr, &hints);
724 // t3's dns query should got returned first
725 EXPECT_TRUE(t3_task_done);
726 EXPECT_EQ(1U, GetNumQueries(dns1, host_name_deferred));
727 EXPECT_TRUE(result != nullptr);
728 EXPECT_EQ("1.2.3.4", ToString(result));
729 });
730
731 // ensuring t1 and t2 handler functions are processed in order
732 usleep(100 * 1000);
733 std::thread t2([&, this]() {
734 ASSERT_TRUE(
735 mDnsClient.SetResolversForNetwork(servers_for_t2, kDefaultSearchDomains, params));
736 ScopedAddrinfo result = safe_getaddrinfo(host_name_deferred, nullptr, &hints);
737 EXPECT_TRUE(t3_task_done);
738 EXPECT_EQ(0U, GetNumQueries(dns2, host_name_deferred));
739 EXPECT_TRUE(result != nullptr);
740 EXPECT_EQ("1.2.3.4", ToString(result));
741
742 std::vector<std::string> res_servers;
743 std::vector<std::string> res_domains;
744 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +0900745 res_params res_params;
Ken Chen92bed612018-12-22 21:46:55 +0800746 std::vector<ResolverStats> res_stats;
747 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +0800748 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
749 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains,
750 &res_tls_servers, &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chen92bed612018-12-22 21:46:55 +0800751 EXPECT_EQ(0, wait_for_pending_req_timeout_count);
752 });
753
754 // ensuring t2 and t3 handler functions are processed in order
755 usleep(100 * 1000);
756 std::thread t3([&, this]() {
757 ASSERT_TRUE(
758 mDnsClient.SetResolversForNetwork(servers_for_t3, kDefaultSearchDomains, params));
759 ScopedAddrinfo result = safe_getaddrinfo(host_name_normal, nullptr, &hints);
760 EXPECT_EQ(1U, GetNumQueries(dns1, host_name_deferred));
761 EXPECT_EQ(0U, GetNumQueries(dns2, host_name_deferred));
762 EXPECT_EQ(1U, GetNumQueries(dns3, host_name_normal));
763 EXPECT_TRUE(result != nullptr);
764 EXPECT_EQ("1.2.3.5", ToString(result));
765
766 t3_task_done = true;
767 dns1.setDeferredResp(false);
768 });
769 t3.join();
770 t1.join();
771 t2.join();
772}
773
lifr4e4a2e02019-01-29 16:53:51 +0800774TEST_F(ResolverTest, GetAddrInfo_cnames) {
775 constexpr char host_name[] = "host.example.com.";
776 test::DNSResponder dns;
777 const std::vector<DnsRecord> records = {
778 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
779 {"a.example.com.", ns_type::ns_t_cname, "b.example.com."},
780 {"b.example.com.", ns_type::ns_t_cname, "c.example.com."},
781 {"c.example.com.", ns_type::ns_t_cname, "d.example.com."},
782 {"d.example.com.", ns_type::ns_t_cname, "e.example.com."},
783 {"e.example.com.", ns_type::ns_t_cname, host_name},
784 {host_name, ns_type::ns_t_a, "1.2.3.3"},
785 {host_name, ns_type::ns_t_aaaa, "2001:db8::42"},
786 };
787 StartDns(dns, records);
788 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
789
790 addrinfo hints = {.ai_family = AF_INET};
791 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
792 EXPECT_TRUE(result != nullptr);
793 EXPECT_EQ("1.2.3.3", ToString(result));
794
795 dns.clearQueries();
796 hints = {.ai_family = AF_INET6};
797 result = safe_getaddrinfo("hello", nullptr, &hints);
798 EXPECT_TRUE(result != nullptr);
799 EXPECT_EQ("2001:db8::42", ToString(result));
800}
801
802TEST_F(ResolverTest, GetAddrInfo_cnamesNoIpAddress) {
803 test::DNSResponder dns;
804 const std::vector<DnsRecord> records = {
805 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
806 };
807 StartDns(dns, records);
808 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
809
810 addrinfo hints = {.ai_family = AF_INET};
811 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
812 EXPECT_TRUE(result == nullptr);
813
814 dns.clearQueries();
815 hints = {.ai_family = AF_INET6};
816 result = safe_getaddrinfo("hello", nullptr, &hints);
817 EXPECT_TRUE(result == nullptr);
818}
819
820TEST_F(ResolverTest, GetAddrInfo_cnamesIllegalRdata) {
821 test::DNSResponder dns;
822 const std::vector<DnsRecord> records = {
823 {kHelloExampleCom, ns_type::ns_t_cname, ".!#?"},
824 };
825 StartDns(dns, records);
826 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
827
828 addrinfo hints = {.ai_family = AF_INET};
829 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
830 EXPECT_TRUE(result == nullptr);
831
832 dns.clearQueries();
833 hints = {.ai_family = AF_INET6};
834 result = safe_getaddrinfo("hello", nullptr, &hints);
835 EXPECT_TRUE(result == nullptr);
836}
837
Ken Chenb9fa2062018-11-13 21:51:13 +0800838TEST_F(ResolverTest, MultidomainResolution) {
Xiao Ma09b71022018-12-11 17:56:32 +0900839 constexpr char host_name[] = "nihao.example2.com.";
Luke Huangf8215372019-11-22 11:53:41 +0800840 std::vector<std::string> searchDomains = {"example1.com", "example2.com", "example3.com"};
Ken Chenb9fa2062018-11-13 21:51:13 +0800841
Xiao Ma09b71022018-12-11 17:56:32 +0900842 test::DNSResponder dns("127.0.0.6");
843 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.3"}});
844 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({"127.0.0.6"}, searchDomains));
845
Ken Chenb9fa2062018-11-13 21:51:13 +0800846 const hostent* result = gethostbyname("nihao");
Xiao Ma09b71022018-12-11 17:56:32 +0900847
Ken Chenb9fa2062018-11-13 21:51:13 +0800848 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
849 ASSERT_FALSE(result == nullptr);
850 ASSERT_EQ(4, result->h_length);
851 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
852 EXPECT_EQ("1.2.3.3", ToString(result));
853 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800854}
855
856TEST_F(ResolverTest, GetAddrInfoV6_numeric) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800857 constexpr char host_name[] = "ohayou.example.com.";
858 constexpr char numeric_addr[] = "fe80::1%lo";
859
Xiao Ma09b71022018-12-11 17:56:32 +0900860 test::DNSResponder dns;
Ken Chenb9fa2062018-11-13 21:51:13 +0800861 dns.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900862 StartDns(dns, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
863 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800864
865 addrinfo hints = {.ai_family = AF_INET6};
866 ScopedAddrinfo result = safe_getaddrinfo(numeric_addr, nullptr, &hints);
867 EXPECT_TRUE(result != nullptr);
868 EXPECT_EQ(numeric_addr, ToString(result));
869 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
870
871 // Now try a non-numeric hostname query with the AI_NUMERICHOST flag set.
872 // We should fail without sending out a DNS query.
873 hints.ai_flags |= AI_NUMERICHOST;
874 result = safe_getaddrinfo(host_name, nullptr, &hints);
875 EXPECT_TRUE(result == nullptr);
876 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
877}
878
879TEST_F(ResolverTest, GetAddrInfoV6_failing) {
Xiao Ma09b71022018-12-11 17:56:32 +0900880 constexpr char listen_addr0[] = "127.0.0.7";
881 constexpr char listen_addr1[] = "127.0.0.8";
Ken Chenb9fa2062018-11-13 21:51:13 +0800882 const char* host_name = "ohayou.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +0900883
884 test::DNSResponder dns0(listen_addr0);
885 test::DNSResponder dns1(listen_addr1);
Ken Chenb9fa2062018-11-13 21:51:13 +0800886 dns0.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900887 StartDns(dns0, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
888 StartDns(dns1, {{host_name, ns_type::ns_t_aaaa, "2001:db8::6"}});
889
Luke Huangf8215372019-11-22 11:53:41 +0800890 std::vector<std::string> servers = {listen_addr0, listen_addr1};
Ken Chenb9fa2062018-11-13 21:51:13 +0800891 // <sample validity in s> <success threshold in percent> <min samples> <max samples>
892 int sample_count = 8;
Luke Huangf8215372019-11-22 11:53:41 +0800893 const std::vector<int> params = {300, 25, sample_count, sample_count};
Xiao Ma09b71022018-12-11 17:56:32 +0900894 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, kDefaultSearchDomains, params));
Ken Chenb9fa2062018-11-13 21:51:13 +0800895
896 // Repeatedly perform resolutions for non-existing domains until MAXNSSAMPLES resolutions have
897 // reached the dns0, which is set to fail. No more requests should then arrive at that server
898 // for the next sample_lifetime seconds.
899 // TODO: This approach is implementation-dependent, change once metrics reporting is available.
Xiao Ma09b71022018-12-11 17:56:32 +0900900 const addrinfo hints = {.ai_family = AF_INET6};
Bernie Innocentib102dd22018-12-04 14:57:48 +0900901 for (int i = 0; i < sample_count; ++i) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800902 std::string domain = StringPrintf("nonexistent%d", i);
903 ScopedAddrinfo result = safe_getaddrinfo(domain.c_str(), nullptr, &hints);
904 }
905 // Due to 100% errors for all possible samples, the server should be ignored from now on and
906 // only the second one used for all following queries, until NSSAMPLE_VALIDITY is reached.
907 dns0.clearQueries();
908 dns1.clearQueries();
909 ScopedAddrinfo result = safe_getaddrinfo("ohayou", nullptr, &hints);
910 EXPECT_TRUE(result != nullptr);
911 EXPECT_EQ(0U, GetNumQueries(dns0, host_name));
912 EXPECT_EQ(1U, GetNumQueries(dns1, host_name));
913}
914
915TEST_F(ResolverTest, GetAddrInfoV6_nonresponsive) {
Xiao Ma09b71022018-12-11 17:56:32 +0900916 constexpr char listen_addr0[] = "127.0.0.7";
917 constexpr char listen_addr1[] = "127.0.0.8";
918 constexpr char listen_srv[] = "53";
919 constexpr char host_name1[] = "ohayou.example.com.";
920 constexpr char host_name2[] = "ciao.example.com.";
Luke Huang483cf332019-06-03 17:24:51 +0800921 const std::vector<std::string> defaultSearchDomain = {"example.com"};
922 // The minimal timeout is 1000ms, so we can't decrease timeout
923 // So reduce retry count.
924 const std::vector<int> reduceRetryParams = {
925 300, // sample validity in seconds
926 25, // success threshod in percent
927 8, 8, // {MIN,MAX}_SAMPLES
928 1000, // BASE_TIMEOUT_MSEC
929 1, // retry count
930 };
Xiao Ma09b71022018-12-11 17:56:32 +0900931 const std::vector<DnsRecord> records0 = {
932 {host_name1, ns_type::ns_t_aaaa, "2001:db8::5"},
933 {host_name2, ns_type::ns_t_aaaa, "2001:db8::5"},
934 };
935 const std::vector<DnsRecord> records1 = {
936 {host_name1, ns_type::ns_t_aaaa, "2001:db8::6"},
937 {host_name2, ns_type::ns_t_aaaa, "2001:db8::6"},
938 };
Ken Chenb9fa2062018-11-13 21:51:13 +0800939
940 // dns0 does not respond with 100% probability, while
941 // dns1 responds normally, at least initially.
Mike Yufc125e42019-05-15 20:41:28 +0800942 test::DNSResponder dns0(listen_addr0, listen_srv, static_cast<ns_rcode>(-1));
943 test::DNSResponder dns1(listen_addr1, listen_srv, static_cast<ns_rcode>(-1));
Ken Chenb9fa2062018-11-13 21:51:13 +0800944 dns0.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900945 StartDns(dns0, records0);
946 StartDns(dns1, records1);
Luke Huang483cf332019-06-03 17:24:51 +0800947 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr0, listen_addr1}, defaultSearchDomain,
948 reduceRetryParams));
Ken Chenb9fa2062018-11-13 21:51:13 +0800949
Luke Huang483cf332019-06-03 17:24:51 +0800950 // Specify ai_socktype to make getaddrinfo will only query 1 time
951 const addrinfo hints = {.ai_family = AF_INET6, .ai_socktype = SOCK_STREAM};
Ken Chenb9fa2062018-11-13 21:51:13 +0800952
953 // dns0 will ignore the request, and we'll fallback to dns1 after the first
954 // retry.
955 ScopedAddrinfo result = safe_getaddrinfo(host_name1, nullptr, &hints);
956 EXPECT_TRUE(result != nullptr);
957 EXPECT_EQ(1U, GetNumQueries(dns0, host_name1));
958 EXPECT_EQ(1U, GetNumQueries(dns1, host_name1));
959
960 // Now make dns1 also ignore 100% requests... The resolve should alternate
Luke Huang483cf332019-06-03 17:24:51 +0800961 // queries between the nameservers and fail
Ken Chenb9fa2062018-11-13 21:51:13 +0800962 dns1.setResponseProbability(0.0);
963 addrinfo* result2 = nullptr;
964 EXPECT_EQ(EAI_NODATA, getaddrinfo(host_name2, nullptr, &hints, &result2));
965 EXPECT_EQ(nullptr, result2);
Luke Huang483cf332019-06-03 17:24:51 +0800966 EXPECT_EQ(1U, GetNumQueries(dns0, host_name2));
967 EXPECT_EQ(1U, GetNumQueries(dns1, host_name2));
Ken Chenb9fa2062018-11-13 21:51:13 +0800968}
969
970TEST_F(ResolverTest, GetAddrInfoV6_concurrent) {
Xiao Ma09b71022018-12-11 17:56:32 +0900971 constexpr char listen_addr0[] = "127.0.0.9";
972 constexpr char listen_addr1[] = "127.0.0.10";
973 constexpr char listen_addr2[] = "127.0.0.11";
974 constexpr char host_name[] = "konbanha.example.com.";
975
976 test::DNSResponder dns0(listen_addr0);
977 test::DNSResponder dns1(listen_addr1);
978 test::DNSResponder dns2(listen_addr2);
979 StartDns(dns0, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
980 StartDns(dns1, {{host_name, ns_type::ns_t_aaaa, "2001:db8::6"}});
981 StartDns(dns2, {{host_name, ns_type::ns_t_aaaa, "2001:db8::7"}});
982
Luke Huangf8215372019-11-22 11:53:41 +0800983 const std::vector<std::string> servers = {listen_addr0, listen_addr1, listen_addr2};
Ken Chenb9fa2062018-11-13 21:51:13 +0800984 std::vector<std::thread> threads(10);
985 for (std::thread& thread : threads) {
Luke Huangf8215372019-11-22 11:53:41 +0800986 thread = std::thread([this, &servers]() {
987 unsigned delay = arc4random_uniform(1 * 1000 * 1000); // <= 1s
Ken Chenb9fa2062018-11-13 21:51:13 +0800988 usleep(delay);
989 std::vector<std::string> serverSubset;
990 for (const auto& server : servers) {
991 if (arc4random_uniform(2)) {
992 serverSubset.push_back(server);
993 }
994 }
995 if (serverSubset.empty()) serverSubset = servers;
Xiao Ma09b71022018-12-11 17:56:32 +0900996 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(serverSubset));
997 const addrinfo hints = {.ai_family = AF_INET6};
Ken Chenb9fa2062018-11-13 21:51:13 +0800998 addrinfo* result = nullptr;
999 int rv = getaddrinfo("konbanha", nullptr, &hints, &result);
1000 EXPECT_EQ(0, rv) << "error [" << rv << "] " << gai_strerror(rv);
1001 if (result) {
1002 freeaddrinfo(result);
1003 result = nullptr;
1004 }
1005 });
1006 }
1007 for (std::thread& thread : threads) {
1008 thread.join();
1009 }
Ken Chen92bed612018-12-22 21:46:55 +08001010
1011 std::vector<std::string> res_servers;
1012 std::vector<std::string> res_domains;
1013 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001014 res_params res_params;
Ken Chen92bed612018-12-22 21:46:55 +08001015 std::vector<ResolverStats> res_stats;
1016 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001017 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1018 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1019 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chen92bed612018-12-22 21:46:55 +08001020 EXPECT_EQ(0, wait_for_pending_req_timeout_count);
Ken Chenb9fa2062018-11-13 21:51:13 +08001021}
1022
Mike Yu8ac63402019-12-02 15:28:38 +08001023TEST_F(ResolverTest, SkipBadServersDueToInternalError) {
1024 constexpr char listen_addr1[] = "fe80::1";
1025 constexpr char listen_addr2[] = "255.255.255.255";
1026 constexpr char listen_addr3[] = "127.0.0.3";
1027
1028 test::DNSResponder dns(listen_addr3);
1029 ASSERT_TRUE(dns.startServer());
1030
1031 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
1032 parcel.servers = {listen_addr1, listen_addr2, listen_addr3};
1033
1034 // Bad servers can be distinguished after two attempts.
1035 parcel.minSamples = 2;
1036 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1037
1038 // Start querying five times.
1039 for (int i = 0; i < 5; i++) {
1040 std::string hostName = StringPrintf("hello%d.com.", i);
1041 dns.addMapping(hostName, ns_type::ns_t_a, "1.2.3.4");
1042 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1043 EXPECT_TRUE(safe_getaddrinfo(hostName.c_str(), nullptr, &hints) != nullptr);
1044 }
1045
Mike Yuc0000252020-03-19 07:14:23 +00001046 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1047 NameserverStats(listen_addr1).setInternalErrors(2),
1048 NameserverStats(listen_addr2).setInternalErrors(2),
1049 NameserverStats(listen_addr3).setSuccesses(5),
1050 };
1051 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
Mike Yu8ac63402019-12-02 15:28:38 +08001052}
1053
1054TEST_F(ResolverTest, SkipBadServersDueToTimeout) {
1055 constexpr char listen_addr1[] = "127.0.0.3";
1056 constexpr char listen_addr2[] = "127.0.0.4";
1057
1058 // Set dns1 non-responsive and dns2 workable.
1059 test::DNSResponder dns1(listen_addr1, test::kDefaultListenService, static_cast<ns_rcode>(-1));
1060 test::DNSResponder dns2(listen_addr2);
1061 dns1.setResponseProbability(0.0);
1062 ASSERT_TRUE(dns1.startServer());
1063 ASSERT_TRUE(dns2.startServer());
1064
1065 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
1066 parcel.servers = {listen_addr1, listen_addr2};
1067
1068 // Bad servers can be distinguished after two attempts.
1069 parcel.minSamples = 2;
1070 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1071
1072 // Start querying five times.
1073 for (int i = 0; i < 5; i++) {
1074 std::string hostName = StringPrintf("hello%d.com.", i);
1075 dns1.addMapping(hostName, ns_type::ns_t_a, "1.2.3.4");
1076 dns2.addMapping(hostName, ns_type::ns_t_a, "1.2.3.5");
1077 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1078 EXPECT_TRUE(safe_getaddrinfo(hostName.c_str(), nullptr, &hints) != nullptr);
1079 }
1080
Mike Yuc0000252020-03-19 07:14:23 +00001081 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1082 NameserverStats(listen_addr1).setTimeouts(2),
1083 NameserverStats(listen_addr2).setSuccesses(5),
1084 };
1085 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
Mike Yu8ac63402019-12-02 15:28:38 +08001086 EXPECT_EQ(dns1.queries().size(), 2U);
1087 EXPECT_EQ(dns2.queries().size(), 5U);
1088}
1089
chenbrucefd837fa2019-10-29 18:35:36 +08001090TEST_F(ResolverTest, GetAddrInfoFromCustTable_InvalidInput) {
1091 constexpr char hostnameNoip[] = "noip.example.com.";
1092 constexpr char hostnameInvalidip[] = "invalidip.example.com.";
1093 const std::vector<aidl::android::net::ResolverHostsParcel> invalidCustHosts = {
1094 {"", hostnameNoip},
1095 {"wrong IP", hostnameInvalidip},
1096 };
1097 test::DNSResponder dns;
1098 StartDns(dns, {});
1099 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
Ken Chen05420812020-04-07 18:58:38 +00001100 resolverParams.resolverOptions.hosts = invalidCustHosts;
chenbrucefd837fa2019-10-29 18:35:36 +08001101 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1102 for (const auto& hostname : {hostnameNoip, hostnameInvalidip}) {
1103 // The query won't get data from customized table because of invalid customized table
1104 // and DNSResponder also has no records. hostnameNoip has never registered and
1105 // hostnameInvalidip has registered but wrong IP.
1106 const addrinfo hints = {.ai_family = AF_UNSPEC};
1107 ScopedAddrinfo result = safe_getaddrinfo(hostname, nullptr, &hints);
1108 ASSERT_TRUE(result == nullptr);
1109 EXPECT_EQ(4U, GetNumQueries(dns, hostname));
1110 }
1111}
1112
1113TEST_F(ResolverTest, GetAddrInfoFromCustTable) {
1114 constexpr char hostnameV4[] = "v4only.example.com.";
1115 constexpr char hostnameV6[] = "v6only.example.com.";
1116 constexpr char hostnameV4V6[] = "v4v6.example.com.";
1117 constexpr char custAddrV4[] = "1.2.3.4";
1118 constexpr char custAddrV6[] = "::1.2.3.4";
1119 constexpr char dnsSvAddrV4[] = "1.2.3.5";
1120 constexpr char dnsSvAddrV6[] = "::1.2.3.5";
1121 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4 = {
1122 {custAddrV4, hostnameV4},
1123 };
1124 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV6 = {
1125 {custAddrV6, hostnameV6},
1126 };
1127 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4V6 = {
1128 {custAddrV4, hostnameV4V6},
1129 {custAddrV6, hostnameV4V6},
1130 };
1131 const std::vector<DnsRecord> dnsSvHostV4 = {
1132 {hostnameV4, ns_type::ns_t_a, dnsSvAddrV4},
1133 };
1134 const std::vector<DnsRecord> dnsSvHostV6 = {
1135 {hostnameV6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1136 };
1137 const std::vector<DnsRecord> dnsSvHostV4V6 = {
1138 {hostnameV4V6, ns_type::ns_t_a, dnsSvAddrV4},
1139 {hostnameV4V6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1140 };
1141 struct TestConfig {
1142 const std::string name;
1143 const std::vector<aidl::android::net::ResolverHostsParcel> customizedHosts;
1144 const std::vector<DnsRecord> dnsserverHosts;
1145 const std::vector<std::string> queryResult;
1146 std::string asParameters() const {
1147 return StringPrintf("name: %s, customizedHosts: %s, dnsserverHosts: %s", name.c_str(),
1148 customizedHosts.empty() ? "No" : "Yes",
1149 dnsserverHosts.empty() ? "No" : "Yes");
1150 }
1151 } testConfigs[]{
1152 // clang-format off
1153 {hostnameV4, {}, {}, {}},
1154 {hostnameV4, {}, dnsSvHostV4, {dnsSvAddrV4}},
1155 {hostnameV4, custHostV4, {}, {custAddrV4}},
1156 {hostnameV4, custHostV4, dnsSvHostV4, {custAddrV4}},
1157 {hostnameV6, {}, {}, {}},
1158 {hostnameV6, {}, dnsSvHostV6, {dnsSvAddrV6}},
1159 {hostnameV6, custHostV6, {}, {custAddrV6}},
1160 {hostnameV6, custHostV6, dnsSvHostV6, {custAddrV6}},
1161 {hostnameV4V6, {}, {}, {}},
1162 {hostnameV4V6, {}, dnsSvHostV4V6, {dnsSvAddrV4, dnsSvAddrV6}},
1163 {hostnameV4V6, custHostV4V6, {}, {custAddrV4, custAddrV6}},
1164 {hostnameV4V6, custHostV4V6, dnsSvHostV4V6, {custAddrV4, custAddrV6}},
1165 // clang-format on
1166 };
1167
1168 for (const auto& config : testConfigs) {
1169 SCOPED_TRACE(config.asParameters());
1170
1171 test::DNSResponder dns;
1172 StartDns(dns, config.dnsserverHosts);
1173
1174 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
Ken Chen05420812020-04-07 18:58:38 +00001175 resolverParams.resolverOptions.hosts = config.customizedHosts;
chenbrucefd837fa2019-10-29 18:35:36 +08001176 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1177 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM};
1178 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
1179 if (config.customizedHosts.empty() && config.dnsserverHosts.empty()) {
1180 ASSERT_TRUE(result == nullptr);
1181 EXPECT_EQ(2U, GetNumQueries(dns, config.name.c_str()));
1182 } else {
1183 ASSERT_TRUE(result != nullptr);
1184 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(config.queryResult));
1185 EXPECT_EQ(config.customizedHosts.empty() ? 2U : 0U,
1186 GetNumQueries(dns, config.name.c_str()));
1187 }
1188
1189 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
1190 }
1191}
1192
1193TEST_F(ResolverTest, GetAddrInfoFromCustTable_Modify) {
1194 constexpr char hostnameV4V6[] = "v4v6.example.com.";
1195 constexpr char custAddrV4[] = "1.2.3.4";
1196 constexpr char custAddrV6[] = "::1.2.3.4";
1197 constexpr char dnsSvAddrV4[] = "1.2.3.5";
1198 constexpr char dnsSvAddrV6[] = "::1.2.3.5";
1199 const std::vector<DnsRecord> dnsSvHostV4V6 = {
1200 {hostnameV4V6, ns_type::ns_t_a, dnsSvAddrV4},
1201 {hostnameV4V6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1202 };
1203 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4V6 = {
1204 {custAddrV4, hostnameV4V6},
1205 {custAddrV6, hostnameV4V6},
1206 };
1207 test::DNSResponder dns;
1208 StartDns(dns, dnsSvHostV4V6);
1209 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1210
Ken Chen05420812020-04-07 18:58:38 +00001211 resolverParams.resolverOptions.hosts = custHostV4V6;
chenbrucefd837fa2019-10-29 18:35:36 +08001212 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1213 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM};
1214 ScopedAddrinfo result = safe_getaddrinfo(hostnameV4V6, nullptr, &hints);
1215 ASSERT_TRUE(result != nullptr);
1216 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray({custAddrV4, custAddrV6}));
1217 EXPECT_EQ(0U, GetNumQueries(dns, hostnameV4V6));
1218
Ken Chen05420812020-04-07 18:58:38 +00001219 resolverParams.resolverOptions.hosts = {};
chenbrucefd837fa2019-10-29 18:35:36 +08001220 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1221 result = safe_getaddrinfo(hostnameV4V6, nullptr, &hints);
1222 ASSERT_TRUE(result != nullptr);
1223 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray({dnsSvAddrV4, dnsSvAddrV6}));
1224 EXPECT_EQ(2U, GetNumQueries(dns, hostnameV4V6));
1225}
1226
Ken Chenb9fa2062018-11-13 21:51:13 +08001227TEST_F(ResolverTest, EmptySetup) {
Ken Chenb9fa2062018-11-13 21:51:13 +08001228 std::vector<std::string> servers;
1229 std::vector<std::string> domains;
Xiao Ma09b71022018-12-11 17:56:32 +09001230 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001231 std::vector<std::string> res_servers;
1232 std::vector<std::string> res_domains;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001233 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001234 res_params res_params;
Ken Chenb9fa2062018-11-13 21:51:13 +08001235 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +08001236 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001237 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1238 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1239 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chenb9fa2062018-11-13 21:51:13 +08001240 EXPECT_EQ(0U, res_servers.size());
1241 EXPECT_EQ(0U, res_domains.size());
Mike Yu0a1c53d2018-11-26 13:26:21 +09001242 EXPECT_EQ(0U, res_tls_servers.size());
Luke Huang5bd827c2019-03-14 16:10:04 +08001243 ASSERT_EQ(static_cast<size_t>(IDnsResolver::RESOLVER_PARAMS_COUNT), kDefaultParams.size());
1244 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY],
1245 res_params.sample_validity);
1246 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001247 res_params.success_threshold);
Luke Huang5bd827c2019-03-14 16:10:04 +08001248 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
1249 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
1250 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
Ken Chenb9fa2062018-11-13 21:51:13 +08001251 res_params.base_timeout_msec);
Luke Huang5bd827c2019-03-14 16:10:04 +08001252 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_RETRY_COUNT], res_params.retry_count);
Ken Chenb9fa2062018-11-13 21:51:13 +08001253}
1254
1255TEST_F(ResolverTest, SearchPathChange) {
Xiao Ma09b71022018-12-11 17:56:32 +09001256 constexpr char listen_addr[] = "127.0.0.13";
1257 constexpr char host_name1[] = "test13.domain1.org.";
1258 constexpr char host_name2[] = "test13.domain2.org.";
Luke Huangf8215372019-11-22 11:53:41 +08001259 std::vector<std::string> servers = {listen_addr};
1260 std::vector<std::string> domains = {"domain1.org"};
Xiao Ma09b71022018-12-11 17:56:32 +09001261
1262 const std::vector<DnsRecord> records = {
1263 {host_name1, ns_type::ns_t_aaaa, "2001:db8::13"},
1264 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1:13"},
1265 };
1266 test::DNSResponder dns(listen_addr);
1267 StartDns(dns, records);
1268 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001269
1270 const addrinfo hints = {.ai_family = AF_INET6};
1271 ScopedAddrinfo result = safe_getaddrinfo("test13", nullptr, &hints);
1272 EXPECT_TRUE(result != nullptr);
1273 EXPECT_EQ(1U, dns.queries().size());
1274 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
1275 EXPECT_EQ("2001:db8::13", ToString(result));
1276
1277 // Test that changing the domain search path on its own works.
Luke Huangf8215372019-11-22 11:53:41 +08001278 domains = {"domain2.org"};
Xiao Ma09b71022018-12-11 17:56:32 +09001279 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001280 dns.clearQueries();
1281
1282 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_name2));
1286 EXPECT_EQ("2001:db8::1:13", ToString(result));
1287}
1288
Luke Huang2dac4382019-06-24 13:28:44 +08001289namespace {
1290
Luke Huangf8215372019-11-22 11:53:41 +08001291std::vector<std::string> getResolverDomains(aidl::android::net::IDnsResolver* dnsResolverService,
Luke Huang2dac4382019-06-24 13:28:44 +08001292 unsigned netId) {
1293 std::vector<std::string> res_servers;
1294 std::vector<std::string> res_domains;
1295 std::vector<std::string> res_tls_servers;
1296 res_params res_params;
1297 std::vector<ResolverStats> res_stats;
1298 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001299 DnsResponderClient::GetResolverInfo(dnsResolverService, netId, &res_servers, &res_domains,
1300 &res_tls_servers, &res_params, &res_stats,
1301 &wait_for_pending_req_timeout_count);
Luke Huang2dac4382019-06-24 13:28:44 +08001302 return res_domains;
1303}
1304
1305} // namespace
1306
1307TEST_F(ResolverTest, SearchPathPrune) {
1308 constexpr size_t DUPLICATED_DOMAIN_NUM = 3;
1309 constexpr char listen_addr[] = "127.0.0.13";
1310 constexpr char domian_name1[] = "domain13.org.";
1311 constexpr char domian_name2[] = "domain14.org.";
1312 constexpr char host_name1[] = "test13.domain13.org.";
1313 constexpr char host_name2[] = "test14.domain14.org.";
1314 std::vector<std::string> servers = {listen_addr};
1315
1316 std::vector<std::string> testDomains1;
1317 std::vector<std::string> testDomains2;
1318 // Domain length should be <= 255
1319 // Max number of domains in search path is 6
1320 for (size_t i = 0; i < MAXDNSRCH + 1; i++) {
1321 // Fill up with invalid domain
1322 testDomains1.push_back(std::string(300, i + '0'));
1323 // Fill up with valid but duplicated domain
1324 testDomains2.push_back(StringPrintf("domain%zu.org", i % DUPLICATED_DOMAIN_NUM));
1325 }
1326
1327 // Add valid domain used for query.
1328 testDomains1.push_back(domian_name1);
1329
1330 // Add valid domain twice used for query.
1331 testDomains2.push_back(domian_name2);
1332 testDomains2.push_back(domian_name2);
1333
1334 const std::vector<DnsRecord> records = {
1335 {host_name1, ns_type::ns_t_aaaa, "2001:db8::13"},
1336 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1:13"},
1337 };
1338 test::DNSResponder dns(listen_addr);
1339 StartDns(dns, records);
1340 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, testDomains1));
1341
1342 const addrinfo hints = {.ai_family = AF_INET6};
1343 ScopedAddrinfo result = safe_getaddrinfo("test13", nullptr, &hints);
1344
1345 EXPECT_TRUE(result != nullptr);
1346
1347 EXPECT_EQ(1U, dns.queries().size());
1348 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
1349 EXPECT_EQ("2001:db8::13", ToString(result));
1350
1351 const auto& res_domains1 = getResolverDomains(mDnsClient.resolvService(), TEST_NETID);
1352 // Expect 1 valid domain, invalid domains are removed.
1353 ASSERT_EQ(1U, res_domains1.size());
1354 EXPECT_EQ(domian_name1, res_domains1[0]);
1355
1356 dns.clearQueries();
1357
1358 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, testDomains2));
1359
1360 result = safe_getaddrinfo("test14", nullptr, &hints);
1361 EXPECT_TRUE(result != nullptr);
1362
1363 // (3 domains * 2 retries) + 1 success query = 7
1364 EXPECT_EQ(7U, dns.queries().size());
1365 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
1366 EXPECT_EQ("2001:db8::1:13", ToString(result));
1367
1368 const auto& res_domains2 = getResolverDomains(mDnsClient.resolvService(), TEST_NETID);
1369 // Expect 4 valid domain, duplicate domains are removed.
1370 EXPECT_EQ(DUPLICATED_DOMAIN_NUM + 1U, res_domains2.size());
1371 EXPECT_THAT(
1372 std::vector<std::string>({"domain0.org", "domain1.org", "domain2.org", domian_name2}),
1373 testing::ElementsAreArray(res_domains2));
1374}
1375
Mike Yu0a1c53d2018-11-26 13:26:21 +09001376// If we move this function to dns_responder_client, it will complicate the dependency need of
1377// dns_tls_frontend.h.
1378static void setupTlsServers(const std::vector<std::string>& servers,
waynema0e73c2e2019-07-31 15:04:08 +08001379 std::vector<std::unique_ptr<test::DnsTlsFrontend>>* tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001380 constexpr char listen_udp[] = "53";
1381 constexpr char listen_tls[] = "853";
Mike Yu0a1c53d2018-11-26 13:26:21 +09001382
1383 for (const auto& server : servers) {
1384 auto t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
1385 t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
1386 t->startServer();
Mike Yu0a1c53d2018-11-26 13:26:21 +09001387 tls->push_back(std::move(t));
1388 }
1389}
1390
Mike Yu0a1c53d2018-11-26 13:26:21 +09001391TEST_F(ResolverTest, MaxServerPrune_Binder) {
Mike Yu0a1c53d2018-11-26 13:26:21 +09001392 std::vector<std::string> domains;
1393 std::vector<std::unique_ptr<test::DNSResponder>> dns;
1394 std::vector<std::unique_ptr<test::DnsTlsFrontend>> tls;
1395 std::vector<std::string> servers;
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001396 std::vector<DnsResponderClient::Mapping> mappings;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001397
1398 for (unsigned i = 0; i < MAXDNSRCH + 1; i++) {
1399 domains.push_back(StringPrintf("example%u.com", i));
1400 }
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001401 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupMappings(1, domains, &mappings));
1402 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupDNSServers(MAXNS + 1, mappings, &dns, &servers));
waynema0e73c2e2019-07-31 15:04:08 +08001403 ASSERT_NO_FATAL_FAILURE(setupTlsServers(servers, &tls));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001404
waynema0e73c2e2019-07-31 15:04:08 +08001405 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, domains, kDefaultParams,
1406 kDefaultPrivateDnsHostName));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001407
Mike Yu383855b2019-01-15 17:53:27 +08001408 // If the private DNS validation hasn't completed yet before backend DNS servers stop,
1409 // TLS servers will get stuck in handleOneRequest(), which causes this test stuck in
1410 // ~DnsTlsFrontend() because the TLS server loop threads can't be terminated.
1411 // So, wait for private DNS validation done before stopping backend DNS servers.
1412 for (int i = 0; i < MAXNS; i++) {
chenbruceaff85842019-05-31 15:46:42 +08001413 LOG(INFO) << "Waiting for private DNS validation on " << tls[i]->listen_address() << ".";
Mike Yu724f77d2019-08-16 11:14:50 +08001414 EXPECT_TRUE(WaitForPrivateDnsValidation(tls[i]->listen_address(), true));
chenbruceaff85842019-05-31 15:46:42 +08001415 LOG(INFO) << "private DNS validation on " << tls[i]->listen_address() << " done.";
Mike Yu383855b2019-01-15 17:53:27 +08001416 }
1417
Mike Yu0a1c53d2018-11-26 13:26:21 +09001418 std::vector<std::string> res_servers;
1419 std::vector<std::string> res_domains;
1420 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001421 res_params res_params;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001422 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +08001423 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001424 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1425 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1426 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001427
1428 // Check the size of the stats and its contents.
1429 EXPECT_EQ(static_cast<size_t>(MAXNS), res_servers.size());
1430 EXPECT_EQ(static_cast<size_t>(MAXNS), res_tls_servers.size());
1431 EXPECT_EQ(static_cast<size_t>(MAXDNSRCH), res_domains.size());
1432 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_servers.begin()));
1433 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_tls_servers.begin()));
1434 EXPECT_TRUE(std::equal(domains.begin(), domains.begin() + MAXDNSRCH, res_domains.begin()));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001435}
1436
1437TEST_F(ResolverTest, ResolverStats) {
Xiao Ma09b71022018-12-11 17:56:32 +09001438 constexpr char listen_addr1[] = "127.0.0.4";
1439 constexpr char listen_addr2[] = "127.0.0.5";
1440 constexpr char listen_addr3[] = "127.0.0.6";
Mike Yu0a1c53d2018-11-26 13:26:21 +09001441
1442 // Set server 1 timeout.
Mike Yufc125e42019-05-15 20:41:28 +08001443 test::DNSResponder dns1(listen_addr1, "53", static_cast<ns_rcode>(-1));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001444 dns1.setResponseProbability(0.0);
1445 ASSERT_TRUE(dns1.startServer());
1446
1447 // Set server 2 responding server failure.
Xiao Ma09b71022018-12-11 17:56:32 +09001448 test::DNSResponder dns2(listen_addr2);
Mike Yu0a1c53d2018-11-26 13:26:21 +09001449 dns2.setResponseProbability(0.0);
1450 ASSERT_TRUE(dns2.startServer());
1451
1452 // Set server 3 workable.
Xiao Ma09b71022018-12-11 17:56:32 +09001453 test::DNSResponder dns3(listen_addr3);
1454 dns3.addMapping(kHelloExampleCom, ns_type::ns_t_a, "1.2.3.4");
Mike Yu0a1c53d2018-11-26 13:26:21 +09001455 ASSERT_TRUE(dns3.startServer());
1456
1457 std::vector<std::string> servers = {listen_addr1, listen_addr2, listen_addr3};
Xiao Ma09b71022018-12-11 17:56:32 +09001458 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001459
1460 dns3.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +09001461 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
Mike Yu0a1c53d2018-11-26 13:26:21 +09001462 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
Xiao Ma09b71022018-12-11 17:56:32 +09001463 size_t found = GetNumQueries(dns3, kHelloExampleCom);
Mike Yu0a1c53d2018-11-26 13:26:21 +09001464 EXPECT_LE(1U, found);
1465 std::string result_str = ToString(result);
1466 EXPECT_TRUE(result_str == "1.2.3.4") << ", result_str='" << result_str << "'";
1467
Mike Yuc0000252020-03-19 07:14:23 +00001468 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1469 NameserverStats(listen_addr1).setTimeouts(1),
1470 NameserverStats(listen_addr2).setErrors(1),
1471 NameserverStats(listen_addr3).setSuccesses(1),
1472 };
1473 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001474}
1475
Mike Yu15791832020-02-11 13:38:48 +08001476TEST_F(ResolverTest, AlwaysUseLatestSetupParamsInLookups) {
1477 constexpr char listen_addr1[] = "127.0.0.3";
1478 constexpr char listen_addr2[] = "255.255.255.255";
1479 constexpr char listen_addr3[] = "127.0.0.4";
1480 constexpr char hostname[] = "hello";
1481 constexpr char fqdn_with_search_domain[] = "hello.domain2.com.";
1482
1483 test::DNSResponder dns1(listen_addr1, test::kDefaultListenService, static_cast<ns_rcode>(-1));
1484 dns1.setResponseProbability(0.0);
1485 ASSERT_TRUE(dns1.startServer());
1486
1487 test::DNSResponder dns3(listen_addr3);
1488 StartDns(dns3, {{fqdn_with_search_domain, ns_type::ns_t_a, "1.2.3.4"}});
1489
1490 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
1491 parcel.tlsServers.clear();
1492 parcel.servers = {listen_addr1, listen_addr2};
1493 parcel.domains = {"domain1.com", "domain2.com"};
1494 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1495
1496 // Expect the things happening in t1:
1497 // 1. The lookup starts using the first domain for query. It sends queries to the populated
1498 // nameserver list {listen_addr1, listen_addr2} for the hostname "hello.domain1.com".
1499 // 2. A different list of nameservers is updated to the resolver. Revision ID is incremented.
1500 // 3. The query for the hostname times out. The lookup fails to add the timeout record to the
1501 // the stats because of the unmatched revision ID.
1502 // 4. The lookup starts using the second domain for query. It sends queries to the populated
1503 // nameserver list {listen_addr3, listen_addr1, listen_addr2} for another hostname
1504 // "hello.domain2.com".
1505 // 5. The lookup gets the answer and updates a success record to the stats.
1506 std::thread t1([&hostname]() {
1507 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1508 ScopedAddrinfo result = safe_getaddrinfo(hostname, nullptr, &hints);
1509 EXPECT_NE(result.get(), nullptr);
1510 EXPECT_EQ(ToString(result), "1.2.3.4");
1511 });
1512
1513 // Wait for t1 to start the step 1.
1514 while (dns1.queries().size() == 0) {
1515 usleep(1000);
1516 }
1517
1518 // Update the resolver with three nameservers. This will increment the revision ID.
1519 parcel.servers = {listen_addr3, listen_addr1, listen_addr2};
1520 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1521
1522 t1.join();
1523 EXPECT_EQ(0U, GetNumQueriesForType(dns3, ns_type::ns_t_aaaa, fqdn_with_search_domain));
1524 EXPECT_EQ(1U, GetNumQueriesForType(dns3, ns_type::ns_t_a, fqdn_with_search_domain));
1525
Mike Yuc0000252020-03-19 07:14:23 +00001526 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1527 NameserverStats(listen_addr1),
1528 NameserverStats(listen_addr2),
1529 NameserverStats(listen_addr3).setSuccesses(1),
1530 };
1531 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
Mike Yu15791832020-02-11 13:38:48 +08001532}
1533
Ken Chenb9fa2062018-11-13 21:51:13 +08001534// Test what happens if the specified TLS server is nonexistent.
1535TEST_F(ResolverTest, GetHostByName_TlsMissing) {
Xiao Ma09b71022018-12-11 17:56:32 +09001536 constexpr char listen_addr[] = "127.0.0.3";
1537 constexpr char host_name[] = "tlsmissing.example.com.";
1538
1539 test::DNSResponder dns;
1540 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.3"}});
Luke Huangf8215372019-11-22 11:53:41 +08001541 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001542
1543 // There's nothing listening on this address, so validation will either fail or
1544 /// hang. Either way, queries will continue to flow to the DNSResponder.
waynema0e73c2e2019-07-31 15:04:08 +08001545 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Ken Chenb9fa2062018-11-13 21:51:13 +08001546
1547 const hostent* result;
1548
1549 result = gethostbyname("tlsmissing");
1550 ASSERT_FALSE(result == nullptr);
1551 EXPECT_EQ("1.2.3.3", ToString(result));
1552
1553 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001554 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001555}
1556
1557// Test what happens if the specified TLS server replies with garbage.
1558TEST_F(ResolverTest, GetHostByName_TlsBroken) {
Xiao Ma09b71022018-12-11 17:56:32 +09001559 constexpr char listen_addr[] = "127.0.0.3";
1560 constexpr char host_name1[] = "tlsbroken1.example.com.";
1561 constexpr char host_name2[] = "tlsbroken2.example.com.";
1562 const std::vector<DnsRecord> records = {
1563 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1564 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1565 };
1566
1567 test::DNSResponder dns;
1568 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001569 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001570
1571 // Bind the specified private DNS socket but don't respond to any client sockets yet.
1572 int s = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, IPPROTO_TCP);
1573 ASSERT_TRUE(s >= 0);
1574 struct sockaddr_in tlsServer = {
Luke Huangf8215372019-11-22 11:53:41 +08001575 .sin_family = AF_INET,
1576 .sin_port = htons(853),
Ken Chenb9fa2062018-11-13 21:51:13 +08001577 };
1578 ASSERT_TRUE(inet_pton(AF_INET, listen_addr, &tlsServer.sin_addr));
1579 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEPORT).ok());
1580 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEADDR).ok());
1581 ASSERT_FALSE(bind(s, reinterpret_cast<struct sockaddr*>(&tlsServer), sizeof(tlsServer)));
1582 ASSERT_FALSE(listen(s, 1));
1583
1584 // Trigger TLS validation.
waynema0e73c2e2019-07-31 15:04:08 +08001585 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Ken Chenb9fa2062018-11-13 21:51:13 +08001586
1587 struct sockaddr_storage cliaddr;
1588 socklen_t sin_size = sizeof(cliaddr);
Luke Huangf8215372019-11-22 11:53:41 +08001589 int new_fd = accept4(s, reinterpret_cast<struct sockaddr*>(&cliaddr), &sin_size, SOCK_CLOEXEC);
Ken Chenb9fa2062018-11-13 21:51:13 +08001590 ASSERT_TRUE(new_fd > 0);
1591
1592 // We've received the new file descriptor but not written to it or closed, so the
1593 // validation is still pending. Queries should still flow correctly because the
1594 // server is not used until validation succeeds.
1595 const hostent* result;
1596 result = gethostbyname("tlsbroken1");
1597 ASSERT_FALSE(result == nullptr);
1598 EXPECT_EQ("1.2.3.1", ToString(result));
1599
1600 // Now we cause the validation to fail.
1601 std::string garbage = "definitely not a valid TLS ServerHello";
1602 write(new_fd, garbage.data(), garbage.size());
1603 close(new_fd);
1604
1605 // Validation failure shouldn't interfere with lookups, because lookups won't be sent
1606 // to the TLS server unless validation succeeds.
1607 result = gethostbyname("tlsbroken2");
1608 ASSERT_FALSE(result == nullptr);
1609 EXPECT_EQ("1.2.3.2", ToString(result));
1610
1611 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001612 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001613 close(s);
1614}
1615
1616TEST_F(ResolverTest, GetHostByName_Tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001617 constexpr char listen_addr[] = "127.0.0.3";
1618 constexpr char listen_udp[] = "53";
1619 constexpr char listen_tls[] = "853";
1620 constexpr char host_name1[] = "tls1.example.com.";
1621 constexpr char host_name2[] = "tls2.example.com.";
1622 constexpr char host_name3[] = "tls3.example.com.";
1623 const std::vector<DnsRecord> records = {
1624 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1625 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1626 {host_name3, ns_type::ns_t_a, "1.2.3.3"},
1627 };
1628
1629 test::DNSResponder dns;
1630 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001631 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001632
1633 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1634 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001635 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08001636 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001637
Mike Yu724f77d2019-08-16 11:14:50 +08001638 const hostent* result = gethostbyname("tls1");
Ken Chenb9fa2062018-11-13 21:51:13 +08001639 ASSERT_FALSE(result == nullptr);
1640 EXPECT_EQ("1.2.3.1", ToString(result));
1641
1642 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001643 EXPECT_TRUE(tls.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001644
1645 // Stop the TLS server. Since we're in opportunistic mode, queries will
1646 // fall back to the locally-assigned (clear text) nameservers.
1647 tls.stopServer();
1648
1649 dns.clearQueries();
1650 result = gethostbyname("tls2");
1651 EXPECT_FALSE(result == nullptr);
1652 EXPECT_EQ("1.2.3.2", ToString(result));
1653 const auto queries = dns.queries();
1654 EXPECT_EQ(1U, queries.size());
waynema29253052019-08-20 11:26:08 +08001655 EXPECT_EQ("tls2.example.com.", queries[0].name);
1656 EXPECT_EQ(ns_t_a, queries[0].type);
Ken Chenb9fa2062018-11-13 21:51:13 +08001657
1658 // Reset the resolvers without enabling TLS. Queries should still be routed
1659 // to the UDP endpoint.
Xiao Ma09b71022018-12-11 17:56:32 +09001660 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001661
1662 result = gethostbyname("tls3");
1663 ASSERT_FALSE(result == nullptr);
1664 EXPECT_EQ("1.2.3.3", ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +08001665}
1666
Ken Chenb9fa2062018-11-13 21:51:13 +08001667TEST_F(ResolverTest, GetHostByName_TlsFailover) {
Xiao Ma09b71022018-12-11 17:56:32 +09001668 constexpr char listen_addr1[] = "127.0.0.3";
1669 constexpr char listen_addr2[] = "127.0.0.4";
1670 constexpr char listen_udp[] = "53";
1671 constexpr char listen_tls[] = "853";
1672 constexpr char host_name1[] = "tlsfailover1.example.com.";
1673 constexpr char host_name2[] = "tlsfailover2.example.com.";
1674 const std::vector<DnsRecord> records1 = {
1675 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1676 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1677 };
1678 const std::vector<DnsRecord> records2 = {
1679 {host_name1, ns_type::ns_t_a, "1.2.3.3"},
1680 {host_name2, ns_type::ns_t_a, "1.2.3.4"},
1681 };
1682
1683 test::DNSResponder dns1(listen_addr1);
1684 test::DNSResponder dns2(listen_addr2);
1685 StartDns(dns1, records1);
1686 StartDns(dns2, records2);
1687
Luke Huangf8215372019-11-22 11:53:41 +08001688 std::vector<std::string> servers = {listen_addr1, listen_addr2};
Ken Chenb9fa2062018-11-13 21:51:13 +08001689
1690 test::DnsTlsFrontend tls1(listen_addr1, listen_tls, listen_addr1, listen_udp);
1691 test::DnsTlsFrontend tls2(listen_addr2, listen_tls, listen_addr2, listen_udp);
1692 ASSERT_TRUE(tls1.startServer());
1693 ASSERT_TRUE(tls2.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001694 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1695 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08001696 EXPECT_TRUE(WaitForPrivateDnsValidation(tls1.listen_address(), true));
1697 EXPECT_TRUE(WaitForPrivateDnsValidation(tls2.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001698
Mike Yu724f77d2019-08-16 11:14:50 +08001699 const hostent* result = gethostbyname("tlsfailover1");
Ken Chenb9fa2062018-11-13 21:51:13 +08001700 ASSERT_FALSE(result == nullptr);
1701 EXPECT_EQ("1.2.3.1", ToString(result));
1702
1703 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001704 EXPECT_TRUE(tls1.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001705 // No new queries should have reached tls2.
Luke Huang3caa42b2020-04-23 14:18:04 +00001706 EXPECT_TRUE(tls2.waitForQueries(1));
Ken Chenb9fa2062018-11-13 21:51:13 +08001707
1708 // Stop tls1. Subsequent queries should attempt to reach tls1, fail, and retry to tls2.
1709 tls1.stopServer();
1710
1711 result = gethostbyname("tlsfailover2");
1712 EXPECT_EQ("1.2.3.4", ToString(result));
1713
1714 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001715 EXPECT_TRUE(tls2.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001716
1717 // No additional queries should have reached the insecure servers.
1718 EXPECT_EQ(2U, dns1.queries().size());
1719 EXPECT_EQ(2U, dns2.queries().size());
1720
1721 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001722 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Ken Chenb9fa2062018-11-13 21:51:13 +08001723}
1724
1725TEST_F(ResolverTest, GetHostByName_BadTlsName) {
Xiao Ma09b71022018-12-11 17:56:32 +09001726 constexpr char listen_addr[] = "127.0.0.3";
1727 constexpr char listen_udp[] = "53";
1728 constexpr char listen_tls[] = "853";
1729 constexpr char host_name[] = "badtlsname.example.com.";
1730
1731 test::DNSResponder dns;
1732 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.1"}});
Luke Huangf8215372019-11-22 11:53:41 +08001733 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001734
1735 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1736 ASSERT_TRUE(tls.startServer());
Xiao Ma09b71022018-12-11 17:56:32 +09001737 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
waynema0e73c2e2019-07-31 15:04:08 +08001738 kDefaultIncorrectPrivateDnsHostName));
Ken Chenb9fa2062018-11-13 21:51:13 +08001739
waynema0e73c2e2019-07-31 15:04:08 +08001740 // The TLS handshake would fail because the name of TLS server doesn't
1741 // match with TLS server's certificate.
Mike Yu724f77d2019-08-16 11:14:50 +08001742 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), false));
Ken Chenb9fa2062018-11-13 21:51:13 +08001743
1744 // The query should fail hard, because a name was specified.
1745 EXPECT_EQ(nullptr, gethostbyname("badtlsname"));
1746
1747 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001748 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001749}
1750
1751TEST_F(ResolverTest, GetAddrInfo_Tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001752 constexpr char listen_addr[] = "127.0.0.3";
1753 constexpr char listen_udp[] = "53";
1754 constexpr char listen_tls[] = "853";
1755 constexpr char host_name[] = "addrinfotls.example.com.";
1756 const std::vector<DnsRecord> records = {
1757 {host_name, ns_type::ns_t_a, "1.2.3.4"},
1758 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
1759 };
1760
1761 test::DNSResponder dns;
1762 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001763 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001764
1765 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1766 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001767 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1768 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08001769 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001770
1771 dns.clearQueries();
1772 ScopedAddrinfo result = safe_getaddrinfo("addrinfotls", nullptr, nullptr);
1773 EXPECT_TRUE(result != nullptr);
1774 size_t found = GetNumQueries(dns, host_name);
1775 EXPECT_LE(1U, found);
1776 // Could be A or AAAA
1777 std::string result_str = ToString(result);
1778 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +08001779 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08001780 // Wait for both A and AAAA queries to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001781 EXPECT_TRUE(tls.waitForQueries(3));
Ken Chenb9fa2062018-11-13 21:51:13 +08001782
1783 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001784 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001785}
1786
1787TEST_F(ResolverTest, TlsBypass) {
1788 const char OFF[] = "off";
1789 const char OPPORTUNISTIC[] = "opportunistic";
1790 const char STRICT[] = "strict";
1791
1792 const char GETHOSTBYNAME[] = "gethostbyname";
1793 const char GETADDRINFO[] = "getaddrinfo";
1794 const char GETADDRINFOFORNET[] = "getaddrinfofornet";
1795
1796 const unsigned BYPASS_NETID = NETID_USE_LOCAL_NAMESERVERS | TEST_NETID;
1797
Ken Chenb9fa2062018-11-13 21:51:13 +08001798 const char ADDR4[] = "192.0.2.1";
1799 const char ADDR6[] = "2001:db8::1";
1800
1801 const char cleartext_addr[] = "127.0.0.53";
1802 const char cleartext_port[] = "53";
1803 const char tls_port[] = "853";
Luke Huangf8215372019-11-22 11:53:41 +08001804 const std::vector<std::string> servers = {cleartext_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001805
Xiao Ma09b71022018-12-11 17:56:32 +09001806 test::DNSResponder dns(cleartext_addr);
Ken Chenb9fa2062018-11-13 21:51:13 +08001807 ASSERT_TRUE(dns.startServer());
1808
1809 test::DnsTlsFrontend tls(cleartext_addr, tls_port, cleartext_addr, cleartext_port);
Mike Yudd4ac2d2019-05-31 16:52:11 +08001810 ASSERT_TRUE(tls.startServer());
Ken Chenb9fa2062018-11-13 21:51:13 +08001811
Luke Huangf8215372019-11-22 11:53:41 +08001812 // clang-format off
Ken Chenb9fa2062018-11-13 21:51:13 +08001813 struct TestConfig {
1814 const std::string mode;
1815 const bool withWorkingTLS;
1816 const std::string method;
1817
1818 std::string asHostName() const {
Luke Huangf8215372019-11-22 11:53:41 +08001819 return StringPrintf("%s.%s.%s.", mode.c_str(), withWorkingTLS ? "tlsOn" : "tlsOff",
Ken Chenb9fa2062018-11-13 21:51:13 +08001820 method.c_str());
1821 }
1822 } testConfigs[]{
Ken Chenb9fa2062018-11-13 21:51:13 +08001823 {OFF, true, GETHOSTBYNAME},
1824 {OPPORTUNISTIC, true, GETHOSTBYNAME},
1825 {STRICT, true, GETHOSTBYNAME},
Ken Chenb9fa2062018-11-13 21:51:13 +08001826 {OFF, true, GETADDRINFO},
1827 {OPPORTUNISTIC, true, GETADDRINFO},
1828 {STRICT, true, GETADDRINFO},
Ken Chenb9fa2062018-11-13 21:51:13 +08001829 {OFF, true, GETADDRINFOFORNET},
1830 {OPPORTUNISTIC, true, GETADDRINFOFORNET},
1831 {STRICT, true, GETADDRINFOFORNET},
Mike Yudd4ac2d2019-05-31 16:52:11 +08001832 {OFF, false, GETHOSTBYNAME},
1833 {OPPORTUNISTIC, false, GETHOSTBYNAME},
1834 {STRICT, false, GETHOSTBYNAME},
1835 {OFF, false, GETADDRINFO},
1836 {OPPORTUNISTIC, false, GETADDRINFO},
1837 {STRICT, false, GETADDRINFO},
1838 {OFF, false, GETADDRINFOFORNET},
1839 {OPPORTUNISTIC, false, GETADDRINFOFORNET},
1840 {STRICT, false, GETADDRINFOFORNET},
Ken Chenb9fa2062018-11-13 21:51:13 +08001841 };
Luke Huangf8215372019-11-22 11:53:41 +08001842 // clang-format on
Ken Chenb9fa2062018-11-13 21:51:13 +08001843
1844 for (const auto& config : testConfigs) {
1845 const std::string testHostName = config.asHostName();
1846 SCOPED_TRACE(testHostName);
1847
1848 // Don't tempt test bugs due to caching.
1849 const char* host_name = testHostName.c_str();
1850 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
1851 dns.addMapping(host_name, ns_type::ns_t_aaaa, ADDR6);
1852
Mike Yudd4ac2d2019-05-31 16:52:11 +08001853 if (config.withWorkingTLS) {
1854 if (!tls.running()) {
1855 ASSERT_TRUE(tls.startServer());
1856 }
1857 } else {
1858 if (tls.running()) {
1859 ASSERT_TRUE(tls.stopServer());
1860 }
1861 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001862
1863 if (config.mode == OFF) {
Xiao Ma09b71022018-12-11 17:56:32 +09001864 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, kDefaultSearchDomains,
1865 kDefaultParams));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001866 } else /* OPPORTUNISTIC or STRICT */ {
1867 const char* tls_hostname = (config.mode == STRICT) ? kDefaultPrivateDnsHostName : "";
Xiao Ma09b71022018-12-11 17:56:32 +09001868 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001869 kDefaultParams, tls_hostname));
Mike Yu724f77d2019-08-16 11:14:50 +08001870
1871 // Wait for the validation event. If the server is running, the validation should
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001872 // succeed; otherwise, the validation should fail.
Mike Yu724f77d2019-08-16 11:14:50 +08001873 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), config.withWorkingTLS));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001874 if (config.withWorkingTLS) {
1875 EXPECT_TRUE(tls.waitForQueries(1));
1876 tls.clearQueries();
1877 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001878 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001879
1880 const hostent* h_result = nullptr;
1881 ScopedAddrinfo ai_result;
1882
1883 if (config.method == GETHOSTBYNAME) {
1884 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
1885 h_result = gethostbyname(host_name);
1886
1887 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
1888 ASSERT_FALSE(h_result == nullptr);
1889 ASSERT_EQ(4, h_result->h_length);
1890 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
1891 EXPECT_EQ(ADDR4, ToString(h_result));
1892 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
1893 } else if (config.method == GETADDRINFO) {
1894 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
1895 ai_result = safe_getaddrinfo(host_name, nullptr, nullptr);
1896 EXPECT_TRUE(ai_result != nullptr);
1897
1898 EXPECT_LE(1U, GetNumQueries(dns, host_name));
1899 // Could be A or AAAA
1900 const std::string result_str = ToString(ai_result);
1901 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
Luke Huangf8215372019-11-22 11:53:41 +08001902 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08001903 } else if (config.method == GETADDRINFOFORNET) {
1904 addrinfo* raw_ai_result = nullptr;
1905 EXPECT_EQ(0, android_getaddrinfofornet(host_name, /*servname=*/nullptr,
1906 /*hints=*/nullptr, BYPASS_NETID, MARK_UNSET,
1907 &raw_ai_result));
1908 ai_result.reset(raw_ai_result);
1909
1910 EXPECT_LE(1U, GetNumQueries(dns, host_name));
1911 // Could be A or AAAA
1912 const std::string result_str = ToString(ai_result);
1913 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
Luke Huangf8215372019-11-22 11:53:41 +08001914 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08001915 }
1916
Mike Yudd4ac2d2019-05-31 16:52:11 +08001917 EXPECT_EQ(0, tls.queries());
Ken Chenb9fa2062018-11-13 21:51:13 +08001918
1919 // Clear per-process resolv netid.
1920 ASSERT_EQ(0, setNetworkForResolv(NETID_UNSET));
Ken Chenb9fa2062018-11-13 21:51:13 +08001921 dns.clearQueries();
1922 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001923}
1924
1925TEST_F(ResolverTest, StrictMode_NoTlsServers) {
Xiao Ma09b71022018-12-11 17:56:32 +09001926 constexpr char cleartext_addr[] = "127.0.0.53";
Luke Huangf8215372019-11-22 11:53:41 +08001927 const std::vector<std::string> servers = {cleartext_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09001928 constexpr char host_name[] = "strictmode.notlsips.example.com.";
1929 const std::vector<DnsRecord> records = {
1930 {host_name, ns_type::ns_t_a, "1.2.3.4"},
1931 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
1932 };
Ken Chenb9fa2062018-11-13 21:51:13 +08001933
Xiao Ma09b71022018-12-11 17:56:32 +09001934 test::DNSResponder dns(cleartext_addr);
1935 StartDns(dns, records);
Ken Chenb9fa2062018-11-13 21:51:13 +08001936
waynema0e73c2e2019-07-31 15:04:08 +08001937 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1938 kDefaultIncorrectPrivateDnsHostName));
Ken Chenb9fa2062018-11-13 21:51:13 +08001939
1940 addrinfo* ai_result = nullptr;
1941 EXPECT_NE(0, getaddrinfo(host_name, nullptr, nullptr, &ai_result));
1942 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
1943}
Luke Huang94b10b92018-11-21 20:13:38 +08001944
1945namespace {
1946
Luke Huang70931aa2019-01-31 11:57:41 +08001947int getAsyncResponse(int fd, int* rcode, uint8_t* buf, int bufLen) {
Luke Huang94b10b92018-11-21 20:13:38 +08001948 struct pollfd wait_fd[1];
1949 wait_fd[0].fd = fd;
1950 wait_fd[0].events = POLLIN;
1951 short revents;
1952 int ret;
1953
1954 ret = poll(wait_fd, 1, -1);
1955 revents = wait_fd[0].revents;
1956 if (revents & POLLIN) {
1957 int n = resNetworkResult(fd, rcode, buf, bufLen);
Luke Huangba7bef92018-12-26 16:53:03 +08001958 // Verify that resNetworkResult() closed the fd
1959 char dummy;
1960 EXPECT_EQ(-1, read(fd, &dummy, sizeof dummy));
1961 EXPECT_EQ(EBADF, errno);
Luke Huang94b10b92018-11-21 20:13:38 +08001962 return n;
1963 }
1964 return -1;
1965}
1966
Luke Huang70931aa2019-01-31 11:57:41 +08001967std::string toString(uint8_t* buf, int bufLen, int ipType) {
Luke Huang94b10b92018-11-21 20:13:38 +08001968 ns_msg handle;
1969 int ancount, n = 0;
1970 ns_rr rr;
1971
Luke Huangf8215372019-11-22 11:53:41 +08001972 if (ns_initparse((const uint8_t*)buf, bufLen, &handle) >= 0) {
Luke Huang94b10b92018-11-21 20:13:38 +08001973 ancount = ns_msg_count(handle, ns_s_an);
1974 if (ns_parserr(&handle, ns_s_an, n, &rr) == 0) {
Luke Huang70931aa2019-01-31 11:57:41 +08001975 const uint8_t* rdata = ns_rr_rdata(rr);
Luke Huang94b10b92018-11-21 20:13:38 +08001976 char buffer[INET6_ADDRSTRLEN];
Luke Huangf8215372019-11-22 11:53:41 +08001977 if (inet_ntop(ipType, (const char*)rdata, buffer, sizeof(buffer))) {
Luke Huang94b10b92018-11-21 20:13:38 +08001978 return buffer;
1979 }
1980 }
1981 }
1982 return "";
1983}
1984
1985int dns_open_proxy() {
1986 int s = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
1987 if (s == -1) {
1988 return -1;
1989 }
1990 const int one = 1;
1991 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
1992
1993 static const struct sockaddr_un proxy_addr = {
1994 .sun_family = AF_UNIX,
1995 .sun_path = "/dev/socket/dnsproxyd",
1996 };
1997
Luke Huangf8215372019-11-22 11:53:41 +08001998 if (TEMP_FAILURE_RETRY(connect(s, (const struct sockaddr*)&proxy_addr, sizeof(proxy_addr))) !=
Luke Huang94b10b92018-11-21 20:13:38 +08001999 0) {
2000 close(s);
2001 return -1;
2002 }
2003
2004 return s;
2005}
2006
Luke Huangba7bef92018-12-26 16:53:03 +08002007void expectAnswersValid(int fd, int ipType, const std::string& expectedAnswer) {
2008 int rcode = -1;
2009 uint8_t buf[MAXPACKET] = {};
2010
2011 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2012 EXPECT_GT(res, 0);
2013 EXPECT_EQ(expectedAnswer, toString(buf, res, ipType));
2014}
2015
2016void expectAnswersNotValid(int fd, int expectedErrno) {
2017 int rcode = -1;
2018 uint8_t buf[MAXPACKET] = {};
2019
2020 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2021 EXPECT_EQ(expectedErrno, res);
2022}
2023
Luke Huang94b10b92018-11-21 20:13:38 +08002024} // namespace
2025
2026TEST_F(ResolverTest, Async_NormalQueryV4V6) {
Xiao Ma09b71022018-12-11 17:56:32 +09002027 constexpr char listen_addr[] = "127.0.0.4";
2028 constexpr char host_name[] = "howdy.example.com.";
2029 const std::vector<DnsRecord> records = {
2030 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2031 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2032 };
2033
2034 test::DNSResponder dns(listen_addr);
2035 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002036 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002037 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002038
Luke Huangba7bef92018-12-26 16:53:03 +08002039 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2040 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002041 EXPECT_TRUE(fd1 != -1);
2042 EXPECT_TRUE(fd2 != -1);
2043
Luke Huang70931aa2019-01-31 11:57:41 +08002044 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002045 int rcode;
2046 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2047 EXPECT_GT(res, 0);
2048 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
2049
2050 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2051 EXPECT_GT(res, 0);
2052 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2053
2054 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
2055
2056 // Re-query verify cache works
Luke Huangba7bef92018-12-26 16:53:03 +08002057 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2058 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002059
2060 EXPECT_TRUE(fd1 != -1);
2061 EXPECT_TRUE(fd2 != -1);
2062
2063 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2064 EXPECT_GT(res, 0);
2065 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
2066
2067 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2068 EXPECT_GT(res, 0);
2069 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2070
2071 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
2072}
2073
2074TEST_F(ResolverTest, Async_BadQuery) {
Xiao Ma09b71022018-12-11 17:56:32 +09002075 constexpr char listen_addr[] = "127.0.0.4";
2076 constexpr char host_name[] = "howdy.example.com.";
2077 const std::vector<DnsRecord> records = {
2078 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2079 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2080 };
2081
2082 test::DNSResponder dns(listen_addr);
2083 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002084 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002085 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002086
2087 static struct {
2088 int fd;
2089 const char* dname;
2090 const int queryType;
2091 const int expectRcode;
2092 } kTestData[] = {
Luke Huangba7bef92018-12-26 16:53:03 +08002093 {-1, "", ns_t_aaaa, 0},
2094 {-1, "as65ass46", ns_t_aaaa, 0},
2095 {-1, "454564564564", ns_t_aaaa, 0},
2096 {-1, "h645235", ns_t_a, 0},
2097 {-1, "www.google.com", ns_t_a, 0},
Luke Huang94b10b92018-11-21 20:13:38 +08002098 };
2099
2100 for (auto& td : kTestData) {
2101 SCOPED_TRACE(td.dname);
Luke Huangba7bef92018-12-26 16:53:03 +08002102 td.fd = resNetworkQuery(TEST_NETID, td.dname, ns_c_in, td.queryType, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002103 EXPECT_TRUE(td.fd != -1);
2104 }
2105
2106 // dns_responder return empty resp(packet only contains query part) with no error currently
2107 for (const auto& td : kTestData) {
Luke Huang70931aa2019-01-31 11:57:41 +08002108 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002109 int rcode;
2110 SCOPED_TRACE(td.dname);
2111 int res = getAsyncResponse(td.fd, &rcode, buf, MAXPACKET);
2112 EXPECT_GT(res, 0);
2113 EXPECT_EQ(rcode, td.expectRcode);
2114 }
2115}
2116
2117TEST_F(ResolverTest, Async_EmptyAnswer) {
Xiao Ma09b71022018-12-11 17:56:32 +09002118 constexpr char listen_addr[] = "127.0.0.4";
2119 constexpr char host_name[] = "howdy.example.com.";
2120 const std::vector<DnsRecord> records = {
2121 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2122 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2123 };
2124
2125 test::DNSResponder dns(listen_addr);
2126 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002127 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002128 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002129
Luke Huang9c264bb2018-12-18 16:44:41 +08002130 // TODO: Disable retry to make this test explicit.
2131 auto& cv = dns.getCv();
2132 auto& cvMutex = dns.getCvMutex();
2133 int fd1;
2134 // Wait on the condition variable to ensure that the DNS server has handled our first query.
2135 {
2136 std::unique_lock lk(cvMutex);
Luke Huangba7bef92018-12-26 16:53:03 +08002137 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang9c264bb2018-12-18 16:44:41 +08002138 EXPECT_TRUE(fd1 != -1);
2139 EXPECT_EQ(std::cv_status::no_timeout, cv.wait_for(lk, std::chrono::seconds(1)));
2140 }
Luke Huang94b10b92018-11-21 20:13:38 +08002141
Luke Huang94b10b92018-11-21 20:13:38 +08002142 dns.setResponseProbability(0.0);
Luke Huang94b10b92018-11-21 20:13:38 +08002143
Luke Huangba7bef92018-12-26 16:53:03 +08002144 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002145 EXPECT_TRUE(fd2 != -1);
2146
Luke Huangba7bef92018-12-26 16:53:03 +08002147 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002148 EXPECT_TRUE(fd3 != -1);
2149
Luke Huang9c264bb2018-12-18 16:44:41 +08002150 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002151 int rcode;
2152
Luke Huang9c264bb2018-12-18 16:44:41 +08002153 // expect no response
2154 int res = getAsyncResponse(fd3, &rcode, buf, MAXPACKET);
2155 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huang94b10b92018-11-21 20:13:38 +08002156
Luke Huang9c264bb2018-12-18 16:44:41 +08002157 // expect no response
Luke Huang94b10b92018-11-21 20:13:38 +08002158 memset(buf, 0, MAXPACKET);
Luke Huang9c264bb2018-12-18 16:44:41 +08002159 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2160 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huang94b10b92018-11-21 20:13:38 +08002161
Luke Huang94b10b92018-11-21 20:13:38 +08002162 dns.setResponseProbability(1.0);
Luke Huang94b10b92018-11-21 20:13:38 +08002163
Luke Huangba7bef92018-12-26 16:53:03 +08002164 int fd4 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002165 EXPECT_TRUE(fd4 != -1);
2166
2167 memset(buf, 0, MAXPACKET);
2168 res = getAsyncResponse(fd4, &rcode, buf, MAXPACKET);
2169 EXPECT_GT(res, 0);
2170 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2171
2172 memset(buf, 0, MAXPACKET);
2173 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2174 EXPECT_GT(res, 0);
2175 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
2176}
2177
2178TEST_F(ResolverTest, Async_MalformedQuery) {
Xiao Ma09b71022018-12-11 17:56:32 +09002179 constexpr char listen_addr[] = "127.0.0.4";
2180 constexpr char host_name[] = "howdy.example.com.";
2181 const std::vector<DnsRecord> records = {
2182 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2183 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2184 };
2185
2186 test::DNSResponder dns(listen_addr);
2187 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002188 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002189 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002190
2191 int fd = dns_open_proxy();
2192 EXPECT_TRUE(fd > 0);
2193
2194 const std::string badMsg = "16-52512#";
Xiao Ma09b71022018-12-11 17:56:32 +09002195 static const struct {
Luke Huang94b10b92018-11-21 20:13:38 +08002196 const std::string cmd;
2197 const int expectErr;
2198 } kTestData[] = {
Luke Huangba7bef92018-12-26 16:53:03 +08002199 // Too few arguments
Luke Huang94b10b92018-11-21 20:13:38 +08002200 {"resnsend " + badMsg + '\0', -EINVAL},
2201 // Bad netId
Luke Huangba7bef92018-12-26 16:53:03 +08002202 {"resnsend badnetId 0 " + badMsg + '\0', -EINVAL},
Luke Huang94b10b92018-11-21 20:13:38 +08002203 // Bad raw data
Luke Huangba7bef92018-12-26 16:53:03 +08002204 {"resnsend " + std::to_string(TEST_NETID) + " 0 " + badMsg + '\0', -EILSEQ},
Luke Huang94b10b92018-11-21 20:13:38 +08002205 };
2206
2207 for (unsigned int i = 0; i < std::size(kTestData); i++) {
2208 auto& td = kTestData[i];
2209 SCOPED_TRACE(td.cmd);
2210 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, td.cmd.c_str(), td.cmd.size()));
2211 EXPECT_EQ(rc, static_cast<ssize_t>(td.cmd.size()));
2212
2213 int32_t tmp;
2214 rc = TEMP_FAILURE_RETRY(read(fd, &tmp, sizeof(tmp)));
2215 EXPECT_TRUE(rc > 0);
2216 EXPECT_EQ(static_cast<int>(ntohl(tmp)), td.expectErr);
2217 }
2218 // Normal query with answer buffer
2219 // This is raw data of query "howdy.example.com" type 1 class 1
2220 std::string query = "81sBAAABAAAAAAAABWhvd2R5B2V4YW1wbGUDY29tAAABAAE=";
Luke Huangba7bef92018-12-26 16:53:03 +08002221 std::string cmd = "resnsend " + std::to_string(TEST_NETID) + " 0 " + query + '\0';
Luke Huang94b10b92018-11-21 20:13:38 +08002222 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
2223 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
2224
Luke Huang70931aa2019-01-31 11:57:41 +08002225 uint8_t smallBuf[1] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002226 int rcode;
2227 rc = getAsyncResponse(fd, &rcode, smallBuf, 1);
Luke Huangba7bef92018-12-26 16:53:03 +08002228 EXPECT_EQ(-EMSGSIZE, rc);
Luke Huang94b10b92018-11-21 20:13:38 +08002229
2230 // Do the normal test with large buffer again
2231 fd = dns_open_proxy();
2232 EXPECT_TRUE(fd > 0);
2233 rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
2234 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
Luke Huang70931aa2019-01-31 11:57:41 +08002235 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002236 rc = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2237 EXPECT_EQ("1.2.3.4", toString(buf, rc, AF_INET));
Mike Yu4f3747b2018-12-02 17:54:29 +09002238}
2239
Luke Huangba7bef92018-12-26 16:53:03 +08002240TEST_F(ResolverTest, Async_CacheFlags) {
Xiao Ma09b71022018-12-11 17:56:32 +09002241 constexpr char listen_addr[] = "127.0.0.4";
Luke Huangb9a10a82020-05-28 10:40:22 +00002242 constexpr char host_name1[] = "howdy.example.com.";
2243 constexpr char host_name2[] = "howdy.example2.com.";
2244 constexpr char host_name3[] = "howdy.example3.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002245 const std::vector<DnsRecord> records = {
Luke Huangb9a10a82020-05-28 10:40:22 +00002246 {host_name1, ns_type::ns_t_a, "1.2.3.4"}, {host_name1, ns_type::ns_t_aaaa, "::1.2.3.4"},
2247 {host_name2, ns_type::ns_t_a, "1.2.3.5"}, {host_name2, ns_type::ns_t_aaaa, "::1.2.3.5"},
2248 {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 +09002249 };
2250
2251 test::DNSResponder dns(listen_addr);
2252 StartDns(dns, records);
Luke Huangba7bef92018-12-26 16:53:03 +08002253 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002254 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huangba7bef92018-12-26 16:53:03 +08002255
2256 // ANDROID_RESOLV_NO_CACHE_STORE
2257 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2258 ANDROID_RESOLV_NO_CACHE_STORE);
2259 EXPECT_TRUE(fd1 != -1);
2260 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2261 ANDROID_RESOLV_NO_CACHE_STORE);
2262 EXPECT_TRUE(fd2 != -1);
2263 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2264 ANDROID_RESOLV_NO_CACHE_STORE);
2265 EXPECT_TRUE(fd3 != -1);
2266
2267 expectAnswersValid(fd3, AF_INET, "1.2.3.4");
2268 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
2269 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2270
2271 // No cache exists, expect 3 queries
Luke Huangb9a10a82020-05-28 10:40:22 +00002272 EXPECT_EQ(3U, GetNumQueries(dns, host_name1));
Luke Huangba7bef92018-12-26 16:53:03 +08002273
Luke Huangb9a10a82020-05-28 10:40:22 +00002274 // Raise a query with no flags to ensure no cache exists. Also make an cache entry for the
2275 // query.
Luke Huangba7bef92018-12-26 16:53:03 +08002276 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2277
2278 EXPECT_TRUE(fd1 != -1);
2279
2280 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2281
Luke Huangb9a10a82020-05-28 10:40:22 +00002282 // Expect 4 queries because there should be no cache before this query.
2283 EXPECT_EQ(4U, GetNumQueries(dns, host_name1));
2284
2285 // Now we have the cache entry, re-query with ANDROID_RESOLV_NO_CACHE_STORE to ensure
2286 // that ANDROID_RESOLV_NO_CACHE_STORE implied ANDROID_RESOLV_NO_CACHE_LOOKUP.
2287 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2288 ANDROID_RESOLV_NO_CACHE_STORE);
2289 EXPECT_TRUE(fd1 != -1);
2290 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2291 // Expect 5 queries because we shouldn't do cache lookup for the query which has
2292 // ANDROID_RESOLV_NO_CACHE_STORE.
2293 EXPECT_EQ(5U, GetNumQueries(dns, host_name1));
Luke Huangba7bef92018-12-26 16:53:03 +08002294
2295 // ANDROID_RESOLV_NO_CACHE_LOOKUP
2296 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2297 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2298 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2299 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2300
2301 EXPECT_TRUE(fd1 != -1);
2302 EXPECT_TRUE(fd2 != -1);
2303
2304 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
2305 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2306
Luke Huangb9a10a82020-05-28 10:40:22 +00002307 // Cache was skipped, expect 2 more queries.
2308 EXPECT_EQ(7U, GetNumQueries(dns, host_name1));
Luke Huangba7bef92018-12-26 16:53:03 +08002309
2310 // Re-query verify cache works
Luke Huangb9a10a82020-05-28 10:40:22 +00002311 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huangba7bef92018-12-26 16:53:03 +08002312 EXPECT_TRUE(fd1 != -1);
2313 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2314
Luke Huangb9a10a82020-05-28 10:40:22 +00002315 // Cache hits, expect still 7 queries
2316 EXPECT_EQ(7U, GetNumQueries(dns, host_name1));
Luke Huanga1d74182019-03-19 17:30:36 +08002317
2318 // Start to verify if ANDROID_RESOLV_NO_CACHE_LOOKUP does write response into cache
2319 dns.clearQueries();
2320
Luke Huangb9a10a82020-05-28 10:40:22 +00002321 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa,
Luke Huanga1d74182019-03-19 17:30:36 +08002322 ANDROID_RESOLV_NO_CACHE_LOOKUP);
Luke Huangb9a10a82020-05-28 10:40:22 +00002323 fd2 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa,
Luke Huanga1d74182019-03-19 17:30:36 +08002324 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2325
2326 EXPECT_TRUE(fd1 != -1);
2327 EXPECT_TRUE(fd2 != -1);
2328
Luke Huangb9a10a82020-05-28 10:40:22 +00002329 expectAnswersValid(fd2, AF_INET6, "::1.2.3.5");
2330 expectAnswersValid(fd1, AF_INET6, "::1.2.3.5");
Luke Huanga1d74182019-03-19 17:30:36 +08002331
2332 // Skip cache, expect 2 queries
Luke Huangb9a10a82020-05-28 10:40:22 +00002333 EXPECT_EQ(2U, GetNumQueries(dns, host_name2));
Luke Huanga1d74182019-03-19 17:30:36 +08002334
2335 // Re-query without flags
Luke Huangb9a10a82020-05-28 10:40:22 +00002336 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa, 0);
2337 fd2 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa, 0);
Luke Huanga1d74182019-03-19 17:30:36 +08002338
2339 EXPECT_TRUE(fd1 != -1);
2340 EXPECT_TRUE(fd2 != -1);
2341
Luke Huangb9a10a82020-05-28 10:40:22 +00002342 expectAnswersValid(fd2, AF_INET6, "::1.2.3.5");
2343 expectAnswersValid(fd1, AF_INET6, "::1.2.3.5");
Luke Huanga1d74182019-03-19 17:30:36 +08002344
2345 // Cache hits, expect still 2 queries
Luke Huangb9a10a82020-05-28 10:40:22 +00002346 EXPECT_EQ(2U, GetNumQueries(dns, host_name2));
Luke Huang40f5f492019-05-09 19:37:35 +08002347
2348 // Test both ANDROID_RESOLV_NO_CACHE_STORE and ANDROID_RESOLV_NO_CACHE_LOOKUP are set
2349 dns.clearQueries();
2350
Luke Huangb9a10a82020-05-28 10:40:22 +00002351 // Make sure that the cache of "howdy.example3.com" exists.
2352 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang40f5f492019-05-09 19:37:35 +08002353 EXPECT_TRUE(fd1 != -1);
Luke Huangb9a10a82020-05-28 10:40:22 +00002354 expectAnswersValid(fd1, AF_INET6, "::1.2.3.6");
2355 EXPECT_EQ(1U, GetNumQueries(dns, host_name3));
Luke Huang40f5f492019-05-09 19:37:35 +08002356
2357 // Re-query with testFlags
2358 const int testFlag = ANDROID_RESOLV_NO_CACHE_STORE | ANDROID_RESOLV_NO_CACHE_LOOKUP;
Luke Huangb9a10a82020-05-28 10:40:22 +00002359 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_aaaa, testFlag);
Luke Huang40f5f492019-05-09 19:37:35 +08002360 EXPECT_TRUE(fd1 != -1);
Luke Huangb9a10a82020-05-28 10:40:22 +00002361 expectAnswersValid(fd1, AF_INET6, "::1.2.3.6");
Luke Huang40f5f492019-05-09 19:37:35 +08002362 // Expect cache lookup is skipped.
Luke Huangb9a10a82020-05-28 10:40:22 +00002363 EXPECT_EQ(2U, GetNumQueries(dns, host_name3));
Luke Huang40f5f492019-05-09 19:37:35 +08002364
2365 // Do another query with testFlags
Luke Huangb9a10a82020-05-28 10:40:22 +00002366 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_a, testFlag);
Luke Huang40f5f492019-05-09 19:37:35 +08002367 EXPECT_TRUE(fd1 != -1);
Luke Huangb9a10a82020-05-28 10:40:22 +00002368 expectAnswersValid(fd1, AF_INET, "1.2.3.6");
Luke Huang40f5f492019-05-09 19:37:35 +08002369 // Expect cache lookup is skipped.
Luke Huangb9a10a82020-05-28 10:40:22 +00002370 EXPECT_EQ(3U, GetNumQueries(dns, host_name3));
Luke Huang40f5f492019-05-09 19:37:35 +08002371
2372 // Re-query with no flags
Luke Huangb9a10a82020-05-28 10:40:22 +00002373 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_a, 0);
Luke Huang40f5f492019-05-09 19:37:35 +08002374 EXPECT_TRUE(fd1 != -1);
Luke Huangb9a10a82020-05-28 10:40:22 +00002375 expectAnswersValid(fd1, AF_INET, "1.2.3.6");
Luke Huang40f5f492019-05-09 19:37:35 +08002376 // Expect no cache hit because cache storing is also skipped in previous query.
Luke Huangb9a10a82020-05-28 10:40:22 +00002377 EXPECT_EQ(4U, GetNumQueries(dns, host_name3));
Luke Huangba7bef92018-12-26 16:53:03 +08002378}
2379
Luke Huang08b13d22020-02-05 14:46:21 +08002380TEST_F(ResolverTest, Async_NoCacheStoreFlagDoesNotRefreshStaleCacheEntry) {
2381 constexpr char listen_addr[] = "127.0.0.4";
2382 constexpr char host_name[] = "howdy.example.com.";
2383 const std::vector<DnsRecord> records = {
2384 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2385 };
2386
2387 test::DNSResponder dns(listen_addr);
2388 StartDns(dns, records);
2389 std::vector<std::string> servers = {listen_addr};
2390 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
2391
2392 const unsigned SHORT_TTL_SEC = 1;
2393 dns.setTtl(SHORT_TTL_SEC);
2394
2395 // Refer to b/148842821 for the purpose of below test steps.
2396 // Basically, this test is used to ensure stale cache case is handled
2397 // correctly with ANDROID_RESOLV_NO_CACHE_STORE.
2398 int fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2399 EXPECT_TRUE(fd != -1);
2400 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2401
2402 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2403 dns.clearQueries();
2404
2405 // Wait until cache expired
2406 sleep(SHORT_TTL_SEC + 0.5);
2407
2408 // Now request the same hostname again.
2409 // We should see a new DNS query because the entry in cache has become stale.
2410 // Due to ANDROID_RESOLV_NO_CACHE_STORE, this query must *not* refresh that stale entry.
2411 fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2412 ANDROID_RESOLV_NO_CACHE_STORE);
2413 EXPECT_TRUE(fd != -1);
2414 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2415 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2416 dns.clearQueries();
2417
2418 // If the cache is still stale, we expect to see one more DNS query
2419 // (this time the cache will be refreshed, but we're not checking for it).
2420 fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2421 EXPECT_TRUE(fd != -1);
2422 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2423 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2424}
2425
Luke Huangba7bef92018-12-26 16:53:03 +08002426TEST_F(ResolverTest, Async_NoRetryFlag) {
Luke Huang70931aa2019-01-31 11:57:41 +08002427 constexpr char listen_addr0[] = "127.0.0.4";
2428 constexpr char listen_addr1[] = "127.0.0.6";
Xiao Ma09b71022018-12-11 17:56:32 +09002429 constexpr char host_name[] = "howdy.example.com.";
2430 const std::vector<DnsRecord> records = {
2431 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2432 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2433 };
2434
Luke Huang70931aa2019-01-31 11:57:41 +08002435 test::DNSResponder dns0(listen_addr0);
2436 test::DNSResponder dns1(listen_addr1);
2437 StartDns(dns0, records);
2438 StartDns(dns1, records);
2439 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr0, listen_addr1}));
Luke Huangba7bef92018-12-26 16:53:03 +08002440
Luke Huang70931aa2019-01-31 11:57:41 +08002441 dns0.clearQueries();
2442 dns1.clearQueries();
2443
2444 dns0.setResponseProbability(0.0);
2445 dns1.setResponseProbability(0.0);
Luke Huangba7bef92018-12-26 16:53:03 +08002446
2447 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2448 ANDROID_RESOLV_NO_RETRY);
2449 EXPECT_TRUE(fd1 != -1);
2450
2451 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa,
2452 ANDROID_RESOLV_NO_RETRY);
2453 EXPECT_TRUE(fd2 != -1);
2454
2455 // expect no response
2456 expectAnswersNotValid(fd1, -ETIMEDOUT);
2457 expectAnswersNotValid(fd2, -ETIMEDOUT);
2458
Luke Huang70931aa2019-01-31 11:57:41 +08002459 // No retry case, expect total 2 queries. The server is selected randomly.
2460 EXPECT_EQ(2U, GetNumQueries(dns0, host_name) + GetNumQueries(dns1, host_name));
Luke Huangba7bef92018-12-26 16:53:03 +08002461
Luke Huang70931aa2019-01-31 11:57:41 +08002462 dns0.clearQueries();
2463 dns1.clearQueries();
Luke Huangba7bef92018-12-26 16:53:03 +08002464
2465 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2466 EXPECT_TRUE(fd1 != -1);
2467
2468 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
2469 EXPECT_TRUE(fd2 != -1);
2470
2471 // expect no response
2472 expectAnswersNotValid(fd1, -ETIMEDOUT);
2473 expectAnswersNotValid(fd2, -ETIMEDOUT);
2474
2475 // Retry case, expect 4 queries
Luke Huang70931aa2019-01-31 11:57:41 +08002476 EXPECT_EQ(4U, GetNumQueries(dns0, host_name));
2477 EXPECT_EQ(4U, GetNumQueries(dns1, host_name));
2478}
2479
2480TEST_F(ResolverTest, Async_VerifyQueryID) {
2481 constexpr char listen_addr[] = "127.0.0.4";
2482 constexpr char host_name[] = "howdy.example.com.";
2483 const std::vector<DnsRecord> records = {
2484 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2485 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2486 };
2487
2488 test::DNSResponder dns(listen_addr);
2489 StartDns(dns, records);
2490 std::vector<std::string> servers = {listen_addr};
2491 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
2492
2493 const uint8_t queryBuf1[] = {
2494 /* Header */
2495 0x55, 0x66, /* Transaction ID */
2496 0x01, 0x00, /* Flags */
2497 0x00, 0x01, /* Questions */
2498 0x00, 0x00, /* Answer RRs */
2499 0x00, 0x00, /* Authority RRs */
2500 0x00, 0x00, /* Additional RRs */
2501 /* Queries */
2502 0x05, 0x68, 0x6f, 0x77, 0x64, 0x79, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
2503 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name */
2504 0x00, 0x01, /* Type */
2505 0x00, 0x01 /* Class */
2506 };
2507
2508 int fd = resNetworkSend(TEST_NETID, queryBuf1, sizeof(queryBuf1), 0);
2509 EXPECT_TRUE(fd != -1);
2510
2511 uint8_t buf[MAXPACKET] = {};
2512 int rcode;
2513
2514 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2515 EXPECT_GT(res, 0);
2516 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2517
2518 auto hp = reinterpret_cast<HEADER*>(buf);
2519 EXPECT_EQ(21862U, htons(hp->id));
2520
2521 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2522
2523 const uint8_t queryBuf2[] = {
2524 /* Header */
2525 0x00, 0x53, /* Transaction ID */
2526 0x01, 0x00, /* Flags */
2527 0x00, 0x01, /* Questions */
2528 0x00, 0x00, /* Answer RRs */
2529 0x00, 0x00, /* Authority RRs */
2530 0x00, 0x00, /* Additional RRs */
2531 /* Queries */
2532 0x05, 0x68, 0x6f, 0x77, 0x64, 0x79, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
2533 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name */
2534 0x00, 0x01, /* Type */
2535 0x00, 0x01 /* Class */
2536 };
2537
2538 // Re-query verify cache works and query id is correct
2539 fd = resNetworkSend(TEST_NETID, queryBuf2, sizeof(queryBuf2), 0);
2540
2541 EXPECT_TRUE(fd != -1);
2542
2543 res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2544 EXPECT_GT(res, 0);
2545 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2546
2547 EXPECT_EQ(0x0053U, htons(hp->id));
2548
2549 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
Luke Huangba7bef92018-12-26 16:53:03 +08002550}
2551
Mike Yu4f3747b2018-12-02 17:54:29 +09002552// This test checks that the resolver should not generate the request containing OPT RR when using
Ken Chen0a015532019-01-02 14:59:38 +08002553// cleartext DNS. If we query the DNS server not supporting EDNS0 and it reponds with
2554// FORMERR_ON_EDNS, we will fallback to no EDNS0 and try again. If the server does no response, we
2555// won't retry so that we get no answer.
Mike Yu4f3747b2018-12-02 17:54:29 +09002556TEST_F(ResolverTest, BrokenEdns) {
2557 typedef test::DNSResponder::Edns Edns;
2558 enum ExpectResult { EXPECT_FAILURE, EXPECT_SUCCESS };
2559
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002560 // Perform cleartext query in off mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002561 const char OFF[] = "off";
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002562
2563 // Perform cleartext query when there's no private DNS server validated in opportunistic mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002564 const char OPPORTUNISTIC_UDP[] = "opportunistic_udp";
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002565
2566 // Perform cleartext query when there is a private DNS server validated in opportunistic mode.
2567 const char OPPORTUNISTIC_FALLBACK_UDP[] = "opportunistic_fallback_udp";
2568
2569 // Perform cyphertext query in opportunistic mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002570 const char OPPORTUNISTIC_TLS[] = "opportunistic_tls";
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002571
2572 // Perform cyphertext query in strict mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002573 const char STRICT[] = "strict";
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002574
Mike Yu4f3747b2018-12-02 17:54:29 +09002575 const char GETHOSTBYNAME[] = "gethostbyname";
2576 const char GETADDRINFO[] = "getaddrinfo";
Mike Yu4f3747b2018-12-02 17:54:29 +09002577 const char ADDR4[] = "192.0.2.1";
2578 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2579 const char CLEARTEXT_PORT[] = "53";
2580 const char TLS_PORT[] = "853";
Luke Huangf8215372019-11-22 11:53:41 +08002581 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002582 ResolverParamsParcel paramsForCleanup = DnsResponderClient::GetDefaultResolverParamsParcel();
2583 paramsForCleanup.servers.clear();
2584 paramsForCleanup.tlsServers.clear();
Mike Yu4f3747b2018-12-02 17:54:29 +09002585
Mike Yufc125e42019-05-15 20:41:28 +08002586 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Mike Yu4f3747b2018-12-02 17:54:29 +09002587 ASSERT_TRUE(dns.startServer());
2588
2589 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2590
Luke Huangf8215372019-11-22 11:53:41 +08002591 // clang-format off
Mike Yu4f3747b2018-12-02 17:54:29 +09002592 static const struct TestConfig {
2593 std::string mode;
2594 std::string method;
2595 Edns edns;
2596 ExpectResult expectResult;
2597
2598 std::string asHostName() const {
2599 const char* ednsString;
2600 switch (edns) {
2601 case Edns::ON:
2602 ednsString = "ednsOn";
2603 break;
Ken Chen0a015532019-01-02 14:59:38 +08002604 case Edns::FORMERR_ON_EDNS:
Mike Yu4f3747b2018-12-02 17:54:29 +09002605 ednsString = "ednsFormerr";
2606 break;
2607 case Edns::DROP:
2608 ednsString = "ednsDrop";
2609 break;
2610 default:
2611 ednsString = "";
2612 break;
2613 }
2614 return StringPrintf("%s.%s.%s.", mode.c_str(), method.c_str(), ednsString);
2615 }
2616 } testConfigs[] = {
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002617 // In OPPORTUNISTIC_TLS, if the DNS server doesn't support EDNS0 but TLS, the lookup
2618 // fails. Could such server exist? if so, we might need to fix it to fallback to
2619 // cleartext query. If the server still make no response for the queries with EDNS0, we
2620 // might also need to fix it to retry without EDNS0.
Mike Yu4f3747b2018-12-02 17:54:29 +09002621 // Another thing is that {OPPORTUNISTIC_TLS, Edns::DROP} and {STRICT, Edns::DROP} are
2622 // commented out since TLS timeout is not configurable.
2623 // TODO: Uncomment them after TLS timeout is configurable.
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002624 {OFF, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2625 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2626 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2627 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2628 {STRICT, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2629 {OFF, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2630 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2631 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2632 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2633 {STRICT, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2634 {OFF, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2635 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2636
2637 // The failure is due to no retry on timeout. Maybe fix it?
2638 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2639
2640 //{OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2641 //{STRICT, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2642 {OFF, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2643 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2644 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2645 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2646 {STRICT, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2647 {OFF, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2648 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2649 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2650 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2651 {STRICT, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2652 {OFF, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2653 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2654
2655 // The failure is due to no retry on timeout. Maybe fix it?
2656 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2657
Mike Yu4f3747b2018-12-02 17:54:29 +09002658 //{OPPORTUNISTIC_TLS, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2659 //{STRICT, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2660 };
Luke Huangf8215372019-11-22 11:53:41 +08002661 // clang-format on
Mike Yu4f3747b2018-12-02 17:54:29 +09002662
2663 for (const auto& config : testConfigs) {
2664 const std::string testHostName = config.asHostName();
2665 SCOPED_TRACE(testHostName);
2666
2667 const char* host_name = testHostName.c_str();
2668 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
2669 dns.setEdns(config.edns);
2670
2671 if (config.mode == OFF) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002672 if (tls.running()) {
2673 ASSERT_TRUE(tls.stopServer());
2674 }
Xiao Ma09b71022018-12-11 17:56:32 +09002675 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Mike Yu4f3747b2018-12-02 17:54:29 +09002676 } else if (config.mode == OPPORTUNISTIC_UDP) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002677 if (tls.running()) {
2678 ASSERT_TRUE(tls.stopServer());
2679 }
Xiao Ma09b71022018-12-11 17:56:32 +09002680 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002681 kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002682 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), false));
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002683 } else if (config.mode == OPPORTUNISTIC_TLS || config.mode == OPPORTUNISTIC_FALLBACK_UDP) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002684 if (!tls.running()) {
2685 ASSERT_TRUE(tls.startServer());
2686 }
Xiao Ma09b71022018-12-11 17:56:32 +09002687 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002688 kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002689 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002690
2691 if (config.mode == OPPORTUNISTIC_FALLBACK_UDP) {
2692 // Force the resolver to fallback to cleartext queries.
2693 ASSERT_TRUE(tls.stopServer());
2694 }
Mike Yu4f3747b2018-12-02 17:54:29 +09002695 } else if (config.mode == STRICT) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002696 if (!tls.running()) {
2697 ASSERT_TRUE(tls.startServer());
2698 }
Xiao Ma09b71022018-12-11 17:56:32 +09002699 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002700 kDefaultParams, kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08002701 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Mike Yu4f3747b2018-12-02 17:54:29 +09002702 }
2703
2704 if (config.method == GETHOSTBYNAME) {
2705 const hostent* h_result = gethostbyname(host_name);
2706 if (config.expectResult == EXPECT_SUCCESS) {
2707 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2708 ASSERT_TRUE(h_result != nullptr);
2709 ASSERT_EQ(4, h_result->h_length);
2710 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
2711 EXPECT_EQ(ADDR4, ToString(h_result));
2712 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
2713 } else {
2714 EXPECT_EQ(0U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
2715 ASSERT_TRUE(h_result == nullptr);
2716 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2717 }
2718 } else if (config.method == GETADDRINFO) {
2719 ScopedAddrinfo ai_result;
2720 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2721 ai_result = safe_getaddrinfo(host_name, nullptr, &hints);
2722 if (config.expectResult == EXPECT_SUCCESS) {
2723 EXPECT_TRUE(ai_result != nullptr);
2724 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2725 const std::string result_str = ToString(ai_result);
2726 EXPECT_EQ(ADDR4, result_str);
2727 } else {
2728 EXPECT_TRUE(ai_result == nullptr);
2729 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
2730 }
2731 } else {
2732 FAIL() << "Unsupported query method: " << config.method;
2733 }
2734
Mike Yudd4ac2d2019-05-31 16:52:11 +08002735 tls.clearQueries();
Mike Yu4f3747b2018-12-02 17:54:29 +09002736 dns.clearQueries();
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002737
2738 // Clear the setup to force the resolver to validate private DNS servers in every test.
2739 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(paramsForCleanup));
Mike Yu4f3747b2018-12-02 17:54:29 +09002740 }
Mike Yu4f3747b2018-12-02 17:54:29 +09002741}
nuccachena26cc2a2018-07-17 18:07:23 +08002742
Ken Chen0a015532019-01-02 14:59:38 +08002743// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2744// Resolver should have a reasonable number of retries instead of spinning forever. We don't have
2745// an efficient way to know if resolver is stuck in an infinite loop. However, test case will be
2746// failed due to timeout.
2747TEST_F(ResolverTest, UnstableTls) {
2748 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2749 const char CLEARTEXT_PORT[] = "53";
2750 const char TLS_PORT[] = "853";
2751 const char* host_name1 = "nonexistent1.example.com.";
2752 const char* host_name2 = "nonexistent2.example.com.";
2753 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
2754
Mike Yufc125e42019-05-15 20:41:28 +08002755 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Ken Chen0a015532019-01-02 14:59:38 +08002756 ASSERT_TRUE(dns.startServer());
2757 dns.setEdns(test::DNSResponder::Edns::FORMERR_ON_EDNS);
2758 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2759 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08002760 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002761 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
2762
Ken Chen0a015532019-01-02 14:59:38 +08002763 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
2764 tls.stopServer();
2765
2766 const hostent* h_result = gethostbyname(host_name1);
2767 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
2768 ASSERT_TRUE(h_result == nullptr);
2769 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2770
2771 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2772 ScopedAddrinfo ai_result = safe_getaddrinfo(host_name2, nullptr, &hints);
2773 EXPECT_TRUE(ai_result == nullptr);
2774 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
2775}
2776
2777// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2778// Moreover, server responds RCODE=FORMERR even on non-EDNS query.
2779TEST_F(ResolverTest, BogusDnsServer) {
2780 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2781 const char CLEARTEXT_PORT[] = "53";
2782 const char TLS_PORT[] = "853";
2783 const char* host_name1 = "nonexistent1.example.com.";
2784 const char* host_name2 = "nonexistent2.example.com.";
2785 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
2786
Mike Yufc125e42019-05-15 20:41:28 +08002787 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Ken Chen0a015532019-01-02 14:59:38 +08002788 ASSERT_TRUE(dns.startServer());
2789 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2790 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08002791 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002792 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
2793
Ken Chen0a015532019-01-02 14:59:38 +08002794 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
2795 tls.stopServer();
2796 dns.setEdns(test::DNSResponder::Edns::FORMERR_UNCOND);
2797
2798 const hostent* h_result = gethostbyname(host_name1);
2799 EXPECT_EQ(0U, GetNumQueries(dns, host_name1));
2800 ASSERT_TRUE(h_result == nullptr);
2801 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2802
2803 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2804 ScopedAddrinfo ai_result = safe_getaddrinfo(host_name2, nullptr, &hints);
2805 EXPECT_TRUE(ai_result == nullptr);
2806 EXPECT_EQ(0U, GetNumQueries(dns, host_name2));
2807}
2808
nuccachena26cc2a2018-07-17 18:07:23 +08002809TEST_F(ResolverTest, GetAddrInfo_Dns64Synthesize) {
2810 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002811 constexpr char dns64_name[] = "ipv4only.arpa.";
2812 constexpr char host_name[] = "v4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002813 const std::vector<DnsRecord> records = {
2814 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2815 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2816 };
nuccachena26cc2a2018-07-17 18:07:23 +08002817
Xiao Ma09b71022018-12-11 17:56:32 +09002818 test::DNSResponder dns(listen_addr);
Xiao Ma09b71022018-12-11 17:56:32 +09002819 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002820
2821 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002822 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002823
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002824 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002825 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002826 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002827
2828 // hints are necessary in order to let netd know which type of addresses the caller is
2829 // interested in.
Xiao Ma09b71022018-12-11 17:56:32 +09002830 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08002831 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
2832 EXPECT_TRUE(result != nullptr);
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002833 // TODO: BUG: there should only be two queries, one AAAA (which returns no records) and one A
2834 // (which returns 1.2.3.4). But there is an extra AAAA.
2835 EXPECT_EQ(3U, GetNumQueries(dns, host_name));
nuccachena26cc2a2018-07-17 18:07:23 +08002836
2837 std::string result_str = ToString(result);
2838 EXPECT_EQ(result_str, "64:ff9b::102:304");
2839
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002840 // Stopping NAT64 prefix discovery disables synthesis.
Luke Huang5bd827c2019-03-14 16:10:04 +08002841 EXPECT_TRUE(mDnsClient.resolvService()->stopPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002842 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_NOT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002843
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002844 dns.clearQueries();
nuccachena26cc2a2018-07-17 18:07:23 +08002845
2846 result = safe_getaddrinfo("v4only", nullptr, &hints);
2847 EXPECT_TRUE(result != nullptr);
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002848 // TODO: BUG: there should only be one query, an AAAA (which returns no records), because the
2849 // A is already cached. But there is an extra AAAA.
2850 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
nuccachena26cc2a2018-07-17 18:07:23 +08002851
2852 result_str = ToString(result);
2853 EXPECT_EQ(result_str, "1.2.3.4");
2854}
2855
nuccachena26cc2a2018-07-17 18:07:23 +08002856TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecified) {
2857 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002858 constexpr char dns64_name[] = "ipv4only.arpa.";
2859 constexpr char host_name[] = "v4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002860 const std::vector<DnsRecord> records = {
2861 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2862 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2863 };
nuccachena26cc2a2018-07-17 18:07:23 +08002864
Xiao Ma09b71022018-12-11 17:56:32 +09002865 test::DNSResponder dns(listen_addr);
2866 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002867 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002868 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002869
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002870 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002871 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002872 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002873
2874 // Ensure to synthesize AAAA if AF_INET6 is specified, and not to synthesize AAAA
2875 // in AF_INET case.
2876 addrinfo hints;
2877 memset(&hints, 0, sizeof(hints));
2878 hints.ai_family = AF_INET6;
2879 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
2880 EXPECT_TRUE(result != nullptr);
2881 std::string result_str = ToString(result);
2882 EXPECT_EQ(result_str, "64:ff9b::102:304");
2883
2884 hints.ai_family = AF_INET;
2885 result = safe_getaddrinfo("v4only", nullptr, &hints);
2886 EXPECT_TRUE(result != nullptr);
2887 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2888 result_str = ToString(result);
2889 EXPECT_EQ(result_str, "1.2.3.4");
2890}
nuccachena26cc2a2018-07-17 18:07:23 +08002891
2892TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedV6) {
2893 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002894 constexpr char dns64_name[] = "ipv4only.arpa.";
2895 constexpr char host_name[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002896 const std::vector<DnsRecord> records = {
2897 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2898 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2899 {host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
2900 };
nuccachena26cc2a2018-07-17 18:07:23 +08002901
Xiao Ma09b71022018-12-11 17:56:32 +09002902 test::DNSResponder dns(listen_addr);
2903 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002904 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002905 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002906
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002907 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002908 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002909 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002910
Xiao Ma09b71022018-12-11 17:56:32 +09002911 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08002912 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
2913 EXPECT_TRUE(result != nullptr);
2914 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2915
2916 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
Xiao Ma09b71022018-12-11 17:56:32 +09002917 const std::vector<std::string> result_strs = ToStrings(result);
nuccachena26cc2a2018-07-17 18:07:23 +08002918 for (const auto& str : result_strs) {
2919 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
2920 << ", result_str='" << str << "'";
2921 }
2922}
2923
2924TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedNoV6) {
2925 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002926 constexpr char dns64_name[] = "ipv4only.arpa.";
2927 constexpr char host_name[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002928 const std::vector<DnsRecord> records = {
2929 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2930 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2931 };
nuccachena26cc2a2018-07-17 18:07:23 +08002932
Xiao Ma09b71022018-12-11 17:56:32 +09002933 test::DNSResponder dns(listen_addr);
2934 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002935 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002936 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002937
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002938 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002939 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002940 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002941
Xiao Ma09b71022018-12-11 17:56:32 +09002942 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08002943 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
2944 EXPECT_TRUE(result != nullptr);
2945 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2946
2947 // In AF_UNSPEC case, synthesize AAAA if there's no AAAA answer.
2948 std::string result_str = ToString(result);
2949 EXPECT_EQ(result_str, "64:ff9b::102:304");
2950}
2951
2952TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecialUseIPv4Addresses) {
2953 constexpr char THIS_NETWORK[] = "this_network";
2954 constexpr char LOOPBACK[] = "loopback";
2955 constexpr char LINK_LOCAL[] = "link_local";
2956 constexpr char MULTICAST[] = "multicast";
2957 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
2958
2959 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
2960 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
2961 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
2962 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
2963 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
2964
2965 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002966 constexpr char dns64_name[] = "ipv4only.arpa.";
2967
Xiao Ma09b71022018-12-11 17:56:32 +09002968 test::DNSResponder dns(listen_addr);
2969 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08002970 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002971 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002972
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002973 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002974 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002975 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002976
Luke Huangf8215372019-11-22 11:53:41 +08002977 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08002978 static const struct TestConfig {
2979 std::string name;
2980 std::string addr;
2981
2982 std::string asHostName() const { return StringPrintf("%s.example.com.", name.c_str()); }
2983 } testConfigs[]{
2984 {THIS_NETWORK, ADDR_THIS_NETWORK},
2985 {LOOPBACK, ADDR_LOOPBACK},
2986 {LINK_LOCAL, ADDR_LINK_LOCAL},
2987 {MULTICAST, ADDR_MULTICAST},
2988 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
2989 };
Luke Huangf8215372019-11-22 11:53:41 +08002990 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08002991
2992 for (const auto& config : testConfigs) {
2993 const std::string testHostName = config.asHostName();
2994 SCOPED_TRACE(testHostName);
2995
2996 const char* host_name = testHostName.c_str();
2997 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
2998
2999 addrinfo hints;
3000 memset(&hints, 0, sizeof(hints));
3001 hints.ai_family = AF_INET6;
3002 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
3003 // In AF_INET6 case, don't return IPv4 answers
3004 EXPECT_TRUE(result == nullptr);
3005 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3006 dns.clearQueries();
3007
3008 memset(&hints, 0, sizeof(hints));
3009 hints.ai_family = AF_UNSPEC;
3010 result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
3011 EXPECT_TRUE(result != nullptr);
3012 // Expect IPv6 query only. IPv4 answer has been cached in previous query.
3013 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3014 // In AF_UNSPEC case, don't synthesize special use IPv4 address.
3015 std::string result_str = ToString(result);
3016 EXPECT_EQ(result_str, config.addr.c_str());
3017 dns.clearQueries();
3018 }
3019}
3020
3021TEST_F(ResolverTest, GetAddrInfo_Dns64QueryWithNullArgumentHints) {
3022 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003023 constexpr char dns64_name[] = "ipv4only.arpa.";
3024 constexpr char host_name[] = "v4only.example.com.";
3025 constexpr char host_name2[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003026 const std::vector<DnsRecord> records = {
3027 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3028 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3029 {host_name2, ns_type::ns_t_a, "1.2.3.4"},
3030 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
3031 };
nuccachena26cc2a2018-07-17 18:07:23 +08003032
Xiao Ma09b71022018-12-11 17:56:32 +09003033 test::DNSResponder dns(listen_addr);
3034 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003035 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003036 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003037
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003038 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003039 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003040 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003041
3042 // Assign argument hints of getaddrinfo() as null is equivalent to set ai_family AF_UNSPEC.
3043 // In AF_UNSPEC case, synthesize AAAA if there has A answer only.
3044 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, nullptr);
3045 EXPECT_TRUE(result != nullptr);
3046 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3047 std::string result_str = ToString(result);
3048 EXPECT_EQ(result_str, "64:ff9b::102:304");
3049 dns.clearQueries();
3050
3051 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
3052 result = safe_getaddrinfo("v4v6", nullptr, nullptr);
3053 EXPECT_TRUE(result != nullptr);
3054 EXPECT_LE(2U, GetNumQueries(dns, host_name2));
3055 std::vector<std::string> result_strs = ToStrings(result);
3056 for (const auto& str : result_strs) {
3057 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
3058 << ", result_str='" << str << "'";
3059 }
3060}
3061
3062TEST_F(ResolverTest, GetAddrInfo_Dns64QueryNullArgumentNode) {
3063 constexpr char ADDR_ANYADDR_V4[] = "0.0.0.0";
3064 constexpr char ADDR_ANYADDR_V6[] = "::";
3065 constexpr char ADDR_LOCALHOST_V4[] = "127.0.0.1";
3066 constexpr char ADDR_LOCALHOST_V6[] = "::1";
3067
3068 constexpr char PORT_NAME_HTTP[] = "http";
3069 constexpr char PORT_NUMBER_HTTP[] = "80";
3070
3071 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003072 constexpr char dns64_name[] = "ipv4only.arpa.";
3073
Xiao Ma09b71022018-12-11 17:56:32 +09003074 test::DNSResponder dns(listen_addr);
3075 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003076 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003077 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003078
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003079 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003080 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003081 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003082
Luke Huangf8215372019-11-22 11:53:41 +08003083 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003084 // If node is null, return address is listed by libc/getaddrinfo.c as follows.
3085 // - passive socket -> anyaddr (0.0.0.0 or ::)
3086 // - non-passive socket -> localhost (127.0.0.1 or ::1)
3087 static const struct TestConfig {
3088 int flag;
3089 std::string addr_v4;
3090 std::string addr_v6;
3091
3092 std::string asParameters() const {
3093 return StringPrintf("flag=%d, addr_v4=%s, addr_v6=%s", flag, addr_v4.c_str(),
3094 addr_v6.c_str());
3095 }
3096 } testConfigs[]{
3097 {0 /* non-passive */, ADDR_LOCALHOST_V4, ADDR_LOCALHOST_V6},
3098 {AI_PASSIVE, ADDR_ANYADDR_V4, ADDR_ANYADDR_V6}
3099 };
Luke Huangf8215372019-11-22 11:53:41 +08003100 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003101
3102 for (const auto& config : testConfigs) {
3103 SCOPED_TRACE(config.asParameters());
3104
Xiao Ma09b71022018-12-11 17:56:32 +09003105 addrinfo hints = {
Nick Desaulnierscd6395a2019-10-11 09:15:24 -07003106 .ai_flags = config.flag,
Xiao Ma09b71022018-12-11 17:56:32 +09003107 .ai_family = AF_UNSPEC, // any address family
3108 .ai_socktype = 0, // any type
3109 .ai_protocol = 0, // any protocol
Xiao Ma09b71022018-12-11 17:56:32 +09003110 };
nuccachena26cc2a2018-07-17 18:07:23 +08003111
3112 // Assign hostname as null and service as port name.
3113 ScopedAddrinfo result = safe_getaddrinfo(nullptr, PORT_NAME_HTTP, &hints);
3114 ASSERT_TRUE(result != nullptr);
3115
3116 // Can't be synthesized because it should not get into Netd.
3117 std::vector<std::string> result_strs = ToStrings(result);
3118 for (const auto& str : result_strs) {
3119 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
3120 << ", result_str='" << str << "'";
3121 }
3122
3123 // Assign hostname as null and service as numeric port number.
3124 hints.ai_flags = config.flag | AI_NUMERICSERV;
3125 result = safe_getaddrinfo(nullptr, PORT_NUMBER_HTTP, &hints);
3126 ASSERT_TRUE(result != nullptr);
3127
3128 // Can't be synthesized because it should not get into Netd.
3129 result_strs = ToStrings(result);
3130 for (const auto& str : result_strs) {
3131 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
3132 << ", result_str='" << str << "'";
3133 }
3134 }
3135}
3136
3137TEST_F(ResolverTest, GetHostByAddr_ReverseDnsQueryWithHavingNat64Prefix) {
3138 struct hostent* result = nullptr;
3139 struct in_addr v4addr;
3140 struct in6_addr v6addr;
3141
3142 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003143 constexpr char dns64_name[] = "ipv4only.arpa.";
3144 constexpr char ptr_name[] = "v4v6.example.com.";
3145 // PTR record for IPv4 address 1.2.3.4
3146 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3147 // PTR record for IPv6 address 2001:db8::102:304
3148 constexpr char ptr_addr_v6[] =
3149 "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 +09003150 const std::vector<DnsRecord> records = {
3151 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3152 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3153 {ptr_addr_v6, ns_type::ns_t_ptr, ptr_name},
3154 };
nuccachena26cc2a2018-07-17 18:07:23 +08003155
Xiao Ma09b71022018-12-11 17:56:32 +09003156 test::DNSResponder dns(listen_addr);
3157 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003158 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003159 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003160
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003161 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003162 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003163 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003164
3165 // Reverse IPv4 DNS query. Prefix should have no effect on it.
3166 inet_pton(AF_INET, "1.2.3.4", &v4addr);
3167 result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
3168 ASSERT_TRUE(result != nullptr);
3169 std::string result_str = result->h_name ? result->h_name : "null";
3170 EXPECT_EQ(result_str, "v4v6.example.com");
3171
3172 // Reverse IPv6 DNS query. Prefix should have no effect on it.
3173 inet_pton(AF_INET6, "2001:db8::102:304", &v6addr);
3174 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3175 ASSERT_TRUE(result != nullptr);
3176 result_str = result->h_name ? result->h_name : "null";
3177 EXPECT_EQ(result_str, "v4v6.example.com");
3178}
3179
3180TEST_F(ResolverTest, GetHostByAddr_ReverseDns64Query) {
3181 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003182 constexpr char dns64_name[] = "ipv4only.arpa.";
3183 constexpr char ptr_name[] = "v4only.example.com.";
3184 // PTR record for IPv4 address 1.2.3.4
3185 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3186 // PTR record for IPv6 address 64:ff9b::1.2.3.4
3187 constexpr char ptr_addr_v6_nomapping[] =
3188 "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.";
3189 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
3190 // PTR record for IPv6 address 64:ff9b::5.6.7.8
3191 constexpr char ptr_addr_v6_synthesis[] =
3192 "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 +09003193 const std::vector<DnsRecord> records = {
3194 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3195 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3196 {ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis},
3197 };
nuccachena26cc2a2018-07-17 18:07:23 +08003198
Xiao Ma09b71022018-12-11 17:56:32 +09003199 test::DNSResponder dns(listen_addr);
3200 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003201 // "ptr_addr_v6_nomapping" is not mapped in DNS server
nuccachena26cc2a2018-07-17 18:07:23 +08003202 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003203 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003204
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003205 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003206 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003207 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003208
3209 // Synthesized PTR record doesn't exist on DNS server
3210 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
3211 // After querying synthesized address failed, expect that prefix is removed from IPv6
3212 // synthesized address and do reverse IPv4 query instead.
3213 struct in6_addr v6addr;
3214 inet_pton(AF_INET6, "64:ff9b::1.2.3.4", &v6addr);
3215 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3216 ASSERT_TRUE(result != nullptr);
3217 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist
3218 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist
3219 std::string result_str = result->h_name ? result->h_name : "null";
3220 EXPECT_EQ(result_str, "v4only.example.com");
3221 // Check that return address has been mapped from IPv4 to IPv6 address because Netd
3222 // removes NAT64 prefix and does IPv4 DNS reverse lookup in this case. Then, Netd
3223 // fakes the return IPv4 address as original queried IPv6 address.
3224 result_str = ToString(result);
3225 EXPECT_EQ(result_str, "64:ff9b::102:304");
3226 dns.clearQueries();
3227
3228 // Synthesized PTR record exists on DNS server
3229 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
3230 // Expect to Netd pass through synthesized address for DNS queries.
3231 inet_pton(AF_INET6, "64:ff9b::5.6.7.8", &v6addr);
3232 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3233 ASSERT_TRUE(result != nullptr);
3234 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
3235 result_str = result->h_name ? result->h_name : "null";
3236 EXPECT_EQ(result_str, "v6synthesis.example.com");
3237}
3238
3239TEST_F(ResolverTest, GetHostByAddr_ReverseDns64QueryFromHostFile) {
3240 constexpr char dns64_name[] = "ipv4only.arpa.";
3241 constexpr char host_name[] = "localhost";
3242 // The address is synthesized by prefix64:localhost.
3243 constexpr char host_addr[] = "64:ff9b::7f00:1";
nuccachena26cc2a2018-07-17 18:07:23 +08003244 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003245
3246 test::DNSResponder dns(listen_addr);
3247 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003248 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003249 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003250
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003251 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003252 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003253 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003254
3255 // Using synthesized "localhost" address to be a trick for resolving host name
3256 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
3257 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
3258 struct in6_addr v6addr;
3259 inet_pton(AF_INET6, host_addr, &v6addr);
3260 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3261 ASSERT_TRUE(result != nullptr);
3262 // Expect no DNS queries; localhost is resolved via /etc/hosts.
3263 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
3264
Luke Huangf8215372019-11-22 11:53:41 +08003265 ASSERT_EQ(sizeof(in6_addr), (unsigned)result->h_length);
nuccachena26cc2a2018-07-17 18:07:23 +08003266 ASSERT_EQ(AF_INET6, result->h_addrtype);
3267 std::string result_str = ToString(result);
3268 EXPECT_EQ(result_str, host_addr);
3269 result_str = result->h_name ? result->h_name : "null";
3270 EXPECT_EQ(result_str, host_name);
3271}
3272
Hungming Chen9e6185a2019-06-04 16:09:19 +08003273TEST_F(ResolverTest, GetHostByAddr_cnamesClasslessReverseDelegation) {
3274 // IPv4 addresses in the subnet with notation '/' or '-'.
3275 constexpr char addr_slash[] = "192.0.2.1";
3276 constexpr char addr_hyphen[] = "192.0.3.1";
3277
3278 // Used to verify DNS reverse query for classless reverse lookup zone. See detail in RFC 2317
3279 // section 4.
3280 const static std::vector<DnsRecord> records = {
3281 // The records for reverse querying "192.0.2.1" in the subnet with notation '/'.
3282 {"1.2.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0/25.2.0.192.in-addr.arpa."},
3283 {"1.0/25.2.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3284
3285 // The records for reverse querying "192.0.3.1" in the subnet with notation '-'.
3286 {"1.3.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0-127.3.0.192.in-addr.arpa."},
3287 {"1.0-127.3.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3288 };
3289
3290 test::DNSResponder dns;
3291 StartDns(dns, records);
3292 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3293
3294 for (const auto& address : {addr_slash, addr_hyphen}) {
3295 SCOPED_TRACE(address);
3296
3297 in_addr v4addr;
3298 ASSERT_TRUE(inet_pton(AF_INET, address, &v4addr));
3299 hostent* result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
3300 ASSERT_TRUE(result != nullptr);
3301 EXPECT_STREQ("hello.example.com", result->h_name);
3302 }
3303}
3304
nuccachena26cc2a2018-07-17 18:07:23 +08003305TEST_F(ResolverTest, GetNameInfo_ReverseDnsQueryWithHavingNat64Prefix) {
3306 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003307 constexpr char dns64_name[] = "ipv4only.arpa.";
3308 constexpr char ptr_name[] = "v4v6.example.com.";
3309 // PTR record for IPv4 address 1.2.3.4
3310 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3311 // PTR record for IPv6 address 2001:db8::102:304
3312 constexpr char ptr_addr_v6[] =
3313 "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 +09003314 const std::vector<DnsRecord> records = {
3315 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3316 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3317 {ptr_addr_v6, ns_type::ns_t_ptr, ptr_name},
3318 };
nuccachena26cc2a2018-07-17 18:07:23 +08003319
Xiao Ma09b71022018-12-11 17:56:32 +09003320 test::DNSResponder dns(listen_addr);
3321 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003322 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003323 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003324
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003325 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003326 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003327 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003328
Luke Huangf8215372019-11-22 11:53:41 +08003329 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003330 static const struct TestConfig {
3331 int flag;
3332 int family;
3333 std::string addr;
3334 std::string host;
3335
3336 std::string asParameters() const {
3337 return StringPrintf("flag=%d, family=%d, addr=%s, host=%s", flag, family, addr.c_str(),
3338 host.c_str());
3339 }
3340 } testConfigs[]{
3341 {NI_NAMEREQD, AF_INET, "1.2.3.4", "v4v6.example.com"},
3342 {NI_NUMERICHOST, AF_INET, "1.2.3.4", "1.2.3.4"},
3343 {0, AF_INET, "1.2.3.4", "v4v6.example.com"},
3344 {0, AF_INET, "5.6.7.8", "5.6.7.8"}, // unmapped
3345 {NI_NAMEREQD, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
3346 {NI_NUMERICHOST, AF_INET6, "2001:db8::102:304", "2001:db8::102:304"},
3347 {0, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
3348 {0, AF_INET6, "2001:db8::506:708", "2001:db8::506:708"}, // unmapped
3349 };
Luke Huangf8215372019-11-22 11:53:41 +08003350 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003351
3352 // Reverse IPv4/IPv6 DNS query. Prefix should have no effect on it.
3353 for (const auto& config : testConfigs) {
3354 SCOPED_TRACE(config.asParameters());
3355
3356 int rv;
3357 char host[NI_MAXHOST];
3358 struct sockaddr_in sin;
3359 struct sockaddr_in6 sin6;
3360 if (config.family == AF_INET) {
3361 memset(&sin, 0, sizeof(sin));
3362 sin.sin_family = AF_INET;
3363 inet_pton(AF_INET, config.addr.c_str(), &sin.sin_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003364 rv = getnameinfo((const struct sockaddr*)&sin, sizeof(sin), host, sizeof(host), nullptr,
3365 0, config.flag);
nuccachena26cc2a2018-07-17 18:07:23 +08003366 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4));
3367 } else if (config.family == AF_INET6) {
3368 memset(&sin6, 0, sizeof(sin6));
3369 sin6.sin6_family = AF_INET6;
3370 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003371 rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host),
nuccachena26cc2a2018-07-17 18:07:23 +08003372 nullptr, 0, config.flag);
3373 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6));
3374 }
3375 ASSERT_EQ(0, rv);
3376 std::string result_str = host;
3377 EXPECT_EQ(result_str, config.host);
3378 dns.clearQueries();
3379 }
3380}
3381
3382TEST_F(ResolverTest, GetNameInfo_ReverseDns64Query) {
3383 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003384 constexpr char dns64_name[] = "ipv4only.arpa.";
3385 constexpr char ptr_name[] = "v4only.example.com.";
3386 // PTR record for IPv4 address 1.2.3.4
3387 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3388 // PTR record for IPv6 address 64:ff9b::1.2.3.4
3389 constexpr char ptr_addr_v6_nomapping[] =
3390 "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.";
3391 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
3392 // PTR record for IPv6 address 64:ff9b::5.6.7.8
3393 constexpr char ptr_addr_v6_synthesis[] =
3394 "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 +09003395 const std::vector<DnsRecord> records = {
3396 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3397 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3398 {ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis},
3399 };
nuccachena26cc2a2018-07-17 18:07:23 +08003400
Xiao Ma09b71022018-12-11 17:56:32 +09003401 test::DNSResponder dns(listen_addr);
3402 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003403 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003404 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003405
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003406 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003407 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003408 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003409
Luke Huangf8215372019-11-22 11:53:41 +08003410 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003411 static const struct TestConfig {
3412 bool hasSynthesizedPtrRecord;
3413 int flag;
3414 std::string addr;
3415 std::string host;
3416
3417 std::string asParameters() const {
3418 return StringPrintf("hasSynthesizedPtrRecord=%d, flag=%d, addr=%s, host=%s",
3419 hasSynthesizedPtrRecord, flag, addr.c_str(), host.c_str());
3420 }
3421 } testConfigs[]{
3422 {false, NI_NAMEREQD, "64:ff9b::102:304", "v4only.example.com"},
3423 {false, NI_NUMERICHOST, "64:ff9b::102:304", "64:ff9b::102:304"},
3424 {false, 0, "64:ff9b::102:304", "v4only.example.com"},
3425 {true, NI_NAMEREQD, "64:ff9b::506:708", "v6synthesis.example.com"},
3426 {true, NI_NUMERICHOST, "64:ff9b::506:708", "64:ff9b::506:708"},
3427 {true, 0, "64:ff9b::506:708", "v6synthesis.example.com"}
3428 };
Luke Huangf8215372019-11-22 11:53:41 +08003429 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003430
3431 // hasSynthesizedPtrRecord = false
3432 // Synthesized PTR record doesn't exist on DNS server
3433 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
3434 // After querying synthesized address failed, expect that prefix is removed from IPv6
3435 // synthesized address and do reverse IPv4 query instead.
3436 //
3437 // hasSynthesizedPtrRecord = true
3438 // Synthesized PTR record exists on DNS server
3439 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
3440 // Expect to just pass through synthesized address for DNS queries.
3441 for (const auto& config : testConfigs) {
3442 SCOPED_TRACE(config.asParameters());
3443
3444 char host[NI_MAXHOST];
3445 struct sockaddr_in6 sin6;
3446 memset(&sin6, 0, sizeof(sin6));
3447 sin6.sin6_family = AF_INET6;
3448 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003449 int rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host),
nuccachena26cc2a2018-07-17 18:07:23 +08003450 nullptr, 0, config.flag);
3451 ASSERT_EQ(0, rv);
3452 if (config.flag == NI_NAMEREQD) {
3453 if (config.hasSynthesizedPtrRecord) {
3454 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
3455 } else {
3456 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist.
3457 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist.
3458 }
3459 }
3460 std::string result_str = host;
3461 EXPECT_EQ(result_str, config.host);
3462 dns.clearQueries();
3463 }
3464}
3465
3466TEST_F(ResolverTest, GetNameInfo_ReverseDns64QueryFromHostFile) {
3467 constexpr char dns64_name[] = "ipv4only.arpa.";
3468 constexpr char host_name[] = "localhost";
3469 // The address is synthesized by prefix64:localhost.
3470 constexpr char host_addr[] = "64:ff9b::7f00:1";
nuccachena26cc2a2018-07-17 18:07:23 +08003471 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003472
3473 test::DNSResponder dns(listen_addr);
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003474
Xiao Ma09b71022018-12-11 17:56:32 +09003475 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003476 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003477 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003478
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003479 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003480 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003481 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003482
3483 // Using synthesized "localhost" address to be a trick for resolving host name
3484 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
3485 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
3486 char host[NI_MAXHOST];
Xiao Ma09b71022018-12-11 17:56:32 +09003487 struct sockaddr_in6 sin6 = {.sin6_family = AF_INET6};
nuccachena26cc2a2018-07-17 18:07:23 +08003488 inet_pton(AF_INET6, host_addr, &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003489 int rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host), nullptr,
nuccachena26cc2a2018-07-17 18:07:23 +08003490 0, NI_NAMEREQD);
3491 ASSERT_EQ(0, rv);
3492 // Expect no DNS queries; localhost is resolved via /etc/hosts.
3493 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
3494
3495 std::string result_str = host;
3496 EXPECT_EQ(result_str, host_name);
3497}
3498
Hungming Chen9e6185a2019-06-04 16:09:19 +08003499TEST_F(ResolverTest, GetNameInfo_cnamesClasslessReverseDelegation) {
3500 // IPv4 addresses in the subnet with notation '/' or '-'.
3501 constexpr char addr_slash[] = "192.0.2.1";
3502 constexpr char addr_hyphen[] = "192.0.3.1";
3503
3504 // Used to verify DNS reverse query for classless reverse lookup zone. See detail in RFC 2317
3505 // section 4.
3506 const static std::vector<DnsRecord> records = {
3507 // The records for reverse querying "192.0.2.1" in the subnet with notation '/'.
3508 {"1.2.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0/25.2.0.192.in-addr.arpa."},
3509 {"1.0/25.2.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3510
3511 // The records for reverse querying "192.0.3.1" in the subnet with notation '-'.
3512 {"1.3.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0-127.3.0.192.in-addr.arpa."},
3513 {"1.0-127.3.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3514 };
3515
3516 test::DNSResponder dns;
3517 StartDns(dns, records);
3518 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3519
3520 for (const auto& address : {addr_slash, addr_hyphen}) {
3521 SCOPED_TRACE(address);
3522
3523 char host[NI_MAXHOST];
3524 sockaddr_in sin = {.sin_family = AF_INET};
3525 ASSERT_TRUE(inet_pton(AF_INET, address, &sin.sin_addr));
3526 int rv = getnameinfo((const sockaddr*)&sin, sizeof(sin), host, sizeof(host), nullptr, 0,
3527 NI_NAMEREQD);
3528 ASSERT_EQ(0, rv);
3529 EXPECT_STREQ("hello.example.com", host);
3530 }
3531}
3532
nuccachena26cc2a2018-07-17 18:07:23 +08003533TEST_F(ResolverTest, GetHostByName2_Dns64Synthesize) {
Xiao Ma09b71022018-12-11 17:56:32 +09003534 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003535 constexpr char dns64_name[] = "ipv4only.arpa.";
3536 constexpr char host_name[] = "ipv4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003537 const std::vector<DnsRecord> records = {
3538 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3539 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3540 };
nuccachena26cc2a2018-07-17 18:07:23 +08003541
Xiao Ma09b71022018-12-11 17:56:32 +09003542 test::DNSResponder dns(listen_addr);
3543 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003544 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003545 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003546
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003547 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003548 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003549 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003550
3551 // Query an IPv4-only hostname. Expect that gets a synthesized address.
3552 struct hostent* result = gethostbyname2("ipv4only", AF_INET6);
3553 ASSERT_TRUE(result != nullptr);
3554 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3555 std::string result_str = ToString(result);
3556 EXPECT_EQ(result_str, "64:ff9b::102:304");
3557}
nuccachena26cc2a2018-07-17 18:07:23 +08003558
3559TEST_F(ResolverTest, GetHostByName2_DnsQueryWithHavingNat64Prefix) {
3560 constexpr char dns64_name[] = "ipv4only.arpa.";
3561 constexpr char host_name[] = "v4v6.example.com.";
nuccachena26cc2a2018-07-17 18:07:23 +08003562 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003563 const std::vector<DnsRecord> records = {
3564 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3565 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3566 {host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
3567 };
3568
3569 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 // IPv4 DNS query. Prefix should have no effect on it.
3579 struct hostent* result = gethostbyname2("v4v6", AF_INET);
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, "1.2.3.4");
3584 dns.clearQueries();
3585
3586 // IPv6 DNS query. Prefix should have no effect on it.
3587 result = gethostbyname2("v4v6", AF_INET6);
3588 ASSERT_TRUE(result != nullptr);
3589 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3590 result_str = ToString(result);
3591 EXPECT_EQ(result_str, "2001:db8::102:304");
3592}
3593
3594TEST_F(ResolverTest, GetHostByName2_Dns64QuerySpecialUseIPv4Addresses) {
3595 constexpr char THIS_NETWORK[] = "this_network";
3596 constexpr char LOOPBACK[] = "loopback";
3597 constexpr char LINK_LOCAL[] = "link_local";
3598 constexpr char MULTICAST[] = "multicast";
3599 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
3600
3601 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
3602 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
3603 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
3604 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
3605 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
3606
3607 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003608 constexpr char dns64_name[] = "ipv4only.arpa.";
3609
Xiao Ma09b71022018-12-11 17:56:32 +09003610 test::DNSResponder dns(listen_addr);
3611 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003612 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003613 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003614
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003615 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003616 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003617 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003618
Luke Huangf8215372019-11-22 11:53:41 +08003619 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003620 static const struct TestConfig {
3621 std::string name;
3622 std::string addr;
3623
3624 std::string asHostName() const {
Luke Huangf8215372019-11-22 11:53:41 +08003625 return StringPrintf("%s.example.com.", name.c_str());
nuccachena26cc2a2018-07-17 18:07:23 +08003626 }
3627 } testConfigs[]{
3628 {THIS_NETWORK, ADDR_THIS_NETWORK},
3629 {LOOPBACK, ADDR_LOOPBACK},
3630 {LINK_LOCAL, ADDR_LINK_LOCAL},
3631 {MULTICAST, ADDR_MULTICAST},
3632 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
3633 };
Luke Huangf8215372019-11-22 11:53:41 +08003634 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003635
3636 for (const auto& config : testConfigs) {
3637 const std::string testHostName = config.asHostName();
3638 SCOPED_TRACE(testHostName);
3639
3640 const char* host_name = testHostName.c_str();
3641 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
3642
3643 struct hostent* result = gethostbyname2(config.name.c_str(), AF_INET6);
3644 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3645
3646 // In AF_INET6 case, don't synthesize special use IPv4 address.
3647 // Expect to have no answer
3648 EXPECT_EQ(nullptr, result);
3649
3650 dns.clearQueries();
3651 }
Bernie Innocenti2fef2b82018-12-20 15:56:40 +09003652}
Mike Yuf14e1a92019-05-10 13:54:58 +08003653
3654TEST_F(ResolverTest, PrefixDiscoveryBypassTls) {
3655 constexpr char listen_addr[] = "::1";
3656 constexpr char cleartext_port[] = "53";
3657 constexpr char tls_port[] = "853";
3658 constexpr char dns64_name[] = "ipv4only.arpa.";
3659 const std::vector<std::string> servers = {listen_addr};
3660
3661 test::DNSResponder dns(listen_addr);
3662 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
3663 test::DnsTlsFrontend tls(listen_addr, tls_port, listen_addr, cleartext_port);
3664 ASSERT_TRUE(tls.startServer());
3665
3666 // Setup OPPORTUNISTIC mode and wait for the validation complete.
waynema0e73c2e2019-07-31 15:04:08 +08003667 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08003668 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003669 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yuf14e1a92019-05-10 13:54:58 +08003670 tls.clearQueries();
3671
3672 // Start NAT64 prefix discovery and wait for it complete.
3673 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003674 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
Mike Yuf14e1a92019-05-10 13:54:58 +08003675
3676 // Verify it bypassed TLS even though there's a TLS server available.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003677 EXPECT_EQ(0, tls.queries()) << dns.dumpQueries();
3678 EXPECT_EQ(1U, GetNumQueries(dns, dns64_name)) << dns.dumpQueries();
Mike Yuf14e1a92019-05-10 13:54:58 +08003679
3680 // Restart the testing network to reset the cache.
3681 mDnsClient.TearDown();
3682 mDnsClient.SetUp();
3683 dns.clearQueries();
3684
3685 // Setup STRICT mode and wait for the validation complete.
waynema0e73c2e2019-07-31 15:04:08 +08003686 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
3687 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08003688 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003689 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yuf14e1a92019-05-10 13:54:58 +08003690 tls.clearQueries();
3691
3692 // Start NAT64 prefix discovery and wait for it to complete.
3693 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003694 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
Mike Yuf14e1a92019-05-10 13:54:58 +08003695
3696 // Verify it bypassed TLS despite STRICT mode.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003697 EXPECT_EQ(0, tls.queries()) << dns.dumpQueries();
3698 EXPECT_EQ(1U, GetNumQueries(dns, dns64_name)) << dns.dumpQueries();
Mike Yuf14e1a92019-05-10 13:54:58 +08003699}
Luke Huang9807e6b2019-05-20 16:17:12 +08003700
Lorenzo Colitti346737c2020-05-21 13:56:22 +00003701TEST_F(ResolverTest, SetAndClearNat64Prefix) {
3702 constexpr char host_name[] = "v4.example.com.";
3703 constexpr char listen_addr[] = "::1";
3704 const std::vector<DnsRecord> records = {
3705 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3706 };
3707 const std::string kNat64Prefix1 = "64:ff9b::/96";
3708 const std::string kNat64Prefix2 = "2001:db8:6464::/96";
3709
3710 test::DNSResponder dns(listen_addr);
3711 StartDns(dns, records);
3712 const std::vector<std::string> servers = {listen_addr};
3713 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
3714
3715 auto resolvService = mDnsClient.resolvService();
3716 addrinfo hints = {.ai_family = AF_INET6};
3717
3718 // No NAT64 prefix, no AAAA record.
3719 ScopedAddrinfo result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3720 ASSERT_TRUE(result == nullptr);
3721
3722 // Set the prefix, and expect to get a synthesized AAAA record.
3723 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix2).isOk());
3724 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3725 ASSERT_FALSE(result == nullptr);
3726 EXPECT_EQ("2001:db8:6464::102:304", ToString(result));
3727
3728 // Update the prefix, expect to see AAAA records from the new prefix.
3729 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3730 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3731 ASSERT_FALSE(result == nullptr);
3732 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3733
3734 // Non-/96 prefixes are ignored.
3735 auto status = resolvService->setPrefix64(TEST_NETID, "64:ff9b::/64");
3736 EXPECT_FALSE(status.isOk());
3737 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3738 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3739
3740 // Invalid prefixes are ignored.
3741 status = resolvService->setPrefix64(TEST_NETID, "192.0.2.0/24");
3742 EXPECT_FALSE(status.isOk());
3743 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3744 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3745
3746 status = resolvService->setPrefix64(TEST_NETID, "192.0.2.1");
3747 EXPECT_FALSE(status.isOk());
3748 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3749 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3750
3751 status = resolvService->setPrefix64(TEST_NETID, "hello");
3752 EXPECT_FALSE(status.isOk());
3753 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3754 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3755
3756 // DNS64 synthesis is still working.
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 // Clear the prefix. No AAAA records any more.
3762 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, "").isOk());
3763 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3764 EXPECT_TRUE(result == nullptr);
3765
3766 // Calling startPrefix64Discovery clears the prefix.
3767 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3768 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3769 ASSERT_FALSE(result == nullptr);
3770 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3771
3772 EXPECT_TRUE(resolvService->startPrefix64Discovery(TEST_NETID).isOk());
3773 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3774 ASSERT_TRUE(result == nullptr);
3775
3776 // setPrefix64 fails if prefix discovery is started, even if no prefix is yet discovered...
3777 status = resolvService->setPrefix64(TEST_NETID, kNat64Prefix1);
3778 EXPECT_FALSE(status.isOk());
3779 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3780 EXPECT_EQ(EEXIST, status.getServiceSpecificError());
3781
3782 // .. and clearing the prefix also has no effect.
3783 status = resolvService->setPrefix64(TEST_NETID, "");
3784 EXPECT_FALSE(status.isOk());
3785 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3786 EXPECT_EQ(ENOENT, status.getServiceSpecificError());
3787
3788 // setPrefix64 succeeds again when prefix discovery is stopped.
3789 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
3790 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3791 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3792 ASSERT_FALSE(result == nullptr);
3793 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3794
3795 // Calling stopPrefix64Discovery clears the prefix.
3796 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
3797 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3798 ASSERT_TRUE(result == nullptr);
3799
3800 // Set up NAT64 prefix discovery.
3801 constexpr char dns64_name[] = "ipv4only.arpa.";
3802 const std::vector<DnsRecord> newRecords = {
3803 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3804 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3805 };
3806 dns.stopServer();
3807 StartDns(dns, newRecords);
3808
3809 EXPECT_TRUE(resolvService->startPrefix64Discovery(TEST_NETID).isOk());
3810 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
3811 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3812 ASSERT_FALSE(result == nullptr);
3813 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3814
3815 // setPrefix64 fails if NAT64 prefix discovery has succeeded, and the discovered prefix
3816 // continues to be used.
3817 status = resolvService->setPrefix64(TEST_NETID, kNat64Prefix2);
3818 EXPECT_FALSE(status.isOk());
3819 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3820 EXPECT_EQ(EEXIST, status.getServiceSpecificError());
3821
3822 // Clearing the prefix also has no effect if discovery is started.
3823 status = resolvService->setPrefix64(TEST_NETID, "");
3824 EXPECT_FALSE(status.isOk());
3825 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3826 EXPECT_EQ(ENOENT, status.getServiceSpecificError());
3827
3828 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3829 ASSERT_FALSE(result == nullptr);
3830 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3831
3832 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
3833 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_NOT_FOUND));
Lorenzo Colitti5be8bf22020-05-26 10:55:21 +00003834
3835 EXPECT_EQ(0, sDnsMetricsListener->getUnexpectedNat64PrefixUpdates());
Lorenzo Colitti346737c2020-05-21 13:56:22 +00003836}
3837
Luke Huang9807e6b2019-05-20 16:17:12 +08003838namespace {
3839
Luke Huang0d592bc2019-05-25 18:24:03 +08003840class ScopedSetNetworkForProcess {
3841 public:
3842 explicit ScopedSetNetworkForProcess(unsigned netId) {
3843 mStoredNetId = getNetworkForProcess();
3844 if (netId == mStoredNetId) return;
3845 EXPECT_EQ(0, setNetworkForProcess(netId));
3846 }
3847 ~ScopedSetNetworkForProcess() { EXPECT_EQ(0, setNetworkForProcess(mStoredNetId)); }
3848
3849 private:
3850 unsigned mStoredNetId;
3851};
3852
3853class ScopedSetNetworkForResolv {
3854 public:
3855 explicit ScopedSetNetworkForResolv(unsigned netId) { EXPECT_EQ(0, setNetworkForResolv(netId)); }
3856 ~ScopedSetNetworkForResolv() { EXPECT_EQ(0, setNetworkForResolv(NETID_UNSET)); }
3857};
3858
Luke Huang9807e6b2019-05-20 16:17:12 +08003859void sendCommand(int fd, const std::string& cmd) {
3860 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size() + 1));
3861 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size() + 1));
3862}
3863
3864int32_t readBE32(int fd) {
3865 int32_t tmp;
3866 int n = TEMP_FAILURE_RETRY(read(fd, &tmp, sizeof(tmp)));
3867 EXPECT_TRUE(n > 0);
3868 return ntohl(tmp);
3869}
3870
Luke Huang0d592bc2019-05-25 18:24:03 +08003871int readResponseCode(int fd) {
Luke Huang9807e6b2019-05-20 16:17:12 +08003872 char buf[4];
3873 int n = TEMP_FAILURE_RETRY(read(fd, &buf, sizeof(buf)));
3874 EXPECT_TRUE(n > 0);
3875 // The format of response code is that 4 bytes for the code & null.
3876 buf[3] = '\0';
3877 int result;
3878 EXPECT_TRUE(ParseInt(buf, &result));
3879 return result;
3880}
3881
Luke Huang0d592bc2019-05-25 18:24:03 +08003882bool checkAndClearUseLocalNameserversFlag(unsigned* netid) {
3883 if (netid == nullptr || ((*netid) & NETID_USE_LOCAL_NAMESERVERS) == 0) {
3884 return false;
3885 }
3886 *netid = (*netid) & ~NETID_USE_LOCAL_NAMESERVERS;
3887 return true;
3888}
3889
Luke Huangf8215372019-11-22 11:53:41 +08003890aidl::android::net::UidRangeParcel makeUidRangeParcel(int start, int stop) {
3891 aidl::android::net::UidRangeParcel res;
Luke Huang0d592bc2019-05-25 18:24:03 +08003892 res.start = start;
3893 res.stop = stop;
3894
3895 return res;
3896}
3897
3898void expectNetIdWithLocalNameserversFlag(unsigned netId) {
3899 unsigned dnsNetId = 0;
3900 EXPECT_EQ(0, getNetworkForDns(&dnsNetId));
3901 EXPECT_TRUE(checkAndClearUseLocalNameserversFlag(&dnsNetId));
3902 EXPECT_EQ(netId, static_cast<unsigned>(dnsNetId));
3903}
3904
3905void expectDnsNetIdEquals(unsigned netId) {
3906 unsigned dnsNetId = 0;
3907 EXPECT_EQ(0, getNetworkForDns(&dnsNetId));
3908 EXPECT_EQ(netId, static_cast<unsigned>(dnsNetId));
3909}
3910
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003911void expectDnsNetIdIsDefaultNetwork(INetd* netdService) {
Luke Huang0d592bc2019-05-25 18:24:03 +08003912 int currentNetid;
3913 EXPECT_TRUE(netdService->networkGetDefault(&currentNetid).isOk());
3914 expectDnsNetIdEquals(currentNetid);
3915}
3916
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003917void expectDnsNetIdWithVpn(INetd* netdService, unsigned vpnNetId, unsigned expectedNetId) {
Luke Huang0d592bc2019-05-25 18:24:03 +08003918 EXPECT_TRUE(netdService->networkCreateVpn(vpnNetId, false /* secure */).isOk());
3919 uid_t uid = getuid();
3920 // Add uid to VPN
3921 EXPECT_TRUE(netdService->networkAddUidRanges(vpnNetId, {makeUidRangeParcel(uid, uid)}).isOk());
3922 expectDnsNetIdEquals(expectedNetId);
3923 EXPECT_TRUE(netdService->networkDestroy(vpnNetId).isOk());
3924}
3925
Luke Huang9807e6b2019-05-20 16:17:12 +08003926} // namespace
3927
3928TEST_F(ResolverTest, getDnsNetId) {
3929 // We've called setNetworkForProcess in SetupOemNetwork, so reset to default first.
3930 setNetworkForProcess(NETID_UNSET);
Luke Huang0d592bc2019-05-25 18:24:03 +08003931
3932 expectDnsNetIdIsDefaultNetwork(mDnsClient.netdService());
3933 expectDnsNetIdWithVpn(mDnsClient.netdService(), TEST_VPN_NETID, TEST_VPN_NETID);
Luke Huang9807e6b2019-05-20 16:17:12 +08003934
3935 // Test with setNetworkForProcess
Luke Huang0d592bc2019-05-25 18:24:03 +08003936 {
3937 ScopedSetNetworkForProcess scopedSetNetworkForProcess(TEST_NETID);
3938 expectDnsNetIdEquals(TEST_NETID);
3939 }
3940
3941 // Test with setNetworkForProcess with NETID_USE_LOCAL_NAMESERVERS
3942 {
3943 ScopedSetNetworkForProcess scopedSetNetworkForProcess(TEST_NETID |
3944 NETID_USE_LOCAL_NAMESERVERS);
3945 expectNetIdWithLocalNameserversFlag(TEST_NETID);
3946 }
Luke Huang9807e6b2019-05-20 16:17:12 +08003947
3948 // Test with setNetworkForResolv
Luke Huang0d592bc2019-05-25 18:24:03 +08003949 {
3950 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID);
3951 expectDnsNetIdEquals(TEST_NETID);
3952 }
3953
3954 // Test with setNetworkForResolv with NETID_USE_LOCAL_NAMESERVERS
3955 {
3956 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID |
3957 NETID_USE_LOCAL_NAMESERVERS);
3958 expectNetIdWithLocalNameserversFlag(TEST_NETID);
3959 }
3960
3961 // Test with setNetworkForResolv under bypassable vpn
3962 {
3963 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID);
3964 expectDnsNetIdWithVpn(mDnsClient.netdService(), TEST_VPN_NETID, TEST_NETID);
3965 }
Luke Huang9807e6b2019-05-20 16:17:12 +08003966
3967 // Create socket connected to DnsProxyListener
3968 int fd = dns_open_proxy();
3969 EXPECT_TRUE(fd > 0);
3970 unique_fd ufd(fd);
3971
3972 // Test command with wrong netId
3973 sendCommand(fd, "getdnsnetid abc");
Luke Huang0d592bc2019-05-25 18:24:03 +08003974 EXPECT_EQ(ResponseCode::DnsProxyQueryResult, readResponseCode(fd));
Luke Huang9807e6b2019-05-20 16:17:12 +08003975 EXPECT_EQ(-EINVAL, readBE32(fd));
3976
3977 // Test unsupported command
3978 sendCommand(fd, "getdnsnetidNotSupported");
3979 // Keep in sync with FrameworkListener.cpp (500, "Command not recognized")
Luke Huang0d592bc2019-05-25 18:24:03 +08003980 EXPECT_EQ(500, readResponseCode(fd));
Luke Huang9807e6b2019-05-20 16:17:12 +08003981}
Sehee Park2c118782019-05-07 13:02:45 +09003982
3983TEST_F(ResolverTest, BlockDnsQueryWithUidRule) {
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003984 // This test relies on blocking traffic on loopback, which xt_qtaguid does not do.
3985 // See aosp/358413 and b/34444781 for why.
3986 SKIP_IF_BPF_NOT_SUPPORTED;
3987
Sehee Park2c118782019-05-07 13:02:45 +09003988 constexpr char listen_addr1[] = "127.0.0.4";
3989 constexpr char listen_addr2[] = "::1";
3990 constexpr char host_name[] = "howdy.example.com.";
3991 const std::vector<DnsRecord> records = {
3992 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3993 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
3994 };
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003995 INetd* netdService = mDnsClient.netdService();
Sehee Park2c118782019-05-07 13:02:45 +09003996
3997 test::DNSResponder dns1(listen_addr1);
3998 test::DNSResponder dns2(listen_addr2);
3999 StartDns(dns1, records);
4000 StartDns(dns2, records);
4001
4002 std::vector<std::string> servers = {listen_addr1, listen_addr2};
4003 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
4004 dns1.clearQueries();
4005 dns2.clearQueries();
4006
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004007 // Add drop rule for TEST_UID. Also enable the standby chain because it might not be enabled.
4008 // Unfortunately we cannot use FIREWALL_CHAIN_NONE, or custom iptables rules, for this purpose
4009 // because netd calls fchown() on the DNS query sockets, and "iptables -m owner" matches the
4010 // UID of the socket creator, not the UID set by fchown().
4011 //
4012 // TODO: migrate FIREWALL_CHAIN_NONE to eBPF as well.
4013 EXPECT_TRUE(netdService->firewallEnableChildChain(INetd::FIREWALL_CHAIN_STANDBY, true).isOk());
4014 EXPECT_TRUE(netdService
Sehee Park2c118782019-05-07 13:02:45 +09004015 ->firewallSetUidRule(INetd::FIREWALL_CHAIN_STANDBY, TEST_UID,
4016 INetd::FIREWALL_RULE_DENY)
4017 .isOk());
4018
4019 // Save uid
4020 int suid = getuid();
4021
4022 // Switch to TEST_UID
4023 EXPECT_TRUE(seteuid(TEST_UID) == 0);
4024
4025 // Dns Query
4026 int fd1 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_a, 0);
4027 int fd2 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_aaaa, 0);
4028 EXPECT_TRUE(fd1 != -1);
4029 EXPECT_TRUE(fd2 != -1);
4030
4031 uint8_t buf[MAXPACKET] = {};
4032 int rcode;
4033 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
4034 EXPECT_EQ(-ECONNREFUSED, res);
4035
4036 memset(buf, 0, MAXPACKET);
4037 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
4038 EXPECT_EQ(-ECONNREFUSED, res);
4039
4040 // Restore uid
4041 EXPECT_TRUE(seteuid(suid) == 0);
4042
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004043 // Remove drop rule for TEST_UID, and disable the standby chain.
4044 EXPECT_TRUE(netdService
Sehee Park2c118782019-05-07 13:02:45 +09004045 ->firewallSetUidRule(INetd::FIREWALL_CHAIN_STANDBY, TEST_UID,
4046 INetd::FIREWALL_RULE_ALLOW)
4047 .isOk());
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004048 EXPECT_TRUE(netdService->firewallEnableChildChain(INetd::FIREWALL_CHAIN_STANDBY, false).isOk());
Sehee Park2c118782019-05-07 13:02:45 +09004049}
Mike Yua772c202019-09-23 17:47:21 +08004050
Mike Yu40e67072019-10-09 21:14:09 +08004051namespace {
4052
4053const std::string kDotConnectTimeoutMsFlag(
4054 "persist.device_config.netd_native.dot_connect_timeout_ms");
4055
4056class ScopedSystemProperties {
4057 public:
4058 explicit ScopedSystemProperties(const std::string& key, const std::string& value)
4059 : mStoredKey(key) {
4060 mStoredValue = android::base::GetProperty(key, "");
4061 android::base::SetProperty(key, value);
4062 }
4063 ~ScopedSystemProperties() { android::base::SetProperty(mStoredKey, mStoredValue); }
4064
4065 private:
4066 std::string mStoredKey;
4067 std::string mStoredValue;
4068};
4069
4070} // namespace
4071
Mike Yua772c202019-09-23 17:47:21 +08004072TEST_F(ResolverTest, ConnectTlsServerTimeout) {
Mike Yu40e67072019-10-09 21:14:09 +08004073 constexpr int expectedTimeout = 1000;
4074 constexpr char hostname1[] = "query1.example.com.";
4075 constexpr char hostname2[] = "query2.example.com.";
Mike Yua772c202019-09-23 17:47:21 +08004076 const std::vector<DnsRecord> records = {
Mike Yu40e67072019-10-09 21:14:09 +08004077 {hostname1, ns_type::ns_t_a, "1.2.3.4"},
4078 {hostname2, ns_type::ns_t_a, "1.2.3.5"},
Mike Yua772c202019-09-23 17:47:21 +08004079 };
4080
4081 test::DNSResponder dns;
4082 StartDns(dns, records);
Mike Yu40e67072019-10-09 21:14:09 +08004083 test::DnsTlsFrontend tls;
Mike Yua772c202019-09-23 17:47:21 +08004084 ASSERT_TRUE(tls.startServer());
4085
Mike Yu40e67072019-10-09 21:14:09 +08004086 // The resolver will adjust the timeout value to 1000ms since the value is too small.
4087 ScopedSystemProperties scopedSystemProperties(kDotConnectTimeoutMsFlag, "100");
Mike Yua772c202019-09-23 17:47:21 +08004088
Mike Yu40e67072019-10-09 21:14:09 +08004089 // Set up resolver to opportunistic mode with the default configuration.
Mike Yu8ac63402019-12-02 15:28:38 +08004090 const ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
Mike Yu40e67072019-10-09 21:14:09 +08004091 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
Mike Yua772c202019-09-23 17:47:21 +08004092 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09004093 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yua772c202019-09-23 17:47:21 +08004094 tls.clearQueries();
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09004095 dns.clearQueries();
Mike Yua772c202019-09-23 17:47:21 +08004096
4097 // The server becomes unresponsive to the handshake request.
4098 tls.setHangOnHandshakeForTesting(true);
4099
4100 // Expect the things happening in getaddrinfo():
4101 // 1. Connect to the private DNS server.
4102 // 2. SSL handshake times out.
4103 // 3. Fallback to UDP transport, and then get the answer.
Mike Yu40e67072019-10-09 21:14:09 +08004104 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4105 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(hostname1, nullptr, hints);
Mike Yua772c202019-09-23 17:47:21 +08004106
Mike Yu40e67072019-10-09 21:14:09 +08004107 EXPECT_NE(nullptr, result);
Mike Yua772c202019-09-23 17:47:21 +08004108 EXPECT_EQ(0, tls.queries());
Mike Yu40e67072019-10-09 21:14:09 +08004109 EXPECT_EQ(1U, GetNumQueries(dns, hostname1));
4110 EXPECT_EQ(records.at(0).addr, ToString(result));
Mike Yua772c202019-09-23 17:47:21 +08004111
Mike Yu40e67072019-10-09 21:14:09 +08004112 // A loose upper bound is set by adding 2000ms buffer time. Theoretically, getaddrinfo()
4113 // should just take a bit more than expetTimeout milliseconds.
4114 EXPECT_GE(timeTakenMs, expectedTimeout);
4115 EXPECT_LE(timeTakenMs, expectedTimeout + 2000);
4116
4117 // Set the server to be responsive. Verify that the resolver will attempt to reconnect
4118 // to the server and then get the result within the timeout.
4119 tls.setHangOnHandshakeForTesting(false);
4120 std::tie(result, timeTakenMs) = safe_getaddrinfo_time_taken(hostname2, nullptr, hints);
4121
4122 EXPECT_NE(nullptr, result);
Luke Huang3caa42b2020-04-23 14:18:04 +00004123 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yu40e67072019-10-09 21:14:09 +08004124 EXPECT_EQ(1U, GetNumQueries(dns, hostname2));
4125 EXPECT_EQ(records.at(1).addr, ToString(result));
4126
4127 EXPECT_LE(timeTakenMs, expectedTimeout);
Mike Yua772c202019-09-23 17:47:21 +08004128}
Hungming Chenbb90ab32019-10-28 18:20:31 +08004129
Ken Chen766feae2019-10-30 15:13:44 +08004130TEST_F(ResolverTest, FlushNetworkCache) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004131 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004132 test::DNSResponder dns;
4133 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4134 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4135
4136 const hostent* result = gethostbyname("hello");
4137 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4138
4139 // get result from cache
4140 result = gethostbyname("hello");
4141 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4142
4143 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4144
4145 result = gethostbyname("hello");
4146 EXPECT_EQ(2U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4147}
4148
4149TEST_F(ResolverTest, FlushNetworkCache_random) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004150 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004151 constexpr int num_flush = 10;
4152 constexpr int num_queries = 20;
4153 test::DNSResponder dns;
4154 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4155 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4156 const addrinfo hints = {.ai_family = AF_INET};
4157
4158 std::thread t([this]() {
4159 for (int i = 0; i < num_flush; ++i) {
4160 unsigned delay = arc4random_uniform(10 * 1000); // 10ms
4161 usleep(delay);
4162 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4163 }
4164 });
4165
4166 for (int i = 0; i < num_queries; ++i) {
4167 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4168 EXPECT_TRUE(result != nullptr);
4169 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4170 }
4171 t.join();
4172}
4173
4174// flush cache while one query is wait-for-response, another is pending.
4175TEST_F(ResolverTest, FlushNetworkCache_concurrent) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004176 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004177 const char* listen_addr1 = "127.0.0.9";
4178 const char* listen_addr2 = "127.0.0.10";
4179 test::DNSResponder dns1(listen_addr1);
4180 test::DNSResponder dns2(listen_addr2);
4181 StartDns(dns1, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4182 StartDns(dns2, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4183 addrinfo hints = {.ai_family = AF_INET};
4184
4185 // step 1: set server#1 into deferred responding mode
4186 dns1.setDeferredResp(true);
4187 std::thread t1([&listen_addr1, &hints, this]() {
4188 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr1}));
4189 // step 3: query
4190 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4191 // step 9: check result
4192 EXPECT_TRUE(result != nullptr);
4193 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4194 });
4195
4196 // step 2: wait for the query to reach the server
4197 while (GetNumQueries(dns1, kHelloExampleCom) == 0) {
4198 usleep(1000); // 1ms
4199 }
4200
4201 std::thread t2([&listen_addr2, &hints, &dns2, this]() {
4202 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr2}));
4203 // step 5: query (should be blocked in resolver)
4204 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4205 // step 7: check result
4206 EXPECT_TRUE(result != nullptr);
4207 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4208 EXPECT_EQ(1U, GetNumQueriesForType(dns2, ns_type::ns_t_a, kHelloExampleCom));
4209 });
4210
4211 // step 4: wait a bit for the 2nd query to enter pending state
4212 usleep(100 * 1000); // 100ms
4213 // step 6: flush cache (will unblock pending queries)
4214 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4215 t2.join();
4216
4217 // step 8: resume server#1
4218 dns1.setDeferredResp(false);
4219 t1.join();
4220
4221 // step 10: verify if result is correctly cached
4222 dns2.clearQueries();
4223 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4224 EXPECT_EQ(0U, GetNumQueries(dns2, kHelloExampleCom));
4225 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4226}
4227
waynema29253052019-08-20 11:26:08 +08004228// TODO: Perhaps to have a boundary conditions test for TCP and UDP.
4229TEST_F(ResolverTest, TcpQueryWithOversizePayload) {
4230 test::DNSResponder dns;
4231 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4232 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4233
4234 int fd = dns_open_proxy();
4235 ASSERT_TRUE(fd > 0);
4236
4237 // Sending DNS query over TCP once the packet sizes exceed 512 bytes.
4238 // The raw data is combined with Question section and Additional section
4239 // Question section : query "hello.example.com", type A, class IN
4240 // Additional section : type OPT (41), Option PADDING, Option Length 546
4241 // Padding option which allows DNS clients and servers to artificially
4242 // increase the size of a DNS message by a variable number of bytes.
4243 // See also RFC7830, section 3
4244 const std::string query =
4245 "+c0BAAABAAAAAAABBWhlbGxvB2V4YW1wbGUDY29tAAABAAEAACkgAAAAgAACJgAMAiIAAAAAAAAAAAAAAAAAA"
4246 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4247 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4248 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4249 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4250 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4251 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4252 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4253 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4254 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
4255 const std::string cmd =
4256 "resnsend " + std::to_string(TEST_NETID) + " 0 " /* ResNsendFlags */ + query + '\0';
4257 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
4258 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
4259 expectAnswersValid(fd, AF_INET, kHelloExampleComAddrV4);
4260 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom));
4261 EXPECT_EQ(0U, GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom));
4262}
4263
Ken Chen99344882020-01-01 14:59:38 +08004264TEST_F(ResolverTest, TruncatedRspMode) {
4265 constexpr char listen_addr[] = "127.0.0.4";
4266 constexpr char listen_addr2[] = "127.0.0.5";
4267 constexpr char listen_srv[] = "53";
4268
4269 test::DNSResponder dns(listen_addr, listen_srv, static_cast<ns_rcode>(-1));
4270 test::DNSResponder dns2(listen_addr2, listen_srv, static_cast<ns_rcode>(-1));
4271 // dns supports UDP only, dns2 support UDP and TCP
4272 dns.setResponseProbability(0.0, IPPROTO_TCP);
4273 StartDns(dns, kLargeCnameChainRecords);
4274 StartDns(dns2, kLargeCnameChainRecords);
4275
4276 const struct TestConfig {
4277 const std::optional<int32_t> tcMode;
4278 const bool ret;
4279 const unsigned numQueries;
4280 std::string asParameters() const {
4281 return StringPrintf("tcMode: %d, ret: %s, numQueries: %u", tcMode.value_or(-1),
4282 ret ? "true" : "false", numQueries);
4283 }
4284 } testConfigs[]{
4285 // clang-format off
4286 {std::nullopt, true, 0}, /* mode unset */
4287 {aidl::android::net::IDnsResolver::TC_MODE_DEFAULT, true, 0}, /* default mode */
4288 {aidl::android::net::IDnsResolver::TC_MODE_UDP_TCP, true, 1}, /* alternative mode */
4289 {-666, false, 1}, /* invalid input */
4290 // clang-format on
4291 };
4292
4293 for (const auto& config : testConfigs) {
4294 SCOPED_TRACE(config.asParameters());
4295
4296 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4297 parcel.servers = {listen_addr, listen_addr2};
4298 if (config.tcMode) {
Ken Chen05420812020-04-07 18:58:38 +00004299 parcel.resolverOptions.tcMode = config.tcMode.value();
Ken Chen99344882020-01-01 14:59:38 +08004300 }
4301 ASSERT_EQ(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk(), config.ret);
4302
4303 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4304 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4305 ASSERT_TRUE(result != nullptr);
4306 EXPECT_EQ(ToString(result), kHelloExampleComAddrV4);
4307 // TC_MODE_DEFAULT: resolver retries on TCP-only on each name server.
4308 // TC_MODE_UDP_TCP: resolver retries on TCP on the same server, falls back to UDP from next.
4309 ASSERT_EQ(GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom), 1U);
4310 ASSERT_EQ(GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom), 1U);
4311 ASSERT_EQ(GetNumQueriesForProtocol(dns2, IPPROTO_UDP, kHelloExampleCom), config.numQueries);
4312 ASSERT_EQ(GetNumQueriesForProtocol(dns2, IPPROTO_TCP, kHelloExampleCom), 1U);
4313
4314 dns.clearQueries();
4315 dns2.clearQueries();
4316 ASSERT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4317 }
4318}
4319
Mike Yuc0000252020-03-19 07:14:23 +00004320TEST_F(ResolverTest, RepeatedSetup_ResolverStatusRemains) {
4321 constexpr char unusable_listen_addr[] = "127.0.0.3";
4322 constexpr char listen_addr[] = "127.0.0.4";
4323 constexpr char hostname[] = "a.hello.query.";
4324 const auto repeatedSetResolversFromParcel = [&](const ResolverParamsParcel& parcel) {
4325 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4326 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4327 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4328 };
4329
4330 test::DNSResponder dns(listen_addr);
4331 StartDns(dns, {{hostname, ns_type::ns_t_a, "1.2.3.3"}});
4332 test::DnsTlsFrontend tls1(listen_addr, "853", listen_addr, "53");
4333 ASSERT_TRUE(tls1.startServer());
4334
4335 // Private DNS off mode.
4336 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4337 parcel.servers = {unusable_listen_addr, listen_addr};
4338 parcel.tlsServers.clear();
4339 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4340
4341 // Send a query.
4342 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4343 EXPECT_NE(safe_getaddrinfo(hostname, nullptr, &hints), nullptr);
4344
4345 // Check the stats as expected.
4346 const std::vector<NameserverStats> expectedCleartextDnsStats = {
4347 NameserverStats(unusable_listen_addr).setInternalErrors(1),
4348 NameserverStats(listen_addr).setSuccesses(1),
4349 };
4350 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
4351 EXPECT_EQ(GetNumQueries(dns, hostname), 1U);
4352
4353 // The stats is supposed to remain as long as the list of cleartext DNS servers is unchanged.
4354 static const struct TestConfig {
4355 std::vector<std::string> servers;
4356 std::vector<std::string> tlsServers;
4357 std::string tlsName;
4358 } testConfigs[] = {
4359 // Private DNS opportunistic mode.
4360 {{listen_addr, unusable_listen_addr}, {listen_addr, unusable_listen_addr}, ""},
4361 {{unusable_listen_addr, listen_addr}, {unusable_listen_addr, listen_addr}, ""},
4362
4363 // Private DNS strict mode.
4364 {{listen_addr, unusable_listen_addr}, {"127.0.0.100"}, kDefaultPrivateDnsHostName},
4365 {{unusable_listen_addr, listen_addr}, {"127.0.0.100"}, kDefaultPrivateDnsHostName},
4366
4367 // Private DNS off mode.
4368 {{unusable_listen_addr, listen_addr}, {}, ""},
4369 {{listen_addr, unusable_listen_addr}, {}, ""},
4370 };
4371
4372 for (const auto& config : testConfigs) {
4373 SCOPED_TRACE(fmt::format("testConfig: [{}] [{}] [{}]", fmt::join(config.servers, ","),
4374 fmt::join(config.tlsServers, ","), config.tlsName));
4375 parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4376 parcel.servers = config.servers;
4377 parcel.tlsServers = config.tlsServers;
4378 parcel.tlsName = config.tlsName;
4379 repeatedSetResolversFromParcel(parcel);
4380 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
4381
4382 // The stats remains when the list of search domains changes.
4383 parcel.domains.push_back("tmp.domains");
4384 repeatedSetResolversFromParcel(parcel);
4385 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
4386
4387 // The stats remains when the parameters change (except maxSamples).
4388 parcel.sampleValiditySeconds++;
4389 parcel.successThreshold++;
4390 parcel.minSamples++;
4391 parcel.baseTimeoutMsec++;
4392 parcel.retryCount++;
4393 repeatedSetResolversFromParcel(parcel);
4394 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
4395 }
4396
4397 // The cache remains.
4398 EXPECT_NE(safe_getaddrinfo(hostname, nullptr, &hints), nullptr);
4399 EXPECT_EQ(GetNumQueries(dns, hostname), 1U);
4400}
4401
4402TEST_F(ResolverTest, RepeatedSetup_NoRedundantPrivateDnsValidation) {
4403 const std::string addr1 = getUniqueIPv4Address(); // For a workable DNS server.
4404 const std::string addr2 = getUniqueIPv4Address(); // For an unresponsive DNS server.
4405 const std::string unusable_addr = getUniqueIPv4Address();
Mike Yu1ec523a2020-03-20 12:22:24 +00004406 const auto waitForPrivateDnsStateUpdated = []() {
4407 // A buffer time for the PrivateDnsConfiguration instance to update its map,
4408 // mPrivateDnsValidateThreads, which is used for tracking validation threads.
4409 // Since there is a time gap between when PrivateDnsConfiguration reports
4410 // onPrivateDnsValidationEvent and when PrivateDnsConfiguration updates the map, this is a
4411 // workaround to avoid the test starts a subsequent resolver setup during the time gap.
4412 // TODO: Report onPrivateDnsValidationEvent after all the relevant updates are complete.
4413 // Reference to b/152009023.
4414 std::this_thread::sleep_for(20ms);
4415 };
Mike Yuc0000252020-03-19 07:14:23 +00004416
4417 test::DNSResponder dns1(addr1);
4418 test::DNSResponder dns2(addr2);
4419 StartDns(dns1, {});
4420 StartDns(dns2, {});
4421 test::DnsTlsFrontend workableTls(addr1, "853", addr1, "53");
4422 test::DnsTlsFrontend unresponsiveTls(addr2, "853", addr2, "53");
4423 unresponsiveTls.setHangOnHandshakeForTesting(true);
4424 ASSERT_TRUE(workableTls.startServer());
4425 ASSERT_TRUE(unresponsiveTls.startServer());
4426
4427 // First setup.
4428 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4429 parcel.servers = {addr1, addr2, unusable_addr};
4430 parcel.tlsServers = {addr1, addr2, unusable_addr};
4431 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4432
4433 // Check the validation results.
4434 EXPECT_TRUE(WaitForPrivateDnsValidation(workableTls.listen_address(), true));
4435 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4436 EXPECT_EQ(unresponsiveTls.acceptConnectionsCount(), 1); // The validation is still in progress.
4437
4438 static const struct TestConfig {
4439 std::vector<std::string> tlsServers;
4440 std::string tlsName;
4441 } testConfigs[] = {
4442 {{addr1, addr2, unusable_addr}, ""},
4443 {{unusable_addr, addr1, addr2}, ""},
4444 {{unusable_addr, addr1, addr2}, kDefaultPrivateDnsHostName},
4445 {{addr1, addr2, unusable_addr}, kDefaultPrivateDnsHostName},
4446 };
4447
4448 std::string TlsNameLastTime;
4449 for (const auto& config : testConfigs) {
4450 SCOPED_TRACE(fmt::format("testConfig: [{}] [{}]", fmt::join(config.tlsServers, ","),
4451 config.tlsName));
4452 parcel.servers = config.tlsServers;
4453 parcel.tlsServers = config.tlsServers;
4454 parcel.tlsName = config.tlsName;
4455 parcel.caCertificate = config.tlsName.empty() ? "" : kCaCert;
4456
4457 const bool dnsModeChanged = (TlsNameLastTime != config.tlsName);
Mike Yu1ec523a2020-03-20 12:22:24 +00004458
4459 waitForPrivateDnsStateUpdated();
Mike Yuc0000252020-03-19 07:14:23 +00004460 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4461
4462 for (const auto& serverAddr : parcel.tlsServers) {
4463 SCOPED_TRACE(serverAddr);
4464 if (serverAddr == workableTls.listen_address()) {
4465 if (dnsModeChanged) {
4466 // In despite of the identical IP address, the server is regarded as a different
4467 // server when DnsTlsServer.name is different. The resolver treats it as a
4468 // different object and begins the validation process.
4469 EXPECT_TRUE(WaitForPrivateDnsValidation(serverAddr, true));
4470 }
4471 } else if (serverAddr == unresponsiveTls.listen_address()) {
4472 // No revalidation needed for the server which have been marked as in_progesss.
4473 } else {
4474 // Must be unusable_addr.
4475 // In opportunistic mode, when a validation for a private DNS server fails, the
4476 // resolver just marks the server as failed and doesn't re-evaluate it, but the
4477 // server can be re-evaluated when setResolverConfiguration() is called.
4478 // However, in strict mode, the resolver automatically re-evaluates the server and
4479 // marks the server as in_progress until the validation succeeds, so repeated setup
4480 // makes no effect.
4481 if (dnsModeChanged || config.tlsName.empty() /* not in strict mode */) {
4482 EXPECT_TRUE(WaitForPrivateDnsValidation(serverAddr, false));
4483 }
4484 }
4485 }
4486
4487 // Repeated setups make no effect in strict mode.
Mike Yu1ec523a2020-03-20 12:22:24 +00004488 waitForPrivateDnsStateUpdated();
Mike Yuc0000252020-03-19 07:14:23 +00004489 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4490 if (config.tlsName.empty()) {
4491 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4492 }
Mike Yu1ec523a2020-03-20 12:22:24 +00004493 waitForPrivateDnsStateUpdated();
Mike Yuc0000252020-03-19 07:14:23 +00004494 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4495 if (config.tlsName.empty()) {
4496 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4497 }
4498
4499 EXPECT_EQ(unresponsiveTls.acceptConnectionsCount(), 1);
4500
4501 TlsNameLastTime = config.tlsName;
4502 }
4503
4504 // Check that all the validation results are caught.
4505 // Note: it doesn't mean no validation being in progress.
4506 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr1));
4507 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr2));
4508 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(unusable_addr));
4509}
4510
4511TEST_F(ResolverTest, RepeatedSetup_KeepChangingPrivateDnsServers) {
4512 enum TlsServerState { WORKING, UNSUPPORTED, UNRESPONSIVE };
4513 const std::string addr1 = getUniqueIPv4Address();
4514 const std::string addr2 = getUniqueIPv4Address();
Mike Yubad95cf2020-03-26 03:19:38 +00004515 const auto waitForPrivateDnsStateUpdated = []() {
4516 // A buffer time for PrivateDnsConfiguration to update its state. It prevents this test
4517 // being flaky. See b/152009023 for the reason.
4518 std::this_thread::sleep_for(20ms);
4519 };
Mike Yuc0000252020-03-19 07:14:23 +00004520
4521 test::DNSResponder dns1(addr1);
4522 test::DNSResponder dns2(addr2);
4523 StartDns(dns1, {});
4524 StartDns(dns2, {});
4525 test::DnsTlsFrontend tls1(addr1, "853", addr1, "53");
4526 test::DnsTlsFrontend tls2(addr2, "853", addr2, "53");
4527 ASSERT_TRUE(tls1.startServer());
4528 ASSERT_TRUE(tls2.startServer());
4529
4530 static const struct TestConfig {
4531 std::string tlsServer;
4532 std::string tlsName;
4533 bool expectNothingHappenWhenServerUnsupported;
4534 bool expectNothingHappenWhenServerUnresponsive;
4535 std::string asTestName() const {
4536 return fmt::format("{}, {}, {}, {}", tlsServer, tlsName,
4537 expectNothingHappenWhenServerUnsupported,
4538 expectNothingHappenWhenServerUnresponsive);
4539 }
4540 } testConfigs[] = {
4541 {{addr1}, "", false, false},
4542 {{addr2}, "", false, false},
4543 {{addr1}, "", false, true},
4544 {{addr2}, "", false, true},
4545 {{addr1}, kDefaultPrivateDnsHostName, false, true},
4546 {{addr2}, kDefaultPrivateDnsHostName, false, true},
4547 {{addr1}, kDefaultPrivateDnsHostName, true, true},
4548 {{addr2}, kDefaultPrivateDnsHostName, true, true},
4549
4550 // There's no new validation to start because there are already two validation threads
4551 // running (one is for addr1, the other is for addr2). This is because the comparator
4552 // doesn't compare DnsTlsServer.name. Keep the design as-is until it's known to be
4553 // harmful.
4554 {{addr1}, "", true, true},
4555 {{addr2}, "", true, true},
4556 {{addr1}, "", true, true},
4557 {{addr2}, "", true, true},
4558 };
4559
4560 for (const auto& serverState : {WORKING, UNSUPPORTED, UNRESPONSIVE}) {
4561 int testIndex = 0;
4562 for (const auto& config : testConfigs) {
4563 SCOPED_TRACE(fmt::format("serverState:{} testIndex:{} testConfig:[{}]", serverState,
4564 testIndex++, config.asTestName()));
4565 auto& tls = (config.tlsServer == addr1) ? tls1 : tls2;
4566
4567 if (serverState == UNSUPPORTED && tls.running()) ASSERT_TRUE(tls.stopServer());
4568 if (serverState != UNSUPPORTED && !tls.running()) ASSERT_TRUE(tls.startServer());
4569
4570 tls.setHangOnHandshakeForTesting(serverState == UNRESPONSIVE);
4571 const int connectCountsBefore = tls.acceptConnectionsCount();
4572
Mike Yubad95cf2020-03-26 03:19:38 +00004573 waitForPrivateDnsStateUpdated();
Mike Yuc0000252020-03-19 07:14:23 +00004574 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4575 parcel.servers = {config.tlsServer};
4576 parcel.tlsServers = {config.tlsServer};
4577 parcel.tlsName = config.tlsName;
4578 parcel.caCertificate = config.tlsName.empty() ? "" : kCaCert;
4579 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4580
4581 if (serverState == WORKING) {
4582 EXPECT_TRUE(WaitForPrivateDnsValidation(config.tlsServer, true));
4583 } else if (serverState == UNSUPPORTED) {
4584 if (config.expectNothingHappenWhenServerUnsupported) {
4585 // It's possible that the resolver hasn't yet started to
4586 // connect. Wait a while.
4587 // TODO: See if we can get rid of the hard waiting time, such as comparing
4588 // the CountDiff across two tests.
4589 std::this_thread::sleep_for(100ms);
4590 EXPECT_EQ(tls.acceptConnectionsCount(), connectCountsBefore);
4591 } else {
4592 EXPECT_TRUE(WaitForPrivateDnsValidation(config.tlsServer, false));
4593 }
4594 } else {
4595 // Must be UNRESPONSIVE.
4596 // DnsTlsFrontend is the only signal for checking whether or not the resolver starts
4597 // another validation when the server is unresponsive.
4598 const int expectCountDiff =
4599 config.expectNothingHappenWhenServerUnresponsive ? 0 : 1;
4600 if (expectCountDiff == 0) {
4601 // It's possible that the resolver hasn't yet started to
4602 // connect. Wait a while.
4603 std::this_thread::sleep_for(100ms);
4604 }
4605 const auto condition = [&]() {
4606 return tls.acceptConnectionsCount() == connectCountsBefore + expectCountDiff;
4607 };
4608 EXPECT_TRUE(PollForCondition(condition));
4609 }
4610 }
4611
4612 // Set to off mode to reset the PrivateDnsConfiguration state.
4613 ResolverParamsParcel setupOffmode = DnsResponderClient::GetDefaultResolverParamsParcel();
4614 setupOffmode.tlsServers.clear();
4615 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(setupOffmode));
4616 }
4617
4618 // Check that all the validation results are caught.
4619 // Note: it doesn't mean no validation being in progress.
4620 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr1));
4621 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr2));
4622}
4623
Hungming Chenbb90ab32019-10-28 18:20:31 +08004624// Parameterized tests.
4625// TODO: Merge the existing tests as parameterized test if possible.
4626// TODO: Perhaps move parameterized tests to an independent file.
4627enum class CallType { GETADDRINFO, GETHOSTBYNAME };
4628class ResolverParameterizedTest : public ResolverTest,
Hungming Chen63779052019-10-30 15:06:13 +08004629 public testing::WithParamInterface<CallType> {
4630 protected:
Hungming Chen22617fd2019-12-06 12:15:45 +08004631 void VerifyQueryHelloExampleComV4(const test::DNSResponder& dns, const CallType calltype,
4632 const bool verifyNumQueries = true) {
Hungming Chen63779052019-10-30 15:06:13 +08004633 if (calltype == CallType::GETADDRINFO) {
4634 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4635 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4636 ASSERT_TRUE(result != nullptr);
4637 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4638 } else if (calltype == CallType::GETHOSTBYNAME) {
4639 const hostent* result = gethostbyname("hello");
4640 ASSERT_TRUE(result != nullptr);
4641 ASSERT_EQ(4, result->h_length);
4642 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
4643 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4644 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
4645 } else {
4646 FAIL() << "Unsupported call type: " << static_cast<uint32_t>(calltype);
4647 }
Hungming Chen22617fd2019-12-06 12:15:45 +08004648 if (verifyNumQueries) EXPECT_EQ(1U, GetNumQueries(dns, kHelloExampleCom));
Hungming Chen63779052019-10-30 15:06:13 +08004649 }
4650};
Hungming Chenbb90ab32019-10-28 18:20:31 +08004651
Hungming Chen63779052019-10-30 15:06:13 +08004652INSTANTIATE_TEST_SUITE_P(QueryCallTest, ResolverParameterizedTest,
Hungming Chenbb90ab32019-10-28 18:20:31 +08004653 testing::Values(CallType::GETADDRINFO, CallType::GETHOSTBYNAME),
4654 [](const testing::TestParamInfo<CallType>& info) {
Hungming Chenbb90ab32019-10-28 18:20:31 +08004655 switch (info.param) {
4656 case CallType::GETADDRINFO:
Hungming Chen63779052019-10-30 15:06:13 +08004657 return "GetAddrInfo";
Hungming Chenbb90ab32019-10-28 18:20:31 +08004658 case CallType::GETHOSTBYNAME:
Hungming Chen63779052019-10-30 15:06:13 +08004659 return "GetHostByName";
Hungming Chenbb90ab32019-10-28 18:20:31 +08004660 default:
Hungming Chen63779052019-10-30 15:06:13 +08004661 return "InvalidParameter"; // Should not happen.
Hungming Chenbb90ab32019-10-28 18:20:31 +08004662 }
Hungming Chenbb90ab32019-10-28 18:20:31 +08004663 });
4664
4665TEST_P(ResolverParameterizedTest, AuthoritySectionAndAdditionalSection) {
4666 // DNS response may have more information in authority section and additional section.
4667 // Currently, getanswer() of packages/modules/DnsResolver/getaddrinfo.cpp doesn't parse the
4668 // content of authority section and additional section. Test these sections if they crash
4669 // the resolver, just in case. See also RFC 1035 section 4.1.
4670 const auto& calltype = GetParam();
4671 test::DNSHeader header(kDefaultDnsHeader);
4672
4673 // Create a DNS response which has a authoritative nameserver record in authority
4674 // section and its relevant address record in additional section.
4675 //
4676 // Question
4677 // hello.example.com. IN A
4678 // Answer
4679 // hello.example.com. IN A 1.2.3.4
4680 // Authority:
4681 // hello.example.com. IN NS ns1.example.com.
4682 // Additional:
4683 // ns1.example.com. IN A 5.6.7.8
4684 //
4685 // A response may have only question, answer, and authority section. Current testing response
4686 // should be able to cover this condition.
4687
4688 // Question section.
4689 test::DNSQuestion question{
4690 .qname = {.name = kHelloExampleCom},
4691 .qtype = ns_type::ns_t_a,
4692 .qclass = ns_c_in,
4693 };
4694 header.questions.push_back(std::move(question));
4695
4696 // Answer section.
4697 test::DNSRecord recordAnswer{
4698 .name = {.name = kHelloExampleCom},
4699 .rtype = ns_type::ns_t_a,
4700 .rclass = ns_c_in,
4701 .ttl = 0, // no cache
4702 };
Hungming Chen63779052019-10-30 15:06:13 +08004703 EXPECT_TRUE(test::DNSResponder::fillRdata(kHelloExampleComAddrV4, recordAnswer));
Hungming Chenbb90ab32019-10-28 18:20:31 +08004704 header.answers.push_back(std::move(recordAnswer));
4705
4706 // Authority section.
4707 test::DNSRecord recordAuthority{
4708 .name = {.name = kHelloExampleCom},
4709 .rtype = ns_type::ns_t_ns,
4710 .rclass = ns_c_in,
4711 .ttl = 0, // no cache
4712 };
4713 EXPECT_TRUE(test::DNSResponder::fillRdata("ns1.example.com.", recordAuthority));
4714 header.authorities.push_back(std::move(recordAuthority));
4715
4716 // Additional section.
4717 test::DNSRecord recordAdditional{
4718 .name = {.name = "ns1.example.com."},
4719 .rtype = ns_type::ns_t_a,
4720 .rclass = ns_c_in,
4721 .ttl = 0, // no cache
4722 };
4723 EXPECT_TRUE(test::DNSResponder::fillRdata("5.6.7.8", recordAdditional));
4724 header.additionals.push_back(std::move(recordAdditional));
4725
4726 // Start DNS server.
4727 test::DNSResponder dns(test::DNSResponder::MappingType::DNS_HEADER);
4728 dns.addMappingDnsHeader(kHelloExampleCom, ns_type::ns_t_a, header);
4729 ASSERT_TRUE(dns.startServer());
4730 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4731 dns.clearQueries();
4732
4733 // Expect that get the address and the resolver doesn't crash.
Hungming Chen63779052019-10-30 15:06:13 +08004734 VerifyQueryHelloExampleComV4(dns, calltype);
4735}
4736
4737TEST_P(ResolverParameterizedTest, MessageCompression) {
4738 const auto& calltype = GetParam();
4739
4740 // The response with compressed domain name by a pointer. See RFC 1035 section 4.1.4.
4741 //
4742 // Ignoring the other fields of the message, the domain name of question section and answer
4743 // section are presented as:
4744 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4745 // 12 | 5 | h |
4746 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4747 // 14 | e | l |
4748 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4749 // 16 | l | o |
4750 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4751 // 18 | 7 | e |
4752 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4753 // 20 | x | a |
4754 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4755 // 22 | m | p |
4756 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4757 // 24 | l | e |
4758 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4759 // 26 | 3 | c |
4760 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4761 // 28 | o | m |
4762 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4763 // 30 | 0 | ... |
4764 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4765 //
4766 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4767 // 35 | 1 1| 12 |
4768 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4769 const std::vector<uint8_t> kResponseAPointer = {
4770 /* Header */
4771 0x00, 0x00, /* Transaction ID: 0x0000 */
4772 0x81, 0x80, /* Flags: qr rd ra */
4773 0x00, 0x01, /* Questions: 1 */
4774 0x00, 0x01, /* Answer RRs: 1 */
4775 0x00, 0x00, /* Authority RRs: 0 */
4776 0x00, 0x00, /* Additional RRs: 0 */
4777 /* Queries */
4778 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
4779 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name: hello.example.com */
4780 0x00, 0x01, /* Type: A */
4781 0x00, 0x01, /* Class: IN */
4782 /* Answers */
4783 0xc0, 0x0c, /* Name: hello.example.com (a pointer) */
4784 0x00, 0x01, /* Type: A */
4785 0x00, 0x01, /* Class: IN */
4786 0x00, 0x00, 0x00, 0x00, /* Time to live: 0 */
4787 0x00, 0x04, /* Data length: 4 */
4788 0x01, 0x02, 0x03, 0x04 /* Address: 1.2.3.4 */
4789 };
4790
4791 // The response with compressed domain name by a sequence of labels ending with a pointer. See
4792 // RFC 1035 section 4.1.4.
4793 //
4794 // Ignoring the other fields of the message, the domain name of question section and answer
4795 // section are presented as:
4796 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4797 // 12 | 5 | h |
4798 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4799 // 14 | e | l |
4800 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4801 // 16 | l | o |
4802 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4803 // 18 | 7 | e |
4804 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4805 // 20 | x | a |
4806 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4807 // 22 | m | p |
4808 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4809 // 24 | l | e |
4810 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4811 // 26 | 3 | c |
4812 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4813 // 28 | o | m |
4814 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4815 // 30 | 0 | ... |
4816 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4817 //
4818 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4819 // 35 | 5 | h |
4820 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4821 // 37 | e | l |
4822 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4823 // 39 | l | o |
4824 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4825 // 41 | 1 1| 18 |
4826 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4827 const std::vector<uint8_t> kResponseLabelEndingWithAPointer = {
4828 /* Header */
4829 0x00, 0x00, /* Transaction ID: 0x0000 */
4830 0x81, 0x80, /* Flags: qr rd ra */
4831 0x00, 0x01, /* Questions: 1 */
4832 0x00, 0x01, /* Answer RRs: 1 */
4833 0x00, 0x00, /* Authority RRs: 0 */
4834 0x00, 0x00, /* Additional RRs: 0 */
4835 /* Queries */
4836 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
4837 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name: hello.example.com */
4838 0x00, 0x01, /* Type: A */
4839 0x00, 0x01, /* Class: IN */
4840 /* Answers */
4841 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0xc0,
4842 0x12, /* Name: hello.example.com (a label ending with a pointer) */
4843 0x00, 0x01, /* Type: A */
4844 0x00, 0x01, /* Class: IN */
4845 0x00, 0x00, 0x00, 0x00, /* Time to live: 0 */
4846 0x00, 0x04, /* Data length: 4 */
4847 0x01, 0x02, 0x03, 0x04 /* Address: 1.2.3.4 */
4848 };
4849
4850 for (const auto& response : {kResponseAPointer, kResponseLabelEndingWithAPointer}) {
4851 SCOPED_TRACE(StringPrintf("Hex dump: %s", toHex(makeSlice(response)).c_str()));
4852
4853 test::DNSResponder dns(test::DNSResponder::MappingType::BINARY_PACKET);
4854 dns.addMappingBinaryPacket(kHelloExampleComQueryV4, response);
4855 StartDns(dns, {});
4856 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4857
4858 // Expect no cache because the TTL of testing responses are 0.
4859 VerifyQueryHelloExampleComV4(dns, calltype);
Hungming Chenbb90ab32019-10-28 18:20:31 +08004860 }
Mike Yu40e67072019-10-09 21:14:09 +08004861}
Hungming Chen22617fd2019-12-06 12:15:45 +08004862
4863TEST_P(ResolverParameterizedTest, TruncatedResponse) {
4864 const auto& calltype = GetParam();
4865
Hungming Chen22617fd2019-12-06 12:15:45 +08004866 test::DNSResponder dns;
Ken Chen99344882020-01-01 14:59:38 +08004867 StartDns(dns, kLargeCnameChainRecords);
Hungming Chen22617fd2019-12-06 12:15:45 +08004868 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4869
4870 // Expect UDP response is truncated. The resolver retries over TCP. See RFC 1035 section 4.2.1.
4871 VerifyQueryHelloExampleComV4(dns, calltype, false);
4872 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom));
4873 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom));
4874}
Luke Huang3caa42b2020-04-23 14:18:04 +00004875
4876TEST_F(ResolverTest, KeepListeningUDP) {
4877 constexpr char listen_addr1[] = "127.0.0.4";
4878 constexpr char listen_addr2[] = "127.0.0.5";
4879 constexpr char host_name[] = "howdy.example.com.";
4880 const std::vector<DnsRecord> records = {
4881 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
4882 };
4883 const std::vector<int> params = {300, 25, 8, 8, 1000 /* BASE_TIMEOUT_MSEC */,
4884 1 /* retry count */};
4885 const int delayTimeMs = 1500;
4886
4887 test::DNSResponder neverRespondDns(listen_addr2, "53", static_cast<ns_rcode>(-1));
4888 neverRespondDns.setResponseProbability(0.0);
4889 StartDns(neverRespondDns, records);
Luke Huang68fa5002020-04-23 15:48:47 +00004890 ScopedSystemProperties scopedSystemProperties(
4891 "persist.device_config.netd_native.keep_listening_udp", "1");
4892 // Re-setup test network to make experiment flag take effect.
4893 resetNetwork();
Luke Huang3caa42b2020-04-23 14:18:04 +00004894
4895 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr1, listen_addr2},
4896 kDefaultSearchDomains, params));
4897 // There are 2 DNS servers for this test.
4898 // |delayedDns| will be blocked for |delayTimeMs|, then start to respond to requests.
4899 // |neverRespondDns| will never respond.
4900 // In the first try, resolver will send query to |delayedDns| but get timeout error
4901 // because |delayTimeMs| > DNS timeout.
4902 // Then it's the second try, resolver will send query to |neverRespondDns| and
4903 // listen on both servers. Resolver will receive the answer coming from |delayedDns|.
Luke Huang3caa42b2020-04-23 14:18:04 +00004904
Luke Huang3caa42b2020-04-23 14:18:04 +00004905 test::DNSResponder delayedDns(listen_addr1);
4906 delayedDns.setResponseDelayMs(delayTimeMs);
4907 StartDns(delayedDns, records);
4908
4909 // Specify hints to ensure resolver doing query only 1 round.
4910 const addrinfo hints = {.ai_family = AF_INET6, .ai_socktype = SOCK_DGRAM};
4911 ScopedAddrinfo result = safe_getaddrinfo(host_name, nullptr, &hints);
4912 EXPECT_TRUE(result != nullptr);
4913
4914 std::string result_str = ToString(result);
4915 EXPECT_TRUE(result_str == "::1.2.3.4") << ", result_str='" << result_str << "'";
4916}
4917
4918TEST_F(ResolverTest, GetAddrInfoParallelLookupTimeout) {
4919 constexpr char listen_addr[] = "127.0.0.4";
4920 constexpr char host_name[] = "howdy.example.com.";
4921 constexpr int TIMING_TOLERANCE_MS = 200;
4922 constexpr int DNS_TIMEOUT_MS = 1000;
4923 const std::vector<DnsRecord> records = {
4924 {host_name, ns_type::ns_t_a, "1.2.3.4"},
4925 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
4926 };
4927 const std::vector<int> params = {300, 25, 8, 8, DNS_TIMEOUT_MS /* BASE_TIMEOUT_MSEC */,
4928 1 /* retry count */};
4929 test::DNSResponder neverRespondDns(listen_addr, "53", static_cast<ns_rcode>(-1));
4930 neverRespondDns.setResponseProbability(0.0);
4931 StartDns(neverRespondDns, records);
Luke Huang68fa5002020-04-23 15:48:47 +00004932 ScopedSystemProperties scopedSystemProperties(
4933 "persist.device_config.netd_native.parallel_lookup", "1");
Luke Huang5b30e712020-05-01 11:09:42 +00004934 // The default value of parallel_lookup_sleep_time should be very small
4935 // that we can ignore in this test case.
Luke Huang68fa5002020-04-23 15:48:47 +00004936 // Re-setup test network to make experiment flag take effect.
4937 resetNetwork();
Luke Huang3caa42b2020-04-23 14:18:04 +00004938
4939 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}, kDefaultSearchDomains, params));
4940 neverRespondDns.clearQueries();
4941
Luke Huang3caa42b2020-04-23 14:18:04 +00004942 // Use a never respond DNS server to verify if the A/AAAA queries are sent in parallel.
4943 // The resolver parameters are set to timeout 1s and retry 1 times.
4944 // So we expect the safe_getaddrinfo_time_taken() might take ~1s to
4945 // return when parallel lookup is enabled. And the DNS server should receive 2 queries.
4946 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_DGRAM};
4947 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(host_name, nullptr, hints);
4948
4949 EXPECT_TRUE(result == nullptr);
4950 EXPECT_NEAR(DNS_TIMEOUT_MS, timeTakenMs, TIMING_TOLERANCE_MS)
4951 << "took time should approximate equal timeout";
4952 EXPECT_EQ(2U, GetNumQueries(neverRespondDns, host_name));
4953}
Luke Huang5b30e712020-05-01 11:09:42 +00004954
4955TEST_F(ResolverTest, GetAddrInfoParallelLookupSleepTime) {
4956 constexpr char listen_addr[] = "127.0.0.4";
4957 constexpr int TIMING_TOLERANCE_MS = 200;
4958 const std::vector<DnsRecord> records = {
4959 {kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4},
4960 {kHelloExampleCom, ns_type::ns_t_aaaa, kHelloExampleComAddrV6},
4961 };
4962 const std::vector<int> params = {300, 25, 8, 8, 1000 /* BASE_TIMEOUT_MSEC */,
4963 1 /* retry count */};
4964 test::DNSResponder dns(listen_addr);
4965 StartDns(dns, records);
4966 ScopedSystemProperties scopedSystemProperties1(
4967 "persist.device_config.netd_native.parallel_lookup", "1");
4968 constexpr int PARALLEL_LOOKUP_SLEEP_TIME_MS = 500;
4969 ScopedSystemProperties scopedSystemProperties2(
4970 "persist.device_config.netd_native.parallel_lookup_sleep_time",
4971 std::to_string(PARALLEL_LOOKUP_SLEEP_TIME_MS));
4972 // Re-setup test network to make experiment flag take effect.
4973 resetNetwork();
4974
4975 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}, kDefaultSearchDomains, params));
4976 dns.clearQueries();
4977
4978 // Expect the safe_getaddrinfo_time_taken() might take ~500ms to return because we set
4979 // parallel_lookup_sleep_time to 500ms.
4980 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_DGRAM};
4981 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(kHelloExampleCom, nullptr, hints);
4982
4983 EXPECT_NE(nullptr, result);
4984 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(
4985 {kHelloExampleComAddrV4, kHelloExampleComAddrV6}));
4986 EXPECT_NEAR(PARALLEL_LOOKUP_SLEEP_TIME_MS, timeTakenMs, TIMING_TOLERANCE_MS)
4987 << "took time should approximate equal timeout";
4988 EXPECT_EQ(2U, GetNumQueries(dns, kHelloExampleCom));
4989
4990 // Expect the PARALLEL_LOOKUP_SLEEP_TIME_MS won't affect the query under cache hit case.
4991 dns.clearQueries();
4992 std::tie(result, timeTakenMs) = safe_getaddrinfo_time_taken(kHelloExampleCom, nullptr, hints);
4993 EXPECT_NE(nullptr, result);
4994 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(
4995 {kHelloExampleComAddrV4, kHelloExampleComAddrV6}));
4996 EXPECT_GT(PARALLEL_LOOKUP_SLEEP_TIME_MS, timeTakenMs);
4997 EXPECT_EQ(0U, GetNumQueries(dns, kHelloExampleCom));
4998}