blob: 67f59a643514ce1882b8860cd4ab29d860dc4360 [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");
187 ndk::SpAIBinder resolvBinder = ndk::SpAIBinder(binder);
188 auto resolvService = aidl::android::net::IDnsResolver::fromBinder(resolvBinder);
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 Chenb9fa2062018-11-13 21:51:13 +0800374};
375
Hungming Chen5bf09772019-04-25 11:16:13 +0800376// Initialize static member of class.
Luke Huangf8215372019-11-22 11:53:41 +0800377std::shared_ptr<DnsMetricsListener> ResolverTest::sDnsMetricsListener;
378AIBinder_DeathRecipient* ResolverTest::sResolvDeathRecipient;
Hungming Chen5bf09772019-04-25 11:16:13 +0800379
Ken Chenb9fa2062018-11-13 21:51:13 +0800380TEST_F(ResolverTest, GetHostByName) {
Xiao Ma09b71022018-12-11 17:56:32 +0900381 constexpr char nonexistent_host_name[] = "nonexistent.example.com.";
382
383 test::DNSResponder dns;
384 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.3"}});
385 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800386
387 const hostent* result;
Ken Chenb9fa2062018-11-13 21:51:13 +0800388 result = gethostbyname("nonexistent");
389 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, nonexistent_host_name));
390 ASSERT_TRUE(result == nullptr);
391 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
392
393 dns.clearQueries();
394 result = gethostbyname("hello");
Xiao Ma09b71022018-12-11 17:56:32 +0900395 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
Ken Chenb9fa2062018-11-13 21:51:13 +0800396 ASSERT_FALSE(result == nullptr);
397 ASSERT_EQ(4, result->h_length);
398 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
399 EXPECT_EQ("1.2.3.3", ToString(result));
400 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800401}
402
lifr4e4a2e02019-01-29 16:53:51 +0800403TEST_F(ResolverTest, GetHostByName_cnames) {
404 constexpr char host_name[] = "host.example.com.";
405 size_t cnamecount = 0;
406 test::DNSResponder dns;
407
408 const std::vector<DnsRecord> records = {
409 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
410 {"a.example.com.", ns_type::ns_t_cname, "b.example.com."},
411 {"b.example.com.", ns_type::ns_t_cname, "c.example.com."},
412 {"c.example.com.", ns_type::ns_t_cname, "d.example.com."},
413 {"d.example.com.", ns_type::ns_t_cname, "e.example.com."},
414 {"e.example.com.", ns_type::ns_t_cname, host_name},
415 {host_name, ns_type::ns_t_a, "1.2.3.3"},
416 {host_name, ns_type::ns_t_aaaa, "2001:db8::42"},
417 };
418 StartDns(dns, records);
419 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
420
421 // using gethostbyname2() to resolve ipv4 hello.example.com. to 1.2.3.3
422 // Ensure the v4 address and cnames are correct
423 const hostent* result;
424 result = gethostbyname2("hello", AF_INET);
425 ASSERT_FALSE(result == nullptr);
426
427 for (int i = 0; result != nullptr && result->h_aliases[i] != nullptr; i++) {
428 std::string domain_name = records[i].host_name.substr(0, records[i].host_name.size() - 1);
429 EXPECT_EQ(result->h_aliases[i], domain_name);
430 cnamecount++;
431 }
432 // The size of "Non-cname type" record in DNS records is 2
433 ASSERT_EQ(cnamecount, records.size() - 2);
434 ASSERT_EQ(4, result->h_length);
435 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
436 EXPECT_EQ("1.2.3.3", ToString(result));
437 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
438 EXPECT_EQ(1U, dns.queries().size()) << dns.dumpQueries();
439
440 // using gethostbyname2() to resolve ipv6 hello.example.com. to 2001:db8::42
441 // Ensure the v6 address and cnames are correct
442 cnamecount = 0;
443 dns.clearQueries();
444 result = gethostbyname2("hello", AF_INET6);
445 for (unsigned i = 0; result != nullptr && result->h_aliases[i] != nullptr; i++) {
446 std::string domain_name = records[i].host_name.substr(0, records[i].host_name.size() - 1);
447 EXPECT_EQ(result->h_aliases[i], domain_name);
448 cnamecount++;
449 }
450 // The size of "Non-cname type" DNS record in records is 2
451 ASSERT_EQ(cnamecount, records.size() - 2);
452 ASSERT_FALSE(result == nullptr);
453 ASSERT_EQ(16, result->h_length);
454 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
455 EXPECT_EQ("2001:db8::42", ToString(result));
456 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
457}
458
459TEST_F(ResolverTest, GetHostByName_cnamesInfiniteLoop) {
460 test::DNSResponder dns;
461 const std::vector<DnsRecord> records = {
462 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
463 {"a.example.com.", ns_type::ns_t_cname, kHelloExampleCom},
464 };
465 StartDns(dns, records);
466 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
467
468 const hostent* result;
469 result = gethostbyname2("hello", AF_INET);
470 ASSERT_TRUE(result == nullptr);
471
472 dns.clearQueries();
473 result = gethostbyname2("hello", AF_INET6);
474 ASSERT_TRUE(result == nullptr);
475}
476
Ken Chenb9fa2062018-11-13 21:51:13 +0800477TEST_F(ResolverTest, GetHostByName_localhost) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800478 constexpr char name_camelcase[] = "LocalHost";
Ken Chenb9fa2062018-11-13 21:51:13 +0800479 constexpr char name_ip6_dot[] = "ip6-localhost.";
480 constexpr char name_ip6_fqdn[] = "ip6-localhost.example.com.";
481
markchien96b09e22020-07-29 14:24:34 +0800482 // Add a no-op nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900483 test::DNSResponder dns;
484 StartDns(dns, {});
485 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800486
487 // Expect no DNS queries; localhost is resolved via /etc/hosts
Xiao Ma09b71022018-12-11 17:56:32 +0900488 const hostent* result = gethostbyname(kLocalHost);
Ken Chenb9fa2062018-11-13 21:51:13 +0800489 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
490 ASSERT_FALSE(result == nullptr);
491 ASSERT_EQ(4, result->h_length);
492 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900493 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800494 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
495
496 // Ensure the hosts file resolver ignores case of hostnames
497 result = gethostbyname(name_camelcase);
498 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
499 ASSERT_FALSE(result == nullptr);
500 ASSERT_EQ(4, result->h_length);
501 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900502 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800503 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
504
505 // The hosts file also contains ip6-localhost, but gethostbyname() won't
chenbruce018fdb22019-06-12 18:08:04 +0800506 // return it. This would be easy to
Ken Chenb9fa2062018-11-13 21:51:13 +0800507 // change, but there's no point in changing the legacy behavior; new code
508 // should be calling getaddrinfo() anyway.
509 // So we check the legacy behavior, which results in amusing A-record
510 // lookups for ip6-localhost, with and without search domains appended.
511 dns.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900512 result = gethostbyname(kIp6LocalHost);
Sehee Parkbbca0202018-11-16 10:53:16 +0900513 EXPECT_EQ(2U, dns.queries().size()) << dns.dumpQueries();
514 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, name_ip6_dot)) << dns.dumpQueries();
515 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, name_ip6_fqdn)) << dns.dumpQueries();
Ken Chenb9fa2062018-11-13 21:51:13 +0800516 ASSERT_TRUE(result == nullptr);
517
518 // Finally, use gethostbyname2() to resolve ip6-localhost to ::1 from
519 // the hosts file.
520 dns.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900521 result = gethostbyname2(kIp6LocalHost, AF_INET6);
Ken Chenb9fa2062018-11-13 21:51:13 +0800522 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
523 ASSERT_FALSE(result == nullptr);
524 ASSERT_EQ(16, result->h_length);
525 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900526 EXPECT_EQ(kIp6LocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800527 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800528}
529
530TEST_F(ResolverTest, GetHostByName_numeric) {
markchien96b09e22020-07-29 14:24:34 +0800531 // Add a no-op nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900532 test::DNSResponder dns;
533 StartDns(dns, {});
534 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800535
536 // Numeric v4 address: expect no DNS queries
537 constexpr char numeric_v4[] = "192.168.0.1";
Ken Chenb9fa2062018-11-13 21:51:13 +0800538 const hostent* result = gethostbyname(numeric_v4);
Sehee Parkbbca0202018-11-16 10:53:16 +0900539 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800540 ASSERT_FALSE(result == nullptr);
541 ASSERT_EQ(4, result->h_length); // v4
542 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
543 EXPECT_EQ(numeric_v4, ToString(result));
544 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
545
546 // gethostbyname() recognizes a v6 address, and fails with no DNS queries
547 constexpr char numeric_v6[] = "2001:db8::42";
548 dns.clearQueries();
549 result = gethostbyname(numeric_v6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900550 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800551 EXPECT_TRUE(result == nullptr);
552
553 // Numeric v6 address with gethostbyname2(): succeeds with no DNS queries
554 dns.clearQueries();
555 result = gethostbyname2(numeric_v6, AF_INET6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900556 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800557 ASSERT_FALSE(result == nullptr);
558 ASSERT_EQ(16, result->h_length); // v6
559 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
560 EXPECT_EQ(numeric_v6, ToString(result));
561 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
562
563 // Numeric v6 address with scope work with getaddrinfo(),
564 // but gethostbyname2() does not understand them; it issues two dns
565 // queries, then fails. This hardly ever happens, there's no point
566 // in fixing this. This test simply verifies the current (bogus)
567 // behavior to avoid further regressions (like crashes, or leaks).
568 constexpr char numeric_v6_scope[] = "fe80::1%lo";
569 dns.clearQueries();
570 result = gethostbyname2(numeric_v6_scope, AF_INET6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900571 EXPECT_EQ(2U, dns.queries().size()); // OUCH!
Ken Chenb9fa2062018-11-13 21:51:13 +0800572 ASSERT_TRUE(result == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800573}
574
575TEST_F(ResolverTest, BinderSerialization) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800576 std::vector<int> params_offsets = {
Luke Huang5bd827c2019-03-14 16:10:04 +0800577 IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY,
578 IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD,
579 IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES,
580 IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES,
581 IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC,
582 IDnsResolver::RESOLVER_PARAMS_RETRY_COUNT,
Ken Chenb9fa2062018-11-13 21:51:13 +0800583 };
Bernie Innocentib102dd22018-12-04 14:57:48 +0900584 const int size = static_cast<int>(params_offsets.size());
Luke Huang5bd827c2019-03-14 16:10:04 +0800585 EXPECT_EQ(size, IDnsResolver::RESOLVER_PARAMS_COUNT);
Ken Chenb9fa2062018-11-13 21:51:13 +0800586 std::sort(params_offsets.begin(), params_offsets.end());
Bernie Innocentib102dd22018-12-04 14:57:48 +0900587 for (int i = 0; i < size; ++i) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800588 EXPECT_EQ(params_offsets[i], i);
589 }
590}
591
592TEST_F(ResolverTest, GetHostByName_Binder) {
Luke Huangf8215372019-11-22 11:53:41 +0800593 std::vector<std::string> domains = {"example.com"};
Ken Chenb9fa2062018-11-13 21:51:13 +0800594 std::vector<std::unique_ptr<test::DNSResponder>> dns;
595 std::vector<std::string> servers;
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900596 std::vector<DnsResponderClient::Mapping> mappings;
597 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupMappings(1, domains, &mappings));
598 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupDNSServers(4, mappings, &dns, &servers));
Ken Chenb9fa2062018-11-13 21:51:13 +0800599 ASSERT_EQ(1U, mappings.size());
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900600 const DnsResponderClient::Mapping& mapping = mappings[0];
Ken Chenb9fa2062018-11-13 21:51:13 +0800601
Xiao Ma09b71022018-12-11 17:56:32 +0900602 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains, kDefaultParams));
Ken Chenb9fa2062018-11-13 21:51:13 +0800603
604 const hostent* result = gethostbyname(mapping.host.c_str());
Bernie Innocentib102dd22018-12-04 14:57:48 +0900605 const size_t total_queries =
Luke Huangfde82482019-06-04 01:04:53 +0800606 std::accumulate(dns.begin(), dns.end(), 0, [&mapping](size_t total, auto& d) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800607 return total + GetNumQueriesForType(*d, ns_type::ns_t_a, mapping.entry.c_str());
608 });
609
610 EXPECT_LE(1U, total_queries);
611 ASSERT_FALSE(result == nullptr);
612 ASSERT_EQ(4, result->h_length);
613 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
614 EXPECT_EQ(mapping.ip4, ToString(result));
615 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
616
617 std::vector<std::string> res_servers;
618 std::vector<std::string> res_domains;
Mike Yu0a1c53d2018-11-26 13:26:21 +0900619 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +0900620 res_params res_params;
Ken Chenb9fa2062018-11-13 21:51:13 +0800621 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +0800622 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +0800623 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
624 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
625 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chenb9fa2062018-11-13 21:51:13 +0800626 EXPECT_EQ(servers.size(), res_servers.size());
627 EXPECT_EQ(domains.size(), res_domains.size());
Mike Yu0a1c53d2018-11-26 13:26:21 +0900628 EXPECT_EQ(0U, res_tls_servers.size());
Luke Huang5bd827c2019-03-14 16:10:04 +0800629 ASSERT_EQ(static_cast<size_t>(IDnsResolver::RESOLVER_PARAMS_COUNT), kDefaultParams.size());
630 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY],
631 res_params.sample_validity);
632 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900633 res_params.success_threshold);
Luke Huang5bd827c2019-03-14 16:10:04 +0800634 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
635 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
636 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
Ken Chenb9fa2062018-11-13 21:51:13 +0800637 res_params.base_timeout_msec);
638 EXPECT_EQ(servers.size(), res_stats.size());
639
Bernie Innocenti0c067e42019-04-01 15:33:16 +0900640 EXPECT_THAT(res_servers, testing::UnorderedElementsAreArray(servers));
641 EXPECT_THAT(res_domains, testing::UnorderedElementsAreArray(domains));
Ken Chenb9fa2062018-11-13 21:51:13 +0800642}
643
644TEST_F(ResolverTest, GetAddrInfo) {
Xiao Ma09b71022018-12-11 17:56:32 +0900645 constexpr char listen_addr[] = "127.0.0.4";
646 constexpr char listen_addr2[] = "127.0.0.5";
647 constexpr char host_name[] = "howdy.example.com.";
Ken Chenb9fa2062018-11-13 21:51:13 +0800648
Xiao Ma09b71022018-12-11 17:56:32 +0900649 const std::vector<DnsRecord> records = {
650 {host_name, ns_type::ns_t_a, "1.2.3.4"},
651 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
652 };
653 test::DNSResponder dns(listen_addr);
654 test::DNSResponder dns2(listen_addr2);
655 StartDns(dns, records);
656 StartDns(dns2, records);
Ken Chenb9fa2062018-11-13 21:51:13 +0800657
Xiao Ma09b71022018-12-11 17:56:32 +0900658 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}));
Ken Chenb9fa2062018-11-13 21:51:13 +0800659 dns.clearQueries();
660 dns2.clearQueries();
661
662 ScopedAddrinfo result = safe_getaddrinfo("howdy", nullptr, nullptr);
663 EXPECT_TRUE(result != nullptr);
664 size_t found = GetNumQueries(dns, host_name);
665 EXPECT_LE(1U, found);
666 // Could be A or AAAA
667 std::string result_str = ToString(result);
668 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +0800669 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +0800670
671 // Verify that the name is cached.
672 size_t old_found = found;
673 result = safe_getaddrinfo("howdy", nullptr, nullptr);
674 EXPECT_TRUE(result != nullptr);
675 found = GetNumQueries(dns, host_name);
676 EXPECT_LE(1U, found);
677 EXPECT_EQ(old_found, found);
678 result_str = ToString(result);
Luke Huangf8215372019-11-22 11:53:41 +0800679 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4") << result_str;
Ken Chenb9fa2062018-11-13 21:51:13 +0800680
681 // Change the DNS resolver, ensure that queries are still cached.
Xiao Ma09b71022018-12-11 17:56:32 +0900682 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr2}));
Ken Chenb9fa2062018-11-13 21:51:13 +0800683 dns.clearQueries();
684 dns2.clearQueries();
685
686 result = safe_getaddrinfo("howdy", nullptr, nullptr);
687 EXPECT_TRUE(result != nullptr);
688 found = GetNumQueries(dns, host_name);
689 size_t found2 = GetNumQueries(dns2, host_name);
690 EXPECT_EQ(0U, found);
691 EXPECT_LE(0U, found2);
692
693 // Could be A or AAAA
694 result_str = ToString(result);
695 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +0800696 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +0800697}
698
699TEST_F(ResolverTest, GetAddrInfoV4) {
Xiao Ma09b71022018-12-11 17:56:32 +0900700 test::DNSResponder dns;
701 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.5"}});
702 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800703
Xiao Ma09b71022018-12-11 17:56:32 +0900704 const addrinfo hints = {.ai_family = AF_INET};
705 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
Ken Chenb9fa2062018-11-13 21:51:13 +0800706 EXPECT_TRUE(result != nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900707 EXPECT_EQ(1U, GetNumQueries(dns, kHelloExampleCom));
Ken Chenb9fa2062018-11-13 21:51:13 +0800708 EXPECT_EQ("1.2.3.5", ToString(result));
709}
710
711TEST_F(ResolverTest, GetAddrInfo_localhost) {
markchien96b09e22020-07-29 14:24:34 +0800712 // Add a no-op nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900713 test::DNSResponder dns;
714 StartDns(dns, {});
715 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800716
Xiao Ma09b71022018-12-11 17:56:32 +0900717 ScopedAddrinfo result = safe_getaddrinfo(kLocalHost, nullptr, nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800718 EXPECT_TRUE(result != nullptr);
719 // Expect no DNS queries; localhost is resolved via /etc/hosts
720 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900721 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800722
Xiao Ma09b71022018-12-11 17:56:32 +0900723 result = safe_getaddrinfo(kIp6LocalHost, nullptr, nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800724 EXPECT_TRUE(result != nullptr);
725 // Expect no DNS queries; ip6-localhost is resolved via /etc/hosts
726 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900727 EXPECT_EQ(kIp6LocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800728}
729
Luke Huangd8ac4752019-06-18 17:05:47 +0800730TEST_F(ResolverTest, GetAddrInfo_InvalidSocketType) {
731 test::DNSResponder dns;
732 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.5"}});
733 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
734
735 // TODO: Test other invalid socket types.
736 const addrinfo hints = {
737 .ai_family = AF_UNSPEC,
Luke Huangd8ac4752019-06-18 17:05:47 +0800738 .ai_socktype = SOCK_PACKET,
739 };
740 addrinfo* result = nullptr;
741 // This is a valid hint, but the query won't be sent because the socket type is
742 // not supported.
743 EXPECT_EQ(EAI_NODATA, getaddrinfo("hello", nullptr, &hints, &result));
744 ScopedAddrinfo result_cleanup(result);
745 EXPECT_EQ(nullptr, result);
746}
747
Ken Chen92bed612018-12-22 21:46:55 +0800748// Verify if the resolver correctly handle multiple queries simultaneously
749// step 1: set dns server#1 into deferred responding mode.
750// step 2: thread#1 query "hello.example.com." --> resolver send query to server#1.
751// step 3: thread#2 query "hello.example.com." --> resolver hold the request and wait for
752// response of previous pending query sent by thread#1.
753// step 4: thread#3 query "konbanha.example.com." --> resolver send query to server#3. Server
754// respond to resolver immediately.
755// step 5: check if server#1 get 1 query by thread#1, server#2 get 0 query, server#3 get 1 query.
756// step 6: resume dns server#1 to respond dns query in step#2.
757// step 7: thread#1 and #2 should get returned from DNS query after step#6. Also, check the
758// number of queries in server#2 is 0 to ensure thread#2 does not wake up unexpectedly
759// before signaled by thread#1.
760TEST_F(ResolverTest, GetAddrInfoV4_deferred_resp) {
761 const char* listen_addr1 = "127.0.0.9";
762 const char* listen_addr2 = "127.0.0.10";
763 const char* listen_addr3 = "127.0.0.11";
764 const char* listen_srv = "53";
765 const char* host_name_deferred = "hello.example.com.";
766 const char* host_name_normal = "konbanha.example.com.";
Mike Yufc125e42019-05-15 20:41:28 +0800767 test::DNSResponder dns1(listen_addr1, listen_srv, ns_rcode::ns_r_servfail);
768 test::DNSResponder dns2(listen_addr2, listen_srv, ns_rcode::ns_r_servfail);
769 test::DNSResponder dns3(listen_addr3, listen_srv, ns_rcode::ns_r_servfail);
Ken Chen92bed612018-12-22 21:46:55 +0800770 dns1.addMapping(host_name_deferred, ns_type::ns_t_a, "1.2.3.4");
771 dns2.addMapping(host_name_deferred, ns_type::ns_t_a, "1.2.3.4");
772 dns3.addMapping(host_name_normal, ns_type::ns_t_a, "1.2.3.5");
773 ASSERT_TRUE(dns1.startServer());
774 ASSERT_TRUE(dns2.startServer());
775 ASSERT_TRUE(dns3.startServer());
776 const std::vector<std::string> servers_for_t1 = {listen_addr1};
777 const std::vector<std::string> servers_for_t2 = {listen_addr2};
778 const std::vector<std::string> servers_for_t3 = {listen_addr3};
779 addrinfo hints = {.ai_family = AF_INET};
780 const std::vector<int> params = {300, 25, 8, 8, 5000};
781 bool t3_task_done = false;
782
783 dns1.setDeferredResp(true);
784 std::thread t1([&, this]() {
785 ASSERT_TRUE(
786 mDnsClient.SetResolversForNetwork(servers_for_t1, kDefaultSearchDomains, params));
787 ScopedAddrinfo result = safe_getaddrinfo(host_name_deferred, nullptr, &hints);
788 // t3's dns query should got returned first
789 EXPECT_TRUE(t3_task_done);
790 EXPECT_EQ(1U, GetNumQueries(dns1, host_name_deferred));
791 EXPECT_TRUE(result != nullptr);
792 EXPECT_EQ("1.2.3.4", ToString(result));
793 });
794
795 // ensuring t1 and t2 handler functions are processed in order
796 usleep(100 * 1000);
797 std::thread t2([&, this]() {
798 ASSERT_TRUE(
799 mDnsClient.SetResolversForNetwork(servers_for_t2, kDefaultSearchDomains, params));
800 ScopedAddrinfo result = safe_getaddrinfo(host_name_deferred, nullptr, &hints);
801 EXPECT_TRUE(t3_task_done);
802 EXPECT_EQ(0U, GetNumQueries(dns2, host_name_deferred));
803 EXPECT_TRUE(result != nullptr);
804 EXPECT_EQ("1.2.3.4", ToString(result));
805
806 std::vector<std::string> res_servers;
807 std::vector<std::string> res_domains;
808 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +0900809 res_params res_params;
Ken Chen92bed612018-12-22 21:46:55 +0800810 std::vector<ResolverStats> res_stats;
811 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +0800812 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
813 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains,
814 &res_tls_servers, &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chen92bed612018-12-22 21:46:55 +0800815 EXPECT_EQ(0, wait_for_pending_req_timeout_count);
816 });
817
818 // ensuring t2 and t3 handler functions are processed in order
819 usleep(100 * 1000);
820 std::thread t3([&, this]() {
821 ASSERT_TRUE(
822 mDnsClient.SetResolversForNetwork(servers_for_t3, kDefaultSearchDomains, params));
823 ScopedAddrinfo result = safe_getaddrinfo(host_name_normal, nullptr, &hints);
824 EXPECT_EQ(1U, GetNumQueries(dns1, host_name_deferred));
825 EXPECT_EQ(0U, GetNumQueries(dns2, host_name_deferred));
826 EXPECT_EQ(1U, GetNumQueries(dns3, host_name_normal));
827 EXPECT_TRUE(result != nullptr);
828 EXPECT_EQ("1.2.3.5", ToString(result));
829
830 t3_task_done = true;
831 dns1.setDeferredResp(false);
832 });
833 t3.join();
834 t1.join();
835 t2.join();
836}
837
lifr4e4a2e02019-01-29 16:53:51 +0800838TEST_F(ResolverTest, GetAddrInfo_cnames) {
839 constexpr char host_name[] = "host.example.com.";
840 test::DNSResponder dns;
841 const std::vector<DnsRecord> records = {
842 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
843 {"a.example.com.", ns_type::ns_t_cname, "b.example.com."},
844 {"b.example.com.", ns_type::ns_t_cname, "c.example.com."},
845 {"c.example.com.", ns_type::ns_t_cname, "d.example.com."},
846 {"d.example.com.", ns_type::ns_t_cname, "e.example.com."},
847 {"e.example.com.", ns_type::ns_t_cname, host_name},
848 {host_name, ns_type::ns_t_a, "1.2.3.3"},
849 {host_name, ns_type::ns_t_aaaa, "2001:db8::42"},
850 };
851 StartDns(dns, records);
852 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
853
854 addrinfo hints = {.ai_family = AF_INET};
855 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
856 EXPECT_TRUE(result != nullptr);
857 EXPECT_EQ("1.2.3.3", ToString(result));
858
859 dns.clearQueries();
860 hints = {.ai_family = AF_INET6};
861 result = safe_getaddrinfo("hello", nullptr, &hints);
862 EXPECT_TRUE(result != nullptr);
863 EXPECT_EQ("2001:db8::42", ToString(result));
864}
865
866TEST_F(ResolverTest, GetAddrInfo_cnamesNoIpAddress) {
867 test::DNSResponder dns;
868 const std::vector<DnsRecord> records = {
869 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
870 };
871 StartDns(dns, records);
872 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
873
874 addrinfo hints = {.ai_family = AF_INET};
875 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
876 EXPECT_TRUE(result == nullptr);
877
878 dns.clearQueries();
879 hints = {.ai_family = AF_INET6};
880 result = safe_getaddrinfo("hello", nullptr, &hints);
881 EXPECT_TRUE(result == nullptr);
882}
883
884TEST_F(ResolverTest, GetAddrInfo_cnamesIllegalRdata) {
885 test::DNSResponder dns;
886 const std::vector<DnsRecord> records = {
887 {kHelloExampleCom, ns_type::ns_t_cname, ".!#?"},
888 };
889 StartDns(dns, records);
890 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
891
892 addrinfo hints = {.ai_family = AF_INET};
893 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
894 EXPECT_TRUE(result == nullptr);
895
896 dns.clearQueries();
897 hints = {.ai_family = AF_INET6};
898 result = safe_getaddrinfo("hello", nullptr, &hints);
899 EXPECT_TRUE(result == nullptr);
900}
901
Pabba Prakash66707822020-01-08 15:34:58 +0530902TEST_F(ResolverTest, GetAddrInfoForCaseInSensitiveDomains) {
903 test::DNSResponder dns;
904 const char* host_name = "howdy.example.com.";
905 const char* host_name2 = "HOWDY.example.com.";
906 const std::vector<DnsRecord> records = {
907 {host_name, ns_type::ns_t_a, "1.2.3.4"},
908 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
909 {host_name2, ns_type::ns_t_a, "1.2.3.5"},
910 {host_name2, ns_type::ns_t_aaaa, "::1.2.3.5"},
911 };
912 StartDns(dns, records);
913 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
914
915 ScopedAddrinfo hostname_result = safe_getaddrinfo("howdy", nullptr, nullptr);
916 EXPECT_TRUE(hostname_result != nullptr);
917 const size_t hostname1_count_after_first_query = GetNumQueries(dns, host_name);
918 EXPECT_LE(1U, hostname1_count_after_first_query);
919 // Could be A or AAAA
920 std::string hostname_result_str = ToString(hostname_result);
921 EXPECT_TRUE(hostname_result_str == "1.2.3.4" || hostname_result_str == "::1.2.3.4");
922
923 // Verify that the name is cached.
924 ScopedAddrinfo hostname2_result = safe_getaddrinfo("HOWDY", nullptr, nullptr);
925 EXPECT_TRUE(hostname2_result != nullptr);
926 const size_t hostname1_count_after_second_query = GetNumQueries(dns, host_name);
927 EXPECT_LE(1U, hostname1_count_after_second_query);
928
929 // verify that there is no change in num of queries for howdy.example.com
930 EXPECT_EQ(hostname1_count_after_first_query, hostname1_count_after_second_query);
931
932 // Number of queries for HOWDY.example.com would be >= 1 if domain names
933 // are considered case-sensitive, else number of queries should be 0.
934 const size_t hostname2_count = GetNumQueries(dns, host_name2);
935 EXPECT_EQ(0U,hostname2_count);
936 std::string hostname2_result_str = ToString(hostname2_result);
937 EXPECT_TRUE(hostname2_result_str == "1.2.3.4" || hostname2_result_str == "::1.2.3.4");
938
939 // verify that the result is still the same address even though
940 // mixed-case string is not in the DNS
941 ScopedAddrinfo result = safe_getaddrinfo("HowDY", nullptr, nullptr);
942 EXPECT_TRUE(result != nullptr);
943 std::string result_str = ToString(result);
944 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4");
945}
946
Ken Chenb9fa2062018-11-13 21:51:13 +0800947TEST_F(ResolverTest, MultidomainResolution) {
Xiao Ma09b71022018-12-11 17:56:32 +0900948 constexpr char host_name[] = "nihao.example2.com.";
Luke Huangf8215372019-11-22 11:53:41 +0800949 std::vector<std::string> searchDomains = {"example1.com", "example2.com", "example3.com"};
Ken Chenb9fa2062018-11-13 21:51:13 +0800950
Xiao Ma09b71022018-12-11 17:56:32 +0900951 test::DNSResponder dns("127.0.0.6");
952 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.3"}});
953 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({"127.0.0.6"}, searchDomains));
954
Ken Chenb9fa2062018-11-13 21:51:13 +0800955 const hostent* result = gethostbyname("nihao");
Xiao Ma09b71022018-12-11 17:56:32 +0900956
Ken Chenb9fa2062018-11-13 21:51:13 +0800957 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
958 ASSERT_FALSE(result == nullptr);
959 ASSERT_EQ(4, result->h_length);
960 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
961 EXPECT_EQ("1.2.3.3", ToString(result));
962 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800963}
964
965TEST_F(ResolverTest, GetAddrInfoV6_numeric) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800966 constexpr char host_name[] = "ohayou.example.com.";
967 constexpr char numeric_addr[] = "fe80::1%lo";
968
Xiao Ma09b71022018-12-11 17:56:32 +0900969 test::DNSResponder dns;
Ken Chenb9fa2062018-11-13 21:51:13 +0800970 dns.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900971 StartDns(dns, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
972 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800973
974 addrinfo hints = {.ai_family = AF_INET6};
975 ScopedAddrinfo result = safe_getaddrinfo(numeric_addr, nullptr, &hints);
976 EXPECT_TRUE(result != nullptr);
977 EXPECT_EQ(numeric_addr, ToString(result));
978 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
979
980 // Now try a non-numeric hostname query with the AI_NUMERICHOST flag set.
981 // We should fail without sending out a DNS query.
982 hints.ai_flags |= AI_NUMERICHOST;
983 result = safe_getaddrinfo(host_name, nullptr, &hints);
984 EXPECT_TRUE(result == nullptr);
985 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
986}
987
988TEST_F(ResolverTest, GetAddrInfoV6_failing) {
Xiao Ma09b71022018-12-11 17:56:32 +0900989 constexpr char listen_addr0[] = "127.0.0.7";
990 constexpr char listen_addr1[] = "127.0.0.8";
Ken Chenb9fa2062018-11-13 21:51:13 +0800991 const char* host_name = "ohayou.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +0900992
993 test::DNSResponder dns0(listen_addr0);
994 test::DNSResponder dns1(listen_addr1);
Ken Chenb9fa2062018-11-13 21:51:13 +0800995 dns0.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900996 StartDns(dns0, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
997 StartDns(dns1, {{host_name, ns_type::ns_t_aaaa, "2001:db8::6"}});
998
Luke Huangf8215372019-11-22 11:53:41 +0800999 std::vector<std::string> servers = {listen_addr0, listen_addr1};
Ken Chenb9fa2062018-11-13 21:51:13 +08001000 // <sample validity in s> <success threshold in percent> <min samples> <max samples>
1001 int sample_count = 8;
Luke Huangf8215372019-11-22 11:53:41 +08001002 const std::vector<int> params = {300, 25, sample_count, sample_count};
Xiao Ma09b71022018-12-11 17:56:32 +09001003 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, kDefaultSearchDomains, params));
Ken Chenb9fa2062018-11-13 21:51:13 +08001004
1005 // Repeatedly perform resolutions for non-existing domains until MAXNSSAMPLES resolutions have
1006 // reached the dns0, which is set to fail. No more requests should then arrive at that server
1007 // for the next sample_lifetime seconds.
1008 // TODO: This approach is implementation-dependent, change once metrics reporting is available.
Xiao Ma09b71022018-12-11 17:56:32 +09001009 const addrinfo hints = {.ai_family = AF_INET6};
Bernie Innocentib102dd22018-12-04 14:57:48 +09001010 for (int i = 0; i < sample_count; ++i) {
Ken Chenb9fa2062018-11-13 21:51:13 +08001011 std::string domain = StringPrintf("nonexistent%d", i);
1012 ScopedAddrinfo result = safe_getaddrinfo(domain.c_str(), nullptr, &hints);
1013 }
1014 // Due to 100% errors for all possible samples, the server should be ignored from now on and
1015 // only the second one used for all following queries, until NSSAMPLE_VALIDITY is reached.
1016 dns0.clearQueries();
1017 dns1.clearQueries();
1018 ScopedAddrinfo result = safe_getaddrinfo("ohayou", nullptr, &hints);
1019 EXPECT_TRUE(result != nullptr);
1020 EXPECT_EQ(0U, GetNumQueries(dns0, host_name));
1021 EXPECT_EQ(1U, GetNumQueries(dns1, host_name));
1022}
1023
1024TEST_F(ResolverTest, GetAddrInfoV6_nonresponsive) {
Xiao Ma09b71022018-12-11 17:56:32 +09001025 constexpr char listen_addr0[] = "127.0.0.7";
1026 constexpr char listen_addr1[] = "127.0.0.8";
1027 constexpr char listen_srv[] = "53";
1028 constexpr char host_name1[] = "ohayou.example.com.";
1029 constexpr char host_name2[] = "ciao.example.com.";
Luke Huang483cf332019-06-03 17:24:51 +08001030 const std::vector<std::string> defaultSearchDomain = {"example.com"};
1031 // The minimal timeout is 1000ms, so we can't decrease timeout
1032 // So reduce retry count.
1033 const std::vector<int> reduceRetryParams = {
1034 300, // sample validity in seconds
1035 25, // success threshod in percent
1036 8, 8, // {MIN,MAX}_SAMPLES
1037 1000, // BASE_TIMEOUT_MSEC
1038 1, // retry count
1039 };
Xiao Ma09b71022018-12-11 17:56:32 +09001040 const std::vector<DnsRecord> records0 = {
1041 {host_name1, ns_type::ns_t_aaaa, "2001:db8::5"},
1042 {host_name2, ns_type::ns_t_aaaa, "2001:db8::5"},
1043 };
1044 const std::vector<DnsRecord> records1 = {
1045 {host_name1, ns_type::ns_t_aaaa, "2001:db8::6"},
1046 {host_name2, ns_type::ns_t_aaaa, "2001:db8::6"},
1047 };
Ken Chenb9fa2062018-11-13 21:51:13 +08001048
1049 // dns0 does not respond with 100% probability, while
1050 // dns1 responds normally, at least initially.
Mike Yufc125e42019-05-15 20:41:28 +08001051 test::DNSResponder dns0(listen_addr0, listen_srv, static_cast<ns_rcode>(-1));
1052 test::DNSResponder dns1(listen_addr1, listen_srv, static_cast<ns_rcode>(-1));
Ken Chenb9fa2062018-11-13 21:51:13 +08001053 dns0.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +09001054 StartDns(dns0, records0);
1055 StartDns(dns1, records1);
Luke Huang483cf332019-06-03 17:24:51 +08001056 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr0, listen_addr1}, defaultSearchDomain,
1057 reduceRetryParams));
Ken Chenb9fa2062018-11-13 21:51:13 +08001058
Luke Huang483cf332019-06-03 17:24:51 +08001059 // Specify ai_socktype to make getaddrinfo will only query 1 time
1060 const addrinfo hints = {.ai_family = AF_INET6, .ai_socktype = SOCK_STREAM};
Ken Chenb9fa2062018-11-13 21:51:13 +08001061
1062 // dns0 will ignore the request, and we'll fallback to dns1 after the first
1063 // retry.
1064 ScopedAddrinfo result = safe_getaddrinfo(host_name1, nullptr, &hints);
1065 EXPECT_TRUE(result != nullptr);
1066 EXPECT_EQ(1U, GetNumQueries(dns0, host_name1));
1067 EXPECT_EQ(1U, GetNumQueries(dns1, host_name1));
Mike Yu532405f2020-06-17 17:46:44 +08001068 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, 0, host_name1, {"2001:db8::6"});
Ken Chenb9fa2062018-11-13 21:51:13 +08001069
1070 // Now make dns1 also ignore 100% requests... The resolve should alternate
Luke Huang483cf332019-06-03 17:24:51 +08001071 // queries between the nameservers and fail
Ken Chenb9fa2062018-11-13 21:51:13 +08001072 dns1.setResponseProbability(0.0);
1073 addrinfo* result2 = nullptr;
1074 EXPECT_EQ(EAI_NODATA, getaddrinfo(host_name2, nullptr, &hints, &result2));
1075 EXPECT_EQ(nullptr, result2);
Luke Huang483cf332019-06-03 17:24:51 +08001076 EXPECT_EQ(1U, GetNumQueries(dns0, host_name2));
1077 EXPECT_EQ(1U, GetNumQueries(dns1, host_name2));
Mike Yu532405f2020-06-17 17:46:44 +08001078 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, RCODE_TIMEOUT, host_name2, {});
Ken Chenb9fa2062018-11-13 21:51:13 +08001079}
1080
1081TEST_F(ResolverTest, GetAddrInfoV6_concurrent) {
Xiao Ma09b71022018-12-11 17:56:32 +09001082 constexpr char listen_addr0[] = "127.0.0.9";
1083 constexpr char listen_addr1[] = "127.0.0.10";
1084 constexpr char listen_addr2[] = "127.0.0.11";
1085 constexpr char host_name[] = "konbanha.example.com.";
1086
1087 test::DNSResponder dns0(listen_addr0);
1088 test::DNSResponder dns1(listen_addr1);
1089 test::DNSResponder dns2(listen_addr2);
1090 StartDns(dns0, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
1091 StartDns(dns1, {{host_name, ns_type::ns_t_aaaa, "2001:db8::6"}});
1092 StartDns(dns2, {{host_name, ns_type::ns_t_aaaa, "2001:db8::7"}});
1093
Luke Huangf8215372019-11-22 11:53:41 +08001094 const std::vector<std::string> servers = {listen_addr0, listen_addr1, listen_addr2};
Ken Chenb9fa2062018-11-13 21:51:13 +08001095 std::vector<std::thread> threads(10);
1096 for (std::thread& thread : threads) {
Luke Huangf8215372019-11-22 11:53:41 +08001097 thread = std::thread([this, &servers]() {
1098 unsigned delay = arc4random_uniform(1 * 1000 * 1000); // <= 1s
Ken Chenb9fa2062018-11-13 21:51:13 +08001099 usleep(delay);
1100 std::vector<std::string> serverSubset;
1101 for (const auto& server : servers) {
1102 if (arc4random_uniform(2)) {
1103 serverSubset.push_back(server);
1104 }
1105 }
1106 if (serverSubset.empty()) serverSubset = servers;
Xiao Ma09b71022018-12-11 17:56:32 +09001107 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(serverSubset));
1108 const addrinfo hints = {.ai_family = AF_INET6};
Ken Chenb9fa2062018-11-13 21:51:13 +08001109 addrinfo* result = nullptr;
1110 int rv = getaddrinfo("konbanha", nullptr, &hints, &result);
1111 EXPECT_EQ(0, rv) << "error [" << rv << "] " << gai_strerror(rv);
1112 if (result) {
1113 freeaddrinfo(result);
1114 result = nullptr;
1115 }
1116 });
1117 }
1118 for (std::thread& thread : threads) {
1119 thread.join();
1120 }
Ken Chen92bed612018-12-22 21:46:55 +08001121
1122 std::vector<std::string> res_servers;
1123 std::vector<std::string> res_domains;
1124 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001125 res_params res_params;
Ken Chen92bed612018-12-22 21:46:55 +08001126 std::vector<ResolverStats> res_stats;
1127 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001128 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1129 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1130 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chen92bed612018-12-22 21:46:55 +08001131 EXPECT_EQ(0, wait_for_pending_req_timeout_count);
Ken Chenb9fa2062018-11-13 21:51:13 +08001132}
1133
Mike Yu8ac63402019-12-02 15:28:38 +08001134TEST_F(ResolverTest, SkipBadServersDueToInternalError) {
1135 constexpr char listen_addr1[] = "fe80::1";
1136 constexpr char listen_addr2[] = "255.255.255.255";
1137 constexpr char listen_addr3[] = "127.0.0.3";
Mike Yu61d17262020-02-15 18:56:22 +08001138 int counter = 0; // To generate unique hostnames.
Mike Yu8ac63402019-12-02 15:28:38 +08001139 test::DNSResponder dns(listen_addr3);
1140 ASSERT_TRUE(dns.startServer());
1141
Mike Yu61d17262020-02-15 18:56:22 +08001142 ResolverParamsParcel setupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1143 setupParams.servers = {listen_addr1, listen_addr2, listen_addr3};
1144 setupParams.minSamples = 2; // Recognize bad servers in two attempts when sorting not enabled.
Mike Yu8ac63402019-12-02 15:28:38 +08001145
Mike Yu61d17262020-02-15 18:56:22 +08001146 ResolverParamsParcel cleanupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1147 cleanupParams.servers.clear();
1148 cleanupParams.tlsServers.clear();
Mike Yu8ac63402019-12-02 15:28:38 +08001149
Mike Yu61d17262020-02-15 18:56:22 +08001150 for (const auto& sortNameserversFlag : {"" /* unset */, "0" /* off */, "1" /* on */}) {
1151 SCOPED_TRACE(fmt::format("sortNameversFlag_{}", sortNameserversFlag));
1152 ScopedSystemProperties scopedSystemProperties(kSortNameserversFlag, sortNameserversFlag);
1153
Mike Yu10832aa2020-08-25 19:13:11 +08001154 // Re-setup test network to make experiment flag take effect.
1155 resetNetwork();
1156
Mike Yu61d17262020-02-15 18:56:22 +08001157 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(setupParams));
1158
1159 // Start sending synchronized querying.
1160 for (int i = 0; i < 100; i++) {
1161 std::string hostName = StringPrintf("hello%d.com.", counter++);
1162 dns.addMapping(hostName, ns_type::ns_t_a, "1.2.3.4");
1163 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1164 EXPECT_TRUE(safe_getaddrinfo(hostName.c_str(), nullptr, &hints) != nullptr);
1165 }
1166
1167 const std::vector<NameserverStats> targetStats = {
1168 NameserverStats(listen_addr1).setInternalErrors(5),
1169 NameserverStats(listen_addr2).setInternalErrors(5),
1170 NameserverStats(listen_addr3).setSuccesses(setupParams.maxSamples),
1171 };
1172 EXPECT_TRUE(expectStatsNotGreaterThan(targetStats));
1173
1174 // Also verify the number of queries received in the server because res_stats.successes has
1175 // a maximum.
1176 EXPECT_EQ(dns.queries().size(), 100U);
1177
1178 // Reset the state.
1179 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(cleanupParams));
1180 dns.clearQueries();
Mike Yu8ac63402019-12-02 15:28:38 +08001181 }
Mike Yu8ac63402019-12-02 15:28:38 +08001182}
1183
1184TEST_F(ResolverTest, SkipBadServersDueToTimeout) {
1185 constexpr char listen_addr1[] = "127.0.0.3";
1186 constexpr char listen_addr2[] = "127.0.0.4";
Mike Yu61d17262020-02-15 18:56:22 +08001187 int counter = 0; // To generate unique hostnames.
1188
1189 ResolverParamsParcel setupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1190 setupParams.servers = {listen_addr1, listen_addr2};
1191 setupParams.minSamples = 2; // Recognize bad servers in two attempts when sorting not enabled.
1192
1193 ResolverParamsParcel cleanupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1194 cleanupParams.servers.clear();
1195 cleanupParams.tlsServers.clear();
Mike Yu8ac63402019-12-02 15:28:38 +08001196
1197 // Set dns1 non-responsive and dns2 workable.
1198 test::DNSResponder dns1(listen_addr1, test::kDefaultListenService, static_cast<ns_rcode>(-1));
1199 test::DNSResponder dns2(listen_addr2);
1200 dns1.setResponseProbability(0.0);
1201 ASSERT_TRUE(dns1.startServer());
1202 ASSERT_TRUE(dns2.startServer());
1203
Mike Yu61d17262020-02-15 18:56:22 +08001204 for (const auto& sortNameserversFlag : {"" /* unset */, "0" /* off */, "1" /* on */}) {
1205 SCOPED_TRACE(fmt::format("sortNameversFlag_{}", sortNameserversFlag));
1206 ScopedSystemProperties scopedSystemProperties(kSortNameserversFlag, sortNameserversFlag);
Mike Yu8ac63402019-12-02 15:28:38 +08001207
Mike Yu10832aa2020-08-25 19:13:11 +08001208 // Re-setup test network to make experiment flag take effect.
1209 resetNetwork();
1210
Mike Yu61d17262020-02-15 18:56:22 +08001211 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(setupParams));
Mike Yu8ac63402019-12-02 15:28:38 +08001212
Mike Yu61d17262020-02-15 18:56:22 +08001213 // Start sending synchronized querying.
1214 for (int i = 0; i < 100; i++) {
1215 std::string hostName = StringPrintf("hello%d.com.", counter++);
1216 dns1.addMapping(hostName, ns_type::ns_t_a, "1.2.3.4");
1217 dns2.addMapping(hostName, ns_type::ns_t_a, "1.2.3.5");
1218 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1219 EXPECT_TRUE(safe_getaddrinfo(hostName.c_str(), nullptr, &hints) != nullptr);
1220 }
1221
1222 const std::vector<NameserverStats> targetStats = {
1223 NameserverStats(listen_addr1).setTimeouts(5),
1224 NameserverStats(listen_addr2).setSuccesses(setupParams.maxSamples),
1225 };
1226 EXPECT_TRUE(expectStatsNotGreaterThan(targetStats));
1227
1228 // Also verify the number of queries received in the server because res_stats.successes has
1229 // an upper bound.
1230 EXPECT_GT(dns1.queries().size(), 0U);
1231 EXPECT_LT(dns1.queries().size(), 5U);
1232 EXPECT_EQ(dns2.queries().size(), 100U);
1233
1234 // Reset the state.
1235 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(cleanupParams));
1236 dns1.clearQueries();
1237 dns2.clearQueries();
Mike Yu8ac63402019-12-02 15:28:38 +08001238 }
Mike Yu8ac63402019-12-02 15:28:38 +08001239}
1240
chenbrucefd837fa2019-10-29 18:35:36 +08001241TEST_F(ResolverTest, GetAddrInfoFromCustTable_InvalidInput) {
1242 constexpr char hostnameNoip[] = "noip.example.com.";
1243 constexpr char hostnameInvalidip[] = "invalidip.example.com.";
1244 const std::vector<aidl::android::net::ResolverHostsParcel> invalidCustHosts = {
1245 {"", hostnameNoip},
1246 {"wrong IP", hostnameInvalidip},
1247 };
1248 test::DNSResponder dns;
1249 StartDns(dns, {});
1250 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
Ken Chena6ac2a62020-04-07 17:25:56 +08001251 resolverParams.resolverOptions.hosts = invalidCustHosts;
chenbrucefd837fa2019-10-29 18:35:36 +08001252 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1253 for (const auto& hostname : {hostnameNoip, hostnameInvalidip}) {
1254 // The query won't get data from customized table because of invalid customized table
1255 // and DNSResponder also has no records. hostnameNoip has never registered and
1256 // hostnameInvalidip has registered but wrong IP.
1257 const addrinfo hints = {.ai_family = AF_UNSPEC};
1258 ScopedAddrinfo result = safe_getaddrinfo(hostname, nullptr, &hints);
1259 ASSERT_TRUE(result == nullptr);
1260 EXPECT_EQ(4U, GetNumQueries(dns, hostname));
1261 }
1262}
1263
1264TEST_F(ResolverTest, GetAddrInfoFromCustTable) {
1265 constexpr char hostnameV4[] = "v4only.example.com.";
1266 constexpr char hostnameV6[] = "v6only.example.com.";
1267 constexpr char hostnameV4V6[] = "v4v6.example.com.";
1268 constexpr char custAddrV4[] = "1.2.3.4";
1269 constexpr char custAddrV6[] = "::1.2.3.4";
1270 constexpr char dnsSvAddrV4[] = "1.2.3.5";
1271 constexpr char dnsSvAddrV6[] = "::1.2.3.5";
1272 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4 = {
1273 {custAddrV4, hostnameV4},
1274 };
1275 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV6 = {
1276 {custAddrV6, hostnameV6},
1277 };
1278 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4V6 = {
1279 {custAddrV4, hostnameV4V6},
1280 {custAddrV6, hostnameV4V6},
1281 };
1282 const std::vector<DnsRecord> dnsSvHostV4 = {
1283 {hostnameV4, ns_type::ns_t_a, dnsSvAddrV4},
1284 };
1285 const std::vector<DnsRecord> dnsSvHostV6 = {
1286 {hostnameV6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1287 };
1288 const std::vector<DnsRecord> dnsSvHostV4V6 = {
1289 {hostnameV4V6, ns_type::ns_t_a, dnsSvAddrV4},
1290 {hostnameV4V6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1291 };
1292 struct TestConfig {
1293 const std::string name;
1294 const std::vector<aidl::android::net::ResolverHostsParcel> customizedHosts;
1295 const std::vector<DnsRecord> dnsserverHosts;
1296 const std::vector<std::string> queryResult;
1297 std::string asParameters() const {
1298 return StringPrintf("name: %s, customizedHosts: %s, dnsserverHosts: %s", name.c_str(),
1299 customizedHosts.empty() ? "No" : "Yes",
1300 dnsserverHosts.empty() ? "No" : "Yes");
1301 }
1302 } testConfigs[]{
1303 // clang-format off
1304 {hostnameV4, {}, {}, {}},
1305 {hostnameV4, {}, dnsSvHostV4, {dnsSvAddrV4}},
1306 {hostnameV4, custHostV4, {}, {custAddrV4}},
1307 {hostnameV4, custHostV4, dnsSvHostV4, {custAddrV4}},
1308 {hostnameV6, {}, {}, {}},
1309 {hostnameV6, {}, dnsSvHostV6, {dnsSvAddrV6}},
1310 {hostnameV6, custHostV6, {}, {custAddrV6}},
1311 {hostnameV6, custHostV6, dnsSvHostV6, {custAddrV6}},
1312 {hostnameV4V6, {}, {}, {}},
1313 {hostnameV4V6, {}, dnsSvHostV4V6, {dnsSvAddrV4, dnsSvAddrV6}},
1314 {hostnameV4V6, custHostV4V6, {}, {custAddrV4, custAddrV6}},
1315 {hostnameV4V6, custHostV4V6, dnsSvHostV4V6, {custAddrV4, custAddrV6}},
1316 // clang-format on
1317 };
1318
1319 for (const auto& config : testConfigs) {
1320 SCOPED_TRACE(config.asParameters());
1321
1322 test::DNSResponder dns;
1323 StartDns(dns, config.dnsserverHosts);
1324
1325 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
Ken Chena6ac2a62020-04-07 17:25:56 +08001326 resolverParams.resolverOptions.hosts = config.customizedHosts;
chenbrucefd837fa2019-10-29 18:35:36 +08001327 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1328 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM};
1329 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
1330 if (config.customizedHosts.empty() && config.dnsserverHosts.empty()) {
1331 ASSERT_TRUE(result == nullptr);
1332 EXPECT_EQ(2U, GetNumQueries(dns, config.name.c_str()));
1333 } else {
1334 ASSERT_TRUE(result != nullptr);
1335 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(config.queryResult));
1336 EXPECT_EQ(config.customizedHosts.empty() ? 2U : 0U,
1337 GetNumQueries(dns, config.name.c_str()));
1338 }
1339
1340 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
1341 }
1342}
1343
1344TEST_F(ResolverTest, GetAddrInfoFromCustTable_Modify) {
1345 constexpr char hostnameV4V6[] = "v4v6.example.com.";
1346 constexpr char custAddrV4[] = "1.2.3.4";
1347 constexpr char custAddrV6[] = "::1.2.3.4";
1348 constexpr char dnsSvAddrV4[] = "1.2.3.5";
1349 constexpr char dnsSvAddrV6[] = "::1.2.3.5";
1350 const std::vector<DnsRecord> dnsSvHostV4V6 = {
1351 {hostnameV4V6, ns_type::ns_t_a, dnsSvAddrV4},
1352 {hostnameV4V6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1353 };
1354 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4V6 = {
1355 {custAddrV4, hostnameV4V6},
1356 {custAddrV6, hostnameV4V6},
1357 };
1358 test::DNSResponder dns;
1359 StartDns(dns, dnsSvHostV4V6);
1360 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1361
Ken Chena6ac2a62020-04-07 17:25:56 +08001362 resolverParams.resolverOptions.hosts = custHostV4V6;
chenbrucefd837fa2019-10-29 18:35:36 +08001363 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1364 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM};
1365 ScopedAddrinfo result = safe_getaddrinfo(hostnameV4V6, nullptr, &hints);
1366 ASSERT_TRUE(result != nullptr);
1367 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray({custAddrV4, custAddrV6}));
1368 EXPECT_EQ(0U, GetNumQueries(dns, hostnameV4V6));
1369
Ken Chena6ac2a62020-04-07 17:25:56 +08001370 resolverParams.resolverOptions.hosts = {};
chenbrucefd837fa2019-10-29 18:35:36 +08001371 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1372 result = safe_getaddrinfo(hostnameV4V6, nullptr, &hints);
1373 ASSERT_TRUE(result != nullptr);
1374 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray({dnsSvAddrV4, dnsSvAddrV6}));
1375 EXPECT_EQ(2U, GetNumQueries(dns, hostnameV4V6));
1376}
1377
Ken Chenb9fa2062018-11-13 21:51:13 +08001378TEST_F(ResolverTest, EmptySetup) {
Ken Chenb9fa2062018-11-13 21:51:13 +08001379 std::vector<std::string> servers;
1380 std::vector<std::string> domains;
Xiao Ma09b71022018-12-11 17:56:32 +09001381 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001382 std::vector<std::string> res_servers;
1383 std::vector<std::string> res_domains;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001384 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001385 res_params res_params;
Ken Chenb9fa2062018-11-13 21:51:13 +08001386 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +08001387 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001388 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1389 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1390 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chenb9fa2062018-11-13 21:51:13 +08001391 EXPECT_EQ(0U, res_servers.size());
1392 EXPECT_EQ(0U, res_domains.size());
Mike Yu0a1c53d2018-11-26 13:26:21 +09001393 EXPECT_EQ(0U, res_tls_servers.size());
Luke Huang5bd827c2019-03-14 16:10:04 +08001394 ASSERT_EQ(static_cast<size_t>(IDnsResolver::RESOLVER_PARAMS_COUNT), kDefaultParams.size());
1395 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY],
1396 res_params.sample_validity);
1397 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001398 res_params.success_threshold);
Luke Huang5bd827c2019-03-14 16:10:04 +08001399 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
1400 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
1401 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
Ken Chenb9fa2062018-11-13 21:51:13 +08001402 res_params.base_timeout_msec);
Luke Huang5bd827c2019-03-14 16:10:04 +08001403 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_RETRY_COUNT], res_params.retry_count);
Ken Chenb9fa2062018-11-13 21:51:13 +08001404}
1405
1406TEST_F(ResolverTest, SearchPathChange) {
Xiao Ma09b71022018-12-11 17:56:32 +09001407 constexpr char listen_addr[] = "127.0.0.13";
1408 constexpr char host_name1[] = "test13.domain1.org.";
1409 constexpr char host_name2[] = "test13.domain2.org.";
Luke Huangf8215372019-11-22 11:53:41 +08001410 std::vector<std::string> servers = {listen_addr};
1411 std::vector<std::string> domains = {"domain1.org"};
Xiao Ma09b71022018-12-11 17:56:32 +09001412
1413 const std::vector<DnsRecord> records = {
1414 {host_name1, ns_type::ns_t_aaaa, "2001:db8::13"},
1415 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1:13"},
1416 };
1417 test::DNSResponder dns(listen_addr);
1418 StartDns(dns, records);
1419 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001420
1421 const addrinfo hints = {.ai_family = AF_INET6};
1422 ScopedAddrinfo result = safe_getaddrinfo("test13", nullptr, &hints);
1423 EXPECT_TRUE(result != nullptr);
1424 EXPECT_EQ(1U, dns.queries().size());
1425 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
1426 EXPECT_EQ("2001:db8::13", ToString(result));
1427
1428 // Test that changing the domain search path on its own works.
Luke Huangf8215372019-11-22 11:53:41 +08001429 domains = {"domain2.org"};
Xiao Ma09b71022018-12-11 17:56:32 +09001430 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001431 dns.clearQueries();
1432
1433 result = safe_getaddrinfo("test13", nullptr, &hints);
1434 EXPECT_TRUE(result != nullptr);
1435 EXPECT_EQ(1U, dns.queries().size());
1436 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
1437 EXPECT_EQ("2001:db8::1:13", ToString(result));
1438}
1439
Luke Huang2dac4382019-06-24 13:28:44 +08001440namespace {
1441
Luke Huangf8215372019-11-22 11:53:41 +08001442std::vector<std::string> getResolverDomains(aidl::android::net::IDnsResolver* dnsResolverService,
Luke Huang2dac4382019-06-24 13:28:44 +08001443 unsigned netId) {
1444 std::vector<std::string> res_servers;
1445 std::vector<std::string> res_domains;
1446 std::vector<std::string> res_tls_servers;
1447 res_params res_params;
1448 std::vector<ResolverStats> res_stats;
1449 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001450 DnsResponderClient::GetResolverInfo(dnsResolverService, netId, &res_servers, &res_domains,
1451 &res_tls_servers, &res_params, &res_stats,
1452 &wait_for_pending_req_timeout_count);
Luke Huang2dac4382019-06-24 13:28:44 +08001453 return res_domains;
1454}
1455
1456} // namespace
1457
1458TEST_F(ResolverTest, SearchPathPrune) {
1459 constexpr size_t DUPLICATED_DOMAIN_NUM = 3;
1460 constexpr char listen_addr[] = "127.0.0.13";
1461 constexpr char domian_name1[] = "domain13.org.";
1462 constexpr char domian_name2[] = "domain14.org.";
1463 constexpr char host_name1[] = "test13.domain13.org.";
1464 constexpr char host_name2[] = "test14.domain14.org.";
1465 std::vector<std::string> servers = {listen_addr};
1466
1467 std::vector<std::string> testDomains1;
1468 std::vector<std::string> testDomains2;
1469 // Domain length should be <= 255
1470 // Max number of domains in search path is 6
1471 for (size_t i = 0; i < MAXDNSRCH + 1; i++) {
1472 // Fill up with invalid domain
1473 testDomains1.push_back(std::string(300, i + '0'));
1474 // Fill up with valid but duplicated domain
1475 testDomains2.push_back(StringPrintf("domain%zu.org", i % DUPLICATED_DOMAIN_NUM));
1476 }
1477
1478 // Add valid domain used for query.
1479 testDomains1.push_back(domian_name1);
1480
1481 // Add valid domain twice used for query.
1482 testDomains2.push_back(domian_name2);
1483 testDomains2.push_back(domian_name2);
1484
1485 const std::vector<DnsRecord> records = {
1486 {host_name1, ns_type::ns_t_aaaa, "2001:db8::13"},
1487 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1:13"},
1488 };
1489 test::DNSResponder dns(listen_addr);
1490 StartDns(dns, records);
1491 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, testDomains1));
1492
1493 const addrinfo hints = {.ai_family = AF_INET6};
1494 ScopedAddrinfo result = safe_getaddrinfo("test13", nullptr, &hints);
1495
1496 EXPECT_TRUE(result != nullptr);
1497
1498 EXPECT_EQ(1U, dns.queries().size());
1499 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
1500 EXPECT_EQ("2001:db8::13", ToString(result));
1501
1502 const auto& res_domains1 = getResolverDomains(mDnsClient.resolvService(), TEST_NETID);
1503 // Expect 1 valid domain, invalid domains are removed.
1504 ASSERT_EQ(1U, res_domains1.size());
1505 EXPECT_EQ(domian_name1, res_domains1[0]);
1506
1507 dns.clearQueries();
1508
1509 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, testDomains2));
1510
1511 result = safe_getaddrinfo("test14", nullptr, &hints);
1512 EXPECT_TRUE(result != nullptr);
1513
1514 // (3 domains * 2 retries) + 1 success query = 7
1515 EXPECT_EQ(7U, dns.queries().size());
1516 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
1517 EXPECT_EQ("2001:db8::1:13", ToString(result));
1518
1519 const auto& res_domains2 = getResolverDomains(mDnsClient.resolvService(), TEST_NETID);
1520 // Expect 4 valid domain, duplicate domains are removed.
1521 EXPECT_EQ(DUPLICATED_DOMAIN_NUM + 1U, res_domains2.size());
1522 EXPECT_THAT(
1523 std::vector<std::string>({"domain0.org", "domain1.org", "domain2.org", domian_name2}),
1524 testing::ElementsAreArray(res_domains2));
1525}
1526
Mike Yu0a1c53d2018-11-26 13:26:21 +09001527// If we move this function to dns_responder_client, it will complicate the dependency need of
1528// dns_tls_frontend.h.
1529static void setupTlsServers(const std::vector<std::string>& servers,
waynema0e73c2e2019-07-31 15:04:08 +08001530 std::vector<std::unique_ptr<test::DnsTlsFrontend>>* tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001531 constexpr char listen_udp[] = "53";
1532 constexpr char listen_tls[] = "853";
Mike Yu0a1c53d2018-11-26 13:26:21 +09001533
1534 for (const auto& server : servers) {
1535 auto t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
1536 t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
1537 t->startServer();
Mike Yu0a1c53d2018-11-26 13:26:21 +09001538 tls->push_back(std::move(t));
1539 }
1540}
1541
Mike Yu0a1c53d2018-11-26 13:26:21 +09001542TEST_F(ResolverTest, MaxServerPrune_Binder) {
Mike Yu0a1c53d2018-11-26 13:26:21 +09001543 std::vector<std::string> domains;
1544 std::vector<std::unique_ptr<test::DNSResponder>> dns;
1545 std::vector<std::unique_ptr<test::DnsTlsFrontend>> tls;
1546 std::vector<std::string> servers;
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001547 std::vector<DnsResponderClient::Mapping> mappings;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001548
1549 for (unsigned i = 0; i < MAXDNSRCH + 1; i++) {
1550 domains.push_back(StringPrintf("example%u.com", i));
1551 }
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001552 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupMappings(1, domains, &mappings));
1553 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupDNSServers(MAXNS + 1, mappings, &dns, &servers));
waynema0e73c2e2019-07-31 15:04:08 +08001554 ASSERT_NO_FATAL_FAILURE(setupTlsServers(servers, &tls));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001555
waynema0e73c2e2019-07-31 15:04:08 +08001556 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, domains, kDefaultParams,
1557 kDefaultPrivateDnsHostName));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001558
Mike Yu383855b2019-01-15 17:53:27 +08001559 // If the private DNS validation hasn't completed yet before backend DNS servers stop,
1560 // TLS servers will get stuck in handleOneRequest(), which causes this test stuck in
1561 // ~DnsTlsFrontend() because the TLS server loop threads can't be terminated.
1562 // So, wait for private DNS validation done before stopping backend DNS servers.
1563 for (int i = 0; i < MAXNS; i++) {
chenbruceaff85842019-05-31 15:46:42 +08001564 LOG(INFO) << "Waiting for private DNS validation on " << tls[i]->listen_address() << ".";
Mike Yu724f77d2019-08-16 11:14:50 +08001565 EXPECT_TRUE(WaitForPrivateDnsValidation(tls[i]->listen_address(), true));
chenbruceaff85842019-05-31 15:46:42 +08001566 LOG(INFO) << "private DNS validation on " << tls[i]->listen_address() << " done.";
Mike Yu383855b2019-01-15 17:53:27 +08001567 }
1568
Mike Yu0a1c53d2018-11-26 13:26:21 +09001569 std::vector<std::string> res_servers;
1570 std::vector<std::string> res_domains;
1571 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001572 res_params res_params;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001573 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +08001574 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001575 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1576 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1577 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001578
1579 // Check the size of the stats and its contents.
1580 EXPECT_EQ(static_cast<size_t>(MAXNS), res_servers.size());
1581 EXPECT_EQ(static_cast<size_t>(MAXNS), res_tls_servers.size());
1582 EXPECT_EQ(static_cast<size_t>(MAXDNSRCH), res_domains.size());
1583 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_servers.begin()));
1584 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_tls_servers.begin()));
1585 EXPECT_TRUE(std::equal(domains.begin(), domains.begin() + MAXDNSRCH, res_domains.begin()));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001586}
1587
1588TEST_F(ResolverTest, ResolverStats) {
Xiao Ma09b71022018-12-11 17:56:32 +09001589 constexpr char listen_addr1[] = "127.0.0.4";
1590 constexpr char listen_addr2[] = "127.0.0.5";
1591 constexpr char listen_addr3[] = "127.0.0.6";
Mike Yu0a1c53d2018-11-26 13:26:21 +09001592
1593 // Set server 1 timeout.
Mike Yufc125e42019-05-15 20:41:28 +08001594 test::DNSResponder dns1(listen_addr1, "53", static_cast<ns_rcode>(-1));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001595 dns1.setResponseProbability(0.0);
1596 ASSERT_TRUE(dns1.startServer());
1597
1598 // Set server 2 responding server failure.
Xiao Ma09b71022018-12-11 17:56:32 +09001599 test::DNSResponder dns2(listen_addr2);
Mike Yu0a1c53d2018-11-26 13:26:21 +09001600 dns2.setResponseProbability(0.0);
1601 ASSERT_TRUE(dns2.startServer());
1602
1603 // Set server 3 workable.
Xiao Ma09b71022018-12-11 17:56:32 +09001604 test::DNSResponder dns3(listen_addr3);
1605 dns3.addMapping(kHelloExampleCom, ns_type::ns_t_a, "1.2.3.4");
Mike Yu0a1c53d2018-11-26 13:26:21 +09001606 ASSERT_TRUE(dns3.startServer());
1607
1608 std::vector<std::string> servers = {listen_addr1, listen_addr2, listen_addr3};
Xiao Ma09b71022018-12-11 17:56:32 +09001609 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001610
1611 dns3.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +09001612 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
Mike Yu0a1c53d2018-11-26 13:26:21 +09001613 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
Xiao Ma09b71022018-12-11 17:56:32 +09001614 size_t found = GetNumQueries(dns3, kHelloExampleCom);
Mike Yu0a1c53d2018-11-26 13:26:21 +09001615 EXPECT_LE(1U, found);
1616 std::string result_str = ToString(result);
1617 EXPECT_TRUE(result_str == "1.2.3.4") << ", result_str='" << result_str << "'";
1618
Mike Yue2162e52020-03-04 18:43:46 +08001619 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1620 NameserverStats(listen_addr1).setTimeouts(1),
1621 NameserverStats(listen_addr2).setErrors(1),
1622 NameserverStats(listen_addr3).setSuccesses(1),
1623 };
Mike Yu61d17262020-02-15 18:56:22 +08001624 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001625}
1626
Mike Yu15791832020-02-11 13:38:48 +08001627TEST_F(ResolverTest, AlwaysUseLatestSetupParamsInLookups) {
1628 constexpr char listen_addr1[] = "127.0.0.3";
1629 constexpr char listen_addr2[] = "255.255.255.255";
1630 constexpr char listen_addr3[] = "127.0.0.4";
1631 constexpr char hostname[] = "hello";
1632 constexpr char fqdn_with_search_domain[] = "hello.domain2.com.";
1633
1634 test::DNSResponder dns1(listen_addr1, test::kDefaultListenService, static_cast<ns_rcode>(-1));
1635 dns1.setResponseProbability(0.0);
1636 ASSERT_TRUE(dns1.startServer());
1637
1638 test::DNSResponder dns3(listen_addr3);
1639 StartDns(dns3, {{fqdn_with_search_domain, ns_type::ns_t_a, "1.2.3.4"}});
1640
1641 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
1642 parcel.tlsServers.clear();
1643 parcel.servers = {listen_addr1, listen_addr2};
1644 parcel.domains = {"domain1.com", "domain2.com"};
1645 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1646
1647 // Expect the things happening in t1:
1648 // 1. The lookup starts using the first domain for query. It sends queries to the populated
1649 // nameserver list {listen_addr1, listen_addr2} for the hostname "hello.domain1.com".
1650 // 2. A different list of nameservers is updated to the resolver. Revision ID is incremented.
1651 // 3. The query for the hostname times out. The lookup fails to add the timeout record to the
1652 // the stats because of the unmatched revision ID.
1653 // 4. The lookup starts using the second domain for query. It sends queries to the populated
1654 // nameserver list {listen_addr3, listen_addr1, listen_addr2} for another hostname
1655 // "hello.domain2.com".
1656 // 5. The lookup gets the answer and updates a success record to the stats.
1657 std::thread t1([&hostname]() {
1658 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1659 ScopedAddrinfo result = safe_getaddrinfo(hostname, nullptr, &hints);
1660 EXPECT_NE(result.get(), nullptr);
1661 EXPECT_EQ(ToString(result), "1.2.3.4");
1662 });
1663
1664 // Wait for t1 to start the step 1.
1665 while (dns1.queries().size() == 0) {
1666 usleep(1000);
1667 }
1668
1669 // Update the resolver with three nameservers. This will increment the revision ID.
1670 parcel.servers = {listen_addr3, listen_addr1, listen_addr2};
1671 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1672
1673 t1.join();
1674 EXPECT_EQ(0U, GetNumQueriesForType(dns3, ns_type::ns_t_aaaa, fqdn_with_search_domain));
1675 EXPECT_EQ(1U, GetNumQueriesForType(dns3, ns_type::ns_t_a, fqdn_with_search_domain));
1676
Mike Yue2162e52020-03-04 18:43:46 +08001677 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1678 NameserverStats(listen_addr1),
1679 NameserverStats(listen_addr2),
1680 NameserverStats(listen_addr3).setSuccesses(1),
1681 };
Mike Yu61d17262020-02-15 18:56:22 +08001682 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu15791832020-02-11 13:38:48 +08001683}
1684
Ken Chenb9fa2062018-11-13 21:51:13 +08001685// Test what happens if the specified TLS server is nonexistent.
1686TEST_F(ResolverTest, GetHostByName_TlsMissing) {
Xiao Ma09b71022018-12-11 17:56:32 +09001687 constexpr char listen_addr[] = "127.0.0.3";
1688 constexpr char host_name[] = "tlsmissing.example.com.";
1689
1690 test::DNSResponder dns;
1691 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.3"}});
Luke Huangf8215372019-11-22 11:53:41 +08001692 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001693
1694 // There's nothing listening on this address, so validation will either fail or
1695 /// hang. Either way, queries will continue to flow to the DNSResponder.
waynema0e73c2e2019-07-31 15:04:08 +08001696 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Ken Chenb9fa2062018-11-13 21:51:13 +08001697
1698 const hostent* result;
1699
1700 result = gethostbyname("tlsmissing");
1701 ASSERT_FALSE(result == nullptr);
1702 EXPECT_EQ("1.2.3.3", ToString(result));
1703
1704 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001705 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001706}
1707
1708// Test what happens if the specified TLS server replies with garbage.
1709TEST_F(ResolverTest, GetHostByName_TlsBroken) {
Xiao Ma09b71022018-12-11 17:56:32 +09001710 constexpr char listen_addr[] = "127.0.0.3";
1711 constexpr char host_name1[] = "tlsbroken1.example.com.";
1712 constexpr char host_name2[] = "tlsbroken2.example.com.";
1713 const std::vector<DnsRecord> records = {
1714 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1715 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1716 };
1717
1718 test::DNSResponder dns;
1719 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001720 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001721
1722 // Bind the specified private DNS socket but don't respond to any client sockets yet.
1723 int s = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, IPPROTO_TCP);
1724 ASSERT_TRUE(s >= 0);
1725 struct sockaddr_in tlsServer = {
Luke Huangf8215372019-11-22 11:53:41 +08001726 .sin_family = AF_INET,
1727 .sin_port = htons(853),
Ken Chenb9fa2062018-11-13 21:51:13 +08001728 };
1729 ASSERT_TRUE(inet_pton(AF_INET, listen_addr, &tlsServer.sin_addr));
1730 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEPORT).ok());
1731 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEADDR).ok());
1732 ASSERT_FALSE(bind(s, reinterpret_cast<struct sockaddr*>(&tlsServer), sizeof(tlsServer)));
1733 ASSERT_FALSE(listen(s, 1));
1734
1735 // Trigger TLS validation.
waynema0e73c2e2019-07-31 15:04:08 +08001736 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Ken Chenb9fa2062018-11-13 21:51:13 +08001737
1738 struct sockaddr_storage cliaddr;
1739 socklen_t sin_size = sizeof(cliaddr);
Luke Huangf8215372019-11-22 11:53:41 +08001740 int new_fd = accept4(s, reinterpret_cast<struct sockaddr*>(&cliaddr), &sin_size, SOCK_CLOEXEC);
Ken Chenb9fa2062018-11-13 21:51:13 +08001741 ASSERT_TRUE(new_fd > 0);
1742
1743 // We've received the new file descriptor but not written to it or closed, so the
1744 // validation is still pending. Queries should still flow correctly because the
1745 // server is not used until validation succeeds.
1746 const hostent* result;
1747 result = gethostbyname("tlsbroken1");
1748 ASSERT_FALSE(result == nullptr);
1749 EXPECT_EQ("1.2.3.1", ToString(result));
1750
1751 // Now we cause the validation to fail.
1752 std::string garbage = "definitely not a valid TLS ServerHello";
1753 write(new_fd, garbage.data(), garbage.size());
1754 close(new_fd);
1755
1756 // Validation failure shouldn't interfere with lookups, because lookups won't be sent
1757 // to the TLS server unless validation succeeds.
1758 result = gethostbyname("tlsbroken2");
1759 ASSERT_FALSE(result == nullptr);
1760 EXPECT_EQ("1.2.3.2", ToString(result));
1761
1762 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001763 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001764 close(s);
1765}
1766
1767TEST_F(ResolverTest, GetHostByName_Tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001768 constexpr char listen_addr[] = "127.0.0.3";
1769 constexpr char listen_udp[] = "53";
1770 constexpr char listen_tls[] = "853";
1771 constexpr char host_name1[] = "tls1.example.com.";
1772 constexpr char host_name2[] = "tls2.example.com.";
1773 constexpr char host_name3[] = "tls3.example.com.";
1774 const std::vector<DnsRecord> records = {
1775 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1776 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1777 {host_name3, ns_type::ns_t_a, "1.2.3.3"},
1778 };
1779
1780 test::DNSResponder dns;
1781 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001782 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001783
1784 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1785 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001786 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08001787 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001788
Mike Yu724f77d2019-08-16 11:14:50 +08001789 const hostent* result = gethostbyname("tls1");
Ken Chenb9fa2062018-11-13 21:51:13 +08001790 ASSERT_FALSE(result == nullptr);
1791 EXPECT_EQ("1.2.3.1", ToString(result));
1792
1793 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001794 EXPECT_TRUE(tls.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001795
1796 // Stop the TLS server. Since we're in opportunistic mode, queries will
1797 // fall back to the locally-assigned (clear text) nameservers.
1798 tls.stopServer();
1799
1800 dns.clearQueries();
1801 result = gethostbyname("tls2");
1802 EXPECT_FALSE(result == nullptr);
1803 EXPECT_EQ("1.2.3.2", ToString(result));
1804 const auto queries = dns.queries();
1805 EXPECT_EQ(1U, queries.size());
waynema29253052019-08-20 11:26:08 +08001806 EXPECT_EQ("tls2.example.com.", queries[0].name);
1807 EXPECT_EQ(ns_t_a, queries[0].type);
Ken Chenb9fa2062018-11-13 21:51:13 +08001808
1809 // Reset the resolvers without enabling TLS. Queries should still be routed
1810 // to the UDP endpoint.
Xiao Ma09b71022018-12-11 17:56:32 +09001811 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001812
1813 result = gethostbyname("tls3");
1814 ASSERT_FALSE(result == nullptr);
1815 EXPECT_EQ("1.2.3.3", ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +08001816}
1817
Ken Chenb9fa2062018-11-13 21:51:13 +08001818TEST_F(ResolverTest, GetHostByName_TlsFailover) {
Xiao Ma09b71022018-12-11 17:56:32 +09001819 constexpr char listen_addr1[] = "127.0.0.3";
1820 constexpr char listen_addr2[] = "127.0.0.4";
1821 constexpr char listen_udp[] = "53";
1822 constexpr char listen_tls[] = "853";
1823 constexpr char host_name1[] = "tlsfailover1.example.com.";
1824 constexpr char host_name2[] = "tlsfailover2.example.com.";
1825 const std::vector<DnsRecord> records1 = {
1826 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1827 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1828 };
1829 const std::vector<DnsRecord> records2 = {
1830 {host_name1, ns_type::ns_t_a, "1.2.3.3"},
1831 {host_name2, ns_type::ns_t_a, "1.2.3.4"},
1832 };
1833
1834 test::DNSResponder dns1(listen_addr1);
1835 test::DNSResponder dns2(listen_addr2);
1836 StartDns(dns1, records1);
1837 StartDns(dns2, records2);
1838
Luke Huangf8215372019-11-22 11:53:41 +08001839 std::vector<std::string> servers = {listen_addr1, listen_addr2};
Ken Chenb9fa2062018-11-13 21:51:13 +08001840
1841 test::DnsTlsFrontend tls1(listen_addr1, listen_tls, listen_addr1, listen_udp);
1842 test::DnsTlsFrontend tls2(listen_addr2, listen_tls, listen_addr2, listen_udp);
1843 ASSERT_TRUE(tls1.startServer());
1844 ASSERT_TRUE(tls2.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001845 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1846 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08001847 EXPECT_TRUE(WaitForPrivateDnsValidation(tls1.listen_address(), true));
1848 EXPECT_TRUE(WaitForPrivateDnsValidation(tls2.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001849
Mike Yu724f77d2019-08-16 11:14:50 +08001850 const hostent* result = gethostbyname("tlsfailover1");
Ken Chenb9fa2062018-11-13 21:51:13 +08001851 ASSERT_FALSE(result == nullptr);
1852 EXPECT_EQ("1.2.3.1", ToString(result));
1853
1854 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001855 EXPECT_TRUE(tls1.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001856 // No new queries should have reached tls2.
Luke Huang0a0870d2020-02-12 20:41:10 +08001857 EXPECT_TRUE(tls2.waitForQueries(1));
Ken Chenb9fa2062018-11-13 21:51:13 +08001858
1859 // Stop tls1. Subsequent queries should attempt to reach tls1, fail, and retry to tls2.
1860 tls1.stopServer();
1861
1862 result = gethostbyname("tlsfailover2");
1863 EXPECT_EQ("1.2.3.4", ToString(result));
1864
1865 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001866 EXPECT_TRUE(tls2.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001867
1868 // No additional queries should have reached the insecure servers.
1869 EXPECT_EQ(2U, dns1.queries().size());
1870 EXPECT_EQ(2U, dns2.queries().size());
1871
1872 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001873 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Ken Chenb9fa2062018-11-13 21:51:13 +08001874}
1875
1876TEST_F(ResolverTest, GetHostByName_BadTlsName) {
Xiao Ma09b71022018-12-11 17:56:32 +09001877 constexpr char listen_addr[] = "127.0.0.3";
1878 constexpr char listen_udp[] = "53";
1879 constexpr char listen_tls[] = "853";
1880 constexpr char host_name[] = "badtlsname.example.com.";
1881
1882 test::DNSResponder dns;
1883 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.1"}});
Luke Huangf8215372019-11-22 11:53:41 +08001884 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001885
1886 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1887 ASSERT_TRUE(tls.startServer());
Xiao Ma09b71022018-12-11 17:56:32 +09001888 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
waynema0e73c2e2019-07-31 15:04:08 +08001889 kDefaultIncorrectPrivateDnsHostName));
Ken Chenb9fa2062018-11-13 21:51:13 +08001890
waynema0e73c2e2019-07-31 15:04:08 +08001891 // The TLS handshake would fail because the name of TLS server doesn't
1892 // match with TLS server's certificate.
Mike Yu724f77d2019-08-16 11:14:50 +08001893 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), false));
Ken Chenb9fa2062018-11-13 21:51:13 +08001894
1895 // The query should fail hard, because a name was specified.
1896 EXPECT_EQ(nullptr, gethostbyname("badtlsname"));
1897
1898 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001899 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001900}
1901
1902TEST_F(ResolverTest, GetAddrInfo_Tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001903 constexpr char listen_addr[] = "127.0.0.3";
1904 constexpr char listen_udp[] = "53";
1905 constexpr char listen_tls[] = "853";
1906 constexpr char host_name[] = "addrinfotls.example.com.";
1907 const std::vector<DnsRecord> records = {
1908 {host_name, ns_type::ns_t_a, "1.2.3.4"},
1909 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
1910 };
1911
1912 test::DNSResponder dns;
1913 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001914 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001915
1916 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1917 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001918 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1919 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08001920 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001921
1922 dns.clearQueries();
1923 ScopedAddrinfo result = safe_getaddrinfo("addrinfotls", nullptr, nullptr);
1924 EXPECT_TRUE(result != nullptr);
1925 size_t found = GetNumQueries(dns, host_name);
1926 EXPECT_LE(1U, found);
1927 // Could be A or AAAA
1928 std::string result_str = ToString(result);
1929 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +08001930 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08001931 // Wait for both A and AAAA queries to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001932 EXPECT_TRUE(tls.waitForQueries(3));
Ken Chenb9fa2062018-11-13 21:51:13 +08001933
1934 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001935 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001936}
1937
1938TEST_F(ResolverTest, TlsBypass) {
1939 const char OFF[] = "off";
1940 const char OPPORTUNISTIC[] = "opportunistic";
1941 const char STRICT[] = "strict";
1942
1943 const char GETHOSTBYNAME[] = "gethostbyname";
1944 const char GETADDRINFO[] = "getaddrinfo";
1945 const char GETADDRINFOFORNET[] = "getaddrinfofornet";
1946
1947 const unsigned BYPASS_NETID = NETID_USE_LOCAL_NAMESERVERS | TEST_NETID;
1948
Ken Chenb9fa2062018-11-13 21:51:13 +08001949 const char ADDR4[] = "192.0.2.1";
1950 const char ADDR6[] = "2001:db8::1";
1951
1952 const char cleartext_addr[] = "127.0.0.53";
1953 const char cleartext_port[] = "53";
1954 const char tls_port[] = "853";
Luke Huangf8215372019-11-22 11:53:41 +08001955 const std::vector<std::string> servers = {cleartext_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001956
Xiao Ma09b71022018-12-11 17:56:32 +09001957 test::DNSResponder dns(cleartext_addr);
Ken Chenb9fa2062018-11-13 21:51:13 +08001958 ASSERT_TRUE(dns.startServer());
1959
1960 test::DnsTlsFrontend tls(cleartext_addr, tls_port, cleartext_addr, cleartext_port);
Mike Yudd4ac2d2019-05-31 16:52:11 +08001961 ASSERT_TRUE(tls.startServer());
Ken Chenb9fa2062018-11-13 21:51:13 +08001962
Luke Huangf8215372019-11-22 11:53:41 +08001963 // clang-format off
Ken Chenb9fa2062018-11-13 21:51:13 +08001964 struct TestConfig {
1965 const std::string mode;
1966 const bool withWorkingTLS;
1967 const std::string method;
1968
1969 std::string asHostName() const {
Luke Huangf8215372019-11-22 11:53:41 +08001970 return StringPrintf("%s.%s.%s.", mode.c_str(), withWorkingTLS ? "tlsOn" : "tlsOff",
Ken Chenb9fa2062018-11-13 21:51:13 +08001971 method.c_str());
1972 }
1973 } testConfigs[]{
Ken Chenb9fa2062018-11-13 21:51:13 +08001974 {OFF, true, GETHOSTBYNAME},
1975 {OPPORTUNISTIC, true, GETHOSTBYNAME},
1976 {STRICT, true, GETHOSTBYNAME},
Ken Chenb9fa2062018-11-13 21:51:13 +08001977 {OFF, true, GETADDRINFO},
1978 {OPPORTUNISTIC, true, GETADDRINFO},
1979 {STRICT, true, GETADDRINFO},
Ken Chenb9fa2062018-11-13 21:51:13 +08001980 {OFF, true, GETADDRINFOFORNET},
1981 {OPPORTUNISTIC, true, GETADDRINFOFORNET},
1982 {STRICT, true, GETADDRINFOFORNET},
Mike Yudd4ac2d2019-05-31 16:52:11 +08001983 {OFF, false, GETHOSTBYNAME},
1984 {OPPORTUNISTIC, false, GETHOSTBYNAME},
1985 {STRICT, false, GETHOSTBYNAME},
1986 {OFF, false, GETADDRINFO},
1987 {OPPORTUNISTIC, false, GETADDRINFO},
1988 {STRICT, false, GETADDRINFO},
1989 {OFF, false, GETADDRINFOFORNET},
1990 {OPPORTUNISTIC, false, GETADDRINFOFORNET},
1991 {STRICT, false, GETADDRINFOFORNET},
Ken Chenb9fa2062018-11-13 21:51:13 +08001992 };
Luke Huangf8215372019-11-22 11:53:41 +08001993 // clang-format on
Ken Chenb9fa2062018-11-13 21:51:13 +08001994
1995 for (const auto& config : testConfigs) {
1996 const std::string testHostName = config.asHostName();
1997 SCOPED_TRACE(testHostName);
1998
1999 // Don't tempt test bugs due to caching.
2000 const char* host_name = testHostName.c_str();
2001 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
2002 dns.addMapping(host_name, ns_type::ns_t_aaaa, ADDR6);
2003
Mike Yudd4ac2d2019-05-31 16:52:11 +08002004 if (config.withWorkingTLS) {
2005 if (!tls.running()) {
2006 ASSERT_TRUE(tls.startServer());
2007 }
2008 } else {
2009 if (tls.running()) {
2010 ASSERT_TRUE(tls.stopServer());
2011 }
2012 }
Ken Chenb9fa2062018-11-13 21:51:13 +08002013
2014 if (config.mode == OFF) {
Xiao Ma09b71022018-12-11 17:56:32 +09002015 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, kDefaultSearchDomains,
2016 kDefaultParams));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09002017 } else /* OPPORTUNISTIC or STRICT */ {
2018 const char* tls_hostname = (config.mode == STRICT) ? kDefaultPrivateDnsHostName : "";
Xiao Ma09b71022018-12-11 17:56:32 +09002019 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09002020 kDefaultParams, tls_hostname));
Mike Yu724f77d2019-08-16 11:14:50 +08002021
2022 // Wait for the validation event. If the server is running, the validation should
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09002023 // succeed; otherwise, the validation should fail.
Mike Yu724f77d2019-08-16 11:14:50 +08002024 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), config.withWorkingTLS));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09002025 if (config.withWorkingTLS) {
2026 EXPECT_TRUE(tls.waitForQueries(1));
2027 tls.clearQueries();
2028 }
Ken Chenb9fa2062018-11-13 21:51:13 +08002029 }
Ken Chenb9fa2062018-11-13 21:51:13 +08002030
2031 const hostent* h_result = nullptr;
2032 ScopedAddrinfo ai_result;
2033
2034 if (config.method == GETHOSTBYNAME) {
2035 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
2036 h_result = gethostbyname(host_name);
2037
2038 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
2039 ASSERT_FALSE(h_result == nullptr);
2040 ASSERT_EQ(4, h_result->h_length);
2041 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
2042 EXPECT_EQ(ADDR4, ToString(h_result));
2043 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
2044 } else if (config.method == GETADDRINFO) {
2045 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
2046 ai_result = safe_getaddrinfo(host_name, nullptr, nullptr);
2047 EXPECT_TRUE(ai_result != nullptr);
2048
2049 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2050 // Could be A or AAAA
2051 const std::string result_str = ToString(ai_result);
2052 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
Luke Huangf8215372019-11-22 11:53:41 +08002053 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08002054 } else if (config.method == GETADDRINFOFORNET) {
2055 addrinfo* raw_ai_result = nullptr;
2056 EXPECT_EQ(0, android_getaddrinfofornet(host_name, /*servname=*/nullptr,
2057 /*hints=*/nullptr, BYPASS_NETID, MARK_UNSET,
2058 &raw_ai_result));
2059 ai_result.reset(raw_ai_result);
2060
2061 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2062 // Could be A or AAAA
2063 const std::string result_str = ToString(ai_result);
2064 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
Luke Huangf8215372019-11-22 11:53:41 +08002065 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08002066 }
2067
Mike Yudd4ac2d2019-05-31 16:52:11 +08002068 EXPECT_EQ(0, tls.queries());
Ken Chenb9fa2062018-11-13 21:51:13 +08002069
2070 // Clear per-process resolv netid.
2071 ASSERT_EQ(0, setNetworkForResolv(NETID_UNSET));
Ken Chenb9fa2062018-11-13 21:51:13 +08002072 dns.clearQueries();
2073 }
Ken Chenb9fa2062018-11-13 21:51:13 +08002074}
2075
2076TEST_F(ResolverTest, StrictMode_NoTlsServers) {
Xiao Ma09b71022018-12-11 17:56:32 +09002077 constexpr char cleartext_addr[] = "127.0.0.53";
Luke Huangf8215372019-11-22 11:53:41 +08002078 const std::vector<std::string> servers = {cleartext_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002079 constexpr char host_name[] = "strictmode.notlsips.example.com.";
2080 const std::vector<DnsRecord> records = {
2081 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2082 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2083 };
Ken Chenb9fa2062018-11-13 21:51:13 +08002084
Xiao Ma09b71022018-12-11 17:56:32 +09002085 test::DNSResponder dns(cleartext_addr);
2086 StartDns(dns, records);
Ken Chenb9fa2062018-11-13 21:51:13 +08002087
waynema0e73c2e2019-07-31 15:04:08 +08002088 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
2089 kDefaultIncorrectPrivateDnsHostName));
Ken Chenb9fa2062018-11-13 21:51:13 +08002090
2091 addrinfo* ai_result = nullptr;
2092 EXPECT_NE(0, getaddrinfo(host_name, nullptr, nullptr, &ai_result));
2093 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
2094}
Luke Huang94b10b92018-11-21 20:13:38 +08002095
2096namespace {
2097
Luke Huang70931aa2019-01-31 11:57:41 +08002098int getAsyncResponse(int fd, int* rcode, uint8_t* buf, int bufLen) {
Luke Huang94b10b92018-11-21 20:13:38 +08002099 struct pollfd wait_fd[1];
2100 wait_fd[0].fd = fd;
2101 wait_fd[0].events = POLLIN;
2102 short revents;
2103 int ret;
2104
2105 ret = poll(wait_fd, 1, -1);
2106 revents = wait_fd[0].revents;
2107 if (revents & POLLIN) {
Mike Yub3505422020-10-15 16:10:41 +08002108 return resNetworkResult(fd, rcode, buf, bufLen);
Luke Huang94b10b92018-11-21 20:13:38 +08002109 }
2110 return -1;
2111}
2112
Luke Huang70931aa2019-01-31 11:57:41 +08002113std::string toString(uint8_t* buf, int bufLen, int ipType) {
Luke Huang94b10b92018-11-21 20:13:38 +08002114 ns_msg handle;
2115 int ancount, n = 0;
2116 ns_rr rr;
2117
Luke Huangf8215372019-11-22 11:53:41 +08002118 if (ns_initparse((const uint8_t*)buf, bufLen, &handle) >= 0) {
Luke Huang94b10b92018-11-21 20:13:38 +08002119 ancount = ns_msg_count(handle, ns_s_an);
2120 if (ns_parserr(&handle, ns_s_an, n, &rr) == 0) {
Luke Huang70931aa2019-01-31 11:57:41 +08002121 const uint8_t* rdata = ns_rr_rdata(rr);
Luke Huang94b10b92018-11-21 20:13:38 +08002122 char buffer[INET6_ADDRSTRLEN];
Luke Huangf8215372019-11-22 11:53:41 +08002123 if (inet_ntop(ipType, (const char*)rdata, buffer, sizeof(buffer))) {
Luke Huang94b10b92018-11-21 20:13:38 +08002124 return buffer;
2125 }
2126 }
2127 }
2128 return "";
2129}
2130
2131int dns_open_proxy() {
2132 int s = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
2133 if (s == -1) {
2134 return -1;
2135 }
2136 const int one = 1;
2137 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
2138
2139 static const struct sockaddr_un proxy_addr = {
2140 .sun_family = AF_UNIX,
2141 .sun_path = "/dev/socket/dnsproxyd",
2142 };
2143
Luke Huangf8215372019-11-22 11:53:41 +08002144 if (TEMP_FAILURE_RETRY(connect(s, (const struct sockaddr*)&proxy_addr, sizeof(proxy_addr))) !=
Luke Huang94b10b92018-11-21 20:13:38 +08002145 0) {
2146 close(s);
2147 return -1;
2148 }
2149
2150 return s;
2151}
2152
Luke Huangba7bef92018-12-26 16:53:03 +08002153void expectAnswersValid(int fd, int ipType, const std::string& expectedAnswer) {
2154 int rcode = -1;
2155 uint8_t buf[MAXPACKET] = {};
2156
2157 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2158 EXPECT_GT(res, 0);
2159 EXPECT_EQ(expectedAnswer, toString(buf, res, ipType));
2160}
2161
2162void expectAnswersNotValid(int fd, int expectedErrno) {
2163 int rcode = -1;
2164 uint8_t buf[MAXPACKET] = {};
2165
2166 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2167 EXPECT_EQ(expectedErrno, res);
2168}
2169
Luke Huang94b10b92018-11-21 20:13:38 +08002170} // namespace
2171
2172TEST_F(ResolverTest, Async_NormalQueryV4V6) {
Xiao Ma09b71022018-12-11 17:56:32 +09002173 constexpr char listen_addr[] = "127.0.0.4";
2174 constexpr char host_name[] = "howdy.example.com.";
2175 const std::vector<DnsRecord> records = {
2176 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2177 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2178 };
2179
2180 test::DNSResponder dns(listen_addr);
2181 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002182 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002183 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002184
Luke Huangba7bef92018-12-26 16:53:03 +08002185 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2186 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002187 EXPECT_TRUE(fd1 != -1);
2188 EXPECT_TRUE(fd2 != -1);
2189
Luke Huang70931aa2019-01-31 11:57:41 +08002190 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002191 int rcode;
2192 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2193 EXPECT_GT(res, 0);
2194 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
2195
2196 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2197 EXPECT_GT(res, 0);
2198 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2199
2200 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
2201
2202 // Re-query verify cache works
Luke Huangba7bef92018-12-26 16:53:03 +08002203 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2204 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002205
2206 EXPECT_TRUE(fd1 != -1);
2207 EXPECT_TRUE(fd2 != -1);
2208
2209 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2210 EXPECT_GT(res, 0);
2211 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
2212
2213 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2214 EXPECT_GT(res, 0);
2215 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2216
2217 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
2218}
2219
2220TEST_F(ResolverTest, Async_BadQuery) {
Xiao Ma09b71022018-12-11 17:56:32 +09002221 constexpr char listen_addr[] = "127.0.0.4";
2222 constexpr char host_name[] = "howdy.example.com.";
2223 const std::vector<DnsRecord> records = {
2224 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2225 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2226 };
2227
2228 test::DNSResponder dns(listen_addr);
2229 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002230 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002231 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002232
2233 static struct {
2234 int fd;
2235 const char* dname;
2236 const int queryType;
2237 const int expectRcode;
2238 } kTestData[] = {
Luke Huangba7bef92018-12-26 16:53:03 +08002239 {-1, "", ns_t_aaaa, 0},
2240 {-1, "as65ass46", ns_t_aaaa, 0},
2241 {-1, "454564564564", ns_t_aaaa, 0},
2242 {-1, "h645235", ns_t_a, 0},
2243 {-1, "www.google.com", ns_t_a, 0},
Luke Huang94b10b92018-11-21 20:13:38 +08002244 };
2245
2246 for (auto& td : kTestData) {
2247 SCOPED_TRACE(td.dname);
Luke Huangba7bef92018-12-26 16:53:03 +08002248 td.fd = resNetworkQuery(TEST_NETID, td.dname, ns_c_in, td.queryType, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002249 EXPECT_TRUE(td.fd != -1);
2250 }
2251
2252 // dns_responder return empty resp(packet only contains query part) with no error currently
2253 for (const auto& td : kTestData) {
Luke Huang70931aa2019-01-31 11:57:41 +08002254 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002255 int rcode;
2256 SCOPED_TRACE(td.dname);
2257 int res = getAsyncResponse(td.fd, &rcode, buf, MAXPACKET);
2258 EXPECT_GT(res, 0);
2259 EXPECT_EQ(rcode, td.expectRcode);
2260 }
2261}
2262
2263TEST_F(ResolverTest, Async_EmptyAnswer) {
Xiao Ma09b71022018-12-11 17:56:32 +09002264 constexpr char listen_addr[] = "127.0.0.4";
2265 constexpr char host_name[] = "howdy.example.com.";
2266 const std::vector<DnsRecord> records = {
2267 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2268 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2269 };
2270
2271 test::DNSResponder dns(listen_addr);
2272 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002273 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002274 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002275
Luke Huang9c264bb2018-12-18 16:44:41 +08002276 // TODO: Disable retry to make this test explicit.
2277 auto& cv = dns.getCv();
2278 auto& cvMutex = dns.getCvMutex();
2279 int fd1;
2280 // Wait on the condition variable to ensure that the DNS server has handled our first query.
2281 {
2282 std::unique_lock lk(cvMutex);
Luke Huangba7bef92018-12-26 16:53:03 +08002283 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang9c264bb2018-12-18 16:44:41 +08002284 EXPECT_TRUE(fd1 != -1);
2285 EXPECT_EQ(std::cv_status::no_timeout, cv.wait_for(lk, std::chrono::seconds(1)));
2286 }
Luke Huang94b10b92018-11-21 20:13:38 +08002287
Luke Huang94b10b92018-11-21 20:13:38 +08002288 dns.setResponseProbability(0.0);
Luke Huang94b10b92018-11-21 20:13:38 +08002289
Luke Huangba7bef92018-12-26 16:53:03 +08002290 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002291 EXPECT_TRUE(fd2 != -1);
2292
Luke Huangba7bef92018-12-26 16:53:03 +08002293 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002294 EXPECT_TRUE(fd3 != -1);
2295
Luke Huang9c264bb2018-12-18 16:44:41 +08002296 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002297 int rcode;
2298
Luke Huang9c264bb2018-12-18 16:44:41 +08002299 // expect no response
2300 int res = getAsyncResponse(fd3, &rcode, buf, MAXPACKET);
2301 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huang94b10b92018-11-21 20:13:38 +08002302
Luke Huang9c264bb2018-12-18 16:44:41 +08002303 // expect no response
Luke Huang94b10b92018-11-21 20:13:38 +08002304 memset(buf, 0, MAXPACKET);
Luke Huang9c264bb2018-12-18 16:44:41 +08002305 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2306 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huang94b10b92018-11-21 20:13:38 +08002307
Luke Huang94b10b92018-11-21 20:13:38 +08002308 dns.setResponseProbability(1.0);
Luke Huang94b10b92018-11-21 20:13:38 +08002309
Luke Huangba7bef92018-12-26 16:53:03 +08002310 int fd4 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002311 EXPECT_TRUE(fd4 != -1);
2312
2313 memset(buf, 0, MAXPACKET);
2314 res = getAsyncResponse(fd4, &rcode, buf, MAXPACKET);
2315 EXPECT_GT(res, 0);
2316 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2317
2318 memset(buf, 0, MAXPACKET);
2319 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2320 EXPECT_GT(res, 0);
2321 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
Mike Yu532405f2020-06-17 17:46:44 +08002322
2323 // Trailing dot is removed. Is it intended?
2324 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, 0, "howdy.example.com", {"::1.2.3.4"});
2325 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2326 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2327 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, 0, "howdy.example.com", {"1.2.3.4"});
Luke Huang94b10b92018-11-21 20:13:38 +08002328}
2329
2330TEST_F(ResolverTest, Async_MalformedQuery) {
Xiao Ma09b71022018-12-11 17:56:32 +09002331 constexpr char listen_addr[] = "127.0.0.4";
2332 constexpr char host_name[] = "howdy.example.com.";
2333 const std::vector<DnsRecord> records = {
2334 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2335 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2336 };
2337
2338 test::DNSResponder dns(listen_addr);
2339 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002340 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002341 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002342
2343 int fd = dns_open_proxy();
2344 EXPECT_TRUE(fd > 0);
2345
2346 const std::string badMsg = "16-52512#";
Xiao Ma09b71022018-12-11 17:56:32 +09002347 static const struct {
Luke Huang94b10b92018-11-21 20:13:38 +08002348 const std::string cmd;
2349 const int expectErr;
2350 } kTestData[] = {
Luke Huangba7bef92018-12-26 16:53:03 +08002351 // Too few arguments
Luke Huang94b10b92018-11-21 20:13:38 +08002352 {"resnsend " + badMsg + '\0', -EINVAL},
2353 // Bad netId
Luke Huangba7bef92018-12-26 16:53:03 +08002354 {"resnsend badnetId 0 " + badMsg + '\0', -EINVAL},
Luke Huang94b10b92018-11-21 20:13:38 +08002355 // Bad raw data
Luke Huangba7bef92018-12-26 16:53:03 +08002356 {"resnsend " + std::to_string(TEST_NETID) + " 0 " + badMsg + '\0', -EILSEQ},
Luke Huang94b10b92018-11-21 20:13:38 +08002357 };
2358
2359 for (unsigned int i = 0; i < std::size(kTestData); i++) {
2360 auto& td = kTestData[i];
2361 SCOPED_TRACE(td.cmd);
2362 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, td.cmd.c_str(), td.cmd.size()));
2363 EXPECT_EQ(rc, static_cast<ssize_t>(td.cmd.size()));
2364
2365 int32_t tmp;
2366 rc = TEMP_FAILURE_RETRY(read(fd, &tmp, sizeof(tmp)));
2367 EXPECT_TRUE(rc > 0);
2368 EXPECT_EQ(static_cast<int>(ntohl(tmp)), td.expectErr);
2369 }
2370 // Normal query with answer buffer
2371 // This is raw data of query "howdy.example.com" type 1 class 1
2372 std::string query = "81sBAAABAAAAAAAABWhvd2R5B2V4YW1wbGUDY29tAAABAAE=";
Luke Huangba7bef92018-12-26 16:53:03 +08002373 std::string cmd = "resnsend " + std::to_string(TEST_NETID) + " 0 " + query + '\0';
Luke Huang94b10b92018-11-21 20:13:38 +08002374 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
2375 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
2376
Luke Huang70931aa2019-01-31 11:57:41 +08002377 uint8_t smallBuf[1] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002378 int rcode;
2379 rc = getAsyncResponse(fd, &rcode, smallBuf, 1);
Luke Huangba7bef92018-12-26 16:53:03 +08002380 EXPECT_EQ(-EMSGSIZE, rc);
Luke Huang94b10b92018-11-21 20:13:38 +08002381
2382 // Do the normal test with large buffer again
2383 fd = dns_open_proxy();
2384 EXPECT_TRUE(fd > 0);
2385 rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
2386 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
Luke Huang70931aa2019-01-31 11:57:41 +08002387 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002388 rc = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2389 EXPECT_EQ("1.2.3.4", toString(buf, rc, AF_INET));
Mike Yu4f3747b2018-12-02 17:54:29 +09002390}
2391
Luke Huangba7bef92018-12-26 16:53:03 +08002392TEST_F(ResolverTest, Async_CacheFlags) {
Xiao Ma09b71022018-12-11 17:56:32 +09002393 constexpr char listen_addr[] = "127.0.0.4";
Luke Huang4eabbe32020-05-28 03:17:32 +08002394 constexpr char host_name1[] = "howdy.example.com.";
2395 constexpr char host_name2[] = "howdy.example2.com.";
2396 constexpr char host_name3[] = "howdy.example3.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002397 const std::vector<DnsRecord> records = {
Luke Huang4eabbe32020-05-28 03:17:32 +08002398 {host_name1, ns_type::ns_t_a, "1.2.3.4"}, {host_name1, ns_type::ns_t_aaaa, "::1.2.3.4"},
2399 {host_name2, ns_type::ns_t_a, "1.2.3.5"}, {host_name2, ns_type::ns_t_aaaa, "::1.2.3.5"},
2400 {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 +09002401 };
2402
2403 test::DNSResponder dns(listen_addr);
2404 StartDns(dns, records);
Luke Huangba7bef92018-12-26 16:53:03 +08002405 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002406 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huangba7bef92018-12-26 16:53:03 +08002407
2408 // ANDROID_RESOLV_NO_CACHE_STORE
2409 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2410 ANDROID_RESOLV_NO_CACHE_STORE);
2411 EXPECT_TRUE(fd1 != -1);
2412 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2413 ANDROID_RESOLV_NO_CACHE_STORE);
2414 EXPECT_TRUE(fd2 != -1);
2415 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2416 ANDROID_RESOLV_NO_CACHE_STORE);
2417 EXPECT_TRUE(fd3 != -1);
2418
2419 expectAnswersValid(fd3, AF_INET, "1.2.3.4");
2420 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
2421 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2422
2423 // No cache exists, expect 3 queries
Luke Huang4eabbe32020-05-28 03:17:32 +08002424 EXPECT_EQ(3U, GetNumQueries(dns, host_name1));
Luke Huangba7bef92018-12-26 16:53:03 +08002425
Luke Huang4eabbe32020-05-28 03:17:32 +08002426 // Raise a query with no flags to ensure no cache exists. Also make an cache entry for the
2427 // query.
Luke Huangba7bef92018-12-26 16:53:03 +08002428 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2429
2430 EXPECT_TRUE(fd1 != -1);
2431
2432 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2433
Luke Huang4eabbe32020-05-28 03:17:32 +08002434 // Expect 4 queries because there should be no cache before this query.
2435 EXPECT_EQ(4U, GetNumQueries(dns, host_name1));
2436
2437 // Now we have the cache entry, re-query with ANDROID_RESOLV_NO_CACHE_STORE to ensure
2438 // that ANDROID_RESOLV_NO_CACHE_STORE implied ANDROID_RESOLV_NO_CACHE_LOOKUP.
2439 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2440 ANDROID_RESOLV_NO_CACHE_STORE);
2441 EXPECT_TRUE(fd1 != -1);
2442 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2443 // Expect 5 queries because we shouldn't do cache lookup for the query which has
2444 // ANDROID_RESOLV_NO_CACHE_STORE.
2445 EXPECT_EQ(5U, GetNumQueries(dns, host_name1));
Luke Huangba7bef92018-12-26 16:53:03 +08002446
2447 // ANDROID_RESOLV_NO_CACHE_LOOKUP
2448 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2449 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2450 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2451 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2452
2453 EXPECT_TRUE(fd1 != -1);
2454 EXPECT_TRUE(fd2 != -1);
2455
2456 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
2457 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2458
Luke Huang4eabbe32020-05-28 03:17:32 +08002459 // Cache was skipped, expect 2 more queries.
2460 EXPECT_EQ(7U, GetNumQueries(dns, host_name1));
Luke Huangba7bef92018-12-26 16:53:03 +08002461
2462 // Re-query verify cache works
Luke Huang4eabbe32020-05-28 03:17:32 +08002463 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huangba7bef92018-12-26 16:53:03 +08002464 EXPECT_TRUE(fd1 != -1);
2465 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2466
Luke Huang4eabbe32020-05-28 03:17:32 +08002467 // Cache hits, expect still 7 queries
2468 EXPECT_EQ(7U, GetNumQueries(dns, host_name1));
Luke Huanga1d74182019-03-19 17:30:36 +08002469
2470 // Start to verify if ANDROID_RESOLV_NO_CACHE_LOOKUP does write response into cache
2471 dns.clearQueries();
2472
Luke Huang4eabbe32020-05-28 03:17:32 +08002473 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa,
Luke Huanga1d74182019-03-19 17:30:36 +08002474 ANDROID_RESOLV_NO_CACHE_LOOKUP);
Luke Huang4eabbe32020-05-28 03:17:32 +08002475 fd2 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa,
Luke Huanga1d74182019-03-19 17:30:36 +08002476 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2477
2478 EXPECT_TRUE(fd1 != -1);
2479 EXPECT_TRUE(fd2 != -1);
2480
Luke Huang4eabbe32020-05-28 03:17:32 +08002481 expectAnswersValid(fd2, AF_INET6, "::1.2.3.5");
2482 expectAnswersValid(fd1, AF_INET6, "::1.2.3.5");
Luke Huanga1d74182019-03-19 17:30:36 +08002483
2484 // Skip cache, expect 2 queries
Luke Huang4eabbe32020-05-28 03:17:32 +08002485 EXPECT_EQ(2U, GetNumQueries(dns, host_name2));
Luke Huanga1d74182019-03-19 17:30:36 +08002486
2487 // Re-query without flags
Luke Huang4eabbe32020-05-28 03:17:32 +08002488 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa, 0);
2489 fd2 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa, 0);
Luke Huanga1d74182019-03-19 17:30:36 +08002490
2491 EXPECT_TRUE(fd1 != -1);
2492 EXPECT_TRUE(fd2 != -1);
2493
Luke Huang4eabbe32020-05-28 03:17:32 +08002494 expectAnswersValid(fd2, AF_INET6, "::1.2.3.5");
2495 expectAnswersValid(fd1, AF_INET6, "::1.2.3.5");
Luke Huanga1d74182019-03-19 17:30:36 +08002496
2497 // Cache hits, expect still 2 queries
Luke Huang4eabbe32020-05-28 03:17:32 +08002498 EXPECT_EQ(2U, GetNumQueries(dns, host_name2));
Luke Huang40f5f492019-05-09 19:37:35 +08002499
2500 // Test both ANDROID_RESOLV_NO_CACHE_STORE and ANDROID_RESOLV_NO_CACHE_LOOKUP are set
2501 dns.clearQueries();
2502
Luke Huang4eabbe32020-05-28 03:17:32 +08002503 // Make sure that the cache of "howdy.example3.com" exists.
2504 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang40f5f492019-05-09 19:37:35 +08002505 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002506 expectAnswersValid(fd1, AF_INET6, "::1.2.3.6");
2507 EXPECT_EQ(1U, GetNumQueries(dns, host_name3));
Luke Huang40f5f492019-05-09 19:37:35 +08002508
2509 // Re-query with testFlags
2510 const int testFlag = ANDROID_RESOLV_NO_CACHE_STORE | ANDROID_RESOLV_NO_CACHE_LOOKUP;
Luke Huang4eabbe32020-05-28 03:17:32 +08002511 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_aaaa, testFlag);
Luke Huang40f5f492019-05-09 19:37:35 +08002512 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002513 expectAnswersValid(fd1, AF_INET6, "::1.2.3.6");
Luke Huang40f5f492019-05-09 19:37:35 +08002514 // Expect cache lookup is skipped.
Luke Huang4eabbe32020-05-28 03:17:32 +08002515 EXPECT_EQ(2U, GetNumQueries(dns, host_name3));
Luke Huang40f5f492019-05-09 19:37:35 +08002516
2517 // Do another query with testFlags
Luke Huang4eabbe32020-05-28 03:17:32 +08002518 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_a, testFlag);
Luke Huang40f5f492019-05-09 19:37:35 +08002519 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002520 expectAnswersValid(fd1, AF_INET, "1.2.3.6");
Luke Huang40f5f492019-05-09 19:37:35 +08002521 // Expect cache lookup is skipped.
Luke Huang4eabbe32020-05-28 03:17:32 +08002522 EXPECT_EQ(3U, GetNumQueries(dns, host_name3));
Luke Huang40f5f492019-05-09 19:37:35 +08002523
2524 // Re-query with no flags
Luke Huang4eabbe32020-05-28 03:17:32 +08002525 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_a, 0);
Luke Huang40f5f492019-05-09 19:37:35 +08002526 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002527 expectAnswersValid(fd1, AF_INET, "1.2.3.6");
Luke Huang40f5f492019-05-09 19:37:35 +08002528 // Expect no cache hit because cache storing is also skipped in previous query.
Luke Huang4eabbe32020-05-28 03:17:32 +08002529 EXPECT_EQ(4U, GetNumQueries(dns, host_name3));
Luke Huangba7bef92018-12-26 16:53:03 +08002530}
2531
Luke Huang08b13d22020-02-05 14:46:21 +08002532TEST_F(ResolverTest, Async_NoCacheStoreFlagDoesNotRefreshStaleCacheEntry) {
2533 constexpr char listen_addr[] = "127.0.0.4";
2534 constexpr char host_name[] = "howdy.example.com.";
2535 const std::vector<DnsRecord> records = {
2536 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2537 };
2538
2539 test::DNSResponder dns(listen_addr);
2540 StartDns(dns, records);
2541 std::vector<std::string> servers = {listen_addr};
2542 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
2543
2544 const unsigned SHORT_TTL_SEC = 1;
2545 dns.setTtl(SHORT_TTL_SEC);
2546
2547 // Refer to b/148842821 for the purpose of below test steps.
2548 // Basically, this test is used to ensure stale cache case is handled
2549 // correctly with ANDROID_RESOLV_NO_CACHE_STORE.
2550 int fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2551 EXPECT_TRUE(fd != -1);
2552 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2553
2554 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2555 dns.clearQueries();
2556
2557 // Wait until cache expired
2558 sleep(SHORT_TTL_SEC + 0.5);
2559
2560 // Now request the same hostname again.
2561 // We should see a new DNS query because the entry in cache has become stale.
2562 // Due to ANDROID_RESOLV_NO_CACHE_STORE, this query must *not* refresh that stale entry.
2563 fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2564 ANDROID_RESOLV_NO_CACHE_STORE);
2565 EXPECT_TRUE(fd != -1);
2566 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2567 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2568 dns.clearQueries();
2569
2570 // If the cache is still stale, we expect to see one more DNS query
2571 // (this time the cache will be refreshed, but we're not checking for it).
2572 fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2573 EXPECT_TRUE(fd != -1);
2574 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2575 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2576}
2577
Luke Huangba7bef92018-12-26 16:53:03 +08002578TEST_F(ResolverTest, Async_NoRetryFlag) {
Luke Huang70931aa2019-01-31 11:57:41 +08002579 constexpr char listen_addr0[] = "127.0.0.4";
2580 constexpr char listen_addr1[] = "127.0.0.6";
Xiao Ma09b71022018-12-11 17:56:32 +09002581 constexpr char host_name[] = "howdy.example.com.";
2582 const std::vector<DnsRecord> records = {
2583 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2584 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2585 };
2586
Luke Huang70931aa2019-01-31 11:57:41 +08002587 test::DNSResponder dns0(listen_addr0);
2588 test::DNSResponder dns1(listen_addr1);
2589 StartDns(dns0, records);
2590 StartDns(dns1, records);
2591 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr0, listen_addr1}));
Luke Huangba7bef92018-12-26 16:53:03 +08002592
Luke Huang70931aa2019-01-31 11:57:41 +08002593 dns0.clearQueries();
2594 dns1.clearQueries();
2595
2596 dns0.setResponseProbability(0.0);
2597 dns1.setResponseProbability(0.0);
Luke Huangba7bef92018-12-26 16:53:03 +08002598
2599 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2600 ANDROID_RESOLV_NO_RETRY);
2601 EXPECT_TRUE(fd1 != -1);
2602
2603 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa,
2604 ANDROID_RESOLV_NO_RETRY);
2605 EXPECT_TRUE(fd2 != -1);
2606
2607 // expect no response
2608 expectAnswersNotValid(fd1, -ETIMEDOUT);
2609 expectAnswersNotValid(fd2, -ETIMEDOUT);
Mike Yu532405f2020-06-17 17:46:44 +08002610 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2611 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
Luke Huangba7bef92018-12-26 16:53:03 +08002612
Luke Huang70931aa2019-01-31 11:57:41 +08002613 // No retry case, expect total 2 queries. The server is selected randomly.
2614 EXPECT_EQ(2U, GetNumQueries(dns0, host_name) + GetNumQueries(dns1, host_name));
Luke Huangba7bef92018-12-26 16:53:03 +08002615
Luke Huang70931aa2019-01-31 11:57:41 +08002616 dns0.clearQueries();
2617 dns1.clearQueries();
Luke Huangba7bef92018-12-26 16:53:03 +08002618
2619 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2620 EXPECT_TRUE(fd1 != -1);
2621
2622 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
2623 EXPECT_TRUE(fd2 != -1);
2624
2625 // expect no response
2626 expectAnswersNotValid(fd1, -ETIMEDOUT);
2627 expectAnswersNotValid(fd2, -ETIMEDOUT);
Mike Yu532405f2020-06-17 17:46:44 +08002628 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2629 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
Luke Huangba7bef92018-12-26 16:53:03 +08002630
2631 // Retry case, expect 4 queries
Luke Huang70931aa2019-01-31 11:57:41 +08002632 EXPECT_EQ(4U, GetNumQueries(dns0, host_name));
2633 EXPECT_EQ(4U, GetNumQueries(dns1, host_name));
2634}
2635
2636TEST_F(ResolverTest, Async_VerifyQueryID) {
2637 constexpr char listen_addr[] = "127.0.0.4";
2638 constexpr char host_name[] = "howdy.example.com.";
2639 const std::vector<DnsRecord> records = {
2640 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2641 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2642 };
2643
2644 test::DNSResponder dns(listen_addr);
2645 StartDns(dns, records);
2646 std::vector<std::string> servers = {listen_addr};
2647 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
2648
2649 const uint8_t queryBuf1[] = {
2650 /* Header */
2651 0x55, 0x66, /* Transaction ID */
2652 0x01, 0x00, /* Flags */
2653 0x00, 0x01, /* Questions */
2654 0x00, 0x00, /* Answer RRs */
2655 0x00, 0x00, /* Authority RRs */
2656 0x00, 0x00, /* Additional RRs */
2657 /* Queries */
2658 0x05, 0x68, 0x6f, 0x77, 0x64, 0x79, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
2659 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name */
2660 0x00, 0x01, /* Type */
2661 0x00, 0x01 /* Class */
2662 };
2663
2664 int fd = resNetworkSend(TEST_NETID, queryBuf1, sizeof(queryBuf1), 0);
2665 EXPECT_TRUE(fd != -1);
2666
2667 uint8_t buf[MAXPACKET] = {};
2668 int rcode;
2669
2670 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2671 EXPECT_GT(res, 0);
2672 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2673
2674 auto hp = reinterpret_cast<HEADER*>(buf);
2675 EXPECT_EQ(21862U, htons(hp->id));
2676
2677 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2678
2679 const uint8_t queryBuf2[] = {
2680 /* Header */
2681 0x00, 0x53, /* Transaction ID */
2682 0x01, 0x00, /* Flags */
2683 0x00, 0x01, /* Questions */
2684 0x00, 0x00, /* Answer RRs */
2685 0x00, 0x00, /* Authority RRs */
2686 0x00, 0x00, /* Additional RRs */
2687 /* Queries */
2688 0x05, 0x68, 0x6f, 0x77, 0x64, 0x79, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
2689 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name */
2690 0x00, 0x01, /* Type */
2691 0x00, 0x01 /* Class */
2692 };
2693
2694 // Re-query verify cache works and query id is correct
2695 fd = resNetworkSend(TEST_NETID, queryBuf2, sizeof(queryBuf2), 0);
2696
2697 EXPECT_TRUE(fd != -1);
2698
2699 res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2700 EXPECT_GT(res, 0);
2701 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2702
2703 EXPECT_EQ(0x0053U, htons(hp->id));
2704
2705 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
Luke Huangba7bef92018-12-26 16:53:03 +08002706}
2707
Ken Chencb016932020-11-04 07:26:53 +08002708// Run a large number of DNS queries through asynchronous API to create
2709// thousands of threads in resolver to simulate the failure of thread creation
2710// when memory per process is exhausted. (The current critical value is about
2711// 84xx threads.)
2712TEST_F(ResolverTest, Async_OutOfMemory) {
2713 constexpr char host_name[] = "howdy.example.com.";
2714 constexpr size_t AMOUNT_OF_UIDS = 40;
2715 constexpr size_t MAX_QUERIES_PER_UID = 256;
2716 constexpr size_t NUM_OF_QUERIES = AMOUNT_OF_UIDS * MAX_QUERIES_PER_UID;
2717
2718 test::DNSResponder dns;
2719 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.4"}});
2720 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
2721 dns.setDeferredResp(true);
2722
2723 std::vector<int> fds;
2724 fds.reserve(NUM_OF_QUERIES);
2725 bool send_query = true;
2726 for (size_t i = 0; i < AMOUNT_OF_UIDS && send_query; i++) {
2727 ScopedChangeUID scopedChangeUID(TEST_UID - i);
2728 for (size_t j = 0; j < MAX_QUERIES_PER_UID; j++) {
2729 int fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2730 if (fd >= 0) {
2731 fds.emplace_back(fd);
2732 } else {
2733 send_query = false;
2734 break;
2735 }
2736 }
2737 }
2738
2739 dns.setDeferredResp(false);
2740 EXPECT_EQ(NUM_OF_QUERIES, fds.size());
2741 // TODO: AIBinder_DeathRecipient_new does not work (b/172178636), which
2742 // should be fixed. Fortunately, netd crash is still detectable at the point
2743 // of DumpResolverService() in TearDown(), where accesses mDnsClient. Also,
2744 // the fds size will be less than NUM_OF_QUERIES in that case.
2745
2746 uint8_t buf[MAXPACKET];
2747 int rcode;
2748 for (auto fd : fds) {
2749 memset(buf, 0, MAXPACKET);
2750 getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2751 // The results of each DNS query are not examined, since they won't all
2752 // succeed or all fail. Here we only focus on netd is crashed or not.
2753 }
2754}
2755
Mike Yu4f3747b2018-12-02 17:54:29 +09002756// This test checks that the resolver should not generate the request containing OPT RR when using
Ken Chen0a015532019-01-02 14:59:38 +08002757// cleartext DNS. If we query the DNS server not supporting EDNS0 and it reponds with
2758// FORMERR_ON_EDNS, we will fallback to no EDNS0 and try again. If the server does no response, we
2759// won't retry so that we get no answer.
Mike Yu4f3747b2018-12-02 17:54:29 +09002760TEST_F(ResolverTest, BrokenEdns) {
2761 typedef test::DNSResponder::Edns Edns;
2762 enum ExpectResult { EXPECT_FAILURE, EXPECT_SUCCESS };
2763
Mike Yu3977d482020-02-26 17:18:57 +08002764 // Perform cleartext query in off mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002765 const char OFF[] = "off";
Mike Yu3977d482020-02-26 17:18:57 +08002766
2767 // Perform cleartext query when there's no private DNS server validated in opportunistic mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002768 const char OPPORTUNISTIC_UDP[] = "opportunistic_udp";
Mike Yu3977d482020-02-26 17:18:57 +08002769
2770 // Perform cleartext query when there is a private DNS server validated in opportunistic mode.
2771 const char OPPORTUNISTIC_FALLBACK_UDP[] = "opportunistic_fallback_udp";
2772
2773 // Perform cyphertext query in opportunistic mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002774 const char OPPORTUNISTIC_TLS[] = "opportunistic_tls";
Mike Yu3977d482020-02-26 17:18:57 +08002775
2776 // Perform cyphertext query in strict mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002777 const char STRICT[] = "strict";
Mike Yu3977d482020-02-26 17:18:57 +08002778
Mike Yu4f3747b2018-12-02 17:54:29 +09002779 const char GETHOSTBYNAME[] = "gethostbyname";
2780 const char GETADDRINFO[] = "getaddrinfo";
Mike Yu4f3747b2018-12-02 17:54:29 +09002781 const char ADDR4[] = "192.0.2.1";
2782 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2783 const char CLEARTEXT_PORT[] = "53";
2784 const char TLS_PORT[] = "853";
Luke Huangf8215372019-11-22 11:53:41 +08002785 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
Mike Yu3977d482020-02-26 17:18:57 +08002786 ResolverParamsParcel paramsForCleanup = DnsResponderClient::GetDefaultResolverParamsParcel();
2787 paramsForCleanup.servers.clear();
2788 paramsForCleanup.tlsServers.clear();
Mike Yu4f3747b2018-12-02 17:54:29 +09002789
Mike Yufc125e42019-05-15 20:41:28 +08002790 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Mike Yu4f3747b2018-12-02 17:54:29 +09002791 ASSERT_TRUE(dns.startServer());
2792
2793 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2794
Luke Huangf8215372019-11-22 11:53:41 +08002795 // clang-format off
Mike Yu4f3747b2018-12-02 17:54:29 +09002796 static const struct TestConfig {
2797 std::string mode;
2798 std::string method;
2799 Edns edns;
2800 ExpectResult expectResult;
2801
2802 std::string asHostName() const {
2803 const char* ednsString;
2804 switch (edns) {
2805 case Edns::ON:
2806 ednsString = "ednsOn";
2807 break;
Ken Chen0a015532019-01-02 14:59:38 +08002808 case Edns::FORMERR_ON_EDNS:
Mike Yu4f3747b2018-12-02 17:54:29 +09002809 ednsString = "ednsFormerr";
2810 break;
2811 case Edns::DROP:
2812 ednsString = "ednsDrop";
2813 break;
2814 default:
2815 ednsString = "";
2816 break;
2817 }
2818 return StringPrintf("%s.%s.%s.", mode.c_str(), method.c_str(), ednsString);
2819 }
2820 } testConfigs[] = {
Mike Yu3977d482020-02-26 17:18:57 +08002821 // In OPPORTUNISTIC_TLS, if the DNS server doesn't support EDNS0 but TLS, the lookup
2822 // fails. Could such server exist? if so, we might need to fix it to fallback to
2823 // cleartext query. If the server still make no response for the queries with EDNS0, we
2824 // might also need to fix it to retry without EDNS0.
Mike Yu4f3747b2018-12-02 17:54:29 +09002825 // Another thing is that {OPPORTUNISTIC_TLS, Edns::DROP} and {STRICT, Edns::DROP} are
2826 // commented out since TLS timeout is not configurable.
2827 // TODO: Uncomment them after TLS timeout is configurable.
Mike Yu3977d482020-02-26 17:18:57 +08002828 {OFF, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2829 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2830 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2831 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2832 {STRICT, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2833 {OFF, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2834 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2835 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2836 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2837 {STRICT, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2838 {OFF, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2839 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2840
2841 // The failure is due to no retry on timeout. Maybe fix it?
2842 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2843
2844 //{OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2845 //{STRICT, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2846 {OFF, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2847 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2848 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2849 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2850 {STRICT, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2851 {OFF, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2852 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2853 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2854 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2855 {STRICT, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2856 {OFF, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2857 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2858
2859 // The failure is due to no retry on timeout. Maybe fix it?
2860 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2861
Mike Yu4f3747b2018-12-02 17:54:29 +09002862 //{OPPORTUNISTIC_TLS, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2863 //{STRICT, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2864 };
Luke Huangf8215372019-11-22 11:53:41 +08002865 // clang-format on
Mike Yu4f3747b2018-12-02 17:54:29 +09002866
2867 for (const auto& config : testConfigs) {
2868 const std::string testHostName = config.asHostName();
2869 SCOPED_TRACE(testHostName);
2870
2871 const char* host_name = testHostName.c_str();
2872 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
2873 dns.setEdns(config.edns);
2874
2875 if (config.mode == OFF) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002876 if (tls.running()) {
2877 ASSERT_TRUE(tls.stopServer());
2878 }
Xiao Ma09b71022018-12-11 17:56:32 +09002879 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Mike Yu4f3747b2018-12-02 17:54:29 +09002880 } else if (config.mode == OPPORTUNISTIC_UDP) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002881 if (tls.running()) {
2882 ASSERT_TRUE(tls.stopServer());
2883 }
Xiao Ma09b71022018-12-11 17:56:32 +09002884 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002885 kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002886 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), false));
Mike Yu3977d482020-02-26 17:18:57 +08002887 } else if (config.mode == OPPORTUNISTIC_TLS || config.mode == OPPORTUNISTIC_FALLBACK_UDP) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002888 if (!tls.running()) {
2889 ASSERT_TRUE(tls.startServer());
2890 }
Xiao Ma09b71022018-12-11 17:56:32 +09002891 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002892 kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002893 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Mike Yu3977d482020-02-26 17:18:57 +08002894
2895 if (config.mode == OPPORTUNISTIC_FALLBACK_UDP) {
2896 // Force the resolver to fallback to cleartext queries.
2897 ASSERT_TRUE(tls.stopServer());
2898 }
Mike Yu4f3747b2018-12-02 17:54:29 +09002899 } else if (config.mode == STRICT) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002900 if (!tls.running()) {
2901 ASSERT_TRUE(tls.startServer());
2902 }
Xiao Ma09b71022018-12-11 17:56:32 +09002903 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002904 kDefaultParams, kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08002905 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Mike Yu4f3747b2018-12-02 17:54:29 +09002906 }
2907
2908 if (config.method == GETHOSTBYNAME) {
2909 const hostent* h_result = gethostbyname(host_name);
2910 if (config.expectResult == EXPECT_SUCCESS) {
2911 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2912 ASSERT_TRUE(h_result != nullptr);
2913 ASSERT_EQ(4, h_result->h_length);
2914 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
2915 EXPECT_EQ(ADDR4, ToString(h_result));
2916 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
Mike Yu532405f2020-06-17 17:46:44 +08002917 ExpectDnsEvent(INetdEventListener::EVENT_GETHOSTBYNAME, 0, host_name, {ADDR4});
Mike Yu4f3747b2018-12-02 17:54:29 +09002918 } else {
2919 EXPECT_EQ(0U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
2920 ASSERT_TRUE(h_result == nullptr);
2921 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
Mike Yu532405f2020-06-17 17:46:44 +08002922 int returnCode = (config.edns == Edns::DROP) ? RCODE_TIMEOUT : EAI_FAIL;
2923 ExpectDnsEvent(INetdEventListener::EVENT_GETHOSTBYNAME, returnCode, host_name, {});
Mike Yu4f3747b2018-12-02 17:54:29 +09002924 }
2925 } else if (config.method == GETADDRINFO) {
2926 ScopedAddrinfo ai_result;
2927 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2928 ai_result = safe_getaddrinfo(host_name, nullptr, &hints);
2929 if (config.expectResult == EXPECT_SUCCESS) {
2930 EXPECT_TRUE(ai_result != nullptr);
2931 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2932 const std::string result_str = ToString(ai_result);
2933 EXPECT_EQ(ADDR4, result_str);
Mike Yu532405f2020-06-17 17:46:44 +08002934 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, 0, host_name, {ADDR4});
Mike Yu4f3747b2018-12-02 17:54:29 +09002935 } else {
2936 EXPECT_TRUE(ai_result == nullptr);
2937 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
Mike Yu532405f2020-06-17 17:46:44 +08002938 int returnCode = (config.edns == Edns::DROP) ? RCODE_TIMEOUT : EAI_FAIL;
2939 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, returnCode, host_name, {});
Mike Yu4f3747b2018-12-02 17:54:29 +09002940 }
2941 } else {
2942 FAIL() << "Unsupported query method: " << config.method;
2943 }
2944
Mike Yudd4ac2d2019-05-31 16:52:11 +08002945 tls.clearQueries();
Mike Yu4f3747b2018-12-02 17:54:29 +09002946 dns.clearQueries();
Mike Yu3977d482020-02-26 17:18:57 +08002947
2948 // Clear the setup to force the resolver to validate private DNS servers in every test.
2949 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(paramsForCleanup));
Mike Yu4f3747b2018-12-02 17:54:29 +09002950 }
Mike Yu4f3747b2018-12-02 17:54:29 +09002951}
nuccachena26cc2a2018-07-17 18:07:23 +08002952
Ken Chen0a015532019-01-02 14:59:38 +08002953// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2954// Resolver should have a reasonable number of retries instead of spinning forever. We don't have
2955// an efficient way to know if resolver is stuck in an infinite loop. However, test case will be
2956// failed due to timeout.
2957TEST_F(ResolverTest, UnstableTls) {
2958 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2959 const char CLEARTEXT_PORT[] = "53";
2960 const char TLS_PORT[] = "853";
2961 const char* host_name1 = "nonexistent1.example.com.";
2962 const char* host_name2 = "nonexistent2.example.com.";
2963 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
2964
Mike Yufc125e42019-05-15 20:41:28 +08002965 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Ken Chen0a015532019-01-02 14:59:38 +08002966 ASSERT_TRUE(dns.startServer());
2967 dns.setEdns(test::DNSResponder::Edns::FORMERR_ON_EDNS);
2968 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2969 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08002970 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002971 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
2972
Ken Chen0a015532019-01-02 14:59:38 +08002973 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
2974 tls.stopServer();
2975
2976 const hostent* h_result = gethostbyname(host_name1);
2977 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
2978 ASSERT_TRUE(h_result == nullptr);
2979 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2980
2981 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2982 ScopedAddrinfo ai_result = safe_getaddrinfo(host_name2, nullptr, &hints);
2983 EXPECT_TRUE(ai_result == nullptr);
2984 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
2985}
2986
2987// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2988// Moreover, server responds RCODE=FORMERR even on non-EDNS query.
2989TEST_F(ResolverTest, BogusDnsServer) {
2990 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2991 const char CLEARTEXT_PORT[] = "53";
2992 const char TLS_PORT[] = "853";
2993 const char* host_name1 = "nonexistent1.example.com.";
2994 const char* host_name2 = "nonexistent2.example.com.";
2995 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
2996
Mike Yufc125e42019-05-15 20:41:28 +08002997 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Ken Chen0a015532019-01-02 14:59:38 +08002998 ASSERT_TRUE(dns.startServer());
2999 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
3000 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08003001 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08003002 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
3003
Ken Chen0a015532019-01-02 14:59:38 +08003004 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
3005 tls.stopServer();
3006 dns.setEdns(test::DNSResponder::Edns::FORMERR_UNCOND);
3007
3008 const hostent* h_result = gethostbyname(host_name1);
3009 EXPECT_EQ(0U, GetNumQueries(dns, host_name1));
3010 ASSERT_TRUE(h_result == nullptr);
3011 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
3012
3013 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
3014 ScopedAddrinfo ai_result = safe_getaddrinfo(host_name2, nullptr, &hints);
3015 EXPECT_TRUE(ai_result == nullptr);
3016 EXPECT_EQ(0U, GetNumQueries(dns, host_name2));
3017}
3018
nuccachena26cc2a2018-07-17 18:07:23 +08003019TEST_F(ResolverTest, GetAddrInfo_Dns64Synthesize) {
3020 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003021 constexpr char dns64_name[] = "ipv4only.arpa.";
3022 constexpr char host_name[] = "v4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003023 const std::vector<DnsRecord> records = {
3024 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3025 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3026 };
nuccachena26cc2a2018-07-17 18:07:23 +08003027
Xiao Ma09b71022018-12-11 17:56:32 +09003028 test::DNSResponder dns(listen_addr);
Xiao Ma09b71022018-12-11 17:56:32 +09003029 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003030
3031 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003032 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003033
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003034 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003035 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003036 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003037
3038 // hints are necessary in order to let netd know which type of addresses the caller is
3039 // interested in.
Xiao Ma09b71022018-12-11 17:56:32 +09003040 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08003041 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
3042 EXPECT_TRUE(result != nullptr);
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003043 // TODO: BUG: there should only be two queries, one AAAA (which returns no records) and one A
3044 // (which returns 1.2.3.4). But there is an extra AAAA.
3045 EXPECT_EQ(3U, GetNumQueries(dns, host_name));
nuccachena26cc2a2018-07-17 18:07:23 +08003046
3047 std::string result_str = ToString(result);
3048 EXPECT_EQ(result_str, "64:ff9b::102:304");
3049
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003050 // Stopping NAT64 prefix discovery disables synthesis.
Luke Huang5bd827c2019-03-14 16:10:04 +08003051 EXPECT_TRUE(mDnsClient.resolvService()->stopPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003052 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_NOT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003053
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003054 dns.clearQueries();
nuccachena26cc2a2018-07-17 18:07:23 +08003055
3056 result = safe_getaddrinfo("v4only", nullptr, &hints);
3057 EXPECT_TRUE(result != nullptr);
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003058 // TODO: BUG: there should only be one query, an AAAA (which returns no records), because the
3059 // A is already cached. But there is an extra AAAA.
3060 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
nuccachena26cc2a2018-07-17 18:07:23 +08003061
3062 result_str = ToString(result);
3063 EXPECT_EQ(result_str, "1.2.3.4");
3064}
3065
nuccachena26cc2a2018-07-17 18:07:23 +08003066TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecified) {
3067 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003068 constexpr char dns64_name[] = "ipv4only.arpa.";
3069 constexpr char host_name[] = "v4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003070 const std::vector<DnsRecord> records = {
3071 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3072 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3073 };
nuccachena26cc2a2018-07-17 18:07:23 +08003074
Xiao Ma09b71022018-12-11 17:56:32 +09003075 test::DNSResponder dns(listen_addr);
3076 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003077 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003078 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003079
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003080 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003081 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003082 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003083
3084 // Ensure to synthesize AAAA if AF_INET6 is specified, and not to synthesize AAAA
3085 // in AF_INET case.
3086 addrinfo hints;
3087 memset(&hints, 0, sizeof(hints));
3088 hints.ai_family = AF_INET6;
3089 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
3090 EXPECT_TRUE(result != nullptr);
3091 std::string result_str = ToString(result);
3092 EXPECT_EQ(result_str, "64:ff9b::102:304");
3093
3094 hints.ai_family = AF_INET;
3095 result = safe_getaddrinfo("v4only", nullptr, &hints);
3096 EXPECT_TRUE(result != nullptr);
3097 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3098 result_str = ToString(result);
3099 EXPECT_EQ(result_str, "1.2.3.4");
3100}
nuccachena26cc2a2018-07-17 18:07:23 +08003101
3102TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedV6) {
3103 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003104 constexpr char dns64_name[] = "ipv4only.arpa.";
3105 constexpr char host_name[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003106 const std::vector<DnsRecord> records = {
3107 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3108 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3109 {host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
3110 };
nuccachena26cc2a2018-07-17 18:07:23 +08003111
Xiao Ma09b71022018-12-11 17:56:32 +09003112 test::DNSResponder dns(listen_addr);
3113 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003114 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003115 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003116
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003117 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003118 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003119 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003120
Xiao Ma09b71022018-12-11 17:56:32 +09003121 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08003122 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
3123 EXPECT_TRUE(result != nullptr);
3124 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3125
3126 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
Xiao Ma09b71022018-12-11 17:56:32 +09003127 const std::vector<std::string> result_strs = ToStrings(result);
nuccachena26cc2a2018-07-17 18:07:23 +08003128 for (const auto& str : result_strs) {
3129 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
3130 << ", result_str='" << str << "'";
3131 }
3132}
3133
3134TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedNoV6) {
3135 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003136 constexpr char dns64_name[] = "ipv4only.arpa.";
3137 constexpr char host_name[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003138 const std::vector<DnsRecord> records = {
3139 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3140 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3141 };
nuccachena26cc2a2018-07-17 18:07:23 +08003142
Xiao Ma09b71022018-12-11 17:56:32 +09003143 test::DNSResponder dns(listen_addr);
3144 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003145 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003146 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003147
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003148 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003149 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003150 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003151
Xiao Ma09b71022018-12-11 17:56:32 +09003152 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08003153 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
3154 EXPECT_TRUE(result != nullptr);
3155 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3156
3157 // In AF_UNSPEC case, synthesize AAAA if there's no AAAA answer.
3158 std::string result_str = ToString(result);
3159 EXPECT_EQ(result_str, "64:ff9b::102:304");
3160}
3161
3162TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecialUseIPv4Addresses) {
3163 constexpr char THIS_NETWORK[] = "this_network";
3164 constexpr char LOOPBACK[] = "loopback";
3165 constexpr char LINK_LOCAL[] = "link_local";
3166 constexpr char MULTICAST[] = "multicast";
3167 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
3168
3169 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
3170 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
3171 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
3172 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
3173 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
3174
3175 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003176 constexpr char dns64_name[] = "ipv4only.arpa.";
3177
Xiao Ma09b71022018-12-11 17:56:32 +09003178 test::DNSResponder dns(listen_addr);
3179 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003180 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003181 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003182
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003183 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003184 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003185 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003186
Luke Huangf8215372019-11-22 11:53:41 +08003187 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003188 static const struct TestConfig {
3189 std::string name;
3190 std::string addr;
3191
3192 std::string asHostName() const { return StringPrintf("%s.example.com.", name.c_str()); }
3193 } testConfigs[]{
3194 {THIS_NETWORK, ADDR_THIS_NETWORK},
3195 {LOOPBACK, ADDR_LOOPBACK},
3196 {LINK_LOCAL, ADDR_LINK_LOCAL},
3197 {MULTICAST, ADDR_MULTICAST},
3198 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
3199 };
Luke Huangf8215372019-11-22 11:53:41 +08003200 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003201
3202 for (const auto& config : testConfigs) {
3203 const std::string testHostName = config.asHostName();
3204 SCOPED_TRACE(testHostName);
3205
3206 const char* host_name = testHostName.c_str();
3207 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
3208
3209 addrinfo hints;
3210 memset(&hints, 0, sizeof(hints));
3211 hints.ai_family = AF_INET6;
3212 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
3213 // In AF_INET6 case, don't return IPv4 answers
3214 EXPECT_TRUE(result == nullptr);
3215 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3216 dns.clearQueries();
3217
3218 memset(&hints, 0, sizeof(hints));
3219 hints.ai_family = AF_UNSPEC;
3220 result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
3221 EXPECT_TRUE(result != nullptr);
3222 // Expect IPv6 query only. IPv4 answer has been cached in previous query.
3223 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3224 // In AF_UNSPEC case, don't synthesize special use IPv4 address.
3225 std::string result_str = ToString(result);
3226 EXPECT_EQ(result_str, config.addr.c_str());
3227 dns.clearQueries();
3228 }
3229}
3230
3231TEST_F(ResolverTest, GetAddrInfo_Dns64QueryWithNullArgumentHints) {
3232 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003233 constexpr char dns64_name[] = "ipv4only.arpa.";
3234 constexpr char host_name[] = "v4only.example.com.";
3235 constexpr char host_name2[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003236 const std::vector<DnsRecord> records = {
3237 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3238 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3239 {host_name2, ns_type::ns_t_a, "1.2.3.4"},
3240 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
3241 };
nuccachena26cc2a2018-07-17 18:07:23 +08003242
Xiao Ma09b71022018-12-11 17:56:32 +09003243 test::DNSResponder dns(listen_addr);
3244 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003245 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003246 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003247
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003248 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003249 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003250 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003251
3252 // Assign argument hints of getaddrinfo() as null is equivalent to set ai_family AF_UNSPEC.
3253 // In AF_UNSPEC case, synthesize AAAA if there has A answer only.
3254 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, nullptr);
3255 EXPECT_TRUE(result != nullptr);
3256 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3257 std::string result_str = ToString(result);
3258 EXPECT_EQ(result_str, "64:ff9b::102:304");
3259 dns.clearQueries();
3260
3261 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
3262 result = safe_getaddrinfo("v4v6", nullptr, nullptr);
3263 EXPECT_TRUE(result != nullptr);
3264 EXPECT_LE(2U, GetNumQueries(dns, host_name2));
3265 std::vector<std::string> result_strs = ToStrings(result);
3266 for (const auto& str : result_strs) {
3267 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
3268 << ", result_str='" << str << "'";
3269 }
3270}
3271
3272TEST_F(ResolverTest, GetAddrInfo_Dns64QueryNullArgumentNode) {
3273 constexpr char ADDR_ANYADDR_V4[] = "0.0.0.0";
3274 constexpr char ADDR_ANYADDR_V6[] = "::";
3275 constexpr char ADDR_LOCALHOST_V4[] = "127.0.0.1";
3276 constexpr char ADDR_LOCALHOST_V6[] = "::1";
3277
3278 constexpr char PORT_NAME_HTTP[] = "http";
3279 constexpr char PORT_NUMBER_HTTP[] = "80";
3280
3281 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003282 constexpr char dns64_name[] = "ipv4only.arpa.";
3283
Xiao Ma09b71022018-12-11 17:56:32 +09003284 test::DNSResponder dns(listen_addr);
3285 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003286 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003287 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003288
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003289 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003290 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003291 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003292
Luke Huangf8215372019-11-22 11:53:41 +08003293 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003294 // If node is null, return address is listed by libc/getaddrinfo.c as follows.
3295 // - passive socket -> anyaddr (0.0.0.0 or ::)
3296 // - non-passive socket -> localhost (127.0.0.1 or ::1)
3297 static const struct TestConfig {
3298 int flag;
3299 std::string addr_v4;
3300 std::string addr_v6;
3301
3302 std::string asParameters() const {
3303 return StringPrintf("flag=%d, addr_v4=%s, addr_v6=%s", flag, addr_v4.c_str(),
3304 addr_v6.c_str());
3305 }
3306 } testConfigs[]{
3307 {0 /* non-passive */, ADDR_LOCALHOST_V4, ADDR_LOCALHOST_V6},
3308 {AI_PASSIVE, ADDR_ANYADDR_V4, ADDR_ANYADDR_V6}
3309 };
Luke Huangf8215372019-11-22 11:53:41 +08003310 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003311
3312 for (const auto& config : testConfigs) {
3313 SCOPED_TRACE(config.asParameters());
3314
Xiao Ma09b71022018-12-11 17:56:32 +09003315 addrinfo hints = {
Nick Desaulnierscd6395a2019-10-11 09:15:24 -07003316 .ai_flags = config.flag,
Xiao Ma09b71022018-12-11 17:56:32 +09003317 .ai_family = AF_UNSPEC, // any address family
3318 .ai_socktype = 0, // any type
3319 .ai_protocol = 0, // any protocol
Xiao Ma09b71022018-12-11 17:56:32 +09003320 };
nuccachena26cc2a2018-07-17 18:07:23 +08003321
3322 // Assign hostname as null and service as port name.
3323 ScopedAddrinfo result = safe_getaddrinfo(nullptr, PORT_NAME_HTTP, &hints);
3324 ASSERT_TRUE(result != nullptr);
3325
3326 // Can't be synthesized because it should not get into Netd.
3327 std::vector<std::string> result_strs = ToStrings(result);
3328 for (const auto& str : result_strs) {
3329 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
3330 << ", result_str='" << str << "'";
3331 }
3332
3333 // Assign hostname as null and service as numeric port number.
3334 hints.ai_flags = config.flag | AI_NUMERICSERV;
3335 result = safe_getaddrinfo(nullptr, PORT_NUMBER_HTTP, &hints);
3336 ASSERT_TRUE(result != nullptr);
3337
3338 // Can't be synthesized because it should not get into Netd.
3339 result_strs = ToStrings(result);
3340 for (const auto& str : result_strs) {
3341 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
3342 << ", result_str='" << str << "'";
3343 }
3344 }
3345}
3346
3347TEST_F(ResolverTest, GetHostByAddr_ReverseDnsQueryWithHavingNat64Prefix) {
3348 struct hostent* result = nullptr;
3349 struct in_addr v4addr;
3350 struct in6_addr v6addr;
3351
3352 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003353 constexpr char dns64_name[] = "ipv4only.arpa.";
3354 constexpr char ptr_name[] = "v4v6.example.com.";
3355 // PTR record for IPv4 address 1.2.3.4
3356 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3357 // PTR record for IPv6 address 2001:db8::102:304
3358 constexpr char ptr_addr_v6[] =
3359 "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 +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, ns_type::ns_t_ptr, ptr_name},
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 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003369 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003370
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003371 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003372 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003373 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003374
3375 // Reverse IPv4 DNS query. Prefix should have no effect on it.
3376 inet_pton(AF_INET, "1.2.3.4", &v4addr);
3377 result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
3378 ASSERT_TRUE(result != nullptr);
3379 std::string result_str = result->h_name ? result->h_name : "null";
3380 EXPECT_EQ(result_str, "v4v6.example.com");
3381
3382 // Reverse IPv6 DNS query. Prefix should have no effect on it.
3383 inet_pton(AF_INET6, "2001:db8::102:304", &v6addr);
3384 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3385 ASSERT_TRUE(result != nullptr);
3386 result_str = result->h_name ? result->h_name : "null";
3387 EXPECT_EQ(result_str, "v4v6.example.com");
3388}
3389
3390TEST_F(ResolverTest, GetHostByAddr_ReverseDns64Query) {
3391 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003392 constexpr char dns64_name[] = "ipv4only.arpa.";
3393 constexpr char ptr_name[] = "v4only.example.com.";
3394 // PTR record for IPv4 address 1.2.3.4
3395 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3396 // PTR record for IPv6 address 64:ff9b::1.2.3.4
3397 constexpr char ptr_addr_v6_nomapping[] =
3398 "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.";
3399 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
3400 // PTR record for IPv6 address 64:ff9b::5.6.7.8
3401 constexpr char ptr_addr_v6_synthesis[] =
3402 "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 +09003403 const std::vector<DnsRecord> records = {
3404 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3405 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3406 {ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis},
3407 };
nuccachena26cc2a2018-07-17 18:07:23 +08003408
Xiao Ma09b71022018-12-11 17:56:32 +09003409 test::DNSResponder dns(listen_addr);
3410 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003411 // "ptr_addr_v6_nomapping" is not mapped in DNS server
nuccachena26cc2a2018-07-17 18:07:23 +08003412 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003413 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003414
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003415 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003416 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003417 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003418
3419 // Synthesized PTR record doesn't exist on DNS server
3420 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
3421 // After querying synthesized address failed, expect that prefix is removed from IPv6
3422 // synthesized address and do reverse IPv4 query instead.
3423 struct in6_addr v6addr;
3424 inet_pton(AF_INET6, "64:ff9b::1.2.3.4", &v6addr);
3425 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3426 ASSERT_TRUE(result != nullptr);
3427 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist
3428 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist
3429 std::string result_str = result->h_name ? result->h_name : "null";
3430 EXPECT_EQ(result_str, "v4only.example.com");
3431 // Check that return address has been mapped from IPv4 to IPv6 address because Netd
3432 // removes NAT64 prefix and does IPv4 DNS reverse lookup in this case. Then, Netd
3433 // fakes the return IPv4 address as original queried IPv6 address.
3434 result_str = ToString(result);
3435 EXPECT_EQ(result_str, "64:ff9b::102:304");
3436 dns.clearQueries();
3437
3438 // Synthesized PTR record exists on DNS server
3439 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
3440 // Expect to Netd pass through synthesized address for DNS queries.
3441 inet_pton(AF_INET6, "64:ff9b::5.6.7.8", &v6addr);
3442 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3443 ASSERT_TRUE(result != nullptr);
3444 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
3445 result_str = result->h_name ? result->h_name : "null";
3446 EXPECT_EQ(result_str, "v6synthesis.example.com");
3447}
3448
3449TEST_F(ResolverTest, GetHostByAddr_ReverseDns64QueryFromHostFile) {
3450 constexpr char dns64_name[] = "ipv4only.arpa.";
3451 constexpr char host_name[] = "localhost";
3452 // The address is synthesized by prefix64:localhost.
3453 constexpr char host_addr[] = "64:ff9b::7f00:1";
nuccachena26cc2a2018-07-17 18:07:23 +08003454 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003455
3456 test::DNSResponder dns(listen_addr);
3457 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003458 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003459 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003460
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003461 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003462 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003463 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003464
3465 // Using synthesized "localhost" address to be a trick for resolving host name
3466 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
3467 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
3468 struct in6_addr v6addr;
3469 inet_pton(AF_INET6, host_addr, &v6addr);
3470 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3471 ASSERT_TRUE(result != nullptr);
3472 // Expect no DNS queries; localhost is resolved via /etc/hosts.
3473 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
3474
Luke Huangf8215372019-11-22 11:53:41 +08003475 ASSERT_EQ(sizeof(in6_addr), (unsigned)result->h_length);
nuccachena26cc2a2018-07-17 18:07:23 +08003476 ASSERT_EQ(AF_INET6, result->h_addrtype);
3477 std::string result_str = ToString(result);
3478 EXPECT_EQ(result_str, host_addr);
3479 result_str = result->h_name ? result->h_name : "null";
3480 EXPECT_EQ(result_str, host_name);
3481}
3482
Hungming Chen9e6185a2019-06-04 16:09:19 +08003483TEST_F(ResolverTest, GetHostByAddr_cnamesClasslessReverseDelegation) {
3484 // IPv4 addresses in the subnet with notation '/' or '-'.
3485 constexpr char addr_slash[] = "192.0.2.1";
3486 constexpr char addr_hyphen[] = "192.0.3.1";
3487
3488 // Used to verify DNS reverse query for classless reverse lookup zone. See detail in RFC 2317
3489 // section 4.
3490 const static std::vector<DnsRecord> records = {
3491 // The records for reverse querying "192.0.2.1" in the subnet with notation '/'.
3492 {"1.2.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0/25.2.0.192.in-addr.arpa."},
3493 {"1.0/25.2.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3494
3495 // The records for reverse querying "192.0.3.1" in the subnet with notation '-'.
3496 {"1.3.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0-127.3.0.192.in-addr.arpa."},
3497 {"1.0-127.3.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3498 };
3499
3500 test::DNSResponder dns;
3501 StartDns(dns, records);
3502 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3503
3504 for (const auto& address : {addr_slash, addr_hyphen}) {
3505 SCOPED_TRACE(address);
3506
3507 in_addr v4addr;
3508 ASSERT_TRUE(inet_pton(AF_INET, address, &v4addr));
3509 hostent* result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
3510 ASSERT_TRUE(result != nullptr);
3511 EXPECT_STREQ("hello.example.com", result->h_name);
3512 }
3513}
3514
nuccachena26cc2a2018-07-17 18:07:23 +08003515TEST_F(ResolverTest, GetNameInfo_ReverseDnsQueryWithHavingNat64Prefix) {
3516 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003517 constexpr char dns64_name[] = "ipv4only.arpa.";
3518 constexpr char ptr_name[] = "v4v6.example.com.";
3519 // PTR record for IPv4 address 1.2.3.4
3520 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3521 // PTR record for IPv6 address 2001:db8::102:304
3522 constexpr char ptr_addr_v6[] =
3523 "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 +09003524 const std::vector<DnsRecord> records = {
3525 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3526 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3527 {ptr_addr_v6, ns_type::ns_t_ptr, ptr_name},
3528 };
nuccachena26cc2a2018-07-17 18:07:23 +08003529
Xiao Ma09b71022018-12-11 17:56:32 +09003530 test::DNSResponder dns(listen_addr);
3531 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003532 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003533 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003534
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003535 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003536 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003537 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003538
Luke Huangf8215372019-11-22 11:53:41 +08003539 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003540 static const struct TestConfig {
3541 int flag;
3542 int family;
3543 std::string addr;
3544 std::string host;
3545
3546 std::string asParameters() const {
3547 return StringPrintf("flag=%d, family=%d, addr=%s, host=%s", flag, family, addr.c_str(),
3548 host.c_str());
3549 }
3550 } testConfigs[]{
3551 {NI_NAMEREQD, AF_INET, "1.2.3.4", "v4v6.example.com"},
3552 {NI_NUMERICHOST, AF_INET, "1.2.3.4", "1.2.3.4"},
3553 {0, AF_INET, "1.2.3.4", "v4v6.example.com"},
3554 {0, AF_INET, "5.6.7.8", "5.6.7.8"}, // unmapped
3555 {NI_NAMEREQD, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
3556 {NI_NUMERICHOST, AF_INET6, "2001:db8::102:304", "2001:db8::102:304"},
3557 {0, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
3558 {0, AF_INET6, "2001:db8::506:708", "2001:db8::506:708"}, // unmapped
3559 };
Luke Huangf8215372019-11-22 11:53:41 +08003560 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003561
3562 // Reverse IPv4/IPv6 DNS query. Prefix should have no effect on it.
3563 for (const auto& config : testConfigs) {
3564 SCOPED_TRACE(config.asParameters());
3565
3566 int rv;
3567 char host[NI_MAXHOST];
3568 struct sockaddr_in sin;
3569 struct sockaddr_in6 sin6;
3570 if (config.family == AF_INET) {
3571 memset(&sin, 0, sizeof(sin));
3572 sin.sin_family = AF_INET;
3573 inet_pton(AF_INET, config.addr.c_str(), &sin.sin_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003574 rv = getnameinfo((const struct sockaddr*)&sin, sizeof(sin), host, sizeof(host), nullptr,
3575 0, config.flag);
nuccachena26cc2a2018-07-17 18:07:23 +08003576 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4));
3577 } else if (config.family == AF_INET6) {
3578 memset(&sin6, 0, sizeof(sin6));
3579 sin6.sin6_family = AF_INET6;
3580 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003581 rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host),
nuccachena26cc2a2018-07-17 18:07:23 +08003582 nullptr, 0, config.flag);
3583 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6));
3584 }
3585 ASSERT_EQ(0, rv);
3586 std::string result_str = host;
3587 EXPECT_EQ(result_str, config.host);
3588 dns.clearQueries();
3589 }
3590}
3591
3592TEST_F(ResolverTest, GetNameInfo_ReverseDns64Query) {
3593 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003594 constexpr char dns64_name[] = "ipv4only.arpa.";
3595 constexpr char ptr_name[] = "v4only.example.com.";
3596 // PTR record for IPv4 address 1.2.3.4
3597 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3598 // PTR record for IPv6 address 64:ff9b::1.2.3.4
3599 constexpr char ptr_addr_v6_nomapping[] =
3600 "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.";
3601 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
3602 // PTR record for IPv6 address 64:ff9b::5.6.7.8
3603 constexpr char ptr_addr_v6_synthesis[] =
3604 "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 +09003605 const std::vector<DnsRecord> records = {
3606 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3607 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3608 {ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis},
3609 };
nuccachena26cc2a2018-07-17 18:07:23 +08003610
Xiao Ma09b71022018-12-11 17:56:32 +09003611 test::DNSResponder dns(listen_addr);
3612 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003613 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003614 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003615
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003616 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003617 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003618 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003619
Luke Huangf8215372019-11-22 11:53:41 +08003620 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003621 static const struct TestConfig {
3622 bool hasSynthesizedPtrRecord;
3623 int flag;
3624 std::string addr;
3625 std::string host;
3626
3627 std::string asParameters() const {
3628 return StringPrintf("hasSynthesizedPtrRecord=%d, flag=%d, addr=%s, host=%s",
3629 hasSynthesizedPtrRecord, flag, addr.c_str(), host.c_str());
3630 }
3631 } testConfigs[]{
3632 {false, NI_NAMEREQD, "64:ff9b::102:304", "v4only.example.com"},
3633 {false, NI_NUMERICHOST, "64:ff9b::102:304", "64:ff9b::102:304"},
3634 {false, 0, "64:ff9b::102:304", "v4only.example.com"},
3635 {true, NI_NAMEREQD, "64:ff9b::506:708", "v6synthesis.example.com"},
3636 {true, NI_NUMERICHOST, "64:ff9b::506:708", "64:ff9b::506:708"},
3637 {true, 0, "64:ff9b::506:708", "v6synthesis.example.com"}
3638 };
Luke Huangf8215372019-11-22 11:53:41 +08003639 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003640
3641 // hasSynthesizedPtrRecord = false
3642 // Synthesized PTR record doesn't exist on DNS server
3643 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
3644 // After querying synthesized address failed, expect that prefix is removed from IPv6
3645 // synthesized address and do reverse IPv4 query instead.
3646 //
3647 // hasSynthesizedPtrRecord = true
3648 // Synthesized PTR record exists on DNS server
3649 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
3650 // Expect to just pass through synthesized address for DNS queries.
3651 for (const auto& config : testConfigs) {
3652 SCOPED_TRACE(config.asParameters());
3653
3654 char host[NI_MAXHOST];
3655 struct sockaddr_in6 sin6;
3656 memset(&sin6, 0, sizeof(sin6));
3657 sin6.sin6_family = AF_INET6;
3658 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003659 int rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host),
nuccachena26cc2a2018-07-17 18:07:23 +08003660 nullptr, 0, config.flag);
3661 ASSERT_EQ(0, rv);
3662 if (config.flag == NI_NAMEREQD) {
3663 if (config.hasSynthesizedPtrRecord) {
3664 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
3665 } else {
3666 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist.
3667 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist.
3668 }
3669 }
3670 std::string result_str = host;
3671 EXPECT_EQ(result_str, config.host);
3672 dns.clearQueries();
3673 }
3674}
3675
3676TEST_F(ResolverTest, GetNameInfo_ReverseDns64QueryFromHostFile) {
3677 constexpr char dns64_name[] = "ipv4only.arpa.";
3678 constexpr char host_name[] = "localhost";
3679 // The address is synthesized by prefix64:localhost.
3680 constexpr char host_addr[] = "64:ff9b::7f00:1";
nuccachena26cc2a2018-07-17 18:07:23 +08003681 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003682
3683 test::DNSResponder dns(listen_addr);
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003684
Xiao Ma09b71022018-12-11 17:56:32 +09003685 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003686 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003687 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003688
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003689 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003690 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003691 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003692
3693 // Using synthesized "localhost" address to be a trick for resolving host name
3694 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
3695 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
3696 char host[NI_MAXHOST];
Xiao Ma09b71022018-12-11 17:56:32 +09003697 struct sockaddr_in6 sin6 = {.sin6_family = AF_INET6};
nuccachena26cc2a2018-07-17 18:07:23 +08003698 inet_pton(AF_INET6, host_addr, &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003699 int rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host), nullptr,
nuccachena26cc2a2018-07-17 18:07:23 +08003700 0, NI_NAMEREQD);
3701 ASSERT_EQ(0, rv);
3702 // Expect no DNS queries; localhost is resolved via /etc/hosts.
3703 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
3704
3705 std::string result_str = host;
3706 EXPECT_EQ(result_str, host_name);
3707}
3708
Hungming Chen9e6185a2019-06-04 16:09:19 +08003709TEST_F(ResolverTest, GetNameInfo_cnamesClasslessReverseDelegation) {
3710 // IPv4 addresses in the subnet with notation '/' or '-'.
3711 constexpr char addr_slash[] = "192.0.2.1";
3712 constexpr char addr_hyphen[] = "192.0.3.1";
3713
3714 // Used to verify DNS reverse query for classless reverse lookup zone. See detail in RFC 2317
3715 // section 4.
3716 const static std::vector<DnsRecord> records = {
3717 // The records for reverse querying "192.0.2.1" in the subnet with notation '/'.
3718 {"1.2.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0/25.2.0.192.in-addr.arpa."},
3719 {"1.0/25.2.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3720
3721 // The records for reverse querying "192.0.3.1" in the subnet with notation '-'.
3722 {"1.3.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0-127.3.0.192.in-addr.arpa."},
3723 {"1.0-127.3.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3724 };
3725
3726 test::DNSResponder dns;
3727 StartDns(dns, records);
3728 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3729
3730 for (const auto& address : {addr_slash, addr_hyphen}) {
3731 SCOPED_TRACE(address);
3732
3733 char host[NI_MAXHOST];
3734 sockaddr_in sin = {.sin_family = AF_INET};
3735 ASSERT_TRUE(inet_pton(AF_INET, address, &sin.sin_addr));
3736 int rv = getnameinfo((const sockaddr*)&sin, sizeof(sin), host, sizeof(host), nullptr, 0,
3737 NI_NAMEREQD);
3738 ASSERT_EQ(0, rv);
3739 EXPECT_STREQ("hello.example.com", host);
3740 }
3741}
3742
nuccachena26cc2a2018-07-17 18:07:23 +08003743TEST_F(ResolverTest, GetHostByName2_Dns64Synthesize) {
Xiao Ma09b71022018-12-11 17:56:32 +09003744 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003745 constexpr char dns64_name[] = "ipv4only.arpa.";
3746 constexpr char host_name[] = "ipv4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003747 const std::vector<DnsRecord> records = {
3748 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3749 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3750 };
nuccachena26cc2a2018-07-17 18:07:23 +08003751
Xiao Ma09b71022018-12-11 17:56:32 +09003752 test::DNSResponder dns(listen_addr);
3753 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003754 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003755 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003756
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003757 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003758 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003759 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003760
3761 // Query an IPv4-only hostname. Expect that gets a synthesized address.
3762 struct hostent* result = gethostbyname2("ipv4only", AF_INET6);
3763 ASSERT_TRUE(result != nullptr);
3764 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3765 std::string result_str = ToString(result);
3766 EXPECT_EQ(result_str, "64:ff9b::102:304");
3767}
nuccachena26cc2a2018-07-17 18:07:23 +08003768
3769TEST_F(ResolverTest, GetHostByName2_DnsQueryWithHavingNat64Prefix) {
3770 constexpr char dns64_name[] = "ipv4only.arpa.";
3771 constexpr char host_name[] = "v4v6.example.com.";
nuccachena26cc2a2018-07-17 18:07:23 +08003772 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003773 const std::vector<DnsRecord> records = {
3774 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3775 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3776 {host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
3777 };
3778
3779 test::DNSResponder dns(listen_addr);
3780 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003781 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003782 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003783
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003784 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003785 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003786 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003787
3788 // IPv4 DNS query. Prefix should have no effect on it.
3789 struct hostent* result = gethostbyname2("v4v6", AF_INET);
3790 ASSERT_TRUE(result != nullptr);
3791 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3792 std::string result_str = ToString(result);
3793 EXPECT_EQ(result_str, "1.2.3.4");
3794 dns.clearQueries();
3795
3796 // IPv6 DNS query. Prefix should have no effect on it.
3797 result = gethostbyname2("v4v6", AF_INET6);
3798 ASSERT_TRUE(result != nullptr);
3799 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3800 result_str = ToString(result);
3801 EXPECT_EQ(result_str, "2001:db8::102:304");
3802}
3803
3804TEST_F(ResolverTest, GetHostByName2_Dns64QuerySpecialUseIPv4Addresses) {
3805 constexpr char THIS_NETWORK[] = "this_network";
3806 constexpr char LOOPBACK[] = "loopback";
3807 constexpr char LINK_LOCAL[] = "link_local";
3808 constexpr char MULTICAST[] = "multicast";
3809 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
3810
3811 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
3812 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
3813 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
3814 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
3815 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
3816
3817 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003818 constexpr char dns64_name[] = "ipv4only.arpa.";
3819
Xiao Ma09b71022018-12-11 17:56:32 +09003820 test::DNSResponder dns(listen_addr);
3821 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003822 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003823 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003824
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003825 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003826 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003827 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003828
Luke Huangf8215372019-11-22 11:53:41 +08003829 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003830 static const struct TestConfig {
3831 std::string name;
3832 std::string addr;
3833
3834 std::string asHostName() const {
Luke Huangf8215372019-11-22 11:53:41 +08003835 return StringPrintf("%s.example.com.", name.c_str());
nuccachena26cc2a2018-07-17 18:07:23 +08003836 }
3837 } testConfigs[]{
3838 {THIS_NETWORK, ADDR_THIS_NETWORK},
3839 {LOOPBACK, ADDR_LOOPBACK},
3840 {LINK_LOCAL, ADDR_LINK_LOCAL},
3841 {MULTICAST, ADDR_MULTICAST},
3842 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
3843 };
Luke Huangf8215372019-11-22 11:53:41 +08003844 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003845
3846 for (const auto& config : testConfigs) {
3847 const std::string testHostName = config.asHostName();
3848 SCOPED_TRACE(testHostName);
3849
3850 const char* host_name = testHostName.c_str();
3851 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
3852
3853 struct hostent* result = gethostbyname2(config.name.c_str(), AF_INET6);
3854 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3855
3856 // In AF_INET6 case, don't synthesize special use IPv4 address.
3857 // Expect to have no answer
3858 EXPECT_EQ(nullptr, result);
3859
3860 dns.clearQueries();
3861 }
Bernie Innocenti2fef2b82018-12-20 15:56:40 +09003862}
Mike Yuf14e1a92019-05-10 13:54:58 +08003863
3864TEST_F(ResolverTest, PrefixDiscoveryBypassTls) {
3865 constexpr char listen_addr[] = "::1";
3866 constexpr char cleartext_port[] = "53";
3867 constexpr char tls_port[] = "853";
3868 constexpr char dns64_name[] = "ipv4only.arpa.";
3869 const std::vector<std::string> servers = {listen_addr};
3870
3871 test::DNSResponder dns(listen_addr);
3872 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
3873 test::DnsTlsFrontend tls(listen_addr, tls_port, listen_addr, cleartext_port);
3874 ASSERT_TRUE(tls.startServer());
3875
3876 // Setup OPPORTUNISTIC mode and wait for the validation complete.
waynema0e73c2e2019-07-31 15:04:08 +08003877 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08003878 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003879 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yuf14e1a92019-05-10 13:54:58 +08003880 tls.clearQueries();
3881
3882 // Start NAT64 prefix discovery and wait for it complete.
3883 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003884 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
Mike Yuf14e1a92019-05-10 13:54:58 +08003885
3886 // Verify it bypassed TLS even though there's a TLS server available.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003887 EXPECT_EQ(0, tls.queries()) << dns.dumpQueries();
3888 EXPECT_EQ(1U, GetNumQueries(dns, dns64_name)) << dns.dumpQueries();
Mike Yuf14e1a92019-05-10 13:54:58 +08003889
3890 // Restart the testing network to reset the cache.
3891 mDnsClient.TearDown();
3892 mDnsClient.SetUp();
3893 dns.clearQueries();
3894
3895 // Setup STRICT mode and wait for the validation complete.
waynema0e73c2e2019-07-31 15:04:08 +08003896 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
3897 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08003898 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003899 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yuf14e1a92019-05-10 13:54:58 +08003900 tls.clearQueries();
3901
3902 // Start NAT64 prefix discovery and wait for it to complete.
3903 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003904 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
Mike Yuf14e1a92019-05-10 13:54:58 +08003905
3906 // Verify it bypassed TLS despite STRICT mode.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003907 EXPECT_EQ(0, tls.queries()) << dns.dumpQueries();
3908 EXPECT_EQ(1U, GetNumQueries(dns, dns64_name)) << dns.dumpQueries();
Mike Yuf14e1a92019-05-10 13:54:58 +08003909}
Luke Huang9807e6b2019-05-20 16:17:12 +08003910
Lorenzo Colittie51091d2020-05-20 02:48:44 +09003911TEST_F(ResolverTest, SetAndClearNat64Prefix) {
3912 constexpr char host_name[] = "v4.example.com.";
3913 constexpr char listen_addr[] = "::1";
3914 const std::vector<DnsRecord> records = {
3915 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3916 };
3917 const std::string kNat64Prefix1 = "64:ff9b::/96";
3918 const std::string kNat64Prefix2 = "2001:db8:6464::/96";
3919
3920 test::DNSResponder dns(listen_addr);
3921 StartDns(dns, records);
3922 const std::vector<std::string> servers = {listen_addr};
3923 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
3924
3925 auto resolvService = mDnsClient.resolvService();
3926 addrinfo hints = {.ai_family = AF_INET6};
3927
3928 // No NAT64 prefix, no AAAA record.
3929 ScopedAddrinfo result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3930 ASSERT_TRUE(result == nullptr);
3931
3932 // Set the prefix, and expect to get a synthesized AAAA record.
3933 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix2).isOk());
3934 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3935 ASSERT_FALSE(result == nullptr);
3936 EXPECT_EQ("2001:db8:6464::102:304", ToString(result));
3937
3938 // Update the prefix, expect to see AAAA records from the new prefix.
3939 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3940 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3941 ASSERT_FALSE(result == nullptr);
3942 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3943
3944 // Non-/96 prefixes are ignored.
3945 auto status = resolvService->setPrefix64(TEST_NETID, "64:ff9b::/64");
3946 EXPECT_FALSE(status.isOk());
3947 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3948 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3949
3950 // Invalid prefixes are ignored.
3951 status = resolvService->setPrefix64(TEST_NETID, "192.0.2.0/24");
3952 EXPECT_FALSE(status.isOk());
3953 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3954 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3955
3956 status = resolvService->setPrefix64(TEST_NETID, "192.0.2.1");
3957 EXPECT_FALSE(status.isOk());
3958 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3959 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3960
3961 status = resolvService->setPrefix64(TEST_NETID, "hello");
3962 EXPECT_FALSE(status.isOk());
3963 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3964 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3965
3966 // DNS64 synthesis is still working.
3967 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3968 ASSERT_FALSE(result == nullptr);
3969 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3970
3971 // Clear the prefix. No AAAA records any more.
3972 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, "").isOk());
3973 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3974 EXPECT_TRUE(result == nullptr);
3975
3976 // Calling startPrefix64Discovery clears the prefix.
3977 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
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 EXPECT_TRUE(resolvService->startPrefix64Discovery(TEST_NETID).isOk());
3983 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3984 ASSERT_TRUE(result == nullptr);
3985
3986 // setPrefix64 fails if prefix discovery is started, even if no prefix is yet discovered...
3987 status = resolvService->setPrefix64(TEST_NETID, kNat64Prefix1);
3988 EXPECT_FALSE(status.isOk());
3989 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3990 EXPECT_EQ(EEXIST, status.getServiceSpecificError());
3991
3992 // .. and clearing the prefix also has no effect.
3993 status = resolvService->setPrefix64(TEST_NETID, "");
3994 EXPECT_FALSE(status.isOk());
3995 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3996 EXPECT_EQ(ENOENT, status.getServiceSpecificError());
3997
3998 // setPrefix64 succeeds again when prefix discovery is stopped.
3999 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
4000 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
4001 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
4002 ASSERT_FALSE(result == nullptr);
4003 EXPECT_EQ("64:ff9b::102:304", ToString(result));
4004
4005 // Calling stopPrefix64Discovery clears the prefix.
4006 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
4007 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
4008 ASSERT_TRUE(result == nullptr);
4009
4010 // Set up NAT64 prefix discovery.
4011 constexpr char dns64_name[] = "ipv4only.arpa.";
4012 const std::vector<DnsRecord> newRecords = {
4013 {host_name, ns_type::ns_t_a, "1.2.3.4"},
4014 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
4015 };
4016 dns.stopServer();
4017 StartDns(dns, newRecords);
4018
4019 EXPECT_TRUE(resolvService->startPrefix64Discovery(TEST_NETID).isOk());
4020 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
4021 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
4022 ASSERT_FALSE(result == nullptr);
4023 EXPECT_EQ("64:ff9b::102:304", ToString(result));
4024
4025 // setPrefix64 fails if NAT64 prefix discovery has succeeded, and the discovered prefix
4026 // continues to be used.
4027 status = resolvService->setPrefix64(TEST_NETID, kNat64Prefix2);
4028 EXPECT_FALSE(status.isOk());
4029 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
4030 EXPECT_EQ(EEXIST, status.getServiceSpecificError());
4031
4032 // Clearing the prefix also has no effect if discovery is started.
4033 status = resolvService->setPrefix64(TEST_NETID, "");
4034 EXPECT_FALSE(status.isOk());
4035 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
4036 EXPECT_EQ(ENOENT, status.getServiceSpecificError());
4037
4038 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
4039 ASSERT_FALSE(result == nullptr);
4040 EXPECT_EQ("64:ff9b::102:304", ToString(result));
4041
4042 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
4043 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_NOT_FOUND));
Lorenzo Colitti61f796b2020-05-21 00:57:49 +09004044
4045 EXPECT_EQ(0, sDnsMetricsListener->getUnexpectedNat64PrefixUpdates());
Lorenzo Colittie51091d2020-05-20 02:48:44 +09004046}
4047
Luke Huang9807e6b2019-05-20 16:17:12 +08004048namespace {
4049
Luke Huang0d592bc2019-05-25 18:24:03 +08004050class ScopedSetNetworkForProcess {
4051 public:
4052 explicit ScopedSetNetworkForProcess(unsigned netId) {
4053 mStoredNetId = getNetworkForProcess();
4054 if (netId == mStoredNetId) return;
4055 EXPECT_EQ(0, setNetworkForProcess(netId));
4056 }
4057 ~ScopedSetNetworkForProcess() { EXPECT_EQ(0, setNetworkForProcess(mStoredNetId)); }
4058
4059 private:
4060 unsigned mStoredNetId;
4061};
4062
4063class ScopedSetNetworkForResolv {
4064 public:
4065 explicit ScopedSetNetworkForResolv(unsigned netId) { EXPECT_EQ(0, setNetworkForResolv(netId)); }
4066 ~ScopedSetNetworkForResolv() { EXPECT_EQ(0, setNetworkForResolv(NETID_UNSET)); }
4067};
4068
Luke Huang9807e6b2019-05-20 16:17:12 +08004069void sendCommand(int fd, const std::string& cmd) {
4070 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size() + 1));
4071 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size() + 1));
4072}
4073
4074int32_t readBE32(int fd) {
4075 int32_t tmp;
4076 int n = TEMP_FAILURE_RETRY(read(fd, &tmp, sizeof(tmp)));
4077 EXPECT_TRUE(n > 0);
4078 return ntohl(tmp);
4079}
4080
Luke Huang0d592bc2019-05-25 18:24:03 +08004081int readResponseCode(int fd) {
Luke Huang9807e6b2019-05-20 16:17:12 +08004082 char buf[4];
4083 int n = TEMP_FAILURE_RETRY(read(fd, &buf, sizeof(buf)));
4084 EXPECT_TRUE(n > 0);
4085 // The format of response code is that 4 bytes for the code & null.
4086 buf[3] = '\0';
4087 int result;
4088 EXPECT_TRUE(ParseInt(buf, &result));
4089 return result;
4090}
4091
Luke Huang0d592bc2019-05-25 18:24:03 +08004092bool checkAndClearUseLocalNameserversFlag(unsigned* netid) {
4093 if (netid == nullptr || ((*netid) & NETID_USE_LOCAL_NAMESERVERS) == 0) {
4094 return false;
4095 }
4096 *netid = (*netid) & ~NETID_USE_LOCAL_NAMESERVERS;
4097 return true;
4098}
4099
Luke Huangf8215372019-11-22 11:53:41 +08004100aidl::android::net::UidRangeParcel makeUidRangeParcel(int start, int stop) {
4101 aidl::android::net::UidRangeParcel res;
Luke Huang0d592bc2019-05-25 18:24:03 +08004102 res.start = start;
4103 res.stop = stop;
4104
4105 return res;
4106}
4107
4108void expectNetIdWithLocalNameserversFlag(unsigned netId) {
4109 unsigned dnsNetId = 0;
4110 EXPECT_EQ(0, getNetworkForDns(&dnsNetId));
4111 EXPECT_TRUE(checkAndClearUseLocalNameserversFlag(&dnsNetId));
4112 EXPECT_EQ(netId, static_cast<unsigned>(dnsNetId));
4113}
4114
4115void expectDnsNetIdEquals(unsigned netId) {
4116 unsigned dnsNetId = 0;
4117 EXPECT_EQ(0, getNetworkForDns(&dnsNetId));
4118 EXPECT_EQ(netId, static_cast<unsigned>(dnsNetId));
4119}
4120
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004121void expectDnsNetIdIsDefaultNetwork(INetd* netdService) {
Luke Huang0d592bc2019-05-25 18:24:03 +08004122 int currentNetid;
4123 EXPECT_TRUE(netdService->networkGetDefault(&currentNetid).isOk());
4124 expectDnsNetIdEquals(currentNetid);
4125}
4126
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004127void expectDnsNetIdWithVpn(INetd* netdService, unsigned vpnNetId, unsigned expectedNetId) {
Luke Huang0d592bc2019-05-25 18:24:03 +08004128 EXPECT_TRUE(netdService->networkCreateVpn(vpnNetId, false /* secure */).isOk());
4129 uid_t uid = getuid();
4130 // Add uid to VPN
4131 EXPECT_TRUE(netdService->networkAddUidRanges(vpnNetId, {makeUidRangeParcel(uid, uid)}).isOk());
4132 expectDnsNetIdEquals(expectedNetId);
4133 EXPECT_TRUE(netdService->networkDestroy(vpnNetId).isOk());
4134}
4135
Luke Huang9807e6b2019-05-20 16:17:12 +08004136} // namespace
4137
4138TEST_F(ResolverTest, getDnsNetId) {
4139 // We've called setNetworkForProcess in SetupOemNetwork, so reset to default first.
4140 setNetworkForProcess(NETID_UNSET);
Luke Huang0d592bc2019-05-25 18:24:03 +08004141
4142 expectDnsNetIdIsDefaultNetwork(mDnsClient.netdService());
4143 expectDnsNetIdWithVpn(mDnsClient.netdService(), TEST_VPN_NETID, TEST_VPN_NETID);
Luke Huang9807e6b2019-05-20 16:17:12 +08004144
4145 // Test with setNetworkForProcess
Luke Huang0d592bc2019-05-25 18:24:03 +08004146 {
4147 ScopedSetNetworkForProcess scopedSetNetworkForProcess(TEST_NETID);
4148 expectDnsNetIdEquals(TEST_NETID);
4149 }
4150
4151 // Test with setNetworkForProcess with NETID_USE_LOCAL_NAMESERVERS
4152 {
4153 ScopedSetNetworkForProcess scopedSetNetworkForProcess(TEST_NETID |
4154 NETID_USE_LOCAL_NAMESERVERS);
4155 expectNetIdWithLocalNameserversFlag(TEST_NETID);
4156 }
Luke Huang9807e6b2019-05-20 16:17:12 +08004157
4158 // Test with setNetworkForResolv
Luke Huang0d592bc2019-05-25 18:24:03 +08004159 {
4160 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID);
4161 expectDnsNetIdEquals(TEST_NETID);
4162 }
4163
4164 // Test with setNetworkForResolv with NETID_USE_LOCAL_NAMESERVERS
4165 {
4166 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID |
4167 NETID_USE_LOCAL_NAMESERVERS);
4168 expectNetIdWithLocalNameserversFlag(TEST_NETID);
4169 }
4170
4171 // Test with setNetworkForResolv under bypassable vpn
4172 {
4173 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID);
4174 expectDnsNetIdWithVpn(mDnsClient.netdService(), TEST_VPN_NETID, TEST_NETID);
4175 }
Luke Huang9807e6b2019-05-20 16:17:12 +08004176
4177 // Create socket connected to DnsProxyListener
4178 int fd = dns_open_proxy();
4179 EXPECT_TRUE(fd > 0);
4180 unique_fd ufd(fd);
4181
4182 // Test command with wrong netId
4183 sendCommand(fd, "getdnsnetid abc");
Luke Huang0d592bc2019-05-25 18:24:03 +08004184 EXPECT_EQ(ResponseCode::DnsProxyQueryResult, readResponseCode(fd));
Luke Huang9807e6b2019-05-20 16:17:12 +08004185 EXPECT_EQ(-EINVAL, readBE32(fd));
4186
4187 // Test unsupported command
4188 sendCommand(fd, "getdnsnetidNotSupported");
4189 // Keep in sync with FrameworkListener.cpp (500, "Command not recognized")
Luke Huang0d592bc2019-05-25 18:24:03 +08004190 EXPECT_EQ(500, readResponseCode(fd));
Luke Huang9807e6b2019-05-20 16:17:12 +08004191}
Sehee Park2c118782019-05-07 13:02:45 +09004192
4193TEST_F(ResolverTest, BlockDnsQueryWithUidRule) {
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004194 // This test relies on blocking traffic on loopback, which xt_qtaguid does not do.
4195 // See aosp/358413 and b/34444781 for why.
4196 SKIP_IF_BPF_NOT_SUPPORTED;
4197
Sehee Park2c118782019-05-07 13:02:45 +09004198 constexpr char listen_addr1[] = "127.0.0.4";
4199 constexpr char listen_addr2[] = "::1";
4200 constexpr char host_name[] = "howdy.example.com.";
4201 const std::vector<DnsRecord> records = {
4202 {host_name, ns_type::ns_t_a, "1.2.3.4"},
4203 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
4204 };
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004205 INetd* netdService = mDnsClient.netdService();
Sehee Park2c118782019-05-07 13:02:45 +09004206
4207 test::DNSResponder dns1(listen_addr1);
4208 test::DNSResponder dns2(listen_addr2);
4209 StartDns(dns1, records);
4210 StartDns(dns2, records);
4211
4212 std::vector<std::string> servers = {listen_addr1, listen_addr2};
4213 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
4214 dns1.clearQueries();
4215 dns2.clearQueries();
4216
Luke Huangeb618ef2020-05-26 14:17:02 +08004217 ScopeBlockedUIDRule scopeBlockUidRule(netdService, TEST_UID);
Sehee Park2c118782019-05-07 13:02:45 +09004218 // Dns Query
4219 int fd1 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_a, 0);
4220 int fd2 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_aaaa, 0);
4221 EXPECT_TRUE(fd1 != -1);
4222 EXPECT_TRUE(fd2 != -1);
4223
Luke Huang5729afc2020-07-30 23:12:17 +08004224 uint8_t buf1[MAXPACKET] = {};
4225 uint8_t buf2[MAXPACKET] = {};
Sehee Park2c118782019-05-07 13:02:45 +09004226 int rcode;
Luke Huang5729afc2020-07-30 23:12:17 +08004227 int res2 = getAsyncResponse(fd2, &rcode, buf2, MAXPACKET);
4228 int res1 = getAsyncResponse(fd1, &rcode, buf1, MAXPACKET);
4229 // If API level >= 30 (R+), these queries should be blocked.
4230 if (isAtLeastR) {
4231 EXPECT_EQ(res2, -ECONNREFUSED);
4232 EXPECT_EQ(res1, -ECONNREFUSED);
4233 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, EAI_SYSTEM, "howdy.example.com", {});
4234 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, EAI_SYSTEM, "howdy.example.com", {});
4235 } else {
4236 EXPECT_GT(res2, 0);
4237 EXPECT_EQ("::1.2.3.4", toString(buf2, res2, AF_INET6));
4238 EXPECT_GT(res1, 0);
4239 EXPECT_EQ("1.2.3.4", toString(buf1, res1, AF_INET));
4240 // To avoid flaky test, do not evaluate DnsEvent since event order is not guaranteed.
4241 }
Sehee Park2c118782019-05-07 13:02:45 +09004242}
Mike Yua772c202019-09-23 17:47:21 +08004243
Ken Chenbc481b82020-05-21 23:30:01 +08004244TEST_F(ResolverTest, EnforceDnsUid) {
4245 SKIP_IF_BPF_NOT_SUPPORTED;
4246
4247 constexpr char listen_addr1[] = "127.0.0.4";
4248 constexpr char listen_addr2[] = "::1";
4249 constexpr char host_name[] = "howdy.example.com.";
4250 const std::vector<DnsRecord> records = {
4251 {host_name, ns_type::ns_t_a, "1.2.3.4"},
4252 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
4253 };
4254 INetd* netdService = mDnsClient.netdService();
4255
4256 test::DNSResponder dns1(listen_addr1);
4257 test::DNSResponder dns2(listen_addr2);
4258 StartDns(dns1, records);
4259 StartDns(dns2, records);
4260
4261 // switch uid of DNS queries from applications to AID_DNS
4262 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4263 parcel.servers = {listen_addr1, listen_addr2};
4264 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk());
4265
4266 uint8_t buf[MAXPACKET] = {};
Luke Huang5729afc2020-07-30 23:12:17 +08004267 uint8_t buf2[MAXPACKET] = {};
Ken Chenbc481b82020-05-21 23:30:01 +08004268 int rcode;
4269 {
4270 ScopeBlockedUIDRule scopeBlockUidRule(netdService, TEST_UID);
4271 // Dns Queries should be blocked
Luke Huang5729afc2020-07-30 23:12:17 +08004272 const int fd1 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_a, 0);
4273 const int fd2 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_aaaa, 0);
Ken Chenbc481b82020-05-21 23:30:01 +08004274 EXPECT_TRUE(fd1 != -1);
4275 EXPECT_TRUE(fd2 != -1);
4276
Luke Huang5729afc2020-07-30 23:12:17 +08004277 const int res2 = getAsyncResponse(fd2, &rcode, buf2, MAXPACKET);
4278 const int res1 = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
4279 // If API level >= 30 (R+), the query should be blocked.
4280 if (isAtLeastR) {
4281 EXPECT_EQ(res2, -ECONNREFUSED);
4282 EXPECT_EQ(res1, -ECONNREFUSED);
4283 } else {
4284 EXPECT_GT(res2, 0);
4285 EXPECT_EQ("::1.2.3.4", toString(buf2, res2, AF_INET6));
4286 EXPECT_GT(res1, 0);
4287 EXPECT_EQ("1.2.3.4", toString(buf, res1, AF_INET));
4288 }
Ken Chenbc481b82020-05-21 23:30:01 +08004289 }
4290
Luke Huang5729afc2020-07-30 23:12:17 +08004291 memset(buf, 0, MAXPACKET);
Ken Chenbc481b82020-05-21 23:30:01 +08004292 parcel.resolverOptions.enforceDnsUid = true;
4293 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk());
4294 {
4295 ScopeBlockedUIDRule scopeBlockUidRule(netdService, TEST_UID);
4296 // Dns Queries should NOT be blocked
4297 int fd1 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_a, 0);
4298 int fd2 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_aaaa, 0);
4299 EXPECT_TRUE(fd1 != -1);
4300 EXPECT_TRUE(fd2 != -1);
4301
4302 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
4303 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
4304
4305 memset(buf, 0, MAXPACKET);
4306 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
4307 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
4308
4309 // @TODO: So far we know that uid of DNS queries are no more set to DNS requester. But we
4310 // don't check if they are actually being set to AID_DNS, because system uids are always
4311 // allowed in bpf_owner_match(). Audit by firewallSetUidRule(AID_DNS) + sending queries is
4312 // infeasible. Fix it if the behavior of bpf_owner_match() is changed in the future, or if
4313 // we have better idea to deal with this.
4314 }
4315}
4316
Mike Yua772c202019-09-23 17:47:21 +08004317TEST_F(ResolverTest, ConnectTlsServerTimeout) {
Mike Yu40e67072019-10-09 21:14:09 +08004318 constexpr char hostname1[] = "query1.example.com.";
4319 constexpr char hostname2[] = "query2.example.com.";
Mike Yua772c202019-09-23 17:47:21 +08004320 const std::vector<DnsRecord> records = {
Mike Yu40e67072019-10-09 21:14:09 +08004321 {hostname1, ns_type::ns_t_a, "1.2.3.4"},
4322 {hostname2, ns_type::ns_t_a, "1.2.3.5"},
Mike Yua772c202019-09-23 17:47:21 +08004323 };
4324
Mike Yu40e67072019-10-09 21:14:09 +08004325 // The resolver will adjust the timeout value to 1000ms since the value is too small.
4326 ScopedSystemProperties scopedSystemProperties(kDotConnectTimeoutMsFlag, "100");
Mike Yua772c202019-09-23 17:47:21 +08004327
Mike Yue93d9ae2020-08-25 19:09:51 +08004328 static const struct TestConfig {
4329 bool asyncHandshake;
Mike Yubb499092020-08-28 19:18:42 +08004330 int maxRetries;
4331
4332 // if asyncHandshake:
4333 // expectedTimeout = dotConnectTimeoutMs * maxRetries
4334 // otherwise:
4335 // expectedTimeout = dotConnectTimeoutMs
Mike Yue93d9ae2020-08-25 19:09:51 +08004336 int expectedTimeout;
4337 } testConfigs[] = {
Mike Yubb499092020-08-28 19:18:42 +08004338 // Test mis-configured dot_maxtries flag.
4339 {false, 0, 1000}, {true, 0, 1000},
Mike Yua772c202019-09-23 17:47:21 +08004340
Mike Yubb499092020-08-28 19:18:42 +08004341 {false, 1, 1000}, {false, 3, 1000}, {true, 1, 1000}, {true, 3, 3000},
Mike Yue93d9ae2020-08-25 19:09:51 +08004342 };
Mike Yua772c202019-09-23 17:47:21 +08004343
Mike Yue93d9ae2020-08-25 19:09:51 +08004344 for (const auto& config : testConfigs) {
Mike Yubb499092020-08-28 19:18:42 +08004345 SCOPED_TRACE(fmt::format("testConfig: [{}, {}]", config.asyncHandshake, config.maxRetries));
Mike Yua772c202019-09-23 17:47:21 +08004346
Mike Yue93d9ae2020-08-25 19:09:51 +08004347 // Because a DnsTlsTransport lasts at least 5 minutes in spite of network
4348 // destroyed, let the resolver creates an unique DnsTlsTransport every time
4349 // so that the DnsTlsTransport won't interfere the other tests.
4350 const std::string addr = getUniqueIPv4Address();
4351 test::DNSResponder dns(addr);
4352 StartDns(dns, records);
4353 test::DnsTlsFrontend tls(addr, "853", addr, "53");
4354 ASSERT_TRUE(tls.startServer());
Mike Yua772c202019-09-23 17:47:21 +08004355
Mike Yubb499092020-08-28 19:18:42 +08004356 ScopedSystemProperties scopedSystemProperties1(kDotAsyncHandshakeFlag,
4357 config.asyncHandshake ? "1" : "0");
4358 ScopedSystemProperties scopedSystemProperties2(kDotMaxretriesFlag,
4359 std::to_string(config.maxRetries));
Mike Yue93d9ae2020-08-25 19:09:51 +08004360 resetNetwork();
Mike Yu40e67072019-10-09 21:14:09 +08004361
Mike Yue93d9ae2020-08-25 19:09:51 +08004362 // Set up resolver to opportunistic mode.
4363 auto parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4364 parcel.servers = {addr};
4365 parcel.tlsServers = {addr};
4366 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4367 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
4368 EXPECT_TRUE(tls.waitForQueries(1));
4369 tls.clearQueries();
4370 dns.clearQueries();
Mike Yu40e67072019-10-09 21:14:09 +08004371
Mike Yue93d9ae2020-08-25 19:09:51 +08004372 // The server becomes unresponsive to the handshake request.
4373 tls.setHangOnHandshakeForTesting(true);
Mike Yu40e67072019-10-09 21:14:09 +08004374
Mike Yue93d9ae2020-08-25 19:09:51 +08004375 // Expect the things happening in getaddrinfo():
4376 // 1. Connect to the private DNS server.
4377 // 2. SSL handshake times out.
4378 // 3. Fallback to UDP transport, and then get the answer.
4379 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4380 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(hostname1, nullptr, hints);
4381
4382 EXPECT_NE(nullptr, result);
4383 EXPECT_EQ(0, tls.queries());
4384 EXPECT_EQ(1U, GetNumQueries(dns, hostname1));
4385 EXPECT_EQ(records.at(0).addr, ToString(result));
4386
4387 // A loose upper bound is set by adding 1000ms buffer time. Theoretically, getaddrinfo()
4388 // should just take a bit more than expetTimeout milliseconds.
4389 EXPECT_GE(timeTakenMs, config.expectedTimeout);
4390 EXPECT_LE(timeTakenMs, config.expectedTimeout + 1000);
4391
4392 // Set the server to be responsive. Verify that the resolver will attempt to reconnect
4393 // to the server and then get the result within the timeout.
4394 tls.setHangOnHandshakeForTesting(false);
4395 std::tie(result, timeTakenMs) = safe_getaddrinfo_time_taken(hostname2, nullptr, hints);
4396
4397 EXPECT_NE(nullptr, result);
4398 EXPECT_TRUE(tls.waitForQueries(1));
4399 EXPECT_EQ(1U, GetNumQueries(dns, hostname2));
4400 EXPECT_EQ(records.at(1).addr, ToString(result));
4401
4402 EXPECT_LE(timeTakenMs, 200);
4403 }
4404}
4405
4406TEST_F(ResolverTest, ConnectTlsServerTimeout_ConcurrentQueries) {
4407 constexpr uint32_t cacheFlag = ANDROID_RESOLV_NO_CACHE_LOOKUP;
4408 constexpr char hostname[] = "hello.example.com.";
4409 const std::vector<DnsRecord> records = {
4410 {hostname, ns_type::ns_t_a, "1.2.3.4"},
4411 };
4412
4413 static const struct TestConfig {
4414 bool asyncHandshake;
4415 int dotConnectTimeoutMs;
Mike Yubb499092020-08-28 19:18:42 +08004416 int maxRetries;
Mike Yue93d9ae2020-08-25 19:09:51 +08004417 int concurrency;
Mike Yubb499092020-08-28 19:18:42 +08004418
4419 // if asyncHandshake:
4420 // expectedTimeout = dotConnectTimeoutMs * maxRetries
4421 // otherwise:
4422 // expectedTimeout = dotConnectTimeoutMs * concurrency
Mike Yue93d9ae2020-08-25 19:09:51 +08004423 int expectedTimeout;
4424 } testConfigs[] = {
Mike Yubb499092020-08-28 19:18:42 +08004425 // clang-format off
4426 {false, 1000, 1, 5, 5000},
4427 {false, 1000, 3, 5, 5000},
4428 {true, 1000, 1, 5, 1000},
4429 {true, 2500, 1, 10, 2500},
4430 {true, 1000, 3, 5, 3000},
4431 // clang-format on
Mike Yue93d9ae2020-08-25 19:09:51 +08004432 };
4433
4434 // Launch query threads. Expected behaviors are:
4435 // - when dot_async_handshake is disabled, one of the query threads triggers a
4436 // handshake and then times out. Then same as another query thread, and so forth.
4437 // - when dot_async_handshake is enabled, only one handshake is triggered, and then
4438 // all of the query threads time out at the same time.
4439 for (const auto& config : testConfigs) {
4440 ScopedSystemProperties scopedSystemProperties1(kDotConnectTimeoutMsFlag,
4441 std::to_string(config.dotConnectTimeoutMs));
4442 ScopedSystemProperties scopedSystemProperties2(kDotAsyncHandshakeFlag,
4443 config.asyncHandshake ? "1" : "0");
Mike Yubb499092020-08-28 19:18:42 +08004444 ScopedSystemProperties scopedSystemProperties3(kDotMaxretriesFlag,
4445 std::to_string(config.maxRetries));
Mike Yue93d9ae2020-08-25 19:09:51 +08004446 resetNetwork();
4447
4448 for (const auto& dnsMode : {"OPPORTUNISTIC", "STRICT"}) {
4449 SCOPED_TRACE(fmt::format("testConfig: [{}, {}]", config.asyncHandshake, dnsMode));
4450
4451 // Because a DnsTlsTransport lasts at least 5 minutes in spite of network
4452 // destroyed, let the resolver creates an unique DnsTlsTransport every time
4453 // so that the DnsTlsTransport won't interfere the other tests.
4454 const std::string addr = getUniqueIPv4Address();
4455 test::DNSResponder dns(addr);
4456 StartDns(dns, records);
4457 test::DnsTlsFrontend tls(addr, "853", addr, "53");
4458 ASSERT_TRUE(tls.startServer());
4459
4460 auto parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4461 parcel.servers = {addr};
4462 parcel.tlsServers = {addr};
4463 if (dnsMode == "STRICT") parcel.tlsName = kDefaultPrivateDnsHostName;
4464 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4465 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
4466 EXPECT_TRUE(tls.waitForQueries(1));
4467
4468 // The server becomes unresponsive to the handshake request.
4469 tls.setHangOnHandshakeForTesting(true);
4470
4471 Stopwatch s;
4472 std::vector<std::thread> threads(config.concurrency);
4473 for (std::thread& thread : threads) {
4474 thread = std::thread([&]() {
4475 int fd = resNetworkQuery(TEST_NETID, hostname, ns_c_in, ns_t_a, cacheFlag);
4476 dnsMode == "STRICT" ? expectAnswersNotValid(fd, -ETIMEDOUT)
4477 : expectAnswersValid(fd, AF_INET, "1.2.3.4");
4478 });
4479 }
4480 for (std::thread& thread : threads) {
4481 thread.join();
4482 }
4483
4484 const int timeTakenMs = s.timeTakenUs() / 1000;
4485 // A loose upper bound is set by adding 1000ms buffer time. Theoretically, it should
4486 // just take a bit more than expetTimeout milliseconds for the result.
4487 EXPECT_GE(timeTakenMs, config.expectedTimeout);
4488 EXPECT_LE(timeTakenMs, config.expectedTimeout + 1000);
4489
4490 // Recover the server from being unresponsive and try again.
4491 tls.setHangOnHandshakeForTesting(false);
4492 int fd = resNetworkQuery(TEST_NETID, hostname, ns_c_in, ns_t_a, cacheFlag);
4493 expectAnswersValid(fd, AF_INET, "1.2.3.4");
4494 }
4495 }
Mike Yua772c202019-09-23 17:47:21 +08004496}
Hungming Chenbb90ab32019-10-28 18:20:31 +08004497
Ken Chen766feae2019-10-30 15:13:44 +08004498TEST_F(ResolverTest, FlushNetworkCache) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004499 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004500 test::DNSResponder dns;
4501 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4502 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4503
4504 const hostent* result = gethostbyname("hello");
4505 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4506
4507 // get result from cache
4508 result = gethostbyname("hello");
4509 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4510
4511 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4512
4513 result = gethostbyname("hello");
4514 EXPECT_EQ(2U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4515}
4516
4517TEST_F(ResolverTest, FlushNetworkCache_random) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004518 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004519 constexpr int num_flush = 10;
4520 constexpr int num_queries = 20;
4521 test::DNSResponder dns;
4522 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4523 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4524 const addrinfo hints = {.ai_family = AF_INET};
4525
4526 std::thread t([this]() {
4527 for (int i = 0; i < num_flush; ++i) {
4528 unsigned delay = arc4random_uniform(10 * 1000); // 10ms
4529 usleep(delay);
4530 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4531 }
4532 });
4533
4534 for (int i = 0; i < num_queries; ++i) {
4535 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4536 EXPECT_TRUE(result != nullptr);
4537 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4538 }
4539 t.join();
4540}
4541
4542// flush cache while one query is wait-for-response, another is pending.
4543TEST_F(ResolverTest, FlushNetworkCache_concurrent) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004544 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004545 const char* listen_addr1 = "127.0.0.9";
4546 const char* listen_addr2 = "127.0.0.10";
4547 test::DNSResponder dns1(listen_addr1);
4548 test::DNSResponder dns2(listen_addr2);
4549 StartDns(dns1, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4550 StartDns(dns2, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4551 addrinfo hints = {.ai_family = AF_INET};
4552
4553 // step 1: set server#1 into deferred responding mode
4554 dns1.setDeferredResp(true);
4555 std::thread t1([&listen_addr1, &hints, this]() {
4556 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr1}));
4557 // step 3: query
4558 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4559 // step 9: check result
4560 EXPECT_TRUE(result != nullptr);
4561 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4562 });
4563
4564 // step 2: wait for the query to reach the server
4565 while (GetNumQueries(dns1, kHelloExampleCom) == 0) {
4566 usleep(1000); // 1ms
4567 }
4568
4569 std::thread t2([&listen_addr2, &hints, &dns2, this]() {
4570 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr2}));
4571 // step 5: query (should be blocked in resolver)
4572 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4573 // step 7: check result
4574 EXPECT_TRUE(result != nullptr);
4575 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4576 EXPECT_EQ(1U, GetNumQueriesForType(dns2, ns_type::ns_t_a, kHelloExampleCom));
4577 });
4578
4579 // step 4: wait a bit for the 2nd query to enter pending state
4580 usleep(100 * 1000); // 100ms
4581 // step 6: flush cache (will unblock pending queries)
4582 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4583 t2.join();
4584
4585 // step 8: resume server#1
4586 dns1.setDeferredResp(false);
4587 t1.join();
4588
4589 // step 10: verify if result is correctly cached
4590 dns2.clearQueries();
4591 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4592 EXPECT_EQ(0U, GetNumQueries(dns2, kHelloExampleCom));
4593 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4594}
4595
waynema29253052019-08-20 11:26:08 +08004596// TODO: Perhaps to have a boundary conditions test for TCP and UDP.
4597TEST_F(ResolverTest, TcpQueryWithOversizePayload) {
4598 test::DNSResponder dns;
4599 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4600 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4601
4602 int fd = dns_open_proxy();
4603 ASSERT_TRUE(fd > 0);
4604
4605 // Sending DNS query over TCP once the packet sizes exceed 512 bytes.
4606 // The raw data is combined with Question section and Additional section
4607 // Question section : query "hello.example.com", type A, class IN
4608 // Additional section : type OPT (41), Option PADDING, Option Length 546
4609 // Padding option which allows DNS clients and servers to artificially
4610 // increase the size of a DNS message by a variable number of bytes.
4611 // See also RFC7830, section 3
4612 const std::string query =
4613 "+c0BAAABAAAAAAABBWhlbGxvB2V4YW1wbGUDY29tAAABAAEAACkgAAAAgAACJgAMAiIAAAAAAAAAAAAAAAAAA"
4614 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4615 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4616 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4617 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4618 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4619 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4620 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4621 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4622 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
4623 const std::string cmd =
4624 "resnsend " + std::to_string(TEST_NETID) + " 0 " /* ResNsendFlags */ + query + '\0';
4625 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
4626 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
4627 expectAnswersValid(fd, AF_INET, kHelloExampleComAddrV4);
4628 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom));
4629 EXPECT_EQ(0U, GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom));
4630}
4631
Ken Chen99344882020-01-01 14:59:38 +08004632TEST_F(ResolverTest, TruncatedRspMode) {
4633 constexpr char listen_addr[] = "127.0.0.4";
4634 constexpr char listen_addr2[] = "127.0.0.5";
4635 constexpr char listen_srv[] = "53";
4636
4637 test::DNSResponder dns(listen_addr, listen_srv, static_cast<ns_rcode>(-1));
4638 test::DNSResponder dns2(listen_addr2, listen_srv, static_cast<ns_rcode>(-1));
4639 // dns supports UDP only, dns2 support UDP and TCP
4640 dns.setResponseProbability(0.0, IPPROTO_TCP);
4641 StartDns(dns, kLargeCnameChainRecords);
4642 StartDns(dns2, kLargeCnameChainRecords);
4643
4644 const struct TestConfig {
4645 const std::optional<int32_t> tcMode;
4646 const bool ret;
4647 const unsigned numQueries;
4648 std::string asParameters() const {
4649 return StringPrintf("tcMode: %d, ret: %s, numQueries: %u", tcMode.value_or(-1),
4650 ret ? "true" : "false", numQueries);
4651 }
4652 } testConfigs[]{
4653 // clang-format off
4654 {std::nullopt, true, 0}, /* mode unset */
4655 {aidl::android::net::IDnsResolver::TC_MODE_DEFAULT, true, 0}, /* default mode */
4656 {aidl::android::net::IDnsResolver::TC_MODE_UDP_TCP, true, 1}, /* alternative mode */
4657 {-666, false, 1}, /* invalid input */
4658 // clang-format on
4659 };
4660
4661 for (const auto& config : testConfigs) {
4662 SCOPED_TRACE(config.asParameters());
4663
4664 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4665 parcel.servers = {listen_addr, listen_addr2};
4666 if (config.tcMode) {
Ken Chena6ac2a62020-04-07 17:25:56 +08004667 parcel.resolverOptions.tcMode = config.tcMode.value();
Ken Chen99344882020-01-01 14:59:38 +08004668 }
4669 ASSERT_EQ(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk(), config.ret);
4670
4671 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4672 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4673 ASSERT_TRUE(result != nullptr);
4674 EXPECT_EQ(ToString(result), kHelloExampleComAddrV4);
4675 // TC_MODE_DEFAULT: resolver retries on TCP-only on each name server.
4676 // TC_MODE_UDP_TCP: resolver retries on TCP on the same server, falls back to UDP from next.
4677 ASSERT_EQ(GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom), 1U);
4678 ASSERT_EQ(GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom), 1U);
4679 ASSERT_EQ(GetNumQueriesForProtocol(dns2, IPPROTO_UDP, kHelloExampleCom), config.numQueries);
4680 ASSERT_EQ(GetNumQueriesForProtocol(dns2, IPPROTO_TCP, kHelloExampleCom), 1U);
4681
4682 dns.clearQueries();
4683 dns2.clearQueries();
4684 ASSERT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
Mike Yu61d17262020-02-15 18:56:22 +08004685
4686 // Clear the stats to make the resolver always choose the same server for the first query.
4687 parcel.servers.clear();
4688 parcel.tlsServers.clear();
4689 ASSERT_EQ(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk(), config.ret);
Ken Chen99344882020-01-01 14:59:38 +08004690 }
4691}
4692
Mike Yu153b5b82020-03-04 19:53:54 +08004693TEST_F(ResolverTest, RepeatedSetup_ResolverStatusRemains) {
4694 constexpr char unusable_listen_addr[] = "127.0.0.3";
4695 constexpr char listen_addr[] = "127.0.0.4";
4696 constexpr char hostname[] = "a.hello.query.";
4697 const auto repeatedSetResolversFromParcel = [&](const ResolverParamsParcel& parcel) {
4698 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4699 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4700 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4701 };
4702
4703 test::DNSResponder dns(listen_addr);
4704 StartDns(dns, {{hostname, ns_type::ns_t_a, "1.2.3.3"}});
4705 test::DnsTlsFrontend tls1(listen_addr, "853", listen_addr, "53");
4706 ASSERT_TRUE(tls1.startServer());
4707
4708 // Private DNS off mode.
4709 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4710 parcel.servers = {unusable_listen_addr, listen_addr};
4711 parcel.tlsServers.clear();
4712 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4713
4714 // Send a query.
4715 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4716 EXPECT_NE(safe_getaddrinfo(hostname, nullptr, &hints), nullptr);
4717
4718 // Check the stats as expected.
4719 const std::vector<NameserverStats> expectedCleartextDnsStats = {
4720 NameserverStats(unusable_listen_addr).setInternalErrors(1),
4721 NameserverStats(listen_addr).setSuccesses(1),
4722 };
Mike Yu61d17262020-02-15 18:56:22 +08004723 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu153b5b82020-03-04 19:53:54 +08004724 EXPECT_EQ(GetNumQueries(dns, hostname), 1U);
4725
4726 // The stats is supposed to remain as long as the list of cleartext DNS servers is unchanged.
4727 static const struct TestConfig {
4728 std::vector<std::string> servers;
4729 std::vector<std::string> tlsServers;
4730 std::string tlsName;
4731 } testConfigs[] = {
4732 // Private DNS opportunistic mode.
4733 {{listen_addr, unusable_listen_addr}, {listen_addr, unusable_listen_addr}, ""},
4734 {{unusable_listen_addr, listen_addr}, {unusable_listen_addr, listen_addr}, ""},
4735
4736 // Private DNS strict mode.
4737 {{listen_addr, unusable_listen_addr}, {"127.0.0.100"}, kDefaultPrivateDnsHostName},
4738 {{unusable_listen_addr, listen_addr}, {"127.0.0.100"}, kDefaultPrivateDnsHostName},
4739
4740 // Private DNS off mode.
4741 {{unusable_listen_addr, listen_addr}, {}, ""},
4742 {{listen_addr, unusable_listen_addr}, {}, ""},
4743 };
4744
4745 for (const auto& config : testConfigs) {
4746 SCOPED_TRACE(fmt::format("testConfig: [{}] [{}] [{}]", fmt::join(config.servers, ","),
4747 fmt::join(config.tlsServers, ","), config.tlsName));
4748 parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4749 parcel.servers = config.servers;
4750 parcel.tlsServers = config.tlsServers;
4751 parcel.tlsName = config.tlsName;
4752 repeatedSetResolversFromParcel(parcel);
Mike Yu61d17262020-02-15 18:56:22 +08004753 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu153b5b82020-03-04 19:53:54 +08004754
4755 // The stats remains when the list of search domains changes.
4756 parcel.domains.push_back("tmp.domains");
4757 repeatedSetResolversFromParcel(parcel);
Mike Yu61d17262020-02-15 18:56:22 +08004758 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu153b5b82020-03-04 19:53:54 +08004759
4760 // The stats remains when the parameters change (except maxSamples).
4761 parcel.sampleValiditySeconds++;
4762 parcel.successThreshold++;
4763 parcel.minSamples++;
4764 parcel.baseTimeoutMsec++;
4765 parcel.retryCount++;
4766 repeatedSetResolversFromParcel(parcel);
Mike Yu61d17262020-02-15 18:56:22 +08004767 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu153b5b82020-03-04 19:53:54 +08004768 }
4769
4770 // The cache remains.
4771 EXPECT_NE(safe_getaddrinfo(hostname, nullptr, &hints), nullptr);
4772 EXPECT_EQ(GetNumQueries(dns, hostname), 1U);
4773}
4774
4775TEST_F(ResolverTest, RepeatedSetup_NoRedundantPrivateDnsValidation) {
4776 const std::string addr1 = getUniqueIPv4Address(); // For a workable DNS server.
4777 const std::string addr2 = getUniqueIPv4Address(); // For an unresponsive DNS server.
4778 const std::string unusable_addr = getUniqueIPv4Address();
Mike Yubc4b9502020-03-20 13:14:00 +08004779 const auto waitForPrivateDnsStateUpdated = []() {
4780 // A buffer time for the PrivateDnsConfiguration instance to update its map,
4781 // mPrivateDnsValidateThreads, which is used for tracking validation threads.
4782 // Since there is a time gap between when PrivateDnsConfiguration reports
4783 // onPrivateDnsValidationEvent and when PrivateDnsConfiguration updates the map, this is a
4784 // workaround to avoid the test starts a subsequent resolver setup during the time gap.
4785 // TODO: Report onPrivateDnsValidationEvent after all the relevant updates are complete.
4786 // Reference to b/152009023.
4787 std::this_thread::sleep_for(20ms);
4788 };
Mike Yu153b5b82020-03-04 19:53:54 +08004789
4790 test::DNSResponder dns1(addr1);
4791 test::DNSResponder dns2(addr2);
4792 StartDns(dns1, {});
4793 StartDns(dns2, {});
4794 test::DnsTlsFrontend workableTls(addr1, "853", addr1, "53");
4795 test::DnsTlsFrontend unresponsiveTls(addr2, "853", addr2, "53");
4796 unresponsiveTls.setHangOnHandshakeForTesting(true);
4797 ASSERT_TRUE(workableTls.startServer());
4798 ASSERT_TRUE(unresponsiveTls.startServer());
4799
4800 // First setup.
4801 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4802 parcel.servers = {addr1, addr2, unusable_addr};
4803 parcel.tlsServers = {addr1, addr2, unusable_addr};
4804 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4805
4806 // Check the validation results.
4807 EXPECT_TRUE(WaitForPrivateDnsValidation(workableTls.listen_address(), true));
4808 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4809 EXPECT_EQ(unresponsiveTls.acceptConnectionsCount(), 1); // The validation is still in progress.
4810
4811 static const struct TestConfig {
4812 std::vector<std::string> tlsServers;
4813 std::string tlsName;
4814 } testConfigs[] = {
4815 {{addr1, addr2, unusable_addr}, ""},
4816 {{unusable_addr, addr1, addr2}, ""},
4817 {{unusable_addr, addr1, addr2}, kDefaultPrivateDnsHostName},
4818 {{addr1, addr2, unusable_addr}, kDefaultPrivateDnsHostName},
4819 };
4820
4821 std::string TlsNameLastTime;
4822 for (const auto& config : testConfigs) {
4823 SCOPED_TRACE(fmt::format("testConfig: [{}] [{}]", fmt::join(config.tlsServers, ","),
4824 config.tlsName));
4825 parcel.servers = config.tlsServers;
4826 parcel.tlsServers = config.tlsServers;
4827 parcel.tlsName = config.tlsName;
4828 parcel.caCertificate = config.tlsName.empty() ? "" : kCaCert;
4829
4830 const bool dnsModeChanged = (TlsNameLastTime != config.tlsName);
Mike Yubc4b9502020-03-20 13:14:00 +08004831
4832 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004833 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4834
4835 for (const auto& serverAddr : parcel.tlsServers) {
4836 SCOPED_TRACE(serverAddr);
4837 if (serverAddr == workableTls.listen_address()) {
4838 if (dnsModeChanged) {
4839 // In despite of the identical IP address, the server is regarded as a different
4840 // server when DnsTlsServer.name is different. The resolver treats it as a
4841 // different object and begins the validation process.
4842 EXPECT_TRUE(WaitForPrivateDnsValidation(serverAddr, true));
4843 }
4844 } else if (serverAddr == unresponsiveTls.listen_address()) {
4845 // No revalidation needed for the server which have been marked as in_progesss.
4846 } else {
4847 // Must be unusable_addr.
4848 // In opportunistic mode, when a validation for a private DNS server fails, the
4849 // resolver just marks the server as failed and doesn't re-evaluate it, but the
4850 // server can be re-evaluated when setResolverConfiguration() is called.
4851 // However, in strict mode, the resolver automatically re-evaluates the server and
4852 // marks the server as in_progress until the validation succeeds, so repeated setup
4853 // makes no effect.
4854 if (dnsModeChanged || config.tlsName.empty() /* not in strict mode */) {
4855 EXPECT_TRUE(WaitForPrivateDnsValidation(serverAddr, false));
4856 }
4857 }
4858 }
4859
4860 // Repeated setups make no effect in strict mode.
Mike Yubc4b9502020-03-20 13:14:00 +08004861 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004862 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4863 if (config.tlsName.empty()) {
4864 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4865 }
Mike Yubc4b9502020-03-20 13:14:00 +08004866 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004867 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4868 if (config.tlsName.empty()) {
4869 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4870 }
4871
4872 EXPECT_EQ(unresponsiveTls.acceptConnectionsCount(), 1);
4873
4874 TlsNameLastTime = config.tlsName;
4875 }
4876
4877 // Check that all the validation results are caught.
4878 // Note: it doesn't mean no validation being in progress.
4879 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr1));
4880 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr2));
4881 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(unusable_addr));
4882}
4883
4884TEST_F(ResolverTest, RepeatedSetup_KeepChangingPrivateDnsServers) {
4885 enum TlsServerState { WORKING, UNSUPPORTED, UNRESPONSIVE };
4886 const std::string addr1 = getUniqueIPv4Address();
4887 const std::string addr2 = getUniqueIPv4Address();
Mike Yu9a185882020-03-25 16:02:36 +08004888 const auto waitForPrivateDnsStateUpdated = []() {
4889 // A buffer time for PrivateDnsConfiguration to update its state. It prevents this test
4890 // being flaky. See b/152009023 for the reason.
4891 std::this_thread::sleep_for(20ms);
4892 };
Mike Yu153b5b82020-03-04 19:53:54 +08004893
4894 test::DNSResponder dns1(addr1);
4895 test::DNSResponder dns2(addr2);
4896 StartDns(dns1, {});
4897 StartDns(dns2, {});
4898 test::DnsTlsFrontend tls1(addr1, "853", addr1, "53");
4899 test::DnsTlsFrontend tls2(addr2, "853", addr2, "53");
4900 ASSERT_TRUE(tls1.startServer());
4901 ASSERT_TRUE(tls2.startServer());
4902
4903 static const struct TestConfig {
4904 std::string tlsServer;
4905 std::string tlsName;
4906 bool expectNothingHappenWhenServerUnsupported;
4907 bool expectNothingHappenWhenServerUnresponsive;
4908 std::string asTestName() const {
4909 return fmt::format("{}, {}, {}, {}", tlsServer, tlsName,
4910 expectNothingHappenWhenServerUnsupported,
4911 expectNothingHappenWhenServerUnresponsive);
4912 }
4913 } testConfigs[] = {
4914 {{addr1}, "", false, false},
4915 {{addr2}, "", false, false},
4916 {{addr1}, "", false, true},
4917 {{addr2}, "", false, true},
4918 {{addr1}, kDefaultPrivateDnsHostName, false, true},
4919 {{addr2}, kDefaultPrivateDnsHostName, false, true},
4920 {{addr1}, kDefaultPrivateDnsHostName, true, true},
4921 {{addr2}, kDefaultPrivateDnsHostName, true, true},
4922
4923 // There's no new validation to start because there are already two validation threads
4924 // running (one is for addr1, the other is for addr2). This is because the comparator
4925 // doesn't compare DnsTlsServer.name. Keep the design as-is until it's known to be
4926 // harmful.
4927 {{addr1}, "", true, true},
4928 {{addr2}, "", true, true},
4929 {{addr1}, "", true, true},
4930 {{addr2}, "", true, true},
4931 };
4932
4933 for (const auto& serverState : {WORKING, UNSUPPORTED, UNRESPONSIVE}) {
4934 int testIndex = 0;
4935 for (const auto& config : testConfigs) {
4936 SCOPED_TRACE(fmt::format("serverState:{} testIndex:{} testConfig:[{}]", serverState,
4937 testIndex++, config.asTestName()));
4938 auto& tls = (config.tlsServer == addr1) ? tls1 : tls2;
4939
4940 if (serverState == UNSUPPORTED && tls.running()) ASSERT_TRUE(tls.stopServer());
4941 if (serverState != UNSUPPORTED && !tls.running()) ASSERT_TRUE(tls.startServer());
4942
4943 tls.setHangOnHandshakeForTesting(serverState == UNRESPONSIVE);
4944 const int connectCountsBefore = tls.acceptConnectionsCount();
4945
Mike Yu9a185882020-03-25 16:02:36 +08004946 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004947 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4948 parcel.servers = {config.tlsServer};
4949 parcel.tlsServers = {config.tlsServer};
4950 parcel.tlsName = config.tlsName;
4951 parcel.caCertificate = config.tlsName.empty() ? "" : kCaCert;
4952 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4953
4954 if (serverState == WORKING) {
4955 EXPECT_TRUE(WaitForPrivateDnsValidation(config.tlsServer, true));
4956 } else if (serverState == UNSUPPORTED) {
4957 if (config.expectNothingHappenWhenServerUnsupported) {
4958 // It's possible that the resolver hasn't yet started to
4959 // connect. Wait a while.
4960 // TODO: See if we can get rid of the hard waiting time, such as comparing
4961 // the CountDiff across two tests.
4962 std::this_thread::sleep_for(100ms);
4963 EXPECT_EQ(tls.acceptConnectionsCount(), connectCountsBefore);
4964 } else {
4965 EXPECT_TRUE(WaitForPrivateDnsValidation(config.tlsServer, false));
4966 }
4967 } else {
4968 // Must be UNRESPONSIVE.
4969 // DnsTlsFrontend is the only signal for checking whether or not the resolver starts
4970 // another validation when the server is unresponsive.
4971 const int expectCountDiff =
4972 config.expectNothingHappenWhenServerUnresponsive ? 0 : 1;
4973 if (expectCountDiff == 0) {
4974 // It's possible that the resolver hasn't yet started to
4975 // connect. Wait a while.
4976 std::this_thread::sleep_for(100ms);
4977 }
4978 const auto condition = [&]() {
4979 return tls.acceptConnectionsCount() == connectCountsBefore + expectCountDiff;
4980 };
4981 EXPECT_TRUE(PollForCondition(condition));
4982 }
4983 }
4984
4985 // Set to off mode to reset the PrivateDnsConfiguration state.
4986 ResolverParamsParcel setupOffmode = DnsResponderClient::GetDefaultResolverParamsParcel();
4987 setupOffmode.tlsServers.clear();
4988 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(setupOffmode));
4989 }
4990
4991 // Check that all the validation results are caught.
4992 // Note: it doesn't mean no validation being in progress.
4993 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr1));
4994 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr2));
4995}
4996
Ken Chen26dc2b02020-06-16 18:49:39 +08004997TEST_F(ResolverTest, PermissionCheckOnCertificateInjection) {
4998 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4999 parcel.caCertificate = kCaCert;
5000 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk());
5001
5002 for (const uid_t uid : {AID_SYSTEM, TEST_UID}) {
5003 ScopedChangeUID scopedChangeUID(uid);
5004 auto status = mDnsClient.resolvService()->setResolverConfiguration(parcel);
5005 EXPECT_EQ(status.getExceptionCode(), EX_SECURITY);
5006 }
5007}
5008
Hungming Chenbb90ab32019-10-28 18:20:31 +08005009// Parameterized tests.
5010// TODO: Merge the existing tests as parameterized test if possible.
5011// TODO: Perhaps move parameterized tests to an independent file.
5012enum class CallType { GETADDRINFO, GETHOSTBYNAME };
5013class ResolverParameterizedTest : public ResolverTest,
Hungming Chen63779052019-10-30 15:06:13 +08005014 public testing::WithParamInterface<CallType> {
5015 protected:
Hungming Chen22617fd2019-12-06 12:15:45 +08005016 void VerifyQueryHelloExampleComV4(const test::DNSResponder& dns, const CallType calltype,
5017 const bool verifyNumQueries = true) {
Hungming Chen63779052019-10-30 15:06:13 +08005018 if (calltype == CallType::GETADDRINFO) {
5019 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
5020 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
5021 ASSERT_TRUE(result != nullptr);
5022 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
5023 } else if (calltype == CallType::GETHOSTBYNAME) {
5024 const hostent* result = gethostbyname("hello");
5025 ASSERT_TRUE(result != nullptr);
5026 ASSERT_EQ(4, result->h_length);
5027 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
5028 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
5029 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
5030 } else {
5031 FAIL() << "Unsupported call type: " << static_cast<uint32_t>(calltype);
5032 }
Hungming Chen22617fd2019-12-06 12:15:45 +08005033 if (verifyNumQueries) EXPECT_EQ(1U, GetNumQueries(dns, kHelloExampleCom));
Hungming Chen63779052019-10-30 15:06:13 +08005034 }
5035};
Hungming Chenbb90ab32019-10-28 18:20:31 +08005036
Hungming Chen63779052019-10-30 15:06:13 +08005037INSTANTIATE_TEST_SUITE_P(QueryCallTest, ResolverParameterizedTest,
Hungming Chenbb90ab32019-10-28 18:20:31 +08005038 testing::Values(CallType::GETADDRINFO, CallType::GETHOSTBYNAME),
5039 [](const testing::TestParamInfo<CallType>& info) {
Hungming Chenbb90ab32019-10-28 18:20:31 +08005040 switch (info.param) {
5041 case CallType::GETADDRINFO:
Hungming Chen63779052019-10-30 15:06:13 +08005042 return "GetAddrInfo";
Hungming Chenbb90ab32019-10-28 18:20:31 +08005043 case CallType::GETHOSTBYNAME:
Hungming Chen63779052019-10-30 15:06:13 +08005044 return "GetHostByName";
Hungming Chenbb90ab32019-10-28 18:20:31 +08005045 default:
Hungming Chen63779052019-10-30 15:06:13 +08005046 return "InvalidParameter"; // Should not happen.
Hungming Chenbb90ab32019-10-28 18:20:31 +08005047 }
Hungming Chenbb90ab32019-10-28 18:20:31 +08005048 });
5049
5050TEST_P(ResolverParameterizedTest, AuthoritySectionAndAdditionalSection) {
5051 // DNS response may have more information in authority section and additional section.
5052 // Currently, getanswer() of packages/modules/DnsResolver/getaddrinfo.cpp doesn't parse the
5053 // content of authority section and additional section. Test these sections if they crash
5054 // the resolver, just in case. See also RFC 1035 section 4.1.
5055 const auto& calltype = GetParam();
5056 test::DNSHeader header(kDefaultDnsHeader);
5057
5058 // Create a DNS response which has a authoritative nameserver record in authority
5059 // section and its relevant address record in additional section.
5060 //
5061 // Question
5062 // hello.example.com. IN A
5063 // Answer
5064 // hello.example.com. IN A 1.2.3.4
5065 // Authority:
5066 // hello.example.com. IN NS ns1.example.com.
5067 // Additional:
5068 // ns1.example.com. IN A 5.6.7.8
5069 //
5070 // A response may have only question, answer, and authority section. Current testing response
5071 // should be able to cover this condition.
5072
5073 // Question section.
5074 test::DNSQuestion question{
5075 .qname = {.name = kHelloExampleCom},
5076 .qtype = ns_type::ns_t_a,
5077 .qclass = ns_c_in,
5078 };
5079 header.questions.push_back(std::move(question));
5080
5081 // Answer section.
5082 test::DNSRecord recordAnswer{
5083 .name = {.name = kHelloExampleCom},
5084 .rtype = ns_type::ns_t_a,
5085 .rclass = ns_c_in,
5086 .ttl = 0, // no cache
5087 };
Hungming Chen63779052019-10-30 15:06:13 +08005088 EXPECT_TRUE(test::DNSResponder::fillRdata(kHelloExampleComAddrV4, recordAnswer));
Hungming Chenbb90ab32019-10-28 18:20:31 +08005089 header.answers.push_back(std::move(recordAnswer));
5090
5091 // Authority section.
5092 test::DNSRecord recordAuthority{
5093 .name = {.name = kHelloExampleCom},
5094 .rtype = ns_type::ns_t_ns,
5095 .rclass = ns_c_in,
5096 .ttl = 0, // no cache
5097 };
5098 EXPECT_TRUE(test::DNSResponder::fillRdata("ns1.example.com.", recordAuthority));
5099 header.authorities.push_back(std::move(recordAuthority));
5100
5101 // Additional section.
5102 test::DNSRecord recordAdditional{
5103 .name = {.name = "ns1.example.com."},
5104 .rtype = ns_type::ns_t_a,
5105 .rclass = ns_c_in,
5106 .ttl = 0, // no cache
5107 };
5108 EXPECT_TRUE(test::DNSResponder::fillRdata("5.6.7.8", recordAdditional));
5109 header.additionals.push_back(std::move(recordAdditional));
5110
5111 // Start DNS server.
5112 test::DNSResponder dns(test::DNSResponder::MappingType::DNS_HEADER);
5113 dns.addMappingDnsHeader(kHelloExampleCom, ns_type::ns_t_a, header);
5114 ASSERT_TRUE(dns.startServer());
5115 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
5116 dns.clearQueries();
5117
5118 // Expect that get the address and the resolver doesn't crash.
Hungming Chen63779052019-10-30 15:06:13 +08005119 VerifyQueryHelloExampleComV4(dns, calltype);
5120}
5121
5122TEST_P(ResolverParameterizedTest, MessageCompression) {
5123 const auto& calltype = GetParam();
5124
5125 // The response with compressed domain name by a pointer. See RFC 1035 section 4.1.4.
5126 //
5127 // Ignoring the other fields of the message, the domain name of question section and answer
5128 // section are presented as:
5129 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5130 // 12 | 5 | h |
5131 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5132 // 14 | e | l |
5133 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5134 // 16 | l | o |
5135 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5136 // 18 | 7 | e |
5137 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5138 // 20 | x | a |
5139 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5140 // 22 | m | p |
5141 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5142 // 24 | l | e |
5143 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5144 // 26 | 3 | c |
5145 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5146 // 28 | o | m |
5147 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5148 // 30 | 0 | ... |
5149 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5150 //
5151 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5152 // 35 | 1 1| 12 |
5153 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5154 const std::vector<uint8_t> kResponseAPointer = {
5155 /* Header */
5156 0x00, 0x00, /* Transaction ID: 0x0000 */
5157 0x81, 0x80, /* Flags: qr rd ra */
5158 0x00, 0x01, /* Questions: 1 */
5159 0x00, 0x01, /* Answer RRs: 1 */
5160 0x00, 0x00, /* Authority RRs: 0 */
5161 0x00, 0x00, /* Additional RRs: 0 */
5162 /* Queries */
5163 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
5164 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name: hello.example.com */
5165 0x00, 0x01, /* Type: A */
5166 0x00, 0x01, /* Class: IN */
5167 /* Answers */
5168 0xc0, 0x0c, /* Name: hello.example.com (a pointer) */
5169 0x00, 0x01, /* Type: A */
5170 0x00, 0x01, /* Class: IN */
5171 0x00, 0x00, 0x00, 0x00, /* Time to live: 0 */
5172 0x00, 0x04, /* Data length: 4 */
5173 0x01, 0x02, 0x03, 0x04 /* Address: 1.2.3.4 */
5174 };
5175
5176 // The response with compressed domain name by a sequence of labels ending with a pointer. See
5177 // RFC 1035 section 4.1.4.
5178 //
5179 // Ignoring the other fields of the message, the domain name of question section and answer
5180 // section are presented as:
5181 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5182 // 12 | 5 | h |
5183 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5184 // 14 | e | l |
5185 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5186 // 16 | l | o |
5187 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5188 // 18 | 7 | e |
5189 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5190 // 20 | x | a |
5191 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5192 // 22 | m | p |
5193 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5194 // 24 | l | e |
5195 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5196 // 26 | 3 | c |
5197 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5198 // 28 | o | m |
5199 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5200 // 30 | 0 | ... |
5201 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5202 //
5203 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5204 // 35 | 5 | h |
5205 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5206 // 37 | e | l |
5207 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5208 // 39 | l | o |
5209 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5210 // 41 | 1 1| 18 |
5211 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5212 const std::vector<uint8_t> kResponseLabelEndingWithAPointer = {
5213 /* Header */
5214 0x00, 0x00, /* Transaction ID: 0x0000 */
5215 0x81, 0x80, /* Flags: qr rd ra */
5216 0x00, 0x01, /* Questions: 1 */
5217 0x00, 0x01, /* Answer RRs: 1 */
5218 0x00, 0x00, /* Authority RRs: 0 */
5219 0x00, 0x00, /* Additional RRs: 0 */
5220 /* Queries */
5221 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
5222 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name: hello.example.com */
5223 0x00, 0x01, /* Type: A */
5224 0x00, 0x01, /* Class: IN */
5225 /* Answers */
5226 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0xc0,
5227 0x12, /* Name: hello.example.com (a label ending with a pointer) */
5228 0x00, 0x01, /* Type: A */
5229 0x00, 0x01, /* Class: IN */
5230 0x00, 0x00, 0x00, 0x00, /* Time to live: 0 */
5231 0x00, 0x04, /* Data length: 4 */
5232 0x01, 0x02, 0x03, 0x04 /* Address: 1.2.3.4 */
5233 };
5234
5235 for (const auto& response : {kResponseAPointer, kResponseLabelEndingWithAPointer}) {
5236 SCOPED_TRACE(StringPrintf("Hex dump: %s", toHex(makeSlice(response)).c_str()));
5237
5238 test::DNSResponder dns(test::DNSResponder::MappingType::BINARY_PACKET);
5239 dns.addMappingBinaryPacket(kHelloExampleComQueryV4, response);
5240 StartDns(dns, {});
5241 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
5242
5243 // Expect no cache because the TTL of testing responses are 0.
5244 VerifyQueryHelloExampleComV4(dns, calltype);
Hungming Chenbb90ab32019-10-28 18:20:31 +08005245 }
Mike Yu40e67072019-10-09 21:14:09 +08005246}
Hungming Chen22617fd2019-12-06 12:15:45 +08005247
5248TEST_P(ResolverParameterizedTest, TruncatedResponse) {
5249 const auto& calltype = GetParam();
5250
Hungming Chen22617fd2019-12-06 12:15:45 +08005251 test::DNSResponder dns;
Ken Chen99344882020-01-01 14:59:38 +08005252 StartDns(dns, kLargeCnameChainRecords);
Hungming Chen22617fd2019-12-06 12:15:45 +08005253 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
5254
5255 // Expect UDP response is truncated. The resolver retries over TCP. See RFC 1035 section 4.2.1.
5256 VerifyQueryHelloExampleComV4(dns, calltype, false);
5257 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom));
5258 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom));
5259}
Luke Huang420ee622019-11-27 17:52:44 +08005260
5261TEST_F(ResolverTest, KeepListeningUDP) {
5262 constexpr char listen_addr1[] = "127.0.0.4";
5263 constexpr char listen_addr2[] = "127.0.0.5";
5264 constexpr char host_name[] = "howdy.example.com.";
5265 const std::vector<DnsRecord> records = {
5266 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
5267 };
5268 const std::vector<int> params = {300, 25, 8, 8, 1000 /* BASE_TIMEOUT_MSEC */,
5269 1 /* retry count */};
5270 const int delayTimeMs = 1500;
5271
5272 test::DNSResponder neverRespondDns(listen_addr2, "53", static_cast<ns_rcode>(-1));
5273 neverRespondDns.setResponseProbability(0.0);
5274 StartDns(neverRespondDns, records);
Luke Huangf40df9c2020-04-21 08:51:48 +08005275 ScopedSystemProperties scopedSystemProperties(
5276 "persist.device_config.netd_native.keep_listening_udp", "1");
5277 // Re-setup test network to make experiment flag take effect.
5278 resetNetwork();
Luke Huang420ee622019-11-27 17:52:44 +08005279
5280 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr1, listen_addr2},
5281 kDefaultSearchDomains, params));
5282 // There are 2 DNS servers for this test.
5283 // |delayedDns| will be blocked for |delayTimeMs|, then start to respond to requests.
5284 // |neverRespondDns| will never respond.
5285 // In the first try, resolver will send query to |delayedDns| but get timeout error
5286 // because |delayTimeMs| > DNS timeout.
5287 // Then it's the second try, resolver will send query to |neverRespondDns| and
5288 // listen on both servers. Resolver will receive the answer coming from |delayedDns|.
Luke Huang420ee622019-11-27 17:52:44 +08005289
Luke Huang420ee622019-11-27 17:52:44 +08005290 test::DNSResponder delayedDns(listen_addr1);
5291 delayedDns.setResponseDelayMs(delayTimeMs);
5292 StartDns(delayedDns, records);
5293
5294 // Specify hints to ensure resolver doing query only 1 round.
5295 const addrinfo hints = {.ai_family = AF_INET6, .ai_socktype = SOCK_DGRAM};
5296 ScopedAddrinfo result = safe_getaddrinfo(host_name, nullptr, &hints);
5297 EXPECT_TRUE(result != nullptr);
5298
5299 std::string result_str = ToString(result);
5300 EXPECT_TRUE(result_str == "::1.2.3.4") << ", result_str='" << result_str << "'";
5301}
Luke Huang0a0870d2020-02-12 20:41:10 +08005302
5303TEST_F(ResolverTest, GetAddrInfoParallelLookupTimeout) {
5304 constexpr char listen_addr[] = "127.0.0.4";
5305 constexpr char host_name[] = "howdy.example.com.";
5306 constexpr int TIMING_TOLERANCE_MS = 200;
5307 constexpr int DNS_TIMEOUT_MS = 1000;
5308 const std::vector<DnsRecord> records = {
5309 {host_name, ns_type::ns_t_a, "1.2.3.4"},
5310 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
5311 };
5312 const std::vector<int> params = {300, 25, 8, 8, DNS_TIMEOUT_MS /* BASE_TIMEOUT_MSEC */,
5313 1 /* retry count */};
5314 test::DNSResponder neverRespondDns(listen_addr, "53", static_cast<ns_rcode>(-1));
5315 neverRespondDns.setResponseProbability(0.0);
5316 StartDns(neverRespondDns, records);
Luke Huangf40df9c2020-04-21 08:51:48 +08005317 ScopedSystemProperties scopedSystemProperties(
5318 "persist.device_config.netd_native.parallel_lookup", "1");
Luke Huangd1d734f2020-04-30 12:25:40 +08005319 // The default value of parallel_lookup_sleep_time should be very small
5320 // that we can ignore in this test case.
Luke Huangf40df9c2020-04-21 08:51:48 +08005321 // Re-setup test network to make experiment flag take effect.
5322 resetNetwork();
Luke Huang0a0870d2020-02-12 20:41:10 +08005323
5324 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}, kDefaultSearchDomains, params));
5325 neverRespondDns.clearQueries();
5326
Luke Huang0a0870d2020-02-12 20:41:10 +08005327 // Use a never respond DNS server to verify if the A/AAAA queries are sent in parallel.
5328 // The resolver parameters are set to timeout 1s and retry 1 times.
5329 // So we expect the safe_getaddrinfo_time_taken() might take ~1s to
5330 // return when parallel lookup is enabled. And the DNS server should receive 2 queries.
5331 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_DGRAM};
5332 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(host_name, nullptr, hints);
5333
5334 EXPECT_TRUE(result == nullptr);
5335 EXPECT_NEAR(DNS_TIMEOUT_MS, timeTakenMs, TIMING_TOLERANCE_MS)
5336 << "took time should approximate equal timeout";
5337 EXPECT_EQ(2U, GetNumQueries(neverRespondDns, host_name));
Mike Yu532405f2020-06-17 17:46:44 +08005338 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, RCODE_TIMEOUT, host_name, {});
Luke Huang0a0870d2020-02-12 20:41:10 +08005339}
Luke Huangd1d734f2020-04-30 12:25:40 +08005340
5341TEST_F(ResolverTest, GetAddrInfoParallelLookupSleepTime) {
5342 constexpr char listen_addr[] = "127.0.0.4";
5343 constexpr int TIMING_TOLERANCE_MS = 200;
5344 const std::vector<DnsRecord> records = {
5345 {kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4},
5346 {kHelloExampleCom, ns_type::ns_t_aaaa, kHelloExampleComAddrV6},
5347 };
5348 const std::vector<int> params = {300, 25, 8, 8, 1000 /* BASE_TIMEOUT_MSEC */,
5349 1 /* retry count */};
5350 test::DNSResponder dns(listen_addr);
5351 StartDns(dns, records);
5352 ScopedSystemProperties scopedSystemProperties1(
5353 "persist.device_config.netd_native.parallel_lookup", "1");
5354 constexpr int PARALLEL_LOOKUP_SLEEP_TIME_MS = 500;
5355 ScopedSystemProperties scopedSystemProperties2(
5356 "persist.device_config.netd_native.parallel_lookup_sleep_time",
5357 std::to_string(PARALLEL_LOOKUP_SLEEP_TIME_MS));
5358 // Re-setup test network to make experiment flag take effect.
5359 resetNetwork();
5360
5361 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}, kDefaultSearchDomains, params));
5362 dns.clearQueries();
5363
5364 // Expect the safe_getaddrinfo_time_taken() might take ~500ms to return because we set
5365 // parallel_lookup_sleep_time to 500ms.
5366 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_DGRAM};
5367 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(kHelloExampleCom, nullptr, hints);
5368
5369 EXPECT_NE(nullptr, result);
5370 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(
5371 {kHelloExampleComAddrV4, kHelloExampleComAddrV6}));
5372 EXPECT_NEAR(PARALLEL_LOOKUP_SLEEP_TIME_MS, timeTakenMs, TIMING_TOLERANCE_MS)
5373 << "took time should approximate equal timeout";
5374 EXPECT_EQ(2U, GetNumQueries(dns, kHelloExampleCom));
5375
5376 // Expect the PARALLEL_LOOKUP_SLEEP_TIME_MS won't affect the query under cache hit case.
5377 dns.clearQueries();
5378 std::tie(result, timeTakenMs) = safe_getaddrinfo_time_taken(kHelloExampleCom, nullptr, hints);
5379 EXPECT_NE(nullptr, result);
5380 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(
5381 {kHelloExampleComAddrV4, kHelloExampleComAddrV6}));
5382 EXPECT_GT(PARALLEL_LOOKUP_SLEEP_TIME_MS, timeTakenMs);
5383 EXPECT_EQ(0U, GetNumQueries(dns, kHelloExampleCom));
5384}
Luke Huangeb618ef2020-05-26 14:17:02 +08005385
5386TEST_F(ResolverTest, BlockDnsQueryUidDoesNotLeadToBadServer) {
5387 // This test relies on blocking traffic on loopback, which xt_qtaguid does not do.
5388 // See aosp/358413 and b/34444781 for why.
5389 SKIP_IF_BPF_NOT_SUPPORTED;
5390
5391 constexpr char listen_addr1[] = "127.0.0.4";
5392 constexpr char listen_addr2[] = "::1";
5393 test::DNSResponder dns1(listen_addr1);
5394 test::DNSResponder dns2(listen_addr2);
5395 StartDns(dns1, {});
5396 StartDns(dns2, {});
5397
5398 std::vector<std::string> servers = {listen_addr1, listen_addr2};
5399 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
5400 dns1.clearQueries();
5401 dns2.clearQueries();
5402 {
5403 ScopeBlockedUIDRule scopeBlockUidRule(mDnsClient.netdService(), TEST_UID);
5404 // Start querying ten times.
5405 for (int i = 0; i < 10; i++) {
5406 std::string hostName = fmt::format("blocked{}.com", i);
5407 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
Luke Huang5729afc2020-07-30 23:12:17 +08005408 // The query result between R+ and Q would be different, but we don't really care
5409 // about the result here because this test is only used to ensure blocked uid rule
5410 // won't cause bad servers.
5411 safe_getaddrinfo(hostName.c_str(), nullptr, &hints);
Luke Huangeb618ef2020-05-26 14:17:02 +08005412 }
5413 }
Luke Huang5729afc2020-07-30 23:12:17 +08005414 ResolverParamsParcel setupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
5415 // If api level >= 30 (R+), expect all query packets to be blocked, hence we should not see any
5416 // of their stats show up. Otherwise, all queries should succeed.
5417 const std::vector<NameserverStats> expectedDnsStats = {
5418 NameserverStats(listen_addr1).setSuccesses(isAtLeastR ? 0 : setupParams.maxSamples),
Luke Huangeb618ef2020-05-26 14:17:02 +08005419 NameserverStats(listen_addr2),
5420 };
Luke Huang5729afc2020-07-30 23:12:17 +08005421 expectStatsEqualTo(expectedDnsStats);
5422 // If api level >= 30 (R+), expect server won't receive any queries,
5423 // otherwise expect 20 == 10 * (setupParams.domains.size() + 1) queries.
5424 EXPECT_EQ(dns1.queries().size(), isAtLeastR ? 0U : 10 * (setupParams.domains.size() + 1));
Luke Huangeb618ef2020-05-26 14:17:02 +08005425 EXPECT_EQ(dns2.queries().size(), 0U);
5426}
Mike Yu6ce587d2019-12-19 21:30:22 +08005427
Mike Yu10832aa2020-08-25 19:13:11 +08005428TEST_F(ResolverTest, DnsServerSelection) {
5429 test::DNSResponder dns1("127.0.0.3");
5430 test::DNSResponder dns2("127.0.0.4");
5431 test::DNSResponder dns3("127.0.0.5");
5432
5433 dns1.setResponseDelayMs(10);
5434 dns2.setResponseDelayMs(25);
5435 dns3.setResponseDelayMs(50);
5436 StartDns(dns1, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
5437 StartDns(dns2, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
5438 StartDns(dns3, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
5439
5440 ScopedSystemProperties scopedSystemProperties(kSortNameserversFlag, "1");
5441
Mike Yueb8f22c2020-09-22 11:58:13 +08005442 // NOTE: the servers must be sorted alphabetically.
5443 std::vector<std::string> serverList = {
5444 dns1.listen_address(),
5445 dns2.listen_address(),
5446 dns3.listen_address(),
Mike Yu10832aa2020-08-25 19:13:11 +08005447 };
Mike Yueb8f22c2020-09-22 11:58:13 +08005448
5449 do {
Mike Yu10832aa2020-08-25 19:13:11 +08005450 SCOPED_TRACE(fmt::format("testConfig: [{}]", fmt::join(serverList, ", ")));
5451 const int queryNum = 50;
5452 int64_t accumulatedTime = 0;
5453
5454 // Restart the testing network to 1) make the flag take effect and 2) reset the statistics.
5455 resetNetwork();
5456
5457 // DnsServerSelection doesn't apply to private DNS.
5458 ResolverParamsParcel setupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
5459 setupParams.servers = serverList;
5460 setupParams.tlsServers.clear();
5461 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(setupParams));
5462
5463 // DNSResponder doesn't handle queries concurrently, so don't allow more than
5464 // one in-flight query.
5465 for (int i = 0; i < queryNum; i++) {
5466 Stopwatch s;
5467 int fd = resNetworkQuery(TEST_NETID, kHelloExampleCom, ns_c_in, ns_t_a,
5468 ANDROID_RESOLV_NO_CACHE_LOOKUP);
5469 expectAnswersValid(fd, AF_INET, kHelloExampleComAddrV4);
5470 accumulatedTime += s.timeTakenUs();
5471 }
5472
5473 const int dns1Count = dns1.queries().size();
5474 const int dns2Count = dns2.queries().size();
5475 const int dns3Count = dns3.queries().size();
5476
5477 // All of the servers have ever been selected. In addition, the less latency server
5478 // is selected more frequently.
5479 EXPECT_GT(dns1Count, 0);
5480 EXPECT_GT(dns2Count, 0);
5481 EXPECT_GT(dns3Count, 0);
5482 EXPECT_GT(dns1Count, dns2Count);
5483 EXPECT_GT(dns2Count, dns3Count);
5484
Mike Yueb8f22c2020-09-22 11:58:13 +08005485 const int averageTime = accumulatedTime / queryNum;
5486 LOG(INFO) << "ResolverTest#DnsServerSelection: averageTime " << averageTime << "us";
Mike Yu10832aa2020-08-25 19:13:11 +08005487
Mike Yueb8f22c2020-09-22 11:58:13 +08005488 // Since the average Time might differ depending on parameters, set [10ms, 20ms] as
Mike Yu10832aa2020-08-25 19:13:11 +08005489 // acceptable range.
Mike Yueb8f22c2020-09-22 11:58:13 +08005490 EXPECT_GE(averageTime, 10000);
5491 EXPECT_LE(averageTime, 20000);
Mike Yu10832aa2020-08-25 19:13:11 +08005492
5493 dns1.clearQueries();
5494 dns2.clearQueries();
5495 dns3.clearQueries();
Mike Yueb8f22c2020-09-22 11:58:13 +08005496 } while (std::next_permutation(serverList.begin(), serverList.end()));
Mike Yu10832aa2020-08-25 19:13:11 +08005497}
5498
Mike Yu6ce587d2019-12-19 21:30:22 +08005499// ResolverMultinetworkTest is used to verify multinetwork functionality. Here's how it works:
5500// The resolver sends queries to address A, and then there will be a TunForwarder helping forward
5501// the packets to address B, which is the address on which the testing server is listening. The
5502// answer packets responded from the testing server go through the reverse path back to the
5503// resolver.
5504//
5505// To achieve the that, it needs to set up a interface with routing rules. Tests are not
5506// supposed to initiate DNS servers on their own; instead, some utilities are added to the class to
5507// help the setup.
5508//
5509// An example of how to use it:
5510// TEST_F() {
Luke Huang81568fb2020-07-13 00:55:12 +08005511// ScopedPhysicalNetwork network = CreateScopedPhysicalNetwork(V4);
Mike Yu6ce587d2019-12-19 21:30:22 +08005512// network.init();
5513//
5514// auto dns = network.addIpv4Dns();
5515// StartDns(dns.dnsServer, {});
5516//
Luke Huang81568fb2020-07-13 00:55:12 +08005517// network.setDnsConfiguration();
Mike Yu6ce587d2019-12-19 21:30:22 +08005518// network.startTunForwarder();
5519//
5520// // Send queries here
5521// }
5522
5523class ResolverMultinetworkTest : public ResolverTest {
5524 protected:
5525 enum class ConnectivityType { V4, V6, V4V6 };
Luke Huang81568fb2020-07-13 00:55:12 +08005526 static constexpr int TEST_NETID_BASE = 10000;
Mike Yu6ce587d2019-12-19 21:30:22 +08005527
5528 struct DnsServerPair {
Luke Huang81568fb2020-07-13 00:55:12 +08005529 DnsServerPair(std::shared_ptr<test::DNSResponder> server, std::string addr)
5530 : dnsServer(server), dnsAddr(addr) {}
5531 std::shared_ptr<test::DNSResponder> dnsServer;
Mike Yu6ce587d2019-12-19 21:30:22 +08005532 std::string dnsAddr; // The DNS server address used for setResolverConfiguration().
5533 // TODO: Add test::DnsTlsFrontend* and std::string for DoT.
5534 };
5535
5536 class ScopedNetwork {
5537 public:
5538 ScopedNetwork(unsigned netId, ConnectivityType type, INetd* netdSrv,
Luke Huang81568fb2020-07-13 00:55:12 +08005539 IDnsResolver* dnsResolvSrv, const char* networkName)
Mike Yu6ce587d2019-12-19 21:30:22 +08005540 : mNetId(netId),
5541 mConnectivityType(type),
5542 mNetdSrv(netdSrv),
Luke Huang81568fb2020-07-13 00:55:12 +08005543 mDnsResolvSrv(dnsResolvSrv),
5544 mNetworkName(networkName) {
5545 mIfname = fmt::format("testtun{}", netId);
Mike Yu6ce587d2019-12-19 21:30:22 +08005546 }
Luke Huang81568fb2020-07-13 00:55:12 +08005547 virtual ~ScopedNetwork() {
5548 if (mNetdSrv != nullptr) mNetdSrv->networkDestroy(mNetId);
5549 if (mDnsResolvSrv != nullptr) mDnsResolvSrv->destroyNetworkCache(mNetId);
5550 }
Mike Yu6ce587d2019-12-19 21:30:22 +08005551
5552 Result<void> init();
Mike Yu6ce587d2019-12-19 21:30:22 +08005553 Result<DnsServerPair> addIpv4Dns() { return addDns(ConnectivityType::V4); }
5554 Result<DnsServerPair> addIpv6Dns() { return addDns(ConnectivityType::V6); }
5555 bool startTunForwarder() { return mTunForwarder->startForwarding(); }
Luke Huang81568fb2020-07-13 00:55:12 +08005556 bool setDnsConfiguration() const;
5557 bool clearDnsConfiguration() const;
Mike Yu6ce587d2019-12-19 21:30:22 +08005558 unsigned netId() const { return mNetId; }
Luke Huang81568fb2020-07-13 00:55:12 +08005559 std::string name() const { return mNetworkName; }
Mike Yu6ce587d2019-12-19 21:30:22 +08005560
Luke Huang81568fb2020-07-13 00:55:12 +08005561 protected:
5562 // Subclasses should implement it to decide which network should be create.
5563 virtual Result<void> createNetwork() const = 0;
Mike Yu6ce587d2019-12-19 21:30:22 +08005564
5565 const unsigned mNetId;
5566 const ConnectivityType mConnectivityType;
5567 INetd* mNetdSrv;
5568 IDnsResolver* mDnsResolvSrv;
Luke Huang81568fb2020-07-13 00:55:12 +08005569 const std::string mNetworkName;
Mike Yu6ce587d2019-12-19 21:30:22 +08005570 std::string mIfname;
5571 std::unique_ptr<TunForwarder> mTunForwarder;
Luke Huang81568fb2020-07-13 00:55:12 +08005572 std::vector<DnsServerPair> mDnsServerPairs;
5573
5574 private:
5575 Result<DnsServerPair> addDns(ConnectivityType connectivity);
5576 // Assuming mNetId is unique during ResolverMultinetworkTest, make the
5577 // address based on it to avoid conflicts.
5578 std::string makeIpv4AddrString(uint8_t n) const {
5579 return StringPrintf("192.168.%u.%u", (mNetId - TEST_NETID_BASE), n);
5580 }
5581 std::string makeIpv6AddrString(uint8_t n) const {
5582 return StringPrintf("2001:db8:%u::%u", (mNetId - TEST_NETID_BASE), n);
5583 }
5584 };
5585
5586 class ScopedPhysicalNetwork : public ScopedNetwork {
5587 public:
5588 ScopedPhysicalNetwork(unsigned netId, const char* networkName)
5589 : ScopedNetwork(netId, ConnectivityType::V4V6, nullptr, nullptr, networkName) {}
5590 ScopedPhysicalNetwork(unsigned netId, ConnectivityType type, INetd* netdSrv,
5591 IDnsResolver* dnsResolvSrv, const char* name = "Physical")
5592 : ScopedNetwork(netId, type, netdSrv, dnsResolvSrv, name) {}
5593
5594 protected:
5595 Result<void> createNetwork() const override {
5596 if (auto r = mNetdSrv->networkCreatePhysical(mNetId, INetd::PERMISSION_NONE);
5597 !r.isOk()) {
5598 return Error() << r.getMessage();
5599 }
5600 return {};
5601 }
5602 };
5603
5604 class ScopedVirtualNetwork : public ScopedNetwork {
5605 public:
5606 ScopedVirtualNetwork(unsigned netId, ConnectivityType type, INetd* netdSrv,
5607 IDnsResolver* dnsResolvSrv, const char* name, bool isSecure)
5608 : ScopedNetwork(netId, type, netdSrv, dnsResolvSrv, name), mIsSecure(isSecure) {}
5609 ~ScopedVirtualNetwork() {
5610 if (!mVpnIsolationUids.empty()) {
5611 const std::vector<int> tmpUids(mVpnIsolationUids.begin(), mVpnIsolationUids.end());
5612 mNetdSrv->firewallRemoveUidInterfaceRules(tmpUids);
5613 }
5614 }
5615 // Enable VPN isolation. Ensures that uid can only receive packets on mIfname.
5616 Result<void> enableVpnIsolation(int uid) {
5617 if (auto r = mNetdSrv->firewallAddUidInterfaceRules(mIfname, {uid}); !r.isOk()) {
5618 return Error() << r.getMessage();
5619 }
5620 mVpnIsolationUids.insert(uid);
5621 return {};
5622 }
5623 Result<void> disableVpnIsolation(int uid) {
5624 if (auto r = mNetdSrv->firewallRemoveUidInterfaceRules({static_cast<int>(uid)});
5625 !r.isOk()) {
5626 return Error() << r.getMessage();
5627 }
5628 mVpnIsolationUids.erase(uid);
5629 return {};
5630 }
5631 Result<void> addUser(uid_t uid) const { return addUidRange(uid, uid); }
5632 Result<void> addUidRange(uid_t from, uid_t to) const {
5633 if (auto r = mNetdSrv->networkAddUidRanges(mNetId, {makeUidRangeParcel(from, to)});
5634 !r.isOk()) {
5635 return Error() << r.getMessage();
5636 }
5637 return {};
5638 }
5639
5640 protected:
5641 Result<void> createNetwork() const override {
5642 if (auto r = mNetdSrv->networkCreateVpn(mNetId, mIsSecure); !r.isOk()) {
5643 return Error() << r.getMessage();
5644 }
5645 return {};
5646 }
5647
5648 bool mIsSecure = false;
5649 std::unordered_set<int> mVpnIsolationUids;
Mike Yu6ce587d2019-12-19 21:30:22 +08005650 };
5651
5652 void SetUp() override {
5653 ResolverTest::SetUp();
5654 ASSERT_NE(mDnsClient.netdService(), nullptr);
5655 ASSERT_NE(mDnsClient.resolvService(), nullptr);
5656 }
5657
Luke Huang81568fb2020-07-13 00:55:12 +08005658 void TearDown() override {
5659 ResolverTest::TearDown();
5660 // Restore default network
5661 if (mStoredDefaultNetwork >= 0) {
5662 mDnsClient.netdService()->networkSetDefault(mStoredDefaultNetwork);
5663 }
5664 }
Mike Yu6ce587d2019-12-19 21:30:22 +08005665
Luke Huang81568fb2020-07-13 00:55:12 +08005666 ScopedPhysicalNetwork CreateScopedPhysicalNetwork(ConnectivityType type,
5667 const char* name = "Physical") {
5668 return {getFreeNetId(), type, mDnsClient.netdService(), mDnsClient.resolvService(), name};
5669 }
5670 ScopedVirtualNetwork CreateScopedVirtualNetwork(ConnectivityType type, bool isSecure,
5671 const char* name = "Virtual") {
5672 return {getFreeNetId(), type, mDnsClient.netdService(), mDnsClient.resolvService(),
5673 name, isSecure};
5674 }
Mike Yu6ce587d2019-12-19 21:30:22 +08005675 void StartDns(test::DNSResponder& dns, const std::vector<DnsRecord>& records);
Luke Huang81568fb2020-07-13 00:55:12 +08005676 void setDefaultNetwork(int netId) {
5677 // Save current default network at the first call.
5678 std::call_once(defaultNetworkFlag, [&]() {
5679 ASSERT_TRUE(mDnsClient.netdService()->networkGetDefault(&mStoredDefaultNetwork).isOk());
5680 });
5681 ASSERT_TRUE(mDnsClient.netdService()->networkSetDefault(netId).isOk());
5682 }
5683 unsigned getFreeNetId() {
5684 if (mNextNetId == TEST_NETID_BASE + 256) mNextNetId = TEST_NETID_BASE;
5685 return mNextNetId++;
5686 }
Mike Yu6ce587d2019-12-19 21:30:22 +08005687
5688 private:
5689 // Use a different netId because this class inherits from the class ResolverTest which
Luke Huang81568fb2020-07-13 00:55:12 +08005690 // always creates TEST_NETID in setup. It's incremented when CreateScoped{Physical,
5691 // Virtual}Network() is called.
5692 // Note: 255 is the maximum number of (mNextNetId - TEST_NETID_BASE) here as mNextNetId
5693 // is used to create address.
5694 unsigned mNextNetId = TEST_NETID_BASE;
5695 // Use -1 to represent that default network was not modified because
5696 // real netId must be an unsigned value.
5697 int mStoredDefaultNetwork = -1;
5698 std::once_flag defaultNetworkFlag;
Mike Yu6ce587d2019-12-19 21:30:22 +08005699};
5700
Mike Yu6ce587d2019-12-19 21:30:22 +08005701Result<void> ResolverMultinetworkTest::ScopedNetwork::init() {
Luke Huang81568fb2020-07-13 00:55:12 +08005702 if (mNetdSrv == nullptr || mDnsResolvSrv == nullptr) return Error() << "srv not available";
Mike Yu6ce587d2019-12-19 21:30:22 +08005703 unique_fd ufd = TunForwarder::createTun(mIfname);
5704 if (!ufd.ok()) {
5705 return Errorf("createTun for {} failed", mIfname);
5706 }
5707 mTunForwarder = std::make_unique<TunForwarder>(std::move(ufd));
5708
Luke Huang81568fb2020-07-13 00:55:12 +08005709 if (auto r = createNetwork(); !r.ok()) {
5710 return r;
Mike Yu6ce587d2019-12-19 21:30:22 +08005711 }
5712 if (auto r = mDnsResolvSrv->createNetworkCache(mNetId); !r.isOk()) {
5713 return Error() << r.getMessage();
5714 }
5715 if (auto r = mNetdSrv->networkAddInterface(mNetId, mIfname); !r.isOk()) {
5716 return Error() << r.getMessage();
5717 }
5718
5719 if (mConnectivityType == ConnectivityType::V4 || mConnectivityType == ConnectivityType::V4V6) {
5720 const std::string v4Addr = makeIpv4AddrString(1);
5721 if (auto r = mNetdSrv->interfaceAddAddress(mIfname, v4Addr, 32); !r.isOk()) {
5722 return Error() << r.getMessage();
5723 }
5724 if (auto r = mNetdSrv->networkAddRoute(mNetId, mIfname, "0.0.0.0/0", ""); !r.isOk()) {
5725 return Error() << r.getMessage();
5726 }
5727 }
5728 if (mConnectivityType == ConnectivityType::V6 || mConnectivityType == ConnectivityType::V4V6) {
5729 const std::string v6Addr = makeIpv6AddrString(1);
5730 if (auto r = mNetdSrv->interfaceAddAddress(mIfname, v6Addr, 128); !r.isOk()) {
5731 return Error() << r.getMessage();
5732 }
5733 if (auto r = mNetdSrv->networkAddRoute(mNetId, mIfname, "::/0", ""); !r.isOk()) {
5734 return Error() << r.getMessage();
5735 }
5736 }
5737
5738 return {};
5739}
5740
Mike Yu6ce587d2019-12-19 21:30:22 +08005741void ResolverMultinetworkTest::StartDns(test::DNSResponder& dns,
5742 const std::vector<DnsRecord>& records) {
5743 ResolverTest::StartDns(dns, records);
5744
5745 // Bind the DNSResponder's sockets to the network if specified.
5746 if (std::optional<unsigned> netId = dns.getNetwork(); netId.has_value()) {
5747 setNetworkForSocket(netId.value(), dns.getUdpSocket());
5748 setNetworkForSocket(netId.value(), dns.getTcpSocket());
5749 }
5750}
5751
5752Result<ResolverMultinetworkTest::DnsServerPair> ResolverMultinetworkTest::ScopedNetwork::addDns(
5753 ConnectivityType type) {
Luke Huang81568fb2020-07-13 00:55:12 +08005754 const int index = mDnsServerPairs.size();
Mike Yu6ce587d2019-12-19 21:30:22 +08005755 const int prefixLen = (type == ConnectivityType::V4) ? 32 : 128;
5756
5757 const std::function<std::string(unsigned)> makeIpString =
5758 std::bind((type == ConnectivityType::V4) ? &ScopedNetwork::makeIpv4AddrString
5759 : &ScopedNetwork::makeIpv6AddrString,
5760 this, std::placeholders::_1);
5761
5762 std::string src1 = makeIpString(1); // The address from which the resolver will send.
Luke Huang81568fb2020-07-13 00:55:12 +08005763 std::string dst1 = makeIpString(
5764 index + 100 +
5765 (mNetId - TEST_NETID_BASE)); // The address to which the resolver will send.
Mike Yu6ce587d2019-12-19 21:30:22 +08005766 std::string src2 = dst1; // The address translated from src1.
Luke Huang81568fb2020-07-13 00:55:12 +08005767 std::string dst2 = makeIpString(
5768 index + 200 + (mNetId - TEST_NETID_BASE)); // The address translated from dst2.
Mike Yu6ce587d2019-12-19 21:30:22 +08005769
5770 if (!mTunForwarder->addForwardingRule({src1, dst1}, {src2, dst2}) ||
5771 !mTunForwarder->addForwardingRule({dst2, src2}, {dst1, src1})) {
5772 return Errorf("Failed to add the rules ({}, {}, {}, {})", src1, dst1, src2, dst2);
5773 }
5774
5775 if (!mNetdSrv->interfaceAddAddress(mIfname, dst2, prefixLen).isOk()) {
5776 return Errorf("interfaceAddAddress({}, {}, {}) failed", mIfname, dst2, prefixLen);
5777 }
5778
Luke Huang81568fb2020-07-13 00:55:12 +08005779 return mDnsServerPairs.emplace_back(std::make_shared<test::DNSResponder>(mNetId, dst2), dst1);
Mike Yu6ce587d2019-12-19 21:30:22 +08005780}
5781
Luke Huang81568fb2020-07-13 00:55:12 +08005782bool ResolverMultinetworkTest::ScopedNetwork::setDnsConfiguration() const {
5783 if (mDnsResolvSrv == nullptr) return false;
5784 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
5785 parcel.tlsServers.clear();
5786 parcel.netId = mNetId;
5787 parcel.servers.clear();
5788 for (const auto& pair : mDnsServerPairs) {
5789 parcel.servers.push_back(pair.dnsAddr);
5790 }
5791 return mDnsResolvSrv->setResolverConfiguration(parcel).isOk();
5792}
5793
5794bool ResolverMultinetworkTest::ScopedNetwork::clearDnsConfiguration() const {
5795 if (mDnsResolvSrv == nullptr) return false;
5796 return mDnsResolvSrv->destroyNetworkCache(mNetId).isOk() &&
5797 mDnsResolvSrv->createNetworkCache(mNetId).isOk();
5798}
5799
5800namespace {
5801
5802// Convenient wrapper for making getaddrinfo call like framework.
5803Result<ScopedAddrinfo> android_getaddrinfofornet_wrapper(const char* name, int netId) {
5804 // Use the same parameter as libcore/ojluni/src/main/java/java/net/Inet6AddressImpl.java.
5805 static const addrinfo hints = {
5806 .ai_flags = AI_ADDRCONFIG,
5807 .ai_family = AF_UNSPEC,
5808 .ai_socktype = SOCK_STREAM,
5809 };
5810 addrinfo* result = nullptr;
5811 if (int r = android_getaddrinfofornet(name, nullptr, &hints, netId, MARK_UNSET, &result)) {
5812 return Error() << r;
5813 }
5814 return ScopedAddrinfo(result);
5815}
5816
5817void expectDnsWorksForUid(const char* name, unsigned netId, uid_t uid,
5818 const std::vector<std::string>& expectedResult) {
5819 ScopedChangeUID scopedChangeUID(uid);
5820 auto result = android_getaddrinfofornet_wrapper(name, netId);
5821 ASSERT_RESULT_OK(result);
5822 ScopedAddrinfo ai_result(std::move(result.value()));
5823 std::vector<std::string> result_strs = ToStrings(ai_result);
5824 EXPECT_THAT(result_strs, testing::UnorderedElementsAreArray(expectedResult));
5825}
5826
5827} // namespace
5828
Mike Yu6ce587d2019-12-19 21:30:22 +08005829TEST_F(ResolverMultinetworkTest, GetAddrInfo_AI_ADDRCONFIG) {
5830 constexpr char host_name[] = "ohayou.example.com.";
5831
5832 const std::array<ConnectivityType, 3> allTypes = {
5833 ConnectivityType::V4,
5834 ConnectivityType::V6,
5835 ConnectivityType::V4V6,
5836 };
5837 for (const auto& type : allTypes) {
5838 SCOPED_TRACE(StringPrintf("ConnectivityType: %d", type));
5839
5840 // Create a network.
Luke Huang81568fb2020-07-13 00:55:12 +08005841 ScopedPhysicalNetwork network = CreateScopedPhysicalNetwork(type);
Mike Yu6ce587d2019-12-19 21:30:22 +08005842 ASSERT_RESULT_OK(network.init());
5843
5844 // Add a testing DNS server.
5845 const Result<DnsServerPair> dnsPair =
5846 (type == ConnectivityType::V4) ? network.addIpv4Dns() : network.addIpv6Dns();
5847 ASSERT_RESULT_OK(dnsPair);
Luke Huang81568fb2020-07-13 00:55:12 +08005848 StartDns(*dnsPair->dnsServer, {{host_name, ns_type::ns_t_a, "192.0.2.0"},
5849 {host_name, ns_type::ns_t_aaaa, "2001:db8:cafe:d00d::31"}});
Mike Yu6ce587d2019-12-19 21:30:22 +08005850
5851 // Set up resolver and start forwarding.
Luke Huang81568fb2020-07-13 00:55:12 +08005852 ASSERT_TRUE(network.setDnsConfiguration());
Mike Yu6ce587d2019-12-19 21:30:22 +08005853 ASSERT_TRUE(network.startTunForwarder());
5854
Luke Huang81568fb2020-07-13 00:55:12 +08005855 auto result = android_getaddrinfofornet_wrapper(host_name, network.netId());
5856 ASSERT_RESULT_OK(result);
5857 ScopedAddrinfo ai_result(std::move(result.value()));
Mike Yu6ce587d2019-12-19 21:30:22 +08005858 std::vector<std::string> result_strs = ToStrings(ai_result);
5859 std::vector<std::string> expectedResult;
5860 size_t expectedQueries = 0;
5861
5862 if (type == ConnectivityType::V6 || type == ConnectivityType::V4V6) {
5863 expectedResult.emplace_back("2001:db8:cafe:d00d::31");
5864 expectedQueries++;
5865 }
5866 if (type == ConnectivityType::V4 || type == ConnectivityType::V4V6) {
Luke Huang81568fb2020-07-13 00:55:12 +08005867 expectedResult.emplace_back("192.0.2.0");
Mike Yu6ce587d2019-12-19 21:30:22 +08005868 expectedQueries++;
5869 }
5870 EXPECT_THAT(result_strs, testing::UnorderedElementsAreArray(expectedResult));
Luke Huang81568fb2020-07-13 00:55:12 +08005871 EXPECT_EQ(GetNumQueries(*dnsPair->dnsServer, host_name), expectedQueries);
Mike Yu6ce587d2019-12-19 21:30:22 +08005872 }
5873}
5874
5875TEST_F(ResolverMultinetworkTest, NetworkDestroyedDuringQueryInFlight) {
5876 constexpr char host_name[] = "ohayou.example.com.";
5877
5878 // Create a network and add an ipv4 DNS server.
Luke Huang81568fb2020-07-13 00:55:12 +08005879 auto network = std::make_unique<ScopedPhysicalNetwork>(getFreeNetId(), ConnectivityType::V4V6,
5880 mDnsClient.netdService(),
5881 mDnsClient.resolvService());
Mike Yu6ce587d2019-12-19 21:30:22 +08005882 ASSERT_RESULT_OK(network->init());
5883 const Result<DnsServerPair> dnsPair = network->addIpv4Dns();
5884 ASSERT_RESULT_OK(dnsPair);
5885
5886 // Set the DNS server unresponsive.
Luke Huang81568fb2020-07-13 00:55:12 +08005887 dnsPair->dnsServer->setResponseProbability(0.0);
5888 dnsPair->dnsServer->setErrorRcode(static_cast<ns_rcode>(-1));
5889 StartDns(*dnsPair->dnsServer, {});
Mike Yu6ce587d2019-12-19 21:30:22 +08005890
5891 // Set up resolver and start forwarding.
Luke Huang81568fb2020-07-13 00:55:12 +08005892 ASSERT_TRUE(network->setDnsConfiguration());
Mike Yu6ce587d2019-12-19 21:30:22 +08005893 ASSERT_TRUE(network->startTunForwarder());
5894
5895 // Expect the things happening in order:
5896 // 1. The thread sends the query to the dns server which is unresponsive.
5897 // 2. The network is destroyed while the thread is waiting for the response from the dns server.
5898 // 3. After the dns server timeout, the thread retries but fails to connect.
5899 std::thread lookup([&]() {
5900 int fd = resNetworkQuery(network->netId(), host_name, ns_c_in, ns_t_a, 0);
5901 EXPECT_TRUE(fd != -1);
5902 expectAnswersNotValid(fd, -ETIMEDOUT);
5903 });
5904
5905 // Tear down the network as soon as the dns server receives the query.
Luke Huang81568fb2020-07-13 00:55:12 +08005906 const auto condition = [&]() { return GetNumQueries(*dnsPair->dnsServer, host_name) == 1U; };
Mike Yu6ce587d2019-12-19 21:30:22 +08005907 EXPECT_TRUE(PollForCondition(condition));
5908 network.reset();
5909
5910 lookup.join();
5911}
5912
5913TEST_F(ResolverMultinetworkTest, OneCachePerNetwork) {
5914 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
5915 constexpr char host_name[] = "ohayou.example.com.";
5916
Luke Huang81568fb2020-07-13 00:55:12 +08005917 ScopedPhysicalNetwork network1 = CreateScopedPhysicalNetwork(ConnectivityType::V4V6);
5918 ScopedPhysicalNetwork network2 = CreateScopedPhysicalNetwork(ConnectivityType::V4V6);
Mike Yu6ce587d2019-12-19 21:30:22 +08005919 ASSERT_RESULT_OK(network1.init());
5920 ASSERT_RESULT_OK(network2.init());
5921
5922 const Result<DnsServerPair> dnsPair1 = network1.addIpv4Dns();
5923 const Result<DnsServerPair> dnsPair2 = network2.addIpv4Dns();
5924 ASSERT_RESULT_OK(dnsPair1);
5925 ASSERT_RESULT_OK(dnsPair2);
Luke Huang81568fb2020-07-13 00:55:12 +08005926 StartDns(*dnsPair1->dnsServer, {{host_name, ns_type::ns_t_a, "192.0.2.0"}});
5927 StartDns(*dnsPair2->dnsServer, {{host_name, ns_type::ns_t_a, "192.0.2.1"}});
Mike Yu6ce587d2019-12-19 21:30:22 +08005928
5929 // Set up resolver for network 1 and start forwarding.
Luke Huang81568fb2020-07-13 00:55:12 +08005930 ASSERT_TRUE(network1.setDnsConfiguration());
Mike Yu6ce587d2019-12-19 21:30:22 +08005931 ASSERT_TRUE(network1.startTunForwarder());
5932
5933 // Set up resolver for network 2 and start forwarding.
Luke Huang81568fb2020-07-13 00:55:12 +08005934 ASSERT_TRUE(network2.setDnsConfiguration());
Mike Yu6ce587d2019-12-19 21:30:22 +08005935 ASSERT_TRUE(network2.startTunForwarder());
5936
5937 // Send the same queries to both networks.
5938 int fd1 = resNetworkQuery(network1.netId(), host_name, ns_c_in, ns_t_a, 0);
5939 int fd2 = resNetworkQuery(network2.netId(), host_name, ns_c_in, ns_t_a, 0);
5940
Luke Huang81568fb2020-07-13 00:55:12 +08005941 expectAnswersValid(fd1, AF_INET, "192.0.2.0");
5942 expectAnswersValid(fd2, AF_INET, "192.0.2.1");
5943 EXPECT_EQ(GetNumQueries(*dnsPair1->dnsServer, host_name), 1U);
5944 EXPECT_EQ(GetNumQueries(*dnsPair2->dnsServer, host_name), 1U);
Mike Yu6ce587d2019-12-19 21:30:22 +08005945
5946 // Flush the cache of network 1, and send the queries again.
5947 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(network1.netId()).isOk());
5948 fd1 = resNetworkQuery(network1.netId(), host_name, ns_c_in, ns_t_a, 0);
5949 fd2 = resNetworkQuery(network2.netId(), host_name, ns_c_in, ns_t_a, 0);
5950
Luke Huang81568fb2020-07-13 00:55:12 +08005951 expectAnswersValid(fd1, AF_INET, "192.0.2.0");
5952 expectAnswersValid(fd2, AF_INET, "192.0.2.1");
5953 EXPECT_EQ(GetNumQueries(*dnsPair1->dnsServer, host_name), 2U);
5954 EXPECT_EQ(GetNumQueries(*dnsPair2->dnsServer, host_name), 1U);
5955}
5956
5957TEST_F(ResolverMultinetworkTest, DnsWithVpn) {
5958 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
5959 SKIP_IF_BPF_NOT_SUPPORTED;
5960 constexpr char host_name[] = "ohayou.example.com.";
5961 constexpr char ipv4_addr[] = "192.0.2.0";
5962 constexpr char ipv6_addr[] = "2001:db8:cafe:d00d::31";
5963
5964 const std::pair<ConnectivityType, std::vector<std::string>> testPairs[] = {
5965 {ConnectivityType::V4, {ipv4_addr}},
5966 {ConnectivityType::V6, {ipv6_addr}},
5967 {ConnectivityType::V4V6, {ipv6_addr, ipv4_addr}},
5968 };
5969 for (const auto& [type, result] : testPairs) {
5970 SCOPED_TRACE(StringPrintf("ConnectivityType: %d", type));
5971
5972 // Create a network.
5973 ScopedPhysicalNetwork underlyingNetwork = CreateScopedPhysicalNetwork(type, "Underlying");
5974 ScopedVirtualNetwork bypassableVpnNetwork =
5975 CreateScopedVirtualNetwork(type, false, "BypassableVpn");
5976 ScopedVirtualNetwork secureVpnNetwork = CreateScopedVirtualNetwork(type, true, "SecureVpn");
5977
5978 ASSERT_RESULT_OK(underlyingNetwork.init());
5979 ASSERT_RESULT_OK(bypassableVpnNetwork.init());
5980 ASSERT_RESULT_OK(secureVpnNetwork.init());
5981 ASSERT_RESULT_OK(bypassableVpnNetwork.addUser(TEST_UID));
5982 ASSERT_RESULT_OK(secureVpnNetwork.addUser(TEST_UID2));
5983
5984 auto setupDnsFn = [&](std::shared_ptr<test::DNSResponder> dnsServer,
5985 ScopedNetwork* nw) -> void {
5986 StartDns(*dnsServer, {{host_name, ns_type::ns_t_a, ipv4_addr},
5987 {host_name, ns_type::ns_t_aaaa, ipv6_addr}});
5988 ASSERT_TRUE(nw->setDnsConfiguration());
5989 ASSERT_TRUE(nw->startTunForwarder());
5990 };
5991 // Add a testing DNS server to networks.
5992 const Result<DnsServerPair> underlyingPair = (type == ConnectivityType::V4)
5993 ? underlyingNetwork.addIpv4Dns()
5994 : underlyingNetwork.addIpv6Dns();
5995 ASSERT_RESULT_OK(underlyingPair);
5996 const Result<DnsServerPair> bypassableVpnPair = (type == ConnectivityType::V4)
5997 ? bypassableVpnNetwork.addIpv4Dns()
5998 : bypassableVpnNetwork.addIpv6Dns();
5999 ASSERT_RESULT_OK(bypassableVpnPair);
6000 const Result<DnsServerPair> secureVpnPair = (type == ConnectivityType::V4)
6001 ? secureVpnNetwork.addIpv4Dns()
6002 : secureVpnNetwork.addIpv6Dns();
6003 ASSERT_RESULT_OK(secureVpnPair);
6004 // Set up resolver and start forwarding for networks.
6005 setupDnsFn(underlyingPair->dnsServer, &underlyingNetwork);
6006 setupDnsFn(bypassableVpnPair->dnsServer, &bypassableVpnNetwork);
6007 setupDnsFn(secureVpnPair->dnsServer, &secureVpnNetwork);
6008
6009 setDefaultNetwork(underlyingNetwork.netId());
6010 const unsigned underlyingNetId = underlyingNetwork.netId();
6011 const unsigned bypassableVpnNetId = bypassableVpnNetwork.netId();
6012 const unsigned secureVpnNetId = secureVpnNetwork.netId();
6013 // We've called setNetworkForProcess in SetupOemNetwork, so reset to default first.
6014 ScopedSetNetworkForProcess scopedSetNetworkForProcess(NETID_UNSET);
6015 auto expectDnsQueryCountsFn = [&](size_t count,
6016 std::shared_ptr<test::DNSResponder> dnsServer,
6017 unsigned expectedDnsNetId) -> void {
6018 EXPECT_EQ(GetNumQueries(*dnsServer, host_name), count);
6019 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(expectedDnsNetId).isOk());
6020 dnsServer->clearQueries();
6021 // Give DnsResolver some time to clear cache to avoid race.
6022 usleep(5 * 1000);
6023 };
6024
6025 // Create a object to represent default network, do not init it.
6026 ScopedPhysicalNetwork defaultNetwork{NETID_UNSET, "Default"};
6027
6028 // Test VPN with DNS server under 4 different network selection scenarios.
6029 // See the test config for the expectation.
6030 const struct TestConfig {
6031 ScopedNetwork* selectedNetwork;
6032 unsigned expectedDnsNetId;
6033 std::shared_ptr<test::DNSResponder> expectedDnsServer;
6034 } vpnWithDnsServerConfigs[]{
6035 // clang-format off
6036 // Queries use the bypassable VPN by default.
6037 {&defaultNetwork, bypassableVpnNetId, bypassableVpnPair->dnsServer},
6038 // Choosing the underlying network works because the VPN is bypassable.
6039 {&underlyingNetwork, underlyingNetId, underlyingPair->dnsServer},
6040 // Selecting the VPN sends the query on the VPN.
6041 {&bypassableVpnNetwork, bypassableVpnNetId, bypassableVpnPair->dnsServer},
6042 // TEST_UID does not have access to the secure VPN.
6043 {&secureVpnNetwork, bypassableVpnNetId, bypassableVpnPair->dnsServer},
6044 // clang-format on
6045 };
6046 for (const auto& config : vpnWithDnsServerConfigs) {
6047 SCOPED_TRACE(fmt::format("Bypassble VPN with DnsServer, selectedNetwork = {}",
6048 config.selectedNetwork->name()));
6049 expectDnsWorksForUid(host_name, config.selectedNetwork->netId(), TEST_UID, result);
6050 expectDnsQueryCountsFn(result.size(), config.expectedDnsServer,
6051 config.expectedDnsNetId);
6052 }
6053
6054 std::vector<ScopedNetwork*> nwVec{&defaultNetwork, &underlyingNetwork,
6055 &bypassableVpnNetwork, &secureVpnNetwork};
6056 // Test the VPN without DNS server with the same combination as before.
6057 ASSERT_TRUE(bypassableVpnNetwork.clearDnsConfiguration());
6058 // Test bypassable VPN, TEST_UID
6059 for (const auto* selectedNetwork : nwVec) {
6060 SCOPED_TRACE(fmt::format("Bypassble VPN without DnsServer, selectedNetwork = {}",
6061 selectedNetwork->name()));
6062 expectDnsWorksForUid(host_name, selectedNetwork->netId(), TEST_UID, result);
6063 expectDnsQueryCountsFn(result.size(), underlyingPair->dnsServer, underlyingNetId);
6064 }
6065
6066 // The same test scenario as before plus enableVpnIsolation for secure VPN, TEST_UID2.
6067 for (bool enableVpnIsolation : {false, true}) {
6068 SCOPED_TRACE(fmt::format("enableVpnIsolation = {}", enableVpnIsolation));
6069 if (enableVpnIsolation) {
6070 EXPECT_RESULT_OK(secureVpnNetwork.enableVpnIsolation(TEST_UID2));
6071 }
6072
6073 // Test secure VPN without DNS server.
6074 ASSERT_TRUE(secureVpnNetwork.clearDnsConfiguration());
6075 for (const auto* selectedNetwork : nwVec) {
6076 SCOPED_TRACE(fmt::format("Secure VPN without DnsServer, selectedNetwork = {}",
6077 selectedNetwork->name()));
6078 expectDnsWorksForUid(host_name, selectedNetwork->netId(), TEST_UID2, result);
6079 expectDnsQueryCountsFn(result.size(), underlyingPair->dnsServer, underlyingNetId);
6080 }
6081
6082 // Test secure VPN with DNS server.
6083 ASSERT_TRUE(secureVpnNetwork.setDnsConfiguration());
6084 for (const auto* selectedNetwork : nwVec) {
6085 SCOPED_TRACE(fmt::format("Secure VPN with DnsServer, selectedNetwork = {}",
6086 selectedNetwork->name()));
6087 expectDnsWorksForUid(host_name, selectedNetwork->netId(), TEST_UID2, result);
6088 expectDnsQueryCountsFn(result.size(), secureVpnPair->dnsServer, secureVpnNetId);
6089 }
6090
6091 if (enableVpnIsolation) {
6092 EXPECT_RESULT_OK(secureVpnNetwork.disableVpnIsolation(TEST_UID2));
6093 }
6094 }
6095 }
Mike Yu6ce587d2019-12-19 21:30:22 +08006096}