blob: c994162340ea07071853da63a696e8ba47748ff5 [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"
Ken Chenb9fa2062018-11-13 21:51:13 +080075
Luke Huang0d592bc2019-05-25 18:24:03 +080076// Valid VPN netId range is 100 ~ 65535
77constexpr int TEST_VPN_NETID = 65502;
Luke Huang94b10b92018-11-21 20:13:38 +080078constexpr int MAXPACKET = (8 * 1024);
Ken Chenb9fa2062018-11-13 21:51:13 +080079
Mike Yu10832aa2020-08-25 19:13:11 +080080const std::string kSortNameserversFlag("persist.device_config.netd_native.sort_nameservers");
Mike Yue93d9ae2020-08-25 19:09:51 +080081const std::string kDotConnectTimeoutMsFlag(
82 "persist.device_config.netd_native.dot_connect_timeout_ms");
83const std::string kDotAsyncHandshakeFlag("persist.device_config.netd_native.dot_async_handshake");
Mike Yubb499092020-08-28 19:18:42 +080084const std::string kDotMaxretriesFlag("persist.device_config.netd_native.dot_maxtries");
Mike Yu10832aa2020-08-25 19:13:11 +080085
Ken Chenb9fa2062018-11-13 21:51:13 +080086// Semi-public Bionic hook used by the NDK (frameworks/base/native/android/net.c)
87// Tested here for convenience.
88extern "C" int android_getaddrinfofornet(const char* hostname, const char* servname,
89 const addrinfo* hints, unsigned netid, unsigned mark,
90 struct addrinfo** result);
91
Mike Yu153b5b82020-03-04 19:53:54 +080092using namespace std::chrono_literals;
93
Luke Huang70070852019-11-25 18:25:50 +080094using aidl::android::net::IDnsResolver;
Luke Huangf8215372019-11-22 11:53:41 +080095using aidl::android::net::INetd;
Mike Yu8ac63402019-12-02 15:28:38 +080096using aidl::android::net::ResolverParamsParcel;
Mike Yu532405f2020-06-17 17:46:44 +080097using aidl::android::net::metrics::INetdEventListener;
Mike Yu6ce587d2019-12-19 21:30:22 +080098using android::base::Error;
Luke Huang9807e6b2019-05-20 16:17:12 +080099using android::base::ParseInt;
Mike Yu6ce587d2019-12-19 21:30:22 +0800100using android::base::Result;
Ken Chenb9fa2062018-11-13 21:51:13 +0800101using android::base::StringPrintf;
Luke Huang9807e6b2019-05-20 16:17:12 +0800102using android::base::unique_fd;
Ken Chenb9fa2062018-11-13 21:51:13 +0800103using android::net::ResolverStats;
Mike Yu6ce587d2019-12-19 21:30:22 +0800104using android::net::TunForwarder;
Hungming Chene8f970c2019-04-10 17:34:06 +0800105using android::net::metrics::DnsMetricsListener;
Ken Chenb9fa2062018-11-13 21:51:13 +0800106using android::netdutils::enableSockopt;
Hungming Chen63779052019-10-30 15:06:13 +0800107using android::netdutils::makeSlice;
Luke Huang9807e6b2019-05-20 16:17:12 +0800108using android::netdutils::ResponseCode;
Luke Huang9d2d25b2019-06-14 00:34:05 +0800109using android::netdutils::ScopedAddrinfo;
Mike Yu40e67072019-10-09 21:14:09 +0800110using android::netdutils::Stopwatch;
Hungming Chen63779052019-10-30 15:06:13 +0800111using android::netdutils::toHex;
Ken Chenb9fa2062018-11-13 21:51:13 +0800112
113// TODO: move into libnetdutils?
114namespace {
Luke Huangfde82482019-06-04 01:04:53 +0800115
Ken Chenb9fa2062018-11-13 21:51:13 +0800116ScopedAddrinfo safe_getaddrinfo(const char* node, const char* service,
117 const struct addrinfo* hints) {
118 addrinfo* result = nullptr;
119 if (getaddrinfo(node, service, hints, &result) != 0) {
120 result = nullptr; // Should already be the case, but...
121 }
122 return ScopedAddrinfo(result);
123}
Luke Huangfde82482019-06-04 01:04:53 +0800124
Mike Yu40e67072019-10-09 21:14:09 +0800125std::pair<ScopedAddrinfo, int> safe_getaddrinfo_time_taken(const char* node, const char* service,
126 const addrinfo& hints) {
127 Stopwatch s;
128 ScopedAddrinfo result = safe_getaddrinfo(node, service, &hints);
129 return {std::move(result), s.timeTakenUs() / 1000};
130}
131
Mike Yue2162e52020-03-04 18:43:46 +0800132struct NameserverStats {
133 NameserverStats() = delete;
134 NameserverStats(const std::string server) : server(server) {}
135 NameserverStats& setSuccesses(int val) {
136 successes = val;
137 return *this;
138 }
139 NameserverStats& setErrors(int val) {
140 errors = val;
141 return *this;
142 }
143 NameserverStats& setTimeouts(int val) {
144 timeouts = val;
145 return *this;
146 }
147 NameserverStats& setInternalErrors(int val) {
148 internal_errors = val;
149 return *this;
150 }
151
152 const std::string server;
153 int successes = 0;
154 int errors = 0;
155 int timeouts = 0;
156 int internal_errors = 0;
157};
158
Mike Yu61d17262020-02-15 18:56:22 +0800159class ScopedSystemProperties {
160 public:
161 ScopedSystemProperties(const std::string& key, const std::string& value) : mStoredKey(key) {
162 mStoredValue = android::base::GetProperty(key, "");
163 android::base::SetProperty(key, value);
164 }
165 ~ScopedSystemProperties() { android::base::SetProperty(mStoredKey, mStoredValue); }
166
167 private:
168 std::string mStoredKey;
169 std::string mStoredValue;
170};
171
Luke Huang5729afc2020-07-30 23:12:17 +0800172const bool isAtLeastR = (getApiLevel() >= 30);
173
Ken Chenb9fa2062018-11-13 21:51:13 +0800174} // namespace
175
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900176class ResolverTest : public ::testing::Test {
Hungming Chene8f970c2019-04-10 17:34:06 +0800177 public:
Hungming Chen473c4de2020-03-12 11:13:35 +0800178 static void SetUpTestSuite() {
Hungming Chen5bf09772019-04-25 11:16:13 +0800179 // Get binder service.
180 // Note that |mDnsClient| is not used for getting binder service in this static function.
181 // The reason is that wants to keep |mDnsClient| as a non-static data member. |mDnsClient|
182 // which sets up device network configuration could be independent from every test.
Luke Huangf8215372019-11-22 11:53:41 +0800183 // TODO: Perhaps add a static function in resolv_test_binder_utils.{cpp,h} to get binder
184 // service.
185
186 AIBinder* binder = AServiceManager_getService("dnsresolver");
Ken Chen753443a2020-11-09 20:52:01 +0800187 sResolvBinder = ndk::SpAIBinder(binder);
188 auto resolvService = aidl::android::net::IDnsResolver::fromBinder(sResolvBinder);
Hungming Chen5bf09772019-04-25 11:16:13 +0800189 ASSERT_NE(nullptr, resolvService.get());
190
191 // Subscribe the death recipient to the service IDnsResolver for detecting Netd death.
Luke Huang70070852019-11-25 18:25:50 +0800192 // GTEST assertion macros are not invoked for generating a test failure in the death
193 // recipient because the macros can't indicate failed test if Netd died between tests.
194 // Moreover, continuing testing may have no meaningful after Netd death. Therefore, the
195 // death recipient aborts process by GTEST_LOG_(FATAL) once Netd died.
Luke Huangf8215372019-11-22 11:53:41 +0800196 sResolvDeathRecipient = AIBinder_DeathRecipient_new([](void*) {
197 constexpr char errorMessage[] = "Netd died";
198 LOG(ERROR) << errorMessage;
199 GTEST_LOG_(FATAL) << errorMessage;
200 });
201 ASSERT_EQ(STATUS_OK, AIBinder_linkToDeath(binder, sResolvDeathRecipient, nullptr));
Hungming Chen5bf09772019-04-25 11:16:13 +0800202
203 // Subscribe the DNS listener for verifying DNS metrics event contents.
Luke Huangf8215372019-11-22 11:53:41 +0800204 sDnsMetricsListener = ndk::SharedRefBase::make<DnsMetricsListener>(
205 TEST_NETID /*monitor specific network*/);
Hungming Chen5bf09772019-04-25 11:16:13 +0800206 ASSERT_TRUE(resolvService->registerEventListener(sDnsMetricsListener).isOk());
207
208 // Start the binder thread pool for listening DNS metrics events and receiving death
209 // recipient.
Luke Huangf8215372019-11-22 11:53:41 +0800210 ABinderProcess_startThreadPool();
Hungming Chene8f970c2019-04-10 17:34:06 +0800211 }
Hungming Chen473c4de2020-03-12 11:13:35 +0800212 static void TearDownTestSuite() { AIBinder_DeathRecipient_delete(sResolvDeathRecipient); }
Hungming Chene8f970c2019-04-10 17:34:06 +0800213
Ken Chenb9fa2062018-11-13 21:51:13 +0800214 protected:
Lorenzo Colitti61f796b2020-05-21 00:57:49 +0900215 void SetUp() {
216 mDnsClient.SetUp();
217 sDnsMetricsListener->reset();
218 }
219
Mike Yu960243d2020-01-17 19:02:15 +0800220 void TearDown() {
221 // Ensure the dump works at the end of each test.
222 DumpResolverService();
223
224 mDnsClient.TearDown();
225 }
nuccachena26cc2a2018-07-17 18:07:23 +0800226
Luke Huangf40df9c2020-04-21 08:51:48 +0800227 void resetNetwork() {
228 mDnsClient.TearDown();
229 mDnsClient.SetupOemNetwork();
230 }
231
Xiao Ma09b71022018-12-11 17:56:32 +0900232 void StartDns(test::DNSResponder& dns, const std::vector<DnsRecord>& records) {
233 for (const auto& r : records) {
234 dns.addMapping(r.host_name, r.type, r.addr);
235 }
236
237 ASSERT_TRUE(dns.startServer());
238 dns.clearQueries();
239 }
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900240
Mike Yu960243d2020-01-17 19:02:15 +0800241 void DumpResolverService() {
242 unique_fd fd(open("/dev/null", O_WRONLY));
243 EXPECT_EQ(mDnsClient.resolvService()->dump(fd, nullptr, 0), 0);
244
245 const char* querylogCmd[] = {"querylog"}; // Keep it sync with DnsQueryLog::DUMP_KEYWORD.
246 EXPECT_EQ(mDnsClient.resolvService()->dump(fd, querylogCmd, std::size(querylogCmd)), 0);
247 }
248
Hungming Chene8f970c2019-04-10 17:34:06 +0800249 bool WaitForNat64Prefix(ExpectNat64PrefixStatus status,
250 std::chrono::milliseconds timeout = std::chrono::milliseconds(1000)) {
Hungming Chen5bf09772019-04-25 11:16:13 +0800251 return sDnsMetricsListener->waitForNat64Prefix(status, timeout);
Hungming Chene8f970c2019-04-10 17:34:06 +0800252 }
253
Mike Yu724f77d2019-08-16 11:14:50 +0800254 bool WaitForPrivateDnsValidation(std::string serverAddr, bool validated) {
255 return sDnsMetricsListener->waitForPrivateDnsValidation(serverAddr, validated);
256 }
257
Mike Yu153b5b82020-03-04 19:53:54 +0800258 bool hasUncaughtPrivateDnsValidation(const std::string& serverAddr) {
259 return sDnsMetricsListener->findValidationRecord(serverAddr);
260 }
261
Mike Yu532405f2020-06-17 17:46:44 +0800262 void ExpectDnsEvent(int32_t eventType, int32_t returnCode, const std::string& hostname,
263 const std::vector<std::string>& ipAddresses) {
264 const DnsMetricsListener::DnsEvent expect = {
265 TEST_NETID, eventType, returnCode,
266 hostname, ipAddresses, static_cast<int32_t>(ipAddresses.size())};
Mike Yub8faac42020-06-20 11:11:44 +0800267 do {
268 // Blocking call until timeout.
269 const auto dnsEvent = sDnsMetricsListener->popDnsEvent();
270 ASSERT_TRUE(dnsEvent.has_value()) << "Expected DnsEvent " << expect;
271 if (dnsEvent.value() == expect) break;
272 LOG(INFO) << "Skip unexpected DnsEvent: " << dnsEvent.value();
273 } while (true);
Mike Yu532405f2020-06-17 17:46:44 +0800274 }
275
Mike Yu61d17262020-02-15 18:56:22 +0800276 enum class StatsCmp { LE, EQ };
277
278 bool expectStatsNotGreaterThan(const std::vector<NameserverStats>& nameserversStats) {
279 return expectStatsFromGetResolverInfo(nameserversStats, StatsCmp::LE);
280 }
281
282 bool expectStatsEqualTo(const std::vector<NameserverStats>& nameserversStats) {
283 return expectStatsFromGetResolverInfo(nameserversStats, StatsCmp::EQ);
284 }
285
286 bool expectStatsFromGetResolverInfo(const std::vector<NameserverStats>& nameserversStats,
287 const StatsCmp cmp) {
Mike Yue2162e52020-03-04 18:43:46 +0800288 std::vector<std::string> res_servers;
289 std::vector<std::string> res_domains;
290 std::vector<std::string> res_tls_servers;
291 res_params res_params;
292 std::vector<ResolverStats> res_stats;
293 int wait_for_pending_req_timeout_count;
294
295 if (!DnsResponderClient::GetResolverInfo(mDnsClient.resolvService(), TEST_NETID,
296 &res_servers, &res_domains, &res_tls_servers,
297 &res_params, &res_stats,
298 &wait_for_pending_req_timeout_count)) {
299 ADD_FAILURE() << "GetResolverInfo failed";
300 return false;
301 }
302
303 if (res_servers.size() != res_stats.size()) {
304 ADD_FAILURE() << fmt::format("res_servers.size() != res_stats.size(): {} != {}",
305 res_servers.size(), res_stats.size());
306 return false;
307 }
308 if (res_servers.size() != nameserversStats.size()) {
309 ADD_FAILURE() << fmt::format("res_servers.size() != nameserversStats.size(): {} != {}",
310 res_servers.size(), nameserversStats.size());
311 return false;
312 }
313
314 for (const auto& stats : nameserversStats) {
315 SCOPED_TRACE(stats.server);
316 const auto it = std::find(res_servers.begin(), res_servers.end(), stats.server);
317 if (it == res_servers.end()) {
318 ADD_FAILURE() << fmt::format("nameserver {} not found in the list {{{}}}",
319 stats.server, fmt::join(res_servers, ", "));
320 return false;
321 }
322 const int index = std::distance(res_servers.begin(), it);
323
324 // The check excludes rtt_avg, last_sample_time, and usable since they will be obsolete
325 // after |res_stats| is retrieved from NetConfig.dnsStats rather than NetConfig.nsstats.
Mike Yu61d17262020-02-15 18:56:22 +0800326 switch (cmp) {
327 case StatsCmp::EQ:
328 EXPECT_EQ(res_stats[index].successes, stats.successes);
329 EXPECT_EQ(res_stats[index].errors, stats.errors);
330 EXPECT_EQ(res_stats[index].timeouts, stats.timeouts);
331 EXPECT_EQ(res_stats[index].internal_errors, stats.internal_errors);
332 break;
333 case StatsCmp::LE:
334 EXPECT_LE(res_stats[index].successes, stats.successes);
335 EXPECT_LE(res_stats[index].errors, stats.errors);
336 EXPECT_LE(res_stats[index].timeouts, stats.timeouts);
337 EXPECT_LE(res_stats[index].internal_errors, stats.internal_errors);
338 break;
339 default:
340 ADD_FAILURE() << "Unknown comparator " << static_cast<int>(cmp);
341 return false;
342 }
Mike Yue2162e52020-03-04 18:43:46 +0800343 }
344
345 return true;
346 }
347
Mike Yu153b5b82020-03-04 19:53:54 +0800348 // Since there's no way to terminate private DNS validation threads at any time. Tests that
349 // focus on the results of private DNS validation can interfere with each other if they use the
350 // same IP address for test servers. getUniqueIPv4Address() is a workaround to reduce the
351 // possibility of tests being flaky. A feasible solution is to forbid the validation threads,
352 // which are considered as outdated (e.g. switch the resolver to private DNS OFF mode), updating
353 // the result to the PrivateDnsConfiguration instance.
354 static std::string getUniqueIPv4Address() {
355 static int counter = 0;
356 return fmt::format("127.0.100.{}", (++counter & 0xff));
357 }
358
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900359 DnsResponderClient mDnsClient;
Xiao Ma09b71022018-12-11 17:56:32 +0900360
Hungming Chen5bf09772019-04-25 11:16:13 +0800361 // Use a shared static DNS listener for all tests to avoid registering lots of listeners
362 // which may be released late until process terminated. Currently, registered DNS listener
363 // is removed by binder death notification which is fired when the process hosting an
364 // IBinder has gone away. If every test in ResolverTest registers its DNS listener, Netd
365 // may temporarily hold lots of dead listeners until the unit test process terminates.
366 // TODO: Perhaps add an unregistering listener binder call or fork a listener process which
367 // could be terminated earlier.
Luke Huangf8215372019-11-22 11:53:41 +0800368 static std::shared_ptr<DnsMetricsListener>
Hungming Chen473c4de2020-03-12 11:13:35 +0800369 sDnsMetricsListener; // Initialized in SetUpTestSuite.
Hungming Chen5bf09772019-04-25 11:16:13 +0800370
371 // Use a shared static death recipient to monitor the service death. The static death
372 // recipient could monitor the death not only during the test but also between tests.
Hungming Chen473c4de2020-03-12 11:13:35 +0800373 static AIBinder_DeathRecipient* sResolvDeathRecipient; // Initialized in SetUpTestSuite.
Ken Chen753443a2020-11-09 20:52:01 +0800374
375 // The linked AIBinder_DeathRecipient will be automatically unlinked if the binder is deleted.
376 // The binder needs to be retained throughout tests.
377 static ndk::SpAIBinder sResolvBinder;
Ken Chenb9fa2062018-11-13 21:51:13 +0800378};
379
Hungming Chen5bf09772019-04-25 11:16:13 +0800380// Initialize static member of class.
Luke Huangf8215372019-11-22 11:53:41 +0800381std::shared_ptr<DnsMetricsListener> ResolverTest::sDnsMetricsListener;
382AIBinder_DeathRecipient* ResolverTest::sResolvDeathRecipient;
Ken Chen753443a2020-11-09 20:52:01 +0800383ndk::SpAIBinder ResolverTest::sResolvBinder;
Hungming Chen5bf09772019-04-25 11:16:13 +0800384
Ken Chenb9fa2062018-11-13 21:51:13 +0800385TEST_F(ResolverTest, GetHostByName) {
Xiao Ma09b71022018-12-11 17:56:32 +0900386 constexpr char nonexistent_host_name[] = "nonexistent.example.com.";
387
388 test::DNSResponder dns;
389 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.3"}});
390 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800391
392 const hostent* result;
Ken Chenb9fa2062018-11-13 21:51:13 +0800393 result = gethostbyname("nonexistent");
394 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, nonexistent_host_name));
395 ASSERT_TRUE(result == nullptr);
396 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
397
398 dns.clearQueries();
399 result = gethostbyname("hello");
Xiao Ma09b71022018-12-11 17:56:32 +0900400 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
Ken Chenb9fa2062018-11-13 21:51:13 +0800401 ASSERT_FALSE(result == nullptr);
402 ASSERT_EQ(4, result->h_length);
403 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
404 EXPECT_EQ("1.2.3.3", ToString(result));
405 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800406}
407
lifr4e4a2e02019-01-29 16:53:51 +0800408TEST_F(ResolverTest, GetHostByName_cnames) {
409 constexpr char host_name[] = "host.example.com.";
410 size_t cnamecount = 0;
411 test::DNSResponder dns;
412
413 const std::vector<DnsRecord> records = {
414 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
415 {"a.example.com.", ns_type::ns_t_cname, "b.example.com."},
416 {"b.example.com.", ns_type::ns_t_cname, "c.example.com."},
417 {"c.example.com.", ns_type::ns_t_cname, "d.example.com."},
418 {"d.example.com.", ns_type::ns_t_cname, "e.example.com."},
419 {"e.example.com.", ns_type::ns_t_cname, host_name},
420 {host_name, ns_type::ns_t_a, "1.2.3.3"},
421 {host_name, ns_type::ns_t_aaaa, "2001:db8::42"},
422 };
423 StartDns(dns, records);
424 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
425
426 // using gethostbyname2() to resolve ipv4 hello.example.com. to 1.2.3.3
427 // Ensure the v4 address and cnames are correct
428 const hostent* result;
429 result = gethostbyname2("hello", AF_INET);
430 ASSERT_FALSE(result == nullptr);
431
432 for (int i = 0; result != nullptr && result->h_aliases[i] != nullptr; i++) {
433 std::string domain_name = records[i].host_name.substr(0, records[i].host_name.size() - 1);
434 EXPECT_EQ(result->h_aliases[i], domain_name);
435 cnamecount++;
436 }
437 // The size of "Non-cname type" record in DNS records is 2
438 ASSERT_EQ(cnamecount, records.size() - 2);
439 ASSERT_EQ(4, result->h_length);
440 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
441 EXPECT_EQ("1.2.3.3", ToString(result));
442 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
443 EXPECT_EQ(1U, dns.queries().size()) << dns.dumpQueries();
444
445 // using gethostbyname2() to resolve ipv6 hello.example.com. to 2001:db8::42
446 // Ensure the v6 address and cnames are correct
447 cnamecount = 0;
448 dns.clearQueries();
449 result = gethostbyname2("hello", AF_INET6);
450 for (unsigned i = 0; result != nullptr && result->h_aliases[i] != nullptr; i++) {
451 std::string domain_name = records[i].host_name.substr(0, records[i].host_name.size() - 1);
452 EXPECT_EQ(result->h_aliases[i], domain_name);
453 cnamecount++;
454 }
455 // The size of "Non-cname type" DNS record in records is 2
456 ASSERT_EQ(cnamecount, records.size() - 2);
457 ASSERT_FALSE(result == nullptr);
458 ASSERT_EQ(16, result->h_length);
459 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
460 EXPECT_EQ("2001:db8::42", ToString(result));
461 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
462}
463
464TEST_F(ResolverTest, GetHostByName_cnamesInfiniteLoop) {
465 test::DNSResponder dns;
466 const std::vector<DnsRecord> records = {
467 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
468 {"a.example.com.", ns_type::ns_t_cname, kHelloExampleCom},
469 };
470 StartDns(dns, records);
471 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
472
473 const hostent* result;
474 result = gethostbyname2("hello", AF_INET);
475 ASSERT_TRUE(result == nullptr);
476
477 dns.clearQueries();
478 result = gethostbyname2("hello", AF_INET6);
479 ASSERT_TRUE(result == nullptr);
480}
481
Ken Chenb9fa2062018-11-13 21:51:13 +0800482TEST_F(ResolverTest, GetHostByName_localhost) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800483 constexpr char name_camelcase[] = "LocalHost";
Ken Chenb9fa2062018-11-13 21:51:13 +0800484 constexpr char name_ip6_dot[] = "ip6-localhost.";
485 constexpr char name_ip6_fqdn[] = "ip6-localhost.example.com.";
486
markchien96b09e22020-07-29 14:24:34 +0800487 // Add a no-op nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900488 test::DNSResponder dns;
489 StartDns(dns, {});
490 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800491
492 // Expect no DNS queries; localhost is resolved via /etc/hosts
Xiao Ma09b71022018-12-11 17:56:32 +0900493 const hostent* result = gethostbyname(kLocalHost);
Ken Chenb9fa2062018-11-13 21:51:13 +0800494 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
495 ASSERT_FALSE(result == nullptr);
496 ASSERT_EQ(4, result->h_length);
497 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900498 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800499 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
500
501 // Ensure the hosts file resolver ignores case of hostnames
502 result = gethostbyname(name_camelcase);
503 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
504 ASSERT_FALSE(result == nullptr);
505 ASSERT_EQ(4, result->h_length);
506 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900507 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800508 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
509
510 // The hosts file also contains ip6-localhost, but gethostbyname() won't
chenbruce018fdb22019-06-12 18:08:04 +0800511 // return it. This would be easy to
Ken Chenb9fa2062018-11-13 21:51:13 +0800512 // change, but there's no point in changing the legacy behavior; new code
513 // should be calling getaddrinfo() anyway.
514 // So we check the legacy behavior, which results in amusing A-record
515 // lookups for ip6-localhost, with and without search domains appended.
516 dns.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900517 result = gethostbyname(kIp6LocalHost);
Sehee Parkbbca0202018-11-16 10:53:16 +0900518 EXPECT_EQ(2U, dns.queries().size()) << dns.dumpQueries();
519 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, name_ip6_dot)) << dns.dumpQueries();
520 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, name_ip6_fqdn)) << dns.dumpQueries();
Ken Chenb9fa2062018-11-13 21:51:13 +0800521 ASSERT_TRUE(result == nullptr);
522
523 // Finally, use gethostbyname2() to resolve ip6-localhost to ::1 from
524 // the hosts file.
525 dns.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900526 result = gethostbyname2(kIp6LocalHost, AF_INET6);
Ken Chenb9fa2062018-11-13 21:51:13 +0800527 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
528 ASSERT_FALSE(result == nullptr);
529 ASSERT_EQ(16, result->h_length);
530 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900531 EXPECT_EQ(kIp6LocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800532 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800533}
534
535TEST_F(ResolverTest, GetHostByName_numeric) {
markchien96b09e22020-07-29 14:24:34 +0800536 // Add a no-op nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900537 test::DNSResponder dns;
538 StartDns(dns, {});
539 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800540
541 // Numeric v4 address: expect no DNS queries
542 constexpr char numeric_v4[] = "192.168.0.1";
Ken Chenb9fa2062018-11-13 21:51:13 +0800543 const hostent* result = gethostbyname(numeric_v4);
Sehee Parkbbca0202018-11-16 10:53:16 +0900544 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800545 ASSERT_FALSE(result == nullptr);
546 ASSERT_EQ(4, result->h_length); // v4
547 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
548 EXPECT_EQ(numeric_v4, ToString(result));
549 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
550
551 // gethostbyname() recognizes a v6 address, and fails with no DNS queries
552 constexpr char numeric_v6[] = "2001:db8::42";
553 dns.clearQueries();
554 result = gethostbyname(numeric_v6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900555 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800556 EXPECT_TRUE(result == nullptr);
557
558 // Numeric v6 address with gethostbyname2(): succeeds with no DNS queries
559 dns.clearQueries();
560 result = gethostbyname2(numeric_v6, AF_INET6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900561 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800562 ASSERT_FALSE(result == nullptr);
563 ASSERT_EQ(16, result->h_length); // v6
564 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
565 EXPECT_EQ(numeric_v6, ToString(result));
566 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
567
568 // Numeric v6 address with scope work with getaddrinfo(),
569 // but gethostbyname2() does not understand them; it issues two dns
570 // queries, then fails. This hardly ever happens, there's no point
571 // in fixing this. This test simply verifies the current (bogus)
572 // behavior to avoid further regressions (like crashes, or leaks).
573 constexpr char numeric_v6_scope[] = "fe80::1%lo";
574 dns.clearQueries();
575 result = gethostbyname2(numeric_v6_scope, AF_INET6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900576 EXPECT_EQ(2U, dns.queries().size()); // OUCH!
Ken Chenb9fa2062018-11-13 21:51:13 +0800577 ASSERT_TRUE(result == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800578}
579
580TEST_F(ResolverTest, BinderSerialization) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800581 std::vector<int> params_offsets = {
Luke Huang5bd827c2019-03-14 16:10:04 +0800582 IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY,
583 IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD,
584 IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES,
585 IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES,
586 IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC,
587 IDnsResolver::RESOLVER_PARAMS_RETRY_COUNT,
Ken Chenb9fa2062018-11-13 21:51:13 +0800588 };
Bernie Innocentib102dd22018-12-04 14:57:48 +0900589 const int size = static_cast<int>(params_offsets.size());
Luke Huang5bd827c2019-03-14 16:10:04 +0800590 EXPECT_EQ(size, IDnsResolver::RESOLVER_PARAMS_COUNT);
Ken Chenb9fa2062018-11-13 21:51:13 +0800591 std::sort(params_offsets.begin(), params_offsets.end());
Bernie Innocentib102dd22018-12-04 14:57:48 +0900592 for (int i = 0; i < size; ++i) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800593 EXPECT_EQ(params_offsets[i], i);
594 }
595}
596
597TEST_F(ResolverTest, GetHostByName_Binder) {
Luke Huangf8215372019-11-22 11:53:41 +0800598 std::vector<std::string> domains = {"example.com"};
Ken Chenb9fa2062018-11-13 21:51:13 +0800599 std::vector<std::unique_ptr<test::DNSResponder>> dns;
600 std::vector<std::string> servers;
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900601 std::vector<DnsResponderClient::Mapping> mappings;
602 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupMappings(1, domains, &mappings));
603 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupDNSServers(4, mappings, &dns, &servers));
Ken Chenb9fa2062018-11-13 21:51:13 +0800604 ASSERT_EQ(1U, mappings.size());
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900605 const DnsResponderClient::Mapping& mapping = mappings[0];
Ken Chenb9fa2062018-11-13 21:51:13 +0800606
Xiao Ma09b71022018-12-11 17:56:32 +0900607 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains, kDefaultParams));
Ken Chenb9fa2062018-11-13 21:51:13 +0800608
609 const hostent* result = gethostbyname(mapping.host.c_str());
Bernie Innocentib102dd22018-12-04 14:57:48 +0900610 const size_t total_queries =
Luke Huangfde82482019-06-04 01:04:53 +0800611 std::accumulate(dns.begin(), dns.end(), 0, [&mapping](size_t total, auto& d) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800612 return total + GetNumQueriesForType(*d, ns_type::ns_t_a, mapping.entry.c_str());
613 });
614
615 EXPECT_LE(1U, total_queries);
616 ASSERT_FALSE(result == nullptr);
617 ASSERT_EQ(4, result->h_length);
618 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
619 EXPECT_EQ(mapping.ip4, ToString(result));
620 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
621
622 std::vector<std::string> res_servers;
623 std::vector<std::string> res_domains;
Mike Yu0a1c53d2018-11-26 13:26:21 +0900624 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +0900625 res_params res_params;
Ken Chenb9fa2062018-11-13 21:51:13 +0800626 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +0800627 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +0800628 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
629 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
630 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chenb9fa2062018-11-13 21:51:13 +0800631 EXPECT_EQ(servers.size(), res_servers.size());
632 EXPECT_EQ(domains.size(), res_domains.size());
Mike Yu0a1c53d2018-11-26 13:26:21 +0900633 EXPECT_EQ(0U, res_tls_servers.size());
Luke Huang5bd827c2019-03-14 16:10:04 +0800634 ASSERT_EQ(static_cast<size_t>(IDnsResolver::RESOLVER_PARAMS_COUNT), kDefaultParams.size());
635 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY],
636 res_params.sample_validity);
637 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900638 res_params.success_threshold);
Luke Huang5bd827c2019-03-14 16:10:04 +0800639 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
640 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
641 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
Ken Chenb9fa2062018-11-13 21:51:13 +0800642 res_params.base_timeout_msec);
643 EXPECT_EQ(servers.size(), res_stats.size());
644
Bernie Innocenti0c067e42019-04-01 15:33:16 +0900645 EXPECT_THAT(res_servers, testing::UnorderedElementsAreArray(servers));
646 EXPECT_THAT(res_domains, testing::UnorderedElementsAreArray(domains));
Ken Chenb9fa2062018-11-13 21:51:13 +0800647}
648
649TEST_F(ResolverTest, GetAddrInfo) {
Xiao Ma09b71022018-12-11 17:56:32 +0900650 constexpr char listen_addr[] = "127.0.0.4";
651 constexpr char listen_addr2[] = "127.0.0.5";
652 constexpr char host_name[] = "howdy.example.com.";
Ken Chenb9fa2062018-11-13 21:51:13 +0800653
Xiao Ma09b71022018-12-11 17:56:32 +0900654 const std::vector<DnsRecord> records = {
655 {host_name, ns_type::ns_t_a, "1.2.3.4"},
656 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
657 };
658 test::DNSResponder dns(listen_addr);
659 test::DNSResponder dns2(listen_addr2);
660 StartDns(dns, records);
661 StartDns(dns2, records);
Ken Chenb9fa2062018-11-13 21:51:13 +0800662
Xiao Ma09b71022018-12-11 17:56:32 +0900663 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}));
Ken Chenb9fa2062018-11-13 21:51:13 +0800664 dns.clearQueries();
665 dns2.clearQueries();
666
667 ScopedAddrinfo result = safe_getaddrinfo("howdy", nullptr, nullptr);
668 EXPECT_TRUE(result != nullptr);
669 size_t found = GetNumQueries(dns, host_name);
670 EXPECT_LE(1U, found);
671 // Could be A or AAAA
672 std::string result_str = ToString(result);
673 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +0800674 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +0800675
676 // Verify that the name is cached.
677 size_t old_found = found;
678 result = safe_getaddrinfo("howdy", nullptr, nullptr);
679 EXPECT_TRUE(result != nullptr);
680 found = GetNumQueries(dns, host_name);
681 EXPECT_LE(1U, found);
682 EXPECT_EQ(old_found, found);
683 result_str = ToString(result);
Luke Huangf8215372019-11-22 11:53:41 +0800684 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4") << result_str;
Ken Chenb9fa2062018-11-13 21:51:13 +0800685
686 // Change the DNS resolver, ensure that queries are still cached.
Xiao Ma09b71022018-12-11 17:56:32 +0900687 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr2}));
Ken Chenb9fa2062018-11-13 21:51:13 +0800688 dns.clearQueries();
689 dns2.clearQueries();
690
691 result = safe_getaddrinfo("howdy", nullptr, nullptr);
692 EXPECT_TRUE(result != nullptr);
693 found = GetNumQueries(dns, host_name);
694 size_t found2 = GetNumQueries(dns2, host_name);
695 EXPECT_EQ(0U, found);
696 EXPECT_LE(0U, found2);
697
698 // Could be A or AAAA
699 result_str = ToString(result);
700 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +0800701 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +0800702}
703
704TEST_F(ResolverTest, GetAddrInfoV4) {
Xiao Ma09b71022018-12-11 17:56:32 +0900705 test::DNSResponder dns;
706 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.5"}});
707 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800708
Xiao Ma09b71022018-12-11 17:56:32 +0900709 const addrinfo hints = {.ai_family = AF_INET};
710 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
Ken Chenb9fa2062018-11-13 21:51:13 +0800711 EXPECT_TRUE(result != nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900712 EXPECT_EQ(1U, GetNumQueries(dns, kHelloExampleCom));
Ken Chenb9fa2062018-11-13 21:51:13 +0800713 EXPECT_EQ("1.2.3.5", ToString(result));
714}
715
716TEST_F(ResolverTest, GetAddrInfo_localhost) {
markchien96b09e22020-07-29 14:24:34 +0800717 // Add a no-op nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900718 test::DNSResponder dns;
719 StartDns(dns, {});
720 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800721
Xiao Ma09b71022018-12-11 17:56:32 +0900722 ScopedAddrinfo result = safe_getaddrinfo(kLocalHost, nullptr, nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800723 EXPECT_TRUE(result != nullptr);
724 // Expect no DNS queries; localhost is resolved via /etc/hosts
725 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900726 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800727
Xiao Ma09b71022018-12-11 17:56:32 +0900728 result = safe_getaddrinfo(kIp6LocalHost, nullptr, nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800729 EXPECT_TRUE(result != nullptr);
730 // Expect no DNS queries; ip6-localhost is resolved via /etc/hosts
731 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900732 EXPECT_EQ(kIp6LocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800733}
734
Luke Huangd8ac4752019-06-18 17:05:47 +0800735TEST_F(ResolverTest, GetAddrInfo_InvalidSocketType) {
736 test::DNSResponder dns;
737 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.5"}});
738 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
739
740 // TODO: Test other invalid socket types.
741 const addrinfo hints = {
742 .ai_family = AF_UNSPEC,
Luke Huangd8ac4752019-06-18 17:05:47 +0800743 .ai_socktype = SOCK_PACKET,
744 };
745 addrinfo* result = nullptr;
746 // This is a valid hint, but the query won't be sent because the socket type is
747 // not supported.
748 EXPECT_EQ(EAI_NODATA, getaddrinfo("hello", nullptr, &hints, &result));
749 ScopedAddrinfo result_cleanup(result);
750 EXPECT_EQ(nullptr, result);
751}
752
Ken Chen92bed612018-12-22 21:46:55 +0800753// Verify if the resolver correctly handle multiple queries simultaneously
754// step 1: set dns server#1 into deferred responding mode.
755// step 2: thread#1 query "hello.example.com." --> resolver send query to server#1.
756// step 3: thread#2 query "hello.example.com." --> resolver hold the request and wait for
757// response of previous pending query sent by thread#1.
758// step 4: thread#3 query "konbanha.example.com." --> resolver send query to server#3. Server
759// respond to resolver immediately.
760// step 5: check if server#1 get 1 query by thread#1, server#2 get 0 query, server#3 get 1 query.
761// step 6: resume dns server#1 to respond dns query in step#2.
762// step 7: thread#1 and #2 should get returned from DNS query after step#6. Also, check the
763// number of queries in server#2 is 0 to ensure thread#2 does not wake up unexpectedly
764// before signaled by thread#1.
765TEST_F(ResolverTest, GetAddrInfoV4_deferred_resp) {
766 const char* listen_addr1 = "127.0.0.9";
767 const char* listen_addr2 = "127.0.0.10";
768 const char* listen_addr3 = "127.0.0.11";
769 const char* listen_srv = "53";
770 const char* host_name_deferred = "hello.example.com.";
771 const char* host_name_normal = "konbanha.example.com.";
Mike Yufc125e42019-05-15 20:41:28 +0800772 test::DNSResponder dns1(listen_addr1, listen_srv, ns_rcode::ns_r_servfail);
773 test::DNSResponder dns2(listen_addr2, listen_srv, ns_rcode::ns_r_servfail);
774 test::DNSResponder dns3(listen_addr3, listen_srv, ns_rcode::ns_r_servfail);
Ken Chen92bed612018-12-22 21:46:55 +0800775 dns1.addMapping(host_name_deferred, ns_type::ns_t_a, "1.2.3.4");
776 dns2.addMapping(host_name_deferred, ns_type::ns_t_a, "1.2.3.4");
777 dns3.addMapping(host_name_normal, ns_type::ns_t_a, "1.2.3.5");
778 ASSERT_TRUE(dns1.startServer());
779 ASSERT_TRUE(dns2.startServer());
780 ASSERT_TRUE(dns3.startServer());
781 const std::vector<std::string> servers_for_t1 = {listen_addr1};
782 const std::vector<std::string> servers_for_t2 = {listen_addr2};
783 const std::vector<std::string> servers_for_t3 = {listen_addr3};
784 addrinfo hints = {.ai_family = AF_INET};
785 const std::vector<int> params = {300, 25, 8, 8, 5000};
786 bool t3_task_done = false;
787
788 dns1.setDeferredResp(true);
789 std::thread t1([&, this]() {
790 ASSERT_TRUE(
791 mDnsClient.SetResolversForNetwork(servers_for_t1, kDefaultSearchDomains, params));
792 ScopedAddrinfo result = safe_getaddrinfo(host_name_deferred, nullptr, &hints);
793 // t3's dns query should got returned first
794 EXPECT_TRUE(t3_task_done);
795 EXPECT_EQ(1U, GetNumQueries(dns1, host_name_deferred));
796 EXPECT_TRUE(result != nullptr);
797 EXPECT_EQ("1.2.3.4", ToString(result));
798 });
799
800 // ensuring t1 and t2 handler functions are processed in order
801 usleep(100 * 1000);
802 std::thread t2([&, this]() {
803 ASSERT_TRUE(
804 mDnsClient.SetResolversForNetwork(servers_for_t2, kDefaultSearchDomains, params));
805 ScopedAddrinfo result = safe_getaddrinfo(host_name_deferred, nullptr, &hints);
806 EXPECT_TRUE(t3_task_done);
807 EXPECT_EQ(0U, GetNumQueries(dns2, host_name_deferred));
808 EXPECT_TRUE(result != nullptr);
809 EXPECT_EQ("1.2.3.4", ToString(result));
810
811 std::vector<std::string> res_servers;
812 std::vector<std::string> res_domains;
813 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +0900814 res_params res_params;
Ken Chen92bed612018-12-22 21:46:55 +0800815 std::vector<ResolverStats> res_stats;
816 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +0800817 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
818 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains,
819 &res_tls_servers, &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chen92bed612018-12-22 21:46:55 +0800820 EXPECT_EQ(0, wait_for_pending_req_timeout_count);
821 });
822
823 // ensuring t2 and t3 handler functions are processed in order
824 usleep(100 * 1000);
825 std::thread t3([&, this]() {
826 ASSERT_TRUE(
827 mDnsClient.SetResolversForNetwork(servers_for_t3, kDefaultSearchDomains, params));
828 ScopedAddrinfo result = safe_getaddrinfo(host_name_normal, nullptr, &hints);
829 EXPECT_EQ(1U, GetNumQueries(dns1, host_name_deferred));
830 EXPECT_EQ(0U, GetNumQueries(dns2, host_name_deferred));
831 EXPECT_EQ(1U, GetNumQueries(dns3, host_name_normal));
832 EXPECT_TRUE(result != nullptr);
833 EXPECT_EQ("1.2.3.5", ToString(result));
834
835 t3_task_done = true;
836 dns1.setDeferredResp(false);
837 });
838 t3.join();
839 t1.join();
840 t2.join();
841}
842
lifr4e4a2e02019-01-29 16:53:51 +0800843TEST_F(ResolverTest, GetAddrInfo_cnames) {
844 constexpr char host_name[] = "host.example.com.";
845 test::DNSResponder dns;
846 const std::vector<DnsRecord> records = {
847 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
848 {"a.example.com.", ns_type::ns_t_cname, "b.example.com."},
849 {"b.example.com.", ns_type::ns_t_cname, "c.example.com."},
850 {"c.example.com.", ns_type::ns_t_cname, "d.example.com."},
851 {"d.example.com.", ns_type::ns_t_cname, "e.example.com."},
852 {"e.example.com.", ns_type::ns_t_cname, host_name},
853 {host_name, ns_type::ns_t_a, "1.2.3.3"},
854 {host_name, ns_type::ns_t_aaaa, "2001:db8::42"},
855 };
856 StartDns(dns, records);
857 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
858
859 addrinfo hints = {.ai_family = AF_INET};
860 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
861 EXPECT_TRUE(result != nullptr);
862 EXPECT_EQ("1.2.3.3", ToString(result));
863
864 dns.clearQueries();
865 hints = {.ai_family = AF_INET6};
866 result = safe_getaddrinfo("hello", nullptr, &hints);
867 EXPECT_TRUE(result != nullptr);
868 EXPECT_EQ("2001:db8::42", ToString(result));
869}
870
871TEST_F(ResolverTest, GetAddrInfo_cnamesNoIpAddress) {
872 test::DNSResponder dns;
873 const std::vector<DnsRecord> records = {
874 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
875 };
876 StartDns(dns, records);
877 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
878
879 addrinfo hints = {.ai_family = AF_INET};
880 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
881 EXPECT_TRUE(result == nullptr);
882
883 dns.clearQueries();
884 hints = {.ai_family = AF_INET6};
885 result = safe_getaddrinfo("hello", nullptr, &hints);
886 EXPECT_TRUE(result == nullptr);
887}
888
889TEST_F(ResolverTest, GetAddrInfo_cnamesIllegalRdata) {
890 test::DNSResponder dns;
891 const std::vector<DnsRecord> records = {
892 {kHelloExampleCom, ns_type::ns_t_cname, ".!#?"},
893 };
894 StartDns(dns, records);
895 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
896
897 addrinfo hints = {.ai_family = AF_INET};
898 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
899 EXPECT_TRUE(result == nullptr);
900
901 dns.clearQueries();
902 hints = {.ai_family = AF_INET6};
903 result = safe_getaddrinfo("hello", nullptr, &hints);
904 EXPECT_TRUE(result == nullptr);
905}
906
Pabba Prakash66707822020-01-08 15:34:58 +0530907TEST_F(ResolverTest, GetAddrInfoForCaseInSensitiveDomains) {
908 test::DNSResponder dns;
909 const char* host_name = "howdy.example.com.";
910 const char* host_name2 = "HOWDY.example.com.";
911 const std::vector<DnsRecord> records = {
912 {host_name, ns_type::ns_t_a, "1.2.3.4"},
913 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
914 {host_name2, ns_type::ns_t_a, "1.2.3.5"},
915 {host_name2, ns_type::ns_t_aaaa, "::1.2.3.5"},
916 };
917 StartDns(dns, records);
918 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
919
920 ScopedAddrinfo hostname_result = safe_getaddrinfo("howdy", nullptr, nullptr);
921 EXPECT_TRUE(hostname_result != nullptr);
922 const size_t hostname1_count_after_first_query = GetNumQueries(dns, host_name);
923 EXPECT_LE(1U, hostname1_count_after_first_query);
924 // Could be A or AAAA
925 std::string hostname_result_str = ToString(hostname_result);
926 EXPECT_TRUE(hostname_result_str == "1.2.3.4" || hostname_result_str == "::1.2.3.4");
927
928 // Verify that the name is cached.
929 ScopedAddrinfo hostname2_result = safe_getaddrinfo("HOWDY", nullptr, nullptr);
930 EXPECT_TRUE(hostname2_result != nullptr);
931 const size_t hostname1_count_after_second_query = GetNumQueries(dns, host_name);
932 EXPECT_LE(1U, hostname1_count_after_second_query);
933
934 // verify that there is no change in num of queries for howdy.example.com
935 EXPECT_EQ(hostname1_count_after_first_query, hostname1_count_after_second_query);
936
937 // Number of queries for HOWDY.example.com would be >= 1 if domain names
938 // are considered case-sensitive, else number of queries should be 0.
939 const size_t hostname2_count = GetNumQueries(dns, host_name2);
940 EXPECT_EQ(0U,hostname2_count);
941 std::string hostname2_result_str = ToString(hostname2_result);
942 EXPECT_TRUE(hostname2_result_str == "1.2.3.4" || hostname2_result_str == "::1.2.3.4");
943
944 // verify that the result is still the same address even though
945 // mixed-case string is not in the DNS
946 ScopedAddrinfo result = safe_getaddrinfo("HowDY", nullptr, nullptr);
947 EXPECT_TRUE(result != nullptr);
948 std::string result_str = ToString(result);
949 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4");
950}
951
Ken Chenb9fa2062018-11-13 21:51:13 +0800952TEST_F(ResolverTest, MultidomainResolution) {
Xiao Ma09b71022018-12-11 17:56:32 +0900953 constexpr char host_name[] = "nihao.example2.com.";
Luke Huangf8215372019-11-22 11:53:41 +0800954 std::vector<std::string> searchDomains = {"example1.com", "example2.com", "example3.com"};
Ken Chenb9fa2062018-11-13 21:51:13 +0800955
Xiao Ma09b71022018-12-11 17:56:32 +0900956 test::DNSResponder dns("127.0.0.6");
957 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.3"}});
958 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({"127.0.0.6"}, searchDomains));
959
Ken Chenb9fa2062018-11-13 21:51:13 +0800960 const hostent* result = gethostbyname("nihao");
Xiao Ma09b71022018-12-11 17:56:32 +0900961
Ken Chenb9fa2062018-11-13 21:51:13 +0800962 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
963 ASSERT_FALSE(result == nullptr);
964 ASSERT_EQ(4, result->h_length);
965 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
966 EXPECT_EQ("1.2.3.3", ToString(result));
967 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800968}
969
970TEST_F(ResolverTest, GetAddrInfoV6_numeric) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800971 constexpr char host_name[] = "ohayou.example.com.";
972 constexpr char numeric_addr[] = "fe80::1%lo";
973
Xiao Ma09b71022018-12-11 17:56:32 +0900974 test::DNSResponder dns;
Ken Chenb9fa2062018-11-13 21:51:13 +0800975 dns.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900976 StartDns(dns, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
977 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800978
979 addrinfo hints = {.ai_family = AF_INET6};
980 ScopedAddrinfo result = safe_getaddrinfo(numeric_addr, nullptr, &hints);
981 EXPECT_TRUE(result != nullptr);
982 EXPECT_EQ(numeric_addr, ToString(result));
983 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
984
985 // Now try a non-numeric hostname query with the AI_NUMERICHOST flag set.
986 // We should fail without sending out a DNS query.
987 hints.ai_flags |= AI_NUMERICHOST;
988 result = safe_getaddrinfo(host_name, nullptr, &hints);
989 EXPECT_TRUE(result == nullptr);
990 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
991}
992
993TEST_F(ResolverTest, GetAddrInfoV6_failing) {
Xiao Ma09b71022018-12-11 17:56:32 +0900994 constexpr char listen_addr0[] = "127.0.0.7";
995 constexpr char listen_addr1[] = "127.0.0.8";
Ken Chenb9fa2062018-11-13 21:51:13 +0800996 const char* host_name = "ohayou.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +0900997
998 test::DNSResponder dns0(listen_addr0);
999 test::DNSResponder dns1(listen_addr1);
Ken Chenb9fa2062018-11-13 21:51:13 +08001000 dns0.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +09001001 StartDns(dns0, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
1002 StartDns(dns1, {{host_name, ns_type::ns_t_aaaa, "2001:db8::6"}});
1003
Luke Huangf8215372019-11-22 11:53:41 +08001004 std::vector<std::string> servers = {listen_addr0, listen_addr1};
Ken Chenb9fa2062018-11-13 21:51:13 +08001005 // <sample validity in s> <success threshold in percent> <min samples> <max samples>
1006 int sample_count = 8;
Luke Huangf8215372019-11-22 11:53:41 +08001007 const std::vector<int> params = {300, 25, sample_count, sample_count};
Xiao Ma09b71022018-12-11 17:56:32 +09001008 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, kDefaultSearchDomains, params));
Ken Chenb9fa2062018-11-13 21:51:13 +08001009
1010 // Repeatedly perform resolutions for non-existing domains until MAXNSSAMPLES resolutions have
1011 // reached the dns0, which is set to fail. No more requests should then arrive at that server
1012 // for the next sample_lifetime seconds.
1013 // TODO: This approach is implementation-dependent, change once metrics reporting is available.
Xiao Ma09b71022018-12-11 17:56:32 +09001014 const addrinfo hints = {.ai_family = AF_INET6};
Bernie Innocentib102dd22018-12-04 14:57:48 +09001015 for (int i = 0; i < sample_count; ++i) {
Ken Chenb9fa2062018-11-13 21:51:13 +08001016 std::string domain = StringPrintf("nonexistent%d", i);
1017 ScopedAddrinfo result = safe_getaddrinfo(domain.c_str(), nullptr, &hints);
1018 }
1019 // Due to 100% errors for all possible samples, the server should be ignored from now on and
1020 // only the second one used for all following queries, until NSSAMPLE_VALIDITY is reached.
1021 dns0.clearQueries();
1022 dns1.clearQueries();
1023 ScopedAddrinfo result = safe_getaddrinfo("ohayou", nullptr, &hints);
1024 EXPECT_TRUE(result != nullptr);
1025 EXPECT_EQ(0U, GetNumQueries(dns0, host_name));
1026 EXPECT_EQ(1U, GetNumQueries(dns1, host_name));
1027}
1028
1029TEST_F(ResolverTest, GetAddrInfoV6_nonresponsive) {
Xiao Ma09b71022018-12-11 17:56:32 +09001030 constexpr char listen_addr0[] = "127.0.0.7";
1031 constexpr char listen_addr1[] = "127.0.0.8";
1032 constexpr char listen_srv[] = "53";
1033 constexpr char host_name1[] = "ohayou.example.com.";
1034 constexpr char host_name2[] = "ciao.example.com.";
Luke Huang483cf332019-06-03 17:24:51 +08001035 const std::vector<std::string> defaultSearchDomain = {"example.com"};
1036 // The minimal timeout is 1000ms, so we can't decrease timeout
1037 // So reduce retry count.
1038 const std::vector<int> reduceRetryParams = {
1039 300, // sample validity in seconds
1040 25, // success threshod in percent
1041 8, 8, // {MIN,MAX}_SAMPLES
1042 1000, // BASE_TIMEOUT_MSEC
1043 1, // retry count
1044 };
Xiao Ma09b71022018-12-11 17:56:32 +09001045 const std::vector<DnsRecord> records0 = {
1046 {host_name1, ns_type::ns_t_aaaa, "2001:db8::5"},
1047 {host_name2, ns_type::ns_t_aaaa, "2001:db8::5"},
1048 };
1049 const std::vector<DnsRecord> records1 = {
1050 {host_name1, ns_type::ns_t_aaaa, "2001:db8::6"},
1051 {host_name2, ns_type::ns_t_aaaa, "2001:db8::6"},
1052 };
Ken Chenb9fa2062018-11-13 21:51:13 +08001053
1054 // dns0 does not respond with 100% probability, while
1055 // dns1 responds normally, at least initially.
Mike Yufc125e42019-05-15 20:41:28 +08001056 test::DNSResponder dns0(listen_addr0, listen_srv, static_cast<ns_rcode>(-1));
1057 test::DNSResponder dns1(listen_addr1, listen_srv, static_cast<ns_rcode>(-1));
Ken Chenb9fa2062018-11-13 21:51:13 +08001058 dns0.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +09001059 StartDns(dns0, records0);
1060 StartDns(dns1, records1);
Luke Huang483cf332019-06-03 17:24:51 +08001061 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr0, listen_addr1}, defaultSearchDomain,
1062 reduceRetryParams));
Ken Chenb9fa2062018-11-13 21:51:13 +08001063
Luke Huang483cf332019-06-03 17:24:51 +08001064 // Specify ai_socktype to make getaddrinfo will only query 1 time
1065 const addrinfo hints = {.ai_family = AF_INET6, .ai_socktype = SOCK_STREAM};
Ken Chenb9fa2062018-11-13 21:51:13 +08001066
1067 // dns0 will ignore the request, and we'll fallback to dns1 after the first
1068 // retry.
1069 ScopedAddrinfo result = safe_getaddrinfo(host_name1, nullptr, &hints);
1070 EXPECT_TRUE(result != nullptr);
1071 EXPECT_EQ(1U, GetNumQueries(dns0, host_name1));
1072 EXPECT_EQ(1U, GetNumQueries(dns1, host_name1));
Mike Yu532405f2020-06-17 17:46:44 +08001073 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, 0, host_name1, {"2001:db8::6"});
Ken Chenb9fa2062018-11-13 21:51:13 +08001074
1075 // Now make dns1 also ignore 100% requests... The resolve should alternate
Luke Huang483cf332019-06-03 17:24:51 +08001076 // queries between the nameservers and fail
Ken Chenb9fa2062018-11-13 21:51:13 +08001077 dns1.setResponseProbability(0.0);
1078 addrinfo* result2 = nullptr;
1079 EXPECT_EQ(EAI_NODATA, getaddrinfo(host_name2, nullptr, &hints, &result2));
1080 EXPECT_EQ(nullptr, result2);
Luke Huang483cf332019-06-03 17:24:51 +08001081 EXPECT_EQ(1U, GetNumQueries(dns0, host_name2));
1082 EXPECT_EQ(1U, GetNumQueries(dns1, host_name2));
Mike Yu532405f2020-06-17 17:46:44 +08001083 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, RCODE_TIMEOUT, host_name2, {});
Ken Chenb9fa2062018-11-13 21:51:13 +08001084}
1085
1086TEST_F(ResolverTest, GetAddrInfoV6_concurrent) {
Xiao Ma09b71022018-12-11 17:56:32 +09001087 constexpr char listen_addr0[] = "127.0.0.9";
1088 constexpr char listen_addr1[] = "127.0.0.10";
1089 constexpr char listen_addr2[] = "127.0.0.11";
1090 constexpr char host_name[] = "konbanha.example.com.";
1091
1092 test::DNSResponder dns0(listen_addr0);
1093 test::DNSResponder dns1(listen_addr1);
1094 test::DNSResponder dns2(listen_addr2);
1095 StartDns(dns0, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
1096 StartDns(dns1, {{host_name, ns_type::ns_t_aaaa, "2001:db8::6"}});
1097 StartDns(dns2, {{host_name, ns_type::ns_t_aaaa, "2001:db8::7"}});
1098
Luke Huangf8215372019-11-22 11:53:41 +08001099 const std::vector<std::string> servers = {listen_addr0, listen_addr1, listen_addr2};
Ken Chenb9fa2062018-11-13 21:51:13 +08001100 std::vector<std::thread> threads(10);
1101 for (std::thread& thread : threads) {
Luke Huangf8215372019-11-22 11:53:41 +08001102 thread = std::thread([this, &servers]() {
1103 unsigned delay = arc4random_uniform(1 * 1000 * 1000); // <= 1s
Ken Chenb9fa2062018-11-13 21:51:13 +08001104 usleep(delay);
1105 std::vector<std::string> serverSubset;
1106 for (const auto& server : servers) {
1107 if (arc4random_uniform(2)) {
1108 serverSubset.push_back(server);
1109 }
1110 }
1111 if (serverSubset.empty()) serverSubset = servers;
Xiao Ma09b71022018-12-11 17:56:32 +09001112 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(serverSubset));
1113 const addrinfo hints = {.ai_family = AF_INET6};
Ken Chenb9fa2062018-11-13 21:51:13 +08001114 addrinfo* result = nullptr;
1115 int rv = getaddrinfo("konbanha", nullptr, &hints, &result);
1116 EXPECT_EQ(0, rv) << "error [" << rv << "] " << gai_strerror(rv);
1117 if (result) {
1118 freeaddrinfo(result);
1119 result = nullptr;
1120 }
1121 });
1122 }
1123 for (std::thread& thread : threads) {
1124 thread.join();
1125 }
Ken Chen92bed612018-12-22 21:46:55 +08001126
1127 std::vector<std::string> res_servers;
1128 std::vector<std::string> res_domains;
1129 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001130 res_params res_params;
Ken Chen92bed612018-12-22 21:46:55 +08001131 std::vector<ResolverStats> res_stats;
1132 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001133 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1134 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1135 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chen92bed612018-12-22 21:46:55 +08001136 EXPECT_EQ(0, wait_for_pending_req_timeout_count);
Ken Chenb9fa2062018-11-13 21:51:13 +08001137}
1138
Mike Yu8ac63402019-12-02 15:28:38 +08001139TEST_F(ResolverTest, SkipBadServersDueToInternalError) {
1140 constexpr char listen_addr1[] = "fe80::1";
1141 constexpr char listen_addr2[] = "255.255.255.255";
1142 constexpr char listen_addr3[] = "127.0.0.3";
Mike Yu61d17262020-02-15 18:56:22 +08001143 int counter = 0; // To generate unique hostnames.
Mike Yu8ac63402019-12-02 15:28:38 +08001144 test::DNSResponder dns(listen_addr3);
1145 ASSERT_TRUE(dns.startServer());
1146
Mike Yu61d17262020-02-15 18:56:22 +08001147 ResolverParamsParcel setupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1148 setupParams.servers = {listen_addr1, listen_addr2, listen_addr3};
1149 setupParams.minSamples = 2; // Recognize bad servers in two attempts when sorting not enabled.
Mike Yu8ac63402019-12-02 15:28:38 +08001150
Mike Yu61d17262020-02-15 18:56:22 +08001151 ResolverParamsParcel cleanupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1152 cleanupParams.servers.clear();
1153 cleanupParams.tlsServers.clear();
Mike Yu8ac63402019-12-02 15:28:38 +08001154
Mike Yu61d17262020-02-15 18:56:22 +08001155 for (const auto& sortNameserversFlag : {"" /* unset */, "0" /* off */, "1" /* on */}) {
1156 SCOPED_TRACE(fmt::format("sortNameversFlag_{}", sortNameserversFlag));
1157 ScopedSystemProperties scopedSystemProperties(kSortNameserversFlag, sortNameserversFlag);
1158
Mike Yu10832aa2020-08-25 19:13:11 +08001159 // Re-setup test network to make experiment flag take effect.
1160 resetNetwork();
1161
Mike Yu61d17262020-02-15 18:56:22 +08001162 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(setupParams));
1163
1164 // Start sending synchronized querying.
1165 for (int i = 0; i < 100; i++) {
1166 std::string hostName = StringPrintf("hello%d.com.", counter++);
1167 dns.addMapping(hostName, ns_type::ns_t_a, "1.2.3.4");
1168 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1169 EXPECT_TRUE(safe_getaddrinfo(hostName.c_str(), nullptr, &hints) != nullptr);
1170 }
1171
1172 const std::vector<NameserverStats> targetStats = {
1173 NameserverStats(listen_addr1).setInternalErrors(5),
1174 NameserverStats(listen_addr2).setInternalErrors(5),
1175 NameserverStats(listen_addr3).setSuccesses(setupParams.maxSamples),
1176 };
1177 EXPECT_TRUE(expectStatsNotGreaterThan(targetStats));
1178
1179 // Also verify the number of queries received in the server because res_stats.successes has
1180 // a maximum.
1181 EXPECT_EQ(dns.queries().size(), 100U);
1182
1183 // Reset the state.
1184 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(cleanupParams));
1185 dns.clearQueries();
Mike Yu8ac63402019-12-02 15:28:38 +08001186 }
Mike Yu8ac63402019-12-02 15:28:38 +08001187}
1188
1189TEST_F(ResolverTest, SkipBadServersDueToTimeout) {
1190 constexpr char listen_addr1[] = "127.0.0.3";
1191 constexpr char listen_addr2[] = "127.0.0.4";
Mike Yu61d17262020-02-15 18:56:22 +08001192 int counter = 0; // To generate unique hostnames.
1193
1194 ResolverParamsParcel setupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1195 setupParams.servers = {listen_addr1, listen_addr2};
1196 setupParams.minSamples = 2; // Recognize bad servers in two attempts when sorting not enabled.
1197
1198 ResolverParamsParcel cleanupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1199 cleanupParams.servers.clear();
1200 cleanupParams.tlsServers.clear();
Mike Yu8ac63402019-12-02 15:28:38 +08001201
1202 // Set dns1 non-responsive and dns2 workable.
1203 test::DNSResponder dns1(listen_addr1, test::kDefaultListenService, static_cast<ns_rcode>(-1));
1204 test::DNSResponder dns2(listen_addr2);
1205 dns1.setResponseProbability(0.0);
1206 ASSERT_TRUE(dns1.startServer());
1207 ASSERT_TRUE(dns2.startServer());
1208
Mike Yu61d17262020-02-15 18:56:22 +08001209 for (const auto& sortNameserversFlag : {"" /* unset */, "0" /* off */, "1" /* on */}) {
1210 SCOPED_TRACE(fmt::format("sortNameversFlag_{}", sortNameserversFlag));
1211 ScopedSystemProperties scopedSystemProperties(kSortNameserversFlag, sortNameserversFlag);
Mike Yu8ac63402019-12-02 15:28:38 +08001212
Mike Yu10832aa2020-08-25 19:13:11 +08001213 // Re-setup test network to make experiment flag take effect.
1214 resetNetwork();
1215
Mike Yu61d17262020-02-15 18:56:22 +08001216 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(setupParams));
Mike Yu8ac63402019-12-02 15:28:38 +08001217
Mike Yu61d17262020-02-15 18:56:22 +08001218 // Start sending synchronized querying.
1219 for (int i = 0; i < 100; i++) {
1220 std::string hostName = StringPrintf("hello%d.com.", counter++);
1221 dns1.addMapping(hostName, ns_type::ns_t_a, "1.2.3.4");
1222 dns2.addMapping(hostName, ns_type::ns_t_a, "1.2.3.5");
1223 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1224 EXPECT_TRUE(safe_getaddrinfo(hostName.c_str(), nullptr, &hints) != nullptr);
1225 }
1226
1227 const std::vector<NameserverStats> targetStats = {
1228 NameserverStats(listen_addr1).setTimeouts(5),
1229 NameserverStats(listen_addr2).setSuccesses(setupParams.maxSamples),
1230 };
1231 EXPECT_TRUE(expectStatsNotGreaterThan(targetStats));
1232
1233 // Also verify the number of queries received in the server because res_stats.successes has
1234 // an upper bound.
1235 EXPECT_GT(dns1.queries().size(), 0U);
1236 EXPECT_LT(dns1.queries().size(), 5U);
1237 EXPECT_EQ(dns2.queries().size(), 100U);
1238
1239 // Reset the state.
1240 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(cleanupParams));
1241 dns1.clearQueries();
1242 dns2.clearQueries();
Mike Yu8ac63402019-12-02 15:28:38 +08001243 }
Mike Yu8ac63402019-12-02 15:28:38 +08001244}
1245
chenbrucefd837fa2019-10-29 18:35:36 +08001246TEST_F(ResolverTest, GetAddrInfoFromCustTable_InvalidInput) {
1247 constexpr char hostnameNoip[] = "noip.example.com.";
1248 constexpr char hostnameInvalidip[] = "invalidip.example.com.";
1249 const std::vector<aidl::android::net::ResolverHostsParcel> invalidCustHosts = {
1250 {"", hostnameNoip},
1251 {"wrong IP", hostnameInvalidip},
1252 };
1253 test::DNSResponder dns;
1254 StartDns(dns, {});
1255 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
Ken Chena6ac2a62020-04-07 17:25:56 +08001256 resolverParams.resolverOptions.hosts = invalidCustHosts;
chenbrucefd837fa2019-10-29 18:35:36 +08001257 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1258 for (const auto& hostname : {hostnameNoip, hostnameInvalidip}) {
1259 // The query won't get data from customized table because of invalid customized table
1260 // and DNSResponder also has no records. hostnameNoip has never registered and
1261 // hostnameInvalidip has registered but wrong IP.
1262 const addrinfo hints = {.ai_family = AF_UNSPEC};
1263 ScopedAddrinfo result = safe_getaddrinfo(hostname, nullptr, &hints);
1264 ASSERT_TRUE(result == nullptr);
1265 EXPECT_EQ(4U, GetNumQueries(dns, hostname));
1266 }
1267}
1268
1269TEST_F(ResolverTest, GetAddrInfoFromCustTable) {
1270 constexpr char hostnameV4[] = "v4only.example.com.";
1271 constexpr char hostnameV6[] = "v6only.example.com.";
1272 constexpr char hostnameV4V6[] = "v4v6.example.com.";
1273 constexpr char custAddrV4[] = "1.2.3.4";
1274 constexpr char custAddrV6[] = "::1.2.3.4";
1275 constexpr char dnsSvAddrV4[] = "1.2.3.5";
1276 constexpr char dnsSvAddrV6[] = "::1.2.3.5";
1277 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4 = {
1278 {custAddrV4, hostnameV4},
1279 };
1280 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV6 = {
1281 {custAddrV6, hostnameV6},
1282 };
1283 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4V6 = {
1284 {custAddrV4, hostnameV4V6},
1285 {custAddrV6, hostnameV4V6},
1286 };
1287 const std::vector<DnsRecord> dnsSvHostV4 = {
1288 {hostnameV4, ns_type::ns_t_a, dnsSvAddrV4},
1289 };
1290 const std::vector<DnsRecord> dnsSvHostV6 = {
1291 {hostnameV6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1292 };
1293 const std::vector<DnsRecord> dnsSvHostV4V6 = {
1294 {hostnameV4V6, ns_type::ns_t_a, dnsSvAddrV4},
1295 {hostnameV4V6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1296 };
1297 struct TestConfig {
1298 const std::string name;
1299 const std::vector<aidl::android::net::ResolverHostsParcel> customizedHosts;
1300 const std::vector<DnsRecord> dnsserverHosts;
1301 const std::vector<std::string> queryResult;
1302 std::string asParameters() const {
1303 return StringPrintf("name: %s, customizedHosts: %s, dnsserverHosts: %s", name.c_str(),
1304 customizedHosts.empty() ? "No" : "Yes",
1305 dnsserverHosts.empty() ? "No" : "Yes");
1306 }
1307 } testConfigs[]{
1308 // clang-format off
1309 {hostnameV4, {}, {}, {}},
1310 {hostnameV4, {}, dnsSvHostV4, {dnsSvAddrV4}},
1311 {hostnameV4, custHostV4, {}, {custAddrV4}},
1312 {hostnameV4, custHostV4, dnsSvHostV4, {custAddrV4}},
1313 {hostnameV6, {}, {}, {}},
1314 {hostnameV6, {}, dnsSvHostV6, {dnsSvAddrV6}},
1315 {hostnameV6, custHostV6, {}, {custAddrV6}},
1316 {hostnameV6, custHostV6, dnsSvHostV6, {custAddrV6}},
1317 {hostnameV4V6, {}, {}, {}},
1318 {hostnameV4V6, {}, dnsSvHostV4V6, {dnsSvAddrV4, dnsSvAddrV6}},
1319 {hostnameV4V6, custHostV4V6, {}, {custAddrV4, custAddrV6}},
1320 {hostnameV4V6, custHostV4V6, dnsSvHostV4V6, {custAddrV4, custAddrV6}},
1321 // clang-format on
1322 };
1323
1324 for (const auto& config : testConfigs) {
1325 SCOPED_TRACE(config.asParameters());
1326
1327 test::DNSResponder dns;
1328 StartDns(dns, config.dnsserverHosts);
1329
1330 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
Ken Chena6ac2a62020-04-07 17:25:56 +08001331 resolverParams.resolverOptions.hosts = config.customizedHosts;
chenbrucefd837fa2019-10-29 18:35:36 +08001332 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1333 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM};
1334 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
1335 if (config.customizedHosts.empty() && config.dnsserverHosts.empty()) {
1336 ASSERT_TRUE(result == nullptr);
1337 EXPECT_EQ(2U, GetNumQueries(dns, config.name.c_str()));
1338 } else {
1339 ASSERT_TRUE(result != nullptr);
1340 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(config.queryResult));
1341 EXPECT_EQ(config.customizedHosts.empty() ? 2U : 0U,
1342 GetNumQueries(dns, config.name.c_str()));
1343 }
1344
1345 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
1346 }
1347}
1348
1349TEST_F(ResolverTest, GetAddrInfoFromCustTable_Modify) {
1350 constexpr char hostnameV4V6[] = "v4v6.example.com.";
1351 constexpr char custAddrV4[] = "1.2.3.4";
1352 constexpr char custAddrV6[] = "::1.2.3.4";
1353 constexpr char dnsSvAddrV4[] = "1.2.3.5";
1354 constexpr char dnsSvAddrV6[] = "::1.2.3.5";
1355 const std::vector<DnsRecord> dnsSvHostV4V6 = {
1356 {hostnameV4V6, ns_type::ns_t_a, dnsSvAddrV4},
1357 {hostnameV4V6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1358 };
1359 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4V6 = {
1360 {custAddrV4, hostnameV4V6},
1361 {custAddrV6, hostnameV4V6},
1362 };
1363 test::DNSResponder dns;
1364 StartDns(dns, dnsSvHostV4V6);
1365 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1366
Ken Chena6ac2a62020-04-07 17:25:56 +08001367 resolverParams.resolverOptions.hosts = custHostV4V6;
chenbrucefd837fa2019-10-29 18:35:36 +08001368 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1369 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM};
1370 ScopedAddrinfo result = safe_getaddrinfo(hostnameV4V6, nullptr, &hints);
1371 ASSERT_TRUE(result != nullptr);
1372 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray({custAddrV4, custAddrV6}));
1373 EXPECT_EQ(0U, GetNumQueries(dns, hostnameV4V6));
1374
Ken Chena6ac2a62020-04-07 17:25:56 +08001375 resolverParams.resolverOptions.hosts = {};
chenbrucefd837fa2019-10-29 18:35:36 +08001376 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1377 result = safe_getaddrinfo(hostnameV4V6, nullptr, &hints);
1378 ASSERT_TRUE(result != nullptr);
1379 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray({dnsSvAddrV4, dnsSvAddrV6}));
1380 EXPECT_EQ(2U, GetNumQueries(dns, hostnameV4V6));
1381}
1382
Ken Chenb9fa2062018-11-13 21:51:13 +08001383TEST_F(ResolverTest, EmptySetup) {
Ken Chenb9fa2062018-11-13 21:51:13 +08001384 std::vector<std::string> servers;
1385 std::vector<std::string> domains;
Xiao Ma09b71022018-12-11 17:56:32 +09001386 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001387 std::vector<std::string> res_servers;
1388 std::vector<std::string> res_domains;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001389 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001390 res_params res_params;
Ken Chenb9fa2062018-11-13 21:51:13 +08001391 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +08001392 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001393 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1394 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1395 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chenb9fa2062018-11-13 21:51:13 +08001396 EXPECT_EQ(0U, res_servers.size());
1397 EXPECT_EQ(0U, res_domains.size());
Mike Yu0a1c53d2018-11-26 13:26:21 +09001398 EXPECT_EQ(0U, res_tls_servers.size());
Luke Huang5bd827c2019-03-14 16:10:04 +08001399 ASSERT_EQ(static_cast<size_t>(IDnsResolver::RESOLVER_PARAMS_COUNT), kDefaultParams.size());
1400 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY],
1401 res_params.sample_validity);
1402 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001403 res_params.success_threshold);
Luke Huang5bd827c2019-03-14 16:10:04 +08001404 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
1405 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
1406 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
Ken Chenb9fa2062018-11-13 21:51:13 +08001407 res_params.base_timeout_msec);
Luke Huang5bd827c2019-03-14 16:10:04 +08001408 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_RETRY_COUNT], res_params.retry_count);
Ken Chenb9fa2062018-11-13 21:51:13 +08001409}
1410
1411TEST_F(ResolverTest, SearchPathChange) {
Xiao Ma09b71022018-12-11 17:56:32 +09001412 constexpr char listen_addr[] = "127.0.0.13";
1413 constexpr char host_name1[] = "test13.domain1.org.";
1414 constexpr char host_name2[] = "test13.domain2.org.";
Luke Huangf8215372019-11-22 11:53:41 +08001415 std::vector<std::string> servers = {listen_addr};
1416 std::vector<std::string> domains = {"domain1.org"};
Xiao Ma09b71022018-12-11 17:56:32 +09001417
1418 const std::vector<DnsRecord> records = {
1419 {host_name1, ns_type::ns_t_aaaa, "2001:db8::13"},
1420 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1:13"},
1421 };
1422 test::DNSResponder dns(listen_addr);
1423 StartDns(dns, records);
1424 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001425
1426 const addrinfo hints = {.ai_family = AF_INET6};
1427 ScopedAddrinfo result = safe_getaddrinfo("test13", nullptr, &hints);
1428 EXPECT_TRUE(result != nullptr);
1429 EXPECT_EQ(1U, dns.queries().size());
1430 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
1431 EXPECT_EQ("2001:db8::13", ToString(result));
1432
1433 // Test that changing the domain search path on its own works.
Luke Huangf8215372019-11-22 11:53:41 +08001434 domains = {"domain2.org"};
Xiao Ma09b71022018-12-11 17:56:32 +09001435 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001436 dns.clearQueries();
1437
1438 result = safe_getaddrinfo("test13", nullptr, &hints);
1439 EXPECT_TRUE(result != nullptr);
1440 EXPECT_EQ(1U, dns.queries().size());
1441 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
1442 EXPECT_EQ("2001:db8::1:13", ToString(result));
1443}
1444
Luke Huang2dac4382019-06-24 13:28:44 +08001445namespace {
1446
Luke Huangf8215372019-11-22 11:53:41 +08001447std::vector<std::string> getResolverDomains(aidl::android::net::IDnsResolver* dnsResolverService,
Luke Huang2dac4382019-06-24 13:28:44 +08001448 unsigned netId) {
1449 std::vector<std::string> res_servers;
1450 std::vector<std::string> res_domains;
1451 std::vector<std::string> res_tls_servers;
1452 res_params res_params;
1453 std::vector<ResolverStats> res_stats;
1454 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001455 DnsResponderClient::GetResolverInfo(dnsResolverService, netId, &res_servers, &res_domains,
1456 &res_tls_servers, &res_params, &res_stats,
1457 &wait_for_pending_req_timeout_count);
Luke Huang2dac4382019-06-24 13:28:44 +08001458 return res_domains;
1459}
1460
1461} // namespace
1462
1463TEST_F(ResolverTest, SearchPathPrune) {
1464 constexpr size_t DUPLICATED_DOMAIN_NUM = 3;
1465 constexpr char listen_addr[] = "127.0.0.13";
1466 constexpr char domian_name1[] = "domain13.org.";
1467 constexpr char domian_name2[] = "domain14.org.";
1468 constexpr char host_name1[] = "test13.domain13.org.";
1469 constexpr char host_name2[] = "test14.domain14.org.";
1470 std::vector<std::string> servers = {listen_addr};
1471
1472 std::vector<std::string> testDomains1;
1473 std::vector<std::string> testDomains2;
1474 // Domain length should be <= 255
1475 // Max number of domains in search path is 6
1476 for (size_t i = 0; i < MAXDNSRCH + 1; i++) {
1477 // Fill up with invalid domain
1478 testDomains1.push_back(std::string(300, i + '0'));
1479 // Fill up with valid but duplicated domain
1480 testDomains2.push_back(StringPrintf("domain%zu.org", i % DUPLICATED_DOMAIN_NUM));
1481 }
1482
1483 // Add valid domain used for query.
1484 testDomains1.push_back(domian_name1);
1485
1486 // Add valid domain twice used for query.
1487 testDomains2.push_back(domian_name2);
1488 testDomains2.push_back(domian_name2);
1489
1490 const std::vector<DnsRecord> records = {
1491 {host_name1, ns_type::ns_t_aaaa, "2001:db8::13"},
1492 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1:13"},
1493 };
1494 test::DNSResponder dns(listen_addr);
1495 StartDns(dns, records);
1496 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, testDomains1));
1497
1498 const addrinfo hints = {.ai_family = AF_INET6};
1499 ScopedAddrinfo result = safe_getaddrinfo("test13", nullptr, &hints);
1500
1501 EXPECT_TRUE(result != nullptr);
1502
1503 EXPECT_EQ(1U, dns.queries().size());
1504 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
1505 EXPECT_EQ("2001:db8::13", ToString(result));
1506
1507 const auto& res_domains1 = getResolverDomains(mDnsClient.resolvService(), TEST_NETID);
1508 // Expect 1 valid domain, invalid domains are removed.
1509 ASSERT_EQ(1U, res_domains1.size());
1510 EXPECT_EQ(domian_name1, res_domains1[0]);
1511
1512 dns.clearQueries();
1513
1514 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, testDomains2));
1515
1516 result = safe_getaddrinfo("test14", nullptr, &hints);
1517 EXPECT_TRUE(result != nullptr);
1518
1519 // (3 domains * 2 retries) + 1 success query = 7
1520 EXPECT_EQ(7U, dns.queries().size());
1521 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
1522 EXPECT_EQ("2001:db8::1:13", ToString(result));
1523
1524 const auto& res_domains2 = getResolverDomains(mDnsClient.resolvService(), TEST_NETID);
1525 // Expect 4 valid domain, duplicate domains are removed.
1526 EXPECT_EQ(DUPLICATED_DOMAIN_NUM + 1U, res_domains2.size());
1527 EXPECT_THAT(
1528 std::vector<std::string>({"domain0.org", "domain1.org", "domain2.org", domian_name2}),
1529 testing::ElementsAreArray(res_domains2));
1530}
1531
Mike Yu0a1c53d2018-11-26 13:26:21 +09001532// If we move this function to dns_responder_client, it will complicate the dependency need of
1533// dns_tls_frontend.h.
1534static void setupTlsServers(const std::vector<std::string>& servers,
waynema0e73c2e2019-07-31 15:04:08 +08001535 std::vector<std::unique_ptr<test::DnsTlsFrontend>>* tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001536 constexpr char listen_udp[] = "53";
1537 constexpr char listen_tls[] = "853";
Mike Yu0a1c53d2018-11-26 13:26:21 +09001538
1539 for (const auto& server : servers) {
1540 auto t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
1541 t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
1542 t->startServer();
Mike Yu0a1c53d2018-11-26 13:26:21 +09001543 tls->push_back(std::move(t));
1544 }
1545}
1546
Mike Yu0a1c53d2018-11-26 13:26:21 +09001547TEST_F(ResolverTest, MaxServerPrune_Binder) {
Mike Yu0a1c53d2018-11-26 13:26:21 +09001548 std::vector<std::string> domains;
1549 std::vector<std::unique_ptr<test::DNSResponder>> dns;
1550 std::vector<std::unique_ptr<test::DnsTlsFrontend>> tls;
1551 std::vector<std::string> servers;
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001552 std::vector<DnsResponderClient::Mapping> mappings;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001553
1554 for (unsigned i = 0; i < MAXDNSRCH + 1; i++) {
1555 domains.push_back(StringPrintf("example%u.com", i));
1556 }
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001557 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupMappings(1, domains, &mappings));
1558 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupDNSServers(MAXNS + 1, mappings, &dns, &servers));
waynema0e73c2e2019-07-31 15:04:08 +08001559 ASSERT_NO_FATAL_FAILURE(setupTlsServers(servers, &tls));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001560
waynema0e73c2e2019-07-31 15:04:08 +08001561 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, domains, kDefaultParams,
1562 kDefaultPrivateDnsHostName));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001563
Mike Yu383855b2019-01-15 17:53:27 +08001564 // If the private DNS validation hasn't completed yet before backend DNS servers stop,
1565 // TLS servers will get stuck in handleOneRequest(), which causes this test stuck in
1566 // ~DnsTlsFrontend() because the TLS server loop threads can't be terminated.
1567 // So, wait for private DNS validation done before stopping backend DNS servers.
1568 for (int i = 0; i < MAXNS; i++) {
chenbruceaff85842019-05-31 15:46:42 +08001569 LOG(INFO) << "Waiting for private DNS validation on " << tls[i]->listen_address() << ".";
Mike Yu724f77d2019-08-16 11:14:50 +08001570 EXPECT_TRUE(WaitForPrivateDnsValidation(tls[i]->listen_address(), true));
chenbruceaff85842019-05-31 15:46:42 +08001571 LOG(INFO) << "private DNS validation on " << tls[i]->listen_address() << " done.";
Mike Yu383855b2019-01-15 17:53:27 +08001572 }
1573
Mike Yu0a1c53d2018-11-26 13:26:21 +09001574 std::vector<std::string> res_servers;
1575 std::vector<std::string> res_domains;
1576 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001577 res_params res_params;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001578 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +08001579 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001580 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1581 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1582 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001583
1584 // Check the size of the stats and its contents.
1585 EXPECT_EQ(static_cast<size_t>(MAXNS), res_servers.size());
1586 EXPECT_EQ(static_cast<size_t>(MAXNS), res_tls_servers.size());
1587 EXPECT_EQ(static_cast<size_t>(MAXDNSRCH), res_domains.size());
1588 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_servers.begin()));
1589 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_tls_servers.begin()));
1590 EXPECT_TRUE(std::equal(domains.begin(), domains.begin() + MAXDNSRCH, res_domains.begin()));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001591}
1592
1593TEST_F(ResolverTest, ResolverStats) {
Xiao Ma09b71022018-12-11 17:56:32 +09001594 constexpr char listen_addr1[] = "127.0.0.4";
1595 constexpr char listen_addr2[] = "127.0.0.5";
1596 constexpr char listen_addr3[] = "127.0.0.6";
Mike Yu0a1c53d2018-11-26 13:26:21 +09001597
1598 // Set server 1 timeout.
Mike Yufc125e42019-05-15 20:41:28 +08001599 test::DNSResponder dns1(listen_addr1, "53", static_cast<ns_rcode>(-1));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001600 dns1.setResponseProbability(0.0);
1601 ASSERT_TRUE(dns1.startServer());
1602
1603 // Set server 2 responding server failure.
Xiao Ma09b71022018-12-11 17:56:32 +09001604 test::DNSResponder dns2(listen_addr2);
Mike Yu0a1c53d2018-11-26 13:26:21 +09001605 dns2.setResponseProbability(0.0);
1606 ASSERT_TRUE(dns2.startServer());
1607
1608 // Set server 3 workable.
Xiao Ma09b71022018-12-11 17:56:32 +09001609 test::DNSResponder dns3(listen_addr3);
1610 dns3.addMapping(kHelloExampleCom, ns_type::ns_t_a, "1.2.3.4");
Mike Yu0a1c53d2018-11-26 13:26:21 +09001611 ASSERT_TRUE(dns3.startServer());
1612
1613 std::vector<std::string> servers = {listen_addr1, listen_addr2, listen_addr3};
Xiao Ma09b71022018-12-11 17:56:32 +09001614 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001615
1616 dns3.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +09001617 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
Mike Yu0a1c53d2018-11-26 13:26:21 +09001618 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
Xiao Ma09b71022018-12-11 17:56:32 +09001619 size_t found = GetNumQueries(dns3, kHelloExampleCom);
Mike Yu0a1c53d2018-11-26 13:26:21 +09001620 EXPECT_LE(1U, found);
1621 std::string result_str = ToString(result);
1622 EXPECT_TRUE(result_str == "1.2.3.4") << ", result_str='" << result_str << "'";
1623
Mike Yue2162e52020-03-04 18:43:46 +08001624 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1625 NameserverStats(listen_addr1).setTimeouts(1),
1626 NameserverStats(listen_addr2).setErrors(1),
1627 NameserverStats(listen_addr3).setSuccesses(1),
1628 };
Mike Yu61d17262020-02-15 18:56:22 +08001629 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001630}
1631
Mike Yu15791832020-02-11 13:38:48 +08001632TEST_F(ResolverTest, AlwaysUseLatestSetupParamsInLookups) {
1633 constexpr char listen_addr1[] = "127.0.0.3";
1634 constexpr char listen_addr2[] = "255.255.255.255";
1635 constexpr char listen_addr3[] = "127.0.0.4";
1636 constexpr char hostname[] = "hello";
1637 constexpr char fqdn_with_search_domain[] = "hello.domain2.com.";
1638
1639 test::DNSResponder dns1(listen_addr1, test::kDefaultListenService, static_cast<ns_rcode>(-1));
1640 dns1.setResponseProbability(0.0);
1641 ASSERT_TRUE(dns1.startServer());
1642
1643 test::DNSResponder dns3(listen_addr3);
1644 StartDns(dns3, {{fqdn_with_search_domain, ns_type::ns_t_a, "1.2.3.4"}});
1645
1646 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
1647 parcel.tlsServers.clear();
1648 parcel.servers = {listen_addr1, listen_addr2};
1649 parcel.domains = {"domain1.com", "domain2.com"};
1650 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1651
1652 // Expect the things happening in t1:
1653 // 1. The lookup starts using the first domain for query. It sends queries to the populated
1654 // nameserver list {listen_addr1, listen_addr2} for the hostname "hello.domain1.com".
1655 // 2. A different list of nameservers is updated to the resolver. Revision ID is incremented.
1656 // 3. The query for the hostname times out. The lookup fails to add the timeout record to the
1657 // the stats because of the unmatched revision ID.
1658 // 4. The lookup starts using the second domain for query. It sends queries to the populated
1659 // nameserver list {listen_addr3, listen_addr1, listen_addr2} for another hostname
1660 // "hello.domain2.com".
1661 // 5. The lookup gets the answer and updates a success record to the stats.
1662 std::thread t1([&hostname]() {
1663 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1664 ScopedAddrinfo result = safe_getaddrinfo(hostname, nullptr, &hints);
1665 EXPECT_NE(result.get(), nullptr);
1666 EXPECT_EQ(ToString(result), "1.2.3.4");
1667 });
1668
1669 // Wait for t1 to start the step 1.
1670 while (dns1.queries().size() == 0) {
1671 usleep(1000);
1672 }
1673
1674 // Update the resolver with three nameservers. This will increment the revision ID.
1675 parcel.servers = {listen_addr3, listen_addr1, listen_addr2};
1676 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1677
1678 t1.join();
1679 EXPECT_EQ(0U, GetNumQueriesForType(dns3, ns_type::ns_t_aaaa, fqdn_with_search_domain));
1680 EXPECT_EQ(1U, GetNumQueriesForType(dns3, ns_type::ns_t_a, fqdn_with_search_domain));
1681
Mike Yue2162e52020-03-04 18:43:46 +08001682 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1683 NameserverStats(listen_addr1),
1684 NameserverStats(listen_addr2),
1685 NameserverStats(listen_addr3).setSuccesses(1),
1686 };
Mike Yu61d17262020-02-15 18:56:22 +08001687 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu15791832020-02-11 13:38:48 +08001688}
1689
Ken Chenb9fa2062018-11-13 21:51:13 +08001690// Test what happens if the specified TLS server is nonexistent.
1691TEST_F(ResolverTest, GetHostByName_TlsMissing) {
Xiao Ma09b71022018-12-11 17:56:32 +09001692 constexpr char listen_addr[] = "127.0.0.3";
1693 constexpr char host_name[] = "tlsmissing.example.com.";
1694
1695 test::DNSResponder dns;
1696 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.3"}});
Luke Huangf8215372019-11-22 11:53:41 +08001697 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001698
1699 // There's nothing listening on this address, so validation will either fail or
1700 /// hang. Either way, queries will continue to flow to the DNSResponder.
waynema0e73c2e2019-07-31 15:04:08 +08001701 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Ken Chenb9fa2062018-11-13 21:51:13 +08001702
1703 const hostent* result;
1704
1705 result = gethostbyname("tlsmissing");
1706 ASSERT_FALSE(result == nullptr);
1707 EXPECT_EQ("1.2.3.3", ToString(result));
1708
1709 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001710 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001711}
1712
1713// Test what happens if the specified TLS server replies with garbage.
1714TEST_F(ResolverTest, GetHostByName_TlsBroken) {
Xiao Ma09b71022018-12-11 17:56:32 +09001715 constexpr char listen_addr[] = "127.0.0.3";
1716 constexpr char host_name1[] = "tlsbroken1.example.com.";
1717 constexpr char host_name2[] = "tlsbroken2.example.com.";
1718 const std::vector<DnsRecord> records = {
1719 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1720 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1721 };
1722
1723 test::DNSResponder dns;
1724 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001725 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001726
1727 // Bind the specified private DNS socket but don't respond to any client sockets yet.
1728 int s = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, IPPROTO_TCP);
1729 ASSERT_TRUE(s >= 0);
1730 struct sockaddr_in tlsServer = {
Luke Huangf8215372019-11-22 11:53:41 +08001731 .sin_family = AF_INET,
1732 .sin_port = htons(853),
Ken Chenb9fa2062018-11-13 21:51:13 +08001733 };
1734 ASSERT_TRUE(inet_pton(AF_INET, listen_addr, &tlsServer.sin_addr));
1735 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEPORT).ok());
1736 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEADDR).ok());
1737 ASSERT_FALSE(bind(s, reinterpret_cast<struct sockaddr*>(&tlsServer), sizeof(tlsServer)));
1738 ASSERT_FALSE(listen(s, 1));
1739
1740 // Trigger TLS validation.
waynema0e73c2e2019-07-31 15:04:08 +08001741 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Ken Chenb9fa2062018-11-13 21:51:13 +08001742
1743 struct sockaddr_storage cliaddr;
1744 socklen_t sin_size = sizeof(cliaddr);
Luke Huangf8215372019-11-22 11:53:41 +08001745 int new_fd = accept4(s, reinterpret_cast<struct sockaddr*>(&cliaddr), &sin_size, SOCK_CLOEXEC);
Ken Chenb9fa2062018-11-13 21:51:13 +08001746 ASSERT_TRUE(new_fd > 0);
1747
1748 // We've received the new file descriptor but not written to it or closed, so the
1749 // validation is still pending. Queries should still flow correctly because the
1750 // server is not used until validation succeeds.
1751 const hostent* result;
1752 result = gethostbyname("tlsbroken1");
1753 ASSERT_FALSE(result == nullptr);
1754 EXPECT_EQ("1.2.3.1", ToString(result));
1755
1756 // Now we cause the validation to fail.
1757 std::string garbage = "definitely not a valid TLS ServerHello";
1758 write(new_fd, garbage.data(), garbage.size());
1759 close(new_fd);
1760
1761 // Validation failure shouldn't interfere with lookups, because lookups won't be sent
1762 // to the TLS server unless validation succeeds.
1763 result = gethostbyname("tlsbroken2");
1764 ASSERT_FALSE(result == nullptr);
1765 EXPECT_EQ("1.2.3.2", ToString(result));
1766
1767 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001768 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001769 close(s);
1770}
1771
1772TEST_F(ResolverTest, GetHostByName_Tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001773 constexpr char listen_addr[] = "127.0.0.3";
1774 constexpr char listen_udp[] = "53";
1775 constexpr char listen_tls[] = "853";
1776 constexpr char host_name1[] = "tls1.example.com.";
1777 constexpr char host_name2[] = "tls2.example.com.";
1778 constexpr char host_name3[] = "tls3.example.com.";
1779 const std::vector<DnsRecord> records = {
1780 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1781 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1782 {host_name3, ns_type::ns_t_a, "1.2.3.3"},
1783 };
1784
1785 test::DNSResponder dns;
1786 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001787 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001788
1789 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1790 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001791 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08001792 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001793
Mike Yu724f77d2019-08-16 11:14:50 +08001794 const hostent* result = gethostbyname("tls1");
Ken Chenb9fa2062018-11-13 21:51:13 +08001795 ASSERT_FALSE(result == nullptr);
1796 EXPECT_EQ("1.2.3.1", ToString(result));
1797
1798 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001799 EXPECT_TRUE(tls.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001800
1801 // Stop the TLS server. Since we're in opportunistic mode, queries will
1802 // fall back to the locally-assigned (clear text) nameservers.
1803 tls.stopServer();
1804
1805 dns.clearQueries();
1806 result = gethostbyname("tls2");
1807 EXPECT_FALSE(result == nullptr);
1808 EXPECT_EQ("1.2.3.2", ToString(result));
1809 const auto queries = dns.queries();
1810 EXPECT_EQ(1U, queries.size());
waynema29253052019-08-20 11:26:08 +08001811 EXPECT_EQ("tls2.example.com.", queries[0].name);
1812 EXPECT_EQ(ns_t_a, queries[0].type);
Ken Chenb9fa2062018-11-13 21:51:13 +08001813
1814 // Reset the resolvers without enabling TLS. Queries should still be routed
1815 // to the UDP endpoint.
Xiao Ma09b71022018-12-11 17:56:32 +09001816 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001817
1818 result = gethostbyname("tls3");
1819 ASSERT_FALSE(result == nullptr);
1820 EXPECT_EQ("1.2.3.3", ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +08001821}
1822
Ken Chenb9fa2062018-11-13 21:51:13 +08001823TEST_F(ResolverTest, GetHostByName_TlsFailover) {
Xiao Ma09b71022018-12-11 17:56:32 +09001824 constexpr char listen_addr1[] = "127.0.0.3";
1825 constexpr char listen_addr2[] = "127.0.0.4";
1826 constexpr char listen_udp[] = "53";
1827 constexpr char listen_tls[] = "853";
1828 constexpr char host_name1[] = "tlsfailover1.example.com.";
1829 constexpr char host_name2[] = "tlsfailover2.example.com.";
1830 const std::vector<DnsRecord> records1 = {
1831 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1832 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1833 };
1834 const std::vector<DnsRecord> records2 = {
1835 {host_name1, ns_type::ns_t_a, "1.2.3.3"},
1836 {host_name2, ns_type::ns_t_a, "1.2.3.4"},
1837 };
1838
1839 test::DNSResponder dns1(listen_addr1);
1840 test::DNSResponder dns2(listen_addr2);
1841 StartDns(dns1, records1);
1842 StartDns(dns2, records2);
1843
Luke Huangf8215372019-11-22 11:53:41 +08001844 std::vector<std::string> servers = {listen_addr1, listen_addr2};
Ken Chenb9fa2062018-11-13 21:51:13 +08001845
1846 test::DnsTlsFrontend tls1(listen_addr1, listen_tls, listen_addr1, listen_udp);
1847 test::DnsTlsFrontend tls2(listen_addr2, listen_tls, listen_addr2, listen_udp);
1848 ASSERT_TRUE(tls1.startServer());
1849 ASSERT_TRUE(tls2.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001850 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1851 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08001852 EXPECT_TRUE(WaitForPrivateDnsValidation(tls1.listen_address(), true));
1853 EXPECT_TRUE(WaitForPrivateDnsValidation(tls2.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001854
Mike Yu724f77d2019-08-16 11:14:50 +08001855 const hostent* result = gethostbyname("tlsfailover1");
Ken Chenb9fa2062018-11-13 21:51:13 +08001856 ASSERT_FALSE(result == nullptr);
1857 EXPECT_EQ("1.2.3.1", ToString(result));
1858
1859 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001860 EXPECT_TRUE(tls1.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001861 // No new queries should have reached tls2.
Luke Huang0a0870d2020-02-12 20:41:10 +08001862 EXPECT_TRUE(tls2.waitForQueries(1));
Ken Chenb9fa2062018-11-13 21:51:13 +08001863
1864 // Stop tls1. Subsequent queries should attempt to reach tls1, fail, and retry to tls2.
1865 tls1.stopServer();
1866
1867 result = gethostbyname("tlsfailover2");
1868 EXPECT_EQ("1.2.3.4", ToString(result));
1869
1870 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001871 EXPECT_TRUE(tls2.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001872
1873 // No additional queries should have reached the insecure servers.
1874 EXPECT_EQ(2U, dns1.queries().size());
1875 EXPECT_EQ(2U, dns2.queries().size());
1876
1877 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001878 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Ken Chenb9fa2062018-11-13 21:51:13 +08001879}
1880
1881TEST_F(ResolverTest, GetHostByName_BadTlsName) {
Xiao Ma09b71022018-12-11 17:56:32 +09001882 constexpr char listen_addr[] = "127.0.0.3";
1883 constexpr char listen_udp[] = "53";
1884 constexpr char listen_tls[] = "853";
1885 constexpr char host_name[] = "badtlsname.example.com.";
1886
1887 test::DNSResponder dns;
1888 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.1"}});
Luke Huangf8215372019-11-22 11:53:41 +08001889 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001890
1891 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1892 ASSERT_TRUE(tls.startServer());
Xiao Ma09b71022018-12-11 17:56:32 +09001893 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
waynema0e73c2e2019-07-31 15:04:08 +08001894 kDefaultIncorrectPrivateDnsHostName));
Ken Chenb9fa2062018-11-13 21:51:13 +08001895
waynema0e73c2e2019-07-31 15:04:08 +08001896 // The TLS handshake would fail because the name of TLS server doesn't
1897 // match with TLS server's certificate.
Mike Yu724f77d2019-08-16 11:14:50 +08001898 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), false));
Ken Chenb9fa2062018-11-13 21:51:13 +08001899
1900 // The query should fail hard, because a name was specified.
1901 EXPECT_EQ(nullptr, gethostbyname("badtlsname"));
1902
1903 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001904 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001905}
1906
1907TEST_F(ResolverTest, GetAddrInfo_Tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001908 constexpr char listen_addr[] = "127.0.0.3";
1909 constexpr char listen_udp[] = "53";
1910 constexpr char listen_tls[] = "853";
1911 constexpr char host_name[] = "addrinfotls.example.com.";
1912 const std::vector<DnsRecord> records = {
1913 {host_name, ns_type::ns_t_a, "1.2.3.4"},
1914 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
1915 };
1916
1917 test::DNSResponder dns;
1918 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001919 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001920
1921 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1922 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001923 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1924 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08001925 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001926
1927 dns.clearQueries();
1928 ScopedAddrinfo result = safe_getaddrinfo("addrinfotls", nullptr, nullptr);
1929 EXPECT_TRUE(result != nullptr);
1930 size_t found = GetNumQueries(dns, host_name);
1931 EXPECT_LE(1U, found);
1932 // Could be A or AAAA
1933 std::string result_str = ToString(result);
1934 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +08001935 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08001936 // Wait for both A and AAAA queries to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001937 EXPECT_TRUE(tls.waitForQueries(3));
Ken Chenb9fa2062018-11-13 21:51:13 +08001938
1939 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001940 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001941}
1942
1943TEST_F(ResolverTest, TlsBypass) {
1944 const char OFF[] = "off";
1945 const char OPPORTUNISTIC[] = "opportunistic";
1946 const char STRICT[] = "strict";
1947
1948 const char GETHOSTBYNAME[] = "gethostbyname";
1949 const char GETADDRINFO[] = "getaddrinfo";
1950 const char GETADDRINFOFORNET[] = "getaddrinfofornet";
1951
1952 const unsigned BYPASS_NETID = NETID_USE_LOCAL_NAMESERVERS | TEST_NETID;
1953
Ken Chenb9fa2062018-11-13 21:51:13 +08001954 const char ADDR4[] = "192.0.2.1";
1955 const char ADDR6[] = "2001:db8::1";
1956
1957 const char cleartext_addr[] = "127.0.0.53";
1958 const char cleartext_port[] = "53";
1959 const char tls_port[] = "853";
Luke Huangf8215372019-11-22 11:53:41 +08001960 const std::vector<std::string> servers = {cleartext_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001961
Xiao Ma09b71022018-12-11 17:56:32 +09001962 test::DNSResponder dns(cleartext_addr);
Ken Chenb9fa2062018-11-13 21:51:13 +08001963 ASSERT_TRUE(dns.startServer());
1964
1965 test::DnsTlsFrontend tls(cleartext_addr, tls_port, cleartext_addr, cleartext_port);
Mike Yudd4ac2d2019-05-31 16:52:11 +08001966 ASSERT_TRUE(tls.startServer());
Ken Chenb9fa2062018-11-13 21:51:13 +08001967
Luke Huangf8215372019-11-22 11:53:41 +08001968 // clang-format off
Ken Chenb9fa2062018-11-13 21:51:13 +08001969 struct TestConfig {
1970 const std::string mode;
1971 const bool withWorkingTLS;
1972 const std::string method;
1973
1974 std::string asHostName() const {
Luke Huangf8215372019-11-22 11:53:41 +08001975 return StringPrintf("%s.%s.%s.", mode.c_str(), withWorkingTLS ? "tlsOn" : "tlsOff",
Ken Chenb9fa2062018-11-13 21:51:13 +08001976 method.c_str());
1977 }
1978 } testConfigs[]{
Ken Chenb9fa2062018-11-13 21:51:13 +08001979 {OFF, true, GETHOSTBYNAME},
1980 {OPPORTUNISTIC, true, GETHOSTBYNAME},
1981 {STRICT, true, GETHOSTBYNAME},
Ken Chenb9fa2062018-11-13 21:51:13 +08001982 {OFF, true, GETADDRINFO},
1983 {OPPORTUNISTIC, true, GETADDRINFO},
1984 {STRICT, true, GETADDRINFO},
Ken Chenb9fa2062018-11-13 21:51:13 +08001985 {OFF, true, GETADDRINFOFORNET},
1986 {OPPORTUNISTIC, true, GETADDRINFOFORNET},
1987 {STRICT, true, GETADDRINFOFORNET},
Mike Yudd4ac2d2019-05-31 16:52:11 +08001988 {OFF, false, GETHOSTBYNAME},
1989 {OPPORTUNISTIC, false, GETHOSTBYNAME},
1990 {STRICT, false, GETHOSTBYNAME},
1991 {OFF, false, GETADDRINFO},
1992 {OPPORTUNISTIC, false, GETADDRINFO},
1993 {STRICT, false, GETADDRINFO},
1994 {OFF, false, GETADDRINFOFORNET},
1995 {OPPORTUNISTIC, false, GETADDRINFOFORNET},
1996 {STRICT, false, GETADDRINFOFORNET},
Ken Chenb9fa2062018-11-13 21:51:13 +08001997 };
Luke Huangf8215372019-11-22 11:53:41 +08001998 // clang-format on
Ken Chenb9fa2062018-11-13 21:51:13 +08001999
2000 for (const auto& config : testConfigs) {
2001 const std::string testHostName = config.asHostName();
2002 SCOPED_TRACE(testHostName);
2003
2004 // Don't tempt test bugs due to caching.
2005 const char* host_name = testHostName.c_str();
2006 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
2007 dns.addMapping(host_name, ns_type::ns_t_aaaa, ADDR6);
2008
Mike Yudd4ac2d2019-05-31 16:52:11 +08002009 if (config.withWorkingTLS) {
2010 if (!tls.running()) {
2011 ASSERT_TRUE(tls.startServer());
2012 }
2013 } else {
2014 if (tls.running()) {
2015 ASSERT_TRUE(tls.stopServer());
2016 }
2017 }
Ken Chenb9fa2062018-11-13 21:51:13 +08002018
2019 if (config.mode == OFF) {
Xiao Ma09b71022018-12-11 17:56:32 +09002020 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, kDefaultSearchDomains,
2021 kDefaultParams));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09002022 } else /* OPPORTUNISTIC or STRICT */ {
2023 const char* tls_hostname = (config.mode == STRICT) ? kDefaultPrivateDnsHostName : "";
Xiao Ma09b71022018-12-11 17:56:32 +09002024 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09002025 kDefaultParams, tls_hostname));
Mike Yu724f77d2019-08-16 11:14:50 +08002026
2027 // Wait for the validation event. If the server is running, the validation should
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09002028 // succeed; otherwise, the validation should fail.
Mike Yu724f77d2019-08-16 11:14:50 +08002029 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), config.withWorkingTLS));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09002030 if (config.withWorkingTLS) {
2031 EXPECT_TRUE(tls.waitForQueries(1));
2032 tls.clearQueries();
2033 }
Ken Chenb9fa2062018-11-13 21:51:13 +08002034 }
Ken Chenb9fa2062018-11-13 21:51:13 +08002035
2036 const hostent* h_result = nullptr;
2037 ScopedAddrinfo ai_result;
2038
2039 if (config.method == GETHOSTBYNAME) {
2040 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
2041 h_result = gethostbyname(host_name);
2042
2043 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
2044 ASSERT_FALSE(h_result == nullptr);
2045 ASSERT_EQ(4, h_result->h_length);
2046 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
2047 EXPECT_EQ(ADDR4, ToString(h_result));
2048 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
2049 } else if (config.method == GETADDRINFO) {
2050 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
2051 ai_result = safe_getaddrinfo(host_name, nullptr, nullptr);
2052 EXPECT_TRUE(ai_result != nullptr);
2053
2054 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2055 // Could be A or AAAA
2056 const std::string result_str = ToString(ai_result);
2057 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
Luke Huangf8215372019-11-22 11:53:41 +08002058 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08002059 } else if (config.method == GETADDRINFOFORNET) {
2060 addrinfo* raw_ai_result = nullptr;
2061 EXPECT_EQ(0, android_getaddrinfofornet(host_name, /*servname=*/nullptr,
2062 /*hints=*/nullptr, BYPASS_NETID, MARK_UNSET,
2063 &raw_ai_result));
2064 ai_result.reset(raw_ai_result);
2065
2066 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2067 // Could be A or AAAA
2068 const std::string result_str = ToString(ai_result);
2069 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
Luke Huangf8215372019-11-22 11:53:41 +08002070 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08002071 }
2072
Mike Yudd4ac2d2019-05-31 16:52:11 +08002073 EXPECT_EQ(0, tls.queries());
Ken Chenb9fa2062018-11-13 21:51:13 +08002074
2075 // Clear per-process resolv netid.
2076 ASSERT_EQ(0, setNetworkForResolv(NETID_UNSET));
Ken Chenb9fa2062018-11-13 21:51:13 +08002077 dns.clearQueries();
2078 }
Ken Chenb9fa2062018-11-13 21:51:13 +08002079}
2080
2081TEST_F(ResolverTest, StrictMode_NoTlsServers) {
Xiao Ma09b71022018-12-11 17:56:32 +09002082 constexpr char cleartext_addr[] = "127.0.0.53";
Luke Huangf8215372019-11-22 11:53:41 +08002083 const std::vector<std::string> servers = {cleartext_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002084 constexpr char host_name[] = "strictmode.notlsips.example.com.";
2085 const std::vector<DnsRecord> records = {
2086 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2087 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2088 };
Ken Chenb9fa2062018-11-13 21:51:13 +08002089
Xiao Ma09b71022018-12-11 17:56:32 +09002090 test::DNSResponder dns(cleartext_addr);
2091 StartDns(dns, records);
Ken Chenb9fa2062018-11-13 21:51:13 +08002092
waynema0e73c2e2019-07-31 15:04:08 +08002093 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
2094 kDefaultIncorrectPrivateDnsHostName));
Ken Chenb9fa2062018-11-13 21:51:13 +08002095
2096 addrinfo* ai_result = nullptr;
2097 EXPECT_NE(0, getaddrinfo(host_name, nullptr, nullptr, &ai_result));
2098 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
2099}
Luke Huang94b10b92018-11-21 20:13:38 +08002100
2101namespace {
2102
Luke Huang70931aa2019-01-31 11:57:41 +08002103int getAsyncResponse(int fd, int* rcode, uint8_t* buf, int bufLen) {
Luke Huang94b10b92018-11-21 20:13:38 +08002104 struct pollfd wait_fd[1];
2105 wait_fd[0].fd = fd;
2106 wait_fd[0].events = POLLIN;
2107 short revents;
2108 int ret;
2109
2110 ret = poll(wait_fd, 1, -1);
2111 revents = wait_fd[0].revents;
2112 if (revents & POLLIN) {
Mike Yub3505422020-10-15 16:10:41 +08002113 return resNetworkResult(fd, rcode, buf, bufLen);
Luke Huang94b10b92018-11-21 20:13:38 +08002114 }
2115 return -1;
2116}
2117
Luke Huang70931aa2019-01-31 11:57:41 +08002118std::string toString(uint8_t* buf, int bufLen, int ipType) {
Luke Huang94b10b92018-11-21 20:13:38 +08002119 ns_msg handle;
2120 int ancount, n = 0;
2121 ns_rr rr;
2122
Luke Huangf8215372019-11-22 11:53:41 +08002123 if (ns_initparse((const uint8_t*)buf, bufLen, &handle) >= 0) {
Luke Huang94b10b92018-11-21 20:13:38 +08002124 ancount = ns_msg_count(handle, ns_s_an);
2125 if (ns_parserr(&handle, ns_s_an, n, &rr) == 0) {
Luke Huang70931aa2019-01-31 11:57:41 +08002126 const uint8_t* rdata = ns_rr_rdata(rr);
Luke Huang94b10b92018-11-21 20:13:38 +08002127 char buffer[INET6_ADDRSTRLEN];
Luke Huangf8215372019-11-22 11:53:41 +08002128 if (inet_ntop(ipType, (const char*)rdata, buffer, sizeof(buffer))) {
Luke Huang94b10b92018-11-21 20:13:38 +08002129 return buffer;
2130 }
2131 }
2132 }
2133 return "";
2134}
2135
2136int dns_open_proxy() {
2137 int s = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
2138 if (s == -1) {
2139 return -1;
2140 }
2141 const int one = 1;
2142 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
2143
2144 static const struct sockaddr_un proxy_addr = {
2145 .sun_family = AF_UNIX,
2146 .sun_path = "/dev/socket/dnsproxyd",
2147 };
2148
Luke Huangf8215372019-11-22 11:53:41 +08002149 if (TEMP_FAILURE_RETRY(connect(s, (const struct sockaddr*)&proxy_addr, sizeof(proxy_addr))) !=
Luke Huang94b10b92018-11-21 20:13:38 +08002150 0) {
2151 close(s);
2152 return -1;
2153 }
2154
2155 return s;
2156}
2157
Luke Huangba7bef92018-12-26 16:53:03 +08002158void expectAnswersValid(int fd, int ipType, const std::string& expectedAnswer) {
2159 int rcode = -1;
2160 uint8_t buf[MAXPACKET] = {};
2161
2162 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2163 EXPECT_GT(res, 0);
2164 EXPECT_EQ(expectedAnswer, toString(buf, res, ipType));
2165}
2166
2167void expectAnswersNotValid(int fd, int expectedErrno) {
2168 int rcode = -1;
2169 uint8_t buf[MAXPACKET] = {};
2170
2171 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2172 EXPECT_EQ(expectedErrno, res);
2173}
2174
Luke Huang94b10b92018-11-21 20:13:38 +08002175} // namespace
2176
2177TEST_F(ResolverTest, Async_NormalQueryV4V6) {
Xiao Ma09b71022018-12-11 17:56:32 +09002178 constexpr char listen_addr[] = "127.0.0.4";
2179 constexpr char host_name[] = "howdy.example.com.";
2180 const std::vector<DnsRecord> records = {
2181 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2182 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2183 };
2184
2185 test::DNSResponder dns(listen_addr);
2186 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002187 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002188 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002189
Luke Huangba7bef92018-12-26 16:53:03 +08002190 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2191 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002192 EXPECT_TRUE(fd1 != -1);
2193 EXPECT_TRUE(fd2 != -1);
2194
Luke Huang70931aa2019-01-31 11:57:41 +08002195 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002196 int rcode;
2197 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2198 EXPECT_GT(res, 0);
2199 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
2200
2201 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2202 EXPECT_GT(res, 0);
2203 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2204
2205 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
2206
2207 // Re-query verify cache works
Luke Huangba7bef92018-12-26 16:53:03 +08002208 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2209 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002210
2211 EXPECT_TRUE(fd1 != -1);
2212 EXPECT_TRUE(fd2 != -1);
2213
2214 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2215 EXPECT_GT(res, 0);
2216 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
2217
2218 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2219 EXPECT_GT(res, 0);
2220 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2221
2222 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
2223}
2224
2225TEST_F(ResolverTest, Async_BadQuery) {
Xiao Ma09b71022018-12-11 17:56:32 +09002226 constexpr char listen_addr[] = "127.0.0.4";
2227 constexpr char host_name[] = "howdy.example.com.";
2228 const std::vector<DnsRecord> records = {
2229 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2230 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2231 };
2232
2233 test::DNSResponder dns(listen_addr);
2234 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002235 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002236 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002237
2238 static struct {
2239 int fd;
2240 const char* dname;
2241 const int queryType;
2242 const int expectRcode;
2243 } kTestData[] = {
Luke Huangba7bef92018-12-26 16:53:03 +08002244 {-1, "", ns_t_aaaa, 0},
2245 {-1, "as65ass46", ns_t_aaaa, 0},
2246 {-1, "454564564564", ns_t_aaaa, 0},
2247 {-1, "h645235", ns_t_a, 0},
2248 {-1, "www.google.com", ns_t_a, 0},
Luke Huang94b10b92018-11-21 20:13:38 +08002249 };
2250
2251 for (auto& td : kTestData) {
2252 SCOPED_TRACE(td.dname);
Luke Huangba7bef92018-12-26 16:53:03 +08002253 td.fd = resNetworkQuery(TEST_NETID, td.dname, ns_c_in, td.queryType, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002254 EXPECT_TRUE(td.fd != -1);
2255 }
2256
2257 // dns_responder return empty resp(packet only contains query part) with no error currently
2258 for (const auto& td : kTestData) {
Luke Huang70931aa2019-01-31 11:57:41 +08002259 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002260 int rcode;
2261 SCOPED_TRACE(td.dname);
2262 int res = getAsyncResponse(td.fd, &rcode, buf, MAXPACKET);
2263 EXPECT_GT(res, 0);
2264 EXPECT_EQ(rcode, td.expectRcode);
2265 }
2266}
2267
2268TEST_F(ResolverTest, Async_EmptyAnswer) {
Xiao Ma09b71022018-12-11 17:56:32 +09002269 constexpr char listen_addr[] = "127.0.0.4";
2270 constexpr char host_name[] = "howdy.example.com.";
2271 const std::vector<DnsRecord> records = {
2272 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2273 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2274 };
2275
2276 test::DNSResponder dns(listen_addr);
2277 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002278 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002279 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002280
Luke Huang9c264bb2018-12-18 16:44:41 +08002281 // TODO: Disable retry to make this test explicit.
2282 auto& cv = dns.getCv();
2283 auto& cvMutex = dns.getCvMutex();
2284 int fd1;
2285 // Wait on the condition variable to ensure that the DNS server has handled our first query.
2286 {
2287 std::unique_lock lk(cvMutex);
Luke Huangba7bef92018-12-26 16:53:03 +08002288 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang9c264bb2018-12-18 16:44:41 +08002289 EXPECT_TRUE(fd1 != -1);
2290 EXPECT_EQ(std::cv_status::no_timeout, cv.wait_for(lk, std::chrono::seconds(1)));
2291 }
Luke Huang94b10b92018-11-21 20:13:38 +08002292
Luke Huang94b10b92018-11-21 20:13:38 +08002293 dns.setResponseProbability(0.0);
Luke Huang94b10b92018-11-21 20:13:38 +08002294
Luke Huangba7bef92018-12-26 16:53:03 +08002295 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002296 EXPECT_TRUE(fd2 != -1);
2297
Luke Huangba7bef92018-12-26 16:53:03 +08002298 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002299 EXPECT_TRUE(fd3 != -1);
2300
Luke Huang9c264bb2018-12-18 16:44:41 +08002301 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002302 int rcode;
2303
Luke Huang9c264bb2018-12-18 16:44:41 +08002304 // expect no response
2305 int res = getAsyncResponse(fd3, &rcode, buf, MAXPACKET);
2306 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huang94b10b92018-11-21 20:13:38 +08002307
Luke Huang9c264bb2018-12-18 16:44:41 +08002308 // expect no response
Luke Huang94b10b92018-11-21 20:13:38 +08002309 memset(buf, 0, MAXPACKET);
Luke Huang9c264bb2018-12-18 16:44:41 +08002310 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2311 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huang94b10b92018-11-21 20:13:38 +08002312
Luke Huang94b10b92018-11-21 20:13:38 +08002313 dns.setResponseProbability(1.0);
Luke Huang94b10b92018-11-21 20:13:38 +08002314
Luke Huangba7bef92018-12-26 16:53:03 +08002315 int fd4 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002316 EXPECT_TRUE(fd4 != -1);
2317
2318 memset(buf, 0, MAXPACKET);
2319 res = getAsyncResponse(fd4, &rcode, buf, MAXPACKET);
2320 EXPECT_GT(res, 0);
2321 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2322
2323 memset(buf, 0, MAXPACKET);
2324 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2325 EXPECT_GT(res, 0);
2326 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
Mike Yu532405f2020-06-17 17:46:44 +08002327
2328 // Trailing dot is removed. Is it intended?
2329 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, 0, "howdy.example.com", {"::1.2.3.4"});
2330 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2331 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2332 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, 0, "howdy.example.com", {"1.2.3.4"});
Luke Huang94b10b92018-11-21 20:13:38 +08002333}
2334
2335TEST_F(ResolverTest, Async_MalformedQuery) {
Xiao Ma09b71022018-12-11 17:56:32 +09002336 constexpr char listen_addr[] = "127.0.0.4";
2337 constexpr char host_name[] = "howdy.example.com.";
2338 const std::vector<DnsRecord> records = {
2339 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2340 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2341 };
2342
2343 test::DNSResponder dns(listen_addr);
2344 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002345 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002346 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002347
2348 int fd = dns_open_proxy();
2349 EXPECT_TRUE(fd > 0);
2350
2351 const std::string badMsg = "16-52512#";
Xiao Ma09b71022018-12-11 17:56:32 +09002352 static const struct {
Luke Huang94b10b92018-11-21 20:13:38 +08002353 const std::string cmd;
2354 const int expectErr;
2355 } kTestData[] = {
Luke Huangba7bef92018-12-26 16:53:03 +08002356 // Too few arguments
Luke Huang94b10b92018-11-21 20:13:38 +08002357 {"resnsend " + badMsg + '\0', -EINVAL},
2358 // Bad netId
Luke Huangba7bef92018-12-26 16:53:03 +08002359 {"resnsend badnetId 0 " + badMsg + '\0', -EINVAL},
Luke Huang94b10b92018-11-21 20:13:38 +08002360 // Bad raw data
Luke Huangba7bef92018-12-26 16:53:03 +08002361 {"resnsend " + std::to_string(TEST_NETID) + " 0 " + badMsg + '\0', -EILSEQ},
Luke Huang94b10b92018-11-21 20:13:38 +08002362 };
2363
2364 for (unsigned int i = 0; i < std::size(kTestData); i++) {
2365 auto& td = kTestData[i];
2366 SCOPED_TRACE(td.cmd);
2367 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, td.cmd.c_str(), td.cmd.size()));
2368 EXPECT_EQ(rc, static_cast<ssize_t>(td.cmd.size()));
2369
2370 int32_t tmp;
2371 rc = TEMP_FAILURE_RETRY(read(fd, &tmp, sizeof(tmp)));
2372 EXPECT_TRUE(rc > 0);
2373 EXPECT_EQ(static_cast<int>(ntohl(tmp)), td.expectErr);
2374 }
2375 // Normal query with answer buffer
2376 // This is raw data of query "howdy.example.com" type 1 class 1
2377 std::string query = "81sBAAABAAAAAAAABWhvd2R5B2V4YW1wbGUDY29tAAABAAE=";
Luke Huangba7bef92018-12-26 16:53:03 +08002378 std::string cmd = "resnsend " + std::to_string(TEST_NETID) + " 0 " + query + '\0';
Luke Huang94b10b92018-11-21 20:13:38 +08002379 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
2380 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
2381
Luke Huang70931aa2019-01-31 11:57:41 +08002382 uint8_t smallBuf[1] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002383 int rcode;
2384 rc = getAsyncResponse(fd, &rcode, smallBuf, 1);
Luke Huangba7bef92018-12-26 16:53:03 +08002385 EXPECT_EQ(-EMSGSIZE, rc);
Luke Huang94b10b92018-11-21 20:13:38 +08002386
2387 // Do the normal test with large buffer again
2388 fd = dns_open_proxy();
2389 EXPECT_TRUE(fd > 0);
2390 rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
2391 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
Luke Huang70931aa2019-01-31 11:57:41 +08002392 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002393 rc = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2394 EXPECT_EQ("1.2.3.4", toString(buf, rc, AF_INET));
Mike Yu4f3747b2018-12-02 17:54:29 +09002395}
2396
Luke Huangba7bef92018-12-26 16:53:03 +08002397TEST_F(ResolverTest, Async_CacheFlags) {
Xiao Ma09b71022018-12-11 17:56:32 +09002398 constexpr char listen_addr[] = "127.0.0.4";
Luke Huang4eabbe32020-05-28 03:17:32 +08002399 constexpr char host_name1[] = "howdy.example.com.";
2400 constexpr char host_name2[] = "howdy.example2.com.";
2401 constexpr char host_name3[] = "howdy.example3.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002402 const std::vector<DnsRecord> records = {
Luke Huang4eabbe32020-05-28 03:17:32 +08002403 {host_name1, ns_type::ns_t_a, "1.2.3.4"}, {host_name1, ns_type::ns_t_aaaa, "::1.2.3.4"},
2404 {host_name2, ns_type::ns_t_a, "1.2.3.5"}, {host_name2, ns_type::ns_t_aaaa, "::1.2.3.5"},
2405 {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 +09002406 };
2407
2408 test::DNSResponder dns(listen_addr);
2409 StartDns(dns, records);
Luke Huangba7bef92018-12-26 16:53:03 +08002410 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002411 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huangba7bef92018-12-26 16:53:03 +08002412
2413 // ANDROID_RESOLV_NO_CACHE_STORE
2414 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2415 ANDROID_RESOLV_NO_CACHE_STORE);
2416 EXPECT_TRUE(fd1 != -1);
2417 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2418 ANDROID_RESOLV_NO_CACHE_STORE);
2419 EXPECT_TRUE(fd2 != -1);
2420 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2421 ANDROID_RESOLV_NO_CACHE_STORE);
2422 EXPECT_TRUE(fd3 != -1);
2423
2424 expectAnswersValid(fd3, AF_INET, "1.2.3.4");
2425 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
2426 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2427
2428 // No cache exists, expect 3 queries
Luke Huang4eabbe32020-05-28 03:17:32 +08002429 EXPECT_EQ(3U, GetNumQueries(dns, host_name1));
Luke Huangba7bef92018-12-26 16:53:03 +08002430
Luke Huang4eabbe32020-05-28 03:17:32 +08002431 // Raise a query with no flags to ensure no cache exists. Also make an cache entry for the
2432 // query.
Luke Huangba7bef92018-12-26 16:53:03 +08002433 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2434
2435 EXPECT_TRUE(fd1 != -1);
2436
2437 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2438
Luke Huang4eabbe32020-05-28 03:17:32 +08002439 // Expect 4 queries because there should be no cache before this query.
2440 EXPECT_EQ(4U, GetNumQueries(dns, host_name1));
2441
2442 // Now we have the cache entry, re-query with ANDROID_RESOLV_NO_CACHE_STORE to ensure
2443 // that ANDROID_RESOLV_NO_CACHE_STORE implied ANDROID_RESOLV_NO_CACHE_LOOKUP.
2444 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2445 ANDROID_RESOLV_NO_CACHE_STORE);
2446 EXPECT_TRUE(fd1 != -1);
2447 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2448 // Expect 5 queries because we shouldn't do cache lookup for the query which has
2449 // ANDROID_RESOLV_NO_CACHE_STORE.
2450 EXPECT_EQ(5U, GetNumQueries(dns, host_name1));
Luke Huangba7bef92018-12-26 16:53:03 +08002451
2452 // ANDROID_RESOLV_NO_CACHE_LOOKUP
2453 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2454 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2455 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2456 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2457
2458 EXPECT_TRUE(fd1 != -1);
2459 EXPECT_TRUE(fd2 != -1);
2460
2461 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
2462 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2463
Luke Huang4eabbe32020-05-28 03:17:32 +08002464 // Cache was skipped, expect 2 more queries.
2465 EXPECT_EQ(7U, GetNumQueries(dns, host_name1));
Luke Huangba7bef92018-12-26 16:53:03 +08002466
2467 // Re-query verify cache works
Luke Huang4eabbe32020-05-28 03:17:32 +08002468 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huangba7bef92018-12-26 16:53:03 +08002469 EXPECT_TRUE(fd1 != -1);
2470 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2471
Luke Huang4eabbe32020-05-28 03:17:32 +08002472 // Cache hits, expect still 7 queries
2473 EXPECT_EQ(7U, GetNumQueries(dns, host_name1));
Luke Huanga1d74182019-03-19 17:30:36 +08002474
2475 // Start to verify if ANDROID_RESOLV_NO_CACHE_LOOKUP does write response into cache
2476 dns.clearQueries();
2477
Luke Huang4eabbe32020-05-28 03:17:32 +08002478 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa,
Luke Huanga1d74182019-03-19 17:30:36 +08002479 ANDROID_RESOLV_NO_CACHE_LOOKUP);
Luke Huang4eabbe32020-05-28 03:17:32 +08002480 fd2 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa,
Luke Huanga1d74182019-03-19 17:30:36 +08002481 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2482
2483 EXPECT_TRUE(fd1 != -1);
2484 EXPECT_TRUE(fd2 != -1);
2485
Luke Huang4eabbe32020-05-28 03:17:32 +08002486 expectAnswersValid(fd2, AF_INET6, "::1.2.3.5");
2487 expectAnswersValid(fd1, AF_INET6, "::1.2.3.5");
Luke Huanga1d74182019-03-19 17:30:36 +08002488
2489 // Skip cache, expect 2 queries
Luke Huang4eabbe32020-05-28 03:17:32 +08002490 EXPECT_EQ(2U, GetNumQueries(dns, host_name2));
Luke Huanga1d74182019-03-19 17:30:36 +08002491
2492 // Re-query without flags
Luke Huang4eabbe32020-05-28 03:17:32 +08002493 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa, 0);
2494 fd2 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa, 0);
Luke Huanga1d74182019-03-19 17:30:36 +08002495
2496 EXPECT_TRUE(fd1 != -1);
2497 EXPECT_TRUE(fd2 != -1);
2498
Luke Huang4eabbe32020-05-28 03:17:32 +08002499 expectAnswersValid(fd2, AF_INET6, "::1.2.3.5");
2500 expectAnswersValid(fd1, AF_INET6, "::1.2.3.5");
Luke Huanga1d74182019-03-19 17:30:36 +08002501
2502 // Cache hits, expect still 2 queries
Luke Huang4eabbe32020-05-28 03:17:32 +08002503 EXPECT_EQ(2U, GetNumQueries(dns, host_name2));
Luke Huang40f5f492019-05-09 19:37:35 +08002504
2505 // Test both ANDROID_RESOLV_NO_CACHE_STORE and ANDROID_RESOLV_NO_CACHE_LOOKUP are set
2506 dns.clearQueries();
2507
Luke Huang4eabbe32020-05-28 03:17:32 +08002508 // Make sure that the cache of "howdy.example3.com" exists.
2509 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang40f5f492019-05-09 19:37:35 +08002510 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002511 expectAnswersValid(fd1, AF_INET6, "::1.2.3.6");
2512 EXPECT_EQ(1U, GetNumQueries(dns, host_name3));
Luke Huang40f5f492019-05-09 19:37:35 +08002513
2514 // Re-query with testFlags
2515 const int testFlag = ANDROID_RESOLV_NO_CACHE_STORE | ANDROID_RESOLV_NO_CACHE_LOOKUP;
Luke Huang4eabbe32020-05-28 03:17:32 +08002516 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_aaaa, testFlag);
Luke Huang40f5f492019-05-09 19:37:35 +08002517 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002518 expectAnswersValid(fd1, AF_INET6, "::1.2.3.6");
Luke Huang40f5f492019-05-09 19:37:35 +08002519 // Expect cache lookup is skipped.
Luke Huang4eabbe32020-05-28 03:17:32 +08002520 EXPECT_EQ(2U, GetNumQueries(dns, host_name3));
Luke Huang40f5f492019-05-09 19:37:35 +08002521
2522 // Do another query with testFlags
Luke Huang4eabbe32020-05-28 03:17:32 +08002523 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_a, testFlag);
Luke Huang40f5f492019-05-09 19:37:35 +08002524 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002525 expectAnswersValid(fd1, AF_INET, "1.2.3.6");
Luke Huang40f5f492019-05-09 19:37:35 +08002526 // Expect cache lookup is skipped.
Luke Huang4eabbe32020-05-28 03:17:32 +08002527 EXPECT_EQ(3U, GetNumQueries(dns, host_name3));
Luke Huang40f5f492019-05-09 19:37:35 +08002528
2529 // Re-query with no flags
Luke Huang4eabbe32020-05-28 03:17:32 +08002530 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_a, 0);
Luke Huang40f5f492019-05-09 19:37:35 +08002531 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002532 expectAnswersValid(fd1, AF_INET, "1.2.3.6");
Luke Huang40f5f492019-05-09 19:37:35 +08002533 // Expect no cache hit because cache storing is also skipped in previous query.
Luke Huang4eabbe32020-05-28 03:17:32 +08002534 EXPECT_EQ(4U, GetNumQueries(dns, host_name3));
Luke Huangba7bef92018-12-26 16:53:03 +08002535}
2536
Luke Huang08b13d22020-02-05 14:46:21 +08002537TEST_F(ResolverTest, Async_NoCacheStoreFlagDoesNotRefreshStaleCacheEntry) {
2538 constexpr char listen_addr[] = "127.0.0.4";
2539 constexpr char host_name[] = "howdy.example.com.";
2540 const std::vector<DnsRecord> records = {
2541 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2542 };
2543
2544 test::DNSResponder dns(listen_addr);
2545 StartDns(dns, records);
2546 std::vector<std::string> servers = {listen_addr};
2547 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
2548
2549 const unsigned SHORT_TTL_SEC = 1;
2550 dns.setTtl(SHORT_TTL_SEC);
2551
2552 // Refer to b/148842821 for the purpose of below test steps.
2553 // Basically, this test is used to ensure stale cache case is handled
2554 // correctly with ANDROID_RESOLV_NO_CACHE_STORE.
2555 int fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2556 EXPECT_TRUE(fd != -1);
2557 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2558
2559 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2560 dns.clearQueries();
2561
2562 // Wait until cache expired
2563 sleep(SHORT_TTL_SEC + 0.5);
2564
2565 // Now request the same hostname again.
2566 // We should see a new DNS query because the entry in cache has become stale.
2567 // Due to ANDROID_RESOLV_NO_CACHE_STORE, this query must *not* refresh that stale entry.
2568 fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2569 ANDROID_RESOLV_NO_CACHE_STORE);
2570 EXPECT_TRUE(fd != -1);
2571 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2572 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2573 dns.clearQueries();
2574
2575 // If the cache is still stale, we expect to see one more DNS query
2576 // (this time the cache will be refreshed, but we're not checking for it).
2577 fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2578 EXPECT_TRUE(fd != -1);
2579 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2580 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2581}
2582
Luke Huangba7bef92018-12-26 16:53:03 +08002583TEST_F(ResolverTest, Async_NoRetryFlag) {
Luke Huang70931aa2019-01-31 11:57:41 +08002584 constexpr char listen_addr0[] = "127.0.0.4";
2585 constexpr char listen_addr1[] = "127.0.0.6";
Xiao Ma09b71022018-12-11 17:56:32 +09002586 constexpr char host_name[] = "howdy.example.com.";
2587 const std::vector<DnsRecord> records = {
2588 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2589 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2590 };
2591
Luke Huang70931aa2019-01-31 11:57:41 +08002592 test::DNSResponder dns0(listen_addr0);
2593 test::DNSResponder dns1(listen_addr1);
2594 StartDns(dns0, records);
2595 StartDns(dns1, records);
2596 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr0, listen_addr1}));
Luke Huangba7bef92018-12-26 16:53:03 +08002597
Luke Huang70931aa2019-01-31 11:57:41 +08002598 dns0.clearQueries();
2599 dns1.clearQueries();
2600
2601 dns0.setResponseProbability(0.0);
2602 dns1.setResponseProbability(0.0);
Luke Huangba7bef92018-12-26 16:53:03 +08002603
2604 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2605 ANDROID_RESOLV_NO_RETRY);
2606 EXPECT_TRUE(fd1 != -1);
2607
2608 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa,
2609 ANDROID_RESOLV_NO_RETRY);
2610 EXPECT_TRUE(fd2 != -1);
2611
2612 // expect no response
2613 expectAnswersNotValid(fd1, -ETIMEDOUT);
2614 expectAnswersNotValid(fd2, -ETIMEDOUT);
Mike Yu532405f2020-06-17 17:46:44 +08002615 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2616 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
Luke Huangba7bef92018-12-26 16:53:03 +08002617
Luke Huang70931aa2019-01-31 11:57:41 +08002618 // No retry case, expect total 2 queries. The server is selected randomly.
2619 EXPECT_EQ(2U, GetNumQueries(dns0, host_name) + GetNumQueries(dns1, host_name));
Luke Huangba7bef92018-12-26 16:53:03 +08002620
Luke Huang70931aa2019-01-31 11:57:41 +08002621 dns0.clearQueries();
2622 dns1.clearQueries();
Luke Huangba7bef92018-12-26 16:53:03 +08002623
2624 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2625 EXPECT_TRUE(fd1 != -1);
2626
2627 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
2628 EXPECT_TRUE(fd2 != -1);
2629
2630 // expect no response
2631 expectAnswersNotValid(fd1, -ETIMEDOUT);
2632 expectAnswersNotValid(fd2, -ETIMEDOUT);
Mike Yu532405f2020-06-17 17:46:44 +08002633 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2634 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
Luke Huangba7bef92018-12-26 16:53:03 +08002635
2636 // Retry case, expect 4 queries
Luke Huang70931aa2019-01-31 11:57:41 +08002637 EXPECT_EQ(4U, GetNumQueries(dns0, host_name));
2638 EXPECT_EQ(4U, GetNumQueries(dns1, host_name));
2639}
2640
2641TEST_F(ResolverTest, Async_VerifyQueryID) {
2642 constexpr char listen_addr[] = "127.0.0.4";
2643 constexpr char host_name[] = "howdy.example.com.";
2644 const std::vector<DnsRecord> records = {
2645 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2646 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2647 };
2648
2649 test::DNSResponder dns(listen_addr);
2650 StartDns(dns, records);
2651 std::vector<std::string> servers = {listen_addr};
2652 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
2653
2654 const uint8_t queryBuf1[] = {
2655 /* Header */
2656 0x55, 0x66, /* Transaction ID */
2657 0x01, 0x00, /* Flags */
2658 0x00, 0x01, /* Questions */
2659 0x00, 0x00, /* Answer RRs */
2660 0x00, 0x00, /* Authority RRs */
2661 0x00, 0x00, /* Additional RRs */
2662 /* Queries */
2663 0x05, 0x68, 0x6f, 0x77, 0x64, 0x79, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
2664 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name */
2665 0x00, 0x01, /* Type */
2666 0x00, 0x01 /* Class */
2667 };
2668
2669 int fd = resNetworkSend(TEST_NETID, queryBuf1, sizeof(queryBuf1), 0);
2670 EXPECT_TRUE(fd != -1);
2671
2672 uint8_t buf[MAXPACKET] = {};
2673 int rcode;
2674
2675 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2676 EXPECT_GT(res, 0);
2677 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2678
2679 auto hp = reinterpret_cast<HEADER*>(buf);
2680 EXPECT_EQ(21862U, htons(hp->id));
2681
2682 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2683
2684 const uint8_t queryBuf2[] = {
2685 /* Header */
2686 0x00, 0x53, /* Transaction ID */
2687 0x01, 0x00, /* Flags */
2688 0x00, 0x01, /* Questions */
2689 0x00, 0x00, /* Answer RRs */
2690 0x00, 0x00, /* Authority RRs */
2691 0x00, 0x00, /* Additional RRs */
2692 /* Queries */
2693 0x05, 0x68, 0x6f, 0x77, 0x64, 0x79, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
2694 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name */
2695 0x00, 0x01, /* Type */
2696 0x00, 0x01 /* Class */
2697 };
2698
2699 // Re-query verify cache works and query id is correct
2700 fd = resNetworkSend(TEST_NETID, queryBuf2, sizeof(queryBuf2), 0);
2701
2702 EXPECT_TRUE(fd != -1);
2703
2704 res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2705 EXPECT_GT(res, 0);
2706 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2707
2708 EXPECT_EQ(0x0053U, htons(hp->id));
2709
2710 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
Luke Huangba7bef92018-12-26 16:53:03 +08002711}
2712
Mike Yu4f3747b2018-12-02 17:54:29 +09002713// This test checks that the resolver should not generate the request containing OPT RR when using
Ken Chen0a015532019-01-02 14:59:38 +08002714// cleartext DNS. If we query the DNS server not supporting EDNS0 and it reponds with
2715// FORMERR_ON_EDNS, we will fallback to no EDNS0 and try again. If the server does no response, we
2716// won't retry so that we get no answer.
Mike Yu4f3747b2018-12-02 17:54:29 +09002717TEST_F(ResolverTest, BrokenEdns) {
2718 typedef test::DNSResponder::Edns Edns;
2719 enum ExpectResult { EXPECT_FAILURE, EXPECT_SUCCESS };
2720
Mike Yu3977d482020-02-26 17:18:57 +08002721 // Perform cleartext query in off mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002722 const char OFF[] = "off";
Mike Yu3977d482020-02-26 17:18:57 +08002723
2724 // Perform cleartext query when there's no private DNS server validated in opportunistic mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002725 const char OPPORTUNISTIC_UDP[] = "opportunistic_udp";
Mike Yu3977d482020-02-26 17:18:57 +08002726
2727 // Perform cleartext query when there is a private DNS server validated in opportunistic mode.
2728 const char OPPORTUNISTIC_FALLBACK_UDP[] = "opportunistic_fallback_udp";
2729
2730 // Perform cyphertext query in opportunistic mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002731 const char OPPORTUNISTIC_TLS[] = "opportunistic_tls";
Mike Yu3977d482020-02-26 17:18:57 +08002732
2733 // Perform cyphertext query in strict mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002734 const char STRICT[] = "strict";
Mike Yu3977d482020-02-26 17:18:57 +08002735
Mike Yu4f3747b2018-12-02 17:54:29 +09002736 const char GETHOSTBYNAME[] = "gethostbyname";
2737 const char GETADDRINFO[] = "getaddrinfo";
Mike Yu4f3747b2018-12-02 17:54:29 +09002738 const char ADDR4[] = "192.0.2.1";
2739 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2740 const char CLEARTEXT_PORT[] = "53";
2741 const char TLS_PORT[] = "853";
Luke Huangf8215372019-11-22 11:53:41 +08002742 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
Mike Yu3977d482020-02-26 17:18:57 +08002743 ResolverParamsParcel paramsForCleanup = DnsResponderClient::GetDefaultResolverParamsParcel();
2744 paramsForCleanup.servers.clear();
2745 paramsForCleanup.tlsServers.clear();
Mike Yu4f3747b2018-12-02 17:54:29 +09002746
Mike Yufc125e42019-05-15 20:41:28 +08002747 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Mike Yu4f3747b2018-12-02 17:54:29 +09002748 ASSERT_TRUE(dns.startServer());
2749
2750 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2751
Luke Huangf8215372019-11-22 11:53:41 +08002752 // clang-format off
Mike Yu4f3747b2018-12-02 17:54:29 +09002753 static const struct TestConfig {
2754 std::string mode;
2755 std::string method;
2756 Edns edns;
2757 ExpectResult expectResult;
2758
2759 std::string asHostName() const {
2760 const char* ednsString;
2761 switch (edns) {
2762 case Edns::ON:
2763 ednsString = "ednsOn";
2764 break;
Ken Chen0a015532019-01-02 14:59:38 +08002765 case Edns::FORMERR_ON_EDNS:
Mike Yu4f3747b2018-12-02 17:54:29 +09002766 ednsString = "ednsFormerr";
2767 break;
2768 case Edns::DROP:
2769 ednsString = "ednsDrop";
2770 break;
2771 default:
2772 ednsString = "";
2773 break;
2774 }
2775 return StringPrintf("%s.%s.%s.", mode.c_str(), method.c_str(), ednsString);
2776 }
2777 } testConfigs[] = {
Mike Yu3977d482020-02-26 17:18:57 +08002778 // In OPPORTUNISTIC_TLS, if the DNS server doesn't support EDNS0 but TLS, the lookup
2779 // fails. Could such server exist? if so, we might need to fix it to fallback to
2780 // cleartext query. If the server still make no response for the queries with EDNS0, we
2781 // might also need to fix it to retry without EDNS0.
Mike Yu4f3747b2018-12-02 17:54:29 +09002782 // Another thing is that {OPPORTUNISTIC_TLS, Edns::DROP} and {STRICT, Edns::DROP} are
2783 // commented out since TLS timeout is not configurable.
2784 // TODO: Uncomment them after TLS timeout is configurable.
Mike Yu3977d482020-02-26 17:18:57 +08002785 {OFF, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2786 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2787 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2788 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2789 {STRICT, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2790 {OFF, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2791 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2792 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2793 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2794 {STRICT, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2795 {OFF, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2796 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2797
2798 // The failure is due to no retry on timeout. Maybe fix it?
2799 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2800
2801 //{OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2802 //{STRICT, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2803 {OFF, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2804 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2805 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2806 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2807 {STRICT, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2808 {OFF, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2809 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2810 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2811 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2812 {STRICT, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2813 {OFF, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2814 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2815
2816 // The failure is due to no retry on timeout. Maybe fix it?
2817 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2818
Mike Yu4f3747b2018-12-02 17:54:29 +09002819 //{OPPORTUNISTIC_TLS, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2820 //{STRICT, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2821 };
Luke Huangf8215372019-11-22 11:53:41 +08002822 // clang-format on
Mike Yu4f3747b2018-12-02 17:54:29 +09002823
2824 for (const auto& config : testConfigs) {
2825 const std::string testHostName = config.asHostName();
2826 SCOPED_TRACE(testHostName);
2827
2828 const char* host_name = testHostName.c_str();
2829 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
2830 dns.setEdns(config.edns);
2831
2832 if (config.mode == OFF) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002833 if (tls.running()) {
2834 ASSERT_TRUE(tls.stopServer());
2835 }
Xiao Ma09b71022018-12-11 17:56:32 +09002836 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Mike Yu4f3747b2018-12-02 17:54:29 +09002837 } else if (config.mode == OPPORTUNISTIC_UDP) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002838 if (tls.running()) {
2839 ASSERT_TRUE(tls.stopServer());
2840 }
Xiao Ma09b71022018-12-11 17:56:32 +09002841 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002842 kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002843 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), false));
Mike Yu3977d482020-02-26 17:18:57 +08002844 } else if (config.mode == OPPORTUNISTIC_TLS || config.mode == OPPORTUNISTIC_FALLBACK_UDP) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002845 if (!tls.running()) {
2846 ASSERT_TRUE(tls.startServer());
2847 }
Xiao Ma09b71022018-12-11 17:56:32 +09002848 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002849 kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002850 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Mike Yu3977d482020-02-26 17:18:57 +08002851
2852 if (config.mode == OPPORTUNISTIC_FALLBACK_UDP) {
2853 // Force the resolver to fallback to cleartext queries.
2854 ASSERT_TRUE(tls.stopServer());
2855 }
Mike Yu4f3747b2018-12-02 17:54:29 +09002856 } else if (config.mode == STRICT) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002857 if (!tls.running()) {
2858 ASSERT_TRUE(tls.startServer());
2859 }
Xiao Ma09b71022018-12-11 17:56:32 +09002860 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002861 kDefaultParams, kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08002862 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Mike Yu4f3747b2018-12-02 17:54:29 +09002863 }
2864
2865 if (config.method == GETHOSTBYNAME) {
2866 const hostent* h_result = gethostbyname(host_name);
2867 if (config.expectResult == EXPECT_SUCCESS) {
2868 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2869 ASSERT_TRUE(h_result != nullptr);
2870 ASSERT_EQ(4, h_result->h_length);
2871 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
2872 EXPECT_EQ(ADDR4, ToString(h_result));
2873 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
Mike Yu532405f2020-06-17 17:46:44 +08002874 ExpectDnsEvent(INetdEventListener::EVENT_GETHOSTBYNAME, 0, host_name, {ADDR4});
Mike Yu4f3747b2018-12-02 17:54:29 +09002875 } else {
2876 EXPECT_EQ(0U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
2877 ASSERT_TRUE(h_result == nullptr);
2878 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
Mike Yu532405f2020-06-17 17:46:44 +08002879 int returnCode = (config.edns == Edns::DROP) ? RCODE_TIMEOUT : EAI_FAIL;
2880 ExpectDnsEvent(INetdEventListener::EVENT_GETHOSTBYNAME, returnCode, host_name, {});
Mike Yu4f3747b2018-12-02 17:54:29 +09002881 }
2882 } else if (config.method == GETADDRINFO) {
2883 ScopedAddrinfo ai_result;
2884 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2885 ai_result = safe_getaddrinfo(host_name, nullptr, &hints);
2886 if (config.expectResult == EXPECT_SUCCESS) {
2887 EXPECT_TRUE(ai_result != nullptr);
2888 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2889 const std::string result_str = ToString(ai_result);
2890 EXPECT_EQ(ADDR4, result_str);
Mike Yu532405f2020-06-17 17:46:44 +08002891 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, 0, host_name, {ADDR4});
Mike Yu4f3747b2018-12-02 17:54:29 +09002892 } else {
2893 EXPECT_TRUE(ai_result == nullptr);
2894 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
Mike Yu532405f2020-06-17 17:46:44 +08002895 int returnCode = (config.edns == Edns::DROP) ? RCODE_TIMEOUT : EAI_FAIL;
2896 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, returnCode, host_name, {});
Mike Yu4f3747b2018-12-02 17:54:29 +09002897 }
2898 } else {
2899 FAIL() << "Unsupported query method: " << config.method;
2900 }
2901
Mike Yudd4ac2d2019-05-31 16:52:11 +08002902 tls.clearQueries();
Mike Yu4f3747b2018-12-02 17:54:29 +09002903 dns.clearQueries();
Mike Yu3977d482020-02-26 17:18:57 +08002904
2905 // Clear the setup to force the resolver to validate private DNS servers in every test.
2906 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(paramsForCleanup));
Mike Yu4f3747b2018-12-02 17:54:29 +09002907 }
Mike Yu4f3747b2018-12-02 17:54:29 +09002908}
nuccachena26cc2a2018-07-17 18:07:23 +08002909
Ken Chen0a015532019-01-02 14:59:38 +08002910// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2911// Resolver should have a reasonable number of retries instead of spinning forever. We don't have
2912// an efficient way to know if resolver is stuck in an infinite loop. However, test case will be
2913// failed due to timeout.
2914TEST_F(ResolverTest, UnstableTls) {
2915 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2916 const char CLEARTEXT_PORT[] = "53";
2917 const char TLS_PORT[] = "853";
2918 const char* host_name1 = "nonexistent1.example.com.";
2919 const char* host_name2 = "nonexistent2.example.com.";
2920 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
2921
Mike Yufc125e42019-05-15 20:41:28 +08002922 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Ken Chen0a015532019-01-02 14:59:38 +08002923 ASSERT_TRUE(dns.startServer());
2924 dns.setEdns(test::DNSResponder::Edns::FORMERR_ON_EDNS);
2925 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2926 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08002927 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002928 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
2929
Ken Chen0a015532019-01-02 14:59:38 +08002930 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
2931 tls.stopServer();
2932
2933 const hostent* h_result = gethostbyname(host_name1);
2934 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
2935 ASSERT_TRUE(h_result == nullptr);
2936 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2937
2938 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2939 ScopedAddrinfo ai_result = safe_getaddrinfo(host_name2, nullptr, &hints);
2940 EXPECT_TRUE(ai_result == nullptr);
2941 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
2942}
2943
2944// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2945// Moreover, server responds RCODE=FORMERR even on non-EDNS query.
2946TEST_F(ResolverTest, BogusDnsServer) {
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 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2957 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08002958 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002959 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
2960
Ken Chen0a015532019-01-02 14:59:38 +08002961 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
2962 tls.stopServer();
2963 dns.setEdns(test::DNSResponder::Edns::FORMERR_UNCOND);
2964
2965 const hostent* h_result = gethostbyname(host_name1);
2966 EXPECT_EQ(0U, 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(0U, GetNumQueries(dns, host_name2));
2974}
2975
nuccachena26cc2a2018-07-17 18:07:23 +08002976TEST_F(ResolverTest, GetAddrInfo_Dns64Synthesize) {
2977 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002978 constexpr char dns64_name[] = "ipv4only.arpa.";
2979 constexpr char host_name[] = "v4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002980 const std::vector<DnsRecord> records = {
2981 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2982 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2983 };
nuccachena26cc2a2018-07-17 18:07:23 +08002984
Xiao Ma09b71022018-12-11 17:56:32 +09002985 test::DNSResponder dns(listen_addr);
Xiao Ma09b71022018-12-11 17:56:32 +09002986 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002987
2988 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002989 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002990
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002991 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002992 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002993 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002994
2995 // hints are necessary in order to let netd know which type of addresses the caller is
2996 // interested in.
Xiao Ma09b71022018-12-11 17:56:32 +09002997 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08002998 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
2999 EXPECT_TRUE(result != nullptr);
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003000 // TODO: BUG: there should only be two queries, one AAAA (which returns no records) and one A
3001 // (which returns 1.2.3.4). But there is an extra AAAA.
3002 EXPECT_EQ(3U, GetNumQueries(dns, host_name));
nuccachena26cc2a2018-07-17 18:07:23 +08003003
3004 std::string result_str = ToString(result);
3005 EXPECT_EQ(result_str, "64:ff9b::102:304");
3006
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003007 // Stopping NAT64 prefix discovery disables synthesis.
Luke Huang5bd827c2019-03-14 16:10:04 +08003008 EXPECT_TRUE(mDnsClient.resolvService()->stopPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003009 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_NOT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003010
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003011 dns.clearQueries();
nuccachena26cc2a2018-07-17 18:07:23 +08003012
3013 result = safe_getaddrinfo("v4only", nullptr, &hints);
3014 EXPECT_TRUE(result != nullptr);
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003015 // TODO: BUG: there should only be one query, an AAAA (which returns no records), because the
3016 // A is already cached. But there is an extra AAAA.
3017 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
nuccachena26cc2a2018-07-17 18:07:23 +08003018
3019 result_str = ToString(result);
3020 EXPECT_EQ(result_str, "1.2.3.4");
3021}
3022
nuccachena26cc2a2018-07-17 18:07:23 +08003023TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecified) {
3024 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003025 constexpr char dns64_name[] = "ipv4only.arpa.";
3026 constexpr char host_name[] = "v4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003027 const std::vector<DnsRecord> records = {
3028 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3029 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3030 };
nuccachena26cc2a2018-07-17 18:07:23 +08003031
Xiao Ma09b71022018-12-11 17:56:32 +09003032 test::DNSResponder dns(listen_addr);
3033 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003034 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003035 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003036
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003037 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003038 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003039 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003040
3041 // Ensure to synthesize AAAA if AF_INET6 is specified, and not to synthesize AAAA
3042 // in AF_INET case.
3043 addrinfo hints;
3044 memset(&hints, 0, sizeof(hints));
3045 hints.ai_family = AF_INET6;
3046 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
3047 EXPECT_TRUE(result != nullptr);
3048 std::string result_str = ToString(result);
3049 EXPECT_EQ(result_str, "64:ff9b::102:304");
3050
3051 hints.ai_family = AF_INET;
3052 result = safe_getaddrinfo("v4only", nullptr, &hints);
3053 EXPECT_TRUE(result != nullptr);
3054 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3055 result_str = ToString(result);
3056 EXPECT_EQ(result_str, "1.2.3.4");
3057}
nuccachena26cc2a2018-07-17 18:07:23 +08003058
3059TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedV6) {
3060 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003061 constexpr char dns64_name[] = "ipv4only.arpa.";
3062 constexpr char host_name[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003063 const std::vector<DnsRecord> records = {
3064 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3065 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3066 {host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
3067 };
nuccachena26cc2a2018-07-17 18:07:23 +08003068
Xiao Ma09b71022018-12-11 17:56:32 +09003069 test::DNSResponder dns(listen_addr);
3070 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003071 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003072 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003073
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003074 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003075 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003076 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003077
Xiao Ma09b71022018-12-11 17:56:32 +09003078 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08003079 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
3080 EXPECT_TRUE(result != nullptr);
3081 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3082
3083 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
Xiao Ma09b71022018-12-11 17:56:32 +09003084 const std::vector<std::string> result_strs = ToStrings(result);
nuccachena26cc2a2018-07-17 18:07:23 +08003085 for (const auto& str : result_strs) {
3086 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
3087 << ", result_str='" << str << "'";
3088 }
3089}
3090
3091TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedNoV6) {
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 };
nuccachena26cc2a2018-07-17 18:07:23 +08003099
Xiao Ma09b71022018-12-11 17:56:32 +09003100 test::DNSResponder dns(listen_addr);
3101 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003102 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003103 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003104
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003105 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003106 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003107 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003108
Xiao Ma09b71022018-12-11 17:56:32 +09003109 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08003110 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
3111 EXPECT_TRUE(result != nullptr);
3112 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3113
3114 // In AF_UNSPEC case, synthesize AAAA if there's no AAAA answer.
3115 std::string result_str = ToString(result);
3116 EXPECT_EQ(result_str, "64:ff9b::102:304");
3117}
3118
3119TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecialUseIPv4Addresses) {
3120 constexpr char THIS_NETWORK[] = "this_network";
3121 constexpr char LOOPBACK[] = "loopback";
3122 constexpr char LINK_LOCAL[] = "link_local";
3123 constexpr char MULTICAST[] = "multicast";
3124 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
3125
3126 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
3127 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
3128 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
3129 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
3130 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
3131
3132 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003133 constexpr char dns64_name[] = "ipv4only.arpa.";
3134
Xiao Ma09b71022018-12-11 17:56:32 +09003135 test::DNSResponder dns(listen_addr);
3136 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003137 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003138 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003139
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003140 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003141 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003142 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003143
Luke Huangf8215372019-11-22 11:53:41 +08003144 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003145 static const struct TestConfig {
3146 std::string name;
3147 std::string addr;
3148
3149 std::string asHostName() const { return StringPrintf("%s.example.com.", name.c_str()); }
3150 } testConfigs[]{
3151 {THIS_NETWORK, ADDR_THIS_NETWORK},
3152 {LOOPBACK, ADDR_LOOPBACK},
3153 {LINK_LOCAL, ADDR_LINK_LOCAL},
3154 {MULTICAST, ADDR_MULTICAST},
3155 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
3156 };
Luke Huangf8215372019-11-22 11:53:41 +08003157 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003158
3159 for (const auto& config : testConfigs) {
3160 const std::string testHostName = config.asHostName();
3161 SCOPED_TRACE(testHostName);
3162
3163 const char* host_name = testHostName.c_str();
3164 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
3165
3166 addrinfo hints;
3167 memset(&hints, 0, sizeof(hints));
3168 hints.ai_family = AF_INET6;
3169 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
3170 // In AF_INET6 case, don't return IPv4 answers
3171 EXPECT_TRUE(result == nullptr);
3172 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3173 dns.clearQueries();
3174
3175 memset(&hints, 0, sizeof(hints));
3176 hints.ai_family = AF_UNSPEC;
3177 result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
3178 EXPECT_TRUE(result != nullptr);
3179 // Expect IPv6 query only. IPv4 answer has been cached in previous query.
3180 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3181 // In AF_UNSPEC case, don't synthesize special use IPv4 address.
3182 std::string result_str = ToString(result);
3183 EXPECT_EQ(result_str, config.addr.c_str());
3184 dns.clearQueries();
3185 }
3186}
3187
3188TEST_F(ResolverTest, GetAddrInfo_Dns64QueryWithNullArgumentHints) {
3189 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003190 constexpr char dns64_name[] = "ipv4only.arpa.";
3191 constexpr char host_name[] = "v4only.example.com.";
3192 constexpr char host_name2[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003193 const std::vector<DnsRecord> records = {
3194 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3195 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3196 {host_name2, ns_type::ns_t_a, "1.2.3.4"},
3197 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
3198 };
nuccachena26cc2a2018-07-17 18:07:23 +08003199
Xiao Ma09b71022018-12-11 17:56:32 +09003200 test::DNSResponder dns(listen_addr);
3201 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003202 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003203 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003204
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003205 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003206 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003207 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003208
3209 // Assign argument hints of getaddrinfo() as null is equivalent to set ai_family AF_UNSPEC.
3210 // In AF_UNSPEC case, synthesize AAAA if there has A answer only.
3211 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, nullptr);
3212 EXPECT_TRUE(result != nullptr);
3213 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3214 std::string result_str = ToString(result);
3215 EXPECT_EQ(result_str, "64:ff9b::102:304");
3216 dns.clearQueries();
3217
3218 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
3219 result = safe_getaddrinfo("v4v6", nullptr, nullptr);
3220 EXPECT_TRUE(result != nullptr);
3221 EXPECT_LE(2U, GetNumQueries(dns, host_name2));
3222 std::vector<std::string> result_strs = ToStrings(result);
3223 for (const auto& str : result_strs) {
3224 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
3225 << ", result_str='" << str << "'";
3226 }
3227}
3228
3229TEST_F(ResolverTest, GetAddrInfo_Dns64QueryNullArgumentNode) {
3230 constexpr char ADDR_ANYADDR_V4[] = "0.0.0.0";
3231 constexpr char ADDR_ANYADDR_V6[] = "::";
3232 constexpr char ADDR_LOCALHOST_V4[] = "127.0.0.1";
3233 constexpr char ADDR_LOCALHOST_V6[] = "::1";
3234
3235 constexpr char PORT_NAME_HTTP[] = "http";
3236 constexpr char PORT_NUMBER_HTTP[] = "80";
3237
3238 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003239 constexpr char dns64_name[] = "ipv4only.arpa.";
3240
Xiao Ma09b71022018-12-11 17:56:32 +09003241 test::DNSResponder dns(listen_addr);
3242 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003243 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003244 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003245
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003246 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003247 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003248 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003249
Luke Huangf8215372019-11-22 11:53:41 +08003250 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003251 // If node is null, return address is listed by libc/getaddrinfo.c as follows.
3252 // - passive socket -> anyaddr (0.0.0.0 or ::)
3253 // - non-passive socket -> localhost (127.0.0.1 or ::1)
3254 static const struct TestConfig {
3255 int flag;
3256 std::string addr_v4;
3257 std::string addr_v6;
3258
3259 std::string asParameters() const {
3260 return StringPrintf("flag=%d, addr_v4=%s, addr_v6=%s", flag, addr_v4.c_str(),
3261 addr_v6.c_str());
3262 }
3263 } testConfigs[]{
3264 {0 /* non-passive */, ADDR_LOCALHOST_V4, ADDR_LOCALHOST_V6},
3265 {AI_PASSIVE, ADDR_ANYADDR_V4, ADDR_ANYADDR_V6}
3266 };
Luke Huangf8215372019-11-22 11:53:41 +08003267 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003268
3269 for (const auto& config : testConfigs) {
3270 SCOPED_TRACE(config.asParameters());
3271
Xiao Ma09b71022018-12-11 17:56:32 +09003272 addrinfo hints = {
Nick Desaulnierscd6395a2019-10-11 09:15:24 -07003273 .ai_flags = config.flag,
Xiao Ma09b71022018-12-11 17:56:32 +09003274 .ai_family = AF_UNSPEC, // any address family
3275 .ai_socktype = 0, // any type
3276 .ai_protocol = 0, // any protocol
Xiao Ma09b71022018-12-11 17:56:32 +09003277 };
nuccachena26cc2a2018-07-17 18:07:23 +08003278
3279 // Assign hostname as null and service as port name.
3280 ScopedAddrinfo result = safe_getaddrinfo(nullptr, PORT_NAME_HTTP, &hints);
3281 ASSERT_TRUE(result != nullptr);
3282
3283 // Can't be synthesized because it should not get into Netd.
3284 std::vector<std::string> result_strs = ToStrings(result);
3285 for (const auto& str : result_strs) {
3286 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
3287 << ", result_str='" << str << "'";
3288 }
3289
3290 // Assign hostname as null and service as numeric port number.
3291 hints.ai_flags = config.flag | AI_NUMERICSERV;
3292 result = safe_getaddrinfo(nullptr, PORT_NUMBER_HTTP, &hints);
3293 ASSERT_TRUE(result != nullptr);
3294
3295 // Can't be synthesized because it should not get into Netd.
3296 result_strs = ToStrings(result);
3297 for (const auto& str : result_strs) {
3298 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
3299 << ", result_str='" << str << "'";
3300 }
3301 }
3302}
3303
3304TEST_F(ResolverTest, GetHostByAddr_ReverseDnsQueryWithHavingNat64Prefix) {
3305 struct hostent* result = nullptr;
3306 struct in_addr v4addr;
3307 struct in6_addr v6addr;
3308
3309 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003310 constexpr char dns64_name[] = "ipv4only.arpa.";
3311 constexpr char ptr_name[] = "v4v6.example.com.";
3312 // PTR record for IPv4 address 1.2.3.4
3313 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3314 // PTR record for IPv6 address 2001:db8::102:304
3315 constexpr char ptr_addr_v6[] =
3316 "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 +09003317 const std::vector<DnsRecord> records = {
3318 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3319 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3320 {ptr_addr_v6, ns_type::ns_t_ptr, ptr_name},
3321 };
nuccachena26cc2a2018-07-17 18:07:23 +08003322
Xiao Ma09b71022018-12-11 17:56:32 +09003323 test::DNSResponder dns(listen_addr);
3324 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003325 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003326 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003327
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003328 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003329 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003330 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003331
3332 // Reverse IPv4 DNS query. Prefix should have no effect on it.
3333 inet_pton(AF_INET, "1.2.3.4", &v4addr);
3334 result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
3335 ASSERT_TRUE(result != nullptr);
3336 std::string result_str = result->h_name ? result->h_name : "null";
3337 EXPECT_EQ(result_str, "v4v6.example.com");
3338
3339 // Reverse IPv6 DNS query. Prefix should have no effect on it.
3340 inet_pton(AF_INET6, "2001:db8::102:304", &v6addr);
3341 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3342 ASSERT_TRUE(result != nullptr);
3343 result_str = result->h_name ? result->h_name : "null";
3344 EXPECT_EQ(result_str, "v4v6.example.com");
3345}
3346
3347TEST_F(ResolverTest, GetHostByAddr_ReverseDns64Query) {
3348 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003349 constexpr char dns64_name[] = "ipv4only.arpa.";
3350 constexpr char ptr_name[] = "v4only.example.com.";
3351 // PTR record for IPv4 address 1.2.3.4
3352 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3353 // PTR record for IPv6 address 64:ff9b::1.2.3.4
3354 constexpr char ptr_addr_v6_nomapping[] =
3355 "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.";
3356 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
3357 // PTR record for IPv6 address 64:ff9b::5.6.7.8
3358 constexpr char ptr_addr_v6_synthesis[] =
3359 "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 +09003360 const std::vector<DnsRecord> records = {
3361 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3362 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3363 {ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis},
3364 };
nuccachena26cc2a2018-07-17 18:07:23 +08003365
Xiao Ma09b71022018-12-11 17:56:32 +09003366 test::DNSResponder dns(listen_addr);
3367 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003368 // "ptr_addr_v6_nomapping" is not mapped in DNS server
nuccachena26cc2a2018-07-17 18:07:23 +08003369 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003370 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003371
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003372 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003373 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003374 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003375
3376 // Synthesized PTR record doesn't exist on DNS server
3377 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
3378 // After querying synthesized address failed, expect that prefix is removed from IPv6
3379 // synthesized address and do reverse IPv4 query instead.
3380 struct in6_addr v6addr;
3381 inet_pton(AF_INET6, "64:ff9b::1.2.3.4", &v6addr);
3382 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3383 ASSERT_TRUE(result != nullptr);
3384 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist
3385 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist
3386 std::string result_str = result->h_name ? result->h_name : "null";
3387 EXPECT_EQ(result_str, "v4only.example.com");
3388 // Check that return address has been mapped from IPv4 to IPv6 address because Netd
3389 // removes NAT64 prefix and does IPv4 DNS reverse lookup in this case. Then, Netd
3390 // fakes the return IPv4 address as original queried IPv6 address.
3391 result_str = ToString(result);
3392 EXPECT_EQ(result_str, "64:ff9b::102:304");
3393 dns.clearQueries();
3394
3395 // Synthesized PTR record exists on DNS server
3396 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
3397 // Expect to Netd pass through synthesized address for DNS queries.
3398 inet_pton(AF_INET6, "64:ff9b::5.6.7.8", &v6addr);
3399 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3400 ASSERT_TRUE(result != nullptr);
3401 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
3402 result_str = result->h_name ? result->h_name : "null";
3403 EXPECT_EQ(result_str, "v6synthesis.example.com");
3404}
3405
3406TEST_F(ResolverTest, GetHostByAddr_ReverseDns64QueryFromHostFile) {
3407 constexpr char dns64_name[] = "ipv4only.arpa.";
3408 constexpr char host_name[] = "localhost";
3409 // The address is synthesized by prefix64:localhost.
3410 constexpr char host_addr[] = "64:ff9b::7f00:1";
nuccachena26cc2a2018-07-17 18:07:23 +08003411 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003412
3413 test::DNSResponder dns(listen_addr);
3414 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003415 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003416 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003417
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003418 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003419 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003420 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003421
3422 // Using synthesized "localhost" address to be a trick for resolving host name
3423 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
3424 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
3425 struct in6_addr v6addr;
3426 inet_pton(AF_INET6, host_addr, &v6addr);
3427 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3428 ASSERT_TRUE(result != nullptr);
3429 // Expect no DNS queries; localhost is resolved via /etc/hosts.
3430 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
3431
Luke Huangf8215372019-11-22 11:53:41 +08003432 ASSERT_EQ(sizeof(in6_addr), (unsigned)result->h_length);
nuccachena26cc2a2018-07-17 18:07:23 +08003433 ASSERT_EQ(AF_INET6, result->h_addrtype);
3434 std::string result_str = ToString(result);
3435 EXPECT_EQ(result_str, host_addr);
3436 result_str = result->h_name ? result->h_name : "null";
3437 EXPECT_EQ(result_str, host_name);
3438}
3439
Hungming Chen9e6185a2019-06-04 16:09:19 +08003440TEST_F(ResolverTest, GetHostByAddr_cnamesClasslessReverseDelegation) {
3441 // IPv4 addresses in the subnet with notation '/' or '-'.
3442 constexpr char addr_slash[] = "192.0.2.1";
3443 constexpr char addr_hyphen[] = "192.0.3.1";
3444
3445 // Used to verify DNS reverse query for classless reverse lookup zone. See detail in RFC 2317
3446 // section 4.
3447 const static std::vector<DnsRecord> records = {
3448 // The records for reverse querying "192.0.2.1" in the subnet with notation '/'.
3449 {"1.2.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0/25.2.0.192.in-addr.arpa."},
3450 {"1.0/25.2.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3451
3452 // The records for reverse querying "192.0.3.1" in the subnet with notation '-'.
3453 {"1.3.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0-127.3.0.192.in-addr.arpa."},
3454 {"1.0-127.3.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3455 };
3456
3457 test::DNSResponder dns;
3458 StartDns(dns, records);
3459 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3460
3461 for (const auto& address : {addr_slash, addr_hyphen}) {
3462 SCOPED_TRACE(address);
3463
3464 in_addr v4addr;
3465 ASSERT_TRUE(inet_pton(AF_INET, address, &v4addr));
3466 hostent* result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
3467 ASSERT_TRUE(result != nullptr);
3468 EXPECT_STREQ("hello.example.com", result->h_name);
3469 }
3470}
3471
nuccachena26cc2a2018-07-17 18:07:23 +08003472TEST_F(ResolverTest, GetNameInfo_ReverseDnsQueryWithHavingNat64Prefix) {
3473 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003474 constexpr char dns64_name[] = "ipv4only.arpa.";
3475 constexpr char ptr_name[] = "v4v6.example.com.";
3476 // PTR record for IPv4 address 1.2.3.4
3477 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3478 // PTR record for IPv6 address 2001:db8::102:304
3479 constexpr char ptr_addr_v6[] =
3480 "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 +09003481 const std::vector<DnsRecord> records = {
3482 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3483 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3484 {ptr_addr_v6, ns_type::ns_t_ptr, ptr_name},
3485 };
nuccachena26cc2a2018-07-17 18:07:23 +08003486
Xiao Ma09b71022018-12-11 17:56:32 +09003487 test::DNSResponder dns(listen_addr);
3488 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003489 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003490 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003491
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003492 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003493 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003494 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003495
Luke Huangf8215372019-11-22 11:53:41 +08003496 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003497 static const struct TestConfig {
3498 int flag;
3499 int family;
3500 std::string addr;
3501 std::string host;
3502
3503 std::string asParameters() const {
3504 return StringPrintf("flag=%d, family=%d, addr=%s, host=%s", flag, family, addr.c_str(),
3505 host.c_str());
3506 }
3507 } testConfigs[]{
3508 {NI_NAMEREQD, AF_INET, "1.2.3.4", "v4v6.example.com"},
3509 {NI_NUMERICHOST, AF_INET, "1.2.3.4", "1.2.3.4"},
3510 {0, AF_INET, "1.2.3.4", "v4v6.example.com"},
3511 {0, AF_INET, "5.6.7.8", "5.6.7.8"}, // unmapped
3512 {NI_NAMEREQD, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
3513 {NI_NUMERICHOST, AF_INET6, "2001:db8::102:304", "2001:db8::102:304"},
3514 {0, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
3515 {0, AF_INET6, "2001:db8::506:708", "2001:db8::506:708"}, // unmapped
3516 };
Luke Huangf8215372019-11-22 11:53:41 +08003517 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003518
3519 // Reverse IPv4/IPv6 DNS query. Prefix should have no effect on it.
3520 for (const auto& config : testConfigs) {
3521 SCOPED_TRACE(config.asParameters());
3522
3523 int rv;
3524 char host[NI_MAXHOST];
3525 struct sockaddr_in sin;
3526 struct sockaddr_in6 sin6;
3527 if (config.family == AF_INET) {
3528 memset(&sin, 0, sizeof(sin));
3529 sin.sin_family = AF_INET;
3530 inet_pton(AF_INET, config.addr.c_str(), &sin.sin_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003531 rv = getnameinfo((const struct sockaddr*)&sin, sizeof(sin), host, sizeof(host), nullptr,
3532 0, config.flag);
nuccachena26cc2a2018-07-17 18:07:23 +08003533 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4));
3534 } else if (config.family == AF_INET6) {
3535 memset(&sin6, 0, sizeof(sin6));
3536 sin6.sin6_family = AF_INET6;
3537 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003538 rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host),
nuccachena26cc2a2018-07-17 18:07:23 +08003539 nullptr, 0, config.flag);
3540 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6));
3541 }
3542 ASSERT_EQ(0, rv);
3543 std::string result_str = host;
3544 EXPECT_EQ(result_str, config.host);
3545 dns.clearQueries();
3546 }
3547}
3548
3549TEST_F(ResolverTest, GetNameInfo_ReverseDns64Query) {
3550 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003551 constexpr char dns64_name[] = "ipv4only.arpa.";
3552 constexpr char ptr_name[] = "v4only.example.com.";
3553 // PTR record for IPv4 address 1.2.3.4
3554 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3555 // PTR record for IPv6 address 64:ff9b::1.2.3.4
3556 constexpr char ptr_addr_v6_nomapping[] =
3557 "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.";
3558 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
3559 // PTR record for IPv6 address 64:ff9b::5.6.7.8
3560 constexpr char ptr_addr_v6_synthesis[] =
3561 "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 +09003562 const std::vector<DnsRecord> records = {
3563 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3564 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3565 {ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis},
3566 };
nuccachena26cc2a2018-07-17 18:07:23 +08003567
Xiao Ma09b71022018-12-11 17:56:32 +09003568 test::DNSResponder dns(listen_addr);
3569 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003570 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003571 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003572
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003573 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003574 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003575 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003576
Luke Huangf8215372019-11-22 11:53:41 +08003577 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003578 static const struct TestConfig {
3579 bool hasSynthesizedPtrRecord;
3580 int flag;
3581 std::string addr;
3582 std::string host;
3583
3584 std::string asParameters() const {
3585 return StringPrintf("hasSynthesizedPtrRecord=%d, flag=%d, addr=%s, host=%s",
3586 hasSynthesizedPtrRecord, flag, addr.c_str(), host.c_str());
3587 }
3588 } testConfigs[]{
3589 {false, NI_NAMEREQD, "64:ff9b::102:304", "v4only.example.com"},
3590 {false, NI_NUMERICHOST, "64:ff9b::102:304", "64:ff9b::102:304"},
3591 {false, 0, "64:ff9b::102:304", "v4only.example.com"},
3592 {true, NI_NAMEREQD, "64:ff9b::506:708", "v6synthesis.example.com"},
3593 {true, NI_NUMERICHOST, "64:ff9b::506:708", "64:ff9b::506:708"},
3594 {true, 0, "64:ff9b::506:708", "v6synthesis.example.com"}
3595 };
Luke Huangf8215372019-11-22 11:53:41 +08003596 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003597
3598 // hasSynthesizedPtrRecord = false
3599 // Synthesized PTR record doesn't exist on DNS server
3600 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
3601 // After querying synthesized address failed, expect that prefix is removed from IPv6
3602 // synthesized address and do reverse IPv4 query instead.
3603 //
3604 // hasSynthesizedPtrRecord = true
3605 // Synthesized PTR record exists on DNS server
3606 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
3607 // Expect to just pass through synthesized address for DNS queries.
3608 for (const auto& config : testConfigs) {
3609 SCOPED_TRACE(config.asParameters());
3610
3611 char host[NI_MAXHOST];
3612 struct sockaddr_in6 sin6;
3613 memset(&sin6, 0, sizeof(sin6));
3614 sin6.sin6_family = AF_INET6;
3615 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003616 int rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host),
nuccachena26cc2a2018-07-17 18:07:23 +08003617 nullptr, 0, config.flag);
3618 ASSERT_EQ(0, rv);
3619 if (config.flag == NI_NAMEREQD) {
3620 if (config.hasSynthesizedPtrRecord) {
3621 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
3622 } else {
3623 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist.
3624 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist.
3625 }
3626 }
3627 std::string result_str = host;
3628 EXPECT_EQ(result_str, config.host);
3629 dns.clearQueries();
3630 }
3631}
3632
3633TEST_F(ResolverTest, GetNameInfo_ReverseDns64QueryFromHostFile) {
3634 constexpr char dns64_name[] = "ipv4only.arpa.";
3635 constexpr char host_name[] = "localhost";
3636 // The address is synthesized by prefix64:localhost.
3637 constexpr char host_addr[] = "64:ff9b::7f00:1";
nuccachena26cc2a2018-07-17 18:07:23 +08003638 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003639
3640 test::DNSResponder dns(listen_addr);
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003641
Xiao Ma09b71022018-12-11 17:56:32 +09003642 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003643 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003644 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003645
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003646 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003647 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003648 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003649
3650 // Using synthesized "localhost" address to be a trick for resolving host name
3651 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
3652 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
3653 char host[NI_MAXHOST];
Xiao Ma09b71022018-12-11 17:56:32 +09003654 struct sockaddr_in6 sin6 = {.sin6_family = AF_INET6};
nuccachena26cc2a2018-07-17 18:07:23 +08003655 inet_pton(AF_INET6, host_addr, &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003656 int rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host), nullptr,
nuccachena26cc2a2018-07-17 18:07:23 +08003657 0, NI_NAMEREQD);
3658 ASSERT_EQ(0, rv);
3659 // Expect no DNS queries; localhost is resolved via /etc/hosts.
3660 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
3661
3662 std::string result_str = host;
3663 EXPECT_EQ(result_str, host_name);
3664}
3665
Hungming Chen9e6185a2019-06-04 16:09:19 +08003666TEST_F(ResolverTest, GetNameInfo_cnamesClasslessReverseDelegation) {
3667 // IPv4 addresses in the subnet with notation '/' or '-'.
3668 constexpr char addr_slash[] = "192.0.2.1";
3669 constexpr char addr_hyphen[] = "192.0.3.1";
3670
3671 // Used to verify DNS reverse query for classless reverse lookup zone. See detail in RFC 2317
3672 // section 4.
3673 const static std::vector<DnsRecord> records = {
3674 // The records for reverse querying "192.0.2.1" in the subnet with notation '/'.
3675 {"1.2.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0/25.2.0.192.in-addr.arpa."},
3676 {"1.0/25.2.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3677
3678 // The records for reverse querying "192.0.3.1" in the subnet with notation '-'.
3679 {"1.3.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0-127.3.0.192.in-addr.arpa."},
3680 {"1.0-127.3.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3681 };
3682
3683 test::DNSResponder dns;
3684 StartDns(dns, records);
3685 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3686
3687 for (const auto& address : {addr_slash, addr_hyphen}) {
3688 SCOPED_TRACE(address);
3689
3690 char host[NI_MAXHOST];
3691 sockaddr_in sin = {.sin_family = AF_INET};
3692 ASSERT_TRUE(inet_pton(AF_INET, address, &sin.sin_addr));
3693 int rv = getnameinfo((const sockaddr*)&sin, sizeof(sin), host, sizeof(host), nullptr, 0,
3694 NI_NAMEREQD);
3695 ASSERT_EQ(0, rv);
3696 EXPECT_STREQ("hello.example.com", host);
3697 }
3698}
3699
nuccachena26cc2a2018-07-17 18:07:23 +08003700TEST_F(ResolverTest, GetHostByName2_Dns64Synthesize) {
Xiao Ma09b71022018-12-11 17:56:32 +09003701 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003702 constexpr char dns64_name[] = "ipv4only.arpa.";
3703 constexpr char host_name[] = "ipv4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003704 const std::vector<DnsRecord> records = {
3705 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3706 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3707 };
nuccachena26cc2a2018-07-17 18:07:23 +08003708
Xiao Ma09b71022018-12-11 17:56:32 +09003709 test::DNSResponder dns(listen_addr);
3710 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003711 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003712 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003713
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003714 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003715 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003716 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003717
3718 // Query an IPv4-only hostname. Expect that gets a synthesized address.
3719 struct hostent* result = gethostbyname2("ipv4only", AF_INET6);
3720 ASSERT_TRUE(result != nullptr);
3721 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3722 std::string result_str = ToString(result);
3723 EXPECT_EQ(result_str, "64:ff9b::102:304");
3724}
nuccachena26cc2a2018-07-17 18:07:23 +08003725
3726TEST_F(ResolverTest, GetHostByName2_DnsQueryWithHavingNat64Prefix) {
3727 constexpr char dns64_name[] = "ipv4only.arpa.";
3728 constexpr char host_name[] = "v4v6.example.com.";
nuccachena26cc2a2018-07-17 18:07:23 +08003729 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003730 const std::vector<DnsRecord> records = {
3731 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3732 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3733 {host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
3734 };
3735
3736 test::DNSResponder dns(listen_addr);
3737 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003738 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003739 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003740
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003741 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003742 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003743 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003744
3745 // IPv4 DNS query. Prefix should have no effect on it.
3746 struct hostent* result = gethostbyname2("v4v6", AF_INET);
3747 ASSERT_TRUE(result != nullptr);
3748 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3749 std::string result_str = ToString(result);
3750 EXPECT_EQ(result_str, "1.2.3.4");
3751 dns.clearQueries();
3752
3753 // IPv6 DNS query. Prefix should have no effect on it.
3754 result = gethostbyname2("v4v6", AF_INET6);
3755 ASSERT_TRUE(result != nullptr);
3756 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3757 result_str = ToString(result);
3758 EXPECT_EQ(result_str, "2001:db8::102:304");
3759}
3760
3761TEST_F(ResolverTest, GetHostByName2_Dns64QuerySpecialUseIPv4Addresses) {
3762 constexpr char THIS_NETWORK[] = "this_network";
3763 constexpr char LOOPBACK[] = "loopback";
3764 constexpr char LINK_LOCAL[] = "link_local";
3765 constexpr char MULTICAST[] = "multicast";
3766 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
3767
3768 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
3769 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
3770 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
3771 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
3772 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
3773
3774 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003775 constexpr char dns64_name[] = "ipv4only.arpa.";
3776
Xiao Ma09b71022018-12-11 17:56:32 +09003777 test::DNSResponder dns(listen_addr);
3778 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003779 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003780 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003781
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003782 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003783 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003784 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003785
Luke Huangf8215372019-11-22 11:53:41 +08003786 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003787 static const struct TestConfig {
3788 std::string name;
3789 std::string addr;
3790
3791 std::string asHostName() const {
Luke Huangf8215372019-11-22 11:53:41 +08003792 return StringPrintf("%s.example.com.", name.c_str());
nuccachena26cc2a2018-07-17 18:07:23 +08003793 }
3794 } testConfigs[]{
3795 {THIS_NETWORK, ADDR_THIS_NETWORK},
3796 {LOOPBACK, ADDR_LOOPBACK},
3797 {LINK_LOCAL, ADDR_LINK_LOCAL},
3798 {MULTICAST, ADDR_MULTICAST},
3799 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
3800 };
Luke Huangf8215372019-11-22 11:53:41 +08003801 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003802
3803 for (const auto& config : testConfigs) {
3804 const std::string testHostName = config.asHostName();
3805 SCOPED_TRACE(testHostName);
3806
3807 const char* host_name = testHostName.c_str();
3808 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
3809
3810 struct hostent* result = gethostbyname2(config.name.c_str(), AF_INET6);
3811 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3812
3813 // In AF_INET6 case, don't synthesize special use IPv4 address.
3814 // Expect to have no answer
3815 EXPECT_EQ(nullptr, result);
3816
3817 dns.clearQueries();
3818 }
Bernie Innocenti2fef2b82018-12-20 15:56:40 +09003819}
Mike Yuf14e1a92019-05-10 13:54:58 +08003820
3821TEST_F(ResolverTest, PrefixDiscoveryBypassTls) {
3822 constexpr char listen_addr[] = "::1";
3823 constexpr char cleartext_port[] = "53";
3824 constexpr char tls_port[] = "853";
3825 constexpr char dns64_name[] = "ipv4only.arpa.";
3826 const std::vector<std::string> servers = {listen_addr};
3827
3828 test::DNSResponder dns(listen_addr);
3829 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
3830 test::DnsTlsFrontend tls(listen_addr, tls_port, listen_addr, cleartext_port);
3831 ASSERT_TRUE(tls.startServer());
3832
3833 // Setup OPPORTUNISTIC mode and wait for the validation complete.
waynema0e73c2e2019-07-31 15:04:08 +08003834 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08003835 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003836 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yuf14e1a92019-05-10 13:54:58 +08003837 tls.clearQueries();
3838
3839 // Start NAT64 prefix discovery and wait for it complete.
3840 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003841 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
Mike Yuf14e1a92019-05-10 13:54:58 +08003842
3843 // Verify it bypassed TLS even though there's a TLS server available.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003844 EXPECT_EQ(0, tls.queries()) << dns.dumpQueries();
3845 EXPECT_EQ(1U, GetNumQueries(dns, dns64_name)) << dns.dumpQueries();
Mike Yuf14e1a92019-05-10 13:54:58 +08003846
3847 // Restart the testing network to reset the cache.
3848 mDnsClient.TearDown();
3849 mDnsClient.SetUp();
3850 dns.clearQueries();
3851
3852 // Setup STRICT mode and wait for the validation complete.
waynema0e73c2e2019-07-31 15:04:08 +08003853 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
3854 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08003855 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003856 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yuf14e1a92019-05-10 13:54:58 +08003857 tls.clearQueries();
3858
3859 // Start NAT64 prefix discovery and wait for it to complete.
3860 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003861 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
Mike Yuf14e1a92019-05-10 13:54:58 +08003862
3863 // Verify it bypassed TLS despite STRICT mode.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003864 EXPECT_EQ(0, tls.queries()) << dns.dumpQueries();
3865 EXPECT_EQ(1U, GetNumQueries(dns, dns64_name)) << dns.dumpQueries();
Mike Yuf14e1a92019-05-10 13:54:58 +08003866}
Luke Huang9807e6b2019-05-20 16:17:12 +08003867
Lorenzo Colittie51091d2020-05-20 02:48:44 +09003868TEST_F(ResolverTest, SetAndClearNat64Prefix) {
3869 constexpr char host_name[] = "v4.example.com.";
3870 constexpr char listen_addr[] = "::1";
3871 const std::vector<DnsRecord> records = {
3872 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3873 };
3874 const std::string kNat64Prefix1 = "64:ff9b::/96";
3875 const std::string kNat64Prefix2 = "2001:db8:6464::/96";
3876
3877 test::DNSResponder dns(listen_addr);
3878 StartDns(dns, records);
3879 const std::vector<std::string> servers = {listen_addr};
3880 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
3881
3882 auto resolvService = mDnsClient.resolvService();
3883 addrinfo hints = {.ai_family = AF_INET6};
3884
3885 // No NAT64 prefix, no AAAA record.
3886 ScopedAddrinfo result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3887 ASSERT_TRUE(result == nullptr);
3888
3889 // Set the prefix, and expect to get a synthesized AAAA record.
3890 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix2).isOk());
3891 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3892 ASSERT_FALSE(result == nullptr);
3893 EXPECT_EQ("2001:db8:6464::102:304", ToString(result));
3894
3895 // Update the prefix, expect to see AAAA records from the new prefix.
3896 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3897 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3898 ASSERT_FALSE(result == nullptr);
3899 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3900
3901 // Non-/96 prefixes are ignored.
3902 auto status = resolvService->setPrefix64(TEST_NETID, "64:ff9b::/64");
3903 EXPECT_FALSE(status.isOk());
3904 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3905 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3906
3907 // Invalid prefixes are ignored.
3908 status = resolvService->setPrefix64(TEST_NETID, "192.0.2.0/24");
3909 EXPECT_FALSE(status.isOk());
3910 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3911 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3912
3913 status = resolvService->setPrefix64(TEST_NETID, "192.0.2.1");
3914 EXPECT_FALSE(status.isOk());
3915 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3916 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3917
3918 status = resolvService->setPrefix64(TEST_NETID, "hello");
3919 EXPECT_FALSE(status.isOk());
3920 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3921 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3922
3923 // DNS64 synthesis is still working.
3924 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3925 ASSERT_FALSE(result == nullptr);
3926 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3927
3928 // Clear the prefix. No AAAA records any more.
3929 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, "").isOk());
3930 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3931 EXPECT_TRUE(result == nullptr);
3932
3933 // Calling startPrefix64Discovery clears the prefix.
3934 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3935 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3936 ASSERT_FALSE(result == nullptr);
3937 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3938
3939 EXPECT_TRUE(resolvService->startPrefix64Discovery(TEST_NETID).isOk());
3940 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3941 ASSERT_TRUE(result == nullptr);
3942
3943 // setPrefix64 fails if prefix discovery is started, even if no prefix is yet discovered...
3944 status = resolvService->setPrefix64(TEST_NETID, kNat64Prefix1);
3945 EXPECT_FALSE(status.isOk());
3946 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3947 EXPECT_EQ(EEXIST, status.getServiceSpecificError());
3948
3949 // .. and clearing the prefix also has no effect.
3950 status = resolvService->setPrefix64(TEST_NETID, "");
3951 EXPECT_FALSE(status.isOk());
3952 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3953 EXPECT_EQ(ENOENT, status.getServiceSpecificError());
3954
3955 // setPrefix64 succeeds again when prefix discovery is stopped.
3956 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
3957 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3958 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3959 ASSERT_FALSE(result == nullptr);
3960 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3961
3962 // Calling stopPrefix64Discovery clears the prefix.
3963 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
3964 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3965 ASSERT_TRUE(result == nullptr);
3966
3967 // Set up NAT64 prefix discovery.
3968 constexpr char dns64_name[] = "ipv4only.arpa.";
3969 const std::vector<DnsRecord> newRecords = {
3970 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3971 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3972 };
3973 dns.stopServer();
3974 StartDns(dns, newRecords);
3975
3976 EXPECT_TRUE(resolvService->startPrefix64Discovery(TEST_NETID).isOk());
3977 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
3978 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3979 ASSERT_FALSE(result == nullptr);
3980 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3981
3982 // setPrefix64 fails if NAT64 prefix discovery has succeeded, and the discovered prefix
3983 // continues to be used.
3984 status = resolvService->setPrefix64(TEST_NETID, kNat64Prefix2);
3985 EXPECT_FALSE(status.isOk());
3986 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3987 EXPECT_EQ(EEXIST, status.getServiceSpecificError());
3988
3989 // Clearing the prefix also has no effect if discovery is started.
3990 status = resolvService->setPrefix64(TEST_NETID, "");
3991 EXPECT_FALSE(status.isOk());
3992 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3993 EXPECT_EQ(ENOENT, status.getServiceSpecificError());
3994
3995 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3996 ASSERT_FALSE(result == nullptr);
3997 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3998
3999 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
4000 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_NOT_FOUND));
Lorenzo Colitti61f796b2020-05-21 00:57:49 +09004001
4002 EXPECT_EQ(0, sDnsMetricsListener->getUnexpectedNat64PrefixUpdates());
Lorenzo Colittie51091d2020-05-20 02:48:44 +09004003}
4004
Luke Huang9807e6b2019-05-20 16:17:12 +08004005namespace {
4006
Luke Huang0d592bc2019-05-25 18:24:03 +08004007class ScopedSetNetworkForProcess {
4008 public:
4009 explicit ScopedSetNetworkForProcess(unsigned netId) {
4010 mStoredNetId = getNetworkForProcess();
4011 if (netId == mStoredNetId) return;
4012 EXPECT_EQ(0, setNetworkForProcess(netId));
4013 }
4014 ~ScopedSetNetworkForProcess() { EXPECT_EQ(0, setNetworkForProcess(mStoredNetId)); }
4015
4016 private:
4017 unsigned mStoredNetId;
4018};
4019
4020class ScopedSetNetworkForResolv {
4021 public:
4022 explicit ScopedSetNetworkForResolv(unsigned netId) { EXPECT_EQ(0, setNetworkForResolv(netId)); }
4023 ~ScopedSetNetworkForResolv() { EXPECT_EQ(0, setNetworkForResolv(NETID_UNSET)); }
4024};
4025
Luke Huang9807e6b2019-05-20 16:17:12 +08004026void sendCommand(int fd, const std::string& cmd) {
4027 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size() + 1));
4028 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size() + 1));
4029}
4030
4031int32_t readBE32(int fd) {
4032 int32_t tmp;
4033 int n = TEMP_FAILURE_RETRY(read(fd, &tmp, sizeof(tmp)));
4034 EXPECT_TRUE(n > 0);
4035 return ntohl(tmp);
4036}
4037
Luke Huang0d592bc2019-05-25 18:24:03 +08004038int readResponseCode(int fd) {
Luke Huang9807e6b2019-05-20 16:17:12 +08004039 char buf[4];
4040 int n = TEMP_FAILURE_RETRY(read(fd, &buf, sizeof(buf)));
4041 EXPECT_TRUE(n > 0);
4042 // The format of response code is that 4 bytes for the code & null.
4043 buf[3] = '\0';
4044 int result;
4045 EXPECT_TRUE(ParseInt(buf, &result));
4046 return result;
4047}
4048
Luke Huang0d592bc2019-05-25 18:24:03 +08004049bool checkAndClearUseLocalNameserversFlag(unsigned* netid) {
4050 if (netid == nullptr || ((*netid) & NETID_USE_LOCAL_NAMESERVERS) == 0) {
4051 return false;
4052 }
4053 *netid = (*netid) & ~NETID_USE_LOCAL_NAMESERVERS;
4054 return true;
4055}
4056
Luke Huangf8215372019-11-22 11:53:41 +08004057aidl::android::net::UidRangeParcel makeUidRangeParcel(int start, int stop) {
4058 aidl::android::net::UidRangeParcel res;
Luke Huang0d592bc2019-05-25 18:24:03 +08004059 res.start = start;
4060 res.stop = stop;
4061
4062 return res;
4063}
4064
4065void expectNetIdWithLocalNameserversFlag(unsigned netId) {
4066 unsigned dnsNetId = 0;
4067 EXPECT_EQ(0, getNetworkForDns(&dnsNetId));
4068 EXPECT_TRUE(checkAndClearUseLocalNameserversFlag(&dnsNetId));
4069 EXPECT_EQ(netId, static_cast<unsigned>(dnsNetId));
4070}
4071
4072void expectDnsNetIdEquals(unsigned netId) {
4073 unsigned dnsNetId = 0;
4074 EXPECT_EQ(0, getNetworkForDns(&dnsNetId));
4075 EXPECT_EQ(netId, static_cast<unsigned>(dnsNetId));
4076}
4077
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004078void expectDnsNetIdIsDefaultNetwork(INetd* netdService) {
Luke Huang0d592bc2019-05-25 18:24:03 +08004079 int currentNetid;
4080 EXPECT_TRUE(netdService->networkGetDefault(&currentNetid).isOk());
4081 expectDnsNetIdEquals(currentNetid);
4082}
4083
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004084void expectDnsNetIdWithVpn(INetd* netdService, unsigned vpnNetId, unsigned expectedNetId) {
Luke Huang0d592bc2019-05-25 18:24:03 +08004085 EXPECT_TRUE(netdService->networkCreateVpn(vpnNetId, false /* secure */).isOk());
4086 uid_t uid = getuid();
4087 // Add uid to VPN
4088 EXPECT_TRUE(netdService->networkAddUidRanges(vpnNetId, {makeUidRangeParcel(uid, uid)}).isOk());
4089 expectDnsNetIdEquals(expectedNetId);
4090 EXPECT_TRUE(netdService->networkDestroy(vpnNetId).isOk());
4091}
4092
Luke Huang9807e6b2019-05-20 16:17:12 +08004093} // namespace
4094
4095TEST_F(ResolverTest, getDnsNetId) {
4096 // We've called setNetworkForProcess in SetupOemNetwork, so reset to default first.
4097 setNetworkForProcess(NETID_UNSET);
Luke Huang0d592bc2019-05-25 18:24:03 +08004098
4099 expectDnsNetIdIsDefaultNetwork(mDnsClient.netdService());
4100 expectDnsNetIdWithVpn(mDnsClient.netdService(), TEST_VPN_NETID, TEST_VPN_NETID);
Luke Huang9807e6b2019-05-20 16:17:12 +08004101
4102 // Test with setNetworkForProcess
Luke Huang0d592bc2019-05-25 18:24:03 +08004103 {
4104 ScopedSetNetworkForProcess scopedSetNetworkForProcess(TEST_NETID);
4105 expectDnsNetIdEquals(TEST_NETID);
4106 }
4107
4108 // Test with setNetworkForProcess with NETID_USE_LOCAL_NAMESERVERS
4109 {
4110 ScopedSetNetworkForProcess scopedSetNetworkForProcess(TEST_NETID |
4111 NETID_USE_LOCAL_NAMESERVERS);
4112 expectNetIdWithLocalNameserversFlag(TEST_NETID);
4113 }
Luke Huang9807e6b2019-05-20 16:17:12 +08004114
4115 // Test with setNetworkForResolv
Luke Huang0d592bc2019-05-25 18:24:03 +08004116 {
4117 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID);
4118 expectDnsNetIdEquals(TEST_NETID);
4119 }
4120
4121 // Test with setNetworkForResolv with NETID_USE_LOCAL_NAMESERVERS
4122 {
4123 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID |
4124 NETID_USE_LOCAL_NAMESERVERS);
4125 expectNetIdWithLocalNameserversFlag(TEST_NETID);
4126 }
4127
4128 // Test with setNetworkForResolv under bypassable vpn
4129 {
4130 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID);
4131 expectDnsNetIdWithVpn(mDnsClient.netdService(), TEST_VPN_NETID, TEST_NETID);
4132 }
Luke Huang9807e6b2019-05-20 16:17:12 +08004133
4134 // Create socket connected to DnsProxyListener
4135 int fd = dns_open_proxy();
4136 EXPECT_TRUE(fd > 0);
4137 unique_fd ufd(fd);
4138
4139 // Test command with wrong netId
4140 sendCommand(fd, "getdnsnetid abc");
Luke Huang0d592bc2019-05-25 18:24:03 +08004141 EXPECT_EQ(ResponseCode::DnsProxyQueryResult, readResponseCode(fd));
Luke Huang9807e6b2019-05-20 16:17:12 +08004142 EXPECT_EQ(-EINVAL, readBE32(fd));
4143
4144 // Test unsupported command
4145 sendCommand(fd, "getdnsnetidNotSupported");
4146 // Keep in sync with FrameworkListener.cpp (500, "Command not recognized")
Luke Huang0d592bc2019-05-25 18:24:03 +08004147 EXPECT_EQ(500, readResponseCode(fd));
Luke Huang9807e6b2019-05-20 16:17:12 +08004148}
Sehee Park2c118782019-05-07 13:02:45 +09004149
4150TEST_F(ResolverTest, BlockDnsQueryWithUidRule) {
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004151 // This test relies on blocking traffic on loopback, which xt_qtaguid does not do.
4152 // See aosp/358413 and b/34444781 for why.
4153 SKIP_IF_BPF_NOT_SUPPORTED;
4154
Sehee Park2c118782019-05-07 13:02:45 +09004155 constexpr char listen_addr1[] = "127.0.0.4";
4156 constexpr char listen_addr2[] = "::1";
4157 constexpr char host_name[] = "howdy.example.com.";
4158 const std::vector<DnsRecord> records = {
4159 {host_name, ns_type::ns_t_a, "1.2.3.4"},
4160 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
4161 };
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004162 INetd* netdService = mDnsClient.netdService();
Sehee Park2c118782019-05-07 13:02:45 +09004163
4164 test::DNSResponder dns1(listen_addr1);
4165 test::DNSResponder dns2(listen_addr2);
4166 StartDns(dns1, records);
4167 StartDns(dns2, records);
4168
4169 std::vector<std::string> servers = {listen_addr1, listen_addr2};
4170 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
4171 dns1.clearQueries();
4172 dns2.clearQueries();
4173
Luke Huangeb618ef2020-05-26 14:17:02 +08004174 ScopeBlockedUIDRule scopeBlockUidRule(netdService, TEST_UID);
Sehee Park2c118782019-05-07 13:02:45 +09004175 // Dns Query
4176 int fd1 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_a, 0);
4177 int fd2 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_aaaa, 0);
4178 EXPECT_TRUE(fd1 != -1);
4179 EXPECT_TRUE(fd2 != -1);
4180
Luke Huang5729afc2020-07-30 23:12:17 +08004181 uint8_t buf1[MAXPACKET] = {};
4182 uint8_t buf2[MAXPACKET] = {};
Sehee Park2c118782019-05-07 13:02:45 +09004183 int rcode;
Luke Huang5729afc2020-07-30 23:12:17 +08004184 int res2 = getAsyncResponse(fd2, &rcode, buf2, MAXPACKET);
4185 int res1 = getAsyncResponse(fd1, &rcode, buf1, MAXPACKET);
4186 // If API level >= 30 (R+), these queries should be blocked.
4187 if (isAtLeastR) {
4188 EXPECT_EQ(res2, -ECONNREFUSED);
4189 EXPECT_EQ(res1, -ECONNREFUSED);
4190 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, EAI_SYSTEM, "howdy.example.com", {});
4191 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, EAI_SYSTEM, "howdy.example.com", {});
4192 } else {
4193 EXPECT_GT(res2, 0);
4194 EXPECT_EQ("::1.2.3.4", toString(buf2, res2, AF_INET6));
4195 EXPECT_GT(res1, 0);
4196 EXPECT_EQ("1.2.3.4", toString(buf1, res1, AF_INET));
4197 // To avoid flaky test, do not evaluate DnsEvent since event order is not guaranteed.
4198 }
Sehee Park2c118782019-05-07 13:02:45 +09004199}
Mike Yua772c202019-09-23 17:47:21 +08004200
Ken Chenbc481b82020-05-21 23:30:01 +08004201TEST_F(ResolverTest, EnforceDnsUid) {
4202 SKIP_IF_BPF_NOT_SUPPORTED;
4203
4204 constexpr char listen_addr1[] = "127.0.0.4";
4205 constexpr char listen_addr2[] = "::1";
4206 constexpr char host_name[] = "howdy.example.com.";
4207 const std::vector<DnsRecord> records = {
4208 {host_name, ns_type::ns_t_a, "1.2.3.4"},
4209 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
4210 };
4211 INetd* netdService = mDnsClient.netdService();
4212
4213 test::DNSResponder dns1(listen_addr1);
4214 test::DNSResponder dns2(listen_addr2);
4215 StartDns(dns1, records);
4216 StartDns(dns2, records);
4217
4218 // switch uid of DNS queries from applications to AID_DNS
4219 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4220 parcel.servers = {listen_addr1, listen_addr2};
4221 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk());
4222
4223 uint8_t buf[MAXPACKET] = {};
Luke Huang5729afc2020-07-30 23:12:17 +08004224 uint8_t buf2[MAXPACKET] = {};
Ken Chenbc481b82020-05-21 23:30:01 +08004225 int rcode;
4226 {
4227 ScopeBlockedUIDRule scopeBlockUidRule(netdService, TEST_UID);
4228 // Dns Queries should be blocked
Luke Huang5729afc2020-07-30 23:12:17 +08004229 const int fd1 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_a, 0);
4230 const int fd2 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_aaaa, 0);
Ken Chenbc481b82020-05-21 23:30:01 +08004231 EXPECT_TRUE(fd1 != -1);
4232 EXPECT_TRUE(fd2 != -1);
4233
Luke Huang5729afc2020-07-30 23:12:17 +08004234 const int res2 = getAsyncResponse(fd2, &rcode, buf2, MAXPACKET);
4235 const int res1 = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
4236 // If API level >= 30 (R+), the query should be blocked.
4237 if (isAtLeastR) {
4238 EXPECT_EQ(res2, -ECONNREFUSED);
4239 EXPECT_EQ(res1, -ECONNREFUSED);
4240 } else {
4241 EXPECT_GT(res2, 0);
4242 EXPECT_EQ("::1.2.3.4", toString(buf2, res2, AF_INET6));
4243 EXPECT_GT(res1, 0);
4244 EXPECT_EQ("1.2.3.4", toString(buf, res1, AF_INET));
4245 }
Ken Chenbc481b82020-05-21 23:30:01 +08004246 }
4247
Luke Huang5729afc2020-07-30 23:12:17 +08004248 memset(buf, 0, MAXPACKET);
Ken Chenbc481b82020-05-21 23:30:01 +08004249 parcel.resolverOptions.enforceDnsUid = true;
4250 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk());
4251 {
4252 ScopeBlockedUIDRule scopeBlockUidRule(netdService, TEST_UID);
4253 // Dns Queries should NOT be blocked
4254 int fd1 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_a, 0);
4255 int fd2 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_aaaa, 0);
4256 EXPECT_TRUE(fd1 != -1);
4257 EXPECT_TRUE(fd2 != -1);
4258
4259 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
4260 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
4261
4262 memset(buf, 0, MAXPACKET);
4263 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
4264 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
4265
4266 // @TODO: So far we know that uid of DNS queries are no more set to DNS requester. But we
4267 // don't check if they are actually being set to AID_DNS, because system uids are always
4268 // allowed in bpf_owner_match(). Audit by firewallSetUidRule(AID_DNS) + sending queries is
4269 // infeasible. Fix it if the behavior of bpf_owner_match() is changed in the future, or if
4270 // we have better idea to deal with this.
4271 }
4272}
4273
Mike Yua772c202019-09-23 17:47:21 +08004274TEST_F(ResolverTest, ConnectTlsServerTimeout) {
Mike Yu40e67072019-10-09 21:14:09 +08004275 constexpr char hostname1[] = "query1.example.com.";
4276 constexpr char hostname2[] = "query2.example.com.";
Mike Yua772c202019-09-23 17:47:21 +08004277 const std::vector<DnsRecord> records = {
Mike Yu40e67072019-10-09 21:14:09 +08004278 {hostname1, ns_type::ns_t_a, "1.2.3.4"},
4279 {hostname2, ns_type::ns_t_a, "1.2.3.5"},
Mike Yua772c202019-09-23 17:47:21 +08004280 };
4281
Mike Yu40e67072019-10-09 21:14:09 +08004282 // The resolver will adjust the timeout value to 1000ms since the value is too small.
4283 ScopedSystemProperties scopedSystemProperties(kDotConnectTimeoutMsFlag, "100");
Mike Yua772c202019-09-23 17:47:21 +08004284
Mike Yue93d9ae2020-08-25 19:09:51 +08004285 static const struct TestConfig {
4286 bool asyncHandshake;
Mike Yubb499092020-08-28 19:18:42 +08004287 int maxRetries;
4288
4289 // if asyncHandshake:
4290 // expectedTimeout = dotConnectTimeoutMs * maxRetries
4291 // otherwise:
4292 // expectedTimeout = dotConnectTimeoutMs
Mike Yue93d9ae2020-08-25 19:09:51 +08004293 int expectedTimeout;
4294 } testConfigs[] = {
Mike Yubb499092020-08-28 19:18:42 +08004295 // Test mis-configured dot_maxtries flag.
4296 {false, 0, 1000}, {true, 0, 1000},
Mike Yua772c202019-09-23 17:47:21 +08004297
Mike Yubb499092020-08-28 19:18:42 +08004298 {false, 1, 1000}, {false, 3, 1000}, {true, 1, 1000}, {true, 3, 3000},
Mike Yue93d9ae2020-08-25 19:09:51 +08004299 };
Mike Yua772c202019-09-23 17:47:21 +08004300
Mike Yue93d9ae2020-08-25 19:09:51 +08004301 for (const auto& config : testConfigs) {
Mike Yubb499092020-08-28 19:18:42 +08004302 SCOPED_TRACE(fmt::format("testConfig: [{}, {}]", config.asyncHandshake, config.maxRetries));
Mike Yua772c202019-09-23 17:47:21 +08004303
Mike Yue93d9ae2020-08-25 19:09:51 +08004304 // Because a DnsTlsTransport lasts at least 5 minutes in spite of network
4305 // destroyed, let the resolver creates an unique DnsTlsTransport every time
4306 // so that the DnsTlsTransport won't interfere the other tests.
4307 const std::string addr = getUniqueIPv4Address();
4308 test::DNSResponder dns(addr);
4309 StartDns(dns, records);
4310 test::DnsTlsFrontend tls(addr, "853", addr, "53");
4311 ASSERT_TRUE(tls.startServer());
Mike Yua772c202019-09-23 17:47:21 +08004312
Mike Yubb499092020-08-28 19:18:42 +08004313 ScopedSystemProperties scopedSystemProperties1(kDotAsyncHandshakeFlag,
4314 config.asyncHandshake ? "1" : "0");
4315 ScopedSystemProperties scopedSystemProperties2(kDotMaxretriesFlag,
4316 std::to_string(config.maxRetries));
Mike Yue93d9ae2020-08-25 19:09:51 +08004317 resetNetwork();
Mike Yu40e67072019-10-09 21:14:09 +08004318
Mike Yue93d9ae2020-08-25 19:09:51 +08004319 // Set up resolver to opportunistic mode.
4320 auto parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4321 parcel.servers = {addr};
4322 parcel.tlsServers = {addr};
4323 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4324 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
4325 EXPECT_TRUE(tls.waitForQueries(1));
4326 tls.clearQueries();
4327 dns.clearQueries();
Mike Yu40e67072019-10-09 21:14:09 +08004328
Mike Yue93d9ae2020-08-25 19:09:51 +08004329 // The server becomes unresponsive to the handshake request.
4330 tls.setHangOnHandshakeForTesting(true);
Mike Yu40e67072019-10-09 21:14:09 +08004331
Mike Yue93d9ae2020-08-25 19:09:51 +08004332 // Expect the things happening in getaddrinfo():
4333 // 1. Connect to the private DNS server.
4334 // 2. SSL handshake times out.
4335 // 3. Fallback to UDP transport, and then get the answer.
4336 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4337 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(hostname1, nullptr, hints);
4338
4339 EXPECT_NE(nullptr, result);
4340 EXPECT_EQ(0, tls.queries());
4341 EXPECT_EQ(1U, GetNumQueries(dns, hostname1));
4342 EXPECT_EQ(records.at(0).addr, ToString(result));
4343
4344 // A loose upper bound is set by adding 1000ms buffer time. Theoretically, getaddrinfo()
4345 // should just take a bit more than expetTimeout milliseconds.
4346 EXPECT_GE(timeTakenMs, config.expectedTimeout);
4347 EXPECT_LE(timeTakenMs, config.expectedTimeout + 1000);
4348
4349 // Set the server to be responsive. Verify that the resolver will attempt to reconnect
4350 // to the server and then get the result within the timeout.
4351 tls.setHangOnHandshakeForTesting(false);
4352 std::tie(result, timeTakenMs) = safe_getaddrinfo_time_taken(hostname2, nullptr, hints);
4353
4354 EXPECT_NE(nullptr, result);
4355 EXPECT_TRUE(tls.waitForQueries(1));
4356 EXPECT_EQ(1U, GetNumQueries(dns, hostname2));
4357 EXPECT_EQ(records.at(1).addr, ToString(result));
4358
4359 EXPECT_LE(timeTakenMs, 200);
4360 }
4361}
4362
4363TEST_F(ResolverTest, ConnectTlsServerTimeout_ConcurrentQueries) {
4364 constexpr uint32_t cacheFlag = ANDROID_RESOLV_NO_CACHE_LOOKUP;
4365 constexpr char hostname[] = "hello.example.com.";
4366 const std::vector<DnsRecord> records = {
4367 {hostname, ns_type::ns_t_a, "1.2.3.4"},
4368 };
4369
4370 static const struct TestConfig {
4371 bool asyncHandshake;
4372 int dotConnectTimeoutMs;
Mike Yubb499092020-08-28 19:18:42 +08004373 int maxRetries;
Mike Yue93d9ae2020-08-25 19:09:51 +08004374 int concurrency;
Mike Yubb499092020-08-28 19:18:42 +08004375
4376 // if asyncHandshake:
4377 // expectedTimeout = dotConnectTimeoutMs * maxRetries
4378 // otherwise:
4379 // expectedTimeout = dotConnectTimeoutMs * concurrency
Mike Yue93d9ae2020-08-25 19:09:51 +08004380 int expectedTimeout;
4381 } testConfigs[] = {
Mike Yubb499092020-08-28 19:18:42 +08004382 // clang-format off
4383 {false, 1000, 1, 5, 5000},
4384 {false, 1000, 3, 5, 5000},
4385 {true, 1000, 1, 5, 1000},
4386 {true, 2500, 1, 10, 2500},
4387 {true, 1000, 3, 5, 3000},
4388 // clang-format on
Mike Yue93d9ae2020-08-25 19:09:51 +08004389 };
4390
4391 // Launch query threads. Expected behaviors are:
4392 // - when dot_async_handshake is disabled, one of the query threads triggers a
4393 // handshake and then times out. Then same as another query thread, and so forth.
4394 // - when dot_async_handshake is enabled, only one handshake is triggered, and then
4395 // all of the query threads time out at the same time.
4396 for (const auto& config : testConfigs) {
4397 ScopedSystemProperties scopedSystemProperties1(kDotConnectTimeoutMsFlag,
4398 std::to_string(config.dotConnectTimeoutMs));
4399 ScopedSystemProperties scopedSystemProperties2(kDotAsyncHandshakeFlag,
4400 config.asyncHandshake ? "1" : "0");
Mike Yubb499092020-08-28 19:18:42 +08004401 ScopedSystemProperties scopedSystemProperties3(kDotMaxretriesFlag,
4402 std::to_string(config.maxRetries));
Mike Yue93d9ae2020-08-25 19:09:51 +08004403 resetNetwork();
4404
4405 for (const auto& dnsMode : {"OPPORTUNISTIC", "STRICT"}) {
4406 SCOPED_TRACE(fmt::format("testConfig: [{}, {}]", config.asyncHandshake, dnsMode));
4407
4408 // Because a DnsTlsTransport lasts at least 5 minutes in spite of network
4409 // destroyed, let the resolver creates an unique DnsTlsTransport every time
4410 // so that the DnsTlsTransport won't interfere the other tests.
4411 const std::string addr = getUniqueIPv4Address();
4412 test::DNSResponder dns(addr);
4413 StartDns(dns, records);
4414 test::DnsTlsFrontend tls(addr, "853", addr, "53");
4415 ASSERT_TRUE(tls.startServer());
4416
4417 auto parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4418 parcel.servers = {addr};
4419 parcel.tlsServers = {addr};
4420 if (dnsMode == "STRICT") parcel.tlsName = kDefaultPrivateDnsHostName;
4421 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4422 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
4423 EXPECT_TRUE(tls.waitForQueries(1));
4424
4425 // The server becomes unresponsive to the handshake request.
4426 tls.setHangOnHandshakeForTesting(true);
4427
4428 Stopwatch s;
4429 std::vector<std::thread> threads(config.concurrency);
4430 for (std::thread& thread : threads) {
4431 thread = std::thread([&]() {
4432 int fd = resNetworkQuery(TEST_NETID, hostname, ns_c_in, ns_t_a, cacheFlag);
4433 dnsMode == "STRICT" ? expectAnswersNotValid(fd, -ETIMEDOUT)
4434 : expectAnswersValid(fd, AF_INET, "1.2.3.4");
4435 });
4436 }
4437 for (std::thread& thread : threads) {
4438 thread.join();
4439 }
4440
4441 const int timeTakenMs = s.timeTakenUs() / 1000;
4442 // A loose upper bound is set by adding 1000ms buffer time. Theoretically, it should
4443 // just take a bit more than expetTimeout milliseconds for the result.
4444 EXPECT_GE(timeTakenMs, config.expectedTimeout);
4445 EXPECT_LE(timeTakenMs, config.expectedTimeout + 1000);
4446
4447 // Recover the server from being unresponsive and try again.
4448 tls.setHangOnHandshakeForTesting(false);
4449 int fd = resNetworkQuery(TEST_NETID, hostname, ns_c_in, ns_t_a, cacheFlag);
4450 expectAnswersValid(fd, AF_INET, "1.2.3.4");
4451 }
4452 }
Mike Yua772c202019-09-23 17:47:21 +08004453}
Hungming Chenbb90ab32019-10-28 18:20:31 +08004454
Ken Chen766feae2019-10-30 15:13:44 +08004455TEST_F(ResolverTest, FlushNetworkCache) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004456 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004457 test::DNSResponder dns;
4458 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4459 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4460
4461 const hostent* result = gethostbyname("hello");
4462 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4463
4464 // get result from cache
4465 result = gethostbyname("hello");
4466 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4467
4468 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4469
4470 result = gethostbyname("hello");
4471 EXPECT_EQ(2U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4472}
4473
4474TEST_F(ResolverTest, FlushNetworkCache_random) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004475 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004476 constexpr int num_flush = 10;
4477 constexpr int num_queries = 20;
4478 test::DNSResponder dns;
4479 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4480 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4481 const addrinfo hints = {.ai_family = AF_INET};
4482
4483 std::thread t([this]() {
4484 for (int i = 0; i < num_flush; ++i) {
4485 unsigned delay = arc4random_uniform(10 * 1000); // 10ms
4486 usleep(delay);
4487 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4488 }
4489 });
4490
4491 for (int i = 0; i < num_queries; ++i) {
4492 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4493 EXPECT_TRUE(result != nullptr);
4494 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4495 }
4496 t.join();
4497}
4498
4499// flush cache while one query is wait-for-response, another is pending.
4500TEST_F(ResolverTest, FlushNetworkCache_concurrent) {
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 const char* listen_addr1 = "127.0.0.9";
4503 const char* listen_addr2 = "127.0.0.10";
4504 test::DNSResponder dns1(listen_addr1);
4505 test::DNSResponder dns2(listen_addr2);
4506 StartDns(dns1, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4507 StartDns(dns2, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4508 addrinfo hints = {.ai_family = AF_INET};
4509
4510 // step 1: set server#1 into deferred responding mode
4511 dns1.setDeferredResp(true);
4512 std::thread t1([&listen_addr1, &hints, this]() {
4513 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr1}));
4514 // step 3: query
4515 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4516 // step 9: check result
4517 EXPECT_TRUE(result != nullptr);
4518 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4519 });
4520
4521 // step 2: wait for the query to reach the server
4522 while (GetNumQueries(dns1, kHelloExampleCom) == 0) {
4523 usleep(1000); // 1ms
4524 }
4525
4526 std::thread t2([&listen_addr2, &hints, &dns2, this]() {
4527 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr2}));
4528 // step 5: query (should be blocked in resolver)
4529 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4530 // step 7: check result
4531 EXPECT_TRUE(result != nullptr);
4532 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4533 EXPECT_EQ(1U, GetNumQueriesForType(dns2, ns_type::ns_t_a, kHelloExampleCom));
4534 });
4535
4536 // step 4: wait a bit for the 2nd query to enter pending state
4537 usleep(100 * 1000); // 100ms
4538 // step 6: flush cache (will unblock pending queries)
4539 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4540 t2.join();
4541
4542 // step 8: resume server#1
4543 dns1.setDeferredResp(false);
4544 t1.join();
4545
4546 // step 10: verify if result is correctly cached
4547 dns2.clearQueries();
4548 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4549 EXPECT_EQ(0U, GetNumQueries(dns2, kHelloExampleCom));
4550 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4551}
4552
waynema29253052019-08-20 11:26:08 +08004553// TODO: Perhaps to have a boundary conditions test for TCP and UDP.
4554TEST_F(ResolverTest, TcpQueryWithOversizePayload) {
4555 test::DNSResponder dns;
4556 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4557 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4558
4559 int fd = dns_open_proxy();
4560 ASSERT_TRUE(fd > 0);
4561
4562 // Sending DNS query over TCP once the packet sizes exceed 512 bytes.
4563 // The raw data is combined with Question section and Additional section
4564 // Question section : query "hello.example.com", type A, class IN
4565 // Additional section : type OPT (41), Option PADDING, Option Length 546
4566 // Padding option which allows DNS clients and servers to artificially
4567 // increase the size of a DNS message by a variable number of bytes.
4568 // See also RFC7830, section 3
4569 const std::string query =
4570 "+c0BAAABAAAAAAABBWhlbGxvB2V4YW1wbGUDY29tAAABAAEAACkgAAAAgAACJgAMAiIAAAAAAAAAAAAAAAAAA"
4571 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4572 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4573 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4574 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4575 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4576 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4577 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4578 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4579 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
4580 const std::string cmd =
4581 "resnsend " + std::to_string(TEST_NETID) + " 0 " /* ResNsendFlags */ + query + '\0';
4582 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
4583 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
4584 expectAnswersValid(fd, AF_INET, kHelloExampleComAddrV4);
4585 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom));
4586 EXPECT_EQ(0U, GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom));
4587}
4588
Ken Chen99344882020-01-01 14:59:38 +08004589TEST_F(ResolverTest, TruncatedRspMode) {
4590 constexpr char listen_addr[] = "127.0.0.4";
4591 constexpr char listen_addr2[] = "127.0.0.5";
4592 constexpr char listen_srv[] = "53";
4593
4594 test::DNSResponder dns(listen_addr, listen_srv, static_cast<ns_rcode>(-1));
4595 test::DNSResponder dns2(listen_addr2, listen_srv, static_cast<ns_rcode>(-1));
4596 // dns supports UDP only, dns2 support UDP and TCP
4597 dns.setResponseProbability(0.0, IPPROTO_TCP);
4598 StartDns(dns, kLargeCnameChainRecords);
4599 StartDns(dns2, kLargeCnameChainRecords);
4600
4601 const struct TestConfig {
4602 const std::optional<int32_t> tcMode;
4603 const bool ret;
4604 const unsigned numQueries;
4605 std::string asParameters() const {
4606 return StringPrintf("tcMode: %d, ret: %s, numQueries: %u", tcMode.value_or(-1),
4607 ret ? "true" : "false", numQueries);
4608 }
4609 } testConfigs[]{
4610 // clang-format off
4611 {std::nullopt, true, 0}, /* mode unset */
4612 {aidl::android::net::IDnsResolver::TC_MODE_DEFAULT, true, 0}, /* default mode */
4613 {aidl::android::net::IDnsResolver::TC_MODE_UDP_TCP, true, 1}, /* alternative mode */
4614 {-666, false, 1}, /* invalid input */
4615 // clang-format on
4616 };
4617
4618 for (const auto& config : testConfigs) {
4619 SCOPED_TRACE(config.asParameters());
4620
4621 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4622 parcel.servers = {listen_addr, listen_addr2};
4623 if (config.tcMode) {
Ken Chena6ac2a62020-04-07 17:25:56 +08004624 parcel.resolverOptions.tcMode = config.tcMode.value();
Ken Chen99344882020-01-01 14:59:38 +08004625 }
4626 ASSERT_EQ(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk(), config.ret);
4627
4628 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4629 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4630 ASSERT_TRUE(result != nullptr);
4631 EXPECT_EQ(ToString(result), kHelloExampleComAddrV4);
4632 // TC_MODE_DEFAULT: resolver retries on TCP-only on each name server.
4633 // TC_MODE_UDP_TCP: resolver retries on TCP on the same server, falls back to UDP from next.
4634 ASSERT_EQ(GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom), 1U);
4635 ASSERT_EQ(GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom), 1U);
4636 ASSERT_EQ(GetNumQueriesForProtocol(dns2, IPPROTO_UDP, kHelloExampleCom), config.numQueries);
4637 ASSERT_EQ(GetNumQueriesForProtocol(dns2, IPPROTO_TCP, kHelloExampleCom), 1U);
4638
4639 dns.clearQueries();
4640 dns2.clearQueries();
4641 ASSERT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
Mike Yu61d17262020-02-15 18:56:22 +08004642
4643 // Clear the stats to make the resolver always choose the same server for the first query.
4644 parcel.servers.clear();
4645 parcel.tlsServers.clear();
4646 ASSERT_EQ(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk(), config.ret);
Ken Chen99344882020-01-01 14:59:38 +08004647 }
4648}
4649
Mike Yu153b5b82020-03-04 19:53:54 +08004650TEST_F(ResolverTest, RepeatedSetup_ResolverStatusRemains) {
4651 constexpr char unusable_listen_addr[] = "127.0.0.3";
4652 constexpr char listen_addr[] = "127.0.0.4";
4653 constexpr char hostname[] = "a.hello.query.";
4654 const auto repeatedSetResolversFromParcel = [&](const ResolverParamsParcel& parcel) {
4655 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4656 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4657 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4658 };
4659
4660 test::DNSResponder dns(listen_addr);
4661 StartDns(dns, {{hostname, ns_type::ns_t_a, "1.2.3.3"}});
4662 test::DnsTlsFrontend tls1(listen_addr, "853", listen_addr, "53");
4663 ASSERT_TRUE(tls1.startServer());
4664
4665 // Private DNS off mode.
4666 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4667 parcel.servers = {unusable_listen_addr, listen_addr};
4668 parcel.tlsServers.clear();
4669 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4670
4671 // Send a query.
4672 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4673 EXPECT_NE(safe_getaddrinfo(hostname, nullptr, &hints), nullptr);
4674
4675 // Check the stats as expected.
4676 const std::vector<NameserverStats> expectedCleartextDnsStats = {
4677 NameserverStats(unusable_listen_addr).setInternalErrors(1),
4678 NameserverStats(listen_addr).setSuccesses(1),
4679 };
Mike Yu61d17262020-02-15 18:56:22 +08004680 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu153b5b82020-03-04 19:53:54 +08004681 EXPECT_EQ(GetNumQueries(dns, hostname), 1U);
4682
4683 // The stats is supposed to remain as long as the list of cleartext DNS servers is unchanged.
4684 static const struct TestConfig {
4685 std::vector<std::string> servers;
4686 std::vector<std::string> tlsServers;
4687 std::string tlsName;
4688 } testConfigs[] = {
4689 // Private DNS opportunistic mode.
4690 {{listen_addr, unusable_listen_addr}, {listen_addr, unusable_listen_addr}, ""},
4691 {{unusable_listen_addr, listen_addr}, {unusable_listen_addr, listen_addr}, ""},
4692
4693 // Private DNS strict mode.
4694 {{listen_addr, unusable_listen_addr}, {"127.0.0.100"}, kDefaultPrivateDnsHostName},
4695 {{unusable_listen_addr, listen_addr}, {"127.0.0.100"}, kDefaultPrivateDnsHostName},
4696
4697 // Private DNS off mode.
4698 {{unusable_listen_addr, listen_addr}, {}, ""},
4699 {{listen_addr, unusable_listen_addr}, {}, ""},
4700 };
4701
4702 for (const auto& config : testConfigs) {
4703 SCOPED_TRACE(fmt::format("testConfig: [{}] [{}] [{}]", fmt::join(config.servers, ","),
4704 fmt::join(config.tlsServers, ","), config.tlsName));
4705 parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4706 parcel.servers = config.servers;
4707 parcel.tlsServers = config.tlsServers;
4708 parcel.tlsName = config.tlsName;
4709 repeatedSetResolversFromParcel(parcel);
Mike Yu61d17262020-02-15 18:56:22 +08004710 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu153b5b82020-03-04 19:53:54 +08004711
4712 // The stats remains when the list of search domains changes.
4713 parcel.domains.push_back("tmp.domains");
4714 repeatedSetResolversFromParcel(parcel);
Mike Yu61d17262020-02-15 18:56:22 +08004715 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu153b5b82020-03-04 19:53:54 +08004716
4717 // The stats remains when the parameters change (except maxSamples).
4718 parcel.sampleValiditySeconds++;
4719 parcel.successThreshold++;
4720 parcel.minSamples++;
4721 parcel.baseTimeoutMsec++;
4722 parcel.retryCount++;
4723 repeatedSetResolversFromParcel(parcel);
Mike Yu61d17262020-02-15 18:56:22 +08004724 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu153b5b82020-03-04 19:53:54 +08004725 }
4726
4727 // The cache remains.
4728 EXPECT_NE(safe_getaddrinfo(hostname, nullptr, &hints), nullptr);
4729 EXPECT_EQ(GetNumQueries(dns, hostname), 1U);
4730}
4731
4732TEST_F(ResolverTest, RepeatedSetup_NoRedundantPrivateDnsValidation) {
4733 const std::string addr1 = getUniqueIPv4Address(); // For a workable DNS server.
4734 const std::string addr2 = getUniqueIPv4Address(); // For an unresponsive DNS server.
4735 const std::string unusable_addr = getUniqueIPv4Address();
Mike Yubc4b9502020-03-20 13:14:00 +08004736 const auto waitForPrivateDnsStateUpdated = []() {
4737 // A buffer time for the PrivateDnsConfiguration instance to update its map,
4738 // mPrivateDnsValidateThreads, which is used for tracking validation threads.
4739 // Since there is a time gap between when PrivateDnsConfiguration reports
4740 // onPrivateDnsValidationEvent and when PrivateDnsConfiguration updates the map, this is a
4741 // workaround to avoid the test starts a subsequent resolver setup during the time gap.
4742 // TODO: Report onPrivateDnsValidationEvent after all the relevant updates are complete.
4743 // Reference to b/152009023.
4744 std::this_thread::sleep_for(20ms);
4745 };
Mike Yu153b5b82020-03-04 19:53:54 +08004746
4747 test::DNSResponder dns1(addr1);
4748 test::DNSResponder dns2(addr2);
4749 StartDns(dns1, {});
4750 StartDns(dns2, {});
4751 test::DnsTlsFrontend workableTls(addr1, "853", addr1, "53");
4752 test::DnsTlsFrontend unresponsiveTls(addr2, "853", addr2, "53");
Mike Yuf7717f52020-11-24 17:31:12 +08004753 int validationAttemptsToUnresponsiveTls = 1;
Mike Yu153b5b82020-03-04 19:53:54 +08004754 unresponsiveTls.setHangOnHandshakeForTesting(true);
4755 ASSERT_TRUE(workableTls.startServer());
4756 ASSERT_TRUE(unresponsiveTls.startServer());
4757
4758 // First setup.
4759 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4760 parcel.servers = {addr1, addr2, unusable_addr};
4761 parcel.tlsServers = {addr1, addr2, unusable_addr};
4762 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4763
4764 // Check the validation results.
4765 EXPECT_TRUE(WaitForPrivateDnsValidation(workableTls.listen_address(), true));
4766 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
Mike Yuf7717f52020-11-24 17:31:12 +08004767
4768 // The validation is still in progress.
4769 EXPECT_EQ(unresponsiveTls.acceptConnectionsCount(), validationAttemptsToUnresponsiveTls);
Mike Yu153b5b82020-03-04 19:53:54 +08004770
4771 static const struct TestConfig {
4772 std::vector<std::string> tlsServers;
4773 std::string tlsName;
4774 } testConfigs[] = {
4775 {{addr1, addr2, unusable_addr}, ""},
4776 {{unusable_addr, addr1, addr2}, ""},
4777 {{unusable_addr, addr1, addr2}, kDefaultPrivateDnsHostName},
4778 {{addr1, addr2, unusable_addr}, kDefaultPrivateDnsHostName},
4779 };
4780
4781 std::string TlsNameLastTime;
4782 for (const auto& config : testConfigs) {
4783 SCOPED_TRACE(fmt::format("testConfig: [{}] [{}]", fmt::join(config.tlsServers, ","),
4784 config.tlsName));
4785 parcel.servers = config.tlsServers;
4786 parcel.tlsServers = config.tlsServers;
4787 parcel.tlsName = config.tlsName;
4788 parcel.caCertificate = config.tlsName.empty() ? "" : kCaCert;
4789
4790 const bool dnsModeChanged = (TlsNameLastTime != config.tlsName);
Mike Yubc4b9502020-03-20 13:14:00 +08004791
4792 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004793 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4794
4795 for (const auto& serverAddr : parcel.tlsServers) {
4796 SCOPED_TRACE(serverAddr);
4797 if (serverAddr == workableTls.listen_address()) {
4798 if (dnsModeChanged) {
Mike Yuf7717f52020-11-24 17:31:12 +08004799 // Despite the identical IP address, the server is regarded as a different
Mike Yu153b5b82020-03-04 19:53:54 +08004800 // server when DnsTlsServer.name is different. The resolver treats it as a
4801 // different object and begins the validation process.
4802 EXPECT_TRUE(WaitForPrivateDnsValidation(serverAddr, true));
4803 }
4804 } else if (serverAddr == unresponsiveTls.listen_address()) {
Mike Yuf7717f52020-11-24 17:31:12 +08004805 if (dnsModeChanged) {
4806 // Despite the identical IP address, the server is regarded as a different
4807 // server when DnsTlsServer.name is different. The resolver treats it as a
4808 // different object and begins the validation process.
4809 validationAttemptsToUnresponsiveTls++;
4810
4811 // This is the limitation from DnsTlsFrontend. DnsTlsFrontend can't operate
4812 // concurrently. As soon as there's another connection request,
4813 // DnsTlsFrontend resets the unique_fd to the new connection.
4814 EXPECT_TRUE(WaitForPrivateDnsValidation(serverAddr, false));
4815 }
Mike Yu153b5b82020-03-04 19:53:54 +08004816 } else {
4817 // Must be unusable_addr.
4818 // In opportunistic mode, when a validation for a private DNS server fails, the
4819 // resolver just marks the server as failed and doesn't re-evaluate it, but the
4820 // server can be re-evaluated when setResolverConfiguration() is called.
4821 // However, in strict mode, the resolver automatically re-evaluates the server and
4822 // marks the server as in_progress until the validation succeeds, so repeated setup
4823 // makes no effect.
4824 if (dnsModeChanged || config.tlsName.empty() /* not in strict mode */) {
4825 EXPECT_TRUE(WaitForPrivateDnsValidation(serverAddr, false));
4826 }
4827 }
4828 }
4829
4830 // Repeated setups make no effect in strict mode.
Mike Yubc4b9502020-03-20 13:14:00 +08004831 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004832 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4833 if (config.tlsName.empty()) {
4834 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4835 }
Mike Yubc4b9502020-03-20 13:14:00 +08004836 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004837 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4838 if (config.tlsName.empty()) {
4839 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4840 }
4841
Mike Yuf7717f52020-11-24 17:31:12 +08004842 EXPECT_EQ(unresponsiveTls.acceptConnectionsCount(), validationAttemptsToUnresponsiveTls);
Mike Yu153b5b82020-03-04 19:53:54 +08004843
4844 TlsNameLastTime = config.tlsName;
4845 }
4846
4847 // Check that all the validation results are caught.
4848 // Note: it doesn't mean no validation being in progress.
4849 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr1));
4850 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr2));
4851 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(unusable_addr));
4852}
4853
4854TEST_F(ResolverTest, RepeatedSetup_KeepChangingPrivateDnsServers) {
4855 enum TlsServerState { WORKING, UNSUPPORTED, UNRESPONSIVE };
4856 const std::string addr1 = getUniqueIPv4Address();
4857 const std::string addr2 = getUniqueIPv4Address();
Mike Yu9a185882020-03-25 16:02:36 +08004858 const auto waitForPrivateDnsStateUpdated = []() {
4859 // A buffer time for PrivateDnsConfiguration to update its state. It prevents this test
4860 // being flaky. See b/152009023 for the reason.
4861 std::this_thread::sleep_for(20ms);
4862 };
Mike Yu153b5b82020-03-04 19:53:54 +08004863
4864 test::DNSResponder dns1(addr1);
4865 test::DNSResponder dns2(addr2);
4866 StartDns(dns1, {});
4867 StartDns(dns2, {});
4868 test::DnsTlsFrontend tls1(addr1, "853", addr1, "53");
4869 test::DnsTlsFrontend tls2(addr2, "853", addr2, "53");
4870 ASSERT_TRUE(tls1.startServer());
4871 ASSERT_TRUE(tls2.startServer());
4872
4873 static const struct TestConfig {
4874 std::string tlsServer;
4875 std::string tlsName;
4876 bool expectNothingHappenWhenServerUnsupported;
4877 bool expectNothingHappenWhenServerUnresponsive;
4878 std::string asTestName() const {
4879 return fmt::format("{}, {}, {}, {}", tlsServer, tlsName,
4880 expectNothingHappenWhenServerUnsupported,
4881 expectNothingHappenWhenServerUnresponsive);
4882 }
4883 } testConfigs[] = {
4884 {{addr1}, "", false, false},
4885 {{addr2}, "", false, false},
4886 {{addr1}, "", false, true},
4887 {{addr2}, "", false, true},
Mike Yuf7717f52020-11-24 17:31:12 +08004888
4889 // expectNothingHappenWhenServerUnresponsive is false in the two cases because of the
4890 // limitation from DnsTlsFrontend which can't operate concurrently.
4891 {{addr1}, kDefaultPrivateDnsHostName, false, false},
4892 {{addr2}, kDefaultPrivateDnsHostName, false, false},
Mike Yu153b5b82020-03-04 19:53:54 +08004893 {{addr1}, kDefaultPrivateDnsHostName, true, true},
4894 {{addr2}, kDefaultPrivateDnsHostName, true, true},
4895
Mike Yuf7717f52020-11-24 17:31:12 +08004896 // expectNothingHappenWhenServerUnresponsive is true in the two cases because of the
4897 // limitation from DnsTlsFrontend which can't operate concurrently.
4898 {{addr1}, "", true, false},
4899 {{addr2}, "", true, false},
Mike Yu153b5b82020-03-04 19:53:54 +08004900 {{addr1}, "", true, true},
4901 {{addr2}, "", true, true},
4902 };
4903
4904 for (const auto& serverState : {WORKING, UNSUPPORTED, UNRESPONSIVE}) {
4905 int testIndex = 0;
4906 for (const auto& config : testConfigs) {
4907 SCOPED_TRACE(fmt::format("serverState:{} testIndex:{} testConfig:[{}]", serverState,
4908 testIndex++, config.asTestName()));
4909 auto& tls = (config.tlsServer == addr1) ? tls1 : tls2;
4910
4911 if (serverState == UNSUPPORTED && tls.running()) ASSERT_TRUE(tls.stopServer());
4912 if (serverState != UNSUPPORTED && !tls.running()) ASSERT_TRUE(tls.startServer());
4913
4914 tls.setHangOnHandshakeForTesting(serverState == UNRESPONSIVE);
4915 const int connectCountsBefore = tls.acceptConnectionsCount();
4916
Mike Yu9a185882020-03-25 16:02:36 +08004917 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004918 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4919 parcel.servers = {config.tlsServer};
4920 parcel.tlsServers = {config.tlsServer};
4921 parcel.tlsName = config.tlsName;
4922 parcel.caCertificate = config.tlsName.empty() ? "" : kCaCert;
4923 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4924
4925 if (serverState == WORKING) {
4926 EXPECT_TRUE(WaitForPrivateDnsValidation(config.tlsServer, true));
4927 } else if (serverState == UNSUPPORTED) {
4928 if (config.expectNothingHappenWhenServerUnsupported) {
4929 // It's possible that the resolver hasn't yet started to
4930 // connect. Wait a while.
4931 // TODO: See if we can get rid of the hard waiting time, such as comparing
4932 // the CountDiff across two tests.
4933 std::this_thread::sleep_for(100ms);
4934 EXPECT_EQ(tls.acceptConnectionsCount(), connectCountsBefore);
4935 } else {
4936 EXPECT_TRUE(WaitForPrivateDnsValidation(config.tlsServer, false));
4937 }
4938 } else {
4939 // Must be UNRESPONSIVE.
4940 // DnsTlsFrontend is the only signal for checking whether or not the resolver starts
4941 // another validation when the server is unresponsive.
4942 const int expectCountDiff =
4943 config.expectNothingHappenWhenServerUnresponsive ? 0 : 1;
4944 if (expectCountDiff == 0) {
4945 // It's possible that the resolver hasn't yet started to
4946 // connect. Wait a while.
4947 std::this_thread::sleep_for(100ms);
Mike Yuf7717f52020-11-24 17:31:12 +08004948 } else {
4949 EXPECT_TRUE(WaitForPrivateDnsValidation(config.tlsServer, false));
Mike Yu153b5b82020-03-04 19:53:54 +08004950 }
4951 const auto condition = [&]() {
4952 return tls.acceptConnectionsCount() == connectCountsBefore + expectCountDiff;
4953 };
4954 EXPECT_TRUE(PollForCondition(condition));
4955 }
4956 }
4957
4958 // Set to off mode to reset the PrivateDnsConfiguration state.
4959 ResolverParamsParcel setupOffmode = DnsResponderClient::GetDefaultResolverParamsParcel();
4960 setupOffmode.tlsServers.clear();
4961 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(setupOffmode));
4962 }
4963
4964 // Check that all the validation results are caught.
4965 // Note: it doesn't mean no validation being in progress.
4966 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr1));
4967 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr2));
4968}
4969
Ken Chen26dc2b02020-06-16 18:49:39 +08004970TEST_F(ResolverTest, PermissionCheckOnCertificateInjection) {
4971 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4972 parcel.caCertificate = kCaCert;
4973 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk());
4974
4975 for (const uid_t uid : {AID_SYSTEM, TEST_UID}) {
4976 ScopedChangeUID scopedChangeUID(uid);
4977 auto status = mDnsClient.resolvService()->setResolverConfiguration(parcel);
4978 EXPECT_EQ(status.getExceptionCode(), EX_SECURITY);
4979 }
4980}
4981
Hungming Chenbb90ab32019-10-28 18:20:31 +08004982// Parameterized tests.
4983// TODO: Merge the existing tests as parameterized test if possible.
4984// TODO: Perhaps move parameterized tests to an independent file.
4985enum class CallType { GETADDRINFO, GETHOSTBYNAME };
4986class ResolverParameterizedTest : public ResolverTest,
Hungming Chen63779052019-10-30 15:06:13 +08004987 public testing::WithParamInterface<CallType> {
4988 protected:
Hungming Chen22617fd2019-12-06 12:15:45 +08004989 void VerifyQueryHelloExampleComV4(const test::DNSResponder& dns, const CallType calltype,
4990 const bool verifyNumQueries = true) {
Hungming Chen63779052019-10-30 15:06:13 +08004991 if (calltype == CallType::GETADDRINFO) {
4992 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4993 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4994 ASSERT_TRUE(result != nullptr);
4995 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4996 } else if (calltype == CallType::GETHOSTBYNAME) {
4997 const hostent* result = gethostbyname("hello");
4998 ASSERT_TRUE(result != nullptr);
4999 ASSERT_EQ(4, result->h_length);
5000 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
5001 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
5002 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
5003 } else {
5004 FAIL() << "Unsupported call type: " << static_cast<uint32_t>(calltype);
5005 }
Hungming Chen22617fd2019-12-06 12:15:45 +08005006 if (verifyNumQueries) EXPECT_EQ(1U, GetNumQueries(dns, kHelloExampleCom));
Hungming Chen63779052019-10-30 15:06:13 +08005007 }
5008};
Hungming Chenbb90ab32019-10-28 18:20:31 +08005009
Hungming Chen63779052019-10-30 15:06:13 +08005010INSTANTIATE_TEST_SUITE_P(QueryCallTest, ResolverParameterizedTest,
Hungming Chenbb90ab32019-10-28 18:20:31 +08005011 testing::Values(CallType::GETADDRINFO, CallType::GETHOSTBYNAME),
5012 [](const testing::TestParamInfo<CallType>& info) {
Hungming Chenbb90ab32019-10-28 18:20:31 +08005013 switch (info.param) {
5014 case CallType::GETADDRINFO:
Hungming Chen63779052019-10-30 15:06:13 +08005015 return "GetAddrInfo";
Hungming Chenbb90ab32019-10-28 18:20:31 +08005016 case CallType::GETHOSTBYNAME:
Hungming Chen63779052019-10-30 15:06:13 +08005017 return "GetHostByName";
Hungming Chenbb90ab32019-10-28 18:20:31 +08005018 default:
Hungming Chen63779052019-10-30 15:06:13 +08005019 return "InvalidParameter"; // Should not happen.
Hungming Chenbb90ab32019-10-28 18:20:31 +08005020 }
Hungming Chenbb90ab32019-10-28 18:20:31 +08005021 });
5022
5023TEST_P(ResolverParameterizedTest, AuthoritySectionAndAdditionalSection) {
5024 // DNS response may have more information in authority section and additional section.
5025 // Currently, getanswer() of packages/modules/DnsResolver/getaddrinfo.cpp doesn't parse the
5026 // content of authority section and additional section. Test these sections if they crash
5027 // the resolver, just in case. See also RFC 1035 section 4.1.
5028 const auto& calltype = GetParam();
5029 test::DNSHeader header(kDefaultDnsHeader);
5030
5031 // Create a DNS response which has a authoritative nameserver record in authority
5032 // section and its relevant address record in additional section.
5033 //
5034 // Question
5035 // hello.example.com. IN A
5036 // Answer
5037 // hello.example.com. IN A 1.2.3.4
5038 // Authority:
5039 // hello.example.com. IN NS ns1.example.com.
5040 // Additional:
5041 // ns1.example.com. IN A 5.6.7.8
5042 //
5043 // A response may have only question, answer, and authority section. Current testing response
5044 // should be able to cover this condition.
5045
5046 // Question section.
5047 test::DNSQuestion question{
5048 .qname = {.name = kHelloExampleCom},
5049 .qtype = ns_type::ns_t_a,
5050 .qclass = ns_c_in,
5051 };
5052 header.questions.push_back(std::move(question));
5053
5054 // Answer section.
5055 test::DNSRecord recordAnswer{
5056 .name = {.name = kHelloExampleCom},
5057 .rtype = ns_type::ns_t_a,
5058 .rclass = ns_c_in,
5059 .ttl = 0, // no cache
5060 };
Hungming Chen63779052019-10-30 15:06:13 +08005061 EXPECT_TRUE(test::DNSResponder::fillRdata(kHelloExampleComAddrV4, recordAnswer));
Hungming Chenbb90ab32019-10-28 18:20:31 +08005062 header.answers.push_back(std::move(recordAnswer));
5063
5064 // Authority section.
5065 test::DNSRecord recordAuthority{
5066 .name = {.name = kHelloExampleCom},
5067 .rtype = ns_type::ns_t_ns,
5068 .rclass = ns_c_in,
5069 .ttl = 0, // no cache
5070 };
5071 EXPECT_TRUE(test::DNSResponder::fillRdata("ns1.example.com.", recordAuthority));
5072 header.authorities.push_back(std::move(recordAuthority));
5073
5074 // Additional section.
5075 test::DNSRecord recordAdditional{
5076 .name = {.name = "ns1.example.com."},
5077 .rtype = ns_type::ns_t_a,
5078 .rclass = ns_c_in,
5079 .ttl = 0, // no cache
5080 };
5081 EXPECT_TRUE(test::DNSResponder::fillRdata("5.6.7.8", recordAdditional));
5082 header.additionals.push_back(std::move(recordAdditional));
5083
5084 // Start DNS server.
5085 test::DNSResponder dns(test::DNSResponder::MappingType::DNS_HEADER);
5086 dns.addMappingDnsHeader(kHelloExampleCom, ns_type::ns_t_a, header);
5087 ASSERT_TRUE(dns.startServer());
5088 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
5089 dns.clearQueries();
5090
5091 // Expect that get the address and the resolver doesn't crash.
Hungming Chen63779052019-10-30 15:06:13 +08005092 VerifyQueryHelloExampleComV4(dns, calltype);
5093}
5094
5095TEST_P(ResolverParameterizedTest, MessageCompression) {
5096 const auto& calltype = GetParam();
5097
5098 // The response with compressed domain name by a pointer. See RFC 1035 section 4.1.4.
5099 //
5100 // Ignoring the other fields of the message, the domain name of question section and answer
5101 // section are presented as:
5102 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5103 // 12 | 5 | h |
5104 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5105 // 14 | e | l |
5106 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5107 // 16 | l | o |
5108 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5109 // 18 | 7 | e |
5110 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5111 // 20 | x | a |
5112 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5113 // 22 | m | p |
5114 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5115 // 24 | l | e |
5116 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5117 // 26 | 3 | c |
5118 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5119 // 28 | o | m |
5120 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5121 // 30 | 0 | ... |
5122 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5123 //
5124 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5125 // 35 | 1 1| 12 |
5126 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5127 const std::vector<uint8_t> kResponseAPointer = {
5128 /* Header */
5129 0x00, 0x00, /* Transaction ID: 0x0000 */
5130 0x81, 0x80, /* Flags: qr rd ra */
5131 0x00, 0x01, /* Questions: 1 */
5132 0x00, 0x01, /* Answer RRs: 1 */
5133 0x00, 0x00, /* Authority RRs: 0 */
5134 0x00, 0x00, /* Additional RRs: 0 */
5135 /* Queries */
5136 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
5137 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name: hello.example.com */
5138 0x00, 0x01, /* Type: A */
5139 0x00, 0x01, /* Class: IN */
5140 /* Answers */
5141 0xc0, 0x0c, /* Name: hello.example.com (a pointer) */
5142 0x00, 0x01, /* Type: A */
5143 0x00, 0x01, /* Class: IN */
5144 0x00, 0x00, 0x00, 0x00, /* Time to live: 0 */
5145 0x00, 0x04, /* Data length: 4 */
5146 0x01, 0x02, 0x03, 0x04 /* Address: 1.2.3.4 */
5147 };
5148
5149 // The response with compressed domain name by a sequence of labels ending with a pointer. See
5150 // RFC 1035 section 4.1.4.
5151 //
5152 // Ignoring the other fields of the message, the domain name of question section and answer
5153 // section are presented as:
5154 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5155 // 12 | 5 | h |
5156 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5157 // 14 | e | l |
5158 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5159 // 16 | l | o |
5160 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5161 // 18 | 7 | e |
5162 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5163 // 20 | x | a |
5164 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5165 // 22 | m | p |
5166 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5167 // 24 | l | e |
5168 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5169 // 26 | 3 | c |
5170 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5171 // 28 | o | m |
5172 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5173 // 30 | 0 | ... |
5174 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5175 //
5176 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5177 // 35 | 5 | h |
5178 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5179 // 37 | e | l |
5180 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5181 // 39 | l | o |
5182 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5183 // 41 | 1 1| 18 |
5184 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5185 const std::vector<uint8_t> kResponseLabelEndingWithAPointer = {
5186 /* Header */
5187 0x00, 0x00, /* Transaction ID: 0x0000 */
5188 0x81, 0x80, /* Flags: qr rd ra */
5189 0x00, 0x01, /* Questions: 1 */
5190 0x00, 0x01, /* Answer RRs: 1 */
5191 0x00, 0x00, /* Authority RRs: 0 */
5192 0x00, 0x00, /* Additional RRs: 0 */
5193 /* Queries */
5194 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
5195 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name: hello.example.com */
5196 0x00, 0x01, /* Type: A */
5197 0x00, 0x01, /* Class: IN */
5198 /* Answers */
5199 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0xc0,
5200 0x12, /* Name: hello.example.com (a label ending with a pointer) */
5201 0x00, 0x01, /* Type: A */
5202 0x00, 0x01, /* Class: IN */
5203 0x00, 0x00, 0x00, 0x00, /* Time to live: 0 */
5204 0x00, 0x04, /* Data length: 4 */
5205 0x01, 0x02, 0x03, 0x04 /* Address: 1.2.3.4 */
5206 };
5207
5208 for (const auto& response : {kResponseAPointer, kResponseLabelEndingWithAPointer}) {
5209 SCOPED_TRACE(StringPrintf("Hex dump: %s", toHex(makeSlice(response)).c_str()));
5210
5211 test::DNSResponder dns(test::DNSResponder::MappingType::BINARY_PACKET);
5212 dns.addMappingBinaryPacket(kHelloExampleComQueryV4, response);
5213 StartDns(dns, {});
5214 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
5215
5216 // Expect no cache because the TTL of testing responses are 0.
5217 VerifyQueryHelloExampleComV4(dns, calltype);
Hungming Chenbb90ab32019-10-28 18:20:31 +08005218 }
Mike Yu40e67072019-10-09 21:14:09 +08005219}
Hungming Chen22617fd2019-12-06 12:15:45 +08005220
5221TEST_P(ResolverParameterizedTest, TruncatedResponse) {
5222 const auto& calltype = GetParam();
5223
Hungming Chen22617fd2019-12-06 12:15:45 +08005224 test::DNSResponder dns;
Ken Chen99344882020-01-01 14:59:38 +08005225 StartDns(dns, kLargeCnameChainRecords);
Hungming Chen22617fd2019-12-06 12:15:45 +08005226 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
5227
5228 // Expect UDP response is truncated. The resolver retries over TCP. See RFC 1035 section 4.2.1.
5229 VerifyQueryHelloExampleComV4(dns, calltype, false);
5230 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom));
5231 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom));
5232}
Luke Huang420ee622019-11-27 17:52:44 +08005233
5234TEST_F(ResolverTest, KeepListeningUDP) {
5235 constexpr char listen_addr1[] = "127.0.0.4";
5236 constexpr char listen_addr2[] = "127.0.0.5";
5237 constexpr char host_name[] = "howdy.example.com.";
5238 const std::vector<DnsRecord> records = {
5239 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
5240 };
5241 const std::vector<int> params = {300, 25, 8, 8, 1000 /* BASE_TIMEOUT_MSEC */,
5242 1 /* retry count */};
5243 const int delayTimeMs = 1500;
5244
5245 test::DNSResponder neverRespondDns(listen_addr2, "53", static_cast<ns_rcode>(-1));
5246 neverRespondDns.setResponseProbability(0.0);
5247 StartDns(neverRespondDns, records);
Luke Huangf40df9c2020-04-21 08:51:48 +08005248 ScopedSystemProperties scopedSystemProperties(
5249 "persist.device_config.netd_native.keep_listening_udp", "1");
5250 // Re-setup test network to make experiment flag take effect.
5251 resetNetwork();
Luke Huang420ee622019-11-27 17:52:44 +08005252
5253 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr1, listen_addr2},
5254 kDefaultSearchDomains, params));
5255 // There are 2 DNS servers for this test.
5256 // |delayedDns| will be blocked for |delayTimeMs|, then start to respond to requests.
5257 // |neverRespondDns| will never respond.
5258 // In the first try, resolver will send query to |delayedDns| but get timeout error
5259 // because |delayTimeMs| > DNS timeout.
5260 // Then it's the second try, resolver will send query to |neverRespondDns| and
5261 // listen on both servers. Resolver will receive the answer coming from |delayedDns|.
Luke Huang420ee622019-11-27 17:52:44 +08005262
Luke Huang420ee622019-11-27 17:52:44 +08005263 test::DNSResponder delayedDns(listen_addr1);
5264 delayedDns.setResponseDelayMs(delayTimeMs);
5265 StartDns(delayedDns, records);
5266
5267 // Specify hints to ensure resolver doing query only 1 round.
5268 const addrinfo hints = {.ai_family = AF_INET6, .ai_socktype = SOCK_DGRAM};
5269 ScopedAddrinfo result = safe_getaddrinfo(host_name, nullptr, &hints);
5270 EXPECT_TRUE(result != nullptr);
5271
5272 std::string result_str = ToString(result);
5273 EXPECT_TRUE(result_str == "::1.2.3.4") << ", result_str='" << result_str << "'";
5274}
Luke Huang0a0870d2020-02-12 20:41:10 +08005275
5276TEST_F(ResolverTest, GetAddrInfoParallelLookupTimeout) {
5277 constexpr char listen_addr[] = "127.0.0.4";
5278 constexpr char host_name[] = "howdy.example.com.";
5279 constexpr int TIMING_TOLERANCE_MS = 200;
5280 constexpr int DNS_TIMEOUT_MS = 1000;
5281 const std::vector<DnsRecord> records = {
5282 {host_name, ns_type::ns_t_a, "1.2.3.4"},
5283 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
5284 };
5285 const std::vector<int> params = {300, 25, 8, 8, DNS_TIMEOUT_MS /* BASE_TIMEOUT_MSEC */,
5286 1 /* retry count */};
5287 test::DNSResponder neverRespondDns(listen_addr, "53", static_cast<ns_rcode>(-1));
5288 neverRespondDns.setResponseProbability(0.0);
5289 StartDns(neverRespondDns, records);
Luke Huangf40df9c2020-04-21 08:51:48 +08005290 ScopedSystemProperties scopedSystemProperties(
5291 "persist.device_config.netd_native.parallel_lookup", "1");
Luke Huangd1d734f2020-04-30 12:25:40 +08005292 // The default value of parallel_lookup_sleep_time should be very small
5293 // that we can ignore in this test case.
Luke Huangf40df9c2020-04-21 08:51:48 +08005294 // Re-setup test network to make experiment flag take effect.
5295 resetNetwork();
Luke Huang0a0870d2020-02-12 20:41:10 +08005296
5297 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}, kDefaultSearchDomains, params));
5298 neverRespondDns.clearQueries();
5299
Luke Huang0a0870d2020-02-12 20:41:10 +08005300 // Use a never respond DNS server to verify if the A/AAAA queries are sent in parallel.
5301 // The resolver parameters are set to timeout 1s and retry 1 times.
5302 // So we expect the safe_getaddrinfo_time_taken() might take ~1s to
5303 // return when parallel lookup is enabled. And the DNS server should receive 2 queries.
5304 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_DGRAM};
5305 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(host_name, nullptr, hints);
5306
5307 EXPECT_TRUE(result == nullptr);
5308 EXPECT_NEAR(DNS_TIMEOUT_MS, timeTakenMs, TIMING_TOLERANCE_MS)
5309 << "took time should approximate equal timeout";
5310 EXPECT_EQ(2U, GetNumQueries(neverRespondDns, host_name));
Mike Yu532405f2020-06-17 17:46:44 +08005311 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, RCODE_TIMEOUT, host_name, {});
Luke Huang0a0870d2020-02-12 20:41:10 +08005312}
Luke Huangd1d734f2020-04-30 12:25:40 +08005313
5314TEST_F(ResolverTest, GetAddrInfoParallelLookupSleepTime) {
5315 constexpr char listen_addr[] = "127.0.0.4";
5316 constexpr int TIMING_TOLERANCE_MS = 200;
5317 const std::vector<DnsRecord> records = {
5318 {kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4},
5319 {kHelloExampleCom, ns_type::ns_t_aaaa, kHelloExampleComAddrV6},
5320 };
5321 const std::vector<int> params = {300, 25, 8, 8, 1000 /* BASE_TIMEOUT_MSEC */,
5322 1 /* retry count */};
5323 test::DNSResponder dns(listen_addr);
5324 StartDns(dns, records);
5325 ScopedSystemProperties scopedSystemProperties1(
5326 "persist.device_config.netd_native.parallel_lookup", "1");
5327 constexpr int PARALLEL_LOOKUP_SLEEP_TIME_MS = 500;
5328 ScopedSystemProperties scopedSystemProperties2(
5329 "persist.device_config.netd_native.parallel_lookup_sleep_time",
5330 std::to_string(PARALLEL_LOOKUP_SLEEP_TIME_MS));
5331 // Re-setup test network to make experiment flag take effect.
5332 resetNetwork();
5333
5334 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}, kDefaultSearchDomains, params));
5335 dns.clearQueries();
5336
5337 // Expect the safe_getaddrinfo_time_taken() might take ~500ms to return because we set
5338 // parallel_lookup_sleep_time to 500ms.
5339 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_DGRAM};
5340 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(kHelloExampleCom, nullptr, hints);
5341
5342 EXPECT_NE(nullptr, result);
5343 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(
5344 {kHelloExampleComAddrV4, kHelloExampleComAddrV6}));
5345 EXPECT_NEAR(PARALLEL_LOOKUP_SLEEP_TIME_MS, timeTakenMs, TIMING_TOLERANCE_MS)
5346 << "took time should approximate equal timeout";
5347 EXPECT_EQ(2U, GetNumQueries(dns, kHelloExampleCom));
5348
5349 // Expect the PARALLEL_LOOKUP_SLEEP_TIME_MS won't affect the query under cache hit case.
5350 dns.clearQueries();
5351 std::tie(result, timeTakenMs) = safe_getaddrinfo_time_taken(kHelloExampleCom, nullptr, hints);
5352 EXPECT_NE(nullptr, result);
5353 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(
5354 {kHelloExampleComAddrV4, kHelloExampleComAddrV6}));
5355 EXPECT_GT(PARALLEL_LOOKUP_SLEEP_TIME_MS, timeTakenMs);
5356 EXPECT_EQ(0U, GetNumQueries(dns, kHelloExampleCom));
5357}
Luke Huangeb618ef2020-05-26 14:17:02 +08005358
5359TEST_F(ResolverTest, BlockDnsQueryUidDoesNotLeadToBadServer) {
5360 // This test relies on blocking traffic on loopback, which xt_qtaguid does not do.
5361 // See aosp/358413 and b/34444781 for why.
5362 SKIP_IF_BPF_NOT_SUPPORTED;
5363
5364 constexpr char listen_addr1[] = "127.0.0.4";
5365 constexpr char listen_addr2[] = "::1";
5366 test::DNSResponder dns1(listen_addr1);
5367 test::DNSResponder dns2(listen_addr2);
5368 StartDns(dns1, {});
5369 StartDns(dns2, {});
5370
5371 std::vector<std::string> servers = {listen_addr1, listen_addr2};
5372 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
5373 dns1.clearQueries();
5374 dns2.clearQueries();
5375 {
5376 ScopeBlockedUIDRule scopeBlockUidRule(mDnsClient.netdService(), TEST_UID);
5377 // Start querying ten times.
5378 for (int i = 0; i < 10; i++) {
5379 std::string hostName = fmt::format("blocked{}.com", i);
5380 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
Luke Huang5729afc2020-07-30 23:12:17 +08005381 // The query result between R+ and Q would be different, but we don't really care
5382 // about the result here because this test is only used to ensure blocked uid rule
5383 // won't cause bad servers.
5384 safe_getaddrinfo(hostName.c_str(), nullptr, &hints);
Luke Huangeb618ef2020-05-26 14:17:02 +08005385 }
5386 }
Luke Huang5729afc2020-07-30 23:12:17 +08005387 ResolverParamsParcel setupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
5388 // If api level >= 30 (R+), expect all query packets to be blocked, hence we should not see any
5389 // of their stats show up. Otherwise, all queries should succeed.
5390 const std::vector<NameserverStats> expectedDnsStats = {
5391 NameserverStats(listen_addr1).setSuccesses(isAtLeastR ? 0 : setupParams.maxSamples),
Luke Huangeb618ef2020-05-26 14:17:02 +08005392 NameserverStats(listen_addr2),
5393 };
Luke Huang5729afc2020-07-30 23:12:17 +08005394 expectStatsEqualTo(expectedDnsStats);
5395 // If api level >= 30 (R+), expect server won't receive any queries,
5396 // otherwise expect 20 == 10 * (setupParams.domains.size() + 1) queries.
5397 EXPECT_EQ(dns1.queries().size(), isAtLeastR ? 0U : 10 * (setupParams.domains.size() + 1));
Luke Huangeb618ef2020-05-26 14:17:02 +08005398 EXPECT_EQ(dns2.queries().size(), 0U);
5399}
Mike Yu6ce587d2019-12-19 21:30:22 +08005400
Mike Yu10832aa2020-08-25 19:13:11 +08005401TEST_F(ResolverTest, DnsServerSelection) {
5402 test::DNSResponder dns1("127.0.0.3");
5403 test::DNSResponder dns2("127.0.0.4");
5404 test::DNSResponder dns3("127.0.0.5");
5405
5406 dns1.setResponseDelayMs(10);
5407 dns2.setResponseDelayMs(25);
5408 dns3.setResponseDelayMs(50);
5409 StartDns(dns1, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
5410 StartDns(dns2, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
5411 StartDns(dns3, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
5412
5413 ScopedSystemProperties scopedSystemProperties(kSortNameserversFlag, "1");
5414
Mike Yueb8f22c2020-09-22 11:58:13 +08005415 // NOTE: the servers must be sorted alphabetically.
5416 std::vector<std::string> serverList = {
5417 dns1.listen_address(),
5418 dns2.listen_address(),
5419 dns3.listen_address(),
Mike Yu10832aa2020-08-25 19:13:11 +08005420 };
Mike Yueb8f22c2020-09-22 11:58:13 +08005421
5422 do {
Mike Yu10832aa2020-08-25 19:13:11 +08005423 SCOPED_TRACE(fmt::format("testConfig: [{}]", fmt::join(serverList, ", ")));
5424 const int queryNum = 50;
5425 int64_t accumulatedTime = 0;
5426
5427 // Restart the testing network to 1) make the flag take effect and 2) reset the statistics.
5428 resetNetwork();
5429
5430 // DnsServerSelection doesn't apply to private DNS.
5431 ResolverParamsParcel setupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
5432 setupParams.servers = serverList;
5433 setupParams.tlsServers.clear();
5434 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(setupParams));
5435
5436 // DNSResponder doesn't handle queries concurrently, so don't allow more than
5437 // one in-flight query.
5438 for (int i = 0; i < queryNum; i++) {
5439 Stopwatch s;
5440 int fd = resNetworkQuery(TEST_NETID, kHelloExampleCom, ns_c_in, ns_t_a,
5441 ANDROID_RESOLV_NO_CACHE_LOOKUP);
5442 expectAnswersValid(fd, AF_INET, kHelloExampleComAddrV4);
5443 accumulatedTime += s.timeTakenUs();
5444 }
5445
5446 const int dns1Count = dns1.queries().size();
5447 const int dns2Count = dns2.queries().size();
5448 const int dns3Count = dns3.queries().size();
5449
5450 // All of the servers have ever been selected. In addition, the less latency server
5451 // is selected more frequently.
5452 EXPECT_GT(dns1Count, 0);
5453 EXPECT_GT(dns2Count, 0);
5454 EXPECT_GT(dns3Count, 0);
5455 EXPECT_GT(dns1Count, dns2Count);
5456 EXPECT_GT(dns2Count, dns3Count);
5457
Mike Yueb8f22c2020-09-22 11:58:13 +08005458 const int averageTime = accumulatedTime / queryNum;
5459 LOG(INFO) << "ResolverTest#DnsServerSelection: averageTime " << averageTime << "us";
Mike Yu10832aa2020-08-25 19:13:11 +08005460
Mike Yueb8f22c2020-09-22 11:58:13 +08005461 // Since the average Time might differ depending on parameters, set [10ms, 20ms] as
Mike Yu10832aa2020-08-25 19:13:11 +08005462 // acceptable range.
Mike Yueb8f22c2020-09-22 11:58:13 +08005463 EXPECT_GE(averageTime, 10000);
5464 EXPECT_LE(averageTime, 20000);
Mike Yu10832aa2020-08-25 19:13:11 +08005465
5466 dns1.clearQueries();
5467 dns2.clearQueries();
5468 dns3.clearQueries();
Mike Yueb8f22c2020-09-22 11:58:13 +08005469 } while (std::next_permutation(serverList.begin(), serverList.end()));
Mike Yu10832aa2020-08-25 19:13:11 +08005470}
5471
Mike Yu5e1b9912020-11-10 16:50:13 +08005472TEST_F(ResolverTest, MultipleDotQueriesInOnePacket) {
5473 constexpr char hostname1[] = "query1.example.com.";
5474 constexpr char hostname2[] = "query2.example.com.";
5475 const std::vector<DnsRecord> records = {
5476 {hostname1, ns_type::ns_t_a, "1.2.3.4"},
5477 {hostname2, ns_type::ns_t_a, "1.2.3.5"},
5478 };
5479
5480 const std::string addr = getUniqueIPv4Address();
5481 test::DNSResponder dns(addr);
5482 StartDns(dns, records);
5483 test::DnsTlsFrontend tls(addr, "853", addr, "53");
5484 ASSERT_TRUE(tls.startServer());
5485
5486 // Set up resolver to strict mode.
5487 auto parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
5488 parcel.servers = {addr};
5489 parcel.tlsServers = {addr};
5490 parcel.tlsName = kDefaultPrivateDnsHostName;
5491 parcel.caCertificate = kCaCert;
5492 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
5493 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
5494 EXPECT_TRUE(tls.waitForQueries(1));
5495 tls.clearQueries();
5496 dns.clearQueries();
5497
5498 const auto queryAndCheck = [&](const std::string& hostname,
5499 const std::vector<DnsRecord>& records) {
5500 SCOPED_TRACE(hostname);
5501
5502 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
5503 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(hostname.c_str(), nullptr, hints);
5504
5505 std::vector<std::string> expectedAnswers;
5506 for (const auto& r : records) {
5507 if (r.host_name == hostname) expectedAnswers.push_back(r.addr);
5508 }
5509
5510 EXPECT_LE(timeTakenMs, 200);
5511 ASSERT_NE(result, nullptr);
5512 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(expectedAnswers));
5513 };
5514
5515 // Set tls to reply DNS responses in one TCP packet and not to close the connection from its
5516 // side.
5517 tls.setDelayQueries(2);
5518 tls.setDelayQueriesTimeout(500);
5519 tls.setPassiveClose(true);
5520
5521 // Start sending DNS requests at the same time.
5522 std::array<std::thread, 2> threads;
5523 threads[0] = std::thread(queryAndCheck, hostname1, records);
5524 threads[1] = std::thread(queryAndCheck, hostname2, records);
5525
5526 threads[0].join();
5527 threads[1].join();
5528
5529 // Also check no additional queries due to DoT reconnection.
5530 EXPECT_EQ(tls.queries(), 2);
5531}
5532
Mike Yu6ce587d2019-12-19 21:30:22 +08005533// ResolverMultinetworkTest is used to verify multinetwork functionality. Here's how it works:
5534// The resolver sends queries to address A, and then there will be a TunForwarder helping forward
5535// the packets to address B, which is the address on which the testing server is listening. The
5536// answer packets responded from the testing server go through the reverse path back to the
5537// resolver.
5538//
5539// To achieve the that, it needs to set up a interface with routing rules. Tests are not
5540// supposed to initiate DNS servers on their own; instead, some utilities are added to the class to
5541// help the setup.
5542//
5543// An example of how to use it:
5544// TEST_F() {
Luke Huang81568fb2020-07-13 00:55:12 +08005545// ScopedPhysicalNetwork network = CreateScopedPhysicalNetwork(V4);
Mike Yu6ce587d2019-12-19 21:30:22 +08005546// network.init();
5547//
5548// auto dns = network.addIpv4Dns();
5549// StartDns(dns.dnsServer, {});
5550//
Luke Huang81568fb2020-07-13 00:55:12 +08005551// network.setDnsConfiguration();
Mike Yu6ce587d2019-12-19 21:30:22 +08005552// network.startTunForwarder();
5553//
5554// // Send queries here
5555// }
5556
5557class ResolverMultinetworkTest : public ResolverTest {
5558 protected:
5559 enum class ConnectivityType { V4, V6, V4V6 };
Luke Huang81568fb2020-07-13 00:55:12 +08005560 static constexpr int TEST_NETID_BASE = 10000;
Mike Yu6ce587d2019-12-19 21:30:22 +08005561
5562 struct DnsServerPair {
Luke Huang81568fb2020-07-13 00:55:12 +08005563 DnsServerPair(std::shared_ptr<test::DNSResponder> server, std::string addr)
5564 : dnsServer(server), dnsAddr(addr) {}
5565 std::shared_ptr<test::DNSResponder> dnsServer;
Mike Yu6ce587d2019-12-19 21:30:22 +08005566 std::string dnsAddr; // The DNS server address used for setResolverConfiguration().
5567 // TODO: Add test::DnsTlsFrontend* and std::string for DoT.
5568 };
5569
5570 class ScopedNetwork {
5571 public:
5572 ScopedNetwork(unsigned netId, ConnectivityType type, INetd* netdSrv,
Luke Huang81568fb2020-07-13 00:55:12 +08005573 IDnsResolver* dnsResolvSrv, const char* networkName)
Mike Yu6ce587d2019-12-19 21:30:22 +08005574 : mNetId(netId),
5575 mConnectivityType(type),
5576 mNetdSrv(netdSrv),
Luke Huang81568fb2020-07-13 00:55:12 +08005577 mDnsResolvSrv(dnsResolvSrv),
5578 mNetworkName(networkName) {
5579 mIfname = fmt::format("testtun{}", netId);
Mike Yu6ce587d2019-12-19 21:30:22 +08005580 }
Luke Huang81568fb2020-07-13 00:55:12 +08005581 virtual ~ScopedNetwork() {
5582 if (mNetdSrv != nullptr) mNetdSrv->networkDestroy(mNetId);
5583 if (mDnsResolvSrv != nullptr) mDnsResolvSrv->destroyNetworkCache(mNetId);
5584 }
Mike Yu6ce587d2019-12-19 21:30:22 +08005585
5586 Result<void> init();
Mike Yu6ce587d2019-12-19 21:30:22 +08005587 Result<DnsServerPair> addIpv4Dns() { return addDns(ConnectivityType::V4); }
5588 Result<DnsServerPair> addIpv6Dns() { return addDns(ConnectivityType::V6); }
5589 bool startTunForwarder() { return mTunForwarder->startForwarding(); }
Luke Huang81568fb2020-07-13 00:55:12 +08005590 bool setDnsConfiguration() const;
5591 bool clearDnsConfiguration() const;
Mike Yu6ce587d2019-12-19 21:30:22 +08005592 unsigned netId() const { return mNetId; }
Luke Huang81568fb2020-07-13 00:55:12 +08005593 std::string name() const { return mNetworkName; }
Mike Yu6ce587d2019-12-19 21:30:22 +08005594
Luke Huang81568fb2020-07-13 00:55:12 +08005595 protected:
5596 // Subclasses should implement it to decide which network should be create.
5597 virtual Result<void> createNetwork() const = 0;
Mike Yu6ce587d2019-12-19 21:30:22 +08005598
5599 const unsigned mNetId;
5600 const ConnectivityType mConnectivityType;
5601 INetd* mNetdSrv;
5602 IDnsResolver* mDnsResolvSrv;
Luke Huang81568fb2020-07-13 00:55:12 +08005603 const std::string mNetworkName;
Mike Yu6ce587d2019-12-19 21:30:22 +08005604 std::string mIfname;
5605 std::unique_ptr<TunForwarder> mTunForwarder;
Luke Huang81568fb2020-07-13 00:55:12 +08005606 std::vector<DnsServerPair> mDnsServerPairs;
5607
5608 private:
5609 Result<DnsServerPair> addDns(ConnectivityType connectivity);
5610 // Assuming mNetId is unique during ResolverMultinetworkTest, make the
5611 // address based on it to avoid conflicts.
5612 std::string makeIpv4AddrString(uint8_t n) const {
5613 return StringPrintf("192.168.%u.%u", (mNetId - TEST_NETID_BASE), n);
5614 }
5615 std::string makeIpv6AddrString(uint8_t n) const {
5616 return StringPrintf("2001:db8:%u::%u", (mNetId - TEST_NETID_BASE), n);
5617 }
5618 };
5619
5620 class ScopedPhysicalNetwork : public ScopedNetwork {
5621 public:
5622 ScopedPhysicalNetwork(unsigned netId, const char* networkName)
5623 : ScopedNetwork(netId, ConnectivityType::V4V6, nullptr, nullptr, networkName) {}
5624 ScopedPhysicalNetwork(unsigned netId, ConnectivityType type, INetd* netdSrv,
5625 IDnsResolver* dnsResolvSrv, const char* name = "Physical")
5626 : ScopedNetwork(netId, type, netdSrv, dnsResolvSrv, name) {}
5627
5628 protected:
5629 Result<void> createNetwork() const override {
5630 if (auto r = mNetdSrv->networkCreatePhysical(mNetId, INetd::PERMISSION_NONE);
5631 !r.isOk()) {
5632 return Error() << r.getMessage();
5633 }
5634 return {};
5635 }
5636 };
5637
5638 class ScopedVirtualNetwork : public ScopedNetwork {
5639 public:
5640 ScopedVirtualNetwork(unsigned netId, ConnectivityType type, INetd* netdSrv,
5641 IDnsResolver* dnsResolvSrv, const char* name, bool isSecure)
5642 : ScopedNetwork(netId, type, netdSrv, dnsResolvSrv, name), mIsSecure(isSecure) {}
5643 ~ScopedVirtualNetwork() {
5644 if (!mVpnIsolationUids.empty()) {
5645 const std::vector<int> tmpUids(mVpnIsolationUids.begin(), mVpnIsolationUids.end());
5646 mNetdSrv->firewallRemoveUidInterfaceRules(tmpUids);
5647 }
5648 }
5649 // Enable VPN isolation. Ensures that uid can only receive packets on mIfname.
5650 Result<void> enableVpnIsolation(int uid) {
5651 if (auto r = mNetdSrv->firewallAddUidInterfaceRules(mIfname, {uid}); !r.isOk()) {
5652 return Error() << r.getMessage();
5653 }
5654 mVpnIsolationUids.insert(uid);
5655 return {};
5656 }
5657 Result<void> disableVpnIsolation(int uid) {
5658 if (auto r = mNetdSrv->firewallRemoveUidInterfaceRules({static_cast<int>(uid)});
5659 !r.isOk()) {
5660 return Error() << r.getMessage();
5661 }
5662 mVpnIsolationUids.erase(uid);
5663 return {};
5664 }
5665 Result<void> addUser(uid_t uid) const { return addUidRange(uid, uid); }
5666 Result<void> addUidRange(uid_t from, uid_t to) const {
5667 if (auto r = mNetdSrv->networkAddUidRanges(mNetId, {makeUidRangeParcel(from, to)});
5668 !r.isOk()) {
5669 return Error() << r.getMessage();
5670 }
5671 return {};
5672 }
5673
5674 protected:
5675 Result<void> createNetwork() const override {
5676 if (auto r = mNetdSrv->networkCreateVpn(mNetId, mIsSecure); !r.isOk()) {
5677 return Error() << r.getMessage();
5678 }
5679 return {};
5680 }
5681
5682 bool mIsSecure = false;
5683 std::unordered_set<int> mVpnIsolationUids;
Mike Yu6ce587d2019-12-19 21:30:22 +08005684 };
5685
5686 void SetUp() override {
5687 ResolverTest::SetUp();
5688 ASSERT_NE(mDnsClient.netdService(), nullptr);
5689 ASSERT_NE(mDnsClient.resolvService(), nullptr);
5690 }
5691
Luke Huang81568fb2020-07-13 00:55:12 +08005692 void TearDown() override {
5693 ResolverTest::TearDown();
5694 // Restore default network
5695 if (mStoredDefaultNetwork >= 0) {
5696 mDnsClient.netdService()->networkSetDefault(mStoredDefaultNetwork);
5697 }
5698 }
Mike Yu6ce587d2019-12-19 21:30:22 +08005699
Luke Huang81568fb2020-07-13 00:55:12 +08005700 ScopedPhysicalNetwork CreateScopedPhysicalNetwork(ConnectivityType type,
5701 const char* name = "Physical") {
5702 return {getFreeNetId(), type, mDnsClient.netdService(), mDnsClient.resolvService(), name};
5703 }
5704 ScopedVirtualNetwork CreateScopedVirtualNetwork(ConnectivityType type, bool isSecure,
5705 const char* name = "Virtual") {
5706 return {getFreeNetId(), type, mDnsClient.netdService(), mDnsClient.resolvService(),
5707 name, isSecure};
5708 }
Mike Yu6ce587d2019-12-19 21:30:22 +08005709 void StartDns(test::DNSResponder& dns, const std::vector<DnsRecord>& records);
Luke Huang81568fb2020-07-13 00:55:12 +08005710 void setDefaultNetwork(int netId) {
5711 // Save current default network at the first call.
5712 std::call_once(defaultNetworkFlag, [&]() {
5713 ASSERT_TRUE(mDnsClient.netdService()->networkGetDefault(&mStoredDefaultNetwork).isOk());
5714 });
5715 ASSERT_TRUE(mDnsClient.netdService()->networkSetDefault(netId).isOk());
5716 }
5717 unsigned getFreeNetId() {
5718 if (mNextNetId == TEST_NETID_BASE + 256) mNextNetId = TEST_NETID_BASE;
5719 return mNextNetId++;
5720 }
Mike Yu6ce587d2019-12-19 21:30:22 +08005721
5722 private:
5723 // Use a different netId because this class inherits from the class ResolverTest which
Luke Huang81568fb2020-07-13 00:55:12 +08005724 // always creates TEST_NETID in setup. It's incremented when CreateScoped{Physical,
5725 // Virtual}Network() is called.
5726 // Note: 255 is the maximum number of (mNextNetId - TEST_NETID_BASE) here as mNextNetId
5727 // is used to create address.
5728 unsigned mNextNetId = TEST_NETID_BASE;
5729 // Use -1 to represent that default network was not modified because
5730 // real netId must be an unsigned value.
5731 int mStoredDefaultNetwork = -1;
5732 std::once_flag defaultNetworkFlag;
Mike Yu6ce587d2019-12-19 21:30:22 +08005733};
5734
Mike Yu6ce587d2019-12-19 21:30:22 +08005735Result<void> ResolverMultinetworkTest::ScopedNetwork::init() {
Luke Huang81568fb2020-07-13 00:55:12 +08005736 if (mNetdSrv == nullptr || mDnsResolvSrv == nullptr) return Error() << "srv not available";
Mike Yu6ce587d2019-12-19 21:30:22 +08005737 unique_fd ufd = TunForwarder::createTun(mIfname);
5738 if (!ufd.ok()) {
5739 return Errorf("createTun for {} failed", mIfname);
5740 }
5741 mTunForwarder = std::make_unique<TunForwarder>(std::move(ufd));
5742
Luke Huang81568fb2020-07-13 00:55:12 +08005743 if (auto r = createNetwork(); !r.ok()) {
5744 return r;
Mike Yu6ce587d2019-12-19 21:30:22 +08005745 }
5746 if (auto r = mDnsResolvSrv->createNetworkCache(mNetId); !r.isOk()) {
5747 return Error() << r.getMessage();
5748 }
5749 if (auto r = mNetdSrv->networkAddInterface(mNetId, mIfname); !r.isOk()) {
5750 return Error() << r.getMessage();
5751 }
5752
5753 if (mConnectivityType == ConnectivityType::V4 || mConnectivityType == ConnectivityType::V4V6) {
5754 const std::string v4Addr = makeIpv4AddrString(1);
5755 if (auto r = mNetdSrv->interfaceAddAddress(mIfname, v4Addr, 32); !r.isOk()) {
5756 return Error() << r.getMessage();
5757 }
5758 if (auto r = mNetdSrv->networkAddRoute(mNetId, mIfname, "0.0.0.0/0", ""); !r.isOk()) {
5759 return Error() << r.getMessage();
5760 }
5761 }
5762 if (mConnectivityType == ConnectivityType::V6 || mConnectivityType == ConnectivityType::V4V6) {
5763 const std::string v6Addr = makeIpv6AddrString(1);
5764 if (auto r = mNetdSrv->interfaceAddAddress(mIfname, v6Addr, 128); !r.isOk()) {
5765 return Error() << r.getMessage();
5766 }
5767 if (auto r = mNetdSrv->networkAddRoute(mNetId, mIfname, "::/0", ""); !r.isOk()) {
5768 return Error() << r.getMessage();
5769 }
5770 }
5771
5772 return {};
5773}
5774
Mike Yu6ce587d2019-12-19 21:30:22 +08005775void ResolverMultinetworkTest::StartDns(test::DNSResponder& dns,
5776 const std::vector<DnsRecord>& records) {
5777 ResolverTest::StartDns(dns, records);
5778
5779 // Bind the DNSResponder's sockets to the network if specified.
5780 if (std::optional<unsigned> netId = dns.getNetwork(); netId.has_value()) {
5781 setNetworkForSocket(netId.value(), dns.getUdpSocket());
5782 setNetworkForSocket(netId.value(), dns.getTcpSocket());
5783 }
5784}
5785
5786Result<ResolverMultinetworkTest::DnsServerPair> ResolverMultinetworkTest::ScopedNetwork::addDns(
5787 ConnectivityType type) {
Luke Huang81568fb2020-07-13 00:55:12 +08005788 const int index = mDnsServerPairs.size();
Mike Yu6ce587d2019-12-19 21:30:22 +08005789 const int prefixLen = (type == ConnectivityType::V4) ? 32 : 128;
5790
5791 const std::function<std::string(unsigned)> makeIpString =
5792 std::bind((type == ConnectivityType::V4) ? &ScopedNetwork::makeIpv4AddrString
5793 : &ScopedNetwork::makeIpv6AddrString,
5794 this, std::placeholders::_1);
5795
5796 std::string src1 = makeIpString(1); // The address from which the resolver will send.
Luke Huang81568fb2020-07-13 00:55:12 +08005797 std::string dst1 = makeIpString(
5798 index + 100 +
5799 (mNetId - TEST_NETID_BASE)); // The address to which the resolver will send.
Mike Yu6ce587d2019-12-19 21:30:22 +08005800 std::string src2 = dst1; // The address translated from src1.
Luke Huang81568fb2020-07-13 00:55:12 +08005801 std::string dst2 = makeIpString(
5802 index + 200 + (mNetId - TEST_NETID_BASE)); // The address translated from dst2.
Mike Yu6ce587d2019-12-19 21:30:22 +08005803
5804 if (!mTunForwarder->addForwardingRule({src1, dst1}, {src2, dst2}) ||
5805 !mTunForwarder->addForwardingRule({dst2, src2}, {dst1, src1})) {
5806 return Errorf("Failed to add the rules ({}, {}, {}, {})", src1, dst1, src2, dst2);
5807 }
5808
5809 if (!mNetdSrv->interfaceAddAddress(mIfname, dst2, prefixLen).isOk()) {
5810 return Errorf("interfaceAddAddress({}, {}, {}) failed", mIfname, dst2, prefixLen);
5811 }
5812
Luke Huang81568fb2020-07-13 00:55:12 +08005813 return mDnsServerPairs.emplace_back(std::make_shared<test::DNSResponder>(mNetId, dst2), dst1);
Mike Yu6ce587d2019-12-19 21:30:22 +08005814}
5815
Luke Huang81568fb2020-07-13 00:55:12 +08005816bool ResolverMultinetworkTest::ScopedNetwork::setDnsConfiguration() const {
5817 if (mDnsResolvSrv == nullptr) return false;
5818 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
5819 parcel.tlsServers.clear();
5820 parcel.netId = mNetId;
5821 parcel.servers.clear();
5822 for (const auto& pair : mDnsServerPairs) {
5823 parcel.servers.push_back(pair.dnsAddr);
5824 }
5825 return mDnsResolvSrv->setResolverConfiguration(parcel).isOk();
5826}
5827
5828bool ResolverMultinetworkTest::ScopedNetwork::clearDnsConfiguration() const {
5829 if (mDnsResolvSrv == nullptr) return false;
5830 return mDnsResolvSrv->destroyNetworkCache(mNetId).isOk() &&
5831 mDnsResolvSrv->createNetworkCache(mNetId).isOk();
5832}
5833
5834namespace {
5835
5836// Convenient wrapper for making getaddrinfo call like framework.
5837Result<ScopedAddrinfo> android_getaddrinfofornet_wrapper(const char* name, int netId) {
5838 // Use the same parameter as libcore/ojluni/src/main/java/java/net/Inet6AddressImpl.java.
5839 static const addrinfo hints = {
5840 .ai_flags = AI_ADDRCONFIG,
5841 .ai_family = AF_UNSPEC,
5842 .ai_socktype = SOCK_STREAM,
5843 };
5844 addrinfo* result = nullptr;
5845 if (int r = android_getaddrinfofornet(name, nullptr, &hints, netId, MARK_UNSET, &result)) {
5846 return Error() << r;
5847 }
5848 return ScopedAddrinfo(result);
5849}
5850
5851void expectDnsWorksForUid(const char* name, unsigned netId, uid_t uid,
5852 const std::vector<std::string>& expectedResult) {
5853 ScopedChangeUID scopedChangeUID(uid);
5854 auto result = android_getaddrinfofornet_wrapper(name, netId);
5855 ASSERT_RESULT_OK(result);
5856 ScopedAddrinfo ai_result(std::move(result.value()));
5857 std::vector<std::string> result_strs = ToStrings(ai_result);
5858 EXPECT_THAT(result_strs, testing::UnorderedElementsAreArray(expectedResult));
5859}
5860
5861} // namespace
5862
Mike Yu6ce587d2019-12-19 21:30:22 +08005863TEST_F(ResolverMultinetworkTest, GetAddrInfo_AI_ADDRCONFIG) {
5864 constexpr char host_name[] = "ohayou.example.com.";
5865
5866 const std::array<ConnectivityType, 3> allTypes = {
5867 ConnectivityType::V4,
5868 ConnectivityType::V6,
5869 ConnectivityType::V4V6,
5870 };
5871 for (const auto& type : allTypes) {
5872 SCOPED_TRACE(StringPrintf("ConnectivityType: %d", type));
5873
5874 // Create a network.
Luke Huang81568fb2020-07-13 00:55:12 +08005875 ScopedPhysicalNetwork network = CreateScopedPhysicalNetwork(type);
Mike Yu6ce587d2019-12-19 21:30:22 +08005876 ASSERT_RESULT_OK(network.init());
5877
5878 // Add a testing DNS server.
5879 const Result<DnsServerPair> dnsPair =
5880 (type == ConnectivityType::V4) ? network.addIpv4Dns() : network.addIpv6Dns();
5881 ASSERT_RESULT_OK(dnsPair);
Luke Huang81568fb2020-07-13 00:55:12 +08005882 StartDns(*dnsPair->dnsServer, {{host_name, ns_type::ns_t_a, "192.0.2.0"},
5883 {host_name, ns_type::ns_t_aaaa, "2001:db8:cafe:d00d::31"}});
Mike Yu6ce587d2019-12-19 21:30:22 +08005884
5885 // Set up resolver and start forwarding.
Luke Huang81568fb2020-07-13 00:55:12 +08005886 ASSERT_TRUE(network.setDnsConfiguration());
Mike Yu6ce587d2019-12-19 21:30:22 +08005887 ASSERT_TRUE(network.startTunForwarder());
5888
Luke Huang81568fb2020-07-13 00:55:12 +08005889 auto result = android_getaddrinfofornet_wrapper(host_name, network.netId());
5890 ASSERT_RESULT_OK(result);
5891 ScopedAddrinfo ai_result(std::move(result.value()));
Mike Yu6ce587d2019-12-19 21:30:22 +08005892 std::vector<std::string> result_strs = ToStrings(ai_result);
5893 std::vector<std::string> expectedResult;
5894 size_t expectedQueries = 0;
5895
5896 if (type == ConnectivityType::V6 || type == ConnectivityType::V4V6) {
5897 expectedResult.emplace_back("2001:db8:cafe:d00d::31");
5898 expectedQueries++;
5899 }
5900 if (type == ConnectivityType::V4 || type == ConnectivityType::V4V6) {
Luke Huang81568fb2020-07-13 00:55:12 +08005901 expectedResult.emplace_back("192.0.2.0");
Mike Yu6ce587d2019-12-19 21:30:22 +08005902 expectedQueries++;
5903 }
5904 EXPECT_THAT(result_strs, testing::UnorderedElementsAreArray(expectedResult));
Luke Huang81568fb2020-07-13 00:55:12 +08005905 EXPECT_EQ(GetNumQueries(*dnsPair->dnsServer, host_name), expectedQueries);
Mike Yu6ce587d2019-12-19 21:30:22 +08005906 }
5907}
5908
5909TEST_F(ResolverMultinetworkTest, NetworkDestroyedDuringQueryInFlight) {
5910 constexpr char host_name[] = "ohayou.example.com.";
5911
5912 // Create a network and add an ipv4 DNS server.
Luke Huang81568fb2020-07-13 00:55:12 +08005913 auto network = std::make_unique<ScopedPhysicalNetwork>(getFreeNetId(), ConnectivityType::V4V6,
5914 mDnsClient.netdService(),
5915 mDnsClient.resolvService());
Mike Yu6ce587d2019-12-19 21:30:22 +08005916 ASSERT_RESULT_OK(network->init());
5917 const Result<DnsServerPair> dnsPair = network->addIpv4Dns();
5918 ASSERT_RESULT_OK(dnsPair);
5919
5920 // Set the DNS server unresponsive.
Luke Huang81568fb2020-07-13 00:55:12 +08005921 dnsPair->dnsServer->setResponseProbability(0.0);
5922 dnsPair->dnsServer->setErrorRcode(static_cast<ns_rcode>(-1));
5923 StartDns(*dnsPair->dnsServer, {});
Mike Yu6ce587d2019-12-19 21:30:22 +08005924
5925 // Set up resolver and start forwarding.
Luke Huang81568fb2020-07-13 00:55:12 +08005926 ASSERT_TRUE(network->setDnsConfiguration());
Mike Yu6ce587d2019-12-19 21:30:22 +08005927 ASSERT_TRUE(network->startTunForwarder());
5928
5929 // Expect the things happening in order:
5930 // 1. The thread sends the query to the dns server which is unresponsive.
5931 // 2. The network is destroyed while the thread is waiting for the response from the dns server.
5932 // 3. After the dns server timeout, the thread retries but fails to connect.
5933 std::thread lookup([&]() {
5934 int fd = resNetworkQuery(network->netId(), host_name, ns_c_in, ns_t_a, 0);
5935 EXPECT_TRUE(fd != -1);
5936 expectAnswersNotValid(fd, -ETIMEDOUT);
5937 });
5938
5939 // Tear down the network as soon as the dns server receives the query.
Luke Huang81568fb2020-07-13 00:55:12 +08005940 const auto condition = [&]() { return GetNumQueries(*dnsPair->dnsServer, host_name) == 1U; };
Mike Yu6ce587d2019-12-19 21:30:22 +08005941 EXPECT_TRUE(PollForCondition(condition));
5942 network.reset();
5943
5944 lookup.join();
5945}
5946
5947TEST_F(ResolverMultinetworkTest, OneCachePerNetwork) {
5948 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
5949 constexpr char host_name[] = "ohayou.example.com.";
5950
Luke Huang81568fb2020-07-13 00:55:12 +08005951 ScopedPhysicalNetwork network1 = CreateScopedPhysicalNetwork(ConnectivityType::V4V6);
5952 ScopedPhysicalNetwork network2 = CreateScopedPhysicalNetwork(ConnectivityType::V4V6);
Mike Yu6ce587d2019-12-19 21:30:22 +08005953 ASSERT_RESULT_OK(network1.init());
5954 ASSERT_RESULT_OK(network2.init());
5955
5956 const Result<DnsServerPair> dnsPair1 = network1.addIpv4Dns();
5957 const Result<DnsServerPair> dnsPair2 = network2.addIpv4Dns();
5958 ASSERT_RESULT_OK(dnsPair1);
5959 ASSERT_RESULT_OK(dnsPair2);
Luke Huang81568fb2020-07-13 00:55:12 +08005960 StartDns(*dnsPair1->dnsServer, {{host_name, ns_type::ns_t_a, "192.0.2.0"}});
5961 StartDns(*dnsPair2->dnsServer, {{host_name, ns_type::ns_t_a, "192.0.2.1"}});
Mike Yu6ce587d2019-12-19 21:30:22 +08005962
5963 // Set up resolver for network 1 and start forwarding.
Luke Huang81568fb2020-07-13 00:55:12 +08005964 ASSERT_TRUE(network1.setDnsConfiguration());
Mike Yu6ce587d2019-12-19 21:30:22 +08005965 ASSERT_TRUE(network1.startTunForwarder());
5966
5967 // Set up resolver for network 2 and start forwarding.
Luke Huang81568fb2020-07-13 00:55:12 +08005968 ASSERT_TRUE(network2.setDnsConfiguration());
Mike Yu6ce587d2019-12-19 21:30:22 +08005969 ASSERT_TRUE(network2.startTunForwarder());
5970
5971 // Send the same queries to both networks.
5972 int fd1 = resNetworkQuery(network1.netId(), host_name, ns_c_in, ns_t_a, 0);
5973 int fd2 = resNetworkQuery(network2.netId(), host_name, ns_c_in, ns_t_a, 0);
5974
Luke Huang81568fb2020-07-13 00:55:12 +08005975 expectAnswersValid(fd1, AF_INET, "192.0.2.0");
5976 expectAnswersValid(fd2, AF_INET, "192.0.2.1");
5977 EXPECT_EQ(GetNumQueries(*dnsPair1->dnsServer, host_name), 1U);
5978 EXPECT_EQ(GetNumQueries(*dnsPair2->dnsServer, host_name), 1U);
Mike Yu6ce587d2019-12-19 21:30:22 +08005979
5980 // Flush the cache of network 1, and send the queries again.
5981 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(network1.netId()).isOk());
5982 fd1 = resNetworkQuery(network1.netId(), host_name, ns_c_in, ns_t_a, 0);
5983 fd2 = resNetworkQuery(network2.netId(), host_name, ns_c_in, ns_t_a, 0);
5984
Luke Huang81568fb2020-07-13 00:55:12 +08005985 expectAnswersValid(fd1, AF_INET, "192.0.2.0");
5986 expectAnswersValid(fd2, AF_INET, "192.0.2.1");
5987 EXPECT_EQ(GetNumQueries(*dnsPair1->dnsServer, host_name), 2U);
5988 EXPECT_EQ(GetNumQueries(*dnsPair2->dnsServer, host_name), 1U);
5989}
5990
5991TEST_F(ResolverMultinetworkTest, DnsWithVpn) {
5992 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
5993 SKIP_IF_BPF_NOT_SUPPORTED;
5994 constexpr char host_name[] = "ohayou.example.com.";
5995 constexpr char ipv4_addr[] = "192.0.2.0";
5996 constexpr char ipv6_addr[] = "2001:db8:cafe:d00d::31";
5997
5998 const std::pair<ConnectivityType, std::vector<std::string>> testPairs[] = {
5999 {ConnectivityType::V4, {ipv4_addr}},
6000 {ConnectivityType::V6, {ipv6_addr}},
6001 {ConnectivityType::V4V6, {ipv6_addr, ipv4_addr}},
6002 };
6003 for (const auto& [type, result] : testPairs) {
6004 SCOPED_TRACE(StringPrintf("ConnectivityType: %d", type));
6005
6006 // Create a network.
6007 ScopedPhysicalNetwork underlyingNetwork = CreateScopedPhysicalNetwork(type, "Underlying");
6008 ScopedVirtualNetwork bypassableVpnNetwork =
6009 CreateScopedVirtualNetwork(type, false, "BypassableVpn");
6010 ScopedVirtualNetwork secureVpnNetwork = CreateScopedVirtualNetwork(type, true, "SecureVpn");
6011
6012 ASSERT_RESULT_OK(underlyingNetwork.init());
6013 ASSERT_RESULT_OK(bypassableVpnNetwork.init());
6014 ASSERT_RESULT_OK(secureVpnNetwork.init());
6015 ASSERT_RESULT_OK(bypassableVpnNetwork.addUser(TEST_UID));
6016 ASSERT_RESULT_OK(secureVpnNetwork.addUser(TEST_UID2));
6017
6018 auto setupDnsFn = [&](std::shared_ptr<test::DNSResponder> dnsServer,
6019 ScopedNetwork* nw) -> void {
6020 StartDns(*dnsServer, {{host_name, ns_type::ns_t_a, ipv4_addr},
6021 {host_name, ns_type::ns_t_aaaa, ipv6_addr}});
6022 ASSERT_TRUE(nw->setDnsConfiguration());
6023 ASSERT_TRUE(nw->startTunForwarder());
6024 };
6025 // Add a testing DNS server to networks.
6026 const Result<DnsServerPair> underlyingPair = (type == ConnectivityType::V4)
6027 ? underlyingNetwork.addIpv4Dns()
6028 : underlyingNetwork.addIpv6Dns();
6029 ASSERT_RESULT_OK(underlyingPair);
6030 const Result<DnsServerPair> bypassableVpnPair = (type == ConnectivityType::V4)
6031 ? bypassableVpnNetwork.addIpv4Dns()
6032 : bypassableVpnNetwork.addIpv6Dns();
6033 ASSERT_RESULT_OK(bypassableVpnPair);
6034 const Result<DnsServerPair> secureVpnPair = (type == ConnectivityType::V4)
6035 ? secureVpnNetwork.addIpv4Dns()
6036 : secureVpnNetwork.addIpv6Dns();
6037 ASSERT_RESULT_OK(secureVpnPair);
6038 // Set up resolver and start forwarding for networks.
6039 setupDnsFn(underlyingPair->dnsServer, &underlyingNetwork);
6040 setupDnsFn(bypassableVpnPair->dnsServer, &bypassableVpnNetwork);
6041 setupDnsFn(secureVpnPair->dnsServer, &secureVpnNetwork);
6042
6043 setDefaultNetwork(underlyingNetwork.netId());
6044 const unsigned underlyingNetId = underlyingNetwork.netId();
6045 const unsigned bypassableVpnNetId = bypassableVpnNetwork.netId();
6046 const unsigned secureVpnNetId = secureVpnNetwork.netId();
6047 // We've called setNetworkForProcess in SetupOemNetwork, so reset to default first.
6048 ScopedSetNetworkForProcess scopedSetNetworkForProcess(NETID_UNSET);
6049 auto expectDnsQueryCountsFn = [&](size_t count,
6050 std::shared_ptr<test::DNSResponder> dnsServer,
6051 unsigned expectedDnsNetId) -> void {
6052 EXPECT_EQ(GetNumQueries(*dnsServer, host_name), count);
6053 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(expectedDnsNetId).isOk());
6054 dnsServer->clearQueries();
6055 // Give DnsResolver some time to clear cache to avoid race.
6056 usleep(5 * 1000);
6057 };
6058
6059 // Create a object to represent default network, do not init it.
6060 ScopedPhysicalNetwork defaultNetwork{NETID_UNSET, "Default"};
6061
6062 // Test VPN with DNS server under 4 different network selection scenarios.
6063 // See the test config for the expectation.
6064 const struct TestConfig {
6065 ScopedNetwork* selectedNetwork;
6066 unsigned expectedDnsNetId;
6067 std::shared_ptr<test::DNSResponder> expectedDnsServer;
6068 } vpnWithDnsServerConfigs[]{
6069 // clang-format off
6070 // Queries use the bypassable VPN by default.
6071 {&defaultNetwork, bypassableVpnNetId, bypassableVpnPair->dnsServer},
6072 // Choosing the underlying network works because the VPN is bypassable.
6073 {&underlyingNetwork, underlyingNetId, underlyingPair->dnsServer},
6074 // Selecting the VPN sends the query on the VPN.
6075 {&bypassableVpnNetwork, bypassableVpnNetId, bypassableVpnPair->dnsServer},
6076 // TEST_UID does not have access to the secure VPN.
6077 {&secureVpnNetwork, bypassableVpnNetId, bypassableVpnPair->dnsServer},
6078 // clang-format on
6079 };
6080 for (const auto& config : vpnWithDnsServerConfigs) {
6081 SCOPED_TRACE(fmt::format("Bypassble VPN with DnsServer, selectedNetwork = {}",
6082 config.selectedNetwork->name()));
6083 expectDnsWorksForUid(host_name, config.selectedNetwork->netId(), TEST_UID, result);
6084 expectDnsQueryCountsFn(result.size(), config.expectedDnsServer,
6085 config.expectedDnsNetId);
6086 }
6087
6088 std::vector<ScopedNetwork*> nwVec{&defaultNetwork, &underlyingNetwork,
6089 &bypassableVpnNetwork, &secureVpnNetwork};
6090 // Test the VPN without DNS server with the same combination as before.
6091 ASSERT_TRUE(bypassableVpnNetwork.clearDnsConfiguration());
6092 // Test bypassable VPN, TEST_UID
6093 for (const auto* selectedNetwork : nwVec) {
6094 SCOPED_TRACE(fmt::format("Bypassble VPN without DnsServer, selectedNetwork = {}",
6095 selectedNetwork->name()));
6096 expectDnsWorksForUid(host_name, selectedNetwork->netId(), TEST_UID, result);
6097 expectDnsQueryCountsFn(result.size(), underlyingPair->dnsServer, underlyingNetId);
6098 }
6099
6100 // The same test scenario as before plus enableVpnIsolation for secure VPN, TEST_UID2.
6101 for (bool enableVpnIsolation : {false, true}) {
6102 SCOPED_TRACE(fmt::format("enableVpnIsolation = {}", enableVpnIsolation));
6103 if (enableVpnIsolation) {
6104 EXPECT_RESULT_OK(secureVpnNetwork.enableVpnIsolation(TEST_UID2));
6105 }
6106
6107 // Test secure VPN without DNS server.
6108 ASSERT_TRUE(secureVpnNetwork.clearDnsConfiguration());
6109 for (const auto* selectedNetwork : nwVec) {
6110 SCOPED_TRACE(fmt::format("Secure VPN without DnsServer, selectedNetwork = {}",
6111 selectedNetwork->name()));
6112 expectDnsWorksForUid(host_name, selectedNetwork->netId(), TEST_UID2, result);
6113 expectDnsQueryCountsFn(result.size(), underlyingPair->dnsServer, underlyingNetId);
6114 }
6115
6116 // Test secure VPN with DNS server.
6117 ASSERT_TRUE(secureVpnNetwork.setDnsConfiguration());
6118 for (const auto* selectedNetwork : nwVec) {
6119 SCOPED_TRACE(fmt::format("Secure VPN with DnsServer, selectedNetwork = {}",
6120 selectedNetwork->name()));
6121 expectDnsWorksForUid(host_name, selectedNetwork->netId(), TEST_UID2, result);
6122 expectDnsQueryCountsFn(result.size(), secureVpnPair->dnsServer, secureVpnNetId);
6123 }
6124
6125 if (enableVpnIsolation) {
6126 EXPECT_RESULT_OK(secureVpnNetwork.disableVpnIsolation(TEST_UID2));
6127 }
6128 }
6129 }
Mike Yu6ce587d2019-12-19 21:30:22 +08006130}