blob: 0789d7c4d2d6f8ccbef64fe8e8caceec2b7d0aec [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 Yu153b5b82020-03-04 19:53:54 +080084using 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 Yue2162e52020-03-04 18:43:46 +0800120struct NameserverStats {
121 NameserverStats() = delete;
122 NameserverStats(const std::string server) : server(server) {}
123 NameserverStats& setSuccesses(int val) {
124 successes = val;
125 return *this;
126 }
127 NameserverStats& setErrors(int val) {
128 errors = val;
129 return *this;
130 }
131 NameserverStats& setTimeouts(int val) {
132 timeouts = val;
133 return *this;
134 }
135 NameserverStats& setInternalErrors(int val) {
136 internal_errors = val;
137 return *this;
138 }
139
140 const std::string server;
141 int successes = 0;
142 int errors = 0;
143 int timeouts = 0;
144 int internal_errors = 0;
145};
146
Ken Chenb9fa2062018-11-13 21:51:13 +0800147} // namespace
148
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900149class ResolverTest : public ::testing::Test {
Hungming Chene8f970c2019-04-10 17:34:06 +0800150 public:
Hungming Chen473c4de2020-03-12 11:13:35 +0800151 static void SetUpTestSuite() {
Hungming Chen5bf09772019-04-25 11:16:13 +0800152 // Get binder service.
153 // Note that |mDnsClient| is not used for getting binder service in this static function.
154 // The reason is that wants to keep |mDnsClient| as a non-static data member. |mDnsClient|
155 // which sets up device network configuration could be independent from every test.
Luke Huangf8215372019-11-22 11:53:41 +0800156 // TODO: Perhaps add a static function in resolv_test_binder_utils.{cpp,h} to get binder
157 // service.
158
159 AIBinder* binder = AServiceManager_getService("dnsresolver");
160 ndk::SpAIBinder resolvBinder = ndk::SpAIBinder(binder);
161 auto resolvService = aidl::android::net::IDnsResolver::fromBinder(resolvBinder);
Hungming Chen5bf09772019-04-25 11:16:13 +0800162 ASSERT_NE(nullptr, resolvService.get());
163
164 // Subscribe the death recipient to the service IDnsResolver for detecting Netd death.
Luke Huang70070852019-11-25 18:25:50 +0800165 // GTEST assertion macros are not invoked for generating a test failure in the death
166 // recipient because the macros can't indicate failed test if Netd died between tests.
167 // Moreover, continuing testing may have no meaningful after Netd death. Therefore, the
168 // death recipient aborts process by GTEST_LOG_(FATAL) once Netd died.
Luke Huangf8215372019-11-22 11:53:41 +0800169 sResolvDeathRecipient = AIBinder_DeathRecipient_new([](void*) {
170 constexpr char errorMessage[] = "Netd died";
171 LOG(ERROR) << errorMessage;
172 GTEST_LOG_(FATAL) << errorMessage;
173 });
174 ASSERT_EQ(STATUS_OK, AIBinder_linkToDeath(binder, sResolvDeathRecipient, nullptr));
Hungming Chen5bf09772019-04-25 11:16:13 +0800175
176 // Subscribe the DNS listener for verifying DNS metrics event contents.
Luke Huangf8215372019-11-22 11:53:41 +0800177 sDnsMetricsListener = ndk::SharedRefBase::make<DnsMetricsListener>(
178 TEST_NETID /*monitor specific network*/);
Hungming Chen5bf09772019-04-25 11:16:13 +0800179 ASSERT_TRUE(resolvService->registerEventListener(sDnsMetricsListener).isOk());
180
181 // Start the binder thread pool for listening DNS metrics events and receiving death
182 // recipient.
Luke Huangf8215372019-11-22 11:53:41 +0800183 ABinderProcess_startThreadPool();
Hungming Chene8f970c2019-04-10 17:34:06 +0800184 }
Hungming Chen473c4de2020-03-12 11:13:35 +0800185 static void TearDownTestSuite() { AIBinder_DeathRecipient_delete(sResolvDeathRecipient); }
Hungming Chene8f970c2019-04-10 17:34:06 +0800186
Ken Chenb9fa2062018-11-13 21:51:13 +0800187 protected:
Lorenzo Colitti61f796b2020-05-21 00:57:49 +0900188 void SetUp() {
189 mDnsClient.SetUp();
190 sDnsMetricsListener->reset();
191 }
192
Mike Yu960243d2020-01-17 19:02:15 +0800193 void TearDown() {
194 // Ensure the dump works at the end of each test.
195 DumpResolverService();
196
197 mDnsClient.TearDown();
198 }
nuccachena26cc2a2018-07-17 18:07:23 +0800199
Luke Huangf40df9c2020-04-21 08:51:48 +0800200 void resetNetwork() {
201 mDnsClient.TearDown();
202 mDnsClient.SetupOemNetwork();
203 }
204
Xiao Ma09b71022018-12-11 17:56:32 +0900205 void StartDns(test::DNSResponder& dns, const std::vector<DnsRecord>& records) {
206 for (const auto& r : records) {
207 dns.addMapping(r.host_name, r.type, r.addr);
208 }
209
210 ASSERT_TRUE(dns.startServer());
211 dns.clearQueries();
212 }
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900213
Mike Yu960243d2020-01-17 19:02:15 +0800214 void DumpResolverService() {
215 unique_fd fd(open("/dev/null", O_WRONLY));
216 EXPECT_EQ(mDnsClient.resolvService()->dump(fd, nullptr, 0), 0);
217
218 const char* querylogCmd[] = {"querylog"}; // Keep it sync with DnsQueryLog::DUMP_KEYWORD.
219 EXPECT_EQ(mDnsClient.resolvService()->dump(fd, querylogCmd, std::size(querylogCmd)), 0);
220 }
221
Hungming Chene8f970c2019-04-10 17:34:06 +0800222 bool WaitForNat64Prefix(ExpectNat64PrefixStatus status,
223 std::chrono::milliseconds timeout = std::chrono::milliseconds(1000)) {
Hungming Chen5bf09772019-04-25 11:16:13 +0800224 return sDnsMetricsListener->waitForNat64Prefix(status, timeout);
Hungming Chene8f970c2019-04-10 17:34:06 +0800225 }
226
Mike Yu724f77d2019-08-16 11:14:50 +0800227 bool WaitForPrivateDnsValidation(std::string serverAddr, bool validated) {
228 return sDnsMetricsListener->waitForPrivateDnsValidation(serverAddr, validated);
229 }
230
Mike Yu153b5b82020-03-04 19:53:54 +0800231 bool hasUncaughtPrivateDnsValidation(const std::string& serverAddr) {
232 return sDnsMetricsListener->findValidationRecord(serverAddr);
233 }
234
Mike Yue2162e52020-03-04 18:43:46 +0800235 bool expectStatsFromGetResolverInfo(const std::vector<NameserverStats>& nameserversStats) {
236 std::vector<std::string> res_servers;
237 std::vector<std::string> res_domains;
238 std::vector<std::string> res_tls_servers;
239 res_params res_params;
240 std::vector<ResolverStats> res_stats;
241 int wait_for_pending_req_timeout_count;
242
243 if (!DnsResponderClient::GetResolverInfo(mDnsClient.resolvService(), TEST_NETID,
244 &res_servers, &res_domains, &res_tls_servers,
245 &res_params, &res_stats,
246 &wait_for_pending_req_timeout_count)) {
247 ADD_FAILURE() << "GetResolverInfo failed";
248 return false;
249 }
250
251 if (res_servers.size() != res_stats.size()) {
252 ADD_FAILURE() << fmt::format("res_servers.size() != res_stats.size(): {} != {}",
253 res_servers.size(), res_stats.size());
254 return false;
255 }
256 if (res_servers.size() != nameserversStats.size()) {
257 ADD_FAILURE() << fmt::format("res_servers.size() != nameserversStats.size(): {} != {}",
258 res_servers.size(), nameserversStats.size());
259 return false;
260 }
261
262 for (const auto& stats : nameserversStats) {
263 SCOPED_TRACE(stats.server);
264 const auto it = std::find(res_servers.begin(), res_servers.end(), stats.server);
265 if (it == res_servers.end()) {
266 ADD_FAILURE() << fmt::format("nameserver {} not found in the list {{{}}}",
267 stats.server, fmt::join(res_servers, ", "));
268 return false;
269 }
270 const int index = std::distance(res_servers.begin(), it);
271
272 // The check excludes rtt_avg, last_sample_time, and usable since they will be obsolete
273 // after |res_stats| is retrieved from NetConfig.dnsStats rather than NetConfig.nsstats.
274 EXPECT_EQ(res_stats[index].successes, stats.successes);
275 EXPECT_EQ(res_stats[index].errors, stats.errors);
276 EXPECT_EQ(res_stats[index].timeouts, stats.timeouts);
277 EXPECT_EQ(res_stats[index].internal_errors, stats.internal_errors);
278 }
279
280 return true;
281 }
282
Mike Yu153b5b82020-03-04 19:53:54 +0800283 // Since there's no way to terminate private DNS validation threads at any time. Tests that
284 // focus on the results of private DNS validation can interfere with each other if they use the
285 // same IP address for test servers. getUniqueIPv4Address() is a workaround to reduce the
286 // possibility of tests being flaky. A feasible solution is to forbid the validation threads,
287 // which are considered as outdated (e.g. switch the resolver to private DNS OFF mode), updating
288 // the result to the PrivateDnsConfiguration instance.
289 static std::string getUniqueIPv4Address() {
290 static int counter = 0;
291 return fmt::format("127.0.100.{}", (++counter & 0xff));
292 }
293
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900294 DnsResponderClient mDnsClient;
Xiao Ma09b71022018-12-11 17:56:32 +0900295
Hungming Chen5bf09772019-04-25 11:16:13 +0800296 // Use a shared static DNS listener for all tests to avoid registering lots of listeners
297 // which may be released late until process terminated. Currently, registered DNS listener
298 // is removed by binder death notification which is fired when the process hosting an
299 // IBinder has gone away. If every test in ResolverTest registers its DNS listener, Netd
300 // may temporarily hold lots of dead listeners until the unit test process terminates.
301 // TODO: Perhaps add an unregistering listener binder call or fork a listener process which
302 // could be terminated earlier.
Luke Huangf8215372019-11-22 11:53:41 +0800303 static std::shared_ptr<DnsMetricsListener>
Hungming Chen473c4de2020-03-12 11:13:35 +0800304 sDnsMetricsListener; // Initialized in SetUpTestSuite.
Hungming Chen5bf09772019-04-25 11:16:13 +0800305
306 // Use a shared static death recipient to monitor the service death. The static death
307 // recipient could monitor the death not only during the test but also between tests.
Hungming Chen473c4de2020-03-12 11:13:35 +0800308 static AIBinder_DeathRecipient* sResolvDeathRecipient; // Initialized in SetUpTestSuite.
Ken Chenb9fa2062018-11-13 21:51:13 +0800309};
310
Hungming Chen5bf09772019-04-25 11:16:13 +0800311// Initialize static member of class.
Luke Huangf8215372019-11-22 11:53:41 +0800312std::shared_ptr<DnsMetricsListener> ResolverTest::sDnsMetricsListener;
313AIBinder_DeathRecipient* ResolverTest::sResolvDeathRecipient;
Hungming Chen5bf09772019-04-25 11:16:13 +0800314
Ken Chenb9fa2062018-11-13 21:51:13 +0800315TEST_F(ResolverTest, GetHostByName) {
Xiao Ma09b71022018-12-11 17:56:32 +0900316 constexpr char nonexistent_host_name[] = "nonexistent.example.com.";
317
318 test::DNSResponder dns;
319 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.3"}});
320 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800321
322 const hostent* result;
Ken Chenb9fa2062018-11-13 21:51:13 +0800323 result = gethostbyname("nonexistent");
324 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, nonexistent_host_name));
325 ASSERT_TRUE(result == nullptr);
326 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
327
328 dns.clearQueries();
329 result = gethostbyname("hello");
Xiao Ma09b71022018-12-11 17:56:32 +0900330 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
Ken Chenb9fa2062018-11-13 21:51:13 +0800331 ASSERT_FALSE(result == nullptr);
332 ASSERT_EQ(4, result->h_length);
333 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
334 EXPECT_EQ("1.2.3.3", ToString(result));
335 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800336}
337
lifr4e4a2e02019-01-29 16:53:51 +0800338TEST_F(ResolverTest, GetHostByName_cnames) {
339 constexpr char host_name[] = "host.example.com.";
340 size_t cnamecount = 0;
341 test::DNSResponder dns;
342
343 const std::vector<DnsRecord> records = {
344 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
345 {"a.example.com.", ns_type::ns_t_cname, "b.example.com."},
346 {"b.example.com.", ns_type::ns_t_cname, "c.example.com."},
347 {"c.example.com.", ns_type::ns_t_cname, "d.example.com."},
348 {"d.example.com.", ns_type::ns_t_cname, "e.example.com."},
349 {"e.example.com.", ns_type::ns_t_cname, host_name},
350 {host_name, ns_type::ns_t_a, "1.2.3.3"},
351 {host_name, ns_type::ns_t_aaaa, "2001:db8::42"},
352 };
353 StartDns(dns, records);
354 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
355
356 // using gethostbyname2() to resolve ipv4 hello.example.com. to 1.2.3.3
357 // Ensure the v4 address and cnames are correct
358 const hostent* result;
359 result = gethostbyname2("hello", AF_INET);
360 ASSERT_FALSE(result == nullptr);
361
362 for (int i = 0; result != nullptr && result->h_aliases[i] != nullptr; i++) {
363 std::string domain_name = records[i].host_name.substr(0, records[i].host_name.size() - 1);
364 EXPECT_EQ(result->h_aliases[i], domain_name);
365 cnamecount++;
366 }
367 // The size of "Non-cname type" record in DNS records is 2
368 ASSERT_EQ(cnamecount, records.size() - 2);
369 ASSERT_EQ(4, result->h_length);
370 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
371 EXPECT_EQ("1.2.3.3", ToString(result));
372 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
373 EXPECT_EQ(1U, dns.queries().size()) << dns.dumpQueries();
374
375 // using gethostbyname2() to resolve ipv6 hello.example.com. to 2001:db8::42
376 // Ensure the v6 address and cnames are correct
377 cnamecount = 0;
378 dns.clearQueries();
379 result = gethostbyname2("hello", AF_INET6);
380 for (unsigned i = 0; result != nullptr && result->h_aliases[i] != nullptr; i++) {
381 std::string domain_name = records[i].host_name.substr(0, records[i].host_name.size() - 1);
382 EXPECT_EQ(result->h_aliases[i], domain_name);
383 cnamecount++;
384 }
385 // The size of "Non-cname type" DNS record in records is 2
386 ASSERT_EQ(cnamecount, records.size() - 2);
387 ASSERT_FALSE(result == nullptr);
388 ASSERT_EQ(16, result->h_length);
389 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
390 EXPECT_EQ("2001:db8::42", ToString(result));
391 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
392}
393
394TEST_F(ResolverTest, GetHostByName_cnamesInfiniteLoop) {
395 test::DNSResponder dns;
396 const std::vector<DnsRecord> records = {
397 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
398 {"a.example.com.", ns_type::ns_t_cname, kHelloExampleCom},
399 };
400 StartDns(dns, records);
401 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
402
403 const hostent* result;
404 result = gethostbyname2("hello", AF_INET);
405 ASSERT_TRUE(result == nullptr);
406
407 dns.clearQueries();
408 result = gethostbyname2("hello", AF_INET6);
409 ASSERT_TRUE(result == nullptr);
410}
411
Ken Chenb9fa2062018-11-13 21:51:13 +0800412TEST_F(ResolverTest, GetHostByName_localhost) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800413 constexpr char name_camelcase[] = "LocalHost";
Ken Chenb9fa2062018-11-13 21:51:13 +0800414 constexpr char name_ip6_dot[] = "ip6-localhost.";
415 constexpr char name_ip6_fqdn[] = "ip6-localhost.example.com.";
416
417 // Add a dummy nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900418 test::DNSResponder dns;
419 StartDns(dns, {});
420 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800421
422 // Expect no DNS queries; localhost is resolved via /etc/hosts
Xiao Ma09b71022018-12-11 17:56:32 +0900423 const hostent* result = gethostbyname(kLocalHost);
Ken Chenb9fa2062018-11-13 21:51:13 +0800424 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
425 ASSERT_FALSE(result == nullptr);
426 ASSERT_EQ(4, result->h_length);
427 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900428 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800429 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
430
431 // Ensure the hosts file resolver ignores case of hostnames
432 result = gethostbyname(name_camelcase);
433 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
434 ASSERT_FALSE(result == nullptr);
435 ASSERT_EQ(4, result->h_length);
436 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900437 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800438 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
439
440 // The hosts file also contains ip6-localhost, but gethostbyname() won't
chenbruce018fdb22019-06-12 18:08:04 +0800441 // return it. This would be easy to
Ken Chenb9fa2062018-11-13 21:51:13 +0800442 // change, but there's no point in changing the legacy behavior; new code
443 // should be calling getaddrinfo() anyway.
444 // So we check the legacy behavior, which results in amusing A-record
445 // lookups for ip6-localhost, with and without search domains appended.
446 dns.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900447 result = gethostbyname(kIp6LocalHost);
Sehee Parkbbca0202018-11-16 10:53:16 +0900448 EXPECT_EQ(2U, dns.queries().size()) << dns.dumpQueries();
449 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, name_ip6_dot)) << dns.dumpQueries();
450 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, name_ip6_fqdn)) << dns.dumpQueries();
Ken Chenb9fa2062018-11-13 21:51:13 +0800451 ASSERT_TRUE(result == nullptr);
452
453 // Finally, use gethostbyname2() to resolve ip6-localhost to ::1 from
454 // the hosts file.
455 dns.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900456 result = gethostbyname2(kIp6LocalHost, AF_INET6);
Ken Chenb9fa2062018-11-13 21:51:13 +0800457 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
458 ASSERT_FALSE(result == nullptr);
459 ASSERT_EQ(16, result->h_length);
460 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900461 EXPECT_EQ(kIp6LocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800462 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800463}
464
465TEST_F(ResolverTest, GetHostByName_numeric) {
466 // Add a dummy nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900467 test::DNSResponder dns;
468 StartDns(dns, {});
469 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800470
471 // Numeric v4 address: expect no DNS queries
472 constexpr char numeric_v4[] = "192.168.0.1";
Ken Chenb9fa2062018-11-13 21:51:13 +0800473 const hostent* result = gethostbyname(numeric_v4);
Sehee Parkbbca0202018-11-16 10:53:16 +0900474 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800475 ASSERT_FALSE(result == nullptr);
476 ASSERT_EQ(4, result->h_length); // v4
477 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
478 EXPECT_EQ(numeric_v4, ToString(result));
479 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
480
481 // gethostbyname() recognizes a v6 address, and fails with no DNS queries
482 constexpr char numeric_v6[] = "2001:db8::42";
483 dns.clearQueries();
484 result = gethostbyname(numeric_v6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900485 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800486 EXPECT_TRUE(result == nullptr);
487
488 // Numeric v6 address with gethostbyname2(): succeeds with no DNS queries
489 dns.clearQueries();
490 result = gethostbyname2(numeric_v6, AF_INET6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900491 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800492 ASSERT_FALSE(result == nullptr);
493 ASSERT_EQ(16, result->h_length); // v6
494 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
495 EXPECT_EQ(numeric_v6, ToString(result));
496 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
497
498 // Numeric v6 address with scope work with getaddrinfo(),
499 // but gethostbyname2() does not understand them; it issues two dns
500 // queries, then fails. This hardly ever happens, there's no point
501 // in fixing this. This test simply verifies the current (bogus)
502 // behavior to avoid further regressions (like crashes, or leaks).
503 constexpr char numeric_v6_scope[] = "fe80::1%lo";
504 dns.clearQueries();
505 result = gethostbyname2(numeric_v6_scope, AF_INET6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900506 EXPECT_EQ(2U, dns.queries().size()); // OUCH!
Ken Chenb9fa2062018-11-13 21:51:13 +0800507 ASSERT_TRUE(result == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800508}
509
510TEST_F(ResolverTest, BinderSerialization) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800511 std::vector<int> params_offsets = {
Luke Huang5bd827c2019-03-14 16:10:04 +0800512 IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY,
513 IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD,
514 IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES,
515 IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES,
516 IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC,
517 IDnsResolver::RESOLVER_PARAMS_RETRY_COUNT,
Ken Chenb9fa2062018-11-13 21:51:13 +0800518 };
Bernie Innocentib102dd22018-12-04 14:57:48 +0900519 const int size = static_cast<int>(params_offsets.size());
Luke Huang5bd827c2019-03-14 16:10:04 +0800520 EXPECT_EQ(size, IDnsResolver::RESOLVER_PARAMS_COUNT);
Ken Chenb9fa2062018-11-13 21:51:13 +0800521 std::sort(params_offsets.begin(), params_offsets.end());
Bernie Innocentib102dd22018-12-04 14:57:48 +0900522 for (int i = 0; i < size; ++i) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800523 EXPECT_EQ(params_offsets[i], i);
524 }
525}
526
527TEST_F(ResolverTest, GetHostByName_Binder) {
Luke Huangf8215372019-11-22 11:53:41 +0800528 std::vector<std::string> domains = {"example.com"};
Ken Chenb9fa2062018-11-13 21:51:13 +0800529 std::vector<std::unique_ptr<test::DNSResponder>> dns;
530 std::vector<std::string> servers;
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900531 std::vector<DnsResponderClient::Mapping> mappings;
532 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupMappings(1, domains, &mappings));
533 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupDNSServers(4, mappings, &dns, &servers));
Ken Chenb9fa2062018-11-13 21:51:13 +0800534 ASSERT_EQ(1U, mappings.size());
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900535 const DnsResponderClient::Mapping& mapping = mappings[0];
Ken Chenb9fa2062018-11-13 21:51:13 +0800536
Xiao Ma09b71022018-12-11 17:56:32 +0900537 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains, kDefaultParams));
Ken Chenb9fa2062018-11-13 21:51:13 +0800538
539 const hostent* result = gethostbyname(mapping.host.c_str());
Bernie Innocentib102dd22018-12-04 14:57:48 +0900540 const size_t total_queries =
Luke Huangfde82482019-06-04 01:04:53 +0800541 std::accumulate(dns.begin(), dns.end(), 0, [&mapping](size_t total, auto& d) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800542 return total + GetNumQueriesForType(*d, ns_type::ns_t_a, mapping.entry.c_str());
543 });
544
545 EXPECT_LE(1U, total_queries);
546 ASSERT_FALSE(result == nullptr);
547 ASSERT_EQ(4, result->h_length);
548 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
549 EXPECT_EQ(mapping.ip4, ToString(result));
550 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
551
552 std::vector<std::string> res_servers;
553 std::vector<std::string> res_domains;
Mike Yu0a1c53d2018-11-26 13:26:21 +0900554 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +0900555 res_params res_params;
Ken Chenb9fa2062018-11-13 21:51:13 +0800556 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +0800557 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +0800558 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
559 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
560 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chenb9fa2062018-11-13 21:51:13 +0800561 EXPECT_EQ(servers.size(), res_servers.size());
562 EXPECT_EQ(domains.size(), res_domains.size());
Mike Yu0a1c53d2018-11-26 13:26:21 +0900563 EXPECT_EQ(0U, res_tls_servers.size());
Luke Huang5bd827c2019-03-14 16:10:04 +0800564 ASSERT_EQ(static_cast<size_t>(IDnsResolver::RESOLVER_PARAMS_COUNT), kDefaultParams.size());
565 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY],
566 res_params.sample_validity);
567 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900568 res_params.success_threshold);
Luke Huang5bd827c2019-03-14 16:10:04 +0800569 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
570 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
571 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
Ken Chenb9fa2062018-11-13 21:51:13 +0800572 res_params.base_timeout_msec);
573 EXPECT_EQ(servers.size(), res_stats.size());
574
Bernie Innocenti0c067e42019-04-01 15:33:16 +0900575 EXPECT_THAT(res_servers, testing::UnorderedElementsAreArray(servers));
576 EXPECT_THAT(res_domains, testing::UnorderedElementsAreArray(domains));
Ken Chenb9fa2062018-11-13 21:51:13 +0800577}
578
579TEST_F(ResolverTest, GetAddrInfo) {
Xiao Ma09b71022018-12-11 17:56:32 +0900580 constexpr char listen_addr[] = "127.0.0.4";
581 constexpr char listen_addr2[] = "127.0.0.5";
582 constexpr char host_name[] = "howdy.example.com.";
Ken Chenb9fa2062018-11-13 21:51:13 +0800583
Xiao Ma09b71022018-12-11 17:56:32 +0900584 const std::vector<DnsRecord> records = {
585 {host_name, ns_type::ns_t_a, "1.2.3.4"},
586 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
587 };
588 test::DNSResponder dns(listen_addr);
589 test::DNSResponder dns2(listen_addr2);
590 StartDns(dns, records);
591 StartDns(dns2, records);
Ken Chenb9fa2062018-11-13 21:51:13 +0800592
Xiao Ma09b71022018-12-11 17:56:32 +0900593 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}));
Ken Chenb9fa2062018-11-13 21:51:13 +0800594 dns.clearQueries();
595 dns2.clearQueries();
596
597 ScopedAddrinfo result = safe_getaddrinfo("howdy", nullptr, nullptr);
598 EXPECT_TRUE(result != nullptr);
599 size_t found = GetNumQueries(dns, host_name);
600 EXPECT_LE(1U, found);
601 // Could be A or AAAA
602 std::string result_str = ToString(result);
603 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +0800604 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +0800605
606 // Verify that the name is cached.
607 size_t old_found = found;
608 result = safe_getaddrinfo("howdy", nullptr, nullptr);
609 EXPECT_TRUE(result != nullptr);
610 found = GetNumQueries(dns, host_name);
611 EXPECT_LE(1U, found);
612 EXPECT_EQ(old_found, found);
613 result_str = ToString(result);
Luke Huangf8215372019-11-22 11:53:41 +0800614 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4") << result_str;
Ken Chenb9fa2062018-11-13 21:51:13 +0800615
616 // Change the DNS resolver, ensure that queries are still cached.
Xiao Ma09b71022018-12-11 17:56:32 +0900617 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr2}));
Ken Chenb9fa2062018-11-13 21:51:13 +0800618 dns.clearQueries();
619 dns2.clearQueries();
620
621 result = safe_getaddrinfo("howdy", nullptr, nullptr);
622 EXPECT_TRUE(result != nullptr);
623 found = GetNumQueries(dns, host_name);
624 size_t found2 = GetNumQueries(dns2, host_name);
625 EXPECT_EQ(0U, found);
626 EXPECT_LE(0U, found2);
627
628 // Could be A or AAAA
629 result_str = ToString(result);
630 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +0800631 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +0800632}
633
634TEST_F(ResolverTest, GetAddrInfoV4) {
Xiao Ma09b71022018-12-11 17:56:32 +0900635 test::DNSResponder dns;
636 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.5"}});
637 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800638
Xiao Ma09b71022018-12-11 17:56:32 +0900639 const addrinfo hints = {.ai_family = AF_INET};
640 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
Ken Chenb9fa2062018-11-13 21:51:13 +0800641 EXPECT_TRUE(result != nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900642 EXPECT_EQ(1U, GetNumQueries(dns, kHelloExampleCom));
Ken Chenb9fa2062018-11-13 21:51:13 +0800643 EXPECT_EQ("1.2.3.5", ToString(result));
644}
645
646TEST_F(ResolverTest, GetAddrInfo_localhost) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800647 // Add a dummy nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900648 test::DNSResponder dns;
649 StartDns(dns, {});
650 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800651
Xiao Ma09b71022018-12-11 17:56:32 +0900652 ScopedAddrinfo result = safe_getaddrinfo(kLocalHost, nullptr, nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800653 EXPECT_TRUE(result != nullptr);
654 // Expect no DNS queries; localhost is resolved via /etc/hosts
655 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900656 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800657
Xiao Ma09b71022018-12-11 17:56:32 +0900658 result = safe_getaddrinfo(kIp6LocalHost, nullptr, nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800659 EXPECT_TRUE(result != nullptr);
660 // Expect no DNS queries; ip6-localhost is resolved via /etc/hosts
661 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900662 EXPECT_EQ(kIp6LocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800663}
664
Luke Huangd8ac4752019-06-18 17:05:47 +0800665TEST_F(ResolverTest, GetAddrInfo_InvalidSocketType) {
666 test::DNSResponder dns;
667 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.5"}});
668 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
669
670 // TODO: Test other invalid socket types.
671 const addrinfo hints = {
672 .ai_family = AF_UNSPEC,
Luke Huangd8ac4752019-06-18 17:05:47 +0800673 .ai_socktype = SOCK_PACKET,
674 };
675 addrinfo* result = nullptr;
676 // This is a valid hint, but the query won't be sent because the socket type is
677 // not supported.
678 EXPECT_EQ(EAI_NODATA, getaddrinfo("hello", nullptr, &hints, &result));
679 ScopedAddrinfo result_cleanup(result);
680 EXPECT_EQ(nullptr, result);
681}
682
Ken Chen92bed612018-12-22 21:46:55 +0800683// Verify if the resolver correctly handle multiple queries simultaneously
684// step 1: set dns server#1 into deferred responding mode.
685// step 2: thread#1 query "hello.example.com." --> resolver send query to server#1.
686// step 3: thread#2 query "hello.example.com." --> resolver hold the request and wait for
687// response of previous pending query sent by thread#1.
688// step 4: thread#3 query "konbanha.example.com." --> resolver send query to server#3. Server
689// respond to resolver immediately.
690// step 5: check if server#1 get 1 query by thread#1, server#2 get 0 query, server#3 get 1 query.
691// step 6: resume dns server#1 to respond dns query in step#2.
692// step 7: thread#1 and #2 should get returned from DNS query after step#6. Also, check the
693// number of queries in server#2 is 0 to ensure thread#2 does not wake up unexpectedly
694// before signaled by thread#1.
695TEST_F(ResolverTest, GetAddrInfoV4_deferred_resp) {
696 const char* listen_addr1 = "127.0.0.9";
697 const char* listen_addr2 = "127.0.0.10";
698 const char* listen_addr3 = "127.0.0.11";
699 const char* listen_srv = "53";
700 const char* host_name_deferred = "hello.example.com.";
701 const char* host_name_normal = "konbanha.example.com.";
Mike Yufc125e42019-05-15 20:41:28 +0800702 test::DNSResponder dns1(listen_addr1, listen_srv, ns_rcode::ns_r_servfail);
703 test::DNSResponder dns2(listen_addr2, listen_srv, ns_rcode::ns_r_servfail);
704 test::DNSResponder dns3(listen_addr3, listen_srv, ns_rcode::ns_r_servfail);
Ken Chen92bed612018-12-22 21:46:55 +0800705 dns1.addMapping(host_name_deferred, ns_type::ns_t_a, "1.2.3.4");
706 dns2.addMapping(host_name_deferred, ns_type::ns_t_a, "1.2.3.4");
707 dns3.addMapping(host_name_normal, ns_type::ns_t_a, "1.2.3.5");
708 ASSERT_TRUE(dns1.startServer());
709 ASSERT_TRUE(dns2.startServer());
710 ASSERT_TRUE(dns3.startServer());
711 const std::vector<std::string> servers_for_t1 = {listen_addr1};
712 const std::vector<std::string> servers_for_t2 = {listen_addr2};
713 const std::vector<std::string> servers_for_t3 = {listen_addr3};
714 addrinfo hints = {.ai_family = AF_INET};
715 const std::vector<int> params = {300, 25, 8, 8, 5000};
716 bool t3_task_done = false;
717
718 dns1.setDeferredResp(true);
719 std::thread t1([&, this]() {
720 ASSERT_TRUE(
721 mDnsClient.SetResolversForNetwork(servers_for_t1, kDefaultSearchDomains, params));
722 ScopedAddrinfo result = safe_getaddrinfo(host_name_deferred, nullptr, &hints);
723 // t3's dns query should got returned first
724 EXPECT_TRUE(t3_task_done);
725 EXPECT_EQ(1U, GetNumQueries(dns1, host_name_deferred));
726 EXPECT_TRUE(result != nullptr);
727 EXPECT_EQ("1.2.3.4", ToString(result));
728 });
729
730 // ensuring t1 and t2 handler functions are processed in order
731 usleep(100 * 1000);
732 std::thread t2([&, this]() {
733 ASSERT_TRUE(
734 mDnsClient.SetResolversForNetwork(servers_for_t2, kDefaultSearchDomains, params));
735 ScopedAddrinfo result = safe_getaddrinfo(host_name_deferred, nullptr, &hints);
736 EXPECT_TRUE(t3_task_done);
737 EXPECT_EQ(0U, GetNumQueries(dns2, host_name_deferred));
738 EXPECT_TRUE(result != nullptr);
739 EXPECT_EQ("1.2.3.4", ToString(result));
740
741 std::vector<std::string> res_servers;
742 std::vector<std::string> res_domains;
743 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +0900744 res_params res_params;
Ken Chen92bed612018-12-22 21:46:55 +0800745 std::vector<ResolverStats> res_stats;
746 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +0800747 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
748 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains,
749 &res_tls_servers, &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chen92bed612018-12-22 21:46:55 +0800750 EXPECT_EQ(0, wait_for_pending_req_timeout_count);
751 });
752
753 // ensuring t2 and t3 handler functions are processed in order
754 usleep(100 * 1000);
755 std::thread t3([&, this]() {
756 ASSERT_TRUE(
757 mDnsClient.SetResolversForNetwork(servers_for_t3, kDefaultSearchDomains, params));
758 ScopedAddrinfo result = safe_getaddrinfo(host_name_normal, nullptr, &hints);
759 EXPECT_EQ(1U, GetNumQueries(dns1, host_name_deferred));
760 EXPECT_EQ(0U, GetNumQueries(dns2, host_name_deferred));
761 EXPECT_EQ(1U, GetNumQueries(dns3, host_name_normal));
762 EXPECT_TRUE(result != nullptr);
763 EXPECT_EQ("1.2.3.5", ToString(result));
764
765 t3_task_done = true;
766 dns1.setDeferredResp(false);
767 });
768 t3.join();
769 t1.join();
770 t2.join();
771}
772
lifr4e4a2e02019-01-29 16:53:51 +0800773TEST_F(ResolverTest, GetAddrInfo_cnames) {
774 constexpr char host_name[] = "host.example.com.";
775 test::DNSResponder dns;
776 const std::vector<DnsRecord> records = {
777 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
778 {"a.example.com.", ns_type::ns_t_cname, "b.example.com."},
779 {"b.example.com.", ns_type::ns_t_cname, "c.example.com."},
780 {"c.example.com.", ns_type::ns_t_cname, "d.example.com."},
781 {"d.example.com.", ns_type::ns_t_cname, "e.example.com."},
782 {"e.example.com.", ns_type::ns_t_cname, host_name},
783 {host_name, ns_type::ns_t_a, "1.2.3.3"},
784 {host_name, ns_type::ns_t_aaaa, "2001:db8::42"},
785 };
786 StartDns(dns, records);
787 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
788
789 addrinfo hints = {.ai_family = AF_INET};
790 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
791 EXPECT_TRUE(result != nullptr);
792 EXPECT_EQ("1.2.3.3", ToString(result));
793
794 dns.clearQueries();
795 hints = {.ai_family = AF_INET6};
796 result = safe_getaddrinfo("hello", nullptr, &hints);
797 EXPECT_TRUE(result != nullptr);
798 EXPECT_EQ("2001:db8::42", ToString(result));
799}
800
801TEST_F(ResolverTest, GetAddrInfo_cnamesNoIpAddress) {
802 test::DNSResponder dns;
803 const std::vector<DnsRecord> records = {
804 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
805 };
806 StartDns(dns, records);
807 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
808
809 addrinfo hints = {.ai_family = AF_INET};
810 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
811 EXPECT_TRUE(result == nullptr);
812
813 dns.clearQueries();
814 hints = {.ai_family = AF_INET6};
815 result = safe_getaddrinfo("hello", nullptr, &hints);
816 EXPECT_TRUE(result == nullptr);
817}
818
819TEST_F(ResolverTest, GetAddrInfo_cnamesIllegalRdata) {
820 test::DNSResponder dns;
821 const std::vector<DnsRecord> records = {
822 {kHelloExampleCom, ns_type::ns_t_cname, ".!#?"},
823 };
824 StartDns(dns, records);
825 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
826
827 addrinfo hints = {.ai_family = AF_INET};
828 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
829 EXPECT_TRUE(result == nullptr);
830
831 dns.clearQueries();
832 hints = {.ai_family = AF_INET6};
833 result = safe_getaddrinfo("hello", nullptr, &hints);
834 EXPECT_TRUE(result == nullptr);
835}
836
Ken Chenb9fa2062018-11-13 21:51:13 +0800837TEST_F(ResolverTest, MultidomainResolution) {
Xiao Ma09b71022018-12-11 17:56:32 +0900838 constexpr char host_name[] = "nihao.example2.com.";
Luke Huangf8215372019-11-22 11:53:41 +0800839 std::vector<std::string> searchDomains = {"example1.com", "example2.com", "example3.com"};
Ken Chenb9fa2062018-11-13 21:51:13 +0800840
Xiao Ma09b71022018-12-11 17:56:32 +0900841 test::DNSResponder dns("127.0.0.6");
842 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.3"}});
843 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({"127.0.0.6"}, searchDomains));
844
Ken Chenb9fa2062018-11-13 21:51:13 +0800845 const hostent* result = gethostbyname("nihao");
Xiao Ma09b71022018-12-11 17:56:32 +0900846
Ken Chenb9fa2062018-11-13 21:51:13 +0800847 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
848 ASSERT_FALSE(result == nullptr);
849 ASSERT_EQ(4, result->h_length);
850 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
851 EXPECT_EQ("1.2.3.3", ToString(result));
852 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800853}
854
855TEST_F(ResolverTest, GetAddrInfoV6_numeric) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800856 constexpr char host_name[] = "ohayou.example.com.";
857 constexpr char numeric_addr[] = "fe80::1%lo";
858
Xiao Ma09b71022018-12-11 17:56:32 +0900859 test::DNSResponder dns;
Ken Chenb9fa2062018-11-13 21:51:13 +0800860 dns.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900861 StartDns(dns, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
862 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800863
864 addrinfo hints = {.ai_family = AF_INET6};
865 ScopedAddrinfo result = safe_getaddrinfo(numeric_addr, nullptr, &hints);
866 EXPECT_TRUE(result != nullptr);
867 EXPECT_EQ(numeric_addr, ToString(result));
868 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
869
870 // Now try a non-numeric hostname query with the AI_NUMERICHOST flag set.
871 // We should fail without sending out a DNS query.
872 hints.ai_flags |= AI_NUMERICHOST;
873 result = safe_getaddrinfo(host_name, nullptr, &hints);
874 EXPECT_TRUE(result == nullptr);
875 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
876}
877
878TEST_F(ResolverTest, GetAddrInfoV6_failing) {
Xiao Ma09b71022018-12-11 17:56:32 +0900879 constexpr char listen_addr0[] = "127.0.0.7";
880 constexpr char listen_addr1[] = "127.0.0.8";
Ken Chenb9fa2062018-11-13 21:51:13 +0800881 const char* host_name = "ohayou.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +0900882
883 test::DNSResponder dns0(listen_addr0);
884 test::DNSResponder dns1(listen_addr1);
Ken Chenb9fa2062018-11-13 21:51:13 +0800885 dns0.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900886 StartDns(dns0, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
887 StartDns(dns1, {{host_name, ns_type::ns_t_aaaa, "2001:db8::6"}});
888
Luke Huangf8215372019-11-22 11:53:41 +0800889 std::vector<std::string> servers = {listen_addr0, listen_addr1};
Ken Chenb9fa2062018-11-13 21:51:13 +0800890 // <sample validity in s> <success threshold in percent> <min samples> <max samples>
891 int sample_count = 8;
Luke Huangf8215372019-11-22 11:53:41 +0800892 const std::vector<int> params = {300, 25, sample_count, sample_count};
Xiao Ma09b71022018-12-11 17:56:32 +0900893 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, kDefaultSearchDomains, params));
Ken Chenb9fa2062018-11-13 21:51:13 +0800894
895 // Repeatedly perform resolutions for non-existing domains until MAXNSSAMPLES resolutions have
896 // reached the dns0, which is set to fail. No more requests should then arrive at that server
897 // for the next sample_lifetime seconds.
898 // TODO: This approach is implementation-dependent, change once metrics reporting is available.
Xiao Ma09b71022018-12-11 17:56:32 +0900899 const addrinfo hints = {.ai_family = AF_INET6};
Bernie Innocentib102dd22018-12-04 14:57:48 +0900900 for (int i = 0; i < sample_count; ++i) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800901 std::string domain = StringPrintf("nonexistent%d", i);
902 ScopedAddrinfo result = safe_getaddrinfo(domain.c_str(), nullptr, &hints);
903 }
904 // Due to 100% errors for all possible samples, the server should be ignored from now on and
905 // only the second one used for all following queries, until NSSAMPLE_VALIDITY is reached.
906 dns0.clearQueries();
907 dns1.clearQueries();
908 ScopedAddrinfo result = safe_getaddrinfo("ohayou", nullptr, &hints);
909 EXPECT_TRUE(result != nullptr);
910 EXPECT_EQ(0U, GetNumQueries(dns0, host_name));
911 EXPECT_EQ(1U, GetNumQueries(dns1, host_name));
912}
913
914TEST_F(ResolverTest, GetAddrInfoV6_nonresponsive) {
Xiao Ma09b71022018-12-11 17:56:32 +0900915 constexpr char listen_addr0[] = "127.0.0.7";
916 constexpr char listen_addr1[] = "127.0.0.8";
917 constexpr char listen_srv[] = "53";
918 constexpr char host_name1[] = "ohayou.example.com.";
919 constexpr char host_name2[] = "ciao.example.com.";
Luke Huang483cf332019-06-03 17:24:51 +0800920 const std::vector<std::string> defaultSearchDomain = {"example.com"};
921 // The minimal timeout is 1000ms, so we can't decrease timeout
922 // So reduce retry count.
923 const std::vector<int> reduceRetryParams = {
924 300, // sample validity in seconds
925 25, // success threshod in percent
926 8, 8, // {MIN,MAX}_SAMPLES
927 1000, // BASE_TIMEOUT_MSEC
928 1, // retry count
929 };
Xiao Ma09b71022018-12-11 17:56:32 +0900930 const std::vector<DnsRecord> records0 = {
931 {host_name1, ns_type::ns_t_aaaa, "2001:db8::5"},
932 {host_name2, ns_type::ns_t_aaaa, "2001:db8::5"},
933 };
934 const std::vector<DnsRecord> records1 = {
935 {host_name1, ns_type::ns_t_aaaa, "2001:db8::6"},
936 {host_name2, ns_type::ns_t_aaaa, "2001:db8::6"},
937 };
Ken Chenb9fa2062018-11-13 21:51:13 +0800938
939 // dns0 does not respond with 100% probability, while
940 // dns1 responds normally, at least initially.
Mike Yufc125e42019-05-15 20:41:28 +0800941 test::DNSResponder dns0(listen_addr0, listen_srv, static_cast<ns_rcode>(-1));
942 test::DNSResponder dns1(listen_addr1, listen_srv, static_cast<ns_rcode>(-1));
Ken Chenb9fa2062018-11-13 21:51:13 +0800943 dns0.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900944 StartDns(dns0, records0);
945 StartDns(dns1, records1);
Luke Huang483cf332019-06-03 17:24:51 +0800946 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr0, listen_addr1}, defaultSearchDomain,
947 reduceRetryParams));
Ken Chenb9fa2062018-11-13 21:51:13 +0800948
Luke Huang483cf332019-06-03 17:24:51 +0800949 // Specify ai_socktype to make getaddrinfo will only query 1 time
950 const addrinfo hints = {.ai_family = AF_INET6, .ai_socktype = SOCK_STREAM};
Ken Chenb9fa2062018-11-13 21:51:13 +0800951
952 // dns0 will ignore the request, and we'll fallback to dns1 after the first
953 // retry.
954 ScopedAddrinfo result = safe_getaddrinfo(host_name1, nullptr, &hints);
955 EXPECT_TRUE(result != nullptr);
956 EXPECT_EQ(1U, GetNumQueries(dns0, host_name1));
957 EXPECT_EQ(1U, GetNumQueries(dns1, host_name1));
958
959 // Now make dns1 also ignore 100% requests... The resolve should alternate
Luke Huang483cf332019-06-03 17:24:51 +0800960 // queries between the nameservers and fail
Ken Chenb9fa2062018-11-13 21:51:13 +0800961 dns1.setResponseProbability(0.0);
962 addrinfo* result2 = nullptr;
963 EXPECT_EQ(EAI_NODATA, getaddrinfo(host_name2, nullptr, &hints, &result2));
964 EXPECT_EQ(nullptr, result2);
Luke Huang483cf332019-06-03 17:24:51 +0800965 EXPECT_EQ(1U, GetNumQueries(dns0, host_name2));
966 EXPECT_EQ(1U, GetNumQueries(dns1, host_name2));
Ken Chenb9fa2062018-11-13 21:51:13 +0800967}
968
969TEST_F(ResolverTest, GetAddrInfoV6_concurrent) {
Xiao Ma09b71022018-12-11 17:56:32 +0900970 constexpr char listen_addr0[] = "127.0.0.9";
971 constexpr char listen_addr1[] = "127.0.0.10";
972 constexpr char listen_addr2[] = "127.0.0.11";
973 constexpr char host_name[] = "konbanha.example.com.";
974
975 test::DNSResponder dns0(listen_addr0);
976 test::DNSResponder dns1(listen_addr1);
977 test::DNSResponder dns2(listen_addr2);
978 StartDns(dns0, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
979 StartDns(dns1, {{host_name, ns_type::ns_t_aaaa, "2001:db8::6"}});
980 StartDns(dns2, {{host_name, ns_type::ns_t_aaaa, "2001:db8::7"}});
981
Luke Huangf8215372019-11-22 11:53:41 +0800982 const std::vector<std::string> servers = {listen_addr0, listen_addr1, listen_addr2};
Ken Chenb9fa2062018-11-13 21:51:13 +0800983 std::vector<std::thread> threads(10);
984 for (std::thread& thread : threads) {
Luke Huangf8215372019-11-22 11:53:41 +0800985 thread = std::thread([this, &servers]() {
986 unsigned delay = arc4random_uniform(1 * 1000 * 1000); // <= 1s
Ken Chenb9fa2062018-11-13 21:51:13 +0800987 usleep(delay);
988 std::vector<std::string> serverSubset;
989 for (const auto& server : servers) {
990 if (arc4random_uniform(2)) {
991 serverSubset.push_back(server);
992 }
993 }
994 if (serverSubset.empty()) serverSubset = servers;
Xiao Ma09b71022018-12-11 17:56:32 +0900995 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(serverSubset));
996 const addrinfo hints = {.ai_family = AF_INET6};
Ken Chenb9fa2062018-11-13 21:51:13 +0800997 addrinfo* result = nullptr;
998 int rv = getaddrinfo("konbanha", nullptr, &hints, &result);
999 EXPECT_EQ(0, rv) << "error [" << rv << "] " << gai_strerror(rv);
1000 if (result) {
1001 freeaddrinfo(result);
1002 result = nullptr;
1003 }
1004 });
1005 }
1006 for (std::thread& thread : threads) {
1007 thread.join();
1008 }
Ken Chen92bed612018-12-22 21:46:55 +08001009
1010 std::vector<std::string> res_servers;
1011 std::vector<std::string> res_domains;
1012 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001013 res_params res_params;
Ken Chen92bed612018-12-22 21:46:55 +08001014 std::vector<ResolverStats> res_stats;
1015 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001016 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1017 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1018 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chen92bed612018-12-22 21:46:55 +08001019 EXPECT_EQ(0, wait_for_pending_req_timeout_count);
Ken Chenb9fa2062018-11-13 21:51:13 +08001020}
1021
Mike Yu8ac63402019-12-02 15:28:38 +08001022TEST_F(ResolverTest, SkipBadServersDueToInternalError) {
1023 constexpr char listen_addr1[] = "fe80::1";
1024 constexpr char listen_addr2[] = "255.255.255.255";
1025 constexpr char listen_addr3[] = "127.0.0.3";
1026
1027 test::DNSResponder dns(listen_addr3);
1028 ASSERT_TRUE(dns.startServer());
1029
1030 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
1031 parcel.servers = {listen_addr1, listen_addr2, listen_addr3};
1032
1033 // Bad servers can be distinguished after two attempts.
1034 parcel.minSamples = 2;
1035 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1036
1037 // Start querying five times.
1038 for (int i = 0; i < 5; i++) {
1039 std::string hostName = StringPrintf("hello%d.com.", i);
1040 dns.addMapping(hostName, ns_type::ns_t_a, "1.2.3.4");
1041 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1042 EXPECT_TRUE(safe_getaddrinfo(hostName.c_str(), nullptr, &hints) != nullptr);
1043 }
1044
Mike Yue2162e52020-03-04 18:43:46 +08001045 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1046 NameserverStats(listen_addr1).setInternalErrors(2),
1047 NameserverStats(listen_addr2).setInternalErrors(2),
1048 NameserverStats(listen_addr3).setSuccesses(5),
1049 };
1050 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
Mike Yu8ac63402019-12-02 15:28:38 +08001051}
1052
1053TEST_F(ResolverTest, SkipBadServersDueToTimeout) {
1054 constexpr char listen_addr1[] = "127.0.0.3";
1055 constexpr char listen_addr2[] = "127.0.0.4";
1056
1057 // Set dns1 non-responsive and dns2 workable.
1058 test::DNSResponder dns1(listen_addr1, test::kDefaultListenService, static_cast<ns_rcode>(-1));
1059 test::DNSResponder dns2(listen_addr2);
1060 dns1.setResponseProbability(0.0);
1061 ASSERT_TRUE(dns1.startServer());
1062 ASSERT_TRUE(dns2.startServer());
1063
1064 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
1065 parcel.servers = {listen_addr1, listen_addr2};
1066
1067 // Bad servers can be distinguished after two attempts.
1068 parcel.minSamples = 2;
1069 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1070
1071 // Start querying five times.
1072 for (int i = 0; i < 5; i++) {
1073 std::string hostName = StringPrintf("hello%d.com.", i);
1074 dns1.addMapping(hostName, ns_type::ns_t_a, "1.2.3.4");
1075 dns2.addMapping(hostName, ns_type::ns_t_a, "1.2.3.5");
1076 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1077 EXPECT_TRUE(safe_getaddrinfo(hostName.c_str(), nullptr, &hints) != nullptr);
1078 }
1079
Mike Yue2162e52020-03-04 18:43:46 +08001080 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1081 NameserverStats(listen_addr1).setTimeouts(2),
1082 NameserverStats(listen_addr2).setSuccesses(5),
1083 };
1084 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
Mike Yu8ac63402019-12-02 15:28:38 +08001085 EXPECT_EQ(dns1.queries().size(), 2U);
1086 EXPECT_EQ(dns2.queries().size(), 5U);
1087}
1088
chenbrucefd837fa2019-10-29 18:35:36 +08001089TEST_F(ResolverTest, GetAddrInfoFromCustTable_InvalidInput) {
1090 constexpr char hostnameNoip[] = "noip.example.com.";
1091 constexpr char hostnameInvalidip[] = "invalidip.example.com.";
1092 const std::vector<aidl::android::net::ResolverHostsParcel> invalidCustHosts = {
1093 {"", hostnameNoip},
1094 {"wrong IP", hostnameInvalidip},
1095 };
1096 test::DNSResponder dns;
1097 StartDns(dns, {});
1098 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
Ken Chena6ac2a62020-04-07 17:25:56 +08001099 resolverParams.resolverOptions.hosts = invalidCustHosts;
chenbrucefd837fa2019-10-29 18:35:36 +08001100 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1101 for (const auto& hostname : {hostnameNoip, hostnameInvalidip}) {
1102 // The query won't get data from customized table because of invalid customized table
1103 // and DNSResponder also has no records. hostnameNoip has never registered and
1104 // hostnameInvalidip has registered but wrong IP.
1105 const addrinfo hints = {.ai_family = AF_UNSPEC};
1106 ScopedAddrinfo result = safe_getaddrinfo(hostname, nullptr, &hints);
1107 ASSERT_TRUE(result == nullptr);
1108 EXPECT_EQ(4U, GetNumQueries(dns, hostname));
1109 }
1110}
1111
1112TEST_F(ResolverTest, GetAddrInfoFromCustTable) {
1113 constexpr char hostnameV4[] = "v4only.example.com.";
1114 constexpr char hostnameV6[] = "v6only.example.com.";
1115 constexpr char hostnameV4V6[] = "v4v6.example.com.";
1116 constexpr char custAddrV4[] = "1.2.3.4";
1117 constexpr char custAddrV6[] = "::1.2.3.4";
1118 constexpr char dnsSvAddrV4[] = "1.2.3.5";
1119 constexpr char dnsSvAddrV6[] = "::1.2.3.5";
1120 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4 = {
1121 {custAddrV4, hostnameV4},
1122 };
1123 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV6 = {
1124 {custAddrV6, hostnameV6},
1125 };
1126 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4V6 = {
1127 {custAddrV4, hostnameV4V6},
1128 {custAddrV6, hostnameV4V6},
1129 };
1130 const std::vector<DnsRecord> dnsSvHostV4 = {
1131 {hostnameV4, ns_type::ns_t_a, dnsSvAddrV4},
1132 };
1133 const std::vector<DnsRecord> dnsSvHostV6 = {
1134 {hostnameV6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1135 };
1136 const std::vector<DnsRecord> dnsSvHostV4V6 = {
1137 {hostnameV4V6, ns_type::ns_t_a, dnsSvAddrV4},
1138 {hostnameV4V6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1139 };
1140 struct TestConfig {
1141 const std::string name;
1142 const std::vector<aidl::android::net::ResolverHostsParcel> customizedHosts;
1143 const std::vector<DnsRecord> dnsserverHosts;
1144 const std::vector<std::string> queryResult;
1145 std::string asParameters() const {
1146 return StringPrintf("name: %s, customizedHosts: %s, dnsserverHosts: %s", name.c_str(),
1147 customizedHosts.empty() ? "No" : "Yes",
1148 dnsserverHosts.empty() ? "No" : "Yes");
1149 }
1150 } testConfigs[]{
1151 // clang-format off
1152 {hostnameV4, {}, {}, {}},
1153 {hostnameV4, {}, dnsSvHostV4, {dnsSvAddrV4}},
1154 {hostnameV4, custHostV4, {}, {custAddrV4}},
1155 {hostnameV4, custHostV4, dnsSvHostV4, {custAddrV4}},
1156 {hostnameV6, {}, {}, {}},
1157 {hostnameV6, {}, dnsSvHostV6, {dnsSvAddrV6}},
1158 {hostnameV6, custHostV6, {}, {custAddrV6}},
1159 {hostnameV6, custHostV6, dnsSvHostV6, {custAddrV6}},
1160 {hostnameV4V6, {}, {}, {}},
1161 {hostnameV4V6, {}, dnsSvHostV4V6, {dnsSvAddrV4, dnsSvAddrV6}},
1162 {hostnameV4V6, custHostV4V6, {}, {custAddrV4, custAddrV6}},
1163 {hostnameV4V6, custHostV4V6, dnsSvHostV4V6, {custAddrV4, custAddrV6}},
1164 // clang-format on
1165 };
1166
1167 for (const auto& config : testConfigs) {
1168 SCOPED_TRACE(config.asParameters());
1169
1170 test::DNSResponder dns;
1171 StartDns(dns, config.dnsserverHosts);
1172
1173 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
Ken Chena6ac2a62020-04-07 17:25:56 +08001174 resolverParams.resolverOptions.hosts = config.customizedHosts;
chenbrucefd837fa2019-10-29 18:35:36 +08001175 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1176 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM};
1177 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
1178 if (config.customizedHosts.empty() && config.dnsserverHosts.empty()) {
1179 ASSERT_TRUE(result == nullptr);
1180 EXPECT_EQ(2U, GetNumQueries(dns, config.name.c_str()));
1181 } else {
1182 ASSERT_TRUE(result != nullptr);
1183 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(config.queryResult));
1184 EXPECT_EQ(config.customizedHosts.empty() ? 2U : 0U,
1185 GetNumQueries(dns, config.name.c_str()));
1186 }
1187
1188 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
1189 }
1190}
1191
1192TEST_F(ResolverTest, GetAddrInfoFromCustTable_Modify) {
1193 constexpr char hostnameV4V6[] = "v4v6.example.com.";
1194 constexpr char custAddrV4[] = "1.2.3.4";
1195 constexpr char custAddrV6[] = "::1.2.3.4";
1196 constexpr char dnsSvAddrV4[] = "1.2.3.5";
1197 constexpr char dnsSvAddrV6[] = "::1.2.3.5";
1198 const std::vector<DnsRecord> dnsSvHostV4V6 = {
1199 {hostnameV4V6, ns_type::ns_t_a, dnsSvAddrV4},
1200 {hostnameV4V6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1201 };
1202 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4V6 = {
1203 {custAddrV4, hostnameV4V6},
1204 {custAddrV6, hostnameV4V6},
1205 };
1206 test::DNSResponder dns;
1207 StartDns(dns, dnsSvHostV4V6);
1208 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1209
Ken Chena6ac2a62020-04-07 17:25:56 +08001210 resolverParams.resolverOptions.hosts = custHostV4V6;
chenbrucefd837fa2019-10-29 18:35:36 +08001211 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1212 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM};
1213 ScopedAddrinfo result = safe_getaddrinfo(hostnameV4V6, nullptr, &hints);
1214 ASSERT_TRUE(result != nullptr);
1215 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray({custAddrV4, custAddrV6}));
1216 EXPECT_EQ(0U, GetNumQueries(dns, hostnameV4V6));
1217
Ken Chena6ac2a62020-04-07 17:25:56 +08001218 resolverParams.resolverOptions.hosts = {};
chenbrucefd837fa2019-10-29 18:35:36 +08001219 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1220 result = safe_getaddrinfo(hostnameV4V6, nullptr, &hints);
1221 ASSERT_TRUE(result != nullptr);
1222 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray({dnsSvAddrV4, dnsSvAddrV6}));
1223 EXPECT_EQ(2U, GetNumQueries(dns, hostnameV4V6));
1224}
1225
Ken Chenb9fa2062018-11-13 21:51:13 +08001226TEST_F(ResolverTest, EmptySetup) {
Ken Chenb9fa2062018-11-13 21:51:13 +08001227 std::vector<std::string> servers;
1228 std::vector<std::string> domains;
Xiao Ma09b71022018-12-11 17:56:32 +09001229 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001230 std::vector<std::string> res_servers;
1231 std::vector<std::string> res_domains;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001232 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001233 res_params res_params;
Ken Chenb9fa2062018-11-13 21:51:13 +08001234 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +08001235 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001236 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1237 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1238 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chenb9fa2062018-11-13 21:51:13 +08001239 EXPECT_EQ(0U, res_servers.size());
1240 EXPECT_EQ(0U, res_domains.size());
Mike Yu0a1c53d2018-11-26 13:26:21 +09001241 EXPECT_EQ(0U, res_tls_servers.size());
Luke Huang5bd827c2019-03-14 16:10:04 +08001242 ASSERT_EQ(static_cast<size_t>(IDnsResolver::RESOLVER_PARAMS_COUNT), kDefaultParams.size());
1243 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY],
1244 res_params.sample_validity);
1245 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001246 res_params.success_threshold);
Luke Huang5bd827c2019-03-14 16:10:04 +08001247 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
1248 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
1249 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
Ken Chenb9fa2062018-11-13 21:51:13 +08001250 res_params.base_timeout_msec);
Luke Huang5bd827c2019-03-14 16:10:04 +08001251 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_RETRY_COUNT], res_params.retry_count);
Ken Chenb9fa2062018-11-13 21:51:13 +08001252}
1253
1254TEST_F(ResolverTest, SearchPathChange) {
Xiao Ma09b71022018-12-11 17:56:32 +09001255 constexpr char listen_addr[] = "127.0.0.13";
1256 constexpr char host_name1[] = "test13.domain1.org.";
1257 constexpr char host_name2[] = "test13.domain2.org.";
Luke Huangf8215372019-11-22 11:53:41 +08001258 std::vector<std::string> servers = {listen_addr};
1259 std::vector<std::string> domains = {"domain1.org"};
Xiao Ma09b71022018-12-11 17:56:32 +09001260
1261 const std::vector<DnsRecord> records = {
1262 {host_name1, ns_type::ns_t_aaaa, "2001:db8::13"},
1263 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1:13"},
1264 };
1265 test::DNSResponder dns(listen_addr);
1266 StartDns(dns, records);
1267 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001268
1269 const addrinfo hints = {.ai_family = AF_INET6};
1270 ScopedAddrinfo result = safe_getaddrinfo("test13", nullptr, &hints);
1271 EXPECT_TRUE(result != nullptr);
1272 EXPECT_EQ(1U, dns.queries().size());
1273 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
1274 EXPECT_EQ("2001:db8::13", ToString(result));
1275
1276 // Test that changing the domain search path on its own works.
Luke Huangf8215372019-11-22 11:53:41 +08001277 domains = {"domain2.org"};
Xiao Ma09b71022018-12-11 17:56:32 +09001278 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001279 dns.clearQueries();
1280
1281 result = safe_getaddrinfo("test13", nullptr, &hints);
1282 EXPECT_TRUE(result != nullptr);
1283 EXPECT_EQ(1U, dns.queries().size());
1284 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
1285 EXPECT_EQ("2001:db8::1:13", ToString(result));
1286}
1287
Luke Huang2dac4382019-06-24 13:28:44 +08001288namespace {
1289
Luke Huangf8215372019-11-22 11:53:41 +08001290std::vector<std::string> getResolverDomains(aidl::android::net::IDnsResolver* dnsResolverService,
Luke Huang2dac4382019-06-24 13:28:44 +08001291 unsigned netId) {
1292 std::vector<std::string> res_servers;
1293 std::vector<std::string> res_domains;
1294 std::vector<std::string> res_tls_servers;
1295 res_params res_params;
1296 std::vector<ResolverStats> res_stats;
1297 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001298 DnsResponderClient::GetResolverInfo(dnsResolverService, netId, &res_servers, &res_domains,
1299 &res_tls_servers, &res_params, &res_stats,
1300 &wait_for_pending_req_timeout_count);
Luke Huang2dac4382019-06-24 13:28:44 +08001301 return res_domains;
1302}
1303
1304} // namespace
1305
1306TEST_F(ResolverTest, SearchPathPrune) {
1307 constexpr size_t DUPLICATED_DOMAIN_NUM = 3;
1308 constexpr char listen_addr[] = "127.0.0.13";
1309 constexpr char domian_name1[] = "domain13.org.";
1310 constexpr char domian_name2[] = "domain14.org.";
1311 constexpr char host_name1[] = "test13.domain13.org.";
1312 constexpr char host_name2[] = "test14.domain14.org.";
1313 std::vector<std::string> servers = {listen_addr};
1314
1315 std::vector<std::string> testDomains1;
1316 std::vector<std::string> testDomains2;
1317 // Domain length should be <= 255
1318 // Max number of domains in search path is 6
1319 for (size_t i = 0; i < MAXDNSRCH + 1; i++) {
1320 // Fill up with invalid domain
1321 testDomains1.push_back(std::string(300, i + '0'));
1322 // Fill up with valid but duplicated domain
1323 testDomains2.push_back(StringPrintf("domain%zu.org", i % DUPLICATED_DOMAIN_NUM));
1324 }
1325
1326 // Add valid domain used for query.
1327 testDomains1.push_back(domian_name1);
1328
1329 // Add valid domain twice used for query.
1330 testDomains2.push_back(domian_name2);
1331 testDomains2.push_back(domian_name2);
1332
1333 const std::vector<DnsRecord> records = {
1334 {host_name1, ns_type::ns_t_aaaa, "2001:db8::13"},
1335 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1:13"},
1336 };
1337 test::DNSResponder dns(listen_addr);
1338 StartDns(dns, records);
1339 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, testDomains1));
1340
1341 const addrinfo hints = {.ai_family = AF_INET6};
1342 ScopedAddrinfo result = safe_getaddrinfo("test13", nullptr, &hints);
1343
1344 EXPECT_TRUE(result != nullptr);
1345
1346 EXPECT_EQ(1U, dns.queries().size());
1347 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
1348 EXPECT_EQ("2001:db8::13", ToString(result));
1349
1350 const auto& res_domains1 = getResolverDomains(mDnsClient.resolvService(), TEST_NETID);
1351 // Expect 1 valid domain, invalid domains are removed.
1352 ASSERT_EQ(1U, res_domains1.size());
1353 EXPECT_EQ(domian_name1, res_domains1[0]);
1354
1355 dns.clearQueries();
1356
1357 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, testDomains2));
1358
1359 result = safe_getaddrinfo("test14", nullptr, &hints);
1360 EXPECT_TRUE(result != nullptr);
1361
1362 // (3 domains * 2 retries) + 1 success query = 7
1363 EXPECT_EQ(7U, dns.queries().size());
1364 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
1365 EXPECT_EQ("2001:db8::1:13", ToString(result));
1366
1367 const auto& res_domains2 = getResolverDomains(mDnsClient.resolvService(), TEST_NETID);
1368 // Expect 4 valid domain, duplicate domains are removed.
1369 EXPECT_EQ(DUPLICATED_DOMAIN_NUM + 1U, res_domains2.size());
1370 EXPECT_THAT(
1371 std::vector<std::string>({"domain0.org", "domain1.org", "domain2.org", domian_name2}),
1372 testing::ElementsAreArray(res_domains2));
1373}
1374
Mike Yu0a1c53d2018-11-26 13:26:21 +09001375// If we move this function to dns_responder_client, it will complicate the dependency need of
1376// dns_tls_frontend.h.
1377static void setupTlsServers(const std::vector<std::string>& servers,
waynema0e73c2e2019-07-31 15:04:08 +08001378 std::vector<std::unique_ptr<test::DnsTlsFrontend>>* tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001379 constexpr char listen_udp[] = "53";
1380 constexpr char listen_tls[] = "853";
Mike Yu0a1c53d2018-11-26 13:26:21 +09001381
1382 for (const auto& server : servers) {
1383 auto t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
1384 t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
1385 t->startServer();
Mike Yu0a1c53d2018-11-26 13:26:21 +09001386 tls->push_back(std::move(t));
1387 }
1388}
1389
Mike Yu0a1c53d2018-11-26 13:26:21 +09001390TEST_F(ResolverTest, MaxServerPrune_Binder) {
Mike Yu0a1c53d2018-11-26 13:26:21 +09001391 std::vector<std::string> domains;
1392 std::vector<std::unique_ptr<test::DNSResponder>> dns;
1393 std::vector<std::unique_ptr<test::DnsTlsFrontend>> tls;
1394 std::vector<std::string> servers;
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001395 std::vector<DnsResponderClient::Mapping> mappings;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001396
1397 for (unsigned i = 0; i < MAXDNSRCH + 1; i++) {
1398 domains.push_back(StringPrintf("example%u.com", i));
1399 }
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001400 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupMappings(1, domains, &mappings));
1401 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupDNSServers(MAXNS + 1, mappings, &dns, &servers));
waynema0e73c2e2019-07-31 15:04:08 +08001402 ASSERT_NO_FATAL_FAILURE(setupTlsServers(servers, &tls));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001403
waynema0e73c2e2019-07-31 15:04:08 +08001404 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, domains, kDefaultParams,
1405 kDefaultPrivateDnsHostName));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001406
Mike Yu383855b2019-01-15 17:53:27 +08001407 // If the private DNS validation hasn't completed yet before backend DNS servers stop,
1408 // TLS servers will get stuck in handleOneRequest(), which causes this test stuck in
1409 // ~DnsTlsFrontend() because the TLS server loop threads can't be terminated.
1410 // So, wait for private DNS validation done before stopping backend DNS servers.
1411 for (int i = 0; i < MAXNS; i++) {
chenbruceaff85842019-05-31 15:46:42 +08001412 LOG(INFO) << "Waiting for private DNS validation on " << tls[i]->listen_address() << ".";
Mike Yu724f77d2019-08-16 11:14:50 +08001413 EXPECT_TRUE(WaitForPrivateDnsValidation(tls[i]->listen_address(), true));
chenbruceaff85842019-05-31 15:46:42 +08001414 LOG(INFO) << "private DNS validation on " << tls[i]->listen_address() << " done.";
Mike Yu383855b2019-01-15 17:53:27 +08001415 }
1416
Mike Yu0a1c53d2018-11-26 13:26:21 +09001417 std::vector<std::string> res_servers;
1418 std::vector<std::string> res_domains;
1419 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001420 res_params res_params;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001421 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +08001422 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001423 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1424 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1425 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001426
1427 // Check the size of the stats and its contents.
1428 EXPECT_EQ(static_cast<size_t>(MAXNS), res_servers.size());
1429 EXPECT_EQ(static_cast<size_t>(MAXNS), res_tls_servers.size());
1430 EXPECT_EQ(static_cast<size_t>(MAXDNSRCH), res_domains.size());
1431 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_servers.begin()));
1432 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_tls_servers.begin()));
1433 EXPECT_TRUE(std::equal(domains.begin(), domains.begin() + MAXDNSRCH, res_domains.begin()));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001434}
1435
1436TEST_F(ResolverTest, ResolverStats) {
Xiao Ma09b71022018-12-11 17:56:32 +09001437 constexpr char listen_addr1[] = "127.0.0.4";
1438 constexpr char listen_addr2[] = "127.0.0.5";
1439 constexpr char listen_addr3[] = "127.0.0.6";
Mike Yu0a1c53d2018-11-26 13:26:21 +09001440
1441 // Set server 1 timeout.
Mike Yufc125e42019-05-15 20:41:28 +08001442 test::DNSResponder dns1(listen_addr1, "53", static_cast<ns_rcode>(-1));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001443 dns1.setResponseProbability(0.0);
1444 ASSERT_TRUE(dns1.startServer());
1445
1446 // Set server 2 responding server failure.
Xiao Ma09b71022018-12-11 17:56:32 +09001447 test::DNSResponder dns2(listen_addr2);
Mike Yu0a1c53d2018-11-26 13:26:21 +09001448 dns2.setResponseProbability(0.0);
1449 ASSERT_TRUE(dns2.startServer());
1450
1451 // Set server 3 workable.
Xiao Ma09b71022018-12-11 17:56:32 +09001452 test::DNSResponder dns3(listen_addr3);
1453 dns3.addMapping(kHelloExampleCom, ns_type::ns_t_a, "1.2.3.4");
Mike Yu0a1c53d2018-11-26 13:26:21 +09001454 ASSERT_TRUE(dns3.startServer());
1455
1456 std::vector<std::string> servers = {listen_addr1, listen_addr2, listen_addr3};
Xiao Ma09b71022018-12-11 17:56:32 +09001457 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001458
1459 dns3.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +09001460 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
Mike Yu0a1c53d2018-11-26 13:26:21 +09001461 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
Xiao Ma09b71022018-12-11 17:56:32 +09001462 size_t found = GetNumQueries(dns3, kHelloExampleCom);
Mike Yu0a1c53d2018-11-26 13:26:21 +09001463 EXPECT_LE(1U, found);
1464 std::string result_str = ToString(result);
1465 EXPECT_TRUE(result_str == "1.2.3.4") << ", result_str='" << result_str << "'";
1466
Mike Yue2162e52020-03-04 18:43:46 +08001467 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1468 NameserverStats(listen_addr1).setTimeouts(1),
1469 NameserverStats(listen_addr2).setErrors(1),
1470 NameserverStats(listen_addr3).setSuccesses(1),
1471 };
1472 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001473}
1474
Mike Yu15791832020-02-11 13:38:48 +08001475TEST_F(ResolverTest, AlwaysUseLatestSetupParamsInLookups) {
1476 constexpr char listen_addr1[] = "127.0.0.3";
1477 constexpr char listen_addr2[] = "255.255.255.255";
1478 constexpr char listen_addr3[] = "127.0.0.4";
1479 constexpr char hostname[] = "hello";
1480 constexpr char fqdn_with_search_domain[] = "hello.domain2.com.";
1481
1482 test::DNSResponder dns1(listen_addr1, test::kDefaultListenService, static_cast<ns_rcode>(-1));
1483 dns1.setResponseProbability(0.0);
1484 ASSERT_TRUE(dns1.startServer());
1485
1486 test::DNSResponder dns3(listen_addr3);
1487 StartDns(dns3, {{fqdn_with_search_domain, ns_type::ns_t_a, "1.2.3.4"}});
1488
1489 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
1490 parcel.tlsServers.clear();
1491 parcel.servers = {listen_addr1, listen_addr2};
1492 parcel.domains = {"domain1.com", "domain2.com"};
1493 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1494
1495 // Expect the things happening in t1:
1496 // 1. The lookup starts using the first domain for query. It sends queries to the populated
1497 // nameserver list {listen_addr1, listen_addr2} for the hostname "hello.domain1.com".
1498 // 2. A different list of nameservers is updated to the resolver. Revision ID is incremented.
1499 // 3. The query for the hostname times out. The lookup fails to add the timeout record to the
1500 // the stats because of the unmatched revision ID.
1501 // 4. The lookup starts using the second domain for query. It sends queries to the populated
1502 // nameserver list {listen_addr3, listen_addr1, listen_addr2} for another hostname
1503 // "hello.domain2.com".
1504 // 5. The lookup gets the answer and updates a success record to the stats.
1505 std::thread t1([&hostname]() {
1506 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1507 ScopedAddrinfo result = safe_getaddrinfo(hostname, nullptr, &hints);
1508 EXPECT_NE(result.get(), nullptr);
1509 EXPECT_EQ(ToString(result), "1.2.3.4");
1510 });
1511
1512 // Wait for t1 to start the step 1.
1513 while (dns1.queries().size() == 0) {
1514 usleep(1000);
1515 }
1516
1517 // Update the resolver with three nameservers. This will increment the revision ID.
1518 parcel.servers = {listen_addr3, listen_addr1, listen_addr2};
1519 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1520
1521 t1.join();
1522 EXPECT_EQ(0U, GetNumQueriesForType(dns3, ns_type::ns_t_aaaa, fqdn_with_search_domain));
1523 EXPECT_EQ(1U, GetNumQueriesForType(dns3, ns_type::ns_t_a, fqdn_with_search_domain));
1524
Mike Yue2162e52020-03-04 18:43:46 +08001525 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1526 NameserverStats(listen_addr1),
1527 NameserverStats(listen_addr2),
1528 NameserverStats(listen_addr3).setSuccesses(1),
1529 };
1530 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
Mike Yu15791832020-02-11 13:38:48 +08001531}
1532
Ken Chenb9fa2062018-11-13 21:51:13 +08001533// Test what happens if the specified TLS server is nonexistent.
1534TEST_F(ResolverTest, GetHostByName_TlsMissing) {
Xiao Ma09b71022018-12-11 17:56:32 +09001535 constexpr char listen_addr[] = "127.0.0.3";
1536 constexpr char host_name[] = "tlsmissing.example.com.";
1537
1538 test::DNSResponder dns;
1539 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.3"}});
Luke Huangf8215372019-11-22 11:53:41 +08001540 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001541
1542 // There's nothing listening on this address, so validation will either fail or
1543 /// hang. Either way, queries will continue to flow to the DNSResponder.
waynema0e73c2e2019-07-31 15:04:08 +08001544 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Ken Chenb9fa2062018-11-13 21:51:13 +08001545
1546 const hostent* result;
1547
1548 result = gethostbyname("tlsmissing");
1549 ASSERT_FALSE(result == nullptr);
1550 EXPECT_EQ("1.2.3.3", ToString(result));
1551
1552 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001553 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001554}
1555
1556// Test what happens if the specified TLS server replies with garbage.
1557TEST_F(ResolverTest, GetHostByName_TlsBroken) {
Xiao Ma09b71022018-12-11 17:56:32 +09001558 constexpr char listen_addr[] = "127.0.0.3";
1559 constexpr char host_name1[] = "tlsbroken1.example.com.";
1560 constexpr char host_name2[] = "tlsbroken2.example.com.";
1561 const std::vector<DnsRecord> records = {
1562 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1563 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1564 };
1565
1566 test::DNSResponder dns;
1567 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001568 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001569
1570 // Bind the specified private DNS socket but don't respond to any client sockets yet.
1571 int s = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, IPPROTO_TCP);
1572 ASSERT_TRUE(s >= 0);
1573 struct sockaddr_in tlsServer = {
Luke Huangf8215372019-11-22 11:53:41 +08001574 .sin_family = AF_INET,
1575 .sin_port = htons(853),
Ken Chenb9fa2062018-11-13 21:51:13 +08001576 };
1577 ASSERT_TRUE(inet_pton(AF_INET, listen_addr, &tlsServer.sin_addr));
1578 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEPORT).ok());
1579 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEADDR).ok());
1580 ASSERT_FALSE(bind(s, reinterpret_cast<struct sockaddr*>(&tlsServer), sizeof(tlsServer)));
1581 ASSERT_FALSE(listen(s, 1));
1582
1583 // Trigger TLS validation.
waynema0e73c2e2019-07-31 15:04:08 +08001584 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Ken Chenb9fa2062018-11-13 21:51:13 +08001585
1586 struct sockaddr_storage cliaddr;
1587 socklen_t sin_size = sizeof(cliaddr);
Luke Huangf8215372019-11-22 11:53:41 +08001588 int new_fd = accept4(s, reinterpret_cast<struct sockaddr*>(&cliaddr), &sin_size, SOCK_CLOEXEC);
Ken Chenb9fa2062018-11-13 21:51:13 +08001589 ASSERT_TRUE(new_fd > 0);
1590
1591 // We've received the new file descriptor but not written to it or closed, so the
1592 // validation is still pending. Queries should still flow correctly because the
1593 // server is not used until validation succeeds.
1594 const hostent* result;
1595 result = gethostbyname("tlsbroken1");
1596 ASSERT_FALSE(result == nullptr);
1597 EXPECT_EQ("1.2.3.1", ToString(result));
1598
1599 // Now we cause the validation to fail.
1600 std::string garbage = "definitely not a valid TLS ServerHello";
1601 write(new_fd, garbage.data(), garbage.size());
1602 close(new_fd);
1603
1604 // Validation failure shouldn't interfere with lookups, because lookups won't be sent
1605 // to the TLS server unless validation succeeds.
1606 result = gethostbyname("tlsbroken2");
1607 ASSERT_FALSE(result == nullptr);
1608 EXPECT_EQ("1.2.3.2", ToString(result));
1609
1610 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001611 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001612 close(s);
1613}
1614
1615TEST_F(ResolverTest, GetHostByName_Tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001616 constexpr char listen_addr[] = "127.0.0.3";
1617 constexpr char listen_udp[] = "53";
1618 constexpr char listen_tls[] = "853";
1619 constexpr char host_name1[] = "tls1.example.com.";
1620 constexpr char host_name2[] = "tls2.example.com.";
1621 constexpr char host_name3[] = "tls3.example.com.";
1622 const std::vector<DnsRecord> records = {
1623 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1624 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1625 {host_name3, ns_type::ns_t_a, "1.2.3.3"},
1626 };
1627
1628 test::DNSResponder dns;
1629 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001630 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001631
1632 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1633 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001634 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08001635 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001636
Mike Yu724f77d2019-08-16 11:14:50 +08001637 const hostent* result = gethostbyname("tls1");
Ken Chenb9fa2062018-11-13 21:51:13 +08001638 ASSERT_FALSE(result == nullptr);
1639 EXPECT_EQ("1.2.3.1", ToString(result));
1640
1641 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001642 EXPECT_TRUE(tls.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001643
1644 // Stop the TLS server. Since we're in opportunistic mode, queries will
1645 // fall back to the locally-assigned (clear text) nameservers.
1646 tls.stopServer();
1647
1648 dns.clearQueries();
1649 result = gethostbyname("tls2");
1650 EXPECT_FALSE(result == nullptr);
1651 EXPECT_EQ("1.2.3.2", ToString(result));
1652 const auto queries = dns.queries();
1653 EXPECT_EQ(1U, queries.size());
waynema29253052019-08-20 11:26:08 +08001654 EXPECT_EQ("tls2.example.com.", queries[0].name);
1655 EXPECT_EQ(ns_t_a, queries[0].type);
Ken Chenb9fa2062018-11-13 21:51:13 +08001656
1657 // Reset the resolvers without enabling TLS. Queries should still be routed
1658 // to the UDP endpoint.
Xiao Ma09b71022018-12-11 17:56:32 +09001659 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001660
1661 result = gethostbyname("tls3");
1662 ASSERT_FALSE(result == nullptr);
1663 EXPECT_EQ("1.2.3.3", ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +08001664}
1665
Ken Chenb9fa2062018-11-13 21:51:13 +08001666TEST_F(ResolverTest, GetHostByName_TlsFailover) {
Xiao Ma09b71022018-12-11 17:56:32 +09001667 constexpr char listen_addr1[] = "127.0.0.3";
1668 constexpr char listen_addr2[] = "127.0.0.4";
1669 constexpr char listen_udp[] = "53";
1670 constexpr char listen_tls[] = "853";
1671 constexpr char host_name1[] = "tlsfailover1.example.com.";
1672 constexpr char host_name2[] = "tlsfailover2.example.com.";
1673 const std::vector<DnsRecord> records1 = {
1674 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1675 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1676 };
1677 const std::vector<DnsRecord> records2 = {
1678 {host_name1, ns_type::ns_t_a, "1.2.3.3"},
1679 {host_name2, ns_type::ns_t_a, "1.2.3.4"},
1680 };
1681
1682 test::DNSResponder dns1(listen_addr1);
1683 test::DNSResponder dns2(listen_addr2);
1684 StartDns(dns1, records1);
1685 StartDns(dns2, records2);
1686
Luke Huangf8215372019-11-22 11:53:41 +08001687 std::vector<std::string> servers = {listen_addr1, listen_addr2};
Ken Chenb9fa2062018-11-13 21:51:13 +08001688
1689 test::DnsTlsFrontend tls1(listen_addr1, listen_tls, listen_addr1, listen_udp);
1690 test::DnsTlsFrontend tls2(listen_addr2, listen_tls, listen_addr2, listen_udp);
1691 ASSERT_TRUE(tls1.startServer());
1692 ASSERT_TRUE(tls2.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001693 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1694 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08001695 EXPECT_TRUE(WaitForPrivateDnsValidation(tls1.listen_address(), true));
1696 EXPECT_TRUE(WaitForPrivateDnsValidation(tls2.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001697
Mike Yu724f77d2019-08-16 11:14:50 +08001698 const hostent* result = gethostbyname("tlsfailover1");
Ken Chenb9fa2062018-11-13 21:51:13 +08001699 ASSERT_FALSE(result == nullptr);
1700 EXPECT_EQ("1.2.3.1", ToString(result));
1701
1702 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001703 EXPECT_TRUE(tls1.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001704 // No new queries should have reached tls2.
Luke Huang0a0870d2020-02-12 20:41:10 +08001705 EXPECT_TRUE(tls2.waitForQueries(1));
Ken Chenb9fa2062018-11-13 21:51:13 +08001706
1707 // Stop tls1. Subsequent queries should attempt to reach tls1, fail, and retry to tls2.
1708 tls1.stopServer();
1709
1710 result = gethostbyname("tlsfailover2");
1711 EXPECT_EQ("1.2.3.4", ToString(result));
1712
1713 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001714 EXPECT_TRUE(tls2.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001715
1716 // No additional queries should have reached the insecure servers.
1717 EXPECT_EQ(2U, dns1.queries().size());
1718 EXPECT_EQ(2U, dns2.queries().size());
1719
1720 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001721 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Ken Chenb9fa2062018-11-13 21:51:13 +08001722}
1723
1724TEST_F(ResolverTest, GetHostByName_BadTlsName) {
Xiao Ma09b71022018-12-11 17:56:32 +09001725 constexpr char listen_addr[] = "127.0.0.3";
1726 constexpr char listen_udp[] = "53";
1727 constexpr char listen_tls[] = "853";
1728 constexpr char host_name[] = "badtlsname.example.com.";
1729
1730 test::DNSResponder dns;
1731 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.1"}});
Luke Huangf8215372019-11-22 11:53:41 +08001732 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001733
1734 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1735 ASSERT_TRUE(tls.startServer());
Xiao Ma09b71022018-12-11 17:56:32 +09001736 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
waynema0e73c2e2019-07-31 15:04:08 +08001737 kDefaultIncorrectPrivateDnsHostName));
Ken Chenb9fa2062018-11-13 21:51:13 +08001738
waynema0e73c2e2019-07-31 15:04:08 +08001739 // The TLS handshake would fail because the name of TLS server doesn't
1740 // match with TLS server's certificate.
Mike Yu724f77d2019-08-16 11:14:50 +08001741 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), false));
Ken Chenb9fa2062018-11-13 21:51:13 +08001742
1743 // The query should fail hard, because a name was specified.
1744 EXPECT_EQ(nullptr, gethostbyname("badtlsname"));
1745
1746 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001747 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001748}
1749
1750TEST_F(ResolverTest, GetAddrInfo_Tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001751 constexpr char listen_addr[] = "127.0.0.3";
1752 constexpr char listen_udp[] = "53";
1753 constexpr char listen_tls[] = "853";
1754 constexpr char host_name[] = "addrinfotls.example.com.";
1755 const std::vector<DnsRecord> records = {
1756 {host_name, ns_type::ns_t_a, "1.2.3.4"},
1757 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
1758 };
1759
1760 test::DNSResponder dns;
1761 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001762 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001763
1764 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1765 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001766 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1767 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08001768 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001769
1770 dns.clearQueries();
1771 ScopedAddrinfo result = safe_getaddrinfo("addrinfotls", nullptr, nullptr);
1772 EXPECT_TRUE(result != nullptr);
1773 size_t found = GetNumQueries(dns, host_name);
1774 EXPECT_LE(1U, found);
1775 // Could be A or AAAA
1776 std::string result_str = ToString(result);
1777 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +08001778 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08001779 // Wait for both A and AAAA queries to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001780 EXPECT_TRUE(tls.waitForQueries(3));
Ken Chenb9fa2062018-11-13 21:51:13 +08001781
1782 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001783 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001784}
1785
1786TEST_F(ResolverTest, TlsBypass) {
1787 const char OFF[] = "off";
1788 const char OPPORTUNISTIC[] = "opportunistic";
1789 const char STRICT[] = "strict";
1790
1791 const char GETHOSTBYNAME[] = "gethostbyname";
1792 const char GETADDRINFO[] = "getaddrinfo";
1793 const char GETADDRINFOFORNET[] = "getaddrinfofornet";
1794
1795 const unsigned BYPASS_NETID = NETID_USE_LOCAL_NAMESERVERS | TEST_NETID;
1796
Ken Chenb9fa2062018-11-13 21:51:13 +08001797 const char ADDR4[] = "192.0.2.1";
1798 const char ADDR6[] = "2001:db8::1";
1799
1800 const char cleartext_addr[] = "127.0.0.53";
1801 const char cleartext_port[] = "53";
1802 const char tls_port[] = "853";
Luke Huangf8215372019-11-22 11:53:41 +08001803 const std::vector<std::string> servers = {cleartext_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001804
Xiao Ma09b71022018-12-11 17:56:32 +09001805 test::DNSResponder dns(cleartext_addr);
Ken Chenb9fa2062018-11-13 21:51:13 +08001806 ASSERT_TRUE(dns.startServer());
1807
1808 test::DnsTlsFrontend tls(cleartext_addr, tls_port, cleartext_addr, cleartext_port);
Mike Yudd4ac2d2019-05-31 16:52:11 +08001809 ASSERT_TRUE(tls.startServer());
Ken Chenb9fa2062018-11-13 21:51:13 +08001810
Luke Huangf8215372019-11-22 11:53:41 +08001811 // clang-format off
Ken Chenb9fa2062018-11-13 21:51:13 +08001812 struct TestConfig {
1813 const std::string mode;
1814 const bool withWorkingTLS;
1815 const std::string method;
1816
1817 std::string asHostName() const {
Luke Huangf8215372019-11-22 11:53:41 +08001818 return StringPrintf("%s.%s.%s.", mode.c_str(), withWorkingTLS ? "tlsOn" : "tlsOff",
Ken Chenb9fa2062018-11-13 21:51:13 +08001819 method.c_str());
1820 }
1821 } testConfigs[]{
Ken Chenb9fa2062018-11-13 21:51:13 +08001822 {OFF, true, GETHOSTBYNAME},
1823 {OPPORTUNISTIC, true, GETHOSTBYNAME},
1824 {STRICT, true, GETHOSTBYNAME},
Ken Chenb9fa2062018-11-13 21:51:13 +08001825 {OFF, true, GETADDRINFO},
1826 {OPPORTUNISTIC, true, GETADDRINFO},
1827 {STRICT, true, GETADDRINFO},
Ken Chenb9fa2062018-11-13 21:51:13 +08001828 {OFF, true, GETADDRINFOFORNET},
1829 {OPPORTUNISTIC, true, GETADDRINFOFORNET},
1830 {STRICT, true, GETADDRINFOFORNET},
Mike Yudd4ac2d2019-05-31 16:52:11 +08001831 {OFF, false, GETHOSTBYNAME},
1832 {OPPORTUNISTIC, false, GETHOSTBYNAME},
1833 {STRICT, false, GETHOSTBYNAME},
1834 {OFF, false, GETADDRINFO},
1835 {OPPORTUNISTIC, false, GETADDRINFO},
1836 {STRICT, false, GETADDRINFO},
1837 {OFF, false, GETADDRINFOFORNET},
1838 {OPPORTUNISTIC, false, GETADDRINFOFORNET},
1839 {STRICT, false, GETADDRINFOFORNET},
Ken Chenb9fa2062018-11-13 21:51:13 +08001840 };
Luke Huangf8215372019-11-22 11:53:41 +08001841 // clang-format on
Ken Chenb9fa2062018-11-13 21:51:13 +08001842
1843 for (const auto& config : testConfigs) {
1844 const std::string testHostName = config.asHostName();
1845 SCOPED_TRACE(testHostName);
1846
1847 // Don't tempt test bugs due to caching.
1848 const char* host_name = testHostName.c_str();
1849 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
1850 dns.addMapping(host_name, ns_type::ns_t_aaaa, ADDR6);
1851
Mike Yudd4ac2d2019-05-31 16:52:11 +08001852 if (config.withWorkingTLS) {
1853 if (!tls.running()) {
1854 ASSERT_TRUE(tls.startServer());
1855 }
1856 } else {
1857 if (tls.running()) {
1858 ASSERT_TRUE(tls.stopServer());
1859 }
1860 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001861
1862 if (config.mode == OFF) {
Xiao Ma09b71022018-12-11 17:56:32 +09001863 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, kDefaultSearchDomains,
1864 kDefaultParams));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001865 } else /* OPPORTUNISTIC or STRICT */ {
1866 const char* tls_hostname = (config.mode == STRICT) ? kDefaultPrivateDnsHostName : "";
Xiao Ma09b71022018-12-11 17:56:32 +09001867 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001868 kDefaultParams, tls_hostname));
Mike Yu724f77d2019-08-16 11:14:50 +08001869
1870 // Wait for the validation event. If the server is running, the validation should
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001871 // succeed; otherwise, the validation should fail.
Mike Yu724f77d2019-08-16 11:14:50 +08001872 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), config.withWorkingTLS));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001873 if (config.withWorkingTLS) {
1874 EXPECT_TRUE(tls.waitForQueries(1));
1875 tls.clearQueries();
1876 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001877 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001878
1879 const hostent* h_result = nullptr;
1880 ScopedAddrinfo ai_result;
1881
1882 if (config.method == GETHOSTBYNAME) {
1883 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
1884 h_result = gethostbyname(host_name);
1885
1886 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
1887 ASSERT_FALSE(h_result == nullptr);
1888 ASSERT_EQ(4, h_result->h_length);
1889 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
1890 EXPECT_EQ(ADDR4, ToString(h_result));
1891 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
1892 } else if (config.method == GETADDRINFO) {
1893 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
1894 ai_result = safe_getaddrinfo(host_name, nullptr, nullptr);
1895 EXPECT_TRUE(ai_result != nullptr);
1896
1897 EXPECT_LE(1U, GetNumQueries(dns, host_name));
1898 // Could be A or AAAA
1899 const std::string result_str = ToString(ai_result);
1900 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
Luke Huangf8215372019-11-22 11:53:41 +08001901 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08001902 } else if (config.method == GETADDRINFOFORNET) {
1903 addrinfo* raw_ai_result = nullptr;
1904 EXPECT_EQ(0, android_getaddrinfofornet(host_name, /*servname=*/nullptr,
1905 /*hints=*/nullptr, BYPASS_NETID, MARK_UNSET,
1906 &raw_ai_result));
1907 ai_result.reset(raw_ai_result);
1908
1909 EXPECT_LE(1U, GetNumQueries(dns, host_name));
1910 // Could be A or AAAA
1911 const std::string result_str = ToString(ai_result);
1912 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
Luke Huangf8215372019-11-22 11:53:41 +08001913 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08001914 }
1915
Mike Yudd4ac2d2019-05-31 16:52:11 +08001916 EXPECT_EQ(0, tls.queries());
Ken Chenb9fa2062018-11-13 21:51:13 +08001917
1918 // Clear per-process resolv netid.
1919 ASSERT_EQ(0, setNetworkForResolv(NETID_UNSET));
Ken Chenb9fa2062018-11-13 21:51:13 +08001920 dns.clearQueries();
1921 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001922}
1923
1924TEST_F(ResolverTest, StrictMode_NoTlsServers) {
Xiao Ma09b71022018-12-11 17:56:32 +09001925 constexpr char cleartext_addr[] = "127.0.0.53";
Luke Huangf8215372019-11-22 11:53:41 +08001926 const std::vector<std::string> servers = {cleartext_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09001927 constexpr char host_name[] = "strictmode.notlsips.example.com.";
1928 const std::vector<DnsRecord> records = {
1929 {host_name, ns_type::ns_t_a, "1.2.3.4"},
1930 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
1931 };
Ken Chenb9fa2062018-11-13 21:51:13 +08001932
Xiao Ma09b71022018-12-11 17:56:32 +09001933 test::DNSResponder dns(cleartext_addr);
1934 StartDns(dns, records);
Ken Chenb9fa2062018-11-13 21:51:13 +08001935
waynema0e73c2e2019-07-31 15:04:08 +08001936 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1937 kDefaultIncorrectPrivateDnsHostName));
Ken Chenb9fa2062018-11-13 21:51:13 +08001938
1939 addrinfo* ai_result = nullptr;
1940 EXPECT_NE(0, getaddrinfo(host_name, nullptr, nullptr, &ai_result));
1941 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
1942}
Luke Huang94b10b92018-11-21 20:13:38 +08001943
1944namespace {
1945
Luke Huang70931aa2019-01-31 11:57:41 +08001946int getAsyncResponse(int fd, int* rcode, uint8_t* buf, int bufLen) {
Luke Huang94b10b92018-11-21 20:13:38 +08001947 struct pollfd wait_fd[1];
1948 wait_fd[0].fd = fd;
1949 wait_fd[0].events = POLLIN;
1950 short revents;
1951 int ret;
1952
1953 ret = poll(wait_fd, 1, -1);
1954 revents = wait_fd[0].revents;
1955 if (revents & POLLIN) {
1956 int n = resNetworkResult(fd, rcode, buf, bufLen);
Luke Huangba7bef92018-12-26 16:53:03 +08001957 // Verify that resNetworkResult() closed the fd
1958 char dummy;
1959 EXPECT_EQ(-1, read(fd, &dummy, sizeof dummy));
1960 EXPECT_EQ(EBADF, errno);
Luke Huang94b10b92018-11-21 20:13:38 +08001961 return n;
1962 }
1963 return -1;
1964}
1965
Luke Huang70931aa2019-01-31 11:57:41 +08001966std::string toString(uint8_t* buf, int bufLen, int ipType) {
Luke Huang94b10b92018-11-21 20:13:38 +08001967 ns_msg handle;
1968 int ancount, n = 0;
1969 ns_rr rr;
1970
Luke Huangf8215372019-11-22 11:53:41 +08001971 if (ns_initparse((const uint8_t*)buf, bufLen, &handle) >= 0) {
Luke Huang94b10b92018-11-21 20:13:38 +08001972 ancount = ns_msg_count(handle, ns_s_an);
1973 if (ns_parserr(&handle, ns_s_an, n, &rr) == 0) {
Luke Huang70931aa2019-01-31 11:57:41 +08001974 const uint8_t* rdata = ns_rr_rdata(rr);
Luke Huang94b10b92018-11-21 20:13:38 +08001975 char buffer[INET6_ADDRSTRLEN];
Luke Huangf8215372019-11-22 11:53:41 +08001976 if (inet_ntop(ipType, (const char*)rdata, buffer, sizeof(buffer))) {
Luke Huang94b10b92018-11-21 20:13:38 +08001977 return buffer;
1978 }
1979 }
1980 }
1981 return "";
1982}
1983
1984int dns_open_proxy() {
1985 int s = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
1986 if (s == -1) {
1987 return -1;
1988 }
1989 const int one = 1;
1990 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
1991
1992 static const struct sockaddr_un proxy_addr = {
1993 .sun_family = AF_UNIX,
1994 .sun_path = "/dev/socket/dnsproxyd",
1995 };
1996
Luke Huangf8215372019-11-22 11:53:41 +08001997 if (TEMP_FAILURE_RETRY(connect(s, (const struct sockaddr*)&proxy_addr, sizeof(proxy_addr))) !=
Luke Huang94b10b92018-11-21 20:13:38 +08001998 0) {
1999 close(s);
2000 return -1;
2001 }
2002
2003 return s;
2004}
2005
Luke Huangba7bef92018-12-26 16:53:03 +08002006void expectAnswersValid(int fd, int ipType, const std::string& expectedAnswer) {
2007 int rcode = -1;
2008 uint8_t buf[MAXPACKET] = {};
2009
2010 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2011 EXPECT_GT(res, 0);
2012 EXPECT_EQ(expectedAnswer, toString(buf, res, ipType));
2013}
2014
2015void expectAnswersNotValid(int fd, int expectedErrno) {
2016 int rcode = -1;
2017 uint8_t buf[MAXPACKET] = {};
2018
2019 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2020 EXPECT_EQ(expectedErrno, res);
2021}
2022
Luke Huang94b10b92018-11-21 20:13:38 +08002023} // namespace
2024
2025TEST_F(ResolverTest, Async_NormalQueryV4V6) {
Xiao Ma09b71022018-12-11 17:56:32 +09002026 constexpr char listen_addr[] = "127.0.0.4";
2027 constexpr char host_name[] = "howdy.example.com.";
2028 const std::vector<DnsRecord> records = {
2029 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2030 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2031 };
2032
2033 test::DNSResponder dns(listen_addr);
2034 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002035 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002036 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002037
Luke Huangba7bef92018-12-26 16:53:03 +08002038 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2039 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002040 EXPECT_TRUE(fd1 != -1);
2041 EXPECT_TRUE(fd2 != -1);
2042
Luke Huang70931aa2019-01-31 11:57:41 +08002043 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002044 int rcode;
2045 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2046 EXPECT_GT(res, 0);
2047 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
2048
2049 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2050 EXPECT_GT(res, 0);
2051 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2052
2053 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
2054
2055 // Re-query verify cache works
Luke Huangba7bef92018-12-26 16:53:03 +08002056 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2057 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002058
2059 EXPECT_TRUE(fd1 != -1);
2060 EXPECT_TRUE(fd2 != -1);
2061
2062 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2063 EXPECT_GT(res, 0);
2064 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
2065
2066 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2067 EXPECT_GT(res, 0);
2068 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2069
2070 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
2071}
2072
2073TEST_F(ResolverTest, Async_BadQuery) {
Xiao Ma09b71022018-12-11 17:56:32 +09002074 constexpr char listen_addr[] = "127.0.0.4";
2075 constexpr char host_name[] = "howdy.example.com.";
2076 const std::vector<DnsRecord> records = {
2077 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2078 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2079 };
2080
2081 test::DNSResponder dns(listen_addr);
2082 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002083 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002084 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002085
2086 static struct {
2087 int fd;
2088 const char* dname;
2089 const int queryType;
2090 const int expectRcode;
2091 } kTestData[] = {
Luke Huangba7bef92018-12-26 16:53:03 +08002092 {-1, "", ns_t_aaaa, 0},
2093 {-1, "as65ass46", ns_t_aaaa, 0},
2094 {-1, "454564564564", ns_t_aaaa, 0},
2095 {-1, "h645235", ns_t_a, 0},
2096 {-1, "www.google.com", ns_t_a, 0},
Luke Huang94b10b92018-11-21 20:13:38 +08002097 };
2098
2099 for (auto& td : kTestData) {
2100 SCOPED_TRACE(td.dname);
Luke Huangba7bef92018-12-26 16:53:03 +08002101 td.fd = resNetworkQuery(TEST_NETID, td.dname, ns_c_in, td.queryType, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002102 EXPECT_TRUE(td.fd != -1);
2103 }
2104
2105 // dns_responder return empty resp(packet only contains query part) with no error currently
2106 for (const auto& td : kTestData) {
Luke Huang70931aa2019-01-31 11:57:41 +08002107 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002108 int rcode;
2109 SCOPED_TRACE(td.dname);
2110 int res = getAsyncResponse(td.fd, &rcode, buf, MAXPACKET);
2111 EXPECT_GT(res, 0);
2112 EXPECT_EQ(rcode, td.expectRcode);
2113 }
2114}
2115
2116TEST_F(ResolverTest, Async_EmptyAnswer) {
Xiao Ma09b71022018-12-11 17:56:32 +09002117 constexpr char listen_addr[] = "127.0.0.4";
2118 constexpr char host_name[] = "howdy.example.com.";
2119 const std::vector<DnsRecord> records = {
2120 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2121 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2122 };
2123
2124 test::DNSResponder dns(listen_addr);
2125 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002126 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002127 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002128
Luke Huang9c264bb2018-12-18 16:44:41 +08002129 // TODO: Disable retry to make this test explicit.
2130 auto& cv = dns.getCv();
2131 auto& cvMutex = dns.getCvMutex();
2132 int fd1;
2133 // Wait on the condition variable to ensure that the DNS server has handled our first query.
2134 {
2135 std::unique_lock lk(cvMutex);
Luke Huangba7bef92018-12-26 16:53:03 +08002136 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang9c264bb2018-12-18 16:44:41 +08002137 EXPECT_TRUE(fd1 != -1);
2138 EXPECT_EQ(std::cv_status::no_timeout, cv.wait_for(lk, std::chrono::seconds(1)));
2139 }
Luke Huang94b10b92018-11-21 20:13:38 +08002140
Luke Huang94b10b92018-11-21 20:13:38 +08002141 dns.setResponseProbability(0.0);
Luke Huang94b10b92018-11-21 20:13:38 +08002142
Luke Huangba7bef92018-12-26 16:53:03 +08002143 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002144 EXPECT_TRUE(fd2 != -1);
2145
Luke Huangba7bef92018-12-26 16:53:03 +08002146 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002147 EXPECT_TRUE(fd3 != -1);
2148
Luke Huang9c264bb2018-12-18 16:44:41 +08002149 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002150 int rcode;
2151
Luke Huang9c264bb2018-12-18 16:44:41 +08002152 // expect no response
2153 int res = getAsyncResponse(fd3, &rcode, buf, MAXPACKET);
2154 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huang94b10b92018-11-21 20:13:38 +08002155
Luke Huang9c264bb2018-12-18 16:44:41 +08002156 // expect no response
Luke Huang94b10b92018-11-21 20:13:38 +08002157 memset(buf, 0, MAXPACKET);
Luke Huang9c264bb2018-12-18 16:44:41 +08002158 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2159 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huang94b10b92018-11-21 20:13:38 +08002160
Luke Huang94b10b92018-11-21 20:13:38 +08002161 dns.setResponseProbability(1.0);
Luke Huang94b10b92018-11-21 20:13:38 +08002162
Luke Huangba7bef92018-12-26 16:53:03 +08002163 int fd4 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002164 EXPECT_TRUE(fd4 != -1);
2165
2166 memset(buf, 0, MAXPACKET);
2167 res = getAsyncResponse(fd4, &rcode, buf, MAXPACKET);
2168 EXPECT_GT(res, 0);
2169 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2170
2171 memset(buf, 0, MAXPACKET);
2172 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2173 EXPECT_GT(res, 0);
2174 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
2175}
2176
2177TEST_F(ResolverTest, Async_MalformedQuery) {
Xiao Ma09b71022018-12-11 17:56:32 +09002178 constexpr char listen_addr[] = "127.0.0.4";
2179 constexpr char host_name[] = "howdy.example.com.";
2180 const std::vector<DnsRecord> records = {
2181 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2182 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2183 };
2184
2185 test::DNSResponder dns(listen_addr);
2186 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002187 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002188 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002189
2190 int fd = dns_open_proxy();
2191 EXPECT_TRUE(fd > 0);
2192
2193 const std::string badMsg = "16-52512#";
Xiao Ma09b71022018-12-11 17:56:32 +09002194 static const struct {
Luke Huang94b10b92018-11-21 20:13:38 +08002195 const std::string cmd;
2196 const int expectErr;
2197 } kTestData[] = {
Luke Huangba7bef92018-12-26 16:53:03 +08002198 // Too few arguments
Luke Huang94b10b92018-11-21 20:13:38 +08002199 {"resnsend " + badMsg + '\0', -EINVAL},
2200 // Bad netId
Luke Huangba7bef92018-12-26 16:53:03 +08002201 {"resnsend badnetId 0 " + badMsg + '\0', -EINVAL},
Luke Huang94b10b92018-11-21 20:13:38 +08002202 // Bad raw data
Luke Huangba7bef92018-12-26 16:53:03 +08002203 {"resnsend " + std::to_string(TEST_NETID) + " 0 " + badMsg + '\0', -EILSEQ},
Luke Huang94b10b92018-11-21 20:13:38 +08002204 };
2205
2206 for (unsigned int i = 0; i < std::size(kTestData); i++) {
2207 auto& td = kTestData[i];
2208 SCOPED_TRACE(td.cmd);
2209 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, td.cmd.c_str(), td.cmd.size()));
2210 EXPECT_EQ(rc, static_cast<ssize_t>(td.cmd.size()));
2211
2212 int32_t tmp;
2213 rc = TEMP_FAILURE_RETRY(read(fd, &tmp, sizeof(tmp)));
2214 EXPECT_TRUE(rc > 0);
2215 EXPECT_EQ(static_cast<int>(ntohl(tmp)), td.expectErr);
2216 }
2217 // Normal query with answer buffer
2218 // This is raw data of query "howdy.example.com" type 1 class 1
2219 std::string query = "81sBAAABAAAAAAAABWhvd2R5B2V4YW1wbGUDY29tAAABAAE=";
Luke Huangba7bef92018-12-26 16:53:03 +08002220 std::string cmd = "resnsend " + std::to_string(TEST_NETID) + " 0 " + query + '\0';
Luke Huang94b10b92018-11-21 20:13:38 +08002221 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
2222 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
2223
Luke Huang70931aa2019-01-31 11:57:41 +08002224 uint8_t smallBuf[1] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002225 int rcode;
2226 rc = getAsyncResponse(fd, &rcode, smallBuf, 1);
Luke Huangba7bef92018-12-26 16:53:03 +08002227 EXPECT_EQ(-EMSGSIZE, rc);
Luke Huang94b10b92018-11-21 20:13:38 +08002228
2229 // Do the normal test with large buffer again
2230 fd = dns_open_proxy();
2231 EXPECT_TRUE(fd > 0);
2232 rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
2233 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
Luke Huang70931aa2019-01-31 11:57:41 +08002234 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002235 rc = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2236 EXPECT_EQ("1.2.3.4", toString(buf, rc, AF_INET));
Mike Yu4f3747b2018-12-02 17:54:29 +09002237}
2238
Luke Huangba7bef92018-12-26 16:53:03 +08002239TEST_F(ResolverTest, Async_CacheFlags) {
Xiao Ma09b71022018-12-11 17:56:32 +09002240 constexpr char listen_addr[] = "127.0.0.4";
Luke Huang4eabbe32020-05-28 03:17:32 +08002241 constexpr char host_name1[] = "howdy.example.com.";
2242 constexpr char host_name2[] = "howdy.example2.com.";
2243 constexpr char host_name3[] = "howdy.example3.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002244 const std::vector<DnsRecord> records = {
Luke Huang4eabbe32020-05-28 03:17:32 +08002245 {host_name1, ns_type::ns_t_a, "1.2.3.4"}, {host_name1, ns_type::ns_t_aaaa, "::1.2.3.4"},
2246 {host_name2, ns_type::ns_t_a, "1.2.3.5"}, {host_name2, ns_type::ns_t_aaaa, "::1.2.3.5"},
2247 {host_name3, ns_type::ns_t_a, "1.2.3.6"}, {host_name3, ns_type::ns_t_aaaa, "::1.2.3.6"},
Xiao Ma09b71022018-12-11 17:56:32 +09002248 };
2249
2250 test::DNSResponder dns(listen_addr);
2251 StartDns(dns, records);
Luke Huangba7bef92018-12-26 16:53:03 +08002252 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002253 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huangba7bef92018-12-26 16:53:03 +08002254
2255 // ANDROID_RESOLV_NO_CACHE_STORE
2256 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2257 ANDROID_RESOLV_NO_CACHE_STORE);
2258 EXPECT_TRUE(fd1 != -1);
2259 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2260 ANDROID_RESOLV_NO_CACHE_STORE);
2261 EXPECT_TRUE(fd2 != -1);
2262 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2263 ANDROID_RESOLV_NO_CACHE_STORE);
2264 EXPECT_TRUE(fd3 != -1);
2265
2266 expectAnswersValid(fd3, AF_INET, "1.2.3.4");
2267 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
2268 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2269
2270 // No cache exists, expect 3 queries
Luke Huang4eabbe32020-05-28 03:17:32 +08002271 EXPECT_EQ(3U, GetNumQueries(dns, host_name1));
Luke Huangba7bef92018-12-26 16:53:03 +08002272
Luke Huang4eabbe32020-05-28 03:17:32 +08002273 // Raise a query with no flags to ensure no cache exists. Also make an cache entry for the
2274 // query.
Luke Huangba7bef92018-12-26 16:53:03 +08002275 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2276
2277 EXPECT_TRUE(fd1 != -1);
2278
2279 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2280
Luke Huang4eabbe32020-05-28 03:17:32 +08002281 // Expect 4 queries because there should be no cache before this query.
2282 EXPECT_EQ(4U, GetNumQueries(dns, host_name1));
2283
2284 // Now we have the cache entry, re-query with ANDROID_RESOLV_NO_CACHE_STORE to ensure
2285 // that ANDROID_RESOLV_NO_CACHE_STORE implied ANDROID_RESOLV_NO_CACHE_LOOKUP.
2286 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2287 ANDROID_RESOLV_NO_CACHE_STORE);
2288 EXPECT_TRUE(fd1 != -1);
2289 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2290 // Expect 5 queries because we shouldn't do cache lookup for the query which has
2291 // ANDROID_RESOLV_NO_CACHE_STORE.
2292 EXPECT_EQ(5U, GetNumQueries(dns, host_name1));
Luke Huangba7bef92018-12-26 16:53:03 +08002293
2294 // ANDROID_RESOLV_NO_CACHE_LOOKUP
2295 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2296 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2297 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2298 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2299
2300 EXPECT_TRUE(fd1 != -1);
2301 EXPECT_TRUE(fd2 != -1);
2302
2303 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
2304 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2305
Luke Huang4eabbe32020-05-28 03:17:32 +08002306 // Cache was skipped, expect 2 more queries.
2307 EXPECT_EQ(7U, GetNumQueries(dns, host_name1));
Luke Huangba7bef92018-12-26 16:53:03 +08002308
2309 // Re-query verify cache works
Luke Huang4eabbe32020-05-28 03:17:32 +08002310 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huangba7bef92018-12-26 16:53:03 +08002311 EXPECT_TRUE(fd1 != -1);
2312 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2313
Luke Huang4eabbe32020-05-28 03:17:32 +08002314 // Cache hits, expect still 7 queries
2315 EXPECT_EQ(7U, GetNumQueries(dns, host_name1));
Luke Huanga1d74182019-03-19 17:30:36 +08002316
2317 // Start to verify if ANDROID_RESOLV_NO_CACHE_LOOKUP does write response into cache
2318 dns.clearQueries();
2319
Luke Huang4eabbe32020-05-28 03:17:32 +08002320 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa,
Luke Huanga1d74182019-03-19 17:30:36 +08002321 ANDROID_RESOLV_NO_CACHE_LOOKUP);
Luke Huang4eabbe32020-05-28 03:17:32 +08002322 fd2 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa,
Luke Huanga1d74182019-03-19 17:30:36 +08002323 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2324
2325 EXPECT_TRUE(fd1 != -1);
2326 EXPECT_TRUE(fd2 != -1);
2327
Luke Huang4eabbe32020-05-28 03:17:32 +08002328 expectAnswersValid(fd2, AF_INET6, "::1.2.3.5");
2329 expectAnswersValid(fd1, AF_INET6, "::1.2.3.5");
Luke Huanga1d74182019-03-19 17:30:36 +08002330
2331 // Skip cache, expect 2 queries
Luke Huang4eabbe32020-05-28 03:17:32 +08002332 EXPECT_EQ(2U, GetNumQueries(dns, host_name2));
Luke Huanga1d74182019-03-19 17:30:36 +08002333
2334 // Re-query without flags
Luke Huang4eabbe32020-05-28 03:17:32 +08002335 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa, 0);
2336 fd2 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa, 0);
Luke Huanga1d74182019-03-19 17:30:36 +08002337
2338 EXPECT_TRUE(fd1 != -1);
2339 EXPECT_TRUE(fd2 != -1);
2340
Luke Huang4eabbe32020-05-28 03:17:32 +08002341 expectAnswersValid(fd2, AF_INET6, "::1.2.3.5");
2342 expectAnswersValid(fd1, AF_INET6, "::1.2.3.5");
Luke Huanga1d74182019-03-19 17:30:36 +08002343
2344 // Cache hits, expect still 2 queries
Luke Huang4eabbe32020-05-28 03:17:32 +08002345 EXPECT_EQ(2U, GetNumQueries(dns, host_name2));
Luke Huang40f5f492019-05-09 19:37:35 +08002346
2347 // Test both ANDROID_RESOLV_NO_CACHE_STORE and ANDROID_RESOLV_NO_CACHE_LOOKUP are set
2348 dns.clearQueries();
2349
Luke Huang4eabbe32020-05-28 03:17:32 +08002350 // Make sure that the cache of "howdy.example3.com" exists.
2351 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang40f5f492019-05-09 19:37:35 +08002352 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002353 expectAnswersValid(fd1, AF_INET6, "::1.2.3.6");
2354 EXPECT_EQ(1U, GetNumQueries(dns, host_name3));
Luke Huang40f5f492019-05-09 19:37:35 +08002355
2356 // Re-query with testFlags
2357 const int testFlag = ANDROID_RESOLV_NO_CACHE_STORE | ANDROID_RESOLV_NO_CACHE_LOOKUP;
Luke Huang4eabbe32020-05-28 03:17:32 +08002358 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_aaaa, testFlag);
Luke Huang40f5f492019-05-09 19:37:35 +08002359 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002360 expectAnswersValid(fd1, AF_INET6, "::1.2.3.6");
Luke Huang40f5f492019-05-09 19:37:35 +08002361 // Expect cache lookup is skipped.
Luke Huang4eabbe32020-05-28 03:17:32 +08002362 EXPECT_EQ(2U, GetNumQueries(dns, host_name3));
Luke Huang40f5f492019-05-09 19:37:35 +08002363
2364 // Do another query with testFlags
Luke Huang4eabbe32020-05-28 03:17:32 +08002365 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_a, testFlag);
Luke Huang40f5f492019-05-09 19:37:35 +08002366 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002367 expectAnswersValid(fd1, AF_INET, "1.2.3.6");
Luke Huang40f5f492019-05-09 19:37:35 +08002368 // Expect cache lookup is skipped.
Luke Huang4eabbe32020-05-28 03:17:32 +08002369 EXPECT_EQ(3U, GetNumQueries(dns, host_name3));
Luke Huang40f5f492019-05-09 19:37:35 +08002370
2371 // Re-query with no flags
Luke Huang4eabbe32020-05-28 03:17:32 +08002372 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_a, 0);
Luke Huang40f5f492019-05-09 19:37:35 +08002373 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002374 expectAnswersValid(fd1, AF_INET, "1.2.3.6");
Luke Huang40f5f492019-05-09 19:37:35 +08002375 // Expect no cache hit because cache storing is also skipped in previous query.
Luke Huang4eabbe32020-05-28 03:17:32 +08002376 EXPECT_EQ(4U, GetNumQueries(dns, host_name3));
Luke Huangba7bef92018-12-26 16:53:03 +08002377}
2378
Luke Huang08b13d22020-02-05 14:46:21 +08002379TEST_F(ResolverTest, Async_NoCacheStoreFlagDoesNotRefreshStaleCacheEntry) {
2380 constexpr char listen_addr[] = "127.0.0.4";
2381 constexpr char host_name[] = "howdy.example.com.";
2382 const std::vector<DnsRecord> records = {
2383 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2384 };
2385
2386 test::DNSResponder dns(listen_addr);
2387 StartDns(dns, records);
2388 std::vector<std::string> servers = {listen_addr};
2389 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
2390
2391 const unsigned SHORT_TTL_SEC = 1;
2392 dns.setTtl(SHORT_TTL_SEC);
2393
2394 // Refer to b/148842821 for the purpose of below test steps.
2395 // Basically, this test is used to ensure stale cache case is handled
2396 // correctly with ANDROID_RESOLV_NO_CACHE_STORE.
2397 int fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2398 EXPECT_TRUE(fd != -1);
2399 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2400
2401 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2402 dns.clearQueries();
2403
2404 // Wait until cache expired
2405 sleep(SHORT_TTL_SEC + 0.5);
2406
2407 // Now request the same hostname again.
2408 // We should see a new DNS query because the entry in cache has become stale.
2409 // Due to ANDROID_RESOLV_NO_CACHE_STORE, this query must *not* refresh that stale entry.
2410 fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2411 ANDROID_RESOLV_NO_CACHE_STORE);
2412 EXPECT_TRUE(fd != -1);
2413 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2414 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2415 dns.clearQueries();
2416
2417 // If the cache is still stale, we expect to see one more DNS query
2418 // (this time the cache will be refreshed, but we're not checking for it).
2419 fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2420 EXPECT_TRUE(fd != -1);
2421 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2422 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2423}
2424
Luke Huangba7bef92018-12-26 16:53:03 +08002425TEST_F(ResolverTest, Async_NoRetryFlag) {
Luke Huang70931aa2019-01-31 11:57:41 +08002426 constexpr char listen_addr0[] = "127.0.0.4";
2427 constexpr char listen_addr1[] = "127.0.0.6";
Xiao Ma09b71022018-12-11 17:56:32 +09002428 constexpr char host_name[] = "howdy.example.com.";
2429 const std::vector<DnsRecord> records = {
2430 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2431 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2432 };
2433
Luke Huang70931aa2019-01-31 11:57:41 +08002434 test::DNSResponder dns0(listen_addr0);
2435 test::DNSResponder dns1(listen_addr1);
2436 StartDns(dns0, records);
2437 StartDns(dns1, records);
2438 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr0, listen_addr1}));
Luke Huangba7bef92018-12-26 16:53:03 +08002439
Luke Huang70931aa2019-01-31 11:57:41 +08002440 dns0.clearQueries();
2441 dns1.clearQueries();
2442
2443 dns0.setResponseProbability(0.0);
2444 dns1.setResponseProbability(0.0);
Luke Huangba7bef92018-12-26 16:53:03 +08002445
2446 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2447 ANDROID_RESOLV_NO_RETRY);
2448 EXPECT_TRUE(fd1 != -1);
2449
2450 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa,
2451 ANDROID_RESOLV_NO_RETRY);
2452 EXPECT_TRUE(fd2 != -1);
2453
2454 // expect no response
2455 expectAnswersNotValid(fd1, -ETIMEDOUT);
2456 expectAnswersNotValid(fd2, -ETIMEDOUT);
2457
Luke Huang70931aa2019-01-31 11:57:41 +08002458 // No retry case, expect total 2 queries. The server is selected randomly.
2459 EXPECT_EQ(2U, GetNumQueries(dns0, host_name) + GetNumQueries(dns1, host_name));
Luke Huangba7bef92018-12-26 16:53:03 +08002460
Luke Huang70931aa2019-01-31 11:57:41 +08002461 dns0.clearQueries();
2462 dns1.clearQueries();
Luke Huangba7bef92018-12-26 16:53:03 +08002463
2464 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2465 EXPECT_TRUE(fd1 != -1);
2466
2467 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
2468 EXPECT_TRUE(fd2 != -1);
2469
2470 // expect no response
2471 expectAnswersNotValid(fd1, -ETIMEDOUT);
2472 expectAnswersNotValid(fd2, -ETIMEDOUT);
2473
2474 // Retry case, expect 4 queries
Luke Huang70931aa2019-01-31 11:57:41 +08002475 EXPECT_EQ(4U, GetNumQueries(dns0, host_name));
2476 EXPECT_EQ(4U, GetNumQueries(dns1, host_name));
2477}
2478
2479TEST_F(ResolverTest, Async_VerifyQueryID) {
2480 constexpr char listen_addr[] = "127.0.0.4";
2481 constexpr char host_name[] = "howdy.example.com.";
2482 const std::vector<DnsRecord> records = {
2483 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2484 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2485 };
2486
2487 test::DNSResponder dns(listen_addr);
2488 StartDns(dns, records);
2489 std::vector<std::string> servers = {listen_addr};
2490 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
2491
2492 const uint8_t queryBuf1[] = {
2493 /* Header */
2494 0x55, 0x66, /* Transaction ID */
2495 0x01, 0x00, /* Flags */
2496 0x00, 0x01, /* Questions */
2497 0x00, 0x00, /* Answer RRs */
2498 0x00, 0x00, /* Authority RRs */
2499 0x00, 0x00, /* Additional RRs */
2500 /* Queries */
2501 0x05, 0x68, 0x6f, 0x77, 0x64, 0x79, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
2502 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name */
2503 0x00, 0x01, /* Type */
2504 0x00, 0x01 /* Class */
2505 };
2506
2507 int fd = resNetworkSend(TEST_NETID, queryBuf1, sizeof(queryBuf1), 0);
2508 EXPECT_TRUE(fd != -1);
2509
2510 uint8_t buf[MAXPACKET] = {};
2511 int rcode;
2512
2513 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2514 EXPECT_GT(res, 0);
2515 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2516
2517 auto hp = reinterpret_cast<HEADER*>(buf);
2518 EXPECT_EQ(21862U, htons(hp->id));
2519
2520 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2521
2522 const uint8_t queryBuf2[] = {
2523 /* Header */
2524 0x00, 0x53, /* Transaction ID */
2525 0x01, 0x00, /* Flags */
2526 0x00, 0x01, /* Questions */
2527 0x00, 0x00, /* Answer RRs */
2528 0x00, 0x00, /* Authority RRs */
2529 0x00, 0x00, /* Additional RRs */
2530 /* Queries */
2531 0x05, 0x68, 0x6f, 0x77, 0x64, 0x79, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
2532 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name */
2533 0x00, 0x01, /* Type */
2534 0x00, 0x01 /* Class */
2535 };
2536
2537 // Re-query verify cache works and query id is correct
2538 fd = resNetworkSend(TEST_NETID, queryBuf2, sizeof(queryBuf2), 0);
2539
2540 EXPECT_TRUE(fd != -1);
2541
2542 res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2543 EXPECT_GT(res, 0);
2544 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2545
2546 EXPECT_EQ(0x0053U, htons(hp->id));
2547
2548 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
Luke Huangba7bef92018-12-26 16:53:03 +08002549}
2550
Mike Yu4f3747b2018-12-02 17:54:29 +09002551// This test checks that the resolver should not generate the request containing OPT RR when using
Ken Chen0a015532019-01-02 14:59:38 +08002552// cleartext DNS. If we query the DNS server not supporting EDNS0 and it reponds with
2553// FORMERR_ON_EDNS, we will fallback to no EDNS0 and try again. If the server does no response, we
2554// won't retry so that we get no answer.
Mike Yu4f3747b2018-12-02 17:54:29 +09002555TEST_F(ResolverTest, BrokenEdns) {
2556 typedef test::DNSResponder::Edns Edns;
2557 enum ExpectResult { EXPECT_FAILURE, EXPECT_SUCCESS };
2558
Mike Yu3977d482020-02-26 17:18:57 +08002559 // Perform cleartext query in off mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002560 const char OFF[] = "off";
Mike Yu3977d482020-02-26 17:18:57 +08002561
2562 // Perform cleartext query when there's no private DNS server validated in opportunistic mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002563 const char OPPORTUNISTIC_UDP[] = "opportunistic_udp";
Mike Yu3977d482020-02-26 17:18:57 +08002564
2565 // Perform cleartext query when there is a private DNS server validated in opportunistic mode.
2566 const char OPPORTUNISTIC_FALLBACK_UDP[] = "opportunistic_fallback_udp";
2567
2568 // Perform cyphertext query in opportunistic mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002569 const char OPPORTUNISTIC_TLS[] = "opportunistic_tls";
Mike Yu3977d482020-02-26 17:18:57 +08002570
2571 // Perform cyphertext query in strict mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002572 const char STRICT[] = "strict";
Mike Yu3977d482020-02-26 17:18:57 +08002573
Mike Yu4f3747b2018-12-02 17:54:29 +09002574 const char GETHOSTBYNAME[] = "gethostbyname";
2575 const char GETADDRINFO[] = "getaddrinfo";
Mike Yu4f3747b2018-12-02 17:54:29 +09002576 const char ADDR4[] = "192.0.2.1";
2577 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2578 const char CLEARTEXT_PORT[] = "53";
2579 const char TLS_PORT[] = "853";
Luke Huangf8215372019-11-22 11:53:41 +08002580 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
Mike Yu3977d482020-02-26 17:18:57 +08002581 ResolverParamsParcel paramsForCleanup = DnsResponderClient::GetDefaultResolverParamsParcel();
2582 paramsForCleanup.servers.clear();
2583 paramsForCleanup.tlsServers.clear();
Mike Yu4f3747b2018-12-02 17:54:29 +09002584
Mike Yufc125e42019-05-15 20:41:28 +08002585 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Mike Yu4f3747b2018-12-02 17:54:29 +09002586 ASSERT_TRUE(dns.startServer());
2587
2588 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2589
Luke Huangf8215372019-11-22 11:53:41 +08002590 // clang-format off
Mike Yu4f3747b2018-12-02 17:54:29 +09002591 static const struct TestConfig {
2592 std::string mode;
2593 std::string method;
2594 Edns edns;
2595 ExpectResult expectResult;
2596
2597 std::string asHostName() const {
2598 const char* ednsString;
2599 switch (edns) {
2600 case Edns::ON:
2601 ednsString = "ednsOn";
2602 break;
Ken Chen0a015532019-01-02 14:59:38 +08002603 case Edns::FORMERR_ON_EDNS:
Mike Yu4f3747b2018-12-02 17:54:29 +09002604 ednsString = "ednsFormerr";
2605 break;
2606 case Edns::DROP:
2607 ednsString = "ednsDrop";
2608 break;
2609 default:
2610 ednsString = "";
2611 break;
2612 }
2613 return StringPrintf("%s.%s.%s.", mode.c_str(), method.c_str(), ednsString);
2614 }
2615 } testConfigs[] = {
Mike Yu3977d482020-02-26 17:18:57 +08002616 // In OPPORTUNISTIC_TLS, if the DNS server doesn't support EDNS0 but TLS, the lookup
2617 // fails. Could such server exist? if so, we might need to fix it to fallback to
2618 // cleartext query. If the server still make no response for the queries with EDNS0, we
2619 // might also need to fix it to retry without EDNS0.
Mike Yu4f3747b2018-12-02 17:54:29 +09002620 // Another thing is that {OPPORTUNISTIC_TLS, Edns::DROP} and {STRICT, Edns::DROP} are
2621 // commented out since TLS timeout is not configurable.
2622 // TODO: Uncomment them after TLS timeout is configurable.
Mike Yu3977d482020-02-26 17:18:57 +08002623 {OFF, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2624 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2625 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2626 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2627 {STRICT, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2628 {OFF, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2629 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2630 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2631 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2632 {STRICT, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2633 {OFF, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2634 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2635
2636 // The failure is due to no retry on timeout. Maybe fix it?
2637 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2638
2639 //{OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2640 //{STRICT, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2641 {OFF, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2642 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2643 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2644 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2645 {STRICT, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2646 {OFF, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2647 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2648 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2649 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2650 {STRICT, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2651 {OFF, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2652 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2653
2654 // The failure is due to no retry on timeout. Maybe fix it?
2655 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2656
Mike Yu4f3747b2018-12-02 17:54:29 +09002657 //{OPPORTUNISTIC_TLS, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2658 //{STRICT, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2659 };
Luke Huangf8215372019-11-22 11:53:41 +08002660 // clang-format on
Mike Yu4f3747b2018-12-02 17:54:29 +09002661
2662 for (const auto& config : testConfigs) {
2663 const std::string testHostName = config.asHostName();
2664 SCOPED_TRACE(testHostName);
2665
2666 const char* host_name = testHostName.c_str();
2667 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
2668 dns.setEdns(config.edns);
2669
2670 if (config.mode == OFF) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002671 if (tls.running()) {
2672 ASSERT_TRUE(tls.stopServer());
2673 }
Xiao Ma09b71022018-12-11 17:56:32 +09002674 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Mike Yu4f3747b2018-12-02 17:54:29 +09002675 } else if (config.mode == OPPORTUNISTIC_UDP) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002676 if (tls.running()) {
2677 ASSERT_TRUE(tls.stopServer());
2678 }
Xiao Ma09b71022018-12-11 17:56:32 +09002679 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002680 kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002681 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), false));
Mike Yu3977d482020-02-26 17:18:57 +08002682 } else if (config.mode == OPPORTUNISTIC_TLS || config.mode == OPPORTUNISTIC_FALLBACK_UDP) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002683 if (!tls.running()) {
2684 ASSERT_TRUE(tls.startServer());
2685 }
Xiao Ma09b71022018-12-11 17:56:32 +09002686 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002687 kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002688 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Mike Yu3977d482020-02-26 17:18:57 +08002689
2690 if (config.mode == OPPORTUNISTIC_FALLBACK_UDP) {
2691 // Force the resolver to fallback to cleartext queries.
2692 ASSERT_TRUE(tls.stopServer());
2693 }
Mike Yu4f3747b2018-12-02 17:54:29 +09002694 } else if (config.mode == STRICT) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002695 if (!tls.running()) {
2696 ASSERT_TRUE(tls.startServer());
2697 }
Xiao Ma09b71022018-12-11 17:56:32 +09002698 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002699 kDefaultParams, kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08002700 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Mike Yu4f3747b2018-12-02 17:54:29 +09002701 }
2702
2703 if (config.method == GETHOSTBYNAME) {
2704 const hostent* h_result = gethostbyname(host_name);
2705 if (config.expectResult == EXPECT_SUCCESS) {
2706 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2707 ASSERT_TRUE(h_result != nullptr);
2708 ASSERT_EQ(4, h_result->h_length);
2709 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
2710 EXPECT_EQ(ADDR4, ToString(h_result));
2711 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
2712 } else {
2713 EXPECT_EQ(0U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
2714 ASSERT_TRUE(h_result == nullptr);
2715 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2716 }
2717 } else if (config.method == GETADDRINFO) {
2718 ScopedAddrinfo ai_result;
2719 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2720 ai_result = safe_getaddrinfo(host_name, nullptr, &hints);
2721 if (config.expectResult == EXPECT_SUCCESS) {
2722 EXPECT_TRUE(ai_result != nullptr);
2723 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2724 const std::string result_str = ToString(ai_result);
2725 EXPECT_EQ(ADDR4, result_str);
2726 } else {
2727 EXPECT_TRUE(ai_result == nullptr);
2728 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
2729 }
2730 } else {
2731 FAIL() << "Unsupported query method: " << config.method;
2732 }
2733
Mike Yudd4ac2d2019-05-31 16:52:11 +08002734 tls.clearQueries();
Mike Yu4f3747b2018-12-02 17:54:29 +09002735 dns.clearQueries();
Mike Yu3977d482020-02-26 17:18:57 +08002736
2737 // Clear the setup to force the resolver to validate private DNS servers in every test.
2738 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(paramsForCleanup));
Mike Yu4f3747b2018-12-02 17:54:29 +09002739 }
Mike Yu4f3747b2018-12-02 17:54:29 +09002740}
nuccachena26cc2a2018-07-17 18:07:23 +08002741
Ken Chen0a015532019-01-02 14:59:38 +08002742// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2743// Resolver should have a reasonable number of retries instead of spinning forever. We don't have
2744// an efficient way to know if resolver is stuck in an infinite loop. However, test case will be
2745// failed due to timeout.
2746TEST_F(ResolverTest, UnstableTls) {
2747 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2748 const char CLEARTEXT_PORT[] = "53";
2749 const char TLS_PORT[] = "853";
2750 const char* host_name1 = "nonexistent1.example.com.";
2751 const char* host_name2 = "nonexistent2.example.com.";
2752 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
2753
Mike Yufc125e42019-05-15 20:41:28 +08002754 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Ken Chen0a015532019-01-02 14:59:38 +08002755 ASSERT_TRUE(dns.startServer());
2756 dns.setEdns(test::DNSResponder::Edns::FORMERR_ON_EDNS);
2757 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2758 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08002759 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002760 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
2761
Ken Chen0a015532019-01-02 14:59:38 +08002762 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
2763 tls.stopServer();
2764
2765 const hostent* h_result = gethostbyname(host_name1);
2766 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
2767 ASSERT_TRUE(h_result == nullptr);
2768 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2769
2770 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2771 ScopedAddrinfo ai_result = safe_getaddrinfo(host_name2, nullptr, &hints);
2772 EXPECT_TRUE(ai_result == nullptr);
2773 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
2774}
2775
2776// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2777// Moreover, server responds RCODE=FORMERR even on non-EDNS query.
2778TEST_F(ResolverTest, BogusDnsServer) {
2779 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2780 const char CLEARTEXT_PORT[] = "53";
2781 const char TLS_PORT[] = "853";
2782 const char* host_name1 = "nonexistent1.example.com.";
2783 const char* host_name2 = "nonexistent2.example.com.";
2784 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
2785
Mike Yufc125e42019-05-15 20:41:28 +08002786 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Ken Chen0a015532019-01-02 14:59:38 +08002787 ASSERT_TRUE(dns.startServer());
2788 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2789 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08002790 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002791 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
2792
Ken Chen0a015532019-01-02 14:59:38 +08002793 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
2794 tls.stopServer();
2795 dns.setEdns(test::DNSResponder::Edns::FORMERR_UNCOND);
2796
2797 const hostent* h_result = gethostbyname(host_name1);
2798 EXPECT_EQ(0U, GetNumQueries(dns, host_name1));
2799 ASSERT_TRUE(h_result == nullptr);
2800 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2801
2802 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2803 ScopedAddrinfo ai_result = safe_getaddrinfo(host_name2, nullptr, &hints);
2804 EXPECT_TRUE(ai_result == nullptr);
2805 EXPECT_EQ(0U, GetNumQueries(dns, host_name2));
2806}
2807
nuccachena26cc2a2018-07-17 18:07:23 +08002808TEST_F(ResolverTest, GetAddrInfo_Dns64Synthesize) {
2809 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002810 constexpr char dns64_name[] = "ipv4only.arpa.";
2811 constexpr char host_name[] = "v4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002812 const std::vector<DnsRecord> records = {
2813 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2814 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2815 };
nuccachena26cc2a2018-07-17 18:07:23 +08002816
Xiao Ma09b71022018-12-11 17:56:32 +09002817 test::DNSResponder dns(listen_addr);
Xiao Ma09b71022018-12-11 17:56:32 +09002818 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002819
2820 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002821 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002822
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002823 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002824 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002825 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002826
2827 // hints are necessary in order to let netd know which type of addresses the caller is
2828 // interested in.
Xiao Ma09b71022018-12-11 17:56:32 +09002829 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08002830 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
2831 EXPECT_TRUE(result != nullptr);
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002832 // TODO: BUG: there should only be two queries, one AAAA (which returns no records) and one A
2833 // (which returns 1.2.3.4). But there is an extra AAAA.
2834 EXPECT_EQ(3U, GetNumQueries(dns, host_name));
nuccachena26cc2a2018-07-17 18:07:23 +08002835
2836 std::string result_str = ToString(result);
2837 EXPECT_EQ(result_str, "64:ff9b::102:304");
2838
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002839 // Stopping NAT64 prefix discovery disables synthesis.
Luke Huang5bd827c2019-03-14 16:10:04 +08002840 EXPECT_TRUE(mDnsClient.resolvService()->stopPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002841 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_NOT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002842
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002843 dns.clearQueries();
nuccachena26cc2a2018-07-17 18:07:23 +08002844
2845 result = safe_getaddrinfo("v4only", nullptr, &hints);
2846 EXPECT_TRUE(result != nullptr);
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002847 // TODO: BUG: there should only be one query, an AAAA (which returns no records), because the
2848 // A is already cached. But there is an extra AAAA.
2849 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
nuccachena26cc2a2018-07-17 18:07:23 +08002850
2851 result_str = ToString(result);
2852 EXPECT_EQ(result_str, "1.2.3.4");
2853}
2854
nuccachena26cc2a2018-07-17 18:07:23 +08002855TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecified) {
2856 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002857 constexpr char dns64_name[] = "ipv4only.arpa.";
2858 constexpr char host_name[] = "v4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002859 const std::vector<DnsRecord> records = {
2860 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2861 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2862 };
nuccachena26cc2a2018-07-17 18:07:23 +08002863
Xiao Ma09b71022018-12-11 17:56:32 +09002864 test::DNSResponder dns(listen_addr);
2865 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002866 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002867 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002868
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002869 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002870 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002871 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002872
2873 // Ensure to synthesize AAAA if AF_INET6 is specified, and not to synthesize AAAA
2874 // in AF_INET case.
2875 addrinfo hints;
2876 memset(&hints, 0, sizeof(hints));
2877 hints.ai_family = AF_INET6;
2878 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
2879 EXPECT_TRUE(result != nullptr);
2880 std::string result_str = ToString(result);
2881 EXPECT_EQ(result_str, "64:ff9b::102:304");
2882
2883 hints.ai_family = AF_INET;
2884 result = safe_getaddrinfo("v4only", nullptr, &hints);
2885 EXPECT_TRUE(result != nullptr);
2886 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2887 result_str = ToString(result);
2888 EXPECT_EQ(result_str, "1.2.3.4");
2889}
nuccachena26cc2a2018-07-17 18:07:23 +08002890
2891TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedV6) {
2892 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002893 constexpr char dns64_name[] = "ipv4only.arpa.";
2894 constexpr char host_name[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002895 const std::vector<DnsRecord> records = {
2896 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2897 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2898 {host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
2899 };
nuccachena26cc2a2018-07-17 18:07:23 +08002900
Xiao Ma09b71022018-12-11 17:56:32 +09002901 test::DNSResponder dns(listen_addr);
2902 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002903 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002904 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002905
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002906 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002907 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002908 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002909
Xiao Ma09b71022018-12-11 17:56:32 +09002910 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08002911 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
2912 EXPECT_TRUE(result != nullptr);
2913 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2914
2915 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
Xiao Ma09b71022018-12-11 17:56:32 +09002916 const std::vector<std::string> result_strs = ToStrings(result);
nuccachena26cc2a2018-07-17 18:07:23 +08002917 for (const auto& str : result_strs) {
2918 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
2919 << ", result_str='" << str << "'";
2920 }
2921}
2922
2923TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedNoV6) {
2924 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002925 constexpr char dns64_name[] = "ipv4only.arpa.";
2926 constexpr char host_name[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002927 const std::vector<DnsRecord> records = {
2928 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2929 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2930 };
nuccachena26cc2a2018-07-17 18:07:23 +08002931
Xiao Ma09b71022018-12-11 17:56:32 +09002932 test::DNSResponder dns(listen_addr);
2933 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002934 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002935 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002936
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002937 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002938 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002939 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002940
Xiao Ma09b71022018-12-11 17:56:32 +09002941 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08002942 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
2943 EXPECT_TRUE(result != nullptr);
2944 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2945
2946 // In AF_UNSPEC case, synthesize AAAA if there's no AAAA answer.
2947 std::string result_str = ToString(result);
2948 EXPECT_EQ(result_str, "64:ff9b::102:304");
2949}
2950
2951TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecialUseIPv4Addresses) {
2952 constexpr char THIS_NETWORK[] = "this_network";
2953 constexpr char LOOPBACK[] = "loopback";
2954 constexpr char LINK_LOCAL[] = "link_local";
2955 constexpr char MULTICAST[] = "multicast";
2956 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
2957
2958 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
2959 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
2960 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
2961 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
2962 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
2963
2964 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002965 constexpr char dns64_name[] = "ipv4only.arpa.";
2966
Xiao Ma09b71022018-12-11 17:56:32 +09002967 test::DNSResponder dns(listen_addr);
2968 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08002969 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002970 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002971
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002972 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002973 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002974 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002975
Luke Huangf8215372019-11-22 11:53:41 +08002976 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08002977 static const struct TestConfig {
2978 std::string name;
2979 std::string addr;
2980
2981 std::string asHostName() const { return StringPrintf("%s.example.com.", name.c_str()); }
2982 } testConfigs[]{
2983 {THIS_NETWORK, ADDR_THIS_NETWORK},
2984 {LOOPBACK, ADDR_LOOPBACK},
2985 {LINK_LOCAL, ADDR_LINK_LOCAL},
2986 {MULTICAST, ADDR_MULTICAST},
2987 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
2988 };
Luke Huangf8215372019-11-22 11:53:41 +08002989 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08002990
2991 for (const auto& config : testConfigs) {
2992 const std::string testHostName = config.asHostName();
2993 SCOPED_TRACE(testHostName);
2994
2995 const char* host_name = testHostName.c_str();
2996 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
2997
2998 addrinfo hints;
2999 memset(&hints, 0, sizeof(hints));
3000 hints.ai_family = AF_INET6;
3001 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
3002 // In AF_INET6 case, don't return IPv4 answers
3003 EXPECT_TRUE(result == nullptr);
3004 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3005 dns.clearQueries();
3006
3007 memset(&hints, 0, sizeof(hints));
3008 hints.ai_family = AF_UNSPEC;
3009 result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
3010 EXPECT_TRUE(result != nullptr);
3011 // Expect IPv6 query only. IPv4 answer has been cached in previous query.
3012 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3013 // In AF_UNSPEC case, don't synthesize special use IPv4 address.
3014 std::string result_str = ToString(result);
3015 EXPECT_EQ(result_str, config.addr.c_str());
3016 dns.clearQueries();
3017 }
3018}
3019
3020TEST_F(ResolverTest, GetAddrInfo_Dns64QueryWithNullArgumentHints) {
3021 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003022 constexpr char dns64_name[] = "ipv4only.arpa.";
3023 constexpr char host_name[] = "v4only.example.com.";
3024 constexpr char host_name2[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003025 const std::vector<DnsRecord> records = {
3026 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3027 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3028 {host_name2, ns_type::ns_t_a, "1.2.3.4"},
3029 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
3030 };
nuccachena26cc2a2018-07-17 18:07:23 +08003031
Xiao Ma09b71022018-12-11 17:56:32 +09003032 test::DNSResponder dns(listen_addr);
3033 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003034 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003035 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003036
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003037 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003038 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003039 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003040
3041 // Assign argument hints of getaddrinfo() as null is equivalent to set ai_family AF_UNSPEC.
3042 // In AF_UNSPEC case, synthesize AAAA if there has A answer only.
3043 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, nullptr);
3044 EXPECT_TRUE(result != nullptr);
3045 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3046 std::string result_str = ToString(result);
3047 EXPECT_EQ(result_str, "64:ff9b::102:304");
3048 dns.clearQueries();
3049
3050 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
3051 result = safe_getaddrinfo("v4v6", nullptr, nullptr);
3052 EXPECT_TRUE(result != nullptr);
3053 EXPECT_LE(2U, GetNumQueries(dns, host_name2));
3054 std::vector<std::string> result_strs = ToStrings(result);
3055 for (const auto& str : result_strs) {
3056 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
3057 << ", result_str='" << str << "'";
3058 }
3059}
3060
3061TEST_F(ResolverTest, GetAddrInfo_Dns64QueryNullArgumentNode) {
3062 constexpr char ADDR_ANYADDR_V4[] = "0.0.0.0";
3063 constexpr char ADDR_ANYADDR_V6[] = "::";
3064 constexpr char ADDR_LOCALHOST_V4[] = "127.0.0.1";
3065 constexpr char ADDR_LOCALHOST_V6[] = "::1";
3066
3067 constexpr char PORT_NAME_HTTP[] = "http";
3068 constexpr char PORT_NUMBER_HTTP[] = "80";
3069
3070 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003071 constexpr char dns64_name[] = "ipv4only.arpa.";
3072
Xiao Ma09b71022018-12-11 17:56:32 +09003073 test::DNSResponder dns(listen_addr);
3074 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003075 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003076 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003077
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003078 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003079 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003080 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003081
Luke Huangf8215372019-11-22 11:53:41 +08003082 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003083 // If node is null, return address is listed by libc/getaddrinfo.c as follows.
3084 // - passive socket -> anyaddr (0.0.0.0 or ::)
3085 // - non-passive socket -> localhost (127.0.0.1 or ::1)
3086 static const struct TestConfig {
3087 int flag;
3088 std::string addr_v4;
3089 std::string addr_v6;
3090
3091 std::string asParameters() const {
3092 return StringPrintf("flag=%d, addr_v4=%s, addr_v6=%s", flag, addr_v4.c_str(),
3093 addr_v6.c_str());
3094 }
3095 } testConfigs[]{
3096 {0 /* non-passive */, ADDR_LOCALHOST_V4, ADDR_LOCALHOST_V6},
3097 {AI_PASSIVE, ADDR_ANYADDR_V4, ADDR_ANYADDR_V6}
3098 };
Luke Huangf8215372019-11-22 11:53:41 +08003099 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003100
3101 for (const auto& config : testConfigs) {
3102 SCOPED_TRACE(config.asParameters());
3103
Xiao Ma09b71022018-12-11 17:56:32 +09003104 addrinfo hints = {
Nick Desaulnierscd6395a2019-10-11 09:15:24 -07003105 .ai_flags = config.flag,
Xiao Ma09b71022018-12-11 17:56:32 +09003106 .ai_family = AF_UNSPEC, // any address family
3107 .ai_socktype = 0, // any type
3108 .ai_protocol = 0, // any protocol
Xiao Ma09b71022018-12-11 17:56:32 +09003109 };
nuccachena26cc2a2018-07-17 18:07:23 +08003110
3111 // Assign hostname as null and service as port name.
3112 ScopedAddrinfo result = safe_getaddrinfo(nullptr, PORT_NAME_HTTP, &hints);
3113 ASSERT_TRUE(result != nullptr);
3114
3115 // Can't be synthesized because it should not get into Netd.
3116 std::vector<std::string> result_strs = ToStrings(result);
3117 for (const auto& str : result_strs) {
3118 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
3119 << ", result_str='" << str << "'";
3120 }
3121
3122 // Assign hostname as null and service as numeric port number.
3123 hints.ai_flags = config.flag | AI_NUMERICSERV;
3124 result = safe_getaddrinfo(nullptr, PORT_NUMBER_HTTP, &hints);
3125 ASSERT_TRUE(result != nullptr);
3126
3127 // Can't be synthesized because it should not get into Netd.
3128 result_strs = ToStrings(result);
3129 for (const auto& str : result_strs) {
3130 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
3131 << ", result_str='" << str << "'";
3132 }
3133 }
3134}
3135
3136TEST_F(ResolverTest, GetHostByAddr_ReverseDnsQueryWithHavingNat64Prefix) {
3137 struct hostent* result = nullptr;
3138 struct in_addr v4addr;
3139 struct in6_addr v6addr;
3140
3141 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003142 constexpr char dns64_name[] = "ipv4only.arpa.";
3143 constexpr char ptr_name[] = "v4v6.example.com.";
3144 // PTR record for IPv4 address 1.2.3.4
3145 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3146 // PTR record for IPv6 address 2001:db8::102:304
3147 constexpr char ptr_addr_v6[] =
3148 "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 +09003149 const std::vector<DnsRecord> records = {
3150 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3151 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3152 {ptr_addr_v6, ns_type::ns_t_ptr, ptr_name},
3153 };
nuccachena26cc2a2018-07-17 18:07:23 +08003154
Xiao Ma09b71022018-12-11 17:56:32 +09003155 test::DNSResponder dns(listen_addr);
3156 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003157 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003158 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003159
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003160 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003161 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003162 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003163
3164 // Reverse IPv4 DNS query. Prefix should have no effect on it.
3165 inet_pton(AF_INET, "1.2.3.4", &v4addr);
3166 result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
3167 ASSERT_TRUE(result != nullptr);
3168 std::string result_str = result->h_name ? result->h_name : "null";
3169 EXPECT_EQ(result_str, "v4v6.example.com");
3170
3171 // Reverse IPv6 DNS query. Prefix should have no effect on it.
3172 inet_pton(AF_INET6, "2001:db8::102:304", &v6addr);
3173 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3174 ASSERT_TRUE(result != nullptr);
3175 result_str = result->h_name ? result->h_name : "null";
3176 EXPECT_EQ(result_str, "v4v6.example.com");
3177}
3178
3179TEST_F(ResolverTest, GetHostByAddr_ReverseDns64Query) {
3180 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003181 constexpr char dns64_name[] = "ipv4only.arpa.";
3182 constexpr char ptr_name[] = "v4only.example.com.";
3183 // PTR record for IPv4 address 1.2.3.4
3184 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3185 // PTR record for IPv6 address 64:ff9b::1.2.3.4
3186 constexpr char ptr_addr_v6_nomapping[] =
3187 "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.";
3188 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
3189 // PTR record for IPv6 address 64:ff9b::5.6.7.8
3190 constexpr char ptr_addr_v6_synthesis[] =
3191 "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 +09003192 const std::vector<DnsRecord> records = {
3193 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3194 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3195 {ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis},
3196 };
nuccachena26cc2a2018-07-17 18:07:23 +08003197
Xiao Ma09b71022018-12-11 17:56:32 +09003198 test::DNSResponder dns(listen_addr);
3199 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003200 // "ptr_addr_v6_nomapping" is not mapped in DNS server
nuccachena26cc2a2018-07-17 18:07:23 +08003201 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003202 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003203
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003204 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003205 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003206 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003207
3208 // Synthesized PTR record doesn't exist on DNS server
3209 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
3210 // After querying synthesized address failed, expect that prefix is removed from IPv6
3211 // synthesized address and do reverse IPv4 query instead.
3212 struct in6_addr v6addr;
3213 inet_pton(AF_INET6, "64:ff9b::1.2.3.4", &v6addr);
3214 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3215 ASSERT_TRUE(result != nullptr);
3216 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist
3217 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist
3218 std::string result_str = result->h_name ? result->h_name : "null";
3219 EXPECT_EQ(result_str, "v4only.example.com");
3220 // Check that return address has been mapped from IPv4 to IPv6 address because Netd
3221 // removes NAT64 prefix and does IPv4 DNS reverse lookup in this case. Then, Netd
3222 // fakes the return IPv4 address as original queried IPv6 address.
3223 result_str = ToString(result);
3224 EXPECT_EQ(result_str, "64:ff9b::102:304");
3225 dns.clearQueries();
3226
3227 // Synthesized PTR record exists on DNS server
3228 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
3229 // Expect to Netd pass through synthesized address for DNS queries.
3230 inet_pton(AF_INET6, "64:ff9b::5.6.7.8", &v6addr);
3231 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3232 ASSERT_TRUE(result != nullptr);
3233 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
3234 result_str = result->h_name ? result->h_name : "null";
3235 EXPECT_EQ(result_str, "v6synthesis.example.com");
3236}
3237
3238TEST_F(ResolverTest, GetHostByAddr_ReverseDns64QueryFromHostFile) {
3239 constexpr char dns64_name[] = "ipv4only.arpa.";
3240 constexpr char host_name[] = "localhost";
3241 // The address is synthesized by prefix64:localhost.
3242 constexpr char host_addr[] = "64:ff9b::7f00:1";
nuccachena26cc2a2018-07-17 18:07:23 +08003243 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003244
3245 test::DNSResponder dns(listen_addr);
3246 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003247 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003248 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003249
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003250 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003251 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003252 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003253
3254 // Using synthesized "localhost" address to be a trick for resolving host name
3255 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
3256 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
3257 struct in6_addr v6addr;
3258 inet_pton(AF_INET6, host_addr, &v6addr);
3259 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3260 ASSERT_TRUE(result != nullptr);
3261 // Expect no DNS queries; localhost is resolved via /etc/hosts.
3262 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
3263
Luke Huangf8215372019-11-22 11:53:41 +08003264 ASSERT_EQ(sizeof(in6_addr), (unsigned)result->h_length);
nuccachena26cc2a2018-07-17 18:07:23 +08003265 ASSERT_EQ(AF_INET6, result->h_addrtype);
3266 std::string result_str = ToString(result);
3267 EXPECT_EQ(result_str, host_addr);
3268 result_str = result->h_name ? result->h_name : "null";
3269 EXPECT_EQ(result_str, host_name);
3270}
3271
Hungming Chen9e6185a2019-06-04 16:09:19 +08003272TEST_F(ResolverTest, GetHostByAddr_cnamesClasslessReverseDelegation) {
3273 // IPv4 addresses in the subnet with notation '/' or '-'.
3274 constexpr char addr_slash[] = "192.0.2.1";
3275 constexpr char addr_hyphen[] = "192.0.3.1";
3276
3277 // Used to verify DNS reverse query for classless reverse lookup zone. See detail in RFC 2317
3278 // section 4.
3279 const static std::vector<DnsRecord> records = {
3280 // The records for reverse querying "192.0.2.1" in the subnet with notation '/'.
3281 {"1.2.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0/25.2.0.192.in-addr.arpa."},
3282 {"1.0/25.2.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3283
3284 // The records for reverse querying "192.0.3.1" in the subnet with notation '-'.
3285 {"1.3.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0-127.3.0.192.in-addr.arpa."},
3286 {"1.0-127.3.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3287 };
3288
3289 test::DNSResponder dns;
3290 StartDns(dns, records);
3291 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3292
3293 for (const auto& address : {addr_slash, addr_hyphen}) {
3294 SCOPED_TRACE(address);
3295
3296 in_addr v4addr;
3297 ASSERT_TRUE(inet_pton(AF_INET, address, &v4addr));
3298 hostent* result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
3299 ASSERT_TRUE(result != nullptr);
3300 EXPECT_STREQ("hello.example.com", result->h_name);
3301 }
3302}
3303
nuccachena26cc2a2018-07-17 18:07:23 +08003304TEST_F(ResolverTest, GetNameInfo_ReverseDnsQueryWithHavingNat64Prefix) {
3305 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003306 constexpr char dns64_name[] = "ipv4only.arpa.";
3307 constexpr char ptr_name[] = "v4v6.example.com.";
3308 // PTR record for IPv4 address 1.2.3.4
3309 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3310 // PTR record for IPv6 address 2001:db8::102:304
3311 constexpr char ptr_addr_v6[] =
3312 "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 +09003313 const std::vector<DnsRecord> records = {
3314 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3315 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3316 {ptr_addr_v6, ns_type::ns_t_ptr, ptr_name},
3317 };
nuccachena26cc2a2018-07-17 18:07:23 +08003318
Xiao Ma09b71022018-12-11 17:56:32 +09003319 test::DNSResponder dns(listen_addr);
3320 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003321 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003322 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003323
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003324 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003325 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003326 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003327
Luke Huangf8215372019-11-22 11:53:41 +08003328 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003329 static const struct TestConfig {
3330 int flag;
3331 int family;
3332 std::string addr;
3333 std::string host;
3334
3335 std::string asParameters() const {
3336 return StringPrintf("flag=%d, family=%d, addr=%s, host=%s", flag, family, addr.c_str(),
3337 host.c_str());
3338 }
3339 } testConfigs[]{
3340 {NI_NAMEREQD, AF_INET, "1.2.3.4", "v4v6.example.com"},
3341 {NI_NUMERICHOST, AF_INET, "1.2.3.4", "1.2.3.4"},
3342 {0, AF_INET, "1.2.3.4", "v4v6.example.com"},
3343 {0, AF_INET, "5.6.7.8", "5.6.7.8"}, // unmapped
3344 {NI_NAMEREQD, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
3345 {NI_NUMERICHOST, AF_INET6, "2001:db8::102:304", "2001:db8::102:304"},
3346 {0, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
3347 {0, AF_INET6, "2001:db8::506:708", "2001:db8::506:708"}, // unmapped
3348 };
Luke Huangf8215372019-11-22 11:53:41 +08003349 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003350
3351 // Reverse IPv4/IPv6 DNS query. Prefix should have no effect on it.
3352 for (const auto& config : testConfigs) {
3353 SCOPED_TRACE(config.asParameters());
3354
3355 int rv;
3356 char host[NI_MAXHOST];
3357 struct sockaddr_in sin;
3358 struct sockaddr_in6 sin6;
3359 if (config.family == AF_INET) {
3360 memset(&sin, 0, sizeof(sin));
3361 sin.sin_family = AF_INET;
3362 inet_pton(AF_INET, config.addr.c_str(), &sin.sin_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003363 rv = getnameinfo((const struct sockaddr*)&sin, sizeof(sin), host, sizeof(host), nullptr,
3364 0, config.flag);
nuccachena26cc2a2018-07-17 18:07:23 +08003365 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4));
3366 } else if (config.family == AF_INET6) {
3367 memset(&sin6, 0, sizeof(sin6));
3368 sin6.sin6_family = AF_INET6;
3369 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003370 rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host),
nuccachena26cc2a2018-07-17 18:07:23 +08003371 nullptr, 0, config.flag);
3372 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6));
3373 }
3374 ASSERT_EQ(0, rv);
3375 std::string result_str = host;
3376 EXPECT_EQ(result_str, config.host);
3377 dns.clearQueries();
3378 }
3379}
3380
3381TEST_F(ResolverTest, GetNameInfo_ReverseDns64Query) {
3382 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003383 constexpr char dns64_name[] = "ipv4only.arpa.";
3384 constexpr char ptr_name[] = "v4only.example.com.";
3385 // PTR record for IPv4 address 1.2.3.4
3386 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3387 // PTR record for IPv6 address 64:ff9b::1.2.3.4
3388 constexpr char ptr_addr_v6_nomapping[] =
3389 "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.";
3390 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
3391 // PTR record for IPv6 address 64:ff9b::5.6.7.8
3392 constexpr char ptr_addr_v6_synthesis[] =
3393 "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 +09003394 const std::vector<DnsRecord> records = {
3395 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3396 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3397 {ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis},
3398 };
nuccachena26cc2a2018-07-17 18:07:23 +08003399
Xiao Ma09b71022018-12-11 17:56:32 +09003400 test::DNSResponder dns(listen_addr);
3401 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003402 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003403 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003404
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003405 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003406 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003407 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003408
Luke Huangf8215372019-11-22 11:53:41 +08003409 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003410 static const struct TestConfig {
3411 bool hasSynthesizedPtrRecord;
3412 int flag;
3413 std::string addr;
3414 std::string host;
3415
3416 std::string asParameters() const {
3417 return StringPrintf("hasSynthesizedPtrRecord=%d, flag=%d, addr=%s, host=%s",
3418 hasSynthesizedPtrRecord, flag, addr.c_str(), host.c_str());
3419 }
3420 } testConfigs[]{
3421 {false, NI_NAMEREQD, "64:ff9b::102:304", "v4only.example.com"},
3422 {false, NI_NUMERICHOST, "64:ff9b::102:304", "64:ff9b::102:304"},
3423 {false, 0, "64:ff9b::102:304", "v4only.example.com"},
3424 {true, NI_NAMEREQD, "64:ff9b::506:708", "v6synthesis.example.com"},
3425 {true, NI_NUMERICHOST, "64:ff9b::506:708", "64:ff9b::506:708"},
3426 {true, 0, "64:ff9b::506:708", "v6synthesis.example.com"}
3427 };
Luke Huangf8215372019-11-22 11:53:41 +08003428 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003429
3430 // hasSynthesizedPtrRecord = false
3431 // Synthesized PTR record doesn't exist on DNS server
3432 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
3433 // After querying synthesized address failed, expect that prefix is removed from IPv6
3434 // synthesized address and do reverse IPv4 query instead.
3435 //
3436 // hasSynthesizedPtrRecord = true
3437 // Synthesized PTR record exists on DNS server
3438 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
3439 // Expect to just pass through synthesized address for DNS queries.
3440 for (const auto& config : testConfigs) {
3441 SCOPED_TRACE(config.asParameters());
3442
3443 char host[NI_MAXHOST];
3444 struct sockaddr_in6 sin6;
3445 memset(&sin6, 0, sizeof(sin6));
3446 sin6.sin6_family = AF_INET6;
3447 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003448 int rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host),
nuccachena26cc2a2018-07-17 18:07:23 +08003449 nullptr, 0, config.flag);
3450 ASSERT_EQ(0, rv);
3451 if (config.flag == NI_NAMEREQD) {
3452 if (config.hasSynthesizedPtrRecord) {
3453 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
3454 } else {
3455 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist.
3456 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist.
3457 }
3458 }
3459 std::string result_str = host;
3460 EXPECT_EQ(result_str, config.host);
3461 dns.clearQueries();
3462 }
3463}
3464
3465TEST_F(ResolverTest, GetNameInfo_ReverseDns64QueryFromHostFile) {
3466 constexpr char dns64_name[] = "ipv4only.arpa.";
3467 constexpr char host_name[] = "localhost";
3468 // The address is synthesized by prefix64:localhost.
3469 constexpr char host_addr[] = "64:ff9b::7f00:1";
nuccachena26cc2a2018-07-17 18:07:23 +08003470 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003471
3472 test::DNSResponder dns(listen_addr);
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003473
Xiao Ma09b71022018-12-11 17:56:32 +09003474 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003475 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003476 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003477
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003478 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003479 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003480 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003481
3482 // Using synthesized "localhost" address to be a trick for resolving host name
3483 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
3484 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
3485 char host[NI_MAXHOST];
Xiao Ma09b71022018-12-11 17:56:32 +09003486 struct sockaddr_in6 sin6 = {.sin6_family = AF_INET6};
nuccachena26cc2a2018-07-17 18:07:23 +08003487 inet_pton(AF_INET6, host_addr, &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003488 int rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host), nullptr,
nuccachena26cc2a2018-07-17 18:07:23 +08003489 0, NI_NAMEREQD);
3490 ASSERT_EQ(0, rv);
3491 // Expect no DNS queries; localhost is resolved via /etc/hosts.
3492 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
3493
3494 std::string result_str = host;
3495 EXPECT_EQ(result_str, host_name);
3496}
3497
Hungming Chen9e6185a2019-06-04 16:09:19 +08003498TEST_F(ResolverTest, GetNameInfo_cnamesClasslessReverseDelegation) {
3499 // IPv4 addresses in the subnet with notation '/' or '-'.
3500 constexpr char addr_slash[] = "192.0.2.1";
3501 constexpr char addr_hyphen[] = "192.0.3.1";
3502
3503 // Used to verify DNS reverse query for classless reverse lookup zone. See detail in RFC 2317
3504 // section 4.
3505 const static std::vector<DnsRecord> records = {
3506 // The records for reverse querying "192.0.2.1" in the subnet with notation '/'.
3507 {"1.2.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0/25.2.0.192.in-addr.arpa."},
3508 {"1.0/25.2.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3509
3510 // The records for reverse querying "192.0.3.1" in the subnet with notation '-'.
3511 {"1.3.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0-127.3.0.192.in-addr.arpa."},
3512 {"1.0-127.3.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3513 };
3514
3515 test::DNSResponder dns;
3516 StartDns(dns, records);
3517 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3518
3519 for (const auto& address : {addr_slash, addr_hyphen}) {
3520 SCOPED_TRACE(address);
3521
3522 char host[NI_MAXHOST];
3523 sockaddr_in sin = {.sin_family = AF_INET};
3524 ASSERT_TRUE(inet_pton(AF_INET, address, &sin.sin_addr));
3525 int rv = getnameinfo((const sockaddr*)&sin, sizeof(sin), host, sizeof(host), nullptr, 0,
3526 NI_NAMEREQD);
3527 ASSERT_EQ(0, rv);
3528 EXPECT_STREQ("hello.example.com", host);
3529 }
3530}
3531
nuccachena26cc2a2018-07-17 18:07:23 +08003532TEST_F(ResolverTest, GetHostByName2_Dns64Synthesize) {
Xiao Ma09b71022018-12-11 17:56:32 +09003533 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003534 constexpr char dns64_name[] = "ipv4only.arpa.";
3535 constexpr char host_name[] = "ipv4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003536 const std::vector<DnsRecord> records = {
3537 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3538 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3539 };
nuccachena26cc2a2018-07-17 18:07:23 +08003540
Xiao Ma09b71022018-12-11 17:56:32 +09003541 test::DNSResponder dns(listen_addr);
3542 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003543 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003544 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003545
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003546 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003547 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003548 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003549
3550 // Query an IPv4-only hostname. Expect that gets a synthesized address.
3551 struct hostent* result = gethostbyname2("ipv4only", AF_INET6);
3552 ASSERT_TRUE(result != nullptr);
3553 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3554 std::string result_str = ToString(result);
3555 EXPECT_EQ(result_str, "64:ff9b::102:304");
3556}
nuccachena26cc2a2018-07-17 18:07:23 +08003557
3558TEST_F(ResolverTest, GetHostByName2_DnsQueryWithHavingNat64Prefix) {
3559 constexpr char dns64_name[] = "ipv4only.arpa.";
3560 constexpr char host_name[] = "v4v6.example.com.";
nuccachena26cc2a2018-07-17 18:07:23 +08003561 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003562 const std::vector<DnsRecord> records = {
3563 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3564 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3565 {host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
3566 };
3567
3568 test::DNSResponder dns(listen_addr);
3569 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003570 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003571 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003572
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003573 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003574 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003575 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003576
3577 // IPv4 DNS query. Prefix should have no effect on it.
3578 struct hostent* result = gethostbyname2("v4v6", AF_INET);
3579 ASSERT_TRUE(result != nullptr);
3580 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3581 std::string result_str = ToString(result);
3582 EXPECT_EQ(result_str, "1.2.3.4");
3583 dns.clearQueries();
3584
3585 // IPv6 DNS query. Prefix should have no effect on it.
3586 result = gethostbyname2("v4v6", AF_INET6);
3587 ASSERT_TRUE(result != nullptr);
3588 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3589 result_str = ToString(result);
3590 EXPECT_EQ(result_str, "2001:db8::102:304");
3591}
3592
3593TEST_F(ResolverTest, GetHostByName2_Dns64QuerySpecialUseIPv4Addresses) {
3594 constexpr char THIS_NETWORK[] = "this_network";
3595 constexpr char LOOPBACK[] = "loopback";
3596 constexpr char LINK_LOCAL[] = "link_local";
3597 constexpr char MULTICAST[] = "multicast";
3598 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
3599
3600 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
3601 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
3602 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
3603 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
3604 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
3605
3606 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003607 constexpr char dns64_name[] = "ipv4only.arpa.";
3608
Xiao Ma09b71022018-12-11 17:56:32 +09003609 test::DNSResponder dns(listen_addr);
3610 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003611 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003612 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003613
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003614 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003615 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003616 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003617
Luke Huangf8215372019-11-22 11:53:41 +08003618 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003619 static const struct TestConfig {
3620 std::string name;
3621 std::string addr;
3622
3623 std::string asHostName() const {
Luke Huangf8215372019-11-22 11:53:41 +08003624 return StringPrintf("%s.example.com.", name.c_str());
nuccachena26cc2a2018-07-17 18:07:23 +08003625 }
3626 } testConfigs[]{
3627 {THIS_NETWORK, ADDR_THIS_NETWORK},
3628 {LOOPBACK, ADDR_LOOPBACK},
3629 {LINK_LOCAL, ADDR_LINK_LOCAL},
3630 {MULTICAST, ADDR_MULTICAST},
3631 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
3632 };
Luke Huangf8215372019-11-22 11:53:41 +08003633 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003634
3635 for (const auto& config : testConfigs) {
3636 const std::string testHostName = config.asHostName();
3637 SCOPED_TRACE(testHostName);
3638
3639 const char* host_name = testHostName.c_str();
3640 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
3641
3642 struct hostent* result = gethostbyname2(config.name.c_str(), AF_INET6);
3643 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3644
3645 // In AF_INET6 case, don't synthesize special use IPv4 address.
3646 // Expect to have no answer
3647 EXPECT_EQ(nullptr, result);
3648
3649 dns.clearQueries();
3650 }
Bernie Innocenti2fef2b82018-12-20 15:56:40 +09003651}
Mike Yuf14e1a92019-05-10 13:54:58 +08003652
3653TEST_F(ResolverTest, PrefixDiscoveryBypassTls) {
3654 constexpr char listen_addr[] = "::1";
3655 constexpr char cleartext_port[] = "53";
3656 constexpr char tls_port[] = "853";
3657 constexpr char dns64_name[] = "ipv4only.arpa.";
3658 const std::vector<std::string> servers = {listen_addr};
3659
3660 test::DNSResponder dns(listen_addr);
3661 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
3662 test::DnsTlsFrontend tls(listen_addr, tls_port, listen_addr, cleartext_port);
3663 ASSERT_TRUE(tls.startServer());
3664
3665 // Setup OPPORTUNISTIC mode and wait for the validation complete.
waynema0e73c2e2019-07-31 15:04:08 +08003666 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08003667 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003668 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yuf14e1a92019-05-10 13:54:58 +08003669 tls.clearQueries();
3670
3671 // Start NAT64 prefix discovery and wait for it complete.
3672 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003673 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
Mike Yuf14e1a92019-05-10 13:54:58 +08003674
3675 // Verify it bypassed TLS even though there's a TLS server available.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003676 EXPECT_EQ(0, tls.queries()) << dns.dumpQueries();
3677 EXPECT_EQ(1U, GetNumQueries(dns, dns64_name)) << dns.dumpQueries();
Mike Yuf14e1a92019-05-10 13:54:58 +08003678
3679 // Restart the testing network to reset the cache.
3680 mDnsClient.TearDown();
3681 mDnsClient.SetUp();
3682 dns.clearQueries();
3683
3684 // Setup STRICT mode and wait for the validation complete.
waynema0e73c2e2019-07-31 15:04:08 +08003685 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
3686 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08003687 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003688 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yuf14e1a92019-05-10 13:54:58 +08003689 tls.clearQueries();
3690
3691 // Start NAT64 prefix discovery and wait for it to complete.
3692 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003693 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
Mike Yuf14e1a92019-05-10 13:54:58 +08003694
3695 // Verify it bypassed TLS despite STRICT mode.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003696 EXPECT_EQ(0, tls.queries()) << dns.dumpQueries();
3697 EXPECT_EQ(1U, GetNumQueries(dns, dns64_name)) << dns.dumpQueries();
Mike Yuf14e1a92019-05-10 13:54:58 +08003698}
Luke Huang9807e6b2019-05-20 16:17:12 +08003699
Lorenzo Colittie51091d2020-05-20 02:48:44 +09003700TEST_F(ResolverTest, SetAndClearNat64Prefix) {
3701 constexpr char host_name[] = "v4.example.com.";
3702 constexpr char listen_addr[] = "::1";
3703 const std::vector<DnsRecord> records = {
3704 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3705 };
3706 const std::string kNat64Prefix1 = "64:ff9b::/96";
3707 const std::string kNat64Prefix2 = "2001:db8:6464::/96";
3708
3709 test::DNSResponder dns(listen_addr);
3710 StartDns(dns, records);
3711 const std::vector<std::string> servers = {listen_addr};
3712 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
3713
3714 auto resolvService = mDnsClient.resolvService();
3715 addrinfo hints = {.ai_family = AF_INET6};
3716
3717 // No NAT64 prefix, no AAAA record.
3718 ScopedAddrinfo result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3719 ASSERT_TRUE(result == nullptr);
3720
3721 // Set the prefix, and expect to get a synthesized AAAA record.
3722 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix2).isOk());
3723 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3724 ASSERT_FALSE(result == nullptr);
3725 EXPECT_EQ("2001:db8:6464::102:304", ToString(result));
3726
3727 // Update the prefix, expect to see AAAA records from the new prefix.
3728 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3729 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3730 ASSERT_FALSE(result == nullptr);
3731 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3732
3733 // Non-/96 prefixes are ignored.
3734 auto status = resolvService->setPrefix64(TEST_NETID, "64:ff9b::/64");
3735 EXPECT_FALSE(status.isOk());
3736 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3737 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3738
3739 // Invalid prefixes are ignored.
3740 status = resolvService->setPrefix64(TEST_NETID, "192.0.2.0/24");
3741 EXPECT_FALSE(status.isOk());
3742 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3743 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3744
3745 status = resolvService->setPrefix64(TEST_NETID, "192.0.2.1");
3746 EXPECT_FALSE(status.isOk());
3747 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3748 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3749
3750 status = resolvService->setPrefix64(TEST_NETID, "hello");
3751 EXPECT_FALSE(status.isOk());
3752 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3753 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3754
3755 // DNS64 synthesis is still working.
3756 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3757 ASSERT_FALSE(result == nullptr);
3758 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3759
3760 // Clear the prefix. No AAAA records any more.
3761 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, "").isOk());
3762 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3763 EXPECT_TRUE(result == nullptr);
3764
3765 // Calling startPrefix64Discovery clears the prefix.
3766 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3767 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3768 ASSERT_FALSE(result == nullptr);
3769 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3770
3771 EXPECT_TRUE(resolvService->startPrefix64Discovery(TEST_NETID).isOk());
3772 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3773 ASSERT_TRUE(result == nullptr);
3774
3775 // setPrefix64 fails if prefix discovery is started, even if no prefix is yet discovered...
3776 status = resolvService->setPrefix64(TEST_NETID, kNat64Prefix1);
3777 EXPECT_FALSE(status.isOk());
3778 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3779 EXPECT_EQ(EEXIST, status.getServiceSpecificError());
3780
3781 // .. and clearing the prefix also has no effect.
3782 status = resolvService->setPrefix64(TEST_NETID, "");
3783 EXPECT_FALSE(status.isOk());
3784 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3785 EXPECT_EQ(ENOENT, status.getServiceSpecificError());
3786
3787 // setPrefix64 succeeds again when prefix discovery is stopped.
3788 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
3789 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3790 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3791 ASSERT_FALSE(result == nullptr);
3792 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3793
3794 // Calling stopPrefix64Discovery clears the prefix.
3795 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
3796 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3797 ASSERT_TRUE(result == nullptr);
3798
3799 // Set up NAT64 prefix discovery.
3800 constexpr char dns64_name[] = "ipv4only.arpa.";
3801 const std::vector<DnsRecord> newRecords = {
3802 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3803 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3804 };
3805 dns.stopServer();
3806 StartDns(dns, newRecords);
3807
3808 EXPECT_TRUE(resolvService->startPrefix64Discovery(TEST_NETID).isOk());
3809 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
3810 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3811 ASSERT_FALSE(result == nullptr);
3812 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3813
3814 // setPrefix64 fails if NAT64 prefix discovery has succeeded, and the discovered prefix
3815 // continues to be used.
3816 status = resolvService->setPrefix64(TEST_NETID, kNat64Prefix2);
3817 EXPECT_FALSE(status.isOk());
3818 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3819 EXPECT_EQ(EEXIST, status.getServiceSpecificError());
3820
3821 // Clearing the prefix also has no effect if discovery is started.
3822 status = resolvService->setPrefix64(TEST_NETID, "");
3823 EXPECT_FALSE(status.isOk());
3824 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3825 EXPECT_EQ(ENOENT, status.getServiceSpecificError());
3826
3827 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3828 ASSERT_FALSE(result == nullptr);
3829 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3830
3831 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
3832 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_NOT_FOUND));
Lorenzo Colitti61f796b2020-05-21 00:57:49 +09003833
3834 EXPECT_EQ(0, sDnsMetricsListener->getUnexpectedNat64PrefixUpdates());
Lorenzo Colittie51091d2020-05-20 02:48:44 +09003835}
3836
Luke Huang9807e6b2019-05-20 16:17:12 +08003837namespace {
3838
Luke Huang0d592bc2019-05-25 18:24:03 +08003839class ScopedSetNetworkForProcess {
3840 public:
3841 explicit ScopedSetNetworkForProcess(unsigned netId) {
3842 mStoredNetId = getNetworkForProcess();
3843 if (netId == mStoredNetId) return;
3844 EXPECT_EQ(0, setNetworkForProcess(netId));
3845 }
3846 ~ScopedSetNetworkForProcess() { EXPECT_EQ(0, setNetworkForProcess(mStoredNetId)); }
3847
3848 private:
3849 unsigned mStoredNetId;
3850};
3851
3852class ScopedSetNetworkForResolv {
3853 public:
3854 explicit ScopedSetNetworkForResolv(unsigned netId) { EXPECT_EQ(0, setNetworkForResolv(netId)); }
3855 ~ScopedSetNetworkForResolv() { EXPECT_EQ(0, setNetworkForResolv(NETID_UNSET)); }
3856};
3857
Luke Huang9807e6b2019-05-20 16:17:12 +08003858void sendCommand(int fd, const std::string& cmd) {
3859 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size() + 1));
3860 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size() + 1));
3861}
3862
3863int32_t readBE32(int fd) {
3864 int32_t tmp;
3865 int n = TEMP_FAILURE_RETRY(read(fd, &tmp, sizeof(tmp)));
3866 EXPECT_TRUE(n > 0);
3867 return ntohl(tmp);
3868}
3869
Luke Huang0d592bc2019-05-25 18:24:03 +08003870int readResponseCode(int fd) {
Luke Huang9807e6b2019-05-20 16:17:12 +08003871 char buf[4];
3872 int n = TEMP_FAILURE_RETRY(read(fd, &buf, sizeof(buf)));
3873 EXPECT_TRUE(n > 0);
3874 // The format of response code is that 4 bytes for the code & null.
3875 buf[3] = '\0';
3876 int result;
3877 EXPECT_TRUE(ParseInt(buf, &result));
3878 return result;
3879}
3880
Luke Huang0d592bc2019-05-25 18:24:03 +08003881bool checkAndClearUseLocalNameserversFlag(unsigned* netid) {
3882 if (netid == nullptr || ((*netid) & NETID_USE_LOCAL_NAMESERVERS) == 0) {
3883 return false;
3884 }
3885 *netid = (*netid) & ~NETID_USE_LOCAL_NAMESERVERS;
3886 return true;
3887}
3888
Luke Huangf8215372019-11-22 11:53:41 +08003889aidl::android::net::UidRangeParcel makeUidRangeParcel(int start, int stop) {
3890 aidl::android::net::UidRangeParcel res;
Luke Huang0d592bc2019-05-25 18:24:03 +08003891 res.start = start;
3892 res.stop = stop;
3893
3894 return res;
3895}
3896
3897void expectNetIdWithLocalNameserversFlag(unsigned netId) {
3898 unsigned dnsNetId = 0;
3899 EXPECT_EQ(0, getNetworkForDns(&dnsNetId));
3900 EXPECT_TRUE(checkAndClearUseLocalNameserversFlag(&dnsNetId));
3901 EXPECT_EQ(netId, static_cast<unsigned>(dnsNetId));
3902}
3903
3904void expectDnsNetIdEquals(unsigned netId) {
3905 unsigned dnsNetId = 0;
3906 EXPECT_EQ(0, getNetworkForDns(&dnsNetId));
3907 EXPECT_EQ(netId, static_cast<unsigned>(dnsNetId));
3908}
3909
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003910void expectDnsNetIdIsDefaultNetwork(INetd* netdService) {
Luke Huang0d592bc2019-05-25 18:24:03 +08003911 int currentNetid;
3912 EXPECT_TRUE(netdService->networkGetDefault(&currentNetid).isOk());
3913 expectDnsNetIdEquals(currentNetid);
3914}
3915
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003916void expectDnsNetIdWithVpn(INetd* netdService, unsigned vpnNetId, unsigned expectedNetId) {
Luke Huang0d592bc2019-05-25 18:24:03 +08003917 EXPECT_TRUE(netdService->networkCreateVpn(vpnNetId, false /* secure */).isOk());
3918 uid_t uid = getuid();
3919 // Add uid to VPN
3920 EXPECT_TRUE(netdService->networkAddUidRanges(vpnNetId, {makeUidRangeParcel(uid, uid)}).isOk());
3921 expectDnsNetIdEquals(expectedNetId);
3922 EXPECT_TRUE(netdService->networkDestroy(vpnNetId).isOk());
3923}
3924
Luke Huang9807e6b2019-05-20 16:17:12 +08003925} // namespace
3926
3927TEST_F(ResolverTest, getDnsNetId) {
3928 // We've called setNetworkForProcess in SetupOemNetwork, so reset to default first.
3929 setNetworkForProcess(NETID_UNSET);
Luke Huang0d592bc2019-05-25 18:24:03 +08003930
3931 expectDnsNetIdIsDefaultNetwork(mDnsClient.netdService());
3932 expectDnsNetIdWithVpn(mDnsClient.netdService(), TEST_VPN_NETID, TEST_VPN_NETID);
Luke Huang9807e6b2019-05-20 16:17:12 +08003933
3934 // Test with setNetworkForProcess
Luke Huang0d592bc2019-05-25 18:24:03 +08003935 {
3936 ScopedSetNetworkForProcess scopedSetNetworkForProcess(TEST_NETID);
3937 expectDnsNetIdEquals(TEST_NETID);
3938 }
3939
3940 // Test with setNetworkForProcess with NETID_USE_LOCAL_NAMESERVERS
3941 {
3942 ScopedSetNetworkForProcess scopedSetNetworkForProcess(TEST_NETID |
3943 NETID_USE_LOCAL_NAMESERVERS);
3944 expectNetIdWithLocalNameserversFlag(TEST_NETID);
3945 }
Luke Huang9807e6b2019-05-20 16:17:12 +08003946
3947 // Test with setNetworkForResolv
Luke Huang0d592bc2019-05-25 18:24:03 +08003948 {
3949 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID);
3950 expectDnsNetIdEquals(TEST_NETID);
3951 }
3952
3953 // Test with setNetworkForResolv with NETID_USE_LOCAL_NAMESERVERS
3954 {
3955 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID |
3956 NETID_USE_LOCAL_NAMESERVERS);
3957 expectNetIdWithLocalNameserversFlag(TEST_NETID);
3958 }
3959
3960 // Test with setNetworkForResolv under bypassable vpn
3961 {
3962 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID);
3963 expectDnsNetIdWithVpn(mDnsClient.netdService(), TEST_VPN_NETID, TEST_NETID);
3964 }
Luke Huang9807e6b2019-05-20 16:17:12 +08003965
3966 // Create socket connected to DnsProxyListener
3967 int fd = dns_open_proxy();
3968 EXPECT_TRUE(fd > 0);
3969 unique_fd ufd(fd);
3970
3971 // Test command with wrong netId
3972 sendCommand(fd, "getdnsnetid abc");
Luke Huang0d592bc2019-05-25 18:24:03 +08003973 EXPECT_EQ(ResponseCode::DnsProxyQueryResult, readResponseCode(fd));
Luke Huang9807e6b2019-05-20 16:17:12 +08003974 EXPECT_EQ(-EINVAL, readBE32(fd));
3975
3976 // Test unsupported command
3977 sendCommand(fd, "getdnsnetidNotSupported");
3978 // Keep in sync with FrameworkListener.cpp (500, "Command not recognized")
Luke Huang0d592bc2019-05-25 18:24:03 +08003979 EXPECT_EQ(500, readResponseCode(fd));
Luke Huang9807e6b2019-05-20 16:17:12 +08003980}
Sehee Park2c118782019-05-07 13:02:45 +09003981
3982TEST_F(ResolverTest, BlockDnsQueryWithUidRule) {
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003983 // This test relies on blocking traffic on loopback, which xt_qtaguid does not do.
3984 // See aosp/358413 and b/34444781 for why.
3985 SKIP_IF_BPF_NOT_SUPPORTED;
3986
Sehee Park2c118782019-05-07 13:02:45 +09003987 constexpr char listen_addr1[] = "127.0.0.4";
3988 constexpr char listen_addr2[] = "::1";
3989 constexpr char host_name[] = "howdy.example.com.";
3990 const std::vector<DnsRecord> records = {
3991 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3992 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
3993 };
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003994 INetd* netdService = mDnsClient.netdService();
Sehee Park2c118782019-05-07 13:02:45 +09003995
3996 test::DNSResponder dns1(listen_addr1);
3997 test::DNSResponder dns2(listen_addr2);
3998 StartDns(dns1, records);
3999 StartDns(dns2, records);
4000
4001 std::vector<std::string> servers = {listen_addr1, listen_addr2};
4002 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
4003 dns1.clearQueries();
4004 dns2.clearQueries();
4005
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004006 // Add drop rule for TEST_UID. Also enable the standby chain because it might not be enabled.
4007 // Unfortunately we cannot use FIREWALL_CHAIN_NONE, or custom iptables rules, for this purpose
4008 // because netd calls fchown() on the DNS query sockets, and "iptables -m owner" matches the
4009 // UID of the socket creator, not the UID set by fchown().
4010 //
4011 // TODO: migrate FIREWALL_CHAIN_NONE to eBPF as well.
4012 EXPECT_TRUE(netdService->firewallEnableChildChain(INetd::FIREWALL_CHAIN_STANDBY, true).isOk());
4013 EXPECT_TRUE(netdService
Sehee Park2c118782019-05-07 13:02:45 +09004014 ->firewallSetUidRule(INetd::FIREWALL_CHAIN_STANDBY, TEST_UID,
4015 INetd::FIREWALL_RULE_DENY)
4016 .isOk());
4017
4018 // Save uid
4019 int suid = getuid();
4020
4021 // Switch to TEST_UID
4022 EXPECT_TRUE(seteuid(TEST_UID) == 0);
4023
4024 // Dns Query
4025 int fd1 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_a, 0);
4026 int fd2 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_aaaa, 0);
4027 EXPECT_TRUE(fd1 != -1);
4028 EXPECT_TRUE(fd2 != -1);
4029
4030 uint8_t buf[MAXPACKET] = {};
4031 int rcode;
4032 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
4033 EXPECT_EQ(-ECONNREFUSED, res);
4034
4035 memset(buf, 0, MAXPACKET);
4036 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
4037 EXPECT_EQ(-ECONNREFUSED, res);
4038
4039 // Restore uid
4040 EXPECT_TRUE(seteuid(suid) == 0);
4041
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004042 // Remove drop rule for TEST_UID, and disable the standby chain.
4043 EXPECT_TRUE(netdService
Sehee Park2c118782019-05-07 13:02:45 +09004044 ->firewallSetUidRule(INetd::FIREWALL_CHAIN_STANDBY, TEST_UID,
4045 INetd::FIREWALL_RULE_ALLOW)
4046 .isOk());
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004047 EXPECT_TRUE(netdService->firewallEnableChildChain(INetd::FIREWALL_CHAIN_STANDBY, false).isOk());
Sehee Park2c118782019-05-07 13:02:45 +09004048}
Mike Yua772c202019-09-23 17:47:21 +08004049
Mike Yu40e67072019-10-09 21:14:09 +08004050namespace {
4051
4052const std::string kDotConnectTimeoutMsFlag(
4053 "persist.device_config.netd_native.dot_connect_timeout_ms");
4054
4055class ScopedSystemProperties {
4056 public:
4057 explicit ScopedSystemProperties(const std::string& key, const std::string& value)
4058 : mStoredKey(key) {
4059 mStoredValue = android::base::GetProperty(key, "");
4060 android::base::SetProperty(key, value);
4061 }
4062 ~ScopedSystemProperties() { android::base::SetProperty(mStoredKey, mStoredValue); }
4063
4064 private:
4065 std::string mStoredKey;
4066 std::string mStoredValue;
4067};
4068
4069} // namespace
4070
Mike Yua772c202019-09-23 17:47:21 +08004071TEST_F(ResolverTest, ConnectTlsServerTimeout) {
Mike Yu40e67072019-10-09 21:14:09 +08004072 constexpr int expectedTimeout = 1000;
4073 constexpr char hostname1[] = "query1.example.com.";
4074 constexpr char hostname2[] = "query2.example.com.";
Mike Yua772c202019-09-23 17:47:21 +08004075 const std::vector<DnsRecord> records = {
Mike Yu40e67072019-10-09 21:14:09 +08004076 {hostname1, ns_type::ns_t_a, "1.2.3.4"},
4077 {hostname2, ns_type::ns_t_a, "1.2.3.5"},
Mike Yua772c202019-09-23 17:47:21 +08004078 };
4079
4080 test::DNSResponder dns;
4081 StartDns(dns, records);
Mike Yu40e67072019-10-09 21:14:09 +08004082 test::DnsTlsFrontend tls;
Mike Yua772c202019-09-23 17:47:21 +08004083 ASSERT_TRUE(tls.startServer());
4084
Mike Yu40e67072019-10-09 21:14:09 +08004085 // The resolver will adjust the timeout value to 1000ms since the value is too small.
4086 ScopedSystemProperties scopedSystemProperties(kDotConnectTimeoutMsFlag, "100");
Mike Yua772c202019-09-23 17:47:21 +08004087
Mike Yu40e67072019-10-09 21:14:09 +08004088 // Set up resolver to opportunistic mode with the default configuration.
Mike Yu8ac63402019-12-02 15:28:38 +08004089 const ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
Mike Yu40e67072019-10-09 21:14:09 +08004090 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
Mike Yua772c202019-09-23 17:47:21 +08004091 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09004092 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yua772c202019-09-23 17:47:21 +08004093 tls.clearQueries();
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09004094 dns.clearQueries();
Mike Yua772c202019-09-23 17:47:21 +08004095
4096 // The server becomes unresponsive to the handshake request.
4097 tls.setHangOnHandshakeForTesting(true);
4098
4099 // Expect the things happening in getaddrinfo():
4100 // 1. Connect to the private DNS server.
4101 // 2. SSL handshake times out.
4102 // 3. Fallback to UDP transport, and then get the answer.
Mike Yu40e67072019-10-09 21:14:09 +08004103 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4104 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(hostname1, nullptr, hints);
Mike Yua772c202019-09-23 17:47:21 +08004105
Mike Yu40e67072019-10-09 21:14:09 +08004106 EXPECT_NE(nullptr, result);
Mike Yua772c202019-09-23 17:47:21 +08004107 EXPECT_EQ(0, tls.queries());
Mike Yu40e67072019-10-09 21:14:09 +08004108 EXPECT_EQ(1U, GetNumQueries(dns, hostname1));
4109 EXPECT_EQ(records.at(0).addr, ToString(result));
Mike Yua772c202019-09-23 17:47:21 +08004110
Mike Yu40e67072019-10-09 21:14:09 +08004111 // A loose upper bound is set by adding 2000ms buffer time. Theoretically, getaddrinfo()
4112 // should just take a bit more than expetTimeout milliseconds.
4113 EXPECT_GE(timeTakenMs, expectedTimeout);
4114 EXPECT_LE(timeTakenMs, expectedTimeout + 2000);
4115
4116 // Set the server to be responsive. Verify that the resolver will attempt to reconnect
4117 // to the server and then get the result within the timeout.
4118 tls.setHangOnHandshakeForTesting(false);
4119 std::tie(result, timeTakenMs) = safe_getaddrinfo_time_taken(hostname2, nullptr, hints);
4120
4121 EXPECT_NE(nullptr, result);
Luke Huang0a0870d2020-02-12 20:41:10 +08004122 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yu40e67072019-10-09 21:14:09 +08004123 EXPECT_EQ(1U, GetNumQueries(dns, hostname2));
4124 EXPECT_EQ(records.at(1).addr, ToString(result));
4125
4126 EXPECT_LE(timeTakenMs, expectedTimeout);
Mike Yua772c202019-09-23 17:47:21 +08004127}
Hungming Chenbb90ab32019-10-28 18:20:31 +08004128
Ken Chen766feae2019-10-30 15:13:44 +08004129TEST_F(ResolverTest, FlushNetworkCache) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004130 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004131 test::DNSResponder dns;
4132 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4133 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4134
4135 const hostent* result = gethostbyname("hello");
4136 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4137
4138 // get result from cache
4139 result = gethostbyname("hello");
4140 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4141
4142 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4143
4144 result = gethostbyname("hello");
4145 EXPECT_EQ(2U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4146}
4147
4148TEST_F(ResolverTest, FlushNetworkCache_random) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004149 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004150 constexpr int num_flush = 10;
4151 constexpr int num_queries = 20;
4152 test::DNSResponder dns;
4153 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4154 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4155 const addrinfo hints = {.ai_family = AF_INET};
4156
4157 std::thread t([this]() {
4158 for (int i = 0; i < num_flush; ++i) {
4159 unsigned delay = arc4random_uniform(10 * 1000); // 10ms
4160 usleep(delay);
4161 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4162 }
4163 });
4164
4165 for (int i = 0; i < num_queries; ++i) {
4166 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4167 EXPECT_TRUE(result != nullptr);
4168 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4169 }
4170 t.join();
4171}
4172
4173// flush cache while one query is wait-for-response, another is pending.
4174TEST_F(ResolverTest, FlushNetworkCache_concurrent) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004175 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004176 const char* listen_addr1 = "127.0.0.9";
4177 const char* listen_addr2 = "127.0.0.10";
4178 test::DNSResponder dns1(listen_addr1);
4179 test::DNSResponder dns2(listen_addr2);
4180 StartDns(dns1, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4181 StartDns(dns2, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4182 addrinfo hints = {.ai_family = AF_INET};
4183
4184 // step 1: set server#1 into deferred responding mode
4185 dns1.setDeferredResp(true);
4186 std::thread t1([&listen_addr1, &hints, this]() {
4187 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr1}));
4188 // step 3: query
4189 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4190 // step 9: check result
4191 EXPECT_TRUE(result != nullptr);
4192 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4193 });
4194
4195 // step 2: wait for the query to reach the server
4196 while (GetNumQueries(dns1, kHelloExampleCom) == 0) {
4197 usleep(1000); // 1ms
4198 }
4199
4200 std::thread t2([&listen_addr2, &hints, &dns2, this]() {
4201 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr2}));
4202 // step 5: query (should be blocked in resolver)
4203 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4204 // step 7: check result
4205 EXPECT_TRUE(result != nullptr);
4206 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4207 EXPECT_EQ(1U, GetNumQueriesForType(dns2, ns_type::ns_t_a, kHelloExampleCom));
4208 });
4209
4210 // step 4: wait a bit for the 2nd query to enter pending state
4211 usleep(100 * 1000); // 100ms
4212 // step 6: flush cache (will unblock pending queries)
4213 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4214 t2.join();
4215
4216 // step 8: resume server#1
4217 dns1.setDeferredResp(false);
4218 t1.join();
4219
4220 // step 10: verify if result is correctly cached
4221 dns2.clearQueries();
4222 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4223 EXPECT_EQ(0U, GetNumQueries(dns2, kHelloExampleCom));
4224 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4225}
4226
waynema29253052019-08-20 11:26:08 +08004227// TODO: Perhaps to have a boundary conditions test for TCP and UDP.
4228TEST_F(ResolverTest, TcpQueryWithOversizePayload) {
4229 test::DNSResponder dns;
4230 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4231 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4232
4233 int fd = dns_open_proxy();
4234 ASSERT_TRUE(fd > 0);
4235
4236 // Sending DNS query over TCP once the packet sizes exceed 512 bytes.
4237 // The raw data is combined with Question section and Additional section
4238 // Question section : query "hello.example.com", type A, class IN
4239 // Additional section : type OPT (41), Option PADDING, Option Length 546
4240 // Padding option which allows DNS clients and servers to artificially
4241 // increase the size of a DNS message by a variable number of bytes.
4242 // See also RFC7830, section 3
4243 const std::string query =
4244 "+c0BAAABAAAAAAABBWhlbGxvB2V4YW1wbGUDY29tAAABAAEAACkgAAAAgAACJgAMAiIAAAAAAAAAAAAAAAAAA"
4245 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4246 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4247 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4248 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4249 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4250 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4251 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4252 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4253 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
4254 const std::string cmd =
4255 "resnsend " + std::to_string(TEST_NETID) + " 0 " /* ResNsendFlags */ + query + '\0';
4256 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
4257 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
4258 expectAnswersValid(fd, AF_INET, kHelloExampleComAddrV4);
4259 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom));
4260 EXPECT_EQ(0U, GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom));
4261}
4262
Ken Chen99344882020-01-01 14:59:38 +08004263TEST_F(ResolverTest, TruncatedRspMode) {
4264 constexpr char listen_addr[] = "127.0.0.4";
4265 constexpr char listen_addr2[] = "127.0.0.5";
4266 constexpr char listen_srv[] = "53";
4267
4268 test::DNSResponder dns(listen_addr, listen_srv, static_cast<ns_rcode>(-1));
4269 test::DNSResponder dns2(listen_addr2, listen_srv, static_cast<ns_rcode>(-1));
4270 // dns supports UDP only, dns2 support UDP and TCP
4271 dns.setResponseProbability(0.0, IPPROTO_TCP);
4272 StartDns(dns, kLargeCnameChainRecords);
4273 StartDns(dns2, kLargeCnameChainRecords);
4274
4275 const struct TestConfig {
4276 const std::optional<int32_t> tcMode;
4277 const bool ret;
4278 const unsigned numQueries;
4279 std::string asParameters() const {
4280 return StringPrintf("tcMode: %d, ret: %s, numQueries: %u", tcMode.value_or(-1),
4281 ret ? "true" : "false", numQueries);
4282 }
4283 } testConfigs[]{
4284 // clang-format off
4285 {std::nullopt, true, 0}, /* mode unset */
4286 {aidl::android::net::IDnsResolver::TC_MODE_DEFAULT, true, 0}, /* default mode */
4287 {aidl::android::net::IDnsResolver::TC_MODE_UDP_TCP, true, 1}, /* alternative mode */
4288 {-666, false, 1}, /* invalid input */
4289 // clang-format on
4290 };
4291
4292 for (const auto& config : testConfigs) {
4293 SCOPED_TRACE(config.asParameters());
4294
4295 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4296 parcel.servers = {listen_addr, listen_addr2};
4297 if (config.tcMode) {
Ken Chena6ac2a62020-04-07 17:25:56 +08004298 parcel.resolverOptions.tcMode = config.tcMode.value();
Ken Chen99344882020-01-01 14:59:38 +08004299 }
4300 ASSERT_EQ(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk(), config.ret);
4301
4302 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4303 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4304 ASSERT_TRUE(result != nullptr);
4305 EXPECT_EQ(ToString(result), kHelloExampleComAddrV4);
4306 // TC_MODE_DEFAULT: resolver retries on TCP-only on each name server.
4307 // TC_MODE_UDP_TCP: resolver retries on TCP on the same server, falls back to UDP from next.
4308 ASSERT_EQ(GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom), 1U);
4309 ASSERT_EQ(GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom), 1U);
4310 ASSERT_EQ(GetNumQueriesForProtocol(dns2, IPPROTO_UDP, kHelloExampleCom), config.numQueries);
4311 ASSERT_EQ(GetNumQueriesForProtocol(dns2, IPPROTO_TCP, kHelloExampleCom), 1U);
4312
4313 dns.clearQueries();
4314 dns2.clearQueries();
4315 ASSERT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4316 }
4317}
4318
Mike Yu153b5b82020-03-04 19:53:54 +08004319TEST_F(ResolverTest, RepeatedSetup_ResolverStatusRemains) {
4320 constexpr char unusable_listen_addr[] = "127.0.0.3";
4321 constexpr char listen_addr[] = "127.0.0.4";
4322 constexpr char hostname[] = "a.hello.query.";
4323 const auto repeatedSetResolversFromParcel = [&](const ResolverParamsParcel& parcel) {
4324 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4325 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4326 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4327 };
4328
4329 test::DNSResponder dns(listen_addr);
4330 StartDns(dns, {{hostname, ns_type::ns_t_a, "1.2.3.3"}});
4331 test::DnsTlsFrontend tls1(listen_addr, "853", listen_addr, "53");
4332 ASSERT_TRUE(tls1.startServer());
4333
4334 // Private DNS off mode.
4335 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4336 parcel.servers = {unusable_listen_addr, listen_addr};
4337 parcel.tlsServers.clear();
4338 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4339
4340 // Send a query.
4341 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4342 EXPECT_NE(safe_getaddrinfo(hostname, nullptr, &hints), nullptr);
4343
4344 // Check the stats as expected.
4345 const std::vector<NameserverStats> expectedCleartextDnsStats = {
4346 NameserverStats(unusable_listen_addr).setInternalErrors(1),
4347 NameserverStats(listen_addr).setSuccesses(1),
4348 };
4349 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
4350 EXPECT_EQ(GetNumQueries(dns, hostname), 1U);
4351
4352 // The stats is supposed to remain as long as the list of cleartext DNS servers is unchanged.
4353 static const struct TestConfig {
4354 std::vector<std::string> servers;
4355 std::vector<std::string> tlsServers;
4356 std::string tlsName;
4357 } testConfigs[] = {
4358 // Private DNS opportunistic mode.
4359 {{listen_addr, unusable_listen_addr}, {listen_addr, unusable_listen_addr}, ""},
4360 {{unusable_listen_addr, listen_addr}, {unusable_listen_addr, listen_addr}, ""},
4361
4362 // Private DNS strict mode.
4363 {{listen_addr, unusable_listen_addr}, {"127.0.0.100"}, kDefaultPrivateDnsHostName},
4364 {{unusable_listen_addr, listen_addr}, {"127.0.0.100"}, kDefaultPrivateDnsHostName},
4365
4366 // Private DNS off mode.
4367 {{unusable_listen_addr, listen_addr}, {}, ""},
4368 {{listen_addr, unusable_listen_addr}, {}, ""},
4369 };
4370
4371 for (const auto& config : testConfigs) {
4372 SCOPED_TRACE(fmt::format("testConfig: [{}] [{}] [{}]", fmt::join(config.servers, ","),
4373 fmt::join(config.tlsServers, ","), config.tlsName));
4374 parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4375 parcel.servers = config.servers;
4376 parcel.tlsServers = config.tlsServers;
4377 parcel.tlsName = config.tlsName;
4378 repeatedSetResolversFromParcel(parcel);
4379 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
4380
4381 // The stats remains when the list of search domains changes.
4382 parcel.domains.push_back("tmp.domains");
4383 repeatedSetResolversFromParcel(parcel);
4384 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
4385
4386 // The stats remains when the parameters change (except maxSamples).
4387 parcel.sampleValiditySeconds++;
4388 parcel.successThreshold++;
4389 parcel.minSamples++;
4390 parcel.baseTimeoutMsec++;
4391 parcel.retryCount++;
4392 repeatedSetResolversFromParcel(parcel);
4393 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
4394 }
4395
4396 // The cache remains.
4397 EXPECT_NE(safe_getaddrinfo(hostname, nullptr, &hints), nullptr);
4398 EXPECT_EQ(GetNumQueries(dns, hostname), 1U);
4399}
4400
4401TEST_F(ResolverTest, RepeatedSetup_NoRedundantPrivateDnsValidation) {
4402 const std::string addr1 = getUniqueIPv4Address(); // For a workable DNS server.
4403 const std::string addr2 = getUniqueIPv4Address(); // For an unresponsive DNS server.
4404 const std::string unusable_addr = getUniqueIPv4Address();
Mike Yubc4b9502020-03-20 13:14:00 +08004405 const auto waitForPrivateDnsStateUpdated = []() {
4406 // A buffer time for the PrivateDnsConfiguration instance to update its map,
4407 // mPrivateDnsValidateThreads, which is used for tracking validation threads.
4408 // Since there is a time gap between when PrivateDnsConfiguration reports
4409 // onPrivateDnsValidationEvent and when PrivateDnsConfiguration updates the map, this is a
4410 // workaround to avoid the test starts a subsequent resolver setup during the time gap.
4411 // TODO: Report onPrivateDnsValidationEvent after all the relevant updates are complete.
4412 // Reference to b/152009023.
4413 std::this_thread::sleep_for(20ms);
4414 };
Mike Yu153b5b82020-03-04 19:53:54 +08004415
4416 test::DNSResponder dns1(addr1);
4417 test::DNSResponder dns2(addr2);
4418 StartDns(dns1, {});
4419 StartDns(dns2, {});
4420 test::DnsTlsFrontend workableTls(addr1, "853", addr1, "53");
4421 test::DnsTlsFrontend unresponsiveTls(addr2, "853", addr2, "53");
4422 unresponsiveTls.setHangOnHandshakeForTesting(true);
4423 ASSERT_TRUE(workableTls.startServer());
4424 ASSERT_TRUE(unresponsiveTls.startServer());
4425
4426 // First setup.
4427 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4428 parcel.servers = {addr1, addr2, unusable_addr};
4429 parcel.tlsServers = {addr1, addr2, unusable_addr};
4430 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4431
4432 // Check the validation results.
4433 EXPECT_TRUE(WaitForPrivateDnsValidation(workableTls.listen_address(), true));
4434 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4435 EXPECT_EQ(unresponsiveTls.acceptConnectionsCount(), 1); // The validation is still in progress.
4436
4437 static const struct TestConfig {
4438 std::vector<std::string> tlsServers;
4439 std::string tlsName;
4440 } testConfigs[] = {
4441 {{addr1, addr2, unusable_addr}, ""},
4442 {{unusable_addr, addr1, addr2}, ""},
4443 {{unusable_addr, addr1, addr2}, kDefaultPrivateDnsHostName},
4444 {{addr1, addr2, unusable_addr}, kDefaultPrivateDnsHostName},
4445 };
4446
4447 std::string TlsNameLastTime;
4448 for (const auto& config : testConfigs) {
4449 SCOPED_TRACE(fmt::format("testConfig: [{}] [{}]", fmt::join(config.tlsServers, ","),
4450 config.tlsName));
4451 parcel.servers = config.tlsServers;
4452 parcel.tlsServers = config.tlsServers;
4453 parcel.tlsName = config.tlsName;
4454 parcel.caCertificate = config.tlsName.empty() ? "" : kCaCert;
4455
4456 const bool dnsModeChanged = (TlsNameLastTime != config.tlsName);
Mike Yubc4b9502020-03-20 13:14:00 +08004457
4458 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004459 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4460
4461 for (const auto& serverAddr : parcel.tlsServers) {
4462 SCOPED_TRACE(serverAddr);
4463 if (serverAddr == workableTls.listen_address()) {
4464 if (dnsModeChanged) {
4465 // In despite of the identical IP address, the server is regarded as a different
4466 // server when DnsTlsServer.name is different. The resolver treats it as a
4467 // different object and begins the validation process.
4468 EXPECT_TRUE(WaitForPrivateDnsValidation(serverAddr, true));
4469 }
4470 } else if (serverAddr == unresponsiveTls.listen_address()) {
4471 // No revalidation needed for the server which have been marked as in_progesss.
4472 } else {
4473 // Must be unusable_addr.
4474 // In opportunistic mode, when a validation for a private DNS server fails, the
4475 // resolver just marks the server as failed and doesn't re-evaluate it, but the
4476 // server can be re-evaluated when setResolverConfiguration() is called.
4477 // However, in strict mode, the resolver automatically re-evaluates the server and
4478 // marks the server as in_progress until the validation succeeds, so repeated setup
4479 // makes no effect.
4480 if (dnsModeChanged || config.tlsName.empty() /* not in strict mode */) {
4481 EXPECT_TRUE(WaitForPrivateDnsValidation(serverAddr, false));
4482 }
4483 }
4484 }
4485
4486 // Repeated setups make no effect in strict mode.
Mike Yubc4b9502020-03-20 13:14:00 +08004487 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004488 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4489 if (config.tlsName.empty()) {
4490 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4491 }
Mike Yubc4b9502020-03-20 13:14:00 +08004492 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004493 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4494 if (config.tlsName.empty()) {
4495 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4496 }
4497
4498 EXPECT_EQ(unresponsiveTls.acceptConnectionsCount(), 1);
4499
4500 TlsNameLastTime = config.tlsName;
4501 }
4502
4503 // Check that all the validation results are caught.
4504 // Note: it doesn't mean no validation being in progress.
4505 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr1));
4506 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr2));
4507 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(unusable_addr));
4508}
4509
4510TEST_F(ResolverTest, RepeatedSetup_KeepChangingPrivateDnsServers) {
4511 enum TlsServerState { WORKING, UNSUPPORTED, UNRESPONSIVE };
4512 const std::string addr1 = getUniqueIPv4Address();
4513 const std::string addr2 = getUniqueIPv4Address();
Mike Yu9a185882020-03-25 16:02:36 +08004514 const auto waitForPrivateDnsStateUpdated = []() {
4515 // A buffer time for PrivateDnsConfiguration to update its state. It prevents this test
4516 // being flaky. See b/152009023 for the reason.
4517 std::this_thread::sleep_for(20ms);
4518 };
Mike Yu153b5b82020-03-04 19:53:54 +08004519
4520 test::DNSResponder dns1(addr1);
4521 test::DNSResponder dns2(addr2);
4522 StartDns(dns1, {});
4523 StartDns(dns2, {});
4524 test::DnsTlsFrontend tls1(addr1, "853", addr1, "53");
4525 test::DnsTlsFrontend tls2(addr2, "853", addr2, "53");
4526 ASSERT_TRUE(tls1.startServer());
4527 ASSERT_TRUE(tls2.startServer());
4528
4529 static const struct TestConfig {
4530 std::string tlsServer;
4531 std::string tlsName;
4532 bool expectNothingHappenWhenServerUnsupported;
4533 bool expectNothingHappenWhenServerUnresponsive;
4534 std::string asTestName() const {
4535 return fmt::format("{}, {}, {}, {}", tlsServer, tlsName,
4536 expectNothingHappenWhenServerUnsupported,
4537 expectNothingHappenWhenServerUnresponsive);
4538 }
4539 } testConfigs[] = {
4540 {{addr1}, "", false, false},
4541 {{addr2}, "", false, false},
4542 {{addr1}, "", false, true},
4543 {{addr2}, "", false, true},
4544 {{addr1}, kDefaultPrivateDnsHostName, false, true},
4545 {{addr2}, kDefaultPrivateDnsHostName, false, true},
4546 {{addr1}, kDefaultPrivateDnsHostName, true, true},
4547 {{addr2}, kDefaultPrivateDnsHostName, true, true},
4548
4549 // There's no new validation to start because there are already two validation threads
4550 // running (one is for addr1, the other is for addr2). This is because the comparator
4551 // doesn't compare DnsTlsServer.name. Keep the design as-is until it's known to be
4552 // harmful.
4553 {{addr1}, "", true, true},
4554 {{addr2}, "", true, true},
4555 {{addr1}, "", true, true},
4556 {{addr2}, "", true, true},
4557 };
4558
4559 for (const auto& serverState : {WORKING, UNSUPPORTED, UNRESPONSIVE}) {
4560 int testIndex = 0;
4561 for (const auto& config : testConfigs) {
4562 SCOPED_TRACE(fmt::format("serverState:{} testIndex:{} testConfig:[{}]", serverState,
4563 testIndex++, config.asTestName()));
4564 auto& tls = (config.tlsServer == addr1) ? tls1 : tls2;
4565
4566 if (serverState == UNSUPPORTED && tls.running()) ASSERT_TRUE(tls.stopServer());
4567 if (serverState != UNSUPPORTED && !tls.running()) ASSERT_TRUE(tls.startServer());
4568
4569 tls.setHangOnHandshakeForTesting(serverState == UNRESPONSIVE);
4570 const int connectCountsBefore = tls.acceptConnectionsCount();
4571
Mike Yu9a185882020-03-25 16:02:36 +08004572 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004573 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4574 parcel.servers = {config.tlsServer};
4575 parcel.tlsServers = {config.tlsServer};
4576 parcel.tlsName = config.tlsName;
4577 parcel.caCertificate = config.tlsName.empty() ? "" : kCaCert;
4578 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4579
4580 if (serverState == WORKING) {
4581 EXPECT_TRUE(WaitForPrivateDnsValidation(config.tlsServer, true));
4582 } else if (serverState == UNSUPPORTED) {
4583 if (config.expectNothingHappenWhenServerUnsupported) {
4584 // It's possible that the resolver hasn't yet started to
4585 // connect. Wait a while.
4586 // TODO: See if we can get rid of the hard waiting time, such as comparing
4587 // the CountDiff across two tests.
4588 std::this_thread::sleep_for(100ms);
4589 EXPECT_EQ(tls.acceptConnectionsCount(), connectCountsBefore);
4590 } else {
4591 EXPECT_TRUE(WaitForPrivateDnsValidation(config.tlsServer, false));
4592 }
4593 } else {
4594 // Must be UNRESPONSIVE.
4595 // DnsTlsFrontend is the only signal for checking whether or not the resolver starts
4596 // another validation when the server is unresponsive.
4597 const int expectCountDiff =
4598 config.expectNothingHappenWhenServerUnresponsive ? 0 : 1;
4599 if (expectCountDiff == 0) {
4600 // It's possible that the resolver hasn't yet started to
4601 // connect. Wait a while.
4602 std::this_thread::sleep_for(100ms);
4603 }
4604 const auto condition = [&]() {
4605 return tls.acceptConnectionsCount() == connectCountsBefore + expectCountDiff;
4606 };
4607 EXPECT_TRUE(PollForCondition(condition));
4608 }
4609 }
4610
4611 // Set to off mode to reset the PrivateDnsConfiguration state.
4612 ResolverParamsParcel setupOffmode = DnsResponderClient::GetDefaultResolverParamsParcel();
4613 setupOffmode.tlsServers.clear();
4614 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(setupOffmode));
4615 }
4616
4617 // Check that all the validation results are caught.
4618 // Note: it doesn't mean no validation being in progress.
4619 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr1));
4620 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr2));
4621}
4622
Hungming Chenbb90ab32019-10-28 18:20:31 +08004623// Parameterized tests.
4624// TODO: Merge the existing tests as parameterized test if possible.
4625// TODO: Perhaps move parameterized tests to an independent file.
4626enum class CallType { GETADDRINFO, GETHOSTBYNAME };
4627class ResolverParameterizedTest : public ResolverTest,
Hungming Chen63779052019-10-30 15:06:13 +08004628 public testing::WithParamInterface<CallType> {
4629 protected:
Hungming Chen22617fd2019-12-06 12:15:45 +08004630 void VerifyQueryHelloExampleComV4(const test::DNSResponder& dns, const CallType calltype,
4631 const bool verifyNumQueries = true) {
Hungming Chen63779052019-10-30 15:06:13 +08004632 if (calltype == CallType::GETADDRINFO) {
4633 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4634 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4635 ASSERT_TRUE(result != nullptr);
4636 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4637 } else if (calltype == CallType::GETHOSTBYNAME) {
4638 const hostent* result = gethostbyname("hello");
4639 ASSERT_TRUE(result != nullptr);
4640 ASSERT_EQ(4, result->h_length);
4641 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
4642 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4643 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
4644 } else {
4645 FAIL() << "Unsupported call type: " << static_cast<uint32_t>(calltype);
4646 }
Hungming Chen22617fd2019-12-06 12:15:45 +08004647 if (verifyNumQueries) EXPECT_EQ(1U, GetNumQueries(dns, kHelloExampleCom));
Hungming Chen63779052019-10-30 15:06:13 +08004648 }
4649};
Hungming Chenbb90ab32019-10-28 18:20:31 +08004650
Hungming Chen63779052019-10-30 15:06:13 +08004651INSTANTIATE_TEST_SUITE_P(QueryCallTest, ResolverParameterizedTest,
Hungming Chenbb90ab32019-10-28 18:20:31 +08004652 testing::Values(CallType::GETADDRINFO, CallType::GETHOSTBYNAME),
4653 [](const testing::TestParamInfo<CallType>& info) {
Hungming Chenbb90ab32019-10-28 18:20:31 +08004654 switch (info.param) {
4655 case CallType::GETADDRINFO:
Hungming Chen63779052019-10-30 15:06:13 +08004656 return "GetAddrInfo";
Hungming Chenbb90ab32019-10-28 18:20:31 +08004657 case CallType::GETHOSTBYNAME:
Hungming Chen63779052019-10-30 15:06:13 +08004658 return "GetHostByName";
Hungming Chenbb90ab32019-10-28 18:20:31 +08004659 default:
Hungming Chen63779052019-10-30 15:06:13 +08004660 return "InvalidParameter"; // Should not happen.
Hungming Chenbb90ab32019-10-28 18:20:31 +08004661 }
Hungming Chenbb90ab32019-10-28 18:20:31 +08004662 });
4663
4664TEST_P(ResolverParameterizedTest, AuthoritySectionAndAdditionalSection) {
4665 // DNS response may have more information in authority section and additional section.
4666 // Currently, getanswer() of packages/modules/DnsResolver/getaddrinfo.cpp doesn't parse the
4667 // content of authority section and additional section. Test these sections if they crash
4668 // the resolver, just in case. See also RFC 1035 section 4.1.
4669 const auto& calltype = GetParam();
4670 test::DNSHeader header(kDefaultDnsHeader);
4671
4672 // Create a DNS response which has a authoritative nameserver record in authority
4673 // section and its relevant address record in additional section.
4674 //
4675 // Question
4676 // hello.example.com. IN A
4677 // Answer
4678 // hello.example.com. IN A 1.2.3.4
4679 // Authority:
4680 // hello.example.com. IN NS ns1.example.com.
4681 // Additional:
4682 // ns1.example.com. IN A 5.6.7.8
4683 //
4684 // A response may have only question, answer, and authority section. Current testing response
4685 // should be able to cover this condition.
4686
4687 // Question section.
4688 test::DNSQuestion question{
4689 .qname = {.name = kHelloExampleCom},
4690 .qtype = ns_type::ns_t_a,
4691 .qclass = ns_c_in,
4692 };
4693 header.questions.push_back(std::move(question));
4694
4695 // Answer section.
4696 test::DNSRecord recordAnswer{
4697 .name = {.name = kHelloExampleCom},
4698 .rtype = ns_type::ns_t_a,
4699 .rclass = ns_c_in,
4700 .ttl = 0, // no cache
4701 };
Hungming Chen63779052019-10-30 15:06:13 +08004702 EXPECT_TRUE(test::DNSResponder::fillRdata(kHelloExampleComAddrV4, recordAnswer));
Hungming Chenbb90ab32019-10-28 18:20:31 +08004703 header.answers.push_back(std::move(recordAnswer));
4704
4705 // Authority section.
4706 test::DNSRecord recordAuthority{
4707 .name = {.name = kHelloExampleCom},
4708 .rtype = ns_type::ns_t_ns,
4709 .rclass = ns_c_in,
4710 .ttl = 0, // no cache
4711 };
4712 EXPECT_TRUE(test::DNSResponder::fillRdata("ns1.example.com.", recordAuthority));
4713 header.authorities.push_back(std::move(recordAuthority));
4714
4715 // Additional section.
4716 test::DNSRecord recordAdditional{
4717 .name = {.name = "ns1.example.com."},
4718 .rtype = ns_type::ns_t_a,
4719 .rclass = ns_c_in,
4720 .ttl = 0, // no cache
4721 };
4722 EXPECT_TRUE(test::DNSResponder::fillRdata("5.6.7.8", recordAdditional));
4723 header.additionals.push_back(std::move(recordAdditional));
4724
4725 // Start DNS server.
4726 test::DNSResponder dns(test::DNSResponder::MappingType::DNS_HEADER);
4727 dns.addMappingDnsHeader(kHelloExampleCom, ns_type::ns_t_a, header);
4728 ASSERT_TRUE(dns.startServer());
4729 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4730 dns.clearQueries();
4731
4732 // Expect that get the address and the resolver doesn't crash.
Hungming Chen63779052019-10-30 15:06:13 +08004733 VerifyQueryHelloExampleComV4(dns, calltype);
4734}
4735
4736TEST_P(ResolverParameterizedTest, MessageCompression) {
4737 const auto& calltype = GetParam();
4738
4739 // The response with compressed domain name by a pointer. See RFC 1035 section 4.1.4.
4740 //
4741 // Ignoring the other fields of the message, the domain name of question section and answer
4742 // section are presented as:
4743 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4744 // 12 | 5 | h |
4745 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4746 // 14 | e | l |
4747 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4748 // 16 | l | o |
4749 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4750 // 18 | 7 | e |
4751 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4752 // 20 | x | a |
4753 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4754 // 22 | m | p |
4755 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4756 // 24 | l | e |
4757 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4758 // 26 | 3 | c |
4759 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4760 // 28 | o | m |
4761 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4762 // 30 | 0 | ... |
4763 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4764 //
4765 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4766 // 35 | 1 1| 12 |
4767 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4768 const std::vector<uint8_t> kResponseAPointer = {
4769 /* Header */
4770 0x00, 0x00, /* Transaction ID: 0x0000 */
4771 0x81, 0x80, /* Flags: qr rd ra */
4772 0x00, 0x01, /* Questions: 1 */
4773 0x00, 0x01, /* Answer RRs: 1 */
4774 0x00, 0x00, /* Authority RRs: 0 */
4775 0x00, 0x00, /* Additional RRs: 0 */
4776 /* Queries */
4777 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
4778 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name: hello.example.com */
4779 0x00, 0x01, /* Type: A */
4780 0x00, 0x01, /* Class: IN */
4781 /* Answers */
4782 0xc0, 0x0c, /* Name: hello.example.com (a pointer) */
4783 0x00, 0x01, /* Type: A */
4784 0x00, 0x01, /* Class: IN */
4785 0x00, 0x00, 0x00, 0x00, /* Time to live: 0 */
4786 0x00, 0x04, /* Data length: 4 */
4787 0x01, 0x02, 0x03, 0x04 /* Address: 1.2.3.4 */
4788 };
4789
4790 // The response with compressed domain name by a sequence of labels ending with a pointer. See
4791 // RFC 1035 section 4.1.4.
4792 //
4793 // Ignoring the other fields of the message, the domain name of question section and answer
4794 // section are presented as:
4795 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4796 // 12 | 5 | h |
4797 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4798 // 14 | e | l |
4799 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4800 // 16 | l | o |
4801 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4802 // 18 | 7 | e |
4803 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4804 // 20 | x | a |
4805 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4806 // 22 | m | p |
4807 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4808 // 24 | l | e |
4809 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4810 // 26 | 3 | c |
4811 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4812 // 28 | o | m |
4813 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4814 // 30 | 0 | ... |
4815 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4816 //
4817 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4818 // 35 | 5 | h |
4819 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4820 // 37 | e | l |
4821 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4822 // 39 | l | o |
4823 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4824 // 41 | 1 1| 18 |
4825 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4826 const std::vector<uint8_t> kResponseLabelEndingWithAPointer = {
4827 /* Header */
4828 0x00, 0x00, /* Transaction ID: 0x0000 */
4829 0x81, 0x80, /* Flags: qr rd ra */
4830 0x00, 0x01, /* Questions: 1 */
4831 0x00, 0x01, /* Answer RRs: 1 */
4832 0x00, 0x00, /* Authority RRs: 0 */
4833 0x00, 0x00, /* Additional RRs: 0 */
4834 /* Queries */
4835 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
4836 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name: hello.example.com */
4837 0x00, 0x01, /* Type: A */
4838 0x00, 0x01, /* Class: IN */
4839 /* Answers */
4840 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0xc0,
4841 0x12, /* Name: hello.example.com (a label ending with a pointer) */
4842 0x00, 0x01, /* Type: A */
4843 0x00, 0x01, /* Class: IN */
4844 0x00, 0x00, 0x00, 0x00, /* Time to live: 0 */
4845 0x00, 0x04, /* Data length: 4 */
4846 0x01, 0x02, 0x03, 0x04 /* Address: 1.2.3.4 */
4847 };
4848
4849 for (const auto& response : {kResponseAPointer, kResponseLabelEndingWithAPointer}) {
4850 SCOPED_TRACE(StringPrintf("Hex dump: %s", toHex(makeSlice(response)).c_str()));
4851
4852 test::DNSResponder dns(test::DNSResponder::MappingType::BINARY_PACKET);
4853 dns.addMappingBinaryPacket(kHelloExampleComQueryV4, response);
4854 StartDns(dns, {});
4855 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4856
4857 // Expect no cache because the TTL of testing responses are 0.
4858 VerifyQueryHelloExampleComV4(dns, calltype);
Hungming Chenbb90ab32019-10-28 18:20:31 +08004859 }
Mike Yu40e67072019-10-09 21:14:09 +08004860}
Hungming Chen22617fd2019-12-06 12:15:45 +08004861
4862TEST_P(ResolverParameterizedTest, TruncatedResponse) {
4863 const auto& calltype = GetParam();
4864
Hungming Chen22617fd2019-12-06 12:15:45 +08004865 test::DNSResponder dns;
Ken Chen99344882020-01-01 14:59:38 +08004866 StartDns(dns, kLargeCnameChainRecords);
Hungming Chen22617fd2019-12-06 12:15:45 +08004867 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4868
4869 // Expect UDP response is truncated. The resolver retries over TCP. See RFC 1035 section 4.2.1.
4870 VerifyQueryHelloExampleComV4(dns, calltype, false);
4871 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom));
4872 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom));
4873}
Luke Huang420ee622019-11-27 17:52:44 +08004874
4875TEST_F(ResolverTest, KeepListeningUDP) {
4876 constexpr char listen_addr1[] = "127.0.0.4";
4877 constexpr char listen_addr2[] = "127.0.0.5";
4878 constexpr char host_name[] = "howdy.example.com.";
4879 const std::vector<DnsRecord> records = {
4880 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
4881 };
4882 const std::vector<int> params = {300, 25, 8, 8, 1000 /* BASE_TIMEOUT_MSEC */,
4883 1 /* retry count */};
4884 const int delayTimeMs = 1500;
4885
4886 test::DNSResponder neverRespondDns(listen_addr2, "53", static_cast<ns_rcode>(-1));
4887 neverRespondDns.setResponseProbability(0.0);
4888 StartDns(neverRespondDns, records);
Luke Huangf40df9c2020-04-21 08:51:48 +08004889 ScopedSystemProperties scopedSystemProperties(
4890 "persist.device_config.netd_native.keep_listening_udp", "1");
4891 // Re-setup test network to make experiment flag take effect.
4892 resetNetwork();
Luke Huang420ee622019-11-27 17:52:44 +08004893
4894 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr1, listen_addr2},
4895 kDefaultSearchDomains, params));
4896 // There are 2 DNS servers for this test.
4897 // |delayedDns| will be blocked for |delayTimeMs|, then start to respond to requests.
4898 // |neverRespondDns| will never respond.
4899 // In the first try, resolver will send query to |delayedDns| but get timeout error
4900 // because |delayTimeMs| > DNS timeout.
4901 // Then it's the second try, resolver will send query to |neverRespondDns| and
4902 // listen on both servers. Resolver will receive the answer coming from |delayedDns|.
Luke Huang420ee622019-11-27 17:52:44 +08004903
Luke Huang420ee622019-11-27 17:52:44 +08004904 test::DNSResponder delayedDns(listen_addr1);
4905 delayedDns.setResponseDelayMs(delayTimeMs);
4906 StartDns(delayedDns, records);
4907
4908 // Specify hints to ensure resolver doing query only 1 round.
4909 const addrinfo hints = {.ai_family = AF_INET6, .ai_socktype = SOCK_DGRAM};
4910 ScopedAddrinfo result = safe_getaddrinfo(host_name, nullptr, &hints);
4911 EXPECT_TRUE(result != nullptr);
4912
4913 std::string result_str = ToString(result);
4914 EXPECT_TRUE(result_str == "::1.2.3.4") << ", result_str='" << result_str << "'";
4915}
Luke Huang0a0870d2020-02-12 20:41:10 +08004916
4917TEST_F(ResolverTest, GetAddrInfoParallelLookupTimeout) {
4918 constexpr char listen_addr[] = "127.0.0.4";
4919 constexpr char host_name[] = "howdy.example.com.";
4920 constexpr int TIMING_TOLERANCE_MS = 200;
4921 constexpr int DNS_TIMEOUT_MS = 1000;
4922 const std::vector<DnsRecord> records = {
4923 {host_name, ns_type::ns_t_a, "1.2.3.4"},
4924 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
4925 };
4926 const std::vector<int> params = {300, 25, 8, 8, DNS_TIMEOUT_MS /* BASE_TIMEOUT_MSEC */,
4927 1 /* retry count */};
4928 test::DNSResponder neverRespondDns(listen_addr, "53", static_cast<ns_rcode>(-1));
4929 neverRespondDns.setResponseProbability(0.0);
4930 StartDns(neverRespondDns, records);
Luke Huangf40df9c2020-04-21 08:51:48 +08004931 ScopedSystemProperties scopedSystemProperties(
4932 "persist.device_config.netd_native.parallel_lookup", "1");
Luke Huangd1d734f2020-04-30 12:25:40 +08004933 // The default value of parallel_lookup_sleep_time should be very small
4934 // that we can ignore in this test case.
Luke Huangf40df9c2020-04-21 08:51:48 +08004935 // Re-setup test network to make experiment flag take effect.
4936 resetNetwork();
Luke Huang0a0870d2020-02-12 20:41:10 +08004937
4938 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}, kDefaultSearchDomains, params));
4939 neverRespondDns.clearQueries();
4940
Luke Huang0a0870d2020-02-12 20:41:10 +08004941 // Use a never respond DNS server to verify if the A/AAAA queries are sent in parallel.
4942 // The resolver parameters are set to timeout 1s and retry 1 times.
4943 // So we expect the safe_getaddrinfo_time_taken() might take ~1s to
4944 // return when parallel lookup is enabled. And the DNS server should receive 2 queries.
4945 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_DGRAM};
4946 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(host_name, nullptr, hints);
4947
4948 EXPECT_TRUE(result == nullptr);
4949 EXPECT_NEAR(DNS_TIMEOUT_MS, timeTakenMs, TIMING_TOLERANCE_MS)
4950 << "took time should approximate equal timeout";
4951 EXPECT_EQ(2U, GetNumQueries(neverRespondDns, host_name));
4952}
Luke Huangd1d734f2020-04-30 12:25:40 +08004953
4954TEST_F(ResolverTest, GetAddrInfoParallelLookupSleepTime) {
4955 constexpr char listen_addr[] = "127.0.0.4";
4956 constexpr int TIMING_TOLERANCE_MS = 200;
4957 const std::vector<DnsRecord> records = {
4958 {kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4},
4959 {kHelloExampleCom, ns_type::ns_t_aaaa, kHelloExampleComAddrV6},
4960 };
4961 const std::vector<int> params = {300, 25, 8, 8, 1000 /* BASE_TIMEOUT_MSEC */,
4962 1 /* retry count */};
4963 test::DNSResponder dns(listen_addr);
4964 StartDns(dns, records);
4965 ScopedSystemProperties scopedSystemProperties1(
4966 "persist.device_config.netd_native.parallel_lookup", "1");
4967 constexpr int PARALLEL_LOOKUP_SLEEP_TIME_MS = 500;
4968 ScopedSystemProperties scopedSystemProperties2(
4969 "persist.device_config.netd_native.parallel_lookup_sleep_time",
4970 std::to_string(PARALLEL_LOOKUP_SLEEP_TIME_MS));
4971 // Re-setup test network to make experiment flag take effect.
4972 resetNetwork();
4973
4974 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}, kDefaultSearchDomains, params));
4975 dns.clearQueries();
4976
4977 // Expect the safe_getaddrinfo_time_taken() might take ~500ms to return because we set
4978 // parallel_lookup_sleep_time to 500ms.
4979 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_DGRAM};
4980 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(kHelloExampleCom, nullptr, hints);
4981
4982 EXPECT_NE(nullptr, result);
4983 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(
4984 {kHelloExampleComAddrV4, kHelloExampleComAddrV6}));
4985 EXPECT_NEAR(PARALLEL_LOOKUP_SLEEP_TIME_MS, timeTakenMs, TIMING_TOLERANCE_MS)
4986 << "took time should approximate equal timeout";
4987 EXPECT_EQ(2U, GetNumQueries(dns, kHelloExampleCom));
4988
4989 // Expect the PARALLEL_LOOKUP_SLEEP_TIME_MS won't affect the query under cache hit case.
4990 dns.clearQueries();
4991 std::tie(result, timeTakenMs) = safe_getaddrinfo_time_taken(kHelloExampleCom, nullptr, hints);
4992 EXPECT_NE(nullptr, result);
4993 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(
4994 {kHelloExampleComAddrV4, kHelloExampleComAddrV6}));
4995 EXPECT_GT(PARALLEL_LOOKUP_SLEEP_TIME_MS, timeTakenMs);
4996 EXPECT_EQ(0U, GetNumQueries(dns, kHelloExampleCom));
4997}