blob: e83fe6349689779e57fd371afdd5b46b66045d5b [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>
Luke Huang5729afc2020-07-30 23:12:17 +080062#include <util.h> // getApiLevel
Bernie Innocenti41b82c42019-06-05 22:38:25 +090063#include "NetdClient.h"
Bernie Innocenti41b82c42019-06-05 22:38:25 +090064#include "ResolverStats.h"
Luke Huangf8215372019-11-22 11:53:41 +080065#include "netid_client.h" // NETID_UNSET
66#include "params.h" // MAXNS
Mike Yu532405f2020-06-17 17:46:44 +080067#include "stats.h" // RCODE_TIMEOUT
Hungming Chene8f970c2019-04-10 17:34:06 +080068#include "tests/dns_metrics_listener/dns_metrics_listener.h"
chenbruceb43ec752019-07-24 20:19:41 +080069#include "tests/dns_responder/dns_responder.h"
Luke Huangf8215372019-11-22 11:53:41 +080070#include "tests/dns_responder/dns_responder_client_ndk.h"
Hungming Chenc6556622019-10-02 16:01:07 +080071#include "tests/dns_responder/dns_tls_certificate.h"
chenbruceb43ec752019-07-24 20:19:41 +080072#include "tests/dns_responder/dns_tls_frontend.h"
Luke Huangfde82482019-06-04 01:04:53 +080073#include "tests/resolv_test_utils.h"
Mike Yu6ce587d2019-12-19 21:30:22 +080074#include "tests/tun_forwarder.h"
paulhu0664f692020-12-14 16:48:26 +080075#include "tests/unsolicited_listener/unsolicited_event_listener.h"
Ken Chenb9fa2062018-11-13 21:51:13 +080076
Luke Huang0d592bc2019-05-25 18:24:03 +080077// Valid VPN netId range is 100 ~ 65535
78constexpr int TEST_VPN_NETID = 65502;
Luke Huang94b10b92018-11-21 20:13:38 +080079constexpr int MAXPACKET = (8 * 1024);
Ken Chenb9fa2062018-11-13 21:51:13 +080080
Mike Yu10832aa2020-08-25 19:13:11 +080081const std::string kSortNameserversFlag("persist.device_config.netd_native.sort_nameservers");
Mike Yue93d9ae2020-08-25 19:09:51 +080082const std::string kDotConnectTimeoutMsFlag(
83 "persist.device_config.netd_native.dot_connect_timeout_ms");
84const std::string kDotAsyncHandshakeFlag("persist.device_config.netd_native.dot_async_handshake");
Mike Yubb499092020-08-28 19:18:42 +080085const std::string kDotMaxretriesFlag("persist.device_config.netd_native.dot_maxtries");
Mike Yu10832aa2020-08-25 19:13:11 +080086
Ken Chenb9fa2062018-11-13 21:51:13 +080087// Semi-public Bionic hook used by the NDK (frameworks/base/native/android/net.c)
88// Tested here for convenience.
89extern "C" int android_getaddrinfofornet(const char* hostname, const char* servname,
90 const addrinfo* hints, unsigned netid, unsigned mark,
91 struct addrinfo** result);
92
Mike Yu153b5b82020-03-04 19:53:54 +080093using namespace std::chrono_literals;
94
Luke Huang70070852019-11-25 18:25:50 +080095using aidl::android::net::IDnsResolver;
Luke Huangf8215372019-11-22 11:53:41 +080096using aidl::android::net::INetd;
Mike Yu8ac63402019-12-02 15:28:38 +080097using aidl::android::net::ResolverParamsParcel;
Mike Yu532405f2020-06-17 17:46:44 +080098using aidl::android::net::metrics::INetdEventListener;
paulhu0664f692020-12-14 16:48:26 +080099using aidl::android::net::resolv::aidl::IDnsResolverUnsolicitedEventListener;
100using aidl::android::net::resolv::aidl::PrivateDnsValidationEventParcel;
Mike Yu6ce587d2019-12-19 21:30:22 +0800101using android::base::Error;
Luke Huang9807e6b2019-05-20 16:17:12 +0800102using android::base::ParseInt;
Mike Yu6ce587d2019-12-19 21:30:22 +0800103using android::base::Result;
Ken Chenb9fa2062018-11-13 21:51:13 +0800104using android::base::StringPrintf;
Luke Huang9807e6b2019-05-20 16:17:12 +0800105using android::base::unique_fd;
Ken Chenb9fa2062018-11-13 21:51:13 +0800106using android::net::ResolverStats;
Mike Yu6ce587d2019-12-19 21:30:22 +0800107using android::net::TunForwarder;
Hungming Chene8f970c2019-04-10 17:34:06 +0800108using android::net::metrics::DnsMetricsListener;
paulhu0664f692020-12-14 16:48:26 +0800109using android::net::resolv::aidl::UnsolicitedEventListener;
Ken Chenb9fa2062018-11-13 21:51:13 +0800110using android::netdutils::enableSockopt;
Hungming Chen63779052019-10-30 15:06:13 +0800111using android::netdutils::makeSlice;
Luke Huang9807e6b2019-05-20 16:17:12 +0800112using android::netdutils::ResponseCode;
Luke Huang9d2d25b2019-06-14 00:34:05 +0800113using android::netdutils::ScopedAddrinfo;
Mike Yu40e67072019-10-09 21:14:09 +0800114using android::netdutils::Stopwatch;
Hungming Chen63779052019-10-30 15:06:13 +0800115using android::netdutils::toHex;
Ken Chenb9fa2062018-11-13 21:51:13 +0800116
117// TODO: move into libnetdutils?
118namespace {
Luke Huangfde82482019-06-04 01:04:53 +0800119
Ken Chenb9fa2062018-11-13 21:51:13 +0800120ScopedAddrinfo safe_getaddrinfo(const char* node, const char* service,
121 const struct addrinfo* hints) {
122 addrinfo* result = nullptr;
123 if (getaddrinfo(node, service, hints, &result) != 0) {
124 result = nullptr; // Should already be the case, but...
125 }
126 return ScopedAddrinfo(result);
127}
Luke Huangfde82482019-06-04 01:04:53 +0800128
Mike Yu40e67072019-10-09 21:14:09 +0800129std::pair<ScopedAddrinfo, int> safe_getaddrinfo_time_taken(const char* node, const char* service,
130 const addrinfo& hints) {
131 Stopwatch s;
132 ScopedAddrinfo result = safe_getaddrinfo(node, service, &hints);
133 return {std::move(result), s.timeTakenUs() / 1000};
134}
135
Mike Yue2162e52020-03-04 18:43:46 +0800136struct NameserverStats {
137 NameserverStats() = delete;
138 NameserverStats(const std::string server) : server(server) {}
139 NameserverStats& setSuccesses(int val) {
140 successes = val;
141 return *this;
142 }
143 NameserverStats& setErrors(int val) {
144 errors = val;
145 return *this;
146 }
147 NameserverStats& setTimeouts(int val) {
148 timeouts = val;
149 return *this;
150 }
151 NameserverStats& setInternalErrors(int val) {
152 internal_errors = val;
153 return *this;
154 }
155
156 const std::string server;
157 int successes = 0;
158 int errors = 0;
159 int timeouts = 0;
160 int internal_errors = 0;
161};
162
Mike Yu61d17262020-02-15 18:56:22 +0800163class ScopedSystemProperties {
164 public:
165 ScopedSystemProperties(const std::string& key, const std::string& value) : mStoredKey(key) {
166 mStoredValue = android::base::GetProperty(key, "");
167 android::base::SetProperty(key, value);
168 }
169 ~ScopedSystemProperties() { android::base::SetProperty(mStoredKey, mStoredValue); }
170
171 private:
172 std::string mStoredKey;
173 std::string mStoredValue;
174};
175
Luke Huang5729afc2020-07-30 23:12:17 +0800176const bool isAtLeastR = (getApiLevel() >= 30);
177
Ken Chenb9fa2062018-11-13 21:51:13 +0800178} // namespace
179
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900180class ResolverTest : public ::testing::Test {
Hungming Chene8f970c2019-04-10 17:34:06 +0800181 public:
Hungming Chen473c4de2020-03-12 11:13:35 +0800182 static void SetUpTestSuite() {
Hungming Chen5bf09772019-04-25 11:16:13 +0800183 // Get binder service.
184 // Note that |mDnsClient| is not used for getting binder service in this static function.
185 // The reason is that wants to keep |mDnsClient| as a non-static data member. |mDnsClient|
186 // which sets up device network configuration could be independent from every test.
Luke Huangf8215372019-11-22 11:53:41 +0800187 // TODO: Perhaps add a static function in resolv_test_binder_utils.{cpp,h} to get binder
188 // service.
189
190 AIBinder* binder = AServiceManager_getService("dnsresolver");
Ken Chen753443a2020-11-09 20:52:01 +0800191 sResolvBinder = ndk::SpAIBinder(binder);
192 auto resolvService = aidl::android::net::IDnsResolver::fromBinder(sResolvBinder);
Hungming Chen5bf09772019-04-25 11:16:13 +0800193 ASSERT_NE(nullptr, resolvService.get());
194
195 // Subscribe the death recipient to the service IDnsResolver for detecting Netd death.
Luke Huang70070852019-11-25 18:25:50 +0800196 // GTEST assertion macros are not invoked for generating a test failure in the death
197 // recipient because the macros can't indicate failed test if Netd died between tests.
198 // Moreover, continuing testing may have no meaningful after Netd death. Therefore, the
199 // death recipient aborts process by GTEST_LOG_(FATAL) once Netd died.
Luke Huangf8215372019-11-22 11:53:41 +0800200 sResolvDeathRecipient = AIBinder_DeathRecipient_new([](void*) {
201 constexpr char errorMessage[] = "Netd died";
202 LOG(ERROR) << errorMessage;
203 GTEST_LOG_(FATAL) << errorMessage;
204 });
205 ASSERT_EQ(STATUS_OK, AIBinder_linkToDeath(binder, sResolvDeathRecipient, nullptr));
Hungming Chen5bf09772019-04-25 11:16:13 +0800206
207 // Subscribe the DNS listener for verifying DNS metrics event contents.
Luke Huangf8215372019-11-22 11:53:41 +0800208 sDnsMetricsListener = ndk::SharedRefBase::make<DnsMetricsListener>(
209 TEST_NETID /*monitor specific network*/);
Hungming Chen5bf09772019-04-25 11:16:13 +0800210 ASSERT_TRUE(resolvService->registerEventListener(sDnsMetricsListener).isOk());
211
paulhu0664f692020-12-14 16:48:26 +0800212 // Subscribe the unsolicited event listener for verifying unsolicited event contents.
213 sUnsolicitedEventListener = ndk::SharedRefBase::make<UnsolicitedEventListener>(
214 TEST_NETID /*monitor specific network*/);
215 ASSERT_TRUE(
216 resolvService->registerUnsolicitedEventListener(sUnsolicitedEventListener).isOk());
217
Hungming Chen5bf09772019-04-25 11:16:13 +0800218 // Start the binder thread pool for listening DNS metrics events and receiving death
219 // recipient.
Luke Huangf8215372019-11-22 11:53:41 +0800220 ABinderProcess_startThreadPool();
Hungming Chene8f970c2019-04-10 17:34:06 +0800221 }
Hungming Chen473c4de2020-03-12 11:13:35 +0800222 static void TearDownTestSuite() { AIBinder_DeathRecipient_delete(sResolvDeathRecipient); }
Hungming Chene8f970c2019-04-10 17:34:06 +0800223
Ken Chenb9fa2062018-11-13 21:51:13 +0800224 protected:
Lorenzo Colitti61f796b2020-05-21 00:57:49 +0900225 void SetUp() {
226 mDnsClient.SetUp();
227 sDnsMetricsListener->reset();
paulhu0664f692020-12-14 16:48:26 +0800228 sUnsolicitedEventListener->reset();
Lorenzo Colitti61f796b2020-05-21 00:57:49 +0900229 }
230
Mike Yu960243d2020-01-17 19:02:15 +0800231 void TearDown() {
232 // Ensure the dump works at the end of each test.
233 DumpResolverService();
234
235 mDnsClient.TearDown();
236 }
nuccachena26cc2a2018-07-17 18:07:23 +0800237
Luke Huangf40df9c2020-04-21 08:51:48 +0800238 void resetNetwork() {
239 mDnsClient.TearDown();
240 mDnsClient.SetupOemNetwork();
241 }
242
Xiao Ma09b71022018-12-11 17:56:32 +0900243 void StartDns(test::DNSResponder& dns, const std::vector<DnsRecord>& records) {
244 for (const auto& r : records) {
245 dns.addMapping(r.host_name, r.type, r.addr);
246 }
247
248 ASSERT_TRUE(dns.startServer());
249 dns.clearQueries();
250 }
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900251
Mike Yu960243d2020-01-17 19:02:15 +0800252 void DumpResolverService() {
253 unique_fd fd(open("/dev/null", O_WRONLY));
254 EXPECT_EQ(mDnsClient.resolvService()->dump(fd, nullptr, 0), 0);
255
256 const char* querylogCmd[] = {"querylog"}; // Keep it sync with DnsQueryLog::DUMP_KEYWORD.
257 EXPECT_EQ(mDnsClient.resolvService()->dump(fd, querylogCmd, std::size(querylogCmd)), 0);
258 }
259
Hungming Chene8f970c2019-04-10 17:34:06 +0800260 bool WaitForNat64Prefix(ExpectNat64PrefixStatus status,
261 std::chrono::milliseconds timeout = std::chrono::milliseconds(1000)) {
Hungming Chen5bf09772019-04-25 11:16:13 +0800262 return sDnsMetricsListener->waitForNat64Prefix(status, timeout);
Hungming Chene8f970c2019-04-10 17:34:06 +0800263 }
264
Mike Yu724f77d2019-08-16 11:14:50 +0800265 bool WaitForPrivateDnsValidation(std::string serverAddr, bool validated) {
paulhu0664f692020-12-14 16:48:26 +0800266 return sDnsMetricsListener->waitForPrivateDnsValidation(serverAddr, validated) &&
267 sUnsolicitedEventListener->waitForPrivateDnsValidation(
268 serverAddr,
269 validated ? IDnsResolverUnsolicitedEventListener::VALIDATION_RESULT_SUCCESS
270 : IDnsResolverUnsolicitedEventListener::VALIDATION_RESULT_FAILURE);
Mike Yu724f77d2019-08-16 11:14:50 +0800271 }
272
Mike Yu153b5b82020-03-04 19:53:54 +0800273 bool hasUncaughtPrivateDnsValidation(const std::string& serverAddr) {
paulhu0664f692020-12-14 16:48:26 +0800274 return sDnsMetricsListener->findValidationRecord(serverAddr) &&
275 sUnsolicitedEventListener->findValidationRecord(serverAddr);
Mike Yu153b5b82020-03-04 19:53:54 +0800276 }
277
Mike Yu532405f2020-06-17 17:46:44 +0800278 void ExpectDnsEvent(int32_t eventType, int32_t returnCode, const std::string& hostname,
279 const std::vector<std::string>& ipAddresses) {
280 const DnsMetricsListener::DnsEvent expect = {
281 TEST_NETID, eventType, returnCode,
282 hostname, ipAddresses, static_cast<int32_t>(ipAddresses.size())};
Mike Yub8faac42020-06-20 11:11:44 +0800283 do {
284 // Blocking call until timeout.
285 const auto dnsEvent = sDnsMetricsListener->popDnsEvent();
286 ASSERT_TRUE(dnsEvent.has_value()) << "Expected DnsEvent " << expect;
287 if (dnsEvent.value() == expect) break;
288 LOG(INFO) << "Skip unexpected DnsEvent: " << dnsEvent.value();
289 } while (true);
Mike Yu532405f2020-06-17 17:46:44 +0800290 }
291
Mike Yu61d17262020-02-15 18:56:22 +0800292 enum class StatsCmp { LE, EQ };
293
294 bool expectStatsNotGreaterThan(const std::vector<NameserverStats>& nameserversStats) {
295 return expectStatsFromGetResolverInfo(nameserversStats, StatsCmp::LE);
296 }
297
298 bool expectStatsEqualTo(const std::vector<NameserverStats>& nameserversStats) {
299 return expectStatsFromGetResolverInfo(nameserversStats, StatsCmp::EQ);
300 }
301
302 bool expectStatsFromGetResolverInfo(const std::vector<NameserverStats>& nameserversStats,
303 const StatsCmp cmp) {
Mike Yue2162e52020-03-04 18:43:46 +0800304 std::vector<std::string> res_servers;
305 std::vector<std::string> res_domains;
306 std::vector<std::string> res_tls_servers;
307 res_params res_params;
308 std::vector<ResolverStats> res_stats;
309 int wait_for_pending_req_timeout_count;
310
311 if (!DnsResponderClient::GetResolverInfo(mDnsClient.resolvService(), TEST_NETID,
312 &res_servers, &res_domains, &res_tls_servers,
313 &res_params, &res_stats,
314 &wait_for_pending_req_timeout_count)) {
315 ADD_FAILURE() << "GetResolverInfo failed";
316 return false;
317 }
318
319 if (res_servers.size() != res_stats.size()) {
320 ADD_FAILURE() << fmt::format("res_servers.size() != res_stats.size(): {} != {}",
321 res_servers.size(), res_stats.size());
322 return false;
323 }
324 if (res_servers.size() != nameserversStats.size()) {
325 ADD_FAILURE() << fmt::format("res_servers.size() != nameserversStats.size(): {} != {}",
326 res_servers.size(), nameserversStats.size());
327 return false;
328 }
329
330 for (const auto& stats : nameserversStats) {
331 SCOPED_TRACE(stats.server);
332 const auto it = std::find(res_servers.begin(), res_servers.end(), stats.server);
333 if (it == res_servers.end()) {
334 ADD_FAILURE() << fmt::format("nameserver {} not found in the list {{{}}}",
335 stats.server, fmt::join(res_servers, ", "));
336 return false;
337 }
338 const int index = std::distance(res_servers.begin(), it);
339
340 // The check excludes rtt_avg, last_sample_time, and usable since they will be obsolete
341 // after |res_stats| is retrieved from NetConfig.dnsStats rather than NetConfig.nsstats.
Mike Yu61d17262020-02-15 18:56:22 +0800342 switch (cmp) {
343 case StatsCmp::EQ:
344 EXPECT_EQ(res_stats[index].successes, stats.successes);
345 EXPECT_EQ(res_stats[index].errors, stats.errors);
346 EXPECT_EQ(res_stats[index].timeouts, stats.timeouts);
347 EXPECT_EQ(res_stats[index].internal_errors, stats.internal_errors);
348 break;
349 case StatsCmp::LE:
350 EXPECT_LE(res_stats[index].successes, stats.successes);
351 EXPECT_LE(res_stats[index].errors, stats.errors);
352 EXPECT_LE(res_stats[index].timeouts, stats.timeouts);
353 EXPECT_LE(res_stats[index].internal_errors, stats.internal_errors);
354 break;
355 default:
356 ADD_FAILURE() << "Unknown comparator " << static_cast<int>(cmp);
357 return false;
358 }
Mike Yue2162e52020-03-04 18:43:46 +0800359 }
360
361 return true;
362 }
363
Mike Yu153b5b82020-03-04 19:53:54 +0800364 // Since there's no way to terminate private DNS validation threads at any time. Tests that
365 // focus on the results of private DNS validation can interfere with each other if they use the
366 // same IP address for test servers. getUniqueIPv4Address() is a workaround to reduce the
367 // possibility of tests being flaky. A feasible solution is to forbid the validation threads,
368 // which are considered as outdated (e.g. switch the resolver to private DNS OFF mode), updating
369 // the result to the PrivateDnsConfiguration instance.
370 static std::string getUniqueIPv4Address() {
371 static int counter = 0;
372 return fmt::format("127.0.100.{}", (++counter & 0xff));
373 }
374
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900375 DnsResponderClient mDnsClient;
Xiao Ma09b71022018-12-11 17:56:32 +0900376
Hungming Chen5bf09772019-04-25 11:16:13 +0800377 // Use a shared static DNS listener for all tests to avoid registering lots of listeners
378 // which may be released late until process terminated. Currently, registered DNS listener
379 // is removed by binder death notification which is fired when the process hosting an
380 // IBinder has gone away. If every test in ResolverTest registers its DNS listener, Netd
381 // may temporarily hold lots of dead listeners until the unit test process terminates.
382 // TODO: Perhaps add an unregistering listener binder call or fork a listener process which
383 // could be terminated earlier.
Luke Huangf8215372019-11-22 11:53:41 +0800384 static std::shared_ptr<DnsMetricsListener>
Hungming Chen473c4de2020-03-12 11:13:35 +0800385 sDnsMetricsListener; // Initialized in SetUpTestSuite.
Hungming Chen5bf09772019-04-25 11:16:13 +0800386
paulhu0664f692020-12-14 16:48:26 +0800387 inline static std::shared_ptr<UnsolicitedEventListener>
388 sUnsolicitedEventListener; // Initialized in SetUpTestSuite.
389
Hungming Chen5bf09772019-04-25 11:16:13 +0800390 // Use a shared static death recipient to monitor the service death. The static death
391 // recipient could monitor the death not only during the test but also between tests.
Hungming Chen473c4de2020-03-12 11:13:35 +0800392 static AIBinder_DeathRecipient* sResolvDeathRecipient; // Initialized in SetUpTestSuite.
Ken Chen753443a2020-11-09 20:52:01 +0800393
394 // The linked AIBinder_DeathRecipient will be automatically unlinked if the binder is deleted.
395 // The binder needs to be retained throughout tests.
396 static ndk::SpAIBinder sResolvBinder;
Ken Chenb9fa2062018-11-13 21:51:13 +0800397};
398
Hungming Chen5bf09772019-04-25 11:16:13 +0800399// Initialize static member of class.
Luke Huangf8215372019-11-22 11:53:41 +0800400std::shared_ptr<DnsMetricsListener> ResolverTest::sDnsMetricsListener;
401AIBinder_DeathRecipient* ResolverTest::sResolvDeathRecipient;
Ken Chen753443a2020-11-09 20:52:01 +0800402ndk::SpAIBinder ResolverTest::sResolvBinder;
Hungming Chen5bf09772019-04-25 11:16:13 +0800403
Ken Chenb9fa2062018-11-13 21:51:13 +0800404TEST_F(ResolverTest, GetHostByName) {
Xiao Ma09b71022018-12-11 17:56:32 +0900405 constexpr char nonexistent_host_name[] = "nonexistent.example.com.";
406
407 test::DNSResponder dns;
408 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.3"}});
409 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800410
411 const hostent* result;
Ken Chenb9fa2062018-11-13 21:51:13 +0800412 result = gethostbyname("nonexistent");
413 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, nonexistent_host_name));
414 ASSERT_TRUE(result == nullptr);
Bernie Innocentic0d8ada2020-11-04 12:51:22 +0900415 EXPECT_EQ(HOST_NOT_FOUND, h_errno);
Ken Chenb9fa2062018-11-13 21:51:13 +0800416
417 dns.clearQueries();
418 result = gethostbyname("hello");
Xiao Ma09b71022018-12-11 17:56:32 +0900419 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
Ken Chenb9fa2062018-11-13 21:51:13 +0800420 ASSERT_FALSE(result == nullptr);
421 ASSERT_EQ(4, result->h_length);
422 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
423 EXPECT_EQ("1.2.3.3", ToString(result));
424 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800425}
426
Bernie Innocentic0d8ada2020-11-04 12:51:22 +0900427TEST_F(ResolverTest, GetHostByName_NULL) {
428 // Most libc implementations would just crash on gethostbyname(NULL). Instead, Bionic
429 // serializes the null argument over dnsproxyd, causing the server-side to crash!
430 // This is a regression test.
431 const char* const testcases[] = {nullptr, "", "^"};
432 for (const char* name : testcases) {
433 SCOPED_TRACE(fmt::format("gethostbyname({})", name ? name : "NULL"));
434 const hostent* result = gethostbyname(name);
435 EXPECT_TRUE(result == nullptr);
436 EXPECT_EQ(HOST_NOT_FOUND, h_errno);
437 }
438}
439
lifr4e4a2e02019-01-29 16:53:51 +0800440TEST_F(ResolverTest, GetHostByName_cnames) {
441 constexpr char host_name[] = "host.example.com.";
442 size_t cnamecount = 0;
443 test::DNSResponder dns;
444
445 const std::vector<DnsRecord> records = {
446 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
447 {"a.example.com.", ns_type::ns_t_cname, "b.example.com."},
448 {"b.example.com.", ns_type::ns_t_cname, "c.example.com."},
449 {"c.example.com.", ns_type::ns_t_cname, "d.example.com."},
450 {"d.example.com.", ns_type::ns_t_cname, "e.example.com."},
451 {"e.example.com.", ns_type::ns_t_cname, host_name},
452 {host_name, ns_type::ns_t_a, "1.2.3.3"},
453 {host_name, ns_type::ns_t_aaaa, "2001:db8::42"},
454 };
455 StartDns(dns, records);
456 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
457
458 // using gethostbyname2() to resolve ipv4 hello.example.com. to 1.2.3.3
459 // Ensure the v4 address and cnames are correct
460 const hostent* result;
461 result = gethostbyname2("hello", AF_INET);
462 ASSERT_FALSE(result == nullptr);
463
464 for (int i = 0; result != nullptr && result->h_aliases[i] != nullptr; i++) {
465 std::string domain_name = records[i].host_name.substr(0, records[i].host_name.size() - 1);
466 EXPECT_EQ(result->h_aliases[i], domain_name);
467 cnamecount++;
468 }
469 // The size of "Non-cname type" record in DNS records is 2
470 ASSERT_EQ(cnamecount, records.size() - 2);
471 ASSERT_EQ(4, result->h_length);
472 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
473 EXPECT_EQ("1.2.3.3", ToString(result));
474 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
475 EXPECT_EQ(1U, dns.queries().size()) << dns.dumpQueries();
476
477 // using gethostbyname2() to resolve ipv6 hello.example.com. to 2001:db8::42
478 // Ensure the v6 address and cnames are correct
479 cnamecount = 0;
480 dns.clearQueries();
481 result = gethostbyname2("hello", AF_INET6);
482 for (unsigned i = 0; result != nullptr && result->h_aliases[i] != nullptr; i++) {
483 std::string domain_name = records[i].host_name.substr(0, records[i].host_name.size() - 1);
484 EXPECT_EQ(result->h_aliases[i], domain_name);
485 cnamecount++;
486 }
487 // The size of "Non-cname type" DNS record in records is 2
488 ASSERT_EQ(cnamecount, records.size() - 2);
489 ASSERT_FALSE(result == nullptr);
490 ASSERT_EQ(16, result->h_length);
491 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
492 EXPECT_EQ("2001:db8::42", ToString(result));
493 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
494}
495
496TEST_F(ResolverTest, GetHostByName_cnamesInfiniteLoop) {
497 test::DNSResponder dns;
498 const std::vector<DnsRecord> records = {
499 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
500 {"a.example.com.", ns_type::ns_t_cname, kHelloExampleCom},
501 };
502 StartDns(dns, records);
503 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
504
505 const hostent* result;
506 result = gethostbyname2("hello", AF_INET);
507 ASSERT_TRUE(result == nullptr);
508
509 dns.clearQueries();
510 result = gethostbyname2("hello", AF_INET6);
511 ASSERT_TRUE(result == nullptr);
512}
513
Ken Chenb9fa2062018-11-13 21:51:13 +0800514TEST_F(ResolverTest, GetHostByName_localhost) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800515 constexpr char name_camelcase[] = "LocalHost";
Ken Chenb9fa2062018-11-13 21:51:13 +0800516 constexpr char name_ip6_dot[] = "ip6-localhost.";
517 constexpr char name_ip6_fqdn[] = "ip6-localhost.example.com.";
518
markchien96b09e22020-07-29 14:24:34 +0800519 // Add a no-op nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900520 test::DNSResponder dns;
521 StartDns(dns, {});
522 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800523
524 // Expect no DNS queries; localhost is resolved via /etc/hosts
Xiao Ma09b71022018-12-11 17:56:32 +0900525 const hostent* result = gethostbyname(kLocalHost);
Ken Chenb9fa2062018-11-13 21:51:13 +0800526 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
527 ASSERT_FALSE(result == nullptr);
528 ASSERT_EQ(4, result->h_length);
529 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900530 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800531 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
532
533 // Ensure the hosts file resolver ignores case of hostnames
534 result = gethostbyname(name_camelcase);
535 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
536 ASSERT_FALSE(result == nullptr);
537 ASSERT_EQ(4, result->h_length);
538 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900539 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800540 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
541
542 // The hosts file also contains ip6-localhost, but gethostbyname() won't
chenbruce018fdb22019-06-12 18:08:04 +0800543 // return it. This would be easy to
Ken Chenb9fa2062018-11-13 21:51:13 +0800544 // change, but there's no point in changing the legacy behavior; new code
545 // should be calling getaddrinfo() anyway.
546 // So we check the legacy behavior, which results in amusing A-record
547 // lookups for ip6-localhost, with and without search domains appended.
548 dns.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900549 result = gethostbyname(kIp6LocalHost);
Sehee Parkbbca0202018-11-16 10:53:16 +0900550 EXPECT_EQ(2U, dns.queries().size()) << dns.dumpQueries();
551 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, name_ip6_dot)) << dns.dumpQueries();
552 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, name_ip6_fqdn)) << dns.dumpQueries();
Ken Chenb9fa2062018-11-13 21:51:13 +0800553 ASSERT_TRUE(result == nullptr);
554
555 // Finally, use gethostbyname2() to resolve ip6-localhost to ::1 from
556 // the hosts file.
557 dns.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900558 result = gethostbyname2(kIp6LocalHost, AF_INET6);
Ken Chenb9fa2062018-11-13 21:51:13 +0800559 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
560 ASSERT_FALSE(result == nullptr);
561 ASSERT_EQ(16, result->h_length);
562 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900563 EXPECT_EQ(kIp6LocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800564 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800565}
566
567TEST_F(ResolverTest, GetHostByName_numeric) {
markchien96b09e22020-07-29 14:24:34 +0800568 // Add a no-op nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900569 test::DNSResponder dns;
570 StartDns(dns, {});
571 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800572
573 // Numeric v4 address: expect no DNS queries
574 constexpr char numeric_v4[] = "192.168.0.1";
Ken Chenb9fa2062018-11-13 21:51:13 +0800575 const hostent* result = gethostbyname(numeric_v4);
Sehee Parkbbca0202018-11-16 10:53:16 +0900576 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800577 ASSERT_FALSE(result == nullptr);
578 ASSERT_EQ(4, result->h_length); // v4
579 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
580 EXPECT_EQ(numeric_v4, ToString(result));
581 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
582
583 // gethostbyname() recognizes a v6 address, and fails with no DNS queries
584 constexpr char numeric_v6[] = "2001:db8::42";
585 dns.clearQueries();
586 result = gethostbyname(numeric_v6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900587 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800588 EXPECT_TRUE(result == nullptr);
589
590 // Numeric v6 address with gethostbyname2(): succeeds with no DNS queries
591 dns.clearQueries();
592 result = gethostbyname2(numeric_v6, AF_INET6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900593 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800594 ASSERT_FALSE(result == nullptr);
595 ASSERT_EQ(16, result->h_length); // v6
596 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
597 EXPECT_EQ(numeric_v6, ToString(result));
598 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
599
600 // Numeric v6 address with scope work with getaddrinfo(),
601 // but gethostbyname2() does not understand them; it issues two dns
602 // queries, then fails. This hardly ever happens, there's no point
603 // in fixing this. This test simply verifies the current (bogus)
604 // behavior to avoid further regressions (like crashes, or leaks).
605 constexpr char numeric_v6_scope[] = "fe80::1%lo";
606 dns.clearQueries();
607 result = gethostbyname2(numeric_v6_scope, AF_INET6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900608 EXPECT_EQ(2U, dns.queries().size()); // OUCH!
Ken Chenb9fa2062018-11-13 21:51:13 +0800609 ASSERT_TRUE(result == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800610}
611
612TEST_F(ResolverTest, BinderSerialization) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800613 std::vector<int> params_offsets = {
Luke Huang5bd827c2019-03-14 16:10:04 +0800614 IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY,
615 IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD,
616 IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES,
617 IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES,
618 IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC,
619 IDnsResolver::RESOLVER_PARAMS_RETRY_COUNT,
Ken Chenb9fa2062018-11-13 21:51:13 +0800620 };
Bernie Innocentib102dd22018-12-04 14:57:48 +0900621 const int size = static_cast<int>(params_offsets.size());
Luke Huang5bd827c2019-03-14 16:10:04 +0800622 EXPECT_EQ(size, IDnsResolver::RESOLVER_PARAMS_COUNT);
Ken Chenb9fa2062018-11-13 21:51:13 +0800623 std::sort(params_offsets.begin(), params_offsets.end());
Bernie Innocentib102dd22018-12-04 14:57:48 +0900624 for (int i = 0; i < size; ++i) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800625 EXPECT_EQ(params_offsets[i], i);
626 }
627}
628
629TEST_F(ResolverTest, GetHostByName_Binder) {
Luke Huangf8215372019-11-22 11:53:41 +0800630 std::vector<std::string> domains = {"example.com"};
Ken Chenb9fa2062018-11-13 21:51:13 +0800631 std::vector<std::unique_ptr<test::DNSResponder>> dns;
632 std::vector<std::string> servers;
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900633 std::vector<DnsResponderClient::Mapping> mappings;
634 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupMappings(1, domains, &mappings));
635 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupDNSServers(4, mappings, &dns, &servers));
Ken Chenb9fa2062018-11-13 21:51:13 +0800636 ASSERT_EQ(1U, mappings.size());
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900637 const DnsResponderClient::Mapping& mapping = mappings[0];
Ken Chenb9fa2062018-11-13 21:51:13 +0800638
Xiao Ma09b71022018-12-11 17:56:32 +0900639 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains, kDefaultParams));
Ken Chenb9fa2062018-11-13 21:51:13 +0800640
641 const hostent* result = gethostbyname(mapping.host.c_str());
Bernie Innocentib102dd22018-12-04 14:57:48 +0900642 const size_t total_queries =
Luke Huangfde82482019-06-04 01:04:53 +0800643 std::accumulate(dns.begin(), dns.end(), 0, [&mapping](size_t total, auto& d) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800644 return total + GetNumQueriesForType(*d, ns_type::ns_t_a, mapping.entry.c_str());
645 });
646
647 EXPECT_LE(1U, total_queries);
648 ASSERT_FALSE(result == nullptr);
649 ASSERT_EQ(4, result->h_length);
650 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
651 EXPECT_EQ(mapping.ip4, ToString(result));
652 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
653
654 std::vector<std::string> res_servers;
655 std::vector<std::string> res_domains;
Mike Yu0a1c53d2018-11-26 13:26:21 +0900656 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +0900657 res_params res_params;
Ken Chenb9fa2062018-11-13 21:51:13 +0800658 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +0800659 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +0800660 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
661 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
662 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chenb9fa2062018-11-13 21:51:13 +0800663 EXPECT_EQ(servers.size(), res_servers.size());
664 EXPECT_EQ(domains.size(), res_domains.size());
Mike Yu0a1c53d2018-11-26 13:26:21 +0900665 EXPECT_EQ(0U, res_tls_servers.size());
Luke Huang5bd827c2019-03-14 16:10:04 +0800666 ASSERT_EQ(static_cast<size_t>(IDnsResolver::RESOLVER_PARAMS_COUNT), kDefaultParams.size());
667 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY],
668 res_params.sample_validity);
669 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900670 res_params.success_threshold);
Luke Huang5bd827c2019-03-14 16:10:04 +0800671 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
672 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
673 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
Ken Chenb9fa2062018-11-13 21:51:13 +0800674 res_params.base_timeout_msec);
675 EXPECT_EQ(servers.size(), res_stats.size());
676
Bernie Innocenti0c067e42019-04-01 15:33:16 +0900677 EXPECT_THAT(res_servers, testing::UnorderedElementsAreArray(servers));
678 EXPECT_THAT(res_domains, testing::UnorderedElementsAreArray(domains));
Ken Chenb9fa2062018-11-13 21:51:13 +0800679}
680
681TEST_F(ResolverTest, GetAddrInfo) {
Xiao Ma09b71022018-12-11 17:56:32 +0900682 constexpr char listen_addr[] = "127.0.0.4";
683 constexpr char listen_addr2[] = "127.0.0.5";
684 constexpr char host_name[] = "howdy.example.com.";
Ken Chenb9fa2062018-11-13 21:51:13 +0800685
Xiao Ma09b71022018-12-11 17:56:32 +0900686 const std::vector<DnsRecord> records = {
687 {host_name, ns_type::ns_t_a, "1.2.3.4"},
688 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
689 };
690 test::DNSResponder dns(listen_addr);
691 test::DNSResponder dns2(listen_addr2);
692 StartDns(dns, records);
693 StartDns(dns2, records);
Ken Chenb9fa2062018-11-13 21:51:13 +0800694
Xiao Ma09b71022018-12-11 17:56:32 +0900695 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}));
Ken Chenb9fa2062018-11-13 21:51:13 +0800696 dns.clearQueries();
697 dns2.clearQueries();
698
699 ScopedAddrinfo result = safe_getaddrinfo("howdy", nullptr, nullptr);
700 EXPECT_TRUE(result != nullptr);
701 size_t found = GetNumQueries(dns, host_name);
702 EXPECT_LE(1U, found);
703 // Could be A or AAAA
704 std::string result_str = ToString(result);
705 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +0800706 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +0800707
708 // Verify that the name is cached.
709 size_t old_found = found;
710 result = safe_getaddrinfo("howdy", nullptr, nullptr);
711 EXPECT_TRUE(result != nullptr);
712 found = GetNumQueries(dns, host_name);
713 EXPECT_LE(1U, found);
714 EXPECT_EQ(old_found, found);
715 result_str = ToString(result);
Luke Huangf8215372019-11-22 11:53:41 +0800716 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4") << result_str;
Ken Chenb9fa2062018-11-13 21:51:13 +0800717
718 // Change the DNS resolver, ensure that queries are still cached.
Xiao Ma09b71022018-12-11 17:56:32 +0900719 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr2}));
Ken Chenb9fa2062018-11-13 21:51:13 +0800720 dns.clearQueries();
721 dns2.clearQueries();
722
723 result = safe_getaddrinfo("howdy", nullptr, nullptr);
724 EXPECT_TRUE(result != nullptr);
725 found = GetNumQueries(dns, host_name);
726 size_t found2 = GetNumQueries(dns2, host_name);
727 EXPECT_EQ(0U, found);
728 EXPECT_LE(0U, found2);
729
730 // Could be A or AAAA
731 result_str = ToString(result);
732 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +0800733 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +0800734}
735
736TEST_F(ResolverTest, GetAddrInfoV4) {
Xiao Ma09b71022018-12-11 17:56:32 +0900737 test::DNSResponder dns;
738 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.5"}});
739 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800740
Xiao Ma09b71022018-12-11 17:56:32 +0900741 const addrinfo hints = {.ai_family = AF_INET};
742 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
Ken Chenb9fa2062018-11-13 21:51:13 +0800743 EXPECT_TRUE(result != nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900744 EXPECT_EQ(1U, GetNumQueries(dns, kHelloExampleCom));
Ken Chenb9fa2062018-11-13 21:51:13 +0800745 EXPECT_EQ("1.2.3.5", ToString(result));
746}
747
748TEST_F(ResolverTest, GetAddrInfo_localhost) {
markchien96b09e22020-07-29 14:24:34 +0800749 // Add a no-op nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900750 test::DNSResponder dns;
751 StartDns(dns, {});
752 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800753
Xiao Ma09b71022018-12-11 17:56:32 +0900754 ScopedAddrinfo result = safe_getaddrinfo(kLocalHost, nullptr, nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800755 EXPECT_TRUE(result != nullptr);
756 // Expect no DNS queries; localhost is resolved via /etc/hosts
757 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900758 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800759
Xiao Ma09b71022018-12-11 17:56:32 +0900760 result = safe_getaddrinfo(kIp6LocalHost, nullptr, nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800761 EXPECT_TRUE(result != nullptr);
762 // Expect no DNS queries; ip6-localhost is resolved via /etc/hosts
763 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900764 EXPECT_EQ(kIp6LocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800765}
766
Luke Huangd8ac4752019-06-18 17:05:47 +0800767TEST_F(ResolverTest, GetAddrInfo_InvalidSocketType) {
768 test::DNSResponder dns;
769 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.5"}});
770 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
771
772 // TODO: Test other invalid socket types.
773 const addrinfo hints = {
774 .ai_family = AF_UNSPEC,
Luke Huangd8ac4752019-06-18 17:05:47 +0800775 .ai_socktype = SOCK_PACKET,
776 };
777 addrinfo* result = nullptr;
778 // This is a valid hint, but the query won't be sent because the socket type is
779 // not supported.
780 EXPECT_EQ(EAI_NODATA, getaddrinfo("hello", nullptr, &hints, &result));
781 ScopedAddrinfo result_cleanup(result);
782 EXPECT_EQ(nullptr, result);
783}
784
Ken Chen92bed612018-12-22 21:46:55 +0800785// Verify if the resolver correctly handle multiple queries simultaneously
786// step 1: set dns server#1 into deferred responding mode.
787// step 2: thread#1 query "hello.example.com." --> resolver send query to server#1.
788// step 3: thread#2 query "hello.example.com." --> resolver hold the request and wait for
789// response of previous pending query sent by thread#1.
790// step 4: thread#3 query "konbanha.example.com." --> resolver send query to server#3. Server
791// respond to resolver immediately.
792// step 5: check if server#1 get 1 query by thread#1, server#2 get 0 query, server#3 get 1 query.
793// step 6: resume dns server#1 to respond dns query in step#2.
794// step 7: thread#1 and #2 should get returned from DNS query after step#6. Also, check the
795// number of queries in server#2 is 0 to ensure thread#2 does not wake up unexpectedly
796// before signaled by thread#1.
797TEST_F(ResolverTest, GetAddrInfoV4_deferred_resp) {
798 const char* listen_addr1 = "127.0.0.9";
799 const char* listen_addr2 = "127.0.0.10";
800 const char* listen_addr3 = "127.0.0.11";
801 const char* listen_srv = "53";
802 const char* host_name_deferred = "hello.example.com.";
803 const char* host_name_normal = "konbanha.example.com.";
Mike Yufc125e42019-05-15 20:41:28 +0800804 test::DNSResponder dns1(listen_addr1, listen_srv, ns_rcode::ns_r_servfail);
805 test::DNSResponder dns2(listen_addr2, listen_srv, ns_rcode::ns_r_servfail);
806 test::DNSResponder dns3(listen_addr3, listen_srv, ns_rcode::ns_r_servfail);
Ken Chen92bed612018-12-22 21:46:55 +0800807 dns1.addMapping(host_name_deferred, ns_type::ns_t_a, "1.2.3.4");
808 dns2.addMapping(host_name_deferred, ns_type::ns_t_a, "1.2.3.4");
809 dns3.addMapping(host_name_normal, ns_type::ns_t_a, "1.2.3.5");
810 ASSERT_TRUE(dns1.startServer());
811 ASSERT_TRUE(dns2.startServer());
812 ASSERT_TRUE(dns3.startServer());
813 const std::vector<std::string> servers_for_t1 = {listen_addr1};
814 const std::vector<std::string> servers_for_t2 = {listen_addr2};
815 const std::vector<std::string> servers_for_t3 = {listen_addr3};
816 addrinfo hints = {.ai_family = AF_INET};
817 const std::vector<int> params = {300, 25, 8, 8, 5000};
818 bool t3_task_done = false;
819
820 dns1.setDeferredResp(true);
821 std::thread t1([&, this]() {
822 ASSERT_TRUE(
823 mDnsClient.SetResolversForNetwork(servers_for_t1, kDefaultSearchDomains, params));
824 ScopedAddrinfo result = safe_getaddrinfo(host_name_deferred, nullptr, &hints);
825 // t3's dns query should got returned first
826 EXPECT_TRUE(t3_task_done);
827 EXPECT_EQ(1U, GetNumQueries(dns1, host_name_deferred));
828 EXPECT_TRUE(result != nullptr);
829 EXPECT_EQ("1.2.3.4", ToString(result));
830 });
831
832 // ensuring t1 and t2 handler functions are processed in order
833 usleep(100 * 1000);
834 std::thread t2([&, this]() {
835 ASSERT_TRUE(
836 mDnsClient.SetResolversForNetwork(servers_for_t2, kDefaultSearchDomains, params));
837 ScopedAddrinfo result = safe_getaddrinfo(host_name_deferred, nullptr, &hints);
838 EXPECT_TRUE(t3_task_done);
839 EXPECT_EQ(0U, GetNumQueries(dns2, host_name_deferred));
840 EXPECT_TRUE(result != nullptr);
841 EXPECT_EQ("1.2.3.4", ToString(result));
842
843 std::vector<std::string> res_servers;
844 std::vector<std::string> res_domains;
845 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +0900846 res_params res_params;
Ken Chen92bed612018-12-22 21:46:55 +0800847 std::vector<ResolverStats> res_stats;
848 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +0800849 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
850 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains,
851 &res_tls_servers, &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chen92bed612018-12-22 21:46:55 +0800852 EXPECT_EQ(0, wait_for_pending_req_timeout_count);
853 });
854
855 // ensuring t2 and t3 handler functions are processed in order
856 usleep(100 * 1000);
857 std::thread t3([&, this]() {
858 ASSERT_TRUE(
859 mDnsClient.SetResolversForNetwork(servers_for_t3, kDefaultSearchDomains, params));
860 ScopedAddrinfo result = safe_getaddrinfo(host_name_normal, nullptr, &hints);
861 EXPECT_EQ(1U, GetNumQueries(dns1, host_name_deferred));
862 EXPECT_EQ(0U, GetNumQueries(dns2, host_name_deferred));
863 EXPECT_EQ(1U, GetNumQueries(dns3, host_name_normal));
864 EXPECT_TRUE(result != nullptr);
865 EXPECT_EQ("1.2.3.5", ToString(result));
866
867 t3_task_done = true;
868 dns1.setDeferredResp(false);
869 });
870 t3.join();
871 t1.join();
872 t2.join();
873}
874
lifr4e4a2e02019-01-29 16:53:51 +0800875TEST_F(ResolverTest, GetAddrInfo_cnames) {
876 constexpr char host_name[] = "host.example.com.";
877 test::DNSResponder dns;
878 const std::vector<DnsRecord> records = {
879 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
880 {"a.example.com.", ns_type::ns_t_cname, "b.example.com."},
881 {"b.example.com.", ns_type::ns_t_cname, "c.example.com."},
882 {"c.example.com.", ns_type::ns_t_cname, "d.example.com."},
883 {"d.example.com.", ns_type::ns_t_cname, "e.example.com."},
884 {"e.example.com.", ns_type::ns_t_cname, host_name},
885 {host_name, ns_type::ns_t_a, "1.2.3.3"},
886 {host_name, ns_type::ns_t_aaaa, "2001:db8::42"},
887 };
888 StartDns(dns, records);
889 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
890
891 addrinfo hints = {.ai_family = AF_INET};
892 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
893 EXPECT_TRUE(result != nullptr);
894 EXPECT_EQ("1.2.3.3", ToString(result));
895
896 dns.clearQueries();
897 hints = {.ai_family = AF_INET6};
898 result = safe_getaddrinfo("hello", nullptr, &hints);
899 EXPECT_TRUE(result != nullptr);
900 EXPECT_EQ("2001:db8::42", ToString(result));
901}
902
903TEST_F(ResolverTest, GetAddrInfo_cnamesNoIpAddress) {
904 test::DNSResponder dns;
905 const std::vector<DnsRecord> records = {
906 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
907 };
908 StartDns(dns, records);
909 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
910
911 addrinfo hints = {.ai_family = AF_INET};
912 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
913 EXPECT_TRUE(result == nullptr);
914
915 dns.clearQueries();
916 hints = {.ai_family = AF_INET6};
917 result = safe_getaddrinfo("hello", nullptr, &hints);
918 EXPECT_TRUE(result == nullptr);
919}
920
921TEST_F(ResolverTest, GetAddrInfo_cnamesIllegalRdata) {
922 test::DNSResponder dns;
923 const std::vector<DnsRecord> records = {
924 {kHelloExampleCom, ns_type::ns_t_cname, ".!#?"},
925 };
926 StartDns(dns, records);
927 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
928
929 addrinfo hints = {.ai_family = AF_INET};
930 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
931 EXPECT_TRUE(result == nullptr);
932
933 dns.clearQueries();
934 hints = {.ai_family = AF_INET6};
935 result = safe_getaddrinfo("hello", nullptr, &hints);
936 EXPECT_TRUE(result == nullptr);
937}
938
Pabba Prakash66707822020-01-08 15:34:58 +0530939TEST_F(ResolverTest, GetAddrInfoForCaseInSensitiveDomains) {
940 test::DNSResponder dns;
941 const char* host_name = "howdy.example.com.";
942 const char* host_name2 = "HOWDY.example.com.";
943 const std::vector<DnsRecord> records = {
944 {host_name, ns_type::ns_t_a, "1.2.3.4"},
945 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
946 {host_name2, ns_type::ns_t_a, "1.2.3.5"},
947 {host_name2, ns_type::ns_t_aaaa, "::1.2.3.5"},
948 };
949 StartDns(dns, records);
950 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
951
952 ScopedAddrinfo hostname_result = safe_getaddrinfo("howdy", nullptr, nullptr);
953 EXPECT_TRUE(hostname_result != nullptr);
954 const size_t hostname1_count_after_first_query = GetNumQueries(dns, host_name);
955 EXPECT_LE(1U, hostname1_count_after_first_query);
956 // Could be A or AAAA
957 std::string hostname_result_str = ToString(hostname_result);
958 EXPECT_TRUE(hostname_result_str == "1.2.3.4" || hostname_result_str == "::1.2.3.4");
959
960 // Verify that the name is cached.
961 ScopedAddrinfo hostname2_result = safe_getaddrinfo("HOWDY", nullptr, nullptr);
962 EXPECT_TRUE(hostname2_result != nullptr);
963 const size_t hostname1_count_after_second_query = GetNumQueries(dns, host_name);
964 EXPECT_LE(1U, hostname1_count_after_second_query);
965
966 // verify that there is no change in num of queries for howdy.example.com
967 EXPECT_EQ(hostname1_count_after_first_query, hostname1_count_after_second_query);
968
969 // Number of queries for HOWDY.example.com would be >= 1 if domain names
970 // are considered case-sensitive, else number of queries should be 0.
971 const size_t hostname2_count = GetNumQueries(dns, host_name2);
972 EXPECT_EQ(0U,hostname2_count);
973 std::string hostname2_result_str = ToString(hostname2_result);
974 EXPECT_TRUE(hostname2_result_str == "1.2.3.4" || hostname2_result_str == "::1.2.3.4");
975
976 // verify that the result is still the same address even though
977 // mixed-case string is not in the DNS
978 ScopedAddrinfo result = safe_getaddrinfo("HowDY", nullptr, nullptr);
979 EXPECT_TRUE(result != nullptr);
980 std::string result_str = ToString(result);
981 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4");
982}
983
Ken Chenb9fa2062018-11-13 21:51:13 +0800984TEST_F(ResolverTest, MultidomainResolution) {
Xiao Ma09b71022018-12-11 17:56:32 +0900985 constexpr char host_name[] = "nihao.example2.com.";
Luke Huangf8215372019-11-22 11:53:41 +0800986 std::vector<std::string> searchDomains = {"example1.com", "example2.com", "example3.com"};
Ken Chenb9fa2062018-11-13 21:51:13 +0800987
Xiao Ma09b71022018-12-11 17:56:32 +0900988 test::DNSResponder dns("127.0.0.6");
989 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.3"}});
990 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({"127.0.0.6"}, searchDomains));
991
Ken Chenb9fa2062018-11-13 21:51:13 +0800992 const hostent* result = gethostbyname("nihao");
Xiao Ma09b71022018-12-11 17:56:32 +0900993
Ken Chenb9fa2062018-11-13 21:51:13 +0800994 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
995 ASSERT_FALSE(result == nullptr);
996 ASSERT_EQ(4, result->h_length);
997 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
998 EXPECT_EQ("1.2.3.3", ToString(result));
999 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +08001000}
1001
1002TEST_F(ResolverTest, GetAddrInfoV6_numeric) {
Ken Chenb9fa2062018-11-13 21:51:13 +08001003 constexpr char host_name[] = "ohayou.example.com.";
1004 constexpr char numeric_addr[] = "fe80::1%lo";
1005
Xiao Ma09b71022018-12-11 17:56:32 +09001006 test::DNSResponder dns;
Ken Chenb9fa2062018-11-13 21:51:13 +08001007 dns.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +09001008 StartDns(dns, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
1009 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001010
1011 addrinfo hints = {.ai_family = AF_INET6};
1012 ScopedAddrinfo result = safe_getaddrinfo(numeric_addr, nullptr, &hints);
1013 EXPECT_TRUE(result != nullptr);
1014 EXPECT_EQ(numeric_addr, ToString(result));
1015 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
1016
1017 // Now try a non-numeric hostname query with the AI_NUMERICHOST flag set.
1018 // We should fail without sending out a DNS query.
1019 hints.ai_flags |= AI_NUMERICHOST;
1020 result = safe_getaddrinfo(host_name, nullptr, &hints);
1021 EXPECT_TRUE(result == nullptr);
1022 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
1023}
1024
1025TEST_F(ResolverTest, GetAddrInfoV6_failing) {
Xiao Ma09b71022018-12-11 17:56:32 +09001026 constexpr char listen_addr0[] = "127.0.0.7";
1027 constexpr char listen_addr1[] = "127.0.0.8";
Ken Chenb9fa2062018-11-13 21:51:13 +08001028 const char* host_name = "ohayou.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09001029
1030 test::DNSResponder dns0(listen_addr0);
1031 test::DNSResponder dns1(listen_addr1);
Ken Chenb9fa2062018-11-13 21:51:13 +08001032 dns0.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +09001033 StartDns(dns0, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
1034 StartDns(dns1, {{host_name, ns_type::ns_t_aaaa, "2001:db8::6"}});
1035
Luke Huangf8215372019-11-22 11:53:41 +08001036 std::vector<std::string> servers = {listen_addr0, listen_addr1};
Ken Chenb9fa2062018-11-13 21:51:13 +08001037 // <sample validity in s> <success threshold in percent> <min samples> <max samples>
1038 int sample_count = 8;
Luke Huangf8215372019-11-22 11:53:41 +08001039 const std::vector<int> params = {300, 25, sample_count, sample_count};
Xiao Ma09b71022018-12-11 17:56:32 +09001040 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, kDefaultSearchDomains, params));
Ken Chenb9fa2062018-11-13 21:51:13 +08001041
1042 // Repeatedly perform resolutions for non-existing domains until MAXNSSAMPLES resolutions have
1043 // reached the dns0, which is set to fail. No more requests should then arrive at that server
1044 // for the next sample_lifetime seconds.
1045 // TODO: This approach is implementation-dependent, change once metrics reporting is available.
Xiao Ma09b71022018-12-11 17:56:32 +09001046 const addrinfo hints = {.ai_family = AF_INET6};
Bernie Innocentib102dd22018-12-04 14:57:48 +09001047 for (int i = 0; i < sample_count; ++i) {
Ken Chenb9fa2062018-11-13 21:51:13 +08001048 std::string domain = StringPrintf("nonexistent%d", i);
1049 ScopedAddrinfo result = safe_getaddrinfo(domain.c_str(), nullptr, &hints);
1050 }
1051 // Due to 100% errors for all possible samples, the server should be ignored from now on and
1052 // only the second one used for all following queries, until NSSAMPLE_VALIDITY is reached.
1053 dns0.clearQueries();
1054 dns1.clearQueries();
1055 ScopedAddrinfo result = safe_getaddrinfo("ohayou", nullptr, &hints);
1056 EXPECT_TRUE(result != nullptr);
1057 EXPECT_EQ(0U, GetNumQueries(dns0, host_name));
1058 EXPECT_EQ(1U, GetNumQueries(dns1, host_name));
1059}
1060
1061TEST_F(ResolverTest, GetAddrInfoV6_nonresponsive) {
Xiao Ma09b71022018-12-11 17:56:32 +09001062 constexpr char listen_addr0[] = "127.0.0.7";
1063 constexpr char listen_addr1[] = "127.0.0.8";
1064 constexpr char listen_srv[] = "53";
1065 constexpr char host_name1[] = "ohayou.example.com.";
1066 constexpr char host_name2[] = "ciao.example.com.";
Luke Huang483cf332019-06-03 17:24:51 +08001067 const std::vector<std::string> defaultSearchDomain = {"example.com"};
1068 // The minimal timeout is 1000ms, so we can't decrease timeout
1069 // So reduce retry count.
1070 const std::vector<int> reduceRetryParams = {
1071 300, // sample validity in seconds
1072 25, // success threshod in percent
1073 8, 8, // {MIN,MAX}_SAMPLES
1074 1000, // BASE_TIMEOUT_MSEC
1075 1, // retry count
1076 };
Xiao Ma09b71022018-12-11 17:56:32 +09001077 const std::vector<DnsRecord> records0 = {
1078 {host_name1, ns_type::ns_t_aaaa, "2001:db8::5"},
1079 {host_name2, ns_type::ns_t_aaaa, "2001:db8::5"},
1080 };
1081 const std::vector<DnsRecord> records1 = {
1082 {host_name1, ns_type::ns_t_aaaa, "2001:db8::6"},
1083 {host_name2, ns_type::ns_t_aaaa, "2001:db8::6"},
1084 };
Ken Chenb9fa2062018-11-13 21:51:13 +08001085
1086 // dns0 does not respond with 100% probability, while
1087 // dns1 responds normally, at least initially.
Mike Yufc125e42019-05-15 20:41:28 +08001088 test::DNSResponder dns0(listen_addr0, listen_srv, static_cast<ns_rcode>(-1));
1089 test::DNSResponder dns1(listen_addr1, listen_srv, static_cast<ns_rcode>(-1));
Ken Chenb9fa2062018-11-13 21:51:13 +08001090 dns0.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +09001091 StartDns(dns0, records0);
1092 StartDns(dns1, records1);
Luke Huang483cf332019-06-03 17:24:51 +08001093 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr0, listen_addr1}, defaultSearchDomain,
1094 reduceRetryParams));
Ken Chenb9fa2062018-11-13 21:51:13 +08001095
Luke Huang483cf332019-06-03 17:24:51 +08001096 // Specify ai_socktype to make getaddrinfo will only query 1 time
1097 const addrinfo hints = {.ai_family = AF_INET6, .ai_socktype = SOCK_STREAM};
Ken Chenb9fa2062018-11-13 21:51:13 +08001098
1099 // dns0 will ignore the request, and we'll fallback to dns1 after the first
1100 // retry.
1101 ScopedAddrinfo result = safe_getaddrinfo(host_name1, nullptr, &hints);
1102 EXPECT_TRUE(result != nullptr);
1103 EXPECT_EQ(1U, GetNumQueries(dns0, host_name1));
1104 EXPECT_EQ(1U, GetNumQueries(dns1, host_name1));
Mike Yu532405f2020-06-17 17:46:44 +08001105 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, 0, host_name1, {"2001:db8::6"});
Ken Chenb9fa2062018-11-13 21:51:13 +08001106
1107 // Now make dns1 also ignore 100% requests... The resolve should alternate
Luke Huang483cf332019-06-03 17:24:51 +08001108 // queries between the nameservers and fail
Ken Chenb9fa2062018-11-13 21:51:13 +08001109 dns1.setResponseProbability(0.0);
1110 addrinfo* result2 = nullptr;
1111 EXPECT_EQ(EAI_NODATA, getaddrinfo(host_name2, nullptr, &hints, &result2));
1112 EXPECT_EQ(nullptr, result2);
Luke Huang483cf332019-06-03 17:24:51 +08001113 EXPECT_EQ(1U, GetNumQueries(dns0, host_name2));
1114 EXPECT_EQ(1U, GetNumQueries(dns1, host_name2));
Mike Yu532405f2020-06-17 17:46:44 +08001115 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, RCODE_TIMEOUT, host_name2, {});
Ken Chenb9fa2062018-11-13 21:51:13 +08001116}
1117
1118TEST_F(ResolverTest, GetAddrInfoV6_concurrent) {
Xiao Ma09b71022018-12-11 17:56:32 +09001119 constexpr char listen_addr0[] = "127.0.0.9";
1120 constexpr char listen_addr1[] = "127.0.0.10";
1121 constexpr char listen_addr2[] = "127.0.0.11";
1122 constexpr char host_name[] = "konbanha.example.com.";
1123
1124 test::DNSResponder dns0(listen_addr0);
1125 test::DNSResponder dns1(listen_addr1);
1126 test::DNSResponder dns2(listen_addr2);
1127 StartDns(dns0, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
1128 StartDns(dns1, {{host_name, ns_type::ns_t_aaaa, "2001:db8::6"}});
1129 StartDns(dns2, {{host_name, ns_type::ns_t_aaaa, "2001:db8::7"}});
1130
Luke Huangf8215372019-11-22 11:53:41 +08001131 const std::vector<std::string> servers = {listen_addr0, listen_addr1, listen_addr2};
Ken Chenb9fa2062018-11-13 21:51:13 +08001132 std::vector<std::thread> threads(10);
1133 for (std::thread& thread : threads) {
Luke Huangf8215372019-11-22 11:53:41 +08001134 thread = std::thread([this, &servers]() {
1135 unsigned delay = arc4random_uniform(1 * 1000 * 1000); // <= 1s
Ken Chenb9fa2062018-11-13 21:51:13 +08001136 usleep(delay);
1137 std::vector<std::string> serverSubset;
1138 for (const auto& server : servers) {
1139 if (arc4random_uniform(2)) {
1140 serverSubset.push_back(server);
1141 }
1142 }
1143 if (serverSubset.empty()) serverSubset = servers;
Xiao Ma09b71022018-12-11 17:56:32 +09001144 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(serverSubset));
1145 const addrinfo hints = {.ai_family = AF_INET6};
Ken Chenb9fa2062018-11-13 21:51:13 +08001146 addrinfo* result = nullptr;
1147 int rv = getaddrinfo("konbanha", nullptr, &hints, &result);
1148 EXPECT_EQ(0, rv) << "error [" << rv << "] " << gai_strerror(rv);
1149 if (result) {
1150 freeaddrinfo(result);
1151 result = nullptr;
1152 }
1153 });
1154 }
1155 for (std::thread& thread : threads) {
1156 thread.join();
1157 }
Ken Chen92bed612018-12-22 21:46:55 +08001158
1159 std::vector<std::string> res_servers;
1160 std::vector<std::string> res_domains;
1161 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001162 res_params res_params;
Ken Chen92bed612018-12-22 21:46:55 +08001163 std::vector<ResolverStats> res_stats;
1164 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001165 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1166 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1167 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chen92bed612018-12-22 21:46:55 +08001168 EXPECT_EQ(0, wait_for_pending_req_timeout_count);
Ken Chenb9fa2062018-11-13 21:51:13 +08001169}
1170
Mike Yu8ac63402019-12-02 15:28:38 +08001171TEST_F(ResolverTest, SkipBadServersDueToInternalError) {
1172 constexpr char listen_addr1[] = "fe80::1";
1173 constexpr char listen_addr2[] = "255.255.255.255";
1174 constexpr char listen_addr3[] = "127.0.0.3";
Mike Yu61d17262020-02-15 18:56:22 +08001175 int counter = 0; // To generate unique hostnames.
Mike Yu8ac63402019-12-02 15:28:38 +08001176 test::DNSResponder dns(listen_addr3);
1177 ASSERT_TRUE(dns.startServer());
1178
Mike Yu61d17262020-02-15 18:56:22 +08001179 ResolverParamsParcel setupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1180 setupParams.servers = {listen_addr1, listen_addr2, listen_addr3};
1181 setupParams.minSamples = 2; // Recognize bad servers in two attempts when sorting not enabled.
Mike Yu8ac63402019-12-02 15:28:38 +08001182
Mike Yu61d17262020-02-15 18:56:22 +08001183 ResolverParamsParcel cleanupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1184 cleanupParams.servers.clear();
1185 cleanupParams.tlsServers.clear();
Mike Yu8ac63402019-12-02 15:28:38 +08001186
Mike Yu61d17262020-02-15 18:56:22 +08001187 for (const auto& sortNameserversFlag : {"" /* unset */, "0" /* off */, "1" /* on */}) {
1188 SCOPED_TRACE(fmt::format("sortNameversFlag_{}", sortNameserversFlag));
1189 ScopedSystemProperties scopedSystemProperties(kSortNameserversFlag, sortNameserversFlag);
1190
Mike Yu10832aa2020-08-25 19:13:11 +08001191 // Re-setup test network to make experiment flag take effect.
1192 resetNetwork();
1193
Mike Yu61d17262020-02-15 18:56:22 +08001194 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(setupParams));
1195
1196 // Start sending synchronized querying.
1197 for (int i = 0; i < 100; i++) {
1198 std::string hostName = StringPrintf("hello%d.com.", counter++);
1199 dns.addMapping(hostName, ns_type::ns_t_a, "1.2.3.4");
1200 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1201 EXPECT_TRUE(safe_getaddrinfo(hostName.c_str(), nullptr, &hints) != nullptr);
1202 }
1203
1204 const std::vector<NameserverStats> targetStats = {
1205 NameserverStats(listen_addr1).setInternalErrors(5),
1206 NameserverStats(listen_addr2).setInternalErrors(5),
1207 NameserverStats(listen_addr3).setSuccesses(setupParams.maxSamples),
1208 };
1209 EXPECT_TRUE(expectStatsNotGreaterThan(targetStats));
1210
1211 // Also verify the number of queries received in the server because res_stats.successes has
1212 // a maximum.
1213 EXPECT_EQ(dns.queries().size(), 100U);
1214
1215 // Reset the state.
1216 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(cleanupParams));
1217 dns.clearQueries();
Mike Yu8ac63402019-12-02 15:28:38 +08001218 }
Mike Yu8ac63402019-12-02 15:28:38 +08001219}
1220
1221TEST_F(ResolverTest, SkipBadServersDueToTimeout) {
1222 constexpr char listen_addr1[] = "127.0.0.3";
1223 constexpr char listen_addr2[] = "127.0.0.4";
Mike Yu61d17262020-02-15 18:56:22 +08001224 int counter = 0; // To generate unique hostnames.
1225
1226 ResolverParamsParcel setupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1227 setupParams.servers = {listen_addr1, listen_addr2};
1228 setupParams.minSamples = 2; // Recognize bad servers in two attempts when sorting not enabled.
1229
1230 ResolverParamsParcel cleanupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1231 cleanupParams.servers.clear();
1232 cleanupParams.tlsServers.clear();
Mike Yu8ac63402019-12-02 15:28:38 +08001233
1234 // Set dns1 non-responsive and dns2 workable.
1235 test::DNSResponder dns1(listen_addr1, test::kDefaultListenService, static_cast<ns_rcode>(-1));
1236 test::DNSResponder dns2(listen_addr2);
1237 dns1.setResponseProbability(0.0);
1238 ASSERT_TRUE(dns1.startServer());
1239 ASSERT_TRUE(dns2.startServer());
1240
Mike Yu61d17262020-02-15 18:56:22 +08001241 for (const auto& sortNameserversFlag : {"" /* unset */, "0" /* off */, "1" /* on */}) {
1242 SCOPED_TRACE(fmt::format("sortNameversFlag_{}", sortNameserversFlag));
1243 ScopedSystemProperties scopedSystemProperties(kSortNameserversFlag, sortNameserversFlag);
Mike Yu8ac63402019-12-02 15:28:38 +08001244
Mike Yu10832aa2020-08-25 19:13:11 +08001245 // Re-setup test network to make experiment flag take effect.
1246 resetNetwork();
1247
Mike Yu61d17262020-02-15 18:56:22 +08001248 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(setupParams));
Mike Yu8ac63402019-12-02 15:28:38 +08001249
Mike Yu61d17262020-02-15 18:56:22 +08001250 // Start sending synchronized querying.
1251 for (int i = 0; i < 100; i++) {
1252 std::string hostName = StringPrintf("hello%d.com.", counter++);
1253 dns1.addMapping(hostName, ns_type::ns_t_a, "1.2.3.4");
1254 dns2.addMapping(hostName, ns_type::ns_t_a, "1.2.3.5");
1255 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1256 EXPECT_TRUE(safe_getaddrinfo(hostName.c_str(), nullptr, &hints) != nullptr);
1257 }
1258
1259 const std::vector<NameserverStats> targetStats = {
1260 NameserverStats(listen_addr1).setTimeouts(5),
1261 NameserverStats(listen_addr2).setSuccesses(setupParams.maxSamples),
1262 };
1263 EXPECT_TRUE(expectStatsNotGreaterThan(targetStats));
1264
1265 // Also verify the number of queries received in the server because res_stats.successes has
1266 // an upper bound.
1267 EXPECT_GT(dns1.queries().size(), 0U);
1268 EXPECT_LT(dns1.queries().size(), 5U);
1269 EXPECT_EQ(dns2.queries().size(), 100U);
1270
1271 // Reset the state.
1272 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(cleanupParams));
1273 dns1.clearQueries();
1274 dns2.clearQueries();
Mike Yu8ac63402019-12-02 15:28:38 +08001275 }
Mike Yu8ac63402019-12-02 15:28:38 +08001276}
1277
chenbrucefd837fa2019-10-29 18:35:36 +08001278TEST_F(ResolverTest, GetAddrInfoFromCustTable_InvalidInput) {
1279 constexpr char hostnameNoip[] = "noip.example.com.";
1280 constexpr char hostnameInvalidip[] = "invalidip.example.com.";
1281 const std::vector<aidl::android::net::ResolverHostsParcel> invalidCustHosts = {
1282 {"", hostnameNoip},
1283 {"wrong IP", hostnameInvalidip},
1284 };
1285 test::DNSResponder dns;
1286 StartDns(dns, {});
1287 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
Ken Chena6ac2a62020-04-07 17:25:56 +08001288 resolverParams.resolverOptions.hosts = invalidCustHosts;
chenbrucefd837fa2019-10-29 18:35:36 +08001289 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1290 for (const auto& hostname : {hostnameNoip, hostnameInvalidip}) {
1291 // The query won't get data from customized table because of invalid customized table
1292 // and DNSResponder also has no records. hostnameNoip has never registered and
1293 // hostnameInvalidip has registered but wrong IP.
1294 const addrinfo hints = {.ai_family = AF_UNSPEC};
1295 ScopedAddrinfo result = safe_getaddrinfo(hostname, nullptr, &hints);
1296 ASSERT_TRUE(result == nullptr);
1297 EXPECT_EQ(4U, GetNumQueries(dns, hostname));
1298 }
1299}
1300
1301TEST_F(ResolverTest, GetAddrInfoFromCustTable) {
1302 constexpr char hostnameV4[] = "v4only.example.com.";
1303 constexpr char hostnameV6[] = "v6only.example.com.";
1304 constexpr char hostnameV4V6[] = "v4v6.example.com.";
1305 constexpr char custAddrV4[] = "1.2.3.4";
1306 constexpr char custAddrV6[] = "::1.2.3.4";
1307 constexpr char dnsSvAddrV4[] = "1.2.3.5";
1308 constexpr char dnsSvAddrV6[] = "::1.2.3.5";
1309 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4 = {
1310 {custAddrV4, hostnameV4},
1311 };
1312 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV6 = {
1313 {custAddrV6, hostnameV6},
1314 };
1315 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4V6 = {
1316 {custAddrV4, hostnameV4V6},
1317 {custAddrV6, hostnameV4V6},
1318 };
1319 const std::vector<DnsRecord> dnsSvHostV4 = {
1320 {hostnameV4, ns_type::ns_t_a, dnsSvAddrV4},
1321 };
1322 const std::vector<DnsRecord> dnsSvHostV6 = {
1323 {hostnameV6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1324 };
1325 const std::vector<DnsRecord> dnsSvHostV4V6 = {
1326 {hostnameV4V6, ns_type::ns_t_a, dnsSvAddrV4},
1327 {hostnameV4V6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1328 };
1329 struct TestConfig {
1330 const std::string name;
1331 const std::vector<aidl::android::net::ResolverHostsParcel> customizedHosts;
1332 const std::vector<DnsRecord> dnsserverHosts;
1333 const std::vector<std::string> queryResult;
1334 std::string asParameters() const {
1335 return StringPrintf("name: %s, customizedHosts: %s, dnsserverHosts: %s", name.c_str(),
1336 customizedHosts.empty() ? "No" : "Yes",
1337 dnsserverHosts.empty() ? "No" : "Yes");
1338 }
1339 } testConfigs[]{
1340 // clang-format off
1341 {hostnameV4, {}, {}, {}},
1342 {hostnameV4, {}, dnsSvHostV4, {dnsSvAddrV4}},
1343 {hostnameV4, custHostV4, {}, {custAddrV4}},
1344 {hostnameV4, custHostV4, dnsSvHostV4, {custAddrV4}},
1345 {hostnameV6, {}, {}, {}},
1346 {hostnameV6, {}, dnsSvHostV6, {dnsSvAddrV6}},
1347 {hostnameV6, custHostV6, {}, {custAddrV6}},
1348 {hostnameV6, custHostV6, dnsSvHostV6, {custAddrV6}},
1349 {hostnameV4V6, {}, {}, {}},
1350 {hostnameV4V6, {}, dnsSvHostV4V6, {dnsSvAddrV4, dnsSvAddrV6}},
1351 {hostnameV4V6, custHostV4V6, {}, {custAddrV4, custAddrV6}},
1352 {hostnameV4V6, custHostV4V6, dnsSvHostV4V6, {custAddrV4, custAddrV6}},
1353 // clang-format on
1354 };
1355
1356 for (const auto& config : testConfigs) {
1357 SCOPED_TRACE(config.asParameters());
1358
1359 test::DNSResponder dns;
1360 StartDns(dns, config.dnsserverHosts);
1361
1362 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
Ken Chena6ac2a62020-04-07 17:25:56 +08001363 resolverParams.resolverOptions.hosts = config.customizedHosts;
chenbrucefd837fa2019-10-29 18:35:36 +08001364 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1365 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM};
1366 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
1367 if (config.customizedHosts.empty() && config.dnsserverHosts.empty()) {
1368 ASSERT_TRUE(result == nullptr);
1369 EXPECT_EQ(2U, GetNumQueries(dns, config.name.c_str()));
1370 } else {
1371 ASSERT_TRUE(result != nullptr);
1372 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(config.queryResult));
1373 EXPECT_EQ(config.customizedHosts.empty() ? 2U : 0U,
1374 GetNumQueries(dns, config.name.c_str()));
1375 }
1376
1377 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
1378 }
1379}
1380
1381TEST_F(ResolverTest, GetAddrInfoFromCustTable_Modify) {
1382 constexpr char hostnameV4V6[] = "v4v6.example.com.";
1383 constexpr char custAddrV4[] = "1.2.3.4";
1384 constexpr char custAddrV6[] = "::1.2.3.4";
1385 constexpr char dnsSvAddrV4[] = "1.2.3.5";
1386 constexpr char dnsSvAddrV6[] = "::1.2.3.5";
1387 const std::vector<DnsRecord> dnsSvHostV4V6 = {
1388 {hostnameV4V6, ns_type::ns_t_a, dnsSvAddrV4},
1389 {hostnameV4V6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1390 };
1391 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4V6 = {
1392 {custAddrV4, hostnameV4V6},
1393 {custAddrV6, hostnameV4V6},
1394 };
1395 test::DNSResponder dns;
1396 StartDns(dns, dnsSvHostV4V6);
1397 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1398
Ken Chena6ac2a62020-04-07 17:25:56 +08001399 resolverParams.resolverOptions.hosts = custHostV4V6;
chenbrucefd837fa2019-10-29 18:35:36 +08001400 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1401 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM};
1402 ScopedAddrinfo result = safe_getaddrinfo(hostnameV4V6, nullptr, &hints);
1403 ASSERT_TRUE(result != nullptr);
1404 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray({custAddrV4, custAddrV6}));
1405 EXPECT_EQ(0U, GetNumQueries(dns, hostnameV4V6));
1406
Ken Chena6ac2a62020-04-07 17:25:56 +08001407 resolverParams.resolverOptions.hosts = {};
chenbrucefd837fa2019-10-29 18:35:36 +08001408 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1409 result = safe_getaddrinfo(hostnameV4V6, nullptr, &hints);
1410 ASSERT_TRUE(result != nullptr);
1411 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray({dnsSvAddrV4, dnsSvAddrV6}));
1412 EXPECT_EQ(2U, GetNumQueries(dns, hostnameV4V6));
1413}
1414
Ken Chenb9fa2062018-11-13 21:51:13 +08001415TEST_F(ResolverTest, EmptySetup) {
Ken Chenb9fa2062018-11-13 21:51:13 +08001416 std::vector<std::string> servers;
1417 std::vector<std::string> domains;
Xiao Ma09b71022018-12-11 17:56:32 +09001418 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001419 std::vector<std::string> res_servers;
1420 std::vector<std::string> res_domains;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001421 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001422 res_params res_params;
Ken Chenb9fa2062018-11-13 21:51:13 +08001423 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +08001424 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001425 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1426 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1427 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chenb9fa2062018-11-13 21:51:13 +08001428 EXPECT_EQ(0U, res_servers.size());
1429 EXPECT_EQ(0U, res_domains.size());
Mike Yu0a1c53d2018-11-26 13:26:21 +09001430 EXPECT_EQ(0U, res_tls_servers.size());
Luke Huang5bd827c2019-03-14 16:10:04 +08001431 ASSERT_EQ(static_cast<size_t>(IDnsResolver::RESOLVER_PARAMS_COUNT), kDefaultParams.size());
1432 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY],
1433 res_params.sample_validity);
1434 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001435 res_params.success_threshold);
Luke Huang5bd827c2019-03-14 16:10:04 +08001436 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
1437 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
1438 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
Ken Chenb9fa2062018-11-13 21:51:13 +08001439 res_params.base_timeout_msec);
Luke Huang5bd827c2019-03-14 16:10:04 +08001440 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_RETRY_COUNT], res_params.retry_count);
Ken Chenb9fa2062018-11-13 21:51:13 +08001441}
1442
1443TEST_F(ResolverTest, SearchPathChange) {
Xiao Ma09b71022018-12-11 17:56:32 +09001444 constexpr char listen_addr[] = "127.0.0.13";
1445 constexpr char host_name1[] = "test13.domain1.org.";
1446 constexpr char host_name2[] = "test13.domain2.org.";
Luke Huangf8215372019-11-22 11:53:41 +08001447 std::vector<std::string> servers = {listen_addr};
1448 std::vector<std::string> domains = {"domain1.org"};
Xiao Ma09b71022018-12-11 17:56:32 +09001449
1450 const std::vector<DnsRecord> records = {
1451 {host_name1, ns_type::ns_t_aaaa, "2001:db8::13"},
1452 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1:13"},
1453 };
1454 test::DNSResponder dns(listen_addr);
1455 StartDns(dns, records);
1456 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001457
1458 const addrinfo hints = {.ai_family = AF_INET6};
1459 ScopedAddrinfo result = safe_getaddrinfo("test13", nullptr, &hints);
1460 EXPECT_TRUE(result != nullptr);
1461 EXPECT_EQ(1U, dns.queries().size());
1462 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
1463 EXPECT_EQ("2001:db8::13", ToString(result));
1464
1465 // Test that changing the domain search path on its own works.
Luke Huangf8215372019-11-22 11:53:41 +08001466 domains = {"domain2.org"};
Xiao Ma09b71022018-12-11 17:56:32 +09001467 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001468 dns.clearQueries();
1469
1470 result = safe_getaddrinfo("test13", nullptr, &hints);
1471 EXPECT_TRUE(result != nullptr);
1472 EXPECT_EQ(1U, dns.queries().size());
1473 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
1474 EXPECT_EQ("2001:db8::1:13", ToString(result));
1475}
1476
Luke Huang2dac4382019-06-24 13:28:44 +08001477namespace {
1478
Luke Huangf8215372019-11-22 11:53:41 +08001479std::vector<std::string> getResolverDomains(aidl::android::net::IDnsResolver* dnsResolverService,
Luke Huang2dac4382019-06-24 13:28:44 +08001480 unsigned netId) {
1481 std::vector<std::string> res_servers;
1482 std::vector<std::string> res_domains;
1483 std::vector<std::string> res_tls_servers;
1484 res_params res_params;
1485 std::vector<ResolverStats> res_stats;
1486 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001487 DnsResponderClient::GetResolverInfo(dnsResolverService, netId, &res_servers, &res_domains,
1488 &res_tls_servers, &res_params, &res_stats,
1489 &wait_for_pending_req_timeout_count);
Luke Huang2dac4382019-06-24 13:28:44 +08001490 return res_domains;
1491}
1492
1493} // namespace
1494
1495TEST_F(ResolverTest, SearchPathPrune) {
1496 constexpr size_t DUPLICATED_DOMAIN_NUM = 3;
1497 constexpr char listen_addr[] = "127.0.0.13";
1498 constexpr char domian_name1[] = "domain13.org.";
1499 constexpr char domian_name2[] = "domain14.org.";
1500 constexpr char host_name1[] = "test13.domain13.org.";
1501 constexpr char host_name2[] = "test14.domain14.org.";
1502 std::vector<std::string> servers = {listen_addr};
1503
1504 std::vector<std::string> testDomains1;
1505 std::vector<std::string> testDomains2;
1506 // Domain length should be <= 255
1507 // Max number of domains in search path is 6
1508 for (size_t i = 0; i < MAXDNSRCH + 1; i++) {
1509 // Fill up with invalid domain
1510 testDomains1.push_back(std::string(300, i + '0'));
1511 // Fill up with valid but duplicated domain
1512 testDomains2.push_back(StringPrintf("domain%zu.org", i % DUPLICATED_DOMAIN_NUM));
1513 }
1514
1515 // Add valid domain used for query.
1516 testDomains1.push_back(domian_name1);
1517
1518 // Add valid domain twice used for query.
1519 testDomains2.push_back(domian_name2);
1520 testDomains2.push_back(domian_name2);
1521
1522 const std::vector<DnsRecord> records = {
1523 {host_name1, ns_type::ns_t_aaaa, "2001:db8::13"},
1524 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1:13"},
1525 };
1526 test::DNSResponder dns(listen_addr);
1527 StartDns(dns, records);
1528 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, testDomains1));
1529
1530 const addrinfo hints = {.ai_family = AF_INET6};
1531 ScopedAddrinfo result = safe_getaddrinfo("test13", nullptr, &hints);
1532
1533 EXPECT_TRUE(result != nullptr);
1534
1535 EXPECT_EQ(1U, dns.queries().size());
1536 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
1537 EXPECT_EQ("2001:db8::13", ToString(result));
1538
1539 const auto& res_domains1 = getResolverDomains(mDnsClient.resolvService(), TEST_NETID);
1540 // Expect 1 valid domain, invalid domains are removed.
1541 ASSERT_EQ(1U, res_domains1.size());
1542 EXPECT_EQ(domian_name1, res_domains1[0]);
1543
1544 dns.clearQueries();
1545
1546 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, testDomains2));
1547
1548 result = safe_getaddrinfo("test14", nullptr, &hints);
1549 EXPECT_TRUE(result != nullptr);
1550
1551 // (3 domains * 2 retries) + 1 success query = 7
1552 EXPECT_EQ(7U, dns.queries().size());
1553 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
1554 EXPECT_EQ("2001:db8::1:13", ToString(result));
1555
1556 const auto& res_domains2 = getResolverDomains(mDnsClient.resolvService(), TEST_NETID);
1557 // Expect 4 valid domain, duplicate domains are removed.
1558 EXPECT_EQ(DUPLICATED_DOMAIN_NUM + 1U, res_domains2.size());
1559 EXPECT_THAT(
1560 std::vector<std::string>({"domain0.org", "domain1.org", "domain2.org", domian_name2}),
1561 testing::ElementsAreArray(res_domains2));
1562}
1563
Mike Yu0a1c53d2018-11-26 13:26:21 +09001564// If we move this function to dns_responder_client, it will complicate the dependency need of
1565// dns_tls_frontend.h.
1566static void setupTlsServers(const std::vector<std::string>& servers,
waynema0e73c2e2019-07-31 15:04:08 +08001567 std::vector<std::unique_ptr<test::DnsTlsFrontend>>* tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001568 constexpr char listen_udp[] = "53";
1569 constexpr char listen_tls[] = "853";
Mike Yu0a1c53d2018-11-26 13:26:21 +09001570
1571 for (const auto& server : servers) {
1572 auto t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
1573 t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
1574 t->startServer();
Mike Yu0a1c53d2018-11-26 13:26:21 +09001575 tls->push_back(std::move(t));
1576 }
1577}
1578
Mike Yu0a1c53d2018-11-26 13:26:21 +09001579TEST_F(ResolverTest, MaxServerPrune_Binder) {
Mike Yu0a1c53d2018-11-26 13:26:21 +09001580 std::vector<std::string> domains;
1581 std::vector<std::unique_ptr<test::DNSResponder>> dns;
1582 std::vector<std::unique_ptr<test::DnsTlsFrontend>> tls;
1583 std::vector<std::string> servers;
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001584 std::vector<DnsResponderClient::Mapping> mappings;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001585
1586 for (unsigned i = 0; i < MAXDNSRCH + 1; i++) {
1587 domains.push_back(StringPrintf("example%u.com", i));
1588 }
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001589 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupMappings(1, domains, &mappings));
1590 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupDNSServers(MAXNS + 1, mappings, &dns, &servers));
waynema0e73c2e2019-07-31 15:04:08 +08001591 ASSERT_NO_FATAL_FAILURE(setupTlsServers(servers, &tls));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001592
waynema0e73c2e2019-07-31 15:04:08 +08001593 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, domains, kDefaultParams,
1594 kDefaultPrivateDnsHostName));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001595
Mike Yu383855b2019-01-15 17:53:27 +08001596 // If the private DNS validation hasn't completed yet before backend DNS servers stop,
1597 // TLS servers will get stuck in handleOneRequest(), which causes this test stuck in
1598 // ~DnsTlsFrontend() because the TLS server loop threads can't be terminated.
1599 // So, wait for private DNS validation done before stopping backend DNS servers.
1600 for (int i = 0; i < MAXNS; i++) {
chenbruceaff85842019-05-31 15:46:42 +08001601 LOG(INFO) << "Waiting for private DNS validation on " << tls[i]->listen_address() << ".";
Mike Yu724f77d2019-08-16 11:14:50 +08001602 EXPECT_TRUE(WaitForPrivateDnsValidation(tls[i]->listen_address(), true));
chenbruceaff85842019-05-31 15:46:42 +08001603 LOG(INFO) << "private DNS validation on " << tls[i]->listen_address() << " done.";
Mike Yu383855b2019-01-15 17:53:27 +08001604 }
1605
Mike Yu0a1c53d2018-11-26 13:26:21 +09001606 std::vector<std::string> res_servers;
1607 std::vector<std::string> res_domains;
1608 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001609 res_params res_params;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001610 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +08001611 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001612 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1613 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1614 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001615
1616 // Check the size of the stats and its contents.
1617 EXPECT_EQ(static_cast<size_t>(MAXNS), res_servers.size());
1618 EXPECT_EQ(static_cast<size_t>(MAXNS), res_tls_servers.size());
1619 EXPECT_EQ(static_cast<size_t>(MAXDNSRCH), res_domains.size());
1620 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_servers.begin()));
1621 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_tls_servers.begin()));
1622 EXPECT_TRUE(std::equal(domains.begin(), domains.begin() + MAXDNSRCH, res_domains.begin()));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001623}
1624
1625TEST_F(ResolverTest, ResolverStats) {
Xiao Ma09b71022018-12-11 17:56:32 +09001626 constexpr char listen_addr1[] = "127.0.0.4";
1627 constexpr char listen_addr2[] = "127.0.0.5";
1628 constexpr char listen_addr3[] = "127.0.0.6";
Mike Yu0a1c53d2018-11-26 13:26:21 +09001629
1630 // Set server 1 timeout.
Mike Yufc125e42019-05-15 20:41:28 +08001631 test::DNSResponder dns1(listen_addr1, "53", static_cast<ns_rcode>(-1));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001632 dns1.setResponseProbability(0.0);
1633 ASSERT_TRUE(dns1.startServer());
1634
1635 // Set server 2 responding server failure.
Xiao Ma09b71022018-12-11 17:56:32 +09001636 test::DNSResponder dns2(listen_addr2);
Mike Yu0a1c53d2018-11-26 13:26:21 +09001637 dns2.setResponseProbability(0.0);
1638 ASSERT_TRUE(dns2.startServer());
1639
1640 // Set server 3 workable.
Xiao Ma09b71022018-12-11 17:56:32 +09001641 test::DNSResponder dns3(listen_addr3);
1642 dns3.addMapping(kHelloExampleCom, ns_type::ns_t_a, "1.2.3.4");
Mike Yu0a1c53d2018-11-26 13:26:21 +09001643 ASSERT_TRUE(dns3.startServer());
1644
1645 std::vector<std::string> servers = {listen_addr1, listen_addr2, listen_addr3};
Xiao Ma09b71022018-12-11 17:56:32 +09001646 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001647
1648 dns3.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +09001649 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
Mike Yu0a1c53d2018-11-26 13:26:21 +09001650 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
Xiao Ma09b71022018-12-11 17:56:32 +09001651 size_t found = GetNumQueries(dns3, kHelloExampleCom);
Mike Yu0a1c53d2018-11-26 13:26:21 +09001652 EXPECT_LE(1U, found);
1653 std::string result_str = ToString(result);
1654 EXPECT_TRUE(result_str == "1.2.3.4") << ", result_str='" << result_str << "'";
1655
Mike Yue2162e52020-03-04 18:43:46 +08001656 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1657 NameserverStats(listen_addr1).setTimeouts(1),
1658 NameserverStats(listen_addr2).setErrors(1),
1659 NameserverStats(listen_addr3).setSuccesses(1),
1660 };
Mike Yu61d17262020-02-15 18:56:22 +08001661 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001662}
1663
Mike Yu15791832020-02-11 13:38:48 +08001664TEST_F(ResolverTest, AlwaysUseLatestSetupParamsInLookups) {
1665 constexpr char listen_addr1[] = "127.0.0.3";
1666 constexpr char listen_addr2[] = "255.255.255.255";
1667 constexpr char listen_addr3[] = "127.0.0.4";
1668 constexpr char hostname[] = "hello";
1669 constexpr char fqdn_with_search_domain[] = "hello.domain2.com.";
1670
1671 test::DNSResponder dns1(listen_addr1, test::kDefaultListenService, static_cast<ns_rcode>(-1));
1672 dns1.setResponseProbability(0.0);
1673 ASSERT_TRUE(dns1.startServer());
1674
1675 test::DNSResponder dns3(listen_addr3);
1676 StartDns(dns3, {{fqdn_with_search_domain, ns_type::ns_t_a, "1.2.3.4"}});
1677
1678 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
1679 parcel.tlsServers.clear();
1680 parcel.servers = {listen_addr1, listen_addr2};
1681 parcel.domains = {"domain1.com", "domain2.com"};
1682 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1683
1684 // Expect the things happening in t1:
1685 // 1. The lookup starts using the first domain for query. It sends queries to the populated
1686 // nameserver list {listen_addr1, listen_addr2} for the hostname "hello.domain1.com".
1687 // 2. A different list of nameservers is updated to the resolver. Revision ID is incremented.
1688 // 3. The query for the hostname times out. The lookup fails to add the timeout record to the
1689 // the stats because of the unmatched revision ID.
1690 // 4. The lookup starts using the second domain for query. It sends queries to the populated
1691 // nameserver list {listen_addr3, listen_addr1, listen_addr2} for another hostname
1692 // "hello.domain2.com".
1693 // 5. The lookup gets the answer and updates a success record to the stats.
1694 std::thread t1([&hostname]() {
1695 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1696 ScopedAddrinfo result = safe_getaddrinfo(hostname, nullptr, &hints);
1697 EXPECT_NE(result.get(), nullptr);
1698 EXPECT_EQ(ToString(result), "1.2.3.4");
1699 });
1700
1701 // Wait for t1 to start the step 1.
1702 while (dns1.queries().size() == 0) {
1703 usleep(1000);
1704 }
1705
1706 // Update the resolver with three nameservers. This will increment the revision ID.
1707 parcel.servers = {listen_addr3, listen_addr1, listen_addr2};
1708 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1709
1710 t1.join();
1711 EXPECT_EQ(0U, GetNumQueriesForType(dns3, ns_type::ns_t_aaaa, fqdn_with_search_domain));
1712 EXPECT_EQ(1U, GetNumQueriesForType(dns3, ns_type::ns_t_a, fqdn_with_search_domain));
1713
Mike Yue2162e52020-03-04 18:43:46 +08001714 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1715 NameserverStats(listen_addr1),
1716 NameserverStats(listen_addr2),
1717 NameserverStats(listen_addr3).setSuccesses(1),
1718 };
Mike Yu61d17262020-02-15 18:56:22 +08001719 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu15791832020-02-11 13:38:48 +08001720}
1721
Ken Chenb9fa2062018-11-13 21:51:13 +08001722// Test what happens if the specified TLS server is nonexistent.
1723TEST_F(ResolverTest, GetHostByName_TlsMissing) {
Xiao Ma09b71022018-12-11 17:56:32 +09001724 constexpr char listen_addr[] = "127.0.0.3";
1725 constexpr char host_name[] = "tlsmissing.example.com.";
1726
1727 test::DNSResponder dns;
1728 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.3"}});
Luke Huangf8215372019-11-22 11:53:41 +08001729 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001730
1731 // There's nothing listening on this address, so validation will either fail or
1732 /// hang. Either way, queries will continue to flow to the DNSResponder.
waynema0e73c2e2019-07-31 15:04:08 +08001733 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Ken Chenb9fa2062018-11-13 21:51:13 +08001734
1735 const hostent* result;
1736
1737 result = gethostbyname("tlsmissing");
1738 ASSERT_FALSE(result == nullptr);
1739 EXPECT_EQ("1.2.3.3", ToString(result));
1740
1741 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001742 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001743}
1744
1745// Test what happens if the specified TLS server replies with garbage.
1746TEST_F(ResolverTest, GetHostByName_TlsBroken) {
Xiao Ma09b71022018-12-11 17:56:32 +09001747 constexpr char listen_addr[] = "127.0.0.3";
1748 constexpr char host_name1[] = "tlsbroken1.example.com.";
1749 constexpr char host_name2[] = "tlsbroken2.example.com.";
1750 const std::vector<DnsRecord> records = {
1751 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1752 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1753 };
1754
1755 test::DNSResponder dns;
1756 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001757 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001758
1759 // Bind the specified private DNS socket but don't respond to any client sockets yet.
1760 int s = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, IPPROTO_TCP);
1761 ASSERT_TRUE(s >= 0);
1762 struct sockaddr_in tlsServer = {
Luke Huangf8215372019-11-22 11:53:41 +08001763 .sin_family = AF_INET,
1764 .sin_port = htons(853),
Ken Chenb9fa2062018-11-13 21:51:13 +08001765 };
1766 ASSERT_TRUE(inet_pton(AF_INET, listen_addr, &tlsServer.sin_addr));
1767 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEPORT).ok());
1768 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEADDR).ok());
1769 ASSERT_FALSE(bind(s, reinterpret_cast<struct sockaddr*>(&tlsServer), sizeof(tlsServer)));
1770 ASSERT_FALSE(listen(s, 1));
1771
1772 // Trigger TLS validation.
waynema0e73c2e2019-07-31 15:04:08 +08001773 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Ken Chenb9fa2062018-11-13 21:51:13 +08001774
1775 struct sockaddr_storage cliaddr;
1776 socklen_t sin_size = sizeof(cliaddr);
Luke Huangf8215372019-11-22 11:53:41 +08001777 int new_fd = accept4(s, reinterpret_cast<struct sockaddr*>(&cliaddr), &sin_size, SOCK_CLOEXEC);
Ken Chenb9fa2062018-11-13 21:51:13 +08001778 ASSERT_TRUE(new_fd > 0);
1779
1780 // We've received the new file descriptor but not written to it or closed, so the
1781 // validation is still pending. Queries should still flow correctly because the
1782 // server is not used until validation succeeds.
1783 const hostent* result;
1784 result = gethostbyname("tlsbroken1");
1785 ASSERT_FALSE(result == nullptr);
1786 EXPECT_EQ("1.2.3.1", ToString(result));
1787
1788 // Now we cause the validation to fail.
1789 std::string garbage = "definitely not a valid TLS ServerHello";
1790 write(new_fd, garbage.data(), garbage.size());
1791 close(new_fd);
1792
1793 // Validation failure shouldn't interfere with lookups, because lookups won't be sent
1794 // to the TLS server unless validation succeeds.
1795 result = gethostbyname("tlsbroken2");
1796 ASSERT_FALSE(result == nullptr);
1797 EXPECT_EQ("1.2.3.2", ToString(result));
1798
1799 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001800 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001801 close(s);
1802}
1803
1804TEST_F(ResolverTest, GetHostByName_Tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001805 constexpr char listen_addr[] = "127.0.0.3";
1806 constexpr char listen_udp[] = "53";
1807 constexpr char listen_tls[] = "853";
1808 constexpr char host_name1[] = "tls1.example.com.";
1809 constexpr char host_name2[] = "tls2.example.com.";
1810 constexpr char host_name3[] = "tls3.example.com.";
1811 const std::vector<DnsRecord> records = {
1812 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1813 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1814 {host_name3, ns_type::ns_t_a, "1.2.3.3"},
1815 };
1816
1817 test::DNSResponder dns;
1818 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001819 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001820
1821 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1822 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001823 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08001824 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001825
Mike Yu724f77d2019-08-16 11:14:50 +08001826 const hostent* result = gethostbyname("tls1");
Ken Chenb9fa2062018-11-13 21:51:13 +08001827 ASSERT_FALSE(result == nullptr);
1828 EXPECT_EQ("1.2.3.1", ToString(result));
1829
1830 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001831 EXPECT_TRUE(tls.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001832
1833 // Stop the TLS server. Since we're in opportunistic mode, queries will
1834 // fall back to the locally-assigned (clear text) nameservers.
1835 tls.stopServer();
1836
1837 dns.clearQueries();
1838 result = gethostbyname("tls2");
1839 EXPECT_FALSE(result == nullptr);
1840 EXPECT_EQ("1.2.3.2", ToString(result));
1841 const auto queries = dns.queries();
1842 EXPECT_EQ(1U, queries.size());
waynema29253052019-08-20 11:26:08 +08001843 EXPECT_EQ("tls2.example.com.", queries[0].name);
1844 EXPECT_EQ(ns_t_a, queries[0].type);
Ken Chenb9fa2062018-11-13 21:51:13 +08001845
1846 // Reset the resolvers without enabling TLS. Queries should still be routed
1847 // to the UDP endpoint.
Xiao Ma09b71022018-12-11 17:56:32 +09001848 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001849
1850 result = gethostbyname("tls3");
1851 ASSERT_FALSE(result == nullptr);
1852 EXPECT_EQ("1.2.3.3", ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +08001853}
1854
Ken Chenb9fa2062018-11-13 21:51:13 +08001855TEST_F(ResolverTest, GetHostByName_TlsFailover) {
Xiao Ma09b71022018-12-11 17:56:32 +09001856 constexpr char listen_addr1[] = "127.0.0.3";
1857 constexpr char listen_addr2[] = "127.0.0.4";
1858 constexpr char listen_udp[] = "53";
1859 constexpr char listen_tls[] = "853";
1860 constexpr char host_name1[] = "tlsfailover1.example.com.";
1861 constexpr char host_name2[] = "tlsfailover2.example.com.";
1862 const std::vector<DnsRecord> records1 = {
1863 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1864 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1865 };
1866 const std::vector<DnsRecord> records2 = {
1867 {host_name1, ns_type::ns_t_a, "1.2.3.3"},
1868 {host_name2, ns_type::ns_t_a, "1.2.3.4"},
1869 };
1870
1871 test::DNSResponder dns1(listen_addr1);
1872 test::DNSResponder dns2(listen_addr2);
1873 StartDns(dns1, records1);
1874 StartDns(dns2, records2);
1875
Luke Huangf8215372019-11-22 11:53:41 +08001876 std::vector<std::string> servers = {listen_addr1, listen_addr2};
Ken Chenb9fa2062018-11-13 21:51:13 +08001877
1878 test::DnsTlsFrontend tls1(listen_addr1, listen_tls, listen_addr1, listen_udp);
1879 test::DnsTlsFrontend tls2(listen_addr2, listen_tls, listen_addr2, listen_udp);
1880 ASSERT_TRUE(tls1.startServer());
1881 ASSERT_TRUE(tls2.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001882 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1883 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08001884 EXPECT_TRUE(WaitForPrivateDnsValidation(tls1.listen_address(), true));
1885 EXPECT_TRUE(WaitForPrivateDnsValidation(tls2.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001886
Mike Yu724f77d2019-08-16 11:14:50 +08001887 const hostent* result = gethostbyname("tlsfailover1");
Ken Chenb9fa2062018-11-13 21:51:13 +08001888 ASSERT_FALSE(result == nullptr);
1889 EXPECT_EQ("1.2.3.1", ToString(result));
1890
1891 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001892 EXPECT_TRUE(tls1.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001893 // No new queries should have reached tls2.
Luke Huang0a0870d2020-02-12 20:41:10 +08001894 EXPECT_TRUE(tls2.waitForQueries(1));
Ken Chenb9fa2062018-11-13 21:51:13 +08001895
1896 // Stop tls1. Subsequent queries should attempt to reach tls1, fail, and retry to tls2.
1897 tls1.stopServer();
1898
1899 result = gethostbyname("tlsfailover2");
1900 EXPECT_EQ("1.2.3.4", ToString(result));
1901
1902 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001903 EXPECT_TRUE(tls2.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001904
1905 // No additional queries should have reached the insecure servers.
1906 EXPECT_EQ(2U, dns1.queries().size());
1907 EXPECT_EQ(2U, dns2.queries().size());
1908
1909 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001910 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Ken Chenb9fa2062018-11-13 21:51:13 +08001911}
1912
1913TEST_F(ResolverTest, GetHostByName_BadTlsName) {
Xiao Ma09b71022018-12-11 17:56:32 +09001914 constexpr char listen_addr[] = "127.0.0.3";
1915 constexpr char listen_udp[] = "53";
1916 constexpr char listen_tls[] = "853";
1917 constexpr char host_name[] = "badtlsname.example.com.";
1918
1919 test::DNSResponder dns;
1920 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.1"}});
Luke Huangf8215372019-11-22 11:53:41 +08001921 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001922
1923 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1924 ASSERT_TRUE(tls.startServer());
Xiao Ma09b71022018-12-11 17:56:32 +09001925 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
waynema0e73c2e2019-07-31 15:04:08 +08001926 kDefaultIncorrectPrivateDnsHostName));
Ken Chenb9fa2062018-11-13 21:51:13 +08001927
waynema0e73c2e2019-07-31 15:04:08 +08001928 // The TLS handshake would fail because the name of TLS server doesn't
1929 // match with TLS server's certificate.
Mike Yu724f77d2019-08-16 11:14:50 +08001930 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), false));
Ken Chenb9fa2062018-11-13 21:51:13 +08001931
1932 // The query should fail hard, because a name was specified.
1933 EXPECT_EQ(nullptr, gethostbyname("badtlsname"));
1934
1935 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001936 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001937}
1938
1939TEST_F(ResolverTest, GetAddrInfo_Tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001940 constexpr char listen_addr[] = "127.0.0.3";
1941 constexpr char listen_udp[] = "53";
1942 constexpr char listen_tls[] = "853";
1943 constexpr char host_name[] = "addrinfotls.example.com.";
1944 const std::vector<DnsRecord> records = {
1945 {host_name, ns_type::ns_t_a, "1.2.3.4"},
1946 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
1947 };
1948
1949 test::DNSResponder dns;
1950 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001951 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001952
1953 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1954 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001955 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1956 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08001957 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001958
1959 dns.clearQueries();
1960 ScopedAddrinfo result = safe_getaddrinfo("addrinfotls", nullptr, nullptr);
1961 EXPECT_TRUE(result != nullptr);
1962 size_t found = GetNumQueries(dns, host_name);
1963 EXPECT_LE(1U, found);
1964 // Could be A or AAAA
1965 std::string result_str = ToString(result);
1966 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +08001967 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08001968 // Wait for both A and AAAA queries to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001969 EXPECT_TRUE(tls.waitForQueries(3));
Ken Chenb9fa2062018-11-13 21:51:13 +08001970
1971 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001972 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001973}
1974
1975TEST_F(ResolverTest, TlsBypass) {
1976 const char OFF[] = "off";
1977 const char OPPORTUNISTIC[] = "opportunistic";
1978 const char STRICT[] = "strict";
1979
1980 const char GETHOSTBYNAME[] = "gethostbyname";
1981 const char GETADDRINFO[] = "getaddrinfo";
1982 const char GETADDRINFOFORNET[] = "getaddrinfofornet";
1983
1984 const unsigned BYPASS_NETID = NETID_USE_LOCAL_NAMESERVERS | TEST_NETID;
1985
Ken Chenb9fa2062018-11-13 21:51:13 +08001986 const char ADDR4[] = "192.0.2.1";
1987 const char ADDR6[] = "2001:db8::1";
1988
1989 const char cleartext_addr[] = "127.0.0.53";
1990 const char cleartext_port[] = "53";
1991 const char tls_port[] = "853";
Luke Huangf8215372019-11-22 11:53:41 +08001992 const std::vector<std::string> servers = {cleartext_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001993
Xiao Ma09b71022018-12-11 17:56:32 +09001994 test::DNSResponder dns(cleartext_addr);
Ken Chenb9fa2062018-11-13 21:51:13 +08001995 ASSERT_TRUE(dns.startServer());
1996
1997 test::DnsTlsFrontend tls(cleartext_addr, tls_port, cleartext_addr, cleartext_port);
Mike Yudd4ac2d2019-05-31 16:52:11 +08001998 ASSERT_TRUE(tls.startServer());
Ken Chenb9fa2062018-11-13 21:51:13 +08001999
Luke Huangf8215372019-11-22 11:53:41 +08002000 // clang-format off
Ken Chenb9fa2062018-11-13 21:51:13 +08002001 struct TestConfig {
2002 const std::string mode;
2003 const bool withWorkingTLS;
2004 const std::string method;
2005
2006 std::string asHostName() const {
Luke Huangf8215372019-11-22 11:53:41 +08002007 return StringPrintf("%s.%s.%s.", mode.c_str(), withWorkingTLS ? "tlsOn" : "tlsOff",
Ken Chenb9fa2062018-11-13 21:51:13 +08002008 method.c_str());
2009 }
2010 } testConfigs[]{
Ken Chenb9fa2062018-11-13 21:51:13 +08002011 {OFF, true, GETHOSTBYNAME},
2012 {OPPORTUNISTIC, true, GETHOSTBYNAME},
2013 {STRICT, true, GETHOSTBYNAME},
Ken Chenb9fa2062018-11-13 21:51:13 +08002014 {OFF, true, GETADDRINFO},
2015 {OPPORTUNISTIC, true, GETADDRINFO},
2016 {STRICT, true, GETADDRINFO},
Ken Chenb9fa2062018-11-13 21:51:13 +08002017 {OFF, true, GETADDRINFOFORNET},
2018 {OPPORTUNISTIC, true, GETADDRINFOFORNET},
2019 {STRICT, true, GETADDRINFOFORNET},
Mike Yudd4ac2d2019-05-31 16:52:11 +08002020 {OFF, false, GETHOSTBYNAME},
2021 {OPPORTUNISTIC, false, GETHOSTBYNAME},
2022 {STRICT, false, GETHOSTBYNAME},
2023 {OFF, false, GETADDRINFO},
2024 {OPPORTUNISTIC, false, GETADDRINFO},
2025 {STRICT, false, GETADDRINFO},
2026 {OFF, false, GETADDRINFOFORNET},
2027 {OPPORTUNISTIC, false, GETADDRINFOFORNET},
2028 {STRICT, false, GETADDRINFOFORNET},
Ken Chenb9fa2062018-11-13 21:51:13 +08002029 };
Luke Huangf8215372019-11-22 11:53:41 +08002030 // clang-format on
Ken Chenb9fa2062018-11-13 21:51:13 +08002031
2032 for (const auto& config : testConfigs) {
2033 const std::string testHostName = config.asHostName();
2034 SCOPED_TRACE(testHostName);
2035
2036 // Don't tempt test bugs due to caching.
2037 const char* host_name = testHostName.c_str();
2038 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
2039 dns.addMapping(host_name, ns_type::ns_t_aaaa, ADDR6);
2040
Mike Yudd4ac2d2019-05-31 16:52:11 +08002041 if (config.withWorkingTLS) {
2042 if (!tls.running()) {
2043 ASSERT_TRUE(tls.startServer());
2044 }
2045 } else {
2046 if (tls.running()) {
2047 ASSERT_TRUE(tls.stopServer());
2048 }
2049 }
Ken Chenb9fa2062018-11-13 21:51:13 +08002050
2051 if (config.mode == OFF) {
Xiao Ma09b71022018-12-11 17:56:32 +09002052 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, kDefaultSearchDomains,
2053 kDefaultParams));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09002054 } else /* OPPORTUNISTIC or STRICT */ {
2055 const char* tls_hostname = (config.mode == STRICT) ? kDefaultPrivateDnsHostName : "";
Xiao Ma09b71022018-12-11 17:56:32 +09002056 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09002057 kDefaultParams, tls_hostname));
Mike Yu724f77d2019-08-16 11:14:50 +08002058
2059 // Wait for the validation event. If the server is running, the validation should
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09002060 // succeed; otherwise, the validation should fail.
Mike Yu724f77d2019-08-16 11:14:50 +08002061 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), config.withWorkingTLS));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09002062 if (config.withWorkingTLS) {
2063 EXPECT_TRUE(tls.waitForQueries(1));
2064 tls.clearQueries();
2065 }
Ken Chenb9fa2062018-11-13 21:51:13 +08002066 }
Ken Chenb9fa2062018-11-13 21:51:13 +08002067
2068 const hostent* h_result = nullptr;
2069 ScopedAddrinfo ai_result;
2070
2071 if (config.method == GETHOSTBYNAME) {
2072 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
2073 h_result = gethostbyname(host_name);
2074
2075 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
2076 ASSERT_FALSE(h_result == nullptr);
2077 ASSERT_EQ(4, h_result->h_length);
2078 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
2079 EXPECT_EQ(ADDR4, ToString(h_result));
2080 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
2081 } else if (config.method == GETADDRINFO) {
2082 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
2083 ai_result = safe_getaddrinfo(host_name, nullptr, nullptr);
2084 EXPECT_TRUE(ai_result != nullptr);
2085
2086 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2087 // Could be A or AAAA
2088 const std::string result_str = ToString(ai_result);
2089 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
Luke Huangf8215372019-11-22 11:53:41 +08002090 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08002091 } else if (config.method == GETADDRINFOFORNET) {
2092 addrinfo* raw_ai_result = nullptr;
2093 EXPECT_EQ(0, android_getaddrinfofornet(host_name, /*servname=*/nullptr,
2094 /*hints=*/nullptr, BYPASS_NETID, MARK_UNSET,
2095 &raw_ai_result));
2096 ai_result.reset(raw_ai_result);
2097
2098 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2099 // Could be A or AAAA
2100 const std::string result_str = ToString(ai_result);
2101 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
Luke Huangf8215372019-11-22 11:53:41 +08002102 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08002103 }
2104
Mike Yudd4ac2d2019-05-31 16:52:11 +08002105 EXPECT_EQ(0, tls.queries());
Ken Chenb9fa2062018-11-13 21:51:13 +08002106
2107 // Clear per-process resolv netid.
2108 ASSERT_EQ(0, setNetworkForResolv(NETID_UNSET));
Ken Chenb9fa2062018-11-13 21:51:13 +08002109 dns.clearQueries();
2110 }
Ken Chenb9fa2062018-11-13 21:51:13 +08002111}
2112
2113TEST_F(ResolverTest, StrictMode_NoTlsServers) {
Xiao Ma09b71022018-12-11 17:56:32 +09002114 constexpr char cleartext_addr[] = "127.0.0.53";
Luke Huangf8215372019-11-22 11:53:41 +08002115 const std::vector<std::string> servers = {cleartext_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002116 constexpr char host_name[] = "strictmode.notlsips.example.com.";
2117 const std::vector<DnsRecord> records = {
2118 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2119 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2120 };
Ken Chenb9fa2062018-11-13 21:51:13 +08002121
Xiao Ma09b71022018-12-11 17:56:32 +09002122 test::DNSResponder dns(cleartext_addr);
2123 StartDns(dns, records);
Ken Chenb9fa2062018-11-13 21:51:13 +08002124
waynema0e73c2e2019-07-31 15:04:08 +08002125 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
2126 kDefaultIncorrectPrivateDnsHostName));
Ken Chenb9fa2062018-11-13 21:51:13 +08002127
2128 addrinfo* ai_result = nullptr;
2129 EXPECT_NE(0, getaddrinfo(host_name, nullptr, nullptr, &ai_result));
2130 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
2131}
Luke Huang94b10b92018-11-21 20:13:38 +08002132
2133namespace {
2134
Luke Huang70931aa2019-01-31 11:57:41 +08002135int getAsyncResponse(int fd, int* rcode, uint8_t* buf, int bufLen) {
Luke Huang94b10b92018-11-21 20:13:38 +08002136 struct pollfd wait_fd[1];
2137 wait_fd[0].fd = fd;
2138 wait_fd[0].events = POLLIN;
2139 short revents;
2140 int ret;
2141
2142 ret = poll(wait_fd, 1, -1);
2143 revents = wait_fd[0].revents;
2144 if (revents & POLLIN) {
Mike Yub3505422020-10-15 16:10:41 +08002145 return resNetworkResult(fd, rcode, buf, bufLen);
Luke Huang94b10b92018-11-21 20:13:38 +08002146 }
2147 return -1;
2148}
2149
Luke Huang70931aa2019-01-31 11:57:41 +08002150std::string toString(uint8_t* buf, int bufLen, int ipType) {
Luke Huang94b10b92018-11-21 20:13:38 +08002151 ns_msg handle;
2152 int ancount, n = 0;
2153 ns_rr rr;
2154
Luke Huangf8215372019-11-22 11:53:41 +08002155 if (ns_initparse((const uint8_t*)buf, bufLen, &handle) >= 0) {
Luke Huang94b10b92018-11-21 20:13:38 +08002156 ancount = ns_msg_count(handle, ns_s_an);
2157 if (ns_parserr(&handle, ns_s_an, n, &rr) == 0) {
Luke Huang70931aa2019-01-31 11:57:41 +08002158 const uint8_t* rdata = ns_rr_rdata(rr);
Luke Huang94b10b92018-11-21 20:13:38 +08002159 char buffer[INET6_ADDRSTRLEN];
Luke Huangf8215372019-11-22 11:53:41 +08002160 if (inet_ntop(ipType, (const char*)rdata, buffer, sizeof(buffer))) {
Luke Huang94b10b92018-11-21 20:13:38 +08002161 return buffer;
2162 }
2163 }
2164 }
2165 return "";
2166}
2167
2168int dns_open_proxy() {
2169 int s = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
2170 if (s == -1) {
2171 return -1;
2172 }
2173 const int one = 1;
2174 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
2175
2176 static const struct sockaddr_un proxy_addr = {
2177 .sun_family = AF_UNIX,
2178 .sun_path = "/dev/socket/dnsproxyd",
2179 };
2180
Luke Huangf8215372019-11-22 11:53:41 +08002181 if (TEMP_FAILURE_RETRY(connect(s, (const struct sockaddr*)&proxy_addr, sizeof(proxy_addr))) !=
Luke Huang94b10b92018-11-21 20:13:38 +08002182 0) {
2183 close(s);
2184 return -1;
2185 }
2186
2187 return s;
2188}
2189
Luke Huangba7bef92018-12-26 16:53:03 +08002190void expectAnswersValid(int fd, int ipType, const std::string& expectedAnswer) {
2191 int rcode = -1;
2192 uint8_t buf[MAXPACKET] = {};
2193
2194 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2195 EXPECT_GT(res, 0);
2196 EXPECT_EQ(expectedAnswer, toString(buf, res, ipType));
2197}
2198
2199void expectAnswersNotValid(int fd, int expectedErrno) {
2200 int rcode = -1;
2201 uint8_t buf[MAXPACKET] = {};
2202
2203 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2204 EXPECT_EQ(expectedErrno, res);
2205}
2206
Luke Huang94b10b92018-11-21 20:13:38 +08002207} // namespace
2208
2209TEST_F(ResolverTest, Async_NormalQueryV4V6) {
Xiao Ma09b71022018-12-11 17:56:32 +09002210 constexpr char listen_addr[] = "127.0.0.4";
2211 constexpr char host_name[] = "howdy.example.com.";
2212 const std::vector<DnsRecord> records = {
2213 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2214 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2215 };
2216
2217 test::DNSResponder dns(listen_addr);
2218 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002219 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002220 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002221
Luke Huangba7bef92018-12-26 16:53:03 +08002222 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2223 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002224 EXPECT_TRUE(fd1 != -1);
2225 EXPECT_TRUE(fd2 != -1);
2226
Luke Huang70931aa2019-01-31 11:57:41 +08002227 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002228 int rcode;
2229 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2230 EXPECT_GT(res, 0);
2231 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
2232
2233 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2234 EXPECT_GT(res, 0);
2235 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2236
2237 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
2238
2239 // Re-query verify cache works
Luke Huangba7bef92018-12-26 16:53:03 +08002240 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2241 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002242
2243 EXPECT_TRUE(fd1 != -1);
2244 EXPECT_TRUE(fd2 != -1);
2245
2246 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2247 EXPECT_GT(res, 0);
2248 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
2249
2250 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2251 EXPECT_GT(res, 0);
2252 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2253
2254 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
2255}
2256
2257TEST_F(ResolverTest, Async_BadQuery) {
Xiao Ma09b71022018-12-11 17:56:32 +09002258 constexpr char listen_addr[] = "127.0.0.4";
2259 constexpr char host_name[] = "howdy.example.com.";
2260 const std::vector<DnsRecord> records = {
2261 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2262 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2263 };
2264
2265 test::DNSResponder dns(listen_addr);
2266 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002267 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002268 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002269
2270 static struct {
2271 int fd;
2272 const char* dname;
2273 const int queryType;
2274 const int expectRcode;
2275 } kTestData[] = {
Luke Huangba7bef92018-12-26 16:53:03 +08002276 {-1, "", ns_t_aaaa, 0},
2277 {-1, "as65ass46", ns_t_aaaa, 0},
2278 {-1, "454564564564", ns_t_aaaa, 0},
2279 {-1, "h645235", ns_t_a, 0},
2280 {-1, "www.google.com", ns_t_a, 0},
Luke Huang94b10b92018-11-21 20:13:38 +08002281 };
2282
2283 for (auto& td : kTestData) {
2284 SCOPED_TRACE(td.dname);
Luke Huangba7bef92018-12-26 16:53:03 +08002285 td.fd = resNetworkQuery(TEST_NETID, td.dname, ns_c_in, td.queryType, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002286 EXPECT_TRUE(td.fd != -1);
2287 }
2288
2289 // dns_responder return empty resp(packet only contains query part) with no error currently
2290 for (const auto& td : kTestData) {
Luke Huang70931aa2019-01-31 11:57:41 +08002291 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002292 int rcode;
2293 SCOPED_TRACE(td.dname);
2294 int res = getAsyncResponse(td.fd, &rcode, buf, MAXPACKET);
2295 EXPECT_GT(res, 0);
2296 EXPECT_EQ(rcode, td.expectRcode);
2297 }
2298}
2299
2300TEST_F(ResolverTest, Async_EmptyAnswer) {
Xiao Ma09b71022018-12-11 17:56:32 +09002301 constexpr char listen_addr[] = "127.0.0.4";
2302 constexpr char host_name[] = "howdy.example.com.";
2303 const std::vector<DnsRecord> records = {
2304 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2305 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2306 };
2307
2308 test::DNSResponder dns(listen_addr);
2309 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002310 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002311 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002312
Luke Huang9c264bb2018-12-18 16:44:41 +08002313 // TODO: Disable retry to make this test explicit.
2314 auto& cv = dns.getCv();
2315 auto& cvMutex = dns.getCvMutex();
2316 int fd1;
2317 // Wait on the condition variable to ensure that the DNS server has handled our first query.
2318 {
2319 std::unique_lock lk(cvMutex);
Luke Huangba7bef92018-12-26 16:53:03 +08002320 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang9c264bb2018-12-18 16:44:41 +08002321 EXPECT_TRUE(fd1 != -1);
2322 EXPECT_EQ(std::cv_status::no_timeout, cv.wait_for(lk, std::chrono::seconds(1)));
2323 }
Luke Huang94b10b92018-11-21 20:13:38 +08002324
Luke Huang94b10b92018-11-21 20:13:38 +08002325 dns.setResponseProbability(0.0);
Luke Huang94b10b92018-11-21 20:13:38 +08002326
Luke Huangba7bef92018-12-26 16:53:03 +08002327 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002328 EXPECT_TRUE(fd2 != -1);
2329
Luke Huangba7bef92018-12-26 16:53:03 +08002330 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002331 EXPECT_TRUE(fd3 != -1);
2332
Luke Huang9c264bb2018-12-18 16:44:41 +08002333 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002334 int rcode;
2335
Luke Huang9c264bb2018-12-18 16:44:41 +08002336 // expect no response
2337 int res = getAsyncResponse(fd3, &rcode, buf, MAXPACKET);
2338 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huang94b10b92018-11-21 20:13:38 +08002339
Luke Huang9c264bb2018-12-18 16:44:41 +08002340 // expect no response
Luke Huang94b10b92018-11-21 20:13:38 +08002341 memset(buf, 0, MAXPACKET);
Luke Huang9c264bb2018-12-18 16:44:41 +08002342 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2343 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huang94b10b92018-11-21 20:13:38 +08002344
Luke Huang94b10b92018-11-21 20:13:38 +08002345 dns.setResponseProbability(1.0);
Luke Huang94b10b92018-11-21 20:13:38 +08002346
Luke Huangba7bef92018-12-26 16:53:03 +08002347 int fd4 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002348 EXPECT_TRUE(fd4 != -1);
2349
2350 memset(buf, 0, MAXPACKET);
2351 res = getAsyncResponse(fd4, &rcode, buf, MAXPACKET);
2352 EXPECT_GT(res, 0);
2353 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2354
2355 memset(buf, 0, MAXPACKET);
2356 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2357 EXPECT_GT(res, 0);
2358 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
Mike Yu532405f2020-06-17 17:46:44 +08002359
2360 // Trailing dot is removed. Is it intended?
2361 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, 0, "howdy.example.com", {"::1.2.3.4"});
2362 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2363 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2364 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, 0, "howdy.example.com", {"1.2.3.4"});
Luke Huang94b10b92018-11-21 20:13:38 +08002365}
2366
2367TEST_F(ResolverTest, Async_MalformedQuery) {
Xiao Ma09b71022018-12-11 17:56:32 +09002368 constexpr char listen_addr[] = "127.0.0.4";
2369 constexpr char host_name[] = "howdy.example.com.";
2370 const std::vector<DnsRecord> records = {
2371 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2372 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2373 };
2374
2375 test::DNSResponder dns(listen_addr);
2376 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002377 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002378 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002379
2380 int fd = dns_open_proxy();
2381 EXPECT_TRUE(fd > 0);
2382
2383 const std::string badMsg = "16-52512#";
Xiao Ma09b71022018-12-11 17:56:32 +09002384 static const struct {
Luke Huang94b10b92018-11-21 20:13:38 +08002385 const std::string cmd;
2386 const int expectErr;
2387 } kTestData[] = {
Luke Huangba7bef92018-12-26 16:53:03 +08002388 // Too few arguments
Luke Huang94b10b92018-11-21 20:13:38 +08002389 {"resnsend " + badMsg + '\0', -EINVAL},
2390 // Bad netId
Luke Huangba7bef92018-12-26 16:53:03 +08002391 {"resnsend badnetId 0 " + badMsg + '\0', -EINVAL},
Luke Huang94b10b92018-11-21 20:13:38 +08002392 // Bad raw data
Luke Huangba7bef92018-12-26 16:53:03 +08002393 {"resnsend " + std::to_string(TEST_NETID) + " 0 " + badMsg + '\0', -EILSEQ},
Luke Huang94b10b92018-11-21 20:13:38 +08002394 };
2395
2396 for (unsigned int i = 0; i < std::size(kTestData); i++) {
2397 auto& td = kTestData[i];
2398 SCOPED_TRACE(td.cmd);
2399 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, td.cmd.c_str(), td.cmd.size()));
2400 EXPECT_EQ(rc, static_cast<ssize_t>(td.cmd.size()));
2401
2402 int32_t tmp;
2403 rc = TEMP_FAILURE_RETRY(read(fd, &tmp, sizeof(tmp)));
2404 EXPECT_TRUE(rc > 0);
2405 EXPECT_EQ(static_cast<int>(ntohl(tmp)), td.expectErr);
2406 }
2407 // Normal query with answer buffer
2408 // This is raw data of query "howdy.example.com" type 1 class 1
2409 std::string query = "81sBAAABAAAAAAAABWhvd2R5B2V4YW1wbGUDY29tAAABAAE=";
Luke Huangba7bef92018-12-26 16:53:03 +08002410 std::string cmd = "resnsend " + std::to_string(TEST_NETID) + " 0 " + query + '\0';
Luke Huang94b10b92018-11-21 20:13:38 +08002411 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
2412 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
2413
Luke Huang70931aa2019-01-31 11:57:41 +08002414 uint8_t smallBuf[1] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002415 int rcode;
2416 rc = getAsyncResponse(fd, &rcode, smallBuf, 1);
Luke Huangba7bef92018-12-26 16:53:03 +08002417 EXPECT_EQ(-EMSGSIZE, rc);
Luke Huang94b10b92018-11-21 20:13:38 +08002418
2419 // Do the normal test with large buffer again
2420 fd = dns_open_proxy();
2421 EXPECT_TRUE(fd > 0);
2422 rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
2423 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
Luke Huang70931aa2019-01-31 11:57:41 +08002424 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002425 rc = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2426 EXPECT_EQ("1.2.3.4", toString(buf, rc, AF_INET));
Mike Yu4f3747b2018-12-02 17:54:29 +09002427}
2428
Luke Huangba7bef92018-12-26 16:53:03 +08002429TEST_F(ResolverTest, Async_CacheFlags) {
Xiao Ma09b71022018-12-11 17:56:32 +09002430 constexpr char listen_addr[] = "127.0.0.4";
Luke Huang4eabbe32020-05-28 03:17:32 +08002431 constexpr char host_name1[] = "howdy.example.com.";
2432 constexpr char host_name2[] = "howdy.example2.com.";
2433 constexpr char host_name3[] = "howdy.example3.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002434 const std::vector<DnsRecord> records = {
Luke Huang4eabbe32020-05-28 03:17:32 +08002435 {host_name1, ns_type::ns_t_a, "1.2.3.4"}, {host_name1, ns_type::ns_t_aaaa, "::1.2.3.4"},
2436 {host_name2, ns_type::ns_t_a, "1.2.3.5"}, {host_name2, ns_type::ns_t_aaaa, "::1.2.3.5"},
2437 {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 +09002438 };
2439
2440 test::DNSResponder dns(listen_addr);
2441 StartDns(dns, records);
Luke Huangba7bef92018-12-26 16:53:03 +08002442 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002443 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huangba7bef92018-12-26 16:53:03 +08002444
2445 // ANDROID_RESOLV_NO_CACHE_STORE
2446 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2447 ANDROID_RESOLV_NO_CACHE_STORE);
2448 EXPECT_TRUE(fd1 != -1);
2449 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2450 ANDROID_RESOLV_NO_CACHE_STORE);
2451 EXPECT_TRUE(fd2 != -1);
2452 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2453 ANDROID_RESOLV_NO_CACHE_STORE);
2454 EXPECT_TRUE(fd3 != -1);
2455
2456 expectAnswersValid(fd3, AF_INET, "1.2.3.4");
2457 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
2458 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2459
2460 // No cache exists, expect 3 queries
Luke Huang4eabbe32020-05-28 03:17:32 +08002461 EXPECT_EQ(3U, GetNumQueries(dns, host_name1));
Luke Huangba7bef92018-12-26 16:53:03 +08002462
Luke Huang4eabbe32020-05-28 03:17:32 +08002463 // Raise a query with no flags to ensure no cache exists. Also make an cache entry for the
2464 // query.
Luke Huangba7bef92018-12-26 16:53:03 +08002465 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2466
2467 EXPECT_TRUE(fd1 != -1);
2468
2469 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2470
Luke Huang4eabbe32020-05-28 03:17:32 +08002471 // Expect 4 queries because there should be no cache before this query.
2472 EXPECT_EQ(4U, GetNumQueries(dns, host_name1));
2473
2474 // Now we have the cache entry, re-query with ANDROID_RESOLV_NO_CACHE_STORE to ensure
2475 // that ANDROID_RESOLV_NO_CACHE_STORE implied ANDROID_RESOLV_NO_CACHE_LOOKUP.
2476 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2477 ANDROID_RESOLV_NO_CACHE_STORE);
2478 EXPECT_TRUE(fd1 != -1);
2479 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2480 // Expect 5 queries because we shouldn't do cache lookup for the query which has
2481 // ANDROID_RESOLV_NO_CACHE_STORE.
2482 EXPECT_EQ(5U, GetNumQueries(dns, host_name1));
Luke Huangba7bef92018-12-26 16:53:03 +08002483
2484 // ANDROID_RESOLV_NO_CACHE_LOOKUP
2485 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2486 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2487 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2488 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2489
2490 EXPECT_TRUE(fd1 != -1);
2491 EXPECT_TRUE(fd2 != -1);
2492
2493 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
2494 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2495
Luke Huang4eabbe32020-05-28 03:17:32 +08002496 // Cache was skipped, expect 2 more queries.
2497 EXPECT_EQ(7U, GetNumQueries(dns, host_name1));
Luke Huangba7bef92018-12-26 16:53:03 +08002498
2499 // Re-query verify cache works
Luke Huang4eabbe32020-05-28 03:17:32 +08002500 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huangba7bef92018-12-26 16:53:03 +08002501 EXPECT_TRUE(fd1 != -1);
2502 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2503
Luke Huang4eabbe32020-05-28 03:17:32 +08002504 // Cache hits, expect still 7 queries
2505 EXPECT_EQ(7U, GetNumQueries(dns, host_name1));
Luke Huanga1d74182019-03-19 17:30:36 +08002506
2507 // Start to verify if ANDROID_RESOLV_NO_CACHE_LOOKUP does write response into cache
2508 dns.clearQueries();
2509
Luke Huang4eabbe32020-05-28 03:17:32 +08002510 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa,
Luke Huanga1d74182019-03-19 17:30:36 +08002511 ANDROID_RESOLV_NO_CACHE_LOOKUP);
Luke Huang4eabbe32020-05-28 03:17:32 +08002512 fd2 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa,
Luke Huanga1d74182019-03-19 17:30:36 +08002513 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2514
2515 EXPECT_TRUE(fd1 != -1);
2516 EXPECT_TRUE(fd2 != -1);
2517
Luke Huang4eabbe32020-05-28 03:17:32 +08002518 expectAnswersValid(fd2, AF_INET6, "::1.2.3.5");
2519 expectAnswersValid(fd1, AF_INET6, "::1.2.3.5");
Luke Huanga1d74182019-03-19 17:30:36 +08002520
2521 // Skip cache, expect 2 queries
Luke Huang4eabbe32020-05-28 03:17:32 +08002522 EXPECT_EQ(2U, GetNumQueries(dns, host_name2));
Luke Huanga1d74182019-03-19 17:30:36 +08002523
2524 // Re-query without flags
Luke Huang4eabbe32020-05-28 03:17:32 +08002525 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa, 0);
2526 fd2 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa, 0);
Luke Huanga1d74182019-03-19 17:30:36 +08002527
2528 EXPECT_TRUE(fd1 != -1);
2529 EXPECT_TRUE(fd2 != -1);
2530
Luke Huang4eabbe32020-05-28 03:17:32 +08002531 expectAnswersValid(fd2, AF_INET6, "::1.2.3.5");
2532 expectAnswersValid(fd1, AF_INET6, "::1.2.3.5");
Luke Huanga1d74182019-03-19 17:30:36 +08002533
2534 // Cache hits, expect still 2 queries
Luke Huang4eabbe32020-05-28 03:17:32 +08002535 EXPECT_EQ(2U, GetNumQueries(dns, host_name2));
Luke Huang40f5f492019-05-09 19:37:35 +08002536
2537 // Test both ANDROID_RESOLV_NO_CACHE_STORE and ANDROID_RESOLV_NO_CACHE_LOOKUP are set
2538 dns.clearQueries();
2539
Luke Huang4eabbe32020-05-28 03:17:32 +08002540 // Make sure that the cache of "howdy.example3.com" exists.
2541 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang40f5f492019-05-09 19:37:35 +08002542 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002543 expectAnswersValid(fd1, AF_INET6, "::1.2.3.6");
2544 EXPECT_EQ(1U, GetNumQueries(dns, host_name3));
Luke Huang40f5f492019-05-09 19:37:35 +08002545
2546 // Re-query with testFlags
2547 const int testFlag = ANDROID_RESOLV_NO_CACHE_STORE | ANDROID_RESOLV_NO_CACHE_LOOKUP;
Luke Huang4eabbe32020-05-28 03:17:32 +08002548 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_aaaa, testFlag);
Luke Huang40f5f492019-05-09 19:37:35 +08002549 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002550 expectAnswersValid(fd1, AF_INET6, "::1.2.3.6");
Luke Huang40f5f492019-05-09 19:37:35 +08002551 // Expect cache lookup is skipped.
Luke Huang4eabbe32020-05-28 03:17:32 +08002552 EXPECT_EQ(2U, GetNumQueries(dns, host_name3));
Luke Huang40f5f492019-05-09 19:37:35 +08002553
2554 // Do another query with testFlags
Luke Huang4eabbe32020-05-28 03:17:32 +08002555 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_a, testFlag);
Luke Huang40f5f492019-05-09 19:37:35 +08002556 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002557 expectAnswersValid(fd1, AF_INET, "1.2.3.6");
Luke Huang40f5f492019-05-09 19:37:35 +08002558 // Expect cache lookup is skipped.
Luke Huang4eabbe32020-05-28 03:17:32 +08002559 EXPECT_EQ(3U, GetNumQueries(dns, host_name3));
Luke Huang40f5f492019-05-09 19:37:35 +08002560
2561 // Re-query with no flags
Luke Huang4eabbe32020-05-28 03:17:32 +08002562 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_a, 0);
Luke Huang40f5f492019-05-09 19:37:35 +08002563 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002564 expectAnswersValid(fd1, AF_INET, "1.2.3.6");
Luke Huang40f5f492019-05-09 19:37:35 +08002565 // Expect no cache hit because cache storing is also skipped in previous query.
Luke Huang4eabbe32020-05-28 03:17:32 +08002566 EXPECT_EQ(4U, GetNumQueries(dns, host_name3));
Luke Huangba7bef92018-12-26 16:53:03 +08002567}
2568
Luke Huang08b13d22020-02-05 14:46:21 +08002569TEST_F(ResolverTest, Async_NoCacheStoreFlagDoesNotRefreshStaleCacheEntry) {
2570 constexpr char listen_addr[] = "127.0.0.4";
2571 constexpr char host_name[] = "howdy.example.com.";
2572 const std::vector<DnsRecord> records = {
2573 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2574 };
2575
2576 test::DNSResponder dns(listen_addr);
2577 StartDns(dns, records);
2578 std::vector<std::string> servers = {listen_addr};
2579 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
2580
2581 const unsigned SHORT_TTL_SEC = 1;
2582 dns.setTtl(SHORT_TTL_SEC);
2583
2584 // Refer to b/148842821 for the purpose of below test steps.
2585 // Basically, this test is used to ensure stale cache case is handled
2586 // correctly with ANDROID_RESOLV_NO_CACHE_STORE.
2587 int fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2588 EXPECT_TRUE(fd != -1);
2589 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2590
2591 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2592 dns.clearQueries();
2593
2594 // Wait until cache expired
2595 sleep(SHORT_TTL_SEC + 0.5);
2596
2597 // Now request the same hostname again.
2598 // We should see a new DNS query because the entry in cache has become stale.
2599 // Due to ANDROID_RESOLV_NO_CACHE_STORE, this query must *not* refresh that stale entry.
2600 fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2601 ANDROID_RESOLV_NO_CACHE_STORE);
2602 EXPECT_TRUE(fd != -1);
2603 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2604 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2605 dns.clearQueries();
2606
2607 // If the cache is still stale, we expect to see one more DNS query
2608 // (this time the cache will be refreshed, but we're not checking for it).
2609 fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2610 EXPECT_TRUE(fd != -1);
2611 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2612 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2613}
2614
Luke Huangba7bef92018-12-26 16:53:03 +08002615TEST_F(ResolverTest, Async_NoRetryFlag) {
Luke Huang70931aa2019-01-31 11:57:41 +08002616 constexpr char listen_addr0[] = "127.0.0.4";
2617 constexpr char listen_addr1[] = "127.0.0.6";
Xiao Ma09b71022018-12-11 17:56:32 +09002618 constexpr char host_name[] = "howdy.example.com.";
2619 const std::vector<DnsRecord> records = {
2620 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2621 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2622 };
2623
Luke Huang70931aa2019-01-31 11:57:41 +08002624 test::DNSResponder dns0(listen_addr0);
2625 test::DNSResponder dns1(listen_addr1);
2626 StartDns(dns0, records);
2627 StartDns(dns1, records);
2628 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr0, listen_addr1}));
Luke Huangba7bef92018-12-26 16:53:03 +08002629
Luke Huang70931aa2019-01-31 11:57:41 +08002630 dns0.clearQueries();
2631 dns1.clearQueries();
2632
2633 dns0.setResponseProbability(0.0);
2634 dns1.setResponseProbability(0.0);
Luke Huangba7bef92018-12-26 16:53:03 +08002635
2636 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2637 ANDROID_RESOLV_NO_RETRY);
2638 EXPECT_TRUE(fd1 != -1);
2639
2640 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa,
2641 ANDROID_RESOLV_NO_RETRY);
2642 EXPECT_TRUE(fd2 != -1);
2643
2644 // expect no response
2645 expectAnswersNotValid(fd1, -ETIMEDOUT);
2646 expectAnswersNotValid(fd2, -ETIMEDOUT);
Mike Yu532405f2020-06-17 17:46:44 +08002647 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2648 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
Luke Huangba7bef92018-12-26 16:53:03 +08002649
Luke Huang70931aa2019-01-31 11:57:41 +08002650 // No retry case, expect total 2 queries. The server is selected randomly.
2651 EXPECT_EQ(2U, GetNumQueries(dns0, host_name) + GetNumQueries(dns1, host_name));
Luke Huangba7bef92018-12-26 16:53:03 +08002652
Luke Huang70931aa2019-01-31 11:57:41 +08002653 dns0.clearQueries();
2654 dns1.clearQueries();
Luke Huangba7bef92018-12-26 16:53:03 +08002655
2656 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2657 EXPECT_TRUE(fd1 != -1);
2658
2659 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
2660 EXPECT_TRUE(fd2 != -1);
2661
2662 // expect no response
2663 expectAnswersNotValid(fd1, -ETIMEDOUT);
2664 expectAnswersNotValid(fd2, -ETIMEDOUT);
Mike Yu532405f2020-06-17 17:46:44 +08002665 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2666 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
Luke Huangba7bef92018-12-26 16:53:03 +08002667
2668 // Retry case, expect 4 queries
Luke Huang70931aa2019-01-31 11:57:41 +08002669 EXPECT_EQ(4U, GetNumQueries(dns0, host_name));
2670 EXPECT_EQ(4U, GetNumQueries(dns1, host_name));
2671}
2672
2673TEST_F(ResolverTest, Async_VerifyQueryID) {
2674 constexpr char listen_addr[] = "127.0.0.4";
2675 constexpr char host_name[] = "howdy.example.com.";
2676 const std::vector<DnsRecord> records = {
2677 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2678 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2679 };
2680
2681 test::DNSResponder dns(listen_addr);
2682 StartDns(dns, records);
2683 std::vector<std::string> servers = {listen_addr};
2684 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
2685
2686 const uint8_t queryBuf1[] = {
2687 /* Header */
2688 0x55, 0x66, /* Transaction ID */
2689 0x01, 0x00, /* Flags */
2690 0x00, 0x01, /* Questions */
2691 0x00, 0x00, /* Answer RRs */
2692 0x00, 0x00, /* Authority RRs */
2693 0x00, 0x00, /* Additional RRs */
2694 /* Queries */
2695 0x05, 0x68, 0x6f, 0x77, 0x64, 0x79, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
2696 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name */
2697 0x00, 0x01, /* Type */
2698 0x00, 0x01 /* Class */
2699 };
2700
2701 int fd = resNetworkSend(TEST_NETID, queryBuf1, sizeof(queryBuf1), 0);
2702 EXPECT_TRUE(fd != -1);
2703
2704 uint8_t buf[MAXPACKET] = {};
2705 int rcode;
2706
2707 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2708 EXPECT_GT(res, 0);
2709 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2710
2711 auto hp = reinterpret_cast<HEADER*>(buf);
2712 EXPECT_EQ(21862U, htons(hp->id));
2713
2714 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2715
2716 const uint8_t queryBuf2[] = {
2717 /* Header */
2718 0x00, 0x53, /* Transaction ID */
2719 0x01, 0x00, /* Flags */
2720 0x00, 0x01, /* Questions */
2721 0x00, 0x00, /* Answer RRs */
2722 0x00, 0x00, /* Authority RRs */
2723 0x00, 0x00, /* Additional RRs */
2724 /* Queries */
2725 0x05, 0x68, 0x6f, 0x77, 0x64, 0x79, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
2726 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name */
2727 0x00, 0x01, /* Type */
2728 0x00, 0x01 /* Class */
2729 };
2730
2731 // Re-query verify cache works and query id is correct
2732 fd = resNetworkSend(TEST_NETID, queryBuf2, sizeof(queryBuf2), 0);
2733
2734 EXPECT_TRUE(fd != -1);
2735
2736 res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2737 EXPECT_GT(res, 0);
2738 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2739
2740 EXPECT_EQ(0x0053U, htons(hp->id));
2741
2742 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
Luke Huangba7bef92018-12-26 16:53:03 +08002743}
2744
Mike Yu4f3747b2018-12-02 17:54:29 +09002745// This test checks that the resolver should not generate the request containing OPT RR when using
Ken Chen0a015532019-01-02 14:59:38 +08002746// cleartext DNS. If we query the DNS server not supporting EDNS0 and it reponds with
2747// FORMERR_ON_EDNS, we will fallback to no EDNS0 and try again. If the server does no response, we
2748// won't retry so that we get no answer.
Mike Yu4f3747b2018-12-02 17:54:29 +09002749TEST_F(ResolverTest, BrokenEdns) {
2750 typedef test::DNSResponder::Edns Edns;
2751 enum ExpectResult { EXPECT_FAILURE, EXPECT_SUCCESS };
2752
Mike Yu3977d482020-02-26 17:18:57 +08002753 // Perform cleartext query in off mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002754 const char OFF[] = "off";
Mike Yu3977d482020-02-26 17:18:57 +08002755
2756 // Perform cleartext query when there's no private DNS server validated in opportunistic mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002757 const char OPPORTUNISTIC_UDP[] = "opportunistic_udp";
Mike Yu3977d482020-02-26 17:18:57 +08002758
2759 // Perform cleartext query when there is a private DNS server validated in opportunistic mode.
2760 const char OPPORTUNISTIC_FALLBACK_UDP[] = "opportunistic_fallback_udp";
2761
2762 // Perform cyphertext query in opportunistic mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002763 const char OPPORTUNISTIC_TLS[] = "opportunistic_tls";
Mike Yu3977d482020-02-26 17:18:57 +08002764
2765 // Perform cyphertext query in strict mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002766 const char STRICT[] = "strict";
Mike Yu3977d482020-02-26 17:18:57 +08002767
Mike Yu4f3747b2018-12-02 17:54:29 +09002768 const char GETHOSTBYNAME[] = "gethostbyname";
2769 const char GETADDRINFO[] = "getaddrinfo";
Mike Yu4f3747b2018-12-02 17:54:29 +09002770 const char ADDR4[] = "192.0.2.1";
2771 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2772 const char CLEARTEXT_PORT[] = "53";
2773 const char TLS_PORT[] = "853";
Luke Huangf8215372019-11-22 11:53:41 +08002774 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
Mike Yu3977d482020-02-26 17:18:57 +08002775 ResolverParamsParcel paramsForCleanup = DnsResponderClient::GetDefaultResolverParamsParcel();
2776 paramsForCleanup.servers.clear();
2777 paramsForCleanup.tlsServers.clear();
Mike Yu4f3747b2018-12-02 17:54:29 +09002778
Mike Yufc125e42019-05-15 20:41:28 +08002779 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Mike Yu4f3747b2018-12-02 17:54:29 +09002780 ASSERT_TRUE(dns.startServer());
2781
2782 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2783
Luke Huangf8215372019-11-22 11:53:41 +08002784 // clang-format off
Mike Yu4f3747b2018-12-02 17:54:29 +09002785 static const struct TestConfig {
2786 std::string mode;
2787 std::string method;
2788 Edns edns;
2789 ExpectResult expectResult;
2790
2791 std::string asHostName() const {
2792 const char* ednsString;
2793 switch (edns) {
2794 case Edns::ON:
2795 ednsString = "ednsOn";
2796 break;
Ken Chen0a015532019-01-02 14:59:38 +08002797 case Edns::FORMERR_ON_EDNS:
Mike Yu4f3747b2018-12-02 17:54:29 +09002798 ednsString = "ednsFormerr";
2799 break;
2800 case Edns::DROP:
2801 ednsString = "ednsDrop";
2802 break;
2803 default:
2804 ednsString = "";
2805 break;
2806 }
2807 return StringPrintf("%s.%s.%s.", mode.c_str(), method.c_str(), ednsString);
2808 }
2809 } testConfigs[] = {
Mike Yu3977d482020-02-26 17:18:57 +08002810 // In OPPORTUNISTIC_TLS, if the DNS server doesn't support EDNS0 but TLS, the lookup
2811 // fails. Could such server exist? if so, we might need to fix it to fallback to
2812 // cleartext query. If the server still make no response for the queries with EDNS0, we
2813 // might also need to fix it to retry without EDNS0.
Mike Yu4f3747b2018-12-02 17:54:29 +09002814 // Another thing is that {OPPORTUNISTIC_TLS, Edns::DROP} and {STRICT, Edns::DROP} are
2815 // commented out since TLS timeout is not configurable.
2816 // TODO: Uncomment them after TLS timeout is configurable.
Mike Yu3977d482020-02-26 17:18:57 +08002817 {OFF, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2818 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2819 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2820 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2821 {STRICT, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2822 {OFF, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2823 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2824 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2825 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2826 {STRICT, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2827 {OFF, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2828 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2829
2830 // The failure is due to no retry on timeout. Maybe fix it?
2831 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2832
2833 //{OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2834 //{STRICT, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2835 {OFF, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2836 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2837 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2838 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2839 {STRICT, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2840 {OFF, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2841 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2842 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2843 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2844 {STRICT, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2845 {OFF, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2846 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2847
2848 // The failure is due to no retry on timeout. Maybe fix it?
2849 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2850
Mike Yu4f3747b2018-12-02 17:54:29 +09002851 //{OPPORTUNISTIC_TLS, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2852 //{STRICT, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2853 };
Luke Huangf8215372019-11-22 11:53:41 +08002854 // clang-format on
Mike Yu4f3747b2018-12-02 17:54:29 +09002855
2856 for (const auto& config : testConfigs) {
2857 const std::string testHostName = config.asHostName();
2858 SCOPED_TRACE(testHostName);
2859
2860 const char* host_name = testHostName.c_str();
2861 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
2862 dns.setEdns(config.edns);
2863
2864 if (config.mode == OFF) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002865 if (tls.running()) {
2866 ASSERT_TRUE(tls.stopServer());
2867 }
Xiao Ma09b71022018-12-11 17:56:32 +09002868 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Mike Yu4f3747b2018-12-02 17:54:29 +09002869 } else if (config.mode == OPPORTUNISTIC_UDP) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002870 if (tls.running()) {
2871 ASSERT_TRUE(tls.stopServer());
2872 }
Xiao Ma09b71022018-12-11 17:56:32 +09002873 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002874 kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002875 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), false));
Mike Yu3977d482020-02-26 17:18:57 +08002876 } else if (config.mode == OPPORTUNISTIC_TLS || config.mode == OPPORTUNISTIC_FALLBACK_UDP) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002877 if (!tls.running()) {
2878 ASSERT_TRUE(tls.startServer());
2879 }
Xiao Ma09b71022018-12-11 17:56:32 +09002880 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002881 kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002882 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Mike Yu3977d482020-02-26 17:18:57 +08002883
2884 if (config.mode == OPPORTUNISTIC_FALLBACK_UDP) {
2885 // Force the resolver to fallback to cleartext queries.
2886 ASSERT_TRUE(tls.stopServer());
2887 }
Mike Yu4f3747b2018-12-02 17:54:29 +09002888 } else if (config.mode == STRICT) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002889 if (!tls.running()) {
2890 ASSERT_TRUE(tls.startServer());
2891 }
Xiao Ma09b71022018-12-11 17:56:32 +09002892 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002893 kDefaultParams, kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08002894 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Mike Yu4f3747b2018-12-02 17:54:29 +09002895 }
2896
2897 if (config.method == GETHOSTBYNAME) {
2898 const hostent* h_result = gethostbyname(host_name);
2899 if (config.expectResult == EXPECT_SUCCESS) {
2900 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2901 ASSERT_TRUE(h_result != nullptr);
2902 ASSERT_EQ(4, h_result->h_length);
2903 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
2904 EXPECT_EQ(ADDR4, ToString(h_result));
2905 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
Mike Yu532405f2020-06-17 17:46:44 +08002906 ExpectDnsEvent(INetdEventListener::EVENT_GETHOSTBYNAME, 0, host_name, {ADDR4});
Mike Yu4f3747b2018-12-02 17:54:29 +09002907 } else {
2908 EXPECT_EQ(0U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
2909 ASSERT_TRUE(h_result == nullptr);
2910 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
Mike Yu532405f2020-06-17 17:46:44 +08002911 int returnCode = (config.edns == Edns::DROP) ? RCODE_TIMEOUT : EAI_FAIL;
2912 ExpectDnsEvent(INetdEventListener::EVENT_GETHOSTBYNAME, returnCode, host_name, {});
Mike Yu4f3747b2018-12-02 17:54:29 +09002913 }
2914 } else if (config.method == GETADDRINFO) {
2915 ScopedAddrinfo ai_result;
2916 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2917 ai_result = safe_getaddrinfo(host_name, nullptr, &hints);
2918 if (config.expectResult == EXPECT_SUCCESS) {
2919 EXPECT_TRUE(ai_result != nullptr);
2920 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2921 const std::string result_str = ToString(ai_result);
2922 EXPECT_EQ(ADDR4, result_str);
Mike Yu532405f2020-06-17 17:46:44 +08002923 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, 0, host_name, {ADDR4});
Mike Yu4f3747b2018-12-02 17:54:29 +09002924 } else {
2925 EXPECT_TRUE(ai_result == nullptr);
2926 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
Mike Yu532405f2020-06-17 17:46:44 +08002927 int returnCode = (config.edns == Edns::DROP) ? RCODE_TIMEOUT : EAI_FAIL;
2928 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, returnCode, host_name, {});
Mike Yu4f3747b2018-12-02 17:54:29 +09002929 }
2930 } else {
2931 FAIL() << "Unsupported query method: " << config.method;
2932 }
2933
Mike Yudd4ac2d2019-05-31 16:52:11 +08002934 tls.clearQueries();
Mike Yu4f3747b2018-12-02 17:54:29 +09002935 dns.clearQueries();
Mike Yu3977d482020-02-26 17:18:57 +08002936
2937 // Clear the setup to force the resolver to validate private DNS servers in every test.
2938 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(paramsForCleanup));
Mike Yu4f3747b2018-12-02 17:54:29 +09002939 }
Mike Yu4f3747b2018-12-02 17:54:29 +09002940}
nuccachena26cc2a2018-07-17 18:07:23 +08002941
Ken Chen0a015532019-01-02 14:59:38 +08002942// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2943// Resolver should have a reasonable number of retries instead of spinning forever. We don't have
2944// an efficient way to know if resolver is stuck in an infinite loop. However, test case will be
2945// failed due to timeout.
2946TEST_F(ResolverTest, UnstableTls) {
2947 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2948 const char CLEARTEXT_PORT[] = "53";
2949 const char TLS_PORT[] = "853";
2950 const char* host_name1 = "nonexistent1.example.com.";
2951 const char* host_name2 = "nonexistent2.example.com.";
2952 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
2953
Mike Yufc125e42019-05-15 20:41:28 +08002954 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Ken Chen0a015532019-01-02 14:59:38 +08002955 ASSERT_TRUE(dns.startServer());
2956 dns.setEdns(test::DNSResponder::Edns::FORMERR_ON_EDNS);
2957 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2958 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08002959 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002960 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
2961
Ken Chen0a015532019-01-02 14:59:38 +08002962 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
2963 tls.stopServer();
2964
2965 const hostent* h_result = gethostbyname(host_name1);
2966 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
2967 ASSERT_TRUE(h_result == nullptr);
2968 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2969
2970 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2971 ScopedAddrinfo ai_result = safe_getaddrinfo(host_name2, nullptr, &hints);
2972 EXPECT_TRUE(ai_result == nullptr);
2973 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
2974}
2975
2976// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2977// Moreover, server responds RCODE=FORMERR even on non-EDNS query.
2978TEST_F(ResolverTest, BogusDnsServer) {
2979 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2980 const char CLEARTEXT_PORT[] = "53";
2981 const char TLS_PORT[] = "853";
2982 const char* host_name1 = "nonexistent1.example.com.";
2983 const char* host_name2 = "nonexistent2.example.com.";
2984 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
2985
Mike Yufc125e42019-05-15 20:41:28 +08002986 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Ken Chen0a015532019-01-02 14:59:38 +08002987 ASSERT_TRUE(dns.startServer());
2988 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2989 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08002990 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002991 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
2992
Ken Chen0a015532019-01-02 14:59:38 +08002993 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
2994 tls.stopServer();
2995 dns.setEdns(test::DNSResponder::Edns::FORMERR_UNCOND);
2996
2997 const hostent* h_result = gethostbyname(host_name1);
2998 EXPECT_EQ(0U, GetNumQueries(dns, host_name1));
2999 ASSERT_TRUE(h_result == nullptr);
3000 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
3001
3002 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
3003 ScopedAddrinfo ai_result = safe_getaddrinfo(host_name2, nullptr, &hints);
3004 EXPECT_TRUE(ai_result == nullptr);
3005 EXPECT_EQ(0U, GetNumQueries(dns, host_name2));
3006}
3007
nuccachena26cc2a2018-07-17 18:07:23 +08003008TEST_F(ResolverTest, GetAddrInfo_Dns64Synthesize) {
3009 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003010 constexpr char dns64_name[] = "ipv4only.arpa.";
3011 constexpr char host_name[] = "v4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003012 const std::vector<DnsRecord> records = {
3013 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3014 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3015 };
nuccachena26cc2a2018-07-17 18:07:23 +08003016
Xiao Ma09b71022018-12-11 17:56:32 +09003017 test::DNSResponder dns(listen_addr);
Xiao Ma09b71022018-12-11 17:56:32 +09003018 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003019
3020 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003021 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003022
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003023 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003024 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003025 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003026
3027 // hints are necessary in order to let netd know which type of addresses the caller is
3028 // interested in.
Xiao Ma09b71022018-12-11 17:56:32 +09003029 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08003030 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
3031 EXPECT_TRUE(result != nullptr);
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003032 // TODO: BUG: there should only be two queries, one AAAA (which returns no records) and one A
3033 // (which returns 1.2.3.4). But there is an extra AAAA.
3034 EXPECT_EQ(3U, GetNumQueries(dns, host_name));
nuccachena26cc2a2018-07-17 18:07:23 +08003035
3036 std::string result_str = ToString(result);
3037 EXPECT_EQ(result_str, "64:ff9b::102:304");
3038
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003039 // Stopping NAT64 prefix discovery disables synthesis.
Luke Huang5bd827c2019-03-14 16:10:04 +08003040 EXPECT_TRUE(mDnsClient.resolvService()->stopPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003041 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_NOT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003042
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003043 dns.clearQueries();
nuccachena26cc2a2018-07-17 18:07:23 +08003044
3045 result = safe_getaddrinfo("v4only", nullptr, &hints);
3046 EXPECT_TRUE(result != nullptr);
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003047 // TODO: BUG: there should only be one query, an AAAA (which returns no records), because the
3048 // A is already cached. But there is an extra AAAA.
3049 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
nuccachena26cc2a2018-07-17 18:07:23 +08003050
3051 result_str = ToString(result);
3052 EXPECT_EQ(result_str, "1.2.3.4");
3053}
3054
nuccachena26cc2a2018-07-17 18:07:23 +08003055TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecified) {
3056 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003057 constexpr char dns64_name[] = "ipv4only.arpa.";
3058 constexpr char host_name[] = "v4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003059 const std::vector<DnsRecord> records = {
3060 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3061 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3062 };
nuccachena26cc2a2018-07-17 18:07:23 +08003063
Xiao Ma09b71022018-12-11 17:56:32 +09003064 test::DNSResponder dns(listen_addr);
3065 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003066 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003067 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003068
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003069 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003070 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003071 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003072
3073 // Ensure to synthesize AAAA if AF_INET6 is specified, and not to synthesize AAAA
3074 // in AF_INET case.
3075 addrinfo hints;
3076 memset(&hints, 0, sizeof(hints));
3077 hints.ai_family = AF_INET6;
3078 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
3079 EXPECT_TRUE(result != nullptr);
3080 std::string result_str = ToString(result);
3081 EXPECT_EQ(result_str, "64:ff9b::102:304");
3082
3083 hints.ai_family = AF_INET;
3084 result = safe_getaddrinfo("v4only", nullptr, &hints);
3085 EXPECT_TRUE(result != nullptr);
3086 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3087 result_str = ToString(result);
3088 EXPECT_EQ(result_str, "1.2.3.4");
3089}
nuccachena26cc2a2018-07-17 18:07:23 +08003090
3091TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedV6) {
3092 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003093 constexpr char dns64_name[] = "ipv4only.arpa.";
3094 constexpr char host_name[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003095 const std::vector<DnsRecord> records = {
3096 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3097 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3098 {host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
3099 };
nuccachena26cc2a2018-07-17 18:07:23 +08003100
Xiao Ma09b71022018-12-11 17:56:32 +09003101 test::DNSResponder dns(listen_addr);
3102 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003103 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003104 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003105
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003106 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003107 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003108 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003109
Xiao Ma09b71022018-12-11 17:56:32 +09003110 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08003111 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
3112 EXPECT_TRUE(result != nullptr);
3113 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3114
3115 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
Xiao Ma09b71022018-12-11 17:56:32 +09003116 const std::vector<std::string> result_strs = ToStrings(result);
nuccachena26cc2a2018-07-17 18:07:23 +08003117 for (const auto& str : result_strs) {
3118 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
3119 << ", result_str='" << str << "'";
3120 }
3121}
3122
3123TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedNoV6) {
3124 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003125 constexpr char dns64_name[] = "ipv4only.arpa.";
3126 constexpr char host_name[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003127 const std::vector<DnsRecord> records = {
3128 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3129 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3130 };
nuccachena26cc2a2018-07-17 18:07:23 +08003131
Xiao Ma09b71022018-12-11 17:56:32 +09003132 test::DNSResponder dns(listen_addr);
3133 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003134 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003135 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003136
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003137 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003138 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003139 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003140
Xiao Ma09b71022018-12-11 17:56:32 +09003141 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08003142 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
3143 EXPECT_TRUE(result != nullptr);
3144 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3145
3146 // In AF_UNSPEC case, synthesize AAAA if there's no AAAA answer.
3147 std::string result_str = ToString(result);
3148 EXPECT_EQ(result_str, "64:ff9b::102:304");
3149}
3150
3151TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecialUseIPv4Addresses) {
3152 constexpr char THIS_NETWORK[] = "this_network";
3153 constexpr char LOOPBACK[] = "loopback";
3154 constexpr char LINK_LOCAL[] = "link_local";
3155 constexpr char MULTICAST[] = "multicast";
3156 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
3157
3158 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
3159 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
3160 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
3161 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
3162 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
3163
3164 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003165 constexpr char dns64_name[] = "ipv4only.arpa.";
3166
Xiao Ma09b71022018-12-11 17:56:32 +09003167 test::DNSResponder dns(listen_addr);
3168 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003169 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003170 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003171
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003172 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003173 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003174 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003175
Luke Huangf8215372019-11-22 11:53:41 +08003176 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003177 static const struct TestConfig {
3178 std::string name;
3179 std::string addr;
3180
3181 std::string asHostName() const { return StringPrintf("%s.example.com.", name.c_str()); }
3182 } testConfigs[]{
3183 {THIS_NETWORK, ADDR_THIS_NETWORK},
3184 {LOOPBACK, ADDR_LOOPBACK},
3185 {LINK_LOCAL, ADDR_LINK_LOCAL},
3186 {MULTICAST, ADDR_MULTICAST},
3187 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
3188 };
Luke Huangf8215372019-11-22 11:53:41 +08003189 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003190
3191 for (const auto& config : testConfigs) {
3192 const std::string testHostName = config.asHostName();
3193 SCOPED_TRACE(testHostName);
3194
3195 const char* host_name = testHostName.c_str();
3196 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
3197
3198 addrinfo hints;
3199 memset(&hints, 0, sizeof(hints));
3200 hints.ai_family = AF_INET6;
3201 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
3202 // In AF_INET6 case, don't return IPv4 answers
3203 EXPECT_TRUE(result == nullptr);
3204 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3205 dns.clearQueries();
3206
3207 memset(&hints, 0, sizeof(hints));
3208 hints.ai_family = AF_UNSPEC;
3209 result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
3210 EXPECT_TRUE(result != nullptr);
3211 // Expect IPv6 query only. IPv4 answer has been cached in previous query.
3212 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3213 // In AF_UNSPEC case, don't synthesize special use IPv4 address.
3214 std::string result_str = ToString(result);
3215 EXPECT_EQ(result_str, config.addr.c_str());
3216 dns.clearQueries();
3217 }
3218}
3219
3220TEST_F(ResolverTest, GetAddrInfo_Dns64QueryWithNullArgumentHints) {
3221 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003222 constexpr char dns64_name[] = "ipv4only.arpa.";
3223 constexpr char host_name[] = "v4only.example.com.";
3224 constexpr char host_name2[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003225 const std::vector<DnsRecord> records = {
3226 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3227 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3228 {host_name2, ns_type::ns_t_a, "1.2.3.4"},
3229 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
3230 };
nuccachena26cc2a2018-07-17 18:07:23 +08003231
Xiao Ma09b71022018-12-11 17:56:32 +09003232 test::DNSResponder dns(listen_addr);
3233 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003234 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003235 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003236
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003237 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003238 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003239 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003240
3241 // Assign argument hints of getaddrinfo() as null is equivalent to set ai_family AF_UNSPEC.
3242 // In AF_UNSPEC case, synthesize AAAA if there has A answer only.
3243 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, nullptr);
3244 EXPECT_TRUE(result != nullptr);
3245 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3246 std::string result_str = ToString(result);
3247 EXPECT_EQ(result_str, "64:ff9b::102:304");
3248 dns.clearQueries();
3249
3250 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
3251 result = safe_getaddrinfo("v4v6", nullptr, nullptr);
3252 EXPECT_TRUE(result != nullptr);
3253 EXPECT_LE(2U, GetNumQueries(dns, host_name2));
3254 std::vector<std::string> result_strs = ToStrings(result);
3255 for (const auto& str : result_strs) {
3256 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
3257 << ", result_str='" << str << "'";
3258 }
3259}
3260
3261TEST_F(ResolverTest, GetAddrInfo_Dns64QueryNullArgumentNode) {
3262 constexpr char ADDR_ANYADDR_V4[] = "0.0.0.0";
3263 constexpr char ADDR_ANYADDR_V6[] = "::";
3264 constexpr char ADDR_LOCALHOST_V4[] = "127.0.0.1";
3265 constexpr char ADDR_LOCALHOST_V6[] = "::1";
3266
3267 constexpr char PORT_NAME_HTTP[] = "http";
3268 constexpr char PORT_NUMBER_HTTP[] = "80";
3269
3270 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003271 constexpr char dns64_name[] = "ipv4only.arpa.";
3272
Xiao Ma09b71022018-12-11 17:56:32 +09003273 test::DNSResponder dns(listen_addr);
3274 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003275 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003276 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003277
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003278 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003279 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003280 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003281
Luke Huangf8215372019-11-22 11:53:41 +08003282 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003283 // If node is null, return address is listed by libc/getaddrinfo.c as follows.
3284 // - passive socket -> anyaddr (0.0.0.0 or ::)
3285 // - non-passive socket -> localhost (127.0.0.1 or ::1)
3286 static const struct TestConfig {
3287 int flag;
3288 std::string addr_v4;
3289 std::string addr_v6;
3290
3291 std::string asParameters() const {
3292 return StringPrintf("flag=%d, addr_v4=%s, addr_v6=%s", flag, addr_v4.c_str(),
3293 addr_v6.c_str());
3294 }
3295 } testConfigs[]{
3296 {0 /* non-passive */, ADDR_LOCALHOST_V4, ADDR_LOCALHOST_V6},
3297 {AI_PASSIVE, ADDR_ANYADDR_V4, ADDR_ANYADDR_V6}
3298 };
Luke Huangf8215372019-11-22 11:53:41 +08003299 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003300
3301 for (const auto& config : testConfigs) {
3302 SCOPED_TRACE(config.asParameters());
3303
Xiao Ma09b71022018-12-11 17:56:32 +09003304 addrinfo hints = {
Nick Desaulnierscd6395a2019-10-11 09:15:24 -07003305 .ai_flags = config.flag,
Xiao Ma09b71022018-12-11 17:56:32 +09003306 .ai_family = AF_UNSPEC, // any address family
3307 .ai_socktype = 0, // any type
3308 .ai_protocol = 0, // any protocol
Xiao Ma09b71022018-12-11 17:56:32 +09003309 };
nuccachena26cc2a2018-07-17 18:07:23 +08003310
3311 // Assign hostname as null and service as port name.
3312 ScopedAddrinfo result = safe_getaddrinfo(nullptr, PORT_NAME_HTTP, &hints);
3313 ASSERT_TRUE(result != nullptr);
3314
3315 // Can't be synthesized because it should not get into Netd.
3316 std::vector<std::string> result_strs = ToStrings(result);
3317 for (const auto& str : result_strs) {
3318 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
3319 << ", result_str='" << str << "'";
3320 }
3321
3322 // Assign hostname as null and service as numeric port number.
3323 hints.ai_flags = config.flag | AI_NUMERICSERV;
3324 result = safe_getaddrinfo(nullptr, PORT_NUMBER_HTTP, &hints);
3325 ASSERT_TRUE(result != nullptr);
3326
3327 // Can't be synthesized because it should not get into Netd.
3328 result_strs = ToStrings(result);
3329 for (const auto& str : result_strs) {
3330 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
3331 << ", result_str='" << str << "'";
3332 }
3333 }
3334}
3335
3336TEST_F(ResolverTest, GetHostByAddr_ReverseDnsQueryWithHavingNat64Prefix) {
3337 struct hostent* result = nullptr;
3338 struct in_addr v4addr;
3339 struct in6_addr v6addr;
3340
3341 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003342 constexpr char dns64_name[] = "ipv4only.arpa.";
3343 constexpr char ptr_name[] = "v4v6.example.com.";
3344 // PTR record for IPv4 address 1.2.3.4
3345 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3346 // PTR record for IPv6 address 2001:db8::102:304
3347 constexpr char ptr_addr_v6[] =
3348 "4.0.3.0.2.0.1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa.";
Xiao Ma09b71022018-12-11 17:56:32 +09003349 const std::vector<DnsRecord> records = {
3350 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3351 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3352 {ptr_addr_v6, ns_type::ns_t_ptr, ptr_name},
3353 };
nuccachena26cc2a2018-07-17 18:07:23 +08003354
Xiao Ma09b71022018-12-11 17:56:32 +09003355 test::DNSResponder dns(listen_addr);
3356 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003357 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003358 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003359
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003360 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003361 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003362 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003363
3364 // Reverse IPv4 DNS query. Prefix should have no effect on it.
3365 inet_pton(AF_INET, "1.2.3.4", &v4addr);
3366 result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
3367 ASSERT_TRUE(result != nullptr);
3368 std::string result_str = result->h_name ? result->h_name : "null";
3369 EXPECT_EQ(result_str, "v4v6.example.com");
3370
3371 // Reverse IPv6 DNS query. Prefix should have no effect on it.
3372 inet_pton(AF_INET6, "2001:db8::102:304", &v6addr);
3373 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3374 ASSERT_TRUE(result != nullptr);
3375 result_str = result->h_name ? result->h_name : "null";
3376 EXPECT_EQ(result_str, "v4v6.example.com");
3377}
3378
3379TEST_F(ResolverTest, GetHostByAddr_ReverseDns64Query) {
3380 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003381 constexpr char dns64_name[] = "ipv4only.arpa.";
3382 constexpr char ptr_name[] = "v4only.example.com.";
3383 // PTR record for IPv4 address 1.2.3.4
3384 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3385 // PTR record for IPv6 address 64:ff9b::1.2.3.4
3386 constexpr char ptr_addr_v6_nomapping[] =
3387 "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.";
3388 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
3389 // PTR record for IPv6 address 64:ff9b::5.6.7.8
3390 constexpr char ptr_addr_v6_synthesis[] =
3391 "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 +09003392 const std::vector<DnsRecord> records = {
3393 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3394 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3395 {ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis},
3396 };
nuccachena26cc2a2018-07-17 18:07:23 +08003397
Xiao Ma09b71022018-12-11 17:56:32 +09003398 test::DNSResponder dns(listen_addr);
3399 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003400 // "ptr_addr_v6_nomapping" is not mapped in DNS server
nuccachena26cc2a2018-07-17 18:07:23 +08003401 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003402 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003403
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003404 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003405 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003406 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003407
3408 // Synthesized PTR record doesn't exist on DNS server
3409 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
3410 // After querying synthesized address failed, expect that prefix is removed from IPv6
3411 // synthesized address and do reverse IPv4 query instead.
3412 struct in6_addr v6addr;
3413 inet_pton(AF_INET6, "64:ff9b::1.2.3.4", &v6addr);
3414 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3415 ASSERT_TRUE(result != nullptr);
3416 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist
3417 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist
3418 std::string result_str = result->h_name ? result->h_name : "null";
3419 EXPECT_EQ(result_str, "v4only.example.com");
3420 // Check that return address has been mapped from IPv4 to IPv6 address because Netd
3421 // removes NAT64 prefix and does IPv4 DNS reverse lookup in this case. Then, Netd
3422 // fakes the return IPv4 address as original queried IPv6 address.
3423 result_str = ToString(result);
3424 EXPECT_EQ(result_str, "64:ff9b::102:304");
3425 dns.clearQueries();
3426
3427 // Synthesized PTR record exists on DNS server
3428 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
3429 // Expect to Netd pass through synthesized address for DNS queries.
3430 inet_pton(AF_INET6, "64:ff9b::5.6.7.8", &v6addr);
3431 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3432 ASSERT_TRUE(result != nullptr);
3433 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
3434 result_str = result->h_name ? result->h_name : "null";
3435 EXPECT_EQ(result_str, "v6synthesis.example.com");
3436}
3437
3438TEST_F(ResolverTest, GetHostByAddr_ReverseDns64QueryFromHostFile) {
3439 constexpr char dns64_name[] = "ipv4only.arpa.";
3440 constexpr char host_name[] = "localhost";
3441 // The address is synthesized by prefix64:localhost.
3442 constexpr char host_addr[] = "64:ff9b::7f00:1";
nuccachena26cc2a2018-07-17 18:07:23 +08003443 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003444
3445 test::DNSResponder dns(listen_addr);
3446 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003447 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003448 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003449
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003450 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003451 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003452 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003453
3454 // Using synthesized "localhost" address to be a trick for resolving host name
3455 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
3456 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
3457 struct in6_addr v6addr;
3458 inet_pton(AF_INET6, host_addr, &v6addr);
3459 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3460 ASSERT_TRUE(result != nullptr);
3461 // Expect no DNS queries; localhost is resolved via /etc/hosts.
3462 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
3463
Luke Huangf8215372019-11-22 11:53:41 +08003464 ASSERT_EQ(sizeof(in6_addr), (unsigned)result->h_length);
nuccachena26cc2a2018-07-17 18:07:23 +08003465 ASSERT_EQ(AF_INET6, result->h_addrtype);
3466 std::string result_str = ToString(result);
3467 EXPECT_EQ(result_str, host_addr);
3468 result_str = result->h_name ? result->h_name : "null";
3469 EXPECT_EQ(result_str, host_name);
3470}
3471
Hungming Chen9e6185a2019-06-04 16:09:19 +08003472TEST_F(ResolverTest, GetHostByAddr_cnamesClasslessReverseDelegation) {
3473 // IPv4 addresses in the subnet with notation '/' or '-'.
3474 constexpr char addr_slash[] = "192.0.2.1";
3475 constexpr char addr_hyphen[] = "192.0.3.1";
3476
3477 // Used to verify DNS reverse query for classless reverse lookup zone. See detail in RFC 2317
3478 // section 4.
3479 const static std::vector<DnsRecord> records = {
3480 // The records for reverse querying "192.0.2.1" in the subnet with notation '/'.
3481 {"1.2.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0/25.2.0.192.in-addr.arpa."},
3482 {"1.0/25.2.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3483
3484 // The records for reverse querying "192.0.3.1" in the subnet with notation '-'.
3485 {"1.3.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0-127.3.0.192.in-addr.arpa."},
3486 {"1.0-127.3.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3487 };
3488
3489 test::DNSResponder dns;
3490 StartDns(dns, records);
3491 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3492
3493 for (const auto& address : {addr_slash, addr_hyphen}) {
3494 SCOPED_TRACE(address);
3495
3496 in_addr v4addr;
3497 ASSERT_TRUE(inet_pton(AF_INET, address, &v4addr));
3498 hostent* result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
3499 ASSERT_TRUE(result != nullptr);
3500 EXPECT_STREQ("hello.example.com", result->h_name);
3501 }
3502}
3503
nuccachena26cc2a2018-07-17 18:07:23 +08003504TEST_F(ResolverTest, GetNameInfo_ReverseDnsQueryWithHavingNat64Prefix) {
3505 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003506 constexpr char dns64_name[] = "ipv4only.arpa.";
3507 constexpr char ptr_name[] = "v4v6.example.com.";
3508 // PTR record for IPv4 address 1.2.3.4
3509 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3510 // PTR record for IPv6 address 2001:db8::102:304
3511 constexpr char ptr_addr_v6[] =
3512 "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 +09003513 const std::vector<DnsRecord> records = {
3514 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3515 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3516 {ptr_addr_v6, ns_type::ns_t_ptr, ptr_name},
3517 };
nuccachena26cc2a2018-07-17 18:07:23 +08003518
Xiao Ma09b71022018-12-11 17:56:32 +09003519 test::DNSResponder dns(listen_addr);
3520 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003521 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003522 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003523
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003524 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003525 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003526 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003527
Luke Huangf8215372019-11-22 11:53:41 +08003528 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003529 static const struct TestConfig {
3530 int flag;
3531 int family;
3532 std::string addr;
3533 std::string host;
3534
3535 std::string asParameters() const {
3536 return StringPrintf("flag=%d, family=%d, addr=%s, host=%s", flag, family, addr.c_str(),
3537 host.c_str());
3538 }
3539 } testConfigs[]{
3540 {NI_NAMEREQD, AF_INET, "1.2.3.4", "v4v6.example.com"},
3541 {NI_NUMERICHOST, AF_INET, "1.2.3.4", "1.2.3.4"},
3542 {0, AF_INET, "1.2.3.4", "v4v6.example.com"},
3543 {0, AF_INET, "5.6.7.8", "5.6.7.8"}, // unmapped
3544 {NI_NAMEREQD, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
3545 {NI_NUMERICHOST, AF_INET6, "2001:db8::102:304", "2001:db8::102:304"},
3546 {0, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
3547 {0, AF_INET6, "2001:db8::506:708", "2001:db8::506:708"}, // unmapped
3548 };
Luke Huangf8215372019-11-22 11:53:41 +08003549 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003550
3551 // Reverse IPv4/IPv6 DNS query. Prefix should have no effect on it.
3552 for (const auto& config : testConfigs) {
3553 SCOPED_TRACE(config.asParameters());
3554
3555 int rv;
3556 char host[NI_MAXHOST];
3557 struct sockaddr_in sin;
3558 struct sockaddr_in6 sin6;
3559 if (config.family == AF_INET) {
3560 memset(&sin, 0, sizeof(sin));
3561 sin.sin_family = AF_INET;
3562 inet_pton(AF_INET, config.addr.c_str(), &sin.sin_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003563 rv = getnameinfo((const struct sockaddr*)&sin, sizeof(sin), host, sizeof(host), nullptr,
3564 0, config.flag);
nuccachena26cc2a2018-07-17 18:07:23 +08003565 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4));
3566 } else if (config.family == AF_INET6) {
3567 memset(&sin6, 0, sizeof(sin6));
3568 sin6.sin6_family = AF_INET6;
3569 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003570 rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host),
nuccachena26cc2a2018-07-17 18:07:23 +08003571 nullptr, 0, config.flag);
3572 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6));
3573 }
3574 ASSERT_EQ(0, rv);
3575 std::string result_str = host;
3576 EXPECT_EQ(result_str, config.host);
3577 dns.clearQueries();
3578 }
3579}
3580
3581TEST_F(ResolverTest, GetNameInfo_ReverseDns64Query) {
3582 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003583 constexpr char dns64_name[] = "ipv4only.arpa.";
3584 constexpr char ptr_name[] = "v4only.example.com.";
3585 // PTR record for IPv4 address 1.2.3.4
3586 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3587 // PTR record for IPv6 address 64:ff9b::1.2.3.4
3588 constexpr char ptr_addr_v6_nomapping[] =
3589 "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.";
3590 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
3591 // PTR record for IPv6 address 64:ff9b::5.6.7.8
3592 constexpr char ptr_addr_v6_synthesis[] =
3593 "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 +09003594 const std::vector<DnsRecord> records = {
3595 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3596 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3597 {ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis},
3598 };
nuccachena26cc2a2018-07-17 18:07:23 +08003599
Xiao Ma09b71022018-12-11 17:56:32 +09003600 test::DNSResponder dns(listen_addr);
3601 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003602 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003603 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003604
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003605 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003606 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003607 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003608
Luke Huangf8215372019-11-22 11:53:41 +08003609 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003610 static const struct TestConfig {
3611 bool hasSynthesizedPtrRecord;
3612 int flag;
3613 std::string addr;
3614 std::string host;
3615
3616 std::string asParameters() const {
3617 return StringPrintf("hasSynthesizedPtrRecord=%d, flag=%d, addr=%s, host=%s",
3618 hasSynthesizedPtrRecord, flag, addr.c_str(), host.c_str());
3619 }
3620 } testConfigs[]{
3621 {false, NI_NAMEREQD, "64:ff9b::102:304", "v4only.example.com"},
3622 {false, NI_NUMERICHOST, "64:ff9b::102:304", "64:ff9b::102:304"},
3623 {false, 0, "64:ff9b::102:304", "v4only.example.com"},
3624 {true, NI_NAMEREQD, "64:ff9b::506:708", "v6synthesis.example.com"},
3625 {true, NI_NUMERICHOST, "64:ff9b::506:708", "64:ff9b::506:708"},
3626 {true, 0, "64:ff9b::506:708", "v6synthesis.example.com"}
3627 };
Luke Huangf8215372019-11-22 11:53:41 +08003628 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003629
3630 // hasSynthesizedPtrRecord = false
3631 // Synthesized PTR record doesn't exist on DNS server
3632 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
3633 // After querying synthesized address failed, expect that prefix is removed from IPv6
3634 // synthesized address and do reverse IPv4 query instead.
3635 //
3636 // hasSynthesizedPtrRecord = true
3637 // Synthesized PTR record exists on DNS server
3638 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
3639 // Expect to just pass through synthesized address for DNS queries.
3640 for (const auto& config : testConfigs) {
3641 SCOPED_TRACE(config.asParameters());
3642
3643 char host[NI_MAXHOST];
3644 struct sockaddr_in6 sin6;
3645 memset(&sin6, 0, sizeof(sin6));
3646 sin6.sin6_family = AF_INET6;
3647 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003648 int rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host),
nuccachena26cc2a2018-07-17 18:07:23 +08003649 nullptr, 0, config.flag);
3650 ASSERT_EQ(0, rv);
3651 if (config.flag == NI_NAMEREQD) {
3652 if (config.hasSynthesizedPtrRecord) {
3653 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
3654 } else {
3655 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist.
3656 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist.
3657 }
3658 }
3659 std::string result_str = host;
3660 EXPECT_EQ(result_str, config.host);
3661 dns.clearQueries();
3662 }
3663}
3664
3665TEST_F(ResolverTest, GetNameInfo_ReverseDns64QueryFromHostFile) {
3666 constexpr char dns64_name[] = "ipv4only.arpa.";
3667 constexpr char host_name[] = "localhost";
3668 // The address is synthesized by prefix64:localhost.
3669 constexpr char host_addr[] = "64:ff9b::7f00:1";
nuccachena26cc2a2018-07-17 18:07:23 +08003670 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003671
3672 test::DNSResponder dns(listen_addr);
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003673
Xiao Ma09b71022018-12-11 17:56:32 +09003674 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003675 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003676 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003677
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003678 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003679 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003680 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003681
3682 // Using synthesized "localhost" address to be a trick for resolving host name
3683 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
3684 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
3685 char host[NI_MAXHOST];
Xiao Ma09b71022018-12-11 17:56:32 +09003686 struct sockaddr_in6 sin6 = {.sin6_family = AF_INET6};
nuccachena26cc2a2018-07-17 18:07:23 +08003687 inet_pton(AF_INET6, host_addr, &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003688 int rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host), nullptr,
nuccachena26cc2a2018-07-17 18:07:23 +08003689 0, NI_NAMEREQD);
3690 ASSERT_EQ(0, rv);
3691 // Expect no DNS queries; localhost is resolved via /etc/hosts.
3692 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
3693
3694 std::string result_str = host;
3695 EXPECT_EQ(result_str, host_name);
3696}
3697
Hungming Chen9e6185a2019-06-04 16:09:19 +08003698TEST_F(ResolverTest, GetNameInfo_cnamesClasslessReverseDelegation) {
3699 // IPv4 addresses in the subnet with notation '/' or '-'.
3700 constexpr char addr_slash[] = "192.0.2.1";
3701 constexpr char addr_hyphen[] = "192.0.3.1";
3702
3703 // Used to verify DNS reverse query for classless reverse lookup zone. See detail in RFC 2317
3704 // section 4.
3705 const static std::vector<DnsRecord> records = {
3706 // The records for reverse querying "192.0.2.1" in the subnet with notation '/'.
3707 {"1.2.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0/25.2.0.192.in-addr.arpa."},
3708 {"1.0/25.2.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3709
3710 // The records for reverse querying "192.0.3.1" in the subnet with notation '-'.
3711 {"1.3.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0-127.3.0.192.in-addr.arpa."},
3712 {"1.0-127.3.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3713 };
3714
3715 test::DNSResponder dns;
3716 StartDns(dns, records);
3717 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3718
3719 for (const auto& address : {addr_slash, addr_hyphen}) {
3720 SCOPED_TRACE(address);
3721
3722 char host[NI_MAXHOST];
3723 sockaddr_in sin = {.sin_family = AF_INET};
3724 ASSERT_TRUE(inet_pton(AF_INET, address, &sin.sin_addr));
3725 int rv = getnameinfo((const sockaddr*)&sin, sizeof(sin), host, sizeof(host), nullptr, 0,
3726 NI_NAMEREQD);
3727 ASSERT_EQ(0, rv);
3728 EXPECT_STREQ("hello.example.com", host);
3729 }
3730}
3731
nuccachena26cc2a2018-07-17 18:07:23 +08003732TEST_F(ResolverTest, GetHostByName2_Dns64Synthesize) {
Xiao Ma09b71022018-12-11 17:56:32 +09003733 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003734 constexpr char dns64_name[] = "ipv4only.arpa.";
3735 constexpr char host_name[] = "ipv4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003736 const std::vector<DnsRecord> records = {
3737 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3738 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3739 };
nuccachena26cc2a2018-07-17 18:07:23 +08003740
Xiao Ma09b71022018-12-11 17:56:32 +09003741 test::DNSResponder dns(listen_addr);
3742 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003743 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003744 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003745
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003746 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003747 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003748 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003749
3750 // Query an IPv4-only hostname. Expect that gets a synthesized address.
3751 struct hostent* result = gethostbyname2("ipv4only", AF_INET6);
3752 ASSERT_TRUE(result != nullptr);
3753 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3754 std::string result_str = ToString(result);
3755 EXPECT_EQ(result_str, "64:ff9b::102:304");
3756}
nuccachena26cc2a2018-07-17 18:07:23 +08003757
3758TEST_F(ResolverTest, GetHostByName2_DnsQueryWithHavingNat64Prefix) {
3759 constexpr char dns64_name[] = "ipv4only.arpa.";
3760 constexpr char host_name[] = "v4v6.example.com.";
nuccachena26cc2a2018-07-17 18:07:23 +08003761 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003762 const std::vector<DnsRecord> records = {
3763 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3764 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3765 {host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
3766 };
3767
3768 test::DNSResponder dns(listen_addr);
3769 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003770 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003771 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003772
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003773 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003774 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003775 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003776
3777 // IPv4 DNS query. Prefix should have no effect on it.
3778 struct hostent* result = gethostbyname2("v4v6", AF_INET);
3779 ASSERT_TRUE(result != nullptr);
3780 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3781 std::string result_str = ToString(result);
3782 EXPECT_EQ(result_str, "1.2.3.4");
3783 dns.clearQueries();
3784
3785 // IPv6 DNS query. Prefix should have no effect on it.
3786 result = gethostbyname2("v4v6", AF_INET6);
3787 ASSERT_TRUE(result != nullptr);
3788 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3789 result_str = ToString(result);
3790 EXPECT_EQ(result_str, "2001:db8::102:304");
3791}
3792
3793TEST_F(ResolverTest, GetHostByName2_Dns64QuerySpecialUseIPv4Addresses) {
3794 constexpr char THIS_NETWORK[] = "this_network";
3795 constexpr char LOOPBACK[] = "loopback";
3796 constexpr char LINK_LOCAL[] = "link_local";
3797 constexpr char MULTICAST[] = "multicast";
3798 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
3799
3800 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
3801 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
3802 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
3803 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
3804 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
3805
3806 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003807 constexpr char dns64_name[] = "ipv4only.arpa.";
3808
Xiao Ma09b71022018-12-11 17:56:32 +09003809 test::DNSResponder dns(listen_addr);
3810 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003811 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003812 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003813
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003814 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003815 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003816 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003817
Luke Huangf8215372019-11-22 11:53:41 +08003818 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003819 static const struct TestConfig {
3820 std::string name;
3821 std::string addr;
3822
3823 std::string asHostName() const {
Luke Huangf8215372019-11-22 11:53:41 +08003824 return StringPrintf("%s.example.com.", name.c_str());
nuccachena26cc2a2018-07-17 18:07:23 +08003825 }
3826 } testConfigs[]{
3827 {THIS_NETWORK, ADDR_THIS_NETWORK},
3828 {LOOPBACK, ADDR_LOOPBACK},
3829 {LINK_LOCAL, ADDR_LINK_LOCAL},
3830 {MULTICAST, ADDR_MULTICAST},
3831 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
3832 };
Luke Huangf8215372019-11-22 11:53:41 +08003833 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003834
3835 for (const auto& config : testConfigs) {
3836 const std::string testHostName = config.asHostName();
3837 SCOPED_TRACE(testHostName);
3838
3839 const char* host_name = testHostName.c_str();
3840 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
3841
3842 struct hostent* result = gethostbyname2(config.name.c_str(), AF_INET6);
3843 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3844
3845 // In AF_INET6 case, don't synthesize special use IPv4 address.
3846 // Expect to have no answer
3847 EXPECT_EQ(nullptr, result);
3848
3849 dns.clearQueries();
3850 }
Bernie Innocenti2fef2b82018-12-20 15:56:40 +09003851}
Mike Yuf14e1a92019-05-10 13:54:58 +08003852
3853TEST_F(ResolverTest, PrefixDiscoveryBypassTls) {
3854 constexpr char listen_addr[] = "::1";
3855 constexpr char cleartext_port[] = "53";
3856 constexpr char tls_port[] = "853";
3857 constexpr char dns64_name[] = "ipv4only.arpa.";
3858 const std::vector<std::string> servers = {listen_addr};
3859
3860 test::DNSResponder dns(listen_addr);
3861 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
3862 test::DnsTlsFrontend tls(listen_addr, tls_port, listen_addr, cleartext_port);
3863 ASSERT_TRUE(tls.startServer());
3864
3865 // Setup OPPORTUNISTIC mode and wait for the validation complete.
waynema0e73c2e2019-07-31 15:04:08 +08003866 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08003867 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003868 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yuf14e1a92019-05-10 13:54:58 +08003869 tls.clearQueries();
3870
3871 // Start NAT64 prefix discovery and wait for it complete.
3872 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003873 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
Mike Yuf14e1a92019-05-10 13:54:58 +08003874
3875 // Verify it bypassed TLS even though there's a TLS server available.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003876 EXPECT_EQ(0, tls.queries()) << dns.dumpQueries();
3877 EXPECT_EQ(1U, GetNumQueries(dns, dns64_name)) << dns.dumpQueries();
Mike Yuf14e1a92019-05-10 13:54:58 +08003878
3879 // Restart the testing network to reset the cache.
3880 mDnsClient.TearDown();
3881 mDnsClient.SetUp();
3882 dns.clearQueries();
3883
3884 // Setup STRICT mode and wait for the validation complete.
waynema0e73c2e2019-07-31 15:04:08 +08003885 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
3886 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08003887 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003888 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yuf14e1a92019-05-10 13:54:58 +08003889 tls.clearQueries();
3890
3891 // Start NAT64 prefix discovery and wait for it to complete.
3892 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003893 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
Mike Yuf14e1a92019-05-10 13:54:58 +08003894
3895 // Verify it bypassed TLS despite STRICT mode.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003896 EXPECT_EQ(0, tls.queries()) << dns.dumpQueries();
3897 EXPECT_EQ(1U, GetNumQueries(dns, dns64_name)) << dns.dumpQueries();
Mike Yuf14e1a92019-05-10 13:54:58 +08003898}
Luke Huang9807e6b2019-05-20 16:17:12 +08003899
Lorenzo Colittie51091d2020-05-20 02:48:44 +09003900TEST_F(ResolverTest, SetAndClearNat64Prefix) {
3901 constexpr char host_name[] = "v4.example.com.";
3902 constexpr char listen_addr[] = "::1";
3903 const std::vector<DnsRecord> records = {
3904 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3905 };
3906 const std::string kNat64Prefix1 = "64:ff9b::/96";
3907 const std::string kNat64Prefix2 = "2001:db8:6464::/96";
3908
3909 test::DNSResponder dns(listen_addr);
3910 StartDns(dns, records);
3911 const std::vector<std::string> servers = {listen_addr};
3912 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
3913
3914 auto resolvService = mDnsClient.resolvService();
3915 addrinfo hints = {.ai_family = AF_INET6};
3916
3917 // No NAT64 prefix, no AAAA record.
3918 ScopedAddrinfo result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3919 ASSERT_TRUE(result == nullptr);
3920
3921 // Set the prefix, and expect to get a synthesized AAAA record.
3922 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix2).isOk());
3923 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3924 ASSERT_FALSE(result == nullptr);
3925 EXPECT_EQ("2001:db8:6464::102:304", ToString(result));
3926
3927 // Update the prefix, expect to see AAAA records from the new prefix.
3928 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3929 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3930 ASSERT_FALSE(result == nullptr);
3931 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3932
3933 // Non-/96 prefixes are ignored.
3934 auto status = resolvService->setPrefix64(TEST_NETID, "64:ff9b::/64");
3935 EXPECT_FALSE(status.isOk());
3936 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3937 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3938
3939 // Invalid prefixes are ignored.
3940 status = resolvService->setPrefix64(TEST_NETID, "192.0.2.0/24");
3941 EXPECT_FALSE(status.isOk());
3942 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3943 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3944
3945 status = resolvService->setPrefix64(TEST_NETID, "192.0.2.1");
3946 EXPECT_FALSE(status.isOk());
3947 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3948 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3949
3950 status = resolvService->setPrefix64(TEST_NETID, "hello");
3951 EXPECT_FALSE(status.isOk());
3952 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3953 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3954
3955 // DNS64 synthesis is still working.
3956 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3957 ASSERT_FALSE(result == nullptr);
3958 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3959
3960 // Clear the prefix. No AAAA records any more.
3961 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, "").isOk());
3962 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3963 EXPECT_TRUE(result == nullptr);
3964
3965 // Calling startPrefix64Discovery clears the prefix.
3966 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3967 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3968 ASSERT_FALSE(result == nullptr);
3969 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3970
3971 EXPECT_TRUE(resolvService->startPrefix64Discovery(TEST_NETID).isOk());
3972 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3973 ASSERT_TRUE(result == nullptr);
3974
3975 // setPrefix64 fails if prefix discovery is started, even if no prefix is yet discovered...
3976 status = resolvService->setPrefix64(TEST_NETID, kNat64Prefix1);
3977 EXPECT_FALSE(status.isOk());
3978 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3979 EXPECT_EQ(EEXIST, status.getServiceSpecificError());
3980
3981 // .. and clearing the prefix also has no effect.
3982 status = resolvService->setPrefix64(TEST_NETID, "");
3983 EXPECT_FALSE(status.isOk());
3984 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3985 EXPECT_EQ(ENOENT, status.getServiceSpecificError());
3986
3987 // setPrefix64 succeeds again when prefix discovery is stopped.
3988 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
3989 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3990 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3991 ASSERT_FALSE(result == nullptr);
3992 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3993
3994 // Calling stopPrefix64Discovery clears the prefix.
3995 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
3996 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3997 ASSERT_TRUE(result == nullptr);
3998
3999 // Set up NAT64 prefix discovery.
4000 constexpr char dns64_name[] = "ipv4only.arpa.";
4001 const std::vector<DnsRecord> newRecords = {
4002 {host_name, ns_type::ns_t_a, "1.2.3.4"},
4003 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
4004 };
4005 dns.stopServer();
4006 StartDns(dns, newRecords);
4007
4008 EXPECT_TRUE(resolvService->startPrefix64Discovery(TEST_NETID).isOk());
4009 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
4010 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
4011 ASSERT_FALSE(result == nullptr);
4012 EXPECT_EQ("64:ff9b::102:304", ToString(result));
4013
4014 // setPrefix64 fails if NAT64 prefix discovery has succeeded, and the discovered prefix
4015 // continues to be used.
4016 status = resolvService->setPrefix64(TEST_NETID, kNat64Prefix2);
4017 EXPECT_FALSE(status.isOk());
4018 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
4019 EXPECT_EQ(EEXIST, status.getServiceSpecificError());
4020
4021 // Clearing the prefix also has no effect if discovery is started.
4022 status = resolvService->setPrefix64(TEST_NETID, "");
4023 EXPECT_FALSE(status.isOk());
4024 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
4025 EXPECT_EQ(ENOENT, status.getServiceSpecificError());
4026
4027 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
4028 ASSERT_FALSE(result == nullptr);
4029 EXPECT_EQ("64:ff9b::102:304", ToString(result));
4030
4031 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
4032 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_NOT_FOUND));
Lorenzo Colitti61f796b2020-05-21 00:57:49 +09004033
4034 EXPECT_EQ(0, sDnsMetricsListener->getUnexpectedNat64PrefixUpdates());
Lorenzo Colittie51091d2020-05-20 02:48:44 +09004035}
4036
Luke Huang9807e6b2019-05-20 16:17:12 +08004037namespace {
4038
Luke Huang0d592bc2019-05-25 18:24:03 +08004039class ScopedSetNetworkForProcess {
4040 public:
4041 explicit ScopedSetNetworkForProcess(unsigned netId) {
4042 mStoredNetId = getNetworkForProcess();
4043 if (netId == mStoredNetId) return;
4044 EXPECT_EQ(0, setNetworkForProcess(netId));
4045 }
4046 ~ScopedSetNetworkForProcess() { EXPECT_EQ(0, setNetworkForProcess(mStoredNetId)); }
4047
4048 private:
4049 unsigned mStoredNetId;
4050};
4051
4052class ScopedSetNetworkForResolv {
4053 public:
4054 explicit ScopedSetNetworkForResolv(unsigned netId) { EXPECT_EQ(0, setNetworkForResolv(netId)); }
4055 ~ScopedSetNetworkForResolv() { EXPECT_EQ(0, setNetworkForResolv(NETID_UNSET)); }
4056};
4057
Luke Huang9807e6b2019-05-20 16:17:12 +08004058void sendCommand(int fd, const std::string& cmd) {
4059 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size() + 1));
4060 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size() + 1));
4061}
4062
4063int32_t readBE32(int fd) {
4064 int32_t tmp;
4065 int n = TEMP_FAILURE_RETRY(read(fd, &tmp, sizeof(tmp)));
4066 EXPECT_TRUE(n > 0);
4067 return ntohl(tmp);
4068}
4069
Luke Huang0d592bc2019-05-25 18:24:03 +08004070int readResponseCode(int fd) {
Luke Huang9807e6b2019-05-20 16:17:12 +08004071 char buf[4];
4072 int n = TEMP_FAILURE_RETRY(read(fd, &buf, sizeof(buf)));
4073 EXPECT_TRUE(n > 0);
4074 // The format of response code is that 4 bytes for the code & null.
4075 buf[3] = '\0';
4076 int result;
4077 EXPECT_TRUE(ParseInt(buf, &result));
4078 return result;
4079}
4080
Luke Huang0d592bc2019-05-25 18:24:03 +08004081bool checkAndClearUseLocalNameserversFlag(unsigned* netid) {
4082 if (netid == nullptr || ((*netid) & NETID_USE_LOCAL_NAMESERVERS) == 0) {
4083 return false;
4084 }
4085 *netid = (*netid) & ~NETID_USE_LOCAL_NAMESERVERS;
4086 return true;
4087}
4088
Luke Huangf8215372019-11-22 11:53:41 +08004089aidl::android::net::UidRangeParcel makeUidRangeParcel(int start, int stop) {
4090 aidl::android::net::UidRangeParcel res;
Luke Huang0d592bc2019-05-25 18:24:03 +08004091 res.start = start;
4092 res.stop = stop;
4093
4094 return res;
4095}
4096
4097void expectNetIdWithLocalNameserversFlag(unsigned netId) {
4098 unsigned dnsNetId = 0;
4099 EXPECT_EQ(0, getNetworkForDns(&dnsNetId));
4100 EXPECT_TRUE(checkAndClearUseLocalNameserversFlag(&dnsNetId));
4101 EXPECT_EQ(netId, static_cast<unsigned>(dnsNetId));
4102}
4103
4104void expectDnsNetIdEquals(unsigned netId) {
4105 unsigned dnsNetId = 0;
4106 EXPECT_EQ(0, getNetworkForDns(&dnsNetId));
4107 EXPECT_EQ(netId, static_cast<unsigned>(dnsNetId));
4108}
4109
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004110void expectDnsNetIdIsDefaultNetwork(INetd* netdService) {
Luke Huang0d592bc2019-05-25 18:24:03 +08004111 int currentNetid;
4112 EXPECT_TRUE(netdService->networkGetDefault(&currentNetid).isOk());
4113 expectDnsNetIdEquals(currentNetid);
4114}
4115
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004116void expectDnsNetIdWithVpn(INetd* netdService, unsigned vpnNetId, unsigned expectedNetId) {
Luke Huang0d592bc2019-05-25 18:24:03 +08004117 EXPECT_TRUE(netdService->networkCreateVpn(vpnNetId, false /* secure */).isOk());
4118 uid_t uid = getuid();
4119 // Add uid to VPN
4120 EXPECT_TRUE(netdService->networkAddUidRanges(vpnNetId, {makeUidRangeParcel(uid, uid)}).isOk());
4121 expectDnsNetIdEquals(expectedNetId);
4122 EXPECT_TRUE(netdService->networkDestroy(vpnNetId).isOk());
4123}
4124
Luke Huang9807e6b2019-05-20 16:17:12 +08004125} // namespace
4126
4127TEST_F(ResolverTest, getDnsNetId) {
4128 // We've called setNetworkForProcess in SetupOemNetwork, so reset to default first.
4129 setNetworkForProcess(NETID_UNSET);
Luke Huang0d592bc2019-05-25 18:24:03 +08004130
4131 expectDnsNetIdIsDefaultNetwork(mDnsClient.netdService());
4132 expectDnsNetIdWithVpn(mDnsClient.netdService(), TEST_VPN_NETID, TEST_VPN_NETID);
Luke Huang9807e6b2019-05-20 16:17:12 +08004133
4134 // Test with setNetworkForProcess
Luke Huang0d592bc2019-05-25 18:24:03 +08004135 {
4136 ScopedSetNetworkForProcess scopedSetNetworkForProcess(TEST_NETID);
4137 expectDnsNetIdEquals(TEST_NETID);
4138 }
4139
4140 // Test with setNetworkForProcess with NETID_USE_LOCAL_NAMESERVERS
4141 {
4142 ScopedSetNetworkForProcess scopedSetNetworkForProcess(TEST_NETID |
4143 NETID_USE_LOCAL_NAMESERVERS);
4144 expectNetIdWithLocalNameserversFlag(TEST_NETID);
4145 }
Luke Huang9807e6b2019-05-20 16:17:12 +08004146
4147 // Test with setNetworkForResolv
Luke Huang0d592bc2019-05-25 18:24:03 +08004148 {
4149 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID);
4150 expectDnsNetIdEquals(TEST_NETID);
4151 }
4152
4153 // Test with setNetworkForResolv with NETID_USE_LOCAL_NAMESERVERS
4154 {
4155 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID |
4156 NETID_USE_LOCAL_NAMESERVERS);
4157 expectNetIdWithLocalNameserversFlag(TEST_NETID);
4158 }
4159
4160 // Test with setNetworkForResolv under bypassable vpn
4161 {
4162 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID);
4163 expectDnsNetIdWithVpn(mDnsClient.netdService(), TEST_VPN_NETID, TEST_NETID);
4164 }
Luke Huang9807e6b2019-05-20 16:17:12 +08004165
4166 // Create socket connected to DnsProxyListener
4167 int fd = dns_open_proxy();
4168 EXPECT_TRUE(fd > 0);
4169 unique_fd ufd(fd);
4170
4171 // Test command with wrong netId
4172 sendCommand(fd, "getdnsnetid abc");
Luke Huang0d592bc2019-05-25 18:24:03 +08004173 EXPECT_EQ(ResponseCode::DnsProxyQueryResult, readResponseCode(fd));
Luke Huang9807e6b2019-05-20 16:17:12 +08004174 EXPECT_EQ(-EINVAL, readBE32(fd));
4175
4176 // Test unsupported command
4177 sendCommand(fd, "getdnsnetidNotSupported");
4178 // Keep in sync with FrameworkListener.cpp (500, "Command not recognized")
Luke Huang0d592bc2019-05-25 18:24:03 +08004179 EXPECT_EQ(500, readResponseCode(fd));
Luke Huang9807e6b2019-05-20 16:17:12 +08004180}
Sehee Park2c118782019-05-07 13:02:45 +09004181
4182TEST_F(ResolverTest, BlockDnsQueryWithUidRule) {
4183 constexpr char listen_addr1[] = "127.0.0.4";
4184 constexpr char listen_addr2[] = "::1";
4185 constexpr char host_name[] = "howdy.example.com.";
4186 const std::vector<DnsRecord> records = {
4187 {host_name, ns_type::ns_t_a, "1.2.3.4"},
4188 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
4189 };
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004190 INetd* netdService = mDnsClient.netdService();
Sehee Park2c118782019-05-07 13:02:45 +09004191
4192 test::DNSResponder dns1(listen_addr1);
4193 test::DNSResponder dns2(listen_addr2);
4194 StartDns(dns1, records);
4195 StartDns(dns2, records);
4196
4197 std::vector<std::string> servers = {listen_addr1, listen_addr2};
4198 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
4199 dns1.clearQueries();
4200 dns2.clearQueries();
4201
Luke Huangeb618ef2020-05-26 14:17:02 +08004202 ScopeBlockedUIDRule scopeBlockUidRule(netdService, TEST_UID);
Sehee Park2c118782019-05-07 13:02:45 +09004203 // Dns Query
4204 int fd1 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_a, 0);
4205 int fd2 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_aaaa, 0);
4206 EXPECT_TRUE(fd1 != -1);
4207 EXPECT_TRUE(fd2 != -1);
4208
Luke Huang5729afc2020-07-30 23:12:17 +08004209 uint8_t buf1[MAXPACKET] = {};
4210 uint8_t buf2[MAXPACKET] = {};
Sehee Park2c118782019-05-07 13:02:45 +09004211 int rcode;
Luke Huang5729afc2020-07-30 23:12:17 +08004212 int res2 = getAsyncResponse(fd2, &rcode, buf2, MAXPACKET);
4213 int res1 = getAsyncResponse(fd1, &rcode, buf1, MAXPACKET);
4214 // If API level >= 30 (R+), these queries should be blocked.
4215 if (isAtLeastR) {
4216 EXPECT_EQ(res2, -ECONNREFUSED);
4217 EXPECT_EQ(res1, -ECONNREFUSED);
4218 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, EAI_SYSTEM, "howdy.example.com", {});
4219 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, EAI_SYSTEM, "howdy.example.com", {});
4220 } else {
4221 EXPECT_GT(res2, 0);
4222 EXPECT_EQ("::1.2.3.4", toString(buf2, res2, AF_INET6));
4223 EXPECT_GT(res1, 0);
4224 EXPECT_EQ("1.2.3.4", toString(buf1, res1, AF_INET));
4225 // To avoid flaky test, do not evaluate DnsEvent since event order is not guaranteed.
4226 }
Sehee Park2c118782019-05-07 13:02:45 +09004227}
Mike Yua772c202019-09-23 17:47:21 +08004228
Ken Chenbc481b82020-05-21 23:30:01 +08004229TEST_F(ResolverTest, EnforceDnsUid) {
Ken Chenbc481b82020-05-21 23:30:01 +08004230 constexpr char listen_addr1[] = "127.0.0.4";
4231 constexpr char listen_addr2[] = "::1";
4232 constexpr char host_name[] = "howdy.example.com.";
4233 const std::vector<DnsRecord> records = {
4234 {host_name, ns_type::ns_t_a, "1.2.3.4"},
4235 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
4236 };
4237 INetd* netdService = mDnsClient.netdService();
4238
4239 test::DNSResponder dns1(listen_addr1);
4240 test::DNSResponder dns2(listen_addr2);
4241 StartDns(dns1, records);
4242 StartDns(dns2, records);
4243
4244 // switch uid of DNS queries from applications to AID_DNS
4245 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4246 parcel.servers = {listen_addr1, listen_addr2};
4247 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk());
4248
4249 uint8_t buf[MAXPACKET] = {};
Luke Huang5729afc2020-07-30 23:12:17 +08004250 uint8_t buf2[MAXPACKET] = {};
Ken Chenbc481b82020-05-21 23:30:01 +08004251 int rcode;
4252 {
4253 ScopeBlockedUIDRule scopeBlockUidRule(netdService, TEST_UID);
4254 // Dns Queries should be blocked
Luke Huang5729afc2020-07-30 23:12:17 +08004255 const int fd1 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_a, 0);
4256 const int fd2 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_aaaa, 0);
Ken Chenbc481b82020-05-21 23:30:01 +08004257 EXPECT_TRUE(fd1 != -1);
4258 EXPECT_TRUE(fd2 != -1);
4259
Luke Huang5729afc2020-07-30 23:12:17 +08004260 const int res2 = getAsyncResponse(fd2, &rcode, buf2, MAXPACKET);
4261 const int res1 = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
4262 // If API level >= 30 (R+), the query should be blocked.
4263 if (isAtLeastR) {
4264 EXPECT_EQ(res2, -ECONNREFUSED);
4265 EXPECT_EQ(res1, -ECONNREFUSED);
4266 } else {
4267 EXPECT_GT(res2, 0);
4268 EXPECT_EQ("::1.2.3.4", toString(buf2, res2, AF_INET6));
4269 EXPECT_GT(res1, 0);
4270 EXPECT_EQ("1.2.3.4", toString(buf, res1, AF_INET));
4271 }
Ken Chenbc481b82020-05-21 23:30:01 +08004272 }
4273
Luke Huang5729afc2020-07-30 23:12:17 +08004274 memset(buf, 0, MAXPACKET);
Ken Chenbc481b82020-05-21 23:30:01 +08004275 parcel.resolverOptions.enforceDnsUid = true;
4276 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk());
4277 {
4278 ScopeBlockedUIDRule scopeBlockUidRule(netdService, TEST_UID);
4279 // Dns Queries should NOT be blocked
4280 int fd1 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_a, 0);
4281 int fd2 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_aaaa, 0);
4282 EXPECT_TRUE(fd1 != -1);
4283 EXPECT_TRUE(fd2 != -1);
4284
4285 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
4286 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
4287
4288 memset(buf, 0, MAXPACKET);
4289 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
4290 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
4291
4292 // @TODO: So far we know that uid of DNS queries are no more set to DNS requester. But we
4293 // don't check if they are actually being set to AID_DNS, because system uids are always
4294 // allowed in bpf_owner_match(). Audit by firewallSetUidRule(AID_DNS) + sending queries is
4295 // infeasible. Fix it if the behavior of bpf_owner_match() is changed in the future, or if
4296 // we have better idea to deal with this.
4297 }
4298}
4299
Mike Yua772c202019-09-23 17:47:21 +08004300TEST_F(ResolverTest, ConnectTlsServerTimeout) {
Mike Yu40e67072019-10-09 21:14:09 +08004301 constexpr char hostname1[] = "query1.example.com.";
4302 constexpr char hostname2[] = "query2.example.com.";
Mike Yua772c202019-09-23 17:47:21 +08004303 const std::vector<DnsRecord> records = {
Mike Yu40e67072019-10-09 21:14:09 +08004304 {hostname1, ns_type::ns_t_a, "1.2.3.4"},
4305 {hostname2, ns_type::ns_t_a, "1.2.3.5"},
Mike Yua772c202019-09-23 17:47:21 +08004306 };
4307
Mike Yu40e67072019-10-09 21:14:09 +08004308 // The resolver will adjust the timeout value to 1000ms since the value is too small.
4309 ScopedSystemProperties scopedSystemProperties(kDotConnectTimeoutMsFlag, "100");
Mike Yua772c202019-09-23 17:47:21 +08004310
Mike Yue93d9ae2020-08-25 19:09:51 +08004311 static const struct TestConfig {
4312 bool asyncHandshake;
Mike Yubb499092020-08-28 19:18:42 +08004313 int maxRetries;
4314
4315 // if asyncHandshake:
4316 // expectedTimeout = dotConnectTimeoutMs * maxRetries
4317 // otherwise:
4318 // expectedTimeout = dotConnectTimeoutMs
Mike Yue93d9ae2020-08-25 19:09:51 +08004319 int expectedTimeout;
4320 } testConfigs[] = {
Mike Yubb499092020-08-28 19:18:42 +08004321 // Test mis-configured dot_maxtries flag.
4322 {false, 0, 1000}, {true, 0, 1000},
Mike Yua772c202019-09-23 17:47:21 +08004323
Mike Yubb499092020-08-28 19:18:42 +08004324 {false, 1, 1000}, {false, 3, 1000}, {true, 1, 1000}, {true, 3, 3000},
Mike Yue93d9ae2020-08-25 19:09:51 +08004325 };
Mike Yua772c202019-09-23 17:47:21 +08004326
Mike Yue93d9ae2020-08-25 19:09:51 +08004327 for (const auto& config : testConfigs) {
Mike Yubb499092020-08-28 19:18:42 +08004328 SCOPED_TRACE(fmt::format("testConfig: [{}, {}]", config.asyncHandshake, config.maxRetries));
Mike Yua772c202019-09-23 17:47:21 +08004329
Mike Yue93d9ae2020-08-25 19:09:51 +08004330 // Because a DnsTlsTransport lasts at least 5 minutes in spite of network
4331 // destroyed, let the resolver creates an unique DnsTlsTransport every time
4332 // so that the DnsTlsTransport won't interfere the other tests.
4333 const std::string addr = getUniqueIPv4Address();
4334 test::DNSResponder dns(addr);
4335 StartDns(dns, records);
4336 test::DnsTlsFrontend tls(addr, "853", addr, "53");
4337 ASSERT_TRUE(tls.startServer());
Mike Yua772c202019-09-23 17:47:21 +08004338
Mike Yubb499092020-08-28 19:18:42 +08004339 ScopedSystemProperties scopedSystemProperties1(kDotAsyncHandshakeFlag,
4340 config.asyncHandshake ? "1" : "0");
4341 ScopedSystemProperties scopedSystemProperties2(kDotMaxretriesFlag,
4342 std::to_string(config.maxRetries));
Mike Yue93d9ae2020-08-25 19:09:51 +08004343 resetNetwork();
Mike Yu40e67072019-10-09 21:14:09 +08004344
Mike Yue93d9ae2020-08-25 19:09:51 +08004345 // Set up resolver to opportunistic mode.
4346 auto parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4347 parcel.servers = {addr};
4348 parcel.tlsServers = {addr};
4349 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4350 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
4351 EXPECT_TRUE(tls.waitForQueries(1));
4352 tls.clearQueries();
4353 dns.clearQueries();
Mike Yu40e67072019-10-09 21:14:09 +08004354
Mike Yue93d9ae2020-08-25 19:09:51 +08004355 // The server becomes unresponsive to the handshake request.
4356 tls.setHangOnHandshakeForTesting(true);
Mike Yu40e67072019-10-09 21:14:09 +08004357
Mike Yue93d9ae2020-08-25 19:09:51 +08004358 // Expect the things happening in getaddrinfo():
4359 // 1. Connect to the private DNS server.
4360 // 2. SSL handshake times out.
4361 // 3. Fallback to UDP transport, and then get the answer.
4362 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4363 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(hostname1, nullptr, hints);
4364
4365 EXPECT_NE(nullptr, result);
4366 EXPECT_EQ(0, tls.queries());
4367 EXPECT_EQ(1U, GetNumQueries(dns, hostname1));
4368 EXPECT_EQ(records.at(0).addr, ToString(result));
4369
4370 // A loose upper bound is set by adding 1000ms buffer time. Theoretically, getaddrinfo()
4371 // should just take a bit more than expetTimeout milliseconds.
4372 EXPECT_GE(timeTakenMs, config.expectedTimeout);
4373 EXPECT_LE(timeTakenMs, config.expectedTimeout + 1000);
4374
4375 // Set the server to be responsive. Verify that the resolver will attempt to reconnect
4376 // to the server and then get the result within the timeout.
4377 tls.setHangOnHandshakeForTesting(false);
4378 std::tie(result, timeTakenMs) = safe_getaddrinfo_time_taken(hostname2, nullptr, hints);
4379
4380 EXPECT_NE(nullptr, result);
4381 EXPECT_TRUE(tls.waitForQueries(1));
4382 EXPECT_EQ(1U, GetNumQueries(dns, hostname2));
4383 EXPECT_EQ(records.at(1).addr, ToString(result));
4384
4385 EXPECT_LE(timeTakenMs, 200);
4386 }
4387}
4388
4389TEST_F(ResolverTest, ConnectTlsServerTimeout_ConcurrentQueries) {
4390 constexpr uint32_t cacheFlag = ANDROID_RESOLV_NO_CACHE_LOOKUP;
4391 constexpr char hostname[] = "hello.example.com.";
4392 const std::vector<DnsRecord> records = {
4393 {hostname, ns_type::ns_t_a, "1.2.3.4"},
4394 };
4395
4396 static const struct TestConfig {
4397 bool asyncHandshake;
4398 int dotConnectTimeoutMs;
Mike Yubb499092020-08-28 19:18:42 +08004399 int maxRetries;
Mike Yue93d9ae2020-08-25 19:09:51 +08004400 int concurrency;
Mike Yubb499092020-08-28 19:18:42 +08004401
4402 // if asyncHandshake:
4403 // expectedTimeout = dotConnectTimeoutMs * maxRetries
4404 // otherwise:
4405 // expectedTimeout = dotConnectTimeoutMs * concurrency
Mike Yue93d9ae2020-08-25 19:09:51 +08004406 int expectedTimeout;
4407 } testConfigs[] = {
Mike Yubb499092020-08-28 19:18:42 +08004408 // clang-format off
4409 {false, 1000, 1, 5, 5000},
4410 {false, 1000, 3, 5, 5000},
4411 {true, 1000, 1, 5, 1000},
4412 {true, 2500, 1, 10, 2500},
4413 {true, 1000, 3, 5, 3000},
4414 // clang-format on
Mike Yue93d9ae2020-08-25 19:09:51 +08004415 };
4416
4417 // Launch query threads. Expected behaviors are:
4418 // - when dot_async_handshake is disabled, one of the query threads triggers a
4419 // handshake and then times out. Then same as another query thread, and so forth.
4420 // - when dot_async_handshake is enabled, only one handshake is triggered, and then
4421 // all of the query threads time out at the same time.
4422 for (const auto& config : testConfigs) {
4423 ScopedSystemProperties scopedSystemProperties1(kDotConnectTimeoutMsFlag,
4424 std::to_string(config.dotConnectTimeoutMs));
4425 ScopedSystemProperties scopedSystemProperties2(kDotAsyncHandshakeFlag,
4426 config.asyncHandshake ? "1" : "0");
Mike Yubb499092020-08-28 19:18:42 +08004427 ScopedSystemProperties scopedSystemProperties3(kDotMaxretriesFlag,
4428 std::to_string(config.maxRetries));
Mike Yue93d9ae2020-08-25 19:09:51 +08004429 resetNetwork();
4430
4431 for (const auto& dnsMode : {"OPPORTUNISTIC", "STRICT"}) {
4432 SCOPED_TRACE(fmt::format("testConfig: [{}, {}]", config.asyncHandshake, dnsMode));
4433
4434 // Because a DnsTlsTransport lasts at least 5 minutes in spite of network
4435 // destroyed, let the resolver creates an unique DnsTlsTransport every time
4436 // so that the DnsTlsTransport won't interfere the other tests.
4437 const std::string addr = getUniqueIPv4Address();
4438 test::DNSResponder dns(addr);
4439 StartDns(dns, records);
4440 test::DnsTlsFrontend tls(addr, "853", addr, "53");
4441 ASSERT_TRUE(tls.startServer());
4442
4443 auto parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4444 parcel.servers = {addr};
4445 parcel.tlsServers = {addr};
4446 if (dnsMode == "STRICT") parcel.tlsName = kDefaultPrivateDnsHostName;
4447 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4448 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
4449 EXPECT_TRUE(tls.waitForQueries(1));
4450
4451 // The server becomes unresponsive to the handshake request.
4452 tls.setHangOnHandshakeForTesting(true);
4453
4454 Stopwatch s;
4455 std::vector<std::thread> threads(config.concurrency);
4456 for (std::thread& thread : threads) {
4457 thread = std::thread([&]() {
4458 int fd = resNetworkQuery(TEST_NETID, hostname, ns_c_in, ns_t_a, cacheFlag);
4459 dnsMode == "STRICT" ? expectAnswersNotValid(fd, -ETIMEDOUT)
4460 : expectAnswersValid(fd, AF_INET, "1.2.3.4");
4461 });
4462 }
4463 for (std::thread& thread : threads) {
4464 thread.join();
4465 }
4466
4467 const int timeTakenMs = s.timeTakenUs() / 1000;
4468 // A loose upper bound is set by adding 1000ms buffer time. Theoretically, it should
4469 // just take a bit more than expetTimeout milliseconds for the result.
4470 EXPECT_GE(timeTakenMs, config.expectedTimeout);
4471 EXPECT_LE(timeTakenMs, config.expectedTimeout + 1000);
4472
4473 // Recover the server from being unresponsive and try again.
4474 tls.setHangOnHandshakeForTesting(false);
4475 int fd = resNetworkQuery(TEST_NETID, hostname, ns_c_in, ns_t_a, cacheFlag);
4476 expectAnswersValid(fd, AF_INET, "1.2.3.4");
4477 }
4478 }
Mike Yua772c202019-09-23 17:47:21 +08004479}
Hungming Chenbb90ab32019-10-28 18:20:31 +08004480
Ken Chen766feae2019-10-30 15:13:44 +08004481TEST_F(ResolverTest, FlushNetworkCache) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004482 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004483 test::DNSResponder dns;
4484 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4485 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4486
4487 const hostent* result = gethostbyname("hello");
4488 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4489
4490 // get result from cache
4491 result = gethostbyname("hello");
4492 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4493
4494 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4495
4496 result = gethostbyname("hello");
4497 EXPECT_EQ(2U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4498}
4499
4500TEST_F(ResolverTest, FlushNetworkCache_random) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004501 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004502 constexpr int num_flush = 10;
4503 constexpr int num_queries = 20;
4504 test::DNSResponder dns;
4505 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4506 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4507 const addrinfo hints = {.ai_family = AF_INET};
4508
4509 std::thread t([this]() {
4510 for (int i = 0; i < num_flush; ++i) {
4511 unsigned delay = arc4random_uniform(10 * 1000); // 10ms
4512 usleep(delay);
4513 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4514 }
4515 });
4516
4517 for (int i = 0; i < num_queries; ++i) {
4518 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4519 EXPECT_TRUE(result != nullptr);
4520 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4521 }
4522 t.join();
4523}
4524
4525// flush cache while one query is wait-for-response, another is pending.
4526TEST_F(ResolverTest, FlushNetworkCache_concurrent) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004527 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004528 const char* listen_addr1 = "127.0.0.9";
4529 const char* listen_addr2 = "127.0.0.10";
4530 test::DNSResponder dns1(listen_addr1);
4531 test::DNSResponder dns2(listen_addr2);
4532 StartDns(dns1, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4533 StartDns(dns2, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4534 addrinfo hints = {.ai_family = AF_INET};
4535
4536 // step 1: set server#1 into deferred responding mode
4537 dns1.setDeferredResp(true);
4538 std::thread t1([&listen_addr1, &hints, this]() {
4539 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr1}));
4540 // step 3: query
4541 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4542 // step 9: check result
4543 EXPECT_TRUE(result != nullptr);
4544 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4545 });
4546
4547 // step 2: wait for the query to reach the server
4548 while (GetNumQueries(dns1, kHelloExampleCom) == 0) {
4549 usleep(1000); // 1ms
4550 }
4551
4552 std::thread t2([&listen_addr2, &hints, &dns2, this]() {
4553 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr2}));
4554 // step 5: query (should be blocked in resolver)
4555 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4556 // step 7: check result
4557 EXPECT_TRUE(result != nullptr);
4558 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4559 EXPECT_EQ(1U, GetNumQueriesForType(dns2, ns_type::ns_t_a, kHelloExampleCom));
4560 });
4561
4562 // step 4: wait a bit for the 2nd query to enter pending state
4563 usleep(100 * 1000); // 100ms
4564 // step 6: flush cache (will unblock pending queries)
4565 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4566 t2.join();
4567
4568 // step 8: resume server#1
4569 dns1.setDeferredResp(false);
4570 t1.join();
4571
4572 // step 10: verify if result is correctly cached
4573 dns2.clearQueries();
4574 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4575 EXPECT_EQ(0U, GetNumQueries(dns2, kHelloExampleCom));
4576 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4577}
4578
waynema29253052019-08-20 11:26:08 +08004579// TODO: Perhaps to have a boundary conditions test for TCP and UDP.
4580TEST_F(ResolverTest, TcpQueryWithOversizePayload) {
4581 test::DNSResponder dns;
4582 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4583 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4584
4585 int fd = dns_open_proxy();
4586 ASSERT_TRUE(fd > 0);
4587
4588 // Sending DNS query over TCP once the packet sizes exceed 512 bytes.
4589 // The raw data is combined with Question section and Additional section
4590 // Question section : query "hello.example.com", type A, class IN
4591 // Additional section : type OPT (41), Option PADDING, Option Length 546
4592 // Padding option which allows DNS clients and servers to artificially
4593 // increase the size of a DNS message by a variable number of bytes.
4594 // See also RFC7830, section 3
4595 const std::string query =
4596 "+c0BAAABAAAAAAABBWhlbGxvB2V4YW1wbGUDY29tAAABAAEAACkgAAAAgAACJgAMAiIAAAAAAAAAAAAAAAAAA"
4597 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4598 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4599 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4600 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4601 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4602 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4603 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4604 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4605 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
4606 const std::string cmd =
4607 "resnsend " + std::to_string(TEST_NETID) + " 0 " /* ResNsendFlags */ + query + '\0';
4608 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
4609 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
4610 expectAnswersValid(fd, AF_INET, kHelloExampleComAddrV4);
4611 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom));
4612 EXPECT_EQ(0U, GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom));
4613}
4614
Ken Chen99344882020-01-01 14:59:38 +08004615TEST_F(ResolverTest, TruncatedRspMode) {
4616 constexpr char listen_addr[] = "127.0.0.4";
4617 constexpr char listen_addr2[] = "127.0.0.5";
4618 constexpr char listen_srv[] = "53";
4619
4620 test::DNSResponder dns(listen_addr, listen_srv, static_cast<ns_rcode>(-1));
4621 test::DNSResponder dns2(listen_addr2, listen_srv, static_cast<ns_rcode>(-1));
4622 // dns supports UDP only, dns2 support UDP and TCP
4623 dns.setResponseProbability(0.0, IPPROTO_TCP);
4624 StartDns(dns, kLargeCnameChainRecords);
4625 StartDns(dns2, kLargeCnameChainRecords);
4626
4627 const struct TestConfig {
4628 const std::optional<int32_t> tcMode;
4629 const bool ret;
4630 const unsigned numQueries;
4631 std::string asParameters() const {
4632 return StringPrintf("tcMode: %d, ret: %s, numQueries: %u", tcMode.value_or(-1),
4633 ret ? "true" : "false", numQueries);
4634 }
4635 } testConfigs[]{
4636 // clang-format off
4637 {std::nullopt, true, 0}, /* mode unset */
4638 {aidl::android::net::IDnsResolver::TC_MODE_DEFAULT, true, 0}, /* default mode */
4639 {aidl::android::net::IDnsResolver::TC_MODE_UDP_TCP, true, 1}, /* alternative mode */
4640 {-666, false, 1}, /* invalid input */
4641 // clang-format on
4642 };
4643
4644 for (const auto& config : testConfigs) {
4645 SCOPED_TRACE(config.asParameters());
4646
4647 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4648 parcel.servers = {listen_addr, listen_addr2};
4649 if (config.tcMode) {
Ken Chena6ac2a62020-04-07 17:25:56 +08004650 parcel.resolverOptions.tcMode = config.tcMode.value();
Ken Chen99344882020-01-01 14:59:38 +08004651 }
4652 ASSERT_EQ(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk(), config.ret);
4653
4654 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4655 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4656 ASSERT_TRUE(result != nullptr);
4657 EXPECT_EQ(ToString(result), kHelloExampleComAddrV4);
4658 // TC_MODE_DEFAULT: resolver retries on TCP-only on each name server.
4659 // TC_MODE_UDP_TCP: resolver retries on TCP on the same server, falls back to UDP from next.
4660 ASSERT_EQ(GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom), 1U);
4661 ASSERT_EQ(GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom), 1U);
4662 ASSERT_EQ(GetNumQueriesForProtocol(dns2, IPPROTO_UDP, kHelloExampleCom), config.numQueries);
4663 ASSERT_EQ(GetNumQueriesForProtocol(dns2, IPPROTO_TCP, kHelloExampleCom), 1U);
4664
4665 dns.clearQueries();
4666 dns2.clearQueries();
4667 ASSERT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
Mike Yu61d17262020-02-15 18:56:22 +08004668
4669 // Clear the stats to make the resolver always choose the same server for the first query.
4670 parcel.servers.clear();
4671 parcel.tlsServers.clear();
4672 ASSERT_EQ(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk(), config.ret);
Ken Chen99344882020-01-01 14:59:38 +08004673 }
4674}
4675
Mike Yu153b5b82020-03-04 19:53:54 +08004676TEST_F(ResolverTest, RepeatedSetup_ResolverStatusRemains) {
4677 constexpr char unusable_listen_addr[] = "127.0.0.3";
4678 constexpr char listen_addr[] = "127.0.0.4";
4679 constexpr char hostname[] = "a.hello.query.";
4680 const auto repeatedSetResolversFromParcel = [&](const ResolverParamsParcel& parcel) {
4681 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4682 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4683 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4684 };
4685
4686 test::DNSResponder dns(listen_addr);
4687 StartDns(dns, {{hostname, ns_type::ns_t_a, "1.2.3.3"}});
4688 test::DnsTlsFrontend tls1(listen_addr, "853", listen_addr, "53");
4689 ASSERT_TRUE(tls1.startServer());
4690
4691 // Private DNS off mode.
4692 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4693 parcel.servers = {unusable_listen_addr, listen_addr};
4694 parcel.tlsServers.clear();
4695 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4696
4697 // Send a query.
4698 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4699 EXPECT_NE(safe_getaddrinfo(hostname, nullptr, &hints), nullptr);
4700
4701 // Check the stats as expected.
4702 const std::vector<NameserverStats> expectedCleartextDnsStats = {
4703 NameserverStats(unusable_listen_addr).setInternalErrors(1),
4704 NameserverStats(listen_addr).setSuccesses(1),
4705 };
Mike Yu61d17262020-02-15 18:56:22 +08004706 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu153b5b82020-03-04 19:53:54 +08004707 EXPECT_EQ(GetNumQueries(dns, hostname), 1U);
4708
4709 // The stats is supposed to remain as long as the list of cleartext DNS servers is unchanged.
4710 static const struct TestConfig {
4711 std::vector<std::string> servers;
4712 std::vector<std::string> tlsServers;
4713 std::string tlsName;
4714 } testConfigs[] = {
4715 // Private DNS opportunistic mode.
4716 {{listen_addr, unusable_listen_addr}, {listen_addr, unusable_listen_addr}, ""},
4717 {{unusable_listen_addr, listen_addr}, {unusable_listen_addr, listen_addr}, ""},
4718
4719 // Private DNS strict mode.
4720 {{listen_addr, unusable_listen_addr}, {"127.0.0.100"}, kDefaultPrivateDnsHostName},
4721 {{unusable_listen_addr, listen_addr}, {"127.0.0.100"}, kDefaultPrivateDnsHostName},
4722
4723 // Private DNS off mode.
4724 {{unusable_listen_addr, listen_addr}, {}, ""},
4725 {{listen_addr, unusable_listen_addr}, {}, ""},
4726 };
4727
4728 for (const auto& config : testConfigs) {
4729 SCOPED_TRACE(fmt::format("testConfig: [{}] [{}] [{}]", fmt::join(config.servers, ","),
4730 fmt::join(config.tlsServers, ","), config.tlsName));
4731 parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4732 parcel.servers = config.servers;
4733 parcel.tlsServers = config.tlsServers;
4734 parcel.tlsName = config.tlsName;
4735 repeatedSetResolversFromParcel(parcel);
Mike Yu61d17262020-02-15 18:56:22 +08004736 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu153b5b82020-03-04 19:53:54 +08004737
4738 // The stats remains when the list of search domains changes.
4739 parcel.domains.push_back("tmp.domains");
4740 repeatedSetResolversFromParcel(parcel);
Mike Yu61d17262020-02-15 18:56:22 +08004741 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu153b5b82020-03-04 19:53:54 +08004742
4743 // The stats remains when the parameters change (except maxSamples).
4744 parcel.sampleValiditySeconds++;
4745 parcel.successThreshold++;
4746 parcel.minSamples++;
4747 parcel.baseTimeoutMsec++;
4748 parcel.retryCount++;
4749 repeatedSetResolversFromParcel(parcel);
Mike Yu61d17262020-02-15 18:56:22 +08004750 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu153b5b82020-03-04 19:53:54 +08004751 }
4752
4753 // The cache remains.
4754 EXPECT_NE(safe_getaddrinfo(hostname, nullptr, &hints), nullptr);
4755 EXPECT_EQ(GetNumQueries(dns, hostname), 1U);
4756}
4757
4758TEST_F(ResolverTest, RepeatedSetup_NoRedundantPrivateDnsValidation) {
4759 const std::string addr1 = getUniqueIPv4Address(); // For a workable DNS server.
4760 const std::string addr2 = getUniqueIPv4Address(); // For an unresponsive DNS server.
4761 const std::string unusable_addr = getUniqueIPv4Address();
Mike Yubc4b9502020-03-20 13:14:00 +08004762 const auto waitForPrivateDnsStateUpdated = []() {
4763 // A buffer time for the PrivateDnsConfiguration instance to update its map,
4764 // mPrivateDnsValidateThreads, which is used for tracking validation threads.
4765 // Since there is a time gap between when PrivateDnsConfiguration reports
4766 // onPrivateDnsValidationEvent and when PrivateDnsConfiguration updates the map, this is a
4767 // workaround to avoid the test starts a subsequent resolver setup during the time gap.
4768 // TODO: Report onPrivateDnsValidationEvent after all the relevant updates are complete.
4769 // Reference to b/152009023.
4770 std::this_thread::sleep_for(20ms);
4771 };
Mike Yu153b5b82020-03-04 19:53:54 +08004772
4773 test::DNSResponder dns1(addr1);
4774 test::DNSResponder dns2(addr2);
4775 StartDns(dns1, {});
4776 StartDns(dns2, {});
4777 test::DnsTlsFrontend workableTls(addr1, "853", addr1, "53");
4778 test::DnsTlsFrontend unresponsiveTls(addr2, "853", addr2, "53");
Mike Yuf7717f52020-11-24 17:31:12 +08004779 int validationAttemptsToUnresponsiveTls = 1;
Mike Yu153b5b82020-03-04 19:53:54 +08004780 unresponsiveTls.setHangOnHandshakeForTesting(true);
4781 ASSERT_TRUE(workableTls.startServer());
4782 ASSERT_TRUE(unresponsiveTls.startServer());
4783
4784 // First setup.
4785 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4786 parcel.servers = {addr1, addr2, unusable_addr};
4787 parcel.tlsServers = {addr1, addr2, unusable_addr};
4788 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4789
4790 // Check the validation results.
4791 EXPECT_TRUE(WaitForPrivateDnsValidation(workableTls.listen_address(), true));
4792 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
Mike Yuf7717f52020-11-24 17:31:12 +08004793
4794 // The validation is still in progress.
4795 EXPECT_EQ(unresponsiveTls.acceptConnectionsCount(), validationAttemptsToUnresponsiveTls);
Mike Yu153b5b82020-03-04 19:53:54 +08004796
4797 static const struct TestConfig {
4798 std::vector<std::string> tlsServers;
4799 std::string tlsName;
4800 } testConfigs[] = {
4801 {{addr1, addr2, unusable_addr}, ""},
4802 {{unusable_addr, addr1, addr2}, ""},
4803 {{unusable_addr, addr1, addr2}, kDefaultPrivateDnsHostName},
4804 {{addr1, addr2, unusable_addr}, kDefaultPrivateDnsHostName},
4805 };
4806
4807 std::string TlsNameLastTime;
4808 for (const auto& config : testConfigs) {
4809 SCOPED_TRACE(fmt::format("testConfig: [{}] [{}]", fmt::join(config.tlsServers, ","),
4810 config.tlsName));
4811 parcel.servers = config.tlsServers;
4812 parcel.tlsServers = config.tlsServers;
4813 parcel.tlsName = config.tlsName;
4814 parcel.caCertificate = config.tlsName.empty() ? "" : kCaCert;
4815
4816 const bool dnsModeChanged = (TlsNameLastTime != config.tlsName);
Mike Yubc4b9502020-03-20 13:14:00 +08004817
4818 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004819 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4820
4821 for (const auto& serverAddr : parcel.tlsServers) {
4822 SCOPED_TRACE(serverAddr);
4823 if (serverAddr == workableTls.listen_address()) {
4824 if (dnsModeChanged) {
Mike Yuf7717f52020-11-24 17:31:12 +08004825 // Despite the identical IP address, the server is regarded as a different
Mike Yu153b5b82020-03-04 19:53:54 +08004826 // server when DnsTlsServer.name is different. The resolver treats it as a
4827 // different object and begins the validation process.
4828 EXPECT_TRUE(WaitForPrivateDnsValidation(serverAddr, true));
4829 }
4830 } else if (serverAddr == unresponsiveTls.listen_address()) {
Mike Yuf7717f52020-11-24 17:31:12 +08004831 if (dnsModeChanged) {
4832 // Despite the identical IP address, the server is regarded as a different
4833 // server when DnsTlsServer.name is different. The resolver treats it as a
4834 // different object and begins the validation process.
4835 validationAttemptsToUnresponsiveTls++;
4836
4837 // This is the limitation from DnsTlsFrontend. DnsTlsFrontend can't operate
4838 // concurrently. As soon as there's another connection request,
4839 // DnsTlsFrontend resets the unique_fd to the new connection.
4840 EXPECT_TRUE(WaitForPrivateDnsValidation(serverAddr, false));
4841 }
Mike Yu153b5b82020-03-04 19:53:54 +08004842 } else {
4843 // Must be unusable_addr.
4844 // In opportunistic mode, when a validation for a private DNS server fails, the
4845 // resolver just marks the server as failed and doesn't re-evaluate it, but the
4846 // server can be re-evaluated when setResolverConfiguration() is called.
4847 // However, in strict mode, the resolver automatically re-evaluates the server and
4848 // marks the server as in_progress until the validation succeeds, so repeated setup
4849 // makes no effect.
4850 if (dnsModeChanged || config.tlsName.empty() /* not in strict mode */) {
4851 EXPECT_TRUE(WaitForPrivateDnsValidation(serverAddr, false));
4852 }
4853 }
4854 }
4855
4856 // Repeated setups make no effect in strict mode.
Mike Yubc4b9502020-03-20 13:14:00 +08004857 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004858 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4859 if (config.tlsName.empty()) {
4860 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4861 }
Mike Yubc4b9502020-03-20 13:14:00 +08004862 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004863 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4864 if (config.tlsName.empty()) {
4865 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4866 }
4867
Mike Yuf7717f52020-11-24 17:31:12 +08004868 EXPECT_EQ(unresponsiveTls.acceptConnectionsCount(), validationAttemptsToUnresponsiveTls);
Mike Yu153b5b82020-03-04 19:53:54 +08004869
4870 TlsNameLastTime = config.tlsName;
4871 }
4872
4873 // Check that all the validation results are caught.
4874 // Note: it doesn't mean no validation being in progress.
4875 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr1));
4876 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr2));
4877 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(unusable_addr));
4878}
4879
4880TEST_F(ResolverTest, RepeatedSetup_KeepChangingPrivateDnsServers) {
4881 enum TlsServerState { WORKING, UNSUPPORTED, UNRESPONSIVE };
4882 const std::string addr1 = getUniqueIPv4Address();
4883 const std::string addr2 = getUniqueIPv4Address();
Mike Yu9a185882020-03-25 16:02:36 +08004884 const auto waitForPrivateDnsStateUpdated = []() {
4885 // A buffer time for PrivateDnsConfiguration to update its state. It prevents this test
4886 // being flaky. See b/152009023 for the reason.
4887 std::this_thread::sleep_for(20ms);
4888 };
Mike Yu153b5b82020-03-04 19:53:54 +08004889
4890 test::DNSResponder dns1(addr1);
4891 test::DNSResponder dns2(addr2);
4892 StartDns(dns1, {});
4893 StartDns(dns2, {});
4894 test::DnsTlsFrontend tls1(addr1, "853", addr1, "53");
4895 test::DnsTlsFrontend tls2(addr2, "853", addr2, "53");
4896 ASSERT_TRUE(tls1.startServer());
4897 ASSERT_TRUE(tls2.startServer());
4898
4899 static const struct TestConfig {
4900 std::string tlsServer;
4901 std::string tlsName;
4902 bool expectNothingHappenWhenServerUnsupported;
4903 bool expectNothingHappenWhenServerUnresponsive;
4904 std::string asTestName() const {
4905 return fmt::format("{}, {}, {}, {}", tlsServer, tlsName,
4906 expectNothingHappenWhenServerUnsupported,
4907 expectNothingHappenWhenServerUnresponsive);
4908 }
4909 } testConfigs[] = {
4910 {{addr1}, "", false, false},
4911 {{addr2}, "", false, false},
4912 {{addr1}, "", false, true},
4913 {{addr2}, "", false, true},
Mike Yuf7717f52020-11-24 17:31:12 +08004914
4915 // expectNothingHappenWhenServerUnresponsive is false in the two cases because of the
4916 // limitation from DnsTlsFrontend which can't operate concurrently.
4917 {{addr1}, kDefaultPrivateDnsHostName, false, false},
4918 {{addr2}, kDefaultPrivateDnsHostName, false, false},
Mike Yu153b5b82020-03-04 19:53:54 +08004919 {{addr1}, kDefaultPrivateDnsHostName, true, true},
4920 {{addr2}, kDefaultPrivateDnsHostName, true, true},
4921
Mike Yuf7717f52020-11-24 17:31:12 +08004922 // expectNothingHappenWhenServerUnresponsive is true in the two cases because of the
4923 // limitation from DnsTlsFrontend which can't operate concurrently.
4924 {{addr1}, "", true, false},
4925 {{addr2}, "", true, false},
Mike Yu153b5b82020-03-04 19:53:54 +08004926 {{addr1}, "", true, true},
4927 {{addr2}, "", true, true},
4928 };
4929
4930 for (const auto& serverState : {WORKING, UNSUPPORTED, UNRESPONSIVE}) {
4931 int testIndex = 0;
4932 for (const auto& config : testConfigs) {
4933 SCOPED_TRACE(fmt::format("serverState:{} testIndex:{} testConfig:[{}]", serverState,
4934 testIndex++, config.asTestName()));
4935 auto& tls = (config.tlsServer == addr1) ? tls1 : tls2;
4936
4937 if (serverState == UNSUPPORTED && tls.running()) ASSERT_TRUE(tls.stopServer());
4938 if (serverState != UNSUPPORTED && !tls.running()) ASSERT_TRUE(tls.startServer());
4939
4940 tls.setHangOnHandshakeForTesting(serverState == UNRESPONSIVE);
4941 const int connectCountsBefore = tls.acceptConnectionsCount();
4942
Mike Yu9a185882020-03-25 16:02:36 +08004943 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004944 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4945 parcel.servers = {config.tlsServer};
4946 parcel.tlsServers = {config.tlsServer};
4947 parcel.tlsName = config.tlsName;
4948 parcel.caCertificate = config.tlsName.empty() ? "" : kCaCert;
4949 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4950
4951 if (serverState == WORKING) {
4952 EXPECT_TRUE(WaitForPrivateDnsValidation(config.tlsServer, true));
4953 } else if (serverState == UNSUPPORTED) {
4954 if (config.expectNothingHappenWhenServerUnsupported) {
4955 // It's possible that the resolver hasn't yet started to
4956 // connect. Wait a while.
4957 // TODO: See if we can get rid of the hard waiting time, such as comparing
4958 // the CountDiff across two tests.
4959 std::this_thread::sleep_for(100ms);
4960 EXPECT_EQ(tls.acceptConnectionsCount(), connectCountsBefore);
4961 } else {
4962 EXPECT_TRUE(WaitForPrivateDnsValidation(config.tlsServer, false));
4963 }
4964 } else {
4965 // Must be UNRESPONSIVE.
4966 // DnsTlsFrontend is the only signal for checking whether or not the resolver starts
4967 // another validation when the server is unresponsive.
4968 const int expectCountDiff =
4969 config.expectNothingHappenWhenServerUnresponsive ? 0 : 1;
4970 if (expectCountDiff == 0) {
4971 // It's possible that the resolver hasn't yet started to
4972 // connect. Wait a while.
4973 std::this_thread::sleep_for(100ms);
Mike Yuf7717f52020-11-24 17:31:12 +08004974 } else {
4975 EXPECT_TRUE(WaitForPrivateDnsValidation(config.tlsServer, false));
Mike Yu153b5b82020-03-04 19:53:54 +08004976 }
4977 const auto condition = [&]() {
4978 return tls.acceptConnectionsCount() == connectCountsBefore + expectCountDiff;
4979 };
4980 EXPECT_TRUE(PollForCondition(condition));
4981 }
4982 }
4983
4984 // Set to off mode to reset the PrivateDnsConfiguration state.
4985 ResolverParamsParcel setupOffmode = DnsResponderClient::GetDefaultResolverParamsParcel();
4986 setupOffmode.tlsServers.clear();
4987 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(setupOffmode));
4988 }
4989
4990 // Check that all the validation results are caught.
4991 // Note: it doesn't mean no validation being in progress.
4992 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr1));
4993 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr2));
4994}
4995
Ken Chen26dc2b02020-06-16 18:49:39 +08004996TEST_F(ResolverTest, PermissionCheckOnCertificateInjection) {
4997 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4998 parcel.caCertificate = kCaCert;
4999 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk());
5000
5001 for (const uid_t uid : {AID_SYSTEM, TEST_UID}) {
5002 ScopedChangeUID scopedChangeUID(uid);
5003 auto status = mDnsClient.resolvService()->setResolverConfiguration(parcel);
5004 EXPECT_EQ(status.getExceptionCode(), EX_SECURITY);
5005 }
5006}
5007
Hungming Chenbb90ab32019-10-28 18:20:31 +08005008// Parameterized tests.
5009// TODO: Merge the existing tests as parameterized test if possible.
5010// TODO: Perhaps move parameterized tests to an independent file.
5011enum class CallType { GETADDRINFO, GETHOSTBYNAME };
5012class ResolverParameterizedTest : public ResolverTest,
Hungming Chen63779052019-10-30 15:06:13 +08005013 public testing::WithParamInterface<CallType> {
5014 protected:
Hungming Chen22617fd2019-12-06 12:15:45 +08005015 void VerifyQueryHelloExampleComV4(const test::DNSResponder& dns, const CallType calltype,
5016 const bool verifyNumQueries = true) {
Hungming Chen63779052019-10-30 15:06:13 +08005017 if (calltype == CallType::GETADDRINFO) {
5018 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
5019 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
5020 ASSERT_TRUE(result != nullptr);
5021 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
5022 } else if (calltype == CallType::GETHOSTBYNAME) {
5023 const hostent* result = gethostbyname("hello");
5024 ASSERT_TRUE(result != nullptr);
5025 ASSERT_EQ(4, result->h_length);
5026 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
5027 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
5028 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
5029 } else {
5030 FAIL() << "Unsupported call type: " << static_cast<uint32_t>(calltype);
5031 }
Hungming Chen22617fd2019-12-06 12:15:45 +08005032 if (verifyNumQueries) EXPECT_EQ(1U, GetNumQueries(dns, kHelloExampleCom));
Hungming Chen63779052019-10-30 15:06:13 +08005033 }
5034};
Hungming Chenbb90ab32019-10-28 18:20:31 +08005035
Hungming Chen63779052019-10-30 15:06:13 +08005036INSTANTIATE_TEST_SUITE_P(QueryCallTest, ResolverParameterizedTest,
Hungming Chenbb90ab32019-10-28 18:20:31 +08005037 testing::Values(CallType::GETADDRINFO, CallType::GETHOSTBYNAME),
5038 [](const testing::TestParamInfo<CallType>& info) {
Hungming Chenbb90ab32019-10-28 18:20:31 +08005039 switch (info.param) {
5040 case CallType::GETADDRINFO:
Hungming Chen63779052019-10-30 15:06:13 +08005041 return "GetAddrInfo";
Hungming Chenbb90ab32019-10-28 18:20:31 +08005042 case CallType::GETHOSTBYNAME:
Hungming Chen63779052019-10-30 15:06:13 +08005043 return "GetHostByName";
Hungming Chenbb90ab32019-10-28 18:20:31 +08005044 default:
Hungming Chen63779052019-10-30 15:06:13 +08005045 return "InvalidParameter"; // Should not happen.
Hungming Chenbb90ab32019-10-28 18:20:31 +08005046 }
Hungming Chenbb90ab32019-10-28 18:20:31 +08005047 });
5048
5049TEST_P(ResolverParameterizedTest, AuthoritySectionAndAdditionalSection) {
5050 // DNS response may have more information in authority section and additional section.
5051 // Currently, getanswer() of packages/modules/DnsResolver/getaddrinfo.cpp doesn't parse the
5052 // content of authority section and additional section. Test these sections if they crash
5053 // the resolver, just in case. See also RFC 1035 section 4.1.
5054 const auto& calltype = GetParam();
5055 test::DNSHeader header(kDefaultDnsHeader);
5056
5057 // Create a DNS response which has a authoritative nameserver record in authority
5058 // section and its relevant address record in additional section.
5059 //
5060 // Question
5061 // hello.example.com. IN A
5062 // Answer
5063 // hello.example.com. IN A 1.2.3.4
5064 // Authority:
5065 // hello.example.com. IN NS ns1.example.com.
5066 // Additional:
5067 // ns1.example.com. IN A 5.6.7.8
5068 //
5069 // A response may have only question, answer, and authority section. Current testing response
5070 // should be able to cover this condition.
5071
5072 // Question section.
5073 test::DNSQuestion question{
5074 .qname = {.name = kHelloExampleCom},
5075 .qtype = ns_type::ns_t_a,
5076 .qclass = ns_c_in,
5077 };
5078 header.questions.push_back(std::move(question));
5079
5080 // Answer section.
5081 test::DNSRecord recordAnswer{
5082 .name = {.name = kHelloExampleCom},
5083 .rtype = ns_type::ns_t_a,
5084 .rclass = ns_c_in,
5085 .ttl = 0, // no cache
5086 };
Hungming Chen63779052019-10-30 15:06:13 +08005087 EXPECT_TRUE(test::DNSResponder::fillRdata(kHelloExampleComAddrV4, recordAnswer));
Hungming Chenbb90ab32019-10-28 18:20:31 +08005088 header.answers.push_back(std::move(recordAnswer));
5089
5090 // Authority section.
5091 test::DNSRecord recordAuthority{
5092 .name = {.name = kHelloExampleCom},
5093 .rtype = ns_type::ns_t_ns,
5094 .rclass = ns_c_in,
5095 .ttl = 0, // no cache
5096 };
5097 EXPECT_TRUE(test::DNSResponder::fillRdata("ns1.example.com.", recordAuthority));
5098 header.authorities.push_back(std::move(recordAuthority));
5099
5100 // Additional section.
5101 test::DNSRecord recordAdditional{
5102 .name = {.name = "ns1.example.com."},
5103 .rtype = ns_type::ns_t_a,
5104 .rclass = ns_c_in,
5105 .ttl = 0, // no cache
5106 };
5107 EXPECT_TRUE(test::DNSResponder::fillRdata("5.6.7.8", recordAdditional));
5108 header.additionals.push_back(std::move(recordAdditional));
5109
5110 // Start DNS server.
5111 test::DNSResponder dns(test::DNSResponder::MappingType::DNS_HEADER);
5112 dns.addMappingDnsHeader(kHelloExampleCom, ns_type::ns_t_a, header);
5113 ASSERT_TRUE(dns.startServer());
5114 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
5115 dns.clearQueries();
5116
5117 // Expect that get the address and the resolver doesn't crash.
Hungming Chen63779052019-10-30 15:06:13 +08005118 VerifyQueryHelloExampleComV4(dns, calltype);
5119}
5120
5121TEST_P(ResolverParameterizedTest, MessageCompression) {
5122 const auto& calltype = GetParam();
5123
5124 // The response with compressed domain name by a pointer. See RFC 1035 section 4.1.4.
5125 //
5126 // Ignoring the other fields of the message, the domain name of question section and answer
5127 // section are presented as:
5128 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5129 // 12 | 5 | h |
5130 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5131 // 14 | e | l |
5132 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5133 // 16 | l | o |
5134 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5135 // 18 | 7 | e |
5136 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5137 // 20 | x | a |
5138 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5139 // 22 | m | p |
5140 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5141 // 24 | l | e |
5142 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5143 // 26 | 3 | c |
5144 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5145 // 28 | o | m |
5146 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5147 // 30 | 0 | ... |
5148 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5149 //
5150 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5151 // 35 | 1 1| 12 |
5152 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5153 const std::vector<uint8_t> kResponseAPointer = {
5154 /* Header */
5155 0x00, 0x00, /* Transaction ID: 0x0000 */
5156 0x81, 0x80, /* Flags: qr rd ra */
5157 0x00, 0x01, /* Questions: 1 */
5158 0x00, 0x01, /* Answer RRs: 1 */
5159 0x00, 0x00, /* Authority RRs: 0 */
5160 0x00, 0x00, /* Additional RRs: 0 */
5161 /* Queries */
5162 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
5163 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name: hello.example.com */
5164 0x00, 0x01, /* Type: A */
5165 0x00, 0x01, /* Class: IN */
5166 /* Answers */
5167 0xc0, 0x0c, /* Name: hello.example.com (a pointer) */
5168 0x00, 0x01, /* Type: A */
5169 0x00, 0x01, /* Class: IN */
5170 0x00, 0x00, 0x00, 0x00, /* Time to live: 0 */
5171 0x00, 0x04, /* Data length: 4 */
5172 0x01, 0x02, 0x03, 0x04 /* Address: 1.2.3.4 */
5173 };
5174
5175 // The response with compressed domain name by a sequence of labels ending with a pointer. See
5176 // RFC 1035 section 4.1.4.
5177 //
5178 // Ignoring the other fields of the message, the domain name of question section and answer
5179 // section are presented as:
5180 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5181 // 12 | 5 | h |
5182 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5183 // 14 | e | l |
5184 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5185 // 16 | l | o |
5186 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5187 // 18 | 7 | e |
5188 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5189 // 20 | x | a |
5190 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5191 // 22 | m | p |
5192 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5193 // 24 | l | e |
5194 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5195 // 26 | 3 | c |
5196 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5197 // 28 | o | m |
5198 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5199 // 30 | 0 | ... |
5200 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5201 //
5202 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5203 // 35 | 5 | h |
5204 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5205 // 37 | e | l |
5206 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5207 // 39 | l | o |
5208 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5209 // 41 | 1 1| 18 |
5210 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5211 const std::vector<uint8_t> kResponseLabelEndingWithAPointer = {
5212 /* Header */
5213 0x00, 0x00, /* Transaction ID: 0x0000 */
5214 0x81, 0x80, /* Flags: qr rd ra */
5215 0x00, 0x01, /* Questions: 1 */
5216 0x00, 0x01, /* Answer RRs: 1 */
5217 0x00, 0x00, /* Authority RRs: 0 */
5218 0x00, 0x00, /* Additional RRs: 0 */
5219 /* Queries */
5220 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
5221 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name: hello.example.com */
5222 0x00, 0x01, /* Type: A */
5223 0x00, 0x01, /* Class: IN */
5224 /* Answers */
5225 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0xc0,
5226 0x12, /* Name: hello.example.com (a label ending with a pointer) */
5227 0x00, 0x01, /* Type: A */
5228 0x00, 0x01, /* Class: IN */
5229 0x00, 0x00, 0x00, 0x00, /* Time to live: 0 */
5230 0x00, 0x04, /* Data length: 4 */
5231 0x01, 0x02, 0x03, 0x04 /* Address: 1.2.3.4 */
5232 };
5233
5234 for (const auto& response : {kResponseAPointer, kResponseLabelEndingWithAPointer}) {
5235 SCOPED_TRACE(StringPrintf("Hex dump: %s", toHex(makeSlice(response)).c_str()));
5236
5237 test::DNSResponder dns(test::DNSResponder::MappingType::BINARY_PACKET);
5238 dns.addMappingBinaryPacket(kHelloExampleComQueryV4, response);
5239 StartDns(dns, {});
5240 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
5241
5242 // Expect no cache because the TTL of testing responses are 0.
5243 VerifyQueryHelloExampleComV4(dns, calltype);
Hungming Chenbb90ab32019-10-28 18:20:31 +08005244 }
Mike Yu40e67072019-10-09 21:14:09 +08005245}
Hungming Chen22617fd2019-12-06 12:15:45 +08005246
5247TEST_P(ResolverParameterizedTest, TruncatedResponse) {
5248 const auto& calltype = GetParam();
5249
Hungming Chen22617fd2019-12-06 12:15:45 +08005250 test::DNSResponder dns;
Ken Chen99344882020-01-01 14:59:38 +08005251 StartDns(dns, kLargeCnameChainRecords);
Hungming Chen22617fd2019-12-06 12:15:45 +08005252 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
5253
5254 // Expect UDP response is truncated. The resolver retries over TCP. See RFC 1035 section 4.2.1.
5255 VerifyQueryHelloExampleComV4(dns, calltype, false);
5256 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom));
5257 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom));
5258}
Luke Huang420ee622019-11-27 17:52:44 +08005259
5260TEST_F(ResolverTest, KeepListeningUDP) {
5261 constexpr char listen_addr1[] = "127.0.0.4";
5262 constexpr char listen_addr2[] = "127.0.0.5";
5263 constexpr char host_name[] = "howdy.example.com.";
5264 const std::vector<DnsRecord> records = {
5265 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
5266 };
5267 const std::vector<int> params = {300, 25, 8, 8, 1000 /* BASE_TIMEOUT_MSEC */,
5268 1 /* retry count */};
5269 const int delayTimeMs = 1500;
5270
5271 test::DNSResponder neverRespondDns(listen_addr2, "53", static_cast<ns_rcode>(-1));
5272 neverRespondDns.setResponseProbability(0.0);
5273 StartDns(neverRespondDns, records);
Luke Huangf40df9c2020-04-21 08:51:48 +08005274 ScopedSystemProperties scopedSystemProperties(
5275 "persist.device_config.netd_native.keep_listening_udp", "1");
5276 // Re-setup test network to make experiment flag take effect.
5277 resetNetwork();
Luke Huang420ee622019-11-27 17:52:44 +08005278
5279 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr1, listen_addr2},
5280 kDefaultSearchDomains, params));
5281 // There are 2 DNS servers for this test.
5282 // |delayedDns| will be blocked for |delayTimeMs|, then start to respond to requests.
5283 // |neverRespondDns| will never respond.
5284 // In the first try, resolver will send query to |delayedDns| but get timeout error
5285 // because |delayTimeMs| > DNS timeout.
5286 // Then it's the second try, resolver will send query to |neverRespondDns| and
5287 // listen on both servers. Resolver will receive the answer coming from |delayedDns|.
Luke Huang420ee622019-11-27 17:52:44 +08005288
Luke Huang420ee622019-11-27 17:52:44 +08005289 test::DNSResponder delayedDns(listen_addr1);
5290 delayedDns.setResponseDelayMs(delayTimeMs);
5291 StartDns(delayedDns, records);
5292
5293 // Specify hints to ensure resolver doing query only 1 round.
5294 const addrinfo hints = {.ai_family = AF_INET6, .ai_socktype = SOCK_DGRAM};
5295 ScopedAddrinfo result = safe_getaddrinfo(host_name, nullptr, &hints);
5296 EXPECT_TRUE(result != nullptr);
5297
5298 std::string result_str = ToString(result);
5299 EXPECT_TRUE(result_str == "::1.2.3.4") << ", result_str='" << result_str << "'";
5300}
Luke Huang0a0870d2020-02-12 20:41:10 +08005301
5302TEST_F(ResolverTest, GetAddrInfoParallelLookupTimeout) {
5303 constexpr char listen_addr[] = "127.0.0.4";
5304 constexpr char host_name[] = "howdy.example.com.";
5305 constexpr int TIMING_TOLERANCE_MS = 200;
5306 constexpr int DNS_TIMEOUT_MS = 1000;
5307 const std::vector<DnsRecord> records = {
5308 {host_name, ns_type::ns_t_a, "1.2.3.4"},
5309 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
5310 };
5311 const std::vector<int> params = {300, 25, 8, 8, DNS_TIMEOUT_MS /* BASE_TIMEOUT_MSEC */,
5312 1 /* retry count */};
5313 test::DNSResponder neverRespondDns(listen_addr, "53", static_cast<ns_rcode>(-1));
5314 neverRespondDns.setResponseProbability(0.0);
5315 StartDns(neverRespondDns, records);
Luke Huangf40df9c2020-04-21 08:51:48 +08005316 ScopedSystemProperties scopedSystemProperties(
Luke Huang0a272a22020-12-04 16:24:49 +08005317 "persist.device_config.netd_native.parallel_lookup_release", "1");
Luke Huangd1d734f2020-04-30 12:25:40 +08005318 // The default value of parallel_lookup_sleep_time should be very small
5319 // that we can ignore in this test case.
Luke Huangf40df9c2020-04-21 08:51:48 +08005320 // Re-setup test network to make experiment flag take effect.
5321 resetNetwork();
Luke Huang0a0870d2020-02-12 20:41:10 +08005322
5323 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}, kDefaultSearchDomains, params));
5324 neverRespondDns.clearQueries();
5325
Luke Huang0a0870d2020-02-12 20:41:10 +08005326 // Use a never respond DNS server to verify if the A/AAAA queries are sent in parallel.
5327 // The resolver parameters are set to timeout 1s and retry 1 times.
5328 // So we expect the safe_getaddrinfo_time_taken() might take ~1s to
5329 // return when parallel lookup is enabled. And the DNS server should receive 2 queries.
5330 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_DGRAM};
5331 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(host_name, nullptr, hints);
5332
5333 EXPECT_TRUE(result == nullptr);
5334 EXPECT_NEAR(DNS_TIMEOUT_MS, timeTakenMs, TIMING_TOLERANCE_MS)
5335 << "took time should approximate equal timeout";
5336 EXPECT_EQ(2U, GetNumQueries(neverRespondDns, host_name));
Mike Yu532405f2020-06-17 17:46:44 +08005337 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, RCODE_TIMEOUT, host_name, {});
Luke Huang0a0870d2020-02-12 20:41:10 +08005338}
Luke Huangd1d734f2020-04-30 12:25:40 +08005339
5340TEST_F(ResolverTest, GetAddrInfoParallelLookupSleepTime) {
5341 constexpr char listen_addr[] = "127.0.0.4";
5342 constexpr int TIMING_TOLERANCE_MS = 200;
5343 const std::vector<DnsRecord> records = {
5344 {kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4},
5345 {kHelloExampleCom, ns_type::ns_t_aaaa, kHelloExampleComAddrV6},
5346 };
5347 const std::vector<int> params = {300, 25, 8, 8, 1000 /* BASE_TIMEOUT_MSEC */,
5348 1 /* retry count */};
5349 test::DNSResponder dns(listen_addr);
5350 StartDns(dns, records);
5351 ScopedSystemProperties scopedSystemProperties1(
Luke Huang0a272a22020-12-04 16:24:49 +08005352 "persist.device_config.netd_native.parallel_lookup_release", "1");
Luke Huangd1d734f2020-04-30 12:25:40 +08005353 constexpr int PARALLEL_LOOKUP_SLEEP_TIME_MS = 500;
5354 ScopedSystemProperties scopedSystemProperties2(
5355 "persist.device_config.netd_native.parallel_lookup_sleep_time",
5356 std::to_string(PARALLEL_LOOKUP_SLEEP_TIME_MS));
5357 // Re-setup test network to make experiment flag take effect.
5358 resetNetwork();
5359
5360 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}, kDefaultSearchDomains, params));
5361 dns.clearQueries();
5362
5363 // Expect the safe_getaddrinfo_time_taken() might take ~500ms to return because we set
5364 // parallel_lookup_sleep_time to 500ms.
5365 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_DGRAM};
5366 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(kHelloExampleCom, nullptr, hints);
5367
5368 EXPECT_NE(nullptr, result);
5369 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(
5370 {kHelloExampleComAddrV4, kHelloExampleComAddrV6}));
5371 EXPECT_NEAR(PARALLEL_LOOKUP_SLEEP_TIME_MS, timeTakenMs, TIMING_TOLERANCE_MS)
5372 << "took time should approximate equal timeout";
5373 EXPECT_EQ(2U, GetNumQueries(dns, kHelloExampleCom));
5374
5375 // Expect the PARALLEL_LOOKUP_SLEEP_TIME_MS won't affect the query under cache hit case.
5376 dns.clearQueries();
5377 std::tie(result, timeTakenMs) = safe_getaddrinfo_time_taken(kHelloExampleCom, nullptr, hints);
5378 EXPECT_NE(nullptr, result);
5379 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(
5380 {kHelloExampleComAddrV4, kHelloExampleComAddrV6}));
5381 EXPECT_GT(PARALLEL_LOOKUP_SLEEP_TIME_MS, timeTakenMs);
5382 EXPECT_EQ(0U, GetNumQueries(dns, kHelloExampleCom));
5383}
Luke Huangeb618ef2020-05-26 14:17:02 +08005384
5385TEST_F(ResolverTest, BlockDnsQueryUidDoesNotLeadToBadServer) {
Luke Huangeb618ef2020-05-26 14:17:02 +08005386 constexpr char listen_addr1[] = "127.0.0.4";
5387 constexpr char listen_addr2[] = "::1";
5388 test::DNSResponder dns1(listen_addr1);
5389 test::DNSResponder dns2(listen_addr2);
5390 StartDns(dns1, {});
5391 StartDns(dns2, {});
5392
5393 std::vector<std::string> servers = {listen_addr1, listen_addr2};
5394 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
5395 dns1.clearQueries();
5396 dns2.clearQueries();
5397 {
5398 ScopeBlockedUIDRule scopeBlockUidRule(mDnsClient.netdService(), TEST_UID);
5399 // Start querying ten times.
5400 for (int i = 0; i < 10; i++) {
5401 std::string hostName = fmt::format("blocked{}.com", i);
5402 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
Luke Huang5729afc2020-07-30 23:12:17 +08005403 // The query result between R+ and Q would be different, but we don't really care
5404 // about the result here because this test is only used to ensure blocked uid rule
5405 // won't cause bad servers.
5406 safe_getaddrinfo(hostName.c_str(), nullptr, &hints);
Luke Huangeb618ef2020-05-26 14:17:02 +08005407 }
5408 }
Luke Huang5729afc2020-07-30 23:12:17 +08005409 ResolverParamsParcel setupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
5410 // If api level >= 30 (R+), expect all query packets to be blocked, hence we should not see any
5411 // of their stats show up. Otherwise, all queries should succeed.
5412 const std::vector<NameserverStats> expectedDnsStats = {
5413 NameserverStats(listen_addr1).setSuccesses(isAtLeastR ? 0 : setupParams.maxSamples),
Luke Huangeb618ef2020-05-26 14:17:02 +08005414 NameserverStats(listen_addr2),
5415 };
Luke Huang5729afc2020-07-30 23:12:17 +08005416 expectStatsEqualTo(expectedDnsStats);
5417 // If api level >= 30 (R+), expect server won't receive any queries,
5418 // otherwise expect 20 == 10 * (setupParams.domains.size() + 1) queries.
5419 EXPECT_EQ(dns1.queries().size(), isAtLeastR ? 0U : 10 * (setupParams.domains.size() + 1));
Luke Huangeb618ef2020-05-26 14:17:02 +08005420 EXPECT_EQ(dns2.queries().size(), 0U);
5421}
Mike Yu6ce587d2019-12-19 21:30:22 +08005422
Mike Yu10832aa2020-08-25 19:13:11 +08005423TEST_F(ResolverTest, DnsServerSelection) {
5424 test::DNSResponder dns1("127.0.0.3");
5425 test::DNSResponder dns2("127.0.0.4");
5426 test::DNSResponder dns3("127.0.0.5");
5427
5428 dns1.setResponseDelayMs(10);
5429 dns2.setResponseDelayMs(25);
5430 dns3.setResponseDelayMs(50);
5431 StartDns(dns1, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
5432 StartDns(dns2, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
5433 StartDns(dns3, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
5434
5435 ScopedSystemProperties scopedSystemProperties(kSortNameserversFlag, "1");
5436
Mike Yueb8f22c2020-09-22 11:58:13 +08005437 // NOTE: the servers must be sorted alphabetically.
5438 std::vector<std::string> serverList = {
5439 dns1.listen_address(),
5440 dns2.listen_address(),
5441 dns3.listen_address(),
Mike Yu10832aa2020-08-25 19:13:11 +08005442 };
Mike Yueb8f22c2020-09-22 11:58:13 +08005443
5444 do {
Mike Yu10832aa2020-08-25 19:13:11 +08005445 SCOPED_TRACE(fmt::format("testConfig: [{}]", fmt::join(serverList, ", ")));
5446 const int queryNum = 50;
5447 int64_t accumulatedTime = 0;
5448
5449 // Restart the testing network to 1) make the flag take effect and 2) reset the statistics.
5450 resetNetwork();
5451
5452 // DnsServerSelection doesn't apply to private DNS.
5453 ResolverParamsParcel setupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
5454 setupParams.servers = serverList;
5455 setupParams.tlsServers.clear();
5456 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(setupParams));
5457
5458 // DNSResponder doesn't handle queries concurrently, so don't allow more than
5459 // one in-flight query.
5460 for (int i = 0; i < queryNum; i++) {
5461 Stopwatch s;
5462 int fd = resNetworkQuery(TEST_NETID, kHelloExampleCom, ns_c_in, ns_t_a,
5463 ANDROID_RESOLV_NO_CACHE_LOOKUP);
5464 expectAnswersValid(fd, AF_INET, kHelloExampleComAddrV4);
5465 accumulatedTime += s.timeTakenUs();
5466 }
5467
5468 const int dns1Count = dns1.queries().size();
5469 const int dns2Count = dns2.queries().size();
5470 const int dns3Count = dns3.queries().size();
5471
5472 // All of the servers have ever been selected. In addition, the less latency server
5473 // is selected more frequently.
5474 EXPECT_GT(dns1Count, 0);
5475 EXPECT_GT(dns2Count, 0);
5476 EXPECT_GT(dns3Count, 0);
5477 EXPECT_GT(dns1Count, dns2Count);
5478 EXPECT_GT(dns2Count, dns3Count);
5479
Mike Yueb8f22c2020-09-22 11:58:13 +08005480 const int averageTime = accumulatedTime / queryNum;
5481 LOG(INFO) << "ResolverTest#DnsServerSelection: averageTime " << averageTime << "us";
Mike Yu10832aa2020-08-25 19:13:11 +08005482
Mike Yueb8f22c2020-09-22 11:58:13 +08005483 // Since the average Time might differ depending on parameters, set [10ms, 20ms] as
Mike Yu10832aa2020-08-25 19:13:11 +08005484 // acceptable range.
Mike Yueb8f22c2020-09-22 11:58:13 +08005485 EXPECT_GE(averageTime, 10000);
5486 EXPECT_LE(averageTime, 20000);
Mike Yu10832aa2020-08-25 19:13:11 +08005487
5488 dns1.clearQueries();
5489 dns2.clearQueries();
5490 dns3.clearQueries();
Mike Yueb8f22c2020-09-22 11:58:13 +08005491 } while (std::next_permutation(serverList.begin(), serverList.end()));
Mike Yu10832aa2020-08-25 19:13:11 +08005492}
5493
Mike Yu5e1b9912020-11-10 16:50:13 +08005494TEST_F(ResolverTest, MultipleDotQueriesInOnePacket) {
5495 constexpr char hostname1[] = "query1.example.com.";
5496 constexpr char hostname2[] = "query2.example.com.";
5497 const std::vector<DnsRecord> records = {
5498 {hostname1, ns_type::ns_t_a, "1.2.3.4"},
5499 {hostname2, ns_type::ns_t_a, "1.2.3.5"},
5500 };
5501
5502 const std::string addr = getUniqueIPv4Address();
5503 test::DNSResponder dns(addr);
5504 StartDns(dns, records);
5505 test::DnsTlsFrontend tls(addr, "853", addr, "53");
5506 ASSERT_TRUE(tls.startServer());
5507
5508 // Set up resolver to strict mode.
5509 auto parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
5510 parcel.servers = {addr};
5511 parcel.tlsServers = {addr};
5512 parcel.tlsName = kDefaultPrivateDnsHostName;
5513 parcel.caCertificate = kCaCert;
5514 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
5515 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
5516 EXPECT_TRUE(tls.waitForQueries(1));
5517 tls.clearQueries();
5518 dns.clearQueries();
5519
5520 const auto queryAndCheck = [&](const std::string& hostname,
5521 const std::vector<DnsRecord>& records) {
5522 SCOPED_TRACE(hostname);
5523
5524 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
5525 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(hostname.c_str(), nullptr, hints);
5526
5527 std::vector<std::string> expectedAnswers;
5528 for (const auto& r : records) {
5529 if (r.host_name == hostname) expectedAnswers.push_back(r.addr);
5530 }
5531
5532 EXPECT_LE(timeTakenMs, 200);
5533 ASSERT_NE(result, nullptr);
5534 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(expectedAnswers));
5535 };
5536
5537 // Set tls to reply DNS responses in one TCP packet and not to close the connection from its
5538 // side.
5539 tls.setDelayQueries(2);
5540 tls.setDelayQueriesTimeout(500);
5541 tls.setPassiveClose(true);
5542
5543 // Start sending DNS requests at the same time.
5544 std::array<std::thread, 2> threads;
5545 threads[0] = std::thread(queryAndCheck, hostname1, records);
5546 threads[1] = std::thread(queryAndCheck, hostname2, records);
5547
5548 threads[0].join();
5549 threads[1].join();
5550
5551 // Also check no additional queries due to DoT reconnection.
5552 EXPECT_EQ(tls.queries(), 2);
5553}
5554
Mike Yu6ce587d2019-12-19 21:30:22 +08005555// ResolverMultinetworkTest is used to verify multinetwork functionality. Here's how it works:
5556// The resolver sends queries to address A, and then there will be a TunForwarder helping forward
5557// the packets to address B, which is the address on which the testing server is listening. The
5558// answer packets responded from the testing server go through the reverse path back to the
5559// resolver.
5560//
5561// To achieve the that, it needs to set up a interface with routing rules. Tests are not
5562// supposed to initiate DNS servers on their own; instead, some utilities are added to the class to
5563// help the setup.
5564//
5565// An example of how to use it:
5566// TEST_F() {
Luke Huang81568fb2020-07-13 00:55:12 +08005567// ScopedPhysicalNetwork network = CreateScopedPhysicalNetwork(V4);
Mike Yu6ce587d2019-12-19 21:30:22 +08005568// network.init();
5569//
5570// auto dns = network.addIpv4Dns();
5571// StartDns(dns.dnsServer, {});
5572//
Luke Huang81568fb2020-07-13 00:55:12 +08005573// network.setDnsConfiguration();
Mike Yu6ce587d2019-12-19 21:30:22 +08005574// network.startTunForwarder();
5575//
5576// // Send queries here
5577// }
5578
5579class ResolverMultinetworkTest : public ResolverTest {
5580 protected:
5581 enum class ConnectivityType { V4, V6, V4V6 };
Luke Huang81568fb2020-07-13 00:55:12 +08005582 static constexpr int TEST_NETID_BASE = 10000;
Mike Yu6ce587d2019-12-19 21:30:22 +08005583
5584 struct DnsServerPair {
Luke Huang81568fb2020-07-13 00:55:12 +08005585 DnsServerPair(std::shared_ptr<test::DNSResponder> server, std::string addr)
5586 : dnsServer(server), dnsAddr(addr) {}
5587 std::shared_ptr<test::DNSResponder> dnsServer;
Mike Yu6ce587d2019-12-19 21:30:22 +08005588 std::string dnsAddr; // The DNS server address used for setResolverConfiguration().
5589 // TODO: Add test::DnsTlsFrontend* and std::string for DoT.
5590 };
5591
5592 class ScopedNetwork {
5593 public:
5594 ScopedNetwork(unsigned netId, ConnectivityType type, INetd* netdSrv,
Luke Huang81568fb2020-07-13 00:55:12 +08005595 IDnsResolver* dnsResolvSrv, const char* networkName)
Mike Yu6ce587d2019-12-19 21:30:22 +08005596 : mNetId(netId),
5597 mConnectivityType(type),
5598 mNetdSrv(netdSrv),
Luke Huang81568fb2020-07-13 00:55:12 +08005599 mDnsResolvSrv(dnsResolvSrv),
5600 mNetworkName(networkName) {
5601 mIfname = fmt::format("testtun{}", netId);
Mike Yu6ce587d2019-12-19 21:30:22 +08005602 }
Luke Huang81568fb2020-07-13 00:55:12 +08005603 virtual ~ScopedNetwork() {
5604 if (mNetdSrv != nullptr) mNetdSrv->networkDestroy(mNetId);
5605 if (mDnsResolvSrv != nullptr) mDnsResolvSrv->destroyNetworkCache(mNetId);
5606 }
Mike Yu6ce587d2019-12-19 21:30:22 +08005607
5608 Result<void> init();
Mike Yu6ce587d2019-12-19 21:30:22 +08005609 Result<DnsServerPair> addIpv4Dns() { return addDns(ConnectivityType::V4); }
5610 Result<DnsServerPair> addIpv6Dns() { return addDns(ConnectivityType::V6); }
5611 bool startTunForwarder() { return mTunForwarder->startForwarding(); }
Luke Huang81568fb2020-07-13 00:55:12 +08005612 bool setDnsConfiguration() const;
5613 bool clearDnsConfiguration() const;
Mike Yu6ce587d2019-12-19 21:30:22 +08005614 unsigned netId() const { return mNetId; }
Luke Huang81568fb2020-07-13 00:55:12 +08005615 std::string name() const { return mNetworkName; }
Mike Yu6ce587d2019-12-19 21:30:22 +08005616
Luke Huang81568fb2020-07-13 00:55:12 +08005617 protected:
5618 // Subclasses should implement it to decide which network should be create.
5619 virtual Result<void> createNetwork() const = 0;
Mike Yu6ce587d2019-12-19 21:30:22 +08005620
5621 const unsigned mNetId;
5622 const ConnectivityType mConnectivityType;
5623 INetd* mNetdSrv;
5624 IDnsResolver* mDnsResolvSrv;
Luke Huang81568fb2020-07-13 00:55:12 +08005625 const std::string mNetworkName;
Mike Yu6ce587d2019-12-19 21:30:22 +08005626 std::string mIfname;
5627 std::unique_ptr<TunForwarder> mTunForwarder;
Luke Huang81568fb2020-07-13 00:55:12 +08005628 std::vector<DnsServerPair> mDnsServerPairs;
5629
5630 private:
5631 Result<DnsServerPair> addDns(ConnectivityType connectivity);
5632 // Assuming mNetId is unique during ResolverMultinetworkTest, make the
5633 // address based on it to avoid conflicts.
5634 std::string makeIpv4AddrString(uint8_t n) const {
5635 return StringPrintf("192.168.%u.%u", (mNetId - TEST_NETID_BASE), n);
5636 }
5637 std::string makeIpv6AddrString(uint8_t n) const {
5638 return StringPrintf("2001:db8:%u::%u", (mNetId - TEST_NETID_BASE), n);
5639 }
5640 };
5641
5642 class ScopedPhysicalNetwork : public ScopedNetwork {
5643 public:
5644 ScopedPhysicalNetwork(unsigned netId, const char* networkName)
5645 : ScopedNetwork(netId, ConnectivityType::V4V6, nullptr, nullptr, networkName) {}
5646 ScopedPhysicalNetwork(unsigned netId, ConnectivityType type, INetd* netdSrv,
5647 IDnsResolver* dnsResolvSrv, const char* name = "Physical")
5648 : ScopedNetwork(netId, type, netdSrv, dnsResolvSrv, name) {}
5649
5650 protected:
5651 Result<void> createNetwork() const override {
5652 if (auto r = mNetdSrv->networkCreatePhysical(mNetId, INetd::PERMISSION_NONE);
5653 !r.isOk()) {
5654 return Error() << r.getMessage();
5655 }
5656 return {};
5657 }
5658 };
5659
5660 class ScopedVirtualNetwork : public ScopedNetwork {
5661 public:
5662 ScopedVirtualNetwork(unsigned netId, ConnectivityType type, INetd* netdSrv,
5663 IDnsResolver* dnsResolvSrv, const char* name, bool isSecure)
5664 : ScopedNetwork(netId, type, netdSrv, dnsResolvSrv, name), mIsSecure(isSecure) {}
5665 ~ScopedVirtualNetwork() {
5666 if (!mVpnIsolationUids.empty()) {
5667 const std::vector<int> tmpUids(mVpnIsolationUids.begin(), mVpnIsolationUids.end());
5668 mNetdSrv->firewallRemoveUidInterfaceRules(tmpUids);
5669 }
5670 }
5671 // Enable VPN isolation. Ensures that uid can only receive packets on mIfname.
5672 Result<void> enableVpnIsolation(int uid) {
5673 if (auto r = mNetdSrv->firewallAddUidInterfaceRules(mIfname, {uid}); !r.isOk()) {
5674 return Error() << r.getMessage();
5675 }
5676 mVpnIsolationUids.insert(uid);
5677 return {};
5678 }
5679 Result<void> disableVpnIsolation(int uid) {
5680 if (auto r = mNetdSrv->firewallRemoveUidInterfaceRules({static_cast<int>(uid)});
5681 !r.isOk()) {
5682 return Error() << r.getMessage();
5683 }
5684 mVpnIsolationUids.erase(uid);
5685 return {};
5686 }
5687 Result<void> addUser(uid_t uid) const { return addUidRange(uid, uid); }
5688 Result<void> addUidRange(uid_t from, uid_t to) const {
5689 if (auto r = mNetdSrv->networkAddUidRanges(mNetId, {makeUidRangeParcel(from, to)});
5690 !r.isOk()) {
5691 return Error() << r.getMessage();
5692 }
5693 return {};
5694 }
5695
5696 protected:
5697 Result<void> createNetwork() const override {
5698 if (auto r = mNetdSrv->networkCreateVpn(mNetId, mIsSecure); !r.isOk()) {
5699 return Error() << r.getMessage();
5700 }
5701 return {};
5702 }
5703
5704 bool mIsSecure = false;
5705 std::unordered_set<int> mVpnIsolationUids;
Mike Yu6ce587d2019-12-19 21:30:22 +08005706 };
5707
5708 void SetUp() override {
5709 ResolverTest::SetUp();
5710 ASSERT_NE(mDnsClient.netdService(), nullptr);
5711 ASSERT_NE(mDnsClient.resolvService(), nullptr);
5712 }
5713
Luke Huang81568fb2020-07-13 00:55:12 +08005714 void TearDown() override {
5715 ResolverTest::TearDown();
5716 // Restore default network
5717 if (mStoredDefaultNetwork >= 0) {
5718 mDnsClient.netdService()->networkSetDefault(mStoredDefaultNetwork);
5719 }
5720 }
Mike Yu6ce587d2019-12-19 21:30:22 +08005721
Luke Huang81568fb2020-07-13 00:55:12 +08005722 ScopedPhysicalNetwork CreateScopedPhysicalNetwork(ConnectivityType type,
5723 const char* name = "Physical") {
5724 return {getFreeNetId(), type, mDnsClient.netdService(), mDnsClient.resolvService(), name};
5725 }
5726 ScopedVirtualNetwork CreateScopedVirtualNetwork(ConnectivityType type, bool isSecure,
5727 const char* name = "Virtual") {
5728 return {getFreeNetId(), type, mDnsClient.netdService(), mDnsClient.resolvService(),
5729 name, isSecure};
5730 }
Mike Yu6ce587d2019-12-19 21:30:22 +08005731 void StartDns(test::DNSResponder& dns, const std::vector<DnsRecord>& records);
Luke Huang81568fb2020-07-13 00:55:12 +08005732 void setDefaultNetwork(int netId) {
5733 // Save current default network at the first call.
5734 std::call_once(defaultNetworkFlag, [&]() {
5735 ASSERT_TRUE(mDnsClient.netdService()->networkGetDefault(&mStoredDefaultNetwork).isOk());
5736 });
5737 ASSERT_TRUE(mDnsClient.netdService()->networkSetDefault(netId).isOk());
5738 }
5739 unsigned getFreeNetId() {
5740 if (mNextNetId == TEST_NETID_BASE + 256) mNextNetId = TEST_NETID_BASE;
5741 return mNextNetId++;
5742 }
Mike Yu6ce587d2019-12-19 21:30:22 +08005743
5744 private:
5745 // Use a different netId because this class inherits from the class ResolverTest which
Luke Huang81568fb2020-07-13 00:55:12 +08005746 // always creates TEST_NETID in setup. It's incremented when CreateScoped{Physical,
5747 // Virtual}Network() is called.
5748 // Note: 255 is the maximum number of (mNextNetId - TEST_NETID_BASE) here as mNextNetId
5749 // is used to create address.
5750 unsigned mNextNetId = TEST_NETID_BASE;
5751 // Use -1 to represent that default network was not modified because
5752 // real netId must be an unsigned value.
5753 int mStoredDefaultNetwork = -1;
5754 std::once_flag defaultNetworkFlag;
Mike Yu6ce587d2019-12-19 21:30:22 +08005755};
5756
Mike Yu6ce587d2019-12-19 21:30:22 +08005757Result<void> ResolverMultinetworkTest::ScopedNetwork::init() {
Luke Huang81568fb2020-07-13 00:55:12 +08005758 if (mNetdSrv == nullptr || mDnsResolvSrv == nullptr) return Error() << "srv not available";
Mike Yu6ce587d2019-12-19 21:30:22 +08005759 unique_fd ufd = TunForwarder::createTun(mIfname);
5760 if (!ufd.ok()) {
5761 return Errorf("createTun for {} failed", mIfname);
5762 }
5763 mTunForwarder = std::make_unique<TunForwarder>(std::move(ufd));
5764
Luke Huang81568fb2020-07-13 00:55:12 +08005765 if (auto r = createNetwork(); !r.ok()) {
5766 return r;
Mike Yu6ce587d2019-12-19 21:30:22 +08005767 }
5768 if (auto r = mDnsResolvSrv->createNetworkCache(mNetId); !r.isOk()) {
5769 return Error() << r.getMessage();
5770 }
5771 if (auto r = mNetdSrv->networkAddInterface(mNetId, mIfname); !r.isOk()) {
5772 return Error() << r.getMessage();
5773 }
5774
5775 if (mConnectivityType == ConnectivityType::V4 || mConnectivityType == ConnectivityType::V4V6) {
5776 const std::string v4Addr = makeIpv4AddrString(1);
5777 if (auto r = mNetdSrv->interfaceAddAddress(mIfname, v4Addr, 32); !r.isOk()) {
5778 return Error() << r.getMessage();
5779 }
5780 if (auto r = mNetdSrv->networkAddRoute(mNetId, mIfname, "0.0.0.0/0", ""); !r.isOk()) {
5781 return Error() << r.getMessage();
5782 }
5783 }
5784 if (mConnectivityType == ConnectivityType::V6 || mConnectivityType == ConnectivityType::V4V6) {
5785 const std::string v6Addr = makeIpv6AddrString(1);
5786 if (auto r = mNetdSrv->interfaceAddAddress(mIfname, v6Addr, 128); !r.isOk()) {
5787 return Error() << r.getMessage();
5788 }
5789 if (auto r = mNetdSrv->networkAddRoute(mNetId, mIfname, "::/0", ""); !r.isOk()) {
5790 return Error() << r.getMessage();
5791 }
5792 }
5793
5794 return {};
5795}
5796
Mike Yu6ce587d2019-12-19 21:30:22 +08005797void ResolverMultinetworkTest::StartDns(test::DNSResponder& dns,
5798 const std::vector<DnsRecord>& records) {
5799 ResolverTest::StartDns(dns, records);
5800
5801 // Bind the DNSResponder's sockets to the network if specified.
5802 if (std::optional<unsigned> netId = dns.getNetwork(); netId.has_value()) {
5803 setNetworkForSocket(netId.value(), dns.getUdpSocket());
5804 setNetworkForSocket(netId.value(), dns.getTcpSocket());
5805 }
5806}
5807
5808Result<ResolverMultinetworkTest::DnsServerPair> ResolverMultinetworkTest::ScopedNetwork::addDns(
5809 ConnectivityType type) {
Luke Huang81568fb2020-07-13 00:55:12 +08005810 const int index = mDnsServerPairs.size();
Mike Yu6ce587d2019-12-19 21:30:22 +08005811 const int prefixLen = (type == ConnectivityType::V4) ? 32 : 128;
5812
5813 const std::function<std::string(unsigned)> makeIpString =
5814 std::bind((type == ConnectivityType::V4) ? &ScopedNetwork::makeIpv4AddrString
5815 : &ScopedNetwork::makeIpv6AddrString,
5816 this, std::placeholders::_1);
5817
5818 std::string src1 = makeIpString(1); // The address from which the resolver will send.
Luke Huang81568fb2020-07-13 00:55:12 +08005819 std::string dst1 = makeIpString(
5820 index + 100 +
5821 (mNetId - TEST_NETID_BASE)); // The address to which the resolver will send.
Mike Yu6ce587d2019-12-19 21:30:22 +08005822 std::string src2 = dst1; // The address translated from src1.
Luke Huang81568fb2020-07-13 00:55:12 +08005823 std::string dst2 = makeIpString(
5824 index + 200 + (mNetId - TEST_NETID_BASE)); // The address translated from dst2.
Mike Yu6ce587d2019-12-19 21:30:22 +08005825
5826 if (!mTunForwarder->addForwardingRule({src1, dst1}, {src2, dst2}) ||
5827 !mTunForwarder->addForwardingRule({dst2, src2}, {dst1, src1})) {
5828 return Errorf("Failed to add the rules ({}, {}, {}, {})", src1, dst1, src2, dst2);
5829 }
5830
5831 if (!mNetdSrv->interfaceAddAddress(mIfname, dst2, prefixLen).isOk()) {
5832 return Errorf("interfaceAddAddress({}, {}, {}) failed", mIfname, dst2, prefixLen);
5833 }
5834
Luke Huang81568fb2020-07-13 00:55:12 +08005835 return mDnsServerPairs.emplace_back(std::make_shared<test::DNSResponder>(mNetId, dst2), dst1);
Mike Yu6ce587d2019-12-19 21:30:22 +08005836}
5837
Luke Huang81568fb2020-07-13 00:55:12 +08005838bool ResolverMultinetworkTest::ScopedNetwork::setDnsConfiguration() const {
5839 if (mDnsResolvSrv == nullptr) return false;
5840 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
5841 parcel.tlsServers.clear();
5842 parcel.netId = mNetId;
5843 parcel.servers.clear();
5844 for (const auto& pair : mDnsServerPairs) {
5845 parcel.servers.push_back(pair.dnsAddr);
5846 }
5847 return mDnsResolvSrv->setResolverConfiguration(parcel).isOk();
5848}
5849
5850bool ResolverMultinetworkTest::ScopedNetwork::clearDnsConfiguration() const {
5851 if (mDnsResolvSrv == nullptr) return false;
5852 return mDnsResolvSrv->destroyNetworkCache(mNetId).isOk() &&
5853 mDnsResolvSrv->createNetworkCache(mNetId).isOk();
5854}
5855
5856namespace {
5857
5858// Convenient wrapper for making getaddrinfo call like framework.
5859Result<ScopedAddrinfo> android_getaddrinfofornet_wrapper(const char* name, int netId) {
5860 // Use the same parameter as libcore/ojluni/src/main/java/java/net/Inet6AddressImpl.java.
5861 static const addrinfo hints = {
5862 .ai_flags = AI_ADDRCONFIG,
5863 .ai_family = AF_UNSPEC,
5864 .ai_socktype = SOCK_STREAM,
5865 };
5866 addrinfo* result = nullptr;
5867 if (int r = android_getaddrinfofornet(name, nullptr, &hints, netId, MARK_UNSET, &result)) {
5868 return Error() << r;
5869 }
5870 return ScopedAddrinfo(result);
5871}
5872
5873void expectDnsWorksForUid(const char* name, unsigned netId, uid_t uid,
5874 const std::vector<std::string>& expectedResult) {
5875 ScopedChangeUID scopedChangeUID(uid);
5876 auto result = android_getaddrinfofornet_wrapper(name, netId);
5877 ASSERT_RESULT_OK(result);
5878 ScopedAddrinfo ai_result(std::move(result.value()));
5879 std::vector<std::string> result_strs = ToStrings(ai_result);
5880 EXPECT_THAT(result_strs, testing::UnorderedElementsAreArray(expectedResult));
5881}
5882
5883} // namespace
5884
Mike Yu6ce587d2019-12-19 21:30:22 +08005885TEST_F(ResolverMultinetworkTest, GetAddrInfo_AI_ADDRCONFIG) {
5886 constexpr char host_name[] = "ohayou.example.com.";
5887
5888 const std::array<ConnectivityType, 3> allTypes = {
5889 ConnectivityType::V4,
5890 ConnectivityType::V6,
5891 ConnectivityType::V4V6,
5892 };
5893 for (const auto& type : allTypes) {
5894 SCOPED_TRACE(StringPrintf("ConnectivityType: %d", type));
5895
5896 // Create a network.
Luke Huang81568fb2020-07-13 00:55:12 +08005897 ScopedPhysicalNetwork network = CreateScopedPhysicalNetwork(type);
Mike Yu6ce587d2019-12-19 21:30:22 +08005898 ASSERT_RESULT_OK(network.init());
5899
5900 // Add a testing DNS server.
5901 const Result<DnsServerPair> dnsPair =
5902 (type == ConnectivityType::V4) ? network.addIpv4Dns() : network.addIpv6Dns();
5903 ASSERT_RESULT_OK(dnsPair);
Luke Huang81568fb2020-07-13 00:55:12 +08005904 StartDns(*dnsPair->dnsServer, {{host_name, ns_type::ns_t_a, "192.0.2.0"},
5905 {host_name, ns_type::ns_t_aaaa, "2001:db8:cafe:d00d::31"}});
Mike Yu6ce587d2019-12-19 21:30:22 +08005906
5907 // Set up resolver and start forwarding.
Luke Huang81568fb2020-07-13 00:55:12 +08005908 ASSERT_TRUE(network.setDnsConfiguration());
Mike Yu6ce587d2019-12-19 21:30:22 +08005909 ASSERT_TRUE(network.startTunForwarder());
5910
Luke Huang81568fb2020-07-13 00:55:12 +08005911 auto result = android_getaddrinfofornet_wrapper(host_name, network.netId());
5912 ASSERT_RESULT_OK(result);
5913 ScopedAddrinfo ai_result(std::move(result.value()));
Mike Yu6ce587d2019-12-19 21:30:22 +08005914 std::vector<std::string> result_strs = ToStrings(ai_result);
5915 std::vector<std::string> expectedResult;
5916 size_t expectedQueries = 0;
5917
5918 if (type == ConnectivityType::V6 || type == ConnectivityType::V4V6) {
5919 expectedResult.emplace_back("2001:db8:cafe:d00d::31");
5920 expectedQueries++;
5921 }
5922 if (type == ConnectivityType::V4 || type == ConnectivityType::V4V6) {
Luke Huang81568fb2020-07-13 00:55:12 +08005923 expectedResult.emplace_back("192.0.2.0");
Mike Yu6ce587d2019-12-19 21:30:22 +08005924 expectedQueries++;
5925 }
5926 EXPECT_THAT(result_strs, testing::UnorderedElementsAreArray(expectedResult));
Luke Huang81568fb2020-07-13 00:55:12 +08005927 EXPECT_EQ(GetNumQueries(*dnsPair->dnsServer, host_name), expectedQueries);
Mike Yu6ce587d2019-12-19 21:30:22 +08005928 }
5929}
5930
5931TEST_F(ResolverMultinetworkTest, NetworkDestroyedDuringQueryInFlight) {
5932 constexpr char host_name[] = "ohayou.example.com.";
5933
5934 // Create a network and add an ipv4 DNS server.
Luke Huang81568fb2020-07-13 00:55:12 +08005935 auto network = std::make_unique<ScopedPhysicalNetwork>(getFreeNetId(), ConnectivityType::V4V6,
5936 mDnsClient.netdService(),
5937 mDnsClient.resolvService());
Mike Yu6ce587d2019-12-19 21:30:22 +08005938 ASSERT_RESULT_OK(network->init());
5939 const Result<DnsServerPair> dnsPair = network->addIpv4Dns();
5940 ASSERT_RESULT_OK(dnsPair);
5941
5942 // Set the DNS server unresponsive.
Luke Huang81568fb2020-07-13 00:55:12 +08005943 dnsPair->dnsServer->setResponseProbability(0.0);
5944 dnsPair->dnsServer->setErrorRcode(static_cast<ns_rcode>(-1));
5945 StartDns(*dnsPair->dnsServer, {});
Mike Yu6ce587d2019-12-19 21:30:22 +08005946
5947 // Set up resolver and start forwarding.
Luke Huang81568fb2020-07-13 00:55:12 +08005948 ASSERT_TRUE(network->setDnsConfiguration());
Mike Yu6ce587d2019-12-19 21:30:22 +08005949 ASSERT_TRUE(network->startTunForwarder());
5950
5951 // Expect the things happening in order:
5952 // 1. The thread sends the query to the dns server which is unresponsive.
5953 // 2. The network is destroyed while the thread is waiting for the response from the dns server.
5954 // 3. After the dns server timeout, the thread retries but fails to connect.
5955 std::thread lookup([&]() {
5956 int fd = resNetworkQuery(network->netId(), host_name, ns_c_in, ns_t_a, 0);
5957 EXPECT_TRUE(fd != -1);
5958 expectAnswersNotValid(fd, -ETIMEDOUT);
5959 });
5960
5961 // Tear down the network as soon as the dns server receives the query.
Luke Huang81568fb2020-07-13 00:55:12 +08005962 const auto condition = [&]() { return GetNumQueries(*dnsPair->dnsServer, host_name) == 1U; };
Mike Yu6ce587d2019-12-19 21:30:22 +08005963 EXPECT_TRUE(PollForCondition(condition));
5964 network.reset();
5965
5966 lookup.join();
5967}
5968
5969TEST_F(ResolverMultinetworkTest, OneCachePerNetwork) {
5970 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
5971 constexpr char host_name[] = "ohayou.example.com.";
5972
Luke Huang81568fb2020-07-13 00:55:12 +08005973 ScopedPhysicalNetwork network1 = CreateScopedPhysicalNetwork(ConnectivityType::V4V6);
5974 ScopedPhysicalNetwork network2 = CreateScopedPhysicalNetwork(ConnectivityType::V4V6);
Mike Yu6ce587d2019-12-19 21:30:22 +08005975 ASSERT_RESULT_OK(network1.init());
5976 ASSERT_RESULT_OK(network2.init());
5977
5978 const Result<DnsServerPair> dnsPair1 = network1.addIpv4Dns();
5979 const Result<DnsServerPair> dnsPair2 = network2.addIpv4Dns();
5980 ASSERT_RESULT_OK(dnsPair1);
5981 ASSERT_RESULT_OK(dnsPair2);
Luke Huang81568fb2020-07-13 00:55:12 +08005982 StartDns(*dnsPair1->dnsServer, {{host_name, ns_type::ns_t_a, "192.0.2.0"}});
5983 StartDns(*dnsPair2->dnsServer, {{host_name, ns_type::ns_t_a, "192.0.2.1"}});
Mike Yu6ce587d2019-12-19 21:30:22 +08005984
5985 // Set up resolver for network 1 and start forwarding.
Luke Huang81568fb2020-07-13 00:55:12 +08005986 ASSERT_TRUE(network1.setDnsConfiguration());
Mike Yu6ce587d2019-12-19 21:30:22 +08005987 ASSERT_TRUE(network1.startTunForwarder());
5988
5989 // Set up resolver for network 2 and start forwarding.
Luke Huang81568fb2020-07-13 00:55:12 +08005990 ASSERT_TRUE(network2.setDnsConfiguration());
Mike Yu6ce587d2019-12-19 21:30:22 +08005991 ASSERT_TRUE(network2.startTunForwarder());
5992
5993 // Send the same queries to both networks.
5994 int fd1 = resNetworkQuery(network1.netId(), host_name, ns_c_in, ns_t_a, 0);
5995 int fd2 = resNetworkQuery(network2.netId(), host_name, ns_c_in, ns_t_a, 0);
5996
Luke Huang81568fb2020-07-13 00:55:12 +08005997 expectAnswersValid(fd1, AF_INET, "192.0.2.0");
5998 expectAnswersValid(fd2, AF_INET, "192.0.2.1");
5999 EXPECT_EQ(GetNumQueries(*dnsPair1->dnsServer, host_name), 1U);
6000 EXPECT_EQ(GetNumQueries(*dnsPair2->dnsServer, host_name), 1U);
Mike Yu6ce587d2019-12-19 21:30:22 +08006001
6002 // Flush the cache of network 1, and send the queries again.
6003 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(network1.netId()).isOk());
6004 fd1 = resNetworkQuery(network1.netId(), host_name, ns_c_in, ns_t_a, 0);
6005 fd2 = resNetworkQuery(network2.netId(), host_name, ns_c_in, ns_t_a, 0);
6006
Luke Huang81568fb2020-07-13 00:55:12 +08006007 expectAnswersValid(fd1, AF_INET, "192.0.2.0");
6008 expectAnswersValid(fd2, AF_INET, "192.0.2.1");
6009 EXPECT_EQ(GetNumQueries(*dnsPair1->dnsServer, host_name), 2U);
6010 EXPECT_EQ(GetNumQueries(*dnsPair2->dnsServer, host_name), 1U);
6011}
6012
6013TEST_F(ResolverMultinetworkTest, DnsWithVpn) {
6014 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Luke Huang81568fb2020-07-13 00:55:12 +08006015 constexpr char host_name[] = "ohayou.example.com.";
6016 constexpr char ipv4_addr[] = "192.0.2.0";
6017 constexpr char ipv6_addr[] = "2001:db8:cafe:d00d::31";
6018
6019 const std::pair<ConnectivityType, std::vector<std::string>> testPairs[] = {
6020 {ConnectivityType::V4, {ipv4_addr}},
6021 {ConnectivityType::V6, {ipv6_addr}},
6022 {ConnectivityType::V4V6, {ipv6_addr, ipv4_addr}},
6023 };
6024 for (const auto& [type, result] : testPairs) {
6025 SCOPED_TRACE(StringPrintf("ConnectivityType: %d", type));
6026
6027 // Create a network.
6028 ScopedPhysicalNetwork underlyingNetwork = CreateScopedPhysicalNetwork(type, "Underlying");
6029 ScopedVirtualNetwork bypassableVpnNetwork =
6030 CreateScopedVirtualNetwork(type, false, "BypassableVpn");
6031 ScopedVirtualNetwork secureVpnNetwork = CreateScopedVirtualNetwork(type, true, "SecureVpn");
6032
6033 ASSERT_RESULT_OK(underlyingNetwork.init());
6034 ASSERT_RESULT_OK(bypassableVpnNetwork.init());
6035 ASSERT_RESULT_OK(secureVpnNetwork.init());
6036 ASSERT_RESULT_OK(bypassableVpnNetwork.addUser(TEST_UID));
6037 ASSERT_RESULT_OK(secureVpnNetwork.addUser(TEST_UID2));
6038
6039 auto setupDnsFn = [&](std::shared_ptr<test::DNSResponder> dnsServer,
6040 ScopedNetwork* nw) -> void {
6041 StartDns(*dnsServer, {{host_name, ns_type::ns_t_a, ipv4_addr},
6042 {host_name, ns_type::ns_t_aaaa, ipv6_addr}});
6043 ASSERT_TRUE(nw->setDnsConfiguration());
6044 ASSERT_TRUE(nw->startTunForwarder());
6045 };
6046 // Add a testing DNS server to networks.
6047 const Result<DnsServerPair> underlyingPair = (type == ConnectivityType::V4)
6048 ? underlyingNetwork.addIpv4Dns()
6049 : underlyingNetwork.addIpv6Dns();
6050 ASSERT_RESULT_OK(underlyingPair);
6051 const Result<DnsServerPair> bypassableVpnPair = (type == ConnectivityType::V4)
6052 ? bypassableVpnNetwork.addIpv4Dns()
6053 : bypassableVpnNetwork.addIpv6Dns();
6054 ASSERT_RESULT_OK(bypassableVpnPair);
6055 const Result<DnsServerPair> secureVpnPair = (type == ConnectivityType::V4)
6056 ? secureVpnNetwork.addIpv4Dns()
6057 : secureVpnNetwork.addIpv6Dns();
6058 ASSERT_RESULT_OK(secureVpnPair);
6059 // Set up resolver and start forwarding for networks.
6060 setupDnsFn(underlyingPair->dnsServer, &underlyingNetwork);
6061 setupDnsFn(bypassableVpnPair->dnsServer, &bypassableVpnNetwork);
6062 setupDnsFn(secureVpnPair->dnsServer, &secureVpnNetwork);
6063
6064 setDefaultNetwork(underlyingNetwork.netId());
6065 const unsigned underlyingNetId = underlyingNetwork.netId();
6066 const unsigned bypassableVpnNetId = bypassableVpnNetwork.netId();
6067 const unsigned secureVpnNetId = secureVpnNetwork.netId();
6068 // We've called setNetworkForProcess in SetupOemNetwork, so reset to default first.
6069 ScopedSetNetworkForProcess scopedSetNetworkForProcess(NETID_UNSET);
6070 auto expectDnsQueryCountsFn = [&](size_t count,
6071 std::shared_ptr<test::DNSResponder> dnsServer,
6072 unsigned expectedDnsNetId) -> void {
6073 EXPECT_EQ(GetNumQueries(*dnsServer, host_name), count);
6074 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(expectedDnsNetId).isOk());
6075 dnsServer->clearQueries();
6076 // Give DnsResolver some time to clear cache to avoid race.
6077 usleep(5 * 1000);
6078 };
6079
6080 // Create a object to represent default network, do not init it.
6081 ScopedPhysicalNetwork defaultNetwork{NETID_UNSET, "Default"};
6082
6083 // Test VPN with DNS server under 4 different network selection scenarios.
6084 // See the test config for the expectation.
6085 const struct TestConfig {
6086 ScopedNetwork* selectedNetwork;
6087 unsigned expectedDnsNetId;
6088 std::shared_ptr<test::DNSResponder> expectedDnsServer;
6089 } vpnWithDnsServerConfigs[]{
6090 // clang-format off
6091 // Queries use the bypassable VPN by default.
6092 {&defaultNetwork, bypassableVpnNetId, bypassableVpnPair->dnsServer},
6093 // Choosing the underlying network works because the VPN is bypassable.
6094 {&underlyingNetwork, underlyingNetId, underlyingPair->dnsServer},
6095 // Selecting the VPN sends the query on the VPN.
6096 {&bypassableVpnNetwork, bypassableVpnNetId, bypassableVpnPair->dnsServer},
6097 // TEST_UID does not have access to the secure VPN.
6098 {&secureVpnNetwork, bypassableVpnNetId, bypassableVpnPair->dnsServer},
6099 // clang-format on
6100 };
6101 for (const auto& config : vpnWithDnsServerConfigs) {
6102 SCOPED_TRACE(fmt::format("Bypassble VPN with DnsServer, selectedNetwork = {}",
6103 config.selectedNetwork->name()));
6104 expectDnsWorksForUid(host_name, config.selectedNetwork->netId(), TEST_UID, result);
6105 expectDnsQueryCountsFn(result.size(), config.expectedDnsServer,
6106 config.expectedDnsNetId);
6107 }
6108
6109 std::vector<ScopedNetwork*> nwVec{&defaultNetwork, &underlyingNetwork,
6110 &bypassableVpnNetwork, &secureVpnNetwork};
6111 // Test the VPN without DNS server with the same combination as before.
6112 ASSERT_TRUE(bypassableVpnNetwork.clearDnsConfiguration());
6113 // Test bypassable VPN, TEST_UID
6114 for (const auto* selectedNetwork : nwVec) {
6115 SCOPED_TRACE(fmt::format("Bypassble VPN without DnsServer, selectedNetwork = {}",
6116 selectedNetwork->name()));
6117 expectDnsWorksForUid(host_name, selectedNetwork->netId(), TEST_UID, result);
6118 expectDnsQueryCountsFn(result.size(), underlyingPair->dnsServer, underlyingNetId);
6119 }
6120
6121 // The same test scenario as before plus enableVpnIsolation for secure VPN, TEST_UID2.
6122 for (bool enableVpnIsolation : {false, true}) {
6123 SCOPED_TRACE(fmt::format("enableVpnIsolation = {}", enableVpnIsolation));
6124 if (enableVpnIsolation) {
6125 EXPECT_RESULT_OK(secureVpnNetwork.enableVpnIsolation(TEST_UID2));
6126 }
6127
6128 // Test secure VPN without DNS server.
6129 ASSERT_TRUE(secureVpnNetwork.clearDnsConfiguration());
6130 for (const auto* selectedNetwork : nwVec) {
6131 SCOPED_TRACE(fmt::format("Secure VPN without DnsServer, selectedNetwork = {}",
6132 selectedNetwork->name()));
6133 expectDnsWorksForUid(host_name, selectedNetwork->netId(), TEST_UID2, result);
6134 expectDnsQueryCountsFn(result.size(), underlyingPair->dnsServer, underlyingNetId);
6135 }
6136
6137 // Test secure VPN with DNS server.
6138 ASSERT_TRUE(secureVpnNetwork.setDnsConfiguration());
6139 for (const auto* selectedNetwork : nwVec) {
6140 SCOPED_TRACE(fmt::format("Secure VPN with DnsServer, selectedNetwork = {}",
6141 selectedNetwork->name()));
6142 expectDnsWorksForUid(host_name, selectedNetwork->netId(), TEST_UID2, result);
6143 expectDnsQueryCountsFn(result.size(), secureVpnPair->dnsServer, secureVpnNetId);
6144 }
6145
6146 if (enableVpnIsolation) {
6147 EXPECT_RESULT_OK(secureVpnNetwork.disableVpnIsolation(TEST_UID2));
6148 }
6149 }
6150 }
Mike Yu6ce587d2019-12-19 21:30:22 +08006151}