blob: 081eda54c9230ea906e85e3e637ec3b1a97d645e [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>
Luke Huang81568fb2020-07-13 00:55:12 +080056#include <unordered_set>
Ken Chenb9fa2062018-11-13 21:51:13 +080057
Luke Huang829511c2020-05-26 17:31:15 +080058#include <DnsProxydProtocol.h> // NETID_USE_LOCAL_NAMESERVERS
Luke Huangf8215372019-11-22 11:53:41 +080059#include <aidl/android/net/IDnsResolver.h>
60#include <android/binder_manager.h>
61#include <android/binder_process.h>
Bernie Innocenti41b82c42019-06-05 22:38:25 +090062#include "NetdClient.h"
Bernie Innocenti41b82c42019-06-05 22:38:25 +090063#include "ResolverStats.h"
Luke Huangf8215372019-11-22 11:53:41 +080064#include "netid_client.h" // NETID_UNSET
65#include "params.h" // MAXNS
Mike Yu532405f2020-06-17 17:46:44 +080066#include "stats.h" // RCODE_TIMEOUT
Hungming Chene8f970c2019-04-10 17:34:06 +080067#include "tests/dns_metrics_listener/dns_metrics_listener.h"
chenbruceb43ec752019-07-24 20:19:41 +080068#include "tests/dns_responder/dns_responder.h"
Luke Huangf8215372019-11-22 11:53:41 +080069#include "tests/dns_responder/dns_responder_client_ndk.h"
Hungming Chenc6556622019-10-02 16:01:07 +080070#include "tests/dns_responder/dns_tls_certificate.h"
chenbruceb43ec752019-07-24 20:19:41 +080071#include "tests/dns_responder/dns_tls_frontend.h"
Luke Huangfde82482019-06-04 01:04:53 +080072#include "tests/resolv_test_utils.h"
Mike Yu6ce587d2019-12-19 21:30:22 +080073#include "tests/tun_forwarder.h"
Ken Chenb9fa2062018-11-13 21:51:13 +080074
Luke Huang0d592bc2019-05-25 18:24:03 +080075// Valid VPN netId range is 100 ~ 65535
76constexpr int TEST_VPN_NETID = 65502;
Luke Huang94b10b92018-11-21 20:13:38 +080077constexpr int MAXPACKET = (8 * 1024);
Ken Chenb9fa2062018-11-13 21:51:13 +080078
79// Semi-public Bionic hook used by the NDK (frameworks/base/native/android/net.c)
80// Tested here for convenience.
81extern "C" int android_getaddrinfofornet(const char* hostname, const char* servname,
82 const addrinfo* hints, unsigned netid, unsigned mark,
83 struct addrinfo** result);
84
Mike Yu153b5b82020-03-04 19:53:54 +080085using namespace std::chrono_literals;
86
Luke Huang70070852019-11-25 18:25:50 +080087using aidl::android::net::IDnsResolver;
Luke Huangf8215372019-11-22 11:53:41 +080088using aidl::android::net::INetd;
Mike Yu8ac63402019-12-02 15:28:38 +080089using aidl::android::net::ResolverParamsParcel;
Mike Yu532405f2020-06-17 17:46:44 +080090using aidl::android::net::metrics::INetdEventListener;
Mike Yu6ce587d2019-12-19 21:30:22 +080091using android::base::Error;
Luke Huang9807e6b2019-05-20 16:17:12 +080092using android::base::ParseInt;
Mike Yu6ce587d2019-12-19 21:30:22 +080093using android::base::Result;
Ken Chenb9fa2062018-11-13 21:51:13 +080094using android::base::StringPrintf;
Luke Huang9807e6b2019-05-20 16:17:12 +080095using android::base::unique_fd;
Ken Chenb9fa2062018-11-13 21:51:13 +080096using android::net::ResolverStats;
Mike Yu6ce587d2019-12-19 21:30:22 +080097using android::net::TunForwarder;
Hungming Chene8f970c2019-04-10 17:34:06 +080098using android::net::metrics::DnsMetricsListener;
Ken Chenb9fa2062018-11-13 21:51:13 +080099using android::netdutils::enableSockopt;
Hungming Chen63779052019-10-30 15:06:13 +0800100using android::netdutils::makeSlice;
Luke Huang9807e6b2019-05-20 16:17:12 +0800101using android::netdutils::ResponseCode;
Luke Huang9d2d25b2019-06-14 00:34:05 +0800102using android::netdutils::ScopedAddrinfo;
Mike Yu40e67072019-10-09 21:14:09 +0800103using android::netdutils::Stopwatch;
Hungming Chen63779052019-10-30 15:06:13 +0800104using android::netdutils::toHex;
Ken Chenb9fa2062018-11-13 21:51:13 +0800105
106// TODO: move into libnetdutils?
107namespace {
Luke Huangfde82482019-06-04 01:04:53 +0800108
Ken Chenb9fa2062018-11-13 21:51:13 +0800109ScopedAddrinfo safe_getaddrinfo(const char* node, const char* service,
110 const struct addrinfo* hints) {
111 addrinfo* result = nullptr;
112 if (getaddrinfo(node, service, hints, &result) != 0) {
113 result = nullptr; // Should already be the case, but...
114 }
115 return ScopedAddrinfo(result);
116}
Luke Huangfde82482019-06-04 01:04:53 +0800117
Mike Yu40e67072019-10-09 21:14:09 +0800118std::pair<ScopedAddrinfo, int> safe_getaddrinfo_time_taken(const char* node, const char* service,
119 const addrinfo& hints) {
120 Stopwatch s;
121 ScopedAddrinfo result = safe_getaddrinfo(node, service, &hints);
122 return {std::move(result), s.timeTakenUs() / 1000};
123}
124
Mike Yue2162e52020-03-04 18:43:46 +0800125struct NameserverStats {
126 NameserverStats() = delete;
127 NameserverStats(const std::string server) : server(server) {}
128 NameserverStats& setSuccesses(int val) {
129 successes = val;
130 return *this;
131 }
132 NameserverStats& setErrors(int val) {
133 errors = val;
134 return *this;
135 }
136 NameserverStats& setTimeouts(int val) {
137 timeouts = val;
138 return *this;
139 }
140 NameserverStats& setInternalErrors(int val) {
141 internal_errors = val;
142 return *this;
143 }
144
145 const std::string server;
146 int successes = 0;
147 int errors = 0;
148 int timeouts = 0;
149 int internal_errors = 0;
150};
151
Mike Yu61d17262020-02-15 18:56:22 +0800152class ScopedSystemProperties {
153 public:
154 ScopedSystemProperties(const std::string& key, const std::string& value) : mStoredKey(key) {
155 mStoredValue = android::base::GetProperty(key, "");
156 android::base::SetProperty(key, value);
157 }
158 ~ScopedSystemProperties() { android::base::SetProperty(mStoredKey, mStoredValue); }
159
160 private:
161 std::string mStoredKey;
162 std::string mStoredValue;
163};
164
Ken Chenb9fa2062018-11-13 21:51:13 +0800165} // namespace
166
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900167class ResolverTest : public ::testing::Test {
Hungming Chene8f970c2019-04-10 17:34:06 +0800168 public:
Hungming Chen473c4de2020-03-12 11:13:35 +0800169 static void SetUpTestSuite() {
Hungming Chen5bf09772019-04-25 11:16:13 +0800170 // Get binder service.
171 // Note that |mDnsClient| is not used for getting binder service in this static function.
172 // The reason is that wants to keep |mDnsClient| as a non-static data member. |mDnsClient|
173 // which sets up device network configuration could be independent from every test.
Luke Huangf8215372019-11-22 11:53:41 +0800174 // TODO: Perhaps add a static function in resolv_test_binder_utils.{cpp,h} to get binder
175 // service.
176
177 AIBinder* binder = AServiceManager_getService("dnsresolver");
178 ndk::SpAIBinder resolvBinder = ndk::SpAIBinder(binder);
179 auto resolvService = aidl::android::net::IDnsResolver::fromBinder(resolvBinder);
Hungming Chen5bf09772019-04-25 11:16:13 +0800180 ASSERT_NE(nullptr, resolvService.get());
181
182 // Subscribe the death recipient to the service IDnsResolver for detecting Netd death.
Luke Huang70070852019-11-25 18:25:50 +0800183 // GTEST assertion macros are not invoked for generating a test failure in the death
184 // recipient because the macros can't indicate failed test if Netd died between tests.
185 // Moreover, continuing testing may have no meaningful after Netd death. Therefore, the
186 // death recipient aborts process by GTEST_LOG_(FATAL) once Netd died.
Luke Huangf8215372019-11-22 11:53:41 +0800187 sResolvDeathRecipient = AIBinder_DeathRecipient_new([](void*) {
188 constexpr char errorMessage[] = "Netd died";
189 LOG(ERROR) << errorMessage;
190 GTEST_LOG_(FATAL) << errorMessage;
191 });
192 ASSERT_EQ(STATUS_OK, AIBinder_linkToDeath(binder, sResolvDeathRecipient, nullptr));
Hungming Chen5bf09772019-04-25 11:16:13 +0800193
194 // Subscribe the DNS listener for verifying DNS metrics event contents.
Luke Huangf8215372019-11-22 11:53:41 +0800195 sDnsMetricsListener = ndk::SharedRefBase::make<DnsMetricsListener>(
196 TEST_NETID /*monitor specific network*/);
Hungming Chen5bf09772019-04-25 11:16:13 +0800197 ASSERT_TRUE(resolvService->registerEventListener(sDnsMetricsListener).isOk());
198
199 // Start the binder thread pool for listening DNS metrics events and receiving death
200 // recipient.
Luke Huangf8215372019-11-22 11:53:41 +0800201 ABinderProcess_startThreadPool();
Hungming Chene8f970c2019-04-10 17:34:06 +0800202 }
Hungming Chen473c4de2020-03-12 11:13:35 +0800203 static void TearDownTestSuite() { AIBinder_DeathRecipient_delete(sResolvDeathRecipient); }
Hungming Chene8f970c2019-04-10 17:34:06 +0800204
Ken Chenb9fa2062018-11-13 21:51:13 +0800205 protected:
Lorenzo Colitti61f796b2020-05-21 00:57:49 +0900206 void SetUp() {
207 mDnsClient.SetUp();
208 sDnsMetricsListener->reset();
209 }
210
Mike Yu960243d2020-01-17 19:02:15 +0800211 void TearDown() {
212 // Ensure the dump works at the end of each test.
213 DumpResolverService();
214
215 mDnsClient.TearDown();
216 }
nuccachena26cc2a2018-07-17 18:07:23 +0800217
Luke Huangf40df9c2020-04-21 08:51:48 +0800218 void resetNetwork() {
219 mDnsClient.TearDown();
220 mDnsClient.SetupOemNetwork();
221 }
222
Xiao Ma09b71022018-12-11 17:56:32 +0900223 void StartDns(test::DNSResponder& dns, const std::vector<DnsRecord>& records) {
224 for (const auto& r : records) {
225 dns.addMapping(r.host_name, r.type, r.addr);
226 }
227
228 ASSERT_TRUE(dns.startServer());
229 dns.clearQueries();
230 }
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900231
Mike Yu960243d2020-01-17 19:02:15 +0800232 void DumpResolverService() {
233 unique_fd fd(open("/dev/null", O_WRONLY));
234 EXPECT_EQ(mDnsClient.resolvService()->dump(fd, nullptr, 0), 0);
235
236 const char* querylogCmd[] = {"querylog"}; // Keep it sync with DnsQueryLog::DUMP_KEYWORD.
237 EXPECT_EQ(mDnsClient.resolvService()->dump(fd, querylogCmd, std::size(querylogCmd)), 0);
238 }
239
Hungming Chene8f970c2019-04-10 17:34:06 +0800240 bool WaitForNat64Prefix(ExpectNat64PrefixStatus status,
241 std::chrono::milliseconds timeout = std::chrono::milliseconds(1000)) {
Hungming Chen5bf09772019-04-25 11:16:13 +0800242 return sDnsMetricsListener->waitForNat64Prefix(status, timeout);
Hungming Chene8f970c2019-04-10 17:34:06 +0800243 }
244
Mike Yu724f77d2019-08-16 11:14:50 +0800245 bool WaitForPrivateDnsValidation(std::string serverAddr, bool validated) {
246 return sDnsMetricsListener->waitForPrivateDnsValidation(serverAddr, validated);
247 }
248
Mike Yu153b5b82020-03-04 19:53:54 +0800249 bool hasUncaughtPrivateDnsValidation(const std::string& serverAddr) {
250 return sDnsMetricsListener->findValidationRecord(serverAddr);
251 }
252
Mike Yu532405f2020-06-17 17:46:44 +0800253 void ExpectDnsEvent(int32_t eventType, int32_t returnCode, const std::string& hostname,
254 const std::vector<std::string>& ipAddresses) {
255 const DnsMetricsListener::DnsEvent expect = {
256 TEST_NETID, eventType, returnCode,
257 hostname, ipAddresses, static_cast<int32_t>(ipAddresses.size())};
Mike Yub8faac42020-06-20 11:11:44 +0800258 do {
259 // Blocking call until timeout.
260 const auto dnsEvent = sDnsMetricsListener->popDnsEvent();
261 ASSERT_TRUE(dnsEvent.has_value()) << "Expected DnsEvent " << expect;
262 if (dnsEvent.value() == expect) break;
263 LOG(INFO) << "Skip unexpected DnsEvent: " << dnsEvent.value();
264 } while (true);
Mike Yu532405f2020-06-17 17:46:44 +0800265 }
266
Mike Yu61d17262020-02-15 18:56:22 +0800267 enum class StatsCmp { LE, EQ };
268
269 bool expectStatsNotGreaterThan(const std::vector<NameserverStats>& nameserversStats) {
270 return expectStatsFromGetResolverInfo(nameserversStats, StatsCmp::LE);
271 }
272
273 bool expectStatsEqualTo(const std::vector<NameserverStats>& nameserversStats) {
274 return expectStatsFromGetResolverInfo(nameserversStats, StatsCmp::EQ);
275 }
276
277 bool expectStatsFromGetResolverInfo(const std::vector<NameserverStats>& nameserversStats,
278 const StatsCmp cmp) {
Mike Yue2162e52020-03-04 18:43:46 +0800279 std::vector<std::string> res_servers;
280 std::vector<std::string> res_domains;
281 std::vector<std::string> res_tls_servers;
282 res_params res_params;
283 std::vector<ResolverStats> res_stats;
284 int wait_for_pending_req_timeout_count;
285
286 if (!DnsResponderClient::GetResolverInfo(mDnsClient.resolvService(), TEST_NETID,
287 &res_servers, &res_domains, &res_tls_servers,
288 &res_params, &res_stats,
289 &wait_for_pending_req_timeout_count)) {
290 ADD_FAILURE() << "GetResolverInfo failed";
291 return false;
292 }
293
294 if (res_servers.size() != res_stats.size()) {
295 ADD_FAILURE() << fmt::format("res_servers.size() != res_stats.size(): {} != {}",
296 res_servers.size(), res_stats.size());
297 return false;
298 }
299 if (res_servers.size() != nameserversStats.size()) {
300 ADD_FAILURE() << fmt::format("res_servers.size() != nameserversStats.size(): {} != {}",
301 res_servers.size(), nameserversStats.size());
302 return false;
303 }
304
305 for (const auto& stats : nameserversStats) {
306 SCOPED_TRACE(stats.server);
307 const auto it = std::find(res_servers.begin(), res_servers.end(), stats.server);
308 if (it == res_servers.end()) {
309 ADD_FAILURE() << fmt::format("nameserver {} not found in the list {{{}}}",
310 stats.server, fmt::join(res_servers, ", "));
311 return false;
312 }
313 const int index = std::distance(res_servers.begin(), it);
314
315 // The check excludes rtt_avg, last_sample_time, and usable since they will be obsolete
316 // after |res_stats| is retrieved from NetConfig.dnsStats rather than NetConfig.nsstats.
Mike Yu61d17262020-02-15 18:56:22 +0800317 switch (cmp) {
318 case StatsCmp::EQ:
319 EXPECT_EQ(res_stats[index].successes, stats.successes);
320 EXPECT_EQ(res_stats[index].errors, stats.errors);
321 EXPECT_EQ(res_stats[index].timeouts, stats.timeouts);
322 EXPECT_EQ(res_stats[index].internal_errors, stats.internal_errors);
323 break;
324 case StatsCmp::LE:
325 EXPECT_LE(res_stats[index].successes, stats.successes);
326 EXPECT_LE(res_stats[index].errors, stats.errors);
327 EXPECT_LE(res_stats[index].timeouts, stats.timeouts);
328 EXPECT_LE(res_stats[index].internal_errors, stats.internal_errors);
329 break;
330 default:
331 ADD_FAILURE() << "Unknown comparator " << static_cast<int>(cmp);
332 return false;
333 }
Mike Yue2162e52020-03-04 18:43:46 +0800334 }
335
336 return true;
337 }
338
Mike Yu153b5b82020-03-04 19:53:54 +0800339 // Since there's no way to terminate private DNS validation threads at any time. Tests that
340 // focus on the results of private DNS validation can interfere with each other if they use the
341 // same IP address for test servers. getUniqueIPv4Address() is a workaround to reduce the
342 // possibility of tests being flaky. A feasible solution is to forbid the validation threads,
343 // which are considered as outdated (e.g. switch the resolver to private DNS OFF mode), updating
344 // the result to the PrivateDnsConfiguration instance.
345 static std::string getUniqueIPv4Address() {
346 static int counter = 0;
347 return fmt::format("127.0.100.{}", (++counter & 0xff));
348 }
349
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900350 DnsResponderClient mDnsClient;
Xiao Ma09b71022018-12-11 17:56:32 +0900351
Hungming Chen5bf09772019-04-25 11:16:13 +0800352 // Use a shared static DNS listener for all tests to avoid registering lots of listeners
353 // which may be released late until process terminated. Currently, registered DNS listener
354 // is removed by binder death notification which is fired when the process hosting an
355 // IBinder has gone away. If every test in ResolverTest registers its DNS listener, Netd
356 // may temporarily hold lots of dead listeners until the unit test process terminates.
357 // TODO: Perhaps add an unregistering listener binder call or fork a listener process which
358 // could be terminated earlier.
Luke Huangf8215372019-11-22 11:53:41 +0800359 static std::shared_ptr<DnsMetricsListener>
Hungming Chen473c4de2020-03-12 11:13:35 +0800360 sDnsMetricsListener; // Initialized in SetUpTestSuite.
Hungming Chen5bf09772019-04-25 11:16:13 +0800361
362 // Use a shared static death recipient to monitor the service death. The static death
363 // recipient could monitor the death not only during the test but also between tests.
Hungming Chen473c4de2020-03-12 11:13:35 +0800364 static AIBinder_DeathRecipient* sResolvDeathRecipient; // Initialized in SetUpTestSuite.
Ken Chenb9fa2062018-11-13 21:51:13 +0800365};
366
Hungming Chen5bf09772019-04-25 11:16:13 +0800367// Initialize static member of class.
Luke Huangf8215372019-11-22 11:53:41 +0800368std::shared_ptr<DnsMetricsListener> ResolverTest::sDnsMetricsListener;
369AIBinder_DeathRecipient* ResolverTest::sResolvDeathRecipient;
Hungming Chen5bf09772019-04-25 11:16:13 +0800370
Ken Chenb9fa2062018-11-13 21:51:13 +0800371TEST_F(ResolverTest, GetHostByName) {
Xiao Ma09b71022018-12-11 17:56:32 +0900372 constexpr char nonexistent_host_name[] = "nonexistent.example.com.";
373
374 test::DNSResponder dns;
375 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.3"}});
376 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800377
378 const hostent* result;
Ken Chenb9fa2062018-11-13 21:51:13 +0800379 result = gethostbyname("nonexistent");
380 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, nonexistent_host_name));
381 ASSERT_TRUE(result == nullptr);
382 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
383
384 dns.clearQueries();
385 result = gethostbyname("hello");
Xiao Ma09b71022018-12-11 17:56:32 +0900386 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
Ken Chenb9fa2062018-11-13 21:51:13 +0800387 ASSERT_FALSE(result == nullptr);
388 ASSERT_EQ(4, result->h_length);
389 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
390 EXPECT_EQ("1.2.3.3", ToString(result));
391 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800392}
393
lifr4e4a2e02019-01-29 16:53:51 +0800394TEST_F(ResolverTest, GetHostByName_cnames) {
395 constexpr char host_name[] = "host.example.com.";
396 size_t cnamecount = 0;
397 test::DNSResponder dns;
398
399 const std::vector<DnsRecord> records = {
400 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
401 {"a.example.com.", ns_type::ns_t_cname, "b.example.com."},
402 {"b.example.com.", ns_type::ns_t_cname, "c.example.com."},
403 {"c.example.com.", ns_type::ns_t_cname, "d.example.com."},
404 {"d.example.com.", ns_type::ns_t_cname, "e.example.com."},
405 {"e.example.com.", ns_type::ns_t_cname, host_name},
406 {host_name, ns_type::ns_t_a, "1.2.3.3"},
407 {host_name, ns_type::ns_t_aaaa, "2001:db8::42"},
408 };
409 StartDns(dns, records);
410 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
411
412 // using gethostbyname2() to resolve ipv4 hello.example.com. to 1.2.3.3
413 // Ensure the v4 address and cnames are correct
414 const hostent* result;
415 result = gethostbyname2("hello", AF_INET);
416 ASSERT_FALSE(result == nullptr);
417
418 for (int i = 0; result != nullptr && result->h_aliases[i] != nullptr; i++) {
419 std::string domain_name = records[i].host_name.substr(0, records[i].host_name.size() - 1);
420 EXPECT_EQ(result->h_aliases[i], domain_name);
421 cnamecount++;
422 }
423 // The size of "Non-cname type" record in DNS records is 2
424 ASSERT_EQ(cnamecount, records.size() - 2);
425 ASSERT_EQ(4, result->h_length);
426 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
427 EXPECT_EQ("1.2.3.3", ToString(result));
428 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
429 EXPECT_EQ(1U, dns.queries().size()) << dns.dumpQueries();
430
431 // using gethostbyname2() to resolve ipv6 hello.example.com. to 2001:db8::42
432 // Ensure the v6 address and cnames are correct
433 cnamecount = 0;
434 dns.clearQueries();
435 result = gethostbyname2("hello", AF_INET6);
436 for (unsigned i = 0; result != nullptr && result->h_aliases[i] != nullptr; i++) {
437 std::string domain_name = records[i].host_name.substr(0, records[i].host_name.size() - 1);
438 EXPECT_EQ(result->h_aliases[i], domain_name);
439 cnamecount++;
440 }
441 // The size of "Non-cname type" DNS record in records is 2
442 ASSERT_EQ(cnamecount, records.size() - 2);
443 ASSERT_FALSE(result == nullptr);
444 ASSERT_EQ(16, result->h_length);
445 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
446 EXPECT_EQ("2001:db8::42", ToString(result));
447 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
448}
449
450TEST_F(ResolverTest, GetHostByName_cnamesInfiniteLoop) {
451 test::DNSResponder dns;
452 const std::vector<DnsRecord> records = {
453 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
454 {"a.example.com.", ns_type::ns_t_cname, kHelloExampleCom},
455 };
456 StartDns(dns, records);
457 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
458
459 const hostent* result;
460 result = gethostbyname2("hello", AF_INET);
461 ASSERT_TRUE(result == nullptr);
462
463 dns.clearQueries();
464 result = gethostbyname2("hello", AF_INET6);
465 ASSERT_TRUE(result == nullptr);
466}
467
Ken Chenb9fa2062018-11-13 21:51:13 +0800468TEST_F(ResolverTest, GetHostByName_localhost) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800469 constexpr char name_camelcase[] = "LocalHost";
Ken Chenb9fa2062018-11-13 21:51:13 +0800470 constexpr char name_ip6_dot[] = "ip6-localhost.";
471 constexpr char name_ip6_fqdn[] = "ip6-localhost.example.com.";
472
markchien96b09e22020-07-29 14:24:34 +0800473 // Add a no-op nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900474 test::DNSResponder dns;
475 StartDns(dns, {});
476 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800477
478 // Expect no DNS queries; localhost is resolved via /etc/hosts
Xiao Ma09b71022018-12-11 17:56:32 +0900479 const hostent* result = gethostbyname(kLocalHost);
Ken Chenb9fa2062018-11-13 21:51:13 +0800480 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
481 ASSERT_FALSE(result == nullptr);
482 ASSERT_EQ(4, result->h_length);
483 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900484 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800485 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
486
487 // Ensure the hosts file resolver ignores case of hostnames
488 result = gethostbyname(name_camelcase);
489 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
490 ASSERT_FALSE(result == nullptr);
491 ASSERT_EQ(4, result->h_length);
492 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900493 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800494 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
495
496 // The hosts file also contains ip6-localhost, but gethostbyname() won't
chenbruce018fdb22019-06-12 18:08:04 +0800497 // return it. This would be easy to
Ken Chenb9fa2062018-11-13 21:51:13 +0800498 // change, but there's no point in changing the legacy behavior; new code
499 // should be calling getaddrinfo() anyway.
500 // So we check the legacy behavior, which results in amusing A-record
501 // lookups for ip6-localhost, with and without search domains appended.
502 dns.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900503 result = gethostbyname(kIp6LocalHost);
Sehee Parkbbca0202018-11-16 10:53:16 +0900504 EXPECT_EQ(2U, dns.queries().size()) << dns.dumpQueries();
505 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, name_ip6_dot)) << dns.dumpQueries();
506 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, name_ip6_fqdn)) << dns.dumpQueries();
Ken Chenb9fa2062018-11-13 21:51:13 +0800507 ASSERT_TRUE(result == nullptr);
508
509 // Finally, use gethostbyname2() to resolve ip6-localhost to ::1 from
510 // the hosts file.
511 dns.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900512 result = gethostbyname2(kIp6LocalHost, AF_INET6);
Ken Chenb9fa2062018-11-13 21:51:13 +0800513 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
514 ASSERT_FALSE(result == nullptr);
515 ASSERT_EQ(16, result->h_length);
516 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900517 EXPECT_EQ(kIp6LocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800518 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800519}
520
521TEST_F(ResolverTest, GetHostByName_numeric) {
markchien96b09e22020-07-29 14:24:34 +0800522 // Add a no-op nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900523 test::DNSResponder dns;
524 StartDns(dns, {});
525 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800526
527 // Numeric v4 address: expect no DNS queries
528 constexpr char numeric_v4[] = "192.168.0.1";
Ken Chenb9fa2062018-11-13 21:51:13 +0800529 const hostent* result = gethostbyname(numeric_v4);
Sehee Parkbbca0202018-11-16 10:53:16 +0900530 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800531 ASSERT_FALSE(result == nullptr);
532 ASSERT_EQ(4, result->h_length); // v4
533 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
534 EXPECT_EQ(numeric_v4, ToString(result));
535 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
536
537 // gethostbyname() recognizes a v6 address, and fails with no DNS queries
538 constexpr char numeric_v6[] = "2001:db8::42";
539 dns.clearQueries();
540 result = gethostbyname(numeric_v6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900541 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800542 EXPECT_TRUE(result == nullptr);
543
544 // Numeric v6 address with gethostbyname2(): succeeds with no DNS queries
545 dns.clearQueries();
546 result = gethostbyname2(numeric_v6, AF_INET6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900547 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800548 ASSERT_FALSE(result == nullptr);
549 ASSERT_EQ(16, result->h_length); // v6
550 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
551 EXPECT_EQ(numeric_v6, ToString(result));
552 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
553
554 // Numeric v6 address with scope work with getaddrinfo(),
555 // but gethostbyname2() does not understand them; it issues two dns
556 // queries, then fails. This hardly ever happens, there's no point
557 // in fixing this. This test simply verifies the current (bogus)
558 // behavior to avoid further regressions (like crashes, or leaks).
559 constexpr char numeric_v6_scope[] = "fe80::1%lo";
560 dns.clearQueries();
561 result = gethostbyname2(numeric_v6_scope, AF_INET6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900562 EXPECT_EQ(2U, dns.queries().size()); // OUCH!
Ken Chenb9fa2062018-11-13 21:51:13 +0800563 ASSERT_TRUE(result == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800564}
565
566TEST_F(ResolverTest, BinderSerialization) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800567 std::vector<int> params_offsets = {
Luke Huang5bd827c2019-03-14 16:10:04 +0800568 IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY,
569 IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD,
570 IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES,
571 IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES,
572 IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC,
573 IDnsResolver::RESOLVER_PARAMS_RETRY_COUNT,
Ken Chenb9fa2062018-11-13 21:51:13 +0800574 };
Bernie Innocentib102dd22018-12-04 14:57:48 +0900575 const int size = static_cast<int>(params_offsets.size());
Luke Huang5bd827c2019-03-14 16:10:04 +0800576 EXPECT_EQ(size, IDnsResolver::RESOLVER_PARAMS_COUNT);
Ken Chenb9fa2062018-11-13 21:51:13 +0800577 std::sort(params_offsets.begin(), params_offsets.end());
Bernie Innocentib102dd22018-12-04 14:57:48 +0900578 for (int i = 0; i < size; ++i) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800579 EXPECT_EQ(params_offsets[i], i);
580 }
581}
582
583TEST_F(ResolverTest, GetHostByName_Binder) {
Luke Huangf8215372019-11-22 11:53:41 +0800584 std::vector<std::string> domains = {"example.com"};
Ken Chenb9fa2062018-11-13 21:51:13 +0800585 std::vector<std::unique_ptr<test::DNSResponder>> dns;
586 std::vector<std::string> servers;
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900587 std::vector<DnsResponderClient::Mapping> mappings;
588 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupMappings(1, domains, &mappings));
589 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupDNSServers(4, mappings, &dns, &servers));
Ken Chenb9fa2062018-11-13 21:51:13 +0800590 ASSERT_EQ(1U, mappings.size());
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900591 const DnsResponderClient::Mapping& mapping = mappings[0];
Ken Chenb9fa2062018-11-13 21:51:13 +0800592
Xiao Ma09b71022018-12-11 17:56:32 +0900593 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains, kDefaultParams));
Ken Chenb9fa2062018-11-13 21:51:13 +0800594
595 const hostent* result = gethostbyname(mapping.host.c_str());
Bernie Innocentib102dd22018-12-04 14:57:48 +0900596 const size_t total_queries =
Luke Huangfde82482019-06-04 01:04:53 +0800597 std::accumulate(dns.begin(), dns.end(), 0, [&mapping](size_t total, auto& d) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800598 return total + GetNumQueriesForType(*d, ns_type::ns_t_a, mapping.entry.c_str());
599 });
600
601 EXPECT_LE(1U, total_queries);
602 ASSERT_FALSE(result == nullptr);
603 ASSERT_EQ(4, result->h_length);
604 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
605 EXPECT_EQ(mapping.ip4, ToString(result));
606 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
607
608 std::vector<std::string> res_servers;
609 std::vector<std::string> res_domains;
Mike Yu0a1c53d2018-11-26 13:26:21 +0900610 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +0900611 res_params res_params;
Ken Chenb9fa2062018-11-13 21:51:13 +0800612 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +0800613 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +0800614 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
615 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
616 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chenb9fa2062018-11-13 21:51:13 +0800617 EXPECT_EQ(servers.size(), res_servers.size());
618 EXPECT_EQ(domains.size(), res_domains.size());
Mike Yu0a1c53d2018-11-26 13:26:21 +0900619 EXPECT_EQ(0U, res_tls_servers.size());
Luke Huang5bd827c2019-03-14 16:10:04 +0800620 ASSERT_EQ(static_cast<size_t>(IDnsResolver::RESOLVER_PARAMS_COUNT), kDefaultParams.size());
621 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY],
622 res_params.sample_validity);
623 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900624 res_params.success_threshold);
Luke Huang5bd827c2019-03-14 16:10:04 +0800625 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
626 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
627 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
Ken Chenb9fa2062018-11-13 21:51:13 +0800628 res_params.base_timeout_msec);
629 EXPECT_EQ(servers.size(), res_stats.size());
630
Bernie Innocenti0c067e42019-04-01 15:33:16 +0900631 EXPECT_THAT(res_servers, testing::UnorderedElementsAreArray(servers));
632 EXPECT_THAT(res_domains, testing::UnorderedElementsAreArray(domains));
Ken Chenb9fa2062018-11-13 21:51:13 +0800633}
634
635TEST_F(ResolverTest, GetAddrInfo) {
Xiao Ma09b71022018-12-11 17:56:32 +0900636 constexpr char listen_addr[] = "127.0.0.4";
637 constexpr char listen_addr2[] = "127.0.0.5";
638 constexpr char host_name[] = "howdy.example.com.";
Ken Chenb9fa2062018-11-13 21:51:13 +0800639
Xiao Ma09b71022018-12-11 17:56:32 +0900640 const std::vector<DnsRecord> records = {
641 {host_name, ns_type::ns_t_a, "1.2.3.4"},
642 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
643 };
644 test::DNSResponder dns(listen_addr);
645 test::DNSResponder dns2(listen_addr2);
646 StartDns(dns, records);
647 StartDns(dns2, records);
Ken Chenb9fa2062018-11-13 21:51:13 +0800648
Xiao Ma09b71022018-12-11 17:56:32 +0900649 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}));
Ken Chenb9fa2062018-11-13 21:51:13 +0800650 dns.clearQueries();
651 dns2.clearQueries();
652
653 ScopedAddrinfo result = safe_getaddrinfo("howdy", nullptr, nullptr);
654 EXPECT_TRUE(result != nullptr);
655 size_t found = GetNumQueries(dns, host_name);
656 EXPECT_LE(1U, found);
657 // Could be A or AAAA
658 std::string result_str = ToString(result);
659 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +0800660 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +0800661
662 // Verify that the name is cached.
663 size_t old_found = found;
664 result = safe_getaddrinfo("howdy", nullptr, nullptr);
665 EXPECT_TRUE(result != nullptr);
666 found = GetNumQueries(dns, host_name);
667 EXPECT_LE(1U, found);
668 EXPECT_EQ(old_found, found);
669 result_str = ToString(result);
Luke Huangf8215372019-11-22 11:53:41 +0800670 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4") << result_str;
Ken Chenb9fa2062018-11-13 21:51:13 +0800671
672 // Change the DNS resolver, ensure that queries are still cached.
Xiao Ma09b71022018-12-11 17:56:32 +0900673 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr2}));
Ken Chenb9fa2062018-11-13 21:51:13 +0800674 dns.clearQueries();
675 dns2.clearQueries();
676
677 result = safe_getaddrinfo("howdy", nullptr, nullptr);
678 EXPECT_TRUE(result != nullptr);
679 found = GetNumQueries(dns, host_name);
680 size_t found2 = GetNumQueries(dns2, host_name);
681 EXPECT_EQ(0U, found);
682 EXPECT_LE(0U, found2);
683
684 // Could be A or AAAA
685 result_str = ToString(result);
686 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +0800687 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +0800688}
689
690TEST_F(ResolverTest, GetAddrInfoV4) {
Xiao Ma09b71022018-12-11 17:56:32 +0900691 test::DNSResponder dns;
692 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.5"}});
693 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800694
Xiao Ma09b71022018-12-11 17:56:32 +0900695 const addrinfo hints = {.ai_family = AF_INET};
696 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
Ken Chenb9fa2062018-11-13 21:51:13 +0800697 EXPECT_TRUE(result != nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900698 EXPECT_EQ(1U, GetNumQueries(dns, kHelloExampleCom));
Ken Chenb9fa2062018-11-13 21:51:13 +0800699 EXPECT_EQ("1.2.3.5", ToString(result));
700}
701
702TEST_F(ResolverTest, GetAddrInfo_localhost) {
markchien96b09e22020-07-29 14:24:34 +0800703 // Add a no-op nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900704 test::DNSResponder dns;
705 StartDns(dns, {});
706 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800707
Xiao Ma09b71022018-12-11 17:56:32 +0900708 ScopedAddrinfo result = safe_getaddrinfo(kLocalHost, nullptr, nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800709 EXPECT_TRUE(result != nullptr);
710 // Expect no DNS queries; localhost is resolved via /etc/hosts
711 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900712 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800713
Xiao Ma09b71022018-12-11 17:56:32 +0900714 result = safe_getaddrinfo(kIp6LocalHost, nullptr, nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800715 EXPECT_TRUE(result != nullptr);
716 // Expect no DNS queries; ip6-localhost is resolved via /etc/hosts
717 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900718 EXPECT_EQ(kIp6LocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800719}
720
Luke Huangd8ac4752019-06-18 17:05:47 +0800721TEST_F(ResolverTest, GetAddrInfo_InvalidSocketType) {
722 test::DNSResponder dns;
723 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.5"}});
724 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
725
726 // TODO: Test other invalid socket types.
727 const addrinfo hints = {
728 .ai_family = AF_UNSPEC,
Luke Huangd8ac4752019-06-18 17:05:47 +0800729 .ai_socktype = SOCK_PACKET,
730 };
731 addrinfo* result = nullptr;
732 // This is a valid hint, but the query won't be sent because the socket type is
733 // not supported.
734 EXPECT_EQ(EAI_NODATA, getaddrinfo("hello", nullptr, &hints, &result));
735 ScopedAddrinfo result_cleanup(result);
736 EXPECT_EQ(nullptr, result);
737}
738
Ken Chen92bed612018-12-22 21:46:55 +0800739// Verify if the resolver correctly handle multiple queries simultaneously
740// step 1: set dns server#1 into deferred responding mode.
741// step 2: thread#1 query "hello.example.com." --> resolver send query to server#1.
742// step 3: thread#2 query "hello.example.com." --> resolver hold the request and wait for
743// response of previous pending query sent by thread#1.
744// step 4: thread#3 query "konbanha.example.com." --> resolver send query to server#3. Server
745// respond to resolver immediately.
746// step 5: check if server#1 get 1 query by thread#1, server#2 get 0 query, server#3 get 1 query.
747// step 6: resume dns server#1 to respond dns query in step#2.
748// step 7: thread#1 and #2 should get returned from DNS query after step#6. Also, check the
749// number of queries in server#2 is 0 to ensure thread#2 does not wake up unexpectedly
750// before signaled by thread#1.
751TEST_F(ResolverTest, GetAddrInfoV4_deferred_resp) {
752 const char* listen_addr1 = "127.0.0.9";
753 const char* listen_addr2 = "127.0.0.10";
754 const char* listen_addr3 = "127.0.0.11";
755 const char* listen_srv = "53";
756 const char* host_name_deferred = "hello.example.com.";
757 const char* host_name_normal = "konbanha.example.com.";
Mike Yufc125e42019-05-15 20:41:28 +0800758 test::DNSResponder dns1(listen_addr1, listen_srv, ns_rcode::ns_r_servfail);
759 test::DNSResponder dns2(listen_addr2, listen_srv, ns_rcode::ns_r_servfail);
760 test::DNSResponder dns3(listen_addr3, listen_srv, ns_rcode::ns_r_servfail);
Ken Chen92bed612018-12-22 21:46:55 +0800761 dns1.addMapping(host_name_deferred, ns_type::ns_t_a, "1.2.3.4");
762 dns2.addMapping(host_name_deferred, ns_type::ns_t_a, "1.2.3.4");
763 dns3.addMapping(host_name_normal, ns_type::ns_t_a, "1.2.3.5");
764 ASSERT_TRUE(dns1.startServer());
765 ASSERT_TRUE(dns2.startServer());
766 ASSERT_TRUE(dns3.startServer());
767 const std::vector<std::string> servers_for_t1 = {listen_addr1};
768 const std::vector<std::string> servers_for_t2 = {listen_addr2};
769 const std::vector<std::string> servers_for_t3 = {listen_addr3};
770 addrinfo hints = {.ai_family = AF_INET};
771 const std::vector<int> params = {300, 25, 8, 8, 5000};
772 bool t3_task_done = false;
773
774 dns1.setDeferredResp(true);
775 std::thread t1([&, this]() {
776 ASSERT_TRUE(
777 mDnsClient.SetResolversForNetwork(servers_for_t1, kDefaultSearchDomains, params));
778 ScopedAddrinfo result = safe_getaddrinfo(host_name_deferred, nullptr, &hints);
779 // t3's dns query should got returned first
780 EXPECT_TRUE(t3_task_done);
781 EXPECT_EQ(1U, GetNumQueries(dns1, host_name_deferred));
782 EXPECT_TRUE(result != nullptr);
783 EXPECT_EQ("1.2.3.4", ToString(result));
784 });
785
786 // ensuring t1 and t2 handler functions are processed in order
787 usleep(100 * 1000);
788 std::thread t2([&, this]() {
789 ASSERT_TRUE(
790 mDnsClient.SetResolversForNetwork(servers_for_t2, kDefaultSearchDomains, params));
791 ScopedAddrinfo result = safe_getaddrinfo(host_name_deferred, nullptr, &hints);
792 EXPECT_TRUE(t3_task_done);
793 EXPECT_EQ(0U, GetNumQueries(dns2, host_name_deferred));
794 EXPECT_TRUE(result != nullptr);
795 EXPECT_EQ("1.2.3.4", ToString(result));
796
797 std::vector<std::string> res_servers;
798 std::vector<std::string> res_domains;
799 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +0900800 res_params res_params;
Ken Chen92bed612018-12-22 21:46:55 +0800801 std::vector<ResolverStats> res_stats;
802 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +0800803 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
804 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains,
805 &res_tls_servers, &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chen92bed612018-12-22 21:46:55 +0800806 EXPECT_EQ(0, wait_for_pending_req_timeout_count);
807 });
808
809 // ensuring t2 and t3 handler functions are processed in order
810 usleep(100 * 1000);
811 std::thread t3([&, this]() {
812 ASSERT_TRUE(
813 mDnsClient.SetResolversForNetwork(servers_for_t3, kDefaultSearchDomains, params));
814 ScopedAddrinfo result = safe_getaddrinfo(host_name_normal, nullptr, &hints);
815 EXPECT_EQ(1U, GetNumQueries(dns1, host_name_deferred));
816 EXPECT_EQ(0U, GetNumQueries(dns2, host_name_deferred));
817 EXPECT_EQ(1U, GetNumQueries(dns3, host_name_normal));
818 EXPECT_TRUE(result != nullptr);
819 EXPECT_EQ("1.2.3.5", ToString(result));
820
821 t3_task_done = true;
822 dns1.setDeferredResp(false);
823 });
824 t3.join();
825 t1.join();
826 t2.join();
827}
828
lifr4e4a2e02019-01-29 16:53:51 +0800829TEST_F(ResolverTest, GetAddrInfo_cnames) {
830 constexpr char host_name[] = "host.example.com.";
831 test::DNSResponder dns;
832 const std::vector<DnsRecord> records = {
833 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
834 {"a.example.com.", ns_type::ns_t_cname, "b.example.com."},
835 {"b.example.com.", ns_type::ns_t_cname, "c.example.com."},
836 {"c.example.com.", ns_type::ns_t_cname, "d.example.com."},
837 {"d.example.com.", ns_type::ns_t_cname, "e.example.com."},
838 {"e.example.com.", ns_type::ns_t_cname, host_name},
839 {host_name, ns_type::ns_t_a, "1.2.3.3"},
840 {host_name, ns_type::ns_t_aaaa, "2001:db8::42"},
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 EXPECT_EQ("1.2.3.3", ToString(result));
849
850 dns.clearQueries();
851 hints = {.ai_family = AF_INET6};
852 result = safe_getaddrinfo("hello", nullptr, &hints);
853 EXPECT_TRUE(result != nullptr);
854 EXPECT_EQ("2001:db8::42", ToString(result));
855}
856
857TEST_F(ResolverTest, GetAddrInfo_cnamesNoIpAddress) {
858 test::DNSResponder dns;
859 const std::vector<DnsRecord> records = {
860 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
861 };
862 StartDns(dns, records);
863 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
864
865 addrinfo hints = {.ai_family = AF_INET};
866 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
867 EXPECT_TRUE(result == nullptr);
868
869 dns.clearQueries();
870 hints = {.ai_family = AF_INET6};
871 result = safe_getaddrinfo("hello", nullptr, &hints);
872 EXPECT_TRUE(result == nullptr);
873}
874
875TEST_F(ResolverTest, GetAddrInfo_cnamesIllegalRdata) {
876 test::DNSResponder dns;
877 const std::vector<DnsRecord> records = {
878 {kHelloExampleCom, ns_type::ns_t_cname, ".!#?"},
879 };
880 StartDns(dns, records);
881 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
882
883 addrinfo hints = {.ai_family = AF_INET};
884 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
885 EXPECT_TRUE(result == nullptr);
886
887 dns.clearQueries();
888 hints = {.ai_family = AF_INET6};
889 result = safe_getaddrinfo("hello", nullptr, &hints);
890 EXPECT_TRUE(result == nullptr);
891}
892
Ken Chenb9fa2062018-11-13 21:51:13 +0800893TEST_F(ResolverTest, MultidomainResolution) {
Xiao Ma09b71022018-12-11 17:56:32 +0900894 constexpr char host_name[] = "nihao.example2.com.";
Luke Huangf8215372019-11-22 11:53:41 +0800895 std::vector<std::string> searchDomains = {"example1.com", "example2.com", "example3.com"};
Ken Chenb9fa2062018-11-13 21:51:13 +0800896
Xiao Ma09b71022018-12-11 17:56:32 +0900897 test::DNSResponder dns("127.0.0.6");
898 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.3"}});
899 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({"127.0.0.6"}, searchDomains));
900
Ken Chenb9fa2062018-11-13 21:51:13 +0800901 const hostent* result = gethostbyname("nihao");
Xiao Ma09b71022018-12-11 17:56:32 +0900902
Ken Chenb9fa2062018-11-13 21:51:13 +0800903 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
904 ASSERT_FALSE(result == nullptr);
905 ASSERT_EQ(4, result->h_length);
906 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
907 EXPECT_EQ("1.2.3.3", ToString(result));
908 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800909}
910
911TEST_F(ResolverTest, GetAddrInfoV6_numeric) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800912 constexpr char host_name[] = "ohayou.example.com.";
913 constexpr char numeric_addr[] = "fe80::1%lo";
914
Xiao Ma09b71022018-12-11 17:56:32 +0900915 test::DNSResponder dns;
Ken Chenb9fa2062018-11-13 21:51:13 +0800916 dns.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900917 StartDns(dns, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
918 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800919
920 addrinfo hints = {.ai_family = AF_INET6};
921 ScopedAddrinfo result = safe_getaddrinfo(numeric_addr, nullptr, &hints);
922 EXPECT_TRUE(result != nullptr);
923 EXPECT_EQ(numeric_addr, ToString(result));
924 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
925
926 // Now try a non-numeric hostname query with the AI_NUMERICHOST flag set.
927 // We should fail without sending out a DNS query.
928 hints.ai_flags |= AI_NUMERICHOST;
929 result = safe_getaddrinfo(host_name, nullptr, &hints);
930 EXPECT_TRUE(result == nullptr);
931 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
932}
933
934TEST_F(ResolverTest, GetAddrInfoV6_failing) {
Xiao Ma09b71022018-12-11 17:56:32 +0900935 constexpr char listen_addr0[] = "127.0.0.7";
936 constexpr char listen_addr1[] = "127.0.0.8";
Ken Chenb9fa2062018-11-13 21:51:13 +0800937 const char* host_name = "ohayou.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +0900938
939 test::DNSResponder dns0(listen_addr0);
940 test::DNSResponder dns1(listen_addr1);
Ken Chenb9fa2062018-11-13 21:51:13 +0800941 dns0.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900942 StartDns(dns0, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
943 StartDns(dns1, {{host_name, ns_type::ns_t_aaaa, "2001:db8::6"}});
944
Luke Huangf8215372019-11-22 11:53:41 +0800945 std::vector<std::string> servers = {listen_addr0, listen_addr1};
Ken Chenb9fa2062018-11-13 21:51:13 +0800946 // <sample validity in s> <success threshold in percent> <min samples> <max samples>
947 int sample_count = 8;
Luke Huangf8215372019-11-22 11:53:41 +0800948 const std::vector<int> params = {300, 25, sample_count, sample_count};
Xiao Ma09b71022018-12-11 17:56:32 +0900949 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, kDefaultSearchDomains, params));
Ken Chenb9fa2062018-11-13 21:51:13 +0800950
951 // Repeatedly perform resolutions for non-existing domains until MAXNSSAMPLES resolutions have
952 // reached the dns0, which is set to fail. No more requests should then arrive at that server
953 // for the next sample_lifetime seconds.
954 // TODO: This approach is implementation-dependent, change once metrics reporting is available.
Xiao Ma09b71022018-12-11 17:56:32 +0900955 const addrinfo hints = {.ai_family = AF_INET6};
Bernie Innocentib102dd22018-12-04 14:57:48 +0900956 for (int i = 0; i < sample_count; ++i) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800957 std::string domain = StringPrintf("nonexistent%d", i);
958 ScopedAddrinfo result = safe_getaddrinfo(domain.c_str(), nullptr, &hints);
959 }
960 // Due to 100% errors for all possible samples, the server should be ignored from now on and
961 // only the second one used for all following queries, until NSSAMPLE_VALIDITY is reached.
962 dns0.clearQueries();
963 dns1.clearQueries();
964 ScopedAddrinfo result = safe_getaddrinfo("ohayou", nullptr, &hints);
965 EXPECT_TRUE(result != nullptr);
966 EXPECT_EQ(0U, GetNumQueries(dns0, host_name));
967 EXPECT_EQ(1U, GetNumQueries(dns1, host_name));
968}
969
970TEST_F(ResolverTest, GetAddrInfoV6_nonresponsive) {
Xiao Ma09b71022018-12-11 17:56:32 +0900971 constexpr char listen_addr0[] = "127.0.0.7";
972 constexpr char listen_addr1[] = "127.0.0.8";
973 constexpr char listen_srv[] = "53";
974 constexpr char host_name1[] = "ohayou.example.com.";
975 constexpr char host_name2[] = "ciao.example.com.";
Luke Huang483cf332019-06-03 17:24:51 +0800976 const std::vector<std::string> defaultSearchDomain = {"example.com"};
977 // The minimal timeout is 1000ms, so we can't decrease timeout
978 // So reduce retry count.
979 const std::vector<int> reduceRetryParams = {
980 300, // sample validity in seconds
981 25, // success threshod in percent
982 8, 8, // {MIN,MAX}_SAMPLES
983 1000, // BASE_TIMEOUT_MSEC
984 1, // retry count
985 };
Xiao Ma09b71022018-12-11 17:56:32 +0900986 const std::vector<DnsRecord> records0 = {
987 {host_name1, ns_type::ns_t_aaaa, "2001:db8::5"},
988 {host_name2, ns_type::ns_t_aaaa, "2001:db8::5"},
989 };
990 const std::vector<DnsRecord> records1 = {
991 {host_name1, ns_type::ns_t_aaaa, "2001:db8::6"},
992 {host_name2, ns_type::ns_t_aaaa, "2001:db8::6"},
993 };
Ken Chenb9fa2062018-11-13 21:51:13 +0800994
995 // dns0 does not respond with 100% probability, while
996 // dns1 responds normally, at least initially.
Mike Yufc125e42019-05-15 20:41:28 +0800997 test::DNSResponder dns0(listen_addr0, listen_srv, static_cast<ns_rcode>(-1));
998 test::DNSResponder dns1(listen_addr1, listen_srv, static_cast<ns_rcode>(-1));
Ken Chenb9fa2062018-11-13 21:51:13 +0800999 dns0.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +09001000 StartDns(dns0, records0);
1001 StartDns(dns1, records1);
Luke Huang483cf332019-06-03 17:24:51 +08001002 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr0, listen_addr1}, defaultSearchDomain,
1003 reduceRetryParams));
Ken Chenb9fa2062018-11-13 21:51:13 +08001004
Luke Huang483cf332019-06-03 17:24:51 +08001005 // Specify ai_socktype to make getaddrinfo will only query 1 time
1006 const addrinfo hints = {.ai_family = AF_INET6, .ai_socktype = SOCK_STREAM};
Ken Chenb9fa2062018-11-13 21:51:13 +08001007
1008 // dns0 will ignore the request, and we'll fallback to dns1 after the first
1009 // retry.
1010 ScopedAddrinfo result = safe_getaddrinfo(host_name1, nullptr, &hints);
1011 EXPECT_TRUE(result != nullptr);
1012 EXPECT_EQ(1U, GetNumQueries(dns0, host_name1));
1013 EXPECT_EQ(1U, GetNumQueries(dns1, host_name1));
Mike Yu532405f2020-06-17 17:46:44 +08001014 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, 0, host_name1, {"2001:db8::6"});
Ken Chenb9fa2062018-11-13 21:51:13 +08001015
1016 // Now make dns1 also ignore 100% requests... The resolve should alternate
Luke Huang483cf332019-06-03 17:24:51 +08001017 // queries between the nameservers and fail
Ken Chenb9fa2062018-11-13 21:51:13 +08001018 dns1.setResponseProbability(0.0);
1019 addrinfo* result2 = nullptr;
1020 EXPECT_EQ(EAI_NODATA, getaddrinfo(host_name2, nullptr, &hints, &result2));
1021 EXPECT_EQ(nullptr, result2);
Luke Huang483cf332019-06-03 17:24:51 +08001022 EXPECT_EQ(1U, GetNumQueries(dns0, host_name2));
1023 EXPECT_EQ(1U, GetNumQueries(dns1, host_name2));
Mike Yu532405f2020-06-17 17:46:44 +08001024 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, RCODE_TIMEOUT, host_name2, {});
Ken Chenb9fa2062018-11-13 21:51:13 +08001025}
1026
1027TEST_F(ResolverTest, GetAddrInfoV6_concurrent) {
Xiao Ma09b71022018-12-11 17:56:32 +09001028 constexpr char listen_addr0[] = "127.0.0.9";
1029 constexpr char listen_addr1[] = "127.0.0.10";
1030 constexpr char listen_addr2[] = "127.0.0.11";
1031 constexpr char host_name[] = "konbanha.example.com.";
1032
1033 test::DNSResponder dns0(listen_addr0);
1034 test::DNSResponder dns1(listen_addr1);
1035 test::DNSResponder dns2(listen_addr2);
1036 StartDns(dns0, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
1037 StartDns(dns1, {{host_name, ns_type::ns_t_aaaa, "2001:db8::6"}});
1038 StartDns(dns2, {{host_name, ns_type::ns_t_aaaa, "2001:db8::7"}});
1039
Luke Huangf8215372019-11-22 11:53:41 +08001040 const std::vector<std::string> servers = {listen_addr0, listen_addr1, listen_addr2};
Ken Chenb9fa2062018-11-13 21:51:13 +08001041 std::vector<std::thread> threads(10);
1042 for (std::thread& thread : threads) {
Luke Huangf8215372019-11-22 11:53:41 +08001043 thread = std::thread([this, &servers]() {
1044 unsigned delay = arc4random_uniform(1 * 1000 * 1000); // <= 1s
Ken Chenb9fa2062018-11-13 21:51:13 +08001045 usleep(delay);
1046 std::vector<std::string> serverSubset;
1047 for (const auto& server : servers) {
1048 if (arc4random_uniform(2)) {
1049 serverSubset.push_back(server);
1050 }
1051 }
1052 if (serverSubset.empty()) serverSubset = servers;
Xiao Ma09b71022018-12-11 17:56:32 +09001053 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(serverSubset));
1054 const addrinfo hints = {.ai_family = AF_INET6};
Ken Chenb9fa2062018-11-13 21:51:13 +08001055 addrinfo* result = nullptr;
1056 int rv = getaddrinfo("konbanha", nullptr, &hints, &result);
1057 EXPECT_EQ(0, rv) << "error [" << rv << "] " << gai_strerror(rv);
1058 if (result) {
1059 freeaddrinfo(result);
1060 result = nullptr;
1061 }
1062 });
1063 }
1064 for (std::thread& thread : threads) {
1065 thread.join();
1066 }
Ken Chen92bed612018-12-22 21:46:55 +08001067
1068 std::vector<std::string> res_servers;
1069 std::vector<std::string> res_domains;
1070 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001071 res_params res_params;
Ken Chen92bed612018-12-22 21:46:55 +08001072 std::vector<ResolverStats> res_stats;
1073 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001074 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1075 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1076 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chen92bed612018-12-22 21:46:55 +08001077 EXPECT_EQ(0, wait_for_pending_req_timeout_count);
Ken Chenb9fa2062018-11-13 21:51:13 +08001078}
1079
Mike Yu8ac63402019-12-02 15:28:38 +08001080TEST_F(ResolverTest, SkipBadServersDueToInternalError) {
Mike Yu61d17262020-02-15 18:56:22 +08001081 const std::string kSortNameserversFlag("persist.device_config.netd_native.sort_nameservers");
Mike Yu8ac63402019-12-02 15:28:38 +08001082 constexpr char listen_addr1[] = "fe80::1";
1083 constexpr char listen_addr2[] = "255.255.255.255";
1084 constexpr char listen_addr3[] = "127.0.0.3";
Mike Yu61d17262020-02-15 18:56:22 +08001085 int counter = 0; // To generate unique hostnames.
Mike Yu8ac63402019-12-02 15:28:38 +08001086 test::DNSResponder dns(listen_addr3);
1087 ASSERT_TRUE(dns.startServer());
1088
Mike Yu61d17262020-02-15 18:56:22 +08001089 ResolverParamsParcel setupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1090 setupParams.servers = {listen_addr1, listen_addr2, listen_addr3};
1091 setupParams.minSamples = 2; // Recognize bad servers in two attempts when sorting not enabled.
Mike Yu8ac63402019-12-02 15:28:38 +08001092
Mike Yu61d17262020-02-15 18:56:22 +08001093 ResolverParamsParcel cleanupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1094 cleanupParams.servers.clear();
1095 cleanupParams.tlsServers.clear();
Mike Yu8ac63402019-12-02 15:28:38 +08001096
Mike Yu61d17262020-02-15 18:56:22 +08001097 for (const auto& sortNameserversFlag : {"" /* unset */, "0" /* off */, "1" /* on */}) {
1098 SCOPED_TRACE(fmt::format("sortNameversFlag_{}", sortNameserversFlag));
1099 ScopedSystemProperties scopedSystemProperties(kSortNameserversFlag, sortNameserversFlag);
1100
1101 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(setupParams));
1102
1103 // Start sending synchronized querying.
1104 for (int i = 0; i < 100; i++) {
1105 std::string hostName = StringPrintf("hello%d.com.", counter++);
1106 dns.addMapping(hostName, ns_type::ns_t_a, "1.2.3.4");
1107 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1108 EXPECT_TRUE(safe_getaddrinfo(hostName.c_str(), nullptr, &hints) != nullptr);
1109 }
1110
1111 const std::vector<NameserverStats> targetStats = {
1112 NameserverStats(listen_addr1).setInternalErrors(5),
1113 NameserverStats(listen_addr2).setInternalErrors(5),
1114 NameserverStats(listen_addr3).setSuccesses(setupParams.maxSamples),
1115 };
1116 EXPECT_TRUE(expectStatsNotGreaterThan(targetStats));
1117
1118 // Also verify the number of queries received in the server because res_stats.successes has
1119 // a maximum.
1120 EXPECT_EQ(dns.queries().size(), 100U);
1121
1122 // Reset the state.
1123 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(cleanupParams));
1124 dns.clearQueries();
Mike Yu8ac63402019-12-02 15:28:38 +08001125 }
Mike Yu8ac63402019-12-02 15:28:38 +08001126}
1127
1128TEST_F(ResolverTest, SkipBadServersDueToTimeout) {
Mike Yu61d17262020-02-15 18:56:22 +08001129 const std::string kSortNameserversFlag("persist.device_config.netd_native.sort_nameservers");
Mike Yu8ac63402019-12-02 15:28:38 +08001130 constexpr char listen_addr1[] = "127.0.0.3";
1131 constexpr char listen_addr2[] = "127.0.0.4";
Mike Yu61d17262020-02-15 18:56:22 +08001132 int counter = 0; // To generate unique hostnames.
1133
1134 ResolverParamsParcel setupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1135 setupParams.servers = {listen_addr1, listen_addr2};
1136 setupParams.minSamples = 2; // Recognize bad servers in two attempts when sorting not enabled.
1137
1138 ResolverParamsParcel cleanupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1139 cleanupParams.servers.clear();
1140 cleanupParams.tlsServers.clear();
Mike Yu8ac63402019-12-02 15:28:38 +08001141
1142 // Set dns1 non-responsive and dns2 workable.
1143 test::DNSResponder dns1(listen_addr1, test::kDefaultListenService, static_cast<ns_rcode>(-1));
1144 test::DNSResponder dns2(listen_addr2);
1145 dns1.setResponseProbability(0.0);
1146 ASSERT_TRUE(dns1.startServer());
1147 ASSERT_TRUE(dns2.startServer());
1148
Mike Yu61d17262020-02-15 18:56:22 +08001149 for (const auto& sortNameserversFlag : {"" /* unset */, "0" /* off */, "1" /* on */}) {
1150 SCOPED_TRACE(fmt::format("sortNameversFlag_{}", sortNameserversFlag));
1151 ScopedSystemProperties scopedSystemProperties(kSortNameserversFlag, sortNameserversFlag);
Mike Yu8ac63402019-12-02 15:28:38 +08001152
Mike Yu61d17262020-02-15 18:56:22 +08001153 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(setupParams));
Mike Yu8ac63402019-12-02 15:28:38 +08001154
Mike Yu61d17262020-02-15 18:56:22 +08001155 // Start sending synchronized querying.
1156 for (int i = 0; i < 100; i++) {
1157 std::string hostName = StringPrintf("hello%d.com.", counter++);
1158 dns1.addMapping(hostName, ns_type::ns_t_a, "1.2.3.4");
1159 dns2.addMapping(hostName, ns_type::ns_t_a, "1.2.3.5");
1160 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1161 EXPECT_TRUE(safe_getaddrinfo(hostName.c_str(), nullptr, &hints) != nullptr);
1162 }
1163
1164 const std::vector<NameserverStats> targetStats = {
1165 NameserverStats(listen_addr1).setTimeouts(5),
1166 NameserverStats(listen_addr2).setSuccesses(setupParams.maxSamples),
1167 };
1168 EXPECT_TRUE(expectStatsNotGreaterThan(targetStats));
1169
1170 // Also verify the number of queries received in the server because res_stats.successes has
1171 // an upper bound.
1172 EXPECT_GT(dns1.queries().size(), 0U);
1173 EXPECT_LT(dns1.queries().size(), 5U);
1174 EXPECT_EQ(dns2.queries().size(), 100U);
1175
1176 // Reset the state.
1177 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(cleanupParams));
1178 dns1.clearQueries();
1179 dns2.clearQueries();
Mike Yu8ac63402019-12-02 15:28:38 +08001180 }
Mike Yu8ac63402019-12-02 15:28:38 +08001181}
1182
chenbrucefd837fa2019-10-29 18:35:36 +08001183TEST_F(ResolverTest, GetAddrInfoFromCustTable_InvalidInput) {
1184 constexpr char hostnameNoip[] = "noip.example.com.";
1185 constexpr char hostnameInvalidip[] = "invalidip.example.com.";
1186 const std::vector<aidl::android::net::ResolverHostsParcel> invalidCustHosts = {
1187 {"", hostnameNoip},
1188 {"wrong IP", hostnameInvalidip},
1189 };
1190 test::DNSResponder dns;
1191 StartDns(dns, {});
1192 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
Ken Chena6ac2a62020-04-07 17:25:56 +08001193 resolverParams.resolverOptions.hosts = invalidCustHosts;
chenbrucefd837fa2019-10-29 18:35:36 +08001194 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1195 for (const auto& hostname : {hostnameNoip, hostnameInvalidip}) {
1196 // The query won't get data from customized table because of invalid customized table
1197 // and DNSResponder also has no records. hostnameNoip has never registered and
1198 // hostnameInvalidip has registered but wrong IP.
1199 const addrinfo hints = {.ai_family = AF_UNSPEC};
1200 ScopedAddrinfo result = safe_getaddrinfo(hostname, nullptr, &hints);
1201 ASSERT_TRUE(result == nullptr);
1202 EXPECT_EQ(4U, GetNumQueries(dns, hostname));
1203 }
1204}
1205
1206TEST_F(ResolverTest, GetAddrInfoFromCustTable) {
1207 constexpr char hostnameV4[] = "v4only.example.com.";
1208 constexpr char hostnameV6[] = "v6only.example.com.";
1209 constexpr char hostnameV4V6[] = "v4v6.example.com.";
1210 constexpr char custAddrV4[] = "1.2.3.4";
1211 constexpr char custAddrV6[] = "::1.2.3.4";
1212 constexpr char dnsSvAddrV4[] = "1.2.3.5";
1213 constexpr char dnsSvAddrV6[] = "::1.2.3.5";
1214 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4 = {
1215 {custAddrV4, hostnameV4},
1216 };
1217 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV6 = {
1218 {custAddrV6, hostnameV6},
1219 };
1220 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4V6 = {
1221 {custAddrV4, hostnameV4V6},
1222 {custAddrV6, hostnameV4V6},
1223 };
1224 const std::vector<DnsRecord> dnsSvHostV4 = {
1225 {hostnameV4, ns_type::ns_t_a, dnsSvAddrV4},
1226 };
1227 const std::vector<DnsRecord> dnsSvHostV6 = {
1228 {hostnameV6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1229 };
1230 const std::vector<DnsRecord> dnsSvHostV4V6 = {
1231 {hostnameV4V6, ns_type::ns_t_a, dnsSvAddrV4},
1232 {hostnameV4V6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1233 };
1234 struct TestConfig {
1235 const std::string name;
1236 const std::vector<aidl::android::net::ResolverHostsParcel> customizedHosts;
1237 const std::vector<DnsRecord> dnsserverHosts;
1238 const std::vector<std::string> queryResult;
1239 std::string asParameters() const {
1240 return StringPrintf("name: %s, customizedHosts: %s, dnsserverHosts: %s", name.c_str(),
1241 customizedHosts.empty() ? "No" : "Yes",
1242 dnsserverHosts.empty() ? "No" : "Yes");
1243 }
1244 } testConfigs[]{
1245 // clang-format off
1246 {hostnameV4, {}, {}, {}},
1247 {hostnameV4, {}, dnsSvHostV4, {dnsSvAddrV4}},
1248 {hostnameV4, custHostV4, {}, {custAddrV4}},
1249 {hostnameV4, custHostV4, dnsSvHostV4, {custAddrV4}},
1250 {hostnameV6, {}, {}, {}},
1251 {hostnameV6, {}, dnsSvHostV6, {dnsSvAddrV6}},
1252 {hostnameV6, custHostV6, {}, {custAddrV6}},
1253 {hostnameV6, custHostV6, dnsSvHostV6, {custAddrV6}},
1254 {hostnameV4V6, {}, {}, {}},
1255 {hostnameV4V6, {}, dnsSvHostV4V6, {dnsSvAddrV4, dnsSvAddrV6}},
1256 {hostnameV4V6, custHostV4V6, {}, {custAddrV4, custAddrV6}},
1257 {hostnameV4V6, custHostV4V6, dnsSvHostV4V6, {custAddrV4, custAddrV6}},
1258 // clang-format on
1259 };
1260
1261 for (const auto& config : testConfigs) {
1262 SCOPED_TRACE(config.asParameters());
1263
1264 test::DNSResponder dns;
1265 StartDns(dns, config.dnsserverHosts);
1266
1267 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
Ken Chena6ac2a62020-04-07 17:25:56 +08001268 resolverParams.resolverOptions.hosts = config.customizedHosts;
chenbrucefd837fa2019-10-29 18:35:36 +08001269 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1270 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM};
1271 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
1272 if (config.customizedHosts.empty() && config.dnsserverHosts.empty()) {
1273 ASSERT_TRUE(result == nullptr);
1274 EXPECT_EQ(2U, GetNumQueries(dns, config.name.c_str()));
1275 } else {
1276 ASSERT_TRUE(result != nullptr);
1277 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(config.queryResult));
1278 EXPECT_EQ(config.customizedHosts.empty() ? 2U : 0U,
1279 GetNumQueries(dns, config.name.c_str()));
1280 }
1281
1282 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
1283 }
1284}
1285
1286TEST_F(ResolverTest, GetAddrInfoFromCustTable_Modify) {
1287 constexpr char hostnameV4V6[] = "v4v6.example.com.";
1288 constexpr char custAddrV4[] = "1.2.3.4";
1289 constexpr char custAddrV6[] = "::1.2.3.4";
1290 constexpr char dnsSvAddrV4[] = "1.2.3.5";
1291 constexpr char dnsSvAddrV6[] = "::1.2.3.5";
1292 const std::vector<DnsRecord> dnsSvHostV4V6 = {
1293 {hostnameV4V6, ns_type::ns_t_a, dnsSvAddrV4},
1294 {hostnameV4V6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1295 };
1296 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4V6 = {
1297 {custAddrV4, hostnameV4V6},
1298 {custAddrV6, hostnameV4V6},
1299 };
1300 test::DNSResponder dns;
1301 StartDns(dns, dnsSvHostV4V6);
1302 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1303
Ken Chena6ac2a62020-04-07 17:25:56 +08001304 resolverParams.resolverOptions.hosts = custHostV4V6;
chenbrucefd837fa2019-10-29 18:35:36 +08001305 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1306 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM};
1307 ScopedAddrinfo result = safe_getaddrinfo(hostnameV4V6, nullptr, &hints);
1308 ASSERT_TRUE(result != nullptr);
1309 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray({custAddrV4, custAddrV6}));
1310 EXPECT_EQ(0U, GetNumQueries(dns, hostnameV4V6));
1311
Ken Chena6ac2a62020-04-07 17:25:56 +08001312 resolverParams.resolverOptions.hosts = {};
chenbrucefd837fa2019-10-29 18:35:36 +08001313 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1314 result = safe_getaddrinfo(hostnameV4V6, nullptr, &hints);
1315 ASSERT_TRUE(result != nullptr);
1316 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray({dnsSvAddrV4, dnsSvAddrV6}));
1317 EXPECT_EQ(2U, GetNumQueries(dns, hostnameV4V6));
1318}
1319
Ken Chenb9fa2062018-11-13 21:51:13 +08001320TEST_F(ResolverTest, EmptySetup) {
Ken Chenb9fa2062018-11-13 21:51:13 +08001321 std::vector<std::string> servers;
1322 std::vector<std::string> domains;
Xiao Ma09b71022018-12-11 17:56:32 +09001323 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001324 std::vector<std::string> res_servers;
1325 std::vector<std::string> res_domains;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001326 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001327 res_params res_params;
Ken Chenb9fa2062018-11-13 21:51:13 +08001328 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +08001329 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001330 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1331 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1332 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chenb9fa2062018-11-13 21:51:13 +08001333 EXPECT_EQ(0U, res_servers.size());
1334 EXPECT_EQ(0U, res_domains.size());
Mike Yu0a1c53d2018-11-26 13:26:21 +09001335 EXPECT_EQ(0U, res_tls_servers.size());
Luke Huang5bd827c2019-03-14 16:10:04 +08001336 ASSERT_EQ(static_cast<size_t>(IDnsResolver::RESOLVER_PARAMS_COUNT), kDefaultParams.size());
1337 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY],
1338 res_params.sample_validity);
1339 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001340 res_params.success_threshold);
Luke Huang5bd827c2019-03-14 16:10:04 +08001341 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
1342 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
1343 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
Ken Chenb9fa2062018-11-13 21:51:13 +08001344 res_params.base_timeout_msec);
Luke Huang5bd827c2019-03-14 16:10:04 +08001345 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_RETRY_COUNT], res_params.retry_count);
Ken Chenb9fa2062018-11-13 21:51:13 +08001346}
1347
1348TEST_F(ResolverTest, SearchPathChange) {
Xiao Ma09b71022018-12-11 17:56:32 +09001349 constexpr char listen_addr[] = "127.0.0.13";
1350 constexpr char host_name1[] = "test13.domain1.org.";
1351 constexpr char host_name2[] = "test13.domain2.org.";
Luke Huangf8215372019-11-22 11:53:41 +08001352 std::vector<std::string> servers = {listen_addr};
1353 std::vector<std::string> domains = {"domain1.org"};
Xiao Ma09b71022018-12-11 17:56:32 +09001354
1355 const std::vector<DnsRecord> records = {
1356 {host_name1, ns_type::ns_t_aaaa, "2001:db8::13"},
1357 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1:13"},
1358 };
1359 test::DNSResponder dns(listen_addr);
1360 StartDns(dns, records);
1361 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001362
1363 const addrinfo hints = {.ai_family = AF_INET6};
1364 ScopedAddrinfo result = safe_getaddrinfo("test13", nullptr, &hints);
1365 EXPECT_TRUE(result != nullptr);
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 // Test that changing the domain search path on its own works.
Luke Huangf8215372019-11-22 11:53:41 +08001371 domains = {"domain2.org"};
Xiao Ma09b71022018-12-11 17:56:32 +09001372 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001373 dns.clearQueries();
1374
1375 result = safe_getaddrinfo("test13", nullptr, &hints);
1376 EXPECT_TRUE(result != nullptr);
1377 EXPECT_EQ(1U, dns.queries().size());
1378 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
1379 EXPECT_EQ("2001:db8::1:13", ToString(result));
1380}
1381
Luke Huang2dac4382019-06-24 13:28:44 +08001382namespace {
1383
Luke Huangf8215372019-11-22 11:53:41 +08001384std::vector<std::string> getResolverDomains(aidl::android::net::IDnsResolver* dnsResolverService,
Luke Huang2dac4382019-06-24 13:28:44 +08001385 unsigned netId) {
1386 std::vector<std::string> res_servers;
1387 std::vector<std::string> res_domains;
1388 std::vector<std::string> res_tls_servers;
1389 res_params res_params;
1390 std::vector<ResolverStats> res_stats;
1391 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001392 DnsResponderClient::GetResolverInfo(dnsResolverService, netId, &res_servers, &res_domains,
1393 &res_tls_servers, &res_params, &res_stats,
1394 &wait_for_pending_req_timeout_count);
Luke Huang2dac4382019-06-24 13:28:44 +08001395 return res_domains;
1396}
1397
1398} // namespace
1399
1400TEST_F(ResolverTest, SearchPathPrune) {
1401 constexpr size_t DUPLICATED_DOMAIN_NUM = 3;
1402 constexpr char listen_addr[] = "127.0.0.13";
1403 constexpr char domian_name1[] = "domain13.org.";
1404 constexpr char domian_name2[] = "domain14.org.";
1405 constexpr char host_name1[] = "test13.domain13.org.";
1406 constexpr char host_name2[] = "test14.domain14.org.";
1407 std::vector<std::string> servers = {listen_addr};
1408
1409 std::vector<std::string> testDomains1;
1410 std::vector<std::string> testDomains2;
1411 // Domain length should be <= 255
1412 // Max number of domains in search path is 6
1413 for (size_t i = 0; i < MAXDNSRCH + 1; i++) {
1414 // Fill up with invalid domain
1415 testDomains1.push_back(std::string(300, i + '0'));
1416 // Fill up with valid but duplicated domain
1417 testDomains2.push_back(StringPrintf("domain%zu.org", i % DUPLICATED_DOMAIN_NUM));
1418 }
1419
1420 // Add valid domain used for query.
1421 testDomains1.push_back(domian_name1);
1422
1423 // Add valid domain twice used for query.
1424 testDomains2.push_back(domian_name2);
1425 testDomains2.push_back(domian_name2);
1426
1427 const std::vector<DnsRecord> records = {
1428 {host_name1, ns_type::ns_t_aaaa, "2001:db8::13"},
1429 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1:13"},
1430 };
1431 test::DNSResponder dns(listen_addr);
1432 StartDns(dns, records);
1433 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, testDomains1));
1434
1435 const addrinfo hints = {.ai_family = AF_INET6};
1436 ScopedAddrinfo result = safe_getaddrinfo("test13", nullptr, &hints);
1437
1438 EXPECT_TRUE(result != nullptr);
1439
1440 EXPECT_EQ(1U, dns.queries().size());
1441 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
1442 EXPECT_EQ("2001:db8::13", ToString(result));
1443
1444 const auto& res_domains1 = getResolverDomains(mDnsClient.resolvService(), TEST_NETID);
1445 // Expect 1 valid domain, invalid domains are removed.
1446 ASSERT_EQ(1U, res_domains1.size());
1447 EXPECT_EQ(domian_name1, res_domains1[0]);
1448
1449 dns.clearQueries();
1450
1451 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, testDomains2));
1452
1453 result = safe_getaddrinfo("test14", nullptr, &hints);
1454 EXPECT_TRUE(result != nullptr);
1455
1456 // (3 domains * 2 retries) + 1 success query = 7
1457 EXPECT_EQ(7U, dns.queries().size());
1458 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
1459 EXPECT_EQ("2001:db8::1:13", ToString(result));
1460
1461 const auto& res_domains2 = getResolverDomains(mDnsClient.resolvService(), TEST_NETID);
1462 // Expect 4 valid domain, duplicate domains are removed.
1463 EXPECT_EQ(DUPLICATED_DOMAIN_NUM + 1U, res_domains2.size());
1464 EXPECT_THAT(
1465 std::vector<std::string>({"domain0.org", "domain1.org", "domain2.org", domian_name2}),
1466 testing::ElementsAreArray(res_domains2));
1467}
1468
Mike Yu0a1c53d2018-11-26 13:26:21 +09001469// If we move this function to dns_responder_client, it will complicate the dependency need of
1470// dns_tls_frontend.h.
1471static void setupTlsServers(const std::vector<std::string>& servers,
waynema0e73c2e2019-07-31 15:04:08 +08001472 std::vector<std::unique_ptr<test::DnsTlsFrontend>>* tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001473 constexpr char listen_udp[] = "53";
1474 constexpr char listen_tls[] = "853";
Mike Yu0a1c53d2018-11-26 13:26:21 +09001475
1476 for (const auto& server : servers) {
1477 auto t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
1478 t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
1479 t->startServer();
Mike Yu0a1c53d2018-11-26 13:26:21 +09001480 tls->push_back(std::move(t));
1481 }
1482}
1483
Mike Yu0a1c53d2018-11-26 13:26:21 +09001484TEST_F(ResolverTest, MaxServerPrune_Binder) {
Mike Yu0a1c53d2018-11-26 13:26:21 +09001485 std::vector<std::string> domains;
1486 std::vector<std::unique_ptr<test::DNSResponder>> dns;
1487 std::vector<std::unique_ptr<test::DnsTlsFrontend>> tls;
1488 std::vector<std::string> servers;
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001489 std::vector<DnsResponderClient::Mapping> mappings;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001490
1491 for (unsigned i = 0; i < MAXDNSRCH + 1; i++) {
1492 domains.push_back(StringPrintf("example%u.com", i));
1493 }
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001494 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupMappings(1, domains, &mappings));
1495 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupDNSServers(MAXNS + 1, mappings, &dns, &servers));
waynema0e73c2e2019-07-31 15:04:08 +08001496 ASSERT_NO_FATAL_FAILURE(setupTlsServers(servers, &tls));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001497
waynema0e73c2e2019-07-31 15:04:08 +08001498 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, domains, kDefaultParams,
1499 kDefaultPrivateDnsHostName));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001500
Mike Yu383855b2019-01-15 17:53:27 +08001501 // If the private DNS validation hasn't completed yet before backend DNS servers stop,
1502 // TLS servers will get stuck in handleOneRequest(), which causes this test stuck in
1503 // ~DnsTlsFrontend() because the TLS server loop threads can't be terminated.
1504 // So, wait for private DNS validation done before stopping backend DNS servers.
1505 for (int i = 0; i < MAXNS; i++) {
chenbruceaff85842019-05-31 15:46:42 +08001506 LOG(INFO) << "Waiting for private DNS validation on " << tls[i]->listen_address() << ".";
Mike Yu724f77d2019-08-16 11:14:50 +08001507 EXPECT_TRUE(WaitForPrivateDnsValidation(tls[i]->listen_address(), true));
chenbruceaff85842019-05-31 15:46:42 +08001508 LOG(INFO) << "private DNS validation on " << tls[i]->listen_address() << " done.";
Mike Yu383855b2019-01-15 17:53:27 +08001509 }
1510
Mike Yu0a1c53d2018-11-26 13:26:21 +09001511 std::vector<std::string> res_servers;
1512 std::vector<std::string> res_domains;
1513 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001514 res_params res_params;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001515 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +08001516 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001517 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1518 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1519 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001520
1521 // Check the size of the stats and its contents.
1522 EXPECT_EQ(static_cast<size_t>(MAXNS), res_servers.size());
1523 EXPECT_EQ(static_cast<size_t>(MAXNS), res_tls_servers.size());
1524 EXPECT_EQ(static_cast<size_t>(MAXDNSRCH), res_domains.size());
1525 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_servers.begin()));
1526 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_tls_servers.begin()));
1527 EXPECT_TRUE(std::equal(domains.begin(), domains.begin() + MAXDNSRCH, res_domains.begin()));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001528}
1529
1530TEST_F(ResolverTest, ResolverStats) {
Xiao Ma09b71022018-12-11 17:56:32 +09001531 constexpr char listen_addr1[] = "127.0.0.4";
1532 constexpr char listen_addr2[] = "127.0.0.5";
1533 constexpr char listen_addr3[] = "127.0.0.6";
Mike Yu0a1c53d2018-11-26 13:26:21 +09001534
1535 // Set server 1 timeout.
Mike Yufc125e42019-05-15 20:41:28 +08001536 test::DNSResponder dns1(listen_addr1, "53", static_cast<ns_rcode>(-1));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001537 dns1.setResponseProbability(0.0);
1538 ASSERT_TRUE(dns1.startServer());
1539
1540 // Set server 2 responding server failure.
Xiao Ma09b71022018-12-11 17:56:32 +09001541 test::DNSResponder dns2(listen_addr2);
Mike Yu0a1c53d2018-11-26 13:26:21 +09001542 dns2.setResponseProbability(0.0);
1543 ASSERT_TRUE(dns2.startServer());
1544
1545 // Set server 3 workable.
Xiao Ma09b71022018-12-11 17:56:32 +09001546 test::DNSResponder dns3(listen_addr3);
1547 dns3.addMapping(kHelloExampleCom, ns_type::ns_t_a, "1.2.3.4");
Mike Yu0a1c53d2018-11-26 13:26:21 +09001548 ASSERT_TRUE(dns3.startServer());
1549
1550 std::vector<std::string> servers = {listen_addr1, listen_addr2, listen_addr3};
Xiao Ma09b71022018-12-11 17:56:32 +09001551 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001552
1553 dns3.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +09001554 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
Mike Yu0a1c53d2018-11-26 13:26:21 +09001555 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
Xiao Ma09b71022018-12-11 17:56:32 +09001556 size_t found = GetNumQueries(dns3, kHelloExampleCom);
Mike Yu0a1c53d2018-11-26 13:26:21 +09001557 EXPECT_LE(1U, found);
1558 std::string result_str = ToString(result);
1559 EXPECT_TRUE(result_str == "1.2.3.4") << ", result_str='" << result_str << "'";
1560
Mike Yue2162e52020-03-04 18:43:46 +08001561 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1562 NameserverStats(listen_addr1).setTimeouts(1),
1563 NameserverStats(listen_addr2).setErrors(1),
1564 NameserverStats(listen_addr3).setSuccesses(1),
1565 };
Mike Yu61d17262020-02-15 18:56:22 +08001566 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001567}
1568
Mike Yu15791832020-02-11 13:38:48 +08001569TEST_F(ResolverTest, AlwaysUseLatestSetupParamsInLookups) {
1570 constexpr char listen_addr1[] = "127.0.0.3";
1571 constexpr char listen_addr2[] = "255.255.255.255";
1572 constexpr char listen_addr3[] = "127.0.0.4";
1573 constexpr char hostname[] = "hello";
1574 constexpr char fqdn_with_search_domain[] = "hello.domain2.com.";
1575
1576 test::DNSResponder dns1(listen_addr1, test::kDefaultListenService, static_cast<ns_rcode>(-1));
1577 dns1.setResponseProbability(0.0);
1578 ASSERT_TRUE(dns1.startServer());
1579
1580 test::DNSResponder dns3(listen_addr3);
1581 StartDns(dns3, {{fqdn_with_search_domain, ns_type::ns_t_a, "1.2.3.4"}});
1582
1583 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
1584 parcel.tlsServers.clear();
1585 parcel.servers = {listen_addr1, listen_addr2};
1586 parcel.domains = {"domain1.com", "domain2.com"};
1587 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1588
1589 // Expect the things happening in t1:
1590 // 1. The lookup starts using the first domain for query. It sends queries to the populated
1591 // nameserver list {listen_addr1, listen_addr2} for the hostname "hello.domain1.com".
1592 // 2. A different list of nameservers is updated to the resolver. Revision ID is incremented.
1593 // 3. The query for the hostname times out. The lookup fails to add the timeout record to the
1594 // the stats because of the unmatched revision ID.
1595 // 4. The lookup starts using the second domain for query. It sends queries to the populated
1596 // nameserver list {listen_addr3, listen_addr1, listen_addr2} for another hostname
1597 // "hello.domain2.com".
1598 // 5. The lookup gets the answer and updates a success record to the stats.
1599 std::thread t1([&hostname]() {
1600 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1601 ScopedAddrinfo result = safe_getaddrinfo(hostname, nullptr, &hints);
1602 EXPECT_NE(result.get(), nullptr);
1603 EXPECT_EQ(ToString(result), "1.2.3.4");
1604 });
1605
1606 // Wait for t1 to start the step 1.
1607 while (dns1.queries().size() == 0) {
1608 usleep(1000);
1609 }
1610
1611 // Update the resolver with three nameservers. This will increment the revision ID.
1612 parcel.servers = {listen_addr3, listen_addr1, listen_addr2};
1613 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1614
1615 t1.join();
1616 EXPECT_EQ(0U, GetNumQueriesForType(dns3, ns_type::ns_t_aaaa, fqdn_with_search_domain));
1617 EXPECT_EQ(1U, GetNumQueriesForType(dns3, ns_type::ns_t_a, fqdn_with_search_domain));
1618
Mike Yue2162e52020-03-04 18:43:46 +08001619 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1620 NameserverStats(listen_addr1),
1621 NameserverStats(listen_addr2),
1622 NameserverStats(listen_addr3).setSuccesses(1),
1623 };
Mike Yu61d17262020-02-15 18:56:22 +08001624 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu15791832020-02-11 13:38:48 +08001625}
1626
Ken Chenb9fa2062018-11-13 21:51:13 +08001627// Test what happens if the specified TLS server is nonexistent.
1628TEST_F(ResolverTest, GetHostByName_TlsMissing) {
Xiao Ma09b71022018-12-11 17:56:32 +09001629 constexpr char listen_addr[] = "127.0.0.3";
1630 constexpr char host_name[] = "tlsmissing.example.com.";
1631
1632 test::DNSResponder dns;
1633 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.3"}});
Luke Huangf8215372019-11-22 11:53:41 +08001634 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001635
1636 // There's nothing listening on this address, so validation will either fail or
1637 /// hang. Either way, queries will continue to flow to the DNSResponder.
waynema0e73c2e2019-07-31 15:04:08 +08001638 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Ken Chenb9fa2062018-11-13 21:51:13 +08001639
1640 const hostent* result;
1641
1642 result = gethostbyname("tlsmissing");
1643 ASSERT_FALSE(result == nullptr);
1644 EXPECT_EQ("1.2.3.3", ToString(result));
1645
1646 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001647 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001648}
1649
1650// Test what happens if the specified TLS server replies with garbage.
1651TEST_F(ResolverTest, GetHostByName_TlsBroken) {
Xiao Ma09b71022018-12-11 17:56:32 +09001652 constexpr char listen_addr[] = "127.0.0.3";
1653 constexpr char host_name1[] = "tlsbroken1.example.com.";
1654 constexpr char host_name2[] = "tlsbroken2.example.com.";
1655 const std::vector<DnsRecord> records = {
1656 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1657 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1658 };
1659
1660 test::DNSResponder dns;
1661 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001662 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001663
1664 // Bind the specified private DNS socket but don't respond to any client sockets yet.
1665 int s = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, IPPROTO_TCP);
1666 ASSERT_TRUE(s >= 0);
1667 struct sockaddr_in tlsServer = {
Luke Huangf8215372019-11-22 11:53:41 +08001668 .sin_family = AF_INET,
1669 .sin_port = htons(853),
Ken Chenb9fa2062018-11-13 21:51:13 +08001670 };
1671 ASSERT_TRUE(inet_pton(AF_INET, listen_addr, &tlsServer.sin_addr));
1672 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEPORT).ok());
1673 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEADDR).ok());
1674 ASSERT_FALSE(bind(s, reinterpret_cast<struct sockaddr*>(&tlsServer), sizeof(tlsServer)));
1675 ASSERT_FALSE(listen(s, 1));
1676
1677 // Trigger TLS validation.
waynema0e73c2e2019-07-31 15:04:08 +08001678 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Ken Chenb9fa2062018-11-13 21:51:13 +08001679
1680 struct sockaddr_storage cliaddr;
1681 socklen_t sin_size = sizeof(cliaddr);
Luke Huangf8215372019-11-22 11:53:41 +08001682 int new_fd = accept4(s, reinterpret_cast<struct sockaddr*>(&cliaddr), &sin_size, SOCK_CLOEXEC);
Ken Chenb9fa2062018-11-13 21:51:13 +08001683 ASSERT_TRUE(new_fd > 0);
1684
1685 // We've received the new file descriptor but not written to it or closed, so the
1686 // validation is still pending. Queries should still flow correctly because the
1687 // server is not used until validation succeeds.
1688 const hostent* result;
1689 result = gethostbyname("tlsbroken1");
1690 ASSERT_FALSE(result == nullptr);
1691 EXPECT_EQ("1.2.3.1", ToString(result));
1692
1693 // Now we cause the validation to fail.
1694 std::string garbage = "definitely not a valid TLS ServerHello";
1695 write(new_fd, garbage.data(), garbage.size());
1696 close(new_fd);
1697
1698 // Validation failure shouldn't interfere with lookups, because lookups won't be sent
1699 // to the TLS server unless validation succeeds.
1700 result = gethostbyname("tlsbroken2");
1701 ASSERT_FALSE(result == nullptr);
1702 EXPECT_EQ("1.2.3.2", ToString(result));
1703
1704 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001705 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001706 close(s);
1707}
1708
1709TEST_F(ResolverTest, GetHostByName_Tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001710 constexpr char listen_addr[] = "127.0.0.3";
1711 constexpr char listen_udp[] = "53";
1712 constexpr char listen_tls[] = "853";
1713 constexpr char host_name1[] = "tls1.example.com.";
1714 constexpr char host_name2[] = "tls2.example.com.";
1715 constexpr char host_name3[] = "tls3.example.com.";
1716 const std::vector<DnsRecord> records = {
1717 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1718 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1719 {host_name3, ns_type::ns_t_a, "1.2.3.3"},
1720 };
1721
1722 test::DNSResponder dns;
1723 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001724 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001725
1726 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1727 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001728 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08001729 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001730
Mike Yu724f77d2019-08-16 11:14:50 +08001731 const hostent* result = gethostbyname("tls1");
Ken Chenb9fa2062018-11-13 21:51:13 +08001732 ASSERT_FALSE(result == nullptr);
1733 EXPECT_EQ("1.2.3.1", ToString(result));
1734
1735 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001736 EXPECT_TRUE(tls.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001737
1738 // Stop the TLS server. Since we're in opportunistic mode, queries will
1739 // fall back to the locally-assigned (clear text) nameservers.
1740 tls.stopServer();
1741
1742 dns.clearQueries();
1743 result = gethostbyname("tls2");
1744 EXPECT_FALSE(result == nullptr);
1745 EXPECT_EQ("1.2.3.2", ToString(result));
1746 const auto queries = dns.queries();
1747 EXPECT_EQ(1U, queries.size());
waynema29253052019-08-20 11:26:08 +08001748 EXPECT_EQ("tls2.example.com.", queries[0].name);
1749 EXPECT_EQ(ns_t_a, queries[0].type);
Ken Chenb9fa2062018-11-13 21:51:13 +08001750
1751 // Reset the resolvers without enabling TLS. Queries should still be routed
1752 // to the UDP endpoint.
Xiao Ma09b71022018-12-11 17:56:32 +09001753 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001754
1755 result = gethostbyname("tls3");
1756 ASSERT_FALSE(result == nullptr);
1757 EXPECT_EQ("1.2.3.3", ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +08001758}
1759
Ken Chenb9fa2062018-11-13 21:51:13 +08001760TEST_F(ResolverTest, GetHostByName_TlsFailover) {
Xiao Ma09b71022018-12-11 17:56:32 +09001761 constexpr char listen_addr1[] = "127.0.0.3";
1762 constexpr char listen_addr2[] = "127.0.0.4";
1763 constexpr char listen_udp[] = "53";
1764 constexpr char listen_tls[] = "853";
1765 constexpr char host_name1[] = "tlsfailover1.example.com.";
1766 constexpr char host_name2[] = "tlsfailover2.example.com.";
1767 const std::vector<DnsRecord> records1 = {
1768 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1769 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1770 };
1771 const std::vector<DnsRecord> records2 = {
1772 {host_name1, ns_type::ns_t_a, "1.2.3.3"},
1773 {host_name2, ns_type::ns_t_a, "1.2.3.4"},
1774 };
1775
1776 test::DNSResponder dns1(listen_addr1);
1777 test::DNSResponder dns2(listen_addr2);
1778 StartDns(dns1, records1);
1779 StartDns(dns2, records2);
1780
Luke Huangf8215372019-11-22 11:53:41 +08001781 std::vector<std::string> servers = {listen_addr1, listen_addr2};
Ken Chenb9fa2062018-11-13 21:51:13 +08001782
1783 test::DnsTlsFrontend tls1(listen_addr1, listen_tls, listen_addr1, listen_udp);
1784 test::DnsTlsFrontend tls2(listen_addr2, listen_tls, listen_addr2, listen_udp);
1785 ASSERT_TRUE(tls1.startServer());
1786 ASSERT_TRUE(tls2.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001787 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1788 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08001789 EXPECT_TRUE(WaitForPrivateDnsValidation(tls1.listen_address(), true));
1790 EXPECT_TRUE(WaitForPrivateDnsValidation(tls2.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001791
Mike Yu724f77d2019-08-16 11:14:50 +08001792 const hostent* result = gethostbyname("tlsfailover1");
Ken Chenb9fa2062018-11-13 21:51:13 +08001793 ASSERT_FALSE(result == nullptr);
1794 EXPECT_EQ("1.2.3.1", ToString(result));
1795
1796 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001797 EXPECT_TRUE(tls1.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001798 // No new queries should have reached tls2.
Luke Huang0a0870d2020-02-12 20:41:10 +08001799 EXPECT_TRUE(tls2.waitForQueries(1));
Ken Chenb9fa2062018-11-13 21:51:13 +08001800
1801 // Stop tls1. Subsequent queries should attempt to reach tls1, fail, and retry to tls2.
1802 tls1.stopServer();
1803
1804 result = gethostbyname("tlsfailover2");
1805 EXPECT_EQ("1.2.3.4", ToString(result));
1806
1807 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001808 EXPECT_TRUE(tls2.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001809
1810 // No additional queries should have reached the insecure servers.
1811 EXPECT_EQ(2U, dns1.queries().size());
1812 EXPECT_EQ(2U, dns2.queries().size());
1813
1814 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001815 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Ken Chenb9fa2062018-11-13 21:51:13 +08001816}
1817
1818TEST_F(ResolverTest, GetHostByName_BadTlsName) {
Xiao Ma09b71022018-12-11 17:56:32 +09001819 constexpr char listen_addr[] = "127.0.0.3";
1820 constexpr char listen_udp[] = "53";
1821 constexpr char listen_tls[] = "853";
1822 constexpr char host_name[] = "badtlsname.example.com.";
1823
1824 test::DNSResponder dns;
1825 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.1"}});
Luke Huangf8215372019-11-22 11:53:41 +08001826 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001827
1828 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1829 ASSERT_TRUE(tls.startServer());
Xiao Ma09b71022018-12-11 17:56:32 +09001830 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
waynema0e73c2e2019-07-31 15:04:08 +08001831 kDefaultIncorrectPrivateDnsHostName));
Ken Chenb9fa2062018-11-13 21:51:13 +08001832
waynema0e73c2e2019-07-31 15:04:08 +08001833 // The TLS handshake would fail because the name of TLS server doesn't
1834 // match with TLS server's certificate.
Mike Yu724f77d2019-08-16 11:14:50 +08001835 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), false));
Ken Chenb9fa2062018-11-13 21:51:13 +08001836
1837 // The query should fail hard, because a name was specified.
1838 EXPECT_EQ(nullptr, gethostbyname("badtlsname"));
1839
1840 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001841 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001842}
1843
1844TEST_F(ResolverTest, GetAddrInfo_Tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001845 constexpr char listen_addr[] = "127.0.0.3";
1846 constexpr char listen_udp[] = "53";
1847 constexpr char listen_tls[] = "853";
1848 constexpr char host_name[] = "addrinfotls.example.com.";
1849 const std::vector<DnsRecord> records = {
1850 {host_name, ns_type::ns_t_a, "1.2.3.4"},
1851 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
1852 };
1853
1854 test::DNSResponder dns;
1855 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001856 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001857
1858 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1859 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001860 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1861 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08001862 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001863
1864 dns.clearQueries();
1865 ScopedAddrinfo result = safe_getaddrinfo("addrinfotls", nullptr, nullptr);
1866 EXPECT_TRUE(result != nullptr);
1867 size_t found = GetNumQueries(dns, host_name);
1868 EXPECT_LE(1U, found);
1869 // Could be A or AAAA
1870 std::string result_str = ToString(result);
1871 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +08001872 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08001873 // Wait for both A and AAAA queries to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001874 EXPECT_TRUE(tls.waitForQueries(3));
Ken Chenb9fa2062018-11-13 21:51:13 +08001875
1876 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001877 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001878}
1879
1880TEST_F(ResolverTest, TlsBypass) {
1881 const char OFF[] = "off";
1882 const char OPPORTUNISTIC[] = "opportunistic";
1883 const char STRICT[] = "strict";
1884
1885 const char GETHOSTBYNAME[] = "gethostbyname";
1886 const char GETADDRINFO[] = "getaddrinfo";
1887 const char GETADDRINFOFORNET[] = "getaddrinfofornet";
1888
1889 const unsigned BYPASS_NETID = NETID_USE_LOCAL_NAMESERVERS | TEST_NETID;
1890
Ken Chenb9fa2062018-11-13 21:51:13 +08001891 const char ADDR4[] = "192.0.2.1";
1892 const char ADDR6[] = "2001:db8::1";
1893
1894 const char cleartext_addr[] = "127.0.0.53";
1895 const char cleartext_port[] = "53";
1896 const char tls_port[] = "853";
Luke Huangf8215372019-11-22 11:53:41 +08001897 const std::vector<std::string> servers = {cleartext_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001898
Xiao Ma09b71022018-12-11 17:56:32 +09001899 test::DNSResponder dns(cleartext_addr);
Ken Chenb9fa2062018-11-13 21:51:13 +08001900 ASSERT_TRUE(dns.startServer());
1901
1902 test::DnsTlsFrontend tls(cleartext_addr, tls_port, cleartext_addr, cleartext_port);
Mike Yudd4ac2d2019-05-31 16:52:11 +08001903 ASSERT_TRUE(tls.startServer());
Ken Chenb9fa2062018-11-13 21:51:13 +08001904
Luke Huangf8215372019-11-22 11:53:41 +08001905 // clang-format off
Ken Chenb9fa2062018-11-13 21:51:13 +08001906 struct TestConfig {
1907 const std::string mode;
1908 const bool withWorkingTLS;
1909 const std::string method;
1910
1911 std::string asHostName() const {
Luke Huangf8215372019-11-22 11:53:41 +08001912 return StringPrintf("%s.%s.%s.", mode.c_str(), withWorkingTLS ? "tlsOn" : "tlsOff",
Ken Chenb9fa2062018-11-13 21:51:13 +08001913 method.c_str());
1914 }
1915 } testConfigs[]{
Ken Chenb9fa2062018-11-13 21:51:13 +08001916 {OFF, true, GETHOSTBYNAME},
1917 {OPPORTUNISTIC, true, GETHOSTBYNAME},
1918 {STRICT, true, GETHOSTBYNAME},
Ken Chenb9fa2062018-11-13 21:51:13 +08001919 {OFF, true, GETADDRINFO},
1920 {OPPORTUNISTIC, true, GETADDRINFO},
1921 {STRICT, true, GETADDRINFO},
Ken Chenb9fa2062018-11-13 21:51:13 +08001922 {OFF, true, GETADDRINFOFORNET},
1923 {OPPORTUNISTIC, true, GETADDRINFOFORNET},
1924 {STRICT, true, GETADDRINFOFORNET},
Mike Yudd4ac2d2019-05-31 16:52:11 +08001925 {OFF, false, GETHOSTBYNAME},
1926 {OPPORTUNISTIC, false, GETHOSTBYNAME},
1927 {STRICT, false, GETHOSTBYNAME},
1928 {OFF, false, GETADDRINFO},
1929 {OPPORTUNISTIC, false, GETADDRINFO},
1930 {STRICT, false, GETADDRINFO},
1931 {OFF, false, GETADDRINFOFORNET},
1932 {OPPORTUNISTIC, false, GETADDRINFOFORNET},
1933 {STRICT, false, GETADDRINFOFORNET},
Ken Chenb9fa2062018-11-13 21:51:13 +08001934 };
Luke Huangf8215372019-11-22 11:53:41 +08001935 // clang-format on
Ken Chenb9fa2062018-11-13 21:51:13 +08001936
1937 for (const auto& config : testConfigs) {
1938 const std::string testHostName = config.asHostName();
1939 SCOPED_TRACE(testHostName);
1940
1941 // Don't tempt test bugs due to caching.
1942 const char* host_name = testHostName.c_str();
1943 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
1944 dns.addMapping(host_name, ns_type::ns_t_aaaa, ADDR6);
1945
Mike Yudd4ac2d2019-05-31 16:52:11 +08001946 if (config.withWorkingTLS) {
1947 if (!tls.running()) {
1948 ASSERT_TRUE(tls.startServer());
1949 }
1950 } else {
1951 if (tls.running()) {
1952 ASSERT_TRUE(tls.stopServer());
1953 }
1954 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001955
1956 if (config.mode == OFF) {
Xiao Ma09b71022018-12-11 17:56:32 +09001957 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, kDefaultSearchDomains,
1958 kDefaultParams));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001959 } else /* OPPORTUNISTIC or STRICT */ {
1960 const char* tls_hostname = (config.mode == STRICT) ? kDefaultPrivateDnsHostName : "";
Xiao Ma09b71022018-12-11 17:56:32 +09001961 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001962 kDefaultParams, tls_hostname));
Mike Yu724f77d2019-08-16 11:14:50 +08001963
1964 // Wait for the validation event. If the server is running, the validation should
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001965 // succeed; otherwise, the validation should fail.
Mike Yu724f77d2019-08-16 11:14:50 +08001966 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), config.withWorkingTLS));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001967 if (config.withWorkingTLS) {
1968 EXPECT_TRUE(tls.waitForQueries(1));
1969 tls.clearQueries();
1970 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001971 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001972
1973 const hostent* h_result = nullptr;
1974 ScopedAddrinfo ai_result;
1975
1976 if (config.method == GETHOSTBYNAME) {
1977 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
1978 h_result = gethostbyname(host_name);
1979
1980 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
1981 ASSERT_FALSE(h_result == nullptr);
1982 ASSERT_EQ(4, h_result->h_length);
1983 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
1984 EXPECT_EQ(ADDR4, ToString(h_result));
1985 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
1986 } else if (config.method == GETADDRINFO) {
1987 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
1988 ai_result = safe_getaddrinfo(host_name, nullptr, nullptr);
1989 EXPECT_TRUE(ai_result != nullptr);
1990
1991 EXPECT_LE(1U, GetNumQueries(dns, host_name));
1992 // Could be A or AAAA
1993 const std::string result_str = ToString(ai_result);
1994 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
Luke Huangf8215372019-11-22 11:53:41 +08001995 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08001996 } else if (config.method == GETADDRINFOFORNET) {
1997 addrinfo* raw_ai_result = nullptr;
1998 EXPECT_EQ(0, android_getaddrinfofornet(host_name, /*servname=*/nullptr,
1999 /*hints=*/nullptr, BYPASS_NETID, MARK_UNSET,
2000 &raw_ai_result));
2001 ai_result.reset(raw_ai_result);
2002
2003 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2004 // Could be A or AAAA
2005 const std::string result_str = ToString(ai_result);
2006 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
Luke Huangf8215372019-11-22 11:53:41 +08002007 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08002008 }
2009
Mike Yudd4ac2d2019-05-31 16:52:11 +08002010 EXPECT_EQ(0, tls.queries());
Ken Chenb9fa2062018-11-13 21:51:13 +08002011
2012 // Clear per-process resolv netid.
2013 ASSERT_EQ(0, setNetworkForResolv(NETID_UNSET));
Ken Chenb9fa2062018-11-13 21:51:13 +08002014 dns.clearQueries();
2015 }
Ken Chenb9fa2062018-11-13 21:51:13 +08002016}
2017
2018TEST_F(ResolverTest, StrictMode_NoTlsServers) {
Xiao Ma09b71022018-12-11 17:56:32 +09002019 constexpr char cleartext_addr[] = "127.0.0.53";
Luke Huangf8215372019-11-22 11:53:41 +08002020 const std::vector<std::string> servers = {cleartext_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002021 constexpr char host_name[] = "strictmode.notlsips.example.com.";
2022 const std::vector<DnsRecord> records = {
2023 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2024 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2025 };
Ken Chenb9fa2062018-11-13 21:51:13 +08002026
Xiao Ma09b71022018-12-11 17:56:32 +09002027 test::DNSResponder dns(cleartext_addr);
2028 StartDns(dns, records);
Ken Chenb9fa2062018-11-13 21:51:13 +08002029
waynema0e73c2e2019-07-31 15:04:08 +08002030 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
2031 kDefaultIncorrectPrivateDnsHostName));
Ken Chenb9fa2062018-11-13 21:51:13 +08002032
2033 addrinfo* ai_result = nullptr;
2034 EXPECT_NE(0, getaddrinfo(host_name, nullptr, nullptr, &ai_result));
2035 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
2036}
Luke Huang94b10b92018-11-21 20:13:38 +08002037
2038namespace {
2039
Luke Huang70931aa2019-01-31 11:57:41 +08002040int getAsyncResponse(int fd, int* rcode, uint8_t* buf, int bufLen) {
Luke Huang94b10b92018-11-21 20:13:38 +08002041 struct pollfd wait_fd[1];
2042 wait_fd[0].fd = fd;
2043 wait_fd[0].events = POLLIN;
2044 short revents;
2045 int ret;
2046
2047 ret = poll(wait_fd, 1, -1);
2048 revents = wait_fd[0].revents;
2049 if (revents & POLLIN) {
2050 int n = resNetworkResult(fd, rcode, buf, bufLen);
Luke Huangba7bef92018-12-26 16:53:03 +08002051 // Verify that resNetworkResult() closed the fd
markchien96b09e22020-07-29 14:24:34 +08002052 char unused;
2053 EXPECT_EQ(-1, read(fd, &unused, sizeof unused));
Luke Huangba7bef92018-12-26 16:53:03 +08002054 EXPECT_EQ(EBADF, errno);
Luke Huang94b10b92018-11-21 20:13:38 +08002055 return n;
2056 }
2057 return -1;
2058}
2059
Luke Huang70931aa2019-01-31 11:57:41 +08002060std::string toString(uint8_t* buf, int bufLen, int ipType) {
Luke Huang94b10b92018-11-21 20:13:38 +08002061 ns_msg handle;
2062 int ancount, n = 0;
2063 ns_rr rr;
2064
Luke Huangf8215372019-11-22 11:53:41 +08002065 if (ns_initparse((const uint8_t*)buf, bufLen, &handle) >= 0) {
Luke Huang94b10b92018-11-21 20:13:38 +08002066 ancount = ns_msg_count(handle, ns_s_an);
2067 if (ns_parserr(&handle, ns_s_an, n, &rr) == 0) {
Luke Huang70931aa2019-01-31 11:57:41 +08002068 const uint8_t* rdata = ns_rr_rdata(rr);
Luke Huang94b10b92018-11-21 20:13:38 +08002069 char buffer[INET6_ADDRSTRLEN];
Luke Huangf8215372019-11-22 11:53:41 +08002070 if (inet_ntop(ipType, (const char*)rdata, buffer, sizeof(buffer))) {
Luke Huang94b10b92018-11-21 20:13:38 +08002071 return buffer;
2072 }
2073 }
2074 }
2075 return "";
2076}
2077
2078int dns_open_proxy() {
2079 int s = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
2080 if (s == -1) {
2081 return -1;
2082 }
2083 const int one = 1;
2084 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
2085
2086 static const struct sockaddr_un proxy_addr = {
2087 .sun_family = AF_UNIX,
2088 .sun_path = "/dev/socket/dnsproxyd",
2089 };
2090
Luke Huangf8215372019-11-22 11:53:41 +08002091 if (TEMP_FAILURE_RETRY(connect(s, (const struct sockaddr*)&proxy_addr, sizeof(proxy_addr))) !=
Luke Huang94b10b92018-11-21 20:13:38 +08002092 0) {
2093 close(s);
2094 return -1;
2095 }
2096
2097 return s;
2098}
2099
Luke Huangba7bef92018-12-26 16:53:03 +08002100void expectAnswersValid(int fd, int ipType, const std::string& expectedAnswer) {
2101 int rcode = -1;
2102 uint8_t buf[MAXPACKET] = {};
2103
2104 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2105 EXPECT_GT(res, 0);
2106 EXPECT_EQ(expectedAnswer, toString(buf, res, ipType));
2107}
2108
2109void expectAnswersNotValid(int fd, int expectedErrno) {
2110 int rcode = -1;
2111 uint8_t buf[MAXPACKET] = {};
2112
2113 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2114 EXPECT_EQ(expectedErrno, res);
2115}
2116
Luke Huang94b10b92018-11-21 20:13:38 +08002117} // namespace
2118
2119TEST_F(ResolverTest, Async_NormalQueryV4V6) {
Xiao Ma09b71022018-12-11 17:56:32 +09002120 constexpr char listen_addr[] = "127.0.0.4";
2121 constexpr char host_name[] = "howdy.example.com.";
2122 const std::vector<DnsRecord> records = {
2123 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2124 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2125 };
2126
2127 test::DNSResponder dns(listen_addr);
2128 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002129 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002130 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002131
Luke Huangba7bef92018-12-26 16:53:03 +08002132 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2133 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002134 EXPECT_TRUE(fd1 != -1);
2135 EXPECT_TRUE(fd2 != -1);
2136
Luke Huang70931aa2019-01-31 11:57:41 +08002137 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002138 int rcode;
2139 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2140 EXPECT_GT(res, 0);
2141 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
2142
2143 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2144 EXPECT_GT(res, 0);
2145 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2146
2147 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
2148
2149 // Re-query verify cache works
Luke Huangba7bef92018-12-26 16:53:03 +08002150 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2151 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002152
2153 EXPECT_TRUE(fd1 != -1);
2154 EXPECT_TRUE(fd2 != -1);
2155
2156 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2157 EXPECT_GT(res, 0);
2158 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
2159
2160 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2161 EXPECT_GT(res, 0);
2162 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2163
2164 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
2165}
2166
2167TEST_F(ResolverTest, Async_BadQuery) {
Xiao Ma09b71022018-12-11 17:56:32 +09002168 constexpr char listen_addr[] = "127.0.0.4";
2169 constexpr char host_name[] = "howdy.example.com.";
2170 const std::vector<DnsRecord> records = {
2171 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2172 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2173 };
2174
2175 test::DNSResponder dns(listen_addr);
2176 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002177 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002178 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002179
2180 static struct {
2181 int fd;
2182 const char* dname;
2183 const int queryType;
2184 const int expectRcode;
2185 } kTestData[] = {
Luke Huangba7bef92018-12-26 16:53:03 +08002186 {-1, "", ns_t_aaaa, 0},
2187 {-1, "as65ass46", ns_t_aaaa, 0},
2188 {-1, "454564564564", ns_t_aaaa, 0},
2189 {-1, "h645235", ns_t_a, 0},
2190 {-1, "www.google.com", ns_t_a, 0},
Luke Huang94b10b92018-11-21 20:13:38 +08002191 };
2192
2193 for (auto& td : kTestData) {
2194 SCOPED_TRACE(td.dname);
Luke Huangba7bef92018-12-26 16:53:03 +08002195 td.fd = resNetworkQuery(TEST_NETID, td.dname, ns_c_in, td.queryType, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002196 EXPECT_TRUE(td.fd != -1);
2197 }
2198
2199 // dns_responder return empty resp(packet only contains query part) with no error currently
2200 for (const auto& td : kTestData) {
Luke Huang70931aa2019-01-31 11:57:41 +08002201 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002202 int rcode;
2203 SCOPED_TRACE(td.dname);
2204 int res = getAsyncResponse(td.fd, &rcode, buf, MAXPACKET);
2205 EXPECT_GT(res, 0);
2206 EXPECT_EQ(rcode, td.expectRcode);
2207 }
2208}
2209
2210TEST_F(ResolverTest, Async_EmptyAnswer) {
Xiao Ma09b71022018-12-11 17:56:32 +09002211 constexpr char listen_addr[] = "127.0.0.4";
2212 constexpr char host_name[] = "howdy.example.com.";
2213 const std::vector<DnsRecord> records = {
2214 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2215 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2216 };
2217
2218 test::DNSResponder dns(listen_addr);
2219 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002220 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002221 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002222
Luke Huang9c264bb2018-12-18 16:44:41 +08002223 // TODO: Disable retry to make this test explicit.
2224 auto& cv = dns.getCv();
2225 auto& cvMutex = dns.getCvMutex();
2226 int fd1;
2227 // Wait on the condition variable to ensure that the DNS server has handled our first query.
2228 {
2229 std::unique_lock lk(cvMutex);
Luke Huangba7bef92018-12-26 16:53:03 +08002230 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang9c264bb2018-12-18 16:44:41 +08002231 EXPECT_TRUE(fd1 != -1);
2232 EXPECT_EQ(std::cv_status::no_timeout, cv.wait_for(lk, std::chrono::seconds(1)));
2233 }
Luke Huang94b10b92018-11-21 20:13:38 +08002234
Luke Huang94b10b92018-11-21 20:13:38 +08002235 dns.setResponseProbability(0.0);
Luke Huang94b10b92018-11-21 20:13:38 +08002236
Luke Huangba7bef92018-12-26 16:53:03 +08002237 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002238 EXPECT_TRUE(fd2 != -1);
2239
Luke Huangba7bef92018-12-26 16:53:03 +08002240 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002241 EXPECT_TRUE(fd3 != -1);
2242
Luke Huang9c264bb2018-12-18 16:44:41 +08002243 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002244 int rcode;
2245
Luke Huang9c264bb2018-12-18 16:44:41 +08002246 // expect no response
2247 int res = getAsyncResponse(fd3, &rcode, buf, MAXPACKET);
2248 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huang94b10b92018-11-21 20:13:38 +08002249
Luke Huang9c264bb2018-12-18 16:44:41 +08002250 // expect no response
Luke Huang94b10b92018-11-21 20:13:38 +08002251 memset(buf, 0, MAXPACKET);
Luke Huang9c264bb2018-12-18 16:44:41 +08002252 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2253 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huang94b10b92018-11-21 20:13:38 +08002254
Luke Huang94b10b92018-11-21 20:13:38 +08002255 dns.setResponseProbability(1.0);
Luke Huang94b10b92018-11-21 20:13:38 +08002256
Luke Huangba7bef92018-12-26 16:53:03 +08002257 int fd4 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002258 EXPECT_TRUE(fd4 != -1);
2259
2260 memset(buf, 0, MAXPACKET);
2261 res = getAsyncResponse(fd4, &rcode, buf, MAXPACKET);
2262 EXPECT_GT(res, 0);
2263 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2264
2265 memset(buf, 0, MAXPACKET);
2266 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2267 EXPECT_GT(res, 0);
2268 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
Mike Yu532405f2020-06-17 17:46:44 +08002269
2270 // Trailing dot is removed. Is it intended?
2271 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, 0, "howdy.example.com", {"::1.2.3.4"});
2272 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2273 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2274 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, 0, "howdy.example.com", {"1.2.3.4"});
Luke Huang94b10b92018-11-21 20:13:38 +08002275}
2276
2277TEST_F(ResolverTest, Async_MalformedQuery) {
Xiao Ma09b71022018-12-11 17:56:32 +09002278 constexpr char listen_addr[] = "127.0.0.4";
2279 constexpr char host_name[] = "howdy.example.com.";
2280 const std::vector<DnsRecord> records = {
2281 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2282 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2283 };
2284
2285 test::DNSResponder dns(listen_addr);
2286 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002287 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002288 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002289
2290 int fd = dns_open_proxy();
2291 EXPECT_TRUE(fd > 0);
2292
2293 const std::string badMsg = "16-52512#";
Xiao Ma09b71022018-12-11 17:56:32 +09002294 static const struct {
Luke Huang94b10b92018-11-21 20:13:38 +08002295 const std::string cmd;
2296 const int expectErr;
2297 } kTestData[] = {
Luke Huangba7bef92018-12-26 16:53:03 +08002298 // Too few arguments
Luke Huang94b10b92018-11-21 20:13:38 +08002299 {"resnsend " + badMsg + '\0', -EINVAL},
2300 // Bad netId
Luke Huangba7bef92018-12-26 16:53:03 +08002301 {"resnsend badnetId 0 " + badMsg + '\0', -EINVAL},
Luke Huang94b10b92018-11-21 20:13:38 +08002302 // Bad raw data
Luke Huangba7bef92018-12-26 16:53:03 +08002303 {"resnsend " + std::to_string(TEST_NETID) + " 0 " + badMsg + '\0', -EILSEQ},
Luke Huang94b10b92018-11-21 20:13:38 +08002304 };
2305
2306 for (unsigned int i = 0; i < std::size(kTestData); i++) {
2307 auto& td = kTestData[i];
2308 SCOPED_TRACE(td.cmd);
2309 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, td.cmd.c_str(), td.cmd.size()));
2310 EXPECT_EQ(rc, static_cast<ssize_t>(td.cmd.size()));
2311
2312 int32_t tmp;
2313 rc = TEMP_FAILURE_RETRY(read(fd, &tmp, sizeof(tmp)));
2314 EXPECT_TRUE(rc > 0);
2315 EXPECT_EQ(static_cast<int>(ntohl(tmp)), td.expectErr);
2316 }
2317 // Normal query with answer buffer
2318 // This is raw data of query "howdy.example.com" type 1 class 1
2319 std::string query = "81sBAAABAAAAAAAABWhvd2R5B2V4YW1wbGUDY29tAAABAAE=";
Luke Huangba7bef92018-12-26 16:53:03 +08002320 std::string cmd = "resnsend " + std::to_string(TEST_NETID) + " 0 " + query + '\0';
Luke Huang94b10b92018-11-21 20:13:38 +08002321 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
2322 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
2323
Luke Huang70931aa2019-01-31 11:57:41 +08002324 uint8_t smallBuf[1] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002325 int rcode;
2326 rc = getAsyncResponse(fd, &rcode, smallBuf, 1);
Luke Huangba7bef92018-12-26 16:53:03 +08002327 EXPECT_EQ(-EMSGSIZE, rc);
Luke Huang94b10b92018-11-21 20:13:38 +08002328
2329 // Do the normal test with large buffer again
2330 fd = dns_open_proxy();
2331 EXPECT_TRUE(fd > 0);
2332 rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
2333 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
Luke Huang70931aa2019-01-31 11:57:41 +08002334 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002335 rc = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2336 EXPECT_EQ("1.2.3.4", toString(buf, rc, AF_INET));
Mike Yu4f3747b2018-12-02 17:54:29 +09002337}
2338
Luke Huangba7bef92018-12-26 16:53:03 +08002339TEST_F(ResolverTest, Async_CacheFlags) {
Xiao Ma09b71022018-12-11 17:56:32 +09002340 constexpr char listen_addr[] = "127.0.0.4";
Luke Huang4eabbe32020-05-28 03:17:32 +08002341 constexpr char host_name1[] = "howdy.example.com.";
2342 constexpr char host_name2[] = "howdy.example2.com.";
2343 constexpr char host_name3[] = "howdy.example3.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002344 const std::vector<DnsRecord> records = {
Luke Huang4eabbe32020-05-28 03:17:32 +08002345 {host_name1, ns_type::ns_t_a, "1.2.3.4"}, {host_name1, ns_type::ns_t_aaaa, "::1.2.3.4"},
2346 {host_name2, ns_type::ns_t_a, "1.2.3.5"}, {host_name2, ns_type::ns_t_aaaa, "::1.2.3.5"},
2347 {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 +09002348 };
2349
2350 test::DNSResponder dns(listen_addr);
2351 StartDns(dns, records);
Luke Huangba7bef92018-12-26 16:53:03 +08002352 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002353 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huangba7bef92018-12-26 16:53:03 +08002354
2355 // ANDROID_RESOLV_NO_CACHE_STORE
2356 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2357 ANDROID_RESOLV_NO_CACHE_STORE);
2358 EXPECT_TRUE(fd1 != -1);
2359 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2360 ANDROID_RESOLV_NO_CACHE_STORE);
2361 EXPECT_TRUE(fd2 != -1);
2362 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2363 ANDROID_RESOLV_NO_CACHE_STORE);
2364 EXPECT_TRUE(fd3 != -1);
2365
2366 expectAnswersValid(fd3, AF_INET, "1.2.3.4");
2367 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
2368 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2369
2370 // No cache exists, expect 3 queries
Luke Huang4eabbe32020-05-28 03:17:32 +08002371 EXPECT_EQ(3U, GetNumQueries(dns, host_name1));
Luke Huangba7bef92018-12-26 16:53:03 +08002372
Luke Huang4eabbe32020-05-28 03:17:32 +08002373 // Raise a query with no flags to ensure no cache exists. Also make an cache entry for the
2374 // query.
Luke Huangba7bef92018-12-26 16:53:03 +08002375 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2376
2377 EXPECT_TRUE(fd1 != -1);
2378
2379 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2380
Luke Huang4eabbe32020-05-28 03:17:32 +08002381 // Expect 4 queries because there should be no cache before this query.
2382 EXPECT_EQ(4U, GetNumQueries(dns, host_name1));
2383
2384 // Now we have the cache entry, re-query with ANDROID_RESOLV_NO_CACHE_STORE to ensure
2385 // that ANDROID_RESOLV_NO_CACHE_STORE implied ANDROID_RESOLV_NO_CACHE_LOOKUP.
2386 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2387 ANDROID_RESOLV_NO_CACHE_STORE);
2388 EXPECT_TRUE(fd1 != -1);
2389 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2390 // Expect 5 queries because we shouldn't do cache lookup for the query which has
2391 // ANDROID_RESOLV_NO_CACHE_STORE.
2392 EXPECT_EQ(5U, GetNumQueries(dns, host_name1));
Luke Huangba7bef92018-12-26 16:53:03 +08002393
2394 // ANDROID_RESOLV_NO_CACHE_LOOKUP
2395 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2396 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2397 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2398 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2399
2400 EXPECT_TRUE(fd1 != -1);
2401 EXPECT_TRUE(fd2 != -1);
2402
2403 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
2404 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2405
Luke Huang4eabbe32020-05-28 03:17:32 +08002406 // Cache was skipped, expect 2 more queries.
2407 EXPECT_EQ(7U, GetNumQueries(dns, host_name1));
Luke Huangba7bef92018-12-26 16:53:03 +08002408
2409 // Re-query verify cache works
Luke Huang4eabbe32020-05-28 03:17:32 +08002410 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huangba7bef92018-12-26 16:53:03 +08002411 EXPECT_TRUE(fd1 != -1);
2412 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2413
Luke Huang4eabbe32020-05-28 03:17:32 +08002414 // Cache hits, expect still 7 queries
2415 EXPECT_EQ(7U, GetNumQueries(dns, host_name1));
Luke Huanga1d74182019-03-19 17:30:36 +08002416
2417 // Start to verify if ANDROID_RESOLV_NO_CACHE_LOOKUP does write response into cache
2418 dns.clearQueries();
2419
Luke Huang4eabbe32020-05-28 03:17:32 +08002420 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa,
Luke Huanga1d74182019-03-19 17:30:36 +08002421 ANDROID_RESOLV_NO_CACHE_LOOKUP);
Luke Huang4eabbe32020-05-28 03:17:32 +08002422 fd2 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa,
Luke Huanga1d74182019-03-19 17:30:36 +08002423 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2424
2425 EXPECT_TRUE(fd1 != -1);
2426 EXPECT_TRUE(fd2 != -1);
2427
Luke Huang4eabbe32020-05-28 03:17:32 +08002428 expectAnswersValid(fd2, AF_INET6, "::1.2.3.5");
2429 expectAnswersValid(fd1, AF_INET6, "::1.2.3.5");
Luke Huanga1d74182019-03-19 17:30:36 +08002430
2431 // Skip cache, expect 2 queries
Luke Huang4eabbe32020-05-28 03:17:32 +08002432 EXPECT_EQ(2U, GetNumQueries(dns, host_name2));
Luke Huanga1d74182019-03-19 17:30:36 +08002433
2434 // Re-query without flags
Luke Huang4eabbe32020-05-28 03:17:32 +08002435 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa, 0);
2436 fd2 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa, 0);
Luke Huanga1d74182019-03-19 17:30:36 +08002437
2438 EXPECT_TRUE(fd1 != -1);
2439 EXPECT_TRUE(fd2 != -1);
2440
Luke Huang4eabbe32020-05-28 03:17:32 +08002441 expectAnswersValid(fd2, AF_INET6, "::1.2.3.5");
2442 expectAnswersValid(fd1, AF_INET6, "::1.2.3.5");
Luke Huanga1d74182019-03-19 17:30:36 +08002443
2444 // Cache hits, expect still 2 queries
Luke Huang4eabbe32020-05-28 03:17:32 +08002445 EXPECT_EQ(2U, GetNumQueries(dns, host_name2));
Luke Huang40f5f492019-05-09 19:37:35 +08002446
2447 // Test both ANDROID_RESOLV_NO_CACHE_STORE and ANDROID_RESOLV_NO_CACHE_LOOKUP are set
2448 dns.clearQueries();
2449
Luke Huang4eabbe32020-05-28 03:17:32 +08002450 // Make sure that the cache of "howdy.example3.com" exists.
2451 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang40f5f492019-05-09 19:37:35 +08002452 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002453 expectAnswersValid(fd1, AF_INET6, "::1.2.3.6");
2454 EXPECT_EQ(1U, GetNumQueries(dns, host_name3));
Luke Huang40f5f492019-05-09 19:37:35 +08002455
2456 // Re-query with testFlags
2457 const int testFlag = ANDROID_RESOLV_NO_CACHE_STORE | ANDROID_RESOLV_NO_CACHE_LOOKUP;
Luke Huang4eabbe32020-05-28 03:17:32 +08002458 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_aaaa, testFlag);
Luke Huang40f5f492019-05-09 19:37:35 +08002459 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002460 expectAnswersValid(fd1, AF_INET6, "::1.2.3.6");
Luke Huang40f5f492019-05-09 19:37:35 +08002461 // Expect cache lookup is skipped.
Luke Huang4eabbe32020-05-28 03:17:32 +08002462 EXPECT_EQ(2U, GetNumQueries(dns, host_name3));
Luke Huang40f5f492019-05-09 19:37:35 +08002463
2464 // Do another query with testFlags
Luke Huang4eabbe32020-05-28 03:17:32 +08002465 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_a, testFlag);
Luke Huang40f5f492019-05-09 19:37:35 +08002466 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002467 expectAnswersValid(fd1, AF_INET, "1.2.3.6");
Luke Huang40f5f492019-05-09 19:37:35 +08002468 // Expect cache lookup is skipped.
Luke Huang4eabbe32020-05-28 03:17:32 +08002469 EXPECT_EQ(3U, GetNumQueries(dns, host_name3));
Luke Huang40f5f492019-05-09 19:37:35 +08002470
2471 // Re-query with no flags
Luke Huang4eabbe32020-05-28 03:17:32 +08002472 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_a, 0);
Luke Huang40f5f492019-05-09 19:37:35 +08002473 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002474 expectAnswersValid(fd1, AF_INET, "1.2.3.6");
Luke Huang40f5f492019-05-09 19:37:35 +08002475 // Expect no cache hit because cache storing is also skipped in previous query.
Luke Huang4eabbe32020-05-28 03:17:32 +08002476 EXPECT_EQ(4U, GetNumQueries(dns, host_name3));
Luke Huangba7bef92018-12-26 16:53:03 +08002477}
2478
Luke Huang08b13d22020-02-05 14:46:21 +08002479TEST_F(ResolverTest, Async_NoCacheStoreFlagDoesNotRefreshStaleCacheEntry) {
2480 constexpr char listen_addr[] = "127.0.0.4";
2481 constexpr char host_name[] = "howdy.example.com.";
2482 const std::vector<DnsRecord> records = {
2483 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2484 };
2485
2486 test::DNSResponder dns(listen_addr);
2487 StartDns(dns, records);
2488 std::vector<std::string> servers = {listen_addr};
2489 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
2490
2491 const unsigned SHORT_TTL_SEC = 1;
2492 dns.setTtl(SHORT_TTL_SEC);
2493
2494 // Refer to b/148842821 for the purpose of below test steps.
2495 // Basically, this test is used to ensure stale cache case is handled
2496 // correctly with ANDROID_RESOLV_NO_CACHE_STORE.
2497 int fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2498 EXPECT_TRUE(fd != -1);
2499 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2500
2501 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2502 dns.clearQueries();
2503
2504 // Wait until cache expired
2505 sleep(SHORT_TTL_SEC + 0.5);
2506
2507 // Now request the same hostname again.
2508 // We should see a new DNS query because the entry in cache has become stale.
2509 // Due to ANDROID_RESOLV_NO_CACHE_STORE, this query must *not* refresh that stale entry.
2510 fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2511 ANDROID_RESOLV_NO_CACHE_STORE);
2512 EXPECT_TRUE(fd != -1);
2513 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2514 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2515 dns.clearQueries();
2516
2517 // If the cache is still stale, we expect to see one more DNS query
2518 // (this time the cache will be refreshed, but we're not checking for it).
2519 fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2520 EXPECT_TRUE(fd != -1);
2521 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2522 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2523}
2524
Luke Huangba7bef92018-12-26 16:53:03 +08002525TEST_F(ResolverTest, Async_NoRetryFlag) {
Luke Huang70931aa2019-01-31 11:57:41 +08002526 constexpr char listen_addr0[] = "127.0.0.4";
2527 constexpr char listen_addr1[] = "127.0.0.6";
Xiao Ma09b71022018-12-11 17:56:32 +09002528 constexpr char host_name[] = "howdy.example.com.";
2529 const std::vector<DnsRecord> records = {
2530 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2531 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2532 };
2533
Luke Huang70931aa2019-01-31 11:57:41 +08002534 test::DNSResponder dns0(listen_addr0);
2535 test::DNSResponder dns1(listen_addr1);
2536 StartDns(dns0, records);
2537 StartDns(dns1, records);
2538 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr0, listen_addr1}));
Luke Huangba7bef92018-12-26 16:53:03 +08002539
Luke Huang70931aa2019-01-31 11:57:41 +08002540 dns0.clearQueries();
2541 dns1.clearQueries();
2542
2543 dns0.setResponseProbability(0.0);
2544 dns1.setResponseProbability(0.0);
Luke Huangba7bef92018-12-26 16:53:03 +08002545
2546 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2547 ANDROID_RESOLV_NO_RETRY);
2548 EXPECT_TRUE(fd1 != -1);
2549
2550 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa,
2551 ANDROID_RESOLV_NO_RETRY);
2552 EXPECT_TRUE(fd2 != -1);
2553
2554 // expect no response
2555 expectAnswersNotValid(fd1, -ETIMEDOUT);
2556 expectAnswersNotValid(fd2, -ETIMEDOUT);
Mike Yu532405f2020-06-17 17:46:44 +08002557 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2558 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
Luke Huangba7bef92018-12-26 16:53:03 +08002559
Luke Huang70931aa2019-01-31 11:57:41 +08002560 // No retry case, expect total 2 queries. The server is selected randomly.
2561 EXPECT_EQ(2U, GetNumQueries(dns0, host_name) + GetNumQueries(dns1, host_name));
Luke Huangba7bef92018-12-26 16:53:03 +08002562
Luke Huang70931aa2019-01-31 11:57:41 +08002563 dns0.clearQueries();
2564 dns1.clearQueries();
Luke Huangba7bef92018-12-26 16:53:03 +08002565
2566 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2567 EXPECT_TRUE(fd1 != -1);
2568
2569 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
2570 EXPECT_TRUE(fd2 != -1);
2571
2572 // expect no response
2573 expectAnswersNotValid(fd1, -ETIMEDOUT);
2574 expectAnswersNotValid(fd2, -ETIMEDOUT);
Mike Yu532405f2020-06-17 17:46:44 +08002575 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2576 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
Luke Huangba7bef92018-12-26 16:53:03 +08002577
2578 // Retry case, expect 4 queries
Luke Huang70931aa2019-01-31 11:57:41 +08002579 EXPECT_EQ(4U, GetNumQueries(dns0, host_name));
2580 EXPECT_EQ(4U, GetNumQueries(dns1, host_name));
2581}
2582
2583TEST_F(ResolverTest, Async_VerifyQueryID) {
2584 constexpr char listen_addr[] = "127.0.0.4";
2585 constexpr char host_name[] = "howdy.example.com.";
2586 const std::vector<DnsRecord> records = {
2587 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2588 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2589 };
2590
2591 test::DNSResponder dns(listen_addr);
2592 StartDns(dns, records);
2593 std::vector<std::string> servers = {listen_addr};
2594 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
2595
2596 const uint8_t queryBuf1[] = {
2597 /* Header */
2598 0x55, 0x66, /* Transaction ID */
2599 0x01, 0x00, /* Flags */
2600 0x00, 0x01, /* Questions */
2601 0x00, 0x00, /* Answer RRs */
2602 0x00, 0x00, /* Authority RRs */
2603 0x00, 0x00, /* Additional RRs */
2604 /* Queries */
2605 0x05, 0x68, 0x6f, 0x77, 0x64, 0x79, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
2606 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name */
2607 0x00, 0x01, /* Type */
2608 0x00, 0x01 /* Class */
2609 };
2610
2611 int fd = resNetworkSend(TEST_NETID, queryBuf1, sizeof(queryBuf1), 0);
2612 EXPECT_TRUE(fd != -1);
2613
2614 uint8_t buf[MAXPACKET] = {};
2615 int rcode;
2616
2617 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2618 EXPECT_GT(res, 0);
2619 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2620
2621 auto hp = reinterpret_cast<HEADER*>(buf);
2622 EXPECT_EQ(21862U, htons(hp->id));
2623
2624 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2625
2626 const uint8_t queryBuf2[] = {
2627 /* Header */
2628 0x00, 0x53, /* Transaction ID */
2629 0x01, 0x00, /* Flags */
2630 0x00, 0x01, /* Questions */
2631 0x00, 0x00, /* Answer RRs */
2632 0x00, 0x00, /* Authority RRs */
2633 0x00, 0x00, /* Additional RRs */
2634 /* Queries */
2635 0x05, 0x68, 0x6f, 0x77, 0x64, 0x79, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
2636 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name */
2637 0x00, 0x01, /* Type */
2638 0x00, 0x01 /* Class */
2639 };
2640
2641 // Re-query verify cache works and query id is correct
2642 fd = resNetworkSend(TEST_NETID, queryBuf2, sizeof(queryBuf2), 0);
2643
2644 EXPECT_TRUE(fd != -1);
2645
2646 res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2647 EXPECT_GT(res, 0);
2648 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2649
2650 EXPECT_EQ(0x0053U, htons(hp->id));
2651
2652 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
Luke Huangba7bef92018-12-26 16:53:03 +08002653}
2654
Mike Yu4f3747b2018-12-02 17:54:29 +09002655// This test checks that the resolver should not generate the request containing OPT RR when using
Ken Chen0a015532019-01-02 14:59:38 +08002656// cleartext DNS. If we query the DNS server not supporting EDNS0 and it reponds with
2657// FORMERR_ON_EDNS, we will fallback to no EDNS0 and try again. If the server does no response, we
2658// won't retry so that we get no answer.
Mike Yu4f3747b2018-12-02 17:54:29 +09002659TEST_F(ResolverTest, BrokenEdns) {
2660 typedef test::DNSResponder::Edns Edns;
2661 enum ExpectResult { EXPECT_FAILURE, EXPECT_SUCCESS };
2662
Mike Yu3977d482020-02-26 17:18:57 +08002663 // Perform cleartext query in off mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002664 const char OFF[] = "off";
Mike Yu3977d482020-02-26 17:18:57 +08002665
2666 // Perform cleartext query when there's no private DNS server validated in opportunistic mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002667 const char OPPORTUNISTIC_UDP[] = "opportunistic_udp";
Mike Yu3977d482020-02-26 17:18:57 +08002668
2669 // Perform cleartext query when there is a private DNS server validated in opportunistic mode.
2670 const char OPPORTUNISTIC_FALLBACK_UDP[] = "opportunistic_fallback_udp";
2671
2672 // Perform cyphertext query in opportunistic mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002673 const char OPPORTUNISTIC_TLS[] = "opportunistic_tls";
Mike Yu3977d482020-02-26 17:18:57 +08002674
2675 // Perform cyphertext query in strict mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002676 const char STRICT[] = "strict";
Mike Yu3977d482020-02-26 17:18:57 +08002677
Mike Yu4f3747b2018-12-02 17:54:29 +09002678 const char GETHOSTBYNAME[] = "gethostbyname";
2679 const char GETADDRINFO[] = "getaddrinfo";
Mike Yu4f3747b2018-12-02 17:54:29 +09002680 const char ADDR4[] = "192.0.2.1";
2681 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2682 const char CLEARTEXT_PORT[] = "53";
2683 const char TLS_PORT[] = "853";
Luke Huangf8215372019-11-22 11:53:41 +08002684 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
Mike Yu3977d482020-02-26 17:18:57 +08002685 ResolverParamsParcel paramsForCleanup = DnsResponderClient::GetDefaultResolverParamsParcel();
2686 paramsForCleanup.servers.clear();
2687 paramsForCleanup.tlsServers.clear();
Mike Yu4f3747b2018-12-02 17:54:29 +09002688
Mike Yufc125e42019-05-15 20:41:28 +08002689 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Mike Yu4f3747b2018-12-02 17:54:29 +09002690 ASSERT_TRUE(dns.startServer());
2691
2692 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2693
Luke Huangf8215372019-11-22 11:53:41 +08002694 // clang-format off
Mike Yu4f3747b2018-12-02 17:54:29 +09002695 static const struct TestConfig {
2696 std::string mode;
2697 std::string method;
2698 Edns edns;
2699 ExpectResult expectResult;
2700
2701 std::string asHostName() const {
2702 const char* ednsString;
2703 switch (edns) {
2704 case Edns::ON:
2705 ednsString = "ednsOn";
2706 break;
Ken Chen0a015532019-01-02 14:59:38 +08002707 case Edns::FORMERR_ON_EDNS:
Mike Yu4f3747b2018-12-02 17:54:29 +09002708 ednsString = "ednsFormerr";
2709 break;
2710 case Edns::DROP:
2711 ednsString = "ednsDrop";
2712 break;
2713 default:
2714 ednsString = "";
2715 break;
2716 }
2717 return StringPrintf("%s.%s.%s.", mode.c_str(), method.c_str(), ednsString);
2718 }
2719 } testConfigs[] = {
Mike Yu3977d482020-02-26 17:18:57 +08002720 // In OPPORTUNISTIC_TLS, if the DNS server doesn't support EDNS0 but TLS, the lookup
2721 // fails. Could such server exist? if so, we might need to fix it to fallback to
2722 // cleartext query. If the server still make no response for the queries with EDNS0, we
2723 // might also need to fix it to retry without EDNS0.
Mike Yu4f3747b2018-12-02 17:54:29 +09002724 // Another thing is that {OPPORTUNISTIC_TLS, Edns::DROP} and {STRICT, Edns::DROP} are
2725 // commented out since TLS timeout is not configurable.
2726 // TODO: Uncomment them after TLS timeout is configurable.
Mike Yu3977d482020-02-26 17:18:57 +08002727 {OFF, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2728 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2729 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2730 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2731 {STRICT, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2732 {OFF, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2733 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2734 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2735 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2736 {STRICT, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2737 {OFF, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2738 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2739
2740 // The failure is due to no retry on timeout. Maybe fix it?
2741 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2742
2743 //{OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2744 //{STRICT, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2745 {OFF, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2746 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2747 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2748 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2749 {STRICT, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2750 {OFF, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2751 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2752 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2753 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2754 {STRICT, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2755 {OFF, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2756 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2757
2758 // The failure is due to no retry on timeout. Maybe fix it?
2759 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2760
Mike Yu4f3747b2018-12-02 17:54:29 +09002761 //{OPPORTUNISTIC_TLS, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2762 //{STRICT, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2763 };
Luke Huangf8215372019-11-22 11:53:41 +08002764 // clang-format on
Mike Yu4f3747b2018-12-02 17:54:29 +09002765
2766 for (const auto& config : testConfigs) {
2767 const std::string testHostName = config.asHostName();
2768 SCOPED_TRACE(testHostName);
2769
2770 const char* host_name = testHostName.c_str();
2771 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
2772 dns.setEdns(config.edns);
2773
2774 if (config.mode == OFF) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002775 if (tls.running()) {
2776 ASSERT_TRUE(tls.stopServer());
2777 }
Xiao Ma09b71022018-12-11 17:56:32 +09002778 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Mike Yu4f3747b2018-12-02 17:54:29 +09002779 } else if (config.mode == OPPORTUNISTIC_UDP) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002780 if (tls.running()) {
2781 ASSERT_TRUE(tls.stopServer());
2782 }
Xiao Ma09b71022018-12-11 17:56:32 +09002783 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002784 kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002785 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), false));
Mike Yu3977d482020-02-26 17:18:57 +08002786 } else if (config.mode == OPPORTUNISTIC_TLS || config.mode == OPPORTUNISTIC_FALLBACK_UDP) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002787 if (!tls.running()) {
2788 ASSERT_TRUE(tls.startServer());
2789 }
Xiao Ma09b71022018-12-11 17:56:32 +09002790 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002791 kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002792 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Mike Yu3977d482020-02-26 17:18:57 +08002793
2794 if (config.mode == OPPORTUNISTIC_FALLBACK_UDP) {
2795 // Force the resolver to fallback to cleartext queries.
2796 ASSERT_TRUE(tls.stopServer());
2797 }
Mike Yu4f3747b2018-12-02 17:54:29 +09002798 } else if (config.mode == STRICT) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002799 if (!tls.running()) {
2800 ASSERT_TRUE(tls.startServer());
2801 }
Xiao Ma09b71022018-12-11 17:56:32 +09002802 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002803 kDefaultParams, kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08002804 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Mike Yu4f3747b2018-12-02 17:54:29 +09002805 }
2806
2807 if (config.method == GETHOSTBYNAME) {
2808 const hostent* h_result = gethostbyname(host_name);
2809 if (config.expectResult == EXPECT_SUCCESS) {
2810 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2811 ASSERT_TRUE(h_result != nullptr);
2812 ASSERT_EQ(4, h_result->h_length);
2813 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
2814 EXPECT_EQ(ADDR4, ToString(h_result));
2815 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
Mike Yu532405f2020-06-17 17:46:44 +08002816 ExpectDnsEvent(INetdEventListener::EVENT_GETHOSTBYNAME, 0, host_name, {ADDR4});
Mike Yu4f3747b2018-12-02 17:54:29 +09002817 } else {
2818 EXPECT_EQ(0U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
2819 ASSERT_TRUE(h_result == nullptr);
2820 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
Mike Yu532405f2020-06-17 17:46:44 +08002821 int returnCode = (config.edns == Edns::DROP) ? RCODE_TIMEOUT : EAI_FAIL;
2822 ExpectDnsEvent(INetdEventListener::EVENT_GETHOSTBYNAME, returnCode, host_name, {});
Mike Yu4f3747b2018-12-02 17:54:29 +09002823 }
2824 } else if (config.method == GETADDRINFO) {
2825 ScopedAddrinfo ai_result;
2826 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2827 ai_result = safe_getaddrinfo(host_name, nullptr, &hints);
2828 if (config.expectResult == EXPECT_SUCCESS) {
2829 EXPECT_TRUE(ai_result != nullptr);
2830 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2831 const std::string result_str = ToString(ai_result);
2832 EXPECT_EQ(ADDR4, result_str);
Mike Yu532405f2020-06-17 17:46:44 +08002833 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, 0, host_name, {ADDR4});
Mike Yu4f3747b2018-12-02 17:54:29 +09002834 } else {
2835 EXPECT_TRUE(ai_result == nullptr);
2836 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
Mike Yu532405f2020-06-17 17:46:44 +08002837 int returnCode = (config.edns == Edns::DROP) ? RCODE_TIMEOUT : EAI_FAIL;
2838 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, returnCode, host_name, {});
Mike Yu4f3747b2018-12-02 17:54:29 +09002839 }
2840 } else {
2841 FAIL() << "Unsupported query method: " << config.method;
2842 }
2843
Mike Yudd4ac2d2019-05-31 16:52:11 +08002844 tls.clearQueries();
Mike Yu4f3747b2018-12-02 17:54:29 +09002845 dns.clearQueries();
Mike Yu3977d482020-02-26 17:18:57 +08002846
2847 // Clear the setup to force the resolver to validate private DNS servers in every test.
2848 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(paramsForCleanup));
Mike Yu4f3747b2018-12-02 17:54:29 +09002849 }
Mike Yu4f3747b2018-12-02 17:54:29 +09002850}
nuccachena26cc2a2018-07-17 18:07:23 +08002851
Ken Chen0a015532019-01-02 14:59:38 +08002852// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2853// Resolver should have a reasonable number of retries instead of spinning forever. We don't have
2854// an efficient way to know if resolver is stuck in an infinite loop. However, test case will be
2855// failed due to timeout.
2856TEST_F(ResolverTest, UnstableTls) {
2857 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2858 const char CLEARTEXT_PORT[] = "53";
2859 const char TLS_PORT[] = "853";
2860 const char* host_name1 = "nonexistent1.example.com.";
2861 const char* host_name2 = "nonexistent2.example.com.";
2862 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
2863
Mike Yufc125e42019-05-15 20:41:28 +08002864 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Ken Chen0a015532019-01-02 14:59:38 +08002865 ASSERT_TRUE(dns.startServer());
2866 dns.setEdns(test::DNSResponder::Edns::FORMERR_ON_EDNS);
2867 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2868 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08002869 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002870 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
2871
Ken Chen0a015532019-01-02 14:59:38 +08002872 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
2873 tls.stopServer();
2874
2875 const hostent* h_result = gethostbyname(host_name1);
2876 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
2877 ASSERT_TRUE(h_result == nullptr);
2878 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2879
2880 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2881 ScopedAddrinfo ai_result = safe_getaddrinfo(host_name2, nullptr, &hints);
2882 EXPECT_TRUE(ai_result == nullptr);
2883 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
2884}
2885
2886// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2887// Moreover, server responds RCODE=FORMERR even on non-EDNS query.
2888TEST_F(ResolverTest, BogusDnsServer) {
2889 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2890 const char CLEARTEXT_PORT[] = "53";
2891 const char TLS_PORT[] = "853";
2892 const char* host_name1 = "nonexistent1.example.com.";
2893 const char* host_name2 = "nonexistent2.example.com.";
2894 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
2895
Mike Yufc125e42019-05-15 20:41:28 +08002896 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Ken Chen0a015532019-01-02 14:59:38 +08002897 ASSERT_TRUE(dns.startServer());
2898 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2899 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08002900 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002901 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
2902
Ken Chen0a015532019-01-02 14:59:38 +08002903 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
2904 tls.stopServer();
2905 dns.setEdns(test::DNSResponder::Edns::FORMERR_UNCOND);
2906
2907 const hostent* h_result = gethostbyname(host_name1);
2908 EXPECT_EQ(0U, GetNumQueries(dns, host_name1));
2909 ASSERT_TRUE(h_result == nullptr);
2910 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2911
2912 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2913 ScopedAddrinfo ai_result = safe_getaddrinfo(host_name2, nullptr, &hints);
2914 EXPECT_TRUE(ai_result == nullptr);
2915 EXPECT_EQ(0U, GetNumQueries(dns, host_name2));
2916}
2917
nuccachena26cc2a2018-07-17 18:07:23 +08002918TEST_F(ResolverTest, GetAddrInfo_Dns64Synthesize) {
2919 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002920 constexpr char dns64_name[] = "ipv4only.arpa.";
2921 constexpr char host_name[] = "v4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002922 const std::vector<DnsRecord> records = {
2923 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2924 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2925 };
nuccachena26cc2a2018-07-17 18:07:23 +08002926
Xiao Ma09b71022018-12-11 17:56:32 +09002927 test::DNSResponder dns(listen_addr);
Xiao Ma09b71022018-12-11 17:56:32 +09002928 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002929
2930 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002931 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002932
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002933 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002934 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002935 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002936
2937 // hints are necessary in order to let netd know which type of addresses the caller is
2938 // interested in.
Xiao Ma09b71022018-12-11 17:56:32 +09002939 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08002940 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
2941 EXPECT_TRUE(result != nullptr);
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002942 // TODO: BUG: there should only be two queries, one AAAA (which returns no records) and one A
2943 // (which returns 1.2.3.4). But there is an extra AAAA.
2944 EXPECT_EQ(3U, GetNumQueries(dns, host_name));
nuccachena26cc2a2018-07-17 18:07:23 +08002945
2946 std::string result_str = ToString(result);
2947 EXPECT_EQ(result_str, "64:ff9b::102:304");
2948
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002949 // Stopping NAT64 prefix discovery disables synthesis.
Luke Huang5bd827c2019-03-14 16:10:04 +08002950 EXPECT_TRUE(mDnsClient.resolvService()->stopPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002951 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_NOT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002952
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002953 dns.clearQueries();
nuccachena26cc2a2018-07-17 18:07:23 +08002954
2955 result = safe_getaddrinfo("v4only", nullptr, &hints);
2956 EXPECT_TRUE(result != nullptr);
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002957 // TODO: BUG: there should only be one query, an AAAA (which returns no records), because the
2958 // A is already cached. But there is an extra AAAA.
2959 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
nuccachena26cc2a2018-07-17 18:07:23 +08002960
2961 result_str = ToString(result);
2962 EXPECT_EQ(result_str, "1.2.3.4");
2963}
2964
nuccachena26cc2a2018-07-17 18:07:23 +08002965TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecified) {
2966 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002967 constexpr char dns64_name[] = "ipv4only.arpa.";
2968 constexpr char host_name[] = "v4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002969 const std::vector<DnsRecord> records = {
2970 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2971 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2972 };
nuccachena26cc2a2018-07-17 18:07:23 +08002973
Xiao Ma09b71022018-12-11 17:56:32 +09002974 test::DNSResponder dns(listen_addr);
2975 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002976 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002977 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002978
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002979 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002980 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002981 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002982
2983 // Ensure to synthesize AAAA if AF_INET6 is specified, and not to synthesize AAAA
2984 // in AF_INET case.
2985 addrinfo hints;
2986 memset(&hints, 0, sizeof(hints));
2987 hints.ai_family = AF_INET6;
2988 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
2989 EXPECT_TRUE(result != nullptr);
2990 std::string result_str = ToString(result);
2991 EXPECT_EQ(result_str, "64:ff9b::102:304");
2992
2993 hints.ai_family = AF_INET;
2994 result = safe_getaddrinfo("v4only", nullptr, &hints);
2995 EXPECT_TRUE(result != nullptr);
2996 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2997 result_str = ToString(result);
2998 EXPECT_EQ(result_str, "1.2.3.4");
2999}
nuccachena26cc2a2018-07-17 18:07:23 +08003000
3001TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedV6) {
3002 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003003 constexpr char dns64_name[] = "ipv4only.arpa.";
3004 constexpr char host_name[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003005 const std::vector<DnsRecord> records = {
3006 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3007 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3008 {host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
3009 };
nuccachena26cc2a2018-07-17 18:07:23 +08003010
Xiao Ma09b71022018-12-11 17:56:32 +09003011 test::DNSResponder dns(listen_addr);
3012 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003013 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003014 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003015
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003016 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003017 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003018 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003019
Xiao Ma09b71022018-12-11 17:56:32 +09003020 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08003021 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
3022 EXPECT_TRUE(result != nullptr);
3023 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3024
3025 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
Xiao Ma09b71022018-12-11 17:56:32 +09003026 const std::vector<std::string> result_strs = ToStrings(result);
nuccachena26cc2a2018-07-17 18:07:23 +08003027 for (const auto& str : result_strs) {
3028 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
3029 << ", result_str='" << str << "'";
3030 }
3031}
3032
3033TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedNoV6) {
3034 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003035 constexpr char dns64_name[] = "ipv4only.arpa.";
3036 constexpr char host_name[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003037 const std::vector<DnsRecord> records = {
3038 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3039 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3040 };
nuccachena26cc2a2018-07-17 18:07:23 +08003041
Xiao Ma09b71022018-12-11 17:56:32 +09003042 test::DNSResponder dns(listen_addr);
3043 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003044 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003045 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003046
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003047 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003048 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003049 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003050
Xiao Ma09b71022018-12-11 17:56:32 +09003051 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08003052 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
3053 EXPECT_TRUE(result != nullptr);
3054 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3055
3056 // In AF_UNSPEC case, synthesize AAAA if there's no AAAA answer.
3057 std::string result_str = ToString(result);
3058 EXPECT_EQ(result_str, "64:ff9b::102:304");
3059}
3060
3061TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecialUseIPv4Addresses) {
3062 constexpr char THIS_NETWORK[] = "this_network";
3063 constexpr char LOOPBACK[] = "loopback";
3064 constexpr char LINK_LOCAL[] = "link_local";
3065 constexpr char MULTICAST[] = "multicast";
3066 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
3067
3068 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
3069 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
3070 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
3071 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
3072 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
3073
3074 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003075 constexpr char dns64_name[] = "ipv4only.arpa.";
3076
Xiao Ma09b71022018-12-11 17:56:32 +09003077 test::DNSResponder dns(listen_addr);
3078 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003079 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003080 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003081
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003082 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003083 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003084 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003085
Luke Huangf8215372019-11-22 11:53:41 +08003086 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003087 static const struct TestConfig {
3088 std::string name;
3089 std::string addr;
3090
3091 std::string asHostName() const { return StringPrintf("%s.example.com.", name.c_str()); }
3092 } testConfigs[]{
3093 {THIS_NETWORK, ADDR_THIS_NETWORK},
3094 {LOOPBACK, ADDR_LOOPBACK},
3095 {LINK_LOCAL, ADDR_LINK_LOCAL},
3096 {MULTICAST, ADDR_MULTICAST},
3097 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
3098 };
Luke Huangf8215372019-11-22 11:53:41 +08003099 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003100
3101 for (const auto& config : testConfigs) {
3102 const std::string testHostName = config.asHostName();
3103 SCOPED_TRACE(testHostName);
3104
3105 const char* host_name = testHostName.c_str();
3106 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
3107
3108 addrinfo hints;
3109 memset(&hints, 0, sizeof(hints));
3110 hints.ai_family = AF_INET6;
3111 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
3112 // In AF_INET6 case, don't return IPv4 answers
3113 EXPECT_TRUE(result == nullptr);
3114 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3115 dns.clearQueries();
3116
3117 memset(&hints, 0, sizeof(hints));
3118 hints.ai_family = AF_UNSPEC;
3119 result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
3120 EXPECT_TRUE(result != nullptr);
3121 // Expect IPv6 query only. IPv4 answer has been cached in previous query.
3122 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3123 // In AF_UNSPEC case, don't synthesize special use IPv4 address.
3124 std::string result_str = ToString(result);
3125 EXPECT_EQ(result_str, config.addr.c_str());
3126 dns.clearQueries();
3127 }
3128}
3129
3130TEST_F(ResolverTest, GetAddrInfo_Dns64QueryWithNullArgumentHints) {
3131 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003132 constexpr char dns64_name[] = "ipv4only.arpa.";
3133 constexpr char host_name[] = "v4only.example.com.";
3134 constexpr char host_name2[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003135 const std::vector<DnsRecord> records = {
3136 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3137 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3138 {host_name2, ns_type::ns_t_a, "1.2.3.4"},
3139 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
3140 };
nuccachena26cc2a2018-07-17 18:07:23 +08003141
Xiao Ma09b71022018-12-11 17:56:32 +09003142 test::DNSResponder dns(listen_addr);
3143 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003144 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003145 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003146
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003147 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003148 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003149 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003150
3151 // Assign argument hints of getaddrinfo() as null is equivalent to set ai_family AF_UNSPEC.
3152 // In AF_UNSPEC case, synthesize AAAA if there has A answer only.
3153 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, nullptr);
3154 EXPECT_TRUE(result != nullptr);
3155 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3156 std::string result_str = ToString(result);
3157 EXPECT_EQ(result_str, "64:ff9b::102:304");
3158 dns.clearQueries();
3159
3160 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
3161 result = safe_getaddrinfo("v4v6", nullptr, nullptr);
3162 EXPECT_TRUE(result != nullptr);
3163 EXPECT_LE(2U, GetNumQueries(dns, host_name2));
3164 std::vector<std::string> result_strs = ToStrings(result);
3165 for (const auto& str : result_strs) {
3166 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
3167 << ", result_str='" << str << "'";
3168 }
3169}
3170
3171TEST_F(ResolverTest, GetAddrInfo_Dns64QueryNullArgumentNode) {
3172 constexpr char ADDR_ANYADDR_V4[] = "0.0.0.0";
3173 constexpr char ADDR_ANYADDR_V6[] = "::";
3174 constexpr char ADDR_LOCALHOST_V4[] = "127.0.0.1";
3175 constexpr char ADDR_LOCALHOST_V6[] = "::1";
3176
3177 constexpr char PORT_NAME_HTTP[] = "http";
3178 constexpr char PORT_NUMBER_HTTP[] = "80";
3179
3180 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003181 constexpr char dns64_name[] = "ipv4only.arpa.";
3182
Xiao Ma09b71022018-12-11 17:56:32 +09003183 test::DNSResponder dns(listen_addr);
3184 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003185 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003186 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003187
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003188 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003189 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003190 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003191
Luke Huangf8215372019-11-22 11:53:41 +08003192 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003193 // If node is null, return address is listed by libc/getaddrinfo.c as follows.
3194 // - passive socket -> anyaddr (0.0.0.0 or ::)
3195 // - non-passive socket -> localhost (127.0.0.1 or ::1)
3196 static const struct TestConfig {
3197 int flag;
3198 std::string addr_v4;
3199 std::string addr_v6;
3200
3201 std::string asParameters() const {
3202 return StringPrintf("flag=%d, addr_v4=%s, addr_v6=%s", flag, addr_v4.c_str(),
3203 addr_v6.c_str());
3204 }
3205 } testConfigs[]{
3206 {0 /* non-passive */, ADDR_LOCALHOST_V4, ADDR_LOCALHOST_V6},
3207 {AI_PASSIVE, ADDR_ANYADDR_V4, ADDR_ANYADDR_V6}
3208 };
Luke Huangf8215372019-11-22 11:53:41 +08003209 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003210
3211 for (const auto& config : testConfigs) {
3212 SCOPED_TRACE(config.asParameters());
3213
Xiao Ma09b71022018-12-11 17:56:32 +09003214 addrinfo hints = {
Nick Desaulnierscd6395a2019-10-11 09:15:24 -07003215 .ai_flags = config.flag,
Xiao Ma09b71022018-12-11 17:56:32 +09003216 .ai_family = AF_UNSPEC, // any address family
3217 .ai_socktype = 0, // any type
3218 .ai_protocol = 0, // any protocol
Xiao Ma09b71022018-12-11 17:56:32 +09003219 };
nuccachena26cc2a2018-07-17 18:07:23 +08003220
3221 // Assign hostname as null and service as port name.
3222 ScopedAddrinfo result = safe_getaddrinfo(nullptr, PORT_NAME_HTTP, &hints);
3223 ASSERT_TRUE(result != nullptr);
3224
3225 // Can't be synthesized because it should not get into Netd.
3226 std::vector<std::string> result_strs = ToStrings(result);
3227 for (const auto& str : result_strs) {
3228 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
3229 << ", result_str='" << str << "'";
3230 }
3231
3232 // Assign hostname as null and service as numeric port number.
3233 hints.ai_flags = config.flag | AI_NUMERICSERV;
3234 result = safe_getaddrinfo(nullptr, PORT_NUMBER_HTTP, &hints);
3235 ASSERT_TRUE(result != nullptr);
3236
3237 // Can't be synthesized because it should not get into Netd.
3238 result_strs = ToStrings(result);
3239 for (const auto& str : result_strs) {
3240 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
3241 << ", result_str='" << str << "'";
3242 }
3243 }
3244}
3245
3246TEST_F(ResolverTest, GetHostByAddr_ReverseDnsQueryWithHavingNat64Prefix) {
3247 struct hostent* result = nullptr;
3248 struct in_addr v4addr;
3249 struct in6_addr v6addr;
3250
3251 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003252 constexpr char dns64_name[] = "ipv4only.arpa.";
3253 constexpr char ptr_name[] = "v4v6.example.com.";
3254 // PTR record for IPv4 address 1.2.3.4
3255 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3256 // PTR record for IPv6 address 2001:db8::102:304
3257 constexpr char ptr_addr_v6[] =
3258 "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 +09003259 const std::vector<DnsRecord> records = {
3260 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3261 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3262 {ptr_addr_v6, ns_type::ns_t_ptr, ptr_name},
3263 };
nuccachena26cc2a2018-07-17 18:07:23 +08003264
Xiao Ma09b71022018-12-11 17:56:32 +09003265 test::DNSResponder dns(listen_addr);
3266 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003267 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003268 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003269
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003270 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003271 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003272 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003273
3274 // Reverse IPv4 DNS query. Prefix should have no effect on it.
3275 inet_pton(AF_INET, "1.2.3.4", &v4addr);
3276 result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
3277 ASSERT_TRUE(result != nullptr);
3278 std::string result_str = result->h_name ? result->h_name : "null";
3279 EXPECT_EQ(result_str, "v4v6.example.com");
3280
3281 // Reverse IPv6 DNS query. Prefix should have no effect on it.
3282 inet_pton(AF_INET6, "2001:db8::102:304", &v6addr);
3283 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3284 ASSERT_TRUE(result != nullptr);
3285 result_str = result->h_name ? result->h_name : "null";
3286 EXPECT_EQ(result_str, "v4v6.example.com");
3287}
3288
3289TEST_F(ResolverTest, GetHostByAddr_ReverseDns64Query) {
3290 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003291 constexpr char dns64_name[] = "ipv4only.arpa.";
3292 constexpr char ptr_name[] = "v4only.example.com.";
3293 // PTR record for IPv4 address 1.2.3.4
3294 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3295 // PTR record for IPv6 address 64:ff9b::1.2.3.4
3296 constexpr char ptr_addr_v6_nomapping[] =
3297 "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.";
3298 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
3299 // PTR record for IPv6 address 64:ff9b::5.6.7.8
3300 constexpr char ptr_addr_v6_synthesis[] =
3301 "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 +09003302 const std::vector<DnsRecord> records = {
3303 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3304 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3305 {ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis},
3306 };
nuccachena26cc2a2018-07-17 18:07:23 +08003307
Xiao Ma09b71022018-12-11 17:56:32 +09003308 test::DNSResponder dns(listen_addr);
3309 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003310 // "ptr_addr_v6_nomapping" is not mapped in DNS server
nuccachena26cc2a2018-07-17 18:07:23 +08003311 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003312 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003313
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003314 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003315 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003316 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003317
3318 // Synthesized PTR record doesn't exist on DNS server
3319 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
3320 // After querying synthesized address failed, expect that prefix is removed from IPv6
3321 // synthesized address and do reverse IPv4 query instead.
3322 struct in6_addr v6addr;
3323 inet_pton(AF_INET6, "64:ff9b::1.2.3.4", &v6addr);
3324 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3325 ASSERT_TRUE(result != nullptr);
3326 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist
3327 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist
3328 std::string result_str = result->h_name ? result->h_name : "null";
3329 EXPECT_EQ(result_str, "v4only.example.com");
3330 // Check that return address has been mapped from IPv4 to IPv6 address because Netd
3331 // removes NAT64 prefix and does IPv4 DNS reverse lookup in this case. Then, Netd
3332 // fakes the return IPv4 address as original queried IPv6 address.
3333 result_str = ToString(result);
3334 EXPECT_EQ(result_str, "64:ff9b::102:304");
3335 dns.clearQueries();
3336
3337 // Synthesized PTR record exists on DNS server
3338 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
3339 // Expect to Netd pass through synthesized address for DNS queries.
3340 inet_pton(AF_INET6, "64:ff9b::5.6.7.8", &v6addr);
3341 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3342 ASSERT_TRUE(result != nullptr);
3343 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
3344 result_str = result->h_name ? result->h_name : "null";
3345 EXPECT_EQ(result_str, "v6synthesis.example.com");
3346}
3347
3348TEST_F(ResolverTest, GetHostByAddr_ReverseDns64QueryFromHostFile) {
3349 constexpr char dns64_name[] = "ipv4only.arpa.";
3350 constexpr char host_name[] = "localhost";
3351 // The address is synthesized by prefix64:localhost.
3352 constexpr char host_addr[] = "64:ff9b::7f00:1";
nuccachena26cc2a2018-07-17 18:07:23 +08003353 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003354
3355 test::DNSResponder dns(listen_addr);
3356 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
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
3364 // Using synthesized "localhost" address to be a trick for resolving host name
3365 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
3366 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
3367 struct in6_addr v6addr;
3368 inet_pton(AF_INET6, host_addr, &v6addr);
3369 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3370 ASSERT_TRUE(result != nullptr);
3371 // Expect no DNS queries; localhost is resolved via /etc/hosts.
3372 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
3373
Luke Huangf8215372019-11-22 11:53:41 +08003374 ASSERT_EQ(sizeof(in6_addr), (unsigned)result->h_length);
nuccachena26cc2a2018-07-17 18:07:23 +08003375 ASSERT_EQ(AF_INET6, result->h_addrtype);
3376 std::string result_str = ToString(result);
3377 EXPECT_EQ(result_str, host_addr);
3378 result_str = result->h_name ? result->h_name : "null";
3379 EXPECT_EQ(result_str, host_name);
3380}
3381
Hungming Chen9e6185a2019-06-04 16:09:19 +08003382TEST_F(ResolverTest, GetHostByAddr_cnamesClasslessReverseDelegation) {
3383 // IPv4 addresses in the subnet with notation '/' or '-'.
3384 constexpr char addr_slash[] = "192.0.2.1";
3385 constexpr char addr_hyphen[] = "192.0.3.1";
3386
3387 // Used to verify DNS reverse query for classless reverse lookup zone. See detail in RFC 2317
3388 // section 4.
3389 const static std::vector<DnsRecord> records = {
3390 // The records for reverse querying "192.0.2.1" in the subnet with notation '/'.
3391 {"1.2.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0/25.2.0.192.in-addr.arpa."},
3392 {"1.0/25.2.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3393
3394 // The records for reverse querying "192.0.3.1" in the subnet with notation '-'.
3395 {"1.3.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0-127.3.0.192.in-addr.arpa."},
3396 {"1.0-127.3.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3397 };
3398
3399 test::DNSResponder dns;
3400 StartDns(dns, records);
3401 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3402
3403 for (const auto& address : {addr_slash, addr_hyphen}) {
3404 SCOPED_TRACE(address);
3405
3406 in_addr v4addr;
3407 ASSERT_TRUE(inet_pton(AF_INET, address, &v4addr));
3408 hostent* result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
3409 ASSERT_TRUE(result != nullptr);
3410 EXPECT_STREQ("hello.example.com", result->h_name);
3411 }
3412}
3413
nuccachena26cc2a2018-07-17 18:07:23 +08003414TEST_F(ResolverTest, GetNameInfo_ReverseDnsQueryWithHavingNat64Prefix) {
3415 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003416 constexpr char dns64_name[] = "ipv4only.arpa.";
3417 constexpr char ptr_name[] = "v4v6.example.com.";
3418 // PTR record for IPv4 address 1.2.3.4
3419 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3420 // PTR record for IPv6 address 2001:db8::102:304
3421 constexpr char ptr_addr_v6[] =
3422 "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 +09003423 const std::vector<DnsRecord> records = {
3424 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3425 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3426 {ptr_addr_v6, ns_type::ns_t_ptr, ptr_name},
3427 };
nuccachena26cc2a2018-07-17 18:07:23 +08003428
Xiao Ma09b71022018-12-11 17:56:32 +09003429 test::DNSResponder dns(listen_addr);
3430 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003431 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003432 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003433
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003434 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003435 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003436 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003437
Luke Huangf8215372019-11-22 11:53:41 +08003438 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003439 static const struct TestConfig {
3440 int flag;
3441 int family;
3442 std::string addr;
3443 std::string host;
3444
3445 std::string asParameters() const {
3446 return StringPrintf("flag=%d, family=%d, addr=%s, host=%s", flag, family, addr.c_str(),
3447 host.c_str());
3448 }
3449 } testConfigs[]{
3450 {NI_NAMEREQD, AF_INET, "1.2.3.4", "v4v6.example.com"},
3451 {NI_NUMERICHOST, AF_INET, "1.2.3.4", "1.2.3.4"},
3452 {0, AF_INET, "1.2.3.4", "v4v6.example.com"},
3453 {0, AF_INET, "5.6.7.8", "5.6.7.8"}, // unmapped
3454 {NI_NAMEREQD, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
3455 {NI_NUMERICHOST, AF_INET6, "2001:db8::102:304", "2001:db8::102:304"},
3456 {0, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
3457 {0, AF_INET6, "2001:db8::506:708", "2001:db8::506:708"}, // unmapped
3458 };
Luke Huangf8215372019-11-22 11:53:41 +08003459 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003460
3461 // Reverse IPv4/IPv6 DNS query. Prefix should have no effect on it.
3462 for (const auto& config : testConfigs) {
3463 SCOPED_TRACE(config.asParameters());
3464
3465 int rv;
3466 char host[NI_MAXHOST];
3467 struct sockaddr_in sin;
3468 struct sockaddr_in6 sin6;
3469 if (config.family == AF_INET) {
3470 memset(&sin, 0, sizeof(sin));
3471 sin.sin_family = AF_INET;
3472 inet_pton(AF_INET, config.addr.c_str(), &sin.sin_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003473 rv = getnameinfo((const struct sockaddr*)&sin, sizeof(sin), host, sizeof(host), nullptr,
3474 0, config.flag);
nuccachena26cc2a2018-07-17 18:07:23 +08003475 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4));
3476 } else if (config.family == AF_INET6) {
3477 memset(&sin6, 0, sizeof(sin6));
3478 sin6.sin6_family = AF_INET6;
3479 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003480 rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host),
nuccachena26cc2a2018-07-17 18:07:23 +08003481 nullptr, 0, config.flag);
3482 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6));
3483 }
3484 ASSERT_EQ(0, rv);
3485 std::string result_str = host;
3486 EXPECT_EQ(result_str, config.host);
3487 dns.clearQueries();
3488 }
3489}
3490
3491TEST_F(ResolverTest, GetNameInfo_ReverseDns64Query) {
3492 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003493 constexpr char dns64_name[] = "ipv4only.arpa.";
3494 constexpr char ptr_name[] = "v4only.example.com.";
3495 // PTR record for IPv4 address 1.2.3.4
3496 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3497 // PTR record for IPv6 address 64:ff9b::1.2.3.4
3498 constexpr char ptr_addr_v6_nomapping[] =
3499 "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.";
3500 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
3501 // PTR record for IPv6 address 64:ff9b::5.6.7.8
3502 constexpr char ptr_addr_v6_synthesis[] =
3503 "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 +09003504 const std::vector<DnsRecord> records = {
3505 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3506 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3507 {ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis},
3508 };
nuccachena26cc2a2018-07-17 18:07:23 +08003509
Xiao Ma09b71022018-12-11 17:56:32 +09003510 test::DNSResponder dns(listen_addr);
3511 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003512 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003513 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003514
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003515 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003516 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003517 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003518
Luke Huangf8215372019-11-22 11:53:41 +08003519 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003520 static const struct TestConfig {
3521 bool hasSynthesizedPtrRecord;
3522 int flag;
3523 std::string addr;
3524 std::string host;
3525
3526 std::string asParameters() const {
3527 return StringPrintf("hasSynthesizedPtrRecord=%d, flag=%d, addr=%s, host=%s",
3528 hasSynthesizedPtrRecord, flag, addr.c_str(), host.c_str());
3529 }
3530 } testConfigs[]{
3531 {false, NI_NAMEREQD, "64:ff9b::102:304", "v4only.example.com"},
3532 {false, NI_NUMERICHOST, "64:ff9b::102:304", "64:ff9b::102:304"},
3533 {false, 0, "64:ff9b::102:304", "v4only.example.com"},
3534 {true, NI_NAMEREQD, "64:ff9b::506:708", "v6synthesis.example.com"},
3535 {true, NI_NUMERICHOST, "64:ff9b::506:708", "64:ff9b::506:708"},
3536 {true, 0, "64:ff9b::506:708", "v6synthesis.example.com"}
3537 };
Luke Huangf8215372019-11-22 11:53:41 +08003538 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003539
3540 // hasSynthesizedPtrRecord = false
3541 // Synthesized PTR record doesn't exist on DNS server
3542 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
3543 // After querying synthesized address failed, expect that prefix is removed from IPv6
3544 // synthesized address and do reverse IPv4 query instead.
3545 //
3546 // hasSynthesizedPtrRecord = true
3547 // Synthesized PTR record exists on DNS server
3548 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
3549 // Expect to just pass through synthesized address for DNS queries.
3550 for (const auto& config : testConfigs) {
3551 SCOPED_TRACE(config.asParameters());
3552
3553 char host[NI_MAXHOST];
3554 struct sockaddr_in6 sin6;
3555 memset(&sin6, 0, sizeof(sin6));
3556 sin6.sin6_family = AF_INET6;
3557 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003558 int rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host),
nuccachena26cc2a2018-07-17 18:07:23 +08003559 nullptr, 0, config.flag);
3560 ASSERT_EQ(0, rv);
3561 if (config.flag == NI_NAMEREQD) {
3562 if (config.hasSynthesizedPtrRecord) {
3563 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
3564 } else {
3565 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist.
3566 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist.
3567 }
3568 }
3569 std::string result_str = host;
3570 EXPECT_EQ(result_str, config.host);
3571 dns.clearQueries();
3572 }
3573}
3574
3575TEST_F(ResolverTest, GetNameInfo_ReverseDns64QueryFromHostFile) {
3576 constexpr char dns64_name[] = "ipv4only.arpa.";
3577 constexpr char host_name[] = "localhost";
3578 // The address is synthesized by prefix64:localhost.
3579 constexpr char host_addr[] = "64:ff9b::7f00:1";
nuccachena26cc2a2018-07-17 18:07:23 +08003580 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003581
3582 test::DNSResponder dns(listen_addr);
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003583
Xiao Ma09b71022018-12-11 17:56:32 +09003584 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003585 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003586 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003587
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003588 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003589 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003590 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003591
3592 // Using synthesized "localhost" address to be a trick for resolving host name
3593 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
3594 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
3595 char host[NI_MAXHOST];
Xiao Ma09b71022018-12-11 17:56:32 +09003596 struct sockaddr_in6 sin6 = {.sin6_family = AF_INET6};
nuccachena26cc2a2018-07-17 18:07:23 +08003597 inet_pton(AF_INET6, host_addr, &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003598 int rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host), nullptr,
nuccachena26cc2a2018-07-17 18:07:23 +08003599 0, NI_NAMEREQD);
3600 ASSERT_EQ(0, rv);
3601 // Expect no DNS queries; localhost is resolved via /etc/hosts.
3602 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
3603
3604 std::string result_str = host;
3605 EXPECT_EQ(result_str, host_name);
3606}
3607
Hungming Chen9e6185a2019-06-04 16:09:19 +08003608TEST_F(ResolverTest, GetNameInfo_cnamesClasslessReverseDelegation) {
3609 // IPv4 addresses in the subnet with notation '/' or '-'.
3610 constexpr char addr_slash[] = "192.0.2.1";
3611 constexpr char addr_hyphen[] = "192.0.3.1";
3612
3613 // Used to verify DNS reverse query for classless reverse lookup zone. See detail in RFC 2317
3614 // section 4.
3615 const static std::vector<DnsRecord> records = {
3616 // The records for reverse querying "192.0.2.1" in the subnet with notation '/'.
3617 {"1.2.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0/25.2.0.192.in-addr.arpa."},
3618 {"1.0/25.2.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3619
3620 // The records for reverse querying "192.0.3.1" in the subnet with notation '-'.
3621 {"1.3.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0-127.3.0.192.in-addr.arpa."},
3622 {"1.0-127.3.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3623 };
3624
3625 test::DNSResponder dns;
3626 StartDns(dns, records);
3627 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3628
3629 for (const auto& address : {addr_slash, addr_hyphen}) {
3630 SCOPED_TRACE(address);
3631
3632 char host[NI_MAXHOST];
3633 sockaddr_in sin = {.sin_family = AF_INET};
3634 ASSERT_TRUE(inet_pton(AF_INET, address, &sin.sin_addr));
3635 int rv = getnameinfo((const sockaddr*)&sin, sizeof(sin), host, sizeof(host), nullptr, 0,
3636 NI_NAMEREQD);
3637 ASSERT_EQ(0, rv);
3638 EXPECT_STREQ("hello.example.com", host);
3639 }
3640}
3641
nuccachena26cc2a2018-07-17 18:07:23 +08003642TEST_F(ResolverTest, GetHostByName2_Dns64Synthesize) {
Xiao Ma09b71022018-12-11 17:56:32 +09003643 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003644 constexpr char dns64_name[] = "ipv4only.arpa.";
3645 constexpr char host_name[] = "ipv4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003646 const std::vector<DnsRecord> records = {
3647 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3648 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3649 };
nuccachena26cc2a2018-07-17 18:07:23 +08003650
Xiao Ma09b71022018-12-11 17:56:32 +09003651 test::DNSResponder dns(listen_addr);
3652 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003653 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003654 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003655
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003656 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003657 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003658 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003659
3660 // Query an IPv4-only hostname. Expect that gets a synthesized address.
3661 struct hostent* result = gethostbyname2("ipv4only", AF_INET6);
3662 ASSERT_TRUE(result != nullptr);
3663 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3664 std::string result_str = ToString(result);
3665 EXPECT_EQ(result_str, "64:ff9b::102:304");
3666}
nuccachena26cc2a2018-07-17 18:07:23 +08003667
3668TEST_F(ResolverTest, GetHostByName2_DnsQueryWithHavingNat64Prefix) {
3669 constexpr char dns64_name[] = "ipv4only.arpa.";
3670 constexpr char host_name[] = "v4v6.example.com.";
nuccachena26cc2a2018-07-17 18:07:23 +08003671 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003672 const std::vector<DnsRecord> records = {
3673 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3674 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3675 {host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
3676 };
3677
3678 test::DNSResponder dns(listen_addr);
3679 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003680 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003681 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003682
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003683 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003684 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003685 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003686
3687 // IPv4 DNS query. Prefix should have no effect on it.
3688 struct hostent* result = gethostbyname2("v4v6", AF_INET);
3689 ASSERT_TRUE(result != nullptr);
3690 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3691 std::string result_str = ToString(result);
3692 EXPECT_EQ(result_str, "1.2.3.4");
3693 dns.clearQueries();
3694
3695 // IPv6 DNS query. Prefix should have no effect on it.
3696 result = gethostbyname2("v4v6", AF_INET6);
3697 ASSERT_TRUE(result != nullptr);
3698 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3699 result_str = ToString(result);
3700 EXPECT_EQ(result_str, "2001:db8::102:304");
3701}
3702
3703TEST_F(ResolverTest, GetHostByName2_Dns64QuerySpecialUseIPv4Addresses) {
3704 constexpr char THIS_NETWORK[] = "this_network";
3705 constexpr char LOOPBACK[] = "loopback";
3706 constexpr char LINK_LOCAL[] = "link_local";
3707 constexpr char MULTICAST[] = "multicast";
3708 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
3709
3710 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
3711 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
3712 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
3713 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
3714 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
3715
3716 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003717 constexpr char dns64_name[] = "ipv4only.arpa.";
3718
Xiao Ma09b71022018-12-11 17:56:32 +09003719 test::DNSResponder dns(listen_addr);
3720 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003721 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003722 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003723
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003724 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003725 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003726 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003727
Luke Huangf8215372019-11-22 11:53:41 +08003728 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003729 static const struct TestConfig {
3730 std::string name;
3731 std::string addr;
3732
3733 std::string asHostName() const {
Luke Huangf8215372019-11-22 11:53:41 +08003734 return StringPrintf("%s.example.com.", name.c_str());
nuccachena26cc2a2018-07-17 18:07:23 +08003735 }
3736 } testConfigs[]{
3737 {THIS_NETWORK, ADDR_THIS_NETWORK},
3738 {LOOPBACK, ADDR_LOOPBACK},
3739 {LINK_LOCAL, ADDR_LINK_LOCAL},
3740 {MULTICAST, ADDR_MULTICAST},
3741 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
3742 };
Luke Huangf8215372019-11-22 11:53:41 +08003743 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003744
3745 for (const auto& config : testConfigs) {
3746 const std::string testHostName = config.asHostName();
3747 SCOPED_TRACE(testHostName);
3748
3749 const char* host_name = testHostName.c_str();
3750 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
3751
3752 struct hostent* result = gethostbyname2(config.name.c_str(), AF_INET6);
3753 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3754
3755 // In AF_INET6 case, don't synthesize special use IPv4 address.
3756 // Expect to have no answer
3757 EXPECT_EQ(nullptr, result);
3758
3759 dns.clearQueries();
3760 }
Bernie Innocenti2fef2b82018-12-20 15:56:40 +09003761}
Mike Yuf14e1a92019-05-10 13:54:58 +08003762
3763TEST_F(ResolverTest, PrefixDiscoveryBypassTls) {
3764 constexpr char listen_addr[] = "::1";
3765 constexpr char cleartext_port[] = "53";
3766 constexpr char tls_port[] = "853";
3767 constexpr char dns64_name[] = "ipv4only.arpa.";
3768 const std::vector<std::string> servers = {listen_addr};
3769
3770 test::DNSResponder dns(listen_addr);
3771 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
3772 test::DnsTlsFrontend tls(listen_addr, tls_port, listen_addr, cleartext_port);
3773 ASSERT_TRUE(tls.startServer());
3774
3775 // Setup OPPORTUNISTIC mode and wait for the validation complete.
waynema0e73c2e2019-07-31 15:04:08 +08003776 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08003777 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003778 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yuf14e1a92019-05-10 13:54:58 +08003779 tls.clearQueries();
3780
3781 // Start NAT64 prefix discovery and wait for it complete.
3782 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003783 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
Mike Yuf14e1a92019-05-10 13:54:58 +08003784
3785 // Verify it bypassed TLS even though there's a TLS server available.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003786 EXPECT_EQ(0, tls.queries()) << dns.dumpQueries();
3787 EXPECT_EQ(1U, GetNumQueries(dns, dns64_name)) << dns.dumpQueries();
Mike Yuf14e1a92019-05-10 13:54:58 +08003788
3789 // Restart the testing network to reset the cache.
3790 mDnsClient.TearDown();
3791 mDnsClient.SetUp();
3792 dns.clearQueries();
3793
3794 // Setup STRICT mode and wait for the validation complete.
waynema0e73c2e2019-07-31 15:04:08 +08003795 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
3796 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08003797 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003798 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yuf14e1a92019-05-10 13:54:58 +08003799 tls.clearQueries();
3800
3801 // Start NAT64 prefix discovery and wait for it to complete.
3802 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003803 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
Mike Yuf14e1a92019-05-10 13:54:58 +08003804
3805 // Verify it bypassed TLS despite STRICT mode.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003806 EXPECT_EQ(0, tls.queries()) << dns.dumpQueries();
3807 EXPECT_EQ(1U, GetNumQueries(dns, dns64_name)) << dns.dumpQueries();
Mike Yuf14e1a92019-05-10 13:54:58 +08003808}
Luke Huang9807e6b2019-05-20 16:17:12 +08003809
Lorenzo Colittie51091d2020-05-20 02:48:44 +09003810TEST_F(ResolverTest, SetAndClearNat64Prefix) {
3811 constexpr char host_name[] = "v4.example.com.";
3812 constexpr char listen_addr[] = "::1";
3813 const std::vector<DnsRecord> records = {
3814 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3815 };
3816 const std::string kNat64Prefix1 = "64:ff9b::/96";
3817 const std::string kNat64Prefix2 = "2001:db8:6464::/96";
3818
3819 test::DNSResponder dns(listen_addr);
3820 StartDns(dns, records);
3821 const std::vector<std::string> servers = {listen_addr};
3822 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
3823
3824 auto resolvService = mDnsClient.resolvService();
3825 addrinfo hints = {.ai_family = AF_INET6};
3826
3827 // No NAT64 prefix, no AAAA record.
3828 ScopedAddrinfo result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3829 ASSERT_TRUE(result == nullptr);
3830
3831 // Set the prefix, and expect to get a synthesized AAAA record.
3832 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix2).isOk());
3833 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3834 ASSERT_FALSE(result == nullptr);
3835 EXPECT_EQ("2001:db8:6464::102:304", ToString(result));
3836
3837 // Update the prefix, expect to see AAAA records from the new prefix.
3838 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3839 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3840 ASSERT_FALSE(result == nullptr);
3841 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3842
3843 // Non-/96 prefixes are ignored.
3844 auto status = resolvService->setPrefix64(TEST_NETID, "64:ff9b::/64");
3845 EXPECT_FALSE(status.isOk());
3846 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3847 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3848
3849 // Invalid prefixes are ignored.
3850 status = resolvService->setPrefix64(TEST_NETID, "192.0.2.0/24");
3851 EXPECT_FALSE(status.isOk());
3852 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3853 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3854
3855 status = resolvService->setPrefix64(TEST_NETID, "192.0.2.1");
3856 EXPECT_FALSE(status.isOk());
3857 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3858 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3859
3860 status = resolvService->setPrefix64(TEST_NETID, "hello");
3861 EXPECT_FALSE(status.isOk());
3862 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3863 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3864
3865 // DNS64 synthesis is still working.
3866 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3867 ASSERT_FALSE(result == nullptr);
3868 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3869
3870 // Clear the prefix. No AAAA records any more.
3871 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, "").isOk());
3872 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3873 EXPECT_TRUE(result == nullptr);
3874
3875 // Calling startPrefix64Discovery clears the prefix.
3876 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3877 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3878 ASSERT_FALSE(result == nullptr);
3879 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3880
3881 EXPECT_TRUE(resolvService->startPrefix64Discovery(TEST_NETID).isOk());
3882 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3883 ASSERT_TRUE(result == nullptr);
3884
3885 // setPrefix64 fails if prefix discovery is started, even if no prefix is yet discovered...
3886 status = resolvService->setPrefix64(TEST_NETID, kNat64Prefix1);
3887 EXPECT_FALSE(status.isOk());
3888 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3889 EXPECT_EQ(EEXIST, status.getServiceSpecificError());
3890
3891 // .. and clearing the prefix also has no effect.
3892 status = resolvService->setPrefix64(TEST_NETID, "");
3893 EXPECT_FALSE(status.isOk());
3894 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3895 EXPECT_EQ(ENOENT, status.getServiceSpecificError());
3896
3897 // setPrefix64 succeeds again when prefix discovery is stopped.
3898 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
3899 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3900 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3901 ASSERT_FALSE(result == nullptr);
3902 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3903
3904 // Calling stopPrefix64Discovery clears the prefix.
3905 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
3906 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3907 ASSERT_TRUE(result == nullptr);
3908
3909 // Set up NAT64 prefix discovery.
3910 constexpr char dns64_name[] = "ipv4only.arpa.";
3911 const std::vector<DnsRecord> newRecords = {
3912 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3913 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3914 };
3915 dns.stopServer();
3916 StartDns(dns, newRecords);
3917
3918 EXPECT_TRUE(resolvService->startPrefix64Discovery(TEST_NETID).isOk());
3919 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
3920 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3921 ASSERT_FALSE(result == nullptr);
3922 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3923
3924 // setPrefix64 fails if NAT64 prefix discovery has succeeded, and the discovered prefix
3925 // continues to be used.
3926 status = resolvService->setPrefix64(TEST_NETID, kNat64Prefix2);
3927 EXPECT_FALSE(status.isOk());
3928 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3929 EXPECT_EQ(EEXIST, status.getServiceSpecificError());
3930
3931 // Clearing the prefix also has no effect if discovery is started.
3932 status = resolvService->setPrefix64(TEST_NETID, "");
3933 EXPECT_FALSE(status.isOk());
3934 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3935 EXPECT_EQ(ENOENT, status.getServiceSpecificError());
3936
3937 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3938 ASSERT_FALSE(result == nullptr);
3939 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3940
3941 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
3942 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_NOT_FOUND));
Lorenzo Colitti61f796b2020-05-21 00:57:49 +09003943
3944 EXPECT_EQ(0, sDnsMetricsListener->getUnexpectedNat64PrefixUpdates());
Lorenzo Colittie51091d2020-05-20 02:48:44 +09003945}
3946
Luke Huang9807e6b2019-05-20 16:17:12 +08003947namespace {
3948
Luke Huang0d592bc2019-05-25 18:24:03 +08003949class ScopedSetNetworkForProcess {
3950 public:
3951 explicit ScopedSetNetworkForProcess(unsigned netId) {
3952 mStoredNetId = getNetworkForProcess();
3953 if (netId == mStoredNetId) return;
3954 EXPECT_EQ(0, setNetworkForProcess(netId));
3955 }
3956 ~ScopedSetNetworkForProcess() { EXPECT_EQ(0, setNetworkForProcess(mStoredNetId)); }
3957
3958 private:
3959 unsigned mStoredNetId;
3960};
3961
3962class ScopedSetNetworkForResolv {
3963 public:
3964 explicit ScopedSetNetworkForResolv(unsigned netId) { EXPECT_EQ(0, setNetworkForResolv(netId)); }
3965 ~ScopedSetNetworkForResolv() { EXPECT_EQ(0, setNetworkForResolv(NETID_UNSET)); }
3966};
3967
Luke Huang9807e6b2019-05-20 16:17:12 +08003968void sendCommand(int fd, const std::string& cmd) {
3969 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size() + 1));
3970 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size() + 1));
3971}
3972
3973int32_t readBE32(int fd) {
3974 int32_t tmp;
3975 int n = TEMP_FAILURE_RETRY(read(fd, &tmp, sizeof(tmp)));
3976 EXPECT_TRUE(n > 0);
3977 return ntohl(tmp);
3978}
3979
Luke Huang0d592bc2019-05-25 18:24:03 +08003980int readResponseCode(int fd) {
Luke Huang9807e6b2019-05-20 16:17:12 +08003981 char buf[4];
3982 int n = TEMP_FAILURE_RETRY(read(fd, &buf, sizeof(buf)));
3983 EXPECT_TRUE(n > 0);
3984 // The format of response code is that 4 bytes for the code & null.
3985 buf[3] = '\0';
3986 int result;
3987 EXPECT_TRUE(ParseInt(buf, &result));
3988 return result;
3989}
3990
Luke Huang0d592bc2019-05-25 18:24:03 +08003991bool checkAndClearUseLocalNameserversFlag(unsigned* netid) {
3992 if (netid == nullptr || ((*netid) & NETID_USE_LOCAL_NAMESERVERS) == 0) {
3993 return false;
3994 }
3995 *netid = (*netid) & ~NETID_USE_LOCAL_NAMESERVERS;
3996 return true;
3997}
3998
Luke Huangf8215372019-11-22 11:53:41 +08003999aidl::android::net::UidRangeParcel makeUidRangeParcel(int start, int stop) {
4000 aidl::android::net::UidRangeParcel res;
Luke Huang0d592bc2019-05-25 18:24:03 +08004001 res.start = start;
4002 res.stop = stop;
4003
4004 return res;
4005}
4006
4007void expectNetIdWithLocalNameserversFlag(unsigned netId) {
4008 unsigned dnsNetId = 0;
4009 EXPECT_EQ(0, getNetworkForDns(&dnsNetId));
4010 EXPECT_TRUE(checkAndClearUseLocalNameserversFlag(&dnsNetId));
4011 EXPECT_EQ(netId, static_cast<unsigned>(dnsNetId));
4012}
4013
4014void expectDnsNetIdEquals(unsigned netId) {
4015 unsigned dnsNetId = 0;
4016 EXPECT_EQ(0, getNetworkForDns(&dnsNetId));
4017 EXPECT_EQ(netId, static_cast<unsigned>(dnsNetId));
4018}
4019
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004020void expectDnsNetIdIsDefaultNetwork(INetd* netdService) {
Luke Huang0d592bc2019-05-25 18:24:03 +08004021 int currentNetid;
4022 EXPECT_TRUE(netdService->networkGetDefault(&currentNetid).isOk());
4023 expectDnsNetIdEquals(currentNetid);
4024}
4025
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004026void expectDnsNetIdWithVpn(INetd* netdService, unsigned vpnNetId, unsigned expectedNetId) {
Luke Huang0d592bc2019-05-25 18:24:03 +08004027 EXPECT_TRUE(netdService->networkCreateVpn(vpnNetId, false /* secure */).isOk());
4028 uid_t uid = getuid();
4029 // Add uid to VPN
4030 EXPECT_TRUE(netdService->networkAddUidRanges(vpnNetId, {makeUidRangeParcel(uid, uid)}).isOk());
4031 expectDnsNetIdEquals(expectedNetId);
4032 EXPECT_TRUE(netdService->networkDestroy(vpnNetId).isOk());
4033}
4034
Luke Huang9807e6b2019-05-20 16:17:12 +08004035} // namespace
4036
4037TEST_F(ResolverTest, getDnsNetId) {
4038 // We've called setNetworkForProcess in SetupOemNetwork, so reset to default first.
4039 setNetworkForProcess(NETID_UNSET);
Luke Huang0d592bc2019-05-25 18:24:03 +08004040
4041 expectDnsNetIdIsDefaultNetwork(mDnsClient.netdService());
4042 expectDnsNetIdWithVpn(mDnsClient.netdService(), TEST_VPN_NETID, TEST_VPN_NETID);
Luke Huang9807e6b2019-05-20 16:17:12 +08004043
4044 // Test with setNetworkForProcess
Luke Huang0d592bc2019-05-25 18:24:03 +08004045 {
4046 ScopedSetNetworkForProcess scopedSetNetworkForProcess(TEST_NETID);
4047 expectDnsNetIdEquals(TEST_NETID);
4048 }
4049
4050 // Test with setNetworkForProcess with NETID_USE_LOCAL_NAMESERVERS
4051 {
4052 ScopedSetNetworkForProcess scopedSetNetworkForProcess(TEST_NETID |
4053 NETID_USE_LOCAL_NAMESERVERS);
4054 expectNetIdWithLocalNameserversFlag(TEST_NETID);
4055 }
Luke Huang9807e6b2019-05-20 16:17:12 +08004056
4057 // Test with setNetworkForResolv
Luke Huang0d592bc2019-05-25 18:24:03 +08004058 {
4059 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID);
4060 expectDnsNetIdEquals(TEST_NETID);
4061 }
4062
4063 // Test with setNetworkForResolv with NETID_USE_LOCAL_NAMESERVERS
4064 {
4065 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID |
4066 NETID_USE_LOCAL_NAMESERVERS);
4067 expectNetIdWithLocalNameserversFlag(TEST_NETID);
4068 }
4069
4070 // Test with setNetworkForResolv under bypassable vpn
4071 {
4072 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID);
4073 expectDnsNetIdWithVpn(mDnsClient.netdService(), TEST_VPN_NETID, TEST_NETID);
4074 }
Luke Huang9807e6b2019-05-20 16:17:12 +08004075
4076 // Create socket connected to DnsProxyListener
4077 int fd = dns_open_proxy();
4078 EXPECT_TRUE(fd > 0);
4079 unique_fd ufd(fd);
4080
4081 // Test command with wrong netId
4082 sendCommand(fd, "getdnsnetid abc");
Luke Huang0d592bc2019-05-25 18:24:03 +08004083 EXPECT_EQ(ResponseCode::DnsProxyQueryResult, readResponseCode(fd));
Luke Huang9807e6b2019-05-20 16:17:12 +08004084 EXPECT_EQ(-EINVAL, readBE32(fd));
4085
4086 // Test unsupported command
4087 sendCommand(fd, "getdnsnetidNotSupported");
4088 // Keep in sync with FrameworkListener.cpp (500, "Command not recognized")
Luke Huang0d592bc2019-05-25 18:24:03 +08004089 EXPECT_EQ(500, readResponseCode(fd));
Luke Huang9807e6b2019-05-20 16:17:12 +08004090}
Sehee Park2c118782019-05-07 13:02:45 +09004091
4092TEST_F(ResolverTest, BlockDnsQueryWithUidRule) {
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004093 // This test relies on blocking traffic on loopback, which xt_qtaguid does not do.
4094 // See aosp/358413 and b/34444781 for why.
4095 SKIP_IF_BPF_NOT_SUPPORTED;
4096
Sehee Park2c118782019-05-07 13:02:45 +09004097 constexpr char listen_addr1[] = "127.0.0.4";
4098 constexpr char listen_addr2[] = "::1";
4099 constexpr char host_name[] = "howdy.example.com.";
4100 const std::vector<DnsRecord> records = {
4101 {host_name, ns_type::ns_t_a, "1.2.3.4"},
4102 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
4103 };
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004104 INetd* netdService = mDnsClient.netdService();
Sehee Park2c118782019-05-07 13:02:45 +09004105
4106 test::DNSResponder dns1(listen_addr1);
4107 test::DNSResponder dns2(listen_addr2);
4108 StartDns(dns1, records);
4109 StartDns(dns2, records);
4110
4111 std::vector<std::string> servers = {listen_addr1, listen_addr2};
4112 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
4113 dns1.clearQueries();
4114 dns2.clearQueries();
4115
Luke Huangeb618ef2020-05-26 14:17:02 +08004116 ScopeBlockedUIDRule scopeBlockUidRule(netdService, TEST_UID);
Sehee Park2c118782019-05-07 13:02:45 +09004117 // Dns Query
4118 int fd1 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_a, 0);
4119 int fd2 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_aaaa, 0);
4120 EXPECT_TRUE(fd1 != -1);
4121 EXPECT_TRUE(fd2 != -1);
4122
4123 uint8_t buf[MAXPACKET] = {};
4124 int rcode;
4125 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
4126 EXPECT_EQ(-ECONNREFUSED, res);
4127
4128 memset(buf, 0, MAXPACKET);
4129 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
4130 EXPECT_EQ(-ECONNREFUSED, res);
Mike Yu532405f2020-06-17 17:46:44 +08004131
4132 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, EAI_SYSTEM, "howdy.example.com", {});
4133 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, EAI_SYSTEM, "howdy.example.com", {});
Sehee Park2c118782019-05-07 13:02:45 +09004134}
Mike Yua772c202019-09-23 17:47:21 +08004135
Ken Chenbc481b82020-05-21 23:30:01 +08004136TEST_F(ResolverTest, EnforceDnsUid) {
4137 SKIP_IF_BPF_NOT_SUPPORTED;
4138
4139 constexpr char listen_addr1[] = "127.0.0.4";
4140 constexpr char listen_addr2[] = "::1";
4141 constexpr char host_name[] = "howdy.example.com.";
4142 const std::vector<DnsRecord> records = {
4143 {host_name, ns_type::ns_t_a, "1.2.3.4"},
4144 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
4145 };
4146 INetd* netdService = mDnsClient.netdService();
4147
4148 test::DNSResponder dns1(listen_addr1);
4149 test::DNSResponder dns2(listen_addr2);
4150 StartDns(dns1, records);
4151 StartDns(dns2, records);
4152
4153 // switch uid of DNS queries from applications to AID_DNS
4154 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4155 parcel.servers = {listen_addr1, listen_addr2};
4156 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk());
4157
4158 uint8_t buf[MAXPACKET] = {};
4159 int rcode;
4160 {
4161 ScopeBlockedUIDRule scopeBlockUidRule(netdService, TEST_UID);
4162 // Dns Queries should be blocked
4163 int fd1 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_a, 0);
4164 int fd2 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_aaaa, 0);
4165 EXPECT_TRUE(fd1 != -1);
4166 EXPECT_TRUE(fd2 != -1);
4167
4168 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
4169 EXPECT_EQ(-ECONNREFUSED, res);
4170
4171 memset(buf, 0, MAXPACKET);
4172 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
4173 EXPECT_EQ(-ECONNREFUSED, res);
4174 }
4175
4176 parcel.resolverOptions.enforceDnsUid = true;
4177 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk());
4178 {
4179 ScopeBlockedUIDRule scopeBlockUidRule(netdService, TEST_UID);
4180 // Dns Queries should NOT be blocked
4181 int fd1 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_a, 0);
4182 int fd2 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_aaaa, 0);
4183 EXPECT_TRUE(fd1 != -1);
4184 EXPECT_TRUE(fd2 != -1);
4185
4186 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
4187 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
4188
4189 memset(buf, 0, MAXPACKET);
4190 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
4191 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
4192
4193 // @TODO: So far we know that uid of DNS queries are no more set to DNS requester. But we
4194 // don't check if they are actually being set to AID_DNS, because system uids are always
4195 // allowed in bpf_owner_match(). Audit by firewallSetUidRule(AID_DNS) + sending queries is
4196 // infeasible. Fix it if the behavior of bpf_owner_match() is changed in the future, or if
4197 // we have better idea to deal with this.
4198 }
4199}
4200
Mike Yua772c202019-09-23 17:47:21 +08004201TEST_F(ResolverTest, ConnectTlsServerTimeout) {
Mike Yu61d17262020-02-15 18:56:22 +08004202 const std::string kDotConnectTimeoutMsFlag(
4203 "persist.device_config.netd_native.dot_connect_timeout_ms");
Mike Yu40e67072019-10-09 21:14:09 +08004204 constexpr int expectedTimeout = 1000;
4205 constexpr char hostname1[] = "query1.example.com.";
4206 constexpr char hostname2[] = "query2.example.com.";
Mike Yua772c202019-09-23 17:47:21 +08004207 const std::vector<DnsRecord> records = {
Mike Yu40e67072019-10-09 21:14:09 +08004208 {hostname1, ns_type::ns_t_a, "1.2.3.4"},
4209 {hostname2, ns_type::ns_t_a, "1.2.3.5"},
Mike Yua772c202019-09-23 17:47:21 +08004210 };
4211
4212 test::DNSResponder dns;
4213 StartDns(dns, records);
Mike Yu40e67072019-10-09 21:14:09 +08004214 test::DnsTlsFrontend tls;
Mike Yua772c202019-09-23 17:47:21 +08004215 ASSERT_TRUE(tls.startServer());
4216
Mike Yu40e67072019-10-09 21:14:09 +08004217 // The resolver will adjust the timeout value to 1000ms since the value is too small.
4218 ScopedSystemProperties scopedSystemProperties(kDotConnectTimeoutMsFlag, "100");
Mike Yua772c202019-09-23 17:47:21 +08004219
Mike Yu40e67072019-10-09 21:14:09 +08004220 // Set up resolver to opportunistic mode with the default configuration.
Mike Yu8ac63402019-12-02 15:28:38 +08004221 const ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
Mike Yu40e67072019-10-09 21:14:09 +08004222 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
Mike Yua772c202019-09-23 17:47:21 +08004223 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09004224 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yua772c202019-09-23 17:47:21 +08004225 tls.clearQueries();
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09004226 dns.clearQueries();
Mike Yua772c202019-09-23 17:47:21 +08004227
4228 // The server becomes unresponsive to the handshake request.
4229 tls.setHangOnHandshakeForTesting(true);
4230
4231 // Expect the things happening in getaddrinfo():
4232 // 1. Connect to the private DNS server.
4233 // 2. SSL handshake times out.
4234 // 3. Fallback to UDP transport, and then get the answer.
Mike Yu40e67072019-10-09 21:14:09 +08004235 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4236 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(hostname1, nullptr, hints);
Mike Yua772c202019-09-23 17:47:21 +08004237
Mike Yu40e67072019-10-09 21:14:09 +08004238 EXPECT_NE(nullptr, result);
Mike Yua772c202019-09-23 17:47:21 +08004239 EXPECT_EQ(0, tls.queries());
Mike Yu40e67072019-10-09 21:14:09 +08004240 EXPECT_EQ(1U, GetNumQueries(dns, hostname1));
4241 EXPECT_EQ(records.at(0).addr, ToString(result));
Mike Yua772c202019-09-23 17:47:21 +08004242
Mike Yu40e67072019-10-09 21:14:09 +08004243 // A loose upper bound is set by adding 2000ms buffer time. Theoretically, getaddrinfo()
4244 // should just take a bit more than expetTimeout milliseconds.
4245 EXPECT_GE(timeTakenMs, expectedTimeout);
4246 EXPECT_LE(timeTakenMs, expectedTimeout + 2000);
4247
4248 // Set the server to be responsive. Verify that the resolver will attempt to reconnect
4249 // to the server and then get the result within the timeout.
4250 tls.setHangOnHandshakeForTesting(false);
4251 std::tie(result, timeTakenMs) = safe_getaddrinfo_time_taken(hostname2, nullptr, hints);
4252
4253 EXPECT_NE(nullptr, result);
Luke Huang0a0870d2020-02-12 20:41:10 +08004254 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yu40e67072019-10-09 21:14:09 +08004255 EXPECT_EQ(1U, GetNumQueries(dns, hostname2));
4256 EXPECT_EQ(records.at(1).addr, ToString(result));
4257
4258 EXPECT_LE(timeTakenMs, expectedTimeout);
Mike Yua772c202019-09-23 17:47:21 +08004259}
Hungming Chenbb90ab32019-10-28 18:20:31 +08004260
Ken Chen766feae2019-10-30 15:13:44 +08004261TEST_F(ResolverTest, FlushNetworkCache) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004262 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004263 test::DNSResponder dns;
4264 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4265 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4266
4267 const hostent* result = gethostbyname("hello");
4268 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4269
4270 // get result from cache
4271 result = gethostbyname("hello");
4272 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4273
4274 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4275
4276 result = gethostbyname("hello");
4277 EXPECT_EQ(2U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4278}
4279
4280TEST_F(ResolverTest, FlushNetworkCache_random) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004281 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004282 constexpr int num_flush = 10;
4283 constexpr int num_queries = 20;
4284 test::DNSResponder dns;
4285 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4286 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4287 const addrinfo hints = {.ai_family = AF_INET};
4288
4289 std::thread t([this]() {
4290 for (int i = 0; i < num_flush; ++i) {
4291 unsigned delay = arc4random_uniform(10 * 1000); // 10ms
4292 usleep(delay);
4293 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4294 }
4295 });
4296
4297 for (int i = 0; i < num_queries; ++i) {
4298 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4299 EXPECT_TRUE(result != nullptr);
4300 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4301 }
4302 t.join();
4303}
4304
4305// flush cache while one query is wait-for-response, another is pending.
4306TEST_F(ResolverTest, FlushNetworkCache_concurrent) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004307 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004308 const char* listen_addr1 = "127.0.0.9";
4309 const char* listen_addr2 = "127.0.0.10";
4310 test::DNSResponder dns1(listen_addr1);
4311 test::DNSResponder dns2(listen_addr2);
4312 StartDns(dns1, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4313 StartDns(dns2, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4314 addrinfo hints = {.ai_family = AF_INET};
4315
4316 // step 1: set server#1 into deferred responding mode
4317 dns1.setDeferredResp(true);
4318 std::thread t1([&listen_addr1, &hints, this]() {
4319 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr1}));
4320 // step 3: query
4321 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4322 // step 9: check result
4323 EXPECT_TRUE(result != nullptr);
4324 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4325 });
4326
4327 // step 2: wait for the query to reach the server
4328 while (GetNumQueries(dns1, kHelloExampleCom) == 0) {
4329 usleep(1000); // 1ms
4330 }
4331
4332 std::thread t2([&listen_addr2, &hints, &dns2, this]() {
4333 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr2}));
4334 // step 5: query (should be blocked in resolver)
4335 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4336 // step 7: check result
4337 EXPECT_TRUE(result != nullptr);
4338 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4339 EXPECT_EQ(1U, GetNumQueriesForType(dns2, ns_type::ns_t_a, kHelloExampleCom));
4340 });
4341
4342 // step 4: wait a bit for the 2nd query to enter pending state
4343 usleep(100 * 1000); // 100ms
4344 // step 6: flush cache (will unblock pending queries)
4345 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4346 t2.join();
4347
4348 // step 8: resume server#1
4349 dns1.setDeferredResp(false);
4350 t1.join();
4351
4352 // step 10: verify if result is correctly cached
4353 dns2.clearQueries();
4354 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4355 EXPECT_EQ(0U, GetNumQueries(dns2, kHelloExampleCom));
4356 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4357}
4358
waynema29253052019-08-20 11:26:08 +08004359// TODO: Perhaps to have a boundary conditions test for TCP and UDP.
4360TEST_F(ResolverTest, TcpQueryWithOversizePayload) {
4361 test::DNSResponder dns;
4362 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4363 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4364
4365 int fd = dns_open_proxy();
4366 ASSERT_TRUE(fd > 0);
4367
4368 // Sending DNS query over TCP once the packet sizes exceed 512 bytes.
4369 // The raw data is combined with Question section and Additional section
4370 // Question section : query "hello.example.com", type A, class IN
4371 // Additional section : type OPT (41), Option PADDING, Option Length 546
4372 // Padding option which allows DNS clients and servers to artificially
4373 // increase the size of a DNS message by a variable number of bytes.
4374 // See also RFC7830, section 3
4375 const std::string query =
4376 "+c0BAAABAAAAAAABBWhlbGxvB2V4YW1wbGUDY29tAAABAAEAACkgAAAAgAACJgAMAiIAAAAAAAAAAAAAAAAAA"
4377 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4378 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4379 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4380 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4381 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4382 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4383 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4384 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4385 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
4386 const std::string cmd =
4387 "resnsend " + std::to_string(TEST_NETID) + " 0 " /* ResNsendFlags */ + query + '\0';
4388 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
4389 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
4390 expectAnswersValid(fd, AF_INET, kHelloExampleComAddrV4);
4391 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom));
4392 EXPECT_EQ(0U, GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom));
4393}
4394
Ken Chen99344882020-01-01 14:59:38 +08004395TEST_F(ResolverTest, TruncatedRspMode) {
4396 constexpr char listen_addr[] = "127.0.0.4";
4397 constexpr char listen_addr2[] = "127.0.0.5";
4398 constexpr char listen_srv[] = "53";
4399
4400 test::DNSResponder dns(listen_addr, listen_srv, static_cast<ns_rcode>(-1));
4401 test::DNSResponder dns2(listen_addr2, listen_srv, static_cast<ns_rcode>(-1));
4402 // dns supports UDP only, dns2 support UDP and TCP
4403 dns.setResponseProbability(0.0, IPPROTO_TCP);
4404 StartDns(dns, kLargeCnameChainRecords);
4405 StartDns(dns2, kLargeCnameChainRecords);
4406
4407 const struct TestConfig {
4408 const std::optional<int32_t> tcMode;
4409 const bool ret;
4410 const unsigned numQueries;
4411 std::string asParameters() const {
4412 return StringPrintf("tcMode: %d, ret: %s, numQueries: %u", tcMode.value_or(-1),
4413 ret ? "true" : "false", numQueries);
4414 }
4415 } testConfigs[]{
4416 // clang-format off
4417 {std::nullopt, true, 0}, /* mode unset */
4418 {aidl::android::net::IDnsResolver::TC_MODE_DEFAULT, true, 0}, /* default mode */
4419 {aidl::android::net::IDnsResolver::TC_MODE_UDP_TCP, true, 1}, /* alternative mode */
4420 {-666, false, 1}, /* invalid input */
4421 // clang-format on
4422 };
4423
4424 for (const auto& config : testConfigs) {
4425 SCOPED_TRACE(config.asParameters());
4426
4427 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4428 parcel.servers = {listen_addr, listen_addr2};
4429 if (config.tcMode) {
Ken Chena6ac2a62020-04-07 17:25:56 +08004430 parcel.resolverOptions.tcMode = config.tcMode.value();
Ken Chen99344882020-01-01 14:59:38 +08004431 }
4432 ASSERT_EQ(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk(), config.ret);
4433
4434 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4435 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4436 ASSERT_TRUE(result != nullptr);
4437 EXPECT_EQ(ToString(result), kHelloExampleComAddrV4);
4438 // TC_MODE_DEFAULT: resolver retries on TCP-only on each name server.
4439 // TC_MODE_UDP_TCP: resolver retries on TCP on the same server, falls back to UDP from next.
4440 ASSERT_EQ(GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom), 1U);
4441 ASSERT_EQ(GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom), 1U);
4442 ASSERT_EQ(GetNumQueriesForProtocol(dns2, IPPROTO_UDP, kHelloExampleCom), config.numQueries);
4443 ASSERT_EQ(GetNumQueriesForProtocol(dns2, IPPROTO_TCP, kHelloExampleCom), 1U);
4444
4445 dns.clearQueries();
4446 dns2.clearQueries();
4447 ASSERT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
Mike Yu61d17262020-02-15 18:56:22 +08004448
4449 // Clear the stats to make the resolver always choose the same server for the first query.
4450 parcel.servers.clear();
4451 parcel.tlsServers.clear();
4452 ASSERT_EQ(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk(), config.ret);
Ken Chen99344882020-01-01 14:59:38 +08004453 }
4454}
4455
Mike Yu153b5b82020-03-04 19:53:54 +08004456TEST_F(ResolverTest, RepeatedSetup_ResolverStatusRemains) {
4457 constexpr char unusable_listen_addr[] = "127.0.0.3";
4458 constexpr char listen_addr[] = "127.0.0.4";
4459 constexpr char hostname[] = "a.hello.query.";
4460 const auto repeatedSetResolversFromParcel = [&](const ResolverParamsParcel& parcel) {
4461 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4462 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4463 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4464 };
4465
4466 test::DNSResponder dns(listen_addr);
4467 StartDns(dns, {{hostname, ns_type::ns_t_a, "1.2.3.3"}});
4468 test::DnsTlsFrontend tls1(listen_addr, "853", listen_addr, "53");
4469 ASSERT_TRUE(tls1.startServer());
4470
4471 // Private DNS off mode.
4472 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4473 parcel.servers = {unusable_listen_addr, listen_addr};
4474 parcel.tlsServers.clear();
4475 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4476
4477 // Send a query.
4478 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4479 EXPECT_NE(safe_getaddrinfo(hostname, nullptr, &hints), nullptr);
4480
4481 // Check the stats as expected.
4482 const std::vector<NameserverStats> expectedCleartextDnsStats = {
4483 NameserverStats(unusable_listen_addr).setInternalErrors(1),
4484 NameserverStats(listen_addr).setSuccesses(1),
4485 };
Mike Yu61d17262020-02-15 18:56:22 +08004486 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu153b5b82020-03-04 19:53:54 +08004487 EXPECT_EQ(GetNumQueries(dns, hostname), 1U);
4488
4489 // The stats is supposed to remain as long as the list of cleartext DNS servers is unchanged.
4490 static const struct TestConfig {
4491 std::vector<std::string> servers;
4492 std::vector<std::string> tlsServers;
4493 std::string tlsName;
4494 } testConfigs[] = {
4495 // Private DNS opportunistic mode.
4496 {{listen_addr, unusable_listen_addr}, {listen_addr, unusable_listen_addr}, ""},
4497 {{unusable_listen_addr, listen_addr}, {unusable_listen_addr, listen_addr}, ""},
4498
4499 // Private DNS strict mode.
4500 {{listen_addr, unusable_listen_addr}, {"127.0.0.100"}, kDefaultPrivateDnsHostName},
4501 {{unusable_listen_addr, listen_addr}, {"127.0.0.100"}, kDefaultPrivateDnsHostName},
4502
4503 // Private DNS off mode.
4504 {{unusable_listen_addr, listen_addr}, {}, ""},
4505 {{listen_addr, unusable_listen_addr}, {}, ""},
4506 };
4507
4508 for (const auto& config : testConfigs) {
4509 SCOPED_TRACE(fmt::format("testConfig: [{}] [{}] [{}]", fmt::join(config.servers, ","),
4510 fmt::join(config.tlsServers, ","), config.tlsName));
4511 parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4512 parcel.servers = config.servers;
4513 parcel.tlsServers = config.tlsServers;
4514 parcel.tlsName = config.tlsName;
4515 repeatedSetResolversFromParcel(parcel);
Mike Yu61d17262020-02-15 18:56:22 +08004516 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu153b5b82020-03-04 19:53:54 +08004517
4518 // The stats remains when the list of search domains changes.
4519 parcel.domains.push_back("tmp.domains");
4520 repeatedSetResolversFromParcel(parcel);
Mike Yu61d17262020-02-15 18:56:22 +08004521 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu153b5b82020-03-04 19:53:54 +08004522
4523 // The stats remains when the parameters change (except maxSamples).
4524 parcel.sampleValiditySeconds++;
4525 parcel.successThreshold++;
4526 parcel.minSamples++;
4527 parcel.baseTimeoutMsec++;
4528 parcel.retryCount++;
4529 repeatedSetResolversFromParcel(parcel);
Mike Yu61d17262020-02-15 18:56:22 +08004530 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu153b5b82020-03-04 19:53:54 +08004531 }
4532
4533 // The cache remains.
4534 EXPECT_NE(safe_getaddrinfo(hostname, nullptr, &hints), nullptr);
4535 EXPECT_EQ(GetNumQueries(dns, hostname), 1U);
4536}
4537
4538TEST_F(ResolverTest, RepeatedSetup_NoRedundantPrivateDnsValidation) {
4539 const std::string addr1 = getUniqueIPv4Address(); // For a workable DNS server.
4540 const std::string addr2 = getUniqueIPv4Address(); // For an unresponsive DNS server.
4541 const std::string unusable_addr = getUniqueIPv4Address();
Mike Yubc4b9502020-03-20 13:14:00 +08004542 const auto waitForPrivateDnsStateUpdated = []() {
4543 // A buffer time for the PrivateDnsConfiguration instance to update its map,
4544 // mPrivateDnsValidateThreads, which is used for tracking validation threads.
4545 // Since there is a time gap between when PrivateDnsConfiguration reports
4546 // onPrivateDnsValidationEvent and when PrivateDnsConfiguration updates the map, this is a
4547 // workaround to avoid the test starts a subsequent resolver setup during the time gap.
4548 // TODO: Report onPrivateDnsValidationEvent after all the relevant updates are complete.
4549 // Reference to b/152009023.
4550 std::this_thread::sleep_for(20ms);
4551 };
Mike Yu153b5b82020-03-04 19:53:54 +08004552
4553 test::DNSResponder dns1(addr1);
4554 test::DNSResponder dns2(addr2);
4555 StartDns(dns1, {});
4556 StartDns(dns2, {});
4557 test::DnsTlsFrontend workableTls(addr1, "853", addr1, "53");
4558 test::DnsTlsFrontend unresponsiveTls(addr2, "853", addr2, "53");
4559 unresponsiveTls.setHangOnHandshakeForTesting(true);
4560 ASSERT_TRUE(workableTls.startServer());
4561 ASSERT_TRUE(unresponsiveTls.startServer());
4562
4563 // First setup.
4564 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4565 parcel.servers = {addr1, addr2, unusable_addr};
4566 parcel.tlsServers = {addr1, addr2, unusable_addr};
4567 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4568
4569 // Check the validation results.
4570 EXPECT_TRUE(WaitForPrivateDnsValidation(workableTls.listen_address(), true));
4571 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4572 EXPECT_EQ(unresponsiveTls.acceptConnectionsCount(), 1); // The validation is still in progress.
4573
4574 static const struct TestConfig {
4575 std::vector<std::string> tlsServers;
4576 std::string tlsName;
4577 } testConfigs[] = {
4578 {{addr1, addr2, unusable_addr}, ""},
4579 {{unusable_addr, addr1, addr2}, ""},
4580 {{unusable_addr, addr1, addr2}, kDefaultPrivateDnsHostName},
4581 {{addr1, addr2, unusable_addr}, kDefaultPrivateDnsHostName},
4582 };
4583
4584 std::string TlsNameLastTime;
4585 for (const auto& config : testConfigs) {
4586 SCOPED_TRACE(fmt::format("testConfig: [{}] [{}]", fmt::join(config.tlsServers, ","),
4587 config.tlsName));
4588 parcel.servers = config.tlsServers;
4589 parcel.tlsServers = config.tlsServers;
4590 parcel.tlsName = config.tlsName;
4591 parcel.caCertificate = config.tlsName.empty() ? "" : kCaCert;
4592
4593 const bool dnsModeChanged = (TlsNameLastTime != config.tlsName);
Mike Yubc4b9502020-03-20 13:14:00 +08004594
4595 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004596 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4597
4598 for (const auto& serverAddr : parcel.tlsServers) {
4599 SCOPED_TRACE(serverAddr);
4600 if (serverAddr == workableTls.listen_address()) {
4601 if (dnsModeChanged) {
4602 // In despite of the identical IP address, the server is regarded as a different
4603 // server when DnsTlsServer.name is different. The resolver treats it as a
4604 // different object and begins the validation process.
4605 EXPECT_TRUE(WaitForPrivateDnsValidation(serverAddr, true));
4606 }
4607 } else if (serverAddr == unresponsiveTls.listen_address()) {
4608 // No revalidation needed for the server which have been marked as in_progesss.
4609 } else {
4610 // Must be unusable_addr.
4611 // In opportunistic mode, when a validation for a private DNS server fails, the
4612 // resolver just marks the server as failed and doesn't re-evaluate it, but the
4613 // server can be re-evaluated when setResolverConfiguration() is called.
4614 // However, in strict mode, the resolver automatically re-evaluates the server and
4615 // marks the server as in_progress until the validation succeeds, so repeated setup
4616 // makes no effect.
4617 if (dnsModeChanged || config.tlsName.empty() /* not in strict mode */) {
4618 EXPECT_TRUE(WaitForPrivateDnsValidation(serverAddr, false));
4619 }
4620 }
4621 }
4622
4623 // Repeated setups make no effect in strict mode.
Mike Yubc4b9502020-03-20 13:14:00 +08004624 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004625 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4626 if (config.tlsName.empty()) {
4627 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4628 }
Mike Yubc4b9502020-03-20 13:14:00 +08004629 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004630 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4631 if (config.tlsName.empty()) {
4632 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4633 }
4634
4635 EXPECT_EQ(unresponsiveTls.acceptConnectionsCount(), 1);
4636
4637 TlsNameLastTime = config.tlsName;
4638 }
4639
4640 // Check that all the validation results are caught.
4641 // Note: it doesn't mean no validation being in progress.
4642 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr1));
4643 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr2));
4644 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(unusable_addr));
4645}
4646
4647TEST_F(ResolverTest, RepeatedSetup_KeepChangingPrivateDnsServers) {
4648 enum TlsServerState { WORKING, UNSUPPORTED, UNRESPONSIVE };
4649 const std::string addr1 = getUniqueIPv4Address();
4650 const std::string addr2 = getUniqueIPv4Address();
Mike Yu9a185882020-03-25 16:02:36 +08004651 const auto waitForPrivateDnsStateUpdated = []() {
4652 // A buffer time for PrivateDnsConfiguration to update its state. It prevents this test
4653 // being flaky. See b/152009023 for the reason.
4654 std::this_thread::sleep_for(20ms);
4655 };
Mike Yu153b5b82020-03-04 19:53:54 +08004656
4657 test::DNSResponder dns1(addr1);
4658 test::DNSResponder dns2(addr2);
4659 StartDns(dns1, {});
4660 StartDns(dns2, {});
4661 test::DnsTlsFrontend tls1(addr1, "853", addr1, "53");
4662 test::DnsTlsFrontend tls2(addr2, "853", addr2, "53");
4663 ASSERT_TRUE(tls1.startServer());
4664 ASSERT_TRUE(tls2.startServer());
4665
4666 static const struct TestConfig {
4667 std::string tlsServer;
4668 std::string tlsName;
4669 bool expectNothingHappenWhenServerUnsupported;
4670 bool expectNothingHappenWhenServerUnresponsive;
4671 std::string asTestName() const {
4672 return fmt::format("{}, {}, {}, {}", tlsServer, tlsName,
4673 expectNothingHappenWhenServerUnsupported,
4674 expectNothingHappenWhenServerUnresponsive);
4675 }
4676 } testConfigs[] = {
4677 {{addr1}, "", false, false},
4678 {{addr2}, "", false, false},
4679 {{addr1}, "", false, true},
4680 {{addr2}, "", false, true},
4681 {{addr1}, kDefaultPrivateDnsHostName, false, true},
4682 {{addr2}, kDefaultPrivateDnsHostName, false, true},
4683 {{addr1}, kDefaultPrivateDnsHostName, true, true},
4684 {{addr2}, kDefaultPrivateDnsHostName, true, true},
4685
4686 // There's no new validation to start because there are already two validation threads
4687 // running (one is for addr1, the other is for addr2). This is because the comparator
4688 // doesn't compare DnsTlsServer.name. Keep the design as-is until it's known to be
4689 // harmful.
4690 {{addr1}, "", true, true},
4691 {{addr2}, "", true, true},
4692 {{addr1}, "", true, true},
4693 {{addr2}, "", true, true},
4694 };
4695
4696 for (const auto& serverState : {WORKING, UNSUPPORTED, UNRESPONSIVE}) {
4697 int testIndex = 0;
4698 for (const auto& config : testConfigs) {
4699 SCOPED_TRACE(fmt::format("serverState:{} testIndex:{} testConfig:[{}]", serverState,
4700 testIndex++, config.asTestName()));
4701 auto& tls = (config.tlsServer == addr1) ? tls1 : tls2;
4702
4703 if (serverState == UNSUPPORTED && tls.running()) ASSERT_TRUE(tls.stopServer());
4704 if (serverState != UNSUPPORTED && !tls.running()) ASSERT_TRUE(tls.startServer());
4705
4706 tls.setHangOnHandshakeForTesting(serverState == UNRESPONSIVE);
4707 const int connectCountsBefore = tls.acceptConnectionsCount();
4708
Mike Yu9a185882020-03-25 16:02:36 +08004709 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004710 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4711 parcel.servers = {config.tlsServer};
4712 parcel.tlsServers = {config.tlsServer};
4713 parcel.tlsName = config.tlsName;
4714 parcel.caCertificate = config.tlsName.empty() ? "" : kCaCert;
4715 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4716
4717 if (serverState == WORKING) {
4718 EXPECT_TRUE(WaitForPrivateDnsValidation(config.tlsServer, true));
4719 } else if (serverState == UNSUPPORTED) {
4720 if (config.expectNothingHappenWhenServerUnsupported) {
4721 // It's possible that the resolver hasn't yet started to
4722 // connect. Wait a while.
4723 // TODO: See if we can get rid of the hard waiting time, such as comparing
4724 // the CountDiff across two tests.
4725 std::this_thread::sleep_for(100ms);
4726 EXPECT_EQ(tls.acceptConnectionsCount(), connectCountsBefore);
4727 } else {
4728 EXPECT_TRUE(WaitForPrivateDnsValidation(config.tlsServer, false));
4729 }
4730 } else {
4731 // Must be UNRESPONSIVE.
4732 // DnsTlsFrontend is the only signal for checking whether or not the resolver starts
4733 // another validation when the server is unresponsive.
4734 const int expectCountDiff =
4735 config.expectNothingHappenWhenServerUnresponsive ? 0 : 1;
4736 if (expectCountDiff == 0) {
4737 // It's possible that the resolver hasn't yet started to
4738 // connect. Wait a while.
4739 std::this_thread::sleep_for(100ms);
4740 }
4741 const auto condition = [&]() {
4742 return tls.acceptConnectionsCount() == connectCountsBefore + expectCountDiff;
4743 };
4744 EXPECT_TRUE(PollForCondition(condition));
4745 }
4746 }
4747
4748 // Set to off mode to reset the PrivateDnsConfiguration state.
4749 ResolverParamsParcel setupOffmode = DnsResponderClient::GetDefaultResolverParamsParcel();
4750 setupOffmode.tlsServers.clear();
4751 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(setupOffmode));
4752 }
4753
4754 // Check that all the validation results are caught.
4755 // Note: it doesn't mean no validation being in progress.
4756 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr1));
4757 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr2));
4758}
4759
Ken Chen26dc2b02020-06-16 18:49:39 +08004760TEST_F(ResolverTest, PermissionCheckOnCertificateInjection) {
4761 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4762 parcel.caCertificate = kCaCert;
4763 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk());
4764
4765 for (const uid_t uid : {AID_SYSTEM, TEST_UID}) {
4766 ScopedChangeUID scopedChangeUID(uid);
4767 auto status = mDnsClient.resolvService()->setResolverConfiguration(parcel);
4768 EXPECT_EQ(status.getExceptionCode(), EX_SECURITY);
4769 }
4770}
4771
Hungming Chenbb90ab32019-10-28 18:20:31 +08004772// Parameterized tests.
4773// TODO: Merge the existing tests as parameterized test if possible.
4774// TODO: Perhaps move parameterized tests to an independent file.
4775enum class CallType { GETADDRINFO, GETHOSTBYNAME };
4776class ResolverParameterizedTest : public ResolverTest,
Hungming Chen63779052019-10-30 15:06:13 +08004777 public testing::WithParamInterface<CallType> {
4778 protected:
Hungming Chen22617fd2019-12-06 12:15:45 +08004779 void VerifyQueryHelloExampleComV4(const test::DNSResponder& dns, const CallType calltype,
4780 const bool verifyNumQueries = true) {
Hungming Chen63779052019-10-30 15:06:13 +08004781 if (calltype == CallType::GETADDRINFO) {
4782 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4783 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4784 ASSERT_TRUE(result != nullptr);
4785 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4786 } else if (calltype == CallType::GETHOSTBYNAME) {
4787 const hostent* result = gethostbyname("hello");
4788 ASSERT_TRUE(result != nullptr);
4789 ASSERT_EQ(4, result->h_length);
4790 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
4791 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4792 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
4793 } else {
4794 FAIL() << "Unsupported call type: " << static_cast<uint32_t>(calltype);
4795 }
Hungming Chen22617fd2019-12-06 12:15:45 +08004796 if (verifyNumQueries) EXPECT_EQ(1U, GetNumQueries(dns, kHelloExampleCom));
Hungming Chen63779052019-10-30 15:06:13 +08004797 }
4798};
Hungming Chenbb90ab32019-10-28 18:20:31 +08004799
Hungming Chen63779052019-10-30 15:06:13 +08004800INSTANTIATE_TEST_SUITE_P(QueryCallTest, ResolverParameterizedTest,
Hungming Chenbb90ab32019-10-28 18:20:31 +08004801 testing::Values(CallType::GETADDRINFO, CallType::GETHOSTBYNAME),
4802 [](const testing::TestParamInfo<CallType>& info) {
Hungming Chenbb90ab32019-10-28 18:20:31 +08004803 switch (info.param) {
4804 case CallType::GETADDRINFO:
Hungming Chen63779052019-10-30 15:06:13 +08004805 return "GetAddrInfo";
Hungming Chenbb90ab32019-10-28 18:20:31 +08004806 case CallType::GETHOSTBYNAME:
Hungming Chen63779052019-10-30 15:06:13 +08004807 return "GetHostByName";
Hungming Chenbb90ab32019-10-28 18:20:31 +08004808 default:
Hungming Chen63779052019-10-30 15:06:13 +08004809 return "InvalidParameter"; // Should not happen.
Hungming Chenbb90ab32019-10-28 18:20:31 +08004810 }
Hungming Chenbb90ab32019-10-28 18:20:31 +08004811 });
4812
4813TEST_P(ResolverParameterizedTest, AuthoritySectionAndAdditionalSection) {
4814 // DNS response may have more information in authority section and additional section.
4815 // Currently, getanswer() of packages/modules/DnsResolver/getaddrinfo.cpp doesn't parse the
4816 // content of authority section and additional section. Test these sections if they crash
4817 // the resolver, just in case. See also RFC 1035 section 4.1.
4818 const auto& calltype = GetParam();
4819 test::DNSHeader header(kDefaultDnsHeader);
4820
4821 // Create a DNS response which has a authoritative nameserver record in authority
4822 // section and its relevant address record in additional section.
4823 //
4824 // Question
4825 // hello.example.com. IN A
4826 // Answer
4827 // hello.example.com. IN A 1.2.3.4
4828 // Authority:
4829 // hello.example.com. IN NS ns1.example.com.
4830 // Additional:
4831 // ns1.example.com. IN A 5.6.7.8
4832 //
4833 // A response may have only question, answer, and authority section. Current testing response
4834 // should be able to cover this condition.
4835
4836 // Question section.
4837 test::DNSQuestion question{
4838 .qname = {.name = kHelloExampleCom},
4839 .qtype = ns_type::ns_t_a,
4840 .qclass = ns_c_in,
4841 };
4842 header.questions.push_back(std::move(question));
4843
4844 // Answer section.
4845 test::DNSRecord recordAnswer{
4846 .name = {.name = kHelloExampleCom},
4847 .rtype = ns_type::ns_t_a,
4848 .rclass = ns_c_in,
4849 .ttl = 0, // no cache
4850 };
Hungming Chen63779052019-10-30 15:06:13 +08004851 EXPECT_TRUE(test::DNSResponder::fillRdata(kHelloExampleComAddrV4, recordAnswer));
Hungming Chenbb90ab32019-10-28 18:20:31 +08004852 header.answers.push_back(std::move(recordAnswer));
4853
4854 // Authority section.
4855 test::DNSRecord recordAuthority{
4856 .name = {.name = kHelloExampleCom},
4857 .rtype = ns_type::ns_t_ns,
4858 .rclass = ns_c_in,
4859 .ttl = 0, // no cache
4860 };
4861 EXPECT_TRUE(test::DNSResponder::fillRdata("ns1.example.com.", recordAuthority));
4862 header.authorities.push_back(std::move(recordAuthority));
4863
4864 // Additional section.
4865 test::DNSRecord recordAdditional{
4866 .name = {.name = "ns1.example.com."},
4867 .rtype = ns_type::ns_t_a,
4868 .rclass = ns_c_in,
4869 .ttl = 0, // no cache
4870 };
4871 EXPECT_TRUE(test::DNSResponder::fillRdata("5.6.7.8", recordAdditional));
4872 header.additionals.push_back(std::move(recordAdditional));
4873
4874 // Start DNS server.
4875 test::DNSResponder dns(test::DNSResponder::MappingType::DNS_HEADER);
4876 dns.addMappingDnsHeader(kHelloExampleCom, ns_type::ns_t_a, header);
4877 ASSERT_TRUE(dns.startServer());
4878 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4879 dns.clearQueries();
4880
4881 // Expect that get the address and the resolver doesn't crash.
Hungming Chen63779052019-10-30 15:06:13 +08004882 VerifyQueryHelloExampleComV4(dns, calltype);
4883}
4884
4885TEST_P(ResolverParameterizedTest, MessageCompression) {
4886 const auto& calltype = GetParam();
4887
4888 // The response with compressed domain name by a pointer. See RFC 1035 section 4.1.4.
4889 //
4890 // Ignoring the other fields of the message, the domain name of question section and answer
4891 // section are presented as:
4892 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4893 // 12 | 5 | h |
4894 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4895 // 14 | e | l |
4896 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4897 // 16 | l | o |
4898 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4899 // 18 | 7 | e |
4900 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4901 // 20 | x | a |
4902 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4903 // 22 | m | p |
4904 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4905 // 24 | l | e |
4906 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4907 // 26 | 3 | c |
4908 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4909 // 28 | o | m |
4910 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4911 // 30 | 0 | ... |
4912 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4913 //
4914 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4915 // 35 | 1 1| 12 |
4916 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4917 const std::vector<uint8_t> kResponseAPointer = {
4918 /* Header */
4919 0x00, 0x00, /* Transaction ID: 0x0000 */
4920 0x81, 0x80, /* Flags: qr rd ra */
4921 0x00, 0x01, /* Questions: 1 */
4922 0x00, 0x01, /* Answer RRs: 1 */
4923 0x00, 0x00, /* Authority RRs: 0 */
4924 0x00, 0x00, /* Additional RRs: 0 */
4925 /* Queries */
4926 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
4927 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name: hello.example.com */
4928 0x00, 0x01, /* Type: A */
4929 0x00, 0x01, /* Class: IN */
4930 /* Answers */
4931 0xc0, 0x0c, /* Name: hello.example.com (a pointer) */
4932 0x00, 0x01, /* Type: A */
4933 0x00, 0x01, /* Class: IN */
4934 0x00, 0x00, 0x00, 0x00, /* Time to live: 0 */
4935 0x00, 0x04, /* Data length: 4 */
4936 0x01, 0x02, 0x03, 0x04 /* Address: 1.2.3.4 */
4937 };
4938
4939 // The response with compressed domain name by a sequence of labels ending with a pointer. See
4940 // RFC 1035 section 4.1.4.
4941 //
4942 // Ignoring the other fields of the message, the domain name of question section and answer
4943 // section are presented as:
4944 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4945 // 12 | 5 | h |
4946 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4947 // 14 | e | l |
4948 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4949 // 16 | l | o |
4950 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4951 // 18 | 7 | e |
4952 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4953 // 20 | x | a |
4954 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4955 // 22 | m | p |
4956 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4957 // 24 | l | e |
4958 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4959 // 26 | 3 | c |
4960 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4961 // 28 | o | m |
4962 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4963 // 30 | 0 | ... |
4964 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4965 //
4966 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4967 // 35 | 5 | h |
4968 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4969 // 37 | e | l |
4970 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4971 // 39 | l | o |
4972 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4973 // 41 | 1 1| 18 |
4974 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4975 const std::vector<uint8_t> kResponseLabelEndingWithAPointer = {
4976 /* Header */
4977 0x00, 0x00, /* Transaction ID: 0x0000 */
4978 0x81, 0x80, /* Flags: qr rd ra */
4979 0x00, 0x01, /* Questions: 1 */
4980 0x00, 0x01, /* Answer RRs: 1 */
4981 0x00, 0x00, /* Authority RRs: 0 */
4982 0x00, 0x00, /* Additional RRs: 0 */
4983 /* Queries */
4984 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
4985 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name: hello.example.com */
4986 0x00, 0x01, /* Type: A */
4987 0x00, 0x01, /* Class: IN */
4988 /* Answers */
4989 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0xc0,
4990 0x12, /* Name: hello.example.com (a label ending with a pointer) */
4991 0x00, 0x01, /* Type: A */
4992 0x00, 0x01, /* Class: IN */
4993 0x00, 0x00, 0x00, 0x00, /* Time to live: 0 */
4994 0x00, 0x04, /* Data length: 4 */
4995 0x01, 0x02, 0x03, 0x04 /* Address: 1.2.3.4 */
4996 };
4997
4998 for (const auto& response : {kResponseAPointer, kResponseLabelEndingWithAPointer}) {
4999 SCOPED_TRACE(StringPrintf("Hex dump: %s", toHex(makeSlice(response)).c_str()));
5000
5001 test::DNSResponder dns(test::DNSResponder::MappingType::BINARY_PACKET);
5002 dns.addMappingBinaryPacket(kHelloExampleComQueryV4, response);
5003 StartDns(dns, {});
5004 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
5005
5006 // Expect no cache because the TTL of testing responses are 0.
5007 VerifyQueryHelloExampleComV4(dns, calltype);
Hungming Chenbb90ab32019-10-28 18:20:31 +08005008 }
Mike Yu40e67072019-10-09 21:14:09 +08005009}
Hungming Chen22617fd2019-12-06 12:15:45 +08005010
5011TEST_P(ResolverParameterizedTest, TruncatedResponse) {
5012 const auto& calltype = GetParam();
5013
Hungming Chen22617fd2019-12-06 12:15:45 +08005014 test::DNSResponder dns;
Ken Chen99344882020-01-01 14:59:38 +08005015 StartDns(dns, kLargeCnameChainRecords);
Hungming Chen22617fd2019-12-06 12:15:45 +08005016 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
5017
5018 // Expect UDP response is truncated. The resolver retries over TCP. See RFC 1035 section 4.2.1.
5019 VerifyQueryHelloExampleComV4(dns, calltype, false);
5020 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom));
5021 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom));
5022}
Luke Huang420ee622019-11-27 17:52:44 +08005023
5024TEST_F(ResolverTest, KeepListeningUDP) {
5025 constexpr char listen_addr1[] = "127.0.0.4";
5026 constexpr char listen_addr2[] = "127.0.0.5";
5027 constexpr char host_name[] = "howdy.example.com.";
5028 const std::vector<DnsRecord> records = {
5029 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
5030 };
5031 const std::vector<int> params = {300, 25, 8, 8, 1000 /* BASE_TIMEOUT_MSEC */,
5032 1 /* retry count */};
5033 const int delayTimeMs = 1500;
5034
5035 test::DNSResponder neverRespondDns(listen_addr2, "53", static_cast<ns_rcode>(-1));
5036 neverRespondDns.setResponseProbability(0.0);
5037 StartDns(neverRespondDns, records);
Luke Huangf40df9c2020-04-21 08:51:48 +08005038 ScopedSystemProperties scopedSystemProperties(
5039 "persist.device_config.netd_native.keep_listening_udp", "1");
5040 // Re-setup test network to make experiment flag take effect.
5041 resetNetwork();
Luke Huang420ee622019-11-27 17:52:44 +08005042
5043 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr1, listen_addr2},
5044 kDefaultSearchDomains, params));
5045 // There are 2 DNS servers for this test.
5046 // |delayedDns| will be blocked for |delayTimeMs|, then start to respond to requests.
5047 // |neverRespondDns| will never respond.
5048 // In the first try, resolver will send query to |delayedDns| but get timeout error
5049 // because |delayTimeMs| > DNS timeout.
5050 // Then it's the second try, resolver will send query to |neverRespondDns| and
5051 // listen on both servers. Resolver will receive the answer coming from |delayedDns|.
Luke Huang420ee622019-11-27 17:52:44 +08005052
Luke Huang420ee622019-11-27 17:52:44 +08005053 test::DNSResponder delayedDns(listen_addr1);
5054 delayedDns.setResponseDelayMs(delayTimeMs);
5055 StartDns(delayedDns, records);
5056
5057 // Specify hints to ensure resolver doing query only 1 round.
5058 const addrinfo hints = {.ai_family = AF_INET6, .ai_socktype = SOCK_DGRAM};
5059 ScopedAddrinfo result = safe_getaddrinfo(host_name, nullptr, &hints);
5060 EXPECT_TRUE(result != nullptr);
5061
5062 std::string result_str = ToString(result);
5063 EXPECT_TRUE(result_str == "::1.2.3.4") << ", result_str='" << result_str << "'";
5064}
Luke Huang0a0870d2020-02-12 20:41:10 +08005065
5066TEST_F(ResolverTest, GetAddrInfoParallelLookupTimeout) {
5067 constexpr char listen_addr[] = "127.0.0.4";
5068 constexpr char host_name[] = "howdy.example.com.";
5069 constexpr int TIMING_TOLERANCE_MS = 200;
5070 constexpr int DNS_TIMEOUT_MS = 1000;
5071 const std::vector<DnsRecord> records = {
5072 {host_name, ns_type::ns_t_a, "1.2.3.4"},
5073 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
5074 };
5075 const std::vector<int> params = {300, 25, 8, 8, DNS_TIMEOUT_MS /* BASE_TIMEOUT_MSEC */,
5076 1 /* retry count */};
5077 test::DNSResponder neverRespondDns(listen_addr, "53", static_cast<ns_rcode>(-1));
5078 neverRespondDns.setResponseProbability(0.0);
5079 StartDns(neverRespondDns, records);
Luke Huangf40df9c2020-04-21 08:51:48 +08005080 ScopedSystemProperties scopedSystemProperties(
5081 "persist.device_config.netd_native.parallel_lookup", "1");
Luke Huangd1d734f2020-04-30 12:25:40 +08005082 // The default value of parallel_lookup_sleep_time should be very small
5083 // that we can ignore in this test case.
Luke Huangf40df9c2020-04-21 08:51:48 +08005084 // Re-setup test network to make experiment flag take effect.
5085 resetNetwork();
Luke Huang0a0870d2020-02-12 20:41:10 +08005086
5087 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}, kDefaultSearchDomains, params));
5088 neverRespondDns.clearQueries();
5089
Luke Huang0a0870d2020-02-12 20:41:10 +08005090 // Use a never respond DNS server to verify if the A/AAAA queries are sent in parallel.
5091 // The resolver parameters are set to timeout 1s and retry 1 times.
5092 // So we expect the safe_getaddrinfo_time_taken() might take ~1s to
5093 // return when parallel lookup is enabled. And the DNS server should receive 2 queries.
5094 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_DGRAM};
5095 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(host_name, nullptr, hints);
5096
5097 EXPECT_TRUE(result == nullptr);
5098 EXPECT_NEAR(DNS_TIMEOUT_MS, timeTakenMs, TIMING_TOLERANCE_MS)
5099 << "took time should approximate equal timeout";
5100 EXPECT_EQ(2U, GetNumQueries(neverRespondDns, host_name));
Mike Yu532405f2020-06-17 17:46:44 +08005101 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, RCODE_TIMEOUT, host_name, {});
Luke Huang0a0870d2020-02-12 20:41:10 +08005102}
Luke Huangd1d734f2020-04-30 12:25:40 +08005103
5104TEST_F(ResolverTest, GetAddrInfoParallelLookupSleepTime) {
5105 constexpr char listen_addr[] = "127.0.0.4";
5106 constexpr int TIMING_TOLERANCE_MS = 200;
5107 const std::vector<DnsRecord> records = {
5108 {kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4},
5109 {kHelloExampleCom, ns_type::ns_t_aaaa, kHelloExampleComAddrV6},
5110 };
5111 const std::vector<int> params = {300, 25, 8, 8, 1000 /* BASE_TIMEOUT_MSEC */,
5112 1 /* retry count */};
5113 test::DNSResponder dns(listen_addr);
5114 StartDns(dns, records);
5115 ScopedSystemProperties scopedSystemProperties1(
5116 "persist.device_config.netd_native.parallel_lookup", "1");
5117 constexpr int PARALLEL_LOOKUP_SLEEP_TIME_MS = 500;
5118 ScopedSystemProperties scopedSystemProperties2(
5119 "persist.device_config.netd_native.parallel_lookup_sleep_time",
5120 std::to_string(PARALLEL_LOOKUP_SLEEP_TIME_MS));
5121 // Re-setup test network to make experiment flag take effect.
5122 resetNetwork();
5123
5124 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}, kDefaultSearchDomains, params));
5125 dns.clearQueries();
5126
5127 // Expect the safe_getaddrinfo_time_taken() might take ~500ms to return because we set
5128 // parallel_lookup_sleep_time to 500ms.
5129 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_DGRAM};
5130 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(kHelloExampleCom, nullptr, hints);
5131
5132 EXPECT_NE(nullptr, result);
5133 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(
5134 {kHelloExampleComAddrV4, kHelloExampleComAddrV6}));
5135 EXPECT_NEAR(PARALLEL_LOOKUP_SLEEP_TIME_MS, timeTakenMs, TIMING_TOLERANCE_MS)
5136 << "took time should approximate equal timeout";
5137 EXPECT_EQ(2U, GetNumQueries(dns, kHelloExampleCom));
5138
5139 // Expect the PARALLEL_LOOKUP_SLEEP_TIME_MS won't affect the query under cache hit case.
5140 dns.clearQueries();
5141 std::tie(result, timeTakenMs) = safe_getaddrinfo_time_taken(kHelloExampleCom, nullptr, hints);
5142 EXPECT_NE(nullptr, result);
5143 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(
5144 {kHelloExampleComAddrV4, kHelloExampleComAddrV6}));
5145 EXPECT_GT(PARALLEL_LOOKUP_SLEEP_TIME_MS, timeTakenMs);
5146 EXPECT_EQ(0U, GetNumQueries(dns, kHelloExampleCom));
5147}
Luke Huangeb618ef2020-05-26 14:17:02 +08005148
5149TEST_F(ResolverTest, BlockDnsQueryUidDoesNotLeadToBadServer) {
5150 // This test relies on blocking traffic on loopback, which xt_qtaguid does not do.
5151 // See aosp/358413 and b/34444781 for why.
5152 SKIP_IF_BPF_NOT_SUPPORTED;
5153
5154 constexpr char listen_addr1[] = "127.0.0.4";
5155 constexpr char listen_addr2[] = "::1";
5156 test::DNSResponder dns1(listen_addr1);
5157 test::DNSResponder dns2(listen_addr2);
5158 StartDns(dns1, {});
5159 StartDns(dns2, {});
5160
5161 std::vector<std::string> servers = {listen_addr1, listen_addr2};
5162 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
5163 dns1.clearQueries();
5164 dns2.clearQueries();
5165 {
5166 ScopeBlockedUIDRule scopeBlockUidRule(mDnsClient.netdService(), TEST_UID);
5167 // Start querying ten times.
5168 for (int i = 0; i < 10; i++) {
5169 std::string hostName = fmt::format("blocked{}.com", i);
5170 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
5171 EXPECT_EQ(safe_getaddrinfo(hostName.c_str(), nullptr, &hints), nullptr);
5172 }
5173 }
5174 // Since all query packets are blocked, we should not see any stats of them.
5175 const std::vector<NameserverStats> expectedEmptyDnsStats = {
5176 NameserverStats(listen_addr1),
5177 NameserverStats(listen_addr2),
5178 };
Mike Yu61d17262020-02-15 18:56:22 +08005179 expectStatsEqualTo(expectedEmptyDnsStats);
Luke Huangeb618ef2020-05-26 14:17:02 +08005180 EXPECT_EQ(dns1.queries().size(), 0U);
5181 EXPECT_EQ(dns2.queries().size(), 0U);
5182}
Mike Yu6ce587d2019-12-19 21:30:22 +08005183
5184// ResolverMultinetworkTest is used to verify multinetwork functionality. Here's how it works:
5185// The resolver sends queries to address A, and then there will be a TunForwarder helping forward
5186// the packets to address B, which is the address on which the testing server is listening. The
5187// answer packets responded from the testing server go through the reverse path back to the
5188// resolver.
5189//
5190// To achieve the that, it needs to set up a interface with routing rules. Tests are not
5191// supposed to initiate DNS servers on their own; instead, some utilities are added to the class to
5192// help the setup.
5193//
5194// An example of how to use it:
5195// TEST_F() {
Luke Huang81568fb2020-07-13 00:55:12 +08005196// ScopedPhysicalNetwork network = CreateScopedPhysicalNetwork(V4);
Mike Yu6ce587d2019-12-19 21:30:22 +08005197// network.init();
5198//
5199// auto dns = network.addIpv4Dns();
5200// StartDns(dns.dnsServer, {});
5201//
Luke Huang81568fb2020-07-13 00:55:12 +08005202// network.setDnsConfiguration();
Mike Yu6ce587d2019-12-19 21:30:22 +08005203// network.startTunForwarder();
5204//
5205// // Send queries here
5206// }
5207
5208class ResolverMultinetworkTest : public ResolverTest {
5209 protected:
5210 enum class ConnectivityType { V4, V6, V4V6 };
Luke Huang81568fb2020-07-13 00:55:12 +08005211 static constexpr int TEST_NETID_BASE = 10000;
Mike Yu6ce587d2019-12-19 21:30:22 +08005212
5213 struct DnsServerPair {
Luke Huang81568fb2020-07-13 00:55:12 +08005214 DnsServerPair(std::shared_ptr<test::DNSResponder> server, std::string addr)
5215 : dnsServer(server), dnsAddr(addr) {}
5216 std::shared_ptr<test::DNSResponder> dnsServer;
Mike Yu6ce587d2019-12-19 21:30:22 +08005217 std::string dnsAddr; // The DNS server address used for setResolverConfiguration().
5218 // TODO: Add test::DnsTlsFrontend* and std::string for DoT.
5219 };
5220
5221 class ScopedNetwork {
5222 public:
5223 ScopedNetwork(unsigned netId, ConnectivityType type, INetd* netdSrv,
Luke Huang81568fb2020-07-13 00:55:12 +08005224 IDnsResolver* dnsResolvSrv, const char* networkName)
Mike Yu6ce587d2019-12-19 21:30:22 +08005225 : mNetId(netId),
5226 mConnectivityType(type),
5227 mNetdSrv(netdSrv),
Luke Huang81568fb2020-07-13 00:55:12 +08005228 mDnsResolvSrv(dnsResolvSrv),
5229 mNetworkName(networkName) {
5230 mIfname = fmt::format("testtun{}", netId);
Mike Yu6ce587d2019-12-19 21:30:22 +08005231 }
Luke Huang81568fb2020-07-13 00:55:12 +08005232 virtual ~ScopedNetwork() {
5233 if (mNetdSrv != nullptr) mNetdSrv->networkDestroy(mNetId);
5234 if (mDnsResolvSrv != nullptr) mDnsResolvSrv->destroyNetworkCache(mNetId);
5235 }
Mike Yu6ce587d2019-12-19 21:30:22 +08005236
5237 Result<void> init();
Mike Yu6ce587d2019-12-19 21:30:22 +08005238 Result<DnsServerPair> addIpv4Dns() { return addDns(ConnectivityType::V4); }
5239 Result<DnsServerPair> addIpv6Dns() { return addDns(ConnectivityType::V6); }
5240 bool startTunForwarder() { return mTunForwarder->startForwarding(); }
Luke Huang81568fb2020-07-13 00:55:12 +08005241 bool setDnsConfiguration() const;
5242 bool clearDnsConfiguration() const;
Mike Yu6ce587d2019-12-19 21:30:22 +08005243 unsigned netId() const { return mNetId; }
Luke Huang81568fb2020-07-13 00:55:12 +08005244 std::string name() const { return mNetworkName; }
Mike Yu6ce587d2019-12-19 21:30:22 +08005245
Luke Huang81568fb2020-07-13 00:55:12 +08005246 protected:
5247 // Subclasses should implement it to decide which network should be create.
5248 virtual Result<void> createNetwork() const = 0;
Mike Yu6ce587d2019-12-19 21:30:22 +08005249
5250 const unsigned mNetId;
5251 const ConnectivityType mConnectivityType;
5252 INetd* mNetdSrv;
5253 IDnsResolver* mDnsResolvSrv;
Luke Huang81568fb2020-07-13 00:55:12 +08005254 const std::string mNetworkName;
Mike Yu6ce587d2019-12-19 21:30:22 +08005255 std::string mIfname;
5256 std::unique_ptr<TunForwarder> mTunForwarder;
Luke Huang81568fb2020-07-13 00:55:12 +08005257 std::vector<DnsServerPair> mDnsServerPairs;
5258
5259 private:
5260 Result<DnsServerPair> addDns(ConnectivityType connectivity);
5261 // Assuming mNetId is unique during ResolverMultinetworkTest, make the
5262 // address based on it to avoid conflicts.
5263 std::string makeIpv4AddrString(uint8_t n) const {
5264 return StringPrintf("192.168.%u.%u", (mNetId - TEST_NETID_BASE), n);
5265 }
5266 std::string makeIpv6AddrString(uint8_t n) const {
5267 return StringPrintf("2001:db8:%u::%u", (mNetId - TEST_NETID_BASE), n);
5268 }
5269 };
5270
5271 class ScopedPhysicalNetwork : public ScopedNetwork {
5272 public:
5273 ScopedPhysicalNetwork(unsigned netId, const char* networkName)
5274 : ScopedNetwork(netId, ConnectivityType::V4V6, nullptr, nullptr, networkName) {}
5275 ScopedPhysicalNetwork(unsigned netId, ConnectivityType type, INetd* netdSrv,
5276 IDnsResolver* dnsResolvSrv, const char* name = "Physical")
5277 : ScopedNetwork(netId, type, netdSrv, dnsResolvSrv, name) {}
5278
5279 protected:
5280 Result<void> createNetwork() const override {
5281 if (auto r = mNetdSrv->networkCreatePhysical(mNetId, INetd::PERMISSION_NONE);
5282 !r.isOk()) {
5283 return Error() << r.getMessage();
5284 }
5285 return {};
5286 }
5287 };
5288
5289 class ScopedVirtualNetwork : public ScopedNetwork {
5290 public:
5291 ScopedVirtualNetwork(unsigned netId, ConnectivityType type, INetd* netdSrv,
5292 IDnsResolver* dnsResolvSrv, const char* name, bool isSecure)
5293 : ScopedNetwork(netId, type, netdSrv, dnsResolvSrv, name), mIsSecure(isSecure) {}
5294 ~ScopedVirtualNetwork() {
5295 if (!mVpnIsolationUids.empty()) {
5296 const std::vector<int> tmpUids(mVpnIsolationUids.begin(), mVpnIsolationUids.end());
5297 mNetdSrv->firewallRemoveUidInterfaceRules(tmpUids);
5298 }
5299 }
5300 // Enable VPN isolation. Ensures that uid can only receive packets on mIfname.
5301 Result<void> enableVpnIsolation(int uid) {
5302 if (auto r = mNetdSrv->firewallAddUidInterfaceRules(mIfname, {uid}); !r.isOk()) {
5303 return Error() << r.getMessage();
5304 }
5305 mVpnIsolationUids.insert(uid);
5306 return {};
5307 }
5308 Result<void> disableVpnIsolation(int uid) {
5309 if (auto r = mNetdSrv->firewallRemoveUidInterfaceRules({static_cast<int>(uid)});
5310 !r.isOk()) {
5311 return Error() << r.getMessage();
5312 }
5313 mVpnIsolationUids.erase(uid);
5314 return {};
5315 }
5316 Result<void> addUser(uid_t uid) const { return addUidRange(uid, uid); }
5317 Result<void> addUidRange(uid_t from, uid_t to) const {
5318 if (auto r = mNetdSrv->networkAddUidRanges(mNetId, {makeUidRangeParcel(from, to)});
5319 !r.isOk()) {
5320 return Error() << r.getMessage();
5321 }
5322 return {};
5323 }
5324
5325 protected:
5326 Result<void> createNetwork() const override {
5327 if (auto r = mNetdSrv->networkCreateVpn(mNetId, mIsSecure); !r.isOk()) {
5328 return Error() << r.getMessage();
5329 }
5330 return {};
5331 }
5332
5333 bool mIsSecure = false;
5334 std::unordered_set<int> mVpnIsolationUids;
Mike Yu6ce587d2019-12-19 21:30:22 +08005335 };
5336
5337 void SetUp() override {
5338 ResolverTest::SetUp();
5339 ASSERT_NE(mDnsClient.netdService(), nullptr);
5340 ASSERT_NE(mDnsClient.resolvService(), nullptr);
5341 }
5342
Luke Huang81568fb2020-07-13 00:55:12 +08005343 void TearDown() override {
5344 ResolverTest::TearDown();
5345 // Restore default network
5346 if (mStoredDefaultNetwork >= 0) {
5347 mDnsClient.netdService()->networkSetDefault(mStoredDefaultNetwork);
5348 }
5349 }
Mike Yu6ce587d2019-12-19 21:30:22 +08005350
Luke Huang81568fb2020-07-13 00:55:12 +08005351 ScopedPhysicalNetwork CreateScopedPhysicalNetwork(ConnectivityType type,
5352 const char* name = "Physical") {
5353 return {getFreeNetId(), type, mDnsClient.netdService(), mDnsClient.resolvService(), name};
5354 }
5355 ScopedVirtualNetwork CreateScopedVirtualNetwork(ConnectivityType type, bool isSecure,
5356 const char* name = "Virtual") {
5357 return {getFreeNetId(), type, mDnsClient.netdService(), mDnsClient.resolvService(),
5358 name, isSecure};
5359 }
Mike Yu6ce587d2019-12-19 21:30:22 +08005360 void StartDns(test::DNSResponder& dns, const std::vector<DnsRecord>& records);
Luke Huang81568fb2020-07-13 00:55:12 +08005361 void setDefaultNetwork(int netId) {
5362 // Save current default network at the first call.
5363 std::call_once(defaultNetworkFlag, [&]() {
5364 ASSERT_TRUE(mDnsClient.netdService()->networkGetDefault(&mStoredDefaultNetwork).isOk());
5365 });
5366 ASSERT_TRUE(mDnsClient.netdService()->networkSetDefault(netId).isOk());
5367 }
5368 unsigned getFreeNetId() {
5369 if (mNextNetId == TEST_NETID_BASE + 256) mNextNetId = TEST_NETID_BASE;
5370 return mNextNetId++;
5371 }
Mike Yu6ce587d2019-12-19 21:30:22 +08005372
5373 private:
5374 // Use a different netId because this class inherits from the class ResolverTest which
Luke Huang81568fb2020-07-13 00:55:12 +08005375 // always creates TEST_NETID in setup. It's incremented when CreateScoped{Physical,
5376 // Virtual}Network() is called.
5377 // Note: 255 is the maximum number of (mNextNetId - TEST_NETID_BASE) here as mNextNetId
5378 // is used to create address.
5379 unsigned mNextNetId = TEST_NETID_BASE;
5380 // Use -1 to represent that default network was not modified because
5381 // real netId must be an unsigned value.
5382 int mStoredDefaultNetwork = -1;
5383 std::once_flag defaultNetworkFlag;
Mike Yu6ce587d2019-12-19 21:30:22 +08005384};
5385
Mike Yu6ce587d2019-12-19 21:30:22 +08005386Result<void> ResolverMultinetworkTest::ScopedNetwork::init() {
Luke Huang81568fb2020-07-13 00:55:12 +08005387 if (mNetdSrv == nullptr || mDnsResolvSrv == nullptr) return Error() << "srv not available";
Mike Yu6ce587d2019-12-19 21:30:22 +08005388 unique_fd ufd = TunForwarder::createTun(mIfname);
5389 if (!ufd.ok()) {
5390 return Errorf("createTun for {} failed", mIfname);
5391 }
5392 mTunForwarder = std::make_unique<TunForwarder>(std::move(ufd));
5393
Luke Huang81568fb2020-07-13 00:55:12 +08005394 if (auto r = createNetwork(); !r.ok()) {
5395 return r;
Mike Yu6ce587d2019-12-19 21:30:22 +08005396 }
5397 if (auto r = mDnsResolvSrv->createNetworkCache(mNetId); !r.isOk()) {
5398 return Error() << r.getMessage();
5399 }
5400 if (auto r = mNetdSrv->networkAddInterface(mNetId, mIfname); !r.isOk()) {
5401 return Error() << r.getMessage();
5402 }
5403
5404 if (mConnectivityType == ConnectivityType::V4 || mConnectivityType == ConnectivityType::V4V6) {
5405 const std::string v4Addr = makeIpv4AddrString(1);
5406 if (auto r = mNetdSrv->interfaceAddAddress(mIfname, v4Addr, 32); !r.isOk()) {
5407 return Error() << r.getMessage();
5408 }
5409 if (auto r = mNetdSrv->networkAddRoute(mNetId, mIfname, "0.0.0.0/0", ""); !r.isOk()) {
5410 return Error() << r.getMessage();
5411 }
5412 }
5413 if (mConnectivityType == ConnectivityType::V6 || mConnectivityType == ConnectivityType::V4V6) {
5414 const std::string v6Addr = makeIpv6AddrString(1);
5415 if (auto r = mNetdSrv->interfaceAddAddress(mIfname, v6Addr, 128); !r.isOk()) {
5416 return Error() << r.getMessage();
5417 }
5418 if (auto r = mNetdSrv->networkAddRoute(mNetId, mIfname, "::/0", ""); !r.isOk()) {
5419 return Error() << r.getMessage();
5420 }
5421 }
5422
5423 return {};
5424}
5425
Mike Yu6ce587d2019-12-19 21:30:22 +08005426void ResolverMultinetworkTest::StartDns(test::DNSResponder& dns,
5427 const std::vector<DnsRecord>& records) {
5428 ResolverTest::StartDns(dns, records);
5429
5430 // Bind the DNSResponder's sockets to the network if specified.
5431 if (std::optional<unsigned> netId = dns.getNetwork(); netId.has_value()) {
5432 setNetworkForSocket(netId.value(), dns.getUdpSocket());
5433 setNetworkForSocket(netId.value(), dns.getTcpSocket());
5434 }
5435}
5436
5437Result<ResolverMultinetworkTest::DnsServerPair> ResolverMultinetworkTest::ScopedNetwork::addDns(
5438 ConnectivityType type) {
Luke Huang81568fb2020-07-13 00:55:12 +08005439 const int index = mDnsServerPairs.size();
Mike Yu6ce587d2019-12-19 21:30:22 +08005440 const int prefixLen = (type == ConnectivityType::V4) ? 32 : 128;
5441
5442 const std::function<std::string(unsigned)> makeIpString =
5443 std::bind((type == ConnectivityType::V4) ? &ScopedNetwork::makeIpv4AddrString
5444 : &ScopedNetwork::makeIpv6AddrString,
5445 this, std::placeholders::_1);
5446
5447 std::string src1 = makeIpString(1); // The address from which the resolver will send.
Luke Huang81568fb2020-07-13 00:55:12 +08005448 std::string dst1 = makeIpString(
5449 index + 100 +
5450 (mNetId - TEST_NETID_BASE)); // The address to which the resolver will send.
Mike Yu6ce587d2019-12-19 21:30:22 +08005451 std::string src2 = dst1; // The address translated from src1.
Luke Huang81568fb2020-07-13 00:55:12 +08005452 std::string dst2 = makeIpString(
5453 index + 200 + (mNetId - TEST_NETID_BASE)); // The address translated from dst2.
Mike Yu6ce587d2019-12-19 21:30:22 +08005454
5455 if (!mTunForwarder->addForwardingRule({src1, dst1}, {src2, dst2}) ||
5456 !mTunForwarder->addForwardingRule({dst2, src2}, {dst1, src1})) {
5457 return Errorf("Failed to add the rules ({}, {}, {}, {})", src1, dst1, src2, dst2);
5458 }
5459
5460 if (!mNetdSrv->interfaceAddAddress(mIfname, dst2, prefixLen).isOk()) {
5461 return Errorf("interfaceAddAddress({}, {}, {}) failed", mIfname, dst2, prefixLen);
5462 }
5463
Luke Huang81568fb2020-07-13 00:55:12 +08005464 return mDnsServerPairs.emplace_back(std::make_shared<test::DNSResponder>(mNetId, dst2), dst1);
Mike Yu6ce587d2019-12-19 21:30:22 +08005465}
5466
Luke Huang81568fb2020-07-13 00:55:12 +08005467bool ResolverMultinetworkTest::ScopedNetwork::setDnsConfiguration() const {
5468 if (mDnsResolvSrv == nullptr) return false;
5469 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
5470 parcel.tlsServers.clear();
5471 parcel.netId = mNetId;
5472 parcel.servers.clear();
5473 for (const auto& pair : mDnsServerPairs) {
5474 parcel.servers.push_back(pair.dnsAddr);
5475 }
5476 return mDnsResolvSrv->setResolverConfiguration(parcel).isOk();
5477}
5478
5479bool ResolverMultinetworkTest::ScopedNetwork::clearDnsConfiguration() const {
5480 if (mDnsResolvSrv == nullptr) return false;
5481 return mDnsResolvSrv->destroyNetworkCache(mNetId).isOk() &&
5482 mDnsResolvSrv->createNetworkCache(mNetId).isOk();
5483}
5484
5485namespace {
5486
5487// Convenient wrapper for making getaddrinfo call like framework.
5488Result<ScopedAddrinfo> android_getaddrinfofornet_wrapper(const char* name, int netId) {
5489 // Use the same parameter as libcore/ojluni/src/main/java/java/net/Inet6AddressImpl.java.
5490 static const addrinfo hints = {
5491 .ai_flags = AI_ADDRCONFIG,
5492 .ai_family = AF_UNSPEC,
5493 .ai_socktype = SOCK_STREAM,
5494 };
5495 addrinfo* result = nullptr;
5496 if (int r = android_getaddrinfofornet(name, nullptr, &hints, netId, MARK_UNSET, &result)) {
5497 return Error() << r;
5498 }
5499 return ScopedAddrinfo(result);
5500}
5501
5502void expectDnsWorksForUid(const char* name, unsigned netId, uid_t uid,
5503 const std::vector<std::string>& expectedResult) {
5504 ScopedChangeUID scopedChangeUID(uid);
5505 auto result = android_getaddrinfofornet_wrapper(name, netId);
5506 ASSERT_RESULT_OK(result);
5507 ScopedAddrinfo ai_result(std::move(result.value()));
5508 std::vector<std::string> result_strs = ToStrings(ai_result);
5509 EXPECT_THAT(result_strs, testing::UnorderedElementsAreArray(expectedResult));
5510}
5511
5512} // namespace
5513
Mike Yu6ce587d2019-12-19 21:30:22 +08005514TEST_F(ResolverMultinetworkTest, GetAddrInfo_AI_ADDRCONFIG) {
5515 constexpr char host_name[] = "ohayou.example.com.";
5516
5517 const std::array<ConnectivityType, 3> allTypes = {
5518 ConnectivityType::V4,
5519 ConnectivityType::V6,
5520 ConnectivityType::V4V6,
5521 };
5522 for (const auto& type : allTypes) {
5523 SCOPED_TRACE(StringPrintf("ConnectivityType: %d", type));
5524
5525 // Create a network.
Luke Huang81568fb2020-07-13 00:55:12 +08005526 ScopedPhysicalNetwork network = CreateScopedPhysicalNetwork(type);
Mike Yu6ce587d2019-12-19 21:30:22 +08005527 ASSERT_RESULT_OK(network.init());
5528
5529 // Add a testing DNS server.
5530 const Result<DnsServerPair> dnsPair =
5531 (type == ConnectivityType::V4) ? network.addIpv4Dns() : network.addIpv6Dns();
5532 ASSERT_RESULT_OK(dnsPair);
Luke Huang81568fb2020-07-13 00:55:12 +08005533 StartDns(*dnsPair->dnsServer, {{host_name, ns_type::ns_t_a, "192.0.2.0"},
5534 {host_name, ns_type::ns_t_aaaa, "2001:db8:cafe:d00d::31"}});
Mike Yu6ce587d2019-12-19 21:30:22 +08005535
5536 // Set up resolver and start forwarding.
Luke Huang81568fb2020-07-13 00:55:12 +08005537 ASSERT_TRUE(network.setDnsConfiguration());
Mike Yu6ce587d2019-12-19 21:30:22 +08005538 ASSERT_TRUE(network.startTunForwarder());
5539
Luke Huang81568fb2020-07-13 00:55:12 +08005540 auto result = android_getaddrinfofornet_wrapper(host_name, network.netId());
5541 ASSERT_RESULT_OK(result);
5542 ScopedAddrinfo ai_result(std::move(result.value()));
Mike Yu6ce587d2019-12-19 21:30:22 +08005543 std::vector<std::string> result_strs = ToStrings(ai_result);
5544 std::vector<std::string> expectedResult;
5545 size_t expectedQueries = 0;
5546
5547 if (type == ConnectivityType::V6 || type == ConnectivityType::V4V6) {
5548 expectedResult.emplace_back("2001:db8:cafe:d00d::31");
5549 expectedQueries++;
5550 }
5551 if (type == ConnectivityType::V4 || type == ConnectivityType::V4V6) {
Luke Huang81568fb2020-07-13 00:55:12 +08005552 expectedResult.emplace_back("192.0.2.0");
Mike Yu6ce587d2019-12-19 21:30:22 +08005553 expectedQueries++;
5554 }
5555 EXPECT_THAT(result_strs, testing::UnorderedElementsAreArray(expectedResult));
Luke Huang81568fb2020-07-13 00:55:12 +08005556 EXPECT_EQ(GetNumQueries(*dnsPair->dnsServer, host_name), expectedQueries);
Mike Yu6ce587d2019-12-19 21:30:22 +08005557 }
5558}
5559
5560TEST_F(ResolverMultinetworkTest, NetworkDestroyedDuringQueryInFlight) {
5561 constexpr char host_name[] = "ohayou.example.com.";
5562
5563 // Create a network and add an ipv4 DNS server.
Luke Huang81568fb2020-07-13 00:55:12 +08005564 auto network = std::make_unique<ScopedPhysicalNetwork>(getFreeNetId(), ConnectivityType::V4V6,
5565 mDnsClient.netdService(),
5566 mDnsClient.resolvService());
Mike Yu6ce587d2019-12-19 21:30:22 +08005567 ASSERT_RESULT_OK(network->init());
5568 const Result<DnsServerPair> dnsPair = network->addIpv4Dns();
5569 ASSERT_RESULT_OK(dnsPair);
5570
5571 // Set the DNS server unresponsive.
Luke Huang81568fb2020-07-13 00:55:12 +08005572 dnsPair->dnsServer->setResponseProbability(0.0);
5573 dnsPair->dnsServer->setErrorRcode(static_cast<ns_rcode>(-1));
5574 StartDns(*dnsPair->dnsServer, {});
Mike Yu6ce587d2019-12-19 21:30:22 +08005575
5576 // Set up resolver and start forwarding.
Luke Huang81568fb2020-07-13 00:55:12 +08005577 ASSERT_TRUE(network->setDnsConfiguration());
Mike Yu6ce587d2019-12-19 21:30:22 +08005578 ASSERT_TRUE(network->startTunForwarder());
5579
5580 // Expect the things happening in order:
5581 // 1. The thread sends the query to the dns server which is unresponsive.
5582 // 2. The network is destroyed while the thread is waiting for the response from the dns server.
5583 // 3. After the dns server timeout, the thread retries but fails to connect.
5584 std::thread lookup([&]() {
5585 int fd = resNetworkQuery(network->netId(), host_name, ns_c_in, ns_t_a, 0);
5586 EXPECT_TRUE(fd != -1);
5587 expectAnswersNotValid(fd, -ETIMEDOUT);
5588 });
5589
5590 // Tear down the network as soon as the dns server receives the query.
Luke Huang81568fb2020-07-13 00:55:12 +08005591 const auto condition = [&]() { return GetNumQueries(*dnsPair->dnsServer, host_name) == 1U; };
Mike Yu6ce587d2019-12-19 21:30:22 +08005592 EXPECT_TRUE(PollForCondition(condition));
5593 network.reset();
5594
5595 lookup.join();
5596}
5597
5598TEST_F(ResolverMultinetworkTest, OneCachePerNetwork) {
5599 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
5600 constexpr char host_name[] = "ohayou.example.com.";
5601
Luke Huang81568fb2020-07-13 00:55:12 +08005602 ScopedPhysicalNetwork network1 = CreateScopedPhysicalNetwork(ConnectivityType::V4V6);
5603 ScopedPhysicalNetwork network2 = CreateScopedPhysicalNetwork(ConnectivityType::V4V6);
Mike Yu6ce587d2019-12-19 21:30:22 +08005604 ASSERT_RESULT_OK(network1.init());
5605 ASSERT_RESULT_OK(network2.init());
5606
5607 const Result<DnsServerPair> dnsPair1 = network1.addIpv4Dns();
5608 const Result<DnsServerPair> dnsPair2 = network2.addIpv4Dns();
5609 ASSERT_RESULT_OK(dnsPair1);
5610 ASSERT_RESULT_OK(dnsPair2);
Luke Huang81568fb2020-07-13 00:55:12 +08005611 StartDns(*dnsPair1->dnsServer, {{host_name, ns_type::ns_t_a, "192.0.2.0"}});
5612 StartDns(*dnsPair2->dnsServer, {{host_name, ns_type::ns_t_a, "192.0.2.1"}});
Mike Yu6ce587d2019-12-19 21:30:22 +08005613
5614 // Set up resolver for network 1 and start forwarding.
Luke Huang81568fb2020-07-13 00:55:12 +08005615 ASSERT_TRUE(network1.setDnsConfiguration());
Mike Yu6ce587d2019-12-19 21:30:22 +08005616 ASSERT_TRUE(network1.startTunForwarder());
5617
5618 // Set up resolver for network 2 and start forwarding.
Luke Huang81568fb2020-07-13 00:55:12 +08005619 ASSERT_TRUE(network2.setDnsConfiguration());
Mike Yu6ce587d2019-12-19 21:30:22 +08005620 ASSERT_TRUE(network2.startTunForwarder());
5621
5622 // Send the same queries to both networks.
5623 int fd1 = resNetworkQuery(network1.netId(), host_name, ns_c_in, ns_t_a, 0);
5624 int fd2 = resNetworkQuery(network2.netId(), host_name, ns_c_in, ns_t_a, 0);
5625
Luke Huang81568fb2020-07-13 00:55:12 +08005626 expectAnswersValid(fd1, AF_INET, "192.0.2.0");
5627 expectAnswersValid(fd2, AF_INET, "192.0.2.1");
5628 EXPECT_EQ(GetNumQueries(*dnsPair1->dnsServer, host_name), 1U);
5629 EXPECT_EQ(GetNumQueries(*dnsPair2->dnsServer, host_name), 1U);
Mike Yu6ce587d2019-12-19 21:30:22 +08005630
5631 // Flush the cache of network 1, and send the queries again.
5632 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(network1.netId()).isOk());
5633 fd1 = resNetworkQuery(network1.netId(), host_name, ns_c_in, ns_t_a, 0);
5634 fd2 = resNetworkQuery(network2.netId(), host_name, ns_c_in, ns_t_a, 0);
5635
Luke Huang81568fb2020-07-13 00:55:12 +08005636 expectAnswersValid(fd1, AF_INET, "192.0.2.0");
5637 expectAnswersValid(fd2, AF_INET, "192.0.2.1");
5638 EXPECT_EQ(GetNumQueries(*dnsPair1->dnsServer, host_name), 2U);
5639 EXPECT_EQ(GetNumQueries(*dnsPair2->dnsServer, host_name), 1U);
5640}
5641
5642TEST_F(ResolverMultinetworkTest, DnsWithVpn) {
5643 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
5644 SKIP_IF_BPF_NOT_SUPPORTED;
5645 constexpr char host_name[] = "ohayou.example.com.";
5646 constexpr char ipv4_addr[] = "192.0.2.0";
5647 constexpr char ipv6_addr[] = "2001:db8:cafe:d00d::31";
5648
5649 const std::pair<ConnectivityType, std::vector<std::string>> testPairs[] = {
5650 {ConnectivityType::V4, {ipv4_addr}},
5651 {ConnectivityType::V6, {ipv6_addr}},
5652 {ConnectivityType::V4V6, {ipv6_addr, ipv4_addr}},
5653 };
5654 for (const auto& [type, result] : testPairs) {
5655 SCOPED_TRACE(StringPrintf("ConnectivityType: %d", type));
5656
5657 // Create a network.
5658 ScopedPhysicalNetwork underlyingNetwork = CreateScopedPhysicalNetwork(type, "Underlying");
5659 ScopedVirtualNetwork bypassableVpnNetwork =
5660 CreateScopedVirtualNetwork(type, false, "BypassableVpn");
5661 ScopedVirtualNetwork secureVpnNetwork = CreateScopedVirtualNetwork(type, true, "SecureVpn");
5662
5663 ASSERT_RESULT_OK(underlyingNetwork.init());
5664 ASSERT_RESULT_OK(bypassableVpnNetwork.init());
5665 ASSERT_RESULT_OK(secureVpnNetwork.init());
5666 ASSERT_RESULT_OK(bypassableVpnNetwork.addUser(TEST_UID));
5667 ASSERT_RESULT_OK(secureVpnNetwork.addUser(TEST_UID2));
5668
5669 auto setupDnsFn = [&](std::shared_ptr<test::DNSResponder> dnsServer,
5670 ScopedNetwork* nw) -> void {
5671 StartDns(*dnsServer, {{host_name, ns_type::ns_t_a, ipv4_addr},
5672 {host_name, ns_type::ns_t_aaaa, ipv6_addr}});
5673 ASSERT_TRUE(nw->setDnsConfiguration());
5674 ASSERT_TRUE(nw->startTunForwarder());
5675 };
5676 // Add a testing DNS server to networks.
5677 const Result<DnsServerPair> underlyingPair = (type == ConnectivityType::V4)
5678 ? underlyingNetwork.addIpv4Dns()
5679 : underlyingNetwork.addIpv6Dns();
5680 ASSERT_RESULT_OK(underlyingPair);
5681 const Result<DnsServerPair> bypassableVpnPair = (type == ConnectivityType::V4)
5682 ? bypassableVpnNetwork.addIpv4Dns()
5683 : bypassableVpnNetwork.addIpv6Dns();
5684 ASSERT_RESULT_OK(bypassableVpnPair);
5685 const Result<DnsServerPair> secureVpnPair = (type == ConnectivityType::V4)
5686 ? secureVpnNetwork.addIpv4Dns()
5687 : secureVpnNetwork.addIpv6Dns();
5688 ASSERT_RESULT_OK(secureVpnPair);
5689 // Set up resolver and start forwarding for networks.
5690 setupDnsFn(underlyingPair->dnsServer, &underlyingNetwork);
5691 setupDnsFn(bypassableVpnPair->dnsServer, &bypassableVpnNetwork);
5692 setupDnsFn(secureVpnPair->dnsServer, &secureVpnNetwork);
5693
5694 setDefaultNetwork(underlyingNetwork.netId());
5695 const unsigned underlyingNetId = underlyingNetwork.netId();
5696 const unsigned bypassableVpnNetId = bypassableVpnNetwork.netId();
5697 const unsigned secureVpnNetId = secureVpnNetwork.netId();
5698 // We've called setNetworkForProcess in SetupOemNetwork, so reset to default first.
5699 ScopedSetNetworkForProcess scopedSetNetworkForProcess(NETID_UNSET);
5700 auto expectDnsQueryCountsFn = [&](size_t count,
5701 std::shared_ptr<test::DNSResponder> dnsServer,
5702 unsigned expectedDnsNetId) -> void {
5703 EXPECT_EQ(GetNumQueries(*dnsServer, host_name), count);
5704 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(expectedDnsNetId).isOk());
5705 dnsServer->clearQueries();
5706 // Give DnsResolver some time to clear cache to avoid race.
5707 usleep(5 * 1000);
5708 };
5709
5710 // Create a object to represent default network, do not init it.
5711 ScopedPhysicalNetwork defaultNetwork{NETID_UNSET, "Default"};
5712
5713 // Test VPN with DNS server under 4 different network selection scenarios.
5714 // See the test config for the expectation.
5715 const struct TestConfig {
5716 ScopedNetwork* selectedNetwork;
5717 unsigned expectedDnsNetId;
5718 std::shared_ptr<test::DNSResponder> expectedDnsServer;
5719 } vpnWithDnsServerConfigs[]{
5720 // clang-format off
5721 // Queries use the bypassable VPN by default.
5722 {&defaultNetwork, bypassableVpnNetId, bypassableVpnPair->dnsServer},
5723 // Choosing the underlying network works because the VPN is bypassable.
5724 {&underlyingNetwork, underlyingNetId, underlyingPair->dnsServer},
5725 // Selecting the VPN sends the query on the VPN.
5726 {&bypassableVpnNetwork, bypassableVpnNetId, bypassableVpnPair->dnsServer},
5727 // TEST_UID does not have access to the secure VPN.
5728 {&secureVpnNetwork, bypassableVpnNetId, bypassableVpnPair->dnsServer},
5729 // clang-format on
5730 };
5731 for (const auto& config : vpnWithDnsServerConfigs) {
5732 SCOPED_TRACE(fmt::format("Bypassble VPN with DnsServer, selectedNetwork = {}",
5733 config.selectedNetwork->name()));
5734 expectDnsWorksForUid(host_name, config.selectedNetwork->netId(), TEST_UID, result);
5735 expectDnsQueryCountsFn(result.size(), config.expectedDnsServer,
5736 config.expectedDnsNetId);
5737 }
5738
5739 std::vector<ScopedNetwork*> nwVec{&defaultNetwork, &underlyingNetwork,
5740 &bypassableVpnNetwork, &secureVpnNetwork};
5741 // Test the VPN without DNS server with the same combination as before.
5742 ASSERT_TRUE(bypassableVpnNetwork.clearDnsConfiguration());
5743 // Test bypassable VPN, TEST_UID
5744 for (const auto* selectedNetwork : nwVec) {
5745 SCOPED_TRACE(fmt::format("Bypassble VPN without DnsServer, selectedNetwork = {}",
5746 selectedNetwork->name()));
5747 expectDnsWorksForUid(host_name, selectedNetwork->netId(), TEST_UID, result);
5748 expectDnsQueryCountsFn(result.size(), underlyingPair->dnsServer, underlyingNetId);
5749 }
5750
5751 // The same test scenario as before plus enableVpnIsolation for secure VPN, TEST_UID2.
5752 for (bool enableVpnIsolation : {false, true}) {
5753 SCOPED_TRACE(fmt::format("enableVpnIsolation = {}", enableVpnIsolation));
5754 if (enableVpnIsolation) {
5755 EXPECT_RESULT_OK(secureVpnNetwork.enableVpnIsolation(TEST_UID2));
5756 }
5757
5758 // Test secure VPN without DNS server.
5759 ASSERT_TRUE(secureVpnNetwork.clearDnsConfiguration());
5760 for (const auto* selectedNetwork : nwVec) {
5761 SCOPED_TRACE(fmt::format("Secure VPN without DnsServer, selectedNetwork = {}",
5762 selectedNetwork->name()));
5763 expectDnsWorksForUid(host_name, selectedNetwork->netId(), TEST_UID2, result);
5764 expectDnsQueryCountsFn(result.size(), underlyingPair->dnsServer, underlyingNetId);
5765 }
5766
5767 // Test secure VPN with DNS server.
5768 ASSERT_TRUE(secureVpnNetwork.setDnsConfiguration());
5769 for (const auto* selectedNetwork : nwVec) {
5770 SCOPED_TRACE(fmt::format("Secure VPN with DnsServer, selectedNetwork = {}",
5771 selectedNetwork->name()));
5772 expectDnsWorksForUid(host_name, selectedNetwork->netId(), TEST_UID2, result);
5773 expectDnsQueryCountsFn(result.size(), secureVpnPair->dnsServer, secureVpnNetId);
5774 }
5775
5776 if (enableVpnIsolation) {
5777 EXPECT_RESULT_OK(secureVpnNetwork.disableVpnIsolation(TEST_UID2));
5778 }
5779 }
5780 }
Mike Yu6ce587d2019-12-19 21:30:22 +08005781}