blob: 595d621d83662f090a89c1579e85f05a3672fb87 [file] [log] [blame]
Ken Chenb9fa2062018-11-13 21:51:13 +08001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
Lorenzo Colitti0a8b4aa2019-06-26 22:31:03 +090010 * Unless required by applicable law or agreed to in writing, software
Ken Chenb9fa2062018-11-13 21:51:13 +080011 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *
16 */
17
Bernie Innocenti3952ccc2019-03-03 19:39:53 +090018#define LOG_TAG "resolv_integration_test"
Ken Chenb9fa2062018-11-13 21:51:13 +080019
Hungming Chen5bf09772019-04-25 11:16:13 +080020#include <android-base/logging.h>
Bernie Innocenti41b82c42019-06-05 22:38:25 +090021#include <android-base/parseint.h>
Mike Yu40e67072019-10-09 21:14:09 +080022#include <android-base/properties.h>
Bernie Innocenti41b82c42019-06-05 22:38:25 +090023#include <android-base/stringprintf.h>
24#include <android-base/unique_fd.h>
25#include <android/multinetwork.h> // ResNsendFlags
Ken Chenb9fa2062018-11-13 21:51:13 +080026#include <arpa/inet.h>
Luke Huang94b10b92018-11-21 20:13:38 +080027#include <arpa/nameser.h>
Hungming Chene8f970c2019-04-10 17:34:06 +080028#include <binder/ProcessState.h>
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +090029#include <bpf/BpfUtils.h>
Bernie Innocenti41b82c42019-06-05 22:38:25 +090030#include <cutils/sockets.h>
31#include <gmock/gmock-matchers.h>
32#include <gtest/gtest.h>
Ken Chenb9fa2062018-11-13 21:51:13 +080033#include <netdb.h>
Luke Huang9d2d25b2019-06-14 00:34:05 +080034#include <netdutils/InternetAddresses.h>
Luke Huang579ddc72019-06-14 00:59:39 +080035#include <netdutils/NetworkConstants.h> // SHA256_SIZE
Luke Huang9d2d25b2019-06-14 00:34:05 +080036#include <netdutils/ResponseCode.h>
Hungming Chen63779052019-10-30 15:06:13 +080037#include <netdutils/Slice.h>
Luke Huang9d2d25b2019-06-14 00:34:05 +080038#include <netdutils/SocketOption.h>
Mike Yu40e67072019-10-09 21:14:09 +080039#include <netdutils/Stopwatch.h>
Luke Huang94b10b92018-11-21 20:13:38 +080040#include <netinet/in.h>
41#include <poll.h> /* poll */
Bernie Innocenti41b82c42019-06-05 22:38:25 +090042#include <private/android_filesystem_config.h>
Luke Huang94b10b92018-11-21 20:13:38 +080043#include <resolv.h>
Ken Chenb9fa2062018-11-13 21:51:13 +080044#include <stdarg.h>
Ken Chenb9fa2062018-11-13 21:51:13 +080045#include <stdlib.h>
Luke Huang94b10b92018-11-21 20:13:38 +080046#include <sys/socket.h>
47#include <sys/un.h>
Ken Chenb9fa2062018-11-13 21:51:13 +080048#include <unistd.h>
49
50#include <algorithm>
51#include <chrono>
52#include <iterator>
53#include <numeric>
54#include <thread>
55
Luke Huangf8215372019-11-22 11:53:41 +080056#include <aidl/android/net/IDnsResolver.h>
57#include <android/binder_manager.h>
58#include <android/binder_process.h>
Bernie Innocenti41b82c42019-06-05 22:38:25 +090059#include "NetdClient.h"
Bernie Innocenti41b82c42019-06-05 22:38:25 +090060#include "ResolverStats.h"
Luke Huangf8215372019-11-22 11:53:41 +080061#include "netid_client.h" // NETID_UNSET
62#include "params.h" // MAXNS
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +090063#include "test_utils.h"
Hungming Chene8f970c2019-04-10 17:34:06 +080064#include "tests/dns_metrics_listener/dns_metrics_listener.h"
chenbruceb43ec752019-07-24 20:19:41 +080065#include "tests/dns_responder/dns_responder.h"
Luke Huangf8215372019-11-22 11:53:41 +080066#include "tests/dns_responder/dns_responder_client_ndk.h"
Hungming Chenc6556622019-10-02 16:01:07 +080067#include "tests/dns_responder/dns_tls_certificate.h"
chenbruceb43ec752019-07-24 20:19:41 +080068#include "tests/dns_responder/dns_tls_frontend.h"
Luke Huangfde82482019-06-04 01:04:53 +080069#include "tests/resolv_test_utils.h"
Ken Chenb9fa2062018-11-13 21:51:13 +080070
Luke Huang0d592bc2019-05-25 18:24:03 +080071// Valid VPN netId range is 100 ~ 65535
72constexpr int TEST_VPN_NETID = 65502;
Luke Huang94b10b92018-11-21 20:13:38 +080073constexpr int MAXPACKET = (8 * 1024);
Ken Chenb9fa2062018-11-13 21:51:13 +080074
Sehee Park2c118782019-05-07 13:02:45 +090075// Use maximum reserved appId for applications to avoid conflict with existing uids.
76static const int TEST_UID = 99999;
77
Ken Chenb9fa2062018-11-13 21:51:13 +080078// Semi-public Bionic hook used by the NDK (frameworks/base/native/android/net.c)
79// Tested here for convenience.
80extern "C" int android_getaddrinfofornet(const char* hostname, const char* servname,
81 const addrinfo* hints, unsigned netid, unsigned mark,
82 struct addrinfo** result);
83
Mike Yuc0000252020-03-19 07:14:23 +000084using namespace std::chrono_literals;
85
Luke Huang70070852019-11-25 18:25:50 +080086using aidl::android::net::IDnsResolver;
Luke Huangf8215372019-11-22 11:53:41 +080087using aidl::android::net::INetd;
Mike Yu8ac63402019-12-02 15:28:38 +080088using aidl::android::net::ResolverParamsParcel;
Luke Huang9807e6b2019-05-20 16:17:12 +080089using android::base::ParseInt;
Ken Chenb9fa2062018-11-13 21:51:13 +080090using android::base::StringPrintf;
Luke Huang9807e6b2019-05-20 16:17:12 +080091using android::base::unique_fd;
Ken Chenb9fa2062018-11-13 21:51:13 +080092using android::net::ResolverStats;
Hungming Chene8f970c2019-04-10 17:34:06 +080093using android::net::metrics::DnsMetricsListener;
Ken Chenb9fa2062018-11-13 21:51:13 +080094using android::netdutils::enableSockopt;
Hungming Chen63779052019-10-30 15:06:13 +080095using android::netdutils::makeSlice;
Luke Huang9807e6b2019-05-20 16:17:12 +080096using android::netdutils::ResponseCode;
Luke Huang9d2d25b2019-06-14 00:34:05 +080097using android::netdutils::ScopedAddrinfo;
Mike Yu40e67072019-10-09 21:14:09 +080098using android::netdutils::Stopwatch;
Hungming Chen63779052019-10-30 15:06:13 +080099using android::netdutils::toHex;
Ken Chenb9fa2062018-11-13 21:51:13 +0800100
101// TODO: move into libnetdutils?
102namespace {
Luke Huangfde82482019-06-04 01:04:53 +0800103
Ken Chenb9fa2062018-11-13 21:51:13 +0800104ScopedAddrinfo safe_getaddrinfo(const char* node, const char* service,
105 const struct addrinfo* hints) {
106 addrinfo* result = nullptr;
107 if (getaddrinfo(node, service, hints, &result) != 0) {
108 result = nullptr; // Should already be the case, but...
109 }
110 return ScopedAddrinfo(result);
111}
Luke Huangfde82482019-06-04 01:04:53 +0800112
Mike Yu40e67072019-10-09 21:14:09 +0800113std::pair<ScopedAddrinfo, int> safe_getaddrinfo_time_taken(const char* node, const char* service,
114 const addrinfo& hints) {
115 Stopwatch s;
116 ScopedAddrinfo result = safe_getaddrinfo(node, service, &hints);
117 return {std::move(result), s.timeTakenUs() / 1000};
118}
119
Mike Yuc0000252020-03-19 07:14:23 +0000120struct NameserverStats {
121 NameserverStats() = delete;
122 NameserverStats(const std::string server) : server(server) {}
123 NameserverStats& setSuccesses(int val) {
124 successes = val;
125 return *this;
126 }
127 NameserverStats& setErrors(int val) {
128 errors = val;
129 return *this;
130 }
131 NameserverStats& setTimeouts(int val) {
132 timeouts = val;
133 return *this;
134 }
135 NameserverStats& setInternalErrors(int val) {
136 internal_errors = val;
137 return *this;
138 }
139
140 const std::string server;
141 int successes = 0;
142 int errors = 0;
143 int timeouts = 0;
144 int internal_errors = 0;
145};
146
Ken Chenb9fa2062018-11-13 21:51:13 +0800147} // namespace
148
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900149class ResolverTest : public ::testing::Test {
Hungming Chene8f970c2019-04-10 17:34:06 +0800150 public:
Automerger Merge Worker19a291b2020-03-17 02:41:30 +0000151 static void SetUpTestSuite() {
Hungming Chen5bf09772019-04-25 11:16:13 +0800152 // Get binder service.
153 // Note that |mDnsClient| is not used for getting binder service in this static function.
154 // The reason is that wants to keep |mDnsClient| as a non-static data member. |mDnsClient|
155 // which sets up device network configuration could be independent from every test.
Luke Huangf8215372019-11-22 11:53:41 +0800156 // TODO: Perhaps add a static function in resolv_test_binder_utils.{cpp,h} to get binder
157 // service.
158
159 AIBinder* binder = AServiceManager_getService("dnsresolver");
160 ndk::SpAIBinder resolvBinder = ndk::SpAIBinder(binder);
161 auto resolvService = aidl::android::net::IDnsResolver::fromBinder(resolvBinder);
Hungming Chen5bf09772019-04-25 11:16:13 +0800162 ASSERT_NE(nullptr, resolvService.get());
163
164 // Subscribe the death recipient to the service IDnsResolver for detecting Netd death.
Luke Huang70070852019-11-25 18:25:50 +0800165 // GTEST assertion macros are not invoked for generating a test failure in the death
166 // recipient because the macros can't indicate failed test if Netd died between tests.
167 // Moreover, continuing testing may have no meaningful after Netd death. Therefore, the
168 // death recipient aborts process by GTEST_LOG_(FATAL) once Netd died.
Luke Huangf8215372019-11-22 11:53:41 +0800169 sResolvDeathRecipient = AIBinder_DeathRecipient_new([](void*) {
170 constexpr char errorMessage[] = "Netd died";
171 LOG(ERROR) << errorMessage;
172 GTEST_LOG_(FATAL) << errorMessage;
173 });
174 ASSERT_EQ(STATUS_OK, AIBinder_linkToDeath(binder, sResolvDeathRecipient, nullptr));
Hungming Chen5bf09772019-04-25 11:16:13 +0800175
176 // Subscribe the DNS listener for verifying DNS metrics event contents.
Luke Huangf8215372019-11-22 11:53:41 +0800177 sDnsMetricsListener = ndk::SharedRefBase::make<DnsMetricsListener>(
178 TEST_NETID /*monitor specific network*/);
Hungming Chen5bf09772019-04-25 11:16:13 +0800179 ASSERT_TRUE(resolvService->registerEventListener(sDnsMetricsListener).isOk());
180
181 // Start the binder thread pool for listening DNS metrics events and receiving death
182 // recipient.
Luke Huangf8215372019-11-22 11:53:41 +0800183 ABinderProcess_startThreadPool();
Hungming Chene8f970c2019-04-10 17:34:06 +0800184 }
Automerger Merge Worker19a291b2020-03-17 02:41:30 +0000185 static void TearDownTestSuite() { AIBinder_DeathRecipient_delete(sResolvDeathRecipient); }
Hungming Chene8f970c2019-04-10 17:34:06 +0800186
Ken Chenb9fa2062018-11-13 21:51:13 +0800187 protected:
Lorenzo Colitti5be8bf22020-05-26 10:55:21 +0000188 void SetUp() {
189 mDnsClient.SetUp();
190 sDnsMetricsListener->reset();
191 }
192
Mike Yu960243d2020-01-17 19:02:15 +0800193 void TearDown() {
194 // Ensure the dump works at the end of each test.
195 DumpResolverService();
196
197 mDnsClient.TearDown();
198 }
nuccachena26cc2a2018-07-17 18:07:23 +0800199
Luke Huang68fa5002020-04-23 15:48:47 +0000200 void resetNetwork() {
201 mDnsClient.TearDown();
202 mDnsClient.SetupOemNetwork();
203 }
204
Xiao Ma09b71022018-12-11 17:56:32 +0900205 void StartDns(test::DNSResponder& dns, const std::vector<DnsRecord>& records) {
206 for (const auto& r : records) {
207 dns.addMapping(r.host_name, r.type, r.addr);
208 }
209
210 ASSERT_TRUE(dns.startServer());
211 dns.clearQueries();
212 }
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900213
Mike Yu960243d2020-01-17 19:02:15 +0800214 void DumpResolverService() {
215 unique_fd fd(open("/dev/null", O_WRONLY));
216 EXPECT_EQ(mDnsClient.resolvService()->dump(fd, nullptr, 0), 0);
217
218 const char* querylogCmd[] = {"querylog"}; // Keep it sync with DnsQueryLog::DUMP_KEYWORD.
219 EXPECT_EQ(mDnsClient.resolvService()->dump(fd, querylogCmd, std::size(querylogCmd)), 0);
220 }
221
Hungming Chene8f970c2019-04-10 17:34:06 +0800222 bool WaitForNat64Prefix(ExpectNat64PrefixStatus status,
223 std::chrono::milliseconds timeout = std::chrono::milliseconds(1000)) {
Hungming Chen5bf09772019-04-25 11:16:13 +0800224 return sDnsMetricsListener->waitForNat64Prefix(status, timeout);
Hungming Chene8f970c2019-04-10 17:34:06 +0800225 }
226
Mike Yu724f77d2019-08-16 11:14:50 +0800227 bool WaitForPrivateDnsValidation(std::string serverAddr, bool validated) {
228 return sDnsMetricsListener->waitForPrivateDnsValidation(serverAddr, validated);
229 }
230
Mike Yuc0000252020-03-19 07:14:23 +0000231 bool hasUncaughtPrivateDnsValidation(const std::string& serverAddr) {
232 return sDnsMetricsListener->findValidationRecord(serverAddr);
233 }
234
235 bool expectStatsFromGetResolverInfo(const std::vector<NameserverStats>& nameserversStats) {
236 std::vector<std::string> res_servers;
237 std::vector<std::string> res_domains;
238 std::vector<std::string> res_tls_servers;
239 res_params res_params;
240 std::vector<ResolverStats> res_stats;
241 int wait_for_pending_req_timeout_count;
242
243 if (!DnsResponderClient::GetResolverInfo(mDnsClient.resolvService(), TEST_NETID,
244 &res_servers, &res_domains, &res_tls_servers,
245 &res_params, &res_stats,
246 &wait_for_pending_req_timeout_count)) {
247 ADD_FAILURE() << "GetResolverInfo failed";
248 return false;
249 }
250
251 if (res_servers.size() != res_stats.size()) {
252 ADD_FAILURE() << fmt::format("res_servers.size() != res_stats.size(): {} != {}",
253 res_servers.size(), res_stats.size());
254 return false;
255 }
256 if (res_servers.size() != nameserversStats.size()) {
257 ADD_FAILURE() << fmt::format("res_servers.size() != nameserversStats.size(): {} != {}",
258 res_servers.size(), nameserversStats.size());
259 return false;
260 }
261
262 for (const auto& stats : nameserversStats) {
263 SCOPED_TRACE(stats.server);
264 const auto it = std::find(res_servers.begin(), res_servers.end(), stats.server);
265 if (it == res_servers.end()) {
266 ADD_FAILURE() << fmt::format("nameserver {} not found in the list {{{}}}",
267 stats.server, fmt::join(res_servers, ", "));
268 return false;
269 }
270 const int index = std::distance(res_servers.begin(), it);
271
272 // The check excludes rtt_avg, last_sample_time, and usable since they will be obsolete
273 // after |res_stats| is retrieved from NetConfig.dnsStats rather than NetConfig.nsstats.
274 EXPECT_EQ(res_stats[index].successes, stats.successes);
275 EXPECT_EQ(res_stats[index].errors, stats.errors);
276 EXPECT_EQ(res_stats[index].timeouts, stats.timeouts);
277 EXPECT_EQ(res_stats[index].internal_errors, stats.internal_errors);
278 }
279
280 return true;
281 }
282
283 // Since there's no way to terminate private DNS validation threads at any time. Tests that
284 // focus on the results of private DNS validation can interfere with each other if they use the
285 // same IP address for test servers. getUniqueIPv4Address() is a workaround to reduce the
286 // possibility of tests being flaky. A feasible solution is to forbid the validation threads,
287 // which are considered as outdated (e.g. switch the resolver to private DNS OFF mode), updating
288 // the result to the PrivateDnsConfiguration instance.
289 static std::string getUniqueIPv4Address() {
290 static int counter = 0;
291 return fmt::format("127.0.100.{}", (++counter & 0xff));
292 }
293
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900294 DnsResponderClient mDnsClient;
Xiao Ma09b71022018-12-11 17:56:32 +0900295
Hungming Chen5bf09772019-04-25 11:16:13 +0800296 // Use a shared static DNS listener for all tests to avoid registering lots of listeners
297 // which may be released late until process terminated. Currently, registered DNS listener
298 // is removed by binder death notification which is fired when the process hosting an
299 // IBinder has gone away. If every test in ResolverTest registers its DNS listener, Netd
300 // may temporarily hold lots of dead listeners until the unit test process terminates.
301 // TODO: Perhaps add an unregistering listener binder call or fork a listener process which
302 // could be terminated earlier.
Luke Huangf8215372019-11-22 11:53:41 +0800303 static std::shared_ptr<DnsMetricsListener>
Automerger Merge Worker19a291b2020-03-17 02:41:30 +0000304 sDnsMetricsListener; // Initialized in SetUpTestSuite.
Hungming Chen5bf09772019-04-25 11:16:13 +0800305
306 // Use a shared static death recipient to monitor the service death. The static death
307 // recipient could monitor the death not only during the test but also between tests.
Automerger Merge Worker19a291b2020-03-17 02:41:30 +0000308 static AIBinder_DeathRecipient* sResolvDeathRecipient; // Initialized in SetUpTestSuite.
Ken Chenb9fa2062018-11-13 21:51:13 +0800309};
310
Hungming Chen5bf09772019-04-25 11:16:13 +0800311// Initialize static member of class.
Luke Huangf8215372019-11-22 11:53:41 +0800312std::shared_ptr<DnsMetricsListener> ResolverTest::sDnsMetricsListener;
313AIBinder_DeathRecipient* ResolverTest::sResolvDeathRecipient;
Hungming Chen5bf09772019-04-25 11:16:13 +0800314
Ken Chenb9fa2062018-11-13 21:51:13 +0800315TEST_F(ResolverTest, GetHostByName) {
Xiao Ma09b71022018-12-11 17:56:32 +0900316 constexpr char nonexistent_host_name[] = "nonexistent.example.com.";
317
318 test::DNSResponder dns;
319 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.3"}});
320 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800321
322 const hostent* result;
Ken Chenb9fa2062018-11-13 21:51:13 +0800323 result = gethostbyname("nonexistent");
324 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, nonexistent_host_name));
325 ASSERT_TRUE(result == nullptr);
326 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
327
328 dns.clearQueries();
329 result = gethostbyname("hello");
Xiao Ma09b71022018-12-11 17:56:32 +0900330 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
Ken Chenb9fa2062018-11-13 21:51:13 +0800331 ASSERT_FALSE(result == nullptr);
332 ASSERT_EQ(4, result->h_length);
333 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
334 EXPECT_EQ("1.2.3.3", ToString(result));
335 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800336}
337
lifr4e4a2e02019-01-29 16:53:51 +0800338TEST_F(ResolverTest, GetHostByName_cnames) {
339 constexpr char host_name[] = "host.example.com.";
340 size_t cnamecount = 0;
341 test::DNSResponder dns;
342
343 const std::vector<DnsRecord> records = {
344 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
345 {"a.example.com.", ns_type::ns_t_cname, "b.example.com."},
346 {"b.example.com.", ns_type::ns_t_cname, "c.example.com."},
347 {"c.example.com.", ns_type::ns_t_cname, "d.example.com."},
348 {"d.example.com.", ns_type::ns_t_cname, "e.example.com."},
349 {"e.example.com.", ns_type::ns_t_cname, host_name},
350 {host_name, ns_type::ns_t_a, "1.2.3.3"},
351 {host_name, ns_type::ns_t_aaaa, "2001:db8::42"},
352 };
353 StartDns(dns, records);
354 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
355
356 // using gethostbyname2() to resolve ipv4 hello.example.com. to 1.2.3.3
357 // Ensure the v4 address and cnames are correct
358 const hostent* result;
359 result = gethostbyname2("hello", AF_INET);
360 ASSERT_FALSE(result == nullptr);
361
362 for (int i = 0; result != nullptr && result->h_aliases[i] != nullptr; i++) {
363 std::string domain_name = records[i].host_name.substr(0, records[i].host_name.size() - 1);
364 EXPECT_EQ(result->h_aliases[i], domain_name);
365 cnamecount++;
366 }
367 // The size of "Non-cname type" record in DNS records is 2
368 ASSERT_EQ(cnamecount, records.size() - 2);
369 ASSERT_EQ(4, result->h_length);
370 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
371 EXPECT_EQ("1.2.3.3", ToString(result));
372 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
373 EXPECT_EQ(1U, dns.queries().size()) << dns.dumpQueries();
374
375 // using gethostbyname2() to resolve ipv6 hello.example.com. to 2001:db8::42
376 // Ensure the v6 address and cnames are correct
377 cnamecount = 0;
378 dns.clearQueries();
379 result = gethostbyname2("hello", AF_INET6);
380 for (unsigned i = 0; result != nullptr && result->h_aliases[i] != nullptr; i++) {
381 std::string domain_name = records[i].host_name.substr(0, records[i].host_name.size() - 1);
382 EXPECT_EQ(result->h_aliases[i], domain_name);
383 cnamecount++;
384 }
385 // The size of "Non-cname type" DNS record in records is 2
386 ASSERT_EQ(cnamecount, records.size() - 2);
387 ASSERT_FALSE(result == nullptr);
388 ASSERT_EQ(16, result->h_length);
389 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
390 EXPECT_EQ("2001:db8::42", ToString(result));
391 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
392}
393
394TEST_F(ResolverTest, GetHostByName_cnamesInfiniteLoop) {
395 test::DNSResponder dns;
396 const std::vector<DnsRecord> records = {
397 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
398 {"a.example.com.", ns_type::ns_t_cname, kHelloExampleCom},
399 };
400 StartDns(dns, records);
401 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
402
403 const hostent* result;
404 result = gethostbyname2("hello", AF_INET);
405 ASSERT_TRUE(result == nullptr);
406
407 dns.clearQueries();
408 result = gethostbyname2("hello", AF_INET6);
409 ASSERT_TRUE(result == nullptr);
410}
411
Ken Chenb9fa2062018-11-13 21:51:13 +0800412TEST_F(ResolverTest, GetHostByName_localhost) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800413 constexpr char name_camelcase[] = "LocalHost";
Ken Chenb9fa2062018-11-13 21:51:13 +0800414 constexpr char name_ip6_dot[] = "ip6-localhost.";
415 constexpr char name_ip6_fqdn[] = "ip6-localhost.example.com.";
416
417 // Add a dummy nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900418 test::DNSResponder dns;
419 StartDns(dns, {});
420 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800421
422 // Expect no DNS queries; localhost is resolved via /etc/hosts
Xiao Ma09b71022018-12-11 17:56:32 +0900423 const hostent* result = gethostbyname(kLocalHost);
Ken Chenb9fa2062018-11-13 21:51:13 +0800424 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
425 ASSERT_FALSE(result == nullptr);
426 ASSERT_EQ(4, result->h_length);
427 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900428 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800429 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
430
431 // Ensure the hosts file resolver ignores case of hostnames
432 result = gethostbyname(name_camelcase);
433 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
434 ASSERT_FALSE(result == nullptr);
435 ASSERT_EQ(4, result->h_length);
436 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900437 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800438 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
439
440 // The hosts file also contains ip6-localhost, but gethostbyname() won't
chenbruce018fdb22019-06-12 18:08:04 +0800441 // return it. This would be easy to
Ken Chenb9fa2062018-11-13 21:51:13 +0800442 // change, but there's no point in changing the legacy behavior; new code
443 // should be calling getaddrinfo() anyway.
444 // So we check the legacy behavior, which results in amusing A-record
445 // lookups for ip6-localhost, with and without search domains appended.
446 dns.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900447 result = gethostbyname(kIp6LocalHost);
Sehee Parkbbca0202018-11-16 10:53:16 +0900448 EXPECT_EQ(2U, dns.queries().size()) << dns.dumpQueries();
449 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, name_ip6_dot)) << dns.dumpQueries();
450 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, name_ip6_fqdn)) << dns.dumpQueries();
Ken Chenb9fa2062018-11-13 21:51:13 +0800451 ASSERT_TRUE(result == nullptr);
452
453 // Finally, use gethostbyname2() to resolve ip6-localhost to ::1 from
454 // the hosts file.
455 dns.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900456 result = gethostbyname2(kIp6LocalHost, AF_INET6);
Ken Chenb9fa2062018-11-13 21:51:13 +0800457 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
458 ASSERT_FALSE(result == nullptr);
459 ASSERT_EQ(16, result->h_length);
460 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900461 EXPECT_EQ(kIp6LocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800462 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800463}
464
465TEST_F(ResolverTest, GetHostByName_numeric) {
466 // Add a dummy nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900467 test::DNSResponder dns;
468 StartDns(dns, {});
469 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800470
471 // Numeric v4 address: expect no DNS queries
472 constexpr char numeric_v4[] = "192.168.0.1";
Ken Chenb9fa2062018-11-13 21:51:13 +0800473 const hostent* result = gethostbyname(numeric_v4);
Sehee Parkbbca0202018-11-16 10:53:16 +0900474 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800475 ASSERT_FALSE(result == nullptr);
476 ASSERT_EQ(4, result->h_length); // v4
477 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
478 EXPECT_EQ(numeric_v4, ToString(result));
479 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
480
481 // gethostbyname() recognizes a v6 address, and fails with no DNS queries
482 constexpr char numeric_v6[] = "2001:db8::42";
483 dns.clearQueries();
484 result = gethostbyname(numeric_v6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900485 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800486 EXPECT_TRUE(result == nullptr);
487
488 // Numeric v6 address with gethostbyname2(): succeeds with no DNS queries
489 dns.clearQueries();
490 result = gethostbyname2(numeric_v6, AF_INET6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900491 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800492 ASSERT_FALSE(result == nullptr);
493 ASSERT_EQ(16, result->h_length); // v6
494 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
495 EXPECT_EQ(numeric_v6, ToString(result));
496 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
497
498 // Numeric v6 address with scope work with getaddrinfo(),
499 // but gethostbyname2() does not understand them; it issues two dns
500 // queries, then fails. This hardly ever happens, there's no point
501 // in fixing this. This test simply verifies the current (bogus)
502 // behavior to avoid further regressions (like crashes, or leaks).
503 constexpr char numeric_v6_scope[] = "fe80::1%lo";
504 dns.clearQueries();
505 result = gethostbyname2(numeric_v6_scope, AF_INET6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900506 EXPECT_EQ(2U, dns.queries().size()); // OUCH!
Ken Chenb9fa2062018-11-13 21:51:13 +0800507 ASSERT_TRUE(result == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800508}
509
510TEST_F(ResolverTest, BinderSerialization) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800511 std::vector<int> params_offsets = {
Luke Huang5bd827c2019-03-14 16:10:04 +0800512 IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY,
513 IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD,
514 IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES,
515 IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES,
516 IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC,
517 IDnsResolver::RESOLVER_PARAMS_RETRY_COUNT,
Ken Chenb9fa2062018-11-13 21:51:13 +0800518 };
Bernie Innocentib102dd22018-12-04 14:57:48 +0900519 const int size = static_cast<int>(params_offsets.size());
Luke Huang5bd827c2019-03-14 16:10:04 +0800520 EXPECT_EQ(size, IDnsResolver::RESOLVER_PARAMS_COUNT);
Ken Chenb9fa2062018-11-13 21:51:13 +0800521 std::sort(params_offsets.begin(), params_offsets.end());
Bernie Innocentib102dd22018-12-04 14:57:48 +0900522 for (int i = 0; i < size; ++i) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800523 EXPECT_EQ(params_offsets[i], i);
524 }
525}
526
527TEST_F(ResolverTest, GetHostByName_Binder) {
Luke Huangf8215372019-11-22 11:53:41 +0800528 std::vector<std::string> domains = {"example.com"};
Ken Chenb9fa2062018-11-13 21:51:13 +0800529 std::vector<std::unique_ptr<test::DNSResponder>> dns;
530 std::vector<std::string> servers;
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900531 std::vector<DnsResponderClient::Mapping> mappings;
532 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupMappings(1, domains, &mappings));
533 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupDNSServers(4, mappings, &dns, &servers));
Ken Chenb9fa2062018-11-13 21:51:13 +0800534 ASSERT_EQ(1U, mappings.size());
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900535 const DnsResponderClient::Mapping& mapping = mappings[0];
Ken Chenb9fa2062018-11-13 21:51:13 +0800536
Xiao Ma09b71022018-12-11 17:56:32 +0900537 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains, kDefaultParams));
Ken Chenb9fa2062018-11-13 21:51:13 +0800538
539 const hostent* result = gethostbyname(mapping.host.c_str());
Bernie Innocentib102dd22018-12-04 14:57:48 +0900540 const size_t total_queries =
Luke Huangfde82482019-06-04 01:04:53 +0800541 std::accumulate(dns.begin(), dns.end(), 0, [&mapping](size_t total, auto& d) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800542 return total + GetNumQueriesForType(*d, ns_type::ns_t_a, mapping.entry.c_str());
543 });
544
545 EXPECT_LE(1U, total_queries);
546 ASSERT_FALSE(result == nullptr);
547 ASSERT_EQ(4, result->h_length);
548 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
549 EXPECT_EQ(mapping.ip4, ToString(result));
550 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
551
552 std::vector<std::string> res_servers;
553 std::vector<std::string> res_domains;
Mike Yu0a1c53d2018-11-26 13:26:21 +0900554 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +0900555 res_params res_params;
Ken Chenb9fa2062018-11-13 21:51:13 +0800556 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +0800557 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +0800558 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
559 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
560 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chenb9fa2062018-11-13 21:51:13 +0800561 EXPECT_EQ(servers.size(), res_servers.size());
562 EXPECT_EQ(domains.size(), res_domains.size());
Mike Yu0a1c53d2018-11-26 13:26:21 +0900563 EXPECT_EQ(0U, res_tls_servers.size());
Luke Huang5bd827c2019-03-14 16:10:04 +0800564 ASSERT_EQ(static_cast<size_t>(IDnsResolver::RESOLVER_PARAMS_COUNT), kDefaultParams.size());
565 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY],
566 res_params.sample_validity);
567 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900568 res_params.success_threshold);
Luke Huang5bd827c2019-03-14 16:10:04 +0800569 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
570 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
571 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
Ken Chenb9fa2062018-11-13 21:51:13 +0800572 res_params.base_timeout_msec);
573 EXPECT_EQ(servers.size(), res_stats.size());
574
Bernie Innocenti0c067e42019-04-01 15:33:16 +0900575 EXPECT_THAT(res_servers, testing::UnorderedElementsAreArray(servers));
576 EXPECT_THAT(res_domains, testing::UnorderedElementsAreArray(domains));
Ken Chenb9fa2062018-11-13 21:51:13 +0800577}
578
579TEST_F(ResolverTest, GetAddrInfo) {
Xiao Ma09b71022018-12-11 17:56:32 +0900580 constexpr char listen_addr[] = "127.0.0.4";
581 constexpr char listen_addr2[] = "127.0.0.5";
582 constexpr char host_name[] = "howdy.example.com.";
Ken Chenb9fa2062018-11-13 21:51:13 +0800583
Xiao Ma09b71022018-12-11 17:56:32 +0900584 const std::vector<DnsRecord> records = {
585 {host_name, ns_type::ns_t_a, "1.2.3.4"},
586 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
587 };
588 test::DNSResponder dns(listen_addr);
589 test::DNSResponder dns2(listen_addr2);
590 StartDns(dns, records);
591 StartDns(dns2, records);
Ken Chenb9fa2062018-11-13 21:51:13 +0800592
Xiao Ma09b71022018-12-11 17:56:32 +0900593 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}));
Ken Chenb9fa2062018-11-13 21:51:13 +0800594 dns.clearQueries();
595 dns2.clearQueries();
596
597 ScopedAddrinfo result = safe_getaddrinfo("howdy", nullptr, nullptr);
598 EXPECT_TRUE(result != nullptr);
599 size_t found = GetNumQueries(dns, host_name);
600 EXPECT_LE(1U, found);
601 // Could be A or AAAA
602 std::string result_str = ToString(result);
603 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +0800604 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +0800605
606 // Verify that the name is cached.
607 size_t old_found = found;
608 result = safe_getaddrinfo("howdy", nullptr, nullptr);
609 EXPECT_TRUE(result != nullptr);
610 found = GetNumQueries(dns, host_name);
611 EXPECT_LE(1U, found);
612 EXPECT_EQ(old_found, found);
613 result_str = ToString(result);
Luke Huangf8215372019-11-22 11:53:41 +0800614 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4") << result_str;
Ken Chenb9fa2062018-11-13 21:51:13 +0800615
616 // Change the DNS resolver, ensure that queries are still cached.
Xiao Ma09b71022018-12-11 17:56:32 +0900617 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr2}));
Ken Chenb9fa2062018-11-13 21:51:13 +0800618 dns.clearQueries();
619 dns2.clearQueries();
620
621 result = safe_getaddrinfo("howdy", nullptr, nullptr);
622 EXPECT_TRUE(result != nullptr);
623 found = GetNumQueries(dns, host_name);
624 size_t found2 = GetNumQueries(dns2, host_name);
625 EXPECT_EQ(0U, found);
626 EXPECT_LE(0U, found2);
627
628 // Could be A or AAAA
629 result_str = ToString(result);
630 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +0800631 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +0800632}
633
634TEST_F(ResolverTest, GetAddrInfoV4) {
Xiao Ma09b71022018-12-11 17:56:32 +0900635 test::DNSResponder dns;
636 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.5"}});
637 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800638
Xiao Ma09b71022018-12-11 17:56:32 +0900639 const addrinfo hints = {.ai_family = AF_INET};
640 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
Ken Chenb9fa2062018-11-13 21:51:13 +0800641 EXPECT_TRUE(result != nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900642 EXPECT_EQ(1U, GetNumQueries(dns, kHelloExampleCom));
Ken Chenb9fa2062018-11-13 21:51:13 +0800643 EXPECT_EQ("1.2.3.5", ToString(result));
644}
645
646TEST_F(ResolverTest, GetAddrInfo_localhost) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800647 // Add a dummy nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900648 test::DNSResponder dns;
649 StartDns(dns, {});
650 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800651
Xiao Ma09b71022018-12-11 17:56:32 +0900652 ScopedAddrinfo result = safe_getaddrinfo(kLocalHost, nullptr, nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800653 EXPECT_TRUE(result != nullptr);
654 // Expect no DNS queries; localhost is resolved via /etc/hosts
655 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900656 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800657
Xiao Ma09b71022018-12-11 17:56:32 +0900658 result = safe_getaddrinfo(kIp6LocalHost, nullptr, nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800659 EXPECT_TRUE(result != nullptr);
660 // Expect no DNS queries; ip6-localhost is resolved via /etc/hosts
661 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900662 EXPECT_EQ(kIp6LocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800663}
664
Luke Huangd8ac4752019-06-18 17:05:47 +0800665TEST_F(ResolverTest, GetAddrInfo_InvalidSocketType) {
666 test::DNSResponder dns;
667 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.5"}});
668 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
669
670 // TODO: Test other invalid socket types.
671 const addrinfo hints = {
672 .ai_family = AF_UNSPEC,
Luke Huangd8ac4752019-06-18 17:05:47 +0800673 .ai_socktype = SOCK_PACKET,
674 };
675 addrinfo* result = nullptr;
676 // This is a valid hint, but the query won't be sent because the socket type is
677 // not supported.
678 EXPECT_EQ(EAI_NODATA, getaddrinfo("hello", nullptr, &hints, &result));
679 ScopedAddrinfo result_cleanup(result);
680 EXPECT_EQ(nullptr, result);
681}
682
Ken Chen92bed612018-12-22 21:46:55 +0800683// Verify if the resolver correctly handle multiple queries simultaneously
684// step 1: set dns server#1 into deferred responding mode.
685// step 2: thread#1 query "hello.example.com." --> resolver send query to server#1.
686// step 3: thread#2 query "hello.example.com." --> resolver hold the request and wait for
687// response of previous pending query sent by thread#1.
688// step 4: thread#3 query "konbanha.example.com." --> resolver send query to server#3. Server
689// respond to resolver immediately.
690// step 5: check if server#1 get 1 query by thread#1, server#2 get 0 query, server#3 get 1 query.
691// step 6: resume dns server#1 to respond dns query in step#2.
692// step 7: thread#1 and #2 should get returned from DNS query after step#6. Also, check the
693// number of queries in server#2 is 0 to ensure thread#2 does not wake up unexpectedly
694// before signaled by thread#1.
695TEST_F(ResolverTest, GetAddrInfoV4_deferred_resp) {
696 const char* listen_addr1 = "127.0.0.9";
697 const char* listen_addr2 = "127.0.0.10";
698 const char* listen_addr3 = "127.0.0.11";
699 const char* listen_srv = "53";
700 const char* host_name_deferred = "hello.example.com.";
701 const char* host_name_normal = "konbanha.example.com.";
Mike Yufc125e42019-05-15 20:41:28 +0800702 test::DNSResponder dns1(listen_addr1, listen_srv, ns_rcode::ns_r_servfail);
703 test::DNSResponder dns2(listen_addr2, listen_srv, ns_rcode::ns_r_servfail);
704 test::DNSResponder dns3(listen_addr3, listen_srv, ns_rcode::ns_r_servfail);
Ken Chen92bed612018-12-22 21:46:55 +0800705 dns1.addMapping(host_name_deferred, ns_type::ns_t_a, "1.2.3.4");
706 dns2.addMapping(host_name_deferred, ns_type::ns_t_a, "1.2.3.4");
707 dns3.addMapping(host_name_normal, ns_type::ns_t_a, "1.2.3.5");
708 ASSERT_TRUE(dns1.startServer());
709 ASSERT_TRUE(dns2.startServer());
710 ASSERT_TRUE(dns3.startServer());
711 const std::vector<std::string> servers_for_t1 = {listen_addr1};
712 const std::vector<std::string> servers_for_t2 = {listen_addr2};
713 const std::vector<std::string> servers_for_t3 = {listen_addr3};
714 addrinfo hints = {.ai_family = AF_INET};
715 const std::vector<int> params = {300, 25, 8, 8, 5000};
716 bool t3_task_done = false;
717
718 dns1.setDeferredResp(true);
719 std::thread t1([&, this]() {
720 ASSERT_TRUE(
721 mDnsClient.SetResolversForNetwork(servers_for_t1, kDefaultSearchDomains, params));
722 ScopedAddrinfo result = safe_getaddrinfo(host_name_deferred, nullptr, &hints);
723 // t3's dns query should got returned first
724 EXPECT_TRUE(t3_task_done);
725 EXPECT_EQ(1U, GetNumQueries(dns1, host_name_deferred));
726 EXPECT_TRUE(result != nullptr);
727 EXPECT_EQ("1.2.3.4", ToString(result));
728 });
729
730 // ensuring t1 and t2 handler functions are processed in order
731 usleep(100 * 1000);
732 std::thread t2([&, this]() {
733 ASSERT_TRUE(
734 mDnsClient.SetResolversForNetwork(servers_for_t2, kDefaultSearchDomains, params));
735 ScopedAddrinfo result = safe_getaddrinfo(host_name_deferred, nullptr, &hints);
736 EXPECT_TRUE(t3_task_done);
737 EXPECT_EQ(0U, GetNumQueries(dns2, host_name_deferred));
738 EXPECT_TRUE(result != nullptr);
739 EXPECT_EQ("1.2.3.4", ToString(result));
740
741 std::vector<std::string> res_servers;
742 std::vector<std::string> res_domains;
743 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +0900744 res_params res_params;
Ken Chen92bed612018-12-22 21:46:55 +0800745 std::vector<ResolverStats> res_stats;
746 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +0800747 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
748 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains,
749 &res_tls_servers, &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chen92bed612018-12-22 21:46:55 +0800750 EXPECT_EQ(0, wait_for_pending_req_timeout_count);
751 });
752
753 // ensuring t2 and t3 handler functions are processed in order
754 usleep(100 * 1000);
755 std::thread t3([&, this]() {
756 ASSERT_TRUE(
757 mDnsClient.SetResolversForNetwork(servers_for_t3, kDefaultSearchDomains, params));
758 ScopedAddrinfo result = safe_getaddrinfo(host_name_normal, nullptr, &hints);
759 EXPECT_EQ(1U, GetNumQueries(dns1, host_name_deferred));
760 EXPECT_EQ(0U, GetNumQueries(dns2, host_name_deferred));
761 EXPECT_EQ(1U, GetNumQueries(dns3, host_name_normal));
762 EXPECT_TRUE(result != nullptr);
763 EXPECT_EQ("1.2.3.5", ToString(result));
764
765 t3_task_done = true;
766 dns1.setDeferredResp(false);
767 });
768 t3.join();
769 t1.join();
770 t2.join();
771}
772
lifr4e4a2e02019-01-29 16:53:51 +0800773TEST_F(ResolverTest, GetAddrInfo_cnames) {
774 constexpr char host_name[] = "host.example.com.";
775 test::DNSResponder dns;
776 const std::vector<DnsRecord> records = {
777 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
778 {"a.example.com.", ns_type::ns_t_cname, "b.example.com."},
779 {"b.example.com.", ns_type::ns_t_cname, "c.example.com."},
780 {"c.example.com.", ns_type::ns_t_cname, "d.example.com."},
781 {"d.example.com.", ns_type::ns_t_cname, "e.example.com."},
782 {"e.example.com.", ns_type::ns_t_cname, host_name},
783 {host_name, ns_type::ns_t_a, "1.2.3.3"},
784 {host_name, ns_type::ns_t_aaaa, "2001:db8::42"},
785 };
786 StartDns(dns, records);
787 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
788
789 addrinfo hints = {.ai_family = AF_INET};
790 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
791 EXPECT_TRUE(result != nullptr);
792 EXPECT_EQ("1.2.3.3", ToString(result));
793
794 dns.clearQueries();
795 hints = {.ai_family = AF_INET6};
796 result = safe_getaddrinfo("hello", nullptr, &hints);
797 EXPECT_TRUE(result != nullptr);
798 EXPECT_EQ("2001:db8::42", ToString(result));
799}
800
801TEST_F(ResolverTest, GetAddrInfo_cnamesNoIpAddress) {
802 test::DNSResponder dns;
803 const std::vector<DnsRecord> records = {
804 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
805 };
806 StartDns(dns, records);
807 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
808
809 addrinfo hints = {.ai_family = AF_INET};
810 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
811 EXPECT_TRUE(result == nullptr);
812
813 dns.clearQueries();
814 hints = {.ai_family = AF_INET6};
815 result = safe_getaddrinfo("hello", nullptr, &hints);
816 EXPECT_TRUE(result == nullptr);
817}
818
819TEST_F(ResolverTest, GetAddrInfo_cnamesIllegalRdata) {
820 test::DNSResponder dns;
821 const std::vector<DnsRecord> records = {
822 {kHelloExampleCom, ns_type::ns_t_cname, ".!#?"},
823 };
824 StartDns(dns, records);
825 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
826
827 addrinfo hints = {.ai_family = AF_INET};
828 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
829 EXPECT_TRUE(result == nullptr);
830
831 dns.clearQueries();
832 hints = {.ai_family = AF_INET6};
833 result = safe_getaddrinfo("hello", nullptr, &hints);
834 EXPECT_TRUE(result == nullptr);
835}
836
Ken Chenb9fa2062018-11-13 21:51:13 +0800837TEST_F(ResolverTest, MultidomainResolution) {
Xiao Ma09b71022018-12-11 17:56:32 +0900838 constexpr char host_name[] = "nihao.example2.com.";
Luke Huangf8215372019-11-22 11:53:41 +0800839 std::vector<std::string> searchDomains = {"example1.com", "example2.com", "example3.com"};
Ken Chenb9fa2062018-11-13 21:51:13 +0800840
Xiao Ma09b71022018-12-11 17:56:32 +0900841 test::DNSResponder dns("127.0.0.6");
842 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.3"}});
843 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({"127.0.0.6"}, searchDomains));
844
Ken Chenb9fa2062018-11-13 21:51:13 +0800845 const hostent* result = gethostbyname("nihao");
Xiao Ma09b71022018-12-11 17:56:32 +0900846
Ken Chenb9fa2062018-11-13 21:51:13 +0800847 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
848 ASSERT_FALSE(result == nullptr);
849 ASSERT_EQ(4, result->h_length);
850 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
851 EXPECT_EQ("1.2.3.3", ToString(result));
852 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800853}
854
855TEST_F(ResolverTest, GetAddrInfoV6_numeric) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800856 constexpr char host_name[] = "ohayou.example.com.";
857 constexpr char numeric_addr[] = "fe80::1%lo";
858
Xiao Ma09b71022018-12-11 17:56:32 +0900859 test::DNSResponder dns;
Ken Chenb9fa2062018-11-13 21:51:13 +0800860 dns.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900861 StartDns(dns, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
862 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800863
864 addrinfo hints = {.ai_family = AF_INET6};
865 ScopedAddrinfo result = safe_getaddrinfo(numeric_addr, nullptr, &hints);
866 EXPECT_TRUE(result != nullptr);
867 EXPECT_EQ(numeric_addr, ToString(result));
868 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
869
870 // Now try a non-numeric hostname query with the AI_NUMERICHOST flag set.
871 // We should fail without sending out a DNS query.
872 hints.ai_flags |= AI_NUMERICHOST;
873 result = safe_getaddrinfo(host_name, nullptr, &hints);
874 EXPECT_TRUE(result == nullptr);
875 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
876}
877
878TEST_F(ResolverTest, GetAddrInfoV6_failing) {
Xiao Ma09b71022018-12-11 17:56:32 +0900879 constexpr char listen_addr0[] = "127.0.0.7";
880 constexpr char listen_addr1[] = "127.0.0.8";
Ken Chenb9fa2062018-11-13 21:51:13 +0800881 const char* host_name = "ohayou.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +0900882
883 test::DNSResponder dns0(listen_addr0);
884 test::DNSResponder dns1(listen_addr1);
Ken Chenb9fa2062018-11-13 21:51:13 +0800885 dns0.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900886 StartDns(dns0, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
887 StartDns(dns1, {{host_name, ns_type::ns_t_aaaa, "2001:db8::6"}});
888
Luke Huangf8215372019-11-22 11:53:41 +0800889 std::vector<std::string> servers = {listen_addr0, listen_addr1};
Ken Chenb9fa2062018-11-13 21:51:13 +0800890 // <sample validity in s> <success threshold in percent> <min samples> <max samples>
891 int sample_count = 8;
Luke Huangf8215372019-11-22 11:53:41 +0800892 const std::vector<int> params = {300, 25, sample_count, sample_count};
Xiao Ma09b71022018-12-11 17:56:32 +0900893 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, kDefaultSearchDomains, params));
Ken Chenb9fa2062018-11-13 21:51:13 +0800894
895 // Repeatedly perform resolutions for non-existing domains until MAXNSSAMPLES resolutions have
896 // reached the dns0, which is set to fail. No more requests should then arrive at that server
897 // for the next sample_lifetime seconds.
898 // TODO: This approach is implementation-dependent, change once metrics reporting is available.
Xiao Ma09b71022018-12-11 17:56:32 +0900899 const addrinfo hints = {.ai_family = AF_INET6};
Bernie Innocentib102dd22018-12-04 14:57:48 +0900900 for (int i = 0; i < sample_count; ++i) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800901 std::string domain = StringPrintf("nonexistent%d", i);
902 ScopedAddrinfo result = safe_getaddrinfo(domain.c_str(), nullptr, &hints);
903 }
904 // Due to 100% errors for all possible samples, the server should be ignored from now on and
905 // only the second one used for all following queries, until NSSAMPLE_VALIDITY is reached.
906 dns0.clearQueries();
907 dns1.clearQueries();
908 ScopedAddrinfo result = safe_getaddrinfo("ohayou", nullptr, &hints);
909 EXPECT_TRUE(result != nullptr);
910 EXPECT_EQ(0U, GetNumQueries(dns0, host_name));
911 EXPECT_EQ(1U, GetNumQueries(dns1, host_name));
912}
913
914TEST_F(ResolverTest, GetAddrInfoV6_nonresponsive) {
Xiao Ma09b71022018-12-11 17:56:32 +0900915 constexpr char listen_addr0[] = "127.0.0.7";
916 constexpr char listen_addr1[] = "127.0.0.8";
917 constexpr char listen_srv[] = "53";
918 constexpr char host_name1[] = "ohayou.example.com.";
919 constexpr char host_name2[] = "ciao.example.com.";
Luke Huang483cf332019-06-03 17:24:51 +0800920 const std::vector<std::string> defaultSearchDomain = {"example.com"};
921 // The minimal timeout is 1000ms, so we can't decrease timeout
922 // So reduce retry count.
923 const std::vector<int> reduceRetryParams = {
924 300, // sample validity in seconds
925 25, // success threshod in percent
926 8, 8, // {MIN,MAX}_SAMPLES
927 1000, // BASE_TIMEOUT_MSEC
928 1, // retry count
929 };
Xiao Ma09b71022018-12-11 17:56:32 +0900930 const std::vector<DnsRecord> records0 = {
931 {host_name1, ns_type::ns_t_aaaa, "2001:db8::5"},
932 {host_name2, ns_type::ns_t_aaaa, "2001:db8::5"},
933 };
934 const std::vector<DnsRecord> records1 = {
935 {host_name1, ns_type::ns_t_aaaa, "2001:db8::6"},
936 {host_name2, ns_type::ns_t_aaaa, "2001:db8::6"},
937 };
Ken Chenb9fa2062018-11-13 21:51:13 +0800938
939 // dns0 does not respond with 100% probability, while
940 // dns1 responds normally, at least initially.
Mike Yufc125e42019-05-15 20:41:28 +0800941 test::DNSResponder dns0(listen_addr0, listen_srv, static_cast<ns_rcode>(-1));
942 test::DNSResponder dns1(listen_addr1, listen_srv, static_cast<ns_rcode>(-1));
Ken Chenb9fa2062018-11-13 21:51:13 +0800943 dns0.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900944 StartDns(dns0, records0);
945 StartDns(dns1, records1);
Luke Huang483cf332019-06-03 17:24:51 +0800946 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr0, listen_addr1}, defaultSearchDomain,
947 reduceRetryParams));
Ken Chenb9fa2062018-11-13 21:51:13 +0800948
Luke Huang483cf332019-06-03 17:24:51 +0800949 // Specify ai_socktype to make getaddrinfo will only query 1 time
950 const addrinfo hints = {.ai_family = AF_INET6, .ai_socktype = SOCK_STREAM};
Ken Chenb9fa2062018-11-13 21:51:13 +0800951
952 // dns0 will ignore the request, and we'll fallback to dns1 after the first
953 // retry.
954 ScopedAddrinfo result = safe_getaddrinfo(host_name1, nullptr, &hints);
955 EXPECT_TRUE(result != nullptr);
956 EXPECT_EQ(1U, GetNumQueries(dns0, host_name1));
957 EXPECT_EQ(1U, GetNumQueries(dns1, host_name1));
958
959 // Now make dns1 also ignore 100% requests... The resolve should alternate
Luke Huang483cf332019-06-03 17:24:51 +0800960 // queries between the nameservers and fail
Ken Chenb9fa2062018-11-13 21:51:13 +0800961 dns1.setResponseProbability(0.0);
962 addrinfo* result2 = nullptr;
963 EXPECT_EQ(EAI_NODATA, getaddrinfo(host_name2, nullptr, &hints, &result2));
964 EXPECT_EQ(nullptr, result2);
Luke Huang483cf332019-06-03 17:24:51 +0800965 EXPECT_EQ(1U, GetNumQueries(dns0, host_name2));
966 EXPECT_EQ(1U, GetNumQueries(dns1, host_name2));
Ken Chenb9fa2062018-11-13 21:51:13 +0800967}
968
969TEST_F(ResolverTest, GetAddrInfoV6_concurrent) {
Xiao Ma09b71022018-12-11 17:56:32 +0900970 constexpr char listen_addr0[] = "127.0.0.9";
971 constexpr char listen_addr1[] = "127.0.0.10";
972 constexpr char listen_addr2[] = "127.0.0.11";
973 constexpr char host_name[] = "konbanha.example.com.";
974
975 test::DNSResponder dns0(listen_addr0);
976 test::DNSResponder dns1(listen_addr1);
977 test::DNSResponder dns2(listen_addr2);
978 StartDns(dns0, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
979 StartDns(dns1, {{host_name, ns_type::ns_t_aaaa, "2001:db8::6"}});
980 StartDns(dns2, {{host_name, ns_type::ns_t_aaaa, "2001:db8::7"}});
981
Luke Huangf8215372019-11-22 11:53:41 +0800982 const std::vector<std::string> servers = {listen_addr0, listen_addr1, listen_addr2};
Ken Chenb9fa2062018-11-13 21:51:13 +0800983 std::vector<std::thread> threads(10);
984 for (std::thread& thread : threads) {
Luke Huangf8215372019-11-22 11:53:41 +0800985 thread = std::thread([this, &servers]() {
986 unsigned delay = arc4random_uniform(1 * 1000 * 1000); // <= 1s
Ken Chenb9fa2062018-11-13 21:51:13 +0800987 usleep(delay);
988 std::vector<std::string> serverSubset;
989 for (const auto& server : servers) {
990 if (arc4random_uniform(2)) {
991 serverSubset.push_back(server);
992 }
993 }
994 if (serverSubset.empty()) serverSubset = servers;
Xiao Ma09b71022018-12-11 17:56:32 +0900995 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(serverSubset));
996 const addrinfo hints = {.ai_family = AF_INET6};
Ken Chenb9fa2062018-11-13 21:51:13 +0800997 addrinfo* result = nullptr;
998 int rv = getaddrinfo("konbanha", nullptr, &hints, &result);
999 EXPECT_EQ(0, rv) << "error [" << rv << "] " << gai_strerror(rv);
1000 if (result) {
1001 freeaddrinfo(result);
1002 result = nullptr;
1003 }
1004 });
1005 }
1006 for (std::thread& thread : threads) {
1007 thread.join();
1008 }
Ken Chen92bed612018-12-22 21:46:55 +08001009
1010 std::vector<std::string> res_servers;
1011 std::vector<std::string> res_domains;
1012 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001013 res_params res_params;
Ken Chen92bed612018-12-22 21:46:55 +08001014 std::vector<ResolverStats> res_stats;
1015 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001016 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1017 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1018 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chen92bed612018-12-22 21:46:55 +08001019 EXPECT_EQ(0, wait_for_pending_req_timeout_count);
Ken Chenb9fa2062018-11-13 21:51:13 +08001020}
1021
Mike Yu8ac63402019-12-02 15:28:38 +08001022TEST_F(ResolverTest, SkipBadServersDueToInternalError) {
1023 constexpr char listen_addr1[] = "fe80::1";
1024 constexpr char listen_addr2[] = "255.255.255.255";
1025 constexpr char listen_addr3[] = "127.0.0.3";
1026
1027 test::DNSResponder dns(listen_addr3);
1028 ASSERT_TRUE(dns.startServer());
1029
1030 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
1031 parcel.servers = {listen_addr1, listen_addr2, listen_addr3};
1032
1033 // Bad servers can be distinguished after two attempts.
1034 parcel.minSamples = 2;
1035 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1036
1037 // Start querying five times.
1038 for (int i = 0; i < 5; i++) {
1039 std::string hostName = StringPrintf("hello%d.com.", i);
1040 dns.addMapping(hostName, ns_type::ns_t_a, "1.2.3.4");
1041 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1042 EXPECT_TRUE(safe_getaddrinfo(hostName.c_str(), nullptr, &hints) != nullptr);
1043 }
1044
Mike Yuc0000252020-03-19 07:14:23 +00001045 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1046 NameserverStats(listen_addr1).setInternalErrors(2),
1047 NameserverStats(listen_addr2).setInternalErrors(2),
1048 NameserverStats(listen_addr3).setSuccesses(5),
1049 };
1050 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
Mike Yu8ac63402019-12-02 15:28:38 +08001051}
1052
1053TEST_F(ResolverTest, SkipBadServersDueToTimeout) {
1054 constexpr char listen_addr1[] = "127.0.0.3";
1055 constexpr char listen_addr2[] = "127.0.0.4";
1056
1057 // Set dns1 non-responsive and dns2 workable.
1058 test::DNSResponder dns1(listen_addr1, test::kDefaultListenService, static_cast<ns_rcode>(-1));
1059 test::DNSResponder dns2(listen_addr2);
1060 dns1.setResponseProbability(0.0);
1061 ASSERT_TRUE(dns1.startServer());
1062 ASSERT_TRUE(dns2.startServer());
1063
1064 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
1065 parcel.servers = {listen_addr1, listen_addr2};
1066
1067 // Bad servers can be distinguished after two attempts.
1068 parcel.minSamples = 2;
1069 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1070
1071 // Start querying five times.
1072 for (int i = 0; i < 5; i++) {
1073 std::string hostName = StringPrintf("hello%d.com.", i);
1074 dns1.addMapping(hostName, ns_type::ns_t_a, "1.2.3.4");
1075 dns2.addMapping(hostName, ns_type::ns_t_a, "1.2.3.5");
1076 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1077 EXPECT_TRUE(safe_getaddrinfo(hostName.c_str(), nullptr, &hints) != nullptr);
1078 }
1079
Mike Yuc0000252020-03-19 07:14:23 +00001080 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1081 NameserverStats(listen_addr1).setTimeouts(2),
1082 NameserverStats(listen_addr2).setSuccesses(5),
1083 };
1084 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
Mike Yu8ac63402019-12-02 15:28:38 +08001085 EXPECT_EQ(dns1.queries().size(), 2U);
1086 EXPECT_EQ(dns2.queries().size(), 5U);
1087}
1088
chenbrucefd837fa2019-10-29 18:35:36 +08001089TEST_F(ResolverTest, GetAddrInfoFromCustTable_InvalidInput) {
1090 constexpr char hostnameNoip[] = "noip.example.com.";
1091 constexpr char hostnameInvalidip[] = "invalidip.example.com.";
1092 const std::vector<aidl::android::net::ResolverHostsParcel> invalidCustHosts = {
1093 {"", hostnameNoip},
1094 {"wrong IP", hostnameInvalidip},
1095 };
1096 test::DNSResponder dns;
1097 StartDns(dns, {});
1098 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
Ken Chen05420812020-04-07 18:58:38 +00001099 resolverParams.resolverOptions.hosts = invalidCustHosts;
chenbrucefd837fa2019-10-29 18:35:36 +08001100 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1101 for (const auto& hostname : {hostnameNoip, hostnameInvalidip}) {
1102 // The query won't get data from customized table because of invalid customized table
1103 // and DNSResponder also has no records. hostnameNoip has never registered and
1104 // hostnameInvalidip has registered but wrong IP.
1105 const addrinfo hints = {.ai_family = AF_UNSPEC};
1106 ScopedAddrinfo result = safe_getaddrinfo(hostname, nullptr, &hints);
1107 ASSERT_TRUE(result == nullptr);
1108 EXPECT_EQ(4U, GetNumQueries(dns, hostname));
1109 }
1110}
1111
1112TEST_F(ResolverTest, GetAddrInfoFromCustTable) {
1113 constexpr char hostnameV4[] = "v4only.example.com.";
1114 constexpr char hostnameV6[] = "v6only.example.com.";
1115 constexpr char hostnameV4V6[] = "v4v6.example.com.";
1116 constexpr char custAddrV4[] = "1.2.3.4";
1117 constexpr char custAddrV6[] = "::1.2.3.4";
1118 constexpr char dnsSvAddrV4[] = "1.2.3.5";
1119 constexpr char dnsSvAddrV6[] = "::1.2.3.5";
1120 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4 = {
1121 {custAddrV4, hostnameV4},
1122 };
1123 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV6 = {
1124 {custAddrV6, hostnameV6},
1125 };
1126 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4V6 = {
1127 {custAddrV4, hostnameV4V6},
1128 {custAddrV6, hostnameV4V6},
1129 };
1130 const std::vector<DnsRecord> dnsSvHostV4 = {
1131 {hostnameV4, ns_type::ns_t_a, dnsSvAddrV4},
1132 };
1133 const std::vector<DnsRecord> dnsSvHostV6 = {
1134 {hostnameV6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1135 };
1136 const std::vector<DnsRecord> dnsSvHostV4V6 = {
1137 {hostnameV4V6, ns_type::ns_t_a, dnsSvAddrV4},
1138 {hostnameV4V6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1139 };
1140 struct TestConfig {
1141 const std::string name;
1142 const std::vector<aidl::android::net::ResolverHostsParcel> customizedHosts;
1143 const std::vector<DnsRecord> dnsserverHosts;
1144 const std::vector<std::string> queryResult;
1145 std::string asParameters() const {
1146 return StringPrintf("name: %s, customizedHosts: %s, dnsserverHosts: %s", name.c_str(),
1147 customizedHosts.empty() ? "No" : "Yes",
1148 dnsserverHosts.empty() ? "No" : "Yes");
1149 }
1150 } testConfigs[]{
1151 // clang-format off
1152 {hostnameV4, {}, {}, {}},
1153 {hostnameV4, {}, dnsSvHostV4, {dnsSvAddrV4}},
1154 {hostnameV4, custHostV4, {}, {custAddrV4}},
1155 {hostnameV4, custHostV4, dnsSvHostV4, {custAddrV4}},
1156 {hostnameV6, {}, {}, {}},
1157 {hostnameV6, {}, dnsSvHostV6, {dnsSvAddrV6}},
1158 {hostnameV6, custHostV6, {}, {custAddrV6}},
1159 {hostnameV6, custHostV6, dnsSvHostV6, {custAddrV6}},
1160 {hostnameV4V6, {}, {}, {}},
1161 {hostnameV4V6, {}, dnsSvHostV4V6, {dnsSvAddrV4, dnsSvAddrV6}},
1162 {hostnameV4V6, custHostV4V6, {}, {custAddrV4, custAddrV6}},
1163 {hostnameV4V6, custHostV4V6, dnsSvHostV4V6, {custAddrV4, custAddrV6}},
1164 // clang-format on
1165 };
1166
1167 for (const auto& config : testConfigs) {
1168 SCOPED_TRACE(config.asParameters());
1169
1170 test::DNSResponder dns;
1171 StartDns(dns, config.dnsserverHosts);
1172
1173 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
Ken Chen05420812020-04-07 18:58:38 +00001174 resolverParams.resolverOptions.hosts = config.customizedHosts;
chenbrucefd837fa2019-10-29 18:35:36 +08001175 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1176 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM};
1177 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
1178 if (config.customizedHosts.empty() && config.dnsserverHosts.empty()) {
1179 ASSERT_TRUE(result == nullptr);
1180 EXPECT_EQ(2U, GetNumQueries(dns, config.name.c_str()));
1181 } else {
1182 ASSERT_TRUE(result != nullptr);
1183 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(config.queryResult));
1184 EXPECT_EQ(config.customizedHosts.empty() ? 2U : 0U,
1185 GetNumQueries(dns, config.name.c_str()));
1186 }
1187
1188 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
1189 }
1190}
1191
1192TEST_F(ResolverTest, GetAddrInfoFromCustTable_Modify) {
1193 constexpr char hostnameV4V6[] = "v4v6.example.com.";
1194 constexpr char custAddrV4[] = "1.2.3.4";
1195 constexpr char custAddrV6[] = "::1.2.3.4";
1196 constexpr char dnsSvAddrV4[] = "1.2.3.5";
1197 constexpr char dnsSvAddrV6[] = "::1.2.3.5";
1198 const std::vector<DnsRecord> dnsSvHostV4V6 = {
1199 {hostnameV4V6, ns_type::ns_t_a, dnsSvAddrV4},
1200 {hostnameV4V6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1201 };
1202 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4V6 = {
1203 {custAddrV4, hostnameV4V6},
1204 {custAddrV6, hostnameV4V6},
1205 };
1206 test::DNSResponder dns;
1207 StartDns(dns, dnsSvHostV4V6);
1208 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1209
Ken Chen05420812020-04-07 18:58:38 +00001210 resolverParams.resolverOptions.hosts = custHostV4V6;
chenbrucefd837fa2019-10-29 18:35:36 +08001211 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1212 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM};
1213 ScopedAddrinfo result = safe_getaddrinfo(hostnameV4V6, nullptr, &hints);
1214 ASSERT_TRUE(result != nullptr);
1215 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray({custAddrV4, custAddrV6}));
1216 EXPECT_EQ(0U, GetNumQueries(dns, hostnameV4V6));
1217
Ken Chen05420812020-04-07 18:58:38 +00001218 resolverParams.resolverOptions.hosts = {};
chenbrucefd837fa2019-10-29 18:35:36 +08001219 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1220 result = safe_getaddrinfo(hostnameV4V6, nullptr, &hints);
1221 ASSERT_TRUE(result != nullptr);
1222 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray({dnsSvAddrV4, dnsSvAddrV6}));
1223 EXPECT_EQ(2U, GetNumQueries(dns, hostnameV4V6));
1224}
1225
Ken Chenb9fa2062018-11-13 21:51:13 +08001226TEST_F(ResolverTest, EmptySetup) {
Ken Chenb9fa2062018-11-13 21:51:13 +08001227 std::vector<std::string> servers;
1228 std::vector<std::string> domains;
Xiao Ma09b71022018-12-11 17:56:32 +09001229 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001230 std::vector<std::string> res_servers;
1231 std::vector<std::string> res_domains;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001232 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001233 res_params res_params;
Ken Chenb9fa2062018-11-13 21:51:13 +08001234 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +08001235 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001236 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1237 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1238 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chenb9fa2062018-11-13 21:51:13 +08001239 EXPECT_EQ(0U, res_servers.size());
1240 EXPECT_EQ(0U, res_domains.size());
Mike Yu0a1c53d2018-11-26 13:26:21 +09001241 EXPECT_EQ(0U, res_tls_servers.size());
Luke Huang5bd827c2019-03-14 16:10:04 +08001242 ASSERT_EQ(static_cast<size_t>(IDnsResolver::RESOLVER_PARAMS_COUNT), kDefaultParams.size());
1243 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY],
1244 res_params.sample_validity);
1245 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001246 res_params.success_threshold);
Luke Huang5bd827c2019-03-14 16:10:04 +08001247 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
1248 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
1249 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
Ken Chenb9fa2062018-11-13 21:51:13 +08001250 res_params.base_timeout_msec);
Luke Huang5bd827c2019-03-14 16:10:04 +08001251 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_RETRY_COUNT], res_params.retry_count);
Ken Chenb9fa2062018-11-13 21:51:13 +08001252}
1253
1254TEST_F(ResolverTest, SearchPathChange) {
Xiao Ma09b71022018-12-11 17:56:32 +09001255 constexpr char listen_addr[] = "127.0.0.13";
1256 constexpr char host_name1[] = "test13.domain1.org.";
1257 constexpr char host_name2[] = "test13.domain2.org.";
Luke Huangf8215372019-11-22 11:53:41 +08001258 std::vector<std::string> servers = {listen_addr};
1259 std::vector<std::string> domains = {"domain1.org"};
Xiao Ma09b71022018-12-11 17:56:32 +09001260
1261 const std::vector<DnsRecord> records = {
1262 {host_name1, ns_type::ns_t_aaaa, "2001:db8::13"},
1263 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1:13"},
1264 };
1265 test::DNSResponder dns(listen_addr);
1266 StartDns(dns, records);
1267 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001268
1269 const addrinfo hints = {.ai_family = AF_INET6};
1270 ScopedAddrinfo result = safe_getaddrinfo("test13", nullptr, &hints);
1271 EXPECT_TRUE(result != nullptr);
1272 EXPECT_EQ(1U, dns.queries().size());
1273 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
1274 EXPECT_EQ("2001:db8::13", ToString(result));
1275
1276 // Test that changing the domain search path on its own works.
Luke Huangf8215372019-11-22 11:53:41 +08001277 domains = {"domain2.org"};
Xiao Ma09b71022018-12-11 17:56:32 +09001278 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001279 dns.clearQueries();
1280
1281 result = safe_getaddrinfo("test13", nullptr, &hints);
1282 EXPECT_TRUE(result != nullptr);
1283 EXPECT_EQ(1U, dns.queries().size());
1284 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
1285 EXPECT_EQ("2001:db8::1:13", ToString(result));
1286}
1287
Luke Huang2dac4382019-06-24 13:28:44 +08001288namespace {
1289
Luke Huangf8215372019-11-22 11:53:41 +08001290std::vector<std::string> getResolverDomains(aidl::android::net::IDnsResolver* dnsResolverService,
Luke Huang2dac4382019-06-24 13:28:44 +08001291 unsigned netId) {
1292 std::vector<std::string> res_servers;
1293 std::vector<std::string> res_domains;
1294 std::vector<std::string> res_tls_servers;
1295 res_params res_params;
1296 std::vector<ResolverStats> res_stats;
1297 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001298 DnsResponderClient::GetResolverInfo(dnsResolverService, netId, &res_servers, &res_domains,
1299 &res_tls_servers, &res_params, &res_stats,
1300 &wait_for_pending_req_timeout_count);
Luke Huang2dac4382019-06-24 13:28:44 +08001301 return res_domains;
1302}
1303
1304} // namespace
1305
1306TEST_F(ResolverTest, SearchPathPrune) {
1307 constexpr size_t DUPLICATED_DOMAIN_NUM = 3;
1308 constexpr char listen_addr[] = "127.0.0.13";
1309 constexpr char domian_name1[] = "domain13.org.";
1310 constexpr char domian_name2[] = "domain14.org.";
1311 constexpr char host_name1[] = "test13.domain13.org.";
1312 constexpr char host_name2[] = "test14.domain14.org.";
1313 std::vector<std::string> servers = {listen_addr};
1314
1315 std::vector<std::string> testDomains1;
1316 std::vector<std::string> testDomains2;
1317 // Domain length should be <= 255
1318 // Max number of domains in search path is 6
1319 for (size_t i = 0; i < MAXDNSRCH + 1; i++) {
1320 // Fill up with invalid domain
1321 testDomains1.push_back(std::string(300, i + '0'));
1322 // Fill up with valid but duplicated domain
1323 testDomains2.push_back(StringPrintf("domain%zu.org", i % DUPLICATED_DOMAIN_NUM));
1324 }
1325
1326 // Add valid domain used for query.
1327 testDomains1.push_back(domian_name1);
1328
1329 // Add valid domain twice used for query.
1330 testDomains2.push_back(domian_name2);
1331 testDomains2.push_back(domian_name2);
1332
1333 const std::vector<DnsRecord> records = {
1334 {host_name1, ns_type::ns_t_aaaa, "2001:db8::13"},
1335 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1:13"},
1336 };
1337 test::DNSResponder dns(listen_addr);
1338 StartDns(dns, records);
1339 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, testDomains1));
1340
1341 const addrinfo hints = {.ai_family = AF_INET6};
1342 ScopedAddrinfo result = safe_getaddrinfo("test13", nullptr, &hints);
1343
1344 EXPECT_TRUE(result != nullptr);
1345
1346 EXPECT_EQ(1U, dns.queries().size());
1347 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
1348 EXPECT_EQ("2001:db8::13", ToString(result));
1349
1350 const auto& res_domains1 = getResolverDomains(mDnsClient.resolvService(), TEST_NETID);
1351 // Expect 1 valid domain, invalid domains are removed.
1352 ASSERT_EQ(1U, res_domains1.size());
1353 EXPECT_EQ(domian_name1, res_domains1[0]);
1354
1355 dns.clearQueries();
1356
1357 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, testDomains2));
1358
1359 result = safe_getaddrinfo("test14", nullptr, &hints);
1360 EXPECT_TRUE(result != nullptr);
1361
1362 // (3 domains * 2 retries) + 1 success query = 7
1363 EXPECT_EQ(7U, dns.queries().size());
1364 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
1365 EXPECT_EQ("2001:db8::1:13", ToString(result));
1366
1367 const auto& res_domains2 = getResolverDomains(mDnsClient.resolvService(), TEST_NETID);
1368 // Expect 4 valid domain, duplicate domains are removed.
1369 EXPECT_EQ(DUPLICATED_DOMAIN_NUM + 1U, res_domains2.size());
1370 EXPECT_THAT(
1371 std::vector<std::string>({"domain0.org", "domain1.org", "domain2.org", domian_name2}),
1372 testing::ElementsAreArray(res_domains2));
1373}
1374
Mike Yu0a1c53d2018-11-26 13:26:21 +09001375// If we move this function to dns_responder_client, it will complicate the dependency need of
1376// dns_tls_frontend.h.
1377static void setupTlsServers(const std::vector<std::string>& servers,
waynema0e73c2e2019-07-31 15:04:08 +08001378 std::vector<std::unique_ptr<test::DnsTlsFrontend>>* tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001379 constexpr char listen_udp[] = "53";
1380 constexpr char listen_tls[] = "853";
Mike Yu0a1c53d2018-11-26 13:26:21 +09001381
1382 for (const auto& server : servers) {
1383 auto t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
1384 t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
1385 t->startServer();
Mike Yu0a1c53d2018-11-26 13:26:21 +09001386 tls->push_back(std::move(t));
1387 }
1388}
1389
Mike Yu0a1c53d2018-11-26 13:26:21 +09001390TEST_F(ResolverTest, MaxServerPrune_Binder) {
Mike Yu0a1c53d2018-11-26 13:26:21 +09001391 std::vector<std::string> domains;
1392 std::vector<std::unique_ptr<test::DNSResponder>> dns;
1393 std::vector<std::unique_ptr<test::DnsTlsFrontend>> tls;
1394 std::vector<std::string> servers;
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001395 std::vector<DnsResponderClient::Mapping> mappings;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001396
1397 for (unsigned i = 0; i < MAXDNSRCH + 1; i++) {
1398 domains.push_back(StringPrintf("example%u.com", i));
1399 }
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001400 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupMappings(1, domains, &mappings));
1401 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupDNSServers(MAXNS + 1, mappings, &dns, &servers));
waynema0e73c2e2019-07-31 15:04:08 +08001402 ASSERT_NO_FATAL_FAILURE(setupTlsServers(servers, &tls));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001403
waynema0e73c2e2019-07-31 15:04:08 +08001404 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, domains, kDefaultParams,
1405 kDefaultPrivateDnsHostName));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001406
Mike Yu383855b2019-01-15 17:53:27 +08001407 // If the private DNS validation hasn't completed yet before backend DNS servers stop,
1408 // TLS servers will get stuck in handleOneRequest(), which causes this test stuck in
1409 // ~DnsTlsFrontend() because the TLS server loop threads can't be terminated.
1410 // So, wait for private DNS validation done before stopping backend DNS servers.
1411 for (int i = 0; i < MAXNS; i++) {
chenbruceaff85842019-05-31 15:46:42 +08001412 LOG(INFO) << "Waiting for private DNS validation on " << tls[i]->listen_address() << ".";
Mike Yu724f77d2019-08-16 11:14:50 +08001413 EXPECT_TRUE(WaitForPrivateDnsValidation(tls[i]->listen_address(), true));
chenbruceaff85842019-05-31 15:46:42 +08001414 LOG(INFO) << "private DNS validation on " << tls[i]->listen_address() << " done.";
Mike Yu383855b2019-01-15 17:53:27 +08001415 }
1416
Mike Yu0a1c53d2018-11-26 13:26:21 +09001417 std::vector<std::string> res_servers;
1418 std::vector<std::string> res_domains;
1419 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001420 res_params res_params;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001421 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +08001422 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001423 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1424 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1425 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001426
1427 // Check the size of the stats and its contents.
1428 EXPECT_EQ(static_cast<size_t>(MAXNS), res_servers.size());
1429 EXPECT_EQ(static_cast<size_t>(MAXNS), res_tls_servers.size());
1430 EXPECT_EQ(static_cast<size_t>(MAXDNSRCH), res_domains.size());
1431 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_servers.begin()));
1432 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_tls_servers.begin()));
1433 EXPECT_TRUE(std::equal(domains.begin(), domains.begin() + MAXDNSRCH, res_domains.begin()));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001434}
1435
1436TEST_F(ResolverTest, ResolverStats) {
Xiao Ma09b71022018-12-11 17:56:32 +09001437 constexpr char listen_addr1[] = "127.0.0.4";
1438 constexpr char listen_addr2[] = "127.0.0.5";
1439 constexpr char listen_addr3[] = "127.0.0.6";
Mike Yu0a1c53d2018-11-26 13:26:21 +09001440
1441 // Set server 1 timeout.
Mike Yufc125e42019-05-15 20:41:28 +08001442 test::DNSResponder dns1(listen_addr1, "53", static_cast<ns_rcode>(-1));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001443 dns1.setResponseProbability(0.0);
1444 ASSERT_TRUE(dns1.startServer());
1445
1446 // Set server 2 responding server failure.
Xiao Ma09b71022018-12-11 17:56:32 +09001447 test::DNSResponder dns2(listen_addr2);
Mike Yu0a1c53d2018-11-26 13:26:21 +09001448 dns2.setResponseProbability(0.0);
1449 ASSERT_TRUE(dns2.startServer());
1450
1451 // Set server 3 workable.
Xiao Ma09b71022018-12-11 17:56:32 +09001452 test::DNSResponder dns3(listen_addr3);
1453 dns3.addMapping(kHelloExampleCom, ns_type::ns_t_a, "1.2.3.4");
Mike Yu0a1c53d2018-11-26 13:26:21 +09001454 ASSERT_TRUE(dns3.startServer());
1455
1456 std::vector<std::string> servers = {listen_addr1, listen_addr2, listen_addr3};
Xiao Ma09b71022018-12-11 17:56:32 +09001457 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001458
1459 dns3.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +09001460 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
Mike Yu0a1c53d2018-11-26 13:26:21 +09001461 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
Xiao Ma09b71022018-12-11 17:56:32 +09001462 size_t found = GetNumQueries(dns3, kHelloExampleCom);
Mike Yu0a1c53d2018-11-26 13:26:21 +09001463 EXPECT_LE(1U, found);
1464 std::string result_str = ToString(result);
1465 EXPECT_TRUE(result_str == "1.2.3.4") << ", result_str='" << result_str << "'";
1466
Mike Yuc0000252020-03-19 07:14:23 +00001467 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1468 NameserverStats(listen_addr1).setTimeouts(1),
1469 NameserverStats(listen_addr2).setErrors(1),
1470 NameserverStats(listen_addr3).setSuccesses(1),
1471 };
1472 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001473}
1474
Mike Yu15791832020-02-11 13:38:48 +08001475TEST_F(ResolverTest, AlwaysUseLatestSetupParamsInLookups) {
1476 constexpr char listen_addr1[] = "127.0.0.3";
1477 constexpr char listen_addr2[] = "255.255.255.255";
1478 constexpr char listen_addr3[] = "127.0.0.4";
1479 constexpr char hostname[] = "hello";
1480 constexpr char fqdn_with_search_domain[] = "hello.domain2.com.";
1481
1482 test::DNSResponder dns1(listen_addr1, test::kDefaultListenService, static_cast<ns_rcode>(-1));
1483 dns1.setResponseProbability(0.0);
1484 ASSERT_TRUE(dns1.startServer());
1485
1486 test::DNSResponder dns3(listen_addr3);
1487 StartDns(dns3, {{fqdn_with_search_domain, ns_type::ns_t_a, "1.2.3.4"}});
1488
1489 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
1490 parcel.tlsServers.clear();
1491 parcel.servers = {listen_addr1, listen_addr2};
1492 parcel.domains = {"domain1.com", "domain2.com"};
1493 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1494
1495 // Expect the things happening in t1:
1496 // 1. The lookup starts using the first domain for query. It sends queries to the populated
1497 // nameserver list {listen_addr1, listen_addr2} for the hostname "hello.domain1.com".
1498 // 2. A different list of nameservers is updated to the resolver. Revision ID is incremented.
1499 // 3. The query for the hostname times out. The lookup fails to add the timeout record to the
1500 // the stats because of the unmatched revision ID.
1501 // 4. The lookup starts using the second domain for query. It sends queries to the populated
1502 // nameserver list {listen_addr3, listen_addr1, listen_addr2} for another hostname
1503 // "hello.domain2.com".
1504 // 5. The lookup gets the answer and updates a success record to the stats.
1505 std::thread t1([&hostname]() {
1506 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1507 ScopedAddrinfo result = safe_getaddrinfo(hostname, nullptr, &hints);
1508 EXPECT_NE(result.get(), nullptr);
1509 EXPECT_EQ(ToString(result), "1.2.3.4");
1510 });
1511
1512 // Wait for t1 to start the step 1.
1513 while (dns1.queries().size() == 0) {
1514 usleep(1000);
1515 }
1516
1517 // Update the resolver with three nameservers. This will increment the revision ID.
1518 parcel.servers = {listen_addr3, listen_addr1, listen_addr2};
1519 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1520
1521 t1.join();
1522 EXPECT_EQ(0U, GetNumQueriesForType(dns3, ns_type::ns_t_aaaa, fqdn_with_search_domain));
1523 EXPECT_EQ(1U, GetNumQueriesForType(dns3, ns_type::ns_t_a, fqdn_with_search_domain));
1524
Mike Yuc0000252020-03-19 07:14:23 +00001525 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1526 NameserverStats(listen_addr1),
1527 NameserverStats(listen_addr2),
1528 NameserverStats(listen_addr3).setSuccesses(1),
1529 };
1530 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
Mike Yu15791832020-02-11 13:38:48 +08001531}
1532
Ken Chenb9fa2062018-11-13 21:51:13 +08001533// Test what happens if the specified TLS server is nonexistent.
1534TEST_F(ResolverTest, GetHostByName_TlsMissing) {
Xiao Ma09b71022018-12-11 17:56:32 +09001535 constexpr char listen_addr[] = "127.0.0.3";
1536 constexpr char host_name[] = "tlsmissing.example.com.";
1537
1538 test::DNSResponder dns;
1539 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.3"}});
Luke Huangf8215372019-11-22 11:53:41 +08001540 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001541
1542 // There's nothing listening on this address, so validation will either fail or
1543 /// hang. Either way, queries will continue to flow to the DNSResponder.
waynema0e73c2e2019-07-31 15:04:08 +08001544 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Ken Chenb9fa2062018-11-13 21:51:13 +08001545
1546 const hostent* result;
1547
1548 result = gethostbyname("tlsmissing");
1549 ASSERT_FALSE(result == nullptr);
1550 EXPECT_EQ("1.2.3.3", ToString(result));
1551
1552 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001553 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001554}
1555
1556// Test what happens if the specified TLS server replies with garbage.
1557TEST_F(ResolverTest, GetHostByName_TlsBroken) {
Xiao Ma09b71022018-12-11 17:56:32 +09001558 constexpr char listen_addr[] = "127.0.0.3";
1559 constexpr char host_name1[] = "tlsbroken1.example.com.";
1560 constexpr char host_name2[] = "tlsbroken2.example.com.";
1561 const std::vector<DnsRecord> records = {
1562 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1563 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1564 };
1565
1566 test::DNSResponder dns;
1567 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001568 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001569
1570 // Bind the specified private DNS socket but don't respond to any client sockets yet.
1571 int s = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, IPPROTO_TCP);
1572 ASSERT_TRUE(s >= 0);
1573 struct sockaddr_in tlsServer = {
Luke Huangf8215372019-11-22 11:53:41 +08001574 .sin_family = AF_INET,
1575 .sin_port = htons(853),
Ken Chenb9fa2062018-11-13 21:51:13 +08001576 };
1577 ASSERT_TRUE(inet_pton(AF_INET, listen_addr, &tlsServer.sin_addr));
1578 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEPORT).ok());
1579 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEADDR).ok());
1580 ASSERT_FALSE(bind(s, reinterpret_cast<struct sockaddr*>(&tlsServer), sizeof(tlsServer)));
1581 ASSERT_FALSE(listen(s, 1));
1582
1583 // Trigger TLS validation.
waynema0e73c2e2019-07-31 15:04:08 +08001584 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Ken Chenb9fa2062018-11-13 21:51:13 +08001585
1586 struct sockaddr_storage cliaddr;
1587 socklen_t sin_size = sizeof(cliaddr);
Luke Huangf8215372019-11-22 11:53:41 +08001588 int new_fd = accept4(s, reinterpret_cast<struct sockaddr*>(&cliaddr), &sin_size, SOCK_CLOEXEC);
Ken Chenb9fa2062018-11-13 21:51:13 +08001589 ASSERT_TRUE(new_fd > 0);
1590
1591 // We've received the new file descriptor but not written to it or closed, so the
1592 // validation is still pending. Queries should still flow correctly because the
1593 // server is not used until validation succeeds.
1594 const hostent* result;
1595 result = gethostbyname("tlsbroken1");
1596 ASSERT_FALSE(result == nullptr);
1597 EXPECT_EQ("1.2.3.1", ToString(result));
1598
1599 // Now we cause the validation to fail.
1600 std::string garbage = "definitely not a valid TLS ServerHello";
1601 write(new_fd, garbage.data(), garbage.size());
1602 close(new_fd);
1603
1604 // Validation failure shouldn't interfere with lookups, because lookups won't be sent
1605 // to the TLS server unless validation succeeds.
1606 result = gethostbyname("tlsbroken2");
1607 ASSERT_FALSE(result == nullptr);
1608 EXPECT_EQ("1.2.3.2", ToString(result));
1609
1610 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001611 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001612 close(s);
1613}
1614
1615TEST_F(ResolverTest, GetHostByName_Tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001616 constexpr char listen_addr[] = "127.0.0.3";
1617 constexpr char listen_udp[] = "53";
1618 constexpr char listen_tls[] = "853";
1619 constexpr char host_name1[] = "tls1.example.com.";
1620 constexpr char host_name2[] = "tls2.example.com.";
1621 constexpr char host_name3[] = "tls3.example.com.";
1622 const std::vector<DnsRecord> records = {
1623 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1624 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1625 {host_name3, ns_type::ns_t_a, "1.2.3.3"},
1626 };
1627
1628 test::DNSResponder dns;
1629 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001630 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001631
1632 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1633 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001634 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08001635 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001636
Mike Yu724f77d2019-08-16 11:14:50 +08001637 const hostent* result = gethostbyname("tls1");
Ken Chenb9fa2062018-11-13 21:51:13 +08001638 ASSERT_FALSE(result == nullptr);
1639 EXPECT_EQ("1.2.3.1", ToString(result));
1640
1641 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001642 EXPECT_TRUE(tls.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001643
1644 // Stop the TLS server. Since we're in opportunistic mode, queries will
1645 // fall back to the locally-assigned (clear text) nameservers.
1646 tls.stopServer();
1647
1648 dns.clearQueries();
1649 result = gethostbyname("tls2");
1650 EXPECT_FALSE(result == nullptr);
1651 EXPECT_EQ("1.2.3.2", ToString(result));
1652 const auto queries = dns.queries();
1653 EXPECT_EQ(1U, queries.size());
waynema29253052019-08-20 11:26:08 +08001654 EXPECT_EQ("tls2.example.com.", queries[0].name);
1655 EXPECT_EQ(ns_t_a, queries[0].type);
Ken Chenb9fa2062018-11-13 21:51:13 +08001656
1657 // Reset the resolvers without enabling TLS. Queries should still be routed
1658 // to the UDP endpoint.
Xiao Ma09b71022018-12-11 17:56:32 +09001659 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001660
1661 result = gethostbyname("tls3");
1662 ASSERT_FALSE(result == nullptr);
1663 EXPECT_EQ("1.2.3.3", ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +08001664}
1665
Ken Chenb9fa2062018-11-13 21:51:13 +08001666TEST_F(ResolverTest, GetHostByName_TlsFailover) {
Xiao Ma09b71022018-12-11 17:56:32 +09001667 constexpr char listen_addr1[] = "127.0.0.3";
1668 constexpr char listen_addr2[] = "127.0.0.4";
1669 constexpr char listen_udp[] = "53";
1670 constexpr char listen_tls[] = "853";
1671 constexpr char host_name1[] = "tlsfailover1.example.com.";
1672 constexpr char host_name2[] = "tlsfailover2.example.com.";
1673 const std::vector<DnsRecord> records1 = {
1674 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1675 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1676 };
1677 const std::vector<DnsRecord> records2 = {
1678 {host_name1, ns_type::ns_t_a, "1.2.3.3"},
1679 {host_name2, ns_type::ns_t_a, "1.2.3.4"},
1680 };
1681
1682 test::DNSResponder dns1(listen_addr1);
1683 test::DNSResponder dns2(listen_addr2);
1684 StartDns(dns1, records1);
1685 StartDns(dns2, records2);
1686
Luke Huangf8215372019-11-22 11:53:41 +08001687 std::vector<std::string> servers = {listen_addr1, listen_addr2};
Ken Chenb9fa2062018-11-13 21:51:13 +08001688
1689 test::DnsTlsFrontend tls1(listen_addr1, listen_tls, listen_addr1, listen_udp);
1690 test::DnsTlsFrontend tls2(listen_addr2, listen_tls, listen_addr2, listen_udp);
1691 ASSERT_TRUE(tls1.startServer());
1692 ASSERT_TRUE(tls2.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001693 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1694 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08001695 EXPECT_TRUE(WaitForPrivateDnsValidation(tls1.listen_address(), true));
1696 EXPECT_TRUE(WaitForPrivateDnsValidation(tls2.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001697
Mike Yu724f77d2019-08-16 11:14:50 +08001698 const hostent* result = gethostbyname("tlsfailover1");
Ken Chenb9fa2062018-11-13 21:51:13 +08001699 ASSERT_FALSE(result == nullptr);
1700 EXPECT_EQ("1.2.3.1", ToString(result));
1701
1702 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001703 EXPECT_TRUE(tls1.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001704 // No new queries should have reached tls2.
Luke Huang3caa42b2020-04-23 14:18:04 +00001705 EXPECT_TRUE(tls2.waitForQueries(1));
Ken Chenb9fa2062018-11-13 21:51:13 +08001706
1707 // Stop tls1. Subsequent queries should attempt to reach tls1, fail, and retry to tls2.
1708 tls1.stopServer();
1709
1710 result = gethostbyname("tlsfailover2");
1711 EXPECT_EQ("1.2.3.4", ToString(result));
1712
1713 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001714 EXPECT_TRUE(tls2.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001715
1716 // No additional queries should have reached the insecure servers.
1717 EXPECT_EQ(2U, dns1.queries().size());
1718 EXPECT_EQ(2U, dns2.queries().size());
1719
1720 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001721 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Ken Chenb9fa2062018-11-13 21:51:13 +08001722}
1723
1724TEST_F(ResolverTest, GetHostByName_BadTlsName) {
Xiao Ma09b71022018-12-11 17:56:32 +09001725 constexpr char listen_addr[] = "127.0.0.3";
1726 constexpr char listen_udp[] = "53";
1727 constexpr char listen_tls[] = "853";
1728 constexpr char host_name[] = "badtlsname.example.com.";
1729
1730 test::DNSResponder dns;
1731 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.1"}});
Luke Huangf8215372019-11-22 11:53:41 +08001732 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001733
1734 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1735 ASSERT_TRUE(tls.startServer());
Xiao Ma09b71022018-12-11 17:56:32 +09001736 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
waynema0e73c2e2019-07-31 15:04:08 +08001737 kDefaultIncorrectPrivateDnsHostName));
Ken Chenb9fa2062018-11-13 21:51:13 +08001738
waynema0e73c2e2019-07-31 15:04:08 +08001739 // The TLS handshake would fail because the name of TLS server doesn't
1740 // match with TLS server's certificate.
Mike Yu724f77d2019-08-16 11:14:50 +08001741 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), false));
Ken Chenb9fa2062018-11-13 21:51:13 +08001742
1743 // The query should fail hard, because a name was specified.
1744 EXPECT_EQ(nullptr, gethostbyname("badtlsname"));
1745
1746 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001747 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001748}
1749
1750TEST_F(ResolverTest, GetAddrInfo_Tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001751 constexpr char listen_addr[] = "127.0.0.3";
1752 constexpr char listen_udp[] = "53";
1753 constexpr char listen_tls[] = "853";
1754 constexpr char host_name[] = "addrinfotls.example.com.";
1755 const std::vector<DnsRecord> records = {
1756 {host_name, ns_type::ns_t_a, "1.2.3.4"},
1757 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
1758 };
1759
1760 test::DNSResponder dns;
1761 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001762 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001763
1764 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1765 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001766 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1767 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08001768 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001769
1770 dns.clearQueries();
1771 ScopedAddrinfo result = safe_getaddrinfo("addrinfotls", nullptr, nullptr);
1772 EXPECT_TRUE(result != nullptr);
1773 size_t found = GetNumQueries(dns, host_name);
1774 EXPECT_LE(1U, found);
1775 // Could be A or AAAA
1776 std::string result_str = ToString(result);
1777 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +08001778 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08001779 // Wait for both A and AAAA queries to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001780 EXPECT_TRUE(tls.waitForQueries(3));
Ken Chenb9fa2062018-11-13 21:51:13 +08001781
1782 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001783 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001784}
1785
1786TEST_F(ResolverTest, TlsBypass) {
1787 const char OFF[] = "off";
1788 const char OPPORTUNISTIC[] = "opportunistic";
1789 const char STRICT[] = "strict";
1790
1791 const char GETHOSTBYNAME[] = "gethostbyname";
1792 const char GETADDRINFO[] = "getaddrinfo";
1793 const char GETADDRINFOFORNET[] = "getaddrinfofornet";
1794
1795 const unsigned BYPASS_NETID = NETID_USE_LOCAL_NAMESERVERS | TEST_NETID;
1796
Ken Chenb9fa2062018-11-13 21:51:13 +08001797 const char ADDR4[] = "192.0.2.1";
1798 const char ADDR6[] = "2001:db8::1";
1799
1800 const char cleartext_addr[] = "127.0.0.53";
1801 const char cleartext_port[] = "53";
1802 const char tls_port[] = "853";
Luke Huangf8215372019-11-22 11:53:41 +08001803 const std::vector<std::string> servers = {cleartext_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001804
Xiao Ma09b71022018-12-11 17:56:32 +09001805 test::DNSResponder dns(cleartext_addr);
Ken Chenb9fa2062018-11-13 21:51:13 +08001806 ASSERT_TRUE(dns.startServer());
1807
1808 test::DnsTlsFrontend tls(cleartext_addr, tls_port, cleartext_addr, cleartext_port);
Mike Yudd4ac2d2019-05-31 16:52:11 +08001809 ASSERT_TRUE(tls.startServer());
Ken Chenb9fa2062018-11-13 21:51:13 +08001810
Luke Huangf8215372019-11-22 11:53:41 +08001811 // clang-format off
Ken Chenb9fa2062018-11-13 21:51:13 +08001812 struct TestConfig {
1813 const std::string mode;
1814 const bool withWorkingTLS;
1815 const std::string method;
1816
1817 std::string asHostName() const {
Luke Huangf8215372019-11-22 11:53:41 +08001818 return StringPrintf("%s.%s.%s.", mode.c_str(), withWorkingTLS ? "tlsOn" : "tlsOff",
Ken Chenb9fa2062018-11-13 21:51:13 +08001819 method.c_str());
1820 }
1821 } testConfigs[]{
Ken Chenb9fa2062018-11-13 21:51:13 +08001822 {OFF, true, GETHOSTBYNAME},
1823 {OPPORTUNISTIC, true, GETHOSTBYNAME},
1824 {STRICT, true, GETHOSTBYNAME},
Ken Chenb9fa2062018-11-13 21:51:13 +08001825 {OFF, true, GETADDRINFO},
1826 {OPPORTUNISTIC, true, GETADDRINFO},
1827 {STRICT, true, GETADDRINFO},
Ken Chenb9fa2062018-11-13 21:51:13 +08001828 {OFF, true, GETADDRINFOFORNET},
1829 {OPPORTUNISTIC, true, GETADDRINFOFORNET},
1830 {STRICT, true, GETADDRINFOFORNET},
Mike Yudd4ac2d2019-05-31 16:52:11 +08001831 {OFF, false, GETHOSTBYNAME},
1832 {OPPORTUNISTIC, false, GETHOSTBYNAME},
1833 {STRICT, false, GETHOSTBYNAME},
1834 {OFF, false, GETADDRINFO},
1835 {OPPORTUNISTIC, false, GETADDRINFO},
1836 {STRICT, false, GETADDRINFO},
1837 {OFF, false, GETADDRINFOFORNET},
1838 {OPPORTUNISTIC, false, GETADDRINFOFORNET},
1839 {STRICT, false, GETADDRINFOFORNET},
Ken Chenb9fa2062018-11-13 21:51:13 +08001840 };
Luke Huangf8215372019-11-22 11:53:41 +08001841 // clang-format on
Ken Chenb9fa2062018-11-13 21:51:13 +08001842
1843 for (const auto& config : testConfigs) {
1844 const std::string testHostName = config.asHostName();
1845 SCOPED_TRACE(testHostName);
1846
1847 // Don't tempt test bugs due to caching.
1848 const char* host_name = testHostName.c_str();
1849 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
1850 dns.addMapping(host_name, ns_type::ns_t_aaaa, ADDR6);
1851
Mike Yudd4ac2d2019-05-31 16:52:11 +08001852 if (config.withWorkingTLS) {
1853 if (!tls.running()) {
1854 ASSERT_TRUE(tls.startServer());
1855 }
1856 } else {
1857 if (tls.running()) {
1858 ASSERT_TRUE(tls.stopServer());
1859 }
1860 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001861
1862 if (config.mode == OFF) {
Xiao Ma09b71022018-12-11 17:56:32 +09001863 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, kDefaultSearchDomains,
1864 kDefaultParams));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001865 } else /* OPPORTUNISTIC or STRICT */ {
1866 const char* tls_hostname = (config.mode == STRICT) ? kDefaultPrivateDnsHostName : "";
Xiao Ma09b71022018-12-11 17:56:32 +09001867 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001868 kDefaultParams, tls_hostname));
Mike Yu724f77d2019-08-16 11:14:50 +08001869
1870 // Wait for the validation event. If the server is running, the validation should
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001871 // succeed; otherwise, the validation should fail.
Mike Yu724f77d2019-08-16 11:14:50 +08001872 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), config.withWorkingTLS));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001873 if (config.withWorkingTLS) {
1874 EXPECT_TRUE(tls.waitForQueries(1));
1875 tls.clearQueries();
1876 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001877 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001878
1879 const hostent* h_result = nullptr;
1880 ScopedAddrinfo ai_result;
1881
1882 if (config.method == GETHOSTBYNAME) {
1883 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
1884 h_result = gethostbyname(host_name);
1885
1886 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
1887 ASSERT_FALSE(h_result == nullptr);
1888 ASSERT_EQ(4, h_result->h_length);
1889 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
1890 EXPECT_EQ(ADDR4, ToString(h_result));
1891 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
1892 } else if (config.method == GETADDRINFO) {
1893 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
1894 ai_result = safe_getaddrinfo(host_name, nullptr, nullptr);
1895 EXPECT_TRUE(ai_result != nullptr);
1896
1897 EXPECT_LE(1U, GetNumQueries(dns, host_name));
1898 // Could be A or AAAA
1899 const std::string result_str = ToString(ai_result);
1900 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
Luke Huangf8215372019-11-22 11:53:41 +08001901 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08001902 } else if (config.method == GETADDRINFOFORNET) {
1903 addrinfo* raw_ai_result = nullptr;
1904 EXPECT_EQ(0, android_getaddrinfofornet(host_name, /*servname=*/nullptr,
1905 /*hints=*/nullptr, BYPASS_NETID, MARK_UNSET,
1906 &raw_ai_result));
1907 ai_result.reset(raw_ai_result);
1908
1909 EXPECT_LE(1U, GetNumQueries(dns, host_name));
1910 // Could be A or AAAA
1911 const std::string result_str = ToString(ai_result);
1912 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
Luke Huangf8215372019-11-22 11:53:41 +08001913 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08001914 }
1915
Mike Yudd4ac2d2019-05-31 16:52:11 +08001916 EXPECT_EQ(0, tls.queries());
Ken Chenb9fa2062018-11-13 21:51:13 +08001917
1918 // Clear per-process resolv netid.
1919 ASSERT_EQ(0, setNetworkForResolv(NETID_UNSET));
Ken Chenb9fa2062018-11-13 21:51:13 +08001920 dns.clearQueries();
1921 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001922}
1923
1924TEST_F(ResolverTest, StrictMode_NoTlsServers) {
Xiao Ma09b71022018-12-11 17:56:32 +09001925 constexpr char cleartext_addr[] = "127.0.0.53";
Luke Huangf8215372019-11-22 11:53:41 +08001926 const std::vector<std::string> servers = {cleartext_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09001927 constexpr char host_name[] = "strictmode.notlsips.example.com.";
1928 const std::vector<DnsRecord> records = {
1929 {host_name, ns_type::ns_t_a, "1.2.3.4"},
1930 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
1931 };
Ken Chenb9fa2062018-11-13 21:51:13 +08001932
Xiao Ma09b71022018-12-11 17:56:32 +09001933 test::DNSResponder dns(cleartext_addr);
1934 StartDns(dns, records);
Ken Chenb9fa2062018-11-13 21:51:13 +08001935
waynema0e73c2e2019-07-31 15:04:08 +08001936 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1937 kDefaultIncorrectPrivateDnsHostName));
Ken Chenb9fa2062018-11-13 21:51:13 +08001938
1939 addrinfo* ai_result = nullptr;
1940 EXPECT_NE(0, getaddrinfo(host_name, nullptr, nullptr, &ai_result));
1941 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
1942}
Luke Huang94b10b92018-11-21 20:13:38 +08001943
1944namespace {
1945
Luke Huang70931aa2019-01-31 11:57:41 +08001946int getAsyncResponse(int fd, int* rcode, uint8_t* buf, int bufLen) {
Luke Huang94b10b92018-11-21 20:13:38 +08001947 struct pollfd wait_fd[1];
1948 wait_fd[0].fd = fd;
1949 wait_fd[0].events = POLLIN;
1950 short revents;
1951 int ret;
1952
1953 ret = poll(wait_fd, 1, -1);
1954 revents = wait_fd[0].revents;
1955 if (revents & POLLIN) {
1956 int n = resNetworkResult(fd, rcode, buf, bufLen);
Luke Huangba7bef92018-12-26 16:53:03 +08001957 // Verify that resNetworkResult() closed the fd
1958 char dummy;
1959 EXPECT_EQ(-1, read(fd, &dummy, sizeof dummy));
1960 EXPECT_EQ(EBADF, errno);
Luke Huang94b10b92018-11-21 20:13:38 +08001961 return n;
1962 }
1963 return -1;
1964}
1965
Luke Huang70931aa2019-01-31 11:57:41 +08001966std::string toString(uint8_t* buf, int bufLen, int ipType) {
Luke Huang94b10b92018-11-21 20:13:38 +08001967 ns_msg handle;
1968 int ancount, n = 0;
1969 ns_rr rr;
1970
Luke Huangf8215372019-11-22 11:53:41 +08001971 if (ns_initparse((const uint8_t*)buf, bufLen, &handle) >= 0) {
Luke Huang94b10b92018-11-21 20:13:38 +08001972 ancount = ns_msg_count(handle, ns_s_an);
1973 if (ns_parserr(&handle, ns_s_an, n, &rr) == 0) {
Luke Huang70931aa2019-01-31 11:57:41 +08001974 const uint8_t* rdata = ns_rr_rdata(rr);
Luke Huang94b10b92018-11-21 20:13:38 +08001975 char buffer[INET6_ADDRSTRLEN];
Luke Huangf8215372019-11-22 11:53:41 +08001976 if (inet_ntop(ipType, (const char*)rdata, buffer, sizeof(buffer))) {
Luke Huang94b10b92018-11-21 20:13:38 +08001977 return buffer;
1978 }
1979 }
1980 }
1981 return "";
1982}
1983
1984int dns_open_proxy() {
1985 int s = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
1986 if (s == -1) {
1987 return -1;
1988 }
1989 const int one = 1;
1990 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
1991
1992 static const struct sockaddr_un proxy_addr = {
1993 .sun_family = AF_UNIX,
1994 .sun_path = "/dev/socket/dnsproxyd",
1995 };
1996
Luke Huangf8215372019-11-22 11:53:41 +08001997 if (TEMP_FAILURE_RETRY(connect(s, (const struct sockaddr*)&proxy_addr, sizeof(proxy_addr))) !=
Luke Huang94b10b92018-11-21 20:13:38 +08001998 0) {
1999 close(s);
2000 return -1;
2001 }
2002
2003 return s;
2004}
2005
Luke Huangba7bef92018-12-26 16:53:03 +08002006void expectAnswersValid(int fd, int ipType, const std::string& expectedAnswer) {
2007 int rcode = -1;
2008 uint8_t buf[MAXPACKET] = {};
2009
2010 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2011 EXPECT_GT(res, 0);
2012 EXPECT_EQ(expectedAnswer, toString(buf, res, ipType));
2013}
2014
2015void expectAnswersNotValid(int fd, int expectedErrno) {
2016 int rcode = -1;
2017 uint8_t buf[MAXPACKET] = {};
2018
2019 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2020 EXPECT_EQ(expectedErrno, res);
2021}
2022
Luke Huang94b10b92018-11-21 20:13:38 +08002023} // namespace
2024
2025TEST_F(ResolverTest, Async_NormalQueryV4V6) {
Xiao Ma09b71022018-12-11 17:56:32 +09002026 constexpr char listen_addr[] = "127.0.0.4";
2027 constexpr char host_name[] = "howdy.example.com.";
2028 const std::vector<DnsRecord> records = {
2029 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2030 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2031 };
2032
2033 test::DNSResponder dns(listen_addr);
2034 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002035 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002036 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002037
Luke Huangba7bef92018-12-26 16:53:03 +08002038 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2039 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002040 EXPECT_TRUE(fd1 != -1);
2041 EXPECT_TRUE(fd2 != -1);
2042
Luke Huang70931aa2019-01-31 11:57:41 +08002043 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002044 int rcode;
2045 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2046 EXPECT_GT(res, 0);
2047 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
2048
2049 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2050 EXPECT_GT(res, 0);
2051 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2052
2053 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
2054
2055 // Re-query verify cache works
Luke Huangba7bef92018-12-26 16:53:03 +08002056 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2057 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002058
2059 EXPECT_TRUE(fd1 != -1);
2060 EXPECT_TRUE(fd2 != -1);
2061
2062 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2063 EXPECT_GT(res, 0);
2064 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
2065
2066 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2067 EXPECT_GT(res, 0);
2068 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2069
2070 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
2071}
2072
2073TEST_F(ResolverTest, Async_BadQuery) {
Xiao Ma09b71022018-12-11 17:56:32 +09002074 constexpr char listen_addr[] = "127.0.0.4";
2075 constexpr char host_name[] = "howdy.example.com.";
2076 const std::vector<DnsRecord> records = {
2077 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2078 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2079 };
2080
2081 test::DNSResponder dns(listen_addr);
2082 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002083 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002084 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002085
2086 static struct {
2087 int fd;
2088 const char* dname;
2089 const int queryType;
2090 const int expectRcode;
2091 } kTestData[] = {
Luke Huangba7bef92018-12-26 16:53:03 +08002092 {-1, "", ns_t_aaaa, 0},
2093 {-1, "as65ass46", ns_t_aaaa, 0},
2094 {-1, "454564564564", ns_t_aaaa, 0},
2095 {-1, "h645235", ns_t_a, 0},
2096 {-1, "www.google.com", ns_t_a, 0},
Luke Huang94b10b92018-11-21 20:13:38 +08002097 };
2098
2099 for (auto& td : kTestData) {
2100 SCOPED_TRACE(td.dname);
Luke Huangba7bef92018-12-26 16:53:03 +08002101 td.fd = resNetworkQuery(TEST_NETID, td.dname, ns_c_in, td.queryType, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002102 EXPECT_TRUE(td.fd != -1);
2103 }
2104
2105 // dns_responder return empty resp(packet only contains query part) with no error currently
2106 for (const auto& td : kTestData) {
Luke Huang70931aa2019-01-31 11:57:41 +08002107 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002108 int rcode;
2109 SCOPED_TRACE(td.dname);
2110 int res = getAsyncResponse(td.fd, &rcode, buf, MAXPACKET);
2111 EXPECT_GT(res, 0);
2112 EXPECT_EQ(rcode, td.expectRcode);
2113 }
2114}
2115
2116TEST_F(ResolverTest, Async_EmptyAnswer) {
Xiao Ma09b71022018-12-11 17:56:32 +09002117 constexpr char listen_addr[] = "127.0.0.4";
2118 constexpr char host_name[] = "howdy.example.com.";
2119 const std::vector<DnsRecord> records = {
2120 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2121 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2122 };
2123
2124 test::DNSResponder dns(listen_addr);
2125 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002126 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002127 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002128
Luke Huang9c264bb2018-12-18 16:44:41 +08002129 // TODO: Disable retry to make this test explicit.
2130 auto& cv = dns.getCv();
2131 auto& cvMutex = dns.getCvMutex();
2132 int fd1;
2133 // Wait on the condition variable to ensure that the DNS server has handled our first query.
2134 {
2135 std::unique_lock lk(cvMutex);
Luke Huangba7bef92018-12-26 16:53:03 +08002136 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang9c264bb2018-12-18 16:44:41 +08002137 EXPECT_TRUE(fd1 != -1);
2138 EXPECT_EQ(std::cv_status::no_timeout, cv.wait_for(lk, std::chrono::seconds(1)));
2139 }
Luke Huang94b10b92018-11-21 20:13:38 +08002140
Luke Huang94b10b92018-11-21 20:13:38 +08002141 dns.setResponseProbability(0.0);
Luke Huang94b10b92018-11-21 20:13:38 +08002142
Luke Huangba7bef92018-12-26 16:53:03 +08002143 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002144 EXPECT_TRUE(fd2 != -1);
2145
Luke Huangba7bef92018-12-26 16:53:03 +08002146 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002147 EXPECT_TRUE(fd3 != -1);
2148
Luke Huang9c264bb2018-12-18 16:44:41 +08002149 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002150 int rcode;
2151
Luke Huang9c264bb2018-12-18 16:44:41 +08002152 // expect no response
2153 int res = getAsyncResponse(fd3, &rcode, buf, MAXPACKET);
2154 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huang94b10b92018-11-21 20:13:38 +08002155
Luke Huang9c264bb2018-12-18 16:44:41 +08002156 // expect no response
Luke Huang94b10b92018-11-21 20:13:38 +08002157 memset(buf, 0, MAXPACKET);
Luke Huang9c264bb2018-12-18 16:44:41 +08002158 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2159 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huang94b10b92018-11-21 20:13:38 +08002160
Luke Huang94b10b92018-11-21 20:13:38 +08002161 dns.setResponseProbability(1.0);
Luke Huang94b10b92018-11-21 20:13:38 +08002162
Luke Huangba7bef92018-12-26 16:53:03 +08002163 int fd4 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002164 EXPECT_TRUE(fd4 != -1);
2165
2166 memset(buf, 0, MAXPACKET);
2167 res = getAsyncResponse(fd4, &rcode, buf, MAXPACKET);
2168 EXPECT_GT(res, 0);
2169 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2170
2171 memset(buf, 0, MAXPACKET);
2172 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2173 EXPECT_GT(res, 0);
2174 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
2175}
2176
2177TEST_F(ResolverTest, Async_MalformedQuery) {
Xiao Ma09b71022018-12-11 17:56:32 +09002178 constexpr char listen_addr[] = "127.0.0.4";
2179 constexpr char host_name[] = "howdy.example.com.";
2180 const std::vector<DnsRecord> records = {
2181 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2182 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2183 };
2184
2185 test::DNSResponder dns(listen_addr);
2186 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002187 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002188 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002189
2190 int fd = dns_open_proxy();
2191 EXPECT_TRUE(fd > 0);
2192
2193 const std::string badMsg = "16-52512#";
Xiao Ma09b71022018-12-11 17:56:32 +09002194 static const struct {
Luke Huang94b10b92018-11-21 20:13:38 +08002195 const std::string cmd;
2196 const int expectErr;
2197 } kTestData[] = {
Luke Huangba7bef92018-12-26 16:53:03 +08002198 // Too few arguments
Luke Huang94b10b92018-11-21 20:13:38 +08002199 {"resnsend " + badMsg + '\0', -EINVAL},
2200 // Bad netId
Luke Huangba7bef92018-12-26 16:53:03 +08002201 {"resnsend badnetId 0 " + badMsg + '\0', -EINVAL},
Luke Huang94b10b92018-11-21 20:13:38 +08002202 // Bad raw data
Luke Huangba7bef92018-12-26 16:53:03 +08002203 {"resnsend " + std::to_string(TEST_NETID) + " 0 " + badMsg + '\0', -EILSEQ},
Luke Huang94b10b92018-11-21 20:13:38 +08002204 };
2205
2206 for (unsigned int i = 0; i < std::size(kTestData); i++) {
2207 auto& td = kTestData[i];
2208 SCOPED_TRACE(td.cmd);
2209 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, td.cmd.c_str(), td.cmd.size()));
2210 EXPECT_EQ(rc, static_cast<ssize_t>(td.cmd.size()));
2211
2212 int32_t tmp;
2213 rc = TEMP_FAILURE_RETRY(read(fd, &tmp, sizeof(tmp)));
2214 EXPECT_TRUE(rc > 0);
2215 EXPECT_EQ(static_cast<int>(ntohl(tmp)), td.expectErr);
2216 }
2217 // Normal query with answer buffer
2218 // This is raw data of query "howdy.example.com" type 1 class 1
2219 std::string query = "81sBAAABAAAAAAAABWhvd2R5B2V4YW1wbGUDY29tAAABAAE=";
Luke Huangba7bef92018-12-26 16:53:03 +08002220 std::string cmd = "resnsend " + std::to_string(TEST_NETID) + " 0 " + query + '\0';
Luke Huang94b10b92018-11-21 20:13:38 +08002221 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
2222 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
2223
Luke Huang70931aa2019-01-31 11:57:41 +08002224 uint8_t smallBuf[1] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002225 int rcode;
2226 rc = getAsyncResponse(fd, &rcode, smallBuf, 1);
Luke Huangba7bef92018-12-26 16:53:03 +08002227 EXPECT_EQ(-EMSGSIZE, rc);
Luke Huang94b10b92018-11-21 20:13:38 +08002228
2229 // Do the normal test with large buffer again
2230 fd = dns_open_proxy();
2231 EXPECT_TRUE(fd > 0);
2232 rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
2233 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
Luke Huang70931aa2019-01-31 11:57:41 +08002234 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002235 rc = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2236 EXPECT_EQ("1.2.3.4", toString(buf, rc, AF_INET));
Mike Yu4f3747b2018-12-02 17:54:29 +09002237}
2238
Luke Huangba7bef92018-12-26 16:53:03 +08002239TEST_F(ResolverTest, Async_CacheFlags) {
Xiao Ma09b71022018-12-11 17:56:32 +09002240 constexpr char listen_addr[] = "127.0.0.4";
2241 constexpr char host_name[] = "howdy.example.com.";
Luke Huang40f5f492019-05-09 19:37:35 +08002242 constexpr char another_host_name[] = "howdy.example2.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002243 const std::vector<DnsRecord> records = {
2244 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2245 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
Luke Huang40f5f492019-05-09 19:37:35 +08002246 {another_host_name, ns_type::ns_t_a, "1.2.3.5"},
2247 {another_host_name, ns_type::ns_t_aaaa, "::1.2.3.5"},
Xiao Ma09b71022018-12-11 17:56:32 +09002248 };
2249
2250 test::DNSResponder dns(listen_addr);
2251 StartDns(dns, records);
Luke Huangba7bef92018-12-26 16:53:03 +08002252 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002253 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huangba7bef92018-12-26 16:53:03 +08002254
2255 // ANDROID_RESOLV_NO_CACHE_STORE
2256 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2257 ANDROID_RESOLV_NO_CACHE_STORE);
2258 EXPECT_TRUE(fd1 != -1);
2259 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2260 ANDROID_RESOLV_NO_CACHE_STORE);
2261 EXPECT_TRUE(fd2 != -1);
2262 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2263 ANDROID_RESOLV_NO_CACHE_STORE);
2264 EXPECT_TRUE(fd3 != -1);
2265
2266 expectAnswersValid(fd3, AF_INET, "1.2.3.4");
2267 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
2268 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2269
2270 // No cache exists, expect 3 queries
2271 EXPECT_EQ(3U, GetNumQueries(dns, host_name));
2272
2273 // Re-query and cache
2274 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2275
2276 EXPECT_TRUE(fd1 != -1);
2277
2278 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2279
2280 // Now we have cache, expect 4 queries
2281 EXPECT_EQ(4U, GetNumQueries(dns, host_name));
2282
2283 // ANDROID_RESOLV_NO_CACHE_LOOKUP
2284 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2285 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2286 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2287 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2288
2289 EXPECT_TRUE(fd1 != -1);
2290 EXPECT_TRUE(fd2 != -1);
2291
2292 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
2293 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2294
2295 // Skip cache, expect 6 queries
2296 EXPECT_EQ(6U, GetNumQueries(dns, host_name));
2297
2298 // Re-query verify cache works
2299 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2300 ANDROID_RESOLV_NO_CACHE_STORE);
2301 EXPECT_TRUE(fd1 != -1);
2302 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2303
2304 // Cache hits, expect still 6 queries
2305 EXPECT_EQ(6U, GetNumQueries(dns, host_name));
Luke Huanga1d74182019-03-19 17:30:36 +08002306
2307 // Start to verify if ANDROID_RESOLV_NO_CACHE_LOOKUP does write response into cache
2308 dns.clearQueries();
2309
2310 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa,
2311 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2312 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa,
2313 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2314
2315 EXPECT_TRUE(fd1 != -1);
2316 EXPECT_TRUE(fd2 != -1);
2317
2318 expectAnswersValid(fd2, AF_INET6, "::1.2.3.4");
2319 expectAnswersValid(fd1, AF_INET6, "::1.2.3.4");
2320
2321 // Skip cache, expect 2 queries
2322 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
2323
2324 // Re-query without flags
2325 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
2326 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
2327
2328 EXPECT_TRUE(fd1 != -1);
2329 EXPECT_TRUE(fd2 != -1);
2330
2331 expectAnswersValid(fd2, AF_INET6, "::1.2.3.4");
2332 expectAnswersValid(fd1, AF_INET6, "::1.2.3.4");
2333
2334 // Cache hits, expect still 2 queries
2335 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
Luke Huang40f5f492019-05-09 19:37:35 +08002336
2337 // Test both ANDROID_RESOLV_NO_CACHE_STORE and ANDROID_RESOLV_NO_CACHE_LOOKUP are set
2338 dns.clearQueries();
2339
2340 // Make sure that the cache of "howdy.example2.com" exists.
2341 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa, 0);
2342 EXPECT_TRUE(fd1 != -1);
2343 expectAnswersValid(fd1, AF_INET6, "::1.2.3.5");
2344 EXPECT_EQ(1U, GetNumQueries(dns, another_host_name));
2345
2346 // Re-query with testFlags
2347 const int testFlag = ANDROID_RESOLV_NO_CACHE_STORE | ANDROID_RESOLV_NO_CACHE_LOOKUP;
2348 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa, testFlag);
2349 EXPECT_TRUE(fd1 != -1);
2350 expectAnswersValid(fd1, AF_INET6, "::1.2.3.5");
2351 // Expect cache lookup is skipped.
2352 EXPECT_EQ(2U, GetNumQueries(dns, another_host_name));
2353
2354 // Do another query with testFlags
2355 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_a, testFlag);
2356 EXPECT_TRUE(fd1 != -1);
2357 expectAnswersValid(fd1, AF_INET, "1.2.3.5");
2358 // Expect cache lookup is skipped.
2359 EXPECT_EQ(3U, GetNumQueries(dns, another_host_name));
2360
2361 // Re-query with no flags
2362 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_a, 0);
2363 EXPECT_TRUE(fd1 != -1);
2364 expectAnswersValid(fd1, AF_INET, "1.2.3.5");
2365 // Expect no cache hit because cache storing is also skipped in previous query.
2366 EXPECT_EQ(4U, GetNumQueries(dns, another_host_name));
Luke Huangba7bef92018-12-26 16:53:03 +08002367}
2368
Luke Huang08b13d22020-02-05 14:46:21 +08002369TEST_F(ResolverTest, Async_NoCacheStoreFlagDoesNotRefreshStaleCacheEntry) {
2370 constexpr char listen_addr[] = "127.0.0.4";
2371 constexpr char host_name[] = "howdy.example.com.";
2372 const std::vector<DnsRecord> records = {
2373 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2374 };
2375
2376 test::DNSResponder dns(listen_addr);
2377 StartDns(dns, records);
2378 std::vector<std::string> servers = {listen_addr};
2379 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
2380
2381 const unsigned SHORT_TTL_SEC = 1;
2382 dns.setTtl(SHORT_TTL_SEC);
2383
2384 // Refer to b/148842821 for the purpose of below test steps.
2385 // Basically, this test is used to ensure stale cache case is handled
2386 // correctly with ANDROID_RESOLV_NO_CACHE_STORE.
2387 int fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2388 EXPECT_TRUE(fd != -1);
2389 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2390
2391 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2392 dns.clearQueries();
2393
2394 // Wait until cache expired
2395 sleep(SHORT_TTL_SEC + 0.5);
2396
2397 // Now request the same hostname again.
2398 // We should see a new DNS query because the entry in cache has become stale.
2399 // Due to ANDROID_RESOLV_NO_CACHE_STORE, this query must *not* refresh that stale entry.
2400 fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2401 ANDROID_RESOLV_NO_CACHE_STORE);
2402 EXPECT_TRUE(fd != -1);
2403 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2404 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2405 dns.clearQueries();
2406
2407 // If the cache is still stale, we expect to see one more DNS query
2408 // (this time the cache will be refreshed, but we're not checking for it).
2409 fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2410 EXPECT_TRUE(fd != -1);
2411 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2412 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2413}
2414
Luke Huangba7bef92018-12-26 16:53:03 +08002415TEST_F(ResolverTest, Async_NoRetryFlag) {
Luke Huang70931aa2019-01-31 11:57:41 +08002416 constexpr char listen_addr0[] = "127.0.0.4";
2417 constexpr char listen_addr1[] = "127.0.0.6";
Xiao Ma09b71022018-12-11 17:56:32 +09002418 constexpr char host_name[] = "howdy.example.com.";
2419 const std::vector<DnsRecord> records = {
2420 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2421 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2422 };
2423
Luke Huang70931aa2019-01-31 11:57:41 +08002424 test::DNSResponder dns0(listen_addr0);
2425 test::DNSResponder dns1(listen_addr1);
2426 StartDns(dns0, records);
2427 StartDns(dns1, records);
2428 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr0, listen_addr1}));
Luke Huangba7bef92018-12-26 16:53:03 +08002429
Luke Huang70931aa2019-01-31 11:57:41 +08002430 dns0.clearQueries();
2431 dns1.clearQueries();
2432
2433 dns0.setResponseProbability(0.0);
2434 dns1.setResponseProbability(0.0);
Luke Huangba7bef92018-12-26 16:53:03 +08002435
2436 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2437 ANDROID_RESOLV_NO_RETRY);
2438 EXPECT_TRUE(fd1 != -1);
2439
2440 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa,
2441 ANDROID_RESOLV_NO_RETRY);
2442 EXPECT_TRUE(fd2 != -1);
2443
2444 // expect no response
2445 expectAnswersNotValid(fd1, -ETIMEDOUT);
2446 expectAnswersNotValid(fd2, -ETIMEDOUT);
2447
Luke Huang70931aa2019-01-31 11:57:41 +08002448 // No retry case, expect total 2 queries. The server is selected randomly.
2449 EXPECT_EQ(2U, GetNumQueries(dns0, host_name) + GetNumQueries(dns1, host_name));
Luke Huangba7bef92018-12-26 16:53:03 +08002450
Luke Huang70931aa2019-01-31 11:57:41 +08002451 dns0.clearQueries();
2452 dns1.clearQueries();
Luke Huangba7bef92018-12-26 16:53:03 +08002453
2454 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2455 EXPECT_TRUE(fd1 != -1);
2456
2457 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
2458 EXPECT_TRUE(fd2 != -1);
2459
2460 // expect no response
2461 expectAnswersNotValid(fd1, -ETIMEDOUT);
2462 expectAnswersNotValid(fd2, -ETIMEDOUT);
2463
2464 // Retry case, expect 4 queries
Luke Huang70931aa2019-01-31 11:57:41 +08002465 EXPECT_EQ(4U, GetNumQueries(dns0, host_name));
2466 EXPECT_EQ(4U, GetNumQueries(dns1, host_name));
2467}
2468
2469TEST_F(ResolverTest, Async_VerifyQueryID) {
2470 constexpr char listen_addr[] = "127.0.0.4";
2471 constexpr char host_name[] = "howdy.example.com.";
2472 const std::vector<DnsRecord> records = {
2473 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2474 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2475 };
2476
2477 test::DNSResponder dns(listen_addr);
2478 StartDns(dns, records);
2479 std::vector<std::string> servers = {listen_addr};
2480 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
2481
2482 const uint8_t queryBuf1[] = {
2483 /* Header */
2484 0x55, 0x66, /* Transaction ID */
2485 0x01, 0x00, /* Flags */
2486 0x00, 0x01, /* Questions */
2487 0x00, 0x00, /* Answer RRs */
2488 0x00, 0x00, /* Authority RRs */
2489 0x00, 0x00, /* Additional RRs */
2490 /* Queries */
2491 0x05, 0x68, 0x6f, 0x77, 0x64, 0x79, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
2492 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name */
2493 0x00, 0x01, /* Type */
2494 0x00, 0x01 /* Class */
2495 };
2496
2497 int fd = resNetworkSend(TEST_NETID, queryBuf1, sizeof(queryBuf1), 0);
2498 EXPECT_TRUE(fd != -1);
2499
2500 uint8_t buf[MAXPACKET] = {};
2501 int rcode;
2502
2503 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2504 EXPECT_GT(res, 0);
2505 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2506
2507 auto hp = reinterpret_cast<HEADER*>(buf);
2508 EXPECT_EQ(21862U, htons(hp->id));
2509
2510 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2511
2512 const uint8_t queryBuf2[] = {
2513 /* Header */
2514 0x00, 0x53, /* Transaction ID */
2515 0x01, 0x00, /* Flags */
2516 0x00, 0x01, /* Questions */
2517 0x00, 0x00, /* Answer RRs */
2518 0x00, 0x00, /* Authority RRs */
2519 0x00, 0x00, /* Additional RRs */
2520 /* Queries */
2521 0x05, 0x68, 0x6f, 0x77, 0x64, 0x79, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
2522 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name */
2523 0x00, 0x01, /* Type */
2524 0x00, 0x01 /* Class */
2525 };
2526
2527 // Re-query verify cache works and query id is correct
2528 fd = resNetworkSend(TEST_NETID, queryBuf2, sizeof(queryBuf2), 0);
2529
2530 EXPECT_TRUE(fd != -1);
2531
2532 res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2533 EXPECT_GT(res, 0);
2534 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2535
2536 EXPECT_EQ(0x0053U, htons(hp->id));
2537
2538 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
Luke Huangba7bef92018-12-26 16:53:03 +08002539}
2540
Mike Yu4f3747b2018-12-02 17:54:29 +09002541// This test checks that the resolver should not generate the request containing OPT RR when using
Ken Chen0a015532019-01-02 14:59:38 +08002542// cleartext DNS. If we query the DNS server not supporting EDNS0 and it reponds with
2543// FORMERR_ON_EDNS, we will fallback to no EDNS0 and try again. If the server does no response, we
2544// won't retry so that we get no answer.
Mike Yu4f3747b2018-12-02 17:54:29 +09002545TEST_F(ResolverTest, BrokenEdns) {
2546 typedef test::DNSResponder::Edns Edns;
2547 enum ExpectResult { EXPECT_FAILURE, EXPECT_SUCCESS };
2548
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002549 // Perform cleartext query in off mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002550 const char OFF[] = "off";
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002551
2552 // Perform cleartext query when there's no private DNS server validated in opportunistic mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002553 const char OPPORTUNISTIC_UDP[] = "opportunistic_udp";
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002554
2555 // Perform cleartext query when there is a private DNS server validated in opportunistic mode.
2556 const char OPPORTUNISTIC_FALLBACK_UDP[] = "opportunistic_fallback_udp";
2557
2558 // Perform cyphertext query in opportunistic mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002559 const char OPPORTUNISTIC_TLS[] = "opportunistic_tls";
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002560
2561 // Perform cyphertext query in strict mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002562 const char STRICT[] = "strict";
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002563
Mike Yu4f3747b2018-12-02 17:54:29 +09002564 const char GETHOSTBYNAME[] = "gethostbyname";
2565 const char GETADDRINFO[] = "getaddrinfo";
Mike Yu4f3747b2018-12-02 17:54:29 +09002566 const char ADDR4[] = "192.0.2.1";
2567 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2568 const char CLEARTEXT_PORT[] = "53";
2569 const char TLS_PORT[] = "853";
Luke Huangf8215372019-11-22 11:53:41 +08002570 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002571 ResolverParamsParcel paramsForCleanup = DnsResponderClient::GetDefaultResolverParamsParcel();
2572 paramsForCleanup.servers.clear();
2573 paramsForCleanup.tlsServers.clear();
Mike Yu4f3747b2018-12-02 17:54:29 +09002574
Mike Yufc125e42019-05-15 20:41:28 +08002575 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Mike Yu4f3747b2018-12-02 17:54:29 +09002576 ASSERT_TRUE(dns.startServer());
2577
2578 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2579
Luke Huangf8215372019-11-22 11:53:41 +08002580 // clang-format off
Mike Yu4f3747b2018-12-02 17:54:29 +09002581 static const struct TestConfig {
2582 std::string mode;
2583 std::string method;
2584 Edns edns;
2585 ExpectResult expectResult;
2586
2587 std::string asHostName() const {
2588 const char* ednsString;
2589 switch (edns) {
2590 case Edns::ON:
2591 ednsString = "ednsOn";
2592 break;
Ken Chen0a015532019-01-02 14:59:38 +08002593 case Edns::FORMERR_ON_EDNS:
Mike Yu4f3747b2018-12-02 17:54:29 +09002594 ednsString = "ednsFormerr";
2595 break;
2596 case Edns::DROP:
2597 ednsString = "ednsDrop";
2598 break;
2599 default:
2600 ednsString = "";
2601 break;
2602 }
2603 return StringPrintf("%s.%s.%s.", mode.c_str(), method.c_str(), ednsString);
2604 }
2605 } testConfigs[] = {
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002606 // In OPPORTUNISTIC_TLS, if the DNS server doesn't support EDNS0 but TLS, the lookup
2607 // fails. Could such server exist? if so, we might need to fix it to fallback to
2608 // cleartext query. If the server still make no response for the queries with EDNS0, we
2609 // might also need to fix it to retry without EDNS0.
Mike Yu4f3747b2018-12-02 17:54:29 +09002610 // Another thing is that {OPPORTUNISTIC_TLS, Edns::DROP} and {STRICT, Edns::DROP} are
2611 // commented out since TLS timeout is not configurable.
2612 // TODO: Uncomment them after TLS timeout is configurable.
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002613 {OFF, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2614 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2615 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2616 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2617 {STRICT, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2618 {OFF, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2619 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2620 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2621 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2622 {STRICT, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2623 {OFF, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2624 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2625
2626 // The failure is due to no retry on timeout. Maybe fix it?
2627 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2628
2629 //{OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2630 //{STRICT, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2631 {OFF, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2632 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2633 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2634 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2635 {STRICT, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2636 {OFF, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2637 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2638 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2639 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2640 {STRICT, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2641 {OFF, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2642 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2643
2644 // The failure is due to no retry on timeout. Maybe fix it?
2645 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2646
Mike Yu4f3747b2018-12-02 17:54:29 +09002647 //{OPPORTUNISTIC_TLS, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2648 //{STRICT, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2649 };
Luke Huangf8215372019-11-22 11:53:41 +08002650 // clang-format on
Mike Yu4f3747b2018-12-02 17:54:29 +09002651
2652 for (const auto& config : testConfigs) {
2653 const std::string testHostName = config.asHostName();
2654 SCOPED_TRACE(testHostName);
2655
2656 const char* host_name = testHostName.c_str();
2657 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
2658 dns.setEdns(config.edns);
2659
2660 if (config.mode == OFF) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002661 if (tls.running()) {
2662 ASSERT_TRUE(tls.stopServer());
2663 }
Xiao Ma09b71022018-12-11 17:56:32 +09002664 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Mike Yu4f3747b2018-12-02 17:54:29 +09002665 } else if (config.mode == OPPORTUNISTIC_UDP) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002666 if (tls.running()) {
2667 ASSERT_TRUE(tls.stopServer());
2668 }
Xiao Ma09b71022018-12-11 17:56:32 +09002669 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002670 kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002671 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), false));
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002672 } else if (config.mode == OPPORTUNISTIC_TLS || config.mode == OPPORTUNISTIC_FALLBACK_UDP) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002673 if (!tls.running()) {
2674 ASSERT_TRUE(tls.startServer());
2675 }
Xiao Ma09b71022018-12-11 17:56:32 +09002676 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002677 kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002678 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002679
2680 if (config.mode == OPPORTUNISTIC_FALLBACK_UDP) {
2681 // Force the resolver to fallback to cleartext queries.
2682 ASSERT_TRUE(tls.stopServer());
2683 }
Mike Yu4f3747b2018-12-02 17:54:29 +09002684 } else if (config.mode == STRICT) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002685 if (!tls.running()) {
2686 ASSERT_TRUE(tls.startServer());
2687 }
Xiao Ma09b71022018-12-11 17:56:32 +09002688 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002689 kDefaultParams, kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08002690 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Mike Yu4f3747b2018-12-02 17:54:29 +09002691 }
2692
2693 if (config.method == GETHOSTBYNAME) {
2694 const hostent* h_result = gethostbyname(host_name);
2695 if (config.expectResult == EXPECT_SUCCESS) {
2696 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2697 ASSERT_TRUE(h_result != nullptr);
2698 ASSERT_EQ(4, h_result->h_length);
2699 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
2700 EXPECT_EQ(ADDR4, ToString(h_result));
2701 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
2702 } else {
2703 EXPECT_EQ(0U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
2704 ASSERT_TRUE(h_result == nullptr);
2705 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2706 }
2707 } else if (config.method == GETADDRINFO) {
2708 ScopedAddrinfo ai_result;
2709 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2710 ai_result = safe_getaddrinfo(host_name, nullptr, &hints);
2711 if (config.expectResult == EXPECT_SUCCESS) {
2712 EXPECT_TRUE(ai_result != nullptr);
2713 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2714 const std::string result_str = ToString(ai_result);
2715 EXPECT_EQ(ADDR4, result_str);
2716 } else {
2717 EXPECT_TRUE(ai_result == nullptr);
2718 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
2719 }
2720 } else {
2721 FAIL() << "Unsupported query method: " << config.method;
2722 }
2723
Mike Yudd4ac2d2019-05-31 16:52:11 +08002724 tls.clearQueries();
Mike Yu4f3747b2018-12-02 17:54:29 +09002725 dns.clearQueries();
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002726
2727 // Clear the setup to force the resolver to validate private DNS servers in every test.
2728 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(paramsForCleanup));
Mike Yu4f3747b2018-12-02 17:54:29 +09002729 }
Mike Yu4f3747b2018-12-02 17:54:29 +09002730}
nuccachena26cc2a2018-07-17 18:07:23 +08002731
Ken Chen0a015532019-01-02 14:59:38 +08002732// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2733// Resolver should have a reasonable number of retries instead of spinning forever. We don't have
2734// an efficient way to know if resolver is stuck in an infinite loop. However, test case will be
2735// failed due to timeout.
2736TEST_F(ResolverTest, UnstableTls) {
2737 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2738 const char CLEARTEXT_PORT[] = "53";
2739 const char TLS_PORT[] = "853";
2740 const char* host_name1 = "nonexistent1.example.com.";
2741 const char* host_name2 = "nonexistent2.example.com.";
2742 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
2743
Mike Yufc125e42019-05-15 20:41:28 +08002744 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Ken Chen0a015532019-01-02 14:59:38 +08002745 ASSERT_TRUE(dns.startServer());
2746 dns.setEdns(test::DNSResponder::Edns::FORMERR_ON_EDNS);
2747 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2748 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08002749 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002750 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
2751
Ken Chen0a015532019-01-02 14:59:38 +08002752 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
2753 tls.stopServer();
2754
2755 const hostent* h_result = gethostbyname(host_name1);
2756 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
2757 ASSERT_TRUE(h_result == nullptr);
2758 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2759
2760 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2761 ScopedAddrinfo ai_result = safe_getaddrinfo(host_name2, nullptr, &hints);
2762 EXPECT_TRUE(ai_result == nullptr);
2763 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
2764}
2765
2766// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2767// Moreover, server responds RCODE=FORMERR even on non-EDNS query.
2768TEST_F(ResolverTest, BogusDnsServer) {
2769 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2770 const char CLEARTEXT_PORT[] = "53";
2771 const char TLS_PORT[] = "853";
2772 const char* host_name1 = "nonexistent1.example.com.";
2773 const char* host_name2 = "nonexistent2.example.com.";
2774 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
2775
Mike Yufc125e42019-05-15 20:41:28 +08002776 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Ken Chen0a015532019-01-02 14:59:38 +08002777 ASSERT_TRUE(dns.startServer());
2778 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2779 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08002780 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002781 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
2782
Ken Chen0a015532019-01-02 14:59:38 +08002783 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
2784 tls.stopServer();
2785 dns.setEdns(test::DNSResponder::Edns::FORMERR_UNCOND);
2786
2787 const hostent* h_result = gethostbyname(host_name1);
2788 EXPECT_EQ(0U, GetNumQueries(dns, host_name1));
2789 ASSERT_TRUE(h_result == nullptr);
2790 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2791
2792 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2793 ScopedAddrinfo ai_result = safe_getaddrinfo(host_name2, nullptr, &hints);
2794 EXPECT_TRUE(ai_result == nullptr);
2795 EXPECT_EQ(0U, GetNumQueries(dns, host_name2));
2796}
2797
nuccachena26cc2a2018-07-17 18:07:23 +08002798TEST_F(ResolverTest, GetAddrInfo_Dns64Synthesize) {
2799 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002800 constexpr char dns64_name[] = "ipv4only.arpa.";
2801 constexpr char host_name[] = "v4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002802 const std::vector<DnsRecord> records = {
2803 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2804 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2805 };
nuccachena26cc2a2018-07-17 18:07:23 +08002806
Xiao Ma09b71022018-12-11 17:56:32 +09002807 test::DNSResponder dns(listen_addr);
Xiao Ma09b71022018-12-11 17:56:32 +09002808 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002809
2810 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002811 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002812
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002813 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002814 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002815 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002816
2817 // hints are necessary in order to let netd know which type of addresses the caller is
2818 // interested in.
Xiao Ma09b71022018-12-11 17:56:32 +09002819 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08002820 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
2821 EXPECT_TRUE(result != nullptr);
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002822 // TODO: BUG: there should only be two queries, one AAAA (which returns no records) and one A
2823 // (which returns 1.2.3.4). But there is an extra AAAA.
2824 EXPECT_EQ(3U, GetNumQueries(dns, host_name));
nuccachena26cc2a2018-07-17 18:07:23 +08002825
2826 std::string result_str = ToString(result);
2827 EXPECT_EQ(result_str, "64:ff9b::102:304");
2828
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002829 // Stopping NAT64 prefix discovery disables synthesis.
Luke Huang5bd827c2019-03-14 16:10:04 +08002830 EXPECT_TRUE(mDnsClient.resolvService()->stopPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002831 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_NOT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002832
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002833 dns.clearQueries();
nuccachena26cc2a2018-07-17 18:07:23 +08002834
2835 result = safe_getaddrinfo("v4only", nullptr, &hints);
2836 EXPECT_TRUE(result != nullptr);
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002837 // TODO: BUG: there should only be one query, an AAAA (which returns no records), because the
2838 // A is already cached. But there is an extra AAAA.
2839 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
nuccachena26cc2a2018-07-17 18:07:23 +08002840
2841 result_str = ToString(result);
2842 EXPECT_EQ(result_str, "1.2.3.4");
2843}
2844
nuccachena26cc2a2018-07-17 18:07:23 +08002845TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecified) {
2846 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002847 constexpr char dns64_name[] = "ipv4only.arpa.";
2848 constexpr char host_name[] = "v4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002849 const std::vector<DnsRecord> records = {
2850 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2851 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2852 };
nuccachena26cc2a2018-07-17 18:07:23 +08002853
Xiao Ma09b71022018-12-11 17:56:32 +09002854 test::DNSResponder dns(listen_addr);
2855 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002856 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002857 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002858
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002859 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002860 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002861 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002862
2863 // Ensure to synthesize AAAA if AF_INET6 is specified, and not to synthesize AAAA
2864 // in AF_INET case.
2865 addrinfo hints;
2866 memset(&hints, 0, sizeof(hints));
2867 hints.ai_family = AF_INET6;
2868 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
2869 EXPECT_TRUE(result != nullptr);
2870 std::string result_str = ToString(result);
2871 EXPECT_EQ(result_str, "64:ff9b::102:304");
2872
2873 hints.ai_family = AF_INET;
2874 result = safe_getaddrinfo("v4only", nullptr, &hints);
2875 EXPECT_TRUE(result != nullptr);
2876 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2877 result_str = ToString(result);
2878 EXPECT_EQ(result_str, "1.2.3.4");
2879}
nuccachena26cc2a2018-07-17 18:07:23 +08002880
2881TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedV6) {
2882 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002883 constexpr char dns64_name[] = "ipv4only.arpa.";
2884 constexpr char host_name[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002885 const std::vector<DnsRecord> records = {
2886 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2887 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2888 {host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
2889 };
nuccachena26cc2a2018-07-17 18:07:23 +08002890
Xiao Ma09b71022018-12-11 17:56:32 +09002891 test::DNSResponder dns(listen_addr);
2892 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002893 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002894 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002895
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002896 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002897 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002898 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002899
Xiao Ma09b71022018-12-11 17:56:32 +09002900 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08002901 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
2902 EXPECT_TRUE(result != nullptr);
2903 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2904
2905 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
Xiao Ma09b71022018-12-11 17:56:32 +09002906 const std::vector<std::string> result_strs = ToStrings(result);
nuccachena26cc2a2018-07-17 18:07:23 +08002907 for (const auto& str : result_strs) {
2908 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
2909 << ", result_str='" << str << "'";
2910 }
2911}
2912
2913TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedNoV6) {
2914 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002915 constexpr char dns64_name[] = "ipv4only.arpa.";
2916 constexpr char host_name[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002917 const std::vector<DnsRecord> records = {
2918 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2919 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2920 };
nuccachena26cc2a2018-07-17 18:07:23 +08002921
Xiao Ma09b71022018-12-11 17:56:32 +09002922 test::DNSResponder dns(listen_addr);
2923 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002924 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002925 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002926
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002927 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002928 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002929 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002930
Xiao Ma09b71022018-12-11 17:56:32 +09002931 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08002932 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
2933 EXPECT_TRUE(result != nullptr);
2934 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2935
2936 // In AF_UNSPEC case, synthesize AAAA if there's no AAAA answer.
2937 std::string result_str = ToString(result);
2938 EXPECT_EQ(result_str, "64:ff9b::102:304");
2939}
2940
2941TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecialUseIPv4Addresses) {
2942 constexpr char THIS_NETWORK[] = "this_network";
2943 constexpr char LOOPBACK[] = "loopback";
2944 constexpr char LINK_LOCAL[] = "link_local";
2945 constexpr char MULTICAST[] = "multicast";
2946 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
2947
2948 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
2949 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
2950 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
2951 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
2952 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
2953
2954 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002955 constexpr char dns64_name[] = "ipv4only.arpa.";
2956
Xiao Ma09b71022018-12-11 17:56:32 +09002957 test::DNSResponder dns(listen_addr);
2958 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08002959 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002960 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002961
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002962 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002963 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002964 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002965
Luke Huangf8215372019-11-22 11:53:41 +08002966 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08002967 static const struct TestConfig {
2968 std::string name;
2969 std::string addr;
2970
2971 std::string asHostName() const { return StringPrintf("%s.example.com.", name.c_str()); }
2972 } testConfigs[]{
2973 {THIS_NETWORK, ADDR_THIS_NETWORK},
2974 {LOOPBACK, ADDR_LOOPBACK},
2975 {LINK_LOCAL, ADDR_LINK_LOCAL},
2976 {MULTICAST, ADDR_MULTICAST},
2977 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
2978 };
Luke Huangf8215372019-11-22 11:53:41 +08002979 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08002980
2981 for (const auto& config : testConfigs) {
2982 const std::string testHostName = config.asHostName();
2983 SCOPED_TRACE(testHostName);
2984
2985 const char* host_name = testHostName.c_str();
2986 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
2987
2988 addrinfo hints;
2989 memset(&hints, 0, sizeof(hints));
2990 hints.ai_family = AF_INET6;
2991 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
2992 // In AF_INET6 case, don't return IPv4 answers
2993 EXPECT_TRUE(result == nullptr);
2994 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2995 dns.clearQueries();
2996
2997 memset(&hints, 0, sizeof(hints));
2998 hints.ai_family = AF_UNSPEC;
2999 result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
3000 EXPECT_TRUE(result != nullptr);
3001 // Expect IPv6 query only. IPv4 answer has been cached in previous query.
3002 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3003 // In AF_UNSPEC case, don't synthesize special use IPv4 address.
3004 std::string result_str = ToString(result);
3005 EXPECT_EQ(result_str, config.addr.c_str());
3006 dns.clearQueries();
3007 }
3008}
3009
3010TEST_F(ResolverTest, GetAddrInfo_Dns64QueryWithNullArgumentHints) {
3011 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003012 constexpr char dns64_name[] = "ipv4only.arpa.";
3013 constexpr char host_name[] = "v4only.example.com.";
3014 constexpr char host_name2[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003015 const std::vector<DnsRecord> records = {
3016 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3017 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3018 {host_name2, ns_type::ns_t_a, "1.2.3.4"},
3019 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
3020 };
nuccachena26cc2a2018-07-17 18:07:23 +08003021
Xiao Ma09b71022018-12-11 17:56:32 +09003022 test::DNSResponder dns(listen_addr);
3023 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003024 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003025 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003026
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003027 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003028 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003029 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003030
3031 // Assign argument hints of getaddrinfo() as null is equivalent to set ai_family AF_UNSPEC.
3032 // In AF_UNSPEC case, synthesize AAAA if there has A answer only.
3033 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, nullptr);
3034 EXPECT_TRUE(result != nullptr);
3035 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3036 std::string result_str = ToString(result);
3037 EXPECT_EQ(result_str, "64:ff9b::102:304");
3038 dns.clearQueries();
3039
3040 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
3041 result = safe_getaddrinfo("v4v6", nullptr, nullptr);
3042 EXPECT_TRUE(result != nullptr);
3043 EXPECT_LE(2U, GetNumQueries(dns, host_name2));
3044 std::vector<std::string> result_strs = ToStrings(result);
3045 for (const auto& str : result_strs) {
3046 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
3047 << ", result_str='" << str << "'";
3048 }
3049}
3050
3051TEST_F(ResolverTest, GetAddrInfo_Dns64QueryNullArgumentNode) {
3052 constexpr char ADDR_ANYADDR_V4[] = "0.0.0.0";
3053 constexpr char ADDR_ANYADDR_V6[] = "::";
3054 constexpr char ADDR_LOCALHOST_V4[] = "127.0.0.1";
3055 constexpr char ADDR_LOCALHOST_V6[] = "::1";
3056
3057 constexpr char PORT_NAME_HTTP[] = "http";
3058 constexpr char PORT_NUMBER_HTTP[] = "80";
3059
3060 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003061 constexpr char dns64_name[] = "ipv4only.arpa.";
3062
Xiao Ma09b71022018-12-11 17:56:32 +09003063 test::DNSResponder dns(listen_addr);
3064 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003065 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003066 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003067
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003068 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003069 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003070 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003071
Luke Huangf8215372019-11-22 11:53:41 +08003072 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003073 // If node is null, return address is listed by libc/getaddrinfo.c as follows.
3074 // - passive socket -> anyaddr (0.0.0.0 or ::)
3075 // - non-passive socket -> localhost (127.0.0.1 or ::1)
3076 static const struct TestConfig {
3077 int flag;
3078 std::string addr_v4;
3079 std::string addr_v6;
3080
3081 std::string asParameters() const {
3082 return StringPrintf("flag=%d, addr_v4=%s, addr_v6=%s", flag, addr_v4.c_str(),
3083 addr_v6.c_str());
3084 }
3085 } testConfigs[]{
3086 {0 /* non-passive */, ADDR_LOCALHOST_V4, ADDR_LOCALHOST_V6},
3087 {AI_PASSIVE, ADDR_ANYADDR_V4, ADDR_ANYADDR_V6}
3088 };
Luke Huangf8215372019-11-22 11:53:41 +08003089 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003090
3091 for (const auto& config : testConfigs) {
3092 SCOPED_TRACE(config.asParameters());
3093
Xiao Ma09b71022018-12-11 17:56:32 +09003094 addrinfo hints = {
Nick Desaulnierscd6395a2019-10-11 09:15:24 -07003095 .ai_flags = config.flag,
Xiao Ma09b71022018-12-11 17:56:32 +09003096 .ai_family = AF_UNSPEC, // any address family
3097 .ai_socktype = 0, // any type
3098 .ai_protocol = 0, // any protocol
Xiao Ma09b71022018-12-11 17:56:32 +09003099 };
nuccachena26cc2a2018-07-17 18:07:23 +08003100
3101 // Assign hostname as null and service as port name.
3102 ScopedAddrinfo result = safe_getaddrinfo(nullptr, PORT_NAME_HTTP, &hints);
3103 ASSERT_TRUE(result != nullptr);
3104
3105 // Can't be synthesized because it should not get into Netd.
3106 std::vector<std::string> result_strs = ToStrings(result);
3107 for (const auto& str : result_strs) {
3108 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
3109 << ", result_str='" << str << "'";
3110 }
3111
3112 // Assign hostname as null and service as numeric port number.
3113 hints.ai_flags = config.flag | AI_NUMERICSERV;
3114 result = safe_getaddrinfo(nullptr, PORT_NUMBER_HTTP, &hints);
3115 ASSERT_TRUE(result != nullptr);
3116
3117 // Can't be synthesized because it should not get into Netd.
3118 result_strs = ToStrings(result);
3119 for (const auto& str : result_strs) {
3120 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
3121 << ", result_str='" << str << "'";
3122 }
3123 }
3124}
3125
3126TEST_F(ResolverTest, GetHostByAddr_ReverseDnsQueryWithHavingNat64Prefix) {
3127 struct hostent* result = nullptr;
3128 struct in_addr v4addr;
3129 struct in6_addr v6addr;
3130
3131 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003132 constexpr char dns64_name[] = "ipv4only.arpa.";
3133 constexpr char ptr_name[] = "v4v6.example.com.";
3134 // PTR record for IPv4 address 1.2.3.4
3135 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3136 // PTR record for IPv6 address 2001:db8::102:304
3137 constexpr char ptr_addr_v6[] =
3138 "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 +09003139 const std::vector<DnsRecord> records = {
3140 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3141 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3142 {ptr_addr_v6, ns_type::ns_t_ptr, ptr_name},
3143 };
nuccachena26cc2a2018-07-17 18:07:23 +08003144
Xiao Ma09b71022018-12-11 17:56:32 +09003145 test::DNSResponder dns(listen_addr);
3146 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003147 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003148 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003149
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003150 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003151 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003152 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003153
3154 // Reverse IPv4 DNS query. Prefix should have no effect on it.
3155 inet_pton(AF_INET, "1.2.3.4", &v4addr);
3156 result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
3157 ASSERT_TRUE(result != nullptr);
3158 std::string result_str = result->h_name ? result->h_name : "null";
3159 EXPECT_EQ(result_str, "v4v6.example.com");
3160
3161 // Reverse IPv6 DNS query. Prefix should have no effect on it.
3162 inet_pton(AF_INET6, "2001:db8::102:304", &v6addr);
3163 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3164 ASSERT_TRUE(result != nullptr);
3165 result_str = result->h_name ? result->h_name : "null";
3166 EXPECT_EQ(result_str, "v4v6.example.com");
3167}
3168
3169TEST_F(ResolverTest, GetHostByAddr_ReverseDns64Query) {
3170 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003171 constexpr char dns64_name[] = "ipv4only.arpa.";
3172 constexpr char ptr_name[] = "v4only.example.com.";
3173 // PTR record for IPv4 address 1.2.3.4
3174 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3175 // PTR record for IPv6 address 64:ff9b::1.2.3.4
3176 constexpr char ptr_addr_v6_nomapping[] =
3177 "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.";
3178 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
3179 // PTR record for IPv6 address 64:ff9b::5.6.7.8
3180 constexpr char ptr_addr_v6_synthesis[] =
3181 "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 +09003182 const std::vector<DnsRecord> records = {
3183 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3184 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3185 {ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis},
3186 };
nuccachena26cc2a2018-07-17 18:07:23 +08003187
Xiao Ma09b71022018-12-11 17:56:32 +09003188 test::DNSResponder dns(listen_addr);
3189 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003190 // "ptr_addr_v6_nomapping" is not mapped in DNS server
nuccachena26cc2a2018-07-17 18:07:23 +08003191 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003192 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003193
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003194 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003195 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003196 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003197
3198 // Synthesized PTR record doesn't exist on DNS server
3199 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
3200 // After querying synthesized address failed, expect that prefix is removed from IPv6
3201 // synthesized address and do reverse IPv4 query instead.
3202 struct in6_addr v6addr;
3203 inet_pton(AF_INET6, "64:ff9b::1.2.3.4", &v6addr);
3204 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3205 ASSERT_TRUE(result != nullptr);
3206 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist
3207 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist
3208 std::string result_str = result->h_name ? result->h_name : "null";
3209 EXPECT_EQ(result_str, "v4only.example.com");
3210 // Check that return address has been mapped from IPv4 to IPv6 address because Netd
3211 // removes NAT64 prefix and does IPv4 DNS reverse lookup in this case. Then, Netd
3212 // fakes the return IPv4 address as original queried IPv6 address.
3213 result_str = ToString(result);
3214 EXPECT_EQ(result_str, "64:ff9b::102:304");
3215 dns.clearQueries();
3216
3217 // Synthesized PTR record exists on DNS server
3218 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
3219 // Expect to Netd pass through synthesized address for DNS queries.
3220 inet_pton(AF_INET6, "64:ff9b::5.6.7.8", &v6addr);
3221 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3222 ASSERT_TRUE(result != nullptr);
3223 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
3224 result_str = result->h_name ? result->h_name : "null";
3225 EXPECT_EQ(result_str, "v6synthesis.example.com");
3226}
3227
3228TEST_F(ResolverTest, GetHostByAddr_ReverseDns64QueryFromHostFile) {
3229 constexpr char dns64_name[] = "ipv4only.arpa.";
3230 constexpr char host_name[] = "localhost";
3231 // The address is synthesized by prefix64:localhost.
3232 constexpr char host_addr[] = "64:ff9b::7f00:1";
nuccachena26cc2a2018-07-17 18:07:23 +08003233 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003234
3235 test::DNSResponder dns(listen_addr);
3236 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003237 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003238 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003239
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003240 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003241 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003242 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003243
3244 // Using synthesized "localhost" address to be a trick for resolving host name
3245 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
3246 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
3247 struct in6_addr v6addr;
3248 inet_pton(AF_INET6, host_addr, &v6addr);
3249 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3250 ASSERT_TRUE(result != nullptr);
3251 // Expect no DNS queries; localhost is resolved via /etc/hosts.
3252 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
3253
Luke Huangf8215372019-11-22 11:53:41 +08003254 ASSERT_EQ(sizeof(in6_addr), (unsigned)result->h_length);
nuccachena26cc2a2018-07-17 18:07:23 +08003255 ASSERT_EQ(AF_INET6, result->h_addrtype);
3256 std::string result_str = ToString(result);
3257 EXPECT_EQ(result_str, host_addr);
3258 result_str = result->h_name ? result->h_name : "null";
3259 EXPECT_EQ(result_str, host_name);
3260}
3261
Hungming Chen9e6185a2019-06-04 16:09:19 +08003262TEST_F(ResolverTest, GetHostByAddr_cnamesClasslessReverseDelegation) {
3263 // IPv4 addresses in the subnet with notation '/' or '-'.
3264 constexpr char addr_slash[] = "192.0.2.1";
3265 constexpr char addr_hyphen[] = "192.0.3.1";
3266
3267 // Used to verify DNS reverse query for classless reverse lookup zone. See detail in RFC 2317
3268 // section 4.
3269 const static std::vector<DnsRecord> records = {
3270 // The records for reverse querying "192.0.2.1" in the subnet with notation '/'.
3271 {"1.2.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0/25.2.0.192.in-addr.arpa."},
3272 {"1.0/25.2.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3273
3274 // The records for reverse querying "192.0.3.1" in the subnet with notation '-'.
3275 {"1.3.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0-127.3.0.192.in-addr.arpa."},
3276 {"1.0-127.3.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3277 };
3278
3279 test::DNSResponder dns;
3280 StartDns(dns, records);
3281 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3282
3283 for (const auto& address : {addr_slash, addr_hyphen}) {
3284 SCOPED_TRACE(address);
3285
3286 in_addr v4addr;
3287 ASSERT_TRUE(inet_pton(AF_INET, address, &v4addr));
3288 hostent* result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
3289 ASSERT_TRUE(result != nullptr);
3290 EXPECT_STREQ("hello.example.com", result->h_name);
3291 }
3292}
3293
nuccachena26cc2a2018-07-17 18:07:23 +08003294TEST_F(ResolverTest, GetNameInfo_ReverseDnsQueryWithHavingNat64Prefix) {
3295 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003296 constexpr char dns64_name[] = "ipv4only.arpa.";
3297 constexpr char ptr_name[] = "v4v6.example.com.";
3298 // PTR record for IPv4 address 1.2.3.4
3299 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3300 // PTR record for IPv6 address 2001:db8::102:304
3301 constexpr char ptr_addr_v6[] =
3302 "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 +09003303 const std::vector<DnsRecord> records = {
3304 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3305 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3306 {ptr_addr_v6, ns_type::ns_t_ptr, ptr_name},
3307 };
nuccachena26cc2a2018-07-17 18:07:23 +08003308
Xiao Ma09b71022018-12-11 17:56:32 +09003309 test::DNSResponder dns(listen_addr);
3310 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003311 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003312 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003313
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003314 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003315 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003316 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003317
Luke Huangf8215372019-11-22 11:53:41 +08003318 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003319 static const struct TestConfig {
3320 int flag;
3321 int family;
3322 std::string addr;
3323 std::string host;
3324
3325 std::string asParameters() const {
3326 return StringPrintf("flag=%d, family=%d, addr=%s, host=%s", flag, family, addr.c_str(),
3327 host.c_str());
3328 }
3329 } testConfigs[]{
3330 {NI_NAMEREQD, AF_INET, "1.2.3.4", "v4v6.example.com"},
3331 {NI_NUMERICHOST, AF_INET, "1.2.3.4", "1.2.3.4"},
3332 {0, AF_INET, "1.2.3.4", "v4v6.example.com"},
3333 {0, AF_INET, "5.6.7.8", "5.6.7.8"}, // unmapped
3334 {NI_NAMEREQD, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
3335 {NI_NUMERICHOST, AF_INET6, "2001:db8::102:304", "2001:db8::102:304"},
3336 {0, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
3337 {0, AF_INET6, "2001:db8::506:708", "2001:db8::506:708"}, // unmapped
3338 };
Luke Huangf8215372019-11-22 11:53:41 +08003339 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003340
3341 // Reverse IPv4/IPv6 DNS query. Prefix should have no effect on it.
3342 for (const auto& config : testConfigs) {
3343 SCOPED_TRACE(config.asParameters());
3344
3345 int rv;
3346 char host[NI_MAXHOST];
3347 struct sockaddr_in sin;
3348 struct sockaddr_in6 sin6;
3349 if (config.family == AF_INET) {
3350 memset(&sin, 0, sizeof(sin));
3351 sin.sin_family = AF_INET;
3352 inet_pton(AF_INET, config.addr.c_str(), &sin.sin_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003353 rv = getnameinfo((const struct sockaddr*)&sin, sizeof(sin), host, sizeof(host), nullptr,
3354 0, config.flag);
nuccachena26cc2a2018-07-17 18:07:23 +08003355 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4));
3356 } else if (config.family == AF_INET6) {
3357 memset(&sin6, 0, sizeof(sin6));
3358 sin6.sin6_family = AF_INET6;
3359 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003360 rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host),
nuccachena26cc2a2018-07-17 18:07:23 +08003361 nullptr, 0, config.flag);
3362 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6));
3363 }
3364 ASSERT_EQ(0, rv);
3365 std::string result_str = host;
3366 EXPECT_EQ(result_str, config.host);
3367 dns.clearQueries();
3368 }
3369}
3370
3371TEST_F(ResolverTest, GetNameInfo_ReverseDns64Query) {
3372 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003373 constexpr char dns64_name[] = "ipv4only.arpa.";
3374 constexpr char ptr_name[] = "v4only.example.com.";
3375 // PTR record for IPv4 address 1.2.3.4
3376 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3377 // PTR record for IPv6 address 64:ff9b::1.2.3.4
3378 constexpr char ptr_addr_v6_nomapping[] =
3379 "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.";
3380 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
3381 // PTR record for IPv6 address 64:ff9b::5.6.7.8
3382 constexpr char ptr_addr_v6_synthesis[] =
3383 "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 +09003384 const std::vector<DnsRecord> records = {
3385 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3386 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3387 {ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis},
3388 };
nuccachena26cc2a2018-07-17 18:07:23 +08003389
Xiao Ma09b71022018-12-11 17:56:32 +09003390 test::DNSResponder dns(listen_addr);
3391 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003392 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003393 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003394
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003395 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003396 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003397 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003398
Luke Huangf8215372019-11-22 11:53:41 +08003399 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003400 static const struct TestConfig {
3401 bool hasSynthesizedPtrRecord;
3402 int flag;
3403 std::string addr;
3404 std::string host;
3405
3406 std::string asParameters() const {
3407 return StringPrintf("hasSynthesizedPtrRecord=%d, flag=%d, addr=%s, host=%s",
3408 hasSynthesizedPtrRecord, flag, addr.c_str(), host.c_str());
3409 }
3410 } testConfigs[]{
3411 {false, NI_NAMEREQD, "64:ff9b::102:304", "v4only.example.com"},
3412 {false, NI_NUMERICHOST, "64:ff9b::102:304", "64:ff9b::102:304"},
3413 {false, 0, "64:ff9b::102:304", "v4only.example.com"},
3414 {true, NI_NAMEREQD, "64:ff9b::506:708", "v6synthesis.example.com"},
3415 {true, NI_NUMERICHOST, "64:ff9b::506:708", "64:ff9b::506:708"},
3416 {true, 0, "64:ff9b::506:708", "v6synthesis.example.com"}
3417 };
Luke Huangf8215372019-11-22 11:53:41 +08003418 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003419
3420 // hasSynthesizedPtrRecord = false
3421 // Synthesized PTR record doesn't exist on DNS server
3422 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
3423 // After querying synthesized address failed, expect that prefix is removed from IPv6
3424 // synthesized address and do reverse IPv4 query instead.
3425 //
3426 // hasSynthesizedPtrRecord = true
3427 // Synthesized PTR record exists on DNS server
3428 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
3429 // Expect to just pass through synthesized address for DNS queries.
3430 for (const auto& config : testConfigs) {
3431 SCOPED_TRACE(config.asParameters());
3432
3433 char host[NI_MAXHOST];
3434 struct sockaddr_in6 sin6;
3435 memset(&sin6, 0, sizeof(sin6));
3436 sin6.sin6_family = AF_INET6;
3437 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003438 int rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host),
nuccachena26cc2a2018-07-17 18:07:23 +08003439 nullptr, 0, config.flag);
3440 ASSERT_EQ(0, rv);
3441 if (config.flag == NI_NAMEREQD) {
3442 if (config.hasSynthesizedPtrRecord) {
3443 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
3444 } else {
3445 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist.
3446 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist.
3447 }
3448 }
3449 std::string result_str = host;
3450 EXPECT_EQ(result_str, config.host);
3451 dns.clearQueries();
3452 }
3453}
3454
3455TEST_F(ResolverTest, GetNameInfo_ReverseDns64QueryFromHostFile) {
3456 constexpr char dns64_name[] = "ipv4only.arpa.";
3457 constexpr char host_name[] = "localhost";
3458 // The address is synthesized by prefix64:localhost.
3459 constexpr char host_addr[] = "64:ff9b::7f00:1";
nuccachena26cc2a2018-07-17 18:07:23 +08003460 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003461
3462 test::DNSResponder dns(listen_addr);
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003463
Xiao Ma09b71022018-12-11 17:56:32 +09003464 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003465 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003466 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003467
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003468 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003469 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003470 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003471
3472 // Using synthesized "localhost" address to be a trick for resolving host name
3473 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
3474 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
3475 char host[NI_MAXHOST];
Xiao Ma09b71022018-12-11 17:56:32 +09003476 struct sockaddr_in6 sin6 = {.sin6_family = AF_INET6};
nuccachena26cc2a2018-07-17 18:07:23 +08003477 inet_pton(AF_INET6, host_addr, &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003478 int rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host), nullptr,
nuccachena26cc2a2018-07-17 18:07:23 +08003479 0, NI_NAMEREQD);
3480 ASSERT_EQ(0, rv);
3481 // Expect no DNS queries; localhost is resolved via /etc/hosts.
3482 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
3483
3484 std::string result_str = host;
3485 EXPECT_EQ(result_str, host_name);
3486}
3487
Hungming Chen9e6185a2019-06-04 16:09:19 +08003488TEST_F(ResolverTest, GetNameInfo_cnamesClasslessReverseDelegation) {
3489 // IPv4 addresses in the subnet with notation '/' or '-'.
3490 constexpr char addr_slash[] = "192.0.2.1";
3491 constexpr char addr_hyphen[] = "192.0.3.1";
3492
3493 // Used to verify DNS reverse query for classless reverse lookup zone. See detail in RFC 2317
3494 // section 4.
3495 const static std::vector<DnsRecord> records = {
3496 // The records for reverse querying "192.0.2.1" in the subnet with notation '/'.
3497 {"1.2.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0/25.2.0.192.in-addr.arpa."},
3498 {"1.0/25.2.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3499
3500 // The records for reverse querying "192.0.3.1" in the subnet with notation '-'.
3501 {"1.3.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0-127.3.0.192.in-addr.arpa."},
3502 {"1.0-127.3.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3503 };
3504
3505 test::DNSResponder dns;
3506 StartDns(dns, records);
3507 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3508
3509 for (const auto& address : {addr_slash, addr_hyphen}) {
3510 SCOPED_TRACE(address);
3511
3512 char host[NI_MAXHOST];
3513 sockaddr_in sin = {.sin_family = AF_INET};
3514 ASSERT_TRUE(inet_pton(AF_INET, address, &sin.sin_addr));
3515 int rv = getnameinfo((const sockaddr*)&sin, sizeof(sin), host, sizeof(host), nullptr, 0,
3516 NI_NAMEREQD);
3517 ASSERT_EQ(0, rv);
3518 EXPECT_STREQ("hello.example.com", host);
3519 }
3520}
3521
nuccachena26cc2a2018-07-17 18:07:23 +08003522TEST_F(ResolverTest, GetHostByName2_Dns64Synthesize) {
Xiao Ma09b71022018-12-11 17:56:32 +09003523 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003524 constexpr char dns64_name[] = "ipv4only.arpa.";
3525 constexpr char host_name[] = "ipv4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003526 const std::vector<DnsRecord> records = {
3527 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3528 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3529 };
nuccachena26cc2a2018-07-17 18:07:23 +08003530
Xiao Ma09b71022018-12-11 17:56:32 +09003531 test::DNSResponder dns(listen_addr);
3532 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003533 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003534 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003535
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003536 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003537 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003538 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003539
3540 // Query an IPv4-only hostname. Expect that gets a synthesized address.
3541 struct hostent* result = gethostbyname2("ipv4only", AF_INET6);
3542 ASSERT_TRUE(result != nullptr);
3543 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3544 std::string result_str = ToString(result);
3545 EXPECT_EQ(result_str, "64:ff9b::102:304");
3546}
nuccachena26cc2a2018-07-17 18:07:23 +08003547
3548TEST_F(ResolverTest, GetHostByName2_DnsQueryWithHavingNat64Prefix) {
3549 constexpr char dns64_name[] = "ipv4only.arpa.";
3550 constexpr char host_name[] = "v4v6.example.com.";
nuccachena26cc2a2018-07-17 18:07:23 +08003551 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003552 const std::vector<DnsRecord> records = {
3553 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3554 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3555 {host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
3556 };
3557
3558 test::DNSResponder dns(listen_addr);
3559 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003560 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003561 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003562
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003563 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003564 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003565 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003566
3567 // IPv4 DNS query. Prefix should have no effect on it.
3568 struct hostent* result = gethostbyname2("v4v6", AF_INET);
3569 ASSERT_TRUE(result != nullptr);
3570 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3571 std::string result_str = ToString(result);
3572 EXPECT_EQ(result_str, "1.2.3.4");
3573 dns.clearQueries();
3574
3575 // IPv6 DNS query. Prefix should have no effect on it.
3576 result = gethostbyname2("v4v6", AF_INET6);
3577 ASSERT_TRUE(result != nullptr);
3578 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3579 result_str = ToString(result);
3580 EXPECT_EQ(result_str, "2001:db8::102:304");
3581}
3582
3583TEST_F(ResolverTest, GetHostByName2_Dns64QuerySpecialUseIPv4Addresses) {
3584 constexpr char THIS_NETWORK[] = "this_network";
3585 constexpr char LOOPBACK[] = "loopback";
3586 constexpr char LINK_LOCAL[] = "link_local";
3587 constexpr char MULTICAST[] = "multicast";
3588 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
3589
3590 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
3591 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
3592 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
3593 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
3594 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
3595
3596 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003597 constexpr char dns64_name[] = "ipv4only.arpa.";
3598
Xiao Ma09b71022018-12-11 17:56:32 +09003599 test::DNSResponder dns(listen_addr);
3600 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003601 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003602 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003603
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003604 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003605 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003606 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003607
Luke Huangf8215372019-11-22 11:53:41 +08003608 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003609 static const struct TestConfig {
3610 std::string name;
3611 std::string addr;
3612
3613 std::string asHostName() const {
Luke Huangf8215372019-11-22 11:53:41 +08003614 return StringPrintf("%s.example.com.", name.c_str());
nuccachena26cc2a2018-07-17 18:07:23 +08003615 }
3616 } testConfigs[]{
3617 {THIS_NETWORK, ADDR_THIS_NETWORK},
3618 {LOOPBACK, ADDR_LOOPBACK},
3619 {LINK_LOCAL, ADDR_LINK_LOCAL},
3620 {MULTICAST, ADDR_MULTICAST},
3621 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
3622 };
Luke Huangf8215372019-11-22 11:53:41 +08003623 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003624
3625 for (const auto& config : testConfigs) {
3626 const std::string testHostName = config.asHostName();
3627 SCOPED_TRACE(testHostName);
3628
3629 const char* host_name = testHostName.c_str();
3630 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
3631
3632 struct hostent* result = gethostbyname2(config.name.c_str(), AF_INET6);
3633 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3634
3635 // In AF_INET6 case, don't synthesize special use IPv4 address.
3636 // Expect to have no answer
3637 EXPECT_EQ(nullptr, result);
3638
3639 dns.clearQueries();
3640 }
Bernie Innocenti2fef2b82018-12-20 15:56:40 +09003641}
Mike Yuf14e1a92019-05-10 13:54:58 +08003642
3643TEST_F(ResolverTest, PrefixDiscoveryBypassTls) {
3644 constexpr char listen_addr[] = "::1";
3645 constexpr char cleartext_port[] = "53";
3646 constexpr char tls_port[] = "853";
3647 constexpr char dns64_name[] = "ipv4only.arpa.";
3648 const std::vector<std::string> servers = {listen_addr};
3649
3650 test::DNSResponder dns(listen_addr);
3651 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
3652 test::DnsTlsFrontend tls(listen_addr, tls_port, listen_addr, cleartext_port);
3653 ASSERT_TRUE(tls.startServer());
3654
3655 // Setup OPPORTUNISTIC mode and wait for the validation complete.
waynema0e73c2e2019-07-31 15:04:08 +08003656 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08003657 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003658 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yuf14e1a92019-05-10 13:54:58 +08003659 tls.clearQueries();
3660
3661 // Start NAT64 prefix discovery and wait for it complete.
3662 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003663 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
Mike Yuf14e1a92019-05-10 13:54:58 +08003664
3665 // Verify it bypassed TLS even though there's a TLS server available.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003666 EXPECT_EQ(0, tls.queries()) << dns.dumpQueries();
3667 EXPECT_EQ(1U, GetNumQueries(dns, dns64_name)) << dns.dumpQueries();
Mike Yuf14e1a92019-05-10 13:54:58 +08003668
3669 // Restart the testing network to reset the cache.
3670 mDnsClient.TearDown();
3671 mDnsClient.SetUp();
3672 dns.clearQueries();
3673
3674 // Setup STRICT mode and wait for the validation complete.
waynema0e73c2e2019-07-31 15:04:08 +08003675 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
3676 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08003677 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003678 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yuf14e1a92019-05-10 13:54:58 +08003679 tls.clearQueries();
3680
3681 // Start NAT64 prefix discovery and wait for it to complete.
3682 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003683 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
Mike Yuf14e1a92019-05-10 13:54:58 +08003684
3685 // Verify it bypassed TLS despite STRICT mode.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003686 EXPECT_EQ(0, tls.queries()) << dns.dumpQueries();
3687 EXPECT_EQ(1U, GetNumQueries(dns, dns64_name)) << dns.dumpQueries();
Mike Yuf14e1a92019-05-10 13:54:58 +08003688}
Luke Huang9807e6b2019-05-20 16:17:12 +08003689
Lorenzo Colitti346737c2020-05-21 13:56:22 +00003690TEST_F(ResolverTest, SetAndClearNat64Prefix) {
3691 constexpr char host_name[] = "v4.example.com.";
3692 constexpr char listen_addr[] = "::1";
3693 const std::vector<DnsRecord> records = {
3694 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3695 };
3696 const std::string kNat64Prefix1 = "64:ff9b::/96";
3697 const std::string kNat64Prefix2 = "2001:db8:6464::/96";
3698
3699 test::DNSResponder dns(listen_addr);
3700 StartDns(dns, records);
3701 const std::vector<std::string> servers = {listen_addr};
3702 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
3703
3704 auto resolvService = mDnsClient.resolvService();
3705 addrinfo hints = {.ai_family = AF_INET6};
3706
3707 // No NAT64 prefix, no AAAA record.
3708 ScopedAddrinfo result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3709 ASSERT_TRUE(result == nullptr);
3710
3711 // Set the prefix, and expect to get a synthesized AAAA record.
3712 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix2).isOk());
3713 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3714 ASSERT_FALSE(result == nullptr);
3715 EXPECT_EQ("2001:db8:6464::102:304", ToString(result));
3716
3717 // Update the prefix, expect to see AAAA records from the new prefix.
3718 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3719 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3720 ASSERT_FALSE(result == nullptr);
3721 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3722
3723 // Non-/96 prefixes are ignored.
3724 auto status = resolvService->setPrefix64(TEST_NETID, "64:ff9b::/64");
3725 EXPECT_FALSE(status.isOk());
3726 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3727 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3728
3729 // Invalid prefixes are ignored.
3730 status = resolvService->setPrefix64(TEST_NETID, "192.0.2.0/24");
3731 EXPECT_FALSE(status.isOk());
3732 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3733 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3734
3735 status = resolvService->setPrefix64(TEST_NETID, "192.0.2.1");
3736 EXPECT_FALSE(status.isOk());
3737 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3738 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3739
3740 status = resolvService->setPrefix64(TEST_NETID, "hello");
3741 EXPECT_FALSE(status.isOk());
3742 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3743 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3744
3745 // DNS64 synthesis is still working.
3746 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3747 ASSERT_FALSE(result == nullptr);
3748 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3749
3750 // Clear the prefix. No AAAA records any more.
3751 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, "").isOk());
3752 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3753 EXPECT_TRUE(result == nullptr);
3754
3755 // Calling startPrefix64Discovery clears the prefix.
3756 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3757 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3758 ASSERT_FALSE(result == nullptr);
3759 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3760
3761 EXPECT_TRUE(resolvService->startPrefix64Discovery(TEST_NETID).isOk());
3762 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3763 ASSERT_TRUE(result == nullptr);
3764
3765 // setPrefix64 fails if prefix discovery is started, even if no prefix is yet discovered...
3766 status = resolvService->setPrefix64(TEST_NETID, kNat64Prefix1);
3767 EXPECT_FALSE(status.isOk());
3768 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3769 EXPECT_EQ(EEXIST, status.getServiceSpecificError());
3770
3771 // .. and clearing the prefix also has no effect.
3772 status = resolvService->setPrefix64(TEST_NETID, "");
3773 EXPECT_FALSE(status.isOk());
3774 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3775 EXPECT_EQ(ENOENT, status.getServiceSpecificError());
3776
3777 // setPrefix64 succeeds again when prefix discovery is stopped.
3778 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
3779 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3780 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3781 ASSERT_FALSE(result == nullptr);
3782 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3783
3784 // Calling stopPrefix64Discovery clears the prefix.
3785 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
3786 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3787 ASSERT_TRUE(result == nullptr);
3788
3789 // Set up NAT64 prefix discovery.
3790 constexpr char dns64_name[] = "ipv4only.arpa.";
3791 const std::vector<DnsRecord> newRecords = {
3792 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3793 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3794 };
3795 dns.stopServer();
3796 StartDns(dns, newRecords);
3797
3798 EXPECT_TRUE(resolvService->startPrefix64Discovery(TEST_NETID).isOk());
3799 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
3800 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3801 ASSERT_FALSE(result == nullptr);
3802 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3803
3804 // setPrefix64 fails if NAT64 prefix discovery has succeeded, and the discovered prefix
3805 // continues to be used.
3806 status = resolvService->setPrefix64(TEST_NETID, kNat64Prefix2);
3807 EXPECT_FALSE(status.isOk());
3808 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3809 EXPECT_EQ(EEXIST, status.getServiceSpecificError());
3810
3811 // Clearing the prefix also has no effect if discovery is started.
3812 status = resolvService->setPrefix64(TEST_NETID, "");
3813 EXPECT_FALSE(status.isOk());
3814 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3815 EXPECT_EQ(ENOENT, status.getServiceSpecificError());
3816
3817 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3818 ASSERT_FALSE(result == nullptr);
3819 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3820
3821 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
3822 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_NOT_FOUND));
Lorenzo Colitti5be8bf22020-05-26 10:55:21 +00003823
3824 EXPECT_EQ(0, sDnsMetricsListener->getUnexpectedNat64PrefixUpdates());
Lorenzo Colitti346737c2020-05-21 13:56:22 +00003825}
3826
Luke Huang9807e6b2019-05-20 16:17:12 +08003827namespace {
3828
Luke Huang0d592bc2019-05-25 18:24:03 +08003829class ScopedSetNetworkForProcess {
3830 public:
3831 explicit ScopedSetNetworkForProcess(unsigned netId) {
3832 mStoredNetId = getNetworkForProcess();
3833 if (netId == mStoredNetId) return;
3834 EXPECT_EQ(0, setNetworkForProcess(netId));
3835 }
3836 ~ScopedSetNetworkForProcess() { EXPECT_EQ(0, setNetworkForProcess(mStoredNetId)); }
3837
3838 private:
3839 unsigned mStoredNetId;
3840};
3841
3842class ScopedSetNetworkForResolv {
3843 public:
3844 explicit ScopedSetNetworkForResolv(unsigned netId) { EXPECT_EQ(0, setNetworkForResolv(netId)); }
3845 ~ScopedSetNetworkForResolv() { EXPECT_EQ(0, setNetworkForResolv(NETID_UNSET)); }
3846};
3847
Luke Huang9807e6b2019-05-20 16:17:12 +08003848void sendCommand(int fd, const std::string& cmd) {
3849 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size() + 1));
3850 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size() + 1));
3851}
3852
3853int32_t readBE32(int fd) {
3854 int32_t tmp;
3855 int n = TEMP_FAILURE_RETRY(read(fd, &tmp, sizeof(tmp)));
3856 EXPECT_TRUE(n > 0);
3857 return ntohl(tmp);
3858}
3859
Luke Huang0d592bc2019-05-25 18:24:03 +08003860int readResponseCode(int fd) {
Luke Huang9807e6b2019-05-20 16:17:12 +08003861 char buf[4];
3862 int n = TEMP_FAILURE_RETRY(read(fd, &buf, sizeof(buf)));
3863 EXPECT_TRUE(n > 0);
3864 // The format of response code is that 4 bytes for the code & null.
3865 buf[3] = '\0';
3866 int result;
3867 EXPECT_TRUE(ParseInt(buf, &result));
3868 return result;
3869}
3870
Luke Huang0d592bc2019-05-25 18:24:03 +08003871bool checkAndClearUseLocalNameserversFlag(unsigned* netid) {
3872 if (netid == nullptr || ((*netid) & NETID_USE_LOCAL_NAMESERVERS) == 0) {
3873 return false;
3874 }
3875 *netid = (*netid) & ~NETID_USE_LOCAL_NAMESERVERS;
3876 return true;
3877}
3878
Luke Huangf8215372019-11-22 11:53:41 +08003879aidl::android::net::UidRangeParcel makeUidRangeParcel(int start, int stop) {
3880 aidl::android::net::UidRangeParcel res;
Luke Huang0d592bc2019-05-25 18:24:03 +08003881 res.start = start;
3882 res.stop = stop;
3883
3884 return res;
3885}
3886
3887void expectNetIdWithLocalNameserversFlag(unsigned netId) {
3888 unsigned dnsNetId = 0;
3889 EXPECT_EQ(0, getNetworkForDns(&dnsNetId));
3890 EXPECT_TRUE(checkAndClearUseLocalNameserversFlag(&dnsNetId));
3891 EXPECT_EQ(netId, static_cast<unsigned>(dnsNetId));
3892}
3893
3894void expectDnsNetIdEquals(unsigned netId) {
3895 unsigned dnsNetId = 0;
3896 EXPECT_EQ(0, getNetworkForDns(&dnsNetId));
3897 EXPECT_EQ(netId, static_cast<unsigned>(dnsNetId));
3898}
3899
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003900void expectDnsNetIdIsDefaultNetwork(INetd* netdService) {
Luke Huang0d592bc2019-05-25 18:24:03 +08003901 int currentNetid;
3902 EXPECT_TRUE(netdService->networkGetDefault(&currentNetid).isOk());
3903 expectDnsNetIdEquals(currentNetid);
3904}
3905
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003906void expectDnsNetIdWithVpn(INetd* netdService, unsigned vpnNetId, unsigned expectedNetId) {
Luke Huang0d592bc2019-05-25 18:24:03 +08003907 EXPECT_TRUE(netdService->networkCreateVpn(vpnNetId, false /* secure */).isOk());
3908 uid_t uid = getuid();
3909 // Add uid to VPN
3910 EXPECT_TRUE(netdService->networkAddUidRanges(vpnNetId, {makeUidRangeParcel(uid, uid)}).isOk());
3911 expectDnsNetIdEquals(expectedNetId);
3912 EXPECT_TRUE(netdService->networkDestroy(vpnNetId).isOk());
3913}
3914
Luke Huang9807e6b2019-05-20 16:17:12 +08003915} // namespace
3916
3917TEST_F(ResolverTest, getDnsNetId) {
3918 // We've called setNetworkForProcess in SetupOemNetwork, so reset to default first.
3919 setNetworkForProcess(NETID_UNSET);
Luke Huang0d592bc2019-05-25 18:24:03 +08003920
3921 expectDnsNetIdIsDefaultNetwork(mDnsClient.netdService());
3922 expectDnsNetIdWithVpn(mDnsClient.netdService(), TEST_VPN_NETID, TEST_VPN_NETID);
Luke Huang9807e6b2019-05-20 16:17:12 +08003923
3924 // Test with setNetworkForProcess
Luke Huang0d592bc2019-05-25 18:24:03 +08003925 {
3926 ScopedSetNetworkForProcess scopedSetNetworkForProcess(TEST_NETID);
3927 expectDnsNetIdEquals(TEST_NETID);
3928 }
3929
3930 // Test with setNetworkForProcess with NETID_USE_LOCAL_NAMESERVERS
3931 {
3932 ScopedSetNetworkForProcess scopedSetNetworkForProcess(TEST_NETID |
3933 NETID_USE_LOCAL_NAMESERVERS);
3934 expectNetIdWithLocalNameserversFlag(TEST_NETID);
3935 }
Luke Huang9807e6b2019-05-20 16:17:12 +08003936
3937 // Test with setNetworkForResolv
Luke Huang0d592bc2019-05-25 18:24:03 +08003938 {
3939 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID);
3940 expectDnsNetIdEquals(TEST_NETID);
3941 }
3942
3943 // Test with setNetworkForResolv with NETID_USE_LOCAL_NAMESERVERS
3944 {
3945 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID |
3946 NETID_USE_LOCAL_NAMESERVERS);
3947 expectNetIdWithLocalNameserversFlag(TEST_NETID);
3948 }
3949
3950 // Test with setNetworkForResolv under bypassable vpn
3951 {
3952 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID);
3953 expectDnsNetIdWithVpn(mDnsClient.netdService(), TEST_VPN_NETID, TEST_NETID);
3954 }
Luke Huang9807e6b2019-05-20 16:17:12 +08003955
3956 // Create socket connected to DnsProxyListener
3957 int fd = dns_open_proxy();
3958 EXPECT_TRUE(fd > 0);
3959 unique_fd ufd(fd);
3960
3961 // Test command with wrong netId
3962 sendCommand(fd, "getdnsnetid abc");
Luke Huang0d592bc2019-05-25 18:24:03 +08003963 EXPECT_EQ(ResponseCode::DnsProxyQueryResult, readResponseCode(fd));
Luke Huang9807e6b2019-05-20 16:17:12 +08003964 EXPECT_EQ(-EINVAL, readBE32(fd));
3965
3966 // Test unsupported command
3967 sendCommand(fd, "getdnsnetidNotSupported");
3968 // Keep in sync with FrameworkListener.cpp (500, "Command not recognized")
Luke Huang0d592bc2019-05-25 18:24:03 +08003969 EXPECT_EQ(500, readResponseCode(fd));
Luke Huang9807e6b2019-05-20 16:17:12 +08003970}
Sehee Park2c118782019-05-07 13:02:45 +09003971
3972TEST_F(ResolverTest, BlockDnsQueryWithUidRule) {
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003973 // This test relies on blocking traffic on loopback, which xt_qtaguid does not do.
3974 // See aosp/358413 and b/34444781 for why.
3975 SKIP_IF_BPF_NOT_SUPPORTED;
3976
Sehee Park2c118782019-05-07 13:02:45 +09003977 constexpr char listen_addr1[] = "127.0.0.4";
3978 constexpr char listen_addr2[] = "::1";
3979 constexpr char host_name[] = "howdy.example.com.";
3980 const std::vector<DnsRecord> records = {
3981 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3982 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
3983 };
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003984 INetd* netdService = mDnsClient.netdService();
Sehee Park2c118782019-05-07 13:02:45 +09003985
3986 test::DNSResponder dns1(listen_addr1);
3987 test::DNSResponder dns2(listen_addr2);
3988 StartDns(dns1, records);
3989 StartDns(dns2, records);
3990
3991 std::vector<std::string> servers = {listen_addr1, listen_addr2};
3992 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
3993 dns1.clearQueries();
3994 dns2.clearQueries();
3995
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003996 // Add drop rule for TEST_UID. Also enable the standby chain because it might not be enabled.
3997 // Unfortunately we cannot use FIREWALL_CHAIN_NONE, or custom iptables rules, for this purpose
3998 // because netd calls fchown() on the DNS query sockets, and "iptables -m owner" matches the
3999 // UID of the socket creator, not the UID set by fchown().
4000 //
4001 // TODO: migrate FIREWALL_CHAIN_NONE to eBPF as well.
4002 EXPECT_TRUE(netdService->firewallEnableChildChain(INetd::FIREWALL_CHAIN_STANDBY, true).isOk());
4003 EXPECT_TRUE(netdService
Sehee Park2c118782019-05-07 13:02:45 +09004004 ->firewallSetUidRule(INetd::FIREWALL_CHAIN_STANDBY, TEST_UID,
4005 INetd::FIREWALL_RULE_DENY)
4006 .isOk());
4007
4008 // Save uid
4009 int suid = getuid();
4010
4011 // Switch to TEST_UID
4012 EXPECT_TRUE(seteuid(TEST_UID) == 0);
4013
4014 // Dns Query
4015 int fd1 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_a, 0);
4016 int fd2 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_aaaa, 0);
4017 EXPECT_TRUE(fd1 != -1);
4018 EXPECT_TRUE(fd2 != -1);
4019
4020 uint8_t buf[MAXPACKET] = {};
4021 int rcode;
4022 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
4023 EXPECT_EQ(-ECONNREFUSED, res);
4024
4025 memset(buf, 0, MAXPACKET);
4026 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
4027 EXPECT_EQ(-ECONNREFUSED, res);
4028
4029 // Restore uid
4030 EXPECT_TRUE(seteuid(suid) == 0);
4031
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004032 // Remove drop rule for TEST_UID, and disable the standby chain.
4033 EXPECT_TRUE(netdService
Sehee Park2c118782019-05-07 13:02:45 +09004034 ->firewallSetUidRule(INetd::FIREWALL_CHAIN_STANDBY, TEST_UID,
4035 INetd::FIREWALL_RULE_ALLOW)
4036 .isOk());
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004037 EXPECT_TRUE(netdService->firewallEnableChildChain(INetd::FIREWALL_CHAIN_STANDBY, false).isOk());
Sehee Park2c118782019-05-07 13:02:45 +09004038}
Mike Yua772c202019-09-23 17:47:21 +08004039
Mike Yu40e67072019-10-09 21:14:09 +08004040namespace {
4041
4042const std::string kDotConnectTimeoutMsFlag(
4043 "persist.device_config.netd_native.dot_connect_timeout_ms");
4044
4045class ScopedSystemProperties {
4046 public:
4047 explicit ScopedSystemProperties(const std::string& key, const std::string& value)
4048 : mStoredKey(key) {
4049 mStoredValue = android::base::GetProperty(key, "");
4050 android::base::SetProperty(key, value);
4051 }
4052 ~ScopedSystemProperties() { android::base::SetProperty(mStoredKey, mStoredValue); }
4053
4054 private:
4055 std::string mStoredKey;
4056 std::string mStoredValue;
4057};
4058
4059} // namespace
4060
Mike Yua772c202019-09-23 17:47:21 +08004061TEST_F(ResolverTest, ConnectTlsServerTimeout) {
Mike Yu40e67072019-10-09 21:14:09 +08004062 constexpr int expectedTimeout = 1000;
4063 constexpr char hostname1[] = "query1.example.com.";
4064 constexpr char hostname2[] = "query2.example.com.";
Mike Yua772c202019-09-23 17:47:21 +08004065 const std::vector<DnsRecord> records = {
Mike Yu40e67072019-10-09 21:14:09 +08004066 {hostname1, ns_type::ns_t_a, "1.2.3.4"},
4067 {hostname2, ns_type::ns_t_a, "1.2.3.5"},
Mike Yua772c202019-09-23 17:47:21 +08004068 };
4069
4070 test::DNSResponder dns;
4071 StartDns(dns, records);
Mike Yu40e67072019-10-09 21:14:09 +08004072 test::DnsTlsFrontend tls;
Mike Yua772c202019-09-23 17:47:21 +08004073 ASSERT_TRUE(tls.startServer());
4074
Mike Yu40e67072019-10-09 21:14:09 +08004075 // The resolver will adjust the timeout value to 1000ms since the value is too small.
4076 ScopedSystemProperties scopedSystemProperties(kDotConnectTimeoutMsFlag, "100");
Mike Yua772c202019-09-23 17:47:21 +08004077
Mike Yu40e67072019-10-09 21:14:09 +08004078 // Set up resolver to opportunistic mode with the default configuration.
Mike Yu8ac63402019-12-02 15:28:38 +08004079 const ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
Mike Yu40e67072019-10-09 21:14:09 +08004080 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
Mike Yua772c202019-09-23 17:47:21 +08004081 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09004082 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yua772c202019-09-23 17:47:21 +08004083 tls.clearQueries();
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09004084 dns.clearQueries();
Mike Yua772c202019-09-23 17:47:21 +08004085
4086 // The server becomes unresponsive to the handshake request.
4087 tls.setHangOnHandshakeForTesting(true);
4088
4089 // Expect the things happening in getaddrinfo():
4090 // 1. Connect to the private DNS server.
4091 // 2. SSL handshake times out.
4092 // 3. Fallback to UDP transport, and then get the answer.
Mike Yu40e67072019-10-09 21:14:09 +08004093 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4094 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(hostname1, nullptr, hints);
Mike Yua772c202019-09-23 17:47:21 +08004095
Mike Yu40e67072019-10-09 21:14:09 +08004096 EXPECT_NE(nullptr, result);
Mike Yua772c202019-09-23 17:47:21 +08004097 EXPECT_EQ(0, tls.queries());
Mike Yu40e67072019-10-09 21:14:09 +08004098 EXPECT_EQ(1U, GetNumQueries(dns, hostname1));
4099 EXPECT_EQ(records.at(0).addr, ToString(result));
Mike Yua772c202019-09-23 17:47:21 +08004100
Mike Yu40e67072019-10-09 21:14:09 +08004101 // A loose upper bound is set by adding 2000ms buffer time. Theoretically, getaddrinfo()
4102 // should just take a bit more than expetTimeout milliseconds.
4103 EXPECT_GE(timeTakenMs, expectedTimeout);
4104 EXPECT_LE(timeTakenMs, expectedTimeout + 2000);
4105
4106 // Set the server to be responsive. Verify that the resolver will attempt to reconnect
4107 // to the server and then get the result within the timeout.
4108 tls.setHangOnHandshakeForTesting(false);
4109 std::tie(result, timeTakenMs) = safe_getaddrinfo_time_taken(hostname2, nullptr, hints);
4110
4111 EXPECT_NE(nullptr, result);
Luke Huang3caa42b2020-04-23 14:18:04 +00004112 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yu40e67072019-10-09 21:14:09 +08004113 EXPECT_EQ(1U, GetNumQueries(dns, hostname2));
4114 EXPECT_EQ(records.at(1).addr, ToString(result));
4115
4116 EXPECT_LE(timeTakenMs, expectedTimeout);
Mike Yua772c202019-09-23 17:47:21 +08004117}
Hungming Chenbb90ab32019-10-28 18:20:31 +08004118
Ken Chen766feae2019-10-30 15:13:44 +08004119TEST_F(ResolverTest, FlushNetworkCache) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004120 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004121 test::DNSResponder dns;
4122 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4123 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4124
4125 const hostent* result = gethostbyname("hello");
4126 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4127
4128 // get result from cache
4129 result = gethostbyname("hello");
4130 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4131
4132 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4133
4134 result = gethostbyname("hello");
4135 EXPECT_EQ(2U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4136}
4137
4138TEST_F(ResolverTest, FlushNetworkCache_random) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004139 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004140 constexpr int num_flush = 10;
4141 constexpr int num_queries = 20;
4142 test::DNSResponder dns;
4143 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4144 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4145 const addrinfo hints = {.ai_family = AF_INET};
4146
4147 std::thread t([this]() {
4148 for (int i = 0; i < num_flush; ++i) {
4149 unsigned delay = arc4random_uniform(10 * 1000); // 10ms
4150 usleep(delay);
4151 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4152 }
4153 });
4154
4155 for (int i = 0; i < num_queries; ++i) {
4156 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4157 EXPECT_TRUE(result != nullptr);
4158 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4159 }
4160 t.join();
4161}
4162
4163// flush cache while one query is wait-for-response, another is pending.
4164TEST_F(ResolverTest, FlushNetworkCache_concurrent) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004165 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004166 const char* listen_addr1 = "127.0.0.9";
4167 const char* listen_addr2 = "127.0.0.10";
4168 test::DNSResponder dns1(listen_addr1);
4169 test::DNSResponder dns2(listen_addr2);
4170 StartDns(dns1, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4171 StartDns(dns2, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4172 addrinfo hints = {.ai_family = AF_INET};
4173
4174 // step 1: set server#1 into deferred responding mode
4175 dns1.setDeferredResp(true);
4176 std::thread t1([&listen_addr1, &hints, this]() {
4177 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr1}));
4178 // step 3: query
4179 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4180 // step 9: check result
4181 EXPECT_TRUE(result != nullptr);
4182 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4183 });
4184
4185 // step 2: wait for the query to reach the server
4186 while (GetNumQueries(dns1, kHelloExampleCom) == 0) {
4187 usleep(1000); // 1ms
4188 }
4189
4190 std::thread t2([&listen_addr2, &hints, &dns2, this]() {
4191 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr2}));
4192 // step 5: query (should be blocked in resolver)
4193 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4194 // step 7: check result
4195 EXPECT_TRUE(result != nullptr);
4196 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4197 EXPECT_EQ(1U, GetNumQueriesForType(dns2, ns_type::ns_t_a, kHelloExampleCom));
4198 });
4199
4200 // step 4: wait a bit for the 2nd query to enter pending state
4201 usleep(100 * 1000); // 100ms
4202 // step 6: flush cache (will unblock pending queries)
4203 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4204 t2.join();
4205
4206 // step 8: resume server#1
4207 dns1.setDeferredResp(false);
4208 t1.join();
4209
4210 // step 10: verify if result is correctly cached
4211 dns2.clearQueries();
4212 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4213 EXPECT_EQ(0U, GetNumQueries(dns2, kHelloExampleCom));
4214 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4215}
4216
waynema29253052019-08-20 11:26:08 +08004217// TODO: Perhaps to have a boundary conditions test for TCP and UDP.
4218TEST_F(ResolverTest, TcpQueryWithOversizePayload) {
4219 test::DNSResponder dns;
4220 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4221 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4222
4223 int fd = dns_open_proxy();
4224 ASSERT_TRUE(fd > 0);
4225
4226 // Sending DNS query over TCP once the packet sizes exceed 512 bytes.
4227 // The raw data is combined with Question section and Additional section
4228 // Question section : query "hello.example.com", type A, class IN
4229 // Additional section : type OPT (41), Option PADDING, Option Length 546
4230 // Padding option which allows DNS clients and servers to artificially
4231 // increase the size of a DNS message by a variable number of bytes.
4232 // See also RFC7830, section 3
4233 const std::string query =
4234 "+c0BAAABAAAAAAABBWhlbGxvB2V4YW1wbGUDY29tAAABAAEAACkgAAAAgAACJgAMAiIAAAAAAAAAAAAAAAAAA"
4235 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4236 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4237 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4238 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4239 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4240 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4241 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4242 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4243 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
4244 const std::string cmd =
4245 "resnsend " + std::to_string(TEST_NETID) + " 0 " /* ResNsendFlags */ + query + '\0';
4246 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
4247 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
4248 expectAnswersValid(fd, AF_INET, kHelloExampleComAddrV4);
4249 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom));
4250 EXPECT_EQ(0U, GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom));
4251}
4252
Ken Chen99344882020-01-01 14:59:38 +08004253TEST_F(ResolverTest, TruncatedRspMode) {
4254 constexpr char listen_addr[] = "127.0.0.4";
4255 constexpr char listen_addr2[] = "127.0.0.5";
4256 constexpr char listen_srv[] = "53";
4257
4258 test::DNSResponder dns(listen_addr, listen_srv, static_cast<ns_rcode>(-1));
4259 test::DNSResponder dns2(listen_addr2, listen_srv, static_cast<ns_rcode>(-1));
4260 // dns supports UDP only, dns2 support UDP and TCP
4261 dns.setResponseProbability(0.0, IPPROTO_TCP);
4262 StartDns(dns, kLargeCnameChainRecords);
4263 StartDns(dns2, kLargeCnameChainRecords);
4264
4265 const struct TestConfig {
4266 const std::optional<int32_t> tcMode;
4267 const bool ret;
4268 const unsigned numQueries;
4269 std::string asParameters() const {
4270 return StringPrintf("tcMode: %d, ret: %s, numQueries: %u", tcMode.value_or(-1),
4271 ret ? "true" : "false", numQueries);
4272 }
4273 } testConfigs[]{
4274 // clang-format off
4275 {std::nullopt, true, 0}, /* mode unset */
4276 {aidl::android::net::IDnsResolver::TC_MODE_DEFAULT, true, 0}, /* default mode */
4277 {aidl::android::net::IDnsResolver::TC_MODE_UDP_TCP, true, 1}, /* alternative mode */
4278 {-666, false, 1}, /* invalid input */
4279 // clang-format on
4280 };
4281
4282 for (const auto& config : testConfigs) {
4283 SCOPED_TRACE(config.asParameters());
4284
4285 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4286 parcel.servers = {listen_addr, listen_addr2};
4287 if (config.tcMode) {
Ken Chen05420812020-04-07 18:58:38 +00004288 parcel.resolverOptions.tcMode = config.tcMode.value();
Ken Chen99344882020-01-01 14:59:38 +08004289 }
4290 ASSERT_EQ(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk(), config.ret);
4291
4292 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4293 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4294 ASSERT_TRUE(result != nullptr);
4295 EXPECT_EQ(ToString(result), kHelloExampleComAddrV4);
4296 // TC_MODE_DEFAULT: resolver retries on TCP-only on each name server.
4297 // TC_MODE_UDP_TCP: resolver retries on TCP on the same server, falls back to UDP from next.
4298 ASSERT_EQ(GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom), 1U);
4299 ASSERT_EQ(GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom), 1U);
4300 ASSERT_EQ(GetNumQueriesForProtocol(dns2, IPPROTO_UDP, kHelloExampleCom), config.numQueries);
4301 ASSERT_EQ(GetNumQueriesForProtocol(dns2, IPPROTO_TCP, kHelloExampleCom), 1U);
4302
4303 dns.clearQueries();
4304 dns2.clearQueries();
4305 ASSERT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4306 }
4307}
4308
Mike Yuc0000252020-03-19 07:14:23 +00004309TEST_F(ResolverTest, RepeatedSetup_ResolverStatusRemains) {
4310 constexpr char unusable_listen_addr[] = "127.0.0.3";
4311 constexpr char listen_addr[] = "127.0.0.4";
4312 constexpr char hostname[] = "a.hello.query.";
4313 const auto repeatedSetResolversFromParcel = [&](const ResolverParamsParcel& parcel) {
4314 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4315 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4316 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4317 };
4318
4319 test::DNSResponder dns(listen_addr);
4320 StartDns(dns, {{hostname, ns_type::ns_t_a, "1.2.3.3"}});
4321 test::DnsTlsFrontend tls1(listen_addr, "853", listen_addr, "53");
4322 ASSERT_TRUE(tls1.startServer());
4323
4324 // Private DNS off mode.
4325 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4326 parcel.servers = {unusable_listen_addr, listen_addr};
4327 parcel.tlsServers.clear();
4328 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4329
4330 // Send a query.
4331 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4332 EXPECT_NE(safe_getaddrinfo(hostname, nullptr, &hints), nullptr);
4333
4334 // Check the stats as expected.
4335 const std::vector<NameserverStats> expectedCleartextDnsStats = {
4336 NameserverStats(unusable_listen_addr).setInternalErrors(1),
4337 NameserverStats(listen_addr).setSuccesses(1),
4338 };
4339 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
4340 EXPECT_EQ(GetNumQueries(dns, hostname), 1U);
4341
4342 // The stats is supposed to remain as long as the list of cleartext DNS servers is unchanged.
4343 static const struct TestConfig {
4344 std::vector<std::string> servers;
4345 std::vector<std::string> tlsServers;
4346 std::string tlsName;
4347 } testConfigs[] = {
4348 // Private DNS opportunistic mode.
4349 {{listen_addr, unusable_listen_addr}, {listen_addr, unusable_listen_addr}, ""},
4350 {{unusable_listen_addr, listen_addr}, {unusable_listen_addr, listen_addr}, ""},
4351
4352 // Private DNS strict mode.
4353 {{listen_addr, unusable_listen_addr}, {"127.0.0.100"}, kDefaultPrivateDnsHostName},
4354 {{unusable_listen_addr, listen_addr}, {"127.0.0.100"}, kDefaultPrivateDnsHostName},
4355
4356 // Private DNS off mode.
4357 {{unusable_listen_addr, listen_addr}, {}, ""},
4358 {{listen_addr, unusable_listen_addr}, {}, ""},
4359 };
4360
4361 for (const auto& config : testConfigs) {
4362 SCOPED_TRACE(fmt::format("testConfig: [{}] [{}] [{}]", fmt::join(config.servers, ","),
4363 fmt::join(config.tlsServers, ","), config.tlsName));
4364 parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4365 parcel.servers = config.servers;
4366 parcel.tlsServers = config.tlsServers;
4367 parcel.tlsName = config.tlsName;
4368 repeatedSetResolversFromParcel(parcel);
4369 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
4370
4371 // The stats remains when the list of search domains changes.
4372 parcel.domains.push_back("tmp.domains");
4373 repeatedSetResolversFromParcel(parcel);
4374 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
4375
4376 // The stats remains when the parameters change (except maxSamples).
4377 parcel.sampleValiditySeconds++;
4378 parcel.successThreshold++;
4379 parcel.minSamples++;
4380 parcel.baseTimeoutMsec++;
4381 parcel.retryCount++;
4382 repeatedSetResolversFromParcel(parcel);
4383 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
4384 }
4385
4386 // The cache remains.
4387 EXPECT_NE(safe_getaddrinfo(hostname, nullptr, &hints), nullptr);
4388 EXPECT_EQ(GetNumQueries(dns, hostname), 1U);
4389}
4390
4391TEST_F(ResolverTest, RepeatedSetup_NoRedundantPrivateDnsValidation) {
4392 const std::string addr1 = getUniqueIPv4Address(); // For a workable DNS server.
4393 const std::string addr2 = getUniqueIPv4Address(); // For an unresponsive DNS server.
4394 const std::string unusable_addr = getUniqueIPv4Address();
Mike Yu1ec523a2020-03-20 12:22:24 +00004395 const auto waitForPrivateDnsStateUpdated = []() {
4396 // A buffer time for the PrivateDnsConfiguration instance to update its map,
4397 // mPrivateDnsValidateThreads, which is used for tracking validation threads.
4398 // Since there is a time gap between when PrivateDnsConfiguration reports
4399 // onPrivateDnsValidationEvent and when PrivateDnsConfiguration updates the map, this is a
4400 // workaround to avoid the test starts a subsequent resolver setup during the time gap.
4401 // TODO: Report onPrivateDnsValidationEvent after all the relevant updates are complete.
4402 // Reference to b/152009023.
4403 std::this_thread::sleep_for(20ms);
4404 };
Mike Yuc0000252020-03-19 07:14:23 +00004405
4406 test::DNSResponder dns1(addr1);
4407 test::DNSResponder dns2(addr2);
4408 StartDns(dns1, {});
4409 StartDns(dns2, {});
4410 test::DnsTlsFrontend workableTls(addr1, "853", addr1, "53");
4411 test::DnsTlsFrontend unresponsiveTls(addr2, "853", addr2, "53");
4412 unresponsiveTls.setHangOnHandshakeForTesting(true);
4413 ASSERT_TRUE(workableTls.startServer());
4414 ASSERT_TRUE(unresponsiveTls.startServer());
4415
4416 // First setup.
4417 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4418 parcel.servers = {addr1, addr2, unusable_addr};
4419 parcel.tlsServers = {addr1, addr2, unusable_addr};
4420 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4421
4422 // Check the validation results.
4423 EXPECT_TRUE(WaitForPrivateDnsValidation(workableTls.listen_address(), true));
4424 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4425 EXPECT_EQ(unresponsiveTls.acceptConnectionsCount(), 1); // The validation is still in progress.
4426
4427 static const struct TestConfig {
4428 std::vector<std::string> tlsServers;
4429 std::string tlsName;
4430 } testConfigs[] = {
4431 {{addr1, addr2, unusable_addr}, ""},
4432 {{unusable_addr, addr1, addr2}, ""},
4433 {{unusable_addr, addr1, addr2}, kDefaultPrivateDnsHostName},
4434 {{addr1, addr2, unusable_addr}, kDefaultPrivateDnsHostName},
4435 };
4436
4437 std::string TlsNameLastTime;
4438 for (const auto& config : testConfigs) {
4439 SCOPED_TRACE(fmt::format("testConfig: [{}] [{}]", fmt::join(config.tlsServers, ","),
4440 config.tlsName));
4441 parcel.servers = config.tlsServers;
4442 parcel.tlsServers = config.tlsServers;
4443 parcel.tlsName = config.tlsName;
4444 parcel.caCertificate = config.tlsName.empty() ? "" : kCaCert;
4445
4446 const bool dnsModeChanged = (TlsNameLastTime != config.tlsName);
Mike Yu1ec523a2020-03-20 12:22:24 +00004447
4448 waitForPrivateDnsStateUpdated();
Mike Yuc0000252020-03-19 07:14:23 +00004449 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4450
4451 for (const auto& serverAddr : parcel.tlsServers) {
4452 SCOPED_TRACE(serverAddr);
4453 if (serverAddr == workableTls.listen_address()) {
4454 if (dnsModeChanged) {
4455 // In despite of the identical IP address, the server is regarded as a different
4456 // server when DnsTlsServer.name is different. The resolver treats it as a
4457 // different object and begins the validation process.
4458 EXPECT_TRUE(WaitForPrivateDnsValidation(serverAddr, true));
4459 }
4460 } else if (serverAddr == unresponsiveTls.listen_address()) {
4461 // No revalidation needed for the server which have been marked as in_progesss.
4462 } else {
4463 // Must be unusable_addr.
4464 // In opportunistic mode, when a validation for a private DNS server fails, the
4465 // resolver just marks the server as failed and doesn't re-evaluate it, but the
4466 // server can be re-evaluated when setResolverConfiguration() is called.
4467 // However, in strict mode, the resolver automatically re-evaluates the server and
4468 // marks the server as in_progress until the validation succeeds, so repeated setup
4469 // makes no effect.
4470 if (dnsModeChanged || config.tlsName.empty() /* not in strict mode */) {
4471 EXPECT_TRUE(WaitForPrivateDnsValidation(serverAddr, false));
4472 }
4473 }
4474 }
4475
4476 // Repeated setups make no effect in strict mode.
Mike Yu1ec523a2020-03-20 12:22:24 +00004477 waitForPrivateDnsStateUpdated();
Mike Yuc0000252020-03-19 07:14:23 +00004478 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4479 if (config.tlsName.empty()) {
4480 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4481 }
Mike Yu1ec523a2020-03-20 12:22:24 +00004482 waitForPrivateDnsStateUpdated();
Mike Yuc0000252020-03-19 07:14:23 +00004483 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4484 if (config.tlsName.empty()) {
4485 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4486 }
4487
4488 EXPECT_EQ(unresponsiveTls.acceptConnectionsCount(), 1);
4489
4490 TlsNameLastTime = config.tlsName;
4491 }
4492
4493 // Check that all the validation results are caught.
4494 // Note: it doesn't mean no validation being in progress.
4495 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr1));
4496 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr2));
4497 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(unusable_addr));
4498}
4499
4500TEST_F(ResolverTest, RepeatedSetup_KeepChangingPrivateDnsServers) {
4501 enum TlsServerState { WORKING, UNSUPPORTED, UNRESPONSIVE };
4502 const std::string addr1 = getUniqueIPv4Address();
4503 const std::string addr2 = getUniqueIPv4Address();
Mike Yubad95cf2020-03-26 03:19:38 +00004504 const auto waitForPrivateDnsStateUpdated = []() {
4505 // A buffer time for PrivateDnsConfiguration to update its state. It prevents this test
4506 // being flaky. See b/152009023 for the reason.
4507 std::this_thread::sleep_for(20ms);
4508 };
Mike Yuc0000252020-03-19 07:14:23 +00004509
4510 test::DNSResponder dns1(addr1);
4511 test::DNSResponder dns2(addr2);
4512 StartDns(dns1, {});
4513 StartDns(dns2, {});
4514 test::DnsTlsFrontend tls1(addr1, "853", addr1, "53");
4515 test::DnsTlsFrontend tls2(addr2, "853", addr2, "53");
4516 ASSERT_TRUE(tls1.startServer());
4517 ASSERT_TRUE(tls2.startServer());
4518
4519 static const struct TestConfig {
4520 std::string tlsServer;
4521 std::string tlsName;
4522 bool expectNothingHappenWhenServerUnsupported;
4523 bool expectNothingHappenWhenServerUnresponsive;
4524 std::string asTestName() const {
4525 return fmt::format("{}, {}, {}, {}", tlsServer, tlsName,
4526 expectNothingHappenWhenServerUnsupported,
4527 expectNothingHappenWhenServerUnresponsive);
4528 }
4529 } testConfigs[] = {
4530 {{addr1}, "", false, false},
4531 {{addr2}, "", false, false},
4532 {{addr1}, "", false, true},
4533 {{addr2}, "", false, true},
4534 {{addr1}, kDefaultPrivateDnsHostName, false, true},
4535 {{addr2}, kDefaultPrivateDnsHostName, false, true},
4536 {{addr1}, kDefaultPrivateDnsHostName, true, true},
4537 {{addr2}, kDefaultPrivateDnsHostName, true, true},
4538
4539 // There's no new validation to start because there are already two validation threads
4540 // running (one is for addr1, the other is for addr2). This is because the comparator
4541 // doesn't compare DnsTlsServer.name. Keep the design as-is until it's known to be
4542 // harmful.
4543 {{addr1}, "", true, true},
4544 {{addr2}, "", true, true},
4545 {{addr1}, "", true, true},
4546 {{addr2}, "", true, true},
4547 };
4548
4549 for (const auto& serverState : {WORKING, UNSUPPORTED, UNRESPONSIVE}) {
4550 int testIndex = 0;
4551 for (const auto& config : testConfigs) {
4552 SCOPED_TRACE(fmt::format("serverState:{} testIndex:{} testConfig:[{}]", serverState,
4553 testIndex++, config.asTestName()));
4554 auto& tls = (config.tlsServer == addr1) ? tls1 : tls2;
4555
4556 if (serverState == UNSUPPORTED && tls.running()) ASSERT_TRUE(tls.stopServer());
4557 if (serverState != UNSUPPORTED && !tls.running()) ASSERT_TRUE(tls.startServer());
4558
4559 tls.setHangOnHandshakeForTesting(serverState == UNRESPONSIVE);
4560 const int connectCountsBefore = tls.acceptConnectionsCount();
4561
Mike Yubad95cf2020-03-26 03:19:38 +00004562 waitForPrivateDnsStateUpdated();
Mike Yuc0000252020-03-19 07:14:23 +00004563 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4564 parcel.servers = {config.tlsServer};
4565 parcel.tlsServers = {config.tlsServer};
4566 parcel.tlsName = config.tlsName;
4567 parcel.caCertificate = config.tlsName.empty() ? "" : kCaCert;
4568 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4569
4570 if (serverState == WORKING) {
4571 EXPECT_TRUE(WaitForPrivateDnsValidation(config.tlsServer, true));
4572 } else if (serverState == UNSUPPORTED) {
4573 if (config.expectNothingHappenWhenServerUnsupported) {
4574 // It's possible that the resolver hasn't yet started to
4575 // connect. Wait a while.
4576 // TODO: See if we can get rid of the hard waiting time, such as comparing
4577 // the CountDiff across two tests.
4578 std::this_thread::sleep_for(100ms);
4579 EXPECT_EQ(tls.acceptConnectionsCount(), connectCountsBefore);
4580 } else {
4581 EXPECT_TRUE(WaitForPrivateDnsValidation(config.tlsServer, false));
4582 }
4583 } else {
4584 // Must be UNRESPONSIVE.
4585 // DnsTlsFrontend is the only signal for checking whether or not the resolver starts
4586 // another validation when the server is unresponsive.
4587 const int expectCountDiff =
4588 config.expectNothingHappenWhenServerUnresponsive ? 0 : 1;
4589 if (expectCountDiff == 0) {
4590 // It's possible that the resolver hasn't yet started to
4591 // connect. Wait a while.
4592 std::this_thread::sleep_for(100ms);
4593 }
4594 const auto condition = [&]() {
4595 return tls.acceptConnectionsCount() == connectCountsBefore + expectCountDiff;
4596 };
4597 EXPECT_TRUE(PollForCondition(condition));
4598 }
4599 }
4600
4601 // Set to off mode to reset the PrivateDnsConfiguration state.
4602 ResolverParamsParcel setupOffmode = DnsResponderClient::GetDefaultResolverParamsParcel();
4603 setupOffmode.tlsServers.clear();
4604 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(setupOffmode));
4605 }
4606
4607 // Check that all the validation results are caught.
4608 // Note: it doesn't mean no validation being in progress.
4609 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr1));
4610 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr2));
4611}
4612
Hungming Chenbb90ab32019-10-28 18:20:31 +08004613// Parameterized tests.
4614// TODO: Merge the existing tests as parameterized test if possible.
4615// TODO: Perhaps move parameterized tests to an independent file.
4616enum class CallType { GETADDRINFO, GETHOSTBYNAME };
4617class ResolverParameterizedTest : public ResolverTest,
Hungming Chen63779052019-10-30 15:06:13 +08004618 public testing::WithParamInterface<CallType> {
4619 protected:
Hungming Chen22617fd2019-12-06 12:15:45 +08004620 void VerifyQueryHelloExampleComV4(const test::DNSResponder& dns, const CallType calltype,
4621 const bool verifyNumQueries = true) {
Hungming Chen63779052019-10-30 15:06:13 +08004622 if (calltype == CallType::GETADDRINFO) {
4623 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4624 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4625 ASSERT_TRUE(result != nullptr);
4626 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4627 } else if (calltype == CallType::GETHOSTBYNAME) {
4628 const hostent* result = gethostbyname("hello");
4629 ASSERT_TRUE(result != nullptr);
4630 ASSERT_EQ(4, result->h_length);
4631 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
4632 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4633 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
4634 } else {
4635 FAIL() << "Unsupported call type: " << static_cast<uint32_t>(calltype);
4636 }
Hungming Chen22617fd2019-12-06 12:15:45 +08004637 if (verifyNumQueries) EXPECT_EQ(1U, GetNumQueries(dns, kHelloExampleCom));
Hungming Chen63779052019-10-30 15:06:13 +08004638 }
4639};
Hungming Chenbb90ab32019-10-28 18:20:31 +08004640
Hungming Chen63779052019-10-30 15:06:13 +08004641INSTANTIATE_TEST_SUITE_P(QueryCallTest, ResolverParameterizedTest,
Hungming Chenbb90ab32019-10-28 18:20:31 +08004642 testing::Values(CallType::GETADDRINFO, CallType::GETHOSTBYNAME),
4643 [](const testing::TestParamInfo<CallType>& info) {
Hungming Chenbb90ab32019-10-28 18:20:31 +08004644 switch (info.param) {
4645 case CallType::GETADDRINFO:
Hungming Chen63779052019-10-30 15:06:13 +08004646 return "GetAddrInfo";
Hungming Chenbb90ab32019-10-28 18:20:31 +08004647 case CallType::GETHOSTBYNAME:
Hungming Chen63779052019-10-30 15:06:13 +08004648 return "GetHostByName";
Hungming Chenbb90ab32019-10-28 18:20:31 +08004649 default:
Hungming Chen63779052019-10-30 15:06:13 +08004650 return "InvalidParameter"; // Should not happen.
Hungming Chenbb90ab32019-10-28 18:20:31 +08004651 }
Hungming Chenbb90ab32019-10-28 18:20:31 +08004652 });
4653
4654TEST_P(ResolverParameterizedTest, AuthoritySectionAndAdditionalSection) {
4655 // DNS response may have more information in authority section and additional section.
4656 // Currently, getanswer() of packages/modules/DnsResolver/getaddrinfo.cpp doesn't parse the
4657 // content of authority section and additional section. Test these sections if they crash
4658 // the resolver, just in case. See also RFC 1035 section 4.1.
4659 const auto& calltype = GetParam();
4660 test::DNSHeader header(kDefaultDnsHeader);
4661
4662 // Create a DNS response which has a authoritative nameserver record in authority
4663 // section and its relevant address record in additional section.
4664 //
4665 // Question
4666 // hello.example.com. IN A
4667 // Answer
4668 // hello.example.com. IN A 1.2.3.4
4669 // Authority:
4670 // hello.example.com. IN NS ns1.example.com.
4671 // Additional:
4672 // ns1.example.com. IN A 5.6.7.8
4673 //
4674 // A response may have only question, answer, and authority section. Current testing response
4675 // should be able to cover this condition.
4676
4677 // Question section.
4678 test::DNSQuestion question{
4679 .qname = {.name = kHelloExampleCom},
4680 .qtype = ns_type::ns_t_a,
4681 .qclass = ns_c_in,
4682 };
4683 header.questions.push_back(std::move(question));
4684
4685 // Answer section.
4686 test::DNSRecord recordAnswer{
4687 .name = {.name = kHelloExampleCom},
4688 .rtype = ns_type::ns_t_a,
4689 .rclass = ns_c_in,
4690 .ttl = 0, // no cache
4691 };
Hungming Chen63779052019-10-30 15:06:13 +08004692 EXPECT_TRUE(test::DNSResponder::fillRdata(kHelloExampleComAddrV4, recordAnswer));
Hungming Chenbb90ab32019-10-28 18:20:31 +08004693 header.answers.push_back(std::move(recordAnswer));
4694
4695 // Authority section.
4696 test::DNSRecord recordAuthority{
4697 .name = {.name = kHelloExampleCom},
4698 .rtype = ns_type::ns_t_ns,
4699 .rclass = ns_c_in,
4700 .ttl = 0, // no cache
4701 };
4702 EXPECT_TRUE(test::DNSResponder::fillRdata("ns1.example.com.", recordAuthority));
4703 header.authorities.push_back(std::move(recordAuthority));
4704
4705 // Additional section.
4706 test::DNSRecord recordAdditional{
4707 .name = {.name = "ns1.example.com."},
4708 .rtype = ns_type::ns_t_a,
4709 .rclass = ns_c_in,
4710 .ttl = 0, // no cache
4711 };
4712 EXPECT_TRUE(test::DNSResponder::fillRdata("5.6.7.8", recordAdditional));
4713 header.additionals.push_back(std::move(recordAdditional));
4714
4715 // Start DNS server.
4716 test::DNSResponder dns(test::DNSResponder::MappingType::DNS_HEADER);
4717 dns.addMappingDnsHeader(kHelloExampleCom, ns_type::ns_t_a, header);
4718 ASSERT_TRUE(dns.startServer());
4719 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4720 dns.clearQueries();
4721
4722 // Expect that get the address and the resolver doesn't crash.
Hungming Chen63779052019-10-30 15:06:13 +08004723 VerifyQueryHelloExampleComV4(dns, calltype);
4724}
4725
4726TEST_P(ResolverParameterizedTest, MessageCompression) {
4727 const auto& calltype = GetParam();
4728
4729 // The response with compressed domain name by a pointer. See RFC 1035 section 4.1.4.
4730 //
4731 // Ignoring the other fields of the message, the domain name of question section and answer
4732 // section are presented as:
4733 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4734 // 12 | 5 | h |
4735 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4736 // 14 | e | l |
4737 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4738 // 16 | l | o |
4739 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4740 // 18 | 7 | e |
4741 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4742 // 20 | x | a |
4743 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4744 // 22 | m | p |
4745 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4746 // 24 | l | e |
4747 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4748 // 26 | 3 | c |
4749 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4750 // 28 | o | m |
4751 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4752 // 30 | 0 | ... |
4753 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4754 //
4755 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4756 // 35 | 1 1| 12 |
4757 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4758 const std::vector<uint8_t> kResponseAPointer = {
4759 /* Header */
4760 0x00, 0x00, /* Transaction ID: 0x0000 */
4761 0x81, 0x80, /* Flags: qr rd ra */
4762 0x00, 0x01, /* Questions: 1 */
4763 0x00, 0x01, /* Answer RRs: 1 */
4764 0x00, 0x00, /* Authority RRs: 0 */
4765 0x00, 0x00, /* Additional RRs: 0 */
4766 /* Queries */
4767 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
4768 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name: hello.example.com */
4769 0x00, 0x01, /* Type: A */
4770 0x00, 0x01, /* Class: IN */
4771 /* Answers */
4772 0xc0, 0x0c, /* Name: hello.example.com (a pointer) */
4773 0x00, 0x01, /* Type: A */
4774 0x00, 0x01, /* Class: IN */
4775 0x00, 0x00, 0x00, 0x00, /* Time to live: 0 */
4776 0x00, 0x04, /* Data length: 4 */
4777 0x01, 0x02, 0x03, 0x04 /* Address: 1.2.3.4 */
4778 };
4779
4780 // The response with compressed domain name by a sequence of labels ending with a pointer. See
4781 // RFC 1035 section 4.1.4.
4782 //
4783 // Ignoring the other fields of the message, the domain name of question section and answer
4784 // section are presented as:
4785 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4786 // 12 | 5 | h |
4787 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4788 // 14 | e | l |
4789 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4790 // 16 | l | o |
4791 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4792 // 18 | 7 | e |
4793 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4794 // 20 | x | a |
4795 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4796 // 22 | m | p |
4797 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4798 // 24 | l | e |
4799 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4800 // 26 | 3 | c |
4801 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4802 // 28 | o | m |
4803 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4804 // 30 | 0 | ... |
4805 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4806 //
4807 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4808 // 35 | 5 | h |
4809 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4810 // 37 | e | l |
4811 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4812 // 39 | l | o |
4813 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4814 // 41 | 1 1| 18 |
4815 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4816 const std::vector<uint8_t> kResponseLabelEndingWithAPointer = {
4817 /* Header */
4818 0x00, 0x00, /* Transaction ID: 0x0000 */
4819 0x81, 0x80, /* Flags: qr rd ra */
4820 0x00, 0x01, /* Questions: 1 */
4821 0x00, 0x01, /* Answer RRs: 1 */
4822 0x00, 0x00, /* Authority RRs: 0 */
4823 0x00, 0x00, /* Additional RRs: 0 */
4824 /* Queries */
4825 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
4826 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name: hello.example.com */
4827 0x00, 0x01, /* Type: A */
4828 0x00, 0x01, /* Class: IN */
4829 /* Answers */
4830 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0xc0,
4831 0x12, /* Name: hello.example.com (a label ending with a pointer) */
4832 0x00, 0x01, /* Type: A */
4833 0x00, 0x01, /* Class: IN */
4834 0x00, 0x00, 0x00, 0x00, /* Time to live: 0 */
4835 0x00, 0x04, /* Data length: 4 */
4836 0x01, 0x02, 0x03, 0x04 /* Address: 1.2.3.4 */
4837 };
4838
4839 for (const auto& response : {kResponseAPointer, kResponseLabelEndingWithAPointer}) {
4840 SCOPED_TRACE(StringPrintf("Hex dump: %s", toHex(makeSlice(response)).c_str()));
4841
4842 test::DNSResponder dns(test::DNSResponder::MappingType::BINARY_PACKET);
4843 dns.addMappingBinaryPacket(kHelloExampleComQueryV4, response);
4844 StartDns(dns, {});
4845 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4846
4847 // Expect no cache because the TTL of testing responses are 0.
4848 VerifyQueryHelloExampleComV4(dns, calltype);
Hungming Chenbb90ab32019-10-28 18:20:31 +08004849 }
Mike Yu40e67072019-10-09 21:14:09 +08004850}
Hungming Chen22617fd2019-12-06 12:15:45 +08004851
4852TEST_P(ResolverParameterizedTest, TruncatedResponse) {
4853 const auto& calltype = GetParam();
4854
Hungming Chen22617fd2019-12-06 12:15:45 +08004855 test::DNSResponder dns;
Ken Chen99344882020-01-01 14:59:38 +08004856 StartDns(dns, kLargeCnameChainRecords);
Hungming Chen22617fd2019-12-06 12:15:45 +08004857 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4858
4859 // Expect UDP response is truncated. The resolver retries over TCP. See RFC 1035 section 4.2.1.
4860 VerifyQueryHelloExampleComV4(dns, calltype, false);
4861 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom));
4862 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom));
4863}
Luke Huang3caa42b2020-04-23 14:18:04 +00004864
4865TEST_F(ResolverTest, KeepListeningUDP) {
4866 constexpr char listen_addr1[] = "127.0.0.4";
4867 constexpr char listen_addr2[] = "127.0.0.5";
4868 constexpr char host_name[] = "howdy.example.com.";
4869 const std::vector<DnsRecord> records = {
4870 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
4871 };
4872 const std::vector<int> params = {300, 25, 8, 8, 1000 /* BASE_TIMEOUT_MSEC */,
4873 1 /* retry count */};
4874 const int delayTimeMs = 1500;
4875
4876 test::DNSResponder neverRespondDns(listen_addr2, "53", static_cast<ns_rcode>(-1));
4877 neverRespondDns.setResponseProbability(0.0);
4878 StartDns(neverRespondDns, records);
Luke Huang68fa5002020-04-23 15:48:47 +00004879 ScopedSystemProperties scopedSystemProperties(
4880 "persist.device_config.netd_native.keep_listening_udp", "1");
4881 // Re-setup test network to make experiment flag take effect.
4882 resetNetwork();
Luke Huang3caa42b2020-04-23 14:18:04 +00004883
4884 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr1, listen_addr2},
4885 kDefaultSearchDomains, params));
4886 // There are 2 DNS servers for this test.
4887 // |delayedDns| will be blocked for |delayTimeMs|, then start to respond to requests.
4888 // |neverRespondDns| will never respond.
4889 // In the first try, resolver will send query to |delayedDns| but get timeout error
4890 // because |delayTimeMs| > DNS timeout.
4891 // Then it's the second try, resolver will send query to |neverRespondDns| and
4892 // listen on both servers. Resolver will receive the answer coming from |delayedDns|.
Luke Huang3caa42b2020-04-23 14:18:04 +00004893
Luke Huang3caa42b2020-04-23 14:18:04 +00004894 test::DNSResponder delayedDns(listen_addr1);
4895 delayedDns.setResponseDelayMs(delayTimeMs);
4896 StartDns(delayedDns, records);
4897
4898 // Specify hints to ensure resolver doing query only 1 round.
4899 const addrinfo hints = {.ai_family = AF_INET6, .ai_socktype = SOCK_DGRAM};
4900 ScopedAddrinfo result = safe_getaddrinfo(host_name, nullptr, &hints);
4901 EXPECT_TRUE(result != nullptr);
4902
4903 std::string result_str = ToString(result);
4904 EXPECT_TRUE(result_str == "::1.2.3.4") << ", result_str='" << result_str << "'";
4905}
4906
4907TEST_F(ResolverTest, GetAddrInfoParallelLookupTimeout) {
4908 constexpr char listen_addr[] = "127.0.0.4";
4909 constexpr char host_name[] = "howdy.example.com.";
4910 constexpr int TIMING_TOLERANCE_MS = 200;
4911 constexpr int DNS_TIMEOUT_MS = 1000;
4912 const std::vector<DnsRecord> records = {
4913 {host_name, ns_type::ns_t_a, "1.2.3.4"},
4914 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
4915 };
4916 const std::vector<int> params = {300, 25, 8, 8, DNS_TIMEOUT_MS /* BASE_TIMEOUT_MSEC */,
4917 1 /* retry count */};
4918 test::DNSResponder neverRespondDns(listen_addr, "53", static_cast<ns_rcode>(-1));
4919 neverRespondDns.setResponseProbability(0.0);
4920 StartDns(neverRespondDns, records);
Luke Huang68fa5002020-04-23 15:48:47 +00004921 ScopedSystemProperties scopedSystemProperties(
4922 "persist.device_config.netd_native.parallel_lookup", "1");
Luke Huang5b30e712020-05-01 11:09:42 +00004923 // The default value of parallel_lookup_sleep_time should be very small
4924 // that we can ignore in this test case.
Luke Huang68fa5002020-04-23 15:48:47 +00004925 // Re-setup test network to make experiment flag take effect.
4926 resetNetwork();
Luke Huang3caa42b2020-04-23 14:18:04 +00004927
4928 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}, kDefaultSearchDomains, params));
4929 neverRespondDns.clearQueries();
4930
Luke Huang3caa42b2020-04-23 14:18:04 +00004931 // Use a never respond DNS server to verify if the A/AAAA queries are sent in parallel.
4932 // The resolver parameters are set to timeout 1s and retry 1 times.
4933 // So we expect the safe_getaddrinfo_time_taken() might take ~1s to
4934 // return when parallel lookup is enabled. And the DNS server should receive 2 queries.
4935 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_DGRAM};
4936 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(host_name, nullptr, hints);
4937
4938 EXPECT_TRUE(result == nullptr);
4939 EXPECT_NEAR(DNS_TIMEOUT_MS, timeTakenMs, TIMING_TOLERANCE_MS)
4940 << "took time should approximate equal timeout";
4941 EXPECT_EQ(2U, GetNumQueries(neverRespondDns, host_name));
4942}
Luke Huang5b30e712020-05-01 11:09:42 +00004943
4944TEST_F(ResolverTest, GetAddrInfoParallelLookupSleepTime) {
4945 constexpr char listen_addr[] = "127.0.0.4";
4946 constexpr int TIMING_TOLERANCE_MS = 200;
4947 const std::vector<DnsRecord> records = {
4948 {kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4},
4949 {kHelloExampleCom, ns_type::ns_t_aaaa, kHelloExampleComAddrV6},
4950 };
4951 const std::vector<int> params = {300, 25, 8, 8, 1000 /* BASE_TIMEOUT_MSEC */,
4952 1 /* retry count */};
4953 test::DNSResponder dns(listen_addr);
4954 StartDns(dns, records);
4955 ScopedSystemProperties scopedSystemProperties1(
4956 "persist.device_config.netd_native.parallel_lookup", "1");
4957 constexpr int PARALLEL_LOOKUP_SLEEP_TIME_MS = 500;
4958 ScopedSystemProperties scopedSystemProperties2(
4959 "persist.device_config.netd_native.parallel_lookup_sleep_time",
4960 std::to_string(PARALLEL_LOOKUP_SLEEP_TIME_MS));
4961 // Re-setup test network to make experiment flag take effect.
4962 resetNetwork();
4963
4964 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}, kDefaultSearchDomains, params));
4965 dns.clearQueries();
4966
4967 // Expect the safe_getaddrinfo_time_taken() might take ~500ms to return because we set
4968 // parallel_lookup_sleep_time to 500ms.
4969 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_DGRAM};
4970 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(kHelloExampleCom, nullptr, hints);
4971
4972 EXPECT_NE(nullptr, result);
4973 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(
4974 {kHelloExampleComAddrV4, kHelloExampleComAddrV6}));
4975 EXPECT_NEAR(PARALLEL_LOOKUP_SLEEP_TIME_MS, timeTakenMs, TIMING_TOLERANCE_MS)
4976 << "took time should approximate equal timeout";
4977 EXPECT_EQ(2U, GetNumQueries(dns, kHelloExampleCom));
4978
4979 // Expect the PARALLEL_LOOKUP_SLEEP_TIME_MS won't affect the query under cache hit case.
4980 dns.clearQueries();
4981 std::tie(result, timeTakenMs) = safe_getaddrinfo_time_taken(kHelloExampleCom, nullptr, hints);
4982 EXPECT_NE(nullptr, result);
4983 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(
4984 {kHelloExampleComAddrV4, kHelloExampleComAddrV6}));
4985 EXPECT_GT(PARALLEL_LOOKUP_SLEEP_TIME_MS, timeTakenMs);
4986 EXPECT_EQ(0U, GetNumQueries(dns, kHelloExampleCom));
4987}