blob: 270f0408755281c3b8c8d80f5a6c4c7cad7a5a02 [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:
Hungming Chen5bf09772019-04-25 11:16:13 +0800188 void SetUp() { mDnsClient.SetUp(); }
Mike Yu960243d2020-01-17 19:02:15 +0800189 void TearDown() {
190 // Ensure the dump works at the end of each test.
191 DumpResolverService();
192
193 mDnsClient.TearDown();
194 }
nuccachena26cc2a2018-07-17 18:07:23 +0800195
Xiao Ma09b71022018-12-11 17:56:32 +0900196 void StartDns(test::DNSResponder& dns, const std::vector<DnsRecord>& records) {
197 for (const auto& r : records) {
198 dns.addMapping(r.host_name, r.type, r.addr);
199 }
200
201 ASSERT_TRUE(dns.startServer());
202 dns.clearQueries();
203 }
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900204
Mike Yu960243d2020-01-17 19:02:15 +0800205 void DumpResolverService() {
206 unique_fd fd(open("/dev/null", O_WRONLY));
207 EXPECT_EQ(mDnsClient.resolvService()->dump(fd, nullptr, 0), 0);
208
209 const char* querylogCmd[] = {"querylog"}; // Keep it sync with DnsQueryLog::DUMP_KEYWORD.
210 EXPECT_EQ(mDnsClient.resolvService()->dump(fd, querylogCmd, std::size(querylogCmd)), 0);
211 }
212
Hungming Chene8f970c2019-04-10 17:34:06 +0800213 bool WaitForNat64Prefix(ExpectNat64PrefixStatus status,
214 std::chrono::milliseconds timeout = std::chrono::milliseconds(1000)) {
Hungming Chen5bf09772019-04-25 11:16:13 +0800215 return sDnsMetricsListener->waitForNat64Prefix(status, timeout);
Hungming Chene8f970c2019-04-10 17:34:06 +0800216 }
217
Mike Yu724f77d2019-08-16 11:14:50 +0800218 bool WaitForPrivateDnsValidation(std::string serverAddr, bool validated) {
219 return sDnsMetricsListener->waitForPrivateDnsValidation(serverAddr, validated);
220 }
221
Mike Yuc0000252020-03-19 07:14:23 +0000222 bool hasUncaughtPrivateDnsValidation(const std::string& serverAddr) {
223 return sDnsMetricsListener->findValidationRecord(serverAddr);
224 }
225
226 bool expectStatsFromGetResolverInfo(const std::vector<NameserverStats>& nameserversStats) {
227 std::vector<std::string> res_servers;
228 std::vector<std::string> res_domains;
229 std::vector<std::string> res_tls_servers;
230 res_params res_params;
231 std::vector<ResolverStats> res_stats;
232 int wait_for_pending_req_timeout_count;
233
234 if (!DnsResponderClient::GetResolverInfo(mDnsClient.resolvService(), TEST_NETID,
235 &res_servers, &res_domains, &res_tls_servers,
236 &res_params, &res_stats,
237 &wait_for_pending_req_timeout_count)) {
238 ADD_FAILURE() << "GetResolverInfo failed";
239 return false;
240 }
241
242 if (res_servers.size() != res_stats.size()) {
243 ADD_FAILURE() << fmt::format("res_servers.size() != res_stats.size(): {} != {}",
244 res_servers.size(), res_stats.size());
245 return false;
246 }
247 if (res_servers.size() != nameserversStats.size()) {
248 ADD_FAILURE() << fmt::format("res_servers.size() != nameserversStats.size(): {} != {}",
249 res_servers.size(), nameserversStats.size());
250 return false;
251 }
252
253 for (const auto& stats : nameserversStats) {
254 SCOPED_TRACE(stats.server);
255 const auto it = std::find(res_servers.begin(), res_servers.end(), stats.server);
256 if (it == res_servers.end()) {
257 ADD_FAILURE() << fmt::format("nameserver {} not found in the list {{{}}}",
258 stats.server, fmt::join(res_servers, ", "));
259 return false;
260 }
261 const int index = std::distance(res_servers.begin(), it);
262
263 // The check excludes rtt_avg, last_sample_time, and usable since they will be obsolete
264 // after |res_stats| is retrieved from NetConfig.dnsStats rather than NetConfig.nsstats.
265 EXPECT_EQ(res_stats[index].successes, stats.successes);
266 EXPECT_EQ(res_stats[index].errors, stats.errors);
267 EXPECT_EQ(res_stats[index].timeouts, stats.timeouts);
268 EXPECT_EQ(res_stats[index].internal_errors, stats.internal_errors);
269 }
270
271 return true;
272 }
273
274 // Since there's no way to terminate private DNS validation threads at any time. Tests that
275 // focus on the results of private DNS validation can interfere with each other if they use the
276 // same IP address for test servers. getUniqueIPv4Address() is a workaround to reduce the
277 // possibility of tests being flaky. A feasible solution is to forbid the validation threads,
278 // which are considered as outdated (e.g. switch the resolver to private DNS OFF mode), updating
279 // the result to the PrivateDnsConfiguration instance.
280 static std::string getUniqueIPv4Address() {
281 static int counter = 0;
282 return fmt::format("127.0.100.{}", (++counter & 0xff));
283 }
284
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900285 DnsResponderClient mDnsClient;
Xiao Ma09b71022018-12-11 17:56:32 +0900286
Hungming Chen5bf09772019-04-25 11:16:13 +0800287 // Use a shared static DNS listener for all tests to avoid registering lots of listeners
288 // which may be released late until process terminated. Currently, registered DNS listener
289 // is removed by binder death notification which is fired when the process hosting an
290 // IBinder has gone away. If every test in ResolverTest registers its DNS listener, Netd
291 // may temporarily hold lots of dead listeners until the unit test process terminates.
292 // TODO: Perhaps add an unregistering listener binder call or fork a listener process which
293 // could be terminated earlier.
Luke Huangf8215372019-11-22 11:53:41 +0800294 static std::shared_ptr<DnsMetricsListener>
Automerger Merge Worker19a291b2020-03-17 02:41:30 +0000295 sDnsMetricsListener; // Initialized in SetUpTestSuite.
Hungming Chen5bf09772019-04-25 11:16:13 +0800296
297 // Use a shared static death recipient to monitor the service death. The static death
298 // recipient could monitor the death not only during the test but also between tests.
Automerger Merge Worker19a291b2020-03-17 02:41:30 +0000299 static AIBinder_DeathRecipient* sResolvDeathRecipient; // Initialized in SetUpTestSuite.
Ken Chenb9fa2062018-11-13 21:51:13 +0800300};
301
Hungming Chen5bf09772019-04-25 11:16:13 +0800302// Initialize static member of class.
Luke Huangf8215372019-11-22 11:53:41 +0800303std::shared_ptr<DnsMetricsListener> ResolverTest::sDnsMetricsListener;
304AIBinder_DeathRecipient* ResolverTest::sResolvDeathRecipient;
Hungming Chen5bf09772019-04-25 11:16:13 +0800305
Ken Chenb9fa2062018-11-13 21:51:13 +0800306TEST_F(ResolverTest, GetHostByName) {
Xiao Ma09b71022018-12-11 17:56:32 +0900307 constexpr char nonexistent_host_name[] = "nonexistent.example.com.";
308
309 test::DNSResponder dns;
310 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.3"}});
311 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800312
313 const hostent* result;
Ken Chenb9fa2062018-11-13 21:51:13 +0800314 result = gethostbyname("nonexistent");
315 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, nonexistent_host_name));
316 ASSERT_TRUE(result == nullptr);
317 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
318
319 dns.clearQueries();
320 result = gethostbyname("hello");
Xiao Ma09b71022018-12-11 17:56:32 +0900321 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
Ken Chenb9fa2062018-11-13 21:51:13 +0800322 ASSERT_FALSE(result == nullptr);
323 ASSERT_EQ(4, result->h_length);
324 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
325 EXPECT_EQ("1.2.3.3", ToString(result));
326 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800327}
328
lifr4e4a2e02019-01-29 16:53:51 +0800329TEST_F(ResolverTest, GetHostByName_cnames) {
330 constexpr char host_name[] = "host.example.com.";
331 size_t cnamecount = 0;
332 test::DNSResponder dns;
333
334 const std::vector<DnsRecord> records = {
335 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
336 {"a.example.com.", ns_type::ns_t_cname, "b.example.com."},
337 {"b.example.com.", ns_type::ns_t_cname, "c.example.com."},
338 {"c.example.com.", ns_type::ns_t_cname, "d.example.com."},
339 {"d.example.com.", ns_type::ns_t_cname, "e.example.com."},
340 {"e.example.com.", ns_type::ns_t_cname, host_name},
341 {host_name, ns_type::ns_t_a, "1.2.3.3"},
342 {host_name, ns_type::ns_t_aaaa, "2001:db8::42"},
343 };
344 StartDns(dns, records);
345 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
346
347 // using gethostbyname2() to resolve ipv4 hello.example.com. to 1.2.3.3
348 // Ensure the v4 address and cnames are correct
349 const hostent* result;
350 result = gethostbyname2("hello", AF_INET);
351 ASSERT_FALSE(result == nullptr);
352
353 for (int i = 0; result != nullptr && result->h_aliases[i] != nullptr; i++) {
354 std::string domain_name = records[i].host_name.substr(0, records[i].host_name.size() - 1);
355 EXPECT_EQ(result->h_aliases[i], domain_name);
356 cnamecount++;
357 }
358 // The size of "Non-cname type" record in DNS records is 2
359 ASSERT_EQ(cnamecount, records.size() - 2);
360 ASSERT_EQ(4, result->h_length);
361 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
362 EXPECT_EQ("1.2.3.3", ToString(result));
363 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
364 EXPECT_EQ(1U, dns.queries().size()) << dns.dumpQueries();
365
366 // using gethostbyname2() to resolve ipv6 hello.example.com. to 2001:db8::42
367 // Ensure the v6 address and cnames are correct
368 cnamecount = 0;
369 dns.clearQueries();
370 result = gethostbyname2("hello", AF_INET6);
371 for (unsigned i = 0; result != nullptr && result->h_aliases[i] != nullptr; i++) {
372 std::string domain_name = records[i].host_name.substr(0, records[i].host_name.size() - 1);
373 EXPECT_EQ(result->h_aliases[i], domain_name);
374 cnamecount++;
375 }
376 // The size of "Non-cname type" DNS record in records is 2
377 ASSERT_EQ(cnamecount, records.size() - 2);
378 ASSERT_FALSE(result == nullptr);
379 ASSERT_EQ(16, result->h_length);
380 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
381 EXPECT_EQ("2001:db8::42", ToString(result));
382 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
383}
384
385TEST_F(ResolverTest, GetHostByName_cnamesInfiniteLoop) {
386 test::DNSResponder dns;
387 const std::vector<DnsRecord> records = {
388 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
389 {"a.example.com.", ns_type::ns_t_cname, kHelloExampleCom},
390 };
391 StartDns(dns, records);
392 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
393
394 const hostent* result;
395 result = gethostbyname2("hello", AF_INET);
396 ASSERT_TRUE(result == nullptr);
397
398 dns.clearQueries();
399 result = gethostbyname2("hello", AF_INET6);
400 ASSERT_TRUE(result == nullptr);
401}
402
Ken Chenb9fa2062018-11-13 21:51:13 +0800403TEST_F(ResolverTest, GetHostByName_localhost) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800404 constexpr char name_camelcase[] = "LocalHost";
Ken Chenb9fa2062018-11-13 21:51:13 +0800405 constexpr char name_ip6_dot[] = "ip6-localhost.";
406 constexpr char name_ip6_fqdn[] = "ip6-localhost.example.com.";
407
408 // Add a dummy nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900409 test::DNSResponder dns;
410 StartDns(dns, {});
411 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800412
413 // Expect no DNS queries; localhost is resolved via /etc/hosts
Xiao Ma09b71022018-12-11 17:56:32 +0900414 const hostent* result = gethostbyname(kLocalHost);
Ken Chenb9fa2062018-11-13 21:51:13 +0800415 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
416 ASSERT_FALSE(result == nullptr);
417 ASSERT_EQ(4, result->h_length);
418 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900419 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800420 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
421
422 // Ensure the hosts file resolver ignores case of hostnames
423 result = gethostbyname(name_camelcase);
424 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 // The hosts file also contains ip6-localhost, but gethostbyname() won't
chenbruce018fdb22019-06-12 18:08:04 +0800432 // return it. This would be easy to
Ken Chenb9fa2062018-11-13 21:51:13 +0800433 // change, but there's no point in changing the legacy behavior; new code
434 // should be calling getaddrinfo() anyway.
435 // So we check the legacy behavior, which results in amusing A-record
436 // lookups for ip6-localhost, with and without search domains appended.
437 dns.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900438 result = gethostbyname(kIp6LocalHost);
Sehee Parkbbca0202018-11-16 10:53:16 +0900439 EXPECT_EQ(2U, dns.queries().size()) << dns.dumpQueries();
440 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, name_ip6_dot)) << dns.dumpQueries();
441 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, name_ip6_fqdn)) << dns.dumpQueries();
Ken Chenb9fa2062018-11-13 21:51:13 +0800442 ASSERT_TRUE(result == nullptr);
443
444 // Finally, use gethostbyname2() to resolve ip6-localhost to ::1 from
445 // the hosts file.
446 dns.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900447 result = gethostbyname2(kIp6LocalHost, AF_INET6);
Ken Chenb9fa2062018-11-13 21:51:13 +0800448 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
449 ASSERT_FALSE(result == nullptr);
450 ASSERT_EQ(16, result->h_length);
451 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900452 EXPECT_EQ(kIp6LocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800453 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800454}
455
456TEST_F(ResolverTest, GetHostByName_numeric) {
457 // Add a dummy nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900458 test::DNSResponder dns;
459 StartDns(dns, {});
460 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800461
462 // Numeric v4 address: expect no DNS queries
463 constexpr char numeric_v4[] = "192.168.0.1";
Ken Chenb9fa2062018-11-13 21:51:13 +0800464 const hostent* result = gethostbyname(numeric_v4);
Sehee Parkbbca0202018-11-16 10:53:16 +0900465 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800466 ASSERT_FALSE(result == nullptr);
467 ASSERT_EQ(4, result->h_length); // v4
468 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
469 EXPECT_EQ(numeric_v4, ToString(result));
470 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
471
472 // gethostbyname() recognizes a v6 address, and fails with no DNS queries
473 constexpr char numeric_v6[] = "2001:db8::42";
474 dns.clearQueries();
475 result = gethostbyname(numeric_v6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900476 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800477 EXPECT_TRUE(result == nullptr);
478
479 // Numeric v6 address with gethostbyname2(): succeeds with no DNS queries
480 dns.clearQueries();
481 result = gethostbyname2(numeric_v6, AF_INET6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900482 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800483 ASSERT_FALSE(result == nullptr);
484 ASSERT_EQ(16, result->h_length); // v6
485 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
486 EXPECT_EQ(numeric_v6, ToString(result));
487 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
488
489 // Numeric v6 address with scope work with getaddrinfo(),
490 // but gethostbyname2() does not understand them; it issues two dns
491 // queries, then fails. This hardly ever happens, there's no point
492 // in fixing this. This test simply verifies the current (bogus)
493 // behavior to avoid further regressions (like crashes, or leaks).
494 constexpr char numeric_v6_scope[] = "fe80::1%lo";
495 dns.clearQueries();
496 result = gethostbyname2(numeric_v6_scope, AF_INET6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900497 EXPECT_EQ(2U, dns.queries().size()); // OUCH!
Ken Chenb9fa2062018-11-13 21:51:13 +0800498 ASSERT_TRUE(result == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800499}
500
501TEST_F(ResolverTest, BinderSerialization) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800502 std::vector<int> params_offsets = {
Luke Huang5bd827c2019-03-14 16:10:04 +0800503 IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY,
504 IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD,
505 IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES,
506 IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES,
507 IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC,
508 IDnsResolver::RESOLVER_PARAMS_RETRY_COUNT,
Ken Chenb9fa2062018-11-13 21:51:13 +0800509 };
Bernie Innocentib102dd22018-12-04 14:57:48 +0900510 const int size = static_cast<int>(params_offsets.size());
Luke Huang5bd827c2019-03-14 16:10:04 +0800511 EXPECT_EQ(size, IDnsResolver::RESOLVER_PARAMS_COUNT);
Ken Chenb9fa2062018-11-13 21:51:13 +0800512 std::sort(params_offsets.begin(), params_offsets.end());
Bernie Innocentib102dd22018-12-04 14:57:48 +0900513 for (int i = 0; i < size; ++i) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800514 EXPECT_EQ(params_offsets[i], i);
515 }
516}
517
518TEST_F(ResolverTest, GetHostByName_Binder) {
Luke Huangf8215372019-11-22 11:53:41 +0800519 std::vector<std::string> domains = {"example.com"};
Ken Chenb9fa2062018-11-13 21:51:13 +0800520 std::vector<std::unique_ptr<test::DNSResponder>> dns;
521 std::vector<std::string> servers;
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900522 std::vector<DnsResponderClient::Mapping> mappings;
523 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupMappings(1, domains, &mappings));
524 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupDNSServers(4, mappings, &dns, &servers));
Ken Chenb9fa2062018-11-13 21:51:13 +0800525 ASSERT_EQ(1U, mappings.size());
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900526 const DnsResponderClient::Mapping& mapping = mappings[0];
Ken Chenb9fa2062018-11-13 21:51:13 +0800527
Xiao Ma09b71022018-12-11 17:56:32 +0900528 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains, kDefaultParams));
Ken Chenb9fa2062018-11-13 21:51:13 +0800529
530 const hostent* result = gethostbyname(mapping.host.c_str());
Bernie Innocentib102dd22018-12-04 14:57:48 +0900531 const size_t total_queries =
Luke Huangfde82482019-06-04 01:04:53 +0800532 std::accumulate(dns.begin(), dns.end(), 0, [&mapping](size_t total, auto& d) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800533 return total + GetNumQueriesForType(*d, ns_type::ns_t_a, mapping.entry.c_str());
534 });
535
536 EXPECT_LE(1U, total_queries);
537 ASSERT_FALSE(result == nullptr);
538 ASSERT_EQ(4, result->h_length);
539 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
540 EXPECT_EQ(mapping.ip4, ToString(result));
541 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
542
543 std::vector<std::string> res_servers;
544 std::vector<std::string> res_domains;
Mike Yu0a1c53d2018-11-26 13:26:21 +0900545 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +0900546 res_params res_params;
Ken Chenb9fa2062018-11-13 21:51:13 +0800547 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +0800548 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +0800549 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
550 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
551 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chenb9fa2062018-11-13 21:51:13 +0800552 EXPECT_EQ(servers.size(), res_servers.size());
553 EXPECT_EQ(domains.size(), res_domains.size());
Mike Yu0a1c53d2018-11-26 13:26:21 +0900554 EXPECT_EQ(0U, res_tls_servers.size());
Luke Huang5bd827c2019-03-14 16:10:04 +0800555 ASSERT_EQ(static_cast<size_t>(IDnsResolver::RESOLVER_PARAMS_COUNT), kDefaultParams.size());
556 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY],
557 res_params.sample_validity);
558 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900559 res_params.success_threshold);
Luke Huang5bd827c2019-03-14 16:10:04 +0800560 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
561 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
562 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
Ken Chenb9fa2062018-11-13 21:51:13 +0800563 res_params.base_timeout_msec);
564 EXPECT_EQ(servers.size(), res_stats.size());
565
Bernie Innocenti0c067e42019-04-01 15:33:16 +0900566 EXPECT_THAT(res_servers, testing::UnorderedElementsAreArray(servers));
567 EXPECT_THAT(res_domains, testing::UnorderedElementsAreArray(domains));
Ken Chenb9fa2062018-11-13 21:51:13 +0800568}
569
570TEST_F(ResolverTest, GetAddrInfo) {
Xiao Ma09b71022018-12-11 17:56:32 +0900571 constexpr char listen_addr[] = "127.0.0.4";
572 constexpr char listen_addr2[] = "127.0.0.5";
573 constexpr char host_name[] = "howdy.example.com.";
Ken Chenb9fa2062018-11-13 21:51:13 +0800574
Xiao Ma09b71022018-12-11 17:56:32 +0900575 const std::vector<DnsRecord> records = {
576 {host_name, ns_type::ns_t_a, "1.2.3.4"},
577 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
578 };
579 test::DNSResponder dns(listen_addr);
580 test::DNSResponder dns2(listen_addr2);
581 StartDns(dns, records);
582 StartDns(dns2, records);
Ken Chenb9fa2062018-11-13 21:51:13 +0800583
Xiao Ma09b71022018-12-11 17:56:32 +0900584 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}));
Ken Chenb9fa2062018-11-13 21:51:13 +0800585 dns.clearQueries();
586 dns2.clearQueries();
587
588 ScopedAddrinfo result = safe_getaddrinfo("howdy", nullptr, nullptr);
589 EXPECT_TRUE(result != nullptr);
590 size_t found = GetNumQueries(dns, host_name);
591 EXPECT_LE(1U, found);
592 // Could be A or AAAA
593 std::string result_str = ToString(result);
594 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +0800595 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +0800596
597 // Verify that the name is cached.
598 size_t old_found = found;
599 result = safe_getaddrinfo("howdy", nullptr, nullptr);
600 EXPECT_TRUE(result != nullptr);
601 found = GetNumQueries(dns, host_name);
602 EXPECT_LE(1U, found);
603 EXPECT_EQ(old_found, found);
604 result_str = ToString(result);
Luke Huangf8215372019-11-22 11:53:41 +0800605 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4") << result_str;
Ken Chenb9fa2062018-11-13 21:51:13 +0800606
607 // Change the DNS resolver, ensure that queries are still cached.
Xiao Ma09b71022018-12-11 17:56:32 +0900608 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr2}));
Ken Chenb9fa2062018-11-13 21:51:13 +0800609 dns.clearQueries();
610 dns2.clearQueries();
611
612 result = safe_getaddrinfo("howdy", nullptr, nullptr);
613 EXPECT_TRUE(result != nullptr);
614 found = GetNumQueries(dns, host_name);
615 size_t found2 = GetNumQueries(dns2, host_name);
616 EXPECT_EQ(0U, found);
617 EXPECT_LE(0U, found2);
618
619 // Could be A or AAAA
620 result_str = ToString(result);
621 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +0800622 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +0800623}
624
625TEST_F(ResolverTest, GetAddrInfoV4) {
Xiao Ma09b71022018-12-11 17:56:32 +0900626 test::DNSResponder dns;
627 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.5"}});
628 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800629
Xiao Ma09b71022018-12-11 17:56:32 +0900630 const addrinfo hints = {.ai_family = AF_INET};
631 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
Ken Chenb9fa2062018-11-13 21:51:13 +0800632 EXPECT_TRUE(result != nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900633 EXPECT_EQ(1U, GetNumQueries(dns, kHelloExampleCom));
Ken Chenb9fa2062018-11-13 21:51:13 +0800634 EXPECT_EQ("1.2.3.5", ToString(result));
635}
636
637TEST_F(ResolverTest, GetAddrInfo_localhost) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800638 // Add a dummy nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900639 test::DNSResponder dns;
640 StartDns(dns, {});
641 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800642
Xiao Ma09b71022018-12-11 17:56:32 +0900643 ScopedAddrinfo result = safe_getaddrinfo(kLocalHost, nullptr, nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800644 EXPECT_TRUE(result != nullptr);
645 // Expect no DNS queries; localhost is resolved via /etc/hosts
646 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900647 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800648
Xiao Ma09b71022018-12-11 17:56:32 +0900649 result = safe_getaddrinfo(kIp6LocalHost, nullptr, nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800650 EXPECT_TRUE(result != nullptr);
651 // Expect no DNS queries; ip6-localhost is resolved via /etc/hosts
652 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900653 EXPECT_EQ(kIp6LocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800654}
655
Luke Huangd8ac4752019-06-18 17:05:47 +0800656TEST_F(ResolverTest, GetAddrInfo_InvalidSocketType) {
657 test::DNSResponder dns;
658 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.5"}});
659 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
660
661 // TODO: Test other invalid socket types.
662 const addrinfo hints = {
663 .ai_family = AF_UNSPEC,
Luke Huangd8ac4752019-06-18 17:05:47 +0800664 .ai_socktype = SOCK_PACKET,
665 };
666 addrinfo* result = nullptr;
667 // This is a valid hint, but the query won't be sent because the socket type is
668 // not supported.
669 EXPECT_EQ(EAI_NODATA, getaddrinfo("hello", nullptr, &hints, &result));
670 ScopedAddrinfo result_cleanup(result);
671 EXPECT_EQ(nullptr, result);
672}
673
Ken Chen92bed612018-12-22 21:46:55 +0800674// Verify if the resolver correctly handle multiple queries simultaneously
675// step 1: set dns server#1 into deferred responding mode.
676// step 2: thread#1 query "hello.example.com." --> resolver send query to server#1.
677// step 3: thread#2 query "hello.example.com." --> resolver hold the request and wait for
678// response of previous pending query sent by thread#1.
679// step 4: thread#3 query "konbanha.example.com." --> resolver send query to server#3. Server
680// respond to resolver immediately.
681// step 5: check if server#1 get 1 query by thread#1, server#2 get 0 query, server#3 get 1 query.
682// step 6: resume dns server#1 to respond dns query in step#2.
683// step 7: thread#1 and #2 should get returned from DNS query after step#6. Also, check the
684// number of queries in server#2 is 0 to ensure thread#2 does not wake up unexpectedly
685// before signaled by thread#1.
686TEST_F(ResolverTest, GetAddrInfoV4_deferred_resp) {
687 const char* listen_addr1 = "127.0.0.9";
688 const char* listen_addr2 = "127.0.0.10";
689 const char* listen_addr3 = "127.0.0.11";
690 const char* listen_srv = "53";
691 const char* host_name_deferred = "hello.example.com.";
692 const char* host_name_normal = "konbanha.example.com.";
Mike Yufc125e42019-05-15 20:41:28 +0800693 test::DNSResponder dns1(listen_addr1, listen_srv, ns_rcode::ns_r_servfail);
694 test::DNSResponder dns2(listen_addr2, listen_srv, ns_rcode::ns_r_servfail);
695 test::DNSResponder dns3(listen_addr3, listen_srv, ns_rcode::ns_r_servfail);
Ken Chen92bed612018-12-22 21:46:55 +0800696 dns1.addMapping(host_name_deferred, ns_type::ns_t_a, "1.2.3.4");
697 dns2.addMapping(host_name_deferred, ns_type::ns_t_a, "1.2.3.4");
698 dns3.addMapping(host_name_normal, ns_type::ns_t_a, "1.2.3.5");
699 ASSERT_TRUE(dns1.startServer());
700 ASSERT_TRUE(dns2.startServer());
701 ASSERT_TRUE(dns3.startServer());
702 const std::vector<std::string> servers_for_t1 = {listen_addr1};
703 const std::vector<std::string> servers_for_t2 = {listen_addr2};
704 const std::vector<std::string> servers_for_t3 = {listen_addr3};
705 addrinfo hints = {.ai_family = AF_INET};
706 const std::vector<int> params = {300, 25, 8, 8, 5000};
707 bool t3_task_done = false;
708
709 dns1.setDeferredResp(true);
710 std::thread t1([&, this]() {
711 ASSERT_TRUE(
712 mDnsClient.SetResolversForNetwork(servers_for_t1, kDefaultSearchDomains, params));
713 ScopedAddrinfo result = safe_getaddrinfo(host_name_deferred, nullptr, &hints);
714 // t3's dns query should got returned first
715 EXPECT_TRUE(t3_task_done);
716 EXPECT_EQ(1U, GetNumQueries(dns1, host_name_deferred));
717 EXPECT_TRUE(result != nullptr);
718 EXPECT_EQ("1.2.3.4", ToString(result));
719 });
720
721 // ensuring t1 and t2 handler functions are processed in order
722 usleep(100 * 1000);
723 std::thread t2([&, this]() {
724 ASSERT_TRUE(
725 mDnsClient.SetResolversForNetwork(servers_for_t2, kDefaultSearchDomains, params));
726 ScopedAddrinfo result = safe_getaddrinfo(host_name_deferred, nullptr, &hints);
727 EXPECT_TRUE(t3_task_done);
728 EXPECT_EQ(0U, GetNumQueries(dns2, host_name_deferred));
729 EXPECT_TRUE(result != nullptr);
730 EXPECT_EQ("1.2.3.4", ToString(result));
731
732 std::vector<std::string> res_servers;
733 std::vector<std::string> res_domains;
734 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +0900735 res_params res_params;
Ken Chen92bed612018-12-22 21:46:55 +0800736 std::vector<ResolverStats> res_stats;
737 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +0800738 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
739 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains,
740 &res_tls_servers, &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chen92bed612018-12-22 21:46:55 +0800741 EXPECT_EQ(0, wait_for_pending_req_timeout_count);
742 });
743
744 // ensuring t2 and t3 handler functions are processed in order
745 usleep(100 * 1000);
746 std::thread t3([&, this]() {
747 ASSERT_TRUE(
748 mDnsClient.SetResolversForNetwork(servers_for_t3, kDefaultSearchDomains, params));
749 ScopedAddrinfo result = safe_getaddrinfo(host_name_normal, nullptr, &hints);
750 EXPECT_EQ(1U, GetNumQueries(dns1, host_name_deferred));
751 EXPECT_EQ(0U, GetNumQueries(dns2, host_name_deferred));
752 EXPECT_EQ(1U, GetNumQueries(dns3, host_name_normal));
753 EXPECT_TRUE(result != nullptr);
754 EXPECT_EQ("1.2.3.5", ToString(result));
755
756 t3_task_done = true;
757 dns1.setDeferredResp(false);
758 });
759 t3.join();
760 t1.join();
761 t2.join();
762}
763
lifr4e4a2e02019-01-29 16:53:51 +0800764TEST_F(ResolverTest, GetAddrInfo_cnames) {
765 constexpr char host_name[] = "host.example.com.";
766 test::DNSResponder dns;
767 const std::vector<DnsRecord> records = {
768 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
769 {"a.example.com.", ns_type::ns_t_cname, "b.example.com."},
770 {"b.example.com.", ns_type::ns_t_cname, "c.example.com."},
771 {"c.example.com.", ns_type::ns_t_cname, "d.example.com."},
772 {"d.example.com.", ns_type::ns_t_cname, "e.example.com."},
773 {"e.example.com.", ns_type::ns_t_cname, host_name},
774 {host_name, ns_type::ns_t_a, "1.2.3.3"},
775 {host_name, ns_type::ns_t_aaaa, "2001:db8::42"},
776 };
777 StartDns(dns, records);
778 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
779
780 addrinfo hints = {.ai_family = AF_INET};
781 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
782 EXPECT_TRUE(result != nullptr);
783 EXPECT_EQ("1.2.3.3", ToString(result));
784
785 dns.clearQueries();
786 hints = {.ai_family = AF_INET6};
787 result = safe_getaddrinfo("hello", nullptr, &hints);
788 EXPECT_TRUE(result != nullptr);
789 EXPECT_EQ("2001:db8::42", ToString(result));
790}
791
792TEST_F(ResolverTest, GetAddrInfo_cnamesNoIpAddress) {
793 test::DNSResponder dns;
794 const std::vector<DnsRecord> records = {
795 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
796 };
797 StartDns(dns, records);
798 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
799
800 addrinfo hints = {.ai_family = AF_INET};
801 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
802 EXPECT_TRUE(result == nullptr);
803
804 dns.clearQueries();
805 hints = {.ai_family = AF_INET6};
806 result = safe_getaddrinfo("hello", nullptr, &hints);
807 EXPECT_TRUE(result == nullptr);
808}
809
810TEST_F(ResolverTest, GetAddrInfo_cnamesIllegalRdata) {
811 test::DNSResponder dns;
812 const std::vector<DnsRecord> records = {
813 {kHelloExampleCom, ns_type::ns_t_cname, ".!#?"},
814 };
815 StartDns(dns, records);
816 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
817
818 addrinfo hints = {.ai_family = AF_INET};
819 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
820 EXPECT_TRUE(result == nullptr);
821
822 dns.clearQueries();
823 hints = {.ai_family = AF_INET6};
824 result = safe_getaddrinfo("hello", nullptr, &hints);
825 EXPECT_TRUE(result == nullptr);
826}
827
Ken Chenb9fa2062018-11-13 21:51:13 +0800828TEST_F(ResolverTest, MultidomainResolution) {
Xiao Ma09b71022018-12-11 17:56:32 +0900829 constexpr char host_name[] = "nihao.example2.com.";
Luke Huangf8215372019-11-22 11:53:41 +0800830 std::vector<std::string> searchDomains = {"example1.com", "example2.com", "example3.com"};
Ken Chenb9fa2062018-11-13 21:51:13 +0800831
Xiao Ma09b71022018-12-11 17:56:32 +0900832 test::DNSResponder dns("127.0.0.6");
833 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.3"}});
834 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({"127.0.0.6"}, searchDomains));
835
Ken Chenb9fa2062018-11-13 21:51:13 +0800836 const hostent* result = gethostbyname("nihao");
Xiao Ma09b71022018-12-11 17:56:32 +0900837
Ken Chenb9fa2062018-11-13 21:51:13 +0800838 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
839 ASSERT_FALSE(result == nullptr);
840 ASSERT_EQ(4, result->h_length);
841 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
842 EXPECT_EQ("1.2.3.3", ToString(result));
843 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800844}
845
846TEST_F(ResolverTest, GetAddrInfoV6_numeric) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800847 constexpr char host_name[] = "ohayou.example.com.";
848 constexpr char numeric_addr[] = "fe80::1%lo";
849
Xiao Ma09b71022018-12-11 17:56:32 +0900850 test::DNSResponder dns;
Ken Chenb9fa2062018-11-13 21:51:13 +0800851 dns.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900852 StartDns(dns, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
853 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800854
855 addrinfo hints = {.ai_family = AF_INET6};
856 ScopedAddrinfo result = safe_getaddrinfo(numeric_addr, nullptr, &hints);
857 EXPECT_TRUE(result != nullptr);
858 EXPECT_EQ(numeric_addr, ToString(result));
859 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
860
861 // Now try a non-numeric hostname query with the AI_NUMERICHOST flag set.
862 // We should fail without sending out a DNS query.
863 hints.ai_flags |= AI_NUMERICHOST;
864 result = safe_getaddrinfo(host_name, nullptr, &hints);
865 EXPECT_TRUE(result == nullptr);
866 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
867}
868
869TEST_F(ResolverTest, GetAddrInfoV6_failing) {
Xiao Ma09b71022018-12-11 17:56:32 +0900870 constexpr char listen_addr0[] = "127.0.0.7";
871 constexpr char listen_addr1[] = "127.0.0.8";
Ken Chenb9fa2062018-11-13 21:51:13 +0800872 const char* host_name = "ohayou.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +0900873
874 test::DNSResponder dns0(listen_addr0);
875 test::DNSResponder dns1(listen_addr1);
Ken Chenb9fa2062018-11-13 21:51:13 +0800876 dns0.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900877 StartDns(dns0, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
878 StartDns(dns1, {{host_name, ns_type::ns_t_aaaa, "2001:db8::6"}});
879
Luke Huangf8215372019-11-22 11:53:41 +0800880 std::vector<std::string> servers = {listen_addr0, listen_addr1};
Ken Chenb9fa2062018-11-13 21:51:13 +0800881 // <sample validity in s> <success threshold in percent> <min samples> <max samples>
882 int sample_count = 8;
Luke Huangf8215372019-11-22 11:53:41 +0800883 const std::vector<int> params = {300, 25, sample_count, sample_count};
Xiao Ma09b71022018-12-11 17:56:32 +0900884 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, kDefaultSearchDomains, params));
Ken Chenb9fa2062018-11-13 21:51:13 +0800885
886 // Repeatedly perform resolutions for non-existing domains until MAXNSSAMPLES resolutions have
887 // reached the dns0, which is set to fail. No more requests should then arrive at that server
888 // for the next sample_lifetime seconds.
889 // TODO: This approach is implementation-dependent, change once metrics reporting is available.
Xiao Ma09b71022018-12-11 17:56:32 +0900890 const addrinfo hints = {.ai_family = AF_INET6};
Bernie Innocentib102dd22018-12-04 14:57:48 +0900891 for (int i = 0; i < sample_count; ++i) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800892 std::string domain = StringPrintf("nonexistent%d", i);
893 ScopedAddrinfo result = safe_getaddrinfo(domain.c_str(), nullptr, &hints);
894 }
895 // Due to 100% errors for all possible samples, the server should be ignored from now on and
896 // only the second one used for all following queries, until NSSAMPLE_VALIDITY is reached.
897 dns0.clearQueries();
898 dns1.clearQueries();
899 ScopedAddrinfo result = safe_getaddrinfo("ohayou", nullptr, &hints);
900 EXPECT_TRUE(result != nullptr);
901 EXPECT_EQ(0U, GetNumQueries(dns0, host_name));
902 EXPECT_EQ(1U, GetNumQueries(dns1, host_name));
903}
904
905TEST_F(ResolverTest, GetAddrInfoV6_nonresponsive) {
Xiao Ma09b71022018-12-11 17:56:32 +0900906 constexpr char listen_addr0[] = "127.0.0.7";
907 constexpr char listen_addr1[] = "127.0.0.8";
908 constexpr char listen_srv[] = "53";
909 constexpr char host_name1[] = "ohayou.example.com.";
910 constexpr char host_name2[] = "ciao.example.com.";
Luke Huang483cf332019-06-03 17:24:51 +0800911 const std::vector<std::string> defaultSearchDomain = {"example.com"};
912 // The minimal timeout is 1000ms, so we can't decrease timeout
913 // So reduce retry count.
914 const std::vector<int> reduceRetryParams = {
915 300, // sample validity in seconds
916 25, // success threshod in percent
917 8, 8, // {MIN,MAX}_SAMPLES
918 1000, // BASE_TIMEOUT_MSEC
919 1, // retry count
920 };
Xiao Ma09b71022018-12-11 17:56:32 +0900921 const std::vector<DnsRecord> records0 = {
922 {host_name1, ns_type::ns_t_aaaa, "2001:db8::5"},
923 {host_name2, ns_type::ns_t_aaaa, "2001:db8::5"},
924 };
925 const std::vector<DnsRecord> records1 = {
926 {host_name1, ns_type::ns_t_aaaa, "2001:db8::6"},
927 {host_name2, ns_type::ns_t_aaaa, "2001:db8::6"},
928 };
Ken Chenb9fa2062018-11-13 21:51:13 +0800929
930 // dns0 does not respond with 100% probability, while
931 // dns1 responds normally, at least initially.
Mike Yufc125e42019-05-15 20:41:28 +0800932 test::DNSResponder dns0(listen_addr0, listen_srv, static_cast<ns_rcode>(-1));
933 test::DNSResponder dns1(listen_addr1, listen_srv, static_cast<ns_rcode>(-1));
Ken Chenb9fa2062018-11-13 21:51:13 +0800934 dns0.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900935 StartDns(dns0, records0);
936 StartDns(dns1, records1);
Luke Huang483cf332019-06-03 17:24:51 +0800937 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr0, listen_addr1}, defaultSearchDomain,
938 reduceRetryParams));
Ken Chenb9fa2062018-11-13 21:51:13 +0800939
Luke Huang483cf332019-06-03 17:24:51 +0800940 // Specify ai_socktype to make getaddrinfo will only query 1 time
941 const addrinfo hints = {.ai_family = AF_INET6, .ai_socktype = SOCK_STREAM};
Ken Chenb9fa2062018-11-13 21:51:13 +0800942
943 // dns0 will ignore the request, and we'll fallback to dns1 after the first
944 // retry.
945 ScopedAddrinfo result = safe_getaddrinfo(host_name1, nullptr, &hints);
946 EXPECT_TRUE(result != nullptr);
947 EXPECT_EQ(1U, GetNumQueries(dns0, host_name1));
948 EXPECT_EQ(1U, GetNumQueries(dns1, host_name1));
949
950 // Now make dns1 also ignore 100% requests... The resolve should alternate
Luke Huang483cf332019-06-03 17:24:51 +0800951 // queries between the nameservers and fail
Ken Chenb9fa2062018-11-13 21:51:13 +0800952 dns1.setResponseProbability(0.0);
953 addrinfo* result2 = nullptr;
954 EXPECT_EQ(EAI_NODATA, getaddrinfo(host_name2, nullptr, &hints, &result2));
955 EXPECT_EQ(nullptr, result2);
Luke Huang483cf332019-06-03 17:24:51 +0800956 EXPECT_EQ(1U, GetNumQueries(dns0, host_name2));
957 EXPECT_EQ(1U, GetNumQueries(dns1, host_name2));
Ken Chenb9fa2062018-11-13 21:51:13 +0800958}
959
960TEST_F(ResolverTest, GetAddrInfoV6_concurrent) {
Xiao Ma09b71022018-12-11 17:56:32 +0900961 constexpr char listen_addr0[] = "127.0.0.9";
962 constexpr char listen_addr1[] = "127.0.0.10";
963 constexpr char listen_addr2[] = "127.0.0.11";
964 constexpr char host_name[] = "konbanha.example.com.";
965
966 test::DNSResponder dns0(listen_addr0);
967 test::DNSResponder dns1(listen_addr1);
968 test::DNSResponder dns2(listen_addr2);
969 StartDns(dns0, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
970 StartDns(dns1, {{host_name, ns_type::ns_t_aaaa, "2001:db8::6"}});
971 StartDns(dns2, {{host_name, ns_type::ns_t_aaaa, "2001:db8::7"}});
972
Luke Huangf8215372019-11-22 11:53:41 +0800973 const std::vector<std::string> servers = {listen_addr0, listen_addr1, listen_addr2};
Ken Chenb9fa2062018-11-13 21:51:13 +0800974 std::vector<std::thread> threads(10);
975 for (std::thread& thread : threads) {
Luke Huangf8215372019-11-22 11:53:41 +0800976 thread = std::thread([this, &servers]() {
977 unsigned delay = arc4random_uniform(1 * 1000 * 1000); // <= 1s
Ken Chenb9fa2062018-11-13 21:51:13 +0800978 usleep(delay);
979 std::vector<std::string> serverSubset;
980 for (const auto& server : servers) {
981 if (arc4random_uniform(2)) {
982 serverSubset.push_back(server);
983 }
984 }
985 if (serverSubset.empty()) serverSubset = servers;
Xiao Ma09b71022018-12-11 17:56:32 +0900986 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(serverSubset));
987 const addrinfo hints = {.ai_family = AF_INET6};
Ken Chenb9fa2062018-11-13 21:51:13 +0800988 addrinfo* result = nullptr;
989 int rv = getaddrinfo("konbanha", nullptr, &hints, &result);
990 EXPECT_EQ(0, rv) << "error [" << rv << "] " << gai_strerror(rv);
991 if (result) {
992 freeaddrinfo(result);
993 result = nullptr;
994 }
995 });
996 }
997 for (std::thread& thread : threads) {
998 thread.join();
999 }
Ken Chen92bed612018-12-22 21:46:55 +08001000
1001 std::vector<std::string> res_servers;
1002 std::vector<std::string> res_domains;
1003 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001004 res_params res_params;
Ken Chen92bed612018-12-22 21:46:55 +08001005 std::vector<ResolverStats> res_stats;
1006 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001007 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1008 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1009 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chen92bed612018-12-22 21:46:55 +08001010 EXPECT_EQ(0, wait_for_pending_req_timeout_count);
Ken Chenb9fa2062018-11-13 21:51:13 +08001011}
1012
Mike Yu8ac63402019-12-02 15:28:38 +08001013TEST_F(ResolverTest, SkipBadServersDueToInternalError) {
1014 constexpr char listen_addr1[] = "fe80::1";
1015 constexpr char listen_addr2[] = "255.255.255.255";
1016 constexpr char listen_addr3[] = "127.0.0.3";
1017
1018 test::DNSResponder dns(listen_addr3);
1019 ASSERT_TRUE(dns.startServer());
1020
1021 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
1022 parcel.servers = {listen_addr1, listen_addr2, listen_addr3};
1023
1024 // Bad servers can be distinguished after two attempts.
1025 parcel.minSamples = 2;
1026 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1027
1028 // Start querying five times.
1029 for (int i = 0; i < 5; i++) {
1030 std::string hostName = StringPrintf("hello%d.com.", i);
1031 dns.addMapping(hostName, ns_type::ns_t_a, "1.2.3.4");
1032 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1033 EXPECT_TRUE(safe_getaddrinfo(hostName.c_str(), nullptr, &hints) != nullptr);
1034 }
1035
Mike Yuc0000252020-03-19 07:14:23 +00001036 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1037 NameserverStats(listen_addr1).setInternalErrors(2),
1038 NameserverStats(listen_addr2).setInternalErrors(2),
1039 NameserverStats(listen_addr3).setSuccesses(5),
1040 };
1041 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
Mike Yu8ac63402019-12-02 15:28:38 +08001042}
1043
1044TEST_F(ResolverTest, SkipBadServersDueToTimeout) {
1045 constexpr char listen_addr1[] = "127.0.0.3";
1046 constexpr char listen_addr2[] = "127.0.0.4";
1047
1048 // Set dns1 non-responsive and dns2 workable.
1049 test::DNSResponder dns1(listen_addr1, test::kDefaultListenService, static_cast<ns_rcode>(-1));
1050 test::DNSResponder dns2(listen_addr2);
1051 dns1.setResponseProbability(0.0);
1052 ASSERT_TRUE(dns1.startServer());
1053 ASSERT_TRUE(dns2.startServer());
1054
1055 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
1056 parcel.servers = {listen_addr1, listen_addr2};
1057
1058 // Bad servers can be distinguished after two attempts.
1059 parcel.minSamples = 2;
1060 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1061
1062 // Start querying five times.
1063 for (int i = 0; i < 5; i++) {
1064 std::string hostName = StringPrintf("hello%d.com.", i);
1065 dns1.addMapping(hostName, ns_type::ns_t_a, "1.2.3.4");
1066 dns2.addMapping(hostName, ns_type::ns_t_a, "1.2.3.5");
1067 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1068 EXPECT_TRUE(safe_getaddrinfo(hostName.c_str(), nullptr, &hints) != nullptr);
1069 }
1070
Mike Yuc0000252020-03-19 07:14:23 +00001071 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1072 NameserverStats(listen_addr1).setTimeouts(2),
1073 NameserverStats(listen_addr2).setSuccesses(5),
1074 };
1075 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
Mike Yu8ac63402019-12-02 15:28:38 +08001076 EXPECT_EQ(dns1.queries().size(), 2U);
1077 EXPECT_EQ(dns2.queries().size(), 5U);
1078}
1079
chenbrucefd837fa2019-10-29 18:35:36 +08001080TEST_F(ResolverTest, GetAddrInfoFromCustTable_InvalidInput) {
1081 constexpr char hostnameNoip[] = "noip.example.com.";
1082 constexpr char hostnameInvalidip[] = "invalidip.example.com.";
1083 const std::vector<aidl::android::net::ResolverHostsParcel> invalidCustHosts = {
1084 {"", hostnameNoip},
1085 {"wrong IP", hostnameInvalidip},
1086 };
1087 test::DNSResponder dns;
1088 StartDns(dns, {});
1089 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
Ken Chen05420812020-04-07 18:58:38 +00001090 resolverParams.resolverOptions.hosts = invalidCustHosts;
chenbrucefd837fa2019-10-29 18:35:36 +08001091 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1092 for (const auto& hostname : {hostnameNoip, hostnameInvalidip}) {
1093 // The query won't get data from customized table because of invalid customized table
1094 // and DNSResponder also has no records. hostnameNoip has never registered and
1095 // hostnameInvalidip has registered but wrong IP.
1096 const addrinfo hints = {.ai_family = AF_UNSPEC};
1097 ScopedAddrinfo result = safe_getaddrinfo(hostname, nullptr, &hints);
1098 ASSERT_TRUE(result == nullptr);
1099 EXPECT_EQ(4U, GetNumQueries(dns, hostname));
1100 }
1101}
1102
1103TEST_F(ResolverTest, GetAddrInfoFromCustTable) {
1104 constexpr char hostnameV4[] = "v4only.example.com.";
1105 constexpr char hostnameV6[] = "v6only.example.com.";
1106 constexpr char hostnameV4V6[] = "v4v6.example.com.";
1107 constexpr char custAddrV4[] = "1.2.3.4";
1108 constexpr char custAddrV6[] = "::1.2.3.4";
1109 constexpr char dnsSvAddrV4[] = "1.2.3.5";
1110 constexpr char dnsSvAddrV6[] = "::1.2.3.5";
1111 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4 = {
1112 {custAddrV4, hostnameV4},
1113 };
1114 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV6 = {
1115 {custAddrV6, hostnameV6},
1116 };
1117 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4V6 = {
1118 {custAddrV4, hostnameV4V6},
1119 {custAddrV6, hostnameV4V6},
1120 };
1121 const std::vector<DnsRecord> dnsSvHostV4 = {
1122 {hostnameV4, ns_type::ns_t_a, dnsSvAddrV4},
1123 };
1124 const std::vector<DnsRecord> dnsSvHostV6 = {
1125 {hostnameV6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1126 };
1127 const std::vector<DnsRecord> dnsSvHostV4V6 = {
1128 {hostnameV4V6, ns_type::ns_t_a, dnsSvAddrV4},
1129 {hostnameV4V6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1130 };
1131 struct TestConfig {
1132 const std::string name;
1133 const std::vector<aidl::android::net::ResolverHostsParcel> customizedHosts;
1134 const std::vector<DnsRecord> dnsserverHosts;
1135 const std::vector<std::string> queryResult;
1136 std::string asParameters() const {
1137 return StringPrintf("name: %s, customizedHosts: %s, dnsserverHosts: %s", name.c_str(),
1138 customizedHosts.empty() ? "No" : "Yes",
1139 dnsserverHosts.empty() ? "No" : "Yes");
1140 }
1141 } testConfigs[]{
1142 // clang-format off
1143 {hostnameV4, {}, {}, {}},
1144 {hostnameV4, {}, dnsSvHostV4, {dnsSvAddrV4}},
1145 {hostnameV4, custHostV4, {}, {custAddrV4}},
1146 {hostnameV4, custHostV4, dnsSvHostV4, {custAddrV4}},
1147 {hostnameV6, {}, {}, {}},
1148 {hostnameV6, {}, dnsSvHostV6, {dnsSvAddrV6}},
1149 {hostnameV6, custHostV6, {}, {custAddrV6}},
1150 {hostnameV6, custHostV6, dnsSvHostV6, {custAddrV6}},
1151 {hostnameV4V6, {}, {}, {}},
1152 {hostnameV4V6, {}, dnsSvHostV4V6, {dnsSvAddrV4, dnsSvAddrV6}},
1153 {hostnameV4V6, custHostV4V6, {}, {custAddrV4, custAddrV6}},
1154 {hostnameV4V6, custHostV4V6, dnsSvHostV4V6, {custAddrV4, custAddrV6}},
1155 // clang-format on
1156 };
1157
1158 for (const auto& config : testConfigs) {
1159 SCOPED_TRACE(config.asParameters());
1160
1161 test::DNSResponder dns;
1162 StartDns(dns, config.dnsserverHosts);
1163
1164 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
Ken Chen05420812020-04-07 18:58:38 +00001165 resolverParams.resolverOptions.hosts = config.customizedHosts;
chenbrucefd837fa2019-10-29 18:35:36 +08001166 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1167 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM};
1168 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
1169 if (config.customizedHosts.empty() && config.dnsserverHosts.empty()) {
1170 ASSERT_TRUE(result == nullptr);
1171 EXPECT_EQ(2U, GetNumQueries(dns, config.name.c_str()));
1172 } else {
1173 ASSERT_TRUE(result != nullptr);
1174 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(config.queryResult));
1175 EXPECT_EQ(config.customizedHosts.empty() ? 2U : 0U,
1176 GetNumQueries(dns, config.name.c_str()));
1177 }
1178
1179 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
1180 }
1181}
1182
1183TEST_F(ResolverTest, GetAddrInfoFromCustTable_Modify) {
1184 constexpr char hostnameV4V6[] = "v4v6.example.com.";
1185 constexpr char custAddrV4[] = "1.2.3.4";
1186 constexpr char custAddrV6[] = "::1.2.3.4";
1187 constexpr char dnsSvAddrV4[] = "1.2.3.5";
1188 constexpr char dnsSvAddrV6[] = "::1.2.3.5";
1189 const std::vector<DnsRecord> dnsSvHostV4V6 = {
1190 {hostnameV4V6, ns_type::ns_t_a, dnsSvAddrV4},
1191 {hostnameV4V6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1192 };
1193 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4V6 = {
1194 {custAddrV4, hostnameV4V6},
1195 {custAddrV6, hostnameV4V6},
1196 };
1197 test::DNSResponder dns;
1198 StartDns(dns, dnsSvHostV4V6);
1199 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1200
Ken Chen05420812020-04-07 18:58:38 +00001201 resolverParams.resolverOptions.hosts = custHostV4V6;
chenbrucefd837fa2019-10-29 18:35:36 +08001202 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1203 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM};
1204 ScopedAddrinfo result = safe_getaddrinfo(hostnameV4V6, nullptr, &hints);
1205 ASSERT_TRUE(result != nullptr);
1206 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray({custAddrV4, custAddrV6}));
1207 EXPECT_EQ(0U, GetNumQueries(dns, hostnameV4V6));
1208
Ken Chen05420812020-04-07 18:58:38 +00001209 resolverParams.resolverOptions.hosts = {};
chenbrucefd837fa2019-10-29 18:35:36 +08001210 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1211 result = safe_getaddrinfo(hostnameV4V6, nullptr, &hints);
1212 ASSERT_TRUE(result != nullptr);
1213 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray({dnsSvAddrV4, dnsSvAddrV6}));
1214 EXPECT_EQ(2U, GetNumQueries(dns, hostnameV4V6));
1215}
1216
Ken Chenb9fa2062018-11-13 21:51:13 +08001217TEST_F(ResolverTest, EmptySetup) {
Ken Chenb9fa2062018-11-13 21:51:13 +08001218 std::vector<std::string> servers;
1219 std::vector<std::string> domains;
Xiao Ma09b71022018-12-11 17:56:32 +09001220 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001221 std::vector<std::string> res_servers;
1222 std::vector<std::string> res_domains;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001223 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001224 res_params res_params;
Ken Chenb9fa2062018-11-13 21:51:13 +08001225 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +08001226 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001227 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1228 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1229 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chenb9fa2062018-11-13 21:51:13 +08001230 EXPECT_EQ(0U, res_servers.size());
1231 EXPECT_EQ(0U, res_domains.size());
Mike Yu0a1c53d2018-11-26 13:26:21 +09001232 EXPECT_EQ(0U, res_tls_servers.size());
Luke Huang5bd827c2019-03-14 16:10:04 +08001233 ASSERT_EQ(static_cast<size_t>(IDnsResolver::RESOLVER_PARAMS_COUNT), kDefaultParams.size());
1234 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY],
1235 res_params.sample_validity);
1236 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001237 res_params.success_threshold);
Luke Huang5bd827c2019-03-14 16:10:04 +08001238 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
1239 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
1240 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
Ken Chenb9fa2062018-11-13 21:51:13 +08001241 res_params.base_timeout_msec);
Luke Huang5bd827c2019-03-14 16:10:04 +08001242 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_RETRY_COUNT], res_params.retry_count);
Ken Chenb9fa2062018-11-13 21:51:13 +08001243}
1244
1245TEST_F(ResolverTest, SearchPathChange) {
Xiao Ma09b71022018-12-11 17:56:32 +09001246 constexpr char listen_addr[] = "127.0.0.13";
1247 constexpr char host_name1[] = "test13.domain1.org.";
1248 constexpr char host_name2[] = "test13.domain2.org.";
Luke Huangf8215372019-11-22 11:53:41 +08001249 std::vector<std::string> servers = {listen_addr};
1250 std::vector<std::string> domains = {"domain1.org"};
Xiao Ma09b71022018-12-11 17:56:32 +09001251
1252 const std::vector<DnsRecord> records = {
1253 {host_name1, ns_type::ns_t_aaaa, "2001:db8::13"},
1254 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1:13"},
1255 };
1256 test::DNSResponder dns(listen_addr);
1257 StartDns(dns, records);
1258 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001259
1260 const addrinfo hints = {.ai_family = AF_INET6};
1261 ScopedAddrinfo result = safe_getaddrinfo("test13", nullptr, &hints);
1262 EXPECT_TRUE(result != nullptr);
1263 EXPECT_EQ(1U, dns.queries().size());
1264 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
1265 EXPECT_EQ("2001:db8::13", ToString(result));
1266
1267 // Test that changing the domain search path on its own works.
Luke Huangf8215372019-11-22 11:53:41 +08001268 domains = {"domain2.org"};
Xiao Ma09b71022018-12-11 17:56:32 +09001269 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001270 dns.clearQueries();
1271
1272 result = safe_getaddrinfo("test13", nullptr, &hints);
1273 EXPECT_TRUE(result != nullptr);
1274 EXPECT_EQ(1U, dns.queries().size());
1275 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
1276 EXPECT_EQ("2001:db8::1:13", ToString(result));
1277}
1278
Luke Huang2dac4382019-06-24 13:28:44 +08001279namespace {
1280
Luke Huangf8215372019-11-22 11:53:41 +08001281std::vector<std::string> getResolverDomains(aidl::android::net::IDnsResolver* dnsResolverService,
Luke Huang2dac4382019-06-24 13:28:44 +08001282 unsigned netId) {
1283 std::vector<std::string> res_servers;
1284 std::vector<std::string> res_domains;
1285 std::vector<std::string> res_tls_servers;
1286 res_params res_params;
1287 std::vector<ResolverStats> res_stats;
1288 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001289 DnsResponderClient::GetResolverInfo(dnsResolverService, netId, &res_servers, &res_domains,
1290 &res_tls_servers, &res_params, &res_stats,
1291 &wait_for_pending_req_timeout_count);
Luke Huang2dac4382019-06-24 13:28:44 +08001292 return res_domains;
1293}
1294
1295} // namespace
1296
1297TEST_F(ResolverTest, SearchPathPrune) {
1298 constexpr size_t DUPLICATED_DOMAIN_NUM = 3;
1299 constexpr char listen_addr[] = "127.0.0.13";
1300 constexpr char domian_name1[] = "domain13.org.";
1301 constexpr char domian_name2[] = "domain14.org.";
1302 constexpr char host_name1[] = "test13.domain13.org.";
1303 constexpr char host_name2[] = "test14.domain14.org.";
1304 std::vector<std::string> servers = {listen_addr};
1305
1306 std::vector<std::string> testDomains1;
1307 std::vector<std::string> testDomains2;
1308 // Domain length should be <= 255
1309 // Max number of domains in search path is 6
1310 for (size_t i = 0; i < MAXDNSRCH + 1; i++) {
1311 // Fill up with invalid domain
1312 testDomains1.push_back(std::string(300, i + '0'));
1313 // Fill up with valid but duplicated domain
1314 testDomains2.push_back(StringPrintf("domain%zu.org", i % DUPLICATED_DOMAIN_NUM));
1315 }
1316
1317 // Add valid domain used for query.
1318 testDomains1.push_back(domian_name1);
1319
1320 // Add valid domain twice used for query.
1321 testDomains2.push_back(domian_name2);
1322 testDomains2.push_back(domian_name2);
1323
1324 const std::vector<DnsRecord> records = {
1325 {host_name1, ns_type::ns_t_aaaa, "2001:db8::13"},
1326 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1:13"},
1327 };
1328 test::DNSResponder dns(listen_addr);
1329 StartDns(dns, records);
1330 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, testDomains1));
1331
1332 const addrinfo hints = {.ai_family = AF_INET6};
1333 ScopedAddrinfo result = safe_getaddrinfo("test13", nullptr, &hints);
1334
1335 EXPECT_TRUE(result != nullptr);
1336
1337 EXPECT_EQ(1U, dns.queries().size());
1338 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
1339 EXPECT_EQ("2001:db8::13", ToString(result));
1340
1341 const auto& res_domains1 = getResolverDomains(mDnsClient.resolvService(), TEST_NETID);
1342 // Expect 1 valid domain, invalid domains are removed.
1343 ASSERT_EQ(1U, res_domains1.size());
1344 EXPECT_EQ(domian_name1, res_domains1[0]);
1345
1346 dns.clearQueries();
1347
1348 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, testDomains2));
1349
1350 result = safe_getaddrinfo("test14", nullptr, &hints);
1351 EXPECT_TRUE(result != nullptr);
1352
1353 // (3 domains * 2 retries) + 1 success query = 7
1354 EXPECT_EQ(7U, dns.queries().size());
1355 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
1356 EXPECT_EQ("2001:db8::1:13", ToString(result));
1357
1358 const auto& res_domains2 = getResolverDomains(mDnsClient.resolvService(), TEST_NETID);
1359 // Expect 4 valid domain, duplicate domains are removed.
1360 EXPECT_EQ(DUPLICATED_DOMAIN_NUM + 1U, res_domains2.size());
1361 EXPECT_THAT(
1362 std::vector<std::string>({"domain0.org", "domain1.org", "domain2.org", domian_name2}),
1363 testing::ElementsAreArray(res_domains2));
1364}
1365
Mike Yu0a1c53d2018-11-26 13:26:21 +09001366// If we move this function to dns_responder_client, it will complicate the dependency need of
1367// dns_tls_frontend.h.
1368static void setupTlsServers(const std::vector<std::string>& servers,
waynema0e73c2e2019-07-31 15:04:08 +08001369 std::vector<std::unique_ptr<test::DnsTlsFrontend>>* tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001370 constexpr char listen_udp[] = "53";
1371 constexpr char listen_tls[] = "853";
Mike Yu0a1c53d2018-11-26 13:26:21 +09001372
1373 for (const auto& server : servers) {
1374 auto t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
1375 t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
1376 t->startServer();
Mike Yu0a1c53d2018-11-26 13:26:21 +09001377 tls->push_back(std::move(t));
1378 }
1379}
1380
Mike Yu0a1c53d2018-11-26 13:26:21 +09001381TEST_F(ResolverTest, MaxServerPrune_Binder) {
Mike Yu0a1c53d2018-11-26 13:26:21 +09001382 std::vector<std::string> domains;
1383 std::vector<std::unique_ptr<test::DNSResponder>> dns;
1384 std::vector<std::unique_ptr<test::DnsTlsFrontend>> tls;
1385 std::vector<std::string> servers;
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001386 std::vector<DnsResponderClient::Mapping> mappings;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001387
1388 for (unsigned i = 0; i < MAXDNSRCH + 1; i++) {
1389 domains.push_back(StringPrintf("example%u.com", i));
1390 }
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001391 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupMappings(1, domains, &mappings));
1392 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupDNSServers(MAXNS + 1, mappings, &dns, &servers));
waynema0e73c2e2019-07-31 15:04:08 +08001393 ASSERT_NO_FATAL_FAILURE(setupTlsServers(servers, &tls));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001394
waynema0e73c2e2019-07-31 15:04:08 +08001395 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, domains, kDefaultParams,
1396 kDefaultPrivateDnsHostName));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001397
Mike Yu383855b2019-01-15 17:53:27 +08001398 // If the private DNS validation hasn't completed yet before backend DNS servers stop,
1399 // TLS servers will get stuck in handleOneRequest(), which causes this test stuck in
1400 // ~DnsTlsFrontend() because the TLS server loop threads can't be terminated.
1401 // So, wait for private DNS validation done before stopping backend DNS servers.
1402 for (int i = 0; i < MAXNS; i++) {
chenbruceaff85842019-05-31 15:46:42 +08001403 LOG(INFO) << "Waiting for private DNS validation on " << tls[i]->listen_address() << ".";
Mike Yu724f77d2019-08-16 11:14:50 +08001404 EXPECT_TRUE(WaitForPrivateDnsValidation(tls[i]->listen_address(), true));
chenbruceaff85842019-05-31 15:46:42 +08001405 LOG(INFO) << "private DNS validation on " << tls[i]->listen_address() << " done.";
Mike Yu383855b2019-01-15 17:53:27 +08001406 }
1407
Mike Yu0a1c53d2018-11-26 13:26:21 +09001408 std::vector<std::string> res_servers;
1409 std::vector<std::string> res_domains;
1410 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001411 res_params res_params;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001412 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +08001413 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001414 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1415 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1416 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001417
1418 // Check the size of the stats and its contents.
1419 EXPECT_EQ(static_cast<size_t>(MAXNS), res_servers.size());
1420 EXPECT_EQ(static_cast<size_t>(MAXNS), res_tls_servers.size());
1421 EXPECT_EQ(static_cast<size_t>(MAXDNSRCH), res_domains.size());
1422 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_servers.begin()));
1423 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_tls_servers.begin()));
1424 EXPECT_TRUE(std::equal(domains.begin(), domains.begin() + MAXDNSRCH, res_domains.begin()));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001425}
1426
1427TEST_F(ResolverTest, ResolverStats) {
Xiao Ma09b71022018-12-11 17:56:32 +09001428 constexpr char listen_addr1[] = "127.0.0.4";
1429 constexpr char listen_addr2[] = "127.0.0.5";
1430 constexpr char listen_addr3[] = "127.0.0.6";
Mike Yu0a1c53d2018-11-26 13:26:21 +09001431
1432 // Set server 1 timeout.
Mike Yufc125e42019-05-15 20:41:28 +08001433 test::DNSResponder dns1(listen_addr1, "53", static_cast<ns_rcode>(-1));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001434 dns1.setResponseProbability(0.0);
1435 ASSERT_TRUE(dns1.startServer());
1436
1437 // Set server 2 responding server failure.
Xiao Ma09b71022018-12-11 17:56:32 +09001438 test::DNSResponder dns2(listen_addr2);
Mike Yu0a1c53d2018-11-26 13:26:21 +09001439 dns2.setResponseProbability(0.0);
1440 ASSERT_TRUE(dns2.startServer());
1441
1442 // Set server 3 workable.
Xiao Ma09b71022018-12-11 17:56:32 +09001443 test::DNSResponder dns3(listen_addr3);
1444 dns3.addMapping(kHelloExampleCom, ns_type::ns_t_a, "1.2.3.4");
Mike Yu0a1c53d2018-11-26 13:26:21 +09001445 ASSERT_TRUE(dns3.startServer());
1446
1447 std::vector<std::string> servers = {listen_addr1, listen_addr2, listen_addr3};
Xiao Ma09b71022018-12-11 17:56:32 +09001448 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001449
1450 dns3.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +09001451 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
Mike Yu0a1c53d2018-11-26 13:26:21 +09001452 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
Xiao Ma09b71022018-12-11 17:56:32 +09001453 size_t found = GetNumQueries(dns3, kHelloExampleCom);
Mike Yu0a1c53d2018-11-26 13:26:21 +09001454 EXPECT_LE(1U, found);
1455 std::string result_str = ToString(result);
1456 EXPECT_TRUE(result_str == "1.2.3.4") << ", result_str='" << result_str << "'";
1457
Mike Yuc0000252020-03-19 07:14:23 +00001458 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1459 NameserverStats(listen_addr1).setTimeouts(1),
1460 NameserverStats(listen_addr2).setErrors(1),
1461 NameserverStats(listen_addr3).setSuccesses(1),
1462 };
1463 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001464}
1465
Mike Yu15791832020-02-11 13:38:48 +08001466TEST_F(ResolverTest, AlwaysUseLatestSetupParamsInLookups) {
1467 constexpr char listen_addr1[] = "127.0.0.3";
1468 constexpr char listen_addr2[] = "255.255.255.255";
1469 constexpr char listen_addr3[] = "127.0.0.4";
1470 constexpr char hostname[] = "hello";
1471 constexpr char fqdn_with_search_domain[] = "hello.domain2.com.";
1472
1473 test::DNSResponder dns1(listen_addr1, test::kDefaultListenService, static_cast<ns_rcode>(-1));
1474 dns1.setResponseProbability(0.0);
1475 ASSERT_TRUE(dns1.startServer());
1476
1477 test::DNSResponder dns3(listen_addr3);
1478 StartDns(dns3, {{fqdn_with_search_domain, ns_type::ns_t_a, "1.2.3.4"}});
1479
1480 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
1481 parcel.tlsServers.clear();
1482 parcel.servers = {listen_addr1, listen_addr2};
1483 parcel.domains = {"domain1.com", "domain2.com"};
1484 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1485
1486 // Expect the things happening in t1:
1487 // 1. The lookup starts using the first domain for query. It sends queries to the populated
1488 // nameserver list {listen_addr1, listen_addr2} for the hostname "hello.domain1.com".
1489 // 2. A different list of nameservers is updated to the resolver. Revision ID is incremented.
1490 // 3. The query for the hostname times out. The lookup fails to add the timeout record to the
1491 // the stats because of the unmatched revision ID.
1492 // 4. The lookup starts using the second domain for query. It sends queries to the populated
1493 // nameserver list {listen_addr3, listen_addr1, listen_addr2} for another hostname
1494 // "hello.domain2.com".
1495 // 5. The lookup gets the answer and updates a success record to the stats.
1496 std::thread t1([&hostname]() {
1497 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1498 ScopedAddrinfo result = safe_getaddrinfo(hostname, nullptr, &hints);
1499 EXPECT_NE(result.get(), nullptr);
1500 EXPECT_EQ(ToString(result), "1.2.3.4");
1501 });
1502
1503 // Wait for t1 to start the step 1.
1504 while (dns1.queries().size() == 0) {
1505 usleep(1000);
1506 }
1507
1508 // Update the resolver with three nameservers. This will increment the revision ID.
1509 parcel.servers = {listen_addr3, listen_addr1, listen_addr2};
1510 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1511
1512 t1.join();
1513 EXPECT_EQ(0U, GetNumQueriesForType(dns3, ns_type::ns_t_aaaa, fqdn_with_search_domain));
1514 EXPECT_EQ(1U, GetNumQueriesForType(dns3, ns_type::ns_t_a, fqdn_with_search_domain));
1515
Mike Yuc0000252020-03-19 07:14:23 +00001516 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1517 NameserverStats(listen_addr1),
1518 NameserverStats(listen_addr2),
1519 NameserverStats(listen_addr3).setSuccesses(1),
1520 };
1521 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
Mike Yu15791832020-02-11 13:38:48 +08001522}
1523
Ken Chenb9fa2062018-11-13 21:51:13 +08001524// Test what happens if the specified TLS server is nonexistent.
1525TEST_F(ResolverTest, GetHostByName_TlsMissing) {
Xiao Ma09b71022018-12-11 17:56:32 +09001526 constexpr char listen_addr[] = "127.0.0.3";
1527 constexpr char host_name[] = "tlsmissing.example.com.";
1528
1529 test::DNSResponder dns;
1530 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.3"}});
Luke Huangf8215372019-11-22 11:53:41 +08001531 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001532
1533 // There's nothing listening on this address, so validation will either fail or
1534 /// hang. Either way, queries will continue to flow to the DNSResponder.
waynema0e73c2e2019-07-31 15:04:08 +08001535 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Ken Chenb9fa2062018-11-13 21:51:13 +08001536
1537 const hostent* result;
1538
1539 result = gethostbyname("tlsmissing");
1540 ASSERT_FALSE(result == nullptr);
1541 EXPECT_EQ("1.2.3.3", ToString(result));
1542
1543 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001544 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001545}
1546
1547// Test what happens if the specified TLS server replies with garbage.
1548TEST_F(ResolverTest, GetHostByName_TlsBroken) {
Xiao Ma09b71022018-12-11 17:56:32 +09001549 constexpr char listen_addr[] = "127.0.0.3";
1550 constexpr char host_name1[] = "tlsbroken1.example.com.";
1551 constexpr char host_name2[] = "tlsbroken2.example.com.";
1552 const std::vector<DnsRecord> records = {
1553 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1554 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1555 };
1556
1557 test::DNSResponder dns;
1558 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001559 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001560
1561 // Bind the specified private DNS socket but don't respond to any client sockets yet.
1562 int s = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, IPPROTO_TCP);
1563 ASSERT_TRUE(s >= 0);
1564 struct sockaddr_in tlsServer = {
Luke Huangf8215372019-11-22 11:53:41 +08001565 .sin_family = AF_INET,
1566 .sin_port = htons(853),
Ken Chenb9fa2062018-11-13 21:51:13 +08001567 };
1568 ASSERT_TRUE(inet_pton(AF_INET, listen_addr, &tlsServer.sin_addr));
1569 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEPORT).ok());
1570 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEADDR).ok());
1571 ASSERT_FALSE(bind(s, reinterpret_cast<struct sockaddr*>(&tlsServer), sizeof(tlsServer)));
1572 ASSERT_FALSE(listen(s, 1));
1573
1574 // Trigger TLS validation.
waynema0e73c2e2019-07-31 15:04:08 +08001575 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Ken Chenb9fa2062018-11-13 21:51:13 +08001576
1577 struct sockaddr_storage cliaddr;
1578 socklen_t sin_size = sizeof(cliaddr);
Luke Huangf8215372019-11-22 11:53:41 +08001579 int new_fd = accept4(s, reinterpret_cast<struct sockaddr*>(&cliaddr), &sin_size, SOCK_CLOEXEC);
Ken Chenb9fa2062018-11-13 21:51:13 +08001580 ASSERT_TRUE(new_fd > 0);
1581
1582 // We've received the new file descriptor but not written to it or closed, so the
1583 // validation is still pending. Queries should still flow correctly because the
1584 // server is not used until validation succeeds.
1585 const hostent* result;
1586 result = gethostbyname("tlsbroken1");
1587 ASSERT_FALSE(result == nullptr);
1588 EXPECT_EQ("1.2.3.1", ToString(result));
1589
1590 // Now we cause the validation to fail.
1591 std::string garbage = "definitely not a valid TLS ServerHello";
1592 write(new_fd, garbage.data(), garbage.size());
1593 close(new_fd);
1594
1595 // Validation failure shouldn't interfere with lookups, because lookups won't be sent
1596 // to the TLS server unless validation succeeds.
1597 result = gethostbyname("tlsbroken2");
1598 ASSERT_FALSE(result == nullptr);
1599 EXPECT_EQ("1.2.3.2", ToString(result));
1600
1601 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001602 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001603 close(s);
1604}
1605
1606TEST_F(ResolverTest, GetHostByName_Tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001607 constexpr char listen_addr[] = "127.0.0.3";
1608 constexpr char listen_udp[] = "53";
1609 constexpr char listen_tls[] = "853";
1610 constexpr char host_name1[] = "tls1.example.com.";
1611 constexpr char host_name2[] = "tls2.example.com.";
1612 constexpr char host_name3[] = "tls3.example.com.";
1613 const std::vector<DnsRecord> records = {
1614 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1615 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1616 {host_name3, ns_type::ns_t_a, "1.2.3.3"},
1617 };
1618
1619 test::DNSResponder dns;
1620 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001621 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001622
1623 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1624 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001625 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08001626 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001627
Mike Yu724f77d2019-08-16 11:14:50 +08001628 const hostent* result = gethostbyname("tls1");
Ken Chenb9fa2062018-11-13 21:51:13 +08001629 ASSERT_FALSE(result == nullptr);
1630 EXPECT_EQ("1.2.3.1", ToString(result));
1631
1632 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001633 EXPECT_TRUE(tls.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001634
1635 // Stop the TLS server. Since we're in opportunistic mode, queries will
1636 // fall back to the locally-assigned (clear text) nameservers.
1637 tls.stopServer();
1638
1639 dns.clearQueries();
1640 result = gethostbyname("tls2");
1641 EXPECT_FALSE(result == nullptr);
1642 EXPECT_EQ("1.2.3.2", ToString(result));
1643 const auto queries = dns.queries();
1644 EXPECT_EQ(1U, queries.size());
waynema29253052019-08-20 11:26:08 +08001645 EXPECT_EQ("tls2.example.com.", queries[0].name);
1646 EXPECT_EQ(ns_t_a, queries[0].type);
Ken Chenb9fa2062018-11-13 21:51:13 +08001647
1648 // Reset the resolvers without enabling TLS. Queries should still be routed
1649 // to the UDP endpoint.
Xiao Ma09b71022018-12-11 17:56:32 +09001650 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001651
1652 result = gethostbyname("tls3");
1653 ASSERT_FALSE(result == nullptr);
1654 EXPECT_EQ("1.2.3.3", ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +08001655}
1656
Ken Chenb9fa2062018-11-13 21:51:13 +08001657TEST_F(ResolverTest, GetHostByName_TlsFailover) {
Xiao Ma09b71022018-12-11 17:56:32 +09001658 constexpr char listen_addr1[] = "127.0.0.3";
1659 constexpr char listen_addr2[] = "127.0.0.4";
1660 constexpr char listen_udp[] = "53";
1661 constexpr char listen_tls[] = "853";
1662 constexpr char host_name1[] = "tlsfailover1.example.com.";
1663 constexpr char host_name2[] = "tlsfailover2.example.com.";
1664 const std::vector<DnsRecord> records1 = {
1665 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1666 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1667 };
1668 const std::vector<DnsRecord> records2 = {
1669 {host_name1, ns_type::ns_t_a, "1.2.3.3"},
1670 {host_name2, ns_type::ns_t_a, "1.2.3.4"},
1671 };
1672
1673 test::DNSResponder dns1(listen_addr1);
1674 test::DNSResponder dns2(listen_addr2);
1675 StartDns(dns1, records1);
1676 StartDns(dns2, records2);
1677
Luke Huangf8215372019-11-22 11:53:41 +08001678 std::vector<std::string> servers = {listen_addr1, listen_addr2};
Ken Chenb9fa2062018-11-13 21:51:13 +08001679
1680 test::DnsTlsFrontend tls1(listen_addr1, listen_tls, listen_addr1, listen_udp);
1681 test::DnsTlsFrontend tls2(listen_addr2, listen_tls, listen_addr2, listen_udp);
1682 ASSERT_TRUE(tls1.startServer());
1683 ASSERT_TRUE(tls2.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001684 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1685 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08001686 EXPECT_TRUE(WaitForPrivateDnsValidation(tls1.listen_address(), true));
1687 EXPECT_TRUE(WaitForPrivateDnsValidation(tls2.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001688
Mike Yu724f77d2019-08-16 11:14:50 +08001689 const hostent* result = gethostbyname("tlsfailover1");
Ken Chenb9fa2062018-11-13 21:51:13 +08001690 ASSERT_FALSE(result == nullptr);
1691 EXPECT_EQ("1.2.3.1", ToString(result));
1692
1693 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001694 EXPECT_TRUE(tls1.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001695 // No new queries should have reached tls2.
1696 EXPECT_EQ(1, tls2.queries());
1697
1698 // Stop tls1. Subsequent queries should attempt to reach tls1, fail, and retry to tls2.
1699 tls1.stopServer();
1700
1701 result = gethostbyname("tlsfailover2");
1702 EXPECT_EQ("1.2.3.4", ToString(result));
1703
1704 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001705 EXPECT_TRUE(tls2.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001706
1707 // No additional queries should have reached the insecure servers.
1708 EXPECT_EQ(2U, dns1.queries().size());
1709 EXPECT_EQ(2U, dns2.queries().size());
1710
1711 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001712 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Ken Chenb9fa2062018-11-13 21:51:13 +08001713}
1714
1715TEST_F(ResolverTest, GetHostByName_BadTlsName) {
Xiao Ma09b71022018-12-11 17:56:32 +09001716 constexpr char listen_addr[] = "127.0.0.3";
1717 constexpr char listen_udp[] = "53";
1718 constexpr char listen_tls[] = "853";
1719 constexpr char host_name[] = "badtlsname.example.com.";
1720
1721 test::DNSResponder dns;
1722 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.1"}});
Luke Huangf8215372019-11-22 11:53:41 +08001723 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001724
1725 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1726 ASSERT_TRUE(tls.startServer());
Xiao Ma09b71022018-12-11 17:56:32 +09001727 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
waynema0e73c2e2019-07-31 15:04:08 +08001728 kDefaultIncorrectPrivateDnsHostName));
Ken Chenb9fa2062018-11-13 21:51:13 +08001729
waynema0e73c2e2019-07-31 15:04:08 +08001730 // The TLS handshake would fail because the name of TLS server doesn't
1731 // match with TLS server's certificate.
Mike Yu724f77d2019-08-16 11:14:50 +08001732 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), false));
Ken Chenb9fa2062018-11-13 21:51:13 +08001733
1734 // The query should fail hard, because a name was specified.
1735 EXPECT_EQ(nullptr, gethostbyname("badtlsname"));
1736
1737 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001738 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001739}
1740
1741TEST_F(ResolverTest, GetAddrInfo_Tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001742 constexpr char listen_addr[] = "127.0.0.3";
1743 constexpr char listen_udp[] = "53";
1744 constexpr char listen_tls[] = "853";
1745 constexpr char host_name[] = "addrinfotls.example.com.";
1746 const std::vector<DnsRecord> records = {
1747 {host_name, ns_type::ns_t_a, "1.2.3.4"},
1748 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
1749 };
1750
1751 test::DNSResponder dns;
1752 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001753 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001754
1755 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1756 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001757 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1758 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08001759 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001760
1761 dns.clearQueries();
1762 ScopedAddrinfo result = safe_getaddrinfo("addrinfotls", nullptr, nullptr);
1763 EXPECT_TRUE(result != nullptr);
1764 size_t found = GetNumQueries(dns, host_name);
1765 EXPECT_LE(1U, found);
1766 // Could be A or AAAA
1767 std::string result_str = ToString(result);
1768 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +08001769 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08001770 // Wait for both A and AAAA queries to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001771 EXPECT_TRUE(tls.waitForQueries(3));
Ken Chenb9fa2062018-11-13 21:51:13 +08001772
1773 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001774 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001775}
1776
1777TEST_F(ResolverTest, TlsBypass) {
1778 const char OFF[] = "off";
1779 const char OPPORTUNISTIC[] = "opportunistic";
1780 const char STRICT[] = "strict";
1781
1782 const char GETHOSTBYNAME[] = "gethostbyname";
1783 const char GETADDRINFO[] = "getaddrinfo";
1784 const char GETADDRINFOFORNET[] = "getaddrinfofornet";
1785
1786 const unsigned BYPASS_NETID = NETID_USE_LOCAL_NAMESERVERS | TEST_NETID;
1787
Ken Chenb9fa2062018-11-13 21:51:13 +08001788 const char ADDR4[] = "192.0.2.1";
1789 const char ADDR6[] = "2001:db8::1";
1790
1791 const char cleartext_addr[] = "127.0.0.53";
1792 const char cleartext_port[] = "53";
1793 const char tls_port[] = "853";
Luke Huangf8215372019-11-22 11:53:41 +08001794 const std::vector<std::string> servers = {cleartext_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001795
Xiao Ma09b71022018-12-11 17:56:32 +09001796 test::DNSResponder dns(cleartext_addr);
Ken Chenb9fa2062018-11-13 21:51:13 +08001797 ASSERT_TRUE(dns.startServer());
1798
1799 test::DnsTlsFrontend tls(cleartext_addr, tls_port, cleartext_addr, cleartext_port);
Mike Yudd4ac2d2019-05-31 16:52:11 +08001800 ASSERT_TRUE(tls.startServer());
Ken Chenb9fa2062018-11-13 21:51:13 +08001801
Luke Huangf8215372019-11-22 11:53:41 +08001802 // clang-format off
Ken Chenb9fa2062018-11-13 21:51:13 +08001803 struct TestConfig {
1804 const std::string mode;
1805 const bool withWorkingTLS;
1806 const std::string method;
1807
1808 std::string asHostName() const {
Luke Huangf8215372019-11-22 11:53:41 +08001809 return StringPrintf("%s.%s.%s.", mode.c_str(), withWorkingTLS ? "tlsOn" : "tlsOff",
Ken Chenb9fa2062018-11-13 21:51:13 +08001810 method.c_str());
1811 }
1812 } testConfigs[]{
Ken Chenb9fa2062018-11-13 21:51:13 +08001813 {OFF, true, GETHOSTBYNAME},
1814 {OPPORTUNISTIC, true, GETHOSTBYNAME},
1815 {STRICT, true, GETHOSTBYNAME},
Ken Chenb9fa2062018-11-13 21:51:13 +08001816 {OFF, true, GETADDRINFO},
1817 {OPPORTUNISTIC, true, GETADDRINFO},
1818 {STRICT, true, GETADDRINFO},
Ken Chenb9fa2062018-11-13 21:51:13 +08001819 {OFF, true, GETADDRINFOFORNET},
1820 {OPPORTUNISTIC, true, GETADDRINFOFORNET},
1821 {STRICT, true, GETADDRINFOFORNET},
Mike Yudd4ac2d2019-05-31 16:52:11 +08001822 {OFF, false, GETHOSTBYNAME},
1823 {OPPORTUNISTIC, false, GETHOSTBYNAME},
1824 {STRICT, false, GETHOSTBYNAME},
1825 {OFF, false, GETADDRINFO},
1826 {OPPORTUNISTIC, false, GETADDRINFO},
1827 {STRICT, false, GETADDRINFO},
1828 {OFF, false, GETADDRINFOFORNET},
1829 {OPPORTUNISTIC, false, GETADDRINFOFORNET},
1830 {STRICT, false, GETADDRINFOFORNET},
Ken Chenb9fa2062018-11-13 21:51:13 +08001831 };
Luke Huangf8215372019-11-22 11:53:41 +08001832 // clang-format on
Ken Chenb9fa2062018-11-13 21:51:13 +08001833
1834 for (const auto& config : testConfigs) {
1835 const std::string testHostName = config.asHostName();
1836 SCOPED_TRACE(testHostName);
1837
1838 // Don't tempt test bugs due to caching.
1839 const char* host_name = testHostName.c_str();
1840 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
1841 dns.addMapping(host_name, ns_type::ns_t_aaaa, ADDR6);
1842
Mike Yudd4ac2d2019-05-31 16:52:11 +08001843 if (config.withWorkingTLS) {
1844 if (!tls.running()) {
1845 ASSERT_TRUE(tls.startServer());
1846 }
1847 } else {
1848 if (tls.running()) {
1849 ASSERT_TRUE(tls.stopServer());
1850 }
1851 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001852
1853 if (config.mode == OFF) {
Xiao Ma09b71022018-12-11 17:56:32 +09001854 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, kDefaultSearchDomains,
1855 kDefaultParams));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001856 } else /* OPPORTUNISTIC or STRICT */ {
1857 const char* tls_hostname = (config.mode == STRICT) ? kDefaultPrivateDnsHostName : "";
Xiao Ma09b71022018-12-11 17:56:32 +09001858 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001859 kDefaultParams, tls_hostname));
Mike Yu724f77d2019-08-16 11:14:50 +08001860
1861 // Wait for the validation event. If the server is running, the validation should
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001862 // succeed; otherwise, the validation should fail.
Mike Yu724f77d2019-08-16 11:14:50 +08001863 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), config.withWorkingTLS));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001864 if (config.withWorkingTLS) {
1865 EXPECT_TRUE(tls.waitForQueries(1));
1866 tls.clearQueries();
1867 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001868 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001869
1870 const hostent* h_result = nullptr;
1871 ScopedAddrinfo ai_result;
1872
1873 if (config.method == GETHOSTBYNAME) {
1874 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
1875 h_result = gethostbyname(host_name);
1876
1877 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
1878 ASSERT_FALSE(h_result == nullptr);
1879 ASSERT_EQ(4, h_result->h_length);
1880 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
1881 EXPECT_EQ(ADDR4, ToString(h_result));
1882 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
1883 } else if (config.method == GETADDRINFO) {
1884 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
1885 ai_result = safe_getaddrinfo(host_name, nullptr, nullptr);
1886 EXPECT_TRUE(ai_result != nullptr);
1887
1888 EXPECT_LE(1U, GetNumQueries(dns, host_name));
1889 // Could be A or AAAA
1890 const std::string result_str = ToString(ai_result);
1891 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
Luke Huangf8215372019-11-22 11:53:41 +08001892 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08001893 } else if (config.method == GETADDRINFOFORNET) {
1894 addrinfo* raw_ai_result = nullptr;
1895 EXPECT_EQ(0, android_getaddrinfofornet(host_name, /*servname=*/nullptr,
1896 /*hints=*/nullptr, BYPASS_NETID, MARK_UNSET,
1897 &raw_ai_result));
1898 ai_result.reset(raw_ai_result);
1899
1900 EXPECT_LE(1U, GetNumQueries(dns, host_name));
1901 // Could be A or AAAA
1902 const std::string result_str = ToString(ai_result);
1903 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
Luke Huangf8215372019-11-22 11:53:41 +08001904 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08001905 }
1906
Mike Yudd4ac2d2019-05-31 16:52:11 +08001907 EXPECT_EQ(0, tls.queries());
Ken Chenb9fa2062018-11-13 21:51:13 +08001908
1909 // Clear per-process resolv netid.
1910 ASSERT_EQ(0, setNetworkForResolv(NETID_UNSET));
Ken Chenb9fa2062018-11-13 21:51:13 +08001911 dns.clearQueries();
1912 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001913}
1914
1915TEST_F(ResolverTest, StrictMode_NoTlsServers) {
Xiao Ma09b71022018-12-11 17:56:32 +09001916 constexpr char cleartext_addr[] = "127.0.0.53";
Luke Huangf8215372019-11-22 11:53:41 +08001917 const std::vector<std::string> servers = {cleartext_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09001918 constexpr char host_name[] = "strictmode.notlsips.example.com.";
1919 const std::vector<DnsRecord> records = {
1920 {host_name, ns_type::ns_t_a, "1.2.3.4"},
1921 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
1922 };
Ken Chenb9fa2062018-11-13 21:51:13 +08001923
Xiao Ma09b71022018-12-11 17:56:32 +09001924 test::DNSResponder dns(cleartext_addr);
1925 StartDns(dns, records);
Ken Chenb9fa2062018-11-13 21:51:13 +08001926
waynema0e73c2e2019-07-31 15:04:08 +08001927 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1928 kDefaultIncorrectPrivateDnsHostName));
Ken Chenb9fa2062018-11-13 21:51:13 +08001929
1930 addrinfo* ai_result = nullptr;
1931 EXPECT_NE(0, getaddrinfo(host_name, nullptr, nullptr, &ai_result));
1932 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
1933}
Luke Huang94b10b92018-11-21 20:13:38 +08001934
1935namespace {
1936
Luke Huang70931aa2019-01-31 11:57:41 +08001937int getAsyncResponse(int fd, int* rcode, uint8_t* buf, int bufLen) {
Luke Huang94b10b92018-11-21 20:13:38 +08001938 struct pollfd wait_fd[1];
1939 wait_fd[0].fd = fd;
1940 wait_fd[0].events = POLLIN;
1941 short revents;
1942 int ret;
1943
1944 ret = poll(wait_fd, 1, -1);
1945 revents = wait_fd[0].revents;
1946 if (revents & POLLIN) {
1947 int n = resNetworkResult(fd, rcode, buf, bufLen);
Luke Huangba7bef92018-12-26 16:53:03 +08001948 // Verify that resNetworkResult() closed the fd
1949 char dummy;
1950 EXPECT_EQ(-1, read(fd, &dummy, sizeof dummy));
1951 EXPECT_EQ(EBADF, errno);
Luke Huang94b10b92018-11-21 20:13:38 +08001952 return n;
1953 }
1954 return -1;
1955}
1956
Luke Huang70931aa2019-01-31 11:57:41 +08001957std::string toString(uint8_t* buf, int bufLen, int ipType) {
Luke Huang94b10b92018-11-21 20:13:38 +08001958 ns_msg handle;
1959 int ancount, n = 0;
1960 ns_rr rr;
1961
Luke Huangf8215372019-11-22 11:53:41 +08001962 if (ns_initparse((const uint8_t*)buf, bufLen, &handle) >= 0) {
Luke Huang94b10b92018-11-21 20:13:38 +08001963 ancount = ns_msg_count(handle, ns_s_an);
1964 if (ns_parserr(&handle, ns_s_an, n, &rr) == 0) {
Luke Huang70931aa2019-01-31 11:57:41 +08001965 const uint8_t* rdata = ns_rr_rdata(rr);
Luke Huang94b10b92018-11-21 20:13:38 +08001966 char buffer[INET6_ADDRSTRLEN];
Luke Huangf8215372019-11-22 11:53:41 +08001967 if (inet_ntop(ipType, (const char*)rdata, buffer, sizeof(buffer))) {
Luke Huang94b10b92018-11-21 20:13:38 +08001968 return buffer;
1969 }
1970 }
1971 }
1972 return "";
1973}
1974
1975int dns_open_proxy() {
1976 int s = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
1977 if (s == -1) {
1978 return -1;
1979 }
1980 const int one = 1;
1981 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
1982
1983 static const struct sockaddr_un proxy_addr = {
1984 .sun_family = AF_UNIX,
1985 .sun_path = "/dev/socket/dnsproxyd",
1986 };
1987
Luke Huangf8215372019-11-22 11:53:41 +08001988 if (TEMP_FAILURE_RETRY(connect(s, (const struct sockaddr*)&proxy_addr, sizeof(proxy_addr))) !=
Luke Huang94b10b92018-11-21 20:13:38 +08001989 0) {
1990 close(s);
1991 return -1;
1992 }
1993
1994 return s;
1995}
1996
Luke Huangba7bef92018-12-26 16:53:03 +08001997void expectAnswersValid(int fd, int ipType, const std::string& expectedAnswer) {
1998 int rcode = -1;
1999 uint8_t buf[MAXPACKET] = {};
2000
2001 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2002 EXPECT_GT(res, 0);
2003 EXPECT_EQ(expectedAnswer, toString(buf, res, ipType));
2004}
2005
2006void expectAnswersNotValid(int fd, int expectedErrno) {
2007 int rcode = -1;
2008 uint8_t buf[MAXPACKET] = {};
2009
2010 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2011 EXPECT_EQ(expectedErrno, res);
2012}
2013
Luke Huang94b10b92018-11-21 20:13:38 +08002014} // namespace
2015
2016TEST_F(ResolverTest, Async_NormalQueryV4V6) {
Xiao Ma09b71022018-12-11 17:56:32 +09002017 constexpr char listen_addr[] = "127.0.0.4";
2018 constexpr char host_name[] = "howdy.example.com.";
2019 const std::vector<DnsRecord> records = {
2020 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2021 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2022 };
2023
2024 test::DNSResponder dns(listen_addr);
2025 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002026 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002027 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002028
Luke Huangba7bef92018-12-26 16:53:03 +08002029 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2030 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002031 EXPECT_TRUE(fd1 != -1);
2032 EXPECT_TRUE(fd2 != -1);
2033
Luke Huang70931aa2019-01-31 11:57:41 +08002034 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002035 int rcode;
2036 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2037 EXPECT_GT(res, 0);
2038 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
2039
2040 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2041 EXPECT_GT(res, 0);
2042 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2043
2044 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
2045
2046 // Re-query verify cache works
Luke Huangba7bef92018-12-26 16:53:03 +08002047 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2048 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002049
2050 EXPECT_TRUE(fd1 != -1);
2051 EXPECT_TRUE(fd2 != -1);
2052
2053 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2054 EXPECT_GT(res, 0);
2055 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
2056
2057 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2058 EXPECT_GT(res, 0);
2059 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2060
2061 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
2062}
2063
2064TEST_F(ResolverTest, Async_BadQuery) {
Xiao Ma09b71022018-12-11 17:56:32 +09002065 constexpr char listen_addr[] = "127.0.0.4";
2066 constexpr char host_name[] = "howdy.example.com.";
2067 const std::vector<DnsRecord> records = {
2068 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2069 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2070 };
2071
2072 test::DNSResponder dns(listen_addr);
2073 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002074 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002075 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002076
2077 static struct {
2078 int fd;
2079 const char* dname;
2080 const int queryType;
2081 const int expectRcode;
2082 } kTestData[] = {
Luke Huangba7bef92018-12-26 16:53:03 +08002083 {-1, "", ns_t_aaaa, 0},
2084 {-1, "as65ass46", ns_t_aaaa, 0},
2085 {-1, "454564564564", ns_t_aaaa, 0},
2086 {-1, "h645235", ns_t_a, 0},
2087 {-1, "www.google.com", ns_t_a, 0},
Luke Huang94b10b92018-11-21 20:13:38 +08002088 };
2089
2090 for (auto& td : kTestData) {
2091 SCOPED_TRACE(td.dname);
Luke Huangba7bef92018-12-26 16:53:03 +08002092 td.fd = resNetworkQuery(TEST_NETID, td.dname, ns_c_in, td.queryType, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002093 EXPECT_TRUE(td.fd != -1);
2094 }
2095
2096 // dns_responder return empty resp(packet only contains query part) with no error currently
2097 for (const auto& td : kTestData) {
Luke Huang70931aa2019-01-31 11:57:41 +08002098 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002099 int rcode;
2100 SCOPED_TRACE(td.dname);
2101 int res = getAsyncResponse(td.fd, &rcode, buf, MAXPACKET);
2102 EXPECT_GT(res, 0);
2103 EXPECT_EQ(rcode, td.expectRcode);
2104 }
2105}
2106
2107TEST_F(ResolverTest, Async_EmptyAnswer) {
Xiao Ma09b71022018-12-11 17:56:32 +09002108 constexpr char listen_addr[] = "127.0.0.4";
2109 constexpr char host_name[] = "howdy.example.com.";
2110 const std::vector<DnsRecord> records = {
2111 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2112 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2113 };
2114
2115 test::DNSResponder dns(listen_addr);
2116 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002117 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002118 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002119
Luke Huang9c264bb2018-12-18 16:44:41 +08002120 // TODO: Disable retry to make this test explicit.
2121 auto& cv = dns.getCv();
2122 auto& cvMutex = dns.getCvMutex();
2123 int fd1;
2124 // Wait on the condition variable to ensure that the DNS server has handled our first query.
2125 {
2126 std::unique_lock lk(cvMutex);
Luke Huangba7bef92018-12-26 16:53:03 +08002127 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang9c264bb2018-12-18 16:44:41 +08002128 EXPECT_TRUE(fd1 != -1);
2129 EXPECT_EQ(std::cv_status::no_timeout, cv.wait_for(lk, std::chrono::seconds(1)));
2130 }
Luke Huang94b10b92018-11-21 20:13:38 +08002131
Luke Huang94b10b92018-11-21 20:13:38 +08002132 dns.setResponseProbability(0.0);
Luke Huang94b10b92018-11-21 20:13:38 +08002133
Luke Huangba7bef92018-12-26 16:53:03 +08002134 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002135 EXPECT_TRUE(fd2 != -1);
2136
Luke Huangba7bef92018-12-26 16:53:03 +08002137 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002138 EXPECT_TRUE(fd3 != -1);
2139
Luke Huang9c264bb2018-12-18 16:44:41 +08002140 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002141 int rcode;
2142
Luke Huang9c264bb2018-12-18 16:44:41 +08002143 // expect no response
2144 int res = getAsyncResponse(fd3, &rcode, buf, MAXPACKET);
2145 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huang94b10b92018-11-21 20:13:38 +08002146
Luke Huang9c264bb2018-12-18 16:44:41 +08002147 // expect no response
Luke Huang94b10b92018-11-21 20:13:38 +08002148 memset(buf, 0, MAXPACKET);
Luke Huang9c264bb2018-12-18 16:44:41 +08002149 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2150 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huang94b10b92018-11-21 20:13:38 +08002151
Luke Huang94b10b92018-11-21 20:13:38 +08002152 dns.setResponseProbability(1.0);
Luke Huang94b10b92018-11-21 20:13:38 +08002153
Luke Huangba7bef92018-12-26 16:53:03 +08002154 int fd4 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002155 EXPECT_TRUE(fd4 != -1);
2156
2157 memset(buf, 0, MAXPACKET);
2158 res = getAsyncResponse(fd4, &rcode, buf, MAXPACKET);
2159 EXPECT_GT(res, 0);
2160 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2161
2162 memset(buf, 0, MAXPACKET);
2163 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2164 EXPECT_GT(res, 0);
2165 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
2166}
2167
2168TEST_F(ResolverTest, Async_MalformedQuery) {
Xiao Ma09b71022018-12-11 17:56:32 +09002169 constexpr char listen_addr[] = "127.0.0.4";
2170 constexpr char host_name[] = "howdy.example.com.";
2171 const std::vector<DnsRecord> records = {
2172 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2173 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2174 };
2175
2176 test::DNSResponder dns(listen_addr);
2177 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002178 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002179 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002180
2181 int fd = dns_open_proxy();
2182 EXPECT_TRUE(fd > 0);
2183
2184 const std::string badMsg = "16-52512#";
Xiao Ma09b71022018-12-11 17:56:32 +09002185 static const struct {
Luke Huang94b10b92018-11-21 20:13:38 +08002186 const std::string cmd;
2187 const int expectErr;
2188 } kTestData[] = {
Luke Huangba7bef92018-12-26 16:53:03 +08002189 // Too few arguments
Luke Huang94b10b92018-11-21 20:13:38 +08002190 {"resnsend " + badMsg + '\0', -EINVAL},
2191 // Bad netId
Luke Huangba7bef92018-12-26 16:53:03 +08002192 {"resnsend badnetId 0 " + badMsg + '\0', -EINVAL},
Luke Huang94b10b92018-11-21 20:13:38 +08002193 // Bad raw data
Luke Huangba7bef92018-12-26 16:53:03 +08002194 {"resnsend " + std::to_string(TEST_NETID) + " 0 " + badMsg + '\0', -EILSEQ},
Luke Huang94b10b92018-11-21 20:13:38 +08002195 };
2196
2197 for (unsigned int i = 0; i < std::size(kTestData); i++) {
2198 auto& td = kTestData[i];
2199 SCOPED_TRACE(td.cmd);
2200 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, td.cmd.c_str(), td.cmd.size()));
2201 EXPECT_EQ(rc, static_cast<ssize_t>(td.cmd.size()));
2202
2203 int32_t tmp;
2204 rc = TEMP_FAILURE_RETRY(read(fd, &tmp, sizeof(tmp)));
2205 EXPECT_TRUE(rc > 0);
2206 EXPECT_EQ(static_cast<int>(ntohl(tmp)), td.expectErr);
2207 }
2208 // Normal query with answer buffer
2209 // This is raw data of query "howdy.example.com" type 1 class 1
2210 std::string query = "81sBAAABAAAAAAAABWhvd2R5B2V4YW1wbGUDY29tAAABAAE=";
Luke Huangba7bef92018-12-26 16:53:03 +08002211 std::string cmd = "resnsend " + std::to_string(TEST_NETID) + " 0 " + query + '\0';
Luke Huang94b10b92018-11-21 20:13:38 +08002212 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
2213 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
2214
Luke Huang70931aa2019-01-31 11:57:41 +08002215 uint8_t smallBuf[1] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002216 int rcode;
2217 rc = getAsyncResponse(fd, &rcode, smallBuf, 1);
Luke Huangba7bef92018-12-26 16:53:03 +08002218 EXPECT_EQ(-EMSGSIZE, rc);
Luke Huang94b10b92018-11-21 20:13:38 +08002219
2220 // Do the normal test with large buffer again
2221 fd = dns_open_proxy();
2222 EXPECT_TRUE(fd > 0);
2223 rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
2224 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
Luke Huang70931aa2019-01-31 11:57:41 +08002225 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002226 rc = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2227 EXPECT_EQ("1.2.3.4", toString(buf, rc, AF_INET));
Mike Yu4f3747b2018-12-02 17:54:29 +09002228}
2229
Luke Huangba7bef92018-12-26 16:53:03 +08002230TEST_F(ResolverTest, Async_CacheFlags) {
Xiao Ma09b71022018-12-11 17:56:32 +09002231 constexpr char listen_addr[] = "127.0.0.4";
2232 constexpr char host_name[] = "howdy.example.com.";
Luke Huang40f5f492019-05-09 19:37:35 +08002233 constexpr char another_host_name[] = "howdy.example2.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002234 const std::vector<DnsRecord> records = {
2235 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2236 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
Luke Huang40f5f492019-05-09 19:37:35 +08002237 {another_host_name, ns_type::ns_t_a, "1.2.3.5"},
2238 {another_host_name, ns_type::ns_t_aaaa, "::1.2.3.5"},
Xiao Ma09b71022018-12-11 17:56:32 +09002239 };
2240
2241 test::DNSResponder dns(listen_addr);
2242 StartDns(dns, records);
Luke Huangba7bef92018-12-26 16:53:03 +08002243 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002244 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huangba7bef92018-12-26 16:53:03 +08002245
2246 // ANDROID_RESOLV_NO_CACHE_STORE
2247 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2248 ANDROID_RESOLV_NO_CACHE_STORE);
2249 EXPECT_TRUE(fd1 != -1);
2250 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2251 ANDROID_RESOLV_NO_CACHE_STORE);
2252 EXPECT_TRUE(fd2 != -1);
2253 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2254 ANDROID_RESOLV_NO_CACHE_STORE);
2255 EXPECT_TRUE(fd3 != -1);
2256
2257 expectAnswersValid(fd3, AF_INET, "1.2.3.4");
2258 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
2259 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2260
2261 // No cache exists, expect 3 queries
2262 EXPECT_EQ(3U, GetNumQueries(dns, host_name));
2263
2264 // Re-query and cache
2265 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2266
2267 EXPECT_TRUE(fd1 != -1);
2268
2269 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2270
2271 // Now we have cache, expect 4 queries
2272 EXPECT_EQ(4U, GetNumQueries(dns, host_name));
2273
2274 // ANDROID_RESOLV_NO_CACHE_LOOKUP
2275 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2276 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2277 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2278 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2279
2280 EXPECT_TRUE(fd1 != -1);
2281 EXPECT_TRUE(fd2 != -1);
2282
2283 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
2284 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2285
2286 // Skip cache, expect 6 queries
2287 EXPECT_EQ(6U, GetNumQueries(dns, host_name));
2288
2289 // Re-query verify cache works
2290 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2291 ANDROID_RESOLV_NO_CACHE_STORE);
2292 EXPECT_TRUE(fd1 != -1);
2293 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2294
2295 // Cache hits, expect still 6 queries
2296 EXPECT_EQ(6U, GetNumQueries(dns, host_name));
Luke Huanga1d74182019-03-19 17:30:36 +08002297
2298 // Start to verify if ANDROID_RESOLV_NO_CACHE_LOOKUP does write response into cache
2299 dns.clearQueries();
2300
2301 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa,
2302 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2303 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa,
2304 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2305
2306 EXPECT_TRUE(fd1 != -1);
2307 EXPECT_TRUE(fd2 != -1);
2308
2309 expectAnswersValid(fd2, AF_INET6, "::1.2.3.4");
2310 expectAnswersValid(fd1, AF_INET6, "::1.2.3.4");
2311
2312 // Skip cache, expect 2 queries
2313 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
2314
2315 // Re-query without flags
2316 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
2317 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
2318
2319 EXPECT_TRUE(fd1 != -1);
2320 EXPECT_TRUE(fd2 != -1);
2321
2322 expectAnswersValid(fd2, AF_INET6, "::1.2.3.4");
2323 expectAnswersValid(fd1, AF_INET6, "::1.2.3.4");
2324
2325 // Cache hits, expect still 2 queries
2326 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
Luke Huang40f5f492019-05-09 19:37:35 +08002327
2328 // Test both ANDROID_RESOLV_NO_CACHE_STORE and ANDROID_RESOLV_NO_CACHE_LOOKUP are set
2329 dns.clearQueries();
2330
2331 // Make sure that the cache of "howdy.example2.com" exists.
2332 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa, 0);
2333 EXPECT_TRUE(fd1 != -1);
2334 expectAnswersValid(fd1, AF_INET6, "::1.2.3.5");
2335 EXPECT_EQ(1U, GetNumQueries(dns, another_host_name));
2336
2337 // Re-query with testFlags
2338 const int testFlag = ANDROID_RESOLV_NO_CACHE_STORE | ANDROID_RESOLV_NO_CACHE_LOOKUP;
2339 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa, testFlag);
2340 EXPECT_TRUE(fd1 != -1);
2341 expectAnswersValid(fd1, AF_INET6, "::1.2.3.5");
2342 // Expect cache lookup is skipped.
2343 EXPECT_EQ(2U, GetNumQueries(dns, another_host_name));
2344
2345 // Do another query with testFlags
2346 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_a, testFlag);
2347 EXPECT_TRUE(fd1 != -1);
2348 expectAnswersValid(fd1, AF_INET, "1.2.3.5");
2349 // Expect cache lookup is skipped.
2350 EXPECT_EQ(3U, GetNumQueries(dns, another_host_name));
2351
2352 // Re-query with no flags
2353 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_a, 0);
2354 EXPECT_TRUE(fd1 != -1);
2355 expectAnswersValid(fd1, AF_INET, "1.2.3.5");
2356 // Expect no cache hit because cache storing is also skipped in previous query.
2357 EXPECT_EQ(4U, GetNumQueries(dns, another_host_name));
Luke Huangba7bef92018-12-26 16:53:03 +08002358}
2359
Luke Huang08b13d22020-02-05 14:46:21 +08002360TEST_F(ResolverTest, Async_NoCacheStoreFlagDoesNotRefreshStaleCacheEntry) {
2361 constexpr char listen_addr[] = "127.0.0.4";
2362 constexpr char host_name[] = "howdy.example.com.";
2363 const std::vector<DnsRecord> records = {
2364 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2365 };
2366
2367 test::DNSResponder dns(listen_addr);
2368 StartDns(dns, records);
2369 std::vector<std::string> servers = {listen_addr};
2370 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
2371
2372 const unsigned SHORT_TTL_SEC = 1;
2373 dns.setTtl(SHORT_TTL_SEC);
2374
2375 // Refer to b/148842821 for the purpose of below test steps.
2376 // Basically, this test is used to ensure stale cache case is handled
2377 // correctly with ANDROID_RESOLV_NO_CACHE_STORE.
2378 int fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2379 EXPECT_TRUE(fd != -1);
2380 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2381
2382 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2383 dns.clearQueries();
2384
2385 // Wait until cache expired
2386 sleep(SHORT_TTL_SEC + 0.5);
2387
2388 // Now request the same hostname again.
2389 // We should see a new DNS query because the entry in cache has become stale.
2390 // Due to ANDROID_RESOLV_NO_CACHE_STORE, this query must *not* refresh that stale entry.
2391 fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2392 ANDROID_RESOLV_NO_CACHE_STORE);
2393 EXPECT_TRUE(fd != -1);
2394 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2395 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2396 dns.clearQueries();
2397
2398 // If the cache is still stale, we expect to see one more DNS query
2399 // (this time the cache will be refreshed, but we're not checking for it).
2400 fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2401 EXPECT_TRUE(fd != -1);
2402 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2403 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2404}
2405
Luke Huangba7bef92018-12-26 16:53:03 +08002406TEST_F(ResolverTest, Async_NoRetryFlag) {
Luke Huang70931aa2019-01-31 11:57:41 +08002407 constexpr char listen_addr0[] = "127.0.0.4";
2408 constexpr char listen_addr1[] = "127.0.0.6";
Xiao Ma09b71022018-12-11 17:56:32 +09002409 constexpr char host_name[] = "howdy.example.com.";
2410 const std::vector<DnsRecord> records = {
2411 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2412 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2413 };
2414
Luke Huang70931aa2019-01-31 11:57:41 +08002415 test::DNSResponder dns0(listen_addr0);
2416 test::DNSResponder dns1(listen_addr1);
2417 StartDns(dns0, records);
2418 StartDns(dns1, records);
2419 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr0, listen_addr1}));
Luke Huangba7bef92018-12-26 16:53:03 +08002420
Luke Huang70931aa2019-01-31 11:57:41 +08002421 dns0.clearQueries();
2422 dns1.clearQueries();
2423
2424 dns0.setResponseProbability(0.0);
2425 dns1.setResponseProbability(0.0);
Luke Huangba7bef92018-12-26 16:53:03 +08002426
2427 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2428 ANDROID_RESOLV_NO_RETRY);
2429 EXPECT_TRUE(fd1 != -1);
2430
2431 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa,
2432 ANDROID_RESOLV_NO_RETRY);
2433 EXPECT_TRUE(fd2 != -1);
2434
2435 // expect no response
2436 expectAnswersNotValid(fd1, -ETIMEDOUT);
2437 expectAnswersNotValid(fd2, -ETIMEDOUT);
2438
Luke Huang70931aa2019-01-31 11:57:41 +08002439 // No retry case, expect total 2 queries. The server is selected randomly.
2440 EXPECT_EQ(2U, GetNumQueries(dns0, host_name) + GetNumQueries(dns1, host_name));
Luke Huangba7bef92018-12-26 16:53:03 +08002441
Luke Huang70931aa2019-01-31 11:57:41 +08002442 dns0.clearQueries();
2443 dns1.clearQueries();
Luke Huangba7bef92018-12-26 16:53:03 +08002444
2445 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2446 EXPECT_TRUE(fd1 != -1);
2447
2448 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
2449 EXPECT_TRUE(fd2 != -1);
2450
2451 // expect no response
2452 expectAnswersNotValid(fd1, -ETIMEDOUT);
2453 expectAnswersNotValid(fd2, -ETIMEDOUT);
2454
2455 // Retry case, expect 4 queries
Luke Huang70931aa2019-01-31 11:57:41 +08002456 EXPECT_EQ(4U, GetNumQueries(dns0, host_name));
2457 EXPECT_EQ(4U, GetNumQueries(dns1, host_name));
2458}
2459
2460TEST_F(ResolverTest, Async_VerifyQueryID) {
2461 constexpr char listen_addr[] = "127.0.0.4";
2462 constexpr char host_name[] = "howdy.example.com.";
2463 const std::vector<DnsRecord> records = {
2464 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2465 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2466 };
2467
2468 test::DNSResponder dns(listen_addr);
2469 StartDns(dns, records);
2470 std::vector<std::string> servers = {listen_addr};
2471 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
2472
2473 const uint8_t queryBuf1[] = {
2474 /* Header */
2475 0x55, 0x66, /* Transaction ID */
2476 0x01, 0x00, /* Flags */
2477 0x00, 0x01, /* Questions */
2478 0x00, 0x00, /* Answer RRs */
2479 0x00, 0x00, /* Authority RRs */
2480 0x00, 0x00, /* Additional RRs */
2481 /* Queries */
2482 0x05, 0x68, 0x6f, 0x77, 0x64, 0x79, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
2483 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name */
2484 0x00, 0x01, /* Type */
2485 0x00, 0x01 /* Class */
2486 };
2487
2488 int fd = resNetworkSend(TEST_NETID, queryBuf1, sizeof(queryBuf1), 0);
2489 EXPECT_TRUE(fd != -1);
2490
2491 uint8_t buf[MAXPACKET] = {};
2492 int rcode;
2493
2494 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2495 EXPECT_GT(res, 0);
2496 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2497
2498 auto hp = reinterpret_cast<HEADER*>(buf);
2499 EXPECT_EQ(21862U, htons(hp->id));
2500
2501 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2502
2503 const uint8_t queryBuf2[] = {
2504 /* Header */
2505 0x00, 0x53, /* Transaction ID */
2506 0x01, 0x00, /* Flags */
2507 0x00, 0x01, /* Questions */
2508 0x00, 0x00, /* Answer RRs */
2509 0x00, 0x00, /* Authority RRs */
2510 0x00, 0x00, /* Additional RRs */
2511 /* Queries */
2512 0x05, 0x68, 0x6f, 0x77, 0x64, 0x79, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
2513 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name */
2514 0x00, 0x01, /* Type */
2515 0x00, 0x01 /* Class */
2516 };
2517
2518 // Re-query verify cache works and query id is correct
2519 fd = resNetworkSend(TEST_NETID, queryBuf2, sizeof(queryBuf2), 0);
2520
2521 EXPECT_TRUE(fd != -1);
2522
2523 res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2524 EXPECT_GT(res, 0);
2525 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2526
2527 EXPECT_EQ(0x0053U, htons(hp->id));
2528
2529 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
Luke Huangba7bef92018-12-26 16:53:03 +08002530}
2531
Mike Yu4f3747b2018-12-02 17:54:29 +09002532// This test checks that the resolver should not generate the request containing OPT RR when using
Ken Chen0a015532019-01-02 14:59:38 +08002533// cleartext DNS. If we query the DNS server not supporting EDNS0 and it reponds with
2534// FORMERR_ON_EDNS, we will fallback to no EDNS0 and try again. If the server does no response, we
2535// won't retry so that we get no answer.
Mike Yu4f3747b2018-12-02 17:54:29 +09002536TEST_F(ResolverTest, BrokenEdns) {
2537 typedef test::DNSResponder::Edns Edns;
2538 enum ExpectResult { EXPECT_FAILURE, EXPECT_SUCCESS };
2539
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002540 // Perform cleartext query in off mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002541 const char OFF[] = "off";
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002542
2543 // Perform cleartext query when there's no private DNS server validated in opportunistic mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002544 const char OPPORTUNISTIC_UDP[] = "opportunistic_udp";
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002545
2546 // Perform cleartext query when there is a private DNS server validated in opportunistic mode.
2547 const char OPPORTUNISTIC_FALLBACK_UDP[] = "opportunistic_fallback_udp";
2548
2549 // Perform cyphertext query in opportunistic mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002550 const char OPPORTUNISTIC_TLS[] = "opportunistic_tls";
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002551
2552 // Perform cyphertext query in strict mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002553 const char STRICT[] = "strict";
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002554
Mike Yu4f3747b2018-12-02 17:54:29 +09002555 const char GETHOSTBYNAME[] = "gethostbyname";
2556 const char GETADDRINFO[] = "getaddrinfo";
Mike Yu4f3747b2018-12-02 17:54:29 +09002557 const char ADDR4[] = "192.0.2.1";
2558 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2559 const char CLEARTEXT_PORT[] = "53";
2560 const char TLS_PORT[] = "853";
Luke Huangf8215372019-11-22 11:53:41 +08002561 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002562 ResolverParamsParcel paramsForCleanup = DnsResponderClient::GetDefaultResolverParamsParcel();
2563 paramsForCleanup.servers.clear();
2564 paramsForCleanup.tlsServers.clear();
Mike Yu4f3747b2018-12-02 17:54:29 +09002565
Mike Yufc125e42019-05-15 20:41:28 +08002566 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Mike Yu4f3747b2018-12-02 17:54:29 +09002567 ASSERT_TRUE(dns.startServer());
2568
2569 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2570
Luke Huangf8215372019-11-22 11:53:41 +08002571 // clang-format off
Mike Yu4f3747b2018-12-02 17:54:29 +09002572 static const struct TestConfig {
2573 std::string mode;
2574 std::string method;
2575 Edns edns;
2576 ExpectResult expectResult;
2577
2578 std::string asHostName() const {
2579 const char* ednsString;
2580 switch (edns) {
2581 case Edns::ON:
2582 ednsString = "ednsOn";
2583 break;
Ken Chen0a015532019-01-02 14:59:38 +08002584 case Edns::FORMERR_ON_EDNS:
Mike Yu4f3747b2018-12-02 17:54:29 +09002585 ednsString = "ednsFormerr";
2586 break;
2587 case Edns::DROP:
2588 ednsString = "ednsDrop";
2589 break;
2590 default:
2591 ednsString = "";
2592 break;
2593 }
2594 return StringPrintf("%s.%s.%s.", mode.c_str(), method.c_str(), ednsString);
2595 }
2596 } testConfigs[] = {
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002597 // In OPPORTUNISTIC_TLS, if the DNS server doesn't support EDNS0 but TLS, the lookup
2598 // fails. Could such server exist? if so, we might need to fix it to fallback to
2599 // cleartext query. If the server still make no response for the queries with EDNS0, we
2600 // might also need to fix it to retry without EDNS0.
Mike Yu4f3747b2018-12-02 17:54:29 +09002601 // Another thing is that {OPPORTUNISTIC_TLS, Edns::DROP} and {STRICT, Edns::DROP} are
2602 // commented out since TLS timeout is not configurable.
2603 // TODO: Uncomment them after TLS timeout is configurable.
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002604 {OFF, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2605 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2606 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2607 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2608 {STRICT, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2609 {OFF, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2610 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2611 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2612 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2613 {STRICT, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2614 {OFF, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2615 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2616
2617 // The failure is due to no retry on timeout. Maybe fix it?
2618 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2619
2620 //{OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2621 //{STRICT, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2622 {OFF, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2623 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2624 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2625 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2626 {STRICT, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2627 {OFF, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2628 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2629 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2630 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2631 {STRICT, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2632 {OFF, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2633 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2634
2635 // The failure is due to no retry on timeout. Maybe fix it?
2636 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2637
Mike Yu4f3747b2018-12-02 17:54:29 +09002638 //{OPPORTUNISTIC_TLS, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2639 //{STRICT, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2640 };
Luke Huangf8215372019-11-22 11:53:41 +08002641 // clang-format on
Mike Yu4f3747b2018-12-02 17:54:29 +09002642
2643 for (const auto& config : testConfigs) {
2644 const std::string testHostName = config.asHostName();
2645 SCOPED_TRACE(testHostName);
2646
2647 const char* host_name = testHostName.c_str();
2648 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
2649 dns.setEdns(config.edns);
2650
2651 if (config.mode == OFF) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002652 if (tls.running()) {
2653 ASSERT_TRUE(tls.stopServer());
2654 }
Xiao Ma09b71022018-12-11 17:56:32 +09002655 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Mike Yu4f3747b2018-12-02 17:54:29 +09002656 } else if (config.mode == OPPORTUNISTIC_UDP) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002657 if (tls.running()) {
2658 ASSERT_TRUE(tls.stopServer());
2659 }
Xiao Ma09b71022018-12-11 17:56:32 +09002660 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002661 kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002662 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), false));
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002663 } else if (config.mode == OPPORTUNISTIC_TLS || config.mode == OPPORTUNISTIC_FALLBACK_UDP) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002664 if (!tls.running()) {
2665 ASSERT_TRUE(tls.startServer());
2666 }
Xiao Ma09b71022018-12-11 17:56:32 +09002667 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002668 kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002669 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002670
2671 if (config.mode == OPPORTUNISTIC_FALLBACK_UDP) {
2672 // Force the resolver to fallback to cleartext queries.
2673 ASSERT_TRUE(tls.stopServer());
2674 }
Mike Yu4f3747b2018-12-02 17:54:29 +09002675 } else if (config.mode == STRICT) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002676 if (!tls.running()) {
2677 ASSERT_TRUE(tls.startServer());
2678 }
Xiao Ma09b71022018-12-11 17:56:32 +09002679 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002680 kDefaultParams, kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08002681 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Mike Yu4f3747b2018-12-02 17:54:29 +09002682 }
2683
2684 if (config.method == GETHOSTBYNAME) {
2685 const hostent* h_result = gethostbyname(host_name);
2686 if (config.expectResult == EXPECT_SUCCESS) {
2687 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2688 ASSERT_TRUE(h_result != nullptr);
2689 ASSERT_EQ(4, h_result->h_length);
2690 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
2691 EXPECT_EQ(ADDR4, ToString(h_result));
2692 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
2693 } else {
2694 EXPECT_EQ(0U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
2695 ASSERT_TRUE(h_result == nullptr);
2696 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2697 }
2698 } else if (config.method == GETADDRINFO) {
2699 ScopedAddrinfo ai_result;
2700 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2701 ai_result = safe_getaddrinfo(host_name, nullptr, &hints);
2702 if (config.expectResult == EXPECT_SUCCESS) {
2703 EXPECT_TRUE(ai_result != nullptr);
2704 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2705 const std::string result_str = ToString(ai_result);
2706 EXPECT_EQ(ADDR4, result_str);
2707 } else {
2708 EXPECT_TRUE(ai_result == nullptr);
2709 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
2710 }
2711 } else {
2712 FAIL() << "Unsupported query method: " << config.method;
2713 }
2714
Mike Yudd4ac2d2019-05-31 16:52:11 +08002715 tls.clearQueries();
Mike Yu4f3747b2018-12-02 17:54:29 +09002716 dns.clearQueries();
Automerger Merge Worker9a495be2020-03-05 14:07:09 +00002717
2718 // Clear the setup to force the resolver to validate private DNS servers in every test.
2719 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(paramsForCleanup));
Mike Yu4f3747b2018-12-02 17:54:29 +09002720 }
Mike Yu4f3747b2018-12-02 17:54:29 +09002721}
nuccachena26cc2a2018-07-17 18:07:23 +08002722
Ken Chen0a015532019-01-02 14:59:38 +08002723// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2724// Resolver should have a reasonable number of retries instead of spinning forever. We don't have
2725// an efficient way to know if resolver is stuck in an infinite loop. However, test case will be
2726// failed due to timeout.
2727TEST_F(ResolverTest, UnstableTls) {
2728 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2729 const char CLEARTEXT_PORT[] = "53";
2730 const char TLS_PORT[] = "853";
2731 const char* host_name1 = "nonexistent1.example.com.";
2732 const char* host_name2 = "nonexistent2.example.com.";
2733 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
2734
Mike Yufc125e42019-05-15 20:41:28 +08002735 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Ken Chen0a015532019-01-02 14:59:38 +08002736 ASSERT_TRUE(dns.startServer());
2737 dns.setEdns(test::DNSResponder::Edns::FORMERR_ON_EDNS);
2738 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2739 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08002740 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002741 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
2742
Ken Chen0a015532019-01-02 14:59:38 +08002743 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
2744 tls.stopServer();
2745
2746 const hostent* h_result = gethostbyname(host_name1);
2747 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
2748 ASSERT_TRUE(h_result == nullptr);
2749 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2750
2751 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2752 ScopedAddrinfo ai_result = safe_getaddrinfo(host_name2, nullptr, &hints);
2753 EXPECT_TRUE(ai_result == nullptr);
2754 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
2755}
2756
2757// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2758// Moreover, server responds RCODE=FORMERR even on non-EDNS query.
2759TEST_F(ResolverTest, BogusDnsServer) {
2760 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2761 const char CLEARTEXT_PORT[] = "53";
2762 const char TLS_PORT[] = "853";
2763 const char* host_name1 = "nonexistent1.example.com.";
2764 const char* host_name2 = "nonexistent2.example.com.";
2765 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
2766
Mike Yufc125e42019-05-15 20:41:28 +08002767 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Ken Chen0a015532019-01-02 14:59:38 +08002768 ASSERT_TRUE(dns.startServer());
2769 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2770 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08002771 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002772 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
2773
Ken Chen0a015532019-01-02 14:59:38 +08002774 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
2775 tls.stopServer();
2776 dns.setEdns(test::DNSResponder::Edns::FORMERR_UNCOND);
2777
2778 const hostent* h_result = gethostbyname(host_name1);
2779 EXPECT_EQ(0U, GetNumQueries(dns, host_name1));
2780 ASSERT_TRUE(h_result == nullptr);
2781 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2782
2783 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2784 ScopedAddrinfo ai_result = safe_getaddrinfo(host_name2, nullptr, &hints);
2785 EXPECT_TRUE(ai_result == nullptr);
2786 EXPECT_EQ(0U, GetNumQueries(dns, host_name2));
2787}
2788
nuccachena26cc2a2018-07-17 18:07:23 +08002789TEST_F(ResolverTest, GetAddrInfo_Dns64Synthesize) {
2790 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002791 constexpr char dns64_name[] = "ipv4only.arpa.";
2792 constexpr char host_name[] = "v4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002793 const std::vector<DnsRecord> records = {
2794 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2795 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2796 };
nuccachena26cc2a2018-07-17 18:07:23 +08002797
Xiao Ma09b71022018-12-11 17:56:32 +09002798 test::DNSResponder dns(listen_addr);
Xiao Ma09b71022018-12-11 17:56:32 +09002799 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002800
2801 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002802 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002803
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002804 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002805 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002806 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002807
2808 // hints are necessary in order to let netd know which type of addresses the caller is
2809 // interested in.
Xiao Ma09b71022018-12-11 17:56:32 +09002810 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08002811 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
2812 EXPECT_TRUE(result != nullptr);
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002813 // TODO: BUG: there should only be two queries, one AAAA (which returns no records) and one A
2814 // (which returns 1.2.3.4). But there is an extra AAAA.
2815 EXPECT_EQ(3U, GetNumQueries(dns, host_name));
nuccachena26cc2a2018-07-17 18:07:23 +08002816
2817 std::string result_str = ToString(result);
2818 EXPECT_EQ(result_str, "64:ff9b::102:304");
2819
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002820 // Stopping NAT64 prefix discovery disables synthesis.
Luke Huang5bd827c2019-03-14 16:10:04 +08002821 EXPECT_TRUE(mDnsClient.resolvService()->stopPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002822 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_NOT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002823
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002824 dns.clearQueries();
nuccachena26cc2a2018-07-17 18:07:23 +08002825
2826 result = safe_getaddrinfo("v4only", nullptr, &hints);
2827 EXPECT_TRUE(result != nullptr);
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002828 // TODO: BUG: there should only be one query, an AAAA (which returns no records), because the
2829 // A is already cached. But there is an extra AAAA.
2830 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
nuccachena26cc2a2018-07-17 18:07:23 +08002831
2832 result_str = ToString(result);
2833 EXPECT_EQ(result_str, "1.2.3.4");
2834}
2835
nuccachena26cc2a2018-07-17 18:07:23 +08002836TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecified) {
2837 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002838 constexpr char dns64_name[] = "ipv4only.arpa.";
2839 constexpr char host_name[] = "v4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002840 const std::vector<DnsRecord> records = {
2841 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2842 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2843 };
nuccachena26cc2a2018-07-17 18:07:23 +08002844
Xiao Ma09b71022018-12-11 17:56:32 +09002845 test::DNSResponder dns(listen_addr);
2846 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002847 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002848 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002849
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002850 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002851 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002852 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002853
2854 // Ensure to synthesize AAAA if AF_INET6 is specified, and not to synthesize AAAA
2855 // in AF_INET case.
2856 addrinfo hints;
2857 memset(&hints, 0, sizeof(hints));
2858 hints.ai_family = AF_INET6;
2859 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
2860 EXPECT_TRUE(result != nullptr);
2861 std::string result_str = ToString(result);
2862 EXPECT_EQ(result_str, "64:ff9b::102:304");
2863
2864 hints.ai_family = AF_INET;
2865 result = safe_getaddrinfo("v4only", nullptr, &hints);
2866 EXPECT_TRUE(result != nullptr);
2867 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2868 result_str = ToString(result);
2869 EXPECT_EQ(result_str, "1.2.3.4");
2870}
nuccachena26cc2a2018-07-17 18:07:23 +08002871
2872TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedV6) {
2873 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002874 constexpr char dns64_name[] = "ipv4only.arpa.";
2875 constexpr char host_name[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002876 const std::vector<DnsRecord> records = {
2877 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2878 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2879 {host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
2880 };
nuccachena26cc2a2018-07-17 18:07:23 +08002881
Xiao Ma09b71022018-12-11 17:56:32 +09002882 test::DNSResponder dns(listen_addr);
2883 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002884 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002885 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002886
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002887 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002888 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002889 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002890
Xiao Ma09b71022018-12-11 17:56:32 +09002891 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08002892 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
2893 EXPECT_TRUE(result != nullptr);
2894 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2895
2896 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
Xiao Ma09b71022018-12-11 17:56:32 +09002897 const std::vector<std::string> result_strs = ToStrings(result);
nuccachena26cc2a2018-07-17 18:07:23 +08002898 for (const auto& str : result_strs) {
2899 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
2900 << ", result_str='" << str << "'";
2901 }
2902}
2903
2904TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedNoV6) {
2905 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002906 constexpr char dns64_name[] = "ipv4only.arpa.";
2907 constexpr char host_name[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002908 const std::vector<DnsRecord> records = {
2909 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2910 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2911 };
nuccachena26cc2a2018-07-17 18:07:23 +08002912
Xiao Ma09b71022018-12-11 17:56:32 +09002913 test::DNSResponder dns(listen_addr);
2914 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002915 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002916 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002917
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002918 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002919 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002920 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002921
Xiao Ma09b71022018-12-11 17:56:32 +09002922 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08002923 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
2924 EXPECT_TRUE(result != nullptr);
2925 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2926
2927 // In AF_UNSPEC case, synthesize AAAA if there's no AAAA answer.
2928 std::string result_str = ToString(result);
2929 EXPECT_EQ(result_str, "64:ff9b::102:304");
2930}
2931
2932TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecialUseIPv4Addresses) {
2933 constexpr char THIS_NETWORK[] = "this_network";
2934 constexpr char LOOPBACK[] = "loopback";
2935 constexpr char LINK_LOCAL[] = "link_local";
2936 constexpr char MULTICAST[] = "multicast";
2937 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
2938
2939 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
2940 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
2941 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
2942 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
2943 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
2944
2945 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002946 constexpr char dns64_name[] = "ipv4only.arpa.";
2947
Xiao Ma09b71022018-12-11 17:56:32 +09002948 test::DNSResponder dns(listen_addr);
2949 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08002950 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002951 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002952
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002953 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002954 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002955 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002956
Luke Huangf8215372019-11-22 11:53:41 +08002957 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08002958 static const struct TestConfig {
2959 std::string name;
2960 std::string addr;
2961
2962 std::string asHostName() const { return StringPrintf("%s.example.com.", name.c_str()); }
2963 } testConfigs[]{
2964 {THIS_NETWORK, ADDR_THIS_NETWORK},
2965 {LOOPBACK, ADDR_LOOPBACK},
2966 {LINK_LOCAL, ADDR_LINK_LOCAL},
2967 {MULTICAST, ADDR_MULTICAST},
2968 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
2969 };
Luke Huangf8215372019-11-22 11:53:41 +08002970 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08002971
2972 for (const auto& config : testConfigs) {
2973 const std::string testHostName = config.asHostName();
2974 SCOPED_TRACE(testHostName);
2975
2976 const char* host_name = testHostName.c_str();
2977 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
2978
2979 addrinfo hints;
2980 memset(&hints, 0, sizeof(hints));
2981 hints.ai_family = AF_INET6;
2982 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
2983 // In AF_INET6 case, don't return IPv4 answers
2984 EXPECT_TRUE(result == nullptr);
2985 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2986 dns.clearQueries();
2987
2988 memset(&hints, 0, sizeof(hints));
2989 hints.ai_family = AF_UNSPEC;
2990 result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
2991 EXPECT_TRUE(result != nullptr);
2992 // Expect IPv6 query only. IPv4 answer has been cached in previous query.
2993 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2994 // In AF_UNSPEC case, don't synthesize special use IPv4 address.
2995 std::string result_str = ToString(result);
2996 EXPECT_EQ(result_str, config.addr.c_str());
2997 dns.clearQueries();
2998 }
2999}
3000
3001TEST_F(ResolverTest, GetAddrInfo_Dns64QueryWithNullArgumentHints) {
3002 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003003 constexpr char dns64_name[] = "ipv4only.arpa.";
3004 constexpr char host_name[] = "v4only.example.com.";
3005 constexpr char host_name2[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003006 const std::vector<DnsRecord> records = {
3007 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3008 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3009 {host_name2, ns_type::ns_t_a, "1.2.3.4"},
3010 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
3011 };
nuccachena26cc2a2018-07-17 18:07:23 +08003012
Xiao Ma09b71022018-12-11 17:56:32 +09003013 test::DNSResponder dns(listen_addr);
3014 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003015 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003016 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003017
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003018 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003019 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003020 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003021
3022 // Assign argument hints of getaddrinfo() as null is equivalent to set ai_family AF_UNSPEC.
3023 // In AF_UNSPEC case, synthesize AAAA if there has A answer only.
3024 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, nullptr);
3025 EXPECT_TRUE(result != nullptr);
3026 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3027 std::string result_str = ToString(result);
3028 EXPECT_EQ(result_str, "64:ff9b::102:304");
3029 dns.clearQueries();
3030
3031 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
3032 result = safe_getaddrinfo("v4v6", nullptr, nullptr);
3033 EXPECT_TRUE(result != nullptr);
3034 EXPECT_LE(2U, GetNumQueries(dns, host_name2));
3035 std::vector<std::string> result_strs = ToStrings(result);
3036 for (const auto& str : result_strs) {
3037 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
3038 << ", result_str='" << str << "'";
3039 }
3040}
3041
3042TEST_F(ResolverTest, GetAddrInfo_Dns64QueryNullArgumentNode) {
3043 constexpr char ADDR_ANYADDR_V4[] = "0.0.0.0";
3044 constexpr char ADDR_ANYADDR_V6[] = "::";
3045 constexpr char ADDR_LOCALHOST_V4[] = "127.0.0.1";
3046 constexpr char ADDR_LOCALHOST_V6[] = "::1";
3047
3048 constexpr char PORT_NAME_HTTP[] = "http";
3049 constexpr char PORT_NUMBER_HTTP[] = "80";
3050
3051 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003052 constexpr char dns64_name[] = "ipv4only.arpa.";
3053
Xiao Ma09b71022018-12-11 17:56:32 +09003054 test::DNSResponder dns(listen_addr);
3055 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003056 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003057 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003058
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003059 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003060 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003061 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003062
Luke Huangf8215372019-11-22 11:53:41 +08003063 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003064 // If node is null, return address is listed by libc/getaddrinfo.c as follows.
3065 // - passive socket -> anyaddr (0.0.0.0 or ::)
3066 // - non-passive socket -> localhost (127.0.0.1 or ::1)
3067 static const struct TestConfig {
3068 int flag;
3069 std::string addr_v4;
3070 std::string addr_v6;
3071
3072 std::string asParameters() const {
3073 return StringPrintf("flag=%d, addr_v4=%s, addr_v6=%s", flag, addr_v4.c_str(),
3074 addr_v6.c_str());
3075 }
3076 } testConfigs[]{
3077 {0 /* non-passive */, ADDR_LOCALHOST_V4, ADDR_LOCALHOST_V6},
3078 {AI_PASSIVE, ADDR_ANYADDR_V4, ADDR_ANYADDR_V6}
3079 };
Luke Huangf8215372019-11-22 11:53:41 +08003080 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003081
3082 for (const auto& config : testConfigs) {
3083 SCOPED_TRACE(config.asParameters());
3084
Xiao Ma09b71022018-12-11 17:56:32 +09003085 addrinfo hints = {
Nick Desaulnierscd6395a2019-10-11 09:15:24 -07003086 .ai_flags = config.flag,
Xiao Ma09b71022018-12-11 17:56:32 +09003087 .ai_family = AF_UNSPEC, // any address family
3088 .ai_socktype = 0, // any type
3089 .ai_protocol = 0, // any protocol
Xiao Ma09b71022018-12-11 17:56:32 +09003090 };
nuccachena26cc2a2018-07-17 18:07:23 +08003091
3092 // Assign hostname as null and service as port name.
3093 ScopedAddrinfo result = safe_getaddrinfo(nullptr, PORT_NAME_HTTP, &hints);
3094 ASSERT_TRUE(result != nullptr);
3095
3096 // Can't be synthesized because it should not get into Netd.
3097 std::vector<std::string> result_strs = ToStrings(result);
3098 for (const auto& str : result_strs) {
3099 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
3100 << ", result_str='" << str << "'";
3101 }
3102
3103 // Assign hostname as null and service as numeric port number.
3104 hints.ai_flags = config.flag | AI_NUMERICSERV;
3105 result = safe_getaddrinfo(nullptr, PORT_NUMBER_HTTP, &hints);
3106 ASSERT_TRUE(result != nullptr);
3107
3108 // Can't be synthesized because it should not get into Netd.
3109 result_strs = ToStrings(result);
3110 for (const auto& str : result_strs) {
3111 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
3112 << ", result_str='" << str << "'";
3113 }
3114 }
3115}
3116
3117TEST_F(ResolverTest, GetHostByAddr_ReverseDnsQueryWithHavingNat64Prefix) {
3118 struct hostent* result = nullptr;
3119 struct in_addr v4addr;
3120 struct in6_addr v6addr;
3121
3122 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003123 constexpr char dns64_name[] = "ipv4only.arpa.";
3124 constexpr char ptr_name[] = "v4v6.example.com.";
3125 // PTR record for IPv4 address 1.2.3.4
3126 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3127 // PTR record for IPv6 address 2001:db8::102:304
3128 constexpr char ptr_addr_v6[] =
3129 "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 +09003130 const std::vector<DnsRecord> records = {
3131 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3132 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3133 {ptr_addr_v6, ns_type::ns_t_ptr, ptr_name},
3134 };
nuccachena26cc2a2018-07-17 18:07:23 +08003135
Xiao Ma09b71022018-12-11 17:56:32 +09003136 test::DNSResponder dns(listen_addr);
3137 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003138 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003139 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003140
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003141 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003142 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003143 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003144
3145 // Reverse IPv4 DNS query. Prefix should have no effect on it.
3146 inet_pton(AF_INET, "1.2.3.4", &v4addr);
3147 result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
3148 ASSERT_TRUE(result != nullptr);
3149 std::string result_str = result->h_name ? result->h_name : "null";
3150 EXPECT_EQ(result_str, "v4v6.example.com");
3151
3152 // Reverse IPv6 DNS query. Prefix should have no effect on it.
3153 inet_pton(AF_INET6, "2001:db8::102:304", &v6addr);
3154 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3155 ASSERT_TRUE(result != nullptr);
3156 result_str = result->h_name ? result->h_name : "null";
3157 EXPECT_EQ(result_str, "v4v6.example.com");
3158}
3159
3160TEST_F(ResolverTest, GetHostByAddr_ReverseDns64Query) {
3161 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003162 constexpr char dns64_name[] = "ipv4only.arpa.";
3163 constexpr char ptr_name[] = "v4only.example.com.";
3164 // PTR record for IPv4 address 1.2.3.4
3165 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3166 // PTR record for IPv6 address 64:ff9b::1.2.3.4
3167 constexpr char ptr_addr_v6_nomapping[] =
3168 "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.";
3169 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
3170 // PTR record for IPv6 address 64:ff9b::5.6.7.8
3171 constexpr char ptr_addr_v6_synthesis[] =
3172 "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 +09003173 const std::vector<DnsRecord> records = {
3174 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3175 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3176 {ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis},
3177 };
nuccachena26cc2a2018-07-17 18:07:23 +08003178
Xiao Ma09b71022018-12-11 17:56:32 +09003179 test::DNSResponder dns(listen_addr);
3180 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003181 // "ptr_addr_v6_nomapping" is not mapped in DNS server
nuccachena26cc2a2018-07-17 18:07:23 +08003182 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003183 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003184
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003185 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003186 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003187 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003188
3189 // Synthesized PTR record doesn't exist on DNS server
3190 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
3191 // After querying synthesized address failed, expect that prefix is removed from IPv6
3192 // synthesized address and do reverse IPv4 query instead.
3193 struct in6_addr v6addr;
3194 inet_pton(AF_INET6, "64:ff9b::1.2.3.4", &v6addr);
3195 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3196 ASSERT_TRUE(result != nullptr);
3197 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist
3198 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist
3199 std::string result_str = result->h_name ? result->h_name : "null";
3200 EXPECT_EQ(result_str, "v4only.example.com");
3201 // Check that return address has been mapped from IPv4 to IPv6 address because Netd
3202 // removes NAT64 prefix and does IPv4 DNS reverse lookup in this case. Then, Netd
3203 // fakes the return IPv4 address as original queried IPv6 address.
3204 result_str = ToString(result);
3205 EXPECT_EQ(result_str, "64:ff9b::102:304");
3206 dns.clearQueries();
3207
3208 // Synthesized PTR record exists on DNS server
3209 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
3210 // Expect to Netd pass through synthesized address for DNS queries.
3211 inet_pton(AF_INET6, "64:ff9b::5.6.7.8", &v6addr);
3212 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3213 ASSERT_TRUE(result != nullptr);
3214 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
3215 result_str = result->h_name ? result->h_name : "null";
3216 EXPECT_EQ(result_str, "v6synthesis.example.com");
3217}
3218
3219TEST_F(ResolverTest, GetHostByAddr_ReverseDns64QueryFromHostFile) {
3220 constexpr char dns64_name[] = "ipv4only.arpa.";
3221 constexpr char host_name[] = "localhost";
3222 // The address is synthesized by prefix64:localhost.
3223 constexpr char host_addr[] = "64:ff9b::7f00:1";
nuccachena26cc2a2018-07-17 18:07:23 +08003224 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003225
3226 test::DNSResponder dns(listen_addr);
3227 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003228 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003229 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003230
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003231 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003232 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003233 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003234
3235 // Using synthesized "localhost" address to be a trick for resolving host name
3236 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
3237 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
3238 struct in6_addr v6addr;
3239 inet_pton(AF_INET6, host_addr, &v6addr);
3240 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3241 ASSERT_TRUE(result != nullptr);
3242 // Expect no DNS queries; localhost is resolved via /etc/hosts.
3243 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
3244
Luke Huangf8215372019-11-22 11:53:41 +08003245 ASSERT_EQ(sizeof(in6_addr), (unsigned)result->h_length);
nuccachena26cc2a2018-07-17 18:07:23 +08003246 ASSERT_EQ(AF_INET6, result->h_addrtype);
3247 std::string result_str = ToString(result);
3248 EXPECT_EQ(result_str, host_addr);
3249 result_str = result->h_name ? result->h_name : "null";
3250 EXPECT_EQ(result_str, host_name);
3251}
3252
Hungming Chen9e6185a2019-06-04 16:09:19 +08003253TEST_F(ResolverTest, GetHostByAddr_cnamesClasslessReverseDelegation) {
3254 // IPv4 addresses in the subnet with notation '/' or '-'.
3255 constexpr char addr_slash[] = "192.0.2.1";
3256 constexpr char addr_hyphen[] = "192.0.3.1";
3257
3258 // Used to verify DNS reverse query for classless reverse lookup zone. See detail in RFC 2317
3259 // section 4.
3260 const static std::vector<DnsRecord> records = {
3261 // The records for reverse querying "192.0.2.1" in the subnet with notation '/'.
3262 {"1.2.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0/25.2.0.192.in-addr.arpa."},
3263 {"1.0/25.2.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3264
3265 // The records for reverse querying "192.0.3.1" in the subnet with notation '-'.
3266 {"1.3.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0-127.3.0.192.in-addr.arpa."},
3267 {"1.0-127.3.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3268 };
3269
3270 test::DNSResponder dns;
3271 StartDns(dns, records);
3272 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3273
3274 for (const auto& address : {addr_slash, addr_hyphen}) {
3275 SCOPED_TRACE(address);
3276
3277 in_addr v4addr;
3278 ASSERT_TRUE(inet_pton(AF_INET, address, &v4addr));
3279 hostent* result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
3280 ASSERT_TRUE(result != nullptr);
3281 EXPECT_STREQ("hello.example.com", result->h_name);
3282 }
3283}
3284
nuccachena26cc2a2018-07-17 18:07:23 +08003285TEST_F(ResolverTest, GetNameInfo_ReverseDnsQueryWithHavingNat64Prefix) {
3286 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003287 constexpr char dns64_name[] = "ipv4only.arpa.";
3288 constexpr char ptr_name[] = "v4v6.example.com.";
3289 // PTR record for IPv4 address 1.2.3.4
3290 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3291 // PTR record for IPv6 address 2001:db8::102:304
3292 constexpr char ptr_addr_v6[] =
3293 "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 +09003294 const std::vector<DnsRecord> records = {
3295 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3296 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3297 {ptr_addr_v6, ns_type::ns_t_ptr, ptr_name},
3298 };
nuccachena26cc2a2018-07-17 18:07:23 +08003299
Xiao Ma09b71022018-12-11 17:56:32 +09003300 test::DNSResponder dns(listen_addr);
3301 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003302 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003303 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003304
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003305 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003306 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003307 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003308
Luke Huangf8215372019-11-22 11:53:41 +08003309 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003310 static const struct TestConfig {
3311 int flag;
3312 int family;
3313 std::string addr;
3314 std::string host;
3315
3316 std::string asParameters() const {
3317 return StringPrintf("flag=%d, family=%d, addr=%s, host=%s", flag, family, addr.c_str(),
3318 host.c_str());
3319 }
3320 } testConfigs[]{
3321 {NI_NAMEREQD, AF_INET, "1.2.3.4", "v4v6.example.com"},
3322 {NI_NUMERICHOST, AF_INET, "1.2.3.4", "1.2.3.4"},
3323 {0, AF_INET, "1.2.3.4", "v4v6.example.com"},
3324 {0, AF_INET, "5.6.7.8", "5.6.7.8"}, // unmapped
3325 {NI_NAMEREQD, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
3326 {NI_NUMERICHOST, AF_INET6, "2001:db8::102:304", "2001:db8::102:304"},
3327 {0, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
3328 {0, AF_INET6, "2001:db8::506:708", "2001:db8::506:708"}, // unmapped
3329 };
Luke Huangf8215372019-11-22 11:53:41 +08003330 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003331
3332 // Reverse IPv4/IPv6 DNS query. Prefix should have no effect on it.
3333 for (const auto& config : testConfigs) {
3334 SCOPED_TRACE(config.asParameters());
3335
3336 int rv;
3337 char host[NI_MAXHOST];
3338 struct sockaddr_in sin;
3339 struct sockaddr_in6 sin6;
3340 if (config.family == AF_INET) {
3341 memset(&sin, 0, sizeof(sin));
3342 sin.sin_family = AF_INET;
3343 inet_pton(AF_INET, config.addr.c_str(), &sin.sin_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003344 rv = getnameinfo((const struct sockaddr*)&sin, sizeof(sin), host, sizeof(host), nullptr,
3345 0, config.flag);
nuccachena26cc2a2018-07-17 18:07:23 +08003346 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4));
3347 } else if (config.family == AF_INET6) {
3348 memset(&sin6, 0, sizeof(sin6));
3349 sin6.sin6_family = AF_INET6;
3350 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003351 rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host),
nuccachena26cc2a2018-07-17 18:07:23 +08003352 nullptr, 0, config.flag);
3353 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6));
3354 }
3355 ASSERT_EQ(0, rv);
3356 std::string result_str = host;
3357 EXPECT_EQ(result_str, config.host);
3358 dns.clearQueries();
3359 }
3360}
3361
3362TEST_F(ResolverTest, GetNameInfo_ReverseDns64Query) {
3363 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003364 constexpr char dns64_name[] = "ipv4only.arpa.";
3365 constexpr char ptr_name[] = "v4only.example.com.";
3366 // PTR record for IPv4 address 1.2.3.4
3367 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3368 // PTR record for IPv6 address 64:ff9b::1.2.3.4
3369 constexpr char ptr_addr_v6_nomapping[] =
3370 "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.";
3371 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
3372 // PTR record for IPv6 address 64:ff9b::5.6.7.8
3373 constexpr char ptr_addr_v6_synthesis[] =
3374 "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 +09003375 const std::vector<DnsRecord> records = {
3376 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3377 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3378 {ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis},
3379 };
nuccachena26cc2a2018-07-17 18:07:23 +08003380
Xiao Ma09b71022018-12-11 17:56:32 +09003381 test::DNSResponder dns(listen_addr);
3382 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003383 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003384 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003385
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003386 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003387 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003388 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003389
Luke Huangf8215372019-11-22 11:53:41 +08003390 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003391 static const struct TestConfig {
3392 bool hasSynthesizedPtrRecord;
3393 int flag;
3394 std::string addr;
3395 std::string host;
3396
3397 std::string asParameters() const {
3398 return StringPrintf("hasSynthesizedPtrRecord=%d, flag=%d, addr=%s, host=%s",
3399 hasSynthesizedPtrRecord, flag, addr.c_str(), host.c_str());
3400 }
3401 } testConfigs[]{
3402 {false, NI_NAMEREQD, "64:ff9b::102:304", "v4only.example.com"},
3403 {false, NI_NUMERICHOST, "64:ff9b::102:304", "64:ff9b::102:304"},
3404 {false, 0, "64:ff9b::102:304", "v4only.example.com"},
3405 {true, NI_NAMEREQD, "64:ff9b::506:708", "v6synthesis.example.com"},
3406 {true, NI_NUMERICHOST, "64:ff9b::506:708", "64:ff9b::506:708"},
3407 {true, 0, "64:ff9b::506:708", "v6synthesis.example.com"}
3408 };
Luke Huangf8215372019-11-22 11:53:41 +08003409 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003410
3411 // hasSynthesizedPtrRecord = false
3412 // Synthesized PTR record doesn't exist on DNS server
3413 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
3414 // After querying synthesized address failed, expect that prefix is removed from IPv6
3415 // synthesized address and do reverse IPv4 query instead.
3416 //
3417 // hasSynthesizedPtrRecord = true
3418 // Synthesized PTR record exists on DNS server
3419 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
3420 // Expect to just pass through synthesized address for DNS queries.
3421 for (const auto& config : testConfigs) {
3422 SCOPED_TRACE(config.asParameters());
3423
3424 char host[NI_MAXHOST];
3425 struct sockaddr_in6 sin6;
3426 memset(&sin6, 0, sizeof(sin6));
3427 sin6.sin6_family = AF_INET6;
3428 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003429 int rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host),
nuccachena26cc2a2018-07-17 18:07:23 +08003430 nullptr, 0, config.flag);
3431 ASSERT_EQ(0, rv);
3432 if (config.flag == NI_NAMEREQD) {
3433 if (config.hasSynthesizedPtrRecord) {
3434 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
3435 } else {
3436 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist.
3437 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist.
3438 }
3439 }
3440 std::string result_str = host;
3441 EXPECT_EQ(result_str, config.host);
3442 dns.clearQueries();
3443 }
3444}
3445
3446TEST_F(ResolverTest, GetNameInfo_ReverseDns64QueryFromHostFile) {
3447 constexpr char dns64_name[] = "ipv4only.arpa.";
3448 constexpr char host_name[] = "localhost";
3449 // The address is synthesized by prefix64:localhost.
3450 constexpr char host_addr[] = "64:ff9b::7f00:1";
nuccachena26cc2a2018-07-17 18:07:23 +08003451 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003452
3453 test::DNSResponder dns(listen_addr);
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003454
Xiao Ma09b71022018-12-11 17:56:32 +09003455 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003456 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003457 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003458
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003459 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003460 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003461 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003462
3463 // Using synthesized "localhost" address to be a trick for resolving host name
3464 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
3465 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
3466 char host[NI_MAXHOST];
Xiao Ma09b71022018-12-11 17:56:32 +09003467 struct sockaddr_in6 sin6 = {.sin6_family = AF_INET6};
nuccachena26cc2a2018-07-17 18:07:23 +08003468 inet_pton(AF_INET6, host_addr, &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003469 int rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host), nullptr,
nuccachena26cc2a2018-07-17 18:07:23 +08003470 0, NI_NAMEREQD);
3471 ASSERT_EQ(0, rv);
3472 // Expect no DNS queries; localhost is resolved via /etc/hosts.
3473 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
3474
3475 std::string result_str = host;
3476 EXPECT_EQ(result_str, host_name);
3477}
3478
Hungming Chen9e6185a2019-06-04 16:09:19 +08003479TEST_F(ResolverTest, GetNameInfo_cnamesClasslessReverseDelegation) {
3480 // IPv4 addresses in the subnet with notation '/' or '-'.
3481 constexpr char addr_slash[] = "192.0.2.1";
3482 constexpr char addr_hyphen[] = "192.0.3.1";
3483
3484 // Used to verify DNS reverse query for classless reverse lookup zone. See detail in RFC 2317
3485 // section 4.
3486 const static std::vector<DnsRecord> records = {
3487 // The records for reverse querying "192.0.2.1" in the subnet with notation '/'.
3488 {"1.2.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0/25.2.0.192.in-addr.arpa."},
3489 {"1.0/25.2.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3490
3491 // The records for reverse querying "192.0.3.1" in the subnet with notation '-'.
3492 {"1.3.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0-127.3.0.192.in-addr.arpa."},
3493 {"1.0-127.3.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3494 };
3495
3496 test::DNSResponder dns;
3497 StartDns(dns, records);
3498 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3499
3500 for (const auto& address : {addr_slash, addr_hyphen}) {
3501 SCOPED_TRACE(address);
3502
3503 char host[NI_MAXHOST];
3504 sockaddr_in sin = {.sin_family = AF_INET};
3505 ASSERT_TRUE(inet_pton(AF_INET, address, &sin.sin_addr));
3506 int rv = getnameinfo((const sockaddr*)&sin, sizeof(sin), host, sizeof(host), nullptr, 0,
3507 NI_NAMEREQD);
3508 ASSERT_EQ(0, rv);
3509 EXPECT_STREQ("hello.example.com", host);
3510 }
3511}
3512
nuccachena26cc2a2018-07-17 18:07:23 +08003513TEST_F(ResolverTest, GetHostByName2_Dns64Synthesize) {
Xiao Ma09b71022018-12-11 17:56:32 +09003514 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003515 constexpr char dns64_name[] = "ipv4only.arpa.";
3516 constexpr char host_name[] = "ipv4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003517 const std::vector<DnsRecord> records = {
3518 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3519 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3520 };
nuccachena26cc2a2018-07-17 18:07:23 +08003521
Xiao Ma09b71022018-12-11 17:56:32 +09003522 test::DNSResponder dns(listen_addr);
3523 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003524 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003525 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003526
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003527 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003528 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003529 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003530
3531 // Query an IPv4-only hostname. Expect that gets a synthesized address.
3532 struct hostent* result = gethostbyname2("ipv4only", AF_INET6);
3533 ASSERT_TRUE(result != nullptr);
3534 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3535 std::string result_str = ToString(result);
3536 EXPECT_EQ(result_str, "64:ff9b::102:304");
3537}
nuccachena26cc2a2018-07-17 18:07:23 +08003538
3539TEST_F(ResolverTest, GetHostByName2_DnsQueryWithHavingNat64Prefix) {
3540 constexpr char dns64_name[] = "ipv4only.arpa.";
3541 constexpr char host_name[] = "v4v6.example.com.";
nuccachena26cc2a2018-07-17 18:07:23 +08003542 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003543 const std::vector<DnsRecord> records = {
3544 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3545 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3546 {host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
3547 };
3548
3549 test::DNSResponder dns(listen_addr);
3550 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003551 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003552 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003553
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003554 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003555 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003556 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003557
3558 // IPv4 DNS query. Prefix should have no effect on it.
3559 struct hostent* result = gethostbyname2("v4v6", AF_INET);
3560 ASSERT_TRUE(result != nullptr);
3561 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3562 std::string result_str = ToString(result);
3563 EXPECT_EQ(result_str, "1.2.3.4");
3564 dns.clearQueries();
3565
3566 // IPv6 DNS query. Prefix should have no effect on it.
3567 result = gethostbyname2("v4v6", AF_INET6);
3568 ASSERT_TRUE(result != nullptr);
3569 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3570 result_str = ToString(result);
3571 EXPECT_EQ(result_str, "2001:db8::102:304");
3572}
3573
3574TEST_F(ResolverTest, GetHostByName2_Dns64QuerySpecialUseIPv4Addresses) {
3575 constexpr char THIS_NETWORK[] = "this_network";
3576 constexpr char LOOPBACK[] = "loopback";
3577 constexpr char LINK_LOCAL[] = "link_local";
3578 constexpr char MULTICAST[] = "multicast";
3579 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
3580
3581 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
3582 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
3583 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
3584 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
3585 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
3586
3587 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003588 constexpr char dns64_name[] = "ipv4only.arpa.";
3589
Xiao Ma09b71022018-12-11 17:56:32 +09003590 test::DNSResponder dns(listen_addr);
3591 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003592 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003593 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003594
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003595 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003596 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003597 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003598
Luke Huangf8215372019-11-22 11:53:41 +08003599 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003600 static const struct TestConfig {
3601 std::string name;
3602 std::string addr;
3603
3604 std::string asHostName() const {
Luke Huangf8215372019-11-22 11:53:41 +08003605 return StringPrintf("%s.example.com.", name.c_str());
nuccachena26cc2a2018-07-17 18:07:23 +08003606 }
3607 } testConfigs[]{
3608 {THIS_NETWORK, ADDR_THIS_NETWORK},
3609 {LOOPBACK, ADDR_LOOPBACK},
3610 {LINK_LOCAL, ADDR_LINK_LOCAL},
3611 {MULTICAST, ADDR_MULTICAST},
3612 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
3613 };
Luke Huangf8215372019-11-22 11:53:41 +08003614 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003615
3616 for (const auto& config : testConfigs) {
3617 const std::string testHostName = config.asHostName();
3618 SCOPED_TRACE(testHostName);
3619
3620 const char* host_name = testHostName.c_str();
3621 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
3622
3623 struct hostent* result = gethostbyname2(config.name.c_str(), AF_INET6);
3624 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3625
3626 // In AF_INET6 case, don't synthesize special use IPv4 address.
3627 // Expect to have no answer
3628 EXPECT_EQ(nullptr, result);
3629
3630 dns.clearQueries();
3631 }
Bernie Innocenti2fef2b82018-12-20 15:56:40 +09003632}
Mike Yuf14e1a92019-05-10 13:54:58 +08003633
3634TEST_F(ResolverTest, PrefixDiscoveryBypassTls) {
3635 constexpr char listen_addr[] = "::1";
3636 constexpr char cleartext_port[] = "53";
3637 constexpr char tls_port[] = "853";
3638 constexpr char dns64_name[] = "ipv4only.arpa.";
3639 const std::vector<std::string> servers = {listen_addr};
3640
3641 test::DNSResponder dns(listen_addr);
3642 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
3643 test::DnsTlsFrontend tls(listen_addr, tls_port, listen_addr, cleartext_port);
3644 ASSERT_TRUE(tls.startServer());
3645
3646 // Setup OPPORTUNISTIC mode and wait for the validation complete.
waynema0e73c2e2019-07-31 15:04:08 +08003647 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08003648 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003649 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yuf14e1a92019-05-10 13:54:58 +08003650 tls.clearQueries();
3651
3652 // Start NAT64 prefix discovery and wait for it complete.
3653 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003654 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
Mike Yuf14e1a92019-05-10 13:54:58 +08003655
3656 // Verify it bypassed TLS even though there's a TLS server available.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003657 EXPECT_EQ(0, tls.queries()) << dns.dumpQueries();
3658 EXPECT_EQ(1U, GetNumQueries(dns, dns64_name)) << dns.dumpQueries();
Mike Yuf14e1a92019-05-10 13:54:58 +08003659
3660 // Restart the testing network to reset the cache.
3661 mDnsClient.TearDown();
3662 mDnsClient.SetUp();
3663 dns.clearQueries();
3664
3665 // Setup STRICT mode and wait for the validation complete.
waynema0e73c2e2019-07-31 15:04:08 +08003666 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
3667 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08003668 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003669 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yuf14e1a92019-05-10 13:54:58 +08003670 tls.clearQueries();
3671
3672 // Start NAT64 prefix discovery and wait for it to complete.
3673 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003674 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
Mike Yuf14e1a92019-05-10 13:54:58 +08003675
3676 // Verify it bypassed TLS despite STRICT mode.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003677 EXPECT_EQ(0, tls.queries()) << dns.dumpQueries();
3678 EXPECT_EQ(1U, GetNumQueries(dns, dns64_name)) << dns.dumpQueries();
Mike Yuf14e1a92019-05-10 13:54:58 +08003679}
Luke Huang9807e6b2019-05-20 16:17:12 +08003680
3681namespace {
3682
Luke Huang0d592bc2019-05-25 18:24:03 +08003683class ScopedSetNetworkForProcess {
3684 public:
3685 explicit ScopedSetNetworkForProcess(unsigned netId) {
3686 mStoredNetId = getNetworkForProcess();
3687 if (netId == mStoredNetId) return;
3688 EXPECT_EQ(0, setNetworkForProcess(netId));
3689 }
3690 ~ScopedSetNetworkForProcess() { EXPECT_EQ(0, setNetworkForProcess(mStoredNetId)); }
3691
3692 private:
3693 unsigned mStoredNetId;
3694};
3695
3696class ScopedSetNetworkForResolv {
3697 public:
3698 explicit ScopedSetNetworkForResolv(unsigned netId) { EXPECT_EQ(0, setNetworkForResolv(netId)); }
3699 ~ScopedSetNetworkForResolv() { EXPECT_EQ(0, setNetworkForResolv(NETID_UNSET)); }
3700};
3701
Luke Huang9807e6b2019-05-20 16:17:12 +08003702void sendCommand(int fd, const std::string& cmd) {
3703 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size() + 1));
3704 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size() + 1));
3705}
3706
3707int32_t readBE32(int fd) {
3708 int32_t tmp;
3709 int n = TEMP_FAILURE_RETRY(read(fd, &tmp, sizeof(tmp)));
3710 EXPECT_TRUE(n > 0);
3711 return ntohl(tmp);
3712}
3713
Luke Huang0d592bc2019-05-25 18:24:03 +08003714int readResponseCode(int fd) {
Luke Huang9807e6b2019-05-20 16:17:12 +08003715 char buf[4];
3716 int n = TEMP_FAILURE_RETRY(read(fd, &buf, sizeof(buf)));
3717 EXPECT_TRUE(n > 0);
3718 // The format of response code is that 4 bytes for the code & null.
3719 buf[3] = '\0';
3720 int result;
3721 EXPECT_TRUE(ParseInt(buf, &result));
3722 return result;
3723}
3724
Luke Huang0d592bc2019-05-25 18:24:03 +08003725bool checkAndClearUseLocalNameserversFlag(unsigned* netid) {
3726 if (netid == nullptr || ((*netid) & NETID_USE_LOCAL_NAMESERVERS) == 0) {
3727 return false;
3728 }
3729 *netid = (*netid) & ~NETID_USE_LOCAL_NAMESERVERS;
3730 return true;
3731}
3732
Luke Huangf8215372019-11-22 11:53:41 +08003733aidl::android::net::UidRangeParcel makeUidRangeParcel(int start, int stop) {
3734 aidl::android::net::UidRangeParcel res;
Luke Huang0d592bc2019-05-25 18:24:03 +08003735 res.start = start;
3736 res.stop = stop;
3737
3738 return res;
3739}
3740
3741void expectNetIdWithLocalNameserversFlag(unsigned netId) {
3742 unsigned dnsNetId = 0;
3743 EXPECT_EQ(0, getNetworkForDns(&dnsNetId));
3744 EXPECT_TRUE(checkAndClearUseLocalNameserversFlag(&dnsNetId));
3745 EXPECT_EQ(netId, static_cast<unsigned>(dnsNetId));
3746}
3747
3748void expectDnsNetIdEquals(unsigned netId) {
3749 unsigned dnsNetId = 0;
3750 EXPECT_EQ(0, getNetworkForDns(&dnsNetId));
3751 EXPECT_EQ(netId, static_cast<unsigned>(dnsNetId));
3752}
3753
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003754void expectDnsNetIdIsDefaultNetwork(INetd* netdService) {
Luke Huang0d592bc2019-05-25 18:24:03 +08003755 int currentNetid;
3756 EXPECT_TRUE(netdService->networkGetDefault(&currentNetid).isOk());
3757 expectDnsNetIdEquals(currentNetid);
3758}
3759
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003760void expectDnsNetIdWithVpn(INetd* netdService, unsigned vpnNetId, unsigned expectedNetId) {
Luke Huang0d592bc2019-05-25 18:24:03 +08003761 EXPECT_TRUE(netdService->networkCreateVpn(vpnNetId, false /* secure */).isOk());
3762 uid_t uid = getuid();
3763 // Add uid to VPN
3764 EXPECT_TRUE(netdService->networkAddUidRanges(vpnNetId, {makeUidRangeParcel(uid, uid)}).isOk());
3765 expectDnsNetIdEquals(expectedNetId);
3766 EXPECT_TRUE(netdService->networkDestroy(vpnNetId).isOk());
3767}
3768
Luke Huang9807e6b2019-05-20 16:17:12 +08003769} // namespace
3770
3771TEST_F(ResolverTest, getDnsNetId) {
3772 // We've called setNetworkForProcess in SetupOemNetwork, so reset to default first.
3773 setNetworkForProcess(NETID_UNSET);
Luke Huang0d592bc2019-05-25 18:24:03 +08003774
3775 expectDnsNetIdIsDefaultNetwork(mDnsClient.netdService());
3776 expectDnsNetIdWithVpn(mDnsClient.netdService(), TEST_VPN_NETID, TEST_VPN_NETID);
Luke Huang9807e6b2019-05-20 16:17:12 +08003777
3778 // Test with setNetworkForProcess
Luke Huang0d592bc2019-05-25 18:24:03 +08003779 {
3780 ScopedSetNetworkForProcess scopedSetNetworkForProcess(TEST_NETID);
3781 expectDnsNetIdEquals(TEST_NETID);
3782 }
3783
3784 // Test with setNetworkForProcess with NETID_USE_LOCAL_NAMESERVERS
3785 {
3786 ScopedSetNetworkForProcess scopedSetNetworkForProcess(TEST_NETID |
3787 NETID_USE_LOCAL_NAMESERVERS);
3788 expectNetIdWithLocalNameserversFlag(TEST_NETID);
3789 }
Luke Huang9807e6b2019-05-20 16:17:12 +08003790
3791 // Test with setNetworkForResolv
Luke Huang0d592bc2019-05-25 18:24:03 +08003792 {
3793 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID);
3794 expectDnsNetIdEquals(TEST_NETID);
3795 }
3796
3797 // Test with setNetworkForResolv with NETID_USE_LOCAL_NAMESERVERS
3798 {
3799 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID |
3800 NETID_USE_LOCAL_NAMESERVERS);
3801 expectNetIdWithLocalNameserversFlag(TEST_NETID);
3802 }
3803
3804 // Test with setNetworkForResolv under bypassable vpn
3805 {
3806 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID);
3807 expectDnsNetIdWithVpn(mDnsClient.netdService(), TEST_VPN_NETID, TEST_NETID);
3808 }
Luke Huang9807e6b2019-05-20 16:17:12 +08003809
3810 // Create socket connected to DnsProxyListener
3811 int fd = dns_open_proxy();
3812 EXPECT_TRUE(fd > 0);
3813 unique_fd ufd(fd);
3814
3815 // Test command with wrong netId
3816 sendCommand(fd, "getdnsnetid abc");
Luke Huang0d592bc2019-05-25 18:24:03 +08003817 EXPECT_EQ(ResponseCode::DnsProxyQueryResult, readResponseCode(fd));
Luke Huang9807e6b2019-05-20 16:17:12 +08003818 EXPECT_EQ(-EINVAL, readBE32(fd));
3819
3820 // Test unsupported command
3821 sendCommand(fd, "getdnsnetidNotSupported");
3822 // Keep in sync with FrameworkListener.cpp (500, "Command not recognized")
Luke Huang0d592bc2019-05-25 18:24:03 +08003823 EXPECT_EQ(500, readResponseCode(fd));
Luke Huang9807e6b2019-05-20 16:17:12 +08003824}
Sehee Park2c118782019-05-07 13:02:45 +09003825
3826TEST_F(ResolverTest, BlockDnsQueryWithUidRule) {
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003827 // This test relies on blocking traffic on loopback, which xt_qtaguid does not do.
3828 // See aosp/358413 and b/34444781 for why.
3829 SKIP_IF_BPF_NOT_SUPPORTED;
3830
Sehee Park2c118782019-05-07 13:02:45 +09003831 constexpr char listen_addr1[] = "127.0.0.4";
3832 constexpr char listen_addr2[] = "::1";
3833 constexpr char host_name[] = "howdy.example.com.";
3834 const std::vector<DnsRecord> records = {
3835 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3836 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
3837 };
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003838 INetd* netdService = mDnsClient.netdService();
Sehee Park2c118782019-05-07 13:02:45 +09003839
3840 test::DNSResponder dns1(listen_addr1);
3841 test::DNSResponder dns2(listen_addr2);
3842 StartDns(dns1, records);
3843 StartDns(dns2, records);
3844
3845 std::vector<std::string> servers = {listen_addr1, listen_addr2};
3846 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
3847 dns1.clearQueries();
3848 dns2.clearQueries();
3849
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003850 // Add drop rule for TEST_UID. Also enable the standby chain because it might not be enabled.
3851 // Unfortunately we cannot use FIREWALL_CHAIN_NONE, or custom iptables rules, for this purpose
3852 // because netd calls fchown() on the DNS query sockets, and "iptables -m owner" matches the
3853 // UID of the socket creator, not the UID set by fchown().
3854 //
3855 // TODO: migrate FIREWALL_CHAIN_NONE to eBPF as well.
3856 EXPECT_TRUE(netdService->firewallEnableChildChain(INetd::FIREWALL_CHAIN_STANDBY, true).isOk());
3857 EXPECT_TRUE(netdService
Sehee Park2c118782019-05-07 13:02:45 +09003858 ->firewallSetUidRule(INetd::FIREWALL_CHAIN_STANDBY, TEST_UID,
3859 INetd::FIREWALL_RULE_DENY)
3860 .isOk());
3861
3862 // Save uid
3863 int suid = getuid();
3864
3865 // Switch to TEST_UID
3866 EXPECT_TRUE(seteuid(TEST_UID) == 0);
3867
3868 // Dns Query
3869 int fd1 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_a, 0);
3870 int fd2 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_aaaa, 0);
3871 EXPECT_TRUE(fd1 != -1);
3872 EXPECT_TRUE(fd2 != -1);
3873
3874 uint8_t buf[MAXPACKET] = {};
3875 int rcode;
3876 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
3877 EXPECT_EQ(-ECONNREFUSED, res);
3878
3879 memset(buf, 0, MAXPACKET);
3880 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
3881 EXPECT_EQ(-ECONNREFUSED, res);
3882
3883 // Restore uid
3884 EXPECT_TRUE(seteuid(suid) == 0);
3885
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003886 // Remove drop rule for TEST_UID, and disable the standby chain.
3887 EXPECT_TRUE(netdService
Sehee Park2c118782019-05-07 13:02:45 +09003888 ->firewallSetUidRule(INetd::FIREWALL_CHAIN_STANDBY, TEST_UID,
3889 INetd::FIREWALL_RULE_ALLOW)
3890 .isOk());
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003891 EXPECT_TRUE(netdService->firewallEnableChildChain(INetd::FIREWALL_CHAIN_STANDBY, false).isOk());
Sehee Park2c118782019-05-07 13:02:45 +09003892}
Mike Yua772c202019-09-23 17:47:21 +08003893
Mike Yu40e67072019-10-09 21:14:09 +08003894namespace {
3895
3896const std::string kDotConnectTimeoutMsFlag(
3897 "persist.device_config.netd_native.dot_connect_timeout_ms");
3898
3899class ScopedSystemProperties {
3900 public:
3901 explicit ScopedSystemProperties(const std::string& key, const std::string& value)
3902 : mStoredKey(key) {
3903 mStoredValue = android::base::GetProperty(key, "");
3904 android::base::SetProperty(key, value);
3905 }
3906 ~ScopedSystemProperties() { android::base::SetProperty(mStoredKey, mStoredValue); }
3907
3908 private:
3909 std::string mStoredKey;
3910 std::string mStoredValue;
3911};
3912
3913} // namespace
3914
Mike Yua772c202019-09-23 17:47:21 +08003915TEST_F(ResolverTest, ConnectTlsServerTimeout) {
Mike Yu40e67072019-10-09 21:14:09 +08003916 constexpr int expectedTimeout = 1000;
3917 constexpr char hostname1[] = "query1.example.com.";
3918 constexpr char hostname2[] = "query2.example.com.";
Mike Yua772c202019-09-23 17:47:21 +08003919 const std::vector<DnsRecord> records = {
Mike Yu40e67072019-10-09 21:14:09 +08003920 {hostname1, ns_type::ns_t_a, "1.2.3.4"},
3921 {hostname2, ns_type::ns_t_a, "1.2.3.5"},
Mike Yua772c202019-09-23 17:47:21 +08003922 };
3923
3924 test::DNSResponder dns;
3925 StartDns(dns, records);
Mike Yu40e67072019-10-09 21:14:09 +08003926 test::DnsTlsFrontend tls;
Mike Yua772c202019-09-23 17:47:21 +08003927 ASSERT_TRUE(tls.startServer());
3928
Mike Yu40e67072019-10-09 21:14:09 +08003929 // The resolver will adjust the timeout value to 1000ms since the value is too small.
3930 ScopedSystemProperties scopedSystemProperties(kDotConnectTimeoutMsFlag, "100");
Mike Yua772c202019-09-23 17:47:21 +08003931
Mike Yu40e67072019-10-09 21:14:09 +08003932 // Set up resolver to opportunistic mode with the default configuration.
Mike Yu8ac63402019-12-02 15:28:38 +08003933 const ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
Mike Yu40e67072019-10-09 21:14:09 +08003934 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
Mike Yua772c202019-09-23 17:47:21 +08003935 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003936 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yua772c202019-09-23 17:47:21 +08003937 tls.clearQueries();
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003938 dns.clearQueries();
Mike Yua772c202019-09-23 17:47:21 +08003939
3940 // The server becomes unresponsive to the handshake request.
3941 tls.setHangOnHandshakeForTesting(true);
3942
3943 // Expect the things happening in getaddrinfo():
3944 // 1. Connect to the private DNS server.
3945 // 2. SSL handshake times out.
3946 // 3. Fallback to UDP transport, and then get the answer.
Mike Yu40e67072019-10-09 21:14:09 +08003947 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
3948 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(hostname1, nullptr, hints);
Mike Yua772c202019-09-23 17:47:21 +08003949
Mike Yu40e67072019-10-09 21:14:09 +08003950 EXPECT_NE(nullptr, result);
Mike Yua772c202019-09-23 17:47:21 +08003951 EXPECT_EQ(0, tls.queries());
Mike Yu40e67072019-10-09 21:14:09 +08003952 EXPECT_EQ(1U, GetNumQueries(dns, hostname1));
3953 EXPECT_EQ(records.at(0).addr, ToString(result));
Mike Yua772c202019-09-23 17:47:21 +08003954
Mike Yu40e67072019-10-09 21:14:09 +08003955 // A loose upper bound is set by adding 2000ms buffer time. Theoretically, getaddrinfo()
3956 // should just take a bit more than expetTimeout milliseconds.
3957 EXPECT_GE(timeTakenMs, expectedTimeout);
3958 EXPECT_LE(timeTakenMs, expectedTimeout + 2000);
3959
3960 // Set the server to be responsive. Verify that the resolver will attempt to reconnect
3961 // to the server and then get the result within the timeout.
3962 tls.setHangOnHandshakeForTesting(false);
3963 std::tie(result, timeTakenMs) = safe_getaddrinfo_time_taken(hostname2, nullptr, hints);
3964
3965 EXPECT_NE(nullptr, result);
3966 EXPECT_EQ(1, tls.queries());
3967 EXPECT_EQ(1U, GetNumQueries(dns, hostname2));
3968 EXPECT_EQ(records.at(1).addr, ToString(result));
3969
3970 EXPECT_LE(timeTakenMs, expectedTimeout);
Mike Yua772c202019-09-23 17:47:21 +08003971}
Hungming Chenbb90ab32019-10-28 18:20:31 +08003972
Ken Chen766feae2019-10-30 15:13:44 +08003973TEST_F(ResolverTest, FlushNetworkCache) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08003974 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08003975 test::DNSResponder dns;
3976 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
3977 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3978
3979 const hostent* result = gethostbyname("hello");
3980 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
3981
3982 // get result from cache
3983 result = gethostbyname("hello");
3984 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
3985
3986 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
3987
3988 result = gethostbyname("hello");
3989 EXPECT_EQ(2U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
3990}
3991
3992TEST_F(ResolverTest, FlushNetworkCache_random) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08003993 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08003994 constexpr int num_flush = 10;
3995 constexpr int num_queries = 20;
3996 test::DNSResponder dns;
3997 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
3998 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3999 const addrinfo hints = {.ai_family = AF_INET};
4000
4001 std::thread t([this]() {
4002 for (int i = 0; i < num_flush; ++i) {
4003 unsigned delay = arc4random_uniform(10 * 1000); // 10ms
4004 usleep(delay);
4005 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4006 }
4007 });
4008
4009 for (int i = 0; i < num_queries; ++i) {
4010 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4011 EXPECT_TRUE(result != nullptr);
4012 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4013 }
4014 t.join();
4015}
4016
4017// flush cache while one query is wait-for-response, another is pending.
4018TEST_F(ResolverTest, FlushNetworkCache_concurrent) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004019 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004020 const char* listen_addr1 = "127.0.0.9";
4021 const char* listen_addr2 = "127.0.0.10";
4022 test::DNSResponder dns1(listen_addr1);
4023 test::DNSResponder dns2(listen_addr2);
4024 StartDns(dns1, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4025 StartDns(dns2, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4026 addrinfo hints = {.ai_family = AF_INET};
4027
4028 // step 1: set server#1 into deferred responding mode
4029 dns1.setDeferredResp(true);
4030 std::thread t1([&listen_addr1, &hints, this]() {
4031 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr1}));
4032 // step 3: query
4033 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4034 // step 9: check result
4035 EXPECT_TRUE(result != nullptr);
4036 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4037 });
4038
4039 // step 2: wait for the query to reach the server
4040 while (GetNumQueries(dns1, kHelloExampleCom) == 0) {
4041 usleep(1000); // 1ms
4042 }
4043
4044 std::thread t2([&listen_addr2, &hints, &dns2, this]() {
4045 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr2}));
4046 // step 5: query (should be blocked in resolver)
4047 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4048 // step 7: check result
4049 EXPECT_TRUE(result != nullptr);
4050 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4051 EXPECT_EQ(1U, GetNumQueriesForType(dns2, ns_type::ns_t_a, kHelloExampleCom));
4052 });
4053
4054 // step 4: wait a bit for the 2nd query to enter pending state
4055 usleep(100 * 1000); // 100ms
4056 // step 6: flush cache (will unblock pending queries)
4057 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4058 t2.join();
4059
4060 // step 8: resume server#1
4061 dns1.setDeferredResp(false);
4062 t1.join();
4063
4064 // step 10: verify if result is correctly cached
4065 dns2.clearQueries();
4066 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4067 EXPECT_EQ(0U, GetNumQueries(dns2, kHelloExampleCom));
4068 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4069}
4070
waynema29253052019-08-20 11:26:08 +08004071// TODO: Perhaps to have a boundary conditions test for TCP and UDP.
4072TEST_F(ResolverTest, TcpQueryWithOversizePayload) {
4073 test::DNSResponder dns;
4074 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4075 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4076
4077 int fd = dns_open_proxy();
4078 ASSERT_TRUE(fd > 0);
4079
4080 // Sending DNS query over TCP once the packet sizes exceed 512 bytes.
4081 // The raw data is combined with Question section and Additional section
4082 // Question section : query "hello.example.com", type A, class IN
4083 // Additional section : type OPT (41), Option PADDING, Option Length 546
4084 // Padding option which allows DNS clients and servers to artificially
4085 // increase the size of a DNS message by a variable number of bytes.
4086 // See also RFC7830, section 3
4087 const std::string query =
4088 "+c0BAAABAAAAAAABBWhlbGxvB2V4YW1wbGUDY29tAAABAAEAACkgAAAAgAACJgAMAiIAAAAAAAAAAAAAAAAAA"
4089 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4090 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4091 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4092 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4093 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4094 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4095 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4096 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4097 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
4098 const std::string cmd =
4099 "resnsend " + std::to_string(TEST_NETID) + " 0 " /* ResNsendFlags */ + query + '\0';
4100 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
4101 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
4102 expectAnswersValid(fd, AF_INET, kHelloExampleComAddrV4);
4103 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom));
4104 EXPECT_EQ(0U, GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom));
4105}
4106
Ken Chen99344882020-01-01 14:59:38 +08004107TEST_F(ResolverTest, TruncatedRspMode) {
4108 constexpr char listen_addr[] = "127.0.0.4";
4109 constexpr char listen_addr2[] = "127.0.0.5";
4110 constexpr char listen_srv[] = "53";
4111
4112 test::DNSResponder dns(listen_addr, listen_srv, static_cast<ns_rcode>(-1));
4113 test::DNSResponder dns2(listen_addr2, listen_srv, static_cast<ns_rcode>(-1));
4114 // dns supports UDP only, dns2 support UDP and TCP
4115 dns.setResponseProbability(0.0, IPPROTO_TCP);
4116 StartDns(dns, kLargeCnameChainRecords);
4117 StartDns(dns2, kLargeCnameChainRecords);
4118
4119 const struct TestConfig {
4120 const std::optional<int32_t> tcMode;
4121 const bool ret;
4122 const unsigned numQueries;
4123 std::string asParameters() const {
4124 return StringPrintf("tcMode: %d, ret: %s, numQueries: %u", tcMode.value_or(-1),
4125 ret ? "true" : "false", numQueries);
4126 }
4127 } testConfigs[]{
4128 // clang-format off
4129 {std::nullopt, true, 0}, /* mode unset */
4130 {aidl::android::net::IDnsResolver::TC_MODE_DEFAULT, true, 0}, /* default mode */
4131 {aidl::android::net::IDnsResolver::TC_MODE_UDP_TCP, true, 1}, /* alternative mode */
4132 {-666, false, 1}, /* invalid input */
4133 // clang-format on
4134 };
4135
4136 for (const auto& config : testConfigs) {
4137 SCOPED_TRACE(config.asParameters());
4138
4139 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4140 parcel.servers = {listen_addr, listen_addr2};
4141 if (config.tcMode) {
Ken Chen05420812020-04-07 18:58:38 +00004142 parcel.resolverOptions.tcMode = config.tcMode.value();
Ken Chen99344882020-01-01 14:59:38 +08004143 }
4144 ASSERT_EQ(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk(), config.ret);
4145
4146 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4147 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4148 ASSERT_TRUE(result != nullptr);
4149 EXPECT_EQ(ToString(result), kHelloExampleComAddrV4);
4150 // TC_MODE_DEFAULT: resolver retries on TCP-only on each name server.
4151 // TC_MODE_UDP_TCP: resolver retries on TCP on the same server, falls back to UDP from next.
4152 ASSERT_EQ(GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom), 1U);
4153 ASSERT_EQ(GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom), 1U);
4154 ASSERT_EQ(GetNumQueriesForProtocol(dns2, IPPROTO_UDP, kHelloExampleCom), config.numQueries);
4155 ASSERT_EQ(GetNumQueriesForProtocol(dns2, IPPROTO_TCP, kHelloExampleCom), 1U);
4156
4157 dns.clearQueries();
4158 dns2.clearQueries();
4159 ASSERT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4160 }
4161}
4162
Mike Yuc0000252020-03-19 07:14:23 +00004163TEST_F(ResolverTest, RepeatedSetup_ResolverStatusRemains) {
4164 constexpr char unusable_listen_addr[] = "127.0.0.3";
4165 constexpr char listen_addr[] = "127.0.0.4";
4166 constexpr char hostname[] = "a.hello.query.";
4167 const auto repeatedSetResolversFromParcel = [&](const ResolverParamsParcel& parcel) {
4168 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4169 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4170 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4171 };
4172
4173 test::DNSResponder dns(listen_addr);
4174 StartDns(dns, {{hostname, ns_type::ns_t_a, "1.2.3.3"}});
4175 test::DnsTlsFrontend tls1(listen_addr, "853", listen_addr, "53");
4176 ASSERT_TRUE(tls1.startServer());
4177
4178 // Private DNS off mode.
4179 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4180 parcel.servers = {unusable_listen_addr, listen_addr};
4181 parcel.tlsServers.clear();
4182 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4183
4184 // Send a query.
4185 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4186 EXPECT_NE(safe_getaddrinfo(hostname, nullptr, &hints), nullptr);
4187
4188 // Check the stats as expected.
4189 const std::vector<NameserverStats> expectedCleartextDnsStats = {
4190 NameserverStats(unusable_listen_addr).setInternalErrors(1),
4191 NameserverStats(listen_addr).setSuccesses(1),
4192 };
4193 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
4194 EXPECT_EQ(GetNumQueries(dns, hostname), 1U);
4195
4196 // The stats is supposed to remain as long as the list of cleartext DNS servers is unchanged.
4197 static const struct TestConfig {
4198 std::vector<std::string> servers;
4199 std::vector<std::string> tlsServers;
4200 std::string tlsName;
4201 } testConfigs[] = {
4202 // Private DNS opportunistic mode.
4203 {{listen_addr, unusable_listen_addr}, {listen_addr, unusable_listen_addr}, ""},
4204 {{unusable_listen_addr, listen_addr}, {unusable_listen_addr, listen_addr}, ""},
4205
4206 // Private DNS strict mode.
4207 {{listen_addr, unusable_listen_addr}, {"127.0.0.100"}, kDefaultPrivateDnsHostName},
4208 {{unusable_listen_addr, listen_addr}, {"127.0.0.100"}, kDefaultPrivateDnsHostName},
4209
4210 // Private DNS off mode.
4211 {{unusable_listen_addr, listen_addr}, {}, ""},
4212 {{listen_addr, unusable_listen_addr}, {}, ""},
4213 };
4214
4215 for (const auto& config : testConfigs) {
4216 SCOPED_TRACE(fmt::format("testConfig: [{}] [{}] [{}]", fmt::join(config.servers, ","),
4217 fmt::join(config.tlsServers, ","), config.tlsName));
4218 parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4219 parcel.servers = config.servers;
4220 parcel.tlsServers = config.tlsServers;
4221 parcel.tlsName = config.tlsName;
4222 repeatedSetResolversFromParcel(parcel);
4223 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
4224
4225 // The stats remains when the list of search domains changes.
4226 parcel.domains.push_back("tmp.domains");
4227 repeatedSetResolversFromParcel(parcel);
4228 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
4229
4230 // The stats remains when the parameters change (except maxSamples).
4231 parcel.sampleValiditySeconds++;
4232 parcel.successThreshold++;
4233 parcel.minSamples++;
4234 parcel.baseTimeoutMsec++;
4235 parcel.retryCount++;
4236 repeatedSetResolversFromParcel(parcel);
4237 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
4238 }
4239
4240 // The cache remains.
4241 EXPECT_NE(safe_getaddrinfo(hostname, nullptr, &hints), nullptr);
4242 EXPECT_EQ(GetNumQueries(dns, hostname), 1U);
4243}
4244
4245TEST_F(ResolverTest, RepeatedSetup_NoRedundantPrivateDnsValidation) {
4246 const std::string addr1 = getUniqueIPv4Address(); // For a workable DNS server.
4247 const std::string addr2 = getUniqueIPv4Address(); // For an unresponsive DNS server.
4248 const std::string unusable_addr = getUniqueIPv4Address();
Mike Yu1ec523a2020-03-20 12:22:24 +00004249 const auto waitForPrivateDnsStateUpdated = []() {
4250 // A buffer time for the PrivateDnsConfiguration instance to update its map,
4251 // mPrivateDnsValidateThreads, which is used for tracking validation threads.
4252 // Since there is a time gap between when PrivateDnsConfiguration reports
4253 // onPrivateDnsValidationEvent and when PrivateDnsConfiguration updates the map, this is a
4254 // workaround to avoid the test starts a subsequent resolver setup during the time gap.
4255 // TODO: Report onPrivateDnsValidationEvent after all the relevant updates are complete.
4256 // Reference to b/152009023.
4257 std::this_thread::sleep_for(20ms);
4258 };
Mike Yuc0000252020-03-19 07:14:23 +00004259
4260 test::DNSResponder dns1(addr1);
4261 test::DNSResponder dns2(addr2);
4262 StartDns(dns1, {});
4263 StartDns(dns2, {});
4264 test::DnsTlsFrontend workableTls(addr1, "853", addr1, "53");
4265 test::DnsTlsFrontend unresponsiveTls(addr2, "853", addr2, "53");
4266 unresponsiveTls.setHangOnHandshakeForTesting(true);
4267 ASSERT_TRUE(workableTls.startServer());
4268 ASSERT_TRUE(unresponsiveTls.startServer());
4269
4270 // First setup.
4271 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4272 parcel.servers = {addr1, addr2, unusable_addr};
4273 parcel.tlsServers = {addr1, addr2, unusable_addr};
4274 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4275
4276 // Check the validation results.
4277 EXPECT_TRUE(WaitForPrivateDnsValidation(workableTls.listen_address(), true));
4278 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4279 EXPECT_EQ(unresponsiveTls.acceptConnectionsCount(), 1); // The validation is still in progress.
4280
4281 static const struct TestConfig {
4282 std::vector<std::string> tlsServers;
4283 std::string tlsName;
4284 } testConfigs[] = {
4285 {{addr1, addr2, unusable_addr}, ""},
4286 {{unusable_addr, addr1, addr2}, ""},
4287 {{unusable_addr, addr1, addr2}, kDefaultPrivateDnsHostName},
4288 {{addr1, addr2, unusable_addr}, kDefaultPrivateDnsHostName},
4289 };
4290
4291 std::string TlsNameLastTime;
4292 for (const auto& config : testConfigs) {
4293 SCOPED_TRACE(fmt::format("testConfig: [{}] [{}]", fmt::join(config.tlsServers, ","),
4294 config.tlsName));
4295 parcel.servers = config.tlsServers;
4296 parcel.tlsServers = config.tlsServers;
4297 parcel.tlsName = config.tlsName;
4298 parcel.caCertificate = config.tlsName.empty() ? "" : kCaCert;
4299
4300 const bool dnsModeChanged = (TlsNameLastTime != config.tlsName);
Mike Yu1ec523a2020-03-20 12:22:24 +00004301
4302 waitForPrivateDnsStateUpdated();
Mike Yuc0000252020-03-19 07:14:23 +00004303 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4304
4305 for (const auto& serverAddr : parcel.tlsServers) {
4306 SCOPED_TRACE(serverAddr);
4307 if (serverAddr == workableTls.listen_address()) {
4308 if (dnsModeChanged) {
4309 // In despite of the identical IP address, the server is regarded as a different
4310 // server when DnsTlsServer.name is different. The resolver treats it as a
4311 // different object and begins the validation process.
4312 EXPECT_TRUE(WaitForPrivateDnsValidation(serverAddr, true));
4313 }
4314 } else if (serverAddr == unresponsiveTls.listen_address()) {
4315 // No revalidation needed for the server which have been marked as in_progesss.
4316 } else {
4317 // Must be unusable_addr.
4318 // In opportunistic mode, when a validation for a private DNS server fails, the
4319 // resolver just marks the server as failed and doesn't re-evaluate it, but the
4320 // server can be re-evaluated when setResolverConfiguration() is called.
4321 // However, in strict mode, the resolver automatically re-evaluates the server and
4322 // marks the server as in_progress until the validation succeeds, so repeated setup
4323 // makes no effect.
4324 if (dnsModeChanged || config.tlsName.empty() /* not in strict mode */) {
4325 EXPECT_TRUE(WaitForPrivateDnsValidation(serverAddr, false));
4326 }
4327 }
4328 }
4329
4330 // Repeated setups make no effect in strict mode.
Mike Yu1ec523a2020-03-20 12:22:24 +00004331 waitForPrivateDnsStateUpdated();
Mike Yuc0000252020-03-19 07:14:23 +00004332 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4333 if (config.tlsName.empty()) {
4334 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4335 }
Mike Yu1ec523a2020-03-20 12:22:24 +00004336 waitForPrivateDnsStateUpdated();
Mike Yuc0000252020-03-19 07:14:23 +00004337 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4338 if (config.tlsName.empty()) {
4339 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4340 }
4341
4342 EXPECT_EQ(unresponsiveTls.acceptConnectionsCount(), 1);
4343
4344 TlsNameLastTime = config.tlsName;
4345 }
4346
4347 // Check that all the validation results are caught.
4348 // Note: it doesn't mean no validation being in progress.
4349 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr1));
4350 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr2));
4351 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(unusable_addr));
4352}
4353
4354TEST_F(ResolverTest, RepeatedSetup_KeepChangingPrivateDnsServers) {
4355 enum TlsServerState { WORKING, UNSUPPORTED, UNRESPONSIVE };
4356 const std::string addr1 = getUniqueIPv4Address();
4357 const std::string addr2 = getUniqueIPv4Address();
Mike Yubad95cf2020-03-26 03:19:38 +00004358 const auto waitForPrivateDnsStateUpdated = []() {
4359 // A buffer time for PrivateDnsConfiguration to update its state. It prevents this test
4360 // being flaky. See b/152009023 for the reason.
4361 std::this_thread::sleep_for(20ms);
4362 };
Mike Yuc0000252020-03-19 07:14:23 +00004363
4364 test::DNSResponder dns1(addr1);
4365 test::DNSResponder dns2(addr2);
4366 StartDns(dns1, {});
4367 StartDns(dns2, {});
4368 test::DnsTlsFrontend tls1(addr1, "853", addr1, "53");
4369 test::DnsTlsFrontend tls2(addr2, "853", addr2, "53");
4370 ASSERT_TRUE(tls1.startServer());
4371 ASSERT_TRUE(tls2.startServer());
4372
4373 static const struct TestConfig {
4374 std::string tlsServer;
4375 std::string tlsName;
4376 bool expectNothingHappenWhenServerUnsupported;
4377 bool expectNothingHappenWhenServerUnresponsive;
4378 std::string asTestName() const {
4379 return fmt::format("{}, {}, {}, {}", tlsServer, tlsName,
4380 expectNothingHappenWhenServerUnsupported,
4381 expectNothingHappenWhenServerUnresponsive);
4382 }
4383 } testConfigs[] = {
4384 {{addr1}, "", false, false},
4385 {{addr2}, "", false, false},
4386 {{addr1}, "", false, true},
4387 {{addr2}, "", false, true},
4388 {{addr1}, kDefaultPrivateDnsHostName, false, true},
4389 {{addr2}, kDefaultPrivateDnsHostName, false, true},
4390 {{addr1}, kDefaultPrivateDnsHostName, true, true},
4391 {{addr2}, kDefaultPrivateDnsHostName, true, true},
4392
4393 // There's no new validation to start because there are already two validation threads
4394 // running (one is for addr1, the other is for addr2). This is because the comparator
4395 // doesn't compare DnsTlsServer.name. Keep the design as-is until it's known to be
4396 // harmful.
4397 {{addr1}, "", true, true},
4398 {{addr2}, "", true, true},
4399 {{addr1}, "", true, true},
4400 {{addr2}, "", true, true},
4401 };
4402
4403 for (const auto& serverState : {WORKING, UNSUPPORTED, UNRESPONSIVE}) {
4404 int testIndex = 0;
4405 for (const auto& config : testConfigs) {
4406 SCOPED_TRACE(fmt::format("serverState:{} testIndex:{} testConfig:[{}]", serverState,
4407 testIndex++, config.asTestName()));
4408 auto& tls = (config.tlsServer == addr1) ? tls1 : tls2;
4409
4410 if (serverState == UNSUPPORTED && tls.running()) ASSERT_TRUE(tls.stopServer());
4411 if (serverState != UNSUPPORTED && !tls.running()) ASSERT_TRUE(tls.startServer());
4412
4413 tls.setHangOnHandshakeForTesting(serverState == UNRESPONSIVE);
4414 const int connectCountsBefore = tls.acceptConnectionsCount();
4415
Mike Yubad95cf2020-03-26 03:19:38 +00004416 waitForPrivateDnsStateUpdated();
Mike Yuc0000252020-03-19 07:14:23 +00004417 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4418 parcel.servers = {config.tlsServer};
4419 parcel.tlsServers = {config.tlsServer};
4420 parcel.tlsName = config.tlsName;
4421 parcel.caCertificate = config.tlsName.empty() ? "" : kCaCert;
4422 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4423
4424 if (serverState == WORKING) {
4425 EXPECT_TRUE(WaitForPrivateDnsValidation(config.tlsServer, true));
4426 } else if (serverState == UNSUPPORTED) {
4427 if (config.expectNothingHappenWhenServerUnsupported) {
4428 // It's possible that the resolver hasn't yet started to
4429 // connect. Wait a while.
4430 // TODO: See if we can get rid of the hard waiting time, such as comparing
4431 // the CountDiff across two tests.
4432 std::this_thread::sleep_for(100ms);
4433 EXPECT_EQ(tls.acceptConnectionsCount(), connectCountsBefore);
4434 } else {
4435 EXPECT_TRUE(WaitForPrivateDnsValidation(config.tlsServer, false));
4436 }
4437 } else {
4438 // Must be UNRESPONSIVE.
4439 // DnsTlsFrontend is the only signal for checking whether or not the resolver starts
4440 // another validation when the server is unresponsive.
4441 const int expectCountDiff =
4442 config.expectNothingHappenWhenServerUnresponsive ? 0 : 1;
4443 if (expectCountDiff == 0) {
4444 // It's possible that the resolver hasn't yet started to
4445 // connect. Wait a while.
4446 std::this_thread::sleep_for(100ms);
4447 }
4448 const auto condition = [&]() {
4449 return tls.acceptConnectionsCount() == connectCountsBefore + expectCountDiff;
4450 };
4451 EXPECT_TRUE(PollForCondition(condition));
4452 }
4453 }
4454
4455 // Set to off mode to reset the PrivateDnsConfiguration state.
4456 ResolverParamsParcel setupOffmode = DnsResponderClient::GetDefaultResolverParamsParcel();
4457 setupOffmode.tlsServers.clear();
4458 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(setupOffmode));
4459 }
4460
4461 // Check that all the validation results are caught.
4462 // Note: it doesn't mean no validation being in progress.
4463 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr1));
4464 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr2));
4465}
4466
Hungming Chenbb90ab32019-10-28 18:20:31 +08004467// Parameterized tests.
4468// TODO: Merge the existing tests as parameterized test if possible.
4469// TODO: Perhaps move parameterized tests to an independent file.
4470enum class CallType { GETADDRINFO, GETHOSTBYNAME };
4471class ResolverParameterizedTest : public ResolverTest,
Hungming Chen63779052019-10-30 15:06:13 +08004472 public testing::WithParamInterface<CallType> {
4473 protected:
Hungming Chen22617fd2019-12-06 12:15:45 +08004474 void VerifyQueryHelloExampleComV4(const test::DNSResponder& dns, const CallType calltype,
4475 const bool verifyNumQueries = true) {
Hungming Chen63779052019-10-30 15:06:13 +08004476 if (calltype == CallType::GETADDRINFO) {
4477 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4478 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4479 ASSERT_TRUE(result != nullptr);
4480 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4481 } else if (calltype == CallType::GETHOSTBYNAME) {
4482 const hostent* result = gethostbyname("hello");
4483 ASSERT_TRUE(result != nullptr);
4484 ASSERT_EQ(4, result->h_length);
4485 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
4486 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4487 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
4488 } else {
4489 FAIL() << "Unsupported call type: " << static_cast<uint32_t>(calltype);
4490 }
Hungming Chen22617fd2019-12-06 12:15:45 +08004491 if (verifyNumQueries) EXPECT_EQ(1U, GetNumQueries(dns, kHelloExampleCom));
Hungming Chen63779052019-10-30 15:06:13 +08004492 }
4493};
Hungming Chenbb90ab32019-10-28 18:20:31 +08004494
Hungming Chen63779052019-10-30 15:06:13 +08004495INSTANTIATE_TEST_SUITE_P(QueryCallTest, ResolverParameterizedTest,
Hungming Chenbb90ab32019-10-28 18:20:31 +08004496 testing::Values(CallType::GETADDRINFO, CallType::GETHOSTBYNAME),
4497 [](const testing::TestParamInfo<CallType>& info) {
Hungming Chenbb90ab32019-10-28 18:20:31 +08004498 switch (info.param) {
4499 case CallType::GETADDRINFO:
Hungming Chen63779052019-10-30 15:06:13 +08004500 return "GetAddrInfo";
Hungming Chenbb90ab32019-10-28 18:20:31 +08004501 case CallType::GETHOSTBYNAME:
Hungming Chen63779052019-10-30 15:06:13 +08004502 return "GetHostByName";
Hungming Chenbb90ab32019-10-28 18:20:31 +08004503 default:
Hungming Chen63779052019-10-30 15:06:13 +08004504 return "InvalidParameter"; // Should not happen.
Hungming Chenbb90ab32019-10-28 18:20:31 +08004505 }
Hungming Chenbb90ab32019-10-28 18:20:31 +08004506 });
4507
4508TEST_P(ResolverParameterizedTest, AuthoritySectionAndAdditionalSection) {
4509 // DNS response may have more information in authority section and additional section.
4510 // Currently, getanswer() of packages/modules/DnsResolver/getaddrinfo.cpp doesn't parse the
4511 // content of authority section and additional section. Test these sections if they crash
4512 // the resolver, just in case. See also RFC 1035 section 4.1.
4513 const auto& calltype = GetParam();
4514 test::DNSHeader header(kDefaultDnsHeader);
4515
4516 // Create a DNS response which has a authoritative nameserver record in authority
4517 // section and its relevant address record in additional section.
4518 //
4519 // Question
4520 // hello.example.com. IN A
4521 // Answer
4522 // hello.example.com. IN A 1.2.3.4
4523 // Authority:
4524 // hello.example.com. IN NS ns1.example.com.
4525 // Additional:
4526 // ns1.example.com. IN A 5.6.7.8
4527 //
4528 // A response may have only question, answer, and authority section. Current testing response
4529 // should be able to cover this condition.
4530
4531 // Question section.
4532 test::DNSQuestion question{
4533 .qname = {.name = kHelloExampleCom},
4534 .qtype = ns_type::ns_t_a,
4535 .qclass = ns_c_in,
4536 };
4537 header.questions.push_back(std::move(question));
4538
4539 // Answer section.
4540 test::DNSRecord recordAnswer{
4541 .name = {.name = kHelloExampleCom},
4542 .rtype = ns_type::ns_t_a,
4543 .rclass = ns_c_in,
4544 .ttl = 0, // no cache
4545 };
Hungming Chen63779052019-10-30 15:06:13 +08004546 EXPECT_TRUE(test::DNSResponder::fillRdata(kHelloExampleComAddrV4, recordAnswer));
Hungming Chenbb90ab32019-10-28 18:20:31 +08004547 header.answers.push_back(std::move(recordAnswer));
4548
4549 // Authority section.
4550 test::DNSRecord recordAuthority{
4551 .name = {.name = kHelloExampleCom},
4552 .rtype = ns_type::ns_t_ns,
4553 .rclass = ns_c_in,
4554 .ttl = 0, // no cache
4555 };
4556 EXPECT_TRUE(test::DNSResponder::fillRdata("ns1.example.com.", recordAuthority));
4557 header.authorities.push_back(std::move(recordAuthority));
4558
4559 // Additional section.
4560 test::DNSRecord recordAdditional{
4561 .name = {.name = "ns1.example.com."},
4562 .rtype = ns_type::ns_t_a,
4563 .rclass = ns_c_in,
4564 .ttl = 0, // no cache
4565 };
4566 EXPECT_TRUE(test::DNSResponder::fillRdata("5.6.7.8", recordAdditional));
4567 header.additionals.push_back(std::move(recordAdditional));
4568
4569 // Start DNS server.
4570 test::DNSResponder dns(test::DNSResponder::MappingType::DNS_HEADER);
4571 dns.addMappingDnsHeader(kHelloExampleCom, ns_type::ns_t_a, header);
4572 ASSERT_TRUE(dns.startServer());
4573 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4574 dns.clearQueries();
4575
4576 // Expect that get the address and the resolver doesn't crash.
Hungming Chen63779052019-10-30 15:06:13 +08004577 VerifyQueryHelloExampleComV4(dns, calltype);
4578}
4579
4580TEST_P(ResolverParameterizedTest, MessageCompression) {
4581 const auto& calltype = GetParam();
4582
4583 // The response with compressed domain name by a pointer. See RFC 1035 section 4.1.4.
4584 //
4585 // Ignoring the other fields of the message, the domain name of question section and answer
4586 // section are presented as:
4587 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4588 // 12 | 5 | h |
4589 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4590 // 14 | e | l |
4591 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4592 // 16 | l | o |
4593 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4594 // 18 | 7 | e |
4595 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4596 // 20 | x | a |
4597 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4598 // 22 | m | p |
4599 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4600 // 24 | l | e |
4601 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4602 // 26 | 3 | c |
4603 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4604 // 28 | o | m |
4605 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4606 // 30 | 0 | ... |
4607 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4608 //
4609 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4610 // 35 | 1 1| 12 |
4611 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4612 const std::vector<uint8_t> kResponseAPointer = {
4613 /* Header */
4614 0x00, 0x00, /* Transaction ID: 0x0000 */
4615 0x81, 0x80, /* Flags: qr rd ra */
4616 0x00, 0x01, /* Questions: 1 */
4617 0x00, 0x01, /* Answer RRs: 1 */
4618 0x00, 0x00, /* Authority RRs: 0 */
4619 0x00, 0x00, /* Additional RRs: 0 */
4620 /* Queries */
4621 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
4622 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name: hello.example.com */
4623 0x00, 0x01, /* Type: A */
4624 0x00, 0x01, /* Class: IN */
4625 /* Answers */
4626 0xc0, 0x0c, /* Name: hello.example.com (a pointer) */
4627 0x00, 0x01, /* Type: A */
4628 0x00, 0x01, /* Class: IN */
4629 0x00, 0x00, 0x00, 0x00, /* Time to live: 0 */
4630 0x00, 0x04, /* Data length: 4 */
4631 0x01, 0x02, 0x03, 0x04 /* Address: 1.2.3.4 */
4632 };
4633
4634 // The response with compressed domain name by a sequence of labels ending with a pointer. See
4635 // RFC 1035 section 4.1.4.
4636 //
4637 // Ignoring the other fields of the message, the domain name of question section and answer
4638 // section are presented as:
4639 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4640 // 12 | 5 | h |
4641 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4642 // 14 | e | l |
4643 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4644 // 16 | l | o |
4645 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4646 // 18 | 7 | e |
4647 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4648 // 20 | x | a |
4649 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4650 // 22 | m | p |
4651 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4652 // 24 | l | e |
4653 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4654 // 26 | 3 | c |
4655 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4656 // 28 | o | m |
4657 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4658 // 30 | 0 | ... |
4659 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4660 //
4661 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4662 // 35 | 5 | h |
4663 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4664 // 37 | e | l |
4665 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4666 // 39 | l | o |
4667 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4668 // 41 | 1 1| 18 |
4669 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4670 const std::vector<uint8_t> kResponseLabelEndingWithAPointer = {
4671 /* Header */
4672 0x00, 0x00, /* Transaction ID: 0x0000 */
4673 0x81, 0x80, /* Flags: qr rd ra */
4674 0x00, 0x01, /* Questions: 1 */
4675 0x00, 0x01, /* Answer RRs: 1 */
4676 0x00, 0x00, /* Authority RRs: 0 */
4677 0x00, 0x00, /* Additional RRs: 0 */
4678 /* Queries */
4679 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
4680 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name: hello.example.com */
4681 0x00, 0x01, /* Type: A */
4682 0x00, 0x01, /* Class: IN */
4683 /* Answers */
4684 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0xc0,
4685 0x12, /* Name: hello.example.com (a label ending with a pointer) */
4686 0x00, 0x01, /* Type: A */
4687 0x00, 0x01, /* Class: IN */
4688 0x00, 0x00, 0x00, 0x00, /* Time to live: 0 */
4689 0x00, 0x04, /* Data length: 4 */
4690 0x01, 0x02, 0x03, 0x04 /* Address: 1.2.3.4 */
4691 };
4692
4693 for (const auto& response : {kResponseAPointer, kResponseLabelEndingWithAPointer}) {
4694 SCOPED_TRACE(StringPrintf("Hex dump: %s", toHex(makeSlice(response)).c_str()));
4695
4696 test::DNSResponder dns(test::DNSResponder::MappingType::BINARY_PACKET);
4697 dns.addMappingBinaryPacket(kHelloExampleComQueryV4, response);
4698 StartDns(dns, {});
4699 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4700
4701 // Expect no cache because the TTL of testing responses are 0.
4702 VerifyQueryHelloExampleComV4(dns, calltype);
Hungming Chenbb90ab32019-10-28 18:20:31 +08004703 }
Mike Yu40e67072019-10-09 21:14:09 +08004704}
Hungming Chen22617fd2019-12-06 12:15:45 +08004705
4706TEST_P(ResolverParameterizedTest, TruncatedResponse) {
4707 const auto& calltype = GetParam();
4708
Hungming Chen22617fd2019-12-06 12:15:45 +08004709 test::DNSResponder dns;
Ken Chen99344882020-01-01 14:59:38 +08004710 StartDns(dns, kLargeCnameChainRecords);
Hungming Chen22617fd2019-12-06 12:15:45 +08004711 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4712
4713 // Expect UDP response is truncated. The resolver retries over TCP. See RFC 1035 section 4.2.1.
4714 VerifyQueryHelloExampleComV4(dns, calltype, false);
4715 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom));
4716 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom));
4717}