blob: 1ea7d01c02dbb7f335df7d1dc38f0ea55ebb7613 [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>
Mike Yu6ce587d2019-12-19 21:30:22 +080023#include <android-base/result.h>
Bernie Innocenti41b82c42019-06-05 22:38:25 +090024#include <android-base/stringprintf.h>
25#include <android-base/unique_fd.h>
26#include <android/multinetwork.h> // ResNsendFlags
Ken Chenb9fa2062018-11-13 21:51:13 +080027#include <arpa/inet.h>
Luke Huang94b10b92018-11-21 20:13:38 +080028#include <arpa/nameser.h>
Hungming Chene8f970c2019-04-10 17:34:06 +080029#include <binder/ProcessState.h>
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +090030#include <bpf/BpfUtils.h>
Bernie Innocenti41b82c42019-06-05 22:38:25 +090031#include <cutils/sockets.h>
32#include <gmock/gmock-matchers.h>
33#include <gtest/gtest.h>
Ken Chenb9fa2062018-11-13 21:51:13 +080034#include <netdb.h>
Luke Huang9d2d25b2019-06-14 00:34:05 +080035#include <netdutils/InternetAddresses.h>
Luke Huang579ddc72019-06-14 00:59:39 +080036#include <netdutils/NetworkConstants.h> // SHA256_SIZE
Luke Huang9d2d25b2019-06-14 00:34:05 +080037#include <netdutils/ResponseCode.h>
Hungming Chen63779052019-10-30 15:06:13 +080038#include <netdutils/Slice.h>
Luke Huang9d2d25b2019-06-14 00:34:05 +080039#include <netdutils/SocketOption.h>
Mike Yu40e67072019-10-09 21:14:09 +080040#include <netdutils/Stopwatch.h>
Luke Huang94b10b92018-11-21 20:13:38 +080041#include <netinet/in.h>
42#include <poll.h> /* poll */
Bernie Innocenti41b82c42019-06-05 22:38:25 +090043#include <private/android_filesystem_config.h>
Luke Huang94b10b92018-11-21 20:13:38 +080044#include <resolv.h>
Ken Chenb9fa2062018-11-13 21:51:13 +080045#include <stdarg.h>
Ken Chenb9fa2062018-11-13 21:51:13 +080046#include <stdlib.h>
Luke Huang94b10b92018-11-21 20:13:38 +080047#include <sys/socket.h>
48#include <sys/un.h>
Ken Chenb9fa2062018-11-13 21:51:13 +080049#include <unistd.h>
50
51#include <algorithm>
52#include <chrono>
53#include <iterator>
54#include <numeric>
55#include <thread>
56
Luke Huang829511c2020-05-26 17:31:15 +080057#include <DnsProxydProtocol.h> // NETID_USE_LOCAL_NAMESERVERS
Luke Huangf8215372019-11-22 11:53:41 +080058#include <aidl/android/net/IDnsResolver.h>
59#include <android/binder_manager.h>
60#include <android/binder_process.h>
Bernie Innocenti41b82c42019-06-05 22:38:25 +090061#include "NetdClient.h"
Bernie Innocenti41b82c42019-06-05 22:38:25 +090062#include "ResolverStats.h"
Luke Huangf8215372019-11-22 11:53:41 +080063#include "netid_client.h" // NETID_UNSET
64#include "params.h" // MAXNS
Mike Yu532405f2020-06-17 17:46:44 +080065#include "stats.h" // RCODE_TIMEOUT
Hungming Chene8f970c2019-04-10 17:34:06 +080066#include "tests/dns_metrics_listener/dns_metrics_listener.h"
chenbruceb43ec752019-07-24 20:19:41 +080067#include "tests/dns_responder/dns_responder.h"
Luke Huangf8215372019-11-22 11:53:41 +080068#include "tests/dns_responder/dns_responder_client_ndk.h"
Hungming Chenc6556622019-10-02 16:01:07 +080069#include "tests/dns_responder/dns_tls_certificate.h"
chenbruceb43ec752019-07-24 20:19:41 +080070#include "tests/dns_responder/dns_tls_frontend.h"
Luke Huangfde82482019-06-04 01:04:53 +080071#include "tests/resolv_test_utils.h"
Mike Yu6ce587d2019-12-19 21:30:22 +080072#include "tests/tun_forwarder.h"
Ken Chenb9fa2062018-11-13 21:51:13 +080073
Luke Huang0d592bc2019-05-25 18:24:03 +080074// Valid VPN netId range is 100 ~ 65535
75constexpr int TEST_VPN_NETID = 65502;
Luke Huang94b10b92018-11-21 20:13:38 +080076constexpr int MAXPACKET = (8 * 1024);
Ken Chenb9fa2062018-11-13 21:51:13 +080077
78// 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;
Mike Yu532405f2020-06-17 17:46:44 +080089using aidl::android::net::metrics::INetdEventListener;
Mike Yu6ce587d2019-12-19 21:30:22 +080090using android::base::Error;
Luke Huang9807e6b2019-05-20 16:17:12 +080091using android::base::ParseInt;
Mike Yu6ce587d2019-12-19 21:30:22 +080092using android::base::Result;
Ken Chenb9fa2062018-11-13 21:51:13 +080093using android::base::StringPrintf;
Luke Huang9807e6b2019-05-20 16:17:12 +080094using android::base::unique_fd;
Ken Chenb9fa2062018-11-13 21:51:13 +080095using android::net::ResolverStats;
Mike Yu6ce587d2019-12-19 21:30:22 +080096using android::net::TunForwarder;
Hungming Chene8f970c2019-04-10 17:34:06 +080097using android::net::metrics::DnsMetricsListener;
Ken Chenb9fa2062018-11-13 21:51:13 +080098using android::netdutils::enableSockopt;
Hungming Chen63779052019-10-30 15:06:13 +080099using android::netdutils::makeSlice;
Luke Huang9807e6b2019-05-20 16:17:12 +0800100using android::netdutils::ResponseCode;
Luke Huang9d2d25b2019-06-14 00:34:05 +0800101using android::netdutils::ScopedAddrinfo;
Mike Yu40e67072019-10-09 21:14:09 +0800102using android::netdutils::Stopwatch;
Hungming Chen63779052019-10-30 15:06:13 +0800103using android::netdutils::toHex;
Ken Chenb9fa2062018-11-13 21:51:13 +0800104
105// TODO: move into libnetdutils?
106namespace {
Luke Huangfde82482019-06-04 01:04:53 +0800107
Ken Chenb9fa2062018-11-13 21:51:13 +0800108ScopedAddrinfo safe_getaddrinfo(const char* node, const char* service,
109 const struct addrinfo* hints) {
110 addrinfo* result = nullptr;
111 if (getaddrinfo(node, service, hints, &result) != 0) {
112 result = nullptr; // Should already be the case, but...
113 }
114 return ScopedAddrinfo(result);
115}
Luke Huangfde82482019-06-04 01:04:53 +0800116
Mike Yu40e67072019-10-09 21:14:09 +0800117std::pair<ScopedAddrinfo, int> safe_getaddrinfo_time_taken(const char* node, const char* service,
118 const addrinfo& hints) {
119 Stopwatch s;
120 ScopedAddrinfo result = safe_getaddrinfo(node, service, &hints);
121 return {std::move(result), s.timeTakenUs() / 1000};
122}
123
Mike Yue2162e52020-03-04 18:43:46 +0800124struct NameserverStats {
125 NameserverStats() = delete;
126 NameserverStats(const std::string server) : server(server) {}
127 NameserverStats& setSuccesses(int val) {
128 successes = val;
129 return *this;
130 }
131 NameserverStats& setErrors(int val) {
132 errors = val;
133 return *this;
134 }
135 NameserverStats& setTimeouts(int val) {
136 timeouts = val;
137 return *this;
138 }
139 NameserverStats& setInternalErrors(int val) {
140 internal_errors = val;
141 return *this;
142 }
143
144 const std::string server;
145 int successes = 0;
146 int errors = 0;
147 int timeouts = 0;
148 int internal_errors = 0;
149};
150
Ken Chenb9fa2062018-11-13 21:51:13 +0800151} // namespace
152
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900153class ResolverTest : public ::testing::Test {
Hungming Chene8f970c2019-04-10 17:34:06 +0800154 public:
Hungming Chen473c4de2020-03-12 11:13:35 +0800155 static void SetUpTestSuite() {
Hungming Chen5bf09772019-04-25 11:16:13 +0800156 // Get binder service.
157 // Note that |mDnsClient| is not used for getting binder service in this static function.
158 // The reason is that wants to keep |mDnsClient| as a non-static data member. |mDnsClient|
159 // which sets up device network configuration could be independent from every test.
Luke Huangf8215372019-11-22 11:53:41 +0800160 // TODO: Perhaps add a static function in resolv_test_binder_utils.{cpp,h} to get binder
161 // service.
162
163 AIBinder* binder = AServiceManager_getService("dnsresolver");
164 ndk::SpAIBinder resolvBinder = ndk::SpAIBinder(binder);
165 auto resolvService = aidl::android::net::IDnsResolver::fromBinder(resolvBinder);
Hungming Chen5bf09772019-04-25 11:16:13 +0800166 ASSERT_NE(nullptr, resolvService.get());
167
168 // Subscribe the death recipient to the service IDnsResolver for detecting Netd death.
Luke Huang70070852019-11-25 18:25:50 +0800169 // GTEST assertion macros are not invoked for generating a test failure in the death
170 // recipient because the macros can't indicate failed test if Netd died between tests.
171 // Moreover, continuing testing may have no meaningful after Netd death. Therefore, the
172 // death recipient aborts process by GTEST_LOG_(FATAL) once Netd died.
Luke Huangf8215372019-11-22 11:53:41 +0800173 sResolvDeathRecipient = AIBinder_DeathRecipient_new([](void*) {
174 constexpr char errorMessage[] = "Netd died";
175 LOG(ERROR) << errorMessage;
176 GTEST_LOG_(FATAL) << errorMessage;
177 });
178 ASSERT_EQ(STATUS_OK, AIBinder_linkToDeath(binder, sResolvDeathRecipient, nullptr));
Hungming Chen5bf09772019-04-25 11:16:13 +0800179
180 // Subscribe the DNS listener for verifying DNS metrics event contents.
Luke Huangf8215372019-11-22 11:53:41 +0800181 sDnsMetricsListener = ndk::SharedRefBase::make<DnsMetricsListener>(
182 TEST_NETID /*monitor specific network*/);
Hungming Chen5bf09772019-04-25 11:16:13 +0800183 ASSERT_TRUE(resolvService->registerEventListener(sDnsMetricsListener).isOk());
184
185 // Start the binder thread pool for listening DNS metrics events and receiving death
186 // recipient.
Luke Huangf8215372019-11-22 11:53:41 +0800187 ABinderProcess_startThreadPool();
Hungming Chene8f970c2019-04-10 17:34:06 +0800188 }
Hungming Chen473c4de2020-03-12 11:13:35 +0800189 static void TearDownTestSuite() { AIBinder_DeathRecipient_delete(sResolvDeathRecipient); }
Hungming Chene8f970c2019-04-10 17:34:06 +0800190
Ken Chenb9fa2062018-11-13 21:51:13 +0800191 protected:
Lorenzo Colitti61f796b2020-05-21 00:57:49 +0900192 void SetUp() {
193 mDnsClient.SetUp();
194 sDnsMetricsListener->reset();
195 }
196
Mike Yu960243d2020-01-17 19:02:15 +0800197 void TearDown() {
198 // Ensure the dump works at the end of each test.
199 DumpResolverService();
200
201 mDnsClient.TearDown();
202 }
nuccachena26cc2a2018-07-17 18:07:23 +0800203
Luke Huangf40df9c2020-04-21 08:51:48 +0800204 void resetNetwork() {
205 mDnsClient.TearDown();
206 mDnsClient.SetupOemNetwork();
207 }
208
Xiao Ma09b71022018-12-11 17:56:32 +0900209 void StartDns(test::DNSResponder& dns, const std::vector<DnsRecord>& records) {
210 for (const auto& r : records) {
211 dns.addMapping(r.host_name, r.type, r.addr);
212 }
213
214 ASSERT_TRUE(dns.startServer());
215 dns.clearQueries();
216 }
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900217
Mike Yu960243d2020-01-17 19:02:15 +0800218 void DumpResolverService() {
219 unique_fd fd(open("/dev/null", O_WRONLY));
220 EXPECT_EQ(mDnsClient.resolvService()->dump(fd, nullptr, 0), 0);
221
222 const char* querylogCmd[] = {"querylog"}; // Keep it sync with DnsQueryLog::DUMP_KEYWORD.
223 EXPECT_EQ(mDnsClient.resolvService()->dump(fd, querylogCmd, std::size(querylogCmd)), 0);
224 }
225
Hungming Chene8f970c2019-04-10 17:34:06 +0800226 bool WaitForNat64Prefix(ExpectNat64PrefixStatus status,
227 std::chrono::milliseconds timeout = std::chrono::milliseconds(1000)) {
Hungming Chen5bf09772019-04-25 11:16:13 +0800228 return sDnsMetricsListener->waitForNat64Prefix(status, timeout);
Hungming Chene8f970c2019-04-10 17:34:06 +0800229 }
230
Mike Yu724f77d2019-08-16 11:14:50 +0800231 bool WaitForPrivateDnsValidation(std::string serverAddr, bool validated) {
232 return sDnsMetricsListener->waitForPrivateDnsValidation(serverAddr, validated);
233 }
234
Mike Yu153b5b82020-03-04 19:53:54 +0800235 bool hasUncaughtPrivateDnsValidation(const std::string& serverAddr) {
236 return sDnsMetricsListener->findValidationRecord(serverAddr);
237 }
238
Mike Yu532405f2020-06-17 17:46:44 +0800239 void ExpectDnsEvent(int32_t eventType, int32_t returnCode, const std::string& hostname,
240 const std::vector<std::string>& ipAddresses) {
241 const DnsMetricsListener::DnsEvent expect = {
242 TEST_NETID, eventType, returnCode,
243 hostname, ipAddresses, static_cast<int32_t>(ipAddresses.size())};
Mike Yub8faac42020-06-20 11:11:44 +0800244 do {
245 // Blocking call until timeout.
246 const auto dnsEvent = sDnsMetricsListener->popDnsEvent();
247 ASSERT_TRUE(dnsEvent.has_value()) << "Expected DnsEvent " << expect;
248 if (dnsEvent.value() == expect) break;
249 LOG(INFO) << "Skip unexpected DnsEvent: " << dnsEvent.value();
250 } while (true);
Mike Yu532405f2020-06-17 17:46:44 +0800251 }
252
Mike Yue2162e52020-03-04 18:43:46 +0800253 bool expectStatsFromGetResolverInfo(const std::vector<NameserverStats>& nameserversStats) {
254 std::vector<std::string> res_servers;
255 std::vector<std::string> res_domains;
256 std::vector<std::string> res_tls_servers;
257 res_params res_params;
258 std::vector<ResolverStats> res_stats;
259 int wait_for_pending_req_timeout_count;
260
261 if (!DnsResponderClient::GetResolverInfo(mDnsClient.resolvService(), TEST_NETID,
262 &res_servers, &res_domains, &res_tls_servers,
263 &res_params, &res_stats,
264 &wait_for_pending_req_timeout_count)) {
265 ADD_FAILURE() << "GetResolverInfo failed";
266 return false;
267 }
268
269 if (res_servers.size() != res_stats.size()) {
270 ADD_FAILURE() << fmt::format("res_servers.size() != res_stats.size(): {} != {}",
271 res_servers.size(), res_stats.size());
272 return false;
273 }
274 if (res_servers.size() != nameserversStats.size()) {
275 ADD_FAILURE() << fmt::format("res_servers.size() != nameserversStats.size(): {} != {}",
276 res_servers.size(), nameserversStats.size());
277 return false;
278 }
279
280 for (const auto& stats : nameserversStats) {
281 SCOPED_TRACE(stats.server);
282 const auto it = std::find(res_servers.begin(), res_servers.end(), stats.server);
283 if (it == res_servers.end()) {
284 ADD_FAILURE() << fmt::format("nameserver {} not found in the list {{{}}}",
285 stats.server, fmt::join(res_servers, ", "));
286 return false;
287 }
288 const int index = std::distance(res_servers.begin(), it);
289
290 // The check excludes rtt_avg, last_sample_time, and usable since they will be obsolete
291 // after |res_stats| is retrieved from NetConfig.dnsStats rather than NetConfig.nsstats.
292 EXPECT_EQ(res_stats[index].successes, stats.successes);
293 EXPECT_EQ(res_stats[index].errors, stats.errors);
294 EXPECT_EQ(res_stats[index].timeouts, stats.timeouts);
295 EXPECT_EQ(res_stats[index].internal_errors, stats.internal_errors);
296 }
297
298 return true;
299 }
300
Mike Yu153b5b82020-03-04 19:53:54 +0800301 // Since there's no way to terminate private DNS validation threads at any time. Tests that
302 // focus on the results of private DNS validation can interfere with each other if they use the
303 // same IP address for test servers. getUniqueIPv4Address() is a workaround to reduce the
304 // possibility of tests being flaky. A feasible solution is to forbid the validation threads,
305 // which are considered as outdated (e.g. switch the resolver to private DNS OFF mode), updating
306 // the result to the PrivateDnsConfiguration instance.
307 static std::string getUniqueIPv4Address() {
308 static int counter = 0;
309 return fmt::format("127.0.100.{}", (++counter & 0xff));
310 }
311
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900312 DnsResponderClient mDnsClient;
Xiao Ma09b71022018-12-11 17:56:32 +0900313
Hungming Chen5bf09772019-04-25 11:16:13 +0800314 // Use a shared static DNS listener for all tests to avoid registering lots of listeners
315 // which may be released late until process terminated. Currently, registered DNS listener
316 // is removed by binder death notification which is fired when the process hosting an
317 // IBinder has gone away. If every test in ResolverTest registers its DNS listener, Netd
318 // may temporarily hold lots of dead listeners until the unit test process terminates.
319 // TODO: Perhaps add an unregistering listener binder call or fork a listener process which
320 // could be terminated earlier.
Luke Huangf8215372019-11-22 11:53:41 +0800321 static std::shared_ptr<DnsMetricsListener>
Hungming Chen473c4de2020-03-12 11:13:35 +0800322 sDnsMetricsListener; // Initialized in SetUpTestSuite.
Hungming Chen5bf09772019-04-25 11:16:13 +0800323
324 // Use a shared static death recipient to monitor the service death. The static death
325 // recipient could monitor the death not only during the test but also between tests.
Hungming Chen473c4de2020-03-12 11:13:35 +0800326 static AIBinder_DeathRecipient* sResolvDeathRecipient; // Initialized in SetUpTestSuite.
Ken Chenb9fa2062018-11-13 21:51:13 +0800327};
328
Hungming Chen5bf09772019-04-25 11:16:13 +0800329// Initialize static member of class.
Luke Huangf8215372019-11-22 11:53:41 +0800330std::shared_ptr<DnsMetricsListener> ResolverTest::sDnsMetricsListener;
331AIBinder_DeathRecipient* ResolverTest::sResolvDeathRecipient;
Hungming Chen5bf09772019-04-25 11:16:13 +0800332
Ken Chenb9fa2062018-11-13 21:51:13 +0800333TEST_F(ResolverTest, GetHostByName) {
Xiao Ma09b71022018-12-11 17:56:32 +0900334 constexpr char nonexistent_host_name[] = "nonexistent.example.com.";
335
336 test::DNSResponder dns;
337 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.3"}});
338 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800339
340 const hostent* result;
Ken Chenb9fa2062018-11-13 21:51:13 +0800341 result = gethostbyname("nonexistent");
342 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, nonexistent_host_name));
343 ASSERT_TRUE(result == nullptr);
344 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
345
346 dns.clearQueries();
347 result = gethostbyname("hello");
Xiao Ma09b71022018-12-11 17:56:32 +0900348 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
Ken Chenb9fa2062018-11-13 21:51:13 +0800349 ASSERT_FALSE(result == nullptr);
350 ASSERT_EQ(4, result->h_length);
351 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
352 EXPECT_EQ("1.2.3.3", ToString(result));
353 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800354}
355
lifr4e4a2e02019-01-29 16:53:51 +0800356TEST_F(ResolverTest, GetHostByName_cnames) {
357 constexpr char host_name[] = "host.example.com.";
358 size_t cnamecount = 0;
359 test::DNSResponder dns;
360
361 const std::vector<DnsRecord> records = {
362 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
363 {"a.example.com.", ns_type::ns_t_cname, "b.example.com."},
364 {"b.example.com.", ns_type::ns_t_cname, "c.example.com."},
365 {"c.example.com.", ns_type::ns_t_cname, "d.example.com."},
366 {"d.example.com.", ns_type::ns_t_cname, "e.example.com."},
367 {"e.example.com.", ns_type::ns_t_cname, host_name},
368 {host_name, ns_type::ns_t_a, "1.2.3.3"},
369 {host_name, ns_type::ns_t_aaaa, "2001:db8::42"},
370 };
371 StartDns(dns, records);
372 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
373
374 // using gethostbyname2() to resolve ipv4 hello.example.com. to 1.2.3.3
375 // Ensure the v4 address and cnames are correct
376 const hostent* result;
377 result = gethostbyname2("hello", AF_INET);
378 ASSERT_FALSE(result == nullptr);
379
380 for (int 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" record in DNS records is 2
386 ASSERT_EQ(cnamecount, records.size() - 2);
387 ASSERT_EQ(4, result->h_length);
388 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
389 EXPECT_EQ("1.2.3.3", ToString(result));
390 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
391 EXPECT_EQ(1U, dns.queries().size()) << dns.dumpQueries();
392
393 // using gethostbyname2() to resolve ipv6 hello.example.com. to 2001:db8::42
394 // Ensure the v6 address and cnames are correct
395 cnamecount = 0;
396 dns.clearQueries();
397 result = gethostbyname2("hello", AF_INET6);
398 for (unsigned i = 0; result != nullptr && result->h_aliases[i] != nullptr; i++) {
399 std::string domain_name = records[i].host_name.substr(0, records[i].host_name.size() - 1);
400 EXPECT_EQ(result->h_aliases[i], domain_name);
401 cnamecount++;
402 }
403 // The size of "Non-cname type" DNS record in records is 2
404 ASSERT_EQ(cnamecount, records.size() - 2);
405 ASSERT_FALSE(result == nullptr);
406 ASSERT_EQ(16, result->h_length);
407 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
408 EXPECT_EQ("2001:db8::42", ToString(result));
409 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
410}
411
412TEST_F(ResolverTest, GetHostByName_cnamesInfiniteLoop) {
413 test::DNSResponder dns;
414 const std::vector<DnsRecord> records = {
415 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
416 {"a.example.com.", ns_type::ns_t_cname, kHelloExampleCom},
417 };
418 StartDns(dns, records);
419 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
420
421 const hostent* result;
422 result = gethostbyname2("hello", AF_INET);
423 ASSERT_TRUE(result == nullptr);
424
425 dns.clearQueries();
426 result = gethostbyname2("hello", AF_INET6);
427 ASSERT_TRUE(result == nullptr);
428}
429
Ken Chenb9fa2062018-11-13 21:51:13 +0800430TEST_F(ResolverTest, GetHostByName_localhost) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800431 constexpr char name_camelcase[] = "LocalHost";
Ken Chenb9fa2062018-11-13 21:51:13 +0800432 constexpr char name_ip6_dot[] = "ip6-localhost.";
433 constexpr char name_ip6_fqdn[] = "ip6-localhost.example.com.";
434
435 // Add a dummy nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900436 test::DNSResponder dns;
437 StartDns(dns, {});
438 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800439
440 // Expect no DNS queries; localhost is resolved via /etc/hosts
Xiao Ma09b71022018-12-11 17:56:32 +0900441 const hostent* result = gethostbyname(kLocalHost);
Ken Chenb9fa2062018-11-13 21:51:13 +0800442 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
443 ASSERT_FALSE(result == nullptr);
444 ASSERT_EQ(4, result->h_length);
445 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900446 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800447 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
448
449 // Ensure the hosts file resolver ignores case of hostnames
450 result = gethostbyname(name_camelcase);
451 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
452 ASSERT_FALSE(result == nullptr);
453 ASSERT_EQ(4, result->h_length);
454 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900455 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800456 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
457
458 // The hosts file also contains ip6-localhost, but gethostbyname() won't
chenbruce018fdb22019-06-12 18:08:04 +0800459 // return it. This would be easy to
Ken Chenb9fa2062018-11-13 21:51:13 +0800460 // change, but there's no point in changing the legacy behavior; new code
461 // should be calling getaddrinfo() anyway.
462 // So we check the legacy behavior, which results in amusing A-record
463 // lookups for ip6-localhost, with and without search domains appended.
464 dns.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900465 result = gethostbyname(kIp6LocalHost);
Sehee Parkbbca0202018-11-16 10:53:16 +0900466 EXPECT_EQ(2U, dns.queries().size()) << dns.dumpQueries();
467 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, name_ip6_dot)) << dns.dumpQueries();
468 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, name_ip6_fqdn)) << dns.dumpQueries();
Ken Chenb9fa2062018-11-13 21:51:13 +0800469 ASSERT_TRUE(result == nullptr);
470
471 // Finally, use gethostbyname2() to resolve ip6-localhost to ::1 from
472 // the hosts file.
473 dns.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900474 result = gethostbyname2(kIp6LocalHost, AF_INET6);
Ken Chenb9fa2062018-11-13 21:51:13 +0800475 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
476 ASSERT_FALSE(result == nullptr);
477 ASSERT_EQ(16, result->h_length);
478 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900479 EXPECT_EQ(kIp6LocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800480 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800481}
482
483TEST_F(ResolverTest, GetHostByName_numeric) {
484 // Add a dummy nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900485 test::DNSResponder dns;
486 StartDns(dns, {});
487 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800488
489 // Numeric v4 address: expect no DNS queries
490 constexpr char numeric_v4[] = "192.168.0.1";
Ken Chenb9fa2062018-11-13 21:51:13 +0800491 const hostent* result = gethostbyname(numeric_v4);
Sehee Parkbbca0202018-11-16 10:53:16 +0900492 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800493 ASSERT_FALSE(result == nullptr);
494 ASSERT_EQ(4, result->h_length); // v4
495 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
496 EXPECT_EQ(numeric_v4, ToString(result));
497 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
498
499 // gethostbyname() recognizes a v6 address, and fails with no DNS queries
500 constexpr char numeric_v6[] = "2001:db8::42";
501 dns.clearQueries();
502 result = gethostbyname(numeric_v6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900503 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800504 EXPECT_TRUE(result == nullptr);
505
506 // Numeric v6 address with gethostbyname2(): succeeds with no DNS queries
507 dns.clearQueries();
508 result = gethostbyname2(numeric_v6, AF_INET6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900509 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800510 ASSERT_FALSE(result == nullptr);
511 ASSERT_EQ(16, result->h_length); // v6
512 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
513 EXPECT_EQ(numeric_v6, ToString(result));
514 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
515
516 // Numeric v6 address with scope work with getaddrinfo(),
517 // but gethostbyname2() does not understand them; it issues two dns
518 // queries, then fails. This hardly ever happens, there's no point
519 // in fixing this. This test simply verifies the current (bogus)
520 // behavior to avoid further regressions (like crashes, or leaks).
521 constexpr char numeric_v6_scope[] = "fe80::1%lo";
522 dns.clearQueries();
523 result = gethostbyname2(numeric_v6_scope, AF_INET6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900524 EXPECT_EQ(2U, dns.queries().size()); // OUCH!
Ken Chenb9fa2062018-11-13 21:51:13 +0800525 ASSERT_TRUE(result == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800526}
527
528TEST_F(ResolverTest, BinderSerialization) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800529 std::vector<int> params_offsets = {
Luke Huang5bd827c2019-03-14 16:10:04 +0800530 IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY,
531 IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD,
532 IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES,
533 IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES,
534 IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC,
535 IDnsResolver::RESOLVER_PARAMS_RETRY_COUNT,
Ken Chenb9fa2062018-11-13 21:51:13 +0800536 };
Bernie Innocentib102dd22018-12-04 14:57:48 +0900537 const int size = static_cast<int>(params_offsets.size());
Luke Huang5bd827c2019-03-14 16:10:04 +0800538 EXPECT_EQ(size, IDnsResolver::RESOLVER_PARAMS_COUNT);
Ken Chenb9fa2062018-11-13 21:51:13 +0800539 std::sort(params_offsets.begin(), params_offsets.end());
Bernie Innocentib102dd22018-12-04 14:57:48 +0900540 for (int i = 0; i < size; ++i) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800541 EXPECT_EQ(params_offsets[i], i);
542 }
543}
544
545TEST_F(ResolverTest, GetHostByName_Binder) {
Luke Huangf8215372019-11-22 11:53:41 +0800546 std::vector<std::string> domains = {"example.com"};
Ken Chenb9fa2062018-11-13 21:51:13 +0800547 std::vector<std::unique_ptr<test::DNSResponder>> dns;
548 std::vector<std::string> servers;
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900549 std::vector<DnsResponderClient::Mapping> mappings;
550 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupMappings(1, domains, &mappings));
551 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupDNSServers(4, mappings, &dns, &servers));
Ken Chenb9fa2062018-11-13 21:51:13 +0800552 ASSERT_EQ(1U, mappings.size());
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900553 const DnsResponderClient::Mapping& mapping = mappings[0];
Ken Chenb9fa2062018-11-13 21:51:13 +0800554
Xiao Ma09b71022018-12-11 17:56:32 +0900555 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains, kDefaultParams));
Ken Chenb9fa2062018-11-13 21:51:13 +0800556
557 const hostent* result = gethostbyname(mapping.host.c_str());
Bernie Innocentib102dd22018-12-04 14:57:48 +0900558 const size_t total_queries =
Luke Huangfde82482019-06-04 01:04:53 +0800559 std::accumulate(dns.begin(), dns.end(), 0, [&mapping](size_t total, auto& d) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800560 return total + GetNumQueriesForType(*d, ns_type::ns_t_a, mapping.entry.c_str());
561 });
562
563 EXPECT_LE(1U, total_queries);
564 ASSERT_FALSE(result == nullptr);
565 ASSERT_EQ(4, result->h_length);
566 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
567 EXPECT_EQ(mapping.ip4, ToString(result));
568 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
569
570 std::vector<std::string> res_servers;
571 std::vector<std::string> res_domains;
Mike Yu0a1c53d2018-11-26 13:26:21 +0900572 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +0900573 res_params res_params;
Ken Chenb9fa2062018-11-13 21:51:13 +0800574 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +0800575 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +0800576 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
577 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
578 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chenb9fa2062018-11-13 21:51:13 +0800579 EXPECT_EQ(servers.size(), res_servers.size());
580 EXPECT_EQ(domains.size(), res_domains.size());
Mike Yu0a1c53d2018-11-26 13:26:21 +0900581 EXPECT_EQ(0U, res_tls_servers.size());
Luke Huang5bd827c2019-03-14 16:10:04 +0800582 ASSERT_EQ(static_cast<size_t>(IDnsResolver::RESOLVER_PARAMS_COUNT), kDefaultParams.size());
583 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY],
584 res_params.sample_validity);
585 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900586 res_params.success_threshold);
Luke Huang5bd827c2019-03-14 16:10:04 +0800587 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
588 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
589 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
Ken Chenb9fa2062018-11-13 21:51:13 +0800590 res_params.base_timeout_msec);
591 EXPECT_EQ(servers.size(), res_stats.size());
592
Bernie Innocenti0c067e42019-04-01 15:33:16 +0900593 EXPECT_THAT(res_servers, testing::UnorderedElementsAreArray(servers));
594 EXPECT_THAT(res_domains, testing::UnorderedElementsAreArray(domains));
Ken Chenb9fa2062018-11-13 21:51:13 +0800595}
596
597TEST_F(ResolverTest, GetAddrInfo) {
Xiao Ma09b71022018-12-11 17:56:32 +0900598 constexpr char listen_addr[] = "127.0.0.4";
599 constexpr char listen_addr2[] = "127.0.0.5";
600 constexpr char host_name[] = "howdy.example.com.";
Ken Chenb9fa2062018-11-13 21:51:13 +0800601
Xiao Ma09b71022018-12-11 17:56:32 +0900602 const std::vector<DnsRecord> records = {
603 {host_name, ns_type::ns_t_a, "1.2.3.4"},
604 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
605 };
606 test::DNSResponder dns(listen_addr);
607 test::DNSResponder dns2(listen_addr2);
608 StartDns(dns, records);
609 StartDns(dns2, records);
Ken Chenb9fa2062018-11-13 21:51:13 +0800610
Xiao Ma09b71022018-12-11 17:56:32 +0900611 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}));
Ken Chenb9fa2062018-11-13 21:51:13 +0800612 dns.clearQueries();
613 dns2.clearQueries();
614
615 ScopedAddrinfo result = safe_getaddrinfo("howdy", nullptr, nullptr);
616 EXPECT_TRUE(result != nullptr);
617 size_t found = GetNumQueries(dns, host_name);
618 EXPECT_LE(1U, found);
619 // Could be A or AAAA
620 std::string result_str = ToString(result);
621 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +0800622 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +0800623
624 // Verify that the name is cached.
625 size_t old_found = found;
626 result = safe_getaddrinfo("howdy", nullptr, nullptr);
627 EXPECT_TRUE(result != nullptr);
628 found = GetNumQueries(dns, host_name);
629 EXPECT_LE(1U, found);
630 EXPECT_EQ(old_found, found);
631 result_str = ToString(result);
Luke Huangf8215372019-11-22 11:53:41 +0800632 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4") << result_str;
Ken Chenb9fa2062018-11-13 21:51:13 +0800633
634 // Change the DNS resolver, ensure that queries are still cached.
Xiao Ma09b71022018-12-11 17:56:32 +0900635 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr2}));
Ken Chenb9fa2062018-11-13 21:51:13 +0800636 dns.clearQueries();
637 dns2.clearQueries();
638
639 result = safe_getaddrinfo("howdy", nullptr, nullptr);
640 EXPECT_TRUE(result != nullptr);
641 found = GetNumQueries(dns, host_name);
642 size_t found2 = GetNumQueries(dns2, host_name);
643 EXPECT_EQ(0U, found);
644 EXPECT_LE(0U, found2);
645
646 // Could be A or AAAA
647 result_str = ToString(result);
648 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +0800649 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +0800650}
651
652TEST_F(ResolverTest, GetAddrInfoV4) {
Xiao Ma09b71022018-12-11 17:56:32 +0900653 test::DNSResponder dns;
654 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.5"}});
655 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800656
Xiao Ma09b71022018-12-11 17:56:32 +0900657 const addrinfo hints = {.ai_family = AF_INET};
658 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
Ken Chenb9fa2062018-11-13 21:51:13 +0800659 EXPECT_TRUE(result != nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900660 EXPECT_EQ(1U, GetNumQueries(dns, kHelloExampleCom));
Ken Chenb9fa2062018-11-13 21:51:13 +0800661 EXPECT_EQ("1.2.3.5", ToString(result));
662}
663
664TEST_F(ResolverTest, GetAddrInfo_localhost) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800665 // Add a dummy nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900666 test::DNSResponder dns;
667 StartDns(dns, {});
668 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800669
Xiao Ma09b71022018-12-11 17:56:32 +0900670 ScopedAddrinfo result = safe_getaddrinfo(kLocalHost, nullptr, nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800671 EXPECT_TRUE(result != nullptr);
672 // Expect no DNS queries; localhost is resolved via /etc/hosts
673 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900674 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800675
Xiao Ma09b71022018-12-11 17:56:32 +0900676 result = safe_getaddrinfo(kIp6LocalHost, nullptr, nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800677 EXPECT_TRUE(result != nullptr);
678 // Expect no DNS queries; ip6-localhost is resolved via /etc/hosts
679 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900680 EXPECT_EQ(kIp6LocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800681}
682
Luke Huangd8ac4752019-06-18 17:05:47 +0800683TEST_F(ResolverTest, GetAddrInfo_InvalidSocketType) {
684 test::DNSResponder dns;
685 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.5"}});
686 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
687
688 // TODO: Test other invalid socket types.
689 const addrinfo hints = {
690 .ai_family = AF_UNSPEC,
Luke Huangd8ac4752019-06-18 17:05:47 +0800691 .ai_socktype = SOCK_PACKET,
692 };
693 addrinfo* result = nullptr;
694 // This is a valid hint, but the query won't be sent because the socket type is
695 // not supported.
696 EXPECT_EQ(EAI_NODATA, getaddrinfo("hello", nullptr, &hints, &result));
697 ScopedAddrinfo result_cleanup(result);
698 EXPECT_EQ(nullptr, result);
699}
700
Ken Chen92bed612018-12-22 21:46:55 +0800701// Verify if the resolver correctly handle multiple queries simultaneously
702// step 1: set dns server#1 into deferred responding mode.
703// step 2: thread#1 query "hello.example.com." --> resolver send query to server#1.
704// step 3: thread#2 query "hello.example.com." --> resolver hold the request and wait for
705// response of previous pending query sent by thread#1.
706// step 4: thread#3 query "konbanha.example.com." --> resolver send query to server#3. Server
707// respond to resolver immediately.
708// step 5: check if server#1 get 1 query by thread#1, server#2 get 0 query, server#3 get 1 query.
709// step 6: resume dns server#1 to respond dns query in step#2.
710// step 7: thread#1 and #2 should get returned from DNS query after step#6. Also, check the
711// number of queries in server#2 is 0 to ensure thread#2 does not wake up unexpectedly
712// before signaled by thread#1.
713TEST_F(ResolverTest, GetAddrInfoV4_deferred_resp) {
714 const char* listen_addr1 = "127.0.0.9";
715 const char* listen_addr2 = "127.0.0.10";
716 const char* listen_addr3 = "127.0.0.11";
717 const char* listen_srv = "53";
718 const char* host_name_deferred = "hello.example.com.";
719 const char* host_name_normal = "konbanha.example.com.";
Mike Yufc125e42019-05-15 20:41:28 +0800720 test::DNSResponder dns1(listen_addr1, listen_srv, ns_rcode::ns_r_servfail);
721 test::DNSResponder dns2(listen_addr2, listen_srv, ns_rcode::ns_r_servfail);
722 test::DNSResponder dns3(listen_addr3, listen_srv, ns_rcode::ns_r_servfail);
Ken Chen92bed612018-12-22 21:46:55 +0800723 dns1.addMapping(host_name_deferred, ns_type::ns_t_a, "1.2.3.4");
724 dns2.addMapping(host_name_deferred, ns_type::ns_t_a, "1.2.3.4");
725 dns3.addMapping(host_name_normal, ns_type::ns_t_a, "1.2.3.5");
726 ASSERT_TRUE(dns1.startServer());
727 ASSERT_TRUE(dns2.startServer());
728 ASSERT_TRUE(dns3.startServer());
729 const std::vector<std::string> servers_for_t1 = {listen_addr1};
730 const std::vector<std::string> servers_for_t2 = {listen_addr2};
731 const std::vector<std::string> servers_for_t3 = {listen_addr3};
732 addrinfo hints = {.ai_family = AF_INET};
733 const std::vector<int> params = {300, 25, 8, 8, 5000};
734 bool t3_task_done = false;
735
736 dns1.setDeferredResp(true);
737 std::thread t1([&, this]() {
738 ASSERT_TRUE(
739 mDnsClient.SetResolversForNetwork(servers_for_t1, kDefaultSearchDomains, params));
740 ScopedAddrinfo result = safe_getaddrinfo(host_name_deferred, nullptr, &hints);
741 // t3's dns query should got returned first
742 EXPECT_TRUE(t3_task_done);
743 EXPECT_EQ(1U, GetNumQueries(dns1, host_name_deferred));
744 EXPECT_TRUE(result != nullptr);
745 EXPECT_EQ("1.2.3.4", ToString(result));
746 });
747
748 // ensuring t1 and t2 handler functions are processed in order
749 usleep(100 * 1000);
750 std::thread t2([&, this]() {
751 ASSERT_TRUE(
752 mDnsClient.SetResolversForNetwork(servers_for_t2, kDefaultSearchDomains, params));
753 ScopedAddrinfo result = safe_getaddrinfo(host_name_deferred, nullptr, &hints);
754 EXPECT_TRUE(t3_task_done);
755 EXPECT_EQ(0U, GetNumQueries(dns2, host_name_deferred));
756 EXPECT_TRUE(result != nullptr);
757 EXPECT_EQ("1.2.3.4", ToString(result));
758
759 std::vector<std::string> res_servers;
760 std::vector<std::string> res_domains;
761 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +0900762 res_params res_params;
Ken Chen92bed612018-12-22 21:46:55 +0800763 std::vector<ResolverStats> res_stats;
764 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +0800765 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
766 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains,
767 &res_tls_servers, &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chen92bed612018-12-22 21:46:55 +0800768 EXPECT_EQ(0, wait_for_pending_req_timeout_count);
769 });
770
771 // ensuring t2 and t3 handler functions are processed in order
772 usleep(100 * 1000);
773 std::thread t3([&, this]() {
774 ASSERT_TRUE(
775 mDnsClient.SetResolversForNetwork(servers_for_t3, kDefaultSearchDomains, params));
776 ScopedAddrinfo result = safe_getaddrinfo(host_name_normal, nullptr, &hints);
777 EXPECT_EQ(1U, GetNumQueries(dns1, host_name_deferred));
778 EXPECT_EQ(0U, GetNumQueries(dns2, host_name_deferred));
779 EXPECT_EQ(1U, GetNumQueries(dns3, host_name_normal));
780 EXPECT_TRUE(result != nullptr);
781 EXPECT_EQ("1.2.3.5", ToString(result));
782
783 t3_task_done = true;
784 dns1.setDeferredResp(false);
785 });
786 t3.join();
787 t1.join();
788 t2.join();
789}
790
lifr4e4a2e02019-01-29 16:53:51 +0800791TEST_F(ResolverTest, GetAddrInfo_cnames) {
792 constexpr char host_name[] = "host.example.com.";
793 test::DNSResponder dns;
794 const std::vector<DnsRecord> records = {
795 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
796 {"a.example.com.", ns_type::ns_t_cname, "b.example.com."},
797 {"b.example.com.", ns_type::ns_t_cname, "c.example.com."},
798 {"c.example.com.", ns_type::ns_t_cname, "d.example.com."},
799 {"d.example.com.", ns_type::ns_t_cname, "e.example.com."},
800 {"e.example.com.", ns_type::ns_t_cname, host_name},
801 {host_name, ns_type::ns_t_a, "1.2.3.3"},
802 {host_name, ns_type::ns_t_aaaa, "2001:db8::42"},
803 };
804 StartDns(dns, records);
805 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
806
807 addrinfo hints = {.ai_family = AF_INET};
808 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
809 EXPECT_TRUE(result != nullptr);
810 EXPECT_EQ("1.2.3.3", ToString(result));
811
812 dns.clearQueries();
813 hints = {.ai_family = AF_INET6};
814 result = safe_getaddrinfo("hello", nullptr, &hints);
815 EXPECT_TRUE(result != nullptr);
816 EXPECT_EQ("2001:db8::42", ToString(result));
817}
818
819TEST_F(ResolverTest, GetAddrInfo_cnamesNoIpAddress) {
820 test::DNSResponder dns;
821 const std::vector<DnsRecord> records = {
822 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
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
837TEST_F(ResolverTest, GetAddrInfo_cnamesIllegalRdata) {
838 test::DNSResponder dns;
839 const std::vector<DnsRecord> records = {
840 {kHelloExampleCom, ns_type::ns_t_cname, ".!#?"},
841 };
842 StartDns(dns, records);
843 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
844
845 addrinfo hints = {.ai_family = AF_INET};
846 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
847 EXPECT_TRUE(result == nullptr);
848
849 dns.clearQueries();
850 hints = {.ai_family = AF_INET6};
851 result = safe_getaddrinfo("hello", nullptr, &hints);
852 EXPECT_TRUE(result == nullptr);
853}
854
Ken Chenb9fa2062018-11-13 21:51:13 +0800855TEST_F(ResolverTest, MultidomainResolution) {
Xiao Ma09b71022018-12-11 17:56:32 +0900856 constexpr char host_name[] = "nihao.example2.com.";
Luke Huangf8215372019-11-22 11:53:41 +0800857 std::vector<std::string> searchDomains = {"example1.com", "example2.com", "example3.com"};
Ken Chenb9fa2062018-11-13 21:51:13 +0800858
Xiao Ma09b71022018-12-11 17:56:32 +0900859 test::DNSResponder dns("127.0.0.6");
860 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.3"}});
861 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({"127.0.0.6"}, searchDomains));
862
Ken Chenb9fa2062018-11-13 21:51:13 +0800863 const hostent* result = gethostbyname("nihao");
Xiao Ma09b71022018-12-11 17:56:32 +0900864
Ken Chenb9fa2062018-11-13 21:51:13 +0800865 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
866 ASSERT_FALSE(result == nullptr);
867 ASSERT_EQ(4, result->h_length);
868 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
869 EXPECT_EQ("1.2.3.3", ToString(result));
870 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800871}
872
873TEST_F(ResolverTest, GetAddrInfoV6_numeric) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800874 constexpr char host_name[] = "ohayou.example.com.";
875 constexpr char numeric_addr[] = "fe80::1%lo";
876
Xiao Ma09b71022018-12-11 17:56:32 +0900877 test::DNSResponder dns;
Ken Chenb9fa2062018-11-13 21:51:13 +0800878 dns.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900879 StartDns(dns, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
880 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800881
882 addrinfo hints = {.ai_family = AF_INET6};
883 ScopedAddrinfo result = safe_getaddrinfo(numeric_addr, nullptr, &hints);
884 EXPECT_TRUE(result != nullptr);
885 EXPECT_EQ(numeric_addr, ToString(result));
886 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
887
888 // Now try a non-numeric hostname query with the AI_NUMERICHOST flag set.
889 // We should fail without sending out a DNS query.
890 hints.ai_flags |= AI_NUMERICHOST;
891 result = safe_getaddrinfo(host_name, nullptr, &hints);
892 EXPECT_TRUE(result == nullptr);
893 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
894}
895
896TEST_F(ResolverTest, GetAddrInfoV6_failing) {
Xiao Ma09b71022018-12-11 17:56:32 +0900897 constexpr char listen_addr0[] = "127.0.0.7";
898 constexpr char listen_addr1[] = "127.0.0.8";
Ken Chenb9fa2062018-11-13 21:51:13 +0800899 const char* host_name = "ohayou.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +0900900
901 test::DNSResponder dns0(listen_addr0);
902 test::DNSResponder dns1(listen_addr1);
Ken Chenb9fa2062018-11-13 21:51:13 +0800903 dns0.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900904 StartDns(dns0, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
905 StartDns(dns1, {{host_name, ns_type::ns_t_aaaa, "2001:db8::6"}});
906
Luke Huangf8215372019-11-22 11:53:41 +0800907 std::vector<std::string> servers = {listen_addr0, listen_addr1};
Ken Chenb9fa2062018-11-13 21:51:13 +0800908 // <sample validity in s> <success threshold in percent> <min samples> <max samples>
909 int sample_count = 8;
Luke Huangf8215372019-11-22 11:53:41 +0800910 const std::vector<int> params = {300, 25, sample_count, sample_count};
Xiao Ma09b71022018-12-11 17:56:32 +0900911 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, kDefaultSearchDomains, params));
Ken Chenb9fa2062018-11-13 21:51:13 +0800912
913 // Repeatedly perform resolutions for non-existing domains until MAXNSSAMPLES resolutions have
914 // reached the dns0, which is set to fail. No more requests should then arrive at that server
915 // for the next sample_lifetime seconds.
916 // TODO: This approach is implementation-dependent, change once metrics reporting is available.
Xiao Ma09b71022018-12-11 17:56:32 +0900917 const addrinfo hints = {.ai_family = AF_INET6};
Bernie Innocentib102dd22018-12-04 14:57:48 +0900918 for (int i = 0; i < sample_count; ++i) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800919 std::string domain = StringPrintf("nonexistent%d", i);
920 ScopedAddrinfo result = safe_getaddrinfo(domain.c_str(), nullptr, &hints);
921 }
922 // Due to 100% errors for all possible samples, the server should be ignored from now on and
923 // only the second one used for all following queries, until NSSAMPLE_VALIDITY is reached.
924 dns0.clearQueries();
925 dns1.clearQueries();
926 ScopedAddrinfo result = safe_getaddrinfo("ohayou", nullptr, &hints);
927 EXPECT_TRUE(result != nullptr);
928 EXPECT_EQ(0U, GetNumQueries(dns0, host_name));
929 EXPECT_EQ(1U, GetNumQueries(dns1, host_name));
930}
931
932TEST_F(ResolverTest, GetAddrInfoV6_nonresponsive) {
Xiao Ma09b71022018-12-11 17:56:32 +0900933 constexpr char listen_addr0[] = "127.0.0.7";
934 constexpr char listen_addr1[] = "127.0.0.8";
935 constexpr char listen_srv[] = "53";
936 constexpr char host_name1[] = "ohayou.example.com.";
937 constexpr char host_name2[] = "ciao.example.com.";
Luke Huang483cf332019-06-03 17:24:51 +0800938 const std::vector<std::string> defaultSearchDomain = {"example.com"};
939 // The minimal timeout is 1000ms, so we can't decrease timeout
940 // So reduce retry count.
941 const std::vector<int> reduceRetryParams = {
942 300, // sample validity in seconds
943 25, // success threshod in percent
944 8, 8, // {MIN,MAX}_SAMPLES
945 1000, // BASE_TIMEOUT_MSEC
946 1, // retry count
947 };
Xiao Ma09b71022018-12-11 17:56:32 +0900948 const std::vector<DnsRecord> records0 = {
949 {host_name1, ns_type::ns_t_aaaa, "2001:db8::5"},
950 {host_name2, ns_type::ns_t_aaaa, "2001:db8::5"},
951 };
952 const std::vector<DnsRecord> records1 = {
953 {host_name1, ns_type::ns_t_aaaa, "2001:db8::6"},
954 {host_name2, ns_type::ns_t_aaaa, "2001:db8::6"},
955 };
Ken Chenb9fa2062018-11-13 21:51:13 +0800956
957 // dns0 does not respond with 100% probability, while
958 // dns1 responds normally, at least initially.
Mike Yufc125e42019-05-15 20:41:28 +0800959 test::DNSResponder dns0(listen_addr0, listen_srv, static_cast<ns_rcode>(-1));
960 test::DNSResponder dns1(listen_addr1, listen_srv, static_cast<ns_rcode>(-1));
Ken Chenb9fa2062018-11-13 21:51:13 +0800961 dns0.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900962 StartDns(dns0, records0);
963 StartDns(dns1, records1);
Luke Huang483cf332019-06-03 17:24:51 +0800964 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr0, listen_addr1}, defaultSearchDomain,
965 reduceRetryParams));
Ken Chenb9fa2062018-11-13 21:51:13 +0800966
Luke Huang483cf332019-06-03 17:24:51 +0800967 // Specify ai_socktype to make getaddrinfo will only query 1 time
968 const addrinfo hints = {.ai_family = AF_INET6, .ai_socktype = SOCK_STREAM};
Ken Chenb9fa2062018-11-13 21:51:13 +0800969
970 // dns0 will ignore the request, and we'll fallback to dns1 after the first
971 // retry.
972 ScopedAddrinfo result = safe_getaddrinfo(host_name1, nullptr, &hints);
973 EXPECT_TRUE(result != nullptr);
974 EXPECT_EQ(1U, GetNumQueries(dns0, host_name1));
975 EXPECT_EQ(1U, GetNumQueries(dns1, host_name1));
Mike Yu532405f2020-06-17 17:46:44 +0800976 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, 0, host_name1, {"2001:db8::6"});
Ken Chenb9fa2062018-11-13 21:51:13 +0800977
978 // Now make dns1 also ignore 100% requests... The resolve should alternate
Luke Huang483cf332019-06-03 17:24:51 +0800979 // queries between the nameservers and fail
Ken Chenb9fa2062018-11-13 21:51:13 +0800980 dns1.setResponseProbability(0.0);
981 addrinfo* result2 = nullptr;
982 EXPECT_EQ(EAI_NODATA, getaddrinfo(host_name2, nullptr, &hints, &result2));
983 EXPECT_EQ(nullptr, result2);
Luke Huang483cf332019-06-03 17:24:51 +0800984 EXPECT_EQ(1U, GetNumQueries(dns0, host_name2));
985 EXPECT_EQ(1U, GetNumQueries(dns1, host_name2));
Mike Yu532405f2020-06-17 17:46:44 +0800986 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, RCODE_TIMEOUT, host_name2, {});
Ken Chenb9fa2062018-11-13 21:51:13 +0800987}
988
989TEST_F(ResolverTest, GetAddrInfoV6_concurrent) {
Xiao Ma09b71022018-12-11 17:56:32 +0900990 constexpr char listen_addr0[] = "127.0.0.9";
991 constexpr char listen_addr1[] = "127.0.0.10";
992 constexpr char listen_addr2[] = "127.0.0.11";
993 constexpr char host_name[] = "konbanha.example.com.";
994
995 test::DNSResponder dns0(listen_addr0);
996 test::DNSResponder dns1(listen_addr1);
997 test::DNSResponder dns2(listen_addr2);
998 StartDns(dns0, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
999 StartDns(dns1, {{host_name, ns_type::ns_t_aaaa, "2001:db8::6"}});
1000 StartDns(dns2, {{host_name, ns_type::ns_t_aaaa, "2001:db8::7"}});
1001
Luke Huangf8215372019-11-22 11:53:41 +08001002 const std::vector<std::string> servers = {listen_addr0, listen_addr1, listen_addr2};
Ken Chenb9fa2062018-11-13 21:51:13 +08001003 std::vector<std::thread> threads(10);
1004 for (std::thread& thread : threads) {
Luke Huangf8215372019-11-22 11:53:41 +08001005 thread = std::thread([this, &servers]() {
1006 unsigned delay = arc4random_uniform(1 * 1000 * 1000); // <= 1s
Ken Chenb9fa2062018-11-13 21:51:13 +08001007 usleep(delay);
1008 std::vector<std::string> serverSubset;
1009 for (const auto& server : servers) {
1010 if (arc4random_uniform(2)) {
1011 serverSubset.push_back(server);
1012 }
1013 }
1014 if (serverSubset.empty()) serverSubset = servers;
Xiao Ma09b71022018-12-11 17:56:32 +09001015 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(serverSubset));
1016 const addrinfo hints = {.ai_family = AF_INET6};
Ken Chenb9fa2062018-11-13 21:51:13 +08001017 addrinfo* result = nullptr;
1018 int rv = getaddrinfo("konbanha", nullptr, &hints, &result);
1019 EXPECT_EQ(0, rv) << "error [" << rv << "] " << gai_strerror(rv);
1020 if (result) {
1021 freeaddrinfo(result);
1022 result = nullptr;
1023 }
1024 });
1025 }
1026 for (std::thread& thread : threads) {
1027 thread.join();
1028 }
Ken Chen92bed612018-12-22 21:46:55 +08001029
1030 std::vector<std::string> res_servers;
1031 std::vector<std::string> res_domains;
1032 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001033 res_params res_params;
Ken Chen92bed612018-12-22 21:46:55 +08001034 std::vector<ResolverStats> res_stats;
1035 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001036 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1037 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1038 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chen92bed612018-12-22 21:46:55 +08001039 EXPECT_EQ(0, wait_for_pending_req_timeout_count);
Ken Chenb9fa2062018-11-13 21:51:13 +08001040}
1041
Mike Yu8ac63402019-12-02 15:28:38 +08001042TEST_F(ResolverTest, SkipBadServersDueToInternalError) {
1043 constexpr char listen_addr1[] = "fe80::1";
1044 constexpr char listen_addr2[] = "255.255.255.255";
1045 constexpr char listen_addr3[] = "127.0.0.3";
1046
1047 test::DNSResponder dns(listen_addr3);
1048 ASSERT_TRUE(dns.startServer());
1049
1050 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
1051 parcel.servers = {listen_addr1, listen_addr2, listen_addr3};
1052
1053 // Bad servers can be distinguished after two attempts.
1054 parcel.minSamples = 2;
1055 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1056
1057 // Start querying five times.
1058 for (int i = 0; i < 5; i++) {
1059 std::string hostName = StringPrintf("hello%d.com.", i);
1060 dns.addMapping(hostName, ns_type::ns_t_a, "1.2.3.4");
1061 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1062 EXPECT_TRUE(safe_getaddrinfo(hostName.c_str(), nullptr, &hints) != nullptr);
1063 }
1064
Mike Yue2162e52020-03-04 18:43:46 +08001065 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1066 NameserverStats(listen_addr1).setInternalErrors(2),
1067 NameserverStats(listen_addr2).setInternalErrors(2),
1068 NameserverStats(listen_addr3).setSuccesses(5),
1069 };
1070 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
Mike Yu8ac63402019-12-02 15:28:38 +08001071}
1072
1073TEST_F(ResolverTest, SkipBadServersDueToTimeout) {
1074 constexpr char listen_addr1[] = "127.0.0.3";
1075 constexpr char listen_addr2[] = "127.0.0.4";
1076
1077 // Set dns1 non-responsive and dns2 workable.
1078 test::DNSResponder dns1(listen_addr1, test::kDefaultListenService, static_cast<ns_rcode>(-1));
1079 test::DNSResponder dns2(listen_addr2);
1080 dns1.setResponseProbability(0.0);
1081 ASSERT_TRUE(dns1.startServer());
1082 ASSERT_TRUE(dns2.startServer());
1083
1084 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
1085 parcel.servers = {listen_addr1, listen_addr2};
1086
1087 // Bad servers can be distinguished after two attempts.
1088 parcel.minSamples = 2;
1089 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1090
1091 // Start querying five times.
1092 for (int i = 0; i < 5; i++) {
1093 std::string hostName = StringPrintf("hello%d.com.", i);
1094 dns1.addMapping(hostName, ns_type::ns_t_a, "1.2.3.4");
1095 dns2.addMapping(hostName, ns_type::ns_t_a, "1.2.3.5");
1096 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1097 EXPECT_TRUE(safe_getaddrinfo(hostName.c_str(), nullptr, &hints) != nullptr);
1098 }
1099
Mike Yue2162e52020-03-04 18:43:46 +08001100 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1101 NameserverStats(listen_addr1).setTimeouts(2),
1102 NameserverStats(listen_addr2).setSuccesses(5),
1103 };
1104 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
Mike Yu8ac63402019-12-02 15:28:38 +08001105 EXPECT_EQ(dns1.queries().size(), 2U);
1106 EXPECT_EQ(dns2.queries().size(), 5U);
1107}
1108
chenbrucefd837fa2019-10-29 18:35:36 +08001109TEST_F(ResolverTest, GetAddrInfoFromCustTable_InvalidInput) {
1110 constexpr char hostnameNoip[] = "noip.example.com.";
1111 constexpr char hostnameInvalidip[] = "invalidip.example.com.";
1112 const std::vector<aidl::android::net::ResolverHostsParcel> invalidCustHosts = {
1113 {"", hostnameNoip},
1114 {"wrong IP", hostnameInvalidip},
1115 };
1116 test::DNSResponder dns;
1117 StartDns(dns, {});
1118 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
Ken Chena6ac2a62020-04-07 17:25:56 +08001119 resolverParams.resolverOptions.hosts = invalidCustHosts;
chenbrucefd837fa2019-10-29 18:35:36 +08001120 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1121 for (const auto& hostname : {hostnameNoip, hostnameInvalidip}) {
1122 // The query won't get data from customized table because of invalid customized table
1123 // and DNSResponder also has no records. hostnameNoip has never registered and
1124 // hostnameInvalidip has registered but wrong IP.
1125 const addrinfo hints = {.ai_family = AF_UNSPEC};
1126 ScopedAddrinfo result = safe_getaddrinfo(hostname, nullptr, &hints);
1127 ASSERT_TRUE(result == nullptr);
1128 EXPECT_EQ(4U, GetNumQueries(dns, hostname));
1129 }
1130}
1131
1132TEST_F(ResolverTest, GetAddrInfoFromCustTable) {
1133 constexpr char hostnameV4[] = "v4only.example.com.";
1134 constexpr char hostnameV6[] = "v6only.example.com.";
1135 constexpr char hostnameV4V6[] = "v4v6.example.com.";
1136 constexpr char custAddrV4[] = "1.2.3.4";
1137 constexpr char custAddrV6[] = "::1.2.3.4";
1138 constexpr char dnsSvAddrV4[] = "1.2.3.5";
1139 constexpr char dnsSvAddrV6[] = "::1.2.3.5";
1140 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4 = {
1141 {custAddrV4, hostnameV4},
1142 };
1143 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV6 = {
1144 {custAddrV6, hostnameV6},
1145 };
1146 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4V6 = {
1147 {custAddrV4, hostnameV4V6},
1148 {custAddrV6, hostnameV4V6},
1149 };
1150 const std::vector<DnsRecord> dnsSvHostV4 = {
1151 {hostnameV4, ns_type::ns_t_a, dnsSvAddrV4},
1152 };
1153 const std::vector<DnsRecord> dnsSvHostV6 = {
1154 {hostnameV6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1155 };
1156 const std::vector<DnsRecord> dnsSvHostV4V6 = {
1157 {hostnameV4V6, ns_type::ns_t_a, dnsSvAddrV4},
1158 {hostnameV4V6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1159 };
1160 struct TestConfig {
1161 const std::string name;
1162 const std::vector<aidl::android::net::ResolverHostsParcel> customizedHosts;
1163 const std::vector<DnsRecord> dnsserverHosts;
1164 const std::vector<std::string> queryResult;
1165 std::string asParameters() const {
1166 return StringPrintf("name: %s, customizedHosts: %s, dnsserverHosts: %s", name.c_str(),
1167 customizedHosts.empty() ? "No" : "Yes",
1168 dnsserverHosts.empty() ? "No" : "Yes");
1169 }
1170 } testConfigs[]{
1171 // clang-format off
1172 {hostnameV4, {}, {}, {}},
1173 {hostnameV4, {}, dnsSvHostV4, {dnsSvAddrV4}},
1174 {hostnameV4, custHostV4, {}, {custAddrV4}},
1175 {hostnameV4, custHostV4, dnsSvHostV4, {custAddrV4}},
1176 {hostnameV6, {}, {}, {}},
1177 {hostnameV6, {}, dnsSvHostV6, {dnsSvAddrV6}},
1178 {hostnameV6, custHostV6, {}, {custAddrV6}},
1179 {hostnameV6, custHostV6, dnsSvHostV6, {custAddrV6}},
1180 {hostnameV4V6, {}, {}, {}},
1181 {hostnameV4V6, {}, dnsSvHostV4V6, {dnsSvAddrV4, dnsSvAddrV6}},
1182 {hostnameV4V6, custHostV4V6, {}, {custAddrV4, custAddrV6}},
1183 {hostnameV4V6, custHostV4V6, dnsSvHostV4V6, {custAddrV4, custAddrV6}},
1184 // clang-format on
1185 };
1186
1187 for (const auto& config : testConfigs) {
1188 SCOPED_TRACE(config.asParameters());
1189
1190 test::DNSResponder dns;
1191 StartDns(dns, config.dnsserverHosts);
1192
1193 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
Ken Chena6ac2a62020-04-07 17:25:56 +08001194 resolverParams.resolverOptions.hosts = config.customizedHosts;
chenbrucefd837fa2019-10-29 18:35:36 +08001195 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1196 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM};
1197 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
1198 if (config.customizedHosts.empty() && config.dnsserverHosts.empty()) {
1199 ASSERT_TRUE(result == nullptr);
1200 EXPECT_EQ(2U, GetNumQueries(dns, config.name.c_str()));
1201 } else {
1202 ASSERT_TRUE(result != nullptr);
1203 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(config.queryResult));
1204 EXPECT_EQ(config.customizedHosts.empty() ? 2U : 0U,
1205 GetNumQueries(dns, config.name.c_str()));
1206 }
1207
1208 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
1209 }
1210}
1211
1212TEST_F(ResolverTest, GetAddrInfoFromCustTable_Modify) {
1213 constexpr char hostnameV4V6[] = "v4v6.example.com.";
1214 constexpr char custAddrV4[] = "1.2.3.4";
1215 constexpr char custAddrV6[] = "::1.2.3.4";
1216 constexpr char dnsSvAddrV4[] = "1.2.3.5";
1217 constexpr char dnsSvAddrV6[] = "::1.2.3.5";
1218 const std::vector<DnsRecord> dnsSvHostV4V6 = {
1219 {hostnameV4V6, ns_type::ns_t_a, dnsSvAddrV4},
1220 {hostnameV4V6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1221 };
1222 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4V6 = {
1223 {custAddrV4, hostnameV4V6},
1224 {custAddrV6, hostnameV4V6},
1225 };
1226 test::DNSResponder dns;
1227 StartDns(dns, dnsSvHostV4V6);
1228 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1229
Ken Chena6ac2a62020-04-07 17:25:56 +08001230 resolverParams.resolverOptions.hosts = custHostV4V6;
chenbrucefd837fa2019-10-29 18:35:36 +08001231 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1232 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM};
1233 ScopedAddrinfo result = safe_getaddrinfo(hostnameV4V6, nullptr, &hints);
1234 ASSERT_TRUE(result != nullptr);
1235 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray({custAddrV4, custAddrV6}));
1236 EXPECT_EQ(0U, GetNumQueries(dns, hostnameV4V6));
1237
Ken Chena6ac2a62020-04-07 17:25:56 +08001238 resolverParams.resolverOptions.hosts = {};
chenbrucefd837fa2019-10-29 18:35:36 +08001239 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1240 result = safe_getaddrinfo(hostnameV4V6, nullptr, &hints);
1241 ASSERT_TRUE(result != nullptr);
1242 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray({dnsSvAddrV4, dnsSvAddrV6}));
1243 EXPECT_EQ(2U, GetNumQueries(dns, hostnameV4V6));
1244}
1245
Ken Chenb9fa2062018-11-13 21:51:13 +08001246TEST_F(ResolverTest, EmptySetup) {
Ken Chenb9fa2062018-11-13 21:51:13 +08001247 std::vector<std::string> servers;
1248 std::vector<std::string> domains;
Xiao Ma09b71022018-12-11 17:56:32 +09001249 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001250 std::vector<std::string> res_servers;
1251 std::vector<std::string> res_domains;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001252 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001253 res_params res_params;
Ken Chenb9fa2062018-11-13 21:51:13 +08001254 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +08001255 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001256 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1257 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1258 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chenb9fa2062018-11-13 21:51:13 +08001259 EXPECT_EQ(0U, res_servers.size());
1260 EXPECT_EQ(0U, res_domains.size());
Mike Yu0a1c53d2018-11-26 13:26:21 +09001261 EXPECT_EQ(0U, res_tls_servers.size());
Luke Huang5bd827c2019-03-14 16:10:04 +08001262 ASSERT_EQ(static_cast<size_t>(IDnsResolver::RESOLVER_PARAMS_COUNT), kDefaultParams.size());
1263 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY],
1264 res_params.sample_validity);
1265 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001266 res_params.success_threshold);
Luke Huang5bd827c2019-03-14 16:10:04 +08001267 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
1268 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
1269 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
Ken Chenb9fa2062018-11-13 21:51:13 +08001270 res_params.base_timeout_msec);
Luke Huang5bd827c2019-03-14 16:10:04 +08001271 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_RETRY_COUNT], res_params.retry_count);
Ken Chenb9fa2062018-11-13 21:51:13 +08001272}
1273
1274TEST_F(ResolverTest, SearchPathChange) {
Xiao Ma09b71022018-12-11 17:56:32 +09001275 constexpr char listen_addr[] = "127.0.0.13";
1276 constexpr char host_name1[] = "test13.domain1.org.";
1277 constexpr char host_name2[] = "test13.domain2.org.";
Luke Huangf8215372019-11-22 11:53:41 +08001278 std::vector<std::string> servers = {listen_addr};
1279 std::vector<std::string> domains = {"domain1.org"};
Xiao Ma09b71022018-12-11 17:56:32 +09001280
1281 const std::vector<DnsRecord> records = {
1282 {host_name1, ns_type::ns_t_aaaa, "2001:db8::13"},
1283 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1:13"},
1284 };
1285 test::DNSResponder dns(listen_addr);
1286 StartDns(dns, records);
1287 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001288
1289 const addrinfo hints = {.ai_family = AF_INET6};
1290 ScopedAddrinfo result = safe_getaddrinfo("test13", nullptr, &hints);
1291 EXPECT_TRUE(result != nullptr);
1292 EXPECT_EQ(1U, dns.queries().size());
1293 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
1294 EXPECT_EQ("2001:db8::13", ToString(result));
1295
1296 // Test that changing the domain search path on its own works.
Luke Huangf8215372019-11-22 11:53:41 +08001297 domains = {"domain2.org"};
Xiao Ma09b71022018-12-11 17:56:32 +09001298 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001299 dns.clearQueries();
1300
1301 result = safe_getaddrinfo("test13", nullptr, &hints);
1302 EXPECT_TRUE(result != nullptr);
1303 EXPECT_EQ(1U, dns.queries().size());
1304 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
1305 EXPECT_EQ("2001:db8::1:13", ToString(result));
1306}
1307
Luke Huang2dac4382019-06-24 13:28:44 +08001308namespace {
1309
Luke Huangf8215372019-11-22 11:53:41 +08001310std::vector<std::string> getResolverDomains(aidl::android::net::IDnsResolver* dnsResolverService,
Luke Huang2dac4382019-06-24 13:28:44 +08001311 unsigned netId) {
1312 std::vector<std::string> res_servers;
1313 std::vector<std::string> res_domains;
1314 std::vector<std::string> res_tls_servers;
1315 res_params res_params;
1316 std::vector<ResolverStats> res_stats;
1317 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001318 DnsResponderClient::GetResolverInfo(dnsResolverService, netId, &res_servers, &res_domains,
1319 &res_tls_servers, &res_params, &res_stats,
1320 &wait_for_pending_req_timeout_count);
Luke Huang2dac4382019-06-24 13:28:44 +08001321 return res_domains;
1322}
1323
1324} // namespace
1325
1326TEST_F(ResolverTest, SearchPathPrune) {
1327 constexpr size_t DUPLICATED_DOMAIN_NUM = 3;
1328 constexpr char listen_addr[] = "127.0.0.13";
1329 constexpr char domian_name1[] = "domain13.org.";
1330 constexpr char domian_name2[] = "domain14.org.";
1331 constexpr char host_name1[] = "test13.domain13.org.";
1332 constexpr char host_name2[] = "test14.domain14.org.";
1333 std::vector<std::string> servers = {listen_addr};
1334
1335 std::vector<std::string> testDomains1;
1336 std::vector<std::string> testDomains2;
1337 // Domain length should be <= 255
1338 // Max number of domains in search path is 6
1339 for (size_t i = 0; i < MAXDNSRCH + 1; i++) {
1340 // Fill up with invalid domain
1341 testDomains1.push_back(std::string(300, i + '0'));
1342 // Fill up with valid but duplicated domain
1343 testDomains2.push_back(StringPrintf("domain%zu.org", i % DUPLICATED_DOMAIN_NUM));
1344 }
1345
1346 // Add valid domain used for query.
1347 testDomains1.push_back(domian_name1);
1348
1349 // Add valid domain twice used for query.
1350 testDomains2.push_back(domian_name2);
1351 testDomains2.push_back(domian_name2);
1352
1353 const std::vector<DnsRecord> records = {
1354 {host_name1, ns_type::ns_t_aaaa, "2001:db8::13"},
1355 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1:13"},
1356 };
1357 test::DNSResponder dns(listen_addr);
1358 StartDns(dns, records);
1359 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, testDomains1));
1360
1361 const addrinfo hints = {.ai_family = AF_INET6};
1362 ScopedAddrinfo result = safe_getaddrinfo("test13", nullptr, &hints);
1363
1364 EXPECT_TRUE(result != nullptr);
1365
1366 EXPECT_EQ(1U, dns.queries().size());
1367 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
1368 EXPECT_EQ("2001:db8::13", ToString(result));
1369
1370 const auto& res_domains1 = getResolverDomains(mDnsClient.resolvService(), TEST_NETID);
1371 // Expect 1 valid domain, invalid domains are removed.
1372 ASSERT_EQ(1U, res_domains1.size());
1373 EXPECT_EQ(domian_name1, res_domains1[0]);
1374
1375 dns.clearQueries();
1376
1377 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, testDomains2));
1378
1379 result = safe_getaddrinfo("test14", nullptr, &hints);
1380 EXPECT_TRUE(result != nullptr);
1381
1382 // (3 domains * 2 retries) + 1 success query = 7
1383 EXPECT_EQ(7U, dns.queries().size());
1384 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
1385 EXPECT_EQ("2001:db8::1:13", ToString(result));
1386
1387 const auto& res_domains2 = getResolverDomains(mDnsClient.resolvService(), TEST_NETID);
1388 // Expect 4 valid domain, duplicate domains are removed.
1389 EXPECT_EQ(DUPLICATED_DOMAIN_NUM + 1U, res_domains2.size());
1390 EXPECT_THAT(
1391 std::vector<std::string>({"domain0.org", "domain1.org", "domain2.org", domian_name2}),
1392 testing::ElementsAreArray(res_domains2));
1393}
1394
Mike Yu0a1c53d2018-11-26 13:26:21 +09001395// If we move this function to dns_responder_client, it will complicate the dependency need of
1396// dns_tls_frontend.h.
1397static void setupTlsServers(const std::vector<std::string>& servers,
waynema0e73c2e2019-07-31 15:04:08 +08001398 std::vector<std::unique_ptr<test::DnsTlsFrontend>>* tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001399 constexpr char listen_udp[] = "53";
1400 constexpr char listen_tls[] = "853";
Mike Yu0a1c53d2018-11-26 13:26:21 +09001401
1402 for (const auto& server : servers) {
1403 auto t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
1404 t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
1405 t->startServer();
Mike Yu0a1c53d2018-11-26 13:26:21 +09001406 tls->push_back(std::move(t));
1407 }
1408}
1409
Mike Yu0a1c53d2018-11-26 13:26:21 +09001410TEST_F(ResolverTest, MaxServerPrune_Binder) {
Mike Yu0a1c53d2018-11-26 13:26:21 +09001411 std::vector<std::string> domains;
1412 std::vector<std::unique_ptr<test::DNSResponder>> dns;
1413 std::vector<std::unique_ptr<test::DnsTlsFrontend>> tls;
1414 std::vector<std::string> servers;
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001415 std::vector<DnsResponderClient::Mapping> mappings;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001416
1417 for (unsigned i = 0; i < MAXDNSRCH + 1; i++) {
1418 domains.push_back(StringPrintf("example%u.com", i));
1419 }
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001420 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupMappings(1, domains, &mappings));
1421 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupDNSServers(MAXNS + 1, mappings, &dns, &servers));
waynema0e73c2e2019-07-31 15:04:08 +08001422 ASSERT_NO_FATAL_FAILURE(setupTlsServers(servers, &tls));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001423
waynema0e73c2e2019-07-31 15:04:08 +08001424 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, domains, kDefaultParams,
1425 kDefaultPrivateDnsHostName));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001426
Mike Yu383855b2019-01-15 17:53:27 +08001427 // If the private DNS validation hasn't completed yet before backend DNS servers stop,
1428 // TLS servers will get stuck in handleOneRequest(), which causes this test stuck in
1429 // ~DnsTlsFrontend() because the TLS server loop threads can't be terminated.
1430 // So, wait for private DNS validation done before stopping backend DNS servers.
1431 for (int i = 0; i < MAXNS; i++) {
chenbruceaff85842019-05-31 15:46:42 +08001432 LOG(INFO) << "Waiting for private DNS validation on " << tls[i]->listen_address() << ".";
Mike Yu724f77d2019-08-16 11:14:50 +08001433 EXPECT_TRUE(WaitForPrivateDnsValidation(tls[i]->listen_address(), true));
chenbruceaff85842019-05-31 15:46:42 +08001434 LOG(INFO) << "private DNS validation on " << tls[i]->listen_address() << " done.";
Mike Yu383855b2019-01-15 17:53:27 +08001435 }
1436
Mike Yu0a1c53d2018-11-26 13:26:21 +09001437 std::vector<std::string> res_servers;
1438 std::vector<std::string> res_domains;
1439 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001440 res_params res_params;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001441 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +08001442 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001443 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1444 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1445 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001446
1447 // Check the size of the stats and its contents.
1448 EXPECT_EQ(static_cast<size_t>(MAXNS), res_servers.size());
1449 EXPECT_EQ(static_cast<size_t>(MAXNS), res_tls_servers.size());
1450 EXPECT_EQ(static_cast<size_t>(MAXDNSRCH), res_domains.size());
1451 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_servers.begin()));
1452 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_tls_servers.begin()));
1453 EXPECT_TRUE(std::equal(domains.begin(), domains.begin() + MAXDNSRCH, res_domains.begin()));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001454}
1455
1456TEST_F(ResolverTest, ResolverStats) {
Xiao Ma09b71022018-12-11 17:56:32 +09001457 constexpr char listen_addr1[] = "127.0.0.4";
1458 constexpr char listen_addr2[] = "127.0.0.5";
1459 constexpr char listen_addr3[] = "127.0.0.6";
Mike Yu0a1c53d2018-11-26 13:26:21 +09001460
1461 // Set server 1 timeout.
Mike Yufc125e42019-05-15 20:41:28 +08001462 test::DNSResponder dns1(listen_addr1, "53", static_cast<ns_rcode>(-1));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001463 dns1.setResponseProbability(0.0);
1464 ASSERT_TRUE(dns1.startServer());
1465
1466 // Set server 2 responding server failure.
Xiao Ma09b71022018-12-11 17:56:32 +09001467 test::DNSResponder dns2(listen_addr2);
Mike Yu0a1c53d2018-11-26 13:26:21 +09001468 dns2.setResponseProbability(0.0);
1469 ASSERT_TRUE(dns2.startServer());
1470
1471 // Set server 3 workable.
Xiao Ma09b71022018-12-11 17:56:32 +09001472 test::DNSResponder dns3(listen_addr3);
1473 dns3.addMapping(kHelloExampleCom, ns_type::ns_t_a, "1.2.3.4");
Mike Yu0a1c53d2018-11-26 13:26:21 +09001474 ASSERT_TRUE(dns3.startServer());
1475
1476 std::vector<std::string> servers = {listen_addr1, listen_addr2, listen_addr3};
Xiao Ma09b71022018-12-11 17:56:32 +09001477 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001478
1479 dns3.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +09001480 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
Mike Yu0a1c53d2018-11-26 13:26:21 +09001481 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
Xiao Ma09b71022018-12-11 17:56:32 +09001482 size_t found = GetNumQueries(dns3, kHelloExampleCom);
Mike Yu0a1c53d2018-11-26 13:26:21 +09001483 EXPECT_LE(1U, found);
1484 std::string result_str = ToString(result);
1485 EXPECT_TRUE(result_str == "1.2.3.4") << ", result_str='" << result_str << "'";
1486
Mike Yue2162e52020-03-04 18:43:46 +08001487 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1488 NameserverStats(listen_addr1).setTimeouts(1),
1489 NameserverStats(listen_addr2).setErrors(1),
1490 NameserverStats(listen_addr3).setSuccesses(1),
1491 };
1492 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001493}
1494
Mike Yu15791832020-02-11 13:38:48 +08001495TEST_F(ResolverTest, AlwaysUseLatestSetupParamsInLookups) {
1496 constexpr char listen_addr1[] = "127.0.0.3";
1497 constexpr char listen_addr2[] = "255.255.255.255";
1498 constexpr char listen_addr3[] = "127.0.0.4";
1499 constexpr char hostname[] = "hello";
1500 constexpr char fqdn_with_search_domain[] = "hello.domain2.com.";
1501
1502 test::DNSResponder dns1(listen_addr1, test::kDefaultListenService, static_cast<ns_rcode>(-1));
1503 dns1.setResponseProbability(0.0);
1504 ASSERT_TRUE(dns1.startServer());
1505
1506 test::DNSResponder dns3(listen_addr3);
1507 StartDns(dns3, {{fqdn_with_search_domain, ns_type::ns_t_a, "1.2.3.4"}});
1508
1509 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
1510 parcel.tlsServers.clear();
1511 parcel.servers = {listen_addr1, listen_addr2};
1512 parcel.domains = {"domain1.com", "domain2.com"};
1513 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1514
1515 // Expect the things happening in t1:
1516 // 1. The lookup starts using the first domain for query. It sends queries to the populated
1517 // nameserver list {listen_addr1, listen_addr2} for the hostname "hello.domain1.com".
1518 // 2. A different list of nameservers is updated to the resolver. Revision ID is incremented.
1519 // 3. The query for the hostname times out. The lookup fails to add the timeout record to the
1520 // the stats because of the unmatched revision ID.
1521 // 4. The lookup starts using the second domain for query. It sends queries to the populated
1522 // nameserver list {listen_addr3, listen_addr1, listen_addr2} for another hostname
1523 // "hello.domain2.com".
1524 // 5. The lookup gets the answer and updates a success record to the stats.
1525 std::thread t1([&hostname]() {
1526 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1527 ScopedAddrinfo result = safe_getaddrinfo(hostname, nullptr, &hints);
1528 EXPECT_NE(result.get(), nullptr);
1529 EXPECT_EQ(ToString(result), "1.2.3.4");
1530 });
1531
1532 // Wait for t1 to start the step 1.
1533 while (dns1.queries().size() == 0) {
1534 usleep(1000);
1535 }
1536
1537 // Update the resolver with three nameservers. This will increment the revision ID.
1538 parcel.servers = {listen_addr3, listen_addr1, listen_addr2};
1539 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1540
1541 t1.join();
1542 EXPECT_EQ(0U, GetNumQueriesForType(dns3, ns_type::ns_t_aaaa, fqdn_with_search_domain));
1543 EXPECT_EQ(1U, GetNumQueriesForType(dns3, ns_type::ns_t_a, fqdn_with_search_domain));
1544
Mike Yue2162e52020-03-04 18:43:46 +08001545 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1546 NameserverStats(listen_addr1),
1547 NameserverStats(listen_addr2),
1548 NameserverStats(listen_addr3).setSuccesses(1),
1549 };
1550 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
Mike Yu15791832020-02-11 13:38:48 +08001551}
1552
Ken Chenb9fa2062018-11-13 21:51:13 +08001553// Test what happens if the specified TLS server is nonexistent.
1554TEST_F(ResolverTest, GetHostByName_TlsMissing) {
Xiao Ma09b71022018-12-11 17:56:32 +09001555 constexpr char listen_addr[] = "127.0.0.3";
1556 constexpr char host_name[] = "tlsmissing.example.com.";
1557
1558 test::DNSResponder dns;
1559 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.3"}});
Luke Huangf8215372019-11-22 11:53:41 +08001560 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001561
1562 // There's nothing listening on this address, so validation will either fail or
1563 /// hang. Either way, queries will continue to flow to the DNSResponder.
waynema0e73c2e2019-07-31 15:04:08 +08001564 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Ken Chenb9fa2062018-11-13 21:51:13 +08001565
1566 const hostent* result;
1567
1568 result = gethostbyname("tlsmissing");
1569 ASSERT_FALSE(result == nullptr);
1570 EXPECT_EQ("1.2.3.3", ToString(result));
1571
1572 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001573 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001574}
1575
1576// Test what happens if the specified TLS server replies with garbage.
1577TEST_F(ResolverTest, GetHostByName_TlsBroken) {
Xiao Ma09b71022018-12-11 17:56:32 +09001578 constexpr char listen_addr[] = "127.0.0.3";
1579 constexpr char host_name1[] = "tlsbroken1.example.com.";
1580 constexpr char host_name2[] = "tlsbroken2.example.com.";
1581 const std::vector<DnsRecord> records = {
1582 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1583 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1584 };
1585
1586 test::DNSResponder dns;
1587 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001588 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001589
1590 // Bind the specified private DNS socket but don't respond to any client sockets yet.
1591 int s = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, IPPROTO_TCP);
1592 ASSERT_TRUE(s >= 0);
1593 struct sockaddr_in tlsServer = {
Luke Huangf8215372019-11-22 11:53:41 +08001594 .sin_family = AF_INET,
1595 .sin_port = htons(853),
Ken Chenb9fa2062018-11-13 21:51:13 +08001596 };
1597 ASSERT_TRUE(inet_pton(AF_INET, listen_addr, &tlsServer.sin_addr));
1598 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEPORT).ok());
1599 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEADDR).ok());
1600 ASSERT_FALSE(bind(s, reinterpret_cast<struct sockaddr*>(&tlsServer), sizeof(tlsServer)));
1601 ASSERT_FALSE(listen(s, 1));
1602
1603 // Trigger TLS validation.
waynema0e73c2e2019-07-31 15:04:08 +08001604 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Ken Chenb9fa2062018-11-13 21:51:13 +08001605
1606 struct sockaddr_storage cliaddr;
1607 socklen_t sin_size = sizeof(cliaddr);
Luke Huangf8215372019-11-22 11:53:41 +08001608 int new_fd = accept4(s, reinterpret_cast<struct sockaddr*>(&cliaddr), &sin_size, SOCK_CLOEXEC);
Ken Chenb9fa2062018-11-13 21:51:13 +08001609 ASSERT_TRUE(new_fd > 0);
1610
1611 // We've received the new file descriptor but not written to it or closed, so the
1612 // validation is still pending. Queries should still flow correctly because the
1613 // server is not used until validation succeeds.
1614 const hostent* result;
1615 result = gethostbyname("tlsbroken1");
1616 ASSERT_FALSE(result == nullptr);
1617 EXPECT_EQ("1.2.3.1", ToString(result));
1618
1619 // Now we cause the validation to fail.
1620 std::string garbage = "definitely not a valid TLS ServerHello";
1621 write(new_fd, garbage.data(), garbage.size());
1622 close(new_fd);
1623
1624 // Validation failure shouldn't interfere with lookups, because lookups won't be sent
1625 // to the TLS server unless validation succeeds.
1626 result = gethostbyname("tlsbroken2");
1627 ASSERT_FALSE(result == nullptr);
1628 EXPECT_EQ("1.2.3.2", ToString(result));
1629
1630 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001631 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001632 close(s);
1633}
1634
1635TEST_F(ResolverTest, GetHostByName_Tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001636 constexpr char listen_addr[] = "127.0.0.3";
1637 constexpr char listen_udp[] = "53";
1638 constexpr char listen_tls[] = "853";
1639 constexpr char host_name1[] = "tls1.example.com.";
1640 constexpr char host_name2[] = "tls2.example.com.";
1641 constexpr char host_name3[] = "tls3.example.com.";
1642 const std::vector<DnsRecord> records = {
1643 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1644 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1645 {host_name3, ns_type::ns_t_a, "1.2.3.3"},
1646 };
1647
1648 test::DNSResponder dns;
1649 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001650 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001651
1652 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1653 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001654 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08001655 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001656
Mike Yu724f77d2019-08-16 11:14:50 +08001657 const hostent* result = gethostbyname("tls1");
Ken Chenb9fa2062018-11-13 21:51:13 +08001658 ASSERT_FALSE(result == nullptr);
1659 EXPECT_EQ("1.2.3.1", ToString(result));
1660
1661 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001662 EXPECT_TRUE(tls.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001663
1664 // Stop the TLS server. Since we're in opportunistic mode, queries will
1665 // fall back to the locally-assigned (clear text) nameservers.
1666 tls.stopServer();
1667
1668 dns.clearQueries();
1669 result = gethostbyname("tls2");
1670 EXPECT_FALSE(result == nullptr);
1671 EXPECT_EQ("1.2.3.2", ToString(result));
1672 const auto queries = dns.queries();
1673 EXPECT_EQ(1U, queries.size());
waynema29253052019-08-20 11:26:08 +08001674 EXPECT_EQ("tls2.example.com.", queries[0].name);
1675 EXPECT_EQ(ns_t_a, queries[0].type);
Ken Chenb9fa2062018-11-13 21:51:13 +08001676
1677 // Reset the resolvers without enabling TLS. Queries should still be routed
1678 // to the UDP endpoint.
Xiao Ma09b71022018-12-11 17:56:32 +09001679 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001680
1681 result = gethostbyname("tls3");
1682 ASSERT_FALSE(result == nullptr);
1683 EXPECT_EQ("1.2.3.3", ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +08001684}
1685
Ken Chenb9fa2062018-11-13 21:51:13 +08001686TEST_F(ResolverTest, GetHostByName_TlsFailover) {
Xiao Ma09b71022018-12-11 17:56:32 +09001687 constexpr char listen_addr1[] = "127.0.0.3";
1688 constexpr char listen_addr2[] = "127.0.0.4";
1689 constexpr char listen_udp[] = "53";
1690 constexpr char listen_tls[] = "853";
1691 constexpr char host_name1[] = "tlsfailover1.example.com.";
1692 constexpr char host_name2[] = "tlsfailover2.example.com.";
1693 const std::vector<DnsRecord> records1 = {
1694 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1695 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1696 };
1697 const std::vector<DnsRecord> records2 = {
1698 {host_name1, ns_type::ns_t_a, "1.2.3.3"},
1699 {host_name2, ns_type::ns_t_a, "1.2.3.4"},
1700 };
1701
1702 test::DNSResponder dns1(listen_addr1);
1703 test::DNSResponder dns2(listen_addr2);
1704 StartDns(dns1, records1);
1705 StartDns(dns2, records2);
1706
Luke Huangf8215372019-11-22 11:53:41 +08001707 std::vector<std::string> servers = {listen_addr1, listen_addr2};
Ken Chenb9fa2062018-11-13 21:51:13 +08001708
1709 test::DnsTlsFrontend tls1(listen_addr1, listen_tls, listen_addr1, listen_udp);
1710 test::DnsTlsFrontend tls2(listen_addr2, listen_tls, listen_addr2, listen_udp);
1711 ASSERT_TRUE(tls1.startServer());
1712 ASSERT_TRUE(tls2.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001713 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1714 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08001715 EXPECT_TRUE(WaitForPrivateDnsValidation(tls1.listen_address(), true));
1716 EXPECT_TRUE(WaitForPrivateDnsValidation(tls2.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001717
Mike Yu724f77d2019-08-16 11:14:50 +08001718 const hostent* result = gethostbyname("tlsfailover1");
Ken Chenb9fa2062018-11-13 21:51:13 +08001719 ASSERT_FALSE(result == nullptr);
1720 EXPECT_EQ("1.2.3.1", ToString(result));
1721
1722 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001723 EXPECT_TRUE(tls1.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001724 // No new queries should have reached tls2.
Luke Huang0a0870d2020-02-12 20:41:10 +08001725 EXPECT_TRUE(tls2.waitForQueries(1));
Ken Chenb9fa2062018-11-13 21:51:13 +08001726
1727 // Stop tls1. Subsequent queries should attempt to reach tls1, fail, and retry to tls2.
1728 tls1.stopServer();
1729
1730 result = gethostbyname("tlsfailover2");
1731 EXPECT_EQ("1.2.3.4", ToString(result));
1732
1733 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001734 EXPECT_TRUE(tls2.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001735
1736 // No additional queries should have reached the insecure servers.
1737 EXPECT_EQ(2U, dns1.queries().size());
1738 EXPECT_EQ(2U, dns2.queries().size());
1739
1740 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001741 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Ken Chenb9fa2062018-11-13 21:51:13 +08001742}
1743
1744TEST_F(ResolverTest, GetHostByName_BadTlsName) {
Xiao Ma09b71022018-12-11 17:56:32 +09001745 constexpr char listen_addr[] = "127.0.0.3";
1746 constexpr char listen_udp[] = "53";
1747 constexpr char listen_tls[] = "853";
1748 constexpr char host_name[] = "badtlsname.example.com.";
1749
1750 test::DNSResponder dns;
1751 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.1"}});
Luke Huangf8215372019-11-22 11:53:41 +08001752 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001753
1754 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1755 ASSERT_TRUE(tls.startServer());
Xiao Ma09b71022018-12-11 17:56:32 +09001756 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
waynema0e73c2e2019-07-31 15:04:08 +08001757 kDefaultIncorrectPrivateDnsHostName));
Ken Chenb9fa2062018-11-13 21:51:13 +08001758
waynema0e73c2e2019-07-31 15:04:08 +08001759 // The TLS handshake would fail because the name of TLS server doesn't
1760 // match with TLS server's certificate.
Mike Yu724f77d2019-08-16 11:14:50 +08001761 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), false));
Ken Chenb9fa2062018-11-13 21:51:13 +08001762
1763 // The query should fail hard, because a name was specified.
1764 EXPECT_EQ(nullptr, gethostbyname("badtlsname"));
1765
1766 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001767 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001768}
1769
1770TEST_F(ResolverTest, GetAddrInfo_Tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001771 constexpr char listen_addr[] = "127.0.0.3";
1772 constexpr char listen_udp[] = "53";
1773 constexpr char listen_tls[] = "853";
1774 constexpr char host_name[] = "addrinfotls.example.com.";
1775 const std::vector<DnsRecord> records = {
1776 {host_name, ns_type::ns_t_a, "1.2.3.4"},
1777 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
1778 };
1779
1780 test::DNSResponder dns;
1781 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001782 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001783
1784 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1785 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001786 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1787 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08001788 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001789
1790 dns.clearQueries();
1791 ScopedAddrinfo result = safe_getaddrinfo("addrinfotls", nullptr, nullptr);
1792 EXPECT_TRUE(result != nullptr);
1793 size_t found = GetNumQueries(dns, host_name);
1794 EXPECT_LE(1U, found);
1795 // Could be A or AAAA
1796 std::string result_str = ToString(result);
1797 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +08001798 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08001799 // Wait for both A and AAAA queries to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001800 EXPECT_TRUE(tls.waitForQueries(3));
Ken Chenb9fa2062018-11-13 21:51:13 +08001801
1802 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001803 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001804}
1805
1806TEST_F(ResolverTest, TlsBypass) {
1807 const char OFF[] = "off";
1808 const char OPPORTUNISTIC[] = "opportunistic";
1809 const char STRICT[] = "strict";
1810
1811 const char GETHOSTBYNAME[] = "gethostbyname";
1812 const char GETADDRINFO[] = "getaddrinfo";
1813 const char GETADDRINFOFORNET[] = "getaddrinfofornet";
1814
1815 const unsigned BYPASS_NETID = NETID_USE_LOCAL_NAMESERVERS | TEST_NETID;
1816
Ken Chenb9fa2062018-11-13 21:51:13 +08001817 const char ADDR4[] = "192.0.2.1";
1818 const char ADDR6[] = "2001:db8::1";
1819
1820 const char cleartext_addr[] = "127.0.0.53";
1821 const char cleartext_port[] = "53";
1822 const char tls_port[] = "853";
Luke Huangf8215372019-11-22 11:53:41 +08001823 const std::vector<std::string> servers = {cleartext_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001824
Xiao Ma09b71022018-12-11 17:56:32 +09001825 test::DNSResponder dns(cleartext_addr);
Ken Chenb9fa2062018-11-13 21:51:13 +08001826 ASSERT_TRUE(dns.startServer());
1827
1828 test::DnsTlsFrontend tls(cleartext_addr, tls_port, cleartext_addr, cleartext_port);
Mike Yudd4ac2d2019-05-31 16:52:11 +08001829 ASSERT_TRUE(tls.startServer());
Ken Chenb9fa2062018-11-13 21:51:13 +08001830
Luke Huangf8215372019-11-22 11:53:41 +08001831 // clang-format off
Ken Chenb9fa2062018-11-13 21:51:13 +08001832 struct TestConfig {
1833 const std::string mode;
1834 const bool withWorkingTLS;
1835 const std::string method;
1836
1837 std::string asHostName() const {
Luke Huangf8215372019-11-22 11:53:41 +08001838 return StringPrintf("%s.%s.%s.", mode.c_str(), withWorkingTLS ? "tlsOn" : "tlsOff",
Ken Chenb9fa2062018-11-13 21:51:13 +08001839 method.c_str());
1840 }
1841 } testConfigs[]{
Ken Chenb9fa2062018-11-13 21:51:13 +08001842 {OFF, true, GETHOSTBYNAME},
1843 {OPPORTUNISTIC, true, GETHOSTBYNAME},
1844 {STRICT, true, GETHOSTBYNAME},
Ken Chenb9fa2062018-11-13 21:51:13 +08001845 {OFF, true, GETADDRINFO},
1846 {OPPORTUNISTIC, true, GETADDRINFO},
1847 {STRICT, true, GETADDRINFO},
Ken Chenb9fa2062018-11-13 21:51:13 +08001848 {OFF, true, GETADDRINFOFORNET},
1849 {OPPORTUNISTIC, true, GETADDRINFOFORNET},
1850 {STRICT, true, GETADDRINFOFORNET},
Mike Yudd4ac2d2019-05-31 16:52:11 +08001851 {OFF, false, GETHOSTBYNAME},
1852 {OPPORTUNISTIC, false, GETHOSTBYNAME},
1853 {STRICT, false, GETHOSTBYNAME},
1854 {OFF, false, GETADDRINFO},
1855 {OPPORTUNISTIC, false, GETADDRINFO},
1856 {STRICT, false, GETADDRINFO},
1857 {OFF, false, GETADDRINFOFORNET},
1858 {OPPORTUNISTIC, false, GETADDRINFOFORNET},
1859 {STRICT, false, GETADDRINFOFORNET},
Ken Chenb9fa2062018-11-13 21:51:13 +08001860 };
Luke Huangf8215372019-11-22 11:53:41 +08001861 // clang-format on
Ken Chenb9fa2062018-11-13 21:51:13 +08001862
1863 for (const auto& config : testConfigs) {
1864 const std::string testHostName = config.asHostName();
1865 SCOPED_TRACE(testHostName);
1866
1867 // Don't tempt test bugs due to caching.
1868 const char* host_name = testHostName.c_str();
1869 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
1870 dns.addMapping(host_name, ns_type::ns_t_aaaa, ADDR6);
1871
Mike Yudd4ac2d2019-05-31 16:52:11 +08001872 if (config.withWorkingTLS) {
1873 if (!tls.running()) {
1874 ASSERT_TRUE(tls.startServer());
1875 }
1876 } else {
1877 if (tls.running()) {
1878 ASSERT_TRUE(tls.stopServer());
1879 }
1880 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001881
1882 if (config.mode == OFF) {
Xiao Ma09b71022018-12-11 17:56:32 +09001883 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, kDefaultSearchDomains,
1884 kDefaultParams));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001885 } else /* OPPORTUNISTIC or STRICT */ {
1886 const char* tls_hostname = (config.mode == STRICT) ? kDefaultPrivateDnsHostName : "";
Xiao Ma09b71022018-12-11 17:56:32 +09001887 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001888 kDefaultParams, tls_hostname));
Mike Yu724f77d2019-08-16 11:14:50 +08001889
1890 // Wait for the validation event. If the server is running, the validation should
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001891 // succeed; otherwise, the validation should fail.
Mike Yu724f77d2019-08-16 11:14:50 +08001892 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), config.withWorkingTLS));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001893 if (config.withWorkingTLS) {
1894 EXPECT_TRUE(tls.waitForQueries(1));
1895 tls.clearQueries();
1896 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001897 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001898
1899 const hostent* h_result = nullptr;
1900 ScopedAddrinfo ai_result;
1901
1902 if (config.method == GETHOSTBYNAME) {
1903 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
1904 h_result = gethostbyname(host_name);
1905
1906 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
1907 ASSERT_FALSE(h_result == nullptr);
1908 ASSERT_EQ(4, h_result->h_length);
1909 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
1910 EXPECT_EQ(ADDR4, ToString(h_result));
1911 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
1912 } else if (config.method == GETADDRINFO) {
1913 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
1914 ai_result = safe_getaddrinfo(host_name, nullptr, nullptr);
1915 EXPECT_TRUE(ai_result != nullptr);
1916
1917 EXPECT_LE(1U, GetNumQueries(dns, host_name));
1918 // Could be A or AAAA
1919 const std::string result_str = ToString(ai_result);
1920 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
Luke Huangf8215372019-11-22 11:53:41 +08001921 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08001922 } else if (config.method == GETADDRINFOFORNET) {
1923 addrinfo* raw_ai_result = nullptr;
1924 EXPECT_EQ(0, android_getaddrinfofornet(host_name, /*servname=*/nullptr,
1925 /*hints=*/nullptr, BYPASS_NETID, MARK_UNSET,
1926 &raw_ai_result));
1927 ai_result.reset(raw_ai_result);
1928
1929 EXPECT_LE(1U, GetNumQueries(dns, host_name));
1930 // Could be A or AAAA
1931 const std::string result_str = ToString(ai_result);
1932 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
Luke Huangf8215372019-11-22 11:53:41 +08001933 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08001934 }
1935
Mike Yudd4ac2d2019-05-31 16:52:11 +08001936 EXPECT_EQ(0, tls.queries());
Ken Chenb9fa2062018-11-13 21:51:13 +08001937
1938 // Clear per-process resolv netid.
1939 ASSERT_EQ(0, setNetworkForResolv(NETID_UNSET));
Ken Chenb9fa2062018-11-13 21:51:13 +08001940 dns.clearQueries();
1941 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001942}
1943
1944TEST_F(ResolverTest, StrictMode_NoTlsServers) {
Xiao Ma09b71022018-12-11 17:56:32 +09001945 constexpr char cleartext_addr[] = "127.0.0.53";
Luke Huangf8215372019-11-22 11:53:41 +08001946 const std::vector<std::string> servers = {cleartext_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09001947 constexpr char host_name[] = "strictmode.notlsips.example.com.";
1948 const std::vector<DnsRecord> records = {
1949 {host_name, ns_type::ns_t_a, "1.2.3.4"},
1950 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
1951 };
Ken Chenb9fa2062018-11-13 21:51:13 +08001952
Xiao Ma09b71022018-12-11 17:56:32 +09001953 test::DNSResponder dns(cleartext_addr);
1954 StartDns(dns, records);
Ken Chenb9fa2062018-11-13 21:51:13 +08001955
waynema0e73c2e2019-07-31 15:04:08 +08001956 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1957 kDefaultIncorrectPrivateDnsHostName));
Ken Chenb9fa2062018-11-13 21:51:13 +08001958
1959 addrinfo* ai_result = nullptr;
1960 EXPECT_NE(0, getaddrinfo(host_name, nullptr, nullptr, &ai_result));
1961 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
1962}
Luke Huang94b10b92018-11-21 20:13:38 +08001963
1964namespace {
1965
Luke Huang70931aa2019-01-31 11:57:41 +08001966int getAsyncResponse(int fd, int* rcode, uint8_t* buf, int bufLen) {
Luke Huang94b10b92018-11-21 20:13:38 +08001967 struct pollfd wait_fd[1];
1968 wait_fd[0].fd = fd;
1969 wait_fd[0].events = POLLIN;
1970 short revents;
1971 int ret;
1972
1973 ret = poll(wait_fd, 1, -1);
1974 revents = wait_fd[0].revents;
1975 if (revents & POLLIN) {
1976 int n = resNetworkResult(fd, rcode, buf, bufLen);
Luke Huangba7bef92018-12-26 16:53:03 +08001977 // Verify that resNetworkResult() closed the fd
1978 char dummy;
1979 EXPECT_EQ(-1, read(fd, &dummy, sizeof dummy));
1980 EXPECT_EQ(EBADF, errno);
Luke Huang94b10b92018-11-21 20:13:38 +08001981 return n;
1982 }
1983 return -1;
1984}
1985
Luke Huang70931aa2019-01-31 11:57:41 +08001986std::string toString(uint8_t* buf, int bufLen, int ipType) {
Luke Huang94b10b92018-11-21 20:13:38 +08001987 ns_msg handle;
1988 int ancount, n = 0;
1989 ns_rr rr;
1990
Luke Huangf8215372019-11-22 11:53:41 +08001991 if (ns_initparse((const uint8_t*)buf, bufLen, &handle) >= 0) {
Luke Huang94b10b92018-11-21 20:13:38 +08001992 ancount = ns_msg_count(handle, ns_s_an);
1993 if (ns_parserr(&handle, ns_s_an, n, &rr) == 0) {
Luke Huang70931aa2019-01-31 11:57:41 +08001994 const uint8_t* rdata = ns_rr_rdata(rr);
Luke Huang94b10b92018-11-21 20:13:38 +08001995 char buffer[INET6_ADDRSTRLEN];
Luke Huangf8215372019-11-22 11:53:41 +08001996 if (inet_ntop(ipType, (const char*)rdata, buffer, sizeof(buffer))) {
Luke Huang94b10b92018-11-21 20:13:38 +08001997 return buffer;
1998 }
1999 }
2000 }
2001 return "";
2002}
2003
2004int dns_open_proxy() {
2005 int s = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
2006 if (s == -1) {
2007 return -1;
2008 }
2009 const int one = 1;
2010 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
2011
2012 static const struct sockaddr_un proxy_addr = {
2013 .sun_family = AF_UNIX,
2014 .sun_path = "/dev/socket/dnsproxyd",
2015 };
2016
Luke Huangf8215372019-11-22 11:53:41 +08002017 if (TEMP_FAILURE_RETRY(connect(s, (const struct sockaddr*)&proxy_addr, sizeof(proxy_addr))) !=
Luke Huang94b10b92018-11-21 20:13:38 +08002018 0) {
2019 close(s);
2020 return -1;
2021 }
2022
2023 return s;
2024}
2025
Luke Huangba7bef92018-12-26 16:53:03 +08002026void expectAnswersValid(int fd, int ipType, const std::string& expectedAnswer) {
2027 int rcode = -1;
2028 uint8_t buf[MAXPACKET] = {};
2029
2030 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2031 EXPECT_GT(res, 0);
2032 EXPECT_EQ(expectedAnswer, toString(buf, res, ipType));
2033}
2034
2035void expectAnswersNotValid(int fd, int expectedErrno) {
2036 int rcode = -1;
2037 uint8_t buf[MAXPACKET] = {};
2038
2039 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2040 EXPECT_EQ(expectedErrno, res);
2041}
2042
Luke Huang94b10b92018-11-21 20:13:38 +08002043} // namespace
2044
2045TEST_F(ResolverTest, Async_NormalQueryV4V6) {
Xiao Ma09b71022018-12-11 17:56:32 +09002046 constexpr char listen_addr[] = "127.0.0.4";
2047 constexpr char host_name[] = "howdy.example.com.";
2048 const std::vector<DnsRecord> records = {
2049 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2050 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2051 };
2052
2053 test::DNSResponder dns(listen_addr);
2054 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002055 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002056 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002057
Luke Huangba7bef92018-12-26 16:53:03 +08002058 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2059 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002060 EXPECT_TRUE(fd1 != -1);
2061 EXPECT_TRUE(fd2 != -1);
2062
Luke Huang70931aa2019-01-31 11:57:41 +08002063 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002064 int rcode;
2065 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2066 EXPECT_GT(res, 0);
2067 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
2068
2069 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2070 EXPECT_GT(res, 0);
2071 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2072
2073 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
2074
2075 // Re-query verify cache works
Luke Huangba7bef92018-12-26 16:53:03 +08002076 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2077 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002078
2079 EXPECT_TRUE(fd1 != -1);
2080 EXPECT_TRUE(fd2 != -1);
2081
2082 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2083 EXPECT_GT(res, 0);
2084 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
2085
2086 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2087 EXPECT_GT(res, 0);
2088 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2089
2090 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
2091}
2092
2093TEST_F(ResolverTest, Async_BadQuery) {
Xiao Ma09b71022018-12-11 17:56:32 +09002094 constexpr char listen_addr[] = "127.0.0.4";
2095 constexpr char host_name[] = "howdy.example.com.";
2096 const std::vector<DnsRecord> records = {
2097 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2098 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2099 };
2100
2101 test::DNSResponder dns(listen_addr);
2102 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002103 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002104 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002105
2106 static struct {
2107 int fd;
2108 const char* dname;
2109 const int queryType;
2110 const int expectRcode;
2111 } kTestData[] = {
Luke Huangba7bef92018-12-26 16:53:03 +08002112 {-1, "", ns_t_aaaa, 0},
2113 {-1, "as65ass46", ns_t_aaaa, 0},
2114 {-1, "454564564564", ns_t_aaaa, 0},
2115 {-1, "h645235", ns_t_a, 0},
2116 {-1, "www.google.com", ns_t_a, 0},
Luke Huang94b10b92018-11-21 20:13:38 +08002117 };
2118
2119 for (auto& td : kTestData) {
2120 SCOPED_TRACE(td.dname);
Luke Huangba7bef92018-12-26 16:53:03 +08002121 td.fd = resNetworkQuery(TEST_NETID, td.dname, ns_c_in, td.queryType, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002122 EXPECT_TRUE(td.fd != -1);
2123 }
2124
2125 // dns_responder return empty resp(packet only contains query part) with no error currently
2126 for (const auto& td : kTestData) {
Luke Huang70931aa2019-01-31 11:57:41 +08002127 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002128 int rcode;
2129 SCOPED_TRACE(td.dname);
2130 int res = getAsyncResponse(td.fd, &rcode, buf, MAXPACKET);
2131 EXPECT_GT(res, 0);
2132 EXPECT_EQ(rcode, td.expectRcode);
2133 }
2134}
2135
2136TEST_F(ResolverTest, Async_EmptyAnswer) {
Xiao Ma09b71022018-12-11 17:56:32 +09002137 constexpr char listen_addr[] = "127.0.0.4";
2138 constexpr char host_name[] = "howdy.example.com.";
2139 const std::vector<DnsRecord> records = {
2140 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2141 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2142 };
2143
2144 test::DNSResponder dns(listen_addr);
2145 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002146 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002147 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002148
Luke Huang9c264bb2018-12-18 16:44:41 +08002149 // TODO: Disable retry to make this test explicit.
2150 auto& cv = dns.getCv();
2151 auto& cvMutex = dns.getCvMutex();
2152 int fd1;
2153 // Wait on the condition variable to ensure that the DNS server has handled our first query.
2154 {
2155 std::unique_lock lk(cvMutex);
Luke Huangba7bef92018-12-26 16:53:03 +08002156 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang9c264bb2018-12-18 16:44:41 +08002157 EXPECT_TRUE(fd1 != -1);
2158 EXPECT_EQ(std::cv_status::no_timeout, cv.wait_for(lk, std::chrono::seconds(1)));
2159 }
Luke Huang94b10b92018-11-21 20:13:38 +08002160
Luke Huang94b10b92018-11-21 20:13:38 +08002161 dns.setResponseProbability(0.0);
Luke Huang94b10b92018-11-21 20:13:38 +08002162
Luke Huangba7bef92018-12-26 16:53:03 +08002163 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002164 EXPECT_TRUE(fd2 != -1);
2165
Luke Huangba7bef92018-12-26 16:53:03 +08002166 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002167 EXPECT_TRUE(fd3 != -1);
2168
Luke Huang9c264bb2018-12-18 16:44:41 +08002169 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002170 int rcode;
2171
Luke Huang9c264bb2018-12-18 16:44:41 +08002172 // expect no response
2173 int res = getAsyncResponse(fd3, &rcode, buf, MAXPACKET);
2174 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huang94b10b92018-11-21 20:13:38 +08002175
Luke Huang9c264bb2018-12-18 16:44:41 +08002176 // expect no response
Luke Huang94b10b92018-11-21 20:13:38 +08002177 memset(buf, 0, MAXPACKET);
Luke Huang9c264bb2018-12-18 16:44:41 +08002178 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2179 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huang94b10b92018-11-21 20:13:38 +08002180
Luke Huang94b10b92018-11-21 20:13:38 +08002181 dns.setResponseProbability(1.0);
Luke Huang94b10b92018-11-21 20:13:38 +08002182
Luke Huangba7bef92018-12-26 16:53:03 +08002183 int fd4 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002184 EXPECT_TRUE(fd4 != -1);
2185
2186 memset(buf, 0, MAXPACKET);
2187 res = getAsyncResponse(fd4, &rcode, buf, MAXPACKET);
2188 EXPECT_GT(res, 0);
2189 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2190
2191 memset(buf, 0, MAXPACKET);
2192 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2193 EXPECT_GT(res, 0);
2194 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
Mike Yu532405f2020-06-17 17:46:44 +08002195
2196 // Trailing dot is removed. Is it intended?
2197 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, 0, "howdy.example.com", {"::1.2.3.4"});
2198 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2199 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2200 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, 0, "howdy.example.com", {"1.2.3.4"});
Luke Huang94b10b92018-11-21 20:13:38 +08002201}
2202
2203TEST_F(ResolverTest, Async_MalformedQuery) {
Xiao Ma09b71022018-12-11 17:56:32 +09002204 constexpr char listen_addr[] = "127.0.0.4";
2205 constexpr char host_name[] = "howdy.example.com.";
2206 const std::vector<DnsRecord> records = {
2207 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2208 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2209 };
2210
2211 test::DNSResponder dns(listen_addr);
2212 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002213 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002214 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002215
2216 int fd = dns_open_proxy();
2217 EXPECT_TRUE(fd > 0);
2218
2219 const std::string badMsg = "16-52512#";
Xiao Ma09b71022018-12-11 17:56:32 +09002220 static const struct {
Luke Huang94b10b92018-11-21 20:13:38 +08002221 const std::string cmd;
2222 const int expectErr;
2223 } kTestData[] = {
Luke Huangba7bef92018-12-26 16:53:03 +08002224 // Too few arguments
Luke Huang94b10b92018-11-21 20:13:38 +08002225 {"resnsend " + badMsg + '\0', -EINVAL},
2226 // Bad netId
Luke Huangba7bef92018-12-26 16:53:03 +08002227 {"resnsend badnetId 0 " + badMsg + '\0', -EINVAL},
Luke Huang94b10b92018-11-21 20:13:38 +08002228 // Bad raw data
Luke Huangba7bef92018-12-26 16:53:03 +08002229 {"resnsend " + std::to_string(TEST_NETID) + " 0 " + badMsg + '\0', -EILSEQ},
Luke Huang94b10b92018-11-21 20:13:38 +08002230 };
2231
2232 for (unsigned int i = 0; i < std::size(kTestData); i++) {
2233 auto& td = kTestData[i];
2234 SCOPED_TRACE(td.cmd);
2235 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, td.cmd.c_str(), td.cmd.size()));
2236 EXPECT_EQ(rc, static_cast<ssize_t>(td.cmd.size()));
2237
2238 int32_t tmp;
2239 rc = TEMP_FAILURE_RETRY(read(fd, &tmp, sizeof(tmp)));
2240 EXPECT_TRUE(rc > 0);
2241 EXPECT_EQ(static_cast<int>(ntohl(tmp)), td.expectErr);
2242 }
2243 // Normal query with answer buffer
2244 // This is raw data of query "howdy.example.com" type 1 class 1
2245 std::string query = "81sBAAABAAAAAAAABWhvd2R5B2V4YW1wbGUDY29tAAABAAE=";
Luke Huangba7bef92018-12-26 16:53:03 +08002246 std::string cmd = "resnsend " + std::to_string(TEST_NETID) + " 0 " + query + '\0';
Luke Huang94b10b92018-11-21 20:13:38 +08002247 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
2248 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
2249
Luke Huang70931aa2019-01-31 11:57:41 +08002250 uint8_t smallBuf[1] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002251 int rcode;
2252 rc = getAsyncResponse(fd, &rcode, smallBuf, 1);
Luke Huangba7bef92018-12-26 16:53:03 +08002253 EXPECT_EQ(-EMSGSIZE, rc);
Luke Huang94b10b92018-11-21 20:13:38 +08002254
2255 // Do the normal test with large buffer again
2256 fd = dns_open_proxy();
2257 EXPECT_TRUE(fd > 0);
2258 rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
2259 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
Luke Huang70931aa2019-01-31 11:57:41 +08002260 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002261 rc = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2262 EXPECT_EQ("1.2.3.4", toString(buf, rc, AF_INET));
Mike Yu4f3747b2018-12-02 17:54:29 +09002263}
2264
Luke Huangba7bef92018-12-26 16:53:03 +08002265TEST_F(ResolverTest, Async_CacheFlags) {
Xiao Ma09b71022018-12-11 17:56:32 +09002266 constexpr char listen_addr[] = "127.0.0.4";
Luke Huang4eabbe32020-05-28 03:17:32 +08002267 constexpr char host_name1[] = "howdy.example.com.";
2268 constexpr char host_name2[] = "howdy.example2.com.";
2269 constexpr char host_name3[] = "howdy.example3.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002270 const std::vector<DnsRecord> records = {
Luke Huang4eabbe32020-05-28 03:17:32 +08002271 {host_name1, ns_type::ns_t_a, "1.2.3.4"}, {host_name1, ns_type::ns_t_aaaa, "::1.2.3.4"},
2272 {host_name2, ns_type::ns_t_a, "1.2.3.5"}, {host_name2, ns_type::ns_t_aaaa, "::1.2.3.5"},
2273 {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 +09002274 };
2275
2276 test::DNSResponder dns(listen_addr);
2277 StartDns(dns, records);
Luke Huangba7bef92018-12-26 16:53:03 +08002278 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002279 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huangba7bef92018-12-26 16:53:03 +08002280
2281 // ANDROID_RESOLV_NO_CACHE_STORE
2282 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2283 ANDROID_RESOLV_NO_CACHE_STORE);
2284 EXPECT_TRUE(fd1 != -1);
2285 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2286 ANDROID_RESOLV_NO_CACHE_STORE);
2287 EXPECT_TRUE(fd2 != -1);
2288 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2289 ANDROID_RESOLV_NO_CACHE_STORE);
2290 EXPECT_TRUE(fd3 != -1);
2291
2292 expectAnswersValid(fd3, AF_INET, "1.2.3.4");
2293 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
2294 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2295
2296 // No cache exists, expect 3 queries
Luke Huang4eabbe32020-05-28 03:17:32 +08002297 EXPECT_EQ(3U, GetNumQueries(dns, host_name1));
Luke Huangba7bef92018-12-26 16:53:03 +08002298
Luke Huang4eabbe32020-05-28 03:17:32 +08002299 // Raise a query with no flags to ensure no cache exists. Also make an cache entry for the
2300 // query.
Luke Huangba7bef92018-12-26 16:53:03 +08002301 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2302
2303 EXPECT_TRUE(fd1 != -1);
2304
2305 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2306
Luke Huang4eabbe32020-05-28 03:17:32 +08002307 // Expect 4 queries because there should be no cache before this query.
2308 EXPECT_EQ(4U, GetNumQueries(dns, host_name1));
2309
2310 // Now we have the cache entry, re-query with ANDROID_RESOLV_NO_CACHE_STORE to ensure
2311 // that ANDROID_RESOLV_NO_CACHE_STORE implied ANDROID_RESOLV_NO_CACHE_LOOKUP.
2312 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2313 ANDROID_RESOLV_NO_CACHE_STORE);
2314 EXPECT_TRUE(fd1 != -1);
2315 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2316 // Expect 5 queries because we shouldn't do cache lookup for the query which has
2317 // ANDROID_RESOLV_NO_CACHE_STORE.
2318 EXPECT_EQ(5U, GetNumQueries(dns, host_name1));
Luke Huangba7bef92018-12-26 16:53:03 +08002319
2320 // ANDROID_RESOLV_NO_CACHE_LOOKUP
2321 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2322 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2323 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2324 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2325
2326 EXPECT_TRUE(fd1 != -1);
2327 EXPECT_TRUE(fd2 != -1);
2328
2329 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
2330 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2331
Luke Huang4eabbe32020-05-28 03:17:32 +08002332 // Cache was skipped, expect 2 more queries.
2333 EXPECT_EQ(7U, GetNumQueries(dns, host_name1));
Luke Huangba7bef92018-12-26 16:53:03 +08002334
2335 // Re-query verify cache works
Luke Huang4eabbe32020-05-28 03:17:32 +08002336 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huangba7bef92018-12-26 16:53:03 +08002337 EXPECT_TRUE(fd1 != -1);
2338 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2339
Luke Huang4eabbe32020-05-28 03:17:32 +08002340 // Cache hits, expect still 7 queries
2341 EXPECT_EQ(7U, GetNumQueries(dns, host_name1));
Luke Huanga1d74182019-03-19 17:30:36 +08002342
2343 // Start to verify if ANDROID_RESOLV_NO_CACHE_LOOKUP does write response into cache
2344 dns.clearQueries();
2345
Luke Huang4eabbe32020-05-28 03:17:32 +08002346 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa,
Luke Huanga1d74182019-03-19 17:30:36 +08002347 ANDROID_RESOLV_NO_CACHE_LOOKUP);
Luke Huang4eabbe32020-05-28 03:17:32 +08002348 fd2 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa,
Luke Huanga1d74182019-03-19 17:30:36 +08002349 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2350
2351 EXPECT_TRUE(fd1 != -1);
2352 EXPECT_TRUE(fd2 != -1);
2353
Luke Huang4eabbe32020-05-28 03:17:32 +08002354 expectAnswersValid(fd2, AF_INET6, "::1.2.3.5");
2355 expectAnswersValid(fd1, AF_INET6, "::1.2.3.5");
Luke Huanga1d74182019-03-19 17:30:36 +08002356
2357 // Skip cache, expect 2 queries
Luke Huang4eabbe32020-05-28 03:17:32 +08002358 EXPECT_EQ(2U, GetNumQueries(dns, host_name2));
Luke Huanga1d74182019-03-19 17:30:36 +08002359
2360 // Re-query without flags
Luke Huang4eabbe32020-05-28 03:17:32 +08002361 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa, 0);
2362 fd2 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa, 0);
Luke Huanga1d74182019-03-19 17:30:36 +08002363
2364 EXPECT_TRUE(fd1 != -1);
2365 EXPECT_TRUE(fd2 != -1);
2366
Luke Huang4eabbe32020-05-28 03:17:32 +08002367 expectAnswersValid(fd2, AF_INET6, "::1.2.3.5");
2368 expectAnswersValid(fd1, AF_INET6, "::1.2.3.5");
Luke Huanga1d74182019-03-19 17:30:36 +08002369
2370 // Cache hits, expect still 2 queries
Luke Huang4eabbe32020-05-28 03:17:32 +08002371 EXPECT_EQ(2U, GetNumQueries(dns, host_name2));
Luke Huang40f5f492019-05-09 19:37:35 +08002372
2373 // Test both ANDROID_RESOLV_NO_CACHE_STORE and ANDROID_RESOLV_NO_CACHE_LOOKUP are set
2374 dns.clearQueries();
2375
Luke Huang4eabbe32020-05-28 03:17:32 +08002376 // Make sure that the cache of "howdy.example3.com" exists.
2377 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang40f5f492019-05-09 19:37:35 +08002378 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002379 expectAnswersValid(fd1, AF_INET6, "::1.2.3.6");
2380 EXPECT_EQ(1U, GetNumQueries(dns, host_name3));
Luke Huang40f5f492019-05-09 19:37:35 +08002381
2382 // Re-query with testFlags
2383 const int testFlag = ANDROID_RESOLV_NO_CACHE_STORE | ANDROID_RESOLV_NO_CACHE_LOOKUP;
Luke Huang4eabbe32020-05-28 03:17:32 +08002384 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_aaaa, testFlag);
Luke Huang40f5f492019-05-09 19:37:35 +08002385 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002386 expectAnswersValid(fd1, AF_INET6, "::1.2.3.6");
Luke Huang40f5f492019-05-09 19:37:35 +08002387 // Expect cache lookup is skipped.
Luke Huang4eabbe32020-05-28 03:17:32 +08002388 EXPECT_EQ(2U, GetNumQueries(dns, host_name3));
Luke Huang40f5f492019-05-09 19:37:35 +08002389
2390 // Do another query with testFlags
Luke Huang4eabbe32020-05-28 03:17:32 +08002391 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_a, testFlag);
Luke Huang40f5f492019-05-09 19:37:35 +08002392 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002393 expectAnswersValid(fd1, AF_INET, "1.2.3.6");
Luke Huang40f5f492019-05-09 19:37:35 +08002394 // Expect cache lookup is skipped.
Luke Huang4eabbe32020-05-28 03:17:32 +08002395 EXPECT_EQ(3U, GetNumQueries(dns, host_name3));
Luke Huang40f5f492019-05-09 19:37:35 +08002396
2397 // Re-query with no flags
Luke Huang4eabbe32020-05-28 03:17:32 +08002398 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_a, 0);
Luke Huang40f5f492019-05-09 19:37:35 +08002399 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002400 expectAnswersValid(fd1, AF_INET, "1.2.3.6");
Luke Huang40f5f492019-05-09 19:37:35 +08002401 // Expect no cache hit because cache storing is also skipped in previous query.
Luke Huang4eabbe32020-05-28 03:17:32 +08002402 EXPECT_EQ(4U, GetNumQueries(dns, host_name3));
Luke Huangba7bef92018-12-26 16:53:03 +08002403}
2404
Luke Huang08b13d22020-02-05 14:46:21 +08002405TEST_F(ResolverTest, Async_NoCacheStoreFlagDoesNotRefreshStaleCacheEntry) {
2406 constexpr char listen_addr[] = "127.0.0.4";
2407 constexpr char host_name[] = "howdy.example.com.";
2408 const std::vector<DnsRecord> records = {
2409 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2410 };
2411
2412 test::DNSResponder dns(listen_addr);
2413 StartDns(dns, records);
2414 std::vector<std::string> servers = {listen_addr};
2415 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
2416
2417 const unsigned SHORT_TTL_SEC = 1;
2418 dns.setTtl(SHORT_TTL_SEC);
2419
2420 // Refer to b/148842821 for the purpose of below test steps.
2421 // Basically, this test is used to ensure stale cache case is handled
2422 // correctly with ANDROID_RESOLV_NO_CACHE_STORE.
2423 int fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2424 EXPECT_TRUE(fd != -1);
2425 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2426
2427 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2428 dns.clearQueries();
2429
2430 // Wait until cache expired
2431 sleep(SHORT_TTL_SEC + 0.5);
2432
2433 // Now request the same hostname again.
2434 // We should see a new DNS query because the entry in cache has become stale.
2435 // Due to ANDROID_RESOLV_NO_CACHE_STORE, this query must *not* refresh that stale entry.
2436 fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2437 ANDROID_RESOLV_NO_CACHE_STORE);
2438 EXPECT_TRUE(fd != -1);
2439 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2440 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2441 dns.clearQueries();
2442
2443 // If the cache is still stale, we expect to see one more DNS query
2444 // (this time the cache will be refreshed, but we're not checking for it).
2445 fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2446 EXPECT_TRUE(fd != -1);
2447 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2448 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2449}
2450
Luke Huangba7bef92018-12-26 16:53:03 +08002451TEST_F(ResolverTest, Async_NoRetryFlag) {
Luke Huang70931aa2019-01-31 11:57:41 +08002452 constexpr char listen_addr0[] = "127.0.0.4";
2453 constexpr char listen_addr1[] = "127.0.0.6";
Xiao Ma09b71022018-12-11 17:56:32 +09002454 constexpr char host_name[] = "howdy.example.com.";
2455 const std::vector<DnsRecord> records = {
2456 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2457 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2458 };
2459
Luke Huang70931aa2019-01-31 11:57:41 +08002460 test::DNSResponder dns0(listen_addr0);
2461 test::DNSResponder dns1(listen_addr1);
2462 StartDns(dns0, records);
2463 StartDns(dns1, records);
2464 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr0, listen_addr1}));
Luke Huangba7bef92018-12-26 16:53:03 +08002465
Luke Huang70931aa2019-01-31 11:57:41 +08002466 dns0.clearQueries();
2467 dns1.clearQueries();
2468
2469 dns0.setResponseProbability(0.0);
2470 dns1.setResponseProbability(0.0);
Luke Huangba7bef92018-12-26 16:53:03 +08002471
2472 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2473 ANDROID_RESOLV_NO_RETRY);
2474 EXPECT_TRUE(fd1 != -1);
2475
2476 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa,
2477 ANDROID_RESOLV_NO_RETRY);
2478 EXPECT_TRUE(fd2 != -1);
2479
2480 // expect no response
2481 expectAnswersNotValid(fd1, -ETIMEDOUT);
2482 expectAnswersNotValid(fd2, -ETIMEDOUT);
Mike Yu532405f2020-06-17 17:46:44 +08002483 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2484 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
Luke Huangba7bef92018-12-26 16:53:03 +08002485
Luke Huang70931aa2019-01-31 11:57:41 +08002486 // No retry case, expect total 2 queries. The server is selected randomly.
2487 EXPECT_EQ(2U, GetNumQueries(dns0, host_name) + GetNumQueries(dns1, host_name));
Luke Huangba7bef92018-12-26 16:53:03 +08002488
Luke Huang70931aa2019-01-31 11:57:41 +08002489 dns0.clearQueries();
2490 dns1.clearQueries();
Luke Huangba7bef92018-12-26 16:53:03 +08002491
2492 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2493 EXPECT_TRUE(fd1 != -1);
2494
2495 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
2496 EXPECT_TRUE(fd2 != -1);
2497
2498 // expect no response
2499 expectAnswersNotValid(fd1, -ETIMEDOUT);
2500 expectAnswersNotValid(fd2, -ETIMEDOUT);
Mike Yu532405f2020-06-17 17:46:44 +08002501 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2502 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
Luke Huangba7bef92018-12-26 16:53:03 +08002503
2504 // Retry case, expect 4 queries
Luke Huang70931aa2019-01-31 11:57:41 +08002505 EXPECT_EQ(4U, GetNumQueries(dns0, host_name));
2506 EXPECT_EQ(4U, GetNumQueries(dns1, host_name));
2507}
2508
2509TEST_F(ResolverTest, Async_VerifyQueryID) {
2510 constexpr char listen_addr[] = "127.0.0.4";
2511 constexpr char host_name[] = "howdy.example.com.";
2512 const std::vector<DnsRecord> records = {
2513 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2514 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2515 };
2516
2517 test::DNSResponder dns(listen_addr);
2518 StartDns(dns, records);
2519 std::vector<std::string> servers = {listen_addr};
2520 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
2521
2522 const uint8_t queryBuf1[] = {
2523 /* Header */
2524 0x55, 0x66, /* 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 int fd = resNetworkSend(TEST_NETID, queryBuf1, sizeof(queryBuf1), 0);
2538 EXPECT_TRUE(fd != -1);
2539
2540 uint8_t buf[MAXPACKET] = {};
2541 int rcode;
2542
2543 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2544 EXPECT_GT(res, 0);
2545 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2546
2547 auto hp = reinterpret_cast<HEADER*>(buf);
2548 EXPECT_EQ(21862U, htons(hp->id));
2549
2550 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2551
2552 const uint8_t queryBuf2[] = {
2553 /* Header */
2554 0x00, 0x53, /* Transaction ID */
2555 0x01, 0x00, /* Flags */
2556 0x00, 0x01, /* Questions */
2557 0x00, 0x00, /* Answer RRs */
2558 0x00, 0x00, /* Authority RRs */
2559 0x00, 0x00, /* Additional RRs */
2560 /* Queries */
2561 0x05, 0x68, 0x6f, 0x77, 0x64, 0x79, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
2562 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name */
2563 0x00, 0x01, /* Type */
2564 0x00, 0x01 /* Class */
2565 };
2566
2567 // Re-query verify cache works and query id is correct
2568 fd = resNetworkSend(TEST_NETID, queryBuf2, sizeof(queryBuf2), 0);
2569
2570 EXPECT_TRUE(fd != -1);
2571
2572 res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2573 EXPECT_GT(res, 0);
2574 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2575
2576 EXPECT_EQ(0x0053U, htons(hp->id));
2577
2578 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
Luke Huangba7bef92018-12-26 16:53:03 +08002579}
2580
Mike Yu4f3747b2018-12-02 17:54:29 +09002581// This test checks that the resolver should not generate the request containing OPT RR when using
Ken Chen0a015532019-01-02 14:59:38 +08002582// cleartext DNS. If we query the DNS server not supporting EDNS0 and it reponds with
2583// FORMERR_ON_EDNS, we will fallback to no EDNS0 and try again. If the server does no response, we
2584// won't retry so that we get no answer.
Mike Yu4f3747b2018-12-02 17:54:29 +09002585TEST_F(ResolverTest, BrokenEdns) {
2586 typedef test::DNSResponder::Edns Edns;
2587 enum ExpectResult { EXPECT_FAILURE, EXPECT_SUCCESS };
2588
Mike Yu3977d482020-02-26 17:18:57 +08002589 // Perform cleartext query in off mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002590 const char OFF[] = "off";
Mike Yu3977d482020-02-26 17:18:57 +08002591
2592 // Perform cleartext query when there's no private DNS server validated in opportunistic mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002593 const char OPPORTUNISTIC_UDP[] = "opportunistic_udp";
Mike Yu3977d482020-02-26 17:18:57 +08002594
2595 // Perform cleartext query when there is a private DNS server validated in opportunistic mode.
2596 const char OPPORTUNISTIC_FALLBACK_UDP[] = "opportunistic_fallback_udp";
2597
2598 // Perform cyphertext query in opportunistic mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002599 const char OPPORTUNISTIC_TLS[] = "opportunistic_tls";
Mike Yu3977d482020-02-26 17:18:57 +08002600
2601 // Perform cyphertext query in strict mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002602 const char STRICT[] = "strict";
Mike Yu3977d482020-02-26 17:18:57 +08002603
Mike Yu4f3747b2018-12-02 17:54:29 +09002604 const char GETHOSTBYNAME[] = "gethostbyname";
2605 const char GETADDRINFO[] = "getaddrinfo";
Mike Yu4f3747b2018-12-02 17:54:29 +09002606 const char ADDR4[] = "192.0.2.1";
2607 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2608 const char CLEARTEXT_PORT[] = "53";
2609 const char TLS_PORT[] = "853";
Luke Huangf8215372019-11-22 11:53:41 +08002610 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
Mike Yu3977d482020-02-26 17:18:57 +08002611 ResolverParamsParcel paramsForCleanup = DnsResponderClient::GetDefaultResolverParamsParcel();
2612 paramsForCleanup.servers.clear();
2613 paramsForCleanup.tlsServers.clear();
Mike Yu4f3747b2018-12-02 17:54:29 +09002614
Mike Yufc125e42019-05-15 20:41:28 +08002615 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Mike Yu4f3747b2018-12-02 17:54:29 +09002616 ASSERT_TRUE(dns.startServer());
2617
2618 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2619
Luke Huangf8215372019-11-22 11:53:41 +08002620 // clang-format off
Mike Yu4f3747b2018-12-02 17:54:29 +09002621 static const struct TestConfig {
2622 std::string mode;
2623 std::string method;
2624 Edns edns;
2625 ExpectResult expectResult;
2626
2627 std::string asHostName() const {
2628 const char* ednsString;
2629 switch (edns) {
2630 case Edns::ON:
2631 ednsString = "ednsOn";
2632 break;
Ken Chen0a015532019-01-02 14:59:38 +08002633 case Edns::FORMERR_ON_EDNS:
Mike Yu4f3747b2018-12-02 17:54:29 +09002634 ednsString = "ednsFormerr";
2635 break;
2636 case Edns::DROP:
2637 ednsString = "ednsDrop";
2638 break;
2639 default:
2640 ednsString = "";
2641 break;
2642 }
2643 return StringPrintf("%s.%s.%s.", mode.c_str(), method.c_str(), ednsString);
2644 }
2645 } testConfigs[] = {
Mike Yu3977d482020-02-26 17:18:57 +08002646 // In OPPORTUNISTIC_TLS, if the DNS server doesn't support EDNS0 but TLS, the lookup
2647 // fails. Could such server exist? if so, we might need to fix it to fallback to
2648 // cleartext query. If the server still make no response for the queries with EDNS0, we
2649 // might also need to fix it to retry without EDNS0.
Mike Yu4f3747b2018-12-02 17:54:29 +09002650 // Another thing is that {OPPORTUNISTIC_TLS, Edns::DROP} and {STRICT, Edns::DROP} are
2651 // commented out since TLS timeout is not configurable.
2652 // TODO: Uncomment them after TLS timeout is configurable.
Mike Yu3977d482020-02-26 17:18:57 +08002653 {OFF, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2654 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2655 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2656 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2657 {STRICT, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2658 {OFF, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2659 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2660 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2661 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2662 {STRICT, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2663 {OFF, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2664 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2665
2666 // The failure is due to no retry on timeout. Maybe fix it?
2667 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2668
2669 //{OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2670 //{STRICT, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2671 {OFF, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2672 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2673 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2674 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2675 {STRICT, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2676 {OFF, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2677 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2678 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2679 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2680 {STRICT, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2681 {OFF, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2682 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2683
2684 // The failure is due to no retry on timeout. Maybe fix it?
2685 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2686
Mike Yu4f3747b2018-12-02 17:54:29 +09002687 //{OPPORTUNISTIC_TLS, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2688 //{STRICT, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2689 };
Luke Huangf8215372019-11-22 11:53:41 +08002690 // clang-format on
Mike Yu4f3747b2018-12-02 17:54:29 +09002691
2692 for (const auto& config : testConfigs) {
2693 const std::string testHostName = config.asHostName();
2694 SCOPED_TRACE(testHostName);
2695
2696 const char* host_name = testHostName.c_str();
2697 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
2698 dns.setEdns(config.edns);
2699
2700 if (config.mode == OFF) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002701 if (tls.running()) {
2702 ASSERT_TRUE(tls.stopServer());
2703 }
Xiao Ma09b71022018-12-11 17:56:32 +09002704 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Mike Yu4f3747b2018-12-02 17:54:29 +09002705 } else if (config.mode == OPPORTUNISTIC_UDP) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002706 if (tls.running()) {
2707 ASSERT_TRUE(tls.stopServer());
2708 }
Xiao Ma09b71022018-12-11 17:56:32 +09002709 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002710 kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002711 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), false));
Mike Yu3977d482020-02-26 17:18:57 +08002712 } else if (config.mode == OPPORTUNISTIC_TLS || config.mode == OPPORTUNISTIC_FALLBACK_UDP) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002713 if (!tls.running()) {
2714 ASSERT_TRUE(tls.startServer());
2715 }
Xiao Ma09b71022018-12-11 17:56:32 +09002716 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002717 kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002718 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Mike Yu3977d482020-02-26 17:18:57 +08002719
2720 if (config.mode == OPPORTUNISTIC_FALLBACK_UDP) {
2721 // Force the resolver to fallback to cleartext queries.
2722 ASSERT_TRUE(tls.stopServer());
2723 }
Mike Yu4f3747b2018-12-02 17:54:29 +09002724 } else if (config.mode == STRICT) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002725 if (!tls.running()) {
2726 ASSERT_TRUE(tls.startServer());
2727 }
Xiao Ma09b71022018-12-11 17:56:32 +09002728 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002729 kDefaultParams, kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08002730 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Mike Yu4f3747b2018-12-02 17:54:29 +09002731 }
2732
2733 if (config.method == GETHOSTBYNAME) {
2734 const hostent* h_result = gethostbyname(host_name);
2735 if (config.expectResult == EXPECT_SUCCESS) {
2736 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2737 ASSERT_TRUE(h_result != nullptr);
2738 ASSERT_EQ(4, h_result->h_length);
2739 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
2740 EXPECT_EQ(ADDR4, ToString(h_result));
2741 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
Mike Yu532405f2020-06-17 17:46:44 +08002742 ExpectDnsEvent(INetdEventListener::EVENT_GETHOSTBYNAME, 0, host_name, {ADDR4});
Mike Yu4f3747b2018-12-02 17:54:29 +09002743 } else {
2744 EXPECT_EQ(0U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
2745 ASSERT_TRUE(h_result == nullptr);
2746 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
Mike Yu532405f2020-06-17 17:46:44 +08002747 int returnCode = (config.edns == Edns::DROP) ? RCODE_TIMEOUT : EAI_FAIL;
2748 ExpectDnsEvent(INetdEventListener::EVENT_GETHOSTBYNAME, returnCode, host_name, {});
Mike Yu4f3747b2018-12-02 17:54:29 +09002749 }
2750 } else if (config.method == GETADDRINFO) {
2751 ScopedAddrinfo ai_result;
2752 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2753 ai_result = safe_getaddrinfo(host_name, nullptr, &hints);
2754 if (config.expectResult == EXPECT_SUCCESS) {
2755 EXPECT_TRUE(ai_result != nullptr);
2756 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2757 const std::string result_str = ToString(ai_result);
2758 EXPECT_EQ(ADDR4, result_str);
Mike Yu532405f2020-06-17 17:46:44 +08002759 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, 0, host_name, {ADDR4});
Mike Yu4f3747b2018-12-02 17:54:29 +09002760 } else {
2761 EXPECT_TRUE(ai_result == nullptr);
2762 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
Mike Yu532405f2020-06-17 17:46:44 +08002763 int returnCode = (config.edns == Edns::DROP) ? RCODE_TIMEOUT : EAI_FAIL;
2764 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, returnCode, host_name, {});
Mike Yu4f3747b2018-12-02 17:54:29 +09002765 }
2766 } else {
2767 FAIL() << "Unsupported query method: " << config.method;
2768 }
2769
Mike Yudd4ac2d2019-05-31 16:52:11 +08002770 tls.clearQueries();
Mike Yu4f3747b2018-12-02 17:54:29 +09002771 dns.clearQueries();
Mike Yu3977d482020-02-26 17:18:57 +08002772
2773 // Clear the setup to force the resolver to validate private DNS servers in every test.
2774 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(paramsForCleanup));
Mike Yu4f3747b2018-12-02 17:54:29 +09002775 }
Mike Yu4f3747b2018-12-02 17:54:29 +09002776}
nuccachena26cc2a2018-07-17 18:07:23 +08002777
Ken Chen0a015532019-01-02 14:59:38 +08002778// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2779// Resolver should have a reasonable number of retries instead of spinning forever. We don't have
2780// an efficient way to know if resolver is stuck in an infinite loop. However, test case will be
2781// failed due to timeout.
2782TEST_F(ResolverTest, UnstableTls) {
2783 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2784 const char CLEARTEXT_PORT[] = "53";
2785 const char TLS_PORT[] = "853";
2786 const char* host_name1 = "nonexistent1.example.com.";
2787 const char* host_name2 = "nonexistent2.example.com.";
2788 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
2789
Mike Yufc125e42019-05-15 20:41:28 +08002790 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Ken Chen0a015532019-01-02 14:59:38 +08002791 ASSERT_TRUE(dns.startServer());
2792 dns.setEdns(test::DNSResponder::Edns::FORMERR_ON_EDNS);
2793 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2794 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08002795 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002796 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
2797
Ken Chen0a015532019-01-02 14:59:38 +08002798 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
2799 tls.stopServer();
2800
2801 const hostent* h_result = gethostbyname(host_name1);
2802 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
2803 ASSERT_TRUE(h_result == nullptr);
2804 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2805
2806 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2807 ScopedAddrinfo ai_result = safe_getaddrinfo(host_name2, nullptr, &hints);
2808 EXPECT_TRUE(ai_result == nullptr);
2809 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
2810}
2811
2812// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2813// Moreover, server responds RCODE=FORMERR even on non-EDNS query.
2814TEST_F(ResolverTest, BogusDnsServer) {
2815 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2816 const char CLEARTEXT_PORT[] = "53";
2817 const char TLS_PORT[] = "853";
2818 const char* host_name1 = "nonexistent1.example.com.";
2819 const char* host_name2 = "nonexistent2.example.com.";
2820 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
2821
Mike Yufc125e42019-05-15 20:41:28 +08002822 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Ken Chen0a015532019-01-02 14:59:38 +08002823 ASSERT_TRUE(dns.startServer());
2824 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2825 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08002826 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002827 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
2828
Ken Chen0a015532019-01-02 14:59:38 +08002829 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
2830 tls.stopServer();
2831 dns.setEdns(test::DNSResponder::Edns::FORMERR_UNCOND);
2832
2833 const hostent* h_result = gethostbyname(host_name1);
2834 EXPECT_EQ(0U, GetNumQueries(dns, host_name1));
2835 ASSERT_TRUE(h_result == nullptr);
2836 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2837
2838 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2839 ScopedAddrinfo ai_result = safe_getaddrinfo(host_name2, nullptr, &hints);
2840 EXPECT_TRUE(ai_result == nullptr);
2841 EXPECT_EQ(0U, GetNumQueries(dns, host_name2));
2842}
2843
nuccachena26cc2a2018-07-17 18:07:23 +08002844TEST_F(ResolverTest, GetAddrInfo_Dns64Synthesize) {
2845 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002846 constexpr char dns64_name[] = "ipv4only.arpa.";
2847 constexpr char host_name[] = "v4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002848 const std::vector<DnsRecord> records = {
2849 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2850 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2851 };
nuccachena26cc2a2018-07-17 18:07:23 +08002852
Xiao Ma09b71022018-12-11 17:56:32 +09002853 test::DNSResponder dns(listen_addr);
Xiao Ma09b71022018-12-11 17:56:32 +09002854 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002855
2856 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002857 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002858
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002859 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002860 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002861 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002862
2863 // hints are necessary in order to let netd know which type of addresses the caller is
2864 // interested in.
Xiao Ma09b71022018-12-11 17:56:32 +09002865 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08002866 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
2867 EXPECT_TRUE(result != nullptr);
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002868 // TODO: BUG: there should only be two queries, one AAAA (which returns no records) and one A
2869 // (which returns 1.2.3.4). But there is an extra AAAA.
2870 EXPECT_EQ(3U, GetNumQueries(dns, host_name));
nuccachena26cc2a2018-07-17 18:07:23 +08002871
2872 std::string result_str = ToString(result);
2873 EXPECT_EQ(result_str, "64:ff9b::102:304");
2874
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002875 // Stopping NAT64 prefix discovery disables synthesis.
Luke Huang5bd827c2019-03-14 16:10:04 +08002876 EXPECT_TRUE(mDnsClient.resolvService()->stopPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002877 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_NOT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002878
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002879 dns.clearQueries();
nuccachena26cc2a2018-07-17 18:07:23 +08002880
2881 result = safe_getaddrinfo("v4only", nullptr, &hints);
2882 EXPECT_TRUE(result != nullptr);
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002883 // TODO: BUG: there should only be one query, an AAAA (which returns no records), because the
2884 // A is already cached. But there is an extra AAAA.
2885 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
nuccachena26cc2a2018-07-17 18:07:23 +08002886
2887 result_str = ToString(result);
2888 EXPECT_EQ(result_str, "1.2.3.4");
2889}
2890
nuccachena26cc2a2018-07-17 18:07:23 +08002891TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecified) {
2892 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002893 constexpr char dns64_name[] = "ipv4only.arpa.";
2894 constexpr char host_name[] = "v4only.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 };
nuccachena26cc2a2018-07-17 18:07:23 +08002899
Xiao Ma09b71022018-12-11 17:56:32 +09002900 test::DNSResponder dns(listen_addr);
2901 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002902 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002903 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002904
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002905 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002906 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002907 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002908
2909 // Ensure to synthesize AAAA if AF_INET6 is specified, and not to synthesize AAAA
2910 // in AF_INET case.
2911 addrinfo hints;
2912 memset(&hints, 0, sizeof(hints));
2913 hints.ai_family = AF_INET6;
2914 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
2915 EXPECT_TRUE(result != nullptr);
2916 std::string result_str = ToString(result);
2917 EXPECT_EQ(result_str, "64:ff9b::102:304");
2918
2919 hints.ai_family = AF_INET;
2920 result = safe_getaddrinfo("v4only", nullptr, &hints);
2921 EXPECT_TRUE(result != nullptr);
2922 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2923 result_str = ToString(result);
2924 EXPECT_EQ(result_str, "1.2.3.4");
2925}
nuccachena26cc2a2018-07-17 18:07:23 +08002926
2927TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedV6) {
2928 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002929 constexpr char dns64_name[] = "ipv4only.arpa.";
2930 constexpr char host_name[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002931 const std::vector<DnsRecord> records = {
2932 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2933 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2934 {host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
2935 };
nuccachena26cc2a2018-07-17 18:07:23 +08002936
Xiao Ma09b71022018-12-11 17:56:32 +09002937 test::DNSResponder dns(listen_addr);
2938 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002939 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002940 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002941
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002942 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002943 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002944 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002945
Xiao Ma09b71022018-12-11 17:56:32 +09002946 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08002947 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
2948 EXPECT_TRUE(result != nullptr);
2949 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2950
2951 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
Xiao Ma09b71022018-12-11 17:56:32 +09002952 const std::vector<std::string> result_strs = ToStrings(result);
nuccachena26cc2a2018-07-17 18:07:23 +08002953 for (const auto& str : result_strs) {
2954 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
2955 << ", result_str='" << str << "'";
2956 }
2957}
2958
2959TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedNoV6) {
2960 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002961 constexpr char dns64_name[] = "ipv4only.arpa.";
2962 constexpr char host_name[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002963 const std::vector<DnsRecord> records = {
2964 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2965 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2966 };
nuccachena26cc2a2018-07-17 18:07:23 +08002967
Xiao Ma09b71022018-12-11 17:56:32 +09002968 test::DNSResponder dns(listen_addr);
2969 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002970 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002971 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002972
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002973 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002974 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002975 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002976
Xiao Ma09b71022018-12-11 17:56:32 +09002977 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08002978 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
2979 EXPECT_TRUE(result != nullptr);
2980 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2981
2982 // In AF_UNSPEC case, synthesize AAAA if there's no AAAA answer.
2983 std::string result_str = ToString(result);
2984 EXPECT_EQ(result_str, "64:ff9b::102:304");
2985}
2986
2987TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecialUseIPv4Addresses) {
2988 constexpr char THIS_NETWORK[] = "this_network";
2989 constexpr char LOOPBACK[] = "loopback";
2990 constexpr char LINK_LOCAL[] = "link_local";
2991 constexpr char MULTICAST[] = "multicast";
2992 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
2993
2994 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
2995 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
2996 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
2997 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
2998 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
2999
3000 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003001 constexpr char dns64_name[] = "ipv4only.arpa.";
3002
Xiao Ma09b71022018-12-11 17:56:32 +09003003 test::DNSResponder dns(listen_addr);
3004 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003005 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003006 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003007
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003008 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003009 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003010 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003011
Luke Huangf8215372019-11-22 11:53:41 +08003012 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003013 static const struct TestConfig {
3014 std::string name;
3015 std::string addr;
3016
3017 std::string asHostName() const { return StringPrintf("%s.example.com.", name.c_str()); }
3018 } testConfigs[]{
3019 {THIS_NETWORK, ADDR_THIS_NETWORK},
3020 {LOOPBACK, ADDR_LOOPBACK},
3021 {LINK_LOCAL, ADDR_LINK_LOCAL},
3022 {MULTICAST, ADDR_MULTICAST},
3023 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
3024 };
Luke Huangf8215372019-11-22 11:53:41 +08003025 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003026
3027 for (const auto& config : testConfigs) {
3028 const std::string testHostName = config.asHostName();
3029 SCOPED_TRACE(testHostName);
3030
3031 const char* host_name = testHostName.c_str();
3032 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
3033
3034 addrinfo hints;
3035 memset(&hints, 0, sizeof(hints));
3036 hints.ai_family = AF_INET6;
3037 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
3038 // In AF_INET6 case, don't return IPv4 answers
3039 EXPECT_TRUE(result == nullptr);
3040 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3041 dns.clearQueries();
3042
3043 memset(&hints, 0, sizeof(hints));
3044 hints.ai_family = AF_UNSPEC;
3045 result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
3046 EXPECT_TRUE(result != nullptr);
3047 // Expect IPv6 query only. IPv4 answer has been cached in previous query.
3048 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3049 // In AF_UNSPEC case, don't synthesize special use IPv4 address.
3050 std::string result_str = ToString(result);
3051 EXPECT_EQ(result_str, config.addr.c_str());
3052 dns.clearQueries();
3053 }
3054}
3055
3056TEST_F(ResolverTest, GetAddrInfo_Dns64QueryWithNullArgumentHints) {
3057 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003058 constexpr char dns64_name[] = "ipv4only.arpa.";
3059 constexpr char host_name[] = "v4only.example.com.";
3060 constexpr char host_name2[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003061 const std::vector<DnsRecord> records = {
3062 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3063 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3064 {host_name2, ns_type::ns_t_a, "1.2.3.4"},
3065 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
3066 };
nuccachena26cc2a2018-07-17 18:07:23 +08003067
Xiao Ma09b71022018-12-11 17:56:32 +09003068 test::DNSResponder dns(listen_addr);
3069 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003070 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003071 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003072
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003073 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003074 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003075 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003076
3077 // Assign argument hints of getaddrinfo() as null is equivalent to set ai_family AF_UNSPEC.
3078 // In AF_UNSPEC case, synthesize AAAA if there has A answer only.
3079 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, nullptr);
3080 EXPECT_TRUE(result != nullptr);
3081 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3082 std::string result_str = ToString(result);
3083 EXPECT_EQ(result_str, "64:ff9b::102:304");
3084 dns.clearQueries();
3085
3086 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
3087 result = safe_getaddrinfo("v4v6", nullptr, nullptr);
3088 EXPECT_TRUE(result != nullptr);
3089 EXPECT_LE(2U, GetNumQueries(dns, host_name2));
3090 std::vector<std::string> result_strs = ToStrings(result);
3091 for (const auto& str : result_strs) {
3092 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
3093 << ", result_str='" << str << "'";
3094 }
3095}
3096
3097TEST_F(ResolverTest, GetAddrInfo_Dns64QueryNullArgumentNode) {
3098 constexpr char ADDR_ANYADDR_V4[] = "0.0.0.0";
3099 constexpr char ADDR_ANYADDR_V6[] = "::";
3100 constexpr char ADDR_LOCALHOST_V4[] = "127.0.0.1";
3101 constexpr char ADDR_LOCALHOST_V6[] = "::1";
3102
3103 constexpr char PORT_NAME_HTTP[] = "http";
3104 constexpr char PORT_NUMBER_HTTP[] = "80";
3105
3106 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003107 constexpr char dns64_name[] = "ipv4only.arpa.";
3108
Xiao Ma09b71022018-12-11 17:56:32 +09003109 test::DNSResponder dns(listen_addr);
3110 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003111 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003112 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003113
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003114 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003115 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003116 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003117
Luke Huangf8215372019-11-22 11:53:41 +08003118 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003119 // If node is null, return address is listed by libc/getaddrinfo.c as follows.
3120 // - passive socket -> anyaddr (0.0.0.0 or ::)
3121 // - non-passive socket -> localhost (127.0.0.1 or ::1)
3122 static const struct TestConfig {
3123 int flag;
3124 std::string addr_v4;
3125 std::string addr_v6;
3126
3127 std::string asParameters() const {
3128 return StringPrintf("flag=%d, addr_v4=%s, addr_v6=%s", flag, addr_v4.c_str(),
3129 addr_v6.c_str());
3130 }
3131 } testConfigs[]{
3132 {0 /* non-passive */, ADDR_LOCALHOST_V4, ADDR_LOCALHOST_V6},
3133 {AI_PASSIVE, ADDR_ANYADDR_V4, ADDR_ANYADDR_V6}
3134 };
Luke Huangf8215372019-11-22 11:53:41 +08003135 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003136
3137 for (const auto& config : testConfigs) {
3138 SCOPED_TRACE(config.asParameters());
3139
Xiao Ma09b71022018-12-11 17:56:32 +09003140 addrinfo hints = {
Nick Desaulnierscd6395a2019-10-11 09:15:24 -07003141 .ai_flags = config.flag,
Xiao Ma09b71022018-12-11 17:56:32 +09003142 .ai_family = AF_UNSPEC, // any address family
3143 .ai_socktype = 0, // any type
3144 .ai_protocol = 0, // any protocol
Xiao Ma09b71022018-12-11 17:56:32 +09003145 };
nuccachena26cc2a2018-07-17 18:07:23 +08003146
3147 // Assign hostname as null and service as port name.
3148 ScopedAddrinfo result = safe_getaddrinfo(nullptr, PORT_NAME_HTTP, &hints);
3149 ASSERT_TRUE(result != nullptr);
3150
3151 // Can't be synthesized because it should not get into Netd.
3152 std::vector<std::string> result_strs = ToStrings(result);
3153 for (const auto& str : result_strs) {
3154 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
3155 << ", result_str='" << str << "'";
3156 }
3157
3158 // Assign hostname as null and service as numeric port number.
3159 hints.ai_flags = config.flag | AI_NUMERICSERV;
3160 result = safe_getaddrinfo(nullptr, PORT_NUMBER_HTTP, &hints);
3161 ASSERT_TRUE(result != nullptr);
3162
3163 // Can't be synthesized because it should not get into Netd.
3164 result_strs = ToStrings(result);
3165 for (const auto& str : result_strs) {
3166 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
3167 << ", result_str='" << str << "'";
3168 }
3169 }
3170}
3171
3172TEST_F(ResolverTest, GetHostByAddr_ReverseDnsQueryWithHavingNat64Prefix) {
3173 struct hostent* result = nullptr;
3174 struct in_addr v4addr;
3175 struct in6_addr v6addr;
3176
3177 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003178 constexpr char dns64_name[] = "ipv4only.arpa.";
3179 constexpr char ptr_name[] = "v4v6.example.com.";
3180 // PTR record for IPv4 address 1.2.3.4
3181 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3182 // PTR record for IPv6 address 2001:db8::102:304
3183 constexpr char ptr_addr_v6[] =
3184 "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 +09003185 const std::vector<DnsRecord> records = {
3186 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3187 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3188 {ptr_addr_v6, ns_type::ns_t_ptr, ptr_name},
3189 };
nuccachena26cc2a2018-07-17 18:07:23 +08003190
Xiao Ma09b71022018-12-11 17:56:32 +09003191 test::DNSResponder dns(listen_addr);
3192 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003193 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003194 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003195
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003196 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003197 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003198 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003199
3200 // Reverse IPv4 DNS query. Prefix should have no effect on it.
3201 inet_pton(AF_INET, "1.2.3.4", &v4addr);
3202 result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
3203 ASSERT_TRUE(result != nullptr);
3204 std::string result_str = result->h_name ? result->h_name : "null";
3205 EXPECT_EQ(result_str, "v4v6.example.com");
3206
3207 // Reverse IPv6 DNS query. Prefix should have no effect on it.
3208 inet_pton(AF_INET6, "2001:db8::102:304", &v6addr);
3209 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3210 ASSERT_TRUE(result != nullptr);
3211 result_str = result->h_name ? result->h_name : "null";
3212 EXPECT_EQ(result_str, "v4v6.example.com");
3213}
3214
3215TEST_F(ResolverTest, GetHostByAddr_ReverseDns64Query) {
3216 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003217 constexpr char dns64_name[] = "ipv4only.arpa.";
3218 constexpr char ptr_name[] = "v4only.example.com.";
3219 // PTR record for IPv4 address 1.2.3.4
3220 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3221 // PTR record for IPv6 address 64:ff9b::1.2.3.4
3222 constexpr char ptr_addr_v6_nomapping[] =
3223 "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.";
3224 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
3225 // PTR record for IPv6 address 64:ff9b::5.6.7.8
3226 constexpr char ptr_addr_v6_synthesis[] =
3227 "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 +09003228 const std::vector<DnsRecord> records = {
3229 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3230 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3231 {ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis},
3232 };
nuccachena26cc2a2018-07-17 18:07:23 +08003233
Xiao Ma09b71022018-12-11 17:56:32 +09003234 test::DNSResponder dns(listen_addr);
3235 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003236 // "ptr_addr_v6_nomapping" is not mapped in DNS server
nuccachena26cc2a2018-07-17 18:07:23 +08003237 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003238 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003239
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003240 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003241 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003242 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003243
3244 // Synthesized PTR record doesn't exist on DNS server
3245 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
3246 // After querying synthesized address failed, expect that prefix is removed from IPv6
3247 // synthesized address and do reverse IPv4 query instead.
3248 struct in6_addr v6addr;
3249 inet_pton(AF_INET6, "64:ff9b::1.2.3.4", &v6addr);
3250 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3251 ASSERT_TRUE(result != nullptr);
3252 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist
3253 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist
3254 std::string result_str = result->h_name ? result->h_name : "null";
3255 EXPECT_EQ(result_str, "v4only.example.com");
3256 // Check that return address has been mapped from IPv4 to IPv6 address because Netd
3257 // removes NAT64 prefix and does IPv4 DNS reverse lookup in this case. Then, Netd
3258 // fakes the return IPv4 address as original queried IPv6 address.
3259 result_str = ToString(result);
3260 EXPECT_EQ(result_str, "64:ff9b::102:304");
3261 dns.clearQueries();
3262
3263 // Synthesized PTR record exists on DNS server
3264 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
3265 // Expect to Netd pass through synthesized address for DNS queries.
3266 inet_pton(AF_INET6, "64:ff9b::5.6.7.8", &v6addr);
3267 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3268 ASSERT_TRUE(result != nullptr);
3269 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
3270 result_str = result->h_name ? result->h_name : "null";
3271 EXPECT_EQ(result_str, "v6synthesis.example.com");
3272}
3273
3274TEST_F(ResolverTest, GetHostByAddr_ReverseDns64QueryFromHostFile) {
3275 constexpr char dns64_name[] = "ipv4only.arpa.";
3276 constexpr char host_name[] = "localhost";
3277 // The address is synthesized by prefix64:localhost.
3278 constexpr char host_addr[] = "64:ff9b::7f00:1";
nuccachena26cc2a2018-07-17 18:07:23 +08003279 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003280
3281 test::DNSResponder dns(listen_addr);
3282 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003283 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003284 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003285
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003286 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003287 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003288 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003289
3290 // Using synthesized "localhost" address to be a trick for resolving host name
3291 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
3292 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
3293 struct in6_addr v6addr;
3294 inet_pton(AF_INET6, host_addr, &v6addr);
3295 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3296 ASSERT_TRUE(result != nullptr);
3297 // Expect no DNS queries; localhost is resolved via /etc/hosts.
3298 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
3299
Luke Huangf8215372019-11-22 11:53:41 +08003300 ASSERT_EQ(sizeof(in6_addr), (unsigned)result->h_length);
nuccachena26cc2a2018-07-17 18:07:23 +08003301 ASSERT_EQ(AF_INET6, result->h_addrtype);
3302 std::string result_str = ToString(result);
3303 EXPECT_EQ(result_str, host_addr);
3304 result_str = result->h_name ? result->h_name : "null";
3305 EXPECT_EQ(result_str, host_name);
3306}
3307
Hungming Chen9e6185a2019-06-04 16:09:19 +08003308TEST_F(ResolverTest, GetHostByAddr_cnamesClasslessReverseDelegation) {
3309 // IPv4 addresses in the subnet with notation '/' or '-'.
3310 constexpr char addr_slash[] = "192.0.2.1";
3311 constexpr char addr_hyphen[] = "192.0.3.1";
3312
3313 // Used to verify DNS reverse query for classless reverse lookup zone. See detail in RFC 2317
3314 // section 4.
3315 const static std::vector<DnsRecord> records = {
3316 // The records for reverse querying "192.0.2.1" in the subnet with notation '/'.
3317 {"1.2.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0/25.2.0.192.in-addr.arpa."},
3318 {"1.0/25.2.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3319
3320 // The records for reverse querying "192.0.3.1" in the subnet with notation '-'.
3321 {"1.3.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0-127.3.0.192.in-addr.arpa."},
3322 {"1.0-127.3.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3323 };
3324
3325 test::DNSResponder dns;
3326 StartDns(dns, records);
3327 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3328
3329 for (const auto& address : {addr_slash, addr_hyphen}) {
3330 SCOPED_TRACE(address);
3331
3332 in_addr v4addr;
3333 ASSERT_TRUE(inet_pton(AF_INET, address, &v4addr));
3334 hostent* result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
3335 ASSERT_TRUE(result != nullptr);
3336 EXPECT_STREQ("hello.example.com", result->h_name);
3337 }
3338}
3339
nuccachena26cc2a2018-07-17 18:07:23 +08003340TEST_F(ResolverTest, GetNameInfo_ReverseDnsQueryWithHavingNat64Prefix) {
3341 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003342 constexpr char dns64_name[] = "ipv4only.arpa.";
3343 constexpr char ptr_name[] = "v4v6.example.com.";
3344 // PTR record for IPv4 address 1.2.3.4
3345 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3346 // PTR record for IPv6 address 2001:db8::102:304
3347 constexpr char ptr_addr_v6[] =
3348 "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 +09003349 const std::vector<DnsRecord> records = {
3350 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3351 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3352 {ptr_addr_v6, ns_type::ns_t_ptr, ptr_name},
3353 };
nuccachena26cc2a2018-07-17 18:07:23 +08003354
Xiao Ma09b71022018-12-11 17:56:32 +09003355 test::DNSResponder dns(listen_addr);
3356 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003357 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003358 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003359
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003360 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003361 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003362 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003363
Luke Huangf8215372019-11-22 11:53:41 +08003364 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003365 static const struct TestConfig {
3366 int flag;
3367 int family;
3368 std::string addr;
3369 std::string host;
3370
3371 std::string asParameters() const {
3372 return StringPrintf("flag=%d, family=%d, addr=%s, host=%s", flag, family, addr.c_str(),
3373 host.c_str());
3374 }
3375 } testConfigs[]{
3376 {NI_NAMEREQD, AF_INET, "1.2.3.4", "v4v6.example.com"},
3377 {NI_NUMERICHOST, AF_INET, "1.2.3.4", "1.2.3.4"},
3378 {0, AF_INET, "1.2.3.4", "v4v6.example.com"},
3379 {0, AF_INET, "5.6.7.8", "5.6.7.8"}, // unmapped
3380 {NI_NAMEREQD, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
3381 {NI_NUMERICHOST, AF_INET6, "2001:db8::102:304", "2001:db8::102:304"},
3382 {0, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
3383 {0, AF_INET6, "2001:db8::506:708", "2001:db8::506:708"}, // unmapped
3384 };
Luke Huangf8215372019-11-22 11:53:41 +08003385 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003386
3387 // Reverse IPv4/IPv6 DNS query. Prefix should have no effect on it.
3388 for (const auto& config : testConfigs) {
3389 SCOPED_TRACE(config.asParameters());
3390
3391 int rv;
3392 char host[NI_MAXHOST];
3393 struct sockaddr_in sin;
3394 struct sockaddr_in6 sin6;
3395 if (config.family == AF_INET) {
3396 memset(&sin, 0, sizeof(sin));
3397 sin.sin_family = AF_INET;
3398 inet_pton(AF_INET, config.addr.c_str(), &sin.sin_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003399 rv = getnameinfo((const struct sockaddr*)&sin, sizeof(sin), host, sizeof(host), nullptr,
3400 0, config.flag);
nuccachena26cc2a2018-07-17 18:07:23 +08003401 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4));
3402 } else if (config.family == AF_INET6) {
3403 memset(&sin6, 0, sizeof(sin6));
3404 sin6.sin6_family = AF_INET6;
3405 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003406 rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host),
nuccachena26cc2a2018-07-17 18:07:23 +08003407 nullptr, 0, config.flag);
3408 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6));
3409 }
3410 ASSERT_EQ(0, rv);
3411 std::string result_str = host;
3412 EXPECT_EQ(result_str, config.host);
3413 dns.clearQueries();
3414 }
3415}
3416
3417TEST_F(ResolverTest, GetNameInfo_ReverseDns64Query) {
3418 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003419 constexpr char dns64_name[] = "ipv4only.arpa.";
3420 constexpr char ptr_name[] = "v4only.example.com.";
3421 // PTR record for IPv4 address 1.2.3.4
3422 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3423 // PTR record for IPv6 address 64:ff9b::1.2.3.4
3424 constexpr char ptr_addr_v6_nomapping[] =
3425 "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.";
3426 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
3427 // PTR record for IPv6 address 64:ff9b::5.6.7.8
3428 constexpr char ptr_addr_v6_synthesis[] =
3429 "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 +09003430 const std::vector<DnsRecord> records = {
3431 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3432 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3433 {ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis},
3434 };
nuccachena26cc2a2018-07-17 18:07:23 +08003435
Xiao Ma09b71022018-12-11 17:56:32 +09003436 test::DNSResponder dns(listen_addr);
3437 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003438 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003439 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003440
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003441 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003442 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003443 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003444
Luke Huangf8215372019-11-22 11:53:41 +08003445 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003446 static const struct TestConfig {
3447 bool hasSynthesizedPtrRecord;
3448 int flag;
3449 std::string addr;
3450 std::string host;
3451
3452 std::string asParameters() const {
3453 return StringPrintf("hasSynthesizedPtrRecord=%d, flag=%d, addr=%s, host=%s",
3454 hasSynthesizedPtrRecord, flag, addr.c_str(), host.c_str());
3455 }
3456 } testConfigs[]{
3457 {false, NI_NAMEREQD, "64:ff9b::102:304", "v4only.example.com"},
3458 {false, NI_NUMERICHOST, "64:ff9b::102:304", "64:ff9b::102:304"},
3459 {false, 0, "64:ff9b::102:304", "v4only.example.com"},
3460 {true, NI_NAMEREQD, "64:ff9b::506:708", "v6synthesis.example.com"},
3461 {true, NI_NUMERICHOST, "64:ff9b::506:708", "64:ff9b::506:708"},
3462 {true, 0, "64:ff9b::506:708", "v6synthesis.example.com"}
3463 };
Luke Huangf8215372019-11-22 11:53:41 +08003464 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003465
3466 // hasSynthesizedPtrRecord = false
3467 // Synthesized PTR record doesn't exist on DNS server
3468 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
3469 // After querying synthesized address failed, expect that prefix is removed from IPv6
3470 // synthesized address and do reverse IPv4 query instead.
3471 //
3472 // hasSynthesizedPtrRecord = true
3473 // Synthesized PTR record exists on DNS server
3474 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
3475 // Expect to just pass through synthesized address for DNS queries.
3476 for (const auto& config : testConfigs) {
3477 SCOPED_TRACE(config.asParameters());
3478
3479 char host[NI_MAXHOST];
3480 struct sockaddr_in6 sin6;
3481 memset(&sin6, 0, sizeof(sin6));
3482 sin6.sin6_family = AF_INET6;
3483 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003484 int rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host),
nuccachena26cc2a2018-07-17 18:07:23 +08003485 nullptr, 0, config.flag);
3486 ASSERT_EQ(0, rv);
3487 if (config.flag == NI_NAMEREQD) {
3488 if (config.hasSynthesizedPtrRecord) {
3489 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
3490 } else {
3491 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist.
3492 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist.
3493 }
3494 }
3495 std::string result_str = host;
3496 EXPECT_EQ(result_str, config.host);
3497 dns.clearQueries();
3498 }
3499}
3500
3501TEST_F(ResolverTest, GetNameInfo_ReverseDns64QueryFromHostFile) {
3502 constexpr char dns64_name[] = "ipv4only.arpa.";
3503 constexpr char host_name[] = "localhost";
3504 // The address is synthesized by prefix64:localhost.
3505 constexpr char host_addr[] = "64:ff9b::7f00:1";
nuccachena26cc2a2018-07-17 18:07:23 +08003506 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003507
3508 test::DNSResponder dns(listen_addr);
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003509
Xiao Ma09b71022018-12-11 17:56:32 +09003510 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003511 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003512 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003513
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003514 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003515 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003516 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003517
3518 // Using synthesized "localhost" address to be a trick for resolving host name
3519 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
3520 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
3521 char host[NI_MAXHOST];
Xiao Ma09b71022018-12-11 17:56:32 +09003522 struct sockaddr_in6 sin6 = {.sin6_family = AF_INET6};
nuccachena26cc2a2018-07-17 18:07:23 +08003523 inet_pton(AF_INET6, host_addr, &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003524 int rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host), nullptr,
nuccachena26cc2a2018-07-17 18:07:23 +08003525 0, NI_NAMEREQD);
3526 ASSERT_EQ(0, rv);
3527 // Expect no DNS queries; localhost is resolved via /etc/hosts.
3528 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
3529
3530 std::string result_str = host;
3531 EXPECT_EQ(result_str, host_name);
3532}
3533
Hungming Chen9e6185a2019-06-04 16:09:19 +08003534TEST_F(ResolverTest, GetNameInfo_cnamesClasslessReverseDelegation) {
3535 // IPv4 addresses in the subnet with notation '/' or '-'.
3536 constexpr char addr_slash[] = "192.0.2.1";
3537 constexpr char addr_hyphen[] = "192.0.3.1";
3538
3539 // Used to verify DNS reverse query for classless reverse lookup zone. See detail in RFC 2317
3540 // section 4.
3541 const static std::vector<DnsRecord> records = {
3542 // The records for reverse querying "192.0.2.1" in the subnet with notation '/'.
3543 {"1.2.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0/25.2.0.192.in-addr.arpa."},
3544 {"1.0/25.2.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3545
3546 // The records for reverse querying "192.0.3.1" in the subnet with notation '-'.
3547 {"1.3.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0-127.3.0.192.in-addr.arpa."},
3548 {"1.0-127.3.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3549 };
3550
3551 test::DNSResponder dns;
3552 StartDns(dns, records);
3553 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3554
3555 for (const auto& address : {addr_slash, addr_hyphen}) {
3556 SCOPED_TRACE(address);
3557
3558 char host[NI_MAXHOST];
3559 sockaddr_in sin = {.sin_family = AF_INET};
3560 ASSERT_TRUE(inet_pton(AF_INET, address, &sin.sin_addr));
3561 int rv = getnameinfo((const sockaddr*)&sin, sizeof(sin), host, sizeof(host), nullptr, 0,
3562 NI_NAMEREQD);
3563 ASSERT_EQ(0, rv);
3564 EXPECT_STREQ("hello.example.com", host);
3565 }
3566}
3567
nuccachena26cc2a2018-07-17 18:07:23 +08003568TEST_F(ResolverTest, GetHostByName2_Dns64Synthesize) {
Xiao Ma09b71022018-12-11 17:56:32 +09003569 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003570 constexpr char dns64_name[] = "ipv4only.arpa.";
3571 constexpr char host_name[] = "ipv4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003572 const std::vector<DnsRecord> records = {
3573 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3574 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3575 };
nuccachena26cc2a2018-07-17 18:07:23 +08003576
Xiao Ma09b71022018-12-11 17:56:32 +09003577 test::DNSResponder dns(listen_addr);
3578 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003579 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003580 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003581
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003582 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003583 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003584 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003585
3586 // Query an IPv4-only hostname. Expect that gets a synthesized address.
3587 struct hostent* result = gethostbyname2("ipv4only", AF_INET6);
3588 ASSERT_TRUE(result != nullptr);
3589 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3590 std::string result_str = ToString(result);
3591 EXPECT_EQ(result_str, "64:ff9b::102:304");
3592}
nuccachena26cc2a2018-07-17 18:07:23 +08003593
3594TEST_F(ResolverTest, GetHostByName2_DnsQueryWithHavingNat64Prefix) {
3595 constexpr char dns64_name[] = "ipv4only.arpa.";
3596 constexpr char host_name[] = "v4v6.example.com.";
nuccachena26cc2a2018-07-17 18:07:23 +08003597 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003598 const std::vector<DnsRecord> records = {
3599 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3600 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3601 {host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
3602 };
3603
3604 test::DNSResponder dns(listen_addr);
3605 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003606 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003607 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003608
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003609 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003610 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003611 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003612
3613 // IPv4 DNS query. Prefix should have no effect on it.
3614 struct hostent* result = gethostbyname2("v4v6", AF_INET);
3615 ASSERT_TRUE(result != nullptr);
3616 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3617 std::string result_str = ToString(result);
3618 EXPECT_EQ(result_str, "1.2.3.4");
3619 dns.clearQueries();
3620
3621 // IPv6 DNS query. Prefix should have no effect on it.
3622 result = gethostbyname2("v4v6", AF_INET6);
3623 ASSERT_TRUE(result != nullptr);
3624 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3625 result_str = ToString(result);
3626 EXPECT_EQ(result_str, "2001:db8::102:304");
3627}
3628
3629TEST_F(ResolverTest, GetHostByName2_Dns64QuerySpecialUseIPv4Addresses) {
3630 constexpr char THIS_NETWORK[] = "this_network";
3631 constexpr char LOOPBACK[] = "loopback";
3632 constexpr char LINK_LOCAL[] = "link_local";
3633 constexpr char MULTICAST[] = "multicast";
3634 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
3635
3636 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
3637 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
3638 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
3639 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
3640 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
3641
3642 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003643 constexpr char dns64_name[] = "ipv4only.arpa.";
3644
Xiao Ma09b71022018-12-11 17:56:32 +09003645 test::DNSResponder dns(listen_addr);
3646 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003647 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003648 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003649
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003650 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003651 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003652 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003653
Luke Huangf8215372019-11-22 11:53:41 +08003654 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003655 static const struct TestConfig {
3656 std::string name;
3657 std::string addr;
3658
3659 std::string asHostName() const {
Luke Huangf8215372019-11-22 11:53:41 +08003660 return StringPrintf("%s.example.com.", name.c_str());
nuccachena26cc2a2018-07-17 18:07:23 +08003661 }
3662 } testConfigs[]{
3663 {THIS_NETWORK, ADDR_THIS_NETWORK},
3664 {LOOPBACK, ADDR_LOOPBACK},
3665 {LINK_LOCAL, ADDR_LINK_LOCAL},
3666 {MULTICAST, ADDR_MULTICAST},
3667 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
3668 };
Luke Huangf8215372019-11-22 11:53:41 +08003669 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003670
3671 for (const auto& config : testConfigs) {
3672 const std::string testHostName = config.asHostName();
3673 SCOPED_TRACE(testHostName);
3674
3675 const char* host_name = testHostName.c_str();
3676 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
3677
3678 struct hostent* result = gethostbyname2(config.name.c_str(), AF_INET6);
3679 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3680
3681 // In AF_INET6 case, don't synthesize special use IPv4 address.
3682 // Expect to have no answer
3683 EXPECT_EQ(nullptr, result);
3684
3685 dns.clearQueries();
3686 }
Bernie Innocenti2fef2b82018-12-20 15:56:40 +09003687}
Mike Yuf14e1a92019-05-10 13:54:58 +08003688
3689TEST_F(ResolverTest, PrefixDiscoveryBypassTls) {
3690 constexpr char listen_addr[] = "::1";
3691 constexpr char cleartext_port[] = "53";
3692 constexpr char tls_port[] = "853";
3693 constexpr char dns64_name[] = "ipv4only.arpa.";
3694 const std::vector<std::string> servers = {listen_addr};
3695
3696 test::DNSResponder dns(listen_addr);
3697 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
3698 test::DnsTlsFrontend tls(listen_addr, tls_port, listen_addr, cleartext_port);
3699 ASSERT_TRUE(tls.startServer());
3700
3701 // Setup OPPORTUNISTIC mode and wait for the validation complete.
waynema0e73c2e2019-07-31 15:04:08 +08003702 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08003703 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003704 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yuf14e1a92019-05-10 13:54:58 +08003705 tls.clearQueries();
3706
3707 // Start NAT64 prefix discovery and wait for it complete.
3708 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003709 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
Mike Yuf14e1a92019-05-10 13:54:58 +08003710
3711 // Verify it bypassed TLS even though there's a TLS server available.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003712 EXPECT_EQ(0, tls.queries()) << dns.dumpQueries();
3713 EXPECT_EQ(1U, GetNumQueries(dns, dns64_name)) << dns.dumpQueries();
Mike Yuf14e1a92019-05-10 13:54:58 +08003714
3715 // Restart the testing network to reset the cache.
3716 mDnsClient.TearDown();
3717 mDnsClient.SetUp();
3718 dns.clearQueries();
3719
3720 // Setup STRICT mode and wait for the validation complete.
waynema0e73c2e2019-07-31 15:04:08 +08003721 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
3722 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08003723 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003724 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yuf14e1a92019-05-10 13:54:58 +08003725 tls.clearQueries();
3726
3727 // Start NAT64 prefix discovery and wait for it to complete.
3728 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003729 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
Mike Yuf14e1a92019-05-10 13:54:58 +08003730
3731 // Verify it bypassed TLS despite STRICT mode.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003732 EXPECT_EQ(0, tls.queries()) << dns.dumpQueries();
3733 EXPECT_EQ(1U, GetNumQueries(dns, dns64_name)) << dns.dumpQueries();
Mike Yuf14e1a92019-05-10 13:54:58 +08003734}
Luke Huang9807e6b2019-05-20 16:17:12 +08003735
Lorenzo Colittie51091d2020-05-20 02:48:44 +09003736TEST_F(ResolverTest, SetAndClearNat64Prefix) {
3737 constexpr char host_name[] = "v4.example.com.";
3738 constexpr char listen_addr[] = "::1";
3739 const std::vector<DnsRecord> records = {
3740 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3741 };
3742 const std::string kNat64Prefix1 = "64:ff9b::/96";
3743 const std::string kNat64Prefix2 = "2001:db8:6464::/96";
3744
3745 test::DNSResponder dns(listen_addr);
3746 StartDns(dns, records);
3747 const std::vector<std::string> servers = {listen_addr};
3748 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
3749
3750 auto resolvService = mDnsClient.resolvService();
3751 addrinfo hints = {.ai_family = AF_INET6};
3752
3753 // No NAT64 prefix, no AAAA record.
3754 ScopedAddrinfo result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3755 ASSERT_TRUE(result == nullptr);
3756
3757 // Set the prefix, and expect to get a synthesized AAAA record.
3758 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix2).isOk());
3759 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3760 ASSERT_FALSE(result == nullptr);
3761 EXPECT_EQ("2001:db8:6464::102:304", ToString(result));
3762
3763 // Update the prefix, expect to see AAAA records from the new prefix.
3764 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3765 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3766 ASSERT_FALSE(result == nullptr);
3767 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3768
3769 // Non-/96 prefixes are ignored.
3770 auto status = resolvService->setPrefix64(TEST_NETID, "64:ff9b::/64");
3771 EXPECT_FALSE(status.isOk());
3772 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3773 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3774
3775 // Invalid prefixes are ignored.
3776 status = resolvService->setPrefix64(TEST_NETID, "192.0.2.0/24");
3777 EXPECT_FALSE(status.isOk());
3778 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3779 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3780
3781 status = resolvService->setPrefix64(TEST_NETID, "192.0.2.1");
3782 EXPECT_FALSE(status.isOk());
3783 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3784 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3785
3786 status = resolvService->setPrefix64(TEST_NETID, "hello");
3787 EXPECT_FALSE(status.isOk());
3788 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3789 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3790
3791 // DNS64 synthesis is still working.
3792 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3793 ASSERT_FALSE(result == nullptr);
3794 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3795
3796 // Clear the prefix. No AAAA records any more.
3797 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, "").isOk());
3798 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3799 EXPECT_TRUE(result == nullptr);
3800
3801 // Calling startPrefix64Discovery clears the prefix.
3802 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3803 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3804 ASSERT_FALSE(result == nullptr);
3805 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3806
3807 EXPECT_TRUE(resolvService->startPrefix64Discovery(TEST_NETID).isOk());
3808 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3809 ASSERT_TRUE(result == nullptr);
3810
3811 // setPrefix64 fails if prefix discovery is started, even if no prefix is yet discovered...
3812 status = resolvService->setPrefix64(TEST_NETID, kNat64Prefix1);
3813 EXPECT_FALSE(status.isOk());
3814 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3815 EXPECT_EQ(EEXIST, status.getServiceSpecificError());
3816
3817 // .. and clearing the prefix also has no effect.
3818 status = resolvService->setPrefix64(TEST_NETID, "");
3819 EXPECT_FALSE(status.isOk());
3820 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3821 EXPECT_EQ(ENOENT, status.getServiceSpecificError());
3822
3823 // setPrefix64 succeeds again when prefix discovery is stopped.
3824 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
3825 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3826 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3827 ASSERT_FALSE(result == nullptr);
3828 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3829
3830 // Calling stopPrefix64Discovery clears the prefix.
3831 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
3832 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3833 ASSERT_TRUE(result == nullptr);
3834
3835 // Set up NAT64 prefix discovery.
3836 constexpr char dns64_name[] = "ipv4only.arpa.";
3837 const std::vector<DnsRecord> newRecords = {
3838 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3839 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3840 };
3841 dns.stopServer();
3842 StartDns(dns, newRecords);
3843
3844 EXPECT_TRUE(resolvService->startPrefix64Discovery(TEST_NETID).isOk());
3845 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
3846 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3847 ASSERT_FALSE(result == nullptr);
3848 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3849
3850 // setPrefix64 fails if NAT64 prefix discovery has succeeded, and the discovered prefix
3851 // continues to be used.
3852 status = resolvService->setPrefix64(TEST_NETID, kNat64Prefix2);
3853 EXPECT_FALSE(status.isOk());
3854 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3855 EXPECT_EQ(EEXIST, status.getServiceSpecificError());
3856
3857 // Clearing the prefix also has no effect if discovery is started.
3858 status = resolvService->setPrefix64(TEST_NETID, "");
3859 EXPECT_FALSE(status.isOk());
3860 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3861 EXPECT_EQ(ENOENT, status.getServiceSpecificError());
3862
3863 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3864 ASSERT_FALSE(result == nullptr);
3865 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3866
3867 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
3868 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_NOT_FOUND));
Lorenzo Colitti61f796b2020-05-21 00:57:49 +09003869
3870 EXPECT_EQ(0, sDnsMetricsListener->getUnexpectedNat64PrefixUpdates());
Lorenzo Colittie51091d2020-05-20 02:48:44 +09003871}
3872
Luke Huang9807e6b2019-05-20 16:17:12 +08003873namespace {
3874
Luke Huang0d592bc2019-05-25 18:24:03 +08003875class ScopedSetNetworkForProcess {
3876 public:
3877 explicit ScopedSetNetworkForProcess(unsigned netId) {
3878 mStoredNetId = getNetworkForProcess();
3879 if (netId == mStoredNetId) return;
3880 EXPECT_EQ(0, setNetworkForProcess(netId));
3881 }
3882 ~ScopedSetNetworkForProcess() { EXPECT_EQ(0, setNetworkForProcess(mStoredNetId)); }
3883
3884 private:
3885 unsigned mStoredNetId;
3886};
3887
3888class ScopedSetNetworkForResolv {
3889 public:
3890 explicit ScopedSetNetworkForResolv(unsigned netId) { EXPECT_EQ(0, setNetworkForResolv(netId)); }
3891 ~ScopedSetNetworkForResolv() { EXPECT_EQ(0, setNetworkForResolv(NETID_UNSET)); }
3892};
3893
Luke Huang9807e6b2019-05-20 16:17:12 +08003894void sendCommand(int fd, const std::string& cmd) {
3895 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size() + 1));
3896 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size() + 1));
3897}
3898
3899int32_t readBE32(int fd) {
3900 int32_t tmp;
3901 int n = TEMP_FAILURE_RETRY(read(fd, &tmp, sizeof(tmp)));
3902 EXPECT_TRUE(n > 0);
3903 return ntohl(tmp);
3904}
3905
Luke Huang0d592bc2019-05-25 18:24:03 +08003906int readResponseCode(int fd) {
Luke Huang9807e6b2019-05-20 16:17:12 +08003907 char buf[4];
3908 int n = TEMP_FAILURE_RETRY(read(fd, &buf, sizeof(buf)));
3909 EXPECT_TRUE(n > 0);
3910 // The format of response code is that 4 bytes for the code & null.
3911 buf[3] = '\0';
3912 int result;
3913 EXPECT_TRUE(ParseInt(buf, &result));
3914 return result;
3915}
3916
Luke Huang0d592bc2019-05-25 18:24:03 +08003917bool checkAndClearUseLocalNameserversFlag(unsigned* netid) {
3918 if (netid == nullptr || ((*netid) & NETID_USE_LOCAL_NAMESERVERS) == 0) {
3919 return false;
3920 }
3921 *netid = (*netid) & ~NETID_USE_LOCAL_NAMESERVERS;
3922 return true;
3923}
3924
Luke Huangf8215372019-11-22 11:53:41 +08003925aidl::android::net::UidRangeParcel makeUidRangeParcel(int start, int stop) {
3926 aidl::android::net::UidRangeParcel res;
Luke Huang0d592bc2019-05-25 18:24:03 +08003927 res.start = start;
3928 res.stop = stop;
3929
3930 return res;
3931}
3932
3933void expectNetIdWithLocalNameserversFlag(unsigned netId) {
3934 unsigned dnsNetId = 0;
3935 EXPECT_EQ(0, getNetworkForDns(&dnsNetId));
3936 EXPECT_TRUE(checkAndClearUseLocalNameserversFlag(&dnsNetId));
3937 EXPECT_EQ(netId, static_cast<unsigned>(dnsNetId));
3938}
3939
3940void expectDnsNetIdEquals(unsigned netId) {
3941 unsigned dnsNetId = 0;
3942 EXPECT_EQ(0, getNetworkForDns(&dnsNetId));
3943 EXPECT_EQ(netId, static_cast<unsigned>(dnsNetId));
3944}
3945
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003946void expectDnsNetIdIsDefaultNetwork(INetd* netdService) {
Luke Huang0d592bc2019-05-25 18:24:03 +08003947 int currentNetid;
3948 EXPECT_TRUE(netdService->networkGetDefault(&currentNetid).isOk());
3949 expectDnsNetIdEquals(currentNetid);
3950}
3951
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09003952void expectDnsNetIdWithVpn(INetd* netdService, unsigned vpnNetId, unsigned expectedNetId) {
Luke Huang0d592bc2019-05-25 18:24:03 +08003953 EXPECT_TRUE(netdService->networkCreateVpn(vpnNetId, false /* secure */).isOk());
3954 uid_t uid = getuid();
3955 // Add uid to VPN
3956 EXPECT_TRUE(netdService->networkAddUidRanges(vpnNetId, {makeUidRangeParcel(uid, uid)}).isOk());
3957 expectDnsNetIdEquals(expectedNetId);
3958 EXPECT_TRUE(netdService->networkDestroy(vpnNetId).isOk());
3959}
3960
Luke Huang9807e6b2019-05-20 16:17:12 +08003961} // namespace
3962
3963TEST_F(ResolverTest, getDnsNetId) {
3964 // We've called setNetworkForProcess in SetupOemNetwork, so reset to default first.
3965 setNetworkForProcess(NETID_UNSET);
Luke Huang0d592bc2019-05-25 18:24:03 +08003966
3967 expectDnsNetIdIsDefaultNetwork(mDnsClient.netdService());
3968 expectDnsNetIdWithVpn(mDnsClient.netdService(), TEST_VPN_NETID, TEST_VPN_NETID);
Luke Huang9807e6b2019-05-20 16:17:12 +08003969
3970 // Test with setNetworkForProcess
Luke Huang0d592bc2019-05-25 18:24:03 +08003971 {
3972 ScopedSetNetworkForProcess scopedSetNetworkForProcess(TEST_NETID);
3973 expectDnsNetIdEquals(TEST_NETID);
3974 }
3975
3976 // Test with setNetworkForProcess with NETID_USE_LOCAL_NAMESERVERS
3977 {
3978 ScopedSetNetworkForProcess scopedSetNetworkForProcess(TEST_NETID |
3979 NETID_USE_LOCAL_NAMESERVERS);
3980 expectNetIdWithLocalNameserversFlag(TEST_NETID);
3981 }
Luke Huang9807e6b2019-05-20 16:17:12 +08003982
3983 // Test with setNetworkForResolv
Luke Huang0d592bc2019-05-25 18:24:03 +08003984 {
3985 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID);
3986 expectDnsNetIdEquals(TEST_NETID);
3987 }
3988
3989 // Test with setNetworkForResolv with NETID_USE_LOCAL_NAMESERVERS
3990 {
3991 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID |
3992 NETID_USE_LOCAL_NAMESERVERS);
3993 expectNetIdWithLocalNameserversFlag(TEST_NETID);
3994 }
3995
3996 // Test with setNetworkForResolv under bypassable vpn
3997 {
3998 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID);
3999 expectDnsNetIdWithVpn(mDnsClient.netdService(), TEST_VPN_NETID, TEST_NETID);
4000 }
Luke Huang9807e6b2019-05-20 16:17:12 +08004001
4002 // Create socket connected to DnsProxyListener
4003 int fd = dns_open_proxy();
4004 EXPECT_TRUE(fd > 0);
4005 unique_fd ufd(fd);
4006
4007 // Test command with wrong netId
4008 sendCommand(fd, "getdnsnetid abc");
Luke Huang0d592bc2019-05-25 18:24:03 +08004009 EXPECT_EQ(ResponseCode::DnsProxyQueryResult, readResponseCode(fd));
Luke Huang9807e6b2019-05-20 16:17:12 +08004010 EXPECT_EQ(-EINVAL, readBE32(fd));
4011
4012 // Test unsupported command
4013 sendCommand(fd, "getdnsnetidNotSupported");
4014 // Keep in sync with FrameworkListener.cpp (500, "Command not recognized")
Luke Huang0d592bc2019-05-25 18:24:03 +08004015 EXPECT_EQ(500, readResponseCode(fd));
Luke Huang9807e6b2019-05-20 16:17:12 +08004016}
Sehee Park2c118782019-05-07 13:02:45 +09004017
4018TEST_F(ResolverTest, BlockDnsQueryWithUidRule) {
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004019 // This test relies on blocking traffic on loopback, which xt_qtaguid does not do.
4020 // See aosp/358413 and b/34444781 for why.
4021 SKIP_IF_BPF_NOT_SUPPORTED;
4022
Sehee Park2c118782019-05-07 13:02:45 +09004023 constexpr char listen_addr1[] = "127.0.0.4";
4024 constexpr char listen_addr2[] = "::1";
4025 constexpr char host_name[] = "howdy.example.com.";
4026 const std::vector<DnsRecord> records = {
4027 {host_name, ns_type::ns_t_a, "1.2.3.4"},
4028 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
4029 };
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004030 INetd* netdService = mDnsClient.netdService();
Sehee Park2c118782019-05-07 13:02:45 +09004031
4032 test::DNSResponder dns1(listen_addr1);
4033 test::DNSResponder dns2(listen_addr2);
4034 StartDns(dns1, records);
4035 StartDns(dns2, records);
4036
4037 std::vector<std::string> servers = {listen_addr1, listen_addr2};
4038 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
4039 dns1.clearQueries();
4040 dns2.clearQueries();
4041
Luke Huangeb618ef2020-05-26 14:17:02 +08004042 ScopeBlockedUIDRule scopeBlockUidRule(netdService, TEST_UID);
Sehee Park2c118782019-05-07 13:02:45 +09004043 // Dns Query
4044 int fd1 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_a, 0);
4045 int fd2 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_aaaa, 0);
4046 EXPECT_TRUE(fd1 != -1);
4047 EXPECT_TRUE(fd2 != -1);
4048
4049 uint8_t buf[MAXPACKET] = {};
4050 int rcode;
4051 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
4052 EXPECT_EQ(-ECONNREFUSED, res);
4053
4054 memset(buf, 0, MAXPACKET);
4055 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
4056 EXPECT_EQ(-ECONNREFUSED, res);
Mike Yu532405f2020-06-17 17:46:44 +08004057
4058 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, EAI_SYSTEM, "howdy.example.com", {});
4059 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, EAI_SYSTEM, "howdy.example.com", {});
Sehee Park2c118782019-05-07 13:02:45 +09004060}
Mike Yua772c202019-09-23 17:47:21 +08004061
Ken Chenbc481b82020-05-21 23:30:01 +08004062TEST_F(ResolverTest, EnforceDnsUid) {
4063 SKIP_IF_BPF_NOT_SUPPORTED;
4064
4065 constexpr char listen_addr1[] = "127.0.0.4";
4066 constexpr char listen_addr2[] = "::1";
4067 constexpr char host_name[] = "howdy.example.com.";
4068 const std::vector<DnsRecord> records = {
4069 {host_name, ns_type::ns_t_a, "1.2.3.4"},
4070 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
4071 };
4072 INetd* netdService = mDnsClient.netdService();
4073
4074 test::DNSResponder dns1(listen_addr1);
4075 test::DNSResponder dns2(listen_addr2);
4076 StartDns(dns1, records);
4077 StartDns(dns2, records);
4078
4079 // switch uid of DNS queries from applications to AID_DNS
4080 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4081 parcel.servers = {listen_addr1, listen_addr2};
4082 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk());
4083
4084 uint8_t buf[MAXPACKET] = {};
4085 int rcode;
4086 {
4087 ScopeBlockedUIDRule scopeBlockUidRule(netdService, TEST_UID);
4088 // Dns Queries should be blocked
4089 int fd1 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_a, 0);
4090 int fd2 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_aaaa, 0);
4091 EXPECT_TRUE(fd1 != -1);
4092 EXPECT_TRUE(fd2 != -1);
4093
4094 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
4095 EXPECT_EQ(-ECONNREFUSED, res);
4096
4097 memset(buf, 0, MAXPACKET);
4098 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
4099 EXPECT_EQ(-ECONNREFUSED, res);
4100 }
4101
4102 parcel.resolverOptions.enforceDnsUid = true;
4103 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk());
4104 {
4105 ScopeBlockedUIDRule scopeBlockUidRule(netdService, TEST_UID);
4106 // Dns Queries should NOT be blocked
4107 int fd1 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_a, 0);
4108 int fd2 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_aaaa, 0);
4109 EXPECT_TRUE(fd1 != -1);
4110 EXPECT_TRUE(fd2 != -1);
4111
4112 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
4113 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
4114
4115 memset(buf, 0, MAXPACKET);
4116 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
4117 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
4118
4119 // @TODO: So far we know that uid of DNS queries are no more set to DNS requester. But we
4120 // don't check if they are actually being set to AID_DNS, because system uids are always
4121 // allowed in bpf_owner_match(). Audit by firewallSetUidRule(AID_DNS) + sending queries is
4122 // infeasible. Fix it if the behavior of bpf_owner_match() is changed in the future, or if
4123 // we have better idea to deal with this.
4124 }
4125}
4126
Mike Yu40e67072019-10-09 21:14:09 +08004127namespace {
4128
4129const std::string kDotConnectTimeoutMsFlag(
4130 "persist.device_config.netd_native.dot_connect_timeout_ms");
4131
4132class ScopedSystemProperties {
4133 public:
4134 explicit ScopedSystemProperties(const std::string& key, const std::string& value)
4135 : mStoredKey(key) {
4136 mStoredValue = android::base::GetProperty(key, "");
4137 android::base::SetProperty(key, value);
4138 }
4139 ~ScopedSystemProperties() { android::base::SetProperty(mStoredKey, mStoredValue); }
4140
4141 private:
4142 std::string mStoredKey;
4143 std::string mStoredValue;
4144};
4145
4146} // namespace
4147
Mike Yua772c202019-09-23 17:47:21 +08004148TEST_F(ResolverTest, ConnectTlsServerTimeout) {
Mike Yu40e67072019-10-09 21:14:09 +08004149 constexpr int expectedTimeout = 1000;
4150 constexpr char hostname1[] = "query1.example.com.";
4151 constexpr char hostname2[] = "query2.example.com.";
Mike Yua772c202019-09-23 17:47:21 +08004152 const std::vector<DnsRecord> records = {
Mike Yu40e67072019-10-09 21:14:09 +08004153 {hostname1, ns_type::ns_t_a, "1.2.3.4"},
4154 {hostname2, ns_type::ns_t_a, "1.2.3.5"},
Mike Yua772c202019-09-23 17:47:21 +08004155 };
4156
4157 test::DNSResponder dns;
4158 StartDns(dns, records);
Mike Yu40e67072019-10-09 21:14:09 +08004159 test::DnsTlsFrontend tls;
Mike Yua772c202019-09-23 17:47:21 +08004160 ASSERT_TRUE(tls.startServer());
4161
Mike Yu40e67072019-10-09 21:14:09 +08004162 // The resolver will adjust the timeout value to 1000ms since the value is too small.
4163 ScopedSystemProperties scopedSystemProperties(kDotConnectTimeoutMsFlag, "100");
Mike Yua772c202019-09-23 17:47:21 +08004164
Mike Yu40e67072019-10-09 21:14:09 +08004165 // Set up resolver to opportunistic mode with the default configuration.
Mike Yu8ac63402019-12-02 15:28:38 +08004166 const ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
Mike Yu40e67072019-10-09 21:14:09 +08004167 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
Mike Yua772c202019-09-23 17:47:21 +08004168 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09004169 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yua772c202019-09-23 17:47:21 +08004170 tls.clearQueries();
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09004171 dns.clearQueries();
Mike Yua772c202019-09-23 17:47:21 +08004172
4173 // The server becomes unresponsive to the handshake request.
4174 tls.setHangOnHandshakeForTesting(true);
4175
4176 // Expect the things happening in getaddrinfo():
4177 // 1. Connect to the private DNS server.
4178 // 2. SSL handshake times out.
4179 // 3. Fallback to UDP transport, and then get the answer.
Mike Yu40e67072019-10-09 21:14:09 +08004180 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4181 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(hostname1, nullptr, hints);
Mike Yua772c202019-09-23 17:47:21 +08004182
Mike Yu40e67072019-10-09 21:14:09 +08004183 EXPECT_NE(nullptr, result);
Mike Yua772c202019-09-23 17:47:21 +08004184 EXPECT_EQ(0, tls.queries());
Mike Yu40e67072019-10-09 21:14:09 +08004185 EXPECT_EQ(1U, GetNumQueries(dns, hostname1));
4186 EXPECT_EQ(records.at(0).addr, ToString(result));
Mike Yua772c202019-09-23 17:47:21 +08004187
Mike Yu40e67072019-10-09 21:14:09 +08004188 // A loose upper bound is set by adding 2000ms buffer time. Theoretically, getaddrinfo()
4189 // should just take a bit more than expetTimeout milliseconds.
4190 EXPECT_GE(timeTakenMs, expectedTimeout);
4191 EXPECT_LE(timeTakenMs, expectedTimeout + 2000);
4192
4193 // Set the server to be responsive. Verify that the resolver will attempt to reconnect
4194 // to the server and then get the result within the timeout.
4195 tls.setHangOnHandshakeForTesting(false);
4196 std::tie(result, timeTakenMs) = safe_getaddrinfo_time_taken(hostname2, nullptr, hints);
4197
4198 EXPECT_NE(nullptr, result);
Luke Huang0a0870d2020-02-12 20:41:10 +08004199 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yu40e67072019-10-09 21:14:09 +08004200 EXPECT_EQ(1U, GetNumQueries(dns, hostname2));
4201 EXPECT_EQ(records.at(1).addr, ToString(result));
4202
4203 EXPECT_LE(timeTakenMs, expectedTimeout);
Mike Yua772c202019-09-23 17:47:21 +08004204}
Hungming Chenbb90ab32019-10-28 18:20:31 +08004205
Ken Chen766feae2019-10-30 15:13:44 +08004206TEST_F(ResolverTest, FlushNetworkCache) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004207 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004208 test::DNSResponder dns;
4209 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4210 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4211
4212 const hostent* result = gethostbyname("hello");
4213 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4214
4215 // get result from cache
4216 result = gethostbyname("hello");
4217 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4218
4219 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4220
4221 result = gethostbyname("hello");
4222 EXPECT_EQ(2U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4223}
4224
4225TEST_F(ResolverTest, FlushNetworkCache_random) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004226 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004227 constexpr int num_flush = 10;
4228 constexpr int num_queries = 20;
4229 test::DNSResponder dns;
4230 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4231 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4232 const addrinfo hints = {.ai_family = AF_INET};
4233
4234 std::thread t([this]() {
4235 for (int i = 0; i < num_flush; ++i) {
4236 unsigned delay = arc4random_uniform(10 * 1000); // 10ms
4237 usleep(delay);
4238 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4239 }
4240 });
4241
4242 for (int i = 0; i < num_queries; ++i) {
4243 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4244 EXPECT_TRUE(result != nullptr);
4245 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4246 }
4247 t.join();
4248}
4249
4250// flush cache while one query is wait-for-response, another is pending.
4251TEST_F(ResolverTest, FlushNetworkCache_concurrent) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004252 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004253 const char* listen_addr1 = "127.0.0.9";
4254 const char* listen_addr2 = "127.0.0.10";
4255 test::DNSResponder dns1(listen_addr1);
4256 test::DNSResponder dns2(listen_addr2);
4257 StartDns(dns1, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4258 StartDns(dns2, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4259 addrinfo hints = {.ai_family = AF_INET};
4260
4261 // step 1: set server#1 into deferred responding mode
4262 dns1.setDeferredResp(true);
4263 std::thread t1([&listen_addr1, &hints, this]() {
4264 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr1}));
4265 // step 3: query
4266 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4267 // step 9: check result
4268 EXPECT_TRUE(result != nullptr);
4269 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4270 });
4271
4272 // step 2: wait for the query to reach the server
4273 while (GetNumQueries(dns1, kHelloExampleCom) == 0) {
4274 usleep(1000); // 1ms
4275 }
4276
4277 std::thread t2([&listen_addr2, &hints, &dns2, this]() {
4278 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr2}));
4279 // step 5: query (should be blocked in resolver)
4280 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4281 // step 7: check result
4282 EXPECT_TRUE(result != nullptr);
4283 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4284 EXPECT_EQ(1U, GetNumQueriesForType(dns2, ns_type::ns_t_a, kHelloExampleCom));
4285 });
4286
4287 // step 4: wait a bit for the 2nd query to enter pending state
4288 usleep(100 * 1000); // 100ms
4289 // step 6: flush cache (will unblock pending queries)
4290 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4291 t2.join();
4292
4293 // step 8: resume server#1
4294 dns1.setDeferredResp(false);
4295 t1.join();
4296
4297 // step 10: verify if result is correctly cached
4298 dns2.clearQueries();
4299 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4300 EXPECT_EQ(0U, GetNumQueries(dns2, kHelloExampleCom));
4301 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4302}
4303
waynema29253052019-08-20 11:26:08 +08004304// TODO: Perhaps to have a boundary conditions test for TCP and UDP.
4305TEST_F(ResolverTest, TcpQueryWithOversizePayload) {
4306 test::DNSResponder dns;
4307 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4308 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4309
4310 int fd = dns_open_proxy();
4311 ASSERT_TRUE(fd > 0);
4312
4313 // Sending DNS query over TCP once the packet sizes exceed 512 bytes.
4314 // The raw data is combined with Question section and Additional section
4315 // Question section : query "hello.example.com", type A, class IN
4316 // Additional section : type OPT (41), Option PADDING, Option Length 546
4317 // Padding option which allows DNS clients and servers to artificially
4318 // increase the size of a DNS message by a variable number of bytes.
4319 // See also RFC7830, section 3
4320 const std::string query =
4321 "+c0BAAABAAAAAAABBWhlbGxvB2V4YW1wbGUDY29tAAABAAEAACkgAAAAgAACJgAMAiIAAAAAAAAAAAAAAAAAA"
4322 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4323 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4324 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4325 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4326 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4327 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4328 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4329 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4330 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
4331 const std::string cmd =
4332 "resnsend " + std::to_string(TEST_NETID) + " 0 " /* ResNsendFlags */ + query + '\0';
4333 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
4334 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
4335 expectAnswersValid(fd, AF_INET, kHelloExampleComAddrV4);
4336 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom));
4337 EXPECT_EQ(0U, GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom));
4338}
4339
Ken Chen99344882020-01-01 14:59:38 +08004340TEST_F(ResolverTest, TruncatedRspMode) {
4341 constexpr char listen_addr[] = "127.0.0.4";
4342 constexpr char listen_addr2[] = "127.0.0.5";
4343 constexpr char listen_srv[] = "53";
4344
4345 test::DNSResponder dns(listen_addr, listen_srv, static_cast<ns_rcode>(-1));
4346 test::DNSResponder dns2(listen_addr2, listen_srv, static_cast<ns_rcode>(-1));
4347 // dns supports UDP only, dns2 support UDP and TCP
4348 dns.setResponseProbability(0.0, IPPROTO_TCP);
4349 StartDns(dns, kLargeCnameChainRecords);
4350 StartDns(dns2, kLargeCnameChainRecords);
4351
4352 const struct TestConfig {
4353 const std::optional<int32_t> tcMode;
4354 const bool ret;
4355 const unsigned numQueries;
4356 std::string asParameters() const {
4357 return StringPrintf("tcMode: %d, ret: %s, numQueries: %u", tcMode.value_or(-1),
4358 ret ? "true" : "false", numQueries);
4359 }
4360 } testConfigs[]{
4361 // clang-format off
4362 {std::nullopt, true, 0}, /* mode unset */
4363 {aidl::android::net::IDnsResolver::TC_MODE_DEFAULT, true, 0}, /* default mode */
4364 {aidl::android::net::IDnsResolver::TC_MODE_UDP_TCP, true, 1}, /* alternative mode */
4365 {-666, false, 1}, /* invalid input */
4366 // clang-format on
4367 };
4368
4369 for (const auto& config : testConfigs) {
4370 SCOPED_TRACE(config.asParameters());
4371
4372 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4373 parcel.servers = {listen_addr, listen_addr2};
4374 if (config.tcMode) {
Ken Chena6ac2a62020-04-07 17:25:56 +08004375 parcel.resolverOptions.tcMode = config.tcMode.value();
Ken Chen99344882020-01-01 14:59:38 +08004376 }
4377 ASSERT_EQ(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk(), config.ret);
4378
4379 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4380 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4381 ASSERT_TRUE(result != nullptr);
4382 EXPECT_EQ(ToString(result), kHelloExampleComAddrV4);
4383 // TC_MODE_DEFAULT: resolver retries on TCP-only on each name server.
4384 // TC_MODE_UDP_TCP: resolver retries on TCP on the same server, falls back to UDP from next.
4385 ASSERT_EQ(GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom), 1U);
4386 ASSERT_EQ(GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom), 1U);
4387 ASSERT_EQ(GetNumQueriesForProtocol(dns2, IPPROTO_UDP, kHelloExampleCom), config.numQueries);
4388 ASSERT_EQ(GetNumQueriesForProtocol(dns2, IPPROTO_TCP, kHelloExampleCom), 1U);
4389
4390 dns.clearQueries();
4391 dns2.clearQueries();
4392 ASSERT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4393 }
4394}
4395
Mike Yu153b5b82020-03-04 19:53:54 +08004396TEST_F(ResolverTest, RepeatedSetup_ResolverStatusRemains) {
4397 constexpr char unusable_listen_addr[] = "127.0.0.3";
4398 constexpr char listen_addr[] = "127.0.0.4";
4399 constexpr char hostname[] = "a.hello.query.";
4400 const auto repeatedSetResolversFromParcel = [&](const ResolverParamsParcel& parcel) {
4401 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4402 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4403 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4404 };
4405
4406 test::DNSResponder dns(listen_addr);
4407 StartDns(dns, {{hostname, ns_type::ns_t_a, "1.2.3.3"}});
4408 test::DnsTlsFrontend tls1(listen_addr, "853", listen_addr, "53");
4409 ASSERT_TRUE(tls1.startServer());
4410
4411 // Private DNS off mode.
4412 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4413 parcel.servers = {unusable_listen_addr, listen_addr};
4414 parcel.tlsServers.clear();
4415 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4416
4417 // Send a query.
4418 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4419 EXPECT_NE(safe_getaddrinfo(hostname, nullptr, &hints), nullptr);
4420
4421 // Check the stats as expected.
4422 const std::vector<NameserverStats> expectedCleartextDnsStats = {
4423 NameserverStats(unusable_listen_addr).setInternalErrors(1),
4424 NameserverStats(listen_addr).setSuccesses(1),
4425 };
4426 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
4427 EXPECT_EQ(GetNumQueries(dns, hostname), 1U);
4428
4429 // The stats is supposed to remain as long as the list of cleartext DNS servers is unchanged.
4430 static const struct TestConfig {
4431 std::vector<std::string> servers;
4432 std::vector<std::string> tlsServers;
4433 std::string tlsName;
4434 } testConfigs[] = {
4435 // Private DNS opportunistic mode.
4436 {{listen_addr, unusable_listen_addr}, {listen_addr, unusable_listen_addr}, ""},
4437 {{unusable_listen_addr, listen_addr}, {unusable_listen_addr, listen_addr}, ""},
4438
4439 // Private DNS strict mode.
4440 {{listen_addr, unusable_listen_addr}, {"127.0.0.100"}, kDefaultPrivateDnsHostName},
4441 {{unusable_listen_addr, listen_addr}, {"127.0.0.100"}, kDefaultPrivateDnsHostName},
4442
4443 // Private DNS off mode.
4444 {{unusable_listen_addr, listen_addr}, {}, ""},
4445 {{listen_addr, unusable_listen_addr}, {}, ""},
4446 };
4447
4448 for (const auto& config : testConfigs) {
4449 SCOPED_TRACE(fmt::format("testConfig: [{}] [{}] [{}]", fmt::join(config.servers, ","),
4450 fmt::join(config.tlsServers, ","), config.tlsName));
4451 parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4452 parcel.servers = config.servers;
4453 parcel.tlsServers = config.tlsServers;
4454 parcel.tlsName = config.tlsName;
4455 repeatedSetResolversFromParcel(parcel);
4456 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
4457
4458 // The stats remains when the list of search domains changes.
4459 parcel.domains.push_back("tmp.domains");
4460 repeatedSetResolversFromParcel(parcel);
4461 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
4462
4463 // The stats remains when the parameters change (except maxSamples).
4464 parcel.sampleValiditySeconds++;
4465 parcel.successThreshold++;
4466 parcel.minSamples++;
4467 parcel.baseTimeoutMsec++;
4468 parcel.retryCount++;
4469 repeatedSetResolversFromParcel(parcel);
4470 EXPECT_TRUE(expectStatsFromGetResolverInfo(expectedCleartextDnsStats));
4471 }
4472
4473 // The cache remains.
4474 EXPECT_NE(safe_getaddrinfo(hostname, nullptr, &hints), nullptr);
4475 EXPECT_EQ(GetNumQueries(dns, hostname), 1U);
4476}
4477
4478TEST_F(ResolverTest, RepeatedSetup_NoRedundantPrivateDnsValidation) {
4479 const std::string addr1 = getUniqueIPv4Address(); // For a workable DNS server.
4480 const std::string addr2 = getUniqueIPv4Address(); // For an unresponsive DNS server.
4481 const std::string unusable_addr = getUniqueIPv4Address();
Mike Yubc4b9502020-03-20 13:14:00 +08004482 const auto waitForPrivateDnsStateUpdated = []() {
4483 // A buffer time for the PrivateDnsConfiguration instance to update its map,
4484 // mPrivateDnsValidateThreads, which is used for tracking validation threads.
4485 // Since there is a time gap between when PrivateDnsConfiguration reports
4486 // onPrivateDnsValidationEvent and when PrivateDnsConfiguration updates the map, this is a
4487 // workaround to avoid the test starts a subsequent resolver setup during the time gap.
4488 // TODO: Report onPrivateDnsValidationEvent after all the relevant updates are complete.
4489 // Reference to b/152009023.
4490 std::this_thread::sleep_for(20ms);
4491 };
Mike Yu153b5b82020-03-04 19:53:54 +08004492
4493 test::DNSResponder dns1(addr1);
4494 test::DNSResponder dns2(addr2);
4495 StartDns(dns1, {});
4496 StartDns(dns2, {});
4497 test::DnsTlsFrontend workableTls(addr1, "853", addr1, "53");
4498 test::DnsTlsFrontend unresponsiveTls(addr2, "853", addr2, "53");
4499 unresponsiveTls.setHangOnHandshakeForTesting(true);
4500 ASSERT_TRUE(workableTls.startServer());
4501 ASSERT_TRUE(unresponsiveTls.startServer());
4502
4503 // First setup.
4504 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4505 parcel.servers = {addr1, addr2, unusable_addr};
4506 parcel.tlsServers = {addr1, addr2, unusable_addr};
4507 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4508
4509 // Check the validation results.
4510 EXPECT_TRUE(WaitForPrivateDnsValidation(workableTls.listen_address(), true));
4511 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4512 EXPECT_EQ(unresponsiveTls.acceptConnectionsCount(), 1); // The validation is still in progress.
4513
4514 static const struct TestConfig {
4515 std::vector<std::string> tlsServers;
4516 std::string tlsName;
4517 } testConfigs[] = {
4518 {{addr1, addr2, unusable_addr}, ""},
4519 {{unusable_addr, addr1, addr2}, ""},
4520 {{unusable_addr, addr1, addr2}, kDefaultPrivateDnsHostName},
4521 {{addr1, addr2, unusable_addr}, kDefaultPrivateDnsHostName},
4522 };
4523
4524 std::string TlsNameLastTime;
4525 for (const auto& config : testConfigs) {
4526 SCOPED_TRACE(fmt::format("testConfig: [{}] [{}]", fmt::join(config.tlsServers, ","),
4527 config.tlsName));
4528 parcel.servers = config.tlsServers;
4529 parcel.tlsServers = config.tlsServers;
4530 parcel.tlsName = config.tlsName;
4531 parcel.caCertificate = config.tlsName.empty() ? "" : kCaCert;
4532
4533 const bool dnsModeChanged = (TlsNameLastTime != config.tlsName);
Mike Yubc4b9502020-03-20 13:14:00 +08004534
4535 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004536 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4537
4538 for (const auto& serverAddr : parcel.tlsServers) {
4539 SCOPED_TRACE(serverAddr);
4540 if (serverAddr == workableTls.listen_address()) {
4541 if (dnsModeChanged) {
4542 // In despite of the identical IP address, the server is regarded as a different
4543 // server when DnsTlsServer.name is different. The resolver treats it as a
4544 // different object and begins the validation process.
4545 EXPECT_TRUE(WaitForPrivateDnsValidation(serverAddr, true));
4546 }
4547 } else if (serverAddr == unresponsiveTls.listen_address()) {
4548 // No revalidation needed for the server which have been marked as in_progesss.
4549 } else {
4550 // Must be unusable_addr.
4551 // In opportunistic mode, when a validation for a private DNS server fails, the
4552 // resolver just marks the server as failed and doesn't re-evaluate it, but the
4553 // server can be re-evaluated when setResolverConfiguration() is called.
4554 // However, in strict mode, the resolver automatically re-evaluates the server and
4555 // marks the server as in_progress until the validation succeeds, so repeated setup
4556 // makes no effect.
4557 if (dnsModeChanged || config.tlsName.empty() /* not in strict mode */) {
4558 EXPECT_TRUE(WaitForPrivateDnsValidation(serverAddr, false));
4559 }
4560 }
4561 }
4562
4563 // Repeated setups make no effect in strict mode.
Mike Yubc4b9502020-03-20 13:14:00 +08004564 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004565 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4566 if (config.tlsName.empty()) {
4567 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4568 }
Mike Yubc4b9502020-03-20 13:14:00 +08004569 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004570 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4571 if (config.tlsName.empty()) {
4572 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4573 }
4574
4575 EXPECT_EQ(unresponsiveTls.acceptConnectionsCount(), 1);
4576
4577 TlsNameLastTime = config.tlsName;
4578 }
4579
4580 // Check that all the validation results are caught.
4581 // Note: it doesn't mean no validation being in progress.
4582 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr1));
4583 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr2));
4584 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(unusable_addr));
4585}
4586
4587TEST_F(ResolverTest, RepeatedSetup_KeepChangingPrivateDnsServers) {
4588 enum TlsServerState { WORKING, UNSUPPORTED, UNRESPONSIVE };
4589 const std::string addr1 = getUniqueIPv4Address();
4590 const std::string addr2 = getUniqueIPv4Address();
Mike Yu9a185882020-03-25 16:02:36 +08004591 const auto waitForPrivateDnsStateUpdated = []() {
4592 // A buffer time for PrivateDnsConfiguration to update its state. It prevents this test
4593 // being flaky. See b/152009023 for the reason.
4594 std::this_thread::sleep_for(20ms);
4595 };
Mike Yu153b5b82020-03-04 19:53:54 +08004596
4597 test::DNSResponder dns1(addr1);
4598 test::DNSResponder dns2(addr2);
4599 StartDns(dns1, {});
4600 StartDns(dns2, {});
4601 test::DnsTlsFrontend tls1(addr1, "853", addr1, "53");
4602 test::DnsTlsFrontend tls2(addr2, "853", addr2, "53");
4603 ASSERT_TRUE(tls1.startServer());
4604 ASSERT_TRUE(tls2.startServer());
4605
4606 static const struct TestConfig {
4607 std::string tlsServer;
4608 std::string tlsName;
4609 bool expectNothingHappenWhenServerUnsupported;
4610 bool expectNothingHappenWhenServerUnresponsive;
4611 std::string asTestName() const {
4612 return fmt::format("{}, {}, {}, {}", tlsServer, tlsName,
4613 expectNothingHappenWhenServerUnsupported,
4614 expectNothingHappenWhenServerUnresponsive);
4615 }
4616 } testConfigs[] = {
4617 {{addr1}, "", false, false},
4618 {{addr2}, "", false, false},
4619 {{addr1}, "", false, true},
4620 {{addr2}, "", false, true},
4621 {{addr1}, kDefaultPrivateDnsHostName, false, true},
4622 {{addr2}, kDefaultPrivateDnsHostName, false, true},
4623 {{addr1}, kDefaultPrivateDnsHostName, true, true},
4624 {{addr2}, kDefaultPrivateDnsHostName, true, true},
4625
4626 // There's no new validation to start because there are already two validation threads
4627 // running (one is for addr1, the other is for addr2). This is because the comparator
4628 // doesn't compare DnsTlsServer.name. Keep the design as-is until it's known to be
4629 // harmful.
4630 {{addr1}, "", true, true},
4631 {{addr2}, "", true, true},
4632 {{addr1}, "", true, true},
4633 {{addr2}, "", true, true},
4634 };
4635
4636 for (const auto& serverState : {WORKING, UNSUPPORTED, UNRESPONSIVE}) {
4637 int testIndex = 0;
4638 for (const auto& config : testConfigs) {
4639 SCOPED_TRACE(fmt::format("serverState:{} testIndex:{} testConfig:[{}]", serverState,
4640 testIndex++, config.asTestName()));
4641 auto& tls = (config.tlsServer == addr1) ? tls1 : tls2;
4642
4643 if (serverState == UNSUPPORTED && tls.running()) ASSERT_TRUE(tls.stopServer());
4644 if (serverState != UNSUPPORTED && !tls.running()) ASSERT_TRUE(tls.startServer());
4645
4646 tls.setHangOnHandshakeForTesting(serverState == UNRESPONSIVE);
4647 const int connectCountsBefore = tls.acceptConnectionsCount();
4648
Mike Yu9a185882020-03-25 16:02:36 +08004649 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004650 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4651 parcel.servers = {config.tlsServer};
4652 parcel.tlsServers = {config.tlsServer};
4653 parcel.tlsName = config.tlsName;
4654 parcel.caCertificate = config.tlsName.empty() ? "" : kCaCert;
4655 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4656
4657 if (serverState == WORKING) {
4658 EXPECT_TRUE(WaitForPrivateDnsValidation(config.tlsServer, true));
4659 } else if (serverState == UNSUPPORTED) {
4660 if (config.expectNothingHappenWhenServerUnsupported) {
4661 // It's possible that the resolver hasn't yet started to
4662 // connect. Wait a while.
4663 // TODO: See if we can get rid of the hard waiting time, such as comparing
4664 // the CountDiff across two tests.
4665 std::this_thread::sleep_for(100ms);
4666 EXPECT_EQ(tls.acceptConnectionsCount(), connectCountsBefore);
4667 } else {
4668 EXPECT_TRUE(WaitForPrivateDnsValidation(config.tlsServer, false));
4669 }
4670 } else {
4671 // Must be UNRESPONSIVE.
4672 // DnsTlsFrontend is the only signal for checking whether or not the resolver starts
4673 // another validation when the server is unresponsive.
4674 const int expectCountDiff =
4675 config.expectNothingHappenWhenServerUnresponsive ? 0 : 1;
4676 if (expectCountDiff == 0) {
4677 // It's possible that the resolver hasn't yet started to
4678 // connect. Wait a while.
4679 std::this_thread::sleep_for(100ms);
4680 }
4681 const auto condition = [&]() {
4682 return tls.acceptConnectionsCount() == connectCountsBefore + expectCountDiff;
4683 };
4684 EXPECT_TRUE(PollForCondition(condition));
4685 }
4686 }
4687
4688 // Set to off mode to reset the PrivateDnsConfiguration state.
4689 ResolverParamsParcel setupOffmode = DnsResponderClient::GetDefaultResolverParamsParcel();
4690 setupOffmode.tlsServers.clear();
4691 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(setupOffmode));
4692 }
4693
4694 // Check that all the validation results are caught.
4695 // Note: it doesn't mean no validation being in progress.
4696 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr1));
4697 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr2));
4698}
4699
Ken Chen26dc2b02020-06-16 18:49:39 +08004700TEST_F(ResolverTest, PermissionCheckOnCertificateInjection) {
4701 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4702 parcel.caCertificate = kCaCert;
4703 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk());
4704
4705 for (const uid_t uid : {AID_SYSTEM, TEST_UID}) {
4706 ScopedChangeUID scopedChangeUID(uid);
4707 auto status = mDnsClient.resolvService()->setResolverConfiguration(parcel);
4708 EXPECT_EQ(status.getExceptionCode(), EX_SECURITY);
4709 }
4710}
4711
Hungming Chenbb90ab32019-10-28 18:20:31 +08004712// Parameterized tests.
4713// TODO: Merge the existing tests as parameterized test if possible.
4714// TODO: Perhaps move parameterized tests to an independent file.
4715enum class CallType { GETADDRINFO, GETHOSTBYNAME };
4716class ResolverParameterizedTest : public ResolverTest,
Hungming Chen63779052019-10-30 15:06:13 +08004717 public testing::WithParamInterface<CallType> {
4718 protected:
Hungming Chen22617fd2019-12-06 12:15:45 +08004719 void VerifyQueryHelloExampleComV4(const test::DNSResponder& dns, const CallType calltype,
4720 const bool verifyNumQueries = true) {
Hungming Chen63779052019-10-30 15:06:13 +08004721 if (calltype == CallType::GETADDRINFO) {
4722 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4723 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4724 ASSERT_TRUE(result != nullptr);
4725 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4726 } else if (calltype == CallType::GETHOSTBYNAME) {
4727 const hostent* result = gethostbyname("hello");
4728 ASSERT_TRUE(result != nullptr);
4729 ASSERT_EQ(4, result->h_length);
4730 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
4731 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4732 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
4733 } else {
4734 FAIL() << "Unsupported call type: " << static_cast<uint32_t>(calltype);
4735 }
Hungming Chen22617fd2019-12-06 12:15:45 +08004736 if (verifyNumQueries) EXPECT_EQ(1U, GetNumQueries(dns, kHelloExampleCom));
Hungming Chen63779052019-10-30 15:06:13 +08004737 }
4738};
Hungming Chenbb90ab32019-10-28 18:20:31 +08004739
Hungming Chen63779052019-10-30 15:06:13 +08004740INSTANTIATE_TEST_SUITE_P(QueryCallTest, ResolverParameterizedTest,
Hungming Chenbb90ab32019-10-28 18:20:31 +08004741 testing::Values(CallType::GETADDRINFO, CallType::GETHOSTBYNAME),
4742 [](const testing::TestParamInfo<CallType>& info) {
Hungming Chenbb90ab32019-10-28 18:20:31 +08004743 switch (info.param) {
4744 case CallType::GETADDRINFO:
Hungming Chen63779052019-10-30 15:06:13 +08004745 return "GetAddrInfo";
Hungming Chenbb90ab32019-10-28 18:20:31 +08004746 case CallType::GETHOSTBYNAME:
Hungming Chen63779052019-10-30 15:06:13 +08004747 return "GetHostByName";
Hungming Chenbb90ab32019-10-28 18:20:31 +08004748 default:
Hungming Chen63779052019-10-30 15:06:13 +08004749 return "InvalidParameter"; // Should not happen.
Hungming Chenbb90ab32019-10-28 18:20:31 +08004750 }
Hungming Chenbb90ab32019-10-28 18:20:31 +08004751 });
4752
4753TEST_P(ResolverParameterizedTest, AuthoritySectionAndAdditionalSection) {
4754 // DNS response may have more information in authority section and additional section.
4755 // Currently, getanswer() of packages/modules/DnsResolver/getaddrinfo.cpp doesn't parse the
4756 // content of authority section and additional section. Test these sections if they crash
4757 // the resolver, just in case. See also RFC 1035 section 4.1.
4758 const auto& calltype = GetParam();
4759 test::DNSHeader header(kDefaultDnsHeader);
4760
4761 // Create a DNS response which has a authoritative nameserver record in authority
4762 // section and its relevant address record in additional section.
4763 //
4764 // Question
4765 // hello.example.com. IN A
4766 // Answer
4767 // hello.example.com. IN A 1.2.3.4
4768 // Authority:
4769 // hello.example.com. IN NS ns1.example.com.
4770 // Additional:
4771 // ns1.example.com. IN A 5.6.7.8
4772 //
4773 // A response may have only question, answer, and authority section. Current testing response
4774 // should be able to cover this condition.
4775
4776 // Question section.
4777 test::DNSQuestion question{
4778 .qname = {.name = kHelloExampleCom},
4779 .qtype = ns_type::ns_t_a,
4780 .qclass = ns_c_in,
4781 };
4782 header.questions.push_back(std::move(question));
4783
4784 // Answer section.
4785 test::DNSRecord recordAnswer{
4786 .name = {.name = kHelloExampleCom},
4787 .rtype = ns_type::ns_t_a,
4788 .rclass = ns_c_in,
4789 .ttl = 0, // no cache
4790 };
Hungming Chen63779052019-10-30 15:06:13 +08004791 EXPECT_TRUE(test::DNSResponder::fillRdata(kHelloExampleComAddrV4, recordAnswer));
Hungming Chenbb90ab32019-10-28 18:20:31 +08004792 header.answers.push_back(std::move(recordAnswer));
4793
4794 // Authority section.
4795 test::DNSRecord recordAuthority{
4796 .name = {.name = kHelloExampleCom},
4797 .rtype = ns_type::ns_t_ns,
4798 .rclass = ns_c_in,
4799 .ttl = 0, // no cache
4800 };
4801 EXPECT_TRUE(test::DNSResponder::fillRdata("ns1.example.com.", recordAuthority));
4802 header.authorities.push_back(std::move(recordAuthority));
4803
4804 // Additional section.
4805 test::DNSRecord recordAdditional{
4806 .name = {.name = "ns1.example.com."},
4807 .rtype = ns_type::ns_t_a,
4808 .rclass = ns_c_in,
4809 .ttl = 0, // no cache
4810 };
4811 EXPECT_TRUE(test::DNSResponder::fillRdata("5.6.7.8", recordAdditional));
4812 header.additionals.push_back(std::move(recordAdditional));
4813
4814 // Start DNS server.
4815 test::DNSResponder dns(test::DNSResponder::MappingType::DNS_HEADER);
4816 dns.addMappingDnsHeader(kHelloExampleCom, ns_type::ns_t_a, header);
4817 ASSERT_TRUE(dns.startServer());
4818 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4819 dns.clearQueries();
4820
4821 // Expect that get the address and the resolver doesn't crash.
Hungming Chen63779052019-10-30 15:06:13 +08004822 VerifyQueryHelloExampleComV4(dns, calltype);
4823}
4824
4825TEST_P(ResolverParameterizedTest, MessageCompression) {
4826 const auto& calltype = GetParam();
4827
4828 // The response with compressed domain name by a pointer. See RFC 1035 section 4.1.4.
4829 //
4830 // Ignoring the other fields of the message, the domain name of question section and answer
4831 // section are presented as:
4832 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4833 // 12 | 5 | h |
4834 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4835 // 14 | e | l |
4836 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4837 // 16 | l | o |
4838 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4839 // 18 | 7 | e |
4840 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4841 // 20 | x | a |
4842 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4843 // 22 | m | p |
4844 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4845 // 24 | l | e |
4846 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4847 // 26 | 3 | c |
4848 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4849 // 28 | o | m |
4850 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4851 // 30 | 0 | ... |
4852 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4853 //
4854 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4855 // 35 | 1 1| 12 |
4856 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4857 const std::vector<uint8_t> kResponseAPointer = {
4858 /* Header */
4859 0x00, 0x00, /* Transaction ID: 0x0000 */
4860 0x81, 0x80, /* Flags: qr rd ra */
4861 0x00, 0x01, /* Questions: 1 */
4862 0x00, 0x01, /* Answer RRs: 1 */
4863 0x00, 0x00, /* Authority RRs: 0 */
4864 0x00, 0x00, /* Additional RRs: 0 */
4865 /* Queries */
4866 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
4867 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name: hello.example.com */
4868 0x00, 0x01, /* Type: A */
4869 0x00, 0x01, /* Class: IN */
4870 /* Answers */
4871 0xc0, 0x0c, /* Name: hello.example.com (a pointer) */
4872 0x00, 0x01, /* Type: A */
4873 0x00, 0x01, /* Class: IN */
4874 0x00, 0x00, 0x00, 0x00, /* Time to live: 0 */
4875 0x00, 0x04, /* Data length: 4 */
4876 0x01, 0x02, 0x03, 0x04 /* Address: 1.2.3.4 */
4877 };
4878
4879 // The response with compressed domain name by a sequence of labels ending with a pointer. See
4880 // RFC 1035 section 4.1.4.
4881 //
4882 // Ignoring the other fields of the message, the domain name of question section and answer
4883 // section are presented as:
4884 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4885 // 12 | 5 | h |
4886 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4887 // 14 | e | l |
4888 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4889 // 16 | l | o |
4890 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4891 // 18 | 7 | e |
4892 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4893 // 20 | x | a |
4894 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4895 // 22 | m | p |
4896 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4897 // 24 | l | e |
4898 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4899 // 26 | 3 | c |
4900 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4901 // 28 | o | m |
4902 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4903 // 30 | 0 | ... |
4904 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4905 //
4906 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4907 // 35 | 5 | h |
4908 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4909 // 37 | e | l |
4910 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4911 // 39 | l | o |
4912 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4913 // 41 | 1 1| 18 |
4914 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4915 const std::vector<uint8_t> kResponseLabelEndingWithAPointer = {
4916 /* Header */
4917 0x00, 0x00, /* Transaction ID: 0x0000 */
4918 0x81, 0x80, /* Flags: qr rd ra */
4919 0x00, 0x01, /* Questions: 1 */
4920 0x00, 0x01, /* Answer RRs: 1 */
4921 0x00, 0x00, /* Authority RRs: 0 */
4922 0x00, 0x00, /* Additional RRs: 0 */
4923 /* Queries */
4924 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
4925 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name: hello.example.com */
4926 0x00, 0x01, /* Type: A */
4927 0x00, 0x01, /* Class: IN */
4928 /* Answers */
4929 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0xc0,
4930 0x12, /* Name: hello.example.com (a label ending with a pointer) */
4931 0x00, 0x01, /* Type: A */
4932 0x00, 0x01, /* Class: IN */
4933 0x00, 0x00, 0x00, 0x00, /* Time to live: 0 */
4934 0x00, 0x04, /* Data length: 4 */
4935 0x01, 0x02, 0x03, 0x04 /* Address: 1.2.3.4 */
4936 };
4937
4938 for (const auto& response : {kResponseAPointer, kResponseLabelEndingWithAPointer}) {
4939 SCOPED_TRACE(StringPrintf("Hex dump: %s", toHex(makeSlice(response)).c_str()));
4940
4941 test::DNSResponder dns(test::DNSResponder::MappingType::BINARY_PACKET);
4942 dns.addMappingBinaryPacket(kHelloExampleComQueryV4, response);
4943 StartDns(dns, {});
4944 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4945
4946 // Expect no cache because the TTL of testing responses are 0.
4947 VerifyQueryHelloExampleComV4(dns, calltype);
Hungming Chenbb90ab32019-10-28 18:20:31 +08004948 }
Mike Yu40e67072019-10-09 21:14:09 +08004949}
Hungming Chen22617fd2019-12-06 12:15:45 +08004950
4951TEST_P(ResolverParameterizedTest, TruncatedResponse) {
4952 const auto& calltype = GetParam();
4953
Hungming Chen22617fd2019-12-06 12:15:45 +08004954 test::DNSResponder dns;
Ken Chen99344882020-01-01 14:59:38 +08004955 StartDns(dns, kLargeCnameChainRecords);
Hungming Chen22617fd2019-12-06 12:15:45 +08004956 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4957
4958 // Expect UDP response is truncated. The resolver retries over TCP. See RFC 1035 section 4.2.1.
4959 VerifyQueryHelloExampleComV4(dns, calltype, false);
4960 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom));
4961 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom));
4962}
Luke Huang420ee622019-11-27 17:52:44 +08004963
4964TEST_F(ResolverTest, KeepListeningUDP) {
4965 constexpr char listen_addr1[] = "127.0.0.4";
4966 constexpr char listen_addr2[] = "127.0.0.5";
4967 constexpr char host_name[] = "howdy.example.com.";
4968 const std::vector<DnsRecord> records = {
4969 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
4970 };
4971 const std::vector<int> params = {300, 25, 8, 8, 1000 /* BASE_TIMEOUT_MSEC */,
4972 1 /* retry count */};
4973 const int delayTimeMs = 1500;
4974
4975 test::DNSResponder neverRespondDns(listen_addr2, "53", static_cast<ns_rcode>(-1));
4976 neverRespondDns.setResponseProbability(0.0);
4977 StartDns(neverRespondDns, records);
Luke Huangf40df9c2020-04-21 08:51:48 +08004978 ScopedSystemProperties scopedSystemProperties(
4979 "persist.device_config.netd_native.keep_listening_udp", "1");
4980 // Re-setup test network to make experiment flag take effect.
4981 resetNetwork();
Luke Huang420ee622019-11-27 17:52:44 +08004982
4983 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr1, listen_addr2},
4984 kDefaultSearchDomains, params));
4985 // There are 2 DNS servers for this test.
4986 // |delayedDns| will be blocked for |delayTimeMs|, then start to respond to requests.
4987 // |neverRespondDns| will never respond.
4988 // In the first try, resolver will send query to |delayedDns| but get timeout error
4989 // because |delayTimeMs| > DNS timeout.
4990 // Then it's the second try, resolver will send query to |neverRespondDns| and
4991 // listen on both servers. Resolver will receive the answer coming from |delayedDns|.
Luke Huang420ee622019-11-27 17:52:44 +08004992
Luke Huang420ee622019-11-27 17:52:44 +08004993 test::DNSResponder delayedDns(listen_addr1);
4994 delayedDns.setResponseDelayMs(delayTimeMs);
4995 StartDns(delayedDns, records);
4996
4997 // Specify hints to ensure resolver doing query only 1 round.
4998 const addrinfo hints = {.ai_family = AF_INET6, .ai_socktype = SOCK_DGRAM};
4999 ScopedAddrinfo result = safe_getaddrinfo(host_name, nullptr, &hints);
5000 EXPECT_TRUE(result != nullptr);
5001
5002 std::string result_str = ToString(result);
5003 EXPECT_TRUE(result_str == "::1.2.3.4") << ", result_str='" << result_str << "'";
5004}
Luke Huang0a0870d2020-02-12 20:41:10 +08005005
5006TEST_F(ResolverTest, GetAddrInfoParallelLookupTimeout) {
5007 constexpr char listen_addr[] = "127.0.0.4";
5008 constexpr char host_name[] = "howdy.example.com.";
5009 constexpr int TIMING_TOLERANCE_MS = 200;
5010 constexpr int DNS_TIMEOUT_MS = 1000;
5011 const std::vector<DnsRecord> records = {
5012 {host_name, ns_type::ns_t_a, "1.2.3.4"},
5013 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
5014 };
5015 const std::vector<int> params = {300, 25, 8, 8, DNS_TIMEOUT_MS /* BASE_TIMEOUT_MSEC */,
5016 1 /* retry count */};
5017 test::DNSResponder neverRespondDns(listen_addr, "53", static_cast<ns_rcode>(-1));
5018 neverRespondDns.setResponseProbability(0.0);
5019 StartDns(neverRespondDns, records);
Luke Huangf40df9c2020-04-21 08:51:48 +08005020 ScopedSystemProperties scopedSystemProperties(
5021 "persist.device_config.netd_native.parallel_lookup", "1");
Luke Huangd1d734f2020-04-30 12:25:40 +08005022 // The default value of parallel_lookup_sleep_time should be very small
5023 // that we can ignore in this test case.
Luke Huangf40df9c2020-04-21 08:51:48 +08005024 // Re-setup test network to make experiment flag take effect.
5025 resetNetwork();
Luke Huang0a0870d2020-02-12 20:41:10 +08005026
5027 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}, kDefaultSearchDomains, params));
5028 neverRespondDns.clearQueries();
5029
Luke Huang0a0870d2020-02-12 20:41:10 +08005030 // Use a never respond DNS server to verify if the A/AAAA queries are sent in parallel.
5031 // The resolver parameters are set to timeout 1s and retry 1 times.
5032 // So we expect the safe_getaddrinfo_time_taken() might take ~1s to
5033 // return when parallel lookup is enabled. And the DNS server should receive 2 queries.
5034 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_DGRAM};
5035 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(host_name, nullptr, hints);
5036
5037 EXPECT_TRUE(result == nullptr);
5038 EXPECT_NEAR(DNS_TIMEOUT_MS, timeTakenMs, TIMING_TOLERANCE_MS)
5039 << "took time should approximate equal timeout";
5040 EXPECT_EQ(2U, GetNumQueries(neverRespondDns, host_name));
Mike Yu532405f2020-06-17 17:46:44 +08005041 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, RCODE_TIMEOUT, host_name, {});
Luke Huang0a0870d2020-02-12 20:41:10 +08005042}
Luke Huangd1d734f2020-04-30 12:25:40 +08005043
5044TEST_F(ResolverTest, GetAddrInfoParallelLookupSleepTime) {
5045 constexpr char listen_addr[] = "127.0.0.4";
5046 constexpr int TIMING_TOLERANCE_MS = 200;
5047 const std::vector<DnsRecord> records = {
5048 {kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4},
5049 {kHelloExampleCom, ns_type::ns_t_aaaa, kHelloExampleComAddrV6},
5050 };
5051 const std::vector<int> params = {300, 25, 8, 8, 1000 /* BASE_TIMEOUT_MSEC */,
5052 1 /* retry count */};
5053 test::DNSResponder dns(listen_addr);
5054 StartDns(dns, records);
5055 ScopedSystemProperties scopedSystemProperties1(
5056 "persist.device_config.netd_native.parallel_lookup", "1");
5057 constexpr int PARALLEL_LOOKUP_SLEEP_TIME_MS = 500;
5058 ScopedSystemProperties scopedSystemProperties2(
5059 "persist.device_config.netd_native.parallel_lookup_sleep_time",
5060 std::to_string(PARALLEL_LOOKUP_SLEEP_TIME_MS));
5061 // Re-setup test network to make experiment flag take effect.
5062 resetNetwork();
5063
5064 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}, kDefaultSearchDomains, params));
5065 dns.clearQueries();
5066
5067 // Expect the safe_getaddrinfo_time_taken() might take ~500ms to return because we set
5068 // parallel_lookup_sleep_time to 500ms.
5069 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_DGRAM};
5070 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(kHelloExampleCom, nullptr, hints);
5071
5072 EXPECT_NE(nullptr, result);
5073 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(
5074 {kHelloExampleComAddrV4, kHelloExampleComAddrV6}));
5075 EXPECT_NEAR(PARALLEL_LOOKUP_SLEEP_TIME_MS, timeTakenMs, TIMING_TOLERANCE_MS)
5076 << "took time should approximate equal timeout";
5077 EXPECT_EQ(2U, GetNumQueries(dns, kHelloExampleCom));
5078
5079 // Expect the PARALLEL_LOOKUP_SLEEP_TIME_MS won't affect the query under cache hit case.
5080 dns.clearQueries();
5081 std::tie(result, timeTakenMs) = safe_getaddrinfo_time_taken(kHelloExampleCom, nullptr, hints);
5082 EXPECT_NE(nullptr, result);
5083 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(
5084 {kHelloExampleComAddrV4, kHelloExampleComAddrV6}));
5085 EXPECT_GT(PARALLEL_LOOKUP_SLEEP_TIME_MS, timeTakenMs);
5086 EXPECT_EQ(0U, GetNumQueries(dns, kHelloExampleCom));
5087}
Luke Huangeb618ef2020-05-26 14:17:02 +08005088
5089TEST_F(ResolverTest, BlockDnsQueryUidDoesNotLeadToBadServer) {
5090 // This test relies on blocking traffic on loopback, which xt_qtaguid does not do.
5091 // See aosp/358413 and b/34444781 for why.
5092 SKIP_IF_BPF_NOT_SUPPORTED;
5093
5094 constexpr char listen_addr1[] = "127.0.0.4";
5095 constexpr char listen_addr2[] = "::1";
5096 test::DNSResponder dns1(listen_addr1);
5097 test::DNSResponder dns2(listen_addr2);
5098 StartDns(dns1, {});
5099 StartDns(dns2, {});
5100
5101 std::vector<std::string> servers = {listen_addr1, listen_addr2};
5102 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
5103 dns1.clearQueries();
5104 dns2.clearQueries();
5105 {
5106 ScopeBlockedUIDRule scopeBlockUidRule(mDnsClient.netdService(), TEST_UID);
5107 // Start querying ten times.
5108 for (int i = 0; i < 10; i++) {
5109 std::string hostName = fmt::format("blocked{}.com", i);
5110 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
5111 EXPECT_EQ(safe_getaddrinfo(hostName.c_str(), nullptr, &hints), nullptr);
5112 }
5113 }
5114 // Since all query packets are blocked, we should not see any stats of them.
5115 const std::vector<NameserverStats> expectedEmptyDnsStats = {
5116 NameserverStats(listen_addr1),
5117 NameserverStats(listen_addr2),
5118 };
5119 expectStatsFromGetResolverInfo(expectedEmptyDnsStats);
5120 EXPECT_EQ(dns1.queries().size(), 0U);
5121 EXPECT_EQ(dns2.queries().size(), 0U);
5122}
Mike Yu6ce587d2019-12-19 21:30:22 +08005123
5124// ResolverMultinetworkTest is used to verify multinetwork functionality. Here's how it works:
5125// The resolver sends queries to address A, and then there will be a TunForwarder helping forward
5126// the packets to address B, which is the address on which the testing server is listening. The
5127// answer packets responded from the testing server go through the reverse path back to the
5128// resolver.
5129//
5130// To achieve the that, it needs to set up a interface with routing rules. Tests are not
5131// supposed to initiate DNS servers on their own; instead, some utilities are added to the class to
5132// help the setup.
5133//
5134// An example of how to use it:
5135// TEST_F() {
5136// ScopedNetwork network = CreateScopedNetwork(V4);
5137// network.init();
5138//
5139// auto dns = network.addIpv4Dns();
5140// StartDns(dns.dnsServer, {});
5141//
5142// setResolverConfiguration(...);
5143// network.startTunForwarder();
5144//
5145// // Send queries here
5146// }
5147
5148class ResolverMultinetworkTest : public ResolverTest {
5149 protected:
5150 enum class ConnectivityType { V4, V6, V4V6 };
5151
5152 struct DnsServerPair {
5153 test::DNSResponder& dnsServer;
5154 std::string dnsAddr; // The DNS server address used for setResolverConfiguration().
5155 // TODO: Add test::DnsTlsFrontend* and std::string for DoT.
5156 };
5157
5158 class ScopedNetwork {
5159 public:
5160 ScopedNetwork(unsigned netId, ConnectivityType type, INetd* netdSrv,
5161 IDnsResolver* dnsResolvSrv)
5162 : mNetId(netId),
5163 mConnectivityType(type),
5164 mNetdSrv(netdSrv),
5165 mDnsResolvSrv(dnsResolvSrv) {
5166 mIfname = StringPrintf("testtun%d", netId);
5167 }
5168 ~ScopedNetwork() { destroy(); }
5169
5170 Result<void> init();
5171 void destroy();
5172 Result<DnsServerPair> addIpv4Dns() { return addDns(ConnectivityType::V4); }
5173 Result<DnsServerPair> addIpv6Dns() { return addDns(ConnectivityType::V6); }
5174 bool startTunForwarder() { return mTunForwarder->startForwarding(); }
5175 unsigned netId() const { return mNetId; }
5176
5177 private:
5178 Result<DnsServerPair> addDns(ConnectivityType connectivity);
5179 std::string makeIpv4AddrString(unsigned n) const {
5180 return StringPrintf("192.168.%u.%u", mNetId, n);
5181 }
5182 std::string makeIpv6AddrString(unsigned n) const {
5183 return StringPrintf("2001:db8:%u::%u", mNetId, n);
5184 }
5185
5186 const unsigned mNetId;
5187 const ConnectivityType mConnectivityType;
5188 INetd* mNetdSrv;
5189 IDnsResolver* mDnsResolvSrv;
5190
5191 std::string mIfname;
5192 std::unique_ptr<TunForwarder> mTunForwarder;
5193 std::vector<std::unique_ptr<test::DNSResponder>> mDnsServers;
5194 // TODO: Add std::vector<std::unique_ptr<test::DnsTlsFrontend>>
5195 };
5196
5197 void SetUp() override {
5198 ResolverTest::SetUp();
5199 ASSERT_NE(mDnsClient.netdService(), nullptr);
5200 ASSERT_NE(mDnsClient.resolvService(), nullptr);
5201 }
5202
5203 void TearDown() override { ResolverTest::TearDown(); }
5204
5205 ScopedNetwork CreateScopedNetwork(ConnectivityType type);
5206 void StartDns(test::DNSResponder& dns, const std::vector<DnsRecord>& records);
5207
5208 unsigned getFreeNetId() { return mNextNetId++; }
5209
5210 private:
5211 // Use a different netId because this class inherits from the class ResolverTest which
5212 // always creates TEST_NETID in setup. It's incremented when CreateScopedNetwork() is called.
5213 // Note: Don't create more than 20 networks in the class since 51 is used for the dummy network.
5214 unsigned mNextNetId = 31;
5215};
5216
5217ResolverMultinetworkTest::ScopedNetwork ResolverMultinetworkTest::CreateScopedNetwork(
5218 ConnectivityType type) {
5219 return {getFreeNetId(), type, mDnsClient.netdService(), mDnsClient.resolvService()};
5220}
5221
5222Result<void> ResolverMultinetworkTest::ScopedNetwork::init() {
5223 unique_fd ufd = TunForwarder::createTun(mIfname);
5224 if (!ufd.ok()) {
5225 return Errorf("createTun for {} failed", mIfname);
5226 }
5227 mTunForwarder = std::make_unique<TunForwarder>(std::move(ufd));
5228
5229 if (auto r = mNetdSrv->networkCreatePhysical(mNetId, INetd::PERMISSION_SYSTEM); !r.isOk()) {
5230 return Error() << r.getMessage();
5231 }
5232 if (auto r = mDnsResolvSrv->createNetworkCache(mNetId); !r.isOk()) {
5233 return Error() << r.getMessage();
5234 }
5235 if (auto r = mNetdSrv->networkAddInterface(mNetId, mIfname); !r.isOk()) {
5236 return Error() << r.getMessage();
5237 }
5238
5239 if (mConnectivityType == ConnectivityType::V4 || mConnectivityType == ConnectivityType::V4V6) {
5240 const std::string v4Addr = makeIpv4AddrString(1);
5241 if (auto r = mNetdSrv->interfaceAddAddress(mIfname, v4Addr, 32); !r.isOk()) {
5242 return Error() << r.getMessage();
5243 }
5244 if (auto r = mNetdSrv->networkAddRoute(mNetId, mIfname, "0.0.0.0/0", ""); !r.isOk()) {
5245 return Error() << r.getMessage();
5246 }
5247 }
5248 if (mConnectivityType == ConnectivityType::V6 || mConnectivityType == ConnectivityType::V4V6) {
5249 const std::string v6Addr = makeIpv6AddrString(1);
5250 if (auto r = mNetdSrv->interfaceAddAddress(mIfname, v6Addr, 128); !r.isOk()) {
5251 return Error() << r.getMessage();
5252 }
5253 if (auto r = mNetdSrv->networkAddRoute(mNetId, mIfname, "::/0", ""); !r.isOk()) {
5254 return Error() << r.getMessage();
5255 }
5256 }
5257
5258 return {};
5259}
5260
5261void ResolverMultinetworkTest::ScopedNetwork::destroy() {
5262 mNetdSrv->networkDestroy(mNetId);
5263 mDnsResolvSrv->destroyNetworkCache(mNetId);
5264}
5265
5266void ResolverMultinetworkTest::StartDns(test::DNSResponder& dns,
5267 const std::vector<DnsRecord>& records) {
5268 ResolverTest::StartDns(dns, records);
5269
5270 // Bind the DNSResponder's sockets to the network if specified.
5271 if (std::optional<unsigned> netId = dns.getNetwork(); netId.has_value()) {
5272 setNetworkForSocket(netId.value(), dns.getUdpSocket());
5273 setNetworkForSocket(netId.value(), dns.getTcpSocket());
5274 }
5275}
5276
5277Result<ResolverMultinetworkTest::DnsServerPair> ResolverMultinetworkTest::ScopedNetwork::addDns(
5278 ConnectivityType type) {
5279 const int index = mDnsServers.size();
5280 const int prefixLen = (type == ConnectivityType::V4) ? 32 : 128;
5281
5282 const std::function<std::string(unsigned)> makeIpString =
5283 std::bind((type == ConnectivityType::V4) ? &ScopedNetwork::makeIpv4AddrString
5284 : &ScopedNetwork::makeIpv6AddrString,
5285 this, std::placeholders::_1);
5286
5287 std::string src1 = makeIpString(1); // The address from which the resolver will send.
5288 std::string dst1 = makeIpString(index + 100); // The address to which the resolver will send.
5289 std::string src2 = dst1; // The address translated from src1.
5290 std::string dst2 = makeIpString(index + 200); // The address translated from dst2.
5291
5292 if (!mTunForwarder->addForwardingRule({src1, dst1}, {src2, dst2}) ||
5293 !mTunForwarder->addForwardingRule({dst2, src2}, {dst1, src1})) {
5294 return Errorf("Failed to add the rules ({}, {}, {}, {})", src1, dst1, src2, dst2);
5295 }
5296
5297 if (!mNetdSrv->interfaceAddAddress(mIfname, dst2, prefixLen).isOk()) {
5298 return Errorf("interfaceAddAddress({}, {}, {}) failed", mIfname, dst2, prefixLen);
5299 }
5300
5301 // Create a DNSResponder instance.
5302 auto& dnsPtr = mDnsServers.emplace_back(std::make_unique<test::DNSResponder>(dst2));
5303 dnsPtr->setNetwork(mNetId);
5304 return DnsServerPair{
5305 .dnsServer = *dnsPtr,
5306 .dnsAddr = dst1,
5307 };
5308}
5309
5310TEST_F(ResolverMultinetworkTest, GetAddrInfo_AI_ADDRCONFIG) {
5311 constexpr char host_name[] = "ohayou.example.com.";
5312
5313 const std::array<ConnectivityType, 3> allTypes = {
5314 ConnectivityType::V4,
5315 ConnectivityType::V6,
5316 ConnectivityType::V4V6,
5317 };
5318 for (const auto& type : allTypes) {
5319 SCOPED_TRACE(StringPrintf("ConnectivityType: %d", type));
5320
5321 // Create a network.
5322 ScopedNetwork network = CreateScopedNetwork(type);
5323 ASSERT_RESULT_OK(network.init());
5324
5325 // Add a testing DNS server.
5326 const Result<DnsServerPair> dnsPair =
5327 (type == ConnectivityType::V4) ? network.addIpv4Dns() : network.addIpv6Dns();
5328 ASSERT_RESULT_OK(dnsPair);
5329 StartDns(dnsPair->dnsServer, {{host_name, ns_type::ns_t_a, "1.1.1.31"},
5330 {host_name, ns_type::ns_t_aaaa, "2001:db8:cafe:d00d::31"}});
5331
5332 // Set up resolver and start forwarding.
5333 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
5334 parcel.tlsServers.clear();
5335 parcel.netId = network.netId();
5336 parcel.servers = {dnsPair->dnsAddr};
5337 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
5338 ASSERT_TRUE(network.startTunForwarder());
5339
5340 const addrinfo hints = {
5341 .ai_flags = AI_ADDRCONFIG,
5342 .ai_family = AF_UNSPEC,
5343 .ai_socktype = SOCK_DGRAM,
5344 };
5345 addrinfo* raw_ai_result = nullptr;
5346 EXPECT_EQ(0, android_getaddrinfofornet(host_name, nullptr, &hints, network.netId(),
5347 MARK_UNSET, &raw_ai_result));
5348 ScopedAddrinfo ai_result(raw_ai_result);
5349 std::vector<std::string> result_strs = ToStrings(ai_result);
5350 std::vector<std::string> expectedResult;
5351 size_t expectedQueries = 0;
5352
5353 if (type == ConnectivityType::V6 || type == ConnectivityType::V4V6) {
5354 expectedResult.emplace_back("2001:db8:cafe:d00d::31");
5355 expectedQueries++;
5356 }
5357 if (type == ConnectivityType::V4 || type == ConnectivityType::V4V6) {
5358 expectedResult.emplace_back("1.1.1.31");
5359 expectedQueries++;
5360 }
5361 EXPECT_THAT(result_strs, testing::UnorderedElementsAreArray(expectedResult));
5362 EXPECT_EQ(GetNumQueries(dnsPair->dnsServer, host_name), expectedQueries);
5363 }
5364}
5365
5366TEST_F(ResolverMultinetworkTest, NetworkDestroyedDuringQueryInFlight) {
5367 constexpr char host_name[] = "ohayou.example.com.";
5368
5369 // Create a network and add an ipv4 DNS server.
5370 auto network =
5371 std::make_unique<ScopedNetwork>(getFreeNetId(), ConnectivityType::V4V6,
5372 mDnsClient.netdService(), mDnsClient.resolvService());
5373 ASSERT_RESULT_OK(network->init());
5374 const Result<DnsServerPair> dnsPair = network->addIpv4Dns();
5375 ASSERT_RESULT_OK(dnsPair);
5376
5377 // Set the DNS server unresponsive.
5378 dnsPair->dnsServer.setResponseProbability(0.0);
5379 dnsPair->dnsServer.setErrorRcode(static_cast<ns_rcode>(-1));
5380 StartDns(dnsPair->dnsServer, {});
5381
5382 // Set up resolver and start forwarding.
5383 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
5384 parcel.tlsServers.clear();
5385 parcel.netId = network->netId();
5386 parcel.servers = {dnsPair->dnsAddr};
5387 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
5388 ASSERT_TRUE(network->startTunForwarder());
5389
5390 // Expect the things happening in order:
5391 // 1. The thread sends the query to the dns server which is unresponsive.
5392 // 2. The network is destroyed while the thread is waiting for the response from the dns server.
5393 // 3. After the dns server timeout, the thread retries but fails to connect.
5394 std::thread lookup([&]() {
5395 int fd = resNetworkQuery(network->netId(), host_name, ns_c_in, ns_t_a, 0);
5396 EXPECT_TRUE(fd != -1);
5397 expectAnswersNotValid(fd, -ETIMEDOUT);
5398 });
5399
5400 // Tear down the network as soon as the dns server receives the query.
5401 const auto condition = [&]() { return GetNumQueries(dnsPair->dnsServer, host_name) == 1U; };
5402 EXPECT_TRUE(PollForCondition(condition));
5403 network.reset();
5404
5405 lookup.join();
5406}
5407
5408TEST_F(ResolverMultinetworkTest, OneCachePerNetwork) {
5409 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
5410 constexpr char host_name[] = "ohayou.example.com.";
5411
5412 ScopedNetwork network1 = CreateScopedNetwork(ConnectivityType::V4V6);
5413 ScopedNetwork network2 = CreateScopedNetwork(ConnectivityType::V4V6);
5414 ASSERT_RESULT_OK(network1.init());
5415 ASSERT_RESULT_OK(network2.init());
5416
5417 const Result<DnsServerPair> dnsPair1 = network1.addIpv4Dns();
5418 const Result<DnsServerPair> dnsPair2 = network2.addIpv4Dns();
5419 ASSERT_RESULT_OK(dnsPair1);
5420 ASSERT_RESULT_OK(dnsPair2);
5421 StartDns(dnsPair1->dnsServer, {{host_name, ns_type::ns_t_a, "1.1.1.31"}});
5422 StartDns(dnsPair2->dnsServer, {{host_name, ns_type::ns_t_a, "1.1.1.32"}});
5423
5424 // Set up resolver for network 1 and start forwarding.
5425 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
5426 parcel.tlsServers.clear();
5427 parcel.netId = network1.netId();
5428 parcel.servers = {dnsPair1->dnsAddr};
5429 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
5430 ASSERT_TRUE(network1.startTunForwarder());
5431
5432 // Set up resolver for network 2 and start forwarding.
5433 parcel.netId = network2.netId();
5434 parcel.servers = {dnsPair2->dnsAddr};
5435 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
5436 ASSERT_TRUE(network2.startTunForwarder());
5437
5438 // Send the same queries to both networks.
5439 int fd1 = resNetworkQuery(network1.netId(), host_name, ns_c_in, ns_t_a, 0);
5440 int fd2 = resNetworkQuery(network2.netId(), host_name, ns_c_in, ns_t_a, 0);
5441
5442 expectAnswersValid(fd1, AF_INET, "1.1.1.31");
5443 expectAnswersValid(fd2, AF_INET, "1.1.1.32");
5444 EXPECT_EQ(GetNumQueries(dnsPair1->dnsServer, host_name), 1U);
5445 EXPECT_EQ(GetNumQueries(dnsPair2->dnsServer, host_name), 1U);
5446
5447 // Flush the cache of network 1, and send the queries again.
5448 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(network1.netId()).isOk());
5449 fd1 = resNetworkQuery(network1.netId(), host_name, ns_c_in, ns_t_a, 0);
5450 fd2 = resNetworkQuery(network2.netId(), host_name, ns_c_in, ns_t_a, 0);
5451
5452 expectAnswersValid(fd1, AF_INET, "1.1.1.31");
5453 expectAnswersValid(fd2, AF_INET, "1.1.1.32");
5454 EXPECT_EQ(GetNumQueries(dnsPair1->dnsServer, host_name), 2U);
5455 EXPECT_EQ(GetNumQueries(dnsPair2->dnsServer, host_name), 1U);
5456}