blob: f95316e770f69964f4fd4784a4de94572b7f9506 [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 Yu10832aa2020-08-25 19:13:11 +080084
Ken Chenb9fa2062018-11-13 21:51:13 +080085// Semi-public Bionic hook used by the NDK (frameworks/base/native/android/net.c)
86// Tested here for convenience.
87extern "C" int android_getaddrinfofornet(const char* hostname, const char* servname,
88 const addrinfo* hints, unsigned netid, unsigned mark,
89 struct addrinfo** result);
90
Mike Yu153b5b82020-03-04 19:53:54 +080091using namespace std::chrono_literals;
92
Luke Huang70070852019-11-25 18:25:50 +080093using aidl::android::net::IDnsResolver;
Luke Huangf8215372019-11-22 11:53:41 +080094using aidl::android::net::INetd;
Mike Yu8ac63402019-12-02 15:28:38 +080095using aidl::android::net::ResolverParamsParcel;
Mike Yu532405f2020-06-17 17:46:44 +080096using aidl::android::net::metrics::INetdEventListener;
Mike Yu6ce587d2019-12-19 21:30:22 +080097using android::base::Error;
Luke Huang9807e6b2019-05-20 16:17:12 +080098using android::base::ParseInt;
Mike Yu6ce587d2019-12-19 21:30:22 +080099using android::base::Result;
Ken Chenb9fa2062018-11-13 21:51:13 +0800100using android::base::StringPrintf;
Luke Huang9807e6b2019-05-20 16:17:12 +0800101using android::base::unique_fd;
Ken Chenb9fa2062018-11-13 21:51:13 +0800102using android::net::ResolverStats;
Mike Yu6ce587d2019-12-19 21:30:22 +0800103using android::net::TunForwarder;
Hungming Chene8f970c2019-04-10 17:34:06 +0800104using android::net::metrics::DnsMetricsListener;
Ken Chenb9fa2062018-11-13 21:51:13 +0800105using android::netdutils::enableSockopt;
Hungming Chen63779052019-10-30 15:06:13 +0800106using android::netdutils::makeSlice;
Luke Huang9807e6b2019-05-20 16:17:12 +0800107using android::netdutils::ResponseCode;
Luke Huang9d2d25b2019-06-14 00:34:05 +0800108using android::netdutils::ScopedAddrinfo;
Mike Yu40e67072019-10-09 21:14:09 +0800109using android::netdutils::Stopwatch;
Hungming Chen63779052019-10-30 15:06:13 +0800110using android::netdutils::toHex;
Ken Chenb9fa2062018-11-13 21:51:13 +0800111
112// TODO: move into libnetdutils?
113namespace {
Luke Huangfde82482019-06-04 01:04:53 +0800114
Ken Chenb9fa2062018-11-13 21:51:13 +0800115ScopedAddrinfo safe_getaddrinfo(const char* node, const char* service,
116 const struct addrinfo* hints) {
117 addrinfo* result = nullptr;
118 if (getaddrinfo(node, service, hints, &result) != 0) {
119 result = nullptr; // Should already be the case, but...
120 }
121 return ScopedAddrinfo(result);
122}
Luke Huangfde82482019-06-04 01:04:53 +0800123
Mike Yu40e67072019-10-09 21:14:09 +0800124std::pair<ScopedAddrinfo, int> safe_getaddrinfo_time_taken(const char* node, const char* service,
125 const addrinfo& hints) {
126 Stopwatch s;
127 ScopedAddrinfo result = safe_getaddrinfo(node, service, &hints);
128 return {std::move(result), s.timeTakenUs() / 1000};
129}
130
Mike Yue2162e52020-03-04 18:43:46 +0800131struct NameserverStats {
132 NameserverStats() = delete;
133 NameserverStats(const std::string server) : server(server) {}
134 NameserverStats& setSuccesses(int val) {
135 successes = val;
136 return *this;
137 }
138 NameserverStats& setErrors(int val) {
139 errors = val;
140 return *this;
141 }
142 NameserverStats& setTimeouts(int val) {
143 timeouts = val;
144 return *this;
145 }
146 NameserverStats& setInternalErrors(int val) {
147 internal_errors = val;
148 return *this;
149 }
150
151 const std::string server;
152 int successes = 0;
153 int errors = 0;
154 int timeouts = 0;
155 int internal_errors = 0;
156};
157
Mike Yu61d17262020-02-15 18:56:22 +0800158class ScopedSystemProperties {
159 public:
160 ScopedSystemProperties(const std::string& key, const std::string& value) : mStoredKey(key) {
161 mStoredValue = android::base::GetProperty(key, "");
162 android::base::SetProperty(key, value);
163 }
164 ~ScopedSystemProperties() { android::base::SetProperty(mStoredKey, mStoredValue); }
165
166 private:
167 std::string mStoredKey;
168 std::string mStoredValue;
169};
170
Luke Huang5729afc2020-07-30 23:12:17 +0800171const bool isAtLeastR = (getApiLevel() >= 30);
172
Ken Chenb9fa2062018-11-13 21:51:13 +0800173} // namespace
174
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900175class ResolverTest : public ::testing::Test {
Hungming Chene8f970c2019-04-10 17:34:06 +0800176 public:
Hungming Chen473c4de2020-03-12 11:13:35 +0800177 static void SetUpTestSuite() {
Hungming Chen5bf09772019-04-25 11:16:13 +0800178 // Get binder service.
179 // Note that |mDnsClient| is not used for getting binder service in this static function.
180 // The reason is that wants to keep |mDnsClient| as a non-static data member. |mDnsClient|
181 // which sets up device network configuration could be independent from every test.
Luke Huangf8215372019-11-22 11:53:41 +0800182 // TODO: Perhaps add a static function in resolv_test_binder_utils.{cpp,h} to get binder
183 // service.
184
185 AIBinder* binder = AServiceManager_getService("dnsresolver");
186 ndk::SpAIBinder resolvBinder = ndk::SpAIBinder(binder);
187 auto resolvService = aidl::android::net::IDnsResolver::fromBinder(resolvBinder);
Hungming Chen5bf09772019-04-25 11:16:13 +0800188 ASSERT_NE(nullptr, resolvService.get());
189
190 // Subscribe the death recipient to the service IDnsResolver for detecting Netd death.
Luke Huang70070852019-11-25 18:25:50 +0800191 // GTEST assertion macros are not invoked for generating a test failure in the death
192 // recipient because the macros can't indicate failed test if Netd died between tests.
193 // Moreover, continuing testing may have no meaningful after Netd death. Therefore, the
194 // death recipient aborts process by GTEST_LOG_(FATAL) once Netd died.
Luke Huangf8215372019-11-22 11:53:41 +0800195 sResolvDeathRecipient = AIBinder_DeathRecipient_new([](void*) {
196 constexpr char errorMessage[] = "Netd died";
197 LOG(ERROR) << errorMessage;
198 GTEST_LOG_(FATAL) << errorMessage;
199 });
200 ASSERT_EQ(STATUS_OK, AIBinder_linkToDeath(binder, sResolvDeathRecipient, nullptr));
Hungming Chen5bf09772019-04-25 11:16:13 +0800201
202 // Subscribe the DNS listener for verifying DNS metrics event contents.
Luke Huangf8215372019-11-22 11:53:41 +0800203 sDnsMetricsListener = ndk::SharedRefBase::make<DnsMetricsListener>(
204 TEST_NETID /*monitor specific network*/);
Hungming Chen5bf09772019-04-25 11:16:13 +0800205 ASSERT_TRUE(resolvService->registerEventListener(sDnsMetricsListener).isOk());
206
207 // Start the binder thread pool for listening DNS metrics events and receiving death
208 // recipient.
Luke Huangf8215372019-11-22 11:53:41 +0800209 ABinderProcess_startThreadPool();
Hungming Chene8f970c2019-04-10 17:34:06 +0800210 }
Hungming Chen473c4de2020-03-12 11:13:35 +0800211 static void TearDownTestSuite() { AIBinder_DeathRecipient_delete(sResolvDeathRecipient); }
Hungming Chene8f970c2019-04-10 17:34:06 +0800212
Ken Chenb9fa2062018-11-13 21:51:13 +0800213 protected:
Lorenzo Colitti61f796b2020-05-21 00:57:49 +0900214 void SetUp() {
215 mDnsClient.SetUp();
216 sDnsMetricsListener->reset();
217 }
218
Mike Yu960243d2020-01-17 19:02:15 +0800219 void TearDown() {
220 // Ensure the dump works at the end of each test.
221 DumpResolverService();
222
223 mDnsClient.TearDown();
224 }
nuccachena26cc2a2018-07-17 18:07:23 +0800225
Luke Huangf40df9c2020-04-21 08:51:48 +0800226 void resetNetwork() {
227 mDnsClient.TearDown();
228 mDnsClient.SetupOemNetwork();
229 }
230
Xiao Ma09b71022018-12-11 17:56:32 +0900231 void StartDns(test::DNSResponder& dns, const std::vector<DnsRecord>& records) {
232 for (const auto& r : records) {
233 dns.addMapping(r.host_name, r.type, r.addr);
234 }
235
236 ASSERT_TRUE(dns.startServer());
237 dns.clearQueries();
238 }
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900239
Mike Yu960243d2020-01-17 19:02:15 +0800240 void DumpResolverService() {
241 unique_fd fd(open("/dev/null", O_WRONLY));
242 EXPECT_EQ(mDnsClient.resolvService()->dump(fd, nullptr, 0), 0);
243
244 const char* querylogCmd[] = {"querylog"}; // Keep it sync with DnsQueryLog::DUMP_KEYWORD.
245 EXPECT_EQ(mDnsClient.resolvService()->dump(fd, querylogCmd, std::size(querylogCmd)), 0);
246 }
247
Hungming Chene8f970c2019-04-10 17:34:06 +0800248 bool WaitForNat64Prefix(ExpectNat64PrefixStatus status,
249 std::chrono::milliseconds timeout = std::chrono::milliseconds(1000)) {
Hungming Chen5bf09772019-04-25 11:16:13 +0800250 return sDnsMetricsListener->waitForNat64Prefix(status, timeout);
Hungming Chene8f970c2019-04-10 17:34:06 +0800251 }
252
Mike Yu724f77d2019-08-16 11:14:50 +0800253 bool WaitForPrivateDnsValidation(std::string serverAddr, bool validated) {
254 return sDnsMetricsListener->waitForPrivateDnsValidation(serverAddr, validated);
255 }
256
Mike Yu153b5b82020-03-04 19:53:54 +0800257 bool hasUncaughtPrivateDnsValidation(const std::string& serverAddr) {
258 return sDnsMetricsListener->findValidationRecord(serverAddr);
259 }
260
Mike Yu532405f2020-06-17 17:46:44 +0800261 void ExpectDnsEvent(int32_t eventType, int32_t returnCode, const std::string& hostname,
262 const std::vector<std::string>& ipAddresses) {
263 const DnsMetricsListener::DnsEvent expect = {
264 TEST_NETID, eventType, returnCode,
265 hostname, ipAddresses, static_cast<int32_t>(ipAddresses.size())};
Mike Yub8faac42020-06-20 11:11:44 +0800266 do {
267 // Blocking call until timeout.
268 const auto dnsEvent = sDnsMetricsListener->popDnsEvent();
269 ASSERT_TRUE(dnsEvent.has_value()) << "Expected DnsEvent " << expect;
270 if (dnsEvent.value() == expect) break;
271 LOG(INFO) << "Skip unexpected DnsEvent: " << dnsEvent.value();
272 } while (true);
Mike Yu532405f2020-06-17 17:46:44 +0800273 }
274
Mike Yu61d17262020-02-15 18:56:22 +0800275 enum class StatsCmp { LE, EQ };
276
277 bool expectStatsNotGreaterThan(const std::vector<NameserverStats>& nameserversStats) {
278 return expectStatsFromGetResolverInfo(nameserversStats, StatsCmp::LE);
279 }
280
281 bool expectStatsEqualTo(const std::vector<NameserverStats>& nameserversStats) {
282 return expectStatsFromGetResolverInfo(nameserversStats, StatsCmp::EQ);
283 }
284
285 bool expectStatsFromGetResolverInfo(const std::vector<NameserverStats>& nameserversStats,
286 const StatsCmp cmp) {
Mike Yue2162e52020-03-04 18:43:46 +0800287 std::vector<std::string> res_servers;
288 std::vector<std::string> res_domains;
289 std::vector<std::string> res_tls_servers;
290 res_params res_params;
291 std::vector<ResolverStats> res_stats;
292 int wait_for_pending_req_timeout_count;
293
294 if (!DnsResponderClient::GetResolverInfo(mDnsClient.resolvService(), TEST_NETID,
295 &res_servers, &res_domains, &res_tls_servers,
296 &res_params, &res_stats,
297 &wait_for_pending_req_timeout_count)) {
298 ADD_FAILURE() << "GetResolverInfo failed";
299 return false;
300 }
301
302 if (res_servers.size() != res_stats.size()) {
303 ADD_FAILURE() << fmt::format("res_servers.size() != res_stats.size(): {} != {}",
304 res_servers.size(), res_stats.size());
305 return false;
306 }
307 if (res_servers.size() != nameserversStats.size()) {
308 ADD_FAILURE() << fmt::format("res_servers.size() != nameserversStats.size(): {} != {}",
309 res_servers.size(), nameserversStats.size());
310 return false;
311 }
312
313 for (const auto& stats : nameserversStats) {
314 SCOPED_TRACE(stats.server);
315 const auto it = std::find(res_servers.begin(), res_servers.end(), stats.server);
316 if (it == res_servers.end()) {
317 ADD_FAILURE() << fmt::format("nameserver {} not found in the list {{{}}}",
318 stats.server, fmt::join(res_servers, ", "));
319 return false;
320 }
321 const int index = std::distance(res_servers.begin(), it);
322
323 // The check excludes rtt_avg, last_sample_time, and usable since they will be obsolete
324 // after |res_stats| is retrieved from NetConfig.dnsStats rather than NetConfig.nsstats.
Mike Yu61d17262020-02-15 18:56:22 +0800325 switch (cmp) {
326 case StatsCmp::EQ:
327 EXPECT_EQ(res_stats[index].successes, stats.successes);
328 EXPECT_EQ(res_stats[index].errors, stats.errors);
329 EXPECT_EQ(res_stats[index].timeouts, stats.timeouts);
330 EXPECT_EQ(res_stats[index].internal_errors, stats.internal_errors);
331 break;
332 case StatsCmp::LE:
333 EXPECT_LE(res_stats[index].successes, stats.successes);
334 EXPECT_LE(res_stats[index].errors, stats.errors);
335 EXPECT_LE(res_stats[index].timeouts, stats.timeouts);
336 EXPECT_LE(res_stats[index].internal_errors, stats.internal_errors);
337 break;
338 default:
339 ADD_FAILURE() << "Unknown comparator " << static_cast<int>(cmp);
340 return false;
341 }
Mike Yue2162e52020-03-04 18:43:46 +0800342 }
343
344 return true;
345 }
346
Mike Yu153b5b82020-03-04 19:53:54 +0800347 // Since there's no way to terminate private DNS validation threads at any time. Tests that
348 // focus on the results of private DNS validation can interfere with each other if they use the
349 // same IP address for test servers. getUniqueIPv4Address() is a workaround to reduce the
350 // possibility of tests being flaky. A feasible solution is to forbid the validation threads,
351 // which are considered as outdated (e.g. switch the resolver to private DNS OFF mode), updating
352 // the result to the PrivateDnsConfiguration instance.
353 static std::string getUniqueIPv4Address() {
354 static int counter = 0;
355 return fmt::format("127.0.100.{}", (++counter & 0xff));
356 }
357
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900358 DnsResponderClient mDnsClient;
Xiao Ma09b71022018-12-11 17:56:32 +0900359
Hungming Chen5bf09772019-04-25 11:16:13 +0800360 // Use a shared static DNS listener for all tests to avoid registering lots of listeners
361 // which may be released late until process terminated. Currently, registered DNS listener
362 // is removed by binder death notification which is fired when the process hosting an
363 // IBinder has gone away. If every test in ResolverTest registers its DNS listener, Netd
364 // may temporarily hold lots of dead listeners until the unit test process terminates.
365 // TODO: Perhaps add an unregistering listener binder call or fork a listener process which
366 // could be terminated earlier.
Luke Huangf8215372019-11-22 11:53:41 +0800367 static std::shared_ptr<DnsMetricsListener>
Hungming Chen473c4de2020-03-12 11:13:35 +0800368 sDnsMetricsListener; // Initialized in SetUpTestSuite.
Hungming Chen5bf09772019-04-25 11:16:13 +0800369
370 // Use a shared static death recipient to monitor the service death. The static death
371 // recipient could monitor the death not only during the test but also between tests.
Hungming Chen473c4de2020-03-12 11:13:35 +0800372 static AIBinder_DeathRecipient* sResolvDeathRecipient; // Initialized in SetUpTestSuite.
Ken Chenb9fa2062018-11-13 21:51:13 +0800373};
374
Hungming Chen5bf09772019-04-25 11:16:13 +0800375// Initialize static member of class.
Luke Huangf8215372019-11-22 11:53:41 +0800376std::shared_ptr<DnsMetricsListener> ResolverTest::sDnsMetricsListener;
377AIBinder_DeathRecipient* ResolverTest::sResolvDeathRecipient;
Hungming Chen5bf09772019-04-25 11:16:13 +0800378
Ken Chenb9fa2062018-11-13 21:51:13 +0800379TEST_F(ResolverTest, GetHostByName) {
Xiao Ma09b71022018-12-11 17:56:32 +0900380 constexpr char nonexistent_host_name[] = "nonexistent.example.com.";
381
382 test::DNSResponder dns;
383 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.3"}});
384 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800385
386 const hostent* result;
Ken Chenb9fa2062018-11-13 21:51:13 +0800387 result = gethostbyname("nonexistent");
388 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, nonexistent_host_name));
389 ASSERT_TRUE(result == nullptr);
390 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
391
392 dns.clearQueries();
393 result = gethostbyname("hello");
Xiao Ma09b71022018-12-11 17:56:32 +0900394 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
Ken Chenb9fa2062018-11-13 21:51:13 +0800395 ASSERT_FALSE(result == nullptr);
396 ASSERT_EQ(4, result->h_length);
397 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
398 EXPECT_EQ("1.2.3.3", ToString(result));
399 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800400}
401
lifr4e4a2e02019-01-29 16:53:51 +0800402TEST_F(ResolverTest, GetHostByName_cnames) {
403 constexpr char host_name[] = "host.example.com.";
404 size_t cnamecount = 0;
405 test::DNSResponder dns;
406
407 const std::vector<DnsRecord> records = {
408 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
409 {"a.example.com.", ns_type::ns_t_cname, "b.example.com."},
410 {"b.example.com.", ns_type::ns_t_cname, "c.example.com."},
411 {"c.example.com.", ns_type::ns_t_cname, "d.example.com."},
412 {"d.example.com.", ns_type::ns_t_cname, "e.example.com."},
413 {"e.example.com.", ns_type::ns_t_cname, host_name},
414 {host_name, ns_type::ns_t_a, "1.2.3.3"},
415 {host_name, ns_type::ns_t_aaaa, "2001:db8::42"},
416 };
417 StartDns(dns, records);
418 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
419
420 // using gethostbyname2() to resolve ipv4 hello.example.com. to 1.2.3.3
421 // Ensure the v4 address and cnames are correct
422 const hostent* result;
423 result = gethostbyname2("hello", AF_INET);
424 ASSERT_FALSE(result == nullptr);
425
426 for (int i = 0; result != nullptr && result->h_aliases[i] != nullptr; i++) {
427 std::string domain_name = records[i].host_name.substr(0, records[i].host_name.size() - 1);
428 EXPECT_EQ(result->h_aliases[i], domain_name);
429 cnamecount++;
430 }
431 // The size of "Non-cname type" record in DNS records is 2
432 ASSERT_EQ(cnamecount, records.size() - 2);
433 ASSERT_EQ(4, result->h_length);
434 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
435 EXPECT_EQ("1.2.3.3", ToString(result));
436 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
437 EXPECT_EQ(1U, dns.queries().size()) << dns.dumpQueries();
438
439 // using gethostbyname2() to resolve ipv6 hello.example.com. to 2001:db8::42
440 // Ensure the v6 address and cnames are correct
441 cnamecount = 0;
442 dns.clearQueries();
443 result = gethostbyname2("hello", AF_INET6);
444 for (unsigned i = 0; result != nullptr && result->h_aliases[i] != nullptr; i++) {
445 std::string domain_name = records[i].host_name.substr(0, records[i].host_name.size() - 1);
446 EXPECT_EQ(result->h_aliases[i], domain_name);
447 cnamecount++;
448 }
449 // The size of "Non-cname type" DNS record in records is 2
450 ASSERT_EQ(cnamecount, records.size() - 2);
451 ASSERT_FALSE(result == nullptr);
452 ASSERT_EQ(16, result->h_length);
453 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
454 EXPECT_EQ("2001:db8::42", ToString(result));
455 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
456}
457
458TEST_F(ResolverTest, GetHostByName_cnamesInfiniteLoop) {
459 test::DNSResponder dns;
460 const std::vector<DnsRecord> records = {
461 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
462 {"a.example.com.", ns_type::ns_t_cname, kHelloExampleCom},
463 };
464 StartDns(dns, records);
465 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
466
467 const hostent* result;
468 result = gethostbyname2("hello", AF_INET);
469 ASSERT_TRUE(result == nullptr);
470
471 dns.clearQueries();
472 result = gethostbyname2("hello", AF_INET6);
473 ASSERT_TRUE(result == nullptr);
474}
475
Ken Chenb9fa2062018-11-13 21:51:13 +0800476TEST_F(ResolverTest, GetHostByName_localhost) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800477 constexpr char name_camelcase[] = "LocalHost";
Ken Chenb9fa2062018-11-13 21:51:13 +0800478 constexpr char name_ip6_dot[] = "ip6-localhost.";
479 constexpr char name_ip6_fqdn[] = "ip6-localhost.example.com.";
480
markchien96b09e22020-07-29 14:24:34 +0800481 // Add a no-op nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900482 test::DNSResponder dns;
483 StartDns(dns, {});
484 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800485
486 // Expect no DNS queries; localhost is resolved via /etc/hosts
Xiao Ma09b71022018-12-11 17:56:32 +0900487 const hostent* result = gethostbyname(kLocalHost);
Ken Chenb9fa2062018-11-13 21:51:13 +0800488 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
489 ASSERT_FALSE(result == nullptr);
490 ASSERT_EQ(4, result->h_length);
491 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900492 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800493 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
494
495 // Ensure the hosts file resolver ignores case of hostnames
496 result = gethostbyname(name_camelcase);
497 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
498 ASSERT_FALSE(result == nullptr);
499 ASSERT_EQ(4, result->h_length);
500 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900501 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800502 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
503
504 // The hosts file also contains ip6-localhost, but gethostbyname() won't
chenbruce018fdb22019-06-12 18:08:04 +0800505 // return it. This would be easy to
Ken Chenb9fa2062018-11-13 21:51:13 +0800506 // change, but there's no point in changing the legacy behavior; new code
507 // should be calling getaddrinfo() anyway.
508 // So we check the legacy behavior, which results in amusing A-record
509 // lookups for ip6-localhost, with and without search domains appended.
510 dns.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900511 result = gethostbyname(kIp6LocalHost);
Sehee Parkbbca0202018-11-16 10:53:16 +0900512 EXPECT_EQ(2U, dns.queries().size()) << dns.dumpQueries();
513 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, name_ip6_dot)) << dns.dumpQueries();
514 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, name_ip6_fqdn)) << dns.dumpQueries();
Ken Chenb9fa2062018-11-13 21:51:13 +0800515 ASSERT_TRUE(result == nullptr);
516
517 // Finally, use gethostbyname2() to resolve ip6-localhost to ::1 from
518 // the hosts file.
519 dns.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900520 result = gethostbyname2(kIp6LocalHost, AF_INET6);
Ken Chenb9fa2062018-11-13 21:51:13 +0800521 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
522 ASSERT_FALSE(result == nullptr);
523 ASSERT_EQ(16, result->h_length);
524 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900525 EXPECT_EQ(kIp6LocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800526 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800527}
528
529TEST_F(ResolverTest, GetHostByName_numeric) {
markchien96b09e22020-07-29 14:24:34 +0800530 // Add a no-op nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900531 test::DNSResponder dns;
532 StartDns(dns, {});
533 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800534
535 // Numeric v4 address: expect no DNS queries
536 constexpr char numeric_v4[] = "192.168.0.1";
Ken Chenb9fa2062018-11-13 21:51:13 +0800537 const hostent* result = gethostbyname(numeric_v4);
Sehee Parkbbca0202018-11-16 10:53:16 +0900538 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800539 ASSERT_FALSE(result == nullptr);
540 ASSERT_EQ(4, result->h_length); // v4
541 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
542 EXPECT_EQ(numeric_v4, ToString(result));
543 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
544
545 // gethostbyname() recognizes a v6 address, and fails with no DNS queries
546 constexpr char numeric_v6[] = "2001:db8::42";
547 dns.clearQueries();
548 result = gethostbyname(numeric_v6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900549 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800550 EXPECT_TRUE(result == nullptr);
551
552 // Numeric v6 address with gethostbyname2(): succeeds with no DNS queries
553 dns.clearQueries();
554 result = gethostbyname2(numeric_v6, AF_INET6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900555 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800556 ASSERT_FALSE(result == nullptr);
557 ASSERT_EQ(16, result->h_length); // v6
558 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
559 EXPECT_EQ(numeric_v6, ToString(result));
560 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
561
562 // Numeric v6 address with scope work with getaddrinfo(),
563 // but gethostbyname2() does not understand them; it issues two dns
564 // queries, then fails. This hardly ever happens, there's no point
565 // in fixing this. This test simply verifies the current (bogus)
566 // behavior to avoid further regressions (like crashes, or leaks).
567 constexpr char numeric_v6_scope[] = "fe80::1%lo";
568 dns.clearQueries();
569 result = gethostbyname2(numeric_v6_scope, AF_INET6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900570 EXPECT_EQ(2U, dns.queries().size()); // OUCH!
Ken Chenb9fa2062018-11-13 21:51:13 +0800571 ASSERT_TRUE(result == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800572}
573
574TEST_F(ResolverTest, BinderSerialization) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800575 std::vector<int> params_offsets = {
Luke Huang5bd827c2019-03-14 16:10:04 +0800576 IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY,
577 IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD,
578 IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES,
579 IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES,
580 IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC,
581 IDnsResolver::RESOLVER_PARAMS_RETRY_COUNT,
Ken Chenb9fa2062018-11-13 21:51:13 +0800582 };
Bernie Innocentib102dd22018-12-04 14:57:48 +0900583 const int size = static_cast<int>(params_offsets.size());
Luke Huang5bd827c2019-03-14 16:10:04 +0800584 EXPECT_EQ(size, IDnsResolver::RESOLVER_PARAMS_COUNT);
Ken Chenb9fa2062018-11-13 21:51:13 +0800585 std::sort(params_offsets.begin(), params_offsets.end());
Bernie Innocentib102dd22018-12-04 14:57:48 +0900586 for (int i = 0; i < size; ++i) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800587 EXPECT_EQ(params_offsets[i], i);
588 }
589}
590
591TEST_F(ResolverTest, GetHostByName_Binder) {
Luke Huangf8215372019-11-22 11:53:41 +0800592 std::vector<std::string> domains = {"example.com"};
Ken Chenb9fa2062018-11-13 21:51:13 +0800593 std::vector<std::unique_ptr<test::DNSResponder>> dns;
594 std::vector<std::string> servers;
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900595 std::vector<DnsResponderClient::Mapping> mappings;
596 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupMappings(1, domains, &mappings));
597 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupDNSServers(4, mappings, &dns, &servers));
Ken Chenb9fa2062018-11-13 21:51:13 +0800598 ASSERT_EQ(1U, mappings.size());
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900599 const DnsResponderClient::Mapping& mapping = mappings[0];
Ken Chenb9fa2062018-11-13 21:51:13 +0800600
Xiao Ma09b71022018-12-11 17:56:32 +0900601 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains, kDefaultParams));
Ken Chenb9fa2062018-11-13 21:51:13 +0800602
603 const hostent* result = gethostbyname(mapping.host.c_str());
Bernie Innocentib102dd22018-12-04 14:57:48 +0900604 const size_t total_queries =
Luke Huangfde82482019-06-04 01:04:53 +0800605 std::accumulate(dns.begin(), dns.end(), 0, [&mapping](size_t total, auto& d) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800606 return total + GetNumQueriesForType(*d, ns_type::ns_t_a, mapping.entry.c_str());
607 });
608
609 EXPECT_LE(1U, total_queries);
610 ASSERT_FALSE(result == nullptr);
611 ASSERT_EQ(4, result->h_length);
612 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
613 EXPECT_EQ(mapping.ip4, ToString(result));
614 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
615
616 std::vector<std::string> res_servers;
617 std::vector<std::string> res_domains;
Mike Yu0a1c53d2018-11-26 13:26:21 +0900618 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +0900619 res_params res_params;
Ken Chenb9fa2062018-11-13 21:51:13 +0800620 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +0800621 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +0800622 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
623 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
624 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chenb9fa2062018-11-13 21:51:13 +0800625 EXPECT_EQ(servers.size(), res_servers.size());
626 EXPECT_EQ(domains.size(), res_domains.size());
Mike Yu0a1c53d2018-11-26 13:26:21 +0900627 EXPECT_EQ(0U, res_tls_servers.size());
Luke Huang5bd827c2019-03-14 16:10:04 +0800628 ASSERT_EQ(static_cast<size_t>(IDnsResolver::RESOLVER_PARAMS_COUNT), kDefaultParams.size());
629 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY],
630 res_params.sample_validity);
631 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900632 res_params.success_threshold);
Luke Huang5bd827c2019-03-14 16:10:04 +0800633 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
634 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
635 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
Ken Chenb9fa2062018-11-13 21:51:13 +0800636 res_params.base_timeout_msec);
637 EXPECT_EQ(servers.size(), res_stats.size());
638
Bernie Innocenti0c067e42019-04-01 15:33:16 +0900639 EXPECT_THAT(res_servers, testing::UnorderedElementsAreArray(servers));
640 EXPECT_THAT(res_domains, testing::UnorderedElementsAreArray(domains));
Ken Chenb9fa2062018-11-13 21:51:13 +0800641}
642
643TEST_F(ResolverTest, GetAddrInfo) {
Xiao Ma09b71022018-12-11 17:56:32 +0900644 constexpr char listen_addr[] = "127.0.0.4";
645 constexpr char listen_addr2[] = "127.0.0.5";
646 constexpr char host_name[] = "howdy.example.com.";
Ken Chenb9fa2062018-11-13 21:51:13 +0800647
Xiao Ma09b71022018-12-11 17:56:32 +0900648 const std::vector<DnsRecord> records = {
649 {host_name, ns_type::ns_t_a, "1.2.3.4"},
650 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
651 };
652 test::DNSResponder dns(listen_addr);
653 test::DNSResponder dns2(listen_addr2);
654 StartDns(dns, records);
655 StartDns(dns2, records);
Ken Chenb9fa2062018-11-13 21:51:13 +0800656
Xiao Ma09b71022018-12-11 17:56:32 +0900657 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}));
Ken Chenb9fa2062018-11-13 21:51:13 +0800658 dns.clearQueries();
659 dns2.clearQueries();
660
661 ScopedAddrinfo result = safe_getaddrinfo("howdy", nullptr, nullptr);
662 EXPECT_TRUE(result != nullptr);
663 size_t found = GetNumQueries(dns, host_name);
664 EXPECT_LE(1U, found);
665 // Could be A or AAAA
666 std::string result_str = ToString(result);
667 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +0800668 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +0800669
670 // Verify that the name is cached.
671 size_t old_found = found;
672 result = safe_getaddrinfo("howdy", nullptr, nullptr);
673 EXPECT_TRUE(result != nullptr);
674 found = GetNumQueries(dns, host_name);
675 EXPECT_LE(1U, found);
676 EXPECT_EQ(old_found, found);
677 result_str = ToString(result);
Luke Huangf8215372019-11-22 11:53:41 +0800678 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4") << result_str;
Ken Chenb9fa2062018-11-13 21:51:13 +0800679
680 // Change the DNS resolver, ensure that queries are still cached.
Xiao Ma09b71022018-12-11 17:56:32 +0900681 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr2}));
Ken Chenb9fa2062018-11-13 21:51:13 +0800682 dns.clearQueries();
683 dns2.clearQueries();
684
685 result = safe_getaddrinfo("howdy", nullptr, nullptr);
686 EXPECT_TRUE(result != nullptr);
687 found = GetNumQueries(dns, host_name);
688 size_t found2 = GetNumQueries(dns2, host_name);
689 EXPECT_EQ(0U, found);
690 EXPECT_LE(0U, found2);
691
692 // Could be A or AAAA
693 result_str = ToString(result);
694 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +0800695 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +0800696}
697
698TEST_F(ResolverTest, GetAddrInfoV4) {
Xiao Ma09b71022018-12-11 17:56:32 +0900699 test::DNSResponder dns;
700 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.5"}});
701 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800702
Xiao Ma09b71022018-12-11 17:56:32 +0900703 const addrinfo hints = {.ai_family = AF_INET};
704 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
Ken Chenb9fa2062018-11-13 21:51:13 +0800705 EXPECT_TRUE(result != nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900706 EXPECT_EQ(1U, GetNumQueries(dns, kHelloExampleCom));
Ken Chenb9fa2062018-11-13 21:51:13 +0800707 EXPECT_EQ("1.2.3.5", ToString(result));
708}
709
710TEST_F(ResolverTest, GetAddrInfo_localhost) {
markchien96b09e22020-07-29 14:24:34 +0800711 // Add a no-op nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900712 test::DNSResponder dns;
713 StartDns(dns, {});
714 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800715
Xiao Ma09b71022018-12-11 17:56:32 +0900716 ScopedAddrinfo result = safe_getaddrinfo(kLocalHost, nullptr, nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800717 EXPECT_TRUE(result != nullptr);
718 // Expect no DNS queries; localhost is resolved via /etc/hosts
719 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900720 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800721
Xiao Ma09b71022018-12-11 17:56:32 +0900722 result = safe_getaddrinfo(kIp6LocalHost, nullptr, nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800723 EXPECT_TRUE(result != nullptr);
724 // Expect no DNS queries; ip6-localhost is resolved via /etc/hosts
725 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900726 EXPECT_EQ(kIp6LocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800727}
728
Luke Huangd8ac4752019-06-18 17:05:47 +0800729TEST_F(ResolverTest, GetAddrInfo_InvalidSocketType) {
730 test::DNSResponder dns;
731 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.5"}});
732 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
733
734 // TODO: Test other invalid socket types.
735 const addrinfo hints = {
736 .ai_family = AF_UNSPEC,
Luke Huangd8ac4752019-06-18 17:05:47 +0800737 .ai_socktype = SOCK_PACKET,
738 };
739 addrinfo* result = nullptr;
740 // This is a valid hint, but the query won't be sent because the socket type is
741 // not supported.
742 EXPECT_EQ(EAI_NODATA, getaddrinfo("hello", nullptr, &hints, &result));
743 ScopedAddrinfo result_cleanup(result);
744 EXPECT_EQ(nullptr, result);
745}
746
Ken Chen92bed612018-12-22 21:46:55 +0800747// Verify if the resolver correctly handle multiple queries simultaneously
748// step 1: set dns server#1 into deferred responding mode.
749// step 2: thread#1 query "hello.example.com." --> resolver send query to server#1.
750// step 3: thread#2 query "hello.example.com." --> resolver hold the request and wait for
751// response of previous pending query sent by thread#1.
752// step 4: thread#3 query "konbanha.example.com." --> resolver send query to server#3. Server
753// respond to resolver immediately.
754// step 5: check if server#1 get 1 query by thread#1, server#2 get 0 query, server#3 get 1 query.
755// step 6: resume dns server#1 to respond dns query in step#2.
756// step 7: thread#1 and #2 should get returned from DNS query after step#6. Also, check the
757// number of queries in server#2 is 0 to ensure thread#2 does not wake up unexpectedly
758// before signaled by thread#1.
759TEST_F(ResolverTest, GetAddrInfoV4_deferred_resp) {
760 const char* listen_addr1 = "127.0.0.9";
761 const char* listen_addr2 = "127.0.0.10";
762 const char* listen_addr3 = "127.0.0.11";
763 const char* listen_srv = "53";
764 const char* host_name_deferred = "hello.example.com.";
765 const char* host_name_normal = "konbanha.example.com.";
Mike Yufc125e42019-05-15 20:41:28 +0800766 test::DNSResponder dns1(listen_addr1, listen_srv, ns_rcode::ns_r_servfail);
767 test::DNSResponder dns2(listen_addr2, listen_srv, ns_rcode::ns_r_servfail);
768 test::DNSResponder dns3(listen_addr3, listen_srv, ns_rcode::ns_r_servfail);
Ken Chen92bed612018-12-22 21:46:55 +0800769 dns1.addMapping(host_name_deferred, ns_type::ns_t_a, "1.2.3.4");
770 dns2.addMapping(host_name_deferred, ns_type::ns_t_a, "1.2.3.4");
771 dns3.addMapping(host_name_normal, ns_type::ns_t_a, "1.2.3.5");
772 ASSERT_TRUE(dns1.startServer());
773 ASSERT_TRUE(dns2.startServer());
774 ASSERT_TRUE(dns3.startServer());
775 const std::vector<std::string> servers_for_t1 = {listen_addr1};
776 const std::vector<std::string> servers_for_t2 = {listen_addr2};
777 const std::vector<std::string> servers_for_t3 = {listen_addr3};
778 addrinfo hints = {.ai_family = AF_INET};
779 const std::vector<int> params = {300, 25, 8, 8, 5000};
780 bool t3_task_done = false;
781
782 dns1.setDeferredResp(true);
783 std::thread t1([&, this]() {
784 ASSERT_TRUE(
785 mDnsClient.SetResolversForNetwork(servers_for_t1, kDefaultSearchDomains, params));
786 ScopedAddrinfo result = safe_getaddrinfo(host_name_deferred, nullptr, &hints);
787 // t3's dns query should got returned first
788 EXPECT_TRUE(t3_task_done);
789 EXPECT_EQ(1U, GetNumQueries(dns1, host_name_deferred));
790 EXPECT_TRUE(result != nullptr);
791 EXPECT_EQ("1.2.3.4", ToString(result));
792 });
793
794 // ensuring t1 and t2 handler functions are processed in order
795 usleep(100 * 1000);
796 std::thread t2([&, this]() {
797 ASSERT_TRUE(
798 mDnsClient.SetResolversForNetwork(servers_for_t2, kDefaultSearchDomains, params));
799 ScopedAddrinfo result = safe_getaddrinfo(host_name_deferred, nullptr, &hints);
800 EXPECT_TRUE(t3_task_done);
801 EXPECT_EQ(0U, GetNumQueries(dns2, host_name_deferred));
802 EXPECT_TRUE(result != nullptr);
803 EXPECT_EQ("1.2.3.4", ToString(result));
804
805 std::vector<std::string> res_servers;
806 std::vector<std::string> res_domains;
807 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +0900808 res_params res_params;
Ken Chen92bed612018-12-22 21:46:55 +0800809 std::vector<ResolverStats> res_stats;
810 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +0800811 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
812 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains,
813 &res_tls_servers, &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chen92bed612018-12-22 21:46:55 +0800814 EXPECT_EQ(0, wait_for_pending_req_timeout_count);
815 });
816
817 // ensuring t2 and t3 handler functions are processed in order
818 usleep(100 * 1000);
819 std::thread t3([&, this]() {
820 ASSERT_TRUE(
821 mDnsClient.SetResolversForNetwork(servers_for_t3, kDefaultSearchDomains, params));
822 ScopedAddrinfo result = safe_getaddrinfo(host_name_normal, nullptr, &hints);
823 EXPECT_EQ(1U, GetNumQueries(dns1, host_name_deferred));
824 EXPECT_EQ(0U, GetNumQueries(dns2, host_name_deferred));
825 EXPECT_EQ(1U, GetNumQueries(dns3, host_name_normal));
826 EXPECT_TRUE(result != nullptr);
827 EXPECT_EQ("1.2.3.5", ToString(result));
828
829 t3_task_done = true;
830 dns1.setDeferredResp(false);
831 });
832 t3.join();
833 t1.join();
834 t2.join();
835}
836
lifr4e4a2e02019-01-29 16:53:51 +0800837TEST_F(ResolverTest, GetAddrInfo_cnames) {
838 constexpr char host_name[] = "host.example.com.";
839 test::DNSResponder dns;
840 const std::vector<DnsRecord> records = {
841 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
842 {"a.example.com.", ns_type::ns_t_cname, "b.example.com."},
843 {"b.example.com.", ns_type::ns_t_cname, "c.example.com."},
844 {"c.example.com.", ns_type::ns_t_cname, "d.example.com."},
845 {"d.example.com.", ns_type::ns_t_cname, "e.example.com."},
846 {"e.example.com.", ns_type::ns_t_cname, host_name},
847 {host_name, ns_type::ns_t_a, "1.2.3.3"},
848 {host_name, ns_type::ns_t_aaaa, "2001:db8::42"},
849 };
850 StartDns(dns, records);
851 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
852
853 addrinfo hints = {.ai_family = AF_INET};
854 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
855 EXPECT_TRUE(result != nullptr);
856 EXPECT_EQ("1.2.3.3", ToString(result));
857
858 dns.clearQueries();
859 hints = {.ai_family = AF_INET6};
860 result = safe_getaddrinfo("hello", nullptr, &hints);
861 EXPECT_TRUE(result != nullptr);
862 EXPECT_EQ("2001:db8::42", ToString(result));
863}
864
865TEST_F(ResolverTest, GetAddrInfo_cnamesNoIpAddress) {
866 test::DNSResponder dns;
867 const std::vector<DnsRecord> records = {
868 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
869 };
870 StartDns(dns, records);
871 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
872
873 addrinfo hints = {.ai_family = AF_INET};
874 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
875 EXPECT_TRUE(result == nullptr);
876
877 dns.clearQueries();
878 hints = {.ai_family = AF_INET6};
879 result = safe_getaddrinfo("hello", nullptr, &hints);
880 EXPECT_TRUE(result == nullptr);
881}
882
883TEST_F(ResolverTest, GetAddrInfo_cnamesIllegalRdata) {
884 test::DNSResponder dns;
885 const std::vector<DnsRecord> records = {
886 {kHelloExampleCom, ns_type::ns_t_cname, ".!#?"},
887 };
888 StartDns(dns, records);
889 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
890
891 addrinfo hints = {.ai_family = AF_INET};
892 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
893 EXPECT_TRUE(result == nullptr);
894
895 dns.clearQueries();
896 hints = {.ai_family = AF_INET6};
897 result = safe_getaddrinfo("hello", nullptr, &hints);
898 EXPECT_TRUE(result == nullptr);
899}
900
Pabba Prakash66707822020-01-08 15:34:58 +0530901TEST_F(ResolverTest, GetAddrInfoForCaseInSensitiveDomains) {
902 test::DNSResponder dns;
903 const char* host_name = "howdy.example.com.";
904 const char* host_name2 = "HOWDY.example.com.";
905 const std::vector<DnsRecord> records = {
906 {host_name, ns_type::ns_t_a, "1.2.3.4"},
907 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
908 {host_name2, ns_type::ns_t_a, "1.2.3.5"},
909 {host_name2, ns_type::ns_t_aaaa, "::1.2.3.5"},
910 };
911 StartDns(dns, records);
912 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
913
914 ScopedAddrinfo hostname_result = safe_getaddrinfo("howdy", nullptr, nullptr);
915 EXPECT_TRUE(hostname_result != nullptr);
916 const size_t hostname1_count_after_first_query = GetNumQueries(dns, host_name);
917 EXPECT_LE(1U, hostname1_count_after_first_query);
918 // Could be A or AAAA
919 std::string hostname_result_str = ToString(hostname_result);
920 EXPECT_TRUE(hostname_result_str == "1.2.3.4" || hostname_result_str == "::1.2.3.4");
921
922 // Verify that the name is cached.
923 ScopedAddrinfo hostname2_result = safe_getaddrinfo("HOWDY", nullptr, nullptr);
924 EXPECT_TRUE(hostname2_result != nullptr);
925 const size_t hostname1_count_after_second_query = GetNumQueries(dns, host_name);
926 EXPECT_LE(1U, hostname1_count_after_second_query);
927
928 // verify that there is no change in num of queries for howdy.example.com
929 EXPECT_EQ(hostname1_count_after_first_query, hostname1_count_after_second_query);
930
931 // Number of queries for HOWDY.example.com would be >= 1 if domain names
932 // are considered case-sensitive, else number of queries should be 0.
933 const size_t hostname2_count = GetNumQueries(dns, host_name2);
934 EXPECT_EQ(0U,hostname2_count);
935 std::string hostname2_result_str = ToString(hostname2_result);
936 EXPECT_TRUE(hostname2_result_str == "1.2.3.4" || hostname2_result_str == "::1.2.3.4");
937
938 // verify that the result is still the same address even though
939 // mixed-case string is not in the DNS
940 ScopedAddrinfo result = safe_getaddrinfo("HowDY", nullptr, nullptr);
941 EXPECT_TRUE(result != nullptr);
942 std::string result_str = ToString(result);
943 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4");
944}
945
Ken Chenb9fa2062018-11-13 21:51:13 +0800946TEST_F(ResolverTest, MultidomainResolution) {
Xiao Ma09b71022018-12-11 17:56:32 +0900947 constexpr char host_name[] = "nihao.example2.com.";
Luke Huangf8215372019-11-22 11:53:41 +0800948 std::vector<std::string> searchDomains = {"example1.com", "example2.com", "example3.com"};
Ken Chenb9fa2062018-11-13 21:51:13 +0800949
Xiao Ma09b71022018-12-11 17:56:32 +0900950 test::DNSResponder dns("127.0.0.6");
951 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.3"}});
952 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({"127.0.0.6"}, searchDomains));
953
Ken Chenb9fa2062018-11-13 21:51:13 +0800954 const hostent* result = gethostbyname("nihao");
Xiao Ma09b71022018-12-11 17:56:32 +0900955
Ken Chenb9fa2062018-11-13 21:51:13 +0800956 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
957 ASSERT_FALSE(result == nullptr);
958 ASSERT_EQ(4, result->h_length);
959 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
960 EXPECT_EQ("1.2.3.3", ToString(result));
961 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800962}
963
964TEST_F(ResolverTest, GetAddrInfoV6_numeric) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800965 constexpr char host_name[] = "ohayou.example.com.";
966 constexpr char numeric_addr[] = "fe80::1%lo";
967
Xiao Ma09b71022018-12-11 17:56:32 +0900968 test::DNSResponder dns;
Ken Chenb9fa2062018-11-13 21:51:13 +0800969 dns.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900970 StartDns(dns, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
971 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800972
973 addrinfo hints = {.ai_family = AF_INET6};
974 ScopedAddrinfo result = safe_getaddrinfo(numeric_addr, nullptr, &hints);
975 EXPECT_TRUE(result != nullptr);
976 EXPECT_EQ(numeric_addr, ToString(result));
977 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
978
979 // Now try a non-numeric hostname query with the AI_NUMERICHOST flag set.
980 // We should fail without sending out a DNS query.
981 hints.ai_flags |= AI_NUMERICHOST;
982 result = safe_getaddrinfo(host_name, nullptr, &hints);
983 EXPECT_TRUE(result == nullptr);
984 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
985}
986
987TEST_F(ResolverTest, GetAddrInfoV6_failing) {
Xiao Ma09b71022018-12-11 17:56:32 +0900988 constexpr char listen_addr0[] = "127.0.0.7";
989 constexpr char listen_addr1[] = "127.0.0.8";
Ken Chenb9fa2062018-11-13 21:51:13 +0800990 const char* host_name = "ohayou.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +0900991
992 test::DNSResponder dns0(listen_addr0);
993 test::DNSResponder dns1(listen_addr1);
Ken Chenb9fa2062018-11-13 21:51:13 +0800994 dns0.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900995 StartDns(dns0, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
996 StartDns(dns1, {{host_name, ns_type::ns_t_aaaa, "2001:db8::6"}});
997
Luke Huangf8215372019-11-22 11:53:41 +0800998 std::vector<std::string> servers = {listen_addr0, listen_addr1};
Ken Chenb9fa2062018-11-13 21:51:13 +0800999 // <sample validity in s> <success threshold in percent> <min samples> <max samples>
1000 int sample_count = 8;
Luke Huangf8215372019-11-22 11:53:41 +08001001 const std::vector<int> params = {300, 25, sample_count, sample_count};
Xiao Ma09b71022018-12-11 17:56:32 +09001002 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, kDefaultSearchDomains, params));
Ken Chenb9fa2062018-11-13 21:51:13 +08001003
1004 // Repeatedly perform resolutions for non-existing domains until MAXNSSAMPLES resolutions have
1005 // reached the dns0, which is set to fail. No more requests should then arrive at that server
1006 // for the next sample_lifetime seconds.
1007 // TODO: This approach is implementation-dependent, change once metrics reporting is available.
Xiao Ma09b71022018-12-11 17:56:32 +09001008 const addrinfo hints = {.ai_family = AF_INET6};
Bernie Innocentib102dd22018-12-04 14:57:48 +09001009 for (int i = 0; i < sample_count; ++i) {
Ken Chenb9fa2062018-11-13 21:51:13 +08001010 std::string domain = StringPrintf("nonexistent%d", i);
1011 ScopedAddrinfo result = safe_getaddrinfo(domain.c_str(), nullptr, &hints);
1012 }
1013 // Due to 100% errors for all possible samples, the server should be ignored from now on and
1014 // only the second one used for all following queries, until NSSAMPLE_VALIDITY is reached.
1015 dns0.clearQueries();
1016 dns1.clearQueries();
1017 ScopedAddrinfo result = safe_getaddrinfo("ohayou", nullptr, &hints);
1018 EXPECT_TRUE(result != nullptr);
1019 EXPECT_EQ(0U, GetNumQueries(dns0, host_name));
1020 EXPECT_EQ(1U, GetNumQueries(dns1, host_name));
1021}
1022
1023TEST_F(ResolverTest, GetAddrInfoV6_nonresponsive) {
Xiao Ma09b71022018-12-11 17:56:32 +09001024 constexpr char listen_addr0[] = "127.0.0.7";
1025 constexpr char listen_addr1[] = "127.0.0.8";
1026 constexpr char listen_srv[] = "53";
1027 constexpr char host_name1[] = "ohayou.example.com.";
1028 constexpr char host_name2[] = "ciao.example.com.";
Luke Huang483cf332019-06-03 17:24:51 +08001029 const std::vector<std::string> defaultSearchDomain = {"example.com"};
1030 // The minimal timeout is 1000ms, so we can't decrease timeout
1031 // So reduce retry count.
1032 const std::vector<int> reduceRetryParams = {
1033 300, // sample validity in seconds
1034 25, // success threshod in percent
1035 8, 8, // {MIN,MAX}_SAMPLES
1036 1000, // BASE_TIMEOUT_MSEC
1037 1, // retry count
1038 };
Xiao Ma09b71022018-12-11 17:56:32 +09001039 const std::vector<DnsRecord> records0 = {
1040 {host_name1, ns_type::ns_t_aaaa, "2001:db8::5"},
1041 {host_name2, ns_type::ns_t_aaaa, "2001:db8::5"},
1042 };
1043 const std::vector<DnsRecord> records1 = {
1044 {host_name1, ns_type::ns_t_aaaa, "2001:db8::6"},
1045 {host_name2, ns_type::ns_t_aaaa, "2001:db8::6"},
1046 };
Ken Chenb9fa2062018-11-13 21:51:13 +08001047
1048 // dns0 does not respond with 100% probability, while
1049 // dns1 responds normally, at least initially.
Mike Yufc125e42019-05-15 20:41:28 +08001050 test::DNSResponder dns0(listen_addr0, listen_srv, static_cast<ns_rcode>(-1));
1051 test::DNSResponder dns1(listen_addr1, listen_srv, static_cast<ns_rcode>(-1));
Ken Chenb9fa2062018-11-13 21:51:13 +08001052 dns0.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +09001053 StartDns(dns0, records0);
1054 StartDns(dns1, records1);
Luke Huang483cf332019-06-03 17:24:51 +08001055 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr0, listen_addr1}, defaultSearchDomain,
1056 reduceRetryParams));
Ken Chenb9fa2062018-11-13 21:51:13 +08001057
Luke Huang483cf332019-06-03 17:24:51 +08001058 // Specify ai_socktype to make getaddrinfo will only query 1 time
1059 const addrinfo hints = {.ai_family = AF_INET6, .ai_socktype = SOCK_STREAM};
Ken Chenb9fa2062018-11-13 21:51:13 +08001060
1061 // dns0 will ignore the request, and we'll fallback to dns1 after the first
1062 // retry.
1063 ScopedAddrinfo result = safe_getaddrinfo(host_name1, nullptr, &hints);
1064 EXPECT_TRUE(result != nullptr);
1065 EXPECT_EQ(1U, GetNumQueries(dns0, host_name1));
1066 EXPECT_EQ(1U, GetNumQueries(dns1, host_name1));
Mike Yu532405f2020-06-17 17:46:44 +08001067 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, 0, host_name1, {"2001:db8::6"});
Ken Chenb9fa2062018-11-13 21:51:13 +08001068
1069 // Now make dns1 also ignore 100% requests... The resolve should alternate
Luke Huang483cf332019-06-03 17:24:51 +08001070 // queries between the nameservers and fail
Ken Chenb9fa2062018-11-13 21:51:13 +08001071 dns1.setResponseProbability(0.0);
1072 addrinfo* result2 = nullptr;
1073 EXPECT_EQ(EAI_NODATA, getaddrinfo(host_name2, nullptr, &hints, &result2));
1074 EXPECT_EQ(nullptr, result2);
Luke Huang483cf332019-06-03 17:24:51 +08001075 EXPECT_EQ(1U, GetNumQueries(dns0, host_name2));
1076 EXPECT_EQ(1U, GetNumQueries(dns1, host_name2));
Mike Yu532405f2020-06-17 17:46:44 +08001077 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, RCODE_TIMEOUT, host_name2, {});
Ken Chenb9fa2062018-11-13 21:51:13 +08001078}
1079
1080TEST_F(ResolverTest, GetAddrInfoV6_concurrent) {
Xiao Ma09b71022018-12-11 17:56:32 +09001081 constexpr char listen_addr0[] = "127.0.0.9";
1082 constexpr char listen_addr1[] = "127.0.0.10";
1083 constexpr char listen_addr2[] = "127.0.0.11";
1084 constexpr char host_name[] = "konbanha.example.com.";
1085
1086 test::DNSResponder dns0(listen_addr0);
1087 test::DNSResponder dns1(listen_addr1);
1088 test::DNSResponder dns2(listen_addr2);
1089 StartDns(dns0, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
1090 StartDns(dns1, {{host_name, ns_type::ns_t_aaaa, "2001:db8::6"}});
1091 StartDns(dns2, {{host_name, ns_type::ns_t_aaaa, "2001:db8::7"}});
1092
Luke Huangf8215372019-11-22 11:53:41 +08001093 const std::vector<std::string> servers = {listen_addr0, listen_addr1, listen_addr2};
Ken Chenb9fa2062018-11-13 21:51:13 +08001094 std::vector<std::thread> threads(10);
1095 for (std::thread& thread : threads) {
Luke Huangf8215372019-11-22 11:53:41 +08001096 thread = std::thread([this, &servers]() {
1097 unsigned delay = arc4random_uniform(1 * 1000 * 1000); // <= 1s
Ken Chenb9fa2062018-11-13 21:51:13 +08001098 usleep(delay);
1099 std::vector<std::string> serverSubset;
1100 for (const auto& server : servers) {
1101 if (arc4random_uniform(2)) {
1102 serverSubset.push_back(server);
1103 }
1104 }
1105 if (serverSubset.empty()) serverSubset = servers;
Xiao Ma09b71022018-12-11 17:56:32 +09001106 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(serverSubset));
1107 const addrinfo hints = {.ai_family = AF_INET6};
Ken Chenb9fa2062018-11-13 21:51:13 +08001108 addrinfo* result = nullptr;
1109 int rv = getaddrinfo("konbanha", nullptr, &hints, &result);
1110 EXPECT_EQ(0, rv) << "error [" << rv << "] " << gai_strerror(rv);
1111 if (result) {
1112 freeaddrinfo(result);
1113 result = nullptr;
1114 }
1115 });
1116 }
1117 for (std::thread& thread : threads) {
1118 thread.join();
1119 }
Ken Chen92bed612018-12-22 21:46:55 +08001120
1121 std::vector<std::string> res_servers;
1122 std::vector<std::string> res_domains;
1123 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001124 res_params res_params;
Ken Chen92bed612018-12-22 21:46:55 +08001125 std::vector<ResolverStats> res_stats;
1126 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001127 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1128 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1129 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chen92bed612018-12-22 21:46:55 +08001130 EXPECT_EQ(0, wait_for_pending_req_timeout_count);
Ken Chenb9fa2062018-11-13 21:51:13 +08001131}
1132
Mike Yu8ac63402019-12-02 15:28:38 +08001133TEST_F(ResolverTest, SkipBadServersDueToInternalError) {
1134 constexpr char listen_addr1[] = "fe80::1";
1135 constexpr char listen_addr2[] = "255.255.255.255";
1136 constexpr char listen_addr3[] = "127.0.0.3";
Mike Yu61d17262020-02-15 18:56:22 +08001137 int counter = 0; // To generate unique hostnames.
Mike Yu8ac63402019-12-02 15:28:38 +08001138 test::DNSResponder dns(listen_addr3);
1139 ASSERT_TRUE(dns.startServer());
1140
Mike Yu61d17262020-02-15 18:56:22 +08001141 ResolverParamsParcel setupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1142 setupParams.servers = {listen_addr1, listen_addr2, listen_addr3};
1143 setupParams.minSamples = 2; // Recognize bad servers in two attempts when sorting not enabled.
Mike Yu8ac63402019-12-02 15:28:38 +08001144
Mike Yu61d17262020-02-15 18:56:22 +08001145 ResolverParamsParcel cleanupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1146 cleanupParams.servers.clear();
1147 cleanupParams.tlsServers.clear();
Mike Yu8ac63402019-12-02 15:28:38 +08001148
Mike Yu61d17262020-02-15 18:56:22 +08001149 for (const auto& sortNameserversFlag : {"" /* unset */, "0" /* off */, "1" /* on */}) {
1150 SCOPED_TRACE(fmt::format("sortNameversFlag_{}", sortNameserversFlag));
1151 ScopedSystemProperties scopedSystemProperties(kSortNameserversFlag, sortNameserversFlag);
1152
Mike Yu10832aa2020-08-25 19:13:11 +08001153 // Re-setup test network to make experiment flag take effect.
1154 resetNetwork();
1155
Mike Yu61d17262020-02-15 18:56:22 +08001156 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(setupParams));
1157
1158 // Start sending synchronized querying.
1159 for (int i = 0; i < 100; i++) {
1160 std::string hostName = StringPrintf("hello%d.com.", counter++);
1161 dns.addMapping(hostName, ns_type::ns_t_a, "1.2.3.4");
1162 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1163 EXPECT_TRUE(safe_getaddrinfo(hostName.c_str(), nullptr, &hints) != nullptr);
1164 }
1165
1166 const std::vector<NameserverStats> targetStats = {
1167 NameserverStats(listen_addr1).setInternalErrors(5),
1168 NameserverStats(listen_addr2).setInternalErrors(5),
1169 NameserverStats(listen_addr3).setSuccesses(setupParams.maxSamples),
1170 };
1171 EXPECT_TRUE(expectStatsNotGreaterThan(targetStats));
1172
1173 // Also verify the number of queries received in the server because res_stats.successes has
1174 // a maximum.
1175 EXPECT_EQ(dns.queries().size(), 100U);
1176
1177 // Reset the state.
1178 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(cleanupParams));
1179 dns.clearQueries();
Mike Yu8ac63402019-12-02 15:28:38 +08001180 }
Mike Yu8ac63402019-12-02 15:28:38 +08001181}
1182
1183TEST_F(ResolverTest, SkipBadServersDueToTimeout) {
1184 constexpr char listen_addr1[] = "127.0.0.3";
1185 constexpr char listen_addr2[] = "127.0.0.4";
Mike Yu61d17262020-02-15 18:56:22 +08001186 int counter = 0; // To generate unique hostnames.
1187
1188 ResolverParamsParcel setupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1189 setupParams.servers = {listen_addr1, listen_addr2};
1190 setupParams.minSamples = 2; // Recognize bad servers in two attempts when sorting not enabled.
1191
1192 ResolverParamsParcel cleanupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1193 cleanupParams.servers.clear();
1194 cleanupParams.tlsServers.clear();
Mike Yu8ac63402019-12-02 15:28:38 +08001195
1196 // Set dns1 non-responsive and dns2 workable.
1197 test::DNSResponder dns1(listen_addr1, test::kDefaultListenService, static_cast<ns_rcode>(-1));
1198 test::DNSResponder dns2(listen_addr2);
1199 dns1.setResponseProbability(0.0);
1200 ASSERT_TRUE(dns1.startServer());
1201 ASSERT_TRUE(dns2.startServer());
1202
Mike Yu61d17262020-02-15 18:56:22 +08001203 for (const auto& sortNameserversFlag : {"" /* unset */, "0" /* off */, "1" /* on */}) {
1204 SCOPED_TRACE(fmt::format("sortNameversFlag_{}", sortNameserversFlag));
1205 ScopedSystemProperties scopedSystemProperties(kSortNameserversFlag, sortNameserversFlag);
Mike Yu8ac63402019-12-02 15:28:38 +08001206
Mike Yu10832aa2020-08-25 19:13:11 +08001207 // Re-setup test network to make experiment flag take effect.
1208 resetNetwork();
1209
Mike Yu61d17262020-02-15 18:56:22 +08001210 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(setupParams));
Mike Yu8ac63402019-12-02 15:28:38 +08001211
Mike Yu61d17262020-02-15 18:56:22 +08001212 // Start sending synchronized querying.
1213 for (int i = 0; i < 100; i++) {
1214 std::string hostName = StringPrintf("hello%d.com.", counter++);
1215 dns1.addMapping(hostName, ns_type::ns_t_a, "1.2.3.4");
1216 dns2.addMapping(hostName, ns_type::ns_t_a, "1.2.3.5");
1217 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1218 EXPECT_TRUE(safe_getaddrinfo(hostName.c_str(), nullptr, &hints) != nullptr);
1219 }
1220
1221 const std::vector<NameserverStats> targetStats = {
1222 NameserverStats(listen_addr1).setTimeouts(5),
1223 NameserverStats(listen_addr2).setSuccesses(setupParams.maxSamples),
1224 };
1225 EXPECT_TRUE(expectStatsNotGreaterThan(targetStats));
1226
1227 // Also verify the number of queries received in the server because res_stats.successes has
1228 // an upper bound.
1229 EXPECT_GT(dns1.queries().size(), 0U);
1230 EXPECT_LT(dns1.queries().size(), 5U);
1231 EXPECT_EQ(dns2.queries().size(), 100U);
1232
1233 // Reset the state.
1234 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(cleanupParams));
1235 dns1.clearQueries();
1236 dns2.clearQueries();
Mike Yu8ac63402019-12-02 15:28:38 +08001237 }
Mike Yu8ac63402019-12-02 15:28:38 +08001238}
1239
chenbrucefd837fa2019-10-29 18:35:36 +08001240TEST_F(ResolverTest, GetAddrInfoFromCustTable_InvalidInput) {
1241 constexpr char hostnameNoip[] = "noip.example.com.";
1242 constexpr char hostnameInvalidip[] = "invalidip.example.com.";
1243 const std::vector<aidl::android::net::ResolverHostsParcel> invalidCustHosts = {
1244 {"", hostnameNoip},
1245 {"wrong IP", hostnameInvalidip},
1246 };
1247 test::DNSResponder dns;
1248 StartDns(dns, {});
1249 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
Ken Chena6ac2a62020-04-07 17:25:56 +08001250 resolverParams.resolverOptions.hosts = invalidCustHosts;
chenbrucefd837fa2019-10-29 18:35:36 +08001251 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1252 for (const auto& hostname : {hostnameNoip, hostnameInvalidip}) {
1253 // The query won't get data from customized table because of invalid customized table
1254 // and DNSResponder also has no records. hostnameNoip has never registered and
1255 // hostnameInvalidip has registered but wrong IP.
1256 const addrinfo hints = {.ai_family = AF_UNSPEC};
1257 ScopedAddrinfo result = safe_getaddrinfo(hostname, nullptr, &hints);
1258 ASSERT_TRUE(result == nullptr);
1259 EXPECT_EQ(4U, GetNumQueries(dns, hostname));
1260 }
1261}
1262
1263TEST_F(ResolverTest, GetAddrInfoFromCustTable) {
1264 constexpr char hostnameV4[] = "v4only.example.com.";
1265 constexpr char hostnameV6[] = "v6only.example.com.";
1266 constexpr char hostnameV4V6[] = "v4v6.example.com.";
1267 constexpr char custAddrV4[] = "1.2.3.4";
1268 constexpr char custAddrV6[] = "::1.2.3.4";
1269 constexpr char dnsSvAddrV4[] = "1.2.3.5";
1270 constexpr char dnsSvAddrV6[] = "::1.2.3.5";
1271 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4 = {
1272 {custAddrV4, hostnameV4},
1273 };
1274 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV6 = {
1275 {custAddrV6, hostnameV6},
1276 };
1277 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4V6 = {
1278 {custAddrV4, hostnameV4V6},
1279 {custAddrV6, hostnameV4V6},
1280 };
1281 const std::vector<DnsRecord> dnsSvHostV4 = {
1282 {hostnameV4, ns_type::ns_t_a, dnsSvAddrV4},
1283 };
1284 const std::vector<DnsRecord> dnsSvHostV6 = {
1285 {hostnameV6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1286 };
1287 const std::vector<DnsRecord> dnsSvHostV4V6 = {
1288 {hostnameV4V6, ns_type::ns_t_a, dnsSvAddrV4},
1289 {hostnameV4V6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1290 };
1291 struct TestConfig {
1292 const std::string name;
1293 const std::vector<aidl::android::net::ResolverHostsParcel> customizedHosts;
1294 const std::vector<DnsRecord> dnsserverHosts;
1295 const std::vector<std::string> queryResult;
1296 std::string asParameters() const {
1297 return StringPrintf("name: %s, customizedHosts: %s, dnsserverHosts: %s", name.c_str(),
1298 customizedHosts.empty() ? "No" : "Yes",
1299 dnsserverHosts.empty() ? "No" : "Yes");
1300 }
1301 } testConfigs[]{
1302 // clang-format off
1303 {hostnameV4, {}, {}, {}},
1304 {hostnameV4, {}, dnsSvHostV4, {dnsSvAddrV4}},
1305 {hostnameV4, custHostV4, {}, {custAddrV4}},
1306 {hostnameV4, custHostV4, dnsSvHostV4, {custAddrV4}},
1307 {hostnameV6, {}, {}, {}},
1308 {hostnameV6, {}, dnsSvHostV6, {dnsSvAddrV6}},
1309 {hostnameV6, custHostV6, {}, {custAddrV6}},
1310 {hostnameV6, custHostV6, dnsSvHostV6, {custAddrV6}},
1311 {hostnameV4V6, {}, {}, {}},
1312 {hostnameV4V6, {}, dnsSvHostV4V6, {dnsSvAddrV4, dnsSvAddrV6}},
1313 {hostnameV4V6, custHostV4V6, {}, {custAddrV4, custAddrV6}},
1314 {hostnameV4V6, custHostV4V6, dnsSvHostV4V6, {custAddrV4, custAddrV6}},
1315 // clang-format on
1316 };
1317
1318 for (const auto& config : testConfigs) {
1319 SCOPED_TRACE(config.asParameters());
1320
1321 test::DNSResponder dns;
1322 StartDns(dns, config.dnsserverHosts);
1323
1324 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
Ken Chena6ac2a62020-04-07 17:25:56 +08001325 resolverParams.resolverOptions.hosts = config.customizedHosts;
chenbrucefd837fa2019-10-29 18:35:36 +08001326 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1327 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM};
1328 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
1329 if (config.customizedHosts.empty() && config.dnsserverHosts.empty()) {
1330 ASSERT_TRUE(result == nullptr);
1331 EXPECT_EQ(2U, GetNumQueries(dns, config.name.c_str()));
1332 } else {
1333 ASSERT_TRUE(result != nullptr);
1334 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(config.queryResult));
1335 EXPECT_EQ(config.customizedHosts.empty() ? 2U : 0U,
1336 GetNumQueries(dns, config.name.c_str()));
1337 }
1338
1339 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
1340 }
1341}
1342
1343TEST_F(ResolverTest, GetAddrInfoFromCustTable_Modify) {
1344 constexpr char hostnameV4V6[] = "v4v6.example.com.";
1345 constexpr char custAddrV4[] = "1.2.3.4";
1346 constexpr char custAddrV6[] = "::1.2.3.4";
1347 constexpr char dnsSvAddrV4[] = "1.2.3.5";
1348 constexpr char dnsSvAddrV6[] = "::1.2.3.5";
1349 const std::vector<DnsRecord> dnsSvHostV4V6 = {
1350 {hostnameV4V6, ns_type::ns_t_a, dnsSvAddrV4},
1351 {hostnameV4V6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1352 };
1353 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4V6 = {
1354 {custAddrV4, hostnameV4V6},
1355 {custAddrV6, hostnameV4V6},
1356 };
1357 test::DNSResponder dns;
1358 StartDns(dns, dnsSvHostV4V6);
1359 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1360
Ken Chena6ac2a62020-04-07 17:25:56 +08001361 resolverParams.resolverOptions.hosts = custHostV4V6;
chenbrucefd837fa2019-10-29 18:35:36 +08001362 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1363 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM};
1364 ScopedAddrinfo result = safe_getaddrinfo(hostnameV4V6, nullptr, &hints);
1365 ASSERT_TRUE(result != nullptr);
1366 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray({custAddrV4, custAddrV6}));
1367 EXPECT_EQ(0U, GetNumQueries(dns, hostnameV4V6));
1368
Ken Chena6ac2a62020-04-07 17:25:56 +08001369 resolverParams.resolverOptions.hosts = {};
chenbrucefd837fa2019-10-29 18:35:36 +08001370 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1371 result = safe_getaddrinfo(hostnameV4V6, nullptr, &hints);
1372 ASSERT_TRUE(result != nullptr);
1373 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray({dnsSvAddrV4, dnsSvAddrV6}));
1374 EXPECT_EQ(2U, GetNumQueries(dns, hostnameV4V6));
1375}
1376
Ken Chenb9fa2062018-11-13 21:51:13 +08001377TEST_F(ResolverTest, EmptySetup) {
Ken Chenb9fa2062018-11-13 21:51:13 +08001378 std::vector<std::string> servers;
1379 std::vector<std::string> domains;
Xiao Ma09b71022018-12-11 17:56:32 +09001380 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001381 std::vector<std::string> res_servers;
1382 std::vector<std::string> res_domains;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001383 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001384 res_params res_params;
Ken Chenb9fa2062018-11-13 21:51:13 +08001385 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +08001386 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001387 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1388 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1389 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chenb9fa2062018-11-13 21:51:13 +08001390 EXPECT_EQ(0U, res_servers.size());
1391 EXPECT_EQ(0U, res_domains.size());
Mike Yu0a1c53d2018-11-26 13:26:21 +09001392 EXPECT_EQ(0U, res_tls_servers.size());
Luke Huang5bd827c2019-03-14 16:10:04 +08001393 ASSERT_EQ(static_cast<size_t>(IDnsResolver::RESOLVER_PARAMS_COUNT), kDefaultParams.size());
1394 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY],
1395 res_params.sample_validity);
1396 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001397 res_params.success_threshold);
Luke Huang5bd827c2019-03-14 16:10:04 +08001398 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
1399 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
1400 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
Ken Chenb9fa2062018-11-13 21:51:13 +08001401 res_params.base_timeout_msec);
Luke Huang5bd827c2019-03-14 16:10:04 +08001402 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_RETRY_COUNT], res_params.retry_count);
Ken Chenb9fa2062018-11-13 21:51:13 +08001403}
1404
1405TEST_F(ResolverTest, SearchPathChange) {
Xiao Ma09b71022018-12-11 17:56:32 +09001406 constexpr char listen_addr[] = "127.0.0.13";
1407 constexpr char host_name1[] = "test13.domain1.org.";
1408 constexpr char host_name2[] = "test13.domain2.org.";
Luke Huangf8215372019-11-22 11:53:41 +08001409 std::vector<std::string> servers = {listen_addr};
1410 std::vector<std::string> domains = {"domain1.org"};
Xiao Ma09b71022018-12-11 17:56:32 +09001411
1412 const std::vector<DnsRecord> records = {
1413 {host_name1, ns_type::ns_t_aaaa, "2001:db8::13"},
1414 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1:13"},
1415 };
1416 test::DNSResponder dns(listen_addr);
1417 StartDns(dns, records);
1418 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001419
1420 const addrinfo hints = {.ai_family = AF_INET6};
1421 ScopedAddrinfo result = safe_getaddrinfo("test13", nullptr, &hints);
1422 EXPECT_TRUE(result != nullptr);
1423 EXPECT_EQ(1U, dns.queries().size());
1424 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
1425 EXPECT_EQ("2001:db8::13", ToString(result));
1426
1427 // Test that changing the domain search path on its own works.
Luke Huangf8215372019-11-22 11:53:41 +08001428 domains = {"domain2.org"};
Xiao Ma09b71022018-12-11 17:56:32 +09001429 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001430 dns.clearQueries();
1431
1432 result = safe_getaddrinfo("test13", nullptr, &hints);
1433 EXPECT_TRUE(result != nullptr);
1434 EXPECT_EQ(1U, dns.queries().size());
1435 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
1436 EXPECT_EQ("2001:db8::1:13", ToString(result));
1437}
1438
Luke Huang2dac4382019-06-24 13:28:44 +08001439namespace {
1440
Luke Huangf8215372019-11-22 11:53:41 +08001441std::vector<std::string> getResolverDomains(aidl::android::net::IDnsResolver* dnsResolverService,
Luke Huang2dac4382019-06-24 13:28:44 +08001442 unsigned netId) {
1443 std::vector<std::string> res_servers;
1444 std::vector<std::string> res_domains;
1445 std::vector<std::string> res_tls_servers;
1446 res_params res_params;
1447 std::vector<ResolverStats> res_stats;
1448 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001449 DnsResponderClient::GetResolverInfo(dnsResolverService, netId, &res_servers, &res_domains,
1450 &res_tls_servers, &res_params, &res_stats,
1451 &wait_for_pending_req_timeout_count);
Luke Huang2dac4382019-06-24 13:28:44 +08001452 return res_domains;
1453}
1454
1455} // namespace
1456
1457TEST_F(ResolverTest, SearchPathPrune) {
1458 constexpr size_t DUPLICATED_DOMAIN_NUM = 3;
1459 constexpr char listen_addr[] = "127.0.0.13";
1460 constexpr char domian_name1[] = "domain13.org.";
1461 constexpr char domian_name2[] = "domain14.org.";
1462 constexpr char host_name1[] = "test13.domain13.org.";
1463 constexpr char host_name2[] = "test14.domain14.org.";
1464 std::vector<std::string> servers = {listen_addr};
1465
1466 std::vector<std::string> testDomains1;
1467 std::vector<std::string> testDomains2;
1468 // Domain length should be <= 255
1469 // Max number of domains in search path is 6
1470 for (size_t i = 0; i < MAXDNSRCH + 1; i++) {
1471 // Fill up with invalid domain
1472 testDomains1.push_back(std::string(300, i + '0'));
1473 // Fill up with valid but duplicated domain
1474 testDomains2.push_back(StringPrintf("domain%zu.org", i % DUPLICATED_DOMAIN_NUM));
1475 }
1476
1477 // Add valid domain used for query.
1478 testDomains1.push_back(domian_name1);
1479
1480 // Add valid domain twice used for query.
1481 testDomains2.push_back(domian_name2);
1482 testDomains2.push_back(domian_name2);
1483
1484 const std::vector<DnsRecord> records = {
1485 {host_name1, ns_type::ns_t_aaaa, "2001:db8::13"},
1486 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1:13"},
1487 };
1488 test::DNSResponder dns(listen_addr);
1489 StartDns(dns, records);
1490 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, testDomains1));
1491
1492 const addrinfo hints = {.ai_family = AF_INET6};
1493 ScopedAddrinfo result = safe_getaddrinfo("test13", nullptr, &hints);
1494
1495 EXPECT_TRUE(result != nullptr);
1496
1497 EXPECT_EQ(1U, dns.queries().size());
1498 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
1499 EXPECT_EQ("2001:db8::13", ToString(result));
1500
1501 const auto& res_domains1 = getResolverDomains(mDnsClient.resolvService(), TEST_NETID);
1502 // Expect 1 valid domain, invalid domains are removed.
1503 ASSERT_EQ(1U, res_domains1.size());
1504 EXPECT_EQ(domian_name1, res_domains1[0]);
1505
1506 dns.clearQueries();
1507
1508 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, testDomains2));
1509
1510 result = safe_getaddrinfo("test14", nullptr, &hints);
1511 EXPECT_TRUE(result != nullptr);
1512
1513 // (3 domains * 2 retries) + 1 success query = 7
1514 EXPECT_EQ(7U, dns.queries().size());
1515 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
1516 EXPECT_EQ("2001:db8::1:13", ToString(result));
1517
1518 const auto& res_domains2 = getResolverDomains(mDnsClient.resolvService(), TEST_NETID);
1519 // Expect 4 valid domain, duplicate domains are removed.
1520 EXPECT_EQ(DUPLICATED_DOMAIN_NUM + 1U, res_domains2.size());
1521 EXPECT_THAT(
1522 std::vector<std::string>({"domain0.org", "domain1.org", "domain2.org", domian_name2}),
1523 testing::ElementsAreArray(res_domains2));
1524}
1525
Mike Yu0a1c53d2018-11-26 13:26:21 +09001526// If we move this function to dns_responder_client, it will complicate the dependency need of
1527// dns_tls_frontend.h.
1528static void setupTlsServers(const std::vector<std::string>& servers,
waynema0e73c2e2019-07-31 15:04:08 +08001529 std::vector<std::unique_ptr<test::DnsTlsFrontend>>* tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001530 constexpr char listen_udp[] = "53";
1531 constexpr char listen_tls[] = "853";
Mike Yu0a1c53d2018-11-26 13:26:21 +09001532
1533 for (const auto& server : servers) {
1534 auto t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
1535 t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
1536 t->startServer();
Mike Yu0a1c53d2018-11-26 13:26:21 +09001537 tls->push_back(std::move(t));
1538 }
1539}
1540
Mike Yu0a1c53d2018-11-26 13:26:21 +09001541TEST_F(ResolverTest, MaxServerPrune_Binder) {
Mike Yu0a1c53d2018-11-26 13:26:21 +09001542 std::vector<std::string> domains;
1543 std::vector<std::unique_ptr<test::DNSResponder>> dns;
1544 std::vector<std::unique_ptr<test::DnsTlsFrontend>> tls;
1545 std::vector<std::string> servers;
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001546 std::vector<DnsResponderClient::Mapping> mappings;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001547
1548 for (unsigned i = 0; i < MAXDNSRCH + 1; i++) {
1549 domains.push_back(StringPrintf("example%u.com", i));
1550 }
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001551 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupMappings(1, domains, &mappings));
1552 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupDNSServers(MAXNS + 1, mappings, &dns, &servers));
waynema0e73c2e2019-07-31 15:04:08 +08001553 ASSERT_NO_FATAL_FAILURE(setupTlsServers(servers, &tls));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001554
waynema0e73c2e2019-07-31 15:04:08 +08001555 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, domains, kDefaultParams,
1556 kDefaultPrivateDnsHostName));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001557
Mike Yu383855b2019-01-15 17:53:27 +08001558 // If the private DNS validation hasn't completed yet before backend DNS servers stop,
1559 // TLS servers will get stuck in handleOneRequest(), which causes this test stuck in
1560 // ~DnsTlsFrontend() because the TLS server loop threads can't be terminated.
1561 // So, wait for private DNS validation done before stopping backend DNS servers.
1562 for (int i = 0; i < MAXNS; i++) {
chenbruceaff85842019-05-31 15:46:42 +08001563 LOG(INFO) << "Waiting for private DNS validation on " << tls[i]->listen_address() << ".";
Mike Yu724f77d2019-08-16 11:14:50 +08001564 EXPECT_TRUE(WaitForPrivateDnsValidation(tls[i]->listen_address(), true));
chenbruceaff85842019-05-31 15:46:42 +08001565 LOG(INFO) << "private DNS validation on " << tls[i]->listen_address() << " done.";
Mike Yu383855b2019-01-15 17:53:27 +08001566 }
1567
Mike Yu0a1c53d2018-11-26 13:26:21 +09001568 std::vector<std::string> res_servers;
1569 std::vector<std::string> res_domains;
1570 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001571 res_params res_params;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001572 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +08001573 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001574 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1575 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1576 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001577
1578 // Check the size of the stats and its contents.
1579 EXPECT_EQ(static_cast<size_t>(MAXNS), res_servers.size());
1580 EXPECT_EQ(static_cast<size_t>(MAXNS), res_tls_servers.size());
1581 EXPECT_EQ(static_cast<size_t>(MAXDNSRCH), res_domains.size());
1582 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_servers.begin()));
1583 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_tls_servers.begin()));
1584 EXPECT_TRUE(std::equal(domains.begin(), domains.begin() + MAXDNSRCH, res_domains.begin()));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001585}
1586
1587TEST_F(ResolverTest, ResolverStats) {
Xiao Ma09b71022018-12-11 17:56:32 +09001588 constexpr char listen_addr1[] = "127.0.0.4";
1589 constexpr char listen_addr2[] = "127.0.0.5";
1590 constexpr char listen_addr3[] = "127.0.0.6";
Mike Yu0a1c53d2018-11-26 13:26:21 +09001591
1592 // Set server 1 timeout.
Mike Yufc125e42019-05-15 20:41:28 +08001593 test::DNSResponder dns1(listen_addr1, "53", static_cast<ns_rcode>(-1));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001594 dns1.setResponseProbability(0.0);
1595 ASSERT_TRUE(dns1.startServer());
1596
1597 // Set server 2 responding server failure.
Xiao Ma09b71022018-12-11 17:56:32 +09001598 test::DNSResponder dns2(listen_addr2);
Mike Yu0a1c53d2018-11-26 13:26:21 +09001599 dns2.setResponseProbability(0.0);
1600 ASSERT_TRUE(dns2.startServer());
1601
1602 // Set server 3 workable.
Xiao Ma09b71022018-12-11 17:56:32 +09001603 test::DNSResponder dns3(listen_addr3);
1604 dns3.addMapping(kHelloExampleCom, ns_type::ns_t_a, "1.2.3.4");
Mike Yu0a1c53d2018-11-26 13:26:21 +09001605 ASSERT_TRUE(dns3.startServer());
1606
1607 std::vector<std::string> servers = {listen_addr1, listen_addr2, listen_addr3};
Xiao Ma09b71022018-12-11 17:56:32 +09001608 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001609
1610 dns3.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +09001611 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
Mike Yu0a1c53d2018-11-26 13:26:21 +09001612 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
Xiao Ma09b71022018-12-11 17:56:32 +09001613 size_t found = GetNumQueries(dns3, kHelloExampleCom);
Mike Yu0a1c53d2018-11-26 13:26:21 +09001614 EXPECT_LE(1U, found);
1615 std::string result_str = ToString(result);
1616 EXPECT_TRUE(result_str == "1.2.3.4") << ", result_str='" << result_str << "'";
1617
Mike Yue2162e52020-03-04 18:43:46 +08001618 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1619 NameserverStats(listen_addr1).setTimeouts(1),
1620 NameserverStats(listen_addr2).setErrors(1),
1621 NameserverStats(listen_addr3).setSuccesses(1),
1622 };
Mike Yu61d17262020-02-15 18:56:22 +08001623 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001624}
1625
Mike Yu15791832020-02-11 13:38:48 +08001626TEST_F(ResolverTest, AlwaysUseLatestSetupParamsInLookups) {
1627 constexpr char listen_addr1[] = "127.0.0.3";
1628 constexpr char listen_addr2[] = "255.255.255.255";
1629 constexpr char listen_addr3[] = "127.0.0.4";
1630 constexpr char hostname[] = "hello";
1631 constexpr char fqdn_with_search_domain[] = "hello.domain2.com.";
1632
1633 test::DNSResponder dns1(listen_addr1, test::kDefaultListenService, static_cast<ns_rcode>(-1));
1634 dns1.setResponseProbability(0.0);
1635 ASSERT_TRUE(dns1.startServer());
1636
1637 test::DNSResponder dns3(listen_addr3);
1638 StartDns(dns3, {{fqdn_with_search_domain, ns_type::ns_t_a, "1.2.3.4"}});
1639
1640 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
1641 parcel.tlsServers.clear();
1642 parcel.servers = {listen_addr1, listen_addr2};
1643 parcel.domains = {"domain1.com", "domain2.com"};
1644 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1645
1646 // Expect the things happening in t1:
1647 // 1. The lookup starts using the first domain for query. It sends queries to the populated
1648 // nameserver list {listen_addr1, listen_addr2} for the hostname "hello.domain1.com".
1649 // 2. A different list of nameservers is updated to the resolver. Revision ID is incremented.
1650 // 3. The query for the hostname times out. The lookup fails to add the timeout record to the
1651 // the stats because of the unmatched revision ID.
1652 // 4. The lookup starts using the second domain for query. It sends queries to the populated
1653 // nameserver list {listen_addr3, listen_addr1, listen_addr2} for another hostname
1654 // "hello.domain2.com".
1655 // 5. The lookup gets the answer and updates a success record to the stats.
1656 std::thread t1([&hostname]() {
1657 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1658 ScopedAddrinfo result = safe_getaddrinfo(hostname, nullptr, &hints);
1659 EXPECT_NE(result.get(), nullptr);
1660 EXPECT_EQ(ToString(result), "1.2.3.4");
1661 });
1662
1663 // Wait for t1 to start the step 1.
1664 while (dns1.queries().size() == 0) {
1665 usleep(1000);
1666 }
1667
1668 // Update the resolver with three nameservers. This will increment the revision ID.
1669 parcel.servers = {listen_addr3, listen_addr1, listen_addr2};
1670 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1671
1672 t1.join();
1673 EXPECT_EQ(0U, GetNumQueriesForType(dns3, ns_type::ns_t_aaaa, fqdn_with_search_domain));
1674 EXPECT_EQ(1U, GetNumQueriesForType(dns3, ns_type::ns_t_a, fqdn_with_search_domain));
1675
Mike Yue2162e52020-03-04 18:43:46 +08001676 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1677 NameserverStats(listen_addr1),
1678 NameserverStats(listen_addr2),
1679 NameserverStats(listen_addr3).setSuccesses(1),
1680 };
Mike Yu61d17262020-02-15 18:56:22 +08001681 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu15791832020-02-11 13:38:48 +08001682}
1683
Ken Chenb9fa2062018-11-13 21:51:13 +08001684// Test what happens if the specified TLS server is nonexistent.
1685TEST_F(ResolverTest, GetHostByName_TlsMissing) {
Xiao Ma09b71022018-12-11 17:56:32 +09001686 constexpr char listen_addr[] = "127.0.0.3";
1687 constexpr char host_name[] = "tlsmissing.example.com.";
1688
1689 test::DNSResponder dns;
1690 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.3"}});
Luke Huangf8215372019-11-22 11:53:41 +08001691 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001692
1693 // There's nothing listening on this address, so validation will either fail or
1694 /// hang. Either way, queries will continue to flow to the DNSResponder.
waynema0e73c2e2019-07-31 15:04:08 +08001695 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Ken Chenb9fa2062018-11-13 21:51:13 +08001696
1697 const hostent* result;
1698
1699 result = gethostbyname("tlsmissing");
1700 ASSERT_FALSE(result == nullptr);
1701 EXPECT_EQ("1.2.3.3", ToString(result));
1702
1703 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001704 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001705}
1706
1707// Test what happens if the specified TLS server replies with garbage.
1708TEST_F(ResolverTest, GetHostByName_TlsBroken) {
Xiao Ma09b71022018-12-11 17:56:32 +09001709 constexpr char listen_addr[] = "127.0.0.3";
1710 constexpr char host_name1[] = "tlsbroken1.example.com.";
1711 constexpr char host_name2[] = "tlsbroken2.example.com.";
1712 const std::vector<DnsRecord> records = {
1713 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1714 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1715 };
1716
1717 test::DNSResponder dns;
1718 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001719 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001720
1721 // Bind the specified private DNS socket but don't respond to any client sockets yet.
1722 int s = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, IPPROTO_TCP);
1723 ASSERT_TRUE(s >= 0);
1724 struct sockaddr_in tlsServer = {
Luke Huangf8215372019-11-22 11:53:41 +08001725 .sin_family = AF_INET,
1726 .sin_port = htons(853),
Ken Chenb9fa2062018-11-13 21:51:13 +08001727 };
1728 ASSERT_TRUE(inet_pton(AF_INET, listen_addr, &tlsServer.sin_addr));
1729 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEPORT).ok());
1730 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEADDR).ok());
1731 ASSERT_FALSE(bind(s, reinterpret_cast<struct sockaddr*>(&tlsServer), sizeof(tlsServer)));
1732 ASSERT_FALSE(listen(s, 1));
1733
1734 // Trigger TLS validation.
waynema0e73c2e2019-07-31 15:04:08 +08001735 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Ken Chenb9fa2062018-11-13 21:51:13 +08001736
1737 struct sockaddr_storage cliaddr;
1738 socklen_t sin_size = sizeof(cliaddr);
Luke Huangf8215372019-11-22 11:53:41 +08001739 int new_fd = accept4(s, reinterpret_cast<struct sockaddr*>(&cliaddr), &sin_size, SOCK_CLOEXEC);
Ken Chenb9fa2062018-11-13 21:51:13 +08001740 ASSERT_TRUE(new_fd > 0);
1741
1742 // We've received the new file descriptor but not written to it or closed, so the
1743 // validation is still pending. Queries should still flow correctly because the
1744 // server is not used until validation succeeds.
1745 const hostent* result;
1746 result = gethostbyname("tlsbroken1");
1747 ASSERT_FALSE(result == nullptr);
1748 EXPECT_EQ("1.2.3.1", ToString(result));
1749
1750 // Now we cause the validation to fail.
1751 std::string garbage = "definitely not a valid TLS ServerHello";
1752 write(new_fd, garbage.data(), garbage.size());
1753 close(new_fd);
1754
1755 // Validation failure shouldn't interfere with lookups, because lookups won't be sent
1756 // to the TLS server unless validation succeeds.
1757 result = gethostbyname("tlsbroken2");
1758 ASSERT_FALSE(result == nullptr);
1759 EXPECT_EQ("1.2.3.2", ToString(result));
1760
1761 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001762 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001763 close(s);
1764}
1765
1766TEST_F(ResolverTest, GetHostByName_Tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001767 constexpr char listen_addr[] = "127.0.0.3";
1768 constexpr char listen_udp[] = "53";
1769 constexpr char listen_tls[] = "853";
1770 constexpr char host_name1[] = "tls1.example.com.";
1771 constexpr char host_name2[] = "tls2.example.com.";
1772 constexpr char host_name3[] = "tls3.example.com.";
1773 const std::vector<DnsRecord> records = {
1774 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1775 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1776 {host_name3, ns_type::ns_t_a, "1.2.3.3"},
1777 };
1778
1779 test::DNSResponder dns;
1780 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001781 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001782
1783 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1784 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001785 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08001786 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001787
Mike Yu724f77d2019-08-16 11:14:50 +08001788 const hostent* result = gethostbyname("tls1");
Ken Chenb9fa2062018-11-13 21:51:13 +08001789 ASSERT_FALSE(result == nullptr);
1790 EXPECT_EQ("1.2.3.1", ToString(result));
1791
1792 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001793 EXPECT_TRUE(tls.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001794
1795 // Stop the TLS server. Since we're in opportunistic mode, queries will
1796 // fall back to the locally-assigned (clear text) nameservers.
1797 tls.stopServer();
1798
1799 dns.clearQueries();
1800 result = gethostbyname("tls2");
1801 EXPECT_FALSE(result == nullptr);
1802 EXPECT_EQ("1.2.3.2", ToString(result));
1803 const auto queries = dns.queries();
1804 EXPECT_EQ(1U, queries.size());
waynema29253052019-08-20 11:26:08 +08001805 EXPECT_EQ("tls2.example.com.", queries[0].name);
1806 EXPECT_EQ(ns_t_a, queries[0].type);
Ken Chenb9fa2062018-11-13 21:51:13 +08001807
1808 // Reset the resolvers without enabling TLS. Queries should still be routed
1809 // to the UDP endpoint.
Xiao Ma09b71022018-12-11 17:56:32 +09001810 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001811
1812 result = gethostbyname("tls3");
1813 ASSERT_FALSE(result == nullptr);
1814 EXPECT_EQ("1.2.3.3", ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +08001815}
1816
Ken Chenb9fa2062018-11-13 21:51:13 +08001817TEST_F(ResolverTest, GetHostByName_TlsFailover) {
Xiao Ma09b71022018-12-11 17:56:32 +09001818 constexpr char listen_addr1[] = "127.0.0.3";
1819 constexpr char listen_addr2[] = "127.0.0.4";
1820 constexpr char listen_udp[] = "53";
1821 constexpr char listen_tls[] = "853";
1822 constexpr char host_name1[] = "tlsfailover1.example.com.";
1823 constexpr char host_name2[] = "tlsfailover2.example.com.";
1824 const std::vector<DnsRecord> records1 = {
1825 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1826 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1827 };
1828 const std::vector<DnsRecord> records2 = {
1829 {host_name1, ns_type::ns_t_a, "1.2.3.3"},
1830 {host_name2, ns_type::ns_t_a, "1.2.3.4"},
1831 };
1832
1833 test::DNSResponder dns1(listen_addr1);
1834 test::DNSResponder dns2(listen_addr2);
1835 StartDns(dns1, records1);
1836 StartDns(dns2, records2);
1837
Luke Huangf8215372019-11-22 11:53:41 +08001838 std::vector<std::string> servers = {listen_addr1, listen_addr2};
Ken Chenb9fa2062018-11-13 21:51:13 +08001839
1840 test::DnsTlsFrontend tls1(listen_addr1, listen_tls, listen_addr1, listen_udp);
1841 test::DnsTlsFrontend tls2(listen_addr2, listen_tls, listen_addr2, listen_udp);
1842 ASSERT_TRUE(tls1.startServer());
1843 ASSERT_TRUE(tls2.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001844 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1845 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08001846 EXPECT_TRUE(WaitForPrivateDnsValidation(tls1.listen_address(), true));
1847 EXPECT_TRUE(WaitForPrivateDnsValidation(tls2.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001848
Mike Yu724f77d2019-08-16 11:14:50 +08001849 const hostent* result = gethostbyname("tlsfailover1");
Ken Chenb9fa2062018-11-13 21:51:13 +08001850 ASSERT_FALSE(result == nullptr);
1851 EXPECT_EQ("1.2.3.1", ToString(result));
1852
1853 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001854 EXPECT_TRUE(tls1.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001855 // No new queries should have reached tls2.
Luke Huang0a0870d2020-02-12 20:41:10 +08001856 EXPECT_TRUE(tls2.waitForQueries(1));
Ken Chenb9fa2062018-11-13 21:51:13 +08001857
1858 // Stop tls1. Subsequent queries should attempt to reach tls1, fail, and retry to tls2.
1859 tls1.stopServer();
1860
1861 result = gethostbyname("tlsfailover2");
1862 EXPECT_EQ("1.2.3.4", ToString(result));
1863
1864 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001865 EXPECT_TRUE(tls2.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001866
1867 // No additional queries should have reached the insecure servers.
1868 EXPECT_EQ(2U, dns1.queries().size());
1869 EXPECT_EQ(2U, dns2.queries().size());
1870
1871 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001872 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Ken Chenb9fa2062018-11-13 21:51:13 +08001873}
1874
1875TEST_F(ResolverTest, GetHostByName_BadTlsName) {
Xiao Ma09b71022018-12-11 17:56:32 +09001876 constexpr char listen_addr[] = "127.0.0.3";
1877 constexpr char listen_udp[] = "53";
1878 constexpr char listen_tls[] = "853";
1879 constexpr char host_name[] = "badtlsname.example.com.";
1880
1881 test::DNSResponder dns;
1882 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.1"}});
Luke Huangf8215372019-11-22 11:53:41 +08001883 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001884
1885 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1886 ASSERT_TRUE(tls.startServer());
Xiao Ma09b71022018-12-11 17:56:32 +09001887 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
waynema0e73c2e2019-07-31 15:04:08 +08001888 kDefaultIncorrectPrivateDnsHostName));
Ken Chenb9fa2062018-11-13 21:51:13 +08001889
waynema0e73c2e2019-07-31 15:04:08 +08001890 // The TLS handshake would fail because the name of TLS server doesn't
1891 // match with TLS server's certificate.
Mike Yu724f77d2019-08-16 11:14:50 +08001892 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), false));
Ken Chenb9fa2062018-11-13 21:51:13 +08001893
1894 // The query should fail hard, because a name was specified.
1895 EXPECT_EQ(nullptr, gethostbyname("badtlsname"));
1896
1897 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001898 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001899}
1900
1901TEST_F(ResolverTest, GetAddrInfo_Tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001902 constexpr char listen_addr[] = "127.0.0.3";
1903 constexpr char listen_udp[] = "53";
1904 constexpr char listen_tls[] = "853";
1905 constexpr char host_name[] = "addrinfotls.example.com.";
1906 const std::vector<DnsRecord> records = {
1907 {host_name, ns_type::ns_t_a, "1.2.3.4"},
1908 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
1909 };
1910
1911 test::DNSResponder dns;
1912 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001913 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001914
1915 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1916 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001917 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1918 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08001919 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001920
1921 dns.clearQueries();
1922 ScopedAddrinfo result = safe_getaddrinfo("addrinfotls", nullptr, nullptr);
1923 EXPECT_TRUE(result != nullptr);
1924 size_t found = GetNumQueries(dns, host_name);
1925 EXPECT_LE(1U, found);
1926 // Could be A or AAAA
1927 std::string result_str = ToString(result);
1928 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +08001929 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08001930 // Wait for both A and AAAA queries to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001931 EXPECT_TRUE(tls.waitForQueries(3));
Ken Chenb9fa2062018-11-13 21:51:13 +08001932
1933 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001934 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001935}
1936
1937TEST_F(ResolverTest, TlsBypass) {
1938 const char OFF[] = "off";
1939 const char OPPORTUNISTIC[] = "opportunistic";
1940 const char STRICT[] = "strict";
1941
1942 const char GETHOSTBYNAME[] = "gethostbyname";
1943 const char GETADDRINFO[] = "getaddrinfo";
1944 const char GETADDRINFOFORNET[] = "getaddrinfofornet";
1945
1946 const unsigned BYPASS_NETID = NETID_USE_LOCAL_NAMESERVERS | TEST_NETID;
1947
Ken Chenb9fa2062018-11-13 21:51:13 +08001948 const char ADDR4[] = "192.0.2.1";
1949 const char ADDR6[] = "2001:db8::1";
1950
1951 const char cleartext_addr[] = "127.0.0.53";
1952 const char cleartext_port[] = "53";
1953 const char tls_port[] = "853";
Luke Huangf8215372019-11-22 11:53:41 +08001954 const std::vector<std::string> servers = {cleartext_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001955
Xiao Ma09b71022018-12-11 17:56:32 +09001956 test::DNSResponder dns(cleartext_addr);
Ken Chenb9fa2062018-11-13 21:51:13 +08001957 ASSERT_TRUE(dns.startServer());
1958
1959 test::DnsTlsFrontend tls(cleartext_addr, tls_port, cleartext_addr, cleartext_port);
Mike Yudd4ac2d2019-05-31 16:52:11 +08001960 ASSERT_TRUE(tls.startServer());
Ken Chenb9fa2062018-11-13 21:51:13 +08001961
Luke Huangf8215372019-11-22 11:53:41 +08001962 // clang-format off
Ken Chenb9fa2062018-11-13 21:51:13 +08001963 struct TestConfig {
1964 const std::string mode;
1965 const bool withWorkingTLS;
1966 const std::string method;
1967
1968 std::string asHostName() const {
Luke Huangf8215372019-11-22 11:53:41 +08001969 return StringPrintf("%s.%s.%s.", mode.c_str(), withWorkingTLS ? "tlsOn" : "tlsOff",
Ken Chenb9fa2062018-11-13 21:51:13 +08001970 method.c_str());
1971 }
1972 } testConfigs[]{
Ken Chenb9fa2062018-11-13 21:51:13 +08001973 {OFF, true, GETHOSTBYNAME},
1974 {OPPORTUNISTIC, true, GETHOSTBYNAME},
1975 {STRICT, true, GETHOSTBYNAME},
Ken Chenb9fa2062018-11-13 21:51:13 +08001976 {OFF, true, GETADDRINFO},
1977 {OPPORTUNISTIC, true, GETADDRINFO},
1978 {STRICT, true, GETADDRINFO},
Ken Chenb9fa2062018-11-13 21:51:13 +08001979 {OFF, true, GETADDRINFOFORNET},
1980 {OPPORTUNISTIC, true, GETADDRINFOFORNET},
1981 {STRICT, true, GETADDRINFOFORNET},
Mike Yudd4ac2d2019-05-31 16:52:11 +08001982 {OFF, false, GETHOSTBYNAME},
1983 {OPPORTUNISTIC, false, GETHOSTBYNAME},
1984 {STRICT, false, GETHOSTBYNAME},
1985 {OFF, false, GETADDRINFO},
1986 {OPPORTUNISTIC, false, GETADDRINFO},
1987 {STRICT, false, GETADDRINFO},
1988 {OFF, false, GETADDRINFOFORNET},
1989 {OPPORTUNISTIC, false, GETADDRINFOFORNET},
1990 {STRICT, false, GETADDRINFOFORNET},
Ken Chenb9fa2062018-11-13 21:51:13 +08001991 };
Luke Huangf8215372019-11-22 11:53:41 +08001992 // clang-format on
Ken Chenb9fa2062018-11-13 21:51:13 +08001993
1994 for (const auto& config : testConfigs) {
1995 const std::string testHostName = config.asHostName();
1996 SCOPED_TRACE(testHostName);
1997
1998 // Don't tempt test bugs due to caching.
1999 const char* host_name = testHostName.c_str();
2000 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
2001 dns.addMapping(host_name, ns_type::ns_t_aaaa, ADDR6);
2002
Mike Yudd4ac2d2019-05-31 16:52:11 +08002003 if (config.withWorkingTLS) {
2004 if (!tls.running()) {
2005 ASSERT_TRUE(tls.startServer());
2006 }
2007 } else {
2008 if (tls.running()) {
2009 ASSERT_TRUE(tls.stopServer());
2010 }
2011 }
Ken Chenb9fa2062018-11-13 21:51:13 +08002012
2013 if (config.mode == OFF) {
Xiao Ma09b71022018-12-11 17:56:32 +09002014 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, kDefaultSearchDomains,
2015 kDefaultParams));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09002016 } else /* OPPORTUNISTIC or STRICT */ {
2017 const char* tls_hostname = (config.mode == STRICT) ? kDefaultPrivateDnsHostName : "";
Xiao Ma09b71022018-12-11 17:56:32 +09002018 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09002019 kDefaultParams, tls_hostname));
Mike Yu724f77d2019-08-16 11:14:50 +08002020
2021 // Wait for the validation event. If the server is running, the validation should
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09002022 // succeed; otherwise, the validation should fail.
Mike Yu724f77d2019-08-16 11:14:50 +08002023 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), config.withWorkingTLS));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09002024 if (config.withWorkingTLS) {
2025 EXPECT_TRUE(tls.waitForQueries(1));
2026 tls.clearQueries();
2027 }
Ken Chenb9fa2062018-11-13 21:51:13 +08002028 }
Ken Chenb9fa2062018-11-13 21:51:13 +08002029
2030 const hostent* h_result = nullptr;
2031 ScopedAddrinfo ai_result;
2032
2033 if (config.method == GETHOSTBYNAME) {
2034 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
2035 h_result = gethostbyname(host_name);
2036
2037 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
2038 ASSERT_FALSE(h_result == nullptr);
2039 ASSERT_EQ(4, h_result->h_length);
2040 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
2041 EXPECT_EQ(ADDR4, ToString(h_result));
2042 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
2043 } else if (config.method == GETADDRINFO) {
2044 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
2045 ai_result = safe_getaddrinfo(host_name, nullptr, nullptr);
2046 EXPECT_TRUE(ai_result != nullptr);
2047
2048 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2049 // Could be A or AAAA
2050 const std::string result_str = ToString(ai_result);
2051 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
Luke Huangf8215372019-11-22 11:53:41 +08002052 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08002053 } else if (config.method == GETADDRINFOFORNET) {
2054 addrinfo* raw_ai_result = nullptr;
2055 EXPECT_EQ(0, android_getaddrinfofornet(host_name, /*servname=*/nullptr,
2056 /*hints=*/nullptr, BYPASS_NETID, MARK_UNSET,
2057 &raw_ai_result));
2058 ai_result.reset(raw_ai_result);
2059
2060 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2061 // Could be A or AAAA
2062 const std::string result_str = ToString(ai_result);
2063 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
Luke Huangf8215372019-11-22 11:53:41 +08002064 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08002065 }
2066
Mike Yudd4ac2d2019-05-31 16:52:11 +08002067 EXPECT_EQ(0, tls.queries());
Ken Chenb9fa2062018-11-13 21:51:13 +08002068
2069 // Clear per-process resolv netid.
2070 ASSERT_EQ(0, setNetworkForResolv(NETID_UNSET));
Ken Chenb9fa2062018-11-13 21:51:13 +08002071 dns.clearQueries();
2072 }
Ken Chenb9fa2062018-11-13 21:51:13 +08002073}
2074
2075TEST_F(ResolverTest, StrictMode_NoTlsServers) {
Xiao Ma09b71022018-12-11 17:56:32 +09002076 constexpr char cleartext_addr[] = "127.0.0.53";
Luke Huangf8215372019-11-22 11:53:41 +08002077 const std::vector<std::string> servers = {cleartext_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002078 constexpr char host_name[] = "strictmode.notlsips.example.com.";
2079 const std::vector<DnsRecord> records = {
2080 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2081 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2082 };
Ken Chenb9fa2062018-11-13 21:51:13 +08002083
Xiao Ma09b71022018-12-11 17:56:32 +09002084 test::DNSResponder dns(cleartext_addr);
2085 StartDns(dns, records);
Ken Chenb9fa2062018-11-13 21:51:13 +08002086
waynema0e73c2e2019-07-31 15:04:08 +08002087 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
2088 kDefaultIncorrectPrivateDnsHostName));
Ken Chenb9fa2062018-11-13 21:51:13 +08002089
2090 addrinfo* ai_result = nullptr;
2091 EXPECT_NE(0, getaddrinfo(host_name, nullptr, nullptr, &ai_result));
2092 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
2093}
Luke Huang94b10b92018-11-21 20:13:38 +08002094
2095namespace {
2096
Luke Huang70931aa2019-01-31 11:57:41 +08002097int getAsyncResponse(int fd, int* rcode, uint8_t* buf, int bufLen) {
Luke Huang94b10b92018-11-21 20:13:38 +08002098 struct pollfd wait_fd[1];
2099 wait_fd[0].fd = fd;
2100 wait_fd[0].events = POLLIN;
2101 short revents;
2102 int ret;
2103
2104 ret = poll(wait_fd, 1, -1);
2105 revents = wait_fd[0].revents;
2106 if (revents & POLLIN) {
2107 int n = resNetworkResult(fd, rcode, buf, bufLen);
Luke Huangba7bef92018-12-26 16:53:03 +08002108 // Verify that resNetworkResult() closed the fd
markchien96b09e22020-07-29 14:24:34 +08002109 char unused;
2110 EXPECT_EQ(-1, read(fd, &unused, sizeof unused));
Luke Huangba7bef92018-12-26 16:53:03 +08002111 EXPECT_EQ(EBADF, errno);
Luke Huang94b10b92018-11-21 20:13:38 +08002112 return n;
2113 }
2114 return -1;
2115}
2116
Luke Huang70931aa2019-01-31 11:57:41 +08002117std::string toString(uint8_t* buf, int bufLen, int ipType) {
Luke Huang94b10b92018-11-21 20:13:38 +08002118 ns_msg handle;
2119 int ancount, n = 0;
2120 ns_rr rr;
2121
Luke Huangf8215372019-11-22 11:53:41 +08002122 if (ns_initparse((const uint8_t*)buf, bufLen, &handle) >= 0) {
Luke Huang94b10b92018-11-21 20:13:38 +08002123 ancount = ns_msg_count(handle, ns_s_an);
2124 if (ns_parserr(&handle, ns_s_an, n, &rr) == 0) {
Luke Huang70931aa2019-01-31 11:57:41 +08002125 const uint8_t* rdata = ns_rr_rdata(rr);
Luke Huang94b10b92018-11-21 20:13:38 +08002126 char buffer[INET6_ADDRSTRLEN];
Luke Huangf8215372019-11-22 11:53:41 +08002127 if (inet_ntop(ipType, (const char*)rdata, buffer, sizeof(buffer))) {
Luke Huang94b10b92018-11-21 20:13:38 +08002128 return buffer;
2129 }
2130 }
2131 }
2132 return "";
2133}
2134
2135int dns_open_proxy() {
2136 int s = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
2137 if (s == -1) {
2138 return -1;
2139 }
2140 const int one = 1;
2141 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
2142
2143 static const struct sockaddr_un proxy_addr = {
2144 .sun_family = AF_UNIX,
2145 .sun_path = "/dev/socket/dnsproxyd",
2146 };
2147
Luke Huangf8215372019-11-22 11:53:41 +08002148 if (TEMP_FAILURE_RETRY(connect(s, (const struct sockaddr*)&proxy_addr, sizeof(proxy_addr))) !=
Luke Huang94b10b92018-11-21 20:13:38 +08002149 0) {
2150 close(s);
2151 return -1;
2152 }
2153
2154 return s;
2155}
2156
Luke Huangba7bef92018-12-26 16:53:03 +08002157void expectAnswersValid(int fd, int ipType, const std::string& expectedAnswer) {
2158 int rcode = -1;
2159 uint8_t buf[MAXPACKET] = {};
2160
2161 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2162 EXPECT_GT(res, 0);
2163 EXPECT_EQ(expectedAnswer, toString(buf, res, ipType));
2164}
2165
2166void expectAnswersNotValid(int fd, int expectedErrno) {
2167 int rcode = -1;
2168 uint8_t buf[MAXPACKET] = {};
2169
2170 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2171 EXPECT_EQ(expectedErrno, res);
2172}
2173
Luke Huang94b10b92018-11-21 20:13:38 +08002174} // namespace
2175
2176TEST_F(ResolverTest, Async_NormalQueryV4V6) {
Xiao Ma09b71022018-12-11 17:56:32 +09002177 constexpr char listen_addr[] = "127.0.0.4";
2178 constexpr char host_name[] = "howdy.example.com.";
2179 const std::vector<DnsRecord> records = {
2180 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2181 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2182 };
2183
2184 test::DNSResponder dns(listen_addr);
2185 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002186 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002187 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002188
Luke Huangba7bef92018-12-26 16:53:03 +08002189 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2190 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002191 EXPECT_TRUE(fd1 != -1);
2192 EXPECT_TRUE(fd2 != -1);
2193
Luke Huang70931aa2019-01-31 11:57:41 +08002194 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002195 int rcode;
2196 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2197 EXPECT_GT(res, 0);
2198 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
2199
2200 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2201 EXPECT_GT(res, 0);
2202 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2203
2204 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
2205
2206 // Re-query verify cache works
Luke Huangba7bef92018-12-26 16:53:03 +08002207 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2208 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002209
2210 EXPECT_TRUE(fd1 != -1);
2211 EXPECT_TRUE(fd2 != -1);
2212
2213 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2214 EXPECT_GT(res, 0);
2215 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
2216
2217 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2218 EXPECT_GT(res, 0);
2219 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2220
2221 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
2222}
2223
2224TEST_F(ResolverTest, Async_BadQuery) {
Xiao Ma09b71022018-12-11 17:56:32 +09002225 constexpr char listen_addr[] = "127.0.0.4";
2226 constexpr char host_name[] = "howdy.example.com.";
2227 const std::vector<DnsRecord> records = {
2228 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2229 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2230 };
2231
2232 test::DNSResponder dns(listen_addr);
2233 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002234 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002235 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002236
2237 static struct {
2238 int fd;
2239 const char* dname;
2240 const int queryType;
2241 const int expectRcode;
2242 } kTestData[] = {
Luke Huangba7bef92018-12-26 16:53:03 +08002243 {-1, "", ns_t_aaaa, 0},
2244 {-1, "as65ass46", ns_t_aaaa, 0},
2245 {-1, "454564564564", ns_t_aaaa, 0},
2246 {-1, "h645235", ns_t_a, 0},
2247 {-1, "www.google.com", ns_t_a, 0},
Luke Huang94b10b92018-11-21 20:13:38 +08002248 };
2249
2250 for (auto& td : kTestData) {
2251 SCOPED_TRACE(td.dname);
Luke Huangba7bef92018-12-26 16:53:03 +08002252 td.fd = resNetworkQuery(TEST_NETID, td.dname, ns_c_in, td.queryType, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002253 EXPECT_TRUE(td.fd != -1);
2254 }
2255
2256 // dns_responder return empty resp(packet only contains query part) with no error currently
2257 for (const auto& td : kTestData) {
Luke Huang70931aa2019-01-31 11:57:41 +08002258 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002259 int rcode;
2260 SCOPED_TRACE(td.dname);
2261 int res = getAsyncResponse(td.fd, &rcode, buf, MAXPACKET);
2262 EXPECT_GT(res, 0);
2263 EXPECT_EQ(rcode, td.expectRcode);
2264 }
2265}
2266
2267TEST_F(ResolverTest, Async_EmptyAnswer) {
Xiao Ma09b71022018-12-11 17:56:32 +09002268 constexpr char listen_addr[] = "127.0.0.4";
2269 constexpr char host_name[] = "howdy.example.com.";
2270 const std::vector<DnsRecord> records = {
2271 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2272 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2273 };
2274
2275 test::DNSResponder dns(listen_addr);
2276 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002277 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002278 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002279
Luke Huang9c264bb2018-12-18 16:44:41 +08002280 // TODO: Disable retry to make this test explicit.
2281 auto& cv = dns.getCv();
2282 auto& cvMutex = dns.getCvMutex();
2283 int fd1;
2284 // Wait on the condition variable to ensure that the DNS server has handled our first query.
2285 {
2286 std::unique_lock lk(cvMutex);
Luke Huangba7bef92018-12-26 16:53:03 +08002287 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang9c264bb2018-12-18 16:44:41 +08002288 EXPECT_TRUE(fd1 != -1);
2289 EXPECT_EQ(std::cv_status::no_timeout, cv.wait_for(lk, std::chrono::seconds(1)));
2290 }
Luke Huang94b10b92018-11-21 20:13:38 +08002291
Luke Huang94b10b92018-11-21 20:13:38 +08002292 dns.setResponseProbability(0.0);
Luke Huang94b10b92018-11-21 20:13:38 +08002293
Luke Huangba7bef92018-12-26 16:53:03 +08002294 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002295 EXPECT_TRUE(fd2 != -1);
2296
Luke Huangba7bef92018-12-26 16:53:03 +08002297 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002298 EXPECT_TRUE(fd3 != -1);
2299
Luke Huang9c264bb2018-12-18 16:44:41 +08002300 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002301 int rcode;
2302
Luke Huang9c264bb2018-12-18 16:44:41 +08002303 // expect no response
2304 int res = getAsyncResponse(fd3, &rcode, buf, MAXPACKET);
2305 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huang94b10b92018-11-21 20:13:38 +08002306
Luke Huang9c264bb2018-12-18 16:44:41 +08002307 // expect no response
Luke Huang94b10b92018-11-21 20:13:38 +08002308 memset(buf, 0, MAXPACKET);
Luke Huang9c264bb2018-12-18 16:44:41 +08002309 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2310 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huang94b10b92018-11-21 20:13:38 +08002311
Luke Huang94b10b92018-11-21 20:13:38 +08002312 dns.setResponseProbability(1.0);
Luke Huang94b10b92018-11-21 20:13:38 +08002313
Luke Huangba7bef92018-12-26 16:53:03 +08002314 int fd4 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002315 EXPECT_TRUE(fd4 != -1);
2316
2317 memset(buf, 0, MAXPACKET);
2318 res = getAsyncResponse(fd4, &rcode, buf, MAXPACKET);
2319 EXPECT_GT(res, 0);
2320 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2321
2322 memset(buf, 0, MAXPACKET);
2323 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2324 EXPECT_GT(res, 0);
2325 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
Mike Yu532405f2020-06-17 17:46:44 +08002326
2327 // Trailing dot is removed. Is it intended?
2328 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, 0, "howdy.example.com", {"::1.2.3.4"});
2329 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2330 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2331 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, 0, "howdy.example.com", {"1.2.3.4"});
Luke Huang94b10b92018-11-21 20:13:38 +08002332}
2333
2334TEST_F(ResolverTest, Async_MalformedQuery) {
Xiao Ma09b71022018-12-11 17:56:32 +09002335 constexpr char listen_addr[] = "127.0.0.4";
2336 constexpr char host_name[] = "howdy.example.com.";
2337 const std::vector<DnsRecord> records = {
2338 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2339 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2340 };
2341
2342 test::DNSResponder dns(listen_addr);
2343 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002344 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002345 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002346
2347 int fd = dns_open_proxy();
2348 EXPECT_TRUE(fd > 0);
2349
2350 const std::string badMsg = "16-52512#";
Xiao Ma09b71022018-12-11 17:56:32 +09002351 static const struct {
Luke Huang94b10b92018-11-21 20:13:38 +08002352 const std::string cmd;
2353 const int expectErr;
2354 } kTestData[] = {
Luke Huangba7bef92018-12-26 16:53:03 +08002355 // Too few arguments
Luke Huang94b10b92018-11-21 20:13:38 +08002356 {"resnsend " + badMsg + '\0', -EINVAL},
2357 // Bad netId
Luke Huangba7bef92018-12-26 16:53:03 +08002358 {"resnsend badnetId 0 " + badMsg + '\0', -EINVAL},
Luke Huang94b10b92018-11-21 20:13:38 +08002359 // Bad raw data
Luke Huangba7bef92018-12-26 16:53:03 +08002360 {"resnsend " + std::to_string(TEST_NETID) + " 0 " + badMsg + '\0', -EILSEQ},
Luke Huang94b10b92018-11-21 20:13:38 +08002361 };
2362
2363 for (unsigned int i = 0; i < std::size(kTestData); i++) {
2364 auto& td = kTestData[i];
2365 SCOPED_TRACE(td.cmd);
2366 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, td.cmd.c_str(), td.cmd.size()));
2367 EXPECT_EQ(rc, static_cast<ssize_t>(td.cmd.size()));
2368
2369 int32_t tmp;
2370 rc = TEMP_FAILURE_RETRY(read(fd, &tmp, sizeof(tmp)));
2371 EXPECT_TRUE(rc > 0);
2372 EXPECT_EQ(static_cast<int>(ntohl(tmp)), td.expectErr);
2373 }
2374 // Normal query with answer buffer
2375 // This is raw data of query "howdy.example.com" type 1 class 1
2376 std::string query = "81sBAAABAAAAAAAABWhvd2R5B2V4YW1wbGUDY29tAAABAAE=";
Luke Huangba7bef92018-12-26 16:53:03 +08002377 std::string cmd = "resnsend " + std::to_string(TEST_NETID) + " 0 " + query + '\0';
Luke Huang94b10b92018-11-21 20:13:38 +08002378 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
2379 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
2380
Luke Huang70931aa2019-01-31 11:57:41 +08002381 uint8_t smallBuf[1] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002382 int rcode;
2383 rc = getAsyncResponse(fd, &rcode, smallBuf, 1);
Luke Huangba7bef92018-12-26 16:53:03 +08002384 EXPECT_EQ(-EMSGSIZE, rc);
Luke Huang94b10b92018-11-21 20:13:38 +08002385
2386 // Do the normal test with large buffer again
2387 fd = dns_open_proxy();
2388 EXPECT_TRUE(fd > 0);
2389 rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
2390 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
Luke Huang70931aa2019-01-31 11:57:41 +08002391 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002392 rc = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2393 EXPECT_EQ("1.2.3.4", toString(buf, rc, AF_INET));
Mike Yu4f3747b2018-12-02 17:54:29 +09002394}
2395
Luke Huangba7bef92018-12-26 16:53:03 +08002396TEST_F(ResolverTest, Async_CacheFlags) {
Xiao Ma09b71022018-12-11 17:56:32 +09002397 constexpr char listen_addr[] = "127.0.0.4";
Luke Huang4eabbe32020-05-28 03:17:32 +08002398 constexpr char host_name1[] = "howdy.example.com.";
2399 constexpr char host_name2[] = "howdy.example2.com.";
2400 constexpr char host_name3[] = "howdy.example3.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002401 const std::vector<DnsRecord> records = {
Luke Huang4eabbe32020-05-28 03:17:32 +08002402 {host_name1, ns_type::ns_t_a, "1.2.3.4"}, {host_name1, ns_type::ns_t_aaaa, "::1.2.3.4"},
2403 {host_name2, ns_type::ns_t_a, "1.2.3.5"}, {host_name2, ns_type::ns_t_aaaa, "::1.2.3.5"},
2404 {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 +09002405 };
2406
2407 test::DNSResponder dns(listen_addr);
2408 StartDns(dns, records);
Luke Huangba7bef92018-12-26 16:53:03 +08002409 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002410 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huangba7bef92018-12-26 16:53:03 +08002411
2412 // ANDROID_RESOLV_NO_CACHE_STORE
2413 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2414 ANDROID_RESOLV_NO_CACHE_STORE);
2415 EXPECT_TRUE(fd1 != -1);
2416 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2417 ANDROID_RESOLV_NO_CACHE_STORE);
2418 EXPECT_TRUE(fd2 != -1);
2419 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2420 ANDROID_RESOLV_NO_CACHE_STORE);
2421 EXPECT_TRUE(fd3 != -1);
2422
2423 expectAnswersValid(fd3, AF_INET, "1.2.3.4");
2424 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
2425 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2426
2427 // No cache exists, expect 3 queries
Luke Huang4eabbe32020-05-28 03:17:32 +08002428 EXPECT_EQ(3U, GetNumQueries(dns, host_name1));
Luke Huangba7bef92018-12-26 16:53:03 +08002429
Luke Huang4eabbe32020-05-28 03:17:32 +08002430 // Raise a query with no flags to ensure no cache exists. Also make an cache entry for the
2431 // query.
Luke Huangba7bef92018-12-26 16:53:03 +08002432 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2433
2434 EXPECT_TRUE(fd1 != -1);
2435
2436 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2437
Luke Huang4eabbe32020-05-28 03:17:32 +08002438 // Expect 4 queries because there should be no cache before this query.
2439 EXPECT_EQ(4U, GetNumQueries(dns, host_name1));
2440
2441 // Now we have the cache entry, re-query with ANDROID_RESOLV_NO_CACHE_STORE to ensure
2442 // that ANDROID_RESOLV_NO_CACHE_STORE implied ANDROID_RESOLV_NO_CACHE_LOOKUP.
2443 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2444 ANDROID_RESOLV_NO_CACHE_STORE);
2445 EXPECT_TRUE(fd1 != -1);
2446 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2447 // Expect 5 queries because we shouldn't do cache lookup for the query which has
2448 // ANDROID_RESOLV_NO_CACHE_STORE.
2449 EXPECT_EQ(5U, GetNumQueries(dns, host_name1));
Luke Huangba7bef92018-12-26 16:53:03 +08002450
2451 // ANDROID_RESOLV_NO_CACHE_LOOKUP
2452 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2453 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2454 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2455 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2456
2457 EXPECT_TRUE(fd1 != -1);
2458 EXPECT_TRUE(fd2 != -1);
2459
2460 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
2461 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2462
Luke Huang4eabbe32020-05-28 03:17:32 +08002463 // Cache was skipped, expect 2 more queries.
2464 EXPECT_EQ(7U, GetNumQueries(dns, host_name1));
Luke Huangba7bef92018-12-26 16:53:03 +08002465
2466 // Re-query verify cache works
Luke Huang4eabbe32020-05-28 03:17:32 +08002467 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huangba7bef92018-12-26 16:53:03 +08002468 EXPECT_TRUE(fd1 != -1);
2469 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2470
Luke Huang4eabbe32020-05-28 03:17:32 +08002471 // Cache hits, expect still 7 queries
2472 EXPECT_EQ(7U, GetNumQueries(dns, host_name1));
Luke Huanga1d74182019-03-19 17:30:36 +08002473
2474 // Start to verify if ANDROID_RESOLV_NO_CACHE_LOOKUP does write response into cache
2475 dns.clearQueries();
2476
Luke Huang4eabbe32020-05-28 03:17:32 +08002477 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa,
Luke Huanga1d74182019-03-19 17:30:36 +08002478 ANDROID_RESOLV_NO_CACHE_LOOKUP);
Luke Huang4eabbe32020-05-28 03:17:32 +08002479 fd2 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa,
Luke Huanga1d74182019-03-19 17:30:36 +08002480 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2481
2482 EXPECT_TRUE(fd1 != -1);
2483 EXPECT_TRUE(fd2 != -1);
2484
Luke Huang4eabbe32020-05-28 03:17:32 +08002485 expectAnswersValid(fd2, AF_INET6, "::1.2.3.5");
2486 expectAnswersValid(fd1, AF_INET6, "::1.2.3.5");
Luke Huanga1d74182019-03-19 17:30:36 +08002487
2488 // Skip cache, expect 2 queries
Luke Huang4eabbe32020-05-28 03:17:32 +08002489 EXPECT_EQ(2U, GetNumQueries(dns, host_name2));
Luke Huanga1d74182019-03-19 17:30:36 +08002490
2491 // Re-query without flags
Luke Huang4eabbe32020-05-28 03:17:32 +08002492 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa, 0);
2493 fd2 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa, 0);
Luke Huanga1d74182019-03-19 17:30:36 +08002494
2495 EXPECT_TRUE(fd1 != -1);
2496 EXPECT_TRUE(fd2 != -1);
2497
Luke Huang4eabbe32020-05-28 03:17:32 +08002498 expectAnswersValid(fd2, AF_INET6, "::1.2.3.5");
2499 expectAnswersValid(fd1, AF_INET6, "::1.2.3.5");
Luke Huanga1d74182019-03-19 17:30:36 +08002500
2501 // Cache hits, expect still 2 queries
Luke Huang4eabbe32020-05-28 03:17:32 +08002502 EXPECT_EQ(2U, GetNumQueries(dns, host_name2));
Luke Huang40f5f492019-05-09 19:37:35 +08002503
2504 // Test both ANDROID_RESOLV_NO_CACHE_STORE and ANDROID_RESOLV_NO_CACHE_LOOKUP are set
2505 dns.clearQueries();
2506
Luke Huang4eabbe32020-05-28 03:17:32 +08002507 // Make sure that the cache of "howdy.example3.com" exists.
2508 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang40f5f492019-05-09 19:37:35 +08002509 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002510 expectAnswersValid(fd1, AF_INET6, "::1.2.3.6");
2511 EXPECT_EQ(1U, GetNumQueries(dns, host_name3));
Luke Huang40f5f492019-05-09 19:37:35 +08002512
2513 // Re-query with testFlags
2514 const int testFlag = ANDROID_RESOLV_NO_CACHE_STORE | ANDROID_RESOLV_NO_CACHE_LOOKUP;
Luke Huang4eabbe32020-05-28 03:17:32 +08002515 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_aaaa, testFlag);
Luke Huang40f5f492019-05-09 19:37:35 +08002516 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002517 expectAnswersValid(fd1, AF_INET6, "::1.2.3.6");
Luke Huang40f5f492019-05-09 19:37:35 +08002518 // Expect cache lookup is skipped.
Luke Huang4eabbe32020-05-28 03:17:32 +08002519 EXPECT_EQ(2U, GetNumQueries(dns, host_name3));
Luke Huang40f5f492019-05-09 19:37:35 +08002520
2521 // Do another query with testFlags
Luke Huang4eabbe32020-05-28 03:17:32 +08002522 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_a, testFlag);
Luke Huang40f5f492019-05-09 19:37:35 +08002523 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002524 expectAnswersValid(fd1, AF_INET, "1.2.3.6");
Luke Huang40f5f492019-05-09 19:37:35 +08002525 // Expect cache lookup is skipped.
Luke Huang4eabbe32020-05-28 03:17:32 +08002526 EXPECT_EQ(3U, GetNumQueries(dns, host_name3));
Luke Huang40f5f492019-05-09 19:37:35 +08002527
2528 // Re-query with no flags
Luke Huang4eabbe32020-05-28 03:17:32 +08002529 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_a, 0);
Luke Huang40f5f492019-05-09 19:37:35 +08002530 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002531 expectAnswersValid(fd1, AF_INET, "1.2.3.6");
Luke Huang40f5f492019-05-09 19:37:35 +08002532 // Expect no cache hit because cache storing is also skipped in previous query.
Luke Huang4eabbe32020-05-28 03:17:32 +08002533 EXPECT_EQ(4U, GetNumQueries(dns, host_name3));
Luke Huangba7bef92018-12-26 16:53:03 +08002534}
2535
Luke Huang08b13d22020-02-05 14:46:21 +08002536TEST_F(ResolverTest, Async_NoCacheStoreFlagDoesNotRefreshStaleCacheEntry) {
2537 constexpr char listen_addr[] = "127.0.0.4";
2538 constexpr char host_name[] = "howdy.example.com.";
2539 const std::vector<DnsRecord> records = {
2540 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2541 };
2542
2543 test::DNSResponder dns(listen_addr);
2544 StartDns(dns, records);
2545 std::vector<std::string> servers = {listen_addr};
2546 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
2547
2548 const unsigned SHORT_TTL_SEC = 1;
2549 dns.setTtl(SHORT_TTL_SEC);
2550
2551 // Refer to b/148842821 for the purpose of below test steps.
2552 // Basically, this test is used to ensure stale cache case is handled
2553 // correctly with ANDROID_RESOLV_NO_CACHE_STORE.
2554 int fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2555 EXPECT_TRUE(fd != -1);
2556 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2557
2558 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2559 dns.clearQueries();
2560
2561 // Wait until cache expired
2562 sleep(SHORT_TTL_SEC + 0.5);
2563
2564 // Now request the same hostname again.
2565 // We should see a new DNS query because the entry in cache has become stale.
2566 // Due to ANDROID_RESOLV_NO_CACHE_STORE, this query must *not* refresh that stale entry.
2567 fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2568 ANDROID_RESOLV_NO_CACHE_STORE);
2569 EXPECT_TRUE(fd != -1);
2570 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2571 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2572 dns.clearQueries();
2573
2574 // If the cache is still stale, we expect to see one more DNS query
2575 // (this time the cache will be refreshed, but we're not checking for it).
2576 fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2577 EXPECT_TRUE(fd != -1);
2578 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2579 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2580}
2581
Luke Huangba7bef92018-12-26 16:53:03 +08002582TEST_F(ResolverTest, Async_NoRetryFlag) {
Luke Huang70931aa2019-01-31 11:57:41 +08002583 constexpr char listen_addr0[] = "127.0.0.4";
2584 constexpr char listen_addr1[] = "127.0.0.6";
Xiao Ma09b71022018-12-11 17:56:32 +09002585 constexpr char host_name[] = "howdy.example.com.";
2586 const std::vector<DnsRecord> records = {
2587 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2588 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2589 };
2590
Luke Huang70931aa2019-01-31 11:57:41 +08002591 test::DNSResponder dns0(listen_addr0);
2592 test::DNSResponder dns1(listen_addr1);
2593 StartDns(dns0, records);
2594 StartDns(dns1, records);
2595 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr0, listen_addr1}));
Luke Huangba7bef92018-12-26 16:53:03 +08002596
Luke Huang70931aa2019-01-31 11:57:41 +08002597 dns0.clearQueries();
2598 dns1.clearQueries();
2599
2600 dns0.setResponseProbability(0.0);
2601 dns1.setResponseProbability(0.0);
Luke Huangba7bef92018-12-26 16:53:03 +08002602
2603 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2604 ANDROID_RESOLV_NO_RETRY);
2605 EXPECT_TRUE(fd1 != -1);
2606
2607 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa,
2608 ANDROID_RESOLV_NO_RETRY);
2609 EXPECT_TRUE(fd2 != -1);
2610
2611 // expect no response
2612 expectAnswersNotValid(fd1, -ETIMEDOUT);
2613 expectAnswersNotValid(fd2, -ETIMEDOUT);
Mike Yu532405f2020-06-17 17:46:44 +08002614 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2615 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
Luke Huangba7bef92018-12-26 16:53:03 +08002616
Luke Huang70931aa2019-01-31 11:57:41 +08002617 // No retry case, expect total 2 queries. The server is selected randomly.
2618 EXPECT_EQ(2U, GetNumQueries(dns0, host_name) + GetNumQueries(dns1, host_name));
Luke Huangba7bef92018-12-26 16:53:03 +08002619
Luke Huang70931aa2019-01-31 11:57:41 +08002620 dns0.clearQueries();
2621 dns1.clearQueries();
Luke Huangba7bef92018-12-26 16:53:03 +08002622
2623 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2624 EXPECT_TRUE(fd1 != -1);
2625
2626 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
2627 EXPECT_TRUE(fd2 != -1);
2628
2629 // expect no response
2630 expectAnswersNotValid(fd1, -ETIMEDOUT);
2631 expectAnswersNotValid(fd2, -ETIMEDOUT);
Mike Yu532405f2020-06-17 17:46:44 +08002632 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2633 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
Luke Huangba7bef92018-12-26 16:53:03 +08002634
2635 // Retry case, expect 4 queries
Luke Huang70931aa2019-01-31 11:57:41 +08002636 EXPECT_EQ(4U, GetNumQueries(dns0, host_name));
2637 EXPECT_EQ(4U, GetNumQueries(dns1, host_name));
2638}
2639
2640TEST_F(ResolverTest, Async_VerifyQueryID) {
2641 constexpr char listen_addr[] = "127.0.0.4";
2642 constexpr char host_name[] = "howdy.example.com.";
2643 const std::vector<DnsRecord> records = {
2644 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2645 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2646 };
2647
2648 test::DNSResponder dns(listen_addr);
2649 StartDns(dns, records);
2650 std::vector<std::string> servers = {listen_addr};
2651 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
2652
2653 const uint8_t queryBuf1[] = {
2654 /* Header */
2655 0x55, 0x66, /* Transaction ID */
2656 0x01, 0x00, /* Flags */
2657 0x00, 0x01, /* Questions */
2658 0x00, 0x00, /* Answer RRs */
2659 0x00, 0x00, /* Authority RRs */
2660 0x00, 0x00, /* Additional RRs */
2661 /* Queries */
2662 0x05, 0x68, 0x6f, 0x77, 0x64, 0x79, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
2663 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name */
2664 0x00, 0x01, /* Type */
2665 0x00, 0x01 /* Class */
2666 };
2667
2668 int fd = resNetworkSend(TEST_NETID, queryBuf1, sizeof(queryBuf1), 0);
2669 EXPECT_TRUE(fd != -1);
2670
2671 uint8_t buf[MAXPACKET] = {};
2672 int rcode;
2673
2674 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2675 EXPECT_GT(res, 0);
2676 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2677
2678 auto hp = reinterpret_cast<HEADER*>(buf);
2679 EXPECT_EQ(21862U, htons(hp->id));
2680
2681 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2682
2683 const uint8_t queryBuf2[] = {
2684 /* Header */
2685 0x00, 0x53, /* Transaction ID */
2686 0x01, 0x00, /* Flags */
2687 0x00, 0x01, /* Questions */
2688 0x00, 0x00, /* Answer RRs */
2689 0x00, 0x00, /* Authority RRs */
2690 0x00, 0x00, /* Additional RRs */
2691 /* Queries */
2692 0x05, 0x68, 0x6f, 0x77, 0x64, 0x79, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
2693 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name */
2694 0x00, 0x01, /* Type */
2695 0x00, 0x01 /* Class */
2696 };
2697
2698 // Re-query verify cache works and query id is correct
2699 fd = resNetworkSend(TEST_NETID, queryBuf2, sizeof(queryBuf2), 0);
2700
2701 EXPECT_TRUE(fd != -1);
2702
2703 res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2704 EXPECT_GT(res, 0);
2705 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2706
2707 EXPECT_EQ(0x0053U, htons(hp->id));
2708
2709 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
Luke Huangba7bef92018-12-26 16:53:03 +08002710}
2711
Mike Yu4f3747b2018-12-02 17:54:29 +09002712// This test checks that the resolver should not generate the request containing OPT RR when using
Ken Chen0a015532019-01-02 14:59:38 +08002713// cleartext DNS. If we query the DNS server not supporting EDNS0 and it reponds with
2714// FORMERR_ON_EDNS, we will fallback to no EDNS0 and try again. If the server does no response, we
2715// won't retry so that we get no answer.
Mike Yu4f3747b2018-12-02 17:54:29 +09002716TEST_F(ResolverTest, BrokenEdns) {
2717 typedef test::DNSResponder::Edns Edns;
2718 enum ExpectResult { EXPECT_FAILURE, EXPECT_SUCCESS };
2719
Mike Yu3977d482020-02-26 17:18:57 +08002720 // Perform cleartext query in off mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002721 const char OFF[] = "off";
Mike Yu3977d482020-02-26 17:18:57 +08002722
2723 // Perform cleartext query when there's no private DNS server validated in opportunistic mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002724 const char OPPORTUNISTIC_UDP[] = "opportunistic_udp";
Mike Yu3977d482020-02-26 17:18:57 +08002725
2726 // Perform cleartext query when there is a private DNS server validated in opportunistic mode.
2727 const char OPPORTUNISTIC_FALLBACK_UDP[] = "opportunistic_fallback_udp";
2728
2729 // Perform cyphertext query in opportunistic mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002730 const char OPPORTUNISTIC_TLS[] = "opportunistic_tls";
Mike Yu3977d482020-02-26 17:18:57 +08002731
2732 // Perform cyphertext query in strict mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002733 const char STRICT[] = "strict";
Mike Yu3977d482020-02-26 17:18:57 +08002734
Mike Yu4f3747b2018-12-02 17:54:29 +09002735 const char GETHOSTBYNAME[] = "gethostbyname";
2736 const char GETADDRINFO[] = "getaddrinfo";
Mike Yu4f3747b2018-12-02 17:54:29 +09002737 const char ADDR4[] = "192.0.2.1";
2738 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2739 const char CLEARTEXT_PORT[] = "53";
2740 const char TLS_PORT[] = "853";
Luke Huangf8215372019-11-22 11:53:41 +08002741 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
Mike Yu3977d482020-02-26 17:18:57 +08002742 ResolverParamsParcel paramsForCleanup = DnsResponderClient::GetDefaultResolverParamsParcel();
2743 paramsForCleanup.servers.clear();
2744 paramsForCleanup.tlsServers.clear();
Mike Yu4f3747b2018-12-02 17:54:29 +09002745
Mike Yufc125e42019-05-15 20:41:28 +08002746 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Mike Yu4f3747b2018-12-02 17:54:29 +09002747 ASSERT_TRUE(dns.startServer());
2748
2749 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2750
Luke Huangf8215372019-11-22 11:53:41 +08002751 // clang-format off
Mike Yu4f3747b2018-12-02 17:54:29 +09002752 static const struct TestConfig {
2753 std::string mode;
2754 std::string method;
2755 Edns edns;
2756 ExpectResult expectResult;
2757
2758 std::string asHostName() const {
2759 const char* ednsString;
2760 switch (edns) {
2761 case Edns::ON:
2762 ednsString = "ednsOn";
2763 break;
Ken Chen0a015532019-01-02 14:59:38 +08002764 case Edns::FORMERR_ON_EDNS:
Mike Yu4f3747b2018-12-02 17:54:29 +09002765 ednsString = "ednsFormerr";
2766 break;
2767 case Edns::DROP:
2768 ednsString = "ednsDrop";
2769 break;
2770 default:
2771 ednsString = "";
2772 break;
2773 }
2774 return StringPrintf("%s.%s.%s.", mode.c_str(), method.c_str(), ednsString);
2775 }
2776 } testConfigs[] = {
Mike Yu3977d482020-02-26 17:18:57 +08002777 // In OPPORTUNISTIC_TLS, if the DNS server doesn't support EDNS0 but TLS, the lookup
2778 // fails. Could such server exist? if so, we might need to fix it to fallback to
2779 // cleartext query. If the server still make no response for the queries with EDNS0, we
2780 // might also need to fix it to retry without EDNS0.
Mike Yu4f3747b2018-12-02 17:54:29 +09002781 // Another thing is that {OPPORTUNISTIC_TLS, Edns::DROP} and {STRICT, Edns::DROP} are
2782 // commented out since TLS timeout is not configurable.
2783 // TODO: Uncomment them after TLS timeout is configurable.
Mike Yu3977d482020-02-26 17:18:57 +08002784 {OFF, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2785 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2786 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2787 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2788 {STRICT, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2789 {OFF, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2790 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2791 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2792 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2793 {STRICT, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2794 {OFF, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2795 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2796
2797 // The failure is due to no retry on timeout. Maybe fix it?
2798 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2799
2800 //{OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2801 //{STRICT, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2802 {OFF, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2803 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2804 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2805 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2806 {STRICT, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2807 {OFF, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2808 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2809 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2810 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2811 {STRICT, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2812 {OFF, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2813 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2814
2815 // The failure is due to no retry on timeout. Maybe fix it?
2816 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2817
Mike Yu4f3747b2018-12-02 17:54:29 +09002818 //{OPPORTUNISTIC_TLS, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2819 //{STRICT, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2820 };
Luke Huangf8215372019-11-22 11:53:41 +08002821 // clang-format on
Mike Yu4f3747b2018-12-02 17:54:29 +09002822
2823 for (const auto& config : testConfigs) {
2824 const std::string testHostName = config.asHostName();
2825 SCOPED_TRACE(testHostName);
2826
2827 const char* host_name = testHostName.c_str();
2828 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
2829 dns.setEdns(config.edns);
2830
2831 if (config.mode == OFF) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002832 if (tls.running()) {
2833 ASSERT_TRUE(tls.stopServer());
2834 }
Xiao Ma09b71022018-12-11 17:56:32 +09002835 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Mike Yu4f3747b2018-12-02 17:54:29 +09002836 } else if (config.mode == OPPORTUNISTIC_UDP) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002837 if (tls.running()) {
2838 ASSERT_TRUE(tls.stopServer());
2839 }
Xiao Ma09b71022018-12-11 17:56:32 +09002840 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002841 kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002842 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), false));
Mike Yu3977d482020-02-26 17:18:57 +08002843 } else if (config.mode == OPPORTUNISTIC_TLS || config.mode == OPPORTUNISTIC_FALLBACK_UDP) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002844 if (!tls.running()) {
2845 ASSERT_TRUE(tls.startServer());
2846 }
Xiao Ma09b71022018-12-11 17:56:32 +09002847 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002848 kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002849 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Mike Yu3977d482020-02-26 17:18:57 +08002850
2851 if (config.mode == OPPORTUNISTIC_FALLBACK_UDP) {
2852 // Force the resolver to fallback to cleartext queries.
2853 ASSERT_TRUE(tls.stopServer());
2854 }
Mike Yu4f3747b2018-12-02 17:54:29 +09002855 } else if (config.mode == STRICT) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002856 if (!tls.running()) {
2857 ASSERT_TRUE(tls.startServer());
2858 }
Xiao Ma09b71022018-12-11 17:56:32 +09002859 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002860 kDefaultParams, kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08002861 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Mike Yu4f3747b2018-12-02 17:54:29 +09002862 }
2863
2864 if (config.method == GETHOSTBYNAME) {
2865 const hostent* h_result = gethostbyname(host_name);
2866 if (config.expectResult == EXPECT_SUCCESS) {
2867 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2868 ASSERT_TRUE(h_result != nullptr);
2869 ASSERT_EQ(4, h_result->h_length);
2870 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
2871 EXPECT_EQ(ADDR4, ToString(h_result));
2872 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
Mike Yu532405f2020-06-17 17:46:44 +08002873 ExpectDnsEvent(INetdEventListener::EVENT_GETHOSTBYNAME, 0, host_name, {ADDR4});
Mike Yu4f3747b2018-12-02 17:54:29 +09002874 } else {
2875 EXPECT_EQ(0U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
2876 ASSERT_TRUE(h_result == nullptr);
2877 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
Mike Yu532405f2020-06-17 17:46:44 +08002878 int returnCode = (config.edns == Edns::DROP) ? RCODE_TIMEOUT : EAI_FAIL;
2879 ExpectDnsEvent(INetdEventListener::EVENT_GETHOSTBYNAME, returnCode, host_name, {});
Mike Yu4f3747b2018-12-02 17:54:29 +09002880 }
2881 } else if (config.method == GETADDRINFO) {
2882 ScopedAddrinfo ai_result;
2883 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2884 ai_result = safe_getaddrinfo(host_name, nullptr, &hints);
2885 if (config.expectResult == EXPECT_SUCCESS) {
2886 EXPECT_TRUE(ai_result != nullptr);
2887 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2888 const std::string result_str = ToString(ai_result);
2889 EXPECT_EQ(ADDR4, result_str);
Mike Yu532405f2020-06-17 17:46:44 +08002890 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, 0, host_name, {ADDR4});
Mike Yu4f3747b2018-12-02 17:54:29 +09002891 } else {
2892 EXPECT_TRUE(ai_result == nullptr);
2893 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
Mike Yu532405f2020-06-17 17:46:44 +08002894 int returnCode = (config.edns == Edns::DROP) ? RCODE_TIMEOUT : EAI_FAIL;
2895 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, returnCode, host_name, {});
Mike Yu4f3747b2018-12-02 17:54:29 +09002896 }
2897 } else {
2898 FAIL() << "Unsupported query method: " << config.method;
2899 }
2900
Mike Yudd4ac2d2019-05-31 16:52:11 +08002901 tls.clearQueries();
Mike Yu4f3747b2018-12-02 17:54:29 +09002902 dns.clearQueries();
Mike Yu3977d482020-02-26 17:18:57 +08002903
2904 // Clear the setup to force the resolver to validate private DNS servers in every test.
2905 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(paramsForCleanup));
Mike Yu4f3747b2018-12-02 17:54:29 +09002906 }
Mike Yu4f3747b2018-12-02 17:54:29 +09002907}
nuccachena26cc2a2018-07-17 18:07:23 +08002908
Ken Chen0a015532019-01-02 14:59:38 +08002909// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2910// Resolver should have a reasonable number of retries instead of spinning forever. We don't have
2911// an efficient way to know if resolver is stuck in an infinite loop. However, test case will be
2912// failed due to timeout.
2913TEST_F(ResolverTest, UnstableTls) {
2914 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2915 const char CLEARTEXT_PORT[] = "53";
2916 const char TLS_PORT[] = "853";
2917 const char* host_name1 = "nonexistent1.example.com.";
2918 const char* host_name2 = "nonexistent2.example.com.";
2919 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
2920
Mike Yufc125e42019-05-15 20:41:28 +08002921 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Ken Chen0a015532019-01-02 14:59:38 +08002922 ASSERT_TRUE(dns.startServer());
2923 dns.setEdns(test::DNSResponder::Edns::FORMERR_ON_EDNS);
2924 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2925 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08002926 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002927 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
2928
Ken Chen0a015532019-01-02 14:59:38 +08002929 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
2930 tls.stopServer();
2931
2932 const hostent* h_result = gethostbyname(host_name1);
2933 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
2934 ASSERT_TRUE(h_result == nullptr);
2935 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2936
2937 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2938 ScopedAddrinfo ai_result = safe_getaddrinfo(host_name2, nullptr, &hints);
2939 EXPECT_TRUE(ai_result == nullptr);
2940 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
2941}
2942
2943// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2944// Moreover, server responds RCODE=FORMERR even on non-EDNS query.
2945TEST_F(ResolverTest, BogusDnsServer) {
2946 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2947 const char CLEARTEXT_PORT[] = "53";
2948 const char TLS_PORT[] = "853";
2949 const char* host_name1 = "nonexistent1.example.com.";
2950 const char* host_name2 = "nonexistent2.example.com.";
2951 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
2952
Mike Yufc125e42019-05-15 20:41:28 +08002953 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Ken Chen0a015532019-01-02 14:59:38 +08002954 ASSERT_TRUE(dns.startServer());
2955 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2956 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08002957 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002958 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
2959
Ken Chen0a015532019-01-02 14:59:38 +08002960 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
2961 tls.stopServer();
2962 dns.setEdns(test::DNSResponder::Edns::FORMERR_UNCOND);
2963
2964 const hostent* h_result = gethostbyname(host_name1);
2965 EXPECT_EQ(0U, GetNumQueries(dns, host_name1));
2966 ASSERT_TRUE(h_result == nullptr);
2967 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2968
2969 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2970 ScopedAddrinfo ai_result = safe_getaddrinfo(host_name2, nullptr, &hints);
2971 EXPECT_TRUE(ai_result == nullptr);
2972 EXPECT_EQ(0U, GetNumQueries(dns, host_name2));
2973}
2974
nuccachena26cc2a2018-07-17 18:07:23 +08002975TEST_F(ResolverTest, GetAddrInfo_Dns64Synthesize) {
2976 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002977 constexpr char dns64_name[] = "ipv4only.arpa.";
2978 constexpr char host_name[] = "v4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002979 const std::vector<DnsRecord> records = {
2980 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2981 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2982 };
nuccachena26cc2a2018-07-17 18:07:23 +08002983
Xiao Ma09b71022018-12-11 17:56:32 +09002984 test::DNSResponder dns(listen_addr);
Xiao Ma09b71022018-12-11 17:56:32 +09002985 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002986
2987 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002988 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002989
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002990 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002991 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002992 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002993
2994 // hints are necessary in order to let netd know which type of addresses the caller is
2995 // interested in.
Xiao Ma09b71022018-12-11 17:56:32 +09002996 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08002997 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
2998 EXPECT_TRUE(result != nullptr);
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002999 // TODO: BUG: there should only be two queries, one AAAA (which returns no records) and one A
3000 // (which returns 1.2.3.4). But there is an extra AAAA.
3001 EXPECT_EQ(3U, GetNumQueries(dns, host_name));
nuccachena26cc2a2018-07-17 18:07:23 +08003002
3003 std::string result_str = ToString(result);
3004 EXPECT_EQ(result_str, "64:ff9b::102:304");
3005
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003006 // Stopping NAT64 prefix discovery disables synthesis.
Luke Huang5bd827c2019-03-14 16:10:04 +08003007 EXPECT_TRUE(mDnsClient.resolvService()->stopPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003008 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_NOT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003009
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003010 dns.clearQueries();
nuccachena26cc2a2018-07-17 18:07:23 +08003011
3012 result = safe_getaddrinfo("v4only", nullptr, &hints);
3013 EXPECT_TRUE(result != nullptr);
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003014 // TODO: BUG: there should only be one query, an AAAA (which returns no records), because the
3015 // A is already cached. But there is an extra AAAA.
3016 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
nuccachena26cc2a2018-07-17 18:07:23 +08003017
3018 result_str = ToString(result);
3019 EXPECT_EQ(result_str, "1.2.3.4");
3020}
3021
nuccachena26cc2a2018-07-17 18:07:23 +08003022TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecified) {
3023 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003024 constexpr char dns64_name[] = "ipv4only.arpa.";
3025 constexpr char host_name[] = "v4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003026 const std::vector<DnsRecord> records = {
3027 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3028 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3029 };
nuccachena26cc2a2018-07-17 18:07:23 +08003030
Xiao Ma09b71022018-12-11 17:56:32 +09003031 test::DNSResponder dns(listen_addr);
3032 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003033 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003034 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003035
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003036 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003037 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003038 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003039
3040 // Ensure to synthesize AAAA if AF_INET6 is specified, and not to synthesize AAAA
3041 // in AF_INET case.
3042 addrinfo hints;
3043 memset(&hints, 0, sizeof(hints));
3044 hints.ai_family = AF_INET6;
3045 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
3046 EXPECT_TRUE(result != nullptr);
3047 std::string result_str = ToString(result);
3048 EXPECT_EQ(result_str, "64:ff9b::102:304");
3049
3050 hints.ai_family = AF_INET;
3051 result = safe_getaddrinfo("v4only", nullptr, &hints);
3052 EXPECT_TRUE(result != nullptr);
3053 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3054 result_str = ToString(result);
3055 EXPECT_EQ(result_str, "1.2.3.4");
3056}
nuccachena26cc2a2018-07-17 18:07:23 +08003057
3058TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedV6) {
3059 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003060 constexpr char dns64_name[] = "ipv4only.arpa.";
3061 constexpr char host_name[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003062 const std::vector<DnsRecord> records = {
3063 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3064 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3065 {host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
3066 };
nuccachena26cc2a2018-07-17 18:07:23 +08003067
Xiao Ma09b71022018-12-11 17:56:32 +09003068 test::DNSResponder dns(listen_addr);
3069 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003070 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003071 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003072
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003073 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003074 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003075 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003076
Xiao Ma09b71022018-12-11 17:56:32 +09003077 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08003078 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
3079 EXPECT_TRUE(result != nullptr);
3080 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3081
3082 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
Xiao Ma09b71022018-12-11 17:56:32 +09003083 const std::vector<std::string> result_strs = ToStrings(result);
nuccachena26cc2a2018-07-17 18:07:23 +08003084 for (const auto& str : result_strs) {
3085 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
3086 << ", result_str='" << str << "'";
3087 }
3088}
3089
3090TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedNoV6) {
3091 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003092 constexpr char dns64_name[] = "ipv4only.arpa.";
3093 constexpr char host_name[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003094 const std::vector<DnsRecord> records = {
3095 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3096 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3097 };
nuccachena26cc2a2018-07-17 18:07:23 +08003098
Xiao Ma09b71022018-12-11 17:56:32 +09003099 test::DNSResponder dns(listen_addr);
3100 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003101 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003102 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003103
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003104 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003105 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003106 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003107
Xiao Ma09b71022018-12-11 17:56:32 +09003108 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08003109 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
3110 EXPECT_TRUE(result != nullptr);
3111 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3112
3113 // In AF_UNSPEC case, synthesize AAAA if there's no AAAA answer.
3114 std::string result_str = ToString(result);
3115 EXPECT_EQ(result_str, "64:ff9b::102:304");
3116}
3117
3118TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecialUseIPv4Addresses) {
3119 constexpr char THIS_NETWORK[] = "this_network";
3120 constexpr char LOOPBACK[] = "loopback";
3121 constexpr char LINK_LOCAL[] = "link_local";
3122 constexpr char MULTICAST[] = "multicast";
3123 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
3124
3125 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
3126 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
3127 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
3128 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
3129 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
3130
3131 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003132 constexpr char dns64_name[] = "ipv4only.arpa.";
3133
Xiao Ma09b71022018-12-11 17:56:32 +09003134 test::DNSResponder dns(listen_addr);
3135 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003136 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003137 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003138
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003139 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003140 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003141 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003142
Luke Huangf8215372019-11-22 11:53:41 +08003143 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003144 static const struct TestConfig {
3145 std::string name;
3146 std::string addr;
3147
3148 std::string asHostName() const { return StringPrintf("%s.example.com.", name.c_str()); }
3149 } testConfigs[]{
3150 {THIS_NETWORK, ADDR_THIS_NETWORK},
3151 {LOOPBACK, ADDR_LOOPBACK},
3152 {LINK_LOCAL, ADDR_LINK_LOCAL},
3153 {MULTICAST, ADDR_MULTICAST},
3154 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
3155 };
Luke Huangf8215372019-11-22 11:53:41 +08003156 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003157
3158 for (const auto& config : testConfigs) {
3159 const std::string testHostName = config.asHostName();
3160 SCOPED_TRACE(testHostName);
3161
3162 const char* host_name = testHostName.c_str();
3163 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
3164
3165 addrinfo hints;
3166 memset(&hints, 0, sizeof(hints));
3167 hints.ai_family = AF_INET6;
3168 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
3169 // In AF_INET6 case, don't return IPv4 answers
3170 EXPECT_TRUE(result == nullptr);
3171 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3172 dns.clearQueries();
3173
3174 memset(&hints, 0, sizeof(hints));
3175 hints.ai_family = AF_UNSPEC;
3176 result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
3177 EXPECT_TRUE(result != nullptr);
3178 // Expect IPv6 query only. IPv4 answer has been cached in previous query.
3179 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3180 // In AF_UNSPEC case, don't synthesize special use IPv4 address.
3181 std::string result_str = ToString(result);
3182 EXPECT_EQ(result_str, config.addr.c_str());
3183 dns.clearQueries();
3184 }
3185}
3186
3187TEST_F(ResolverTest, GetAddrInfo_Dns64QueryWithNullArgumentHints) {
3188 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003189 constexpr char dns64_name[] = "ipv4only.arpa.";
3190 constexpr char host_name[] = "v4only.example.com.";
3191 constexpr char host_name2[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003192 const std::vector<DnsRecord> records = {
3193 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3194 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3195 {host_name2, ns_type::ns_t_a, "1.2.3.4"},
3196 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
3197 };
nuccachena26cc2a2018-07-17 18:07:23 +08003198
Xiao Ma09b71022018-12-11 17:56:32 +09003199 test::DNSResponder dns(listen_addr);
3200 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003201 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003202 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003203
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003204 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003205 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003206 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003207
3208 // Assign argument hints of getaddrinfo() as null is equivalent to set ai_family AF_UNSPEC.
3209 // In AF_UNSPEC case, synthesize AAAA if there has A answer only.
3210 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, nullptr);
3211 EXPECT_TRUE(result != nullptr);
3212 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3213 std::string result_str = ToString(result);
3214 EXPECT_EQ(result_str, "64:ff9b::102:304");
3215 dns.clearQueries();
3216
3217 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
3218 result = safe_getaddrinfo("v4v6", nullptr, nullptr);
3219 EXPECT_TRUE(result != nullptr);
3220 EXPECT_LE(2U, GetNumQueries(dns, host_name2));
3221 std::vector<std::string> result_strs = ToStrings(result);
3222 for (const auto& str : result_strs) {
3223 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
3224 << ", result_str='" << str << "'";
3225 }
3226}
3227
3228TEST_F(ResolverTest, GetAddrInfo_Dns64QueryNullArgumentNode) {
3229 constexpr char ADDR_ANYADDR_V4[] = "0.0.0.0";
3230 constexpr char ADDR_ANYADDR_V6[] = "::";
3231 constexpr char ADDR_LOCALHOST_V4[] = "127.0.0.1";
3232 constexpr char ADDR_LOCALHOST_V6[] = "::1";
3233
3234 constexpr char PORT_NAME_HTTP[] = "http";
3235 constexpr char PORT_NUMBER_HTTP[] = "80";
3236
3237 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003238 constexpr char dns64_name[] = "ipv4only.arpa.";
3239
Xiao Ma09b71022018-12-11 17:56:32 +09003240 test::DNSResponder dns(listen_addr);
3241 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003242 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003243 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003244
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003245 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003246 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003247 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003248
Luke Huangf8215372019-11-22 11:53:41 +08003249 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003250 // If node is null, return address is listed by libc/getaddrinfo.c as follows.
3251 // - passive socket -> anyaddr (0.0.0.0 or ::)
3252 // - non-passive socket -> localhost (127.0.0.1 or ::1)
3253 static const struct TestConfig {
3254 int flag;
3255 std::string addr_v4;
3256 std::string addr_v6;
3257
3258 std::string asParameters() const {
3259 return StringPrintf("flag=%d, addr_v4=%s, addr_v6=%s", flag, addr_v4.c_str(),
3260 addr_v6.c_str());
3261 }
3262 } testConfigs[]{
3263 {0 /* non-passive */, ADDR_LOCALHOST_V4, ADDR_LOCALHOST_V6},
3264 {AI_PASSIVE, ADDR_ANYADDR_V4, ADDR_ANYADDR_V6}
3265 };
Luke Huangf8215372019-11-22 11:53:41 +08003266 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003267
3268 for (const auto& config : testConfigs) {
3269 SCOPED_TRACE(config.asParameters());
3270
Xiao Ma09b71022018-12-11 17:56:32 +09003271 addrinfo hints = {
Nick Desaulnierscd6395a2019-10-11 09:15:24 -07003272 .ai_flags = config.flag,
Xiao Ma09b71022018-12-11 17:56:32 +09003273 .ai_family = AF_UNSPEC, // any address family
3274 .ai_socktype = 0, // any type
3275 .ai_protocol = 0, // any protocol
Xiao Ma09b71022018-12-11 17:56:32 +09003276 };
nuccachena26cc2a2018-07-17 18:07:23 +08003277
3278 // Assign hostname as null and service as port name.
3279 ScopedAddrinfo result = safe_getaddrinfo(nullptr, PORT_NAME_HTTP, &hints);
3280 ASSERT_TRUE(result != nullptr);
3281
3282 // Can't be synthesized because it should not get into Netd.
3283 std::vector<std::string> result_strs = ToStrings(result);
3284 for (const auto& str : result_strs) {
3285 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
3286 << ", result_str='" << str << "'";
3287 }
3288
3289 // Assign hostname as null and service as numeric port number.
3290 hints.ai_flags = config.flag | AI_NUMERICSERV;
3291 result = safe_getaddrinfo(nullptr, PORT_NUMBER_HTTP, &hints);
3292 ASSERT_TRUE(result != nullptr);
3293
3294 // Can't be synthesized because it should not get into Netd.
3295 result_strs = ToStrings(result);
3296 for (const auto& str : result_strs) {
3297 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
3298 << ", result_str='" << str << "'";
3299 }
3300 }
3301}
3302
3303TEST_F(ResolverTest, GetHostByAddr_ReverseDnsQueryWithHavingNat64Prefix) {
3304 struct hostent* result = nullptr;
3305 struct in_addr v4addr;
3306 struct in6_addr v6addr;
3307
3308 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003309 constexpr char dns64_name[] = "ipv4only.arpa.";
3310 constexpr char ptr_name[] = "v4v6.example.com.";
3311 // PTR record for IPv4 address 1.2.3.4
3312 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3313 // PTR record for IPv6 address 2001:db8::102:304
3314 constexpr char ptr_addr_v6[] =
3315 "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 +09003316 const std::vector<DnsRecord> records = {
3317 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3318 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3319 {ptr_addr_v6, ns_type::ns_t_ptr, ptr_name},
3320 };
nuccachena26cc2a2018-07-17 18:07:23 +08003321
Xiao Ma09b71022018-12-11 17:56:32 +09003322 test::DNSResponder dns(listen_addr);
3323 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003324 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003325 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003326
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003327 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003328 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003329 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003330
3331 // Reverse IPv4 DNS query. Prefix should have no effect on it.
3332 inet_pton(AF_INET, "1.2.3.4", &v4addr);
3333 result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
3334 ASSERT_TRUE(result != nullptr);
3335 std::string result_str = result->h_name ? result->h_name : "null";
3336 EXPECT_EQ(result_str, "v4v6.example.com");
3337
3338 // Reverse IPv6 DNS query. Prefix should have no effect on it.
3339 inet_pton(AF_INET6, "2001:db8::102:304", &v6addr);
3340 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3341 ASSERT_TRUE(result != nullptr);
3342 result_str = result->h_name ? result->h_name : "null";
3343 EXPECT_EQ(result_str, "v4v6.example.com");
3344}
3345
3346TEST_F(ResolverTest, GetHostByAddr_ReverseDns64Query) {
3347 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003348 constexpr char dns64_name[] = "ipv4only.arpa.";
3349 constexpr char ptr_name[] = "v4only.example.com.";
3350 // PTR record for IPv4 address 1.2.3.4
3351 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3352 // PTR record for IPv6 address 64:ff9b::1.2.3.4
3353 constexpr char ptr_addr_v6_nomapping[] =
3354 "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.";
3355 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
3356 // PTR record for IPv6 address 64:ff9b::5.6.7.8
3357 constexpr char ptr_addr_v6_synthesis[] =
3358 "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 +09003359 const std::vector<DnsRecord> records = {
3360 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3361 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3362 {ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis},
3363 };
nuccachena26cc2a2018-07-17 18:07:23 +08003364
Xiao Ma09b71022018-12-11 17:56:32 +09003365 test::DNSResponder dns(listen_addr);
3366 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003367 // "ptr_addr_v6_nomapping" is not mapped in DNS server
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 // Synthesized PTR record doesn't exist on DNS server
3376 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
3377 // After querying synthesized address failed, expect that prefix is removed from IPv6
3378 // synthesized address and do reverse IPv4 query instead.
3379 struct in6_addr v6addr;
3380 inet_pton(AF_INET6, "64:ff9b::1.2.3.4", &v6addr);
3381 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3382 ASSERT_TRUE(result != nullptr);
3383 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist
3384 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist
3385 std::string result_str = result->h_name ? result->h_name : "null";
3386 EXPECT_EQ(result_str, "v4only.example.com");
3387 // Check that return address has been mapped from IPv4 to IPv6 address because Netd
3388 // removes NAT64 prefix and does IPv4 DNS reverse lookup in this case. Then, Netd
3389 // fakes the return IPv4 address as original queried IPv6 address.
3390 result_str = ToString(result);
3391 EXPECT_EQ(result_str, "64:ff9b::102:304");
3392 dns.clearQueries();
3393
3394 // Synthesized PTR record exists on DNS server
3395 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
3396 // Expect to Netd pass through synthesized address for DNS queries.
3397 inet_pton(AF_INET6, "64:ff9b::5.6.7.8", &v6addr);
3398 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3399 ASSERT_TRUE(result != nullptr);
3400 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
3401 result_str = result->h_name ? result->h_name : "null";
3402 EXPECT_EQ(result_str, "v6synthesis.example.com");
3403}
3404
3405TEST_F(ResolverTest, GetHostByAddr_ReverseDns64QueryFromHostFile) {
3406 constexpr char dns64_name[] = "ipv4only.arpa.";
3407 constexpr char host_name[] = "localhost";
3408 // The address is synthesized by prefix64:localhost.
3409 constexpr char host_addr[] = "64:ff9b::7f00:1";
nuccachena26cc2a2018-07-17 18:07:23 +08003410 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003411
3412 test::DNSResponder dns(listen_addr);
3413 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003414 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003415 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003416
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003417 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003418 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003419 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003420
3421 // Using synthesized "localhost" address to be a trick for resolving host name
3422 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
3423 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
3424 struct in6_addr v6addr;
3425 inet_pton(AF_INET6, host_addr, &v6addr);
3426 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3427 ASSERT_TRUE(result != nullptr);
3428 // Expect no DNS queries; localhost is resolved via /etc/hosts.
3429 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
3430
Luke Huangf8215372019-11-22 11:53:41 +08003431 ASSERT_EQ(sizeof(in6_addr), (unsigned)result->h_length);
nuccachena26cc2a2018-07-17 18:07:23 +08003432 ASSERT_EQ(AF_INET6, result->h_addrtype);
3433 std::string result_str = ToString(result);
3434 EXPECT_EQ(result_str, host_addr);
3435 result_str = result->h_name ? result->h_name : "null";
3436 EXPECT_EQ(result_str, host_name);
3437}
3438
Hungming Chen9e6185a2019-06-04 16:09:19 +08003439TEST_F(ResolverTest, GetHostByAddr_cnamesClasslessReverseDelegation) {
3440 // IPv4 addresses in the subnet with notation '/' or '-'.
3441 constexpr char addr_slash[] = "192.0.2.1";
3442 constexpr char addr_hyphen[] = "192.0.3.1";
3443
3444 // Used to verify DNS reverse query for classless reverse lookup zone. See detail in RFC 2317
3445 // section 4.
3446 const static std::vector<DnsRecord> records = {
3447 // The records for reverse querying "192.0.2.1" in the subnet with notation '/'.
3448 {"1.2.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0/25.2.0.192.in-addr.arpa."},
3449 {"1.0/25.2.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3450
3451 // The records for reverse querying "192.0.3.1" in the subnet with notation '-'.
3452 {"1.3.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0-127.3.0.192.in-addr.arpa."},
3453 {"1.0-127.3.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3454 };
3455
3456 test::DNSResponder dns;
3457 StartDns(dns, records);
3458 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3459
3460 for (const auto& address : {addr_slash, addr_hyphen}) {
3461 SCOPED_TRACE(address);
3462
3463 in_addr v4addr;
3464 ASSERT_TRUE(inet_pton(AF_INET, address, &v4addr));
3465 hostent* result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
3466 ASSERT_TRUE(result != nullptr);
3467 EXPECT_STREQ("hello.example.com", result->h_name);
3468 }
3469}
3470
nuccachena26cc2a2018-07-17 18:07:23 +08003471TEST_F(ResolverTest, GetNameInfo_ReverseDnsQueryWithHavingNat64Prefix) {
3472 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003473 constexpr char dns64_name[] = "ipv4only.arpa.";
3474 constexpr char ptr_name[] = "v4v6.example.com.";
3475 // PTR record for IPv4 address 1.2.3.4
3476 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3477 // PTR record for IPv6 address 2001:db8::102:304
3478 constexpr char ptr_addr_v6[] =
3479 "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 +09003480 const std::vector<DnsRecord> records = {
3481 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3482 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3483 {ptr_addr_v6, ns_type::ns_t_ptr, ptr_name},
3484 };
nuccachena26cc2a2018-07-17 18:07:23 +08003485
Xiao Ma09b71022018-12-11 17:56:32 +09003486 test::DNSResponder dns(listen_addr);
3487 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003488 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003489 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003490
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003491 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003492 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003493 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003494
Luke Huangf8215372019-11-22 11:53:41 +08003495 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003496 static const struct TestConfig {
3497 int flag;
3498 int family;
3499 std::string addr;
3500 std::string host;
3501
3502 std::string asParameters() const {
3503 return StringPrintf("flag=%d, family=%d, addr=%s, host=%s", flag, family, addr.c_str(),
3504 host.c_str());
3505 }
3506 } testConfigs[]{
3507 {NI_NAMEREQD, AF_INET, "1.2.3.4", "v4v6.example.com"},
3508 {NI_NUMERICHOST, AF_INET, "1.2.3.4", "1.2.3.4"},
3509 {0, AF_INET, "1.2.3.4", "v4v6.example.com"},
3510 {0, AF_INET, "5.6.7.8", "5.6.7.8"}, // unmapped
3511 {NI_NAMEREQD, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
3512 {NI_NUMERICHOST, AF_INET6, "2001:db8::102:304", "2001:db8::102:304"},
3513 {0, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
3514 {0, AF_INET6, "2001:db8::506:708", "2001:db8::506:708"}, // unmapped
3515 };
Luke Huangf8215372019-11-22 11:53:41 +08003516 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003517
3518 // Reverse IPv4/IPv6 DNS query. Prefix should have no effect on it.
3519 for (const auto& config : testConfigs) {
3520 SCOPED_TRACE(config.asParameters());
3521
3522 int rv;
3523 char host[NI_MAXHOST];
3524 struct sockaddr_in sin;
3525 struct sockaddr_in6 sin6;
3526 if (config.family == AF_INET) {
3527 memset(&sin, 0, sizeof(sin));
3528 sin.sin_family = AF_INET;
3529 inet_pton(AF_INET, config.addr.c_str(), &sin.sin_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003530 rv = getnameinfo((const struct sockaddr*)&sin, sizeof(sin), host, sizeof(host), nullptr,
3531 0, config.flag);
nuccachena26cc2a2018-07-17 18:07:23 +08003532 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4));
3533 } else if (config.family == AF_INET6) {
3534 memset(&sin6, 0, sizeof(sin6));
3535 sin6.sin6_family = AF_INET6;
3536 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003537 rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host),
nuccachena26cc2a2018-07-17 18:07:23 +08003538 nullptr, 0, config.flag);
3539 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6));
3540 }
3541 ASSERT_EQ(0, rv);
3542 std::string result_str = host;
3543 EXPECT_EQ(result_str, config.host);
3544 dns.clearQueries();
3545 }
3546}
3547
3548TEST_F(ResolverTest, GetNameInfo_ReverseDns64Query) {
3549 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003550 constexpr char dns64_name[] = "ipv4only.arpa.";
3551 constexpr char ptr_name[] = "v4only.example.com.";
3552 // PTR record for IPv4 address 1.2.3.4
3553 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3554 // PTR record for IPv6 address 64:ff9b::1.2.3.4
3555 constexpr char ptr_addr_v6_nomapping[] =
3556 "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.";
3557 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
3558 // PTR record for IPv6 address 64:ff9b::5.6.7.8
3559 constexpr char ptr_addr_v6_synthesis[] =
3560 "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 +09003561 const std::vector<DnsRecord> records = {
3562 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3563 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3564 {ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis},
3565 };
nuccachena26cc2a2018-07-17 18:07:23 +08003566
Xiao Ma09b71022018-12-11 17:56:32 +09003567 test::DNSResponder dns(listen_addr);
3568 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003569 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003570 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003571
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003572 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003573 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003574 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003575
Luke Huangf8215372019-11-22 11:53:41 +08003576 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003577 static const struct TestConfig {
3578 bool hasSynthesizedPtrRecord;
3579 int flag;
3580 std::string addr;
3581 std::string host;
3582
3583 std::string asParameters() const {
3584 return StringPrintf("hasSynthesizedPtrRecord=%d, flag=%d, addr=%s, host=%s",
3585 hasSynthesizedPtrRecord, flag, addr.c_str(), host.c_str());
3586 }
3587 } testConfigs[]{
3588 {false, NI_NAMEREQD, "64:ff9b::102:304", "v4only.example.com"},
3589 {false, NI_NUMERICHOST, "64:ff9b::102:304", "64:ff9b::102:304"},
3590 {false, 0, "64:ff9b::102:304", "v4only.example.com"},
3591 {true, NI_NAMEREQD, "64:ff9b::506:708", "v6synthesis.example.com"},
3592 {true, NI_NUMERICHOST, "64:ff9b::506:708", "64:ff9b::506:708"},
3593 {true, 0, "64:ff9b::506:708", "v6synthesis.example.com"}
3594 };
Luke Huangf8215372019-11-22 11:53:41 +08003595 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003596
3597 // hasSynthesizedPtrRecord = false
3598 // Synthesized PTR record doesn't exist on DNS server
3599 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
3600 // After querying synthesized address failed, expect that prefix is removed from IPv6
3601 // synthesized address and do reverse IPv4 query instead.
3602 //
3603 // hasSynthesizedPtrRecord = true
3604 // Synthesized PTR record exists on DNS server
3605 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
3606 // Expect to just pass through synthesized address for DNS queries.
3607 for (const auto& config : testConfigs) {
3608 SCOPED_TRACE(config.asParameters());
3609
3610 char host[NI_MAXHOST];
3611 struct sockaddr_in6 sin6;
3612 memset(&sin6, 0, sizeof(sin6));
3613 sin6.sin6_family = AF_INET6;
3614 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003615 int rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host),
nuccachena26cc2a2018-07-17 18:07:23 +08003616 nullptr, 0, config.flag);
3617 ASSERT_EQ(0, rv);
3618 if (config.flag == NI_NAMEREQD) {
3619 if (config.hasSynthesizedPtrRecord) {
3620 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
3621 } else {
3622 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist.
3623 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist.
3624 }
3625 }
3626 std::string result_str = host;
3627 EXPECT_EQ(result_str, config.host);
3628 dns.clearQueries();
3629 }
3630}
3631
3632TEST_F(ResolverTest, GetNameInfo_ReverseDns64QueryFromHostFile) {
3633 constexpr char dns64_name[] = "ipv4only.arpa.";
3634 constexpr char host_name[] = "localhost";
3635 // The address is synthesized by prefix64:localhost.
3636 constexpr char host_addr[] = "64:ff9b::7f00:1";
nuccachena26cc2a2018-07-17 18:07:23 +08003637 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003638
3639 test::DNSResponder dns(listen_addr);
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003640
Xiao Ma09b71022018-12-11 17:56:32 +09003641 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003642 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003643 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003644
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003645 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003646 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003647 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003648
3649 // Using synthesized "localhost" address to be a trick for resolving host name
3650 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
3651 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
3652 char host[NI_MAXHOST];
Xiao Ma09b71022018-12-11 17:56:32 +09003653 struct sockaddr_in6 sin6 = {.sin6_family = AF_INET6};
nuccachena26cc2a2018-07-17 18:07:23 +08003654 inet_pton(AF_INET6, host_addr, &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003655 int rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host), nullptr,
nuccachena26cc2a2018-07-17 18:07:23 +08003656 0, NI_NAMEREQD);
3657 ASSERT_EQ(0, rv);
3658 // Expect no DNS queries; localhost is resolved via /etc/hosts.
3659 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
3660
3661 std::string result_str = host;
3662 EXPECT_EQ(result_str, host_name);
3663}
3664
Hungming Chen9e6185a2019-06-04 16:09:19 +08003665TEST_F(ResolverTest, GetNameInfo_cnamesClasslessReverseDelegation) {
3666 // IPv4 addresses in the subnet with notation '/' or '-'.
3667 constexpr char addr_slash[] = "192.0.2.1";
3668 constexpr char addr_hyphen[] = "192.0.3.1";
3669
3670 // Used to verify DNS reverse query for classless reverse lookup zone. See detail in RFC 2317
3671 // section 4.
3672 const static std::vector<DnsRecord> records = {
3673 // The records for reverse querying "192.0.2.1" in the subnet with notation '/'.
3674 {"1.2.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0/25.2.0.192.in-addr.arpa."},
3675 {"1.0/25.2.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3676
3677 // The records for reverse querying "192.0.3.1" in the subnet with notation '-'.
3678 {"1.3.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0-127.3.0.192.in-addr.arpa."},
3679 {"1.0-127.3.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3680 };
3681
3682 test::DNSResponder dns;
3683 StartDns(dns, records);
3684 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3685
3686 for (const auto& address : {addr_slash, addr_hyphen}) {
3687 SCOPED_TRACE(address);
3688
3689 char host[NI_MAXHOST];
3690 sockaddr_in sin = {.sin_family = AF_INET};
3691 ASSERT_TRUE(inet_pton(AF_INET, address, &sin.sin_addr));
3692 int rv = getnameinfo((const sockaddr*)&sin, sizeof(sin), host, sizeof(host), nullptr, 0,
3693 NI_NAMEREQD);
3694 ASSERT_EQ(0, rv);
3695 EXPECT_STREQ("hello.example.com", host);
3696 }
3697}
3698
nuccachena26cc2a2018-07-17 18:07:23 +08003699TEST_F(ResolverTest, GetHostByName2_Dns64Synthesize) {
Xiao Ma09b71022018-12-11 17:56:32 +09003700 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003701 constexpr char dns64_name[] = "ipv4only.arpa.";
3702 constexpr char host_name[] = "ipv4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003703 const std::vector<DnsRecord> records = {
3704 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3705 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3706 };
nuccachena26cc2a2018-07-17 18:07:23 +08003707
Xiao Ma09b71022018-12-11 17:56:32 +09003708 test::DNSResponder dns(listen_addr);
3709 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003710 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003711 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003712
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003713 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003714 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003715 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003716
3717 // Query an IPv4-only hostname. Expect that gets a synthesized address.
3718 struct hostent* result = gethostbyname2("ipv4only", AF_INET6);
3719 ASSERT_TRUE(result != nullptr);
3720 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3721 std::string result_str = ToString(result);
3722 EXPECT_EQ(result_str, "64:ff9b::102:304");
3723}
nuccachena26cc2a2018-07-17 18:07:23 +08003724
3725TEST_F(ResolverTest, GetHostByName2_DnsQueryWithHavingNat64Prefix) {
3726 constexpr char dns64_name[] = "ipv4only.arpa.";
3727 constexpr char host_name[] = "v4v6.example.com.";
nuccachena26cc2a2018-07-17 18:07:23 +08003728 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003729 const std::vector<DnsRecord> records = {
3730 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3731 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3732 {host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
3733 };
3734
3735 test::DNSResponder dns(listen_addr);
3736 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003737 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003738 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003739
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003740 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003741 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003742 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003743
3744 // IPv4 DNS query. Prefix should have no effect on it.
3745 struct hostent* result = gethostbyname2("v4v6", AF_INET);
3746 ASSERT_TRUE(result != nullptr);
3747 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3748 std::string result_str = ToString(result);
3749 EXPECT_EQ(result_str, "1.2.3.4");
3750 dns.clearQueries();
3751
3752 // IPv6 DNS query. Prefix should have no effect on it.
3753 result = gethostbyname2("v4v6", AF_INET6);
3754 ASSERT_TRUE(result != nullptr);
3755 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3756 result_str = ToString(result);
3757 EXPECT_EQ(result_str, "2001:db8::102:304");
3758}
3759
3760TEST_F(ResolverTest, GetHostByName2_Dns64QuerySpecialUseIPv4Addresses) {
3761 constexpr char THIS_NETWORK[] = "this_network";
3762 constexpr char LOOPBACK[] = "loopback";
3763 constexpr char LINK_LOCAL[] = "link_local";
3764 constexpr char MULTICAST[] = "multicast";
3765 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
3766
3767 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
3768 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
3769 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
3770 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
3771 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
3772
3773 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003774 constexpr char dns64_name[] = "ipv4only.arpa.";
3775
Xiao Ma09b71022018-12-11 17:56:32 +09003776 test::DNSResponder dns(listen_addr);
3777 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003778 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003779 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003780
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003781 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003782 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003783 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003784
Luke Huangf8215372019-11-22 11:53:41 +08003785 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003786 static const struct TestConfig {
3787 std::string name;
3788 std::string addr;
3789
3790 std::string asHostName() const {
Luke Huangf8215372019-11-22 11:53:41 +08003791 return StringPrintf("%s.example.com.", name.c_str());
nuccachena26cc2a2018-07-17 18:07:23 +08003792 }
3793 } testConfigs[]{
3794 {THIS_NETWORK, ADDR_THIS_NETWORK},
3795 {LOOPBACK, ADDR_LOOPBACK},
3796 {LINK_LOCAL, ADDR_LINK_LOCAL},
3797 {MULTICAST, ADDR_MULTICAST},
3798 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
3799 };
Luke Huangf8215372019-11-22 11:53:41 +08003800 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003801
3802 for (const auto& config : testConfigs) {
3803 const std::string testHostName = config.asHostName();
3804 SCOPED_TRACE(testHostName);
3805
3806 const char* host_name = testHostName.c_str();
3807 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
3808
3809 struct hostent* result = gethostbyname2(config.name.c_str(), AF_INET6);
3810 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3811
3812 // In AF_INET6 case, don't synthesize special use IPv4 address.
3813 // Expect to have no answer
3814 EXPECT_EQ(nullptr, result);
3815
3816 dns.clearQueries();
3817 }
Bernie Innocenti2fef2b82018-12-20 15:56:40 +09003818}
Mike Yuf14e1a92019-05-10 13:54:58 +08003819
3820TEST_F(ResolverTest, PrefixDiscoveryBypassTls) {
3821 constexpr char listen_addr[] = "::1";
3822 constexpr char cleartext_port[] = "53";
3823 constexpr char tls_port[] = "853";
3824 constexpr char dns64_name[] = "ipv4only.arpa.";
3825 const std::vector<std::string> servers = {listen_addr};
3826
3827 test::DNSResponder dns(listen_addr);
3828 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
3829 test::DnsTlsFrontend tls(listen_addr, tls_port, listen_addr, cleartext_port);
3830 ASSERT_TRUE(tls.startServer());
3831
3832 // Setup OPPORTUNISTIC mode and wait for the validation complete.
waynema0e73c2e2019-07-31 15:04:08 +08003833 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08003834 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003835 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yuf14e1a92019-05-10 13:54:58 +08003836 tls.clearQueries();
3837
3838 // Start NAT64 prefix discovery and wait for it complete.
3839 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003840 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
Mike Yuf14e1a92019-05-10 13:54:58 +08003841
3842 // Verify it bypassed TLS even though there's a TLS server available.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003843 EXPECT_EQ(0, tls.queries()) << dns.dumpQueries();
3844 EXPECT_EQ(1U, GetNumQueries(dns, dns64_name)) << dns.dumpQueries();
Mike Yuf14e1a92019-05-10 13:54:58 +08003845
3846 // Restart the testing network to reset the cache.
3847 mDnsClient.TearDown();
3848 mDnsClient.SetUp();
3849 dns.clearQueries();
3850
3851 // Setup STRICT mode and wait for the validation complete.
waynema0e73c2e2019-07-31 15:04:08 +08003852 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
3853 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08003854 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003855 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yuf14e1a92019-05-10 13:54:58 +08003856 tls.clearQueries();
3857
3858 // Start NAT64 prefix discovery and wait for it to complete.
3859 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003860 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
Mike Yuf14e1a92019-05-10 13:54:58 +08003861
3862 // Verify it bypassed TLS despite STRICT mode.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003863 EXPECT_EQ(0, tls.queries()) << dns.dumpQueries();
3864 EXPECT_EQ(1U, GetNumQueries(dns, dns64_name)) << dns.dumpQueries();
Mike Yuf14e1a92019-05-10 13:54:58 +08003865}
Luke Huang9807e6b2019-05-20 16:17:12 +08003866
Lorenzo Colittie51091d2020-05-20 02:48:44 +09003867TEST_F(ResolverTest, SetAndClearNat64Prefix) {
3868 constexpr char host_name[] = "v4.example.com.";
3869 constexpr char listen_addr[] = "::1";
3870 const std::vector<DnsRecord> records = {
3871 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3872 };
3873 const std::string kNat64Prefix1 = "64:ff9b::/96";
3874 const std::string kNat64Prefix2 = "2001:db8:6464::/96";
3875
3876 test::DNSResponder dns(listen_addr);
3877 StartDns(dns, records);
3878 const std::vector<std::string> servers = {listen_addr};
3879 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
3880
3881 auto resolvService = mDnsClient.resolvService();
3882 addrinfo hints = {.ai_family = AF_INET6};
3883
3884 // No NAT64 prefix, no AAAA record.
3885 ScopedAddrinfo result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3886 ASSERT_TRUE(result == nullptr);
3887
3888 // Set the prefix, and expect to get a synthesized AAAA record.
3889 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix2).isOk());
3890 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3891 ASSERT_FALSE(result == nullptr);
3892 EXPECT_EQ("2001:db8:6464::102:304", ToString(result));
3893
3894 // Update the prefix, expect to see AAAA records from the new prefix.
3895 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3896 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3897 ASSERT_FALSE(result == nullptr);
3898 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3899
3900 // Non-/96 prefixes are ignored.
3901 auto status = resolvService->setPrefix64(TEST_NETID, "64:ff9b::/64");
3902 EXPECT_FALSE(status.isOk());
3903 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3904 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3905
3906 // Invalid prefixes are ignored.
3907 status = resolvService->setPrefix64(TEST_NETID, "192.0.2.0/24");
3908 EXPECT_FALSE(status.isOk());
3909 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3910 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3911
3912 status = resolvService->setPrefix64(TEST_NETID, "192.0.2.1");
3913 EXPECT_FALSE(status.isOk());
3914 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3915 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3916
3917 status = resolvService->setPrefix64(TEST_NETID, "hello");
3918 EXPECT_FALSE(status.isOk());
3919 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3920 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3921
3922 // DNS64 synthesis is still working.
3923 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3924 ASSERT_FALSE(result == nullptr);
3925 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3926
3927 // Clear the prefix. No AAAA records any more.
3928 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, "").isOk());
3929 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3930 EXPECT_TRUE(result == nullptr);
3931
3932 // Calling startPrefix64Discovery clears the prefix.
3933 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3934 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3935 ASSERT_FALSE(result == nullptr);
3936 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3937
3938 EXPECT_TRUE(resolvService->startPrefix64Discovery(TEST_NETID).isOk());
3939 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3940 ASSERT_TRUE(result == nullptr);
3941
3942 // setPrefix64 fails if prefix discovery is started, even if no prefix is yet discovered...
3943 status = resolvService->setPrefix64(TEST_NETID, kNat64Prefix1);
3944 EXPECT_FALSE(status.isOk());
3945 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3946 EXPECT_EQ(EEXIST, status.getServiceSpecificError());
3947
3948 // .. and clearing the prefix also has no effect.
3949 status = resolvService->setPrefix64(TEST_NETID, "");
3950 EXPECT_FALSE(status.isOk());
3951 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3952 EXPECT_EQ(ENOENT, status.getServiceSpecificError());
3953
3954 // setPrefix64 succeeds again when prefix discovery is stopped.
3955 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
3956 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3957 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3958 ASSERT_FALSE(result == nullptr);
3959 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3960
3961 // Calling stopPrefix64Discovery clears the prefix.
3962 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
3963 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3964 ASSERT_TRUE(result == nullptr);
3965
3966 // Set up NAT64 prefix discovery.
3967 constexpr char dns64_name[] = "ipv4only.arpa.";
3968 const std::vector<DnsRecord> newRecords = {
3969 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3970 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3971 };
3972 dns.stopServer();
3973 StartDns(dns, newRecords);
3974
3975 EXPECT_TRUE(resolvService->startPrefix64Discovery(TEST_NETID).isOk());
3976 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
3977 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3978 ASSERT_FALSE(result == nullptr);
3979 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3980
3981 // setPrefix64 fails if NAT64 prefix discovery has succeeded, and the discovered prefix
3982 // continues to be used.
3983 status = resolvService->setPrefix64(TEST_NETID, kNat64Prefix2);
3984 EXPECT_FALSE(status.isOk());
3985 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3986 EXPECT_EQ(EEXIST, status.getServiceSpecificError());
3987
3988 // Clearing the prefix also has no effect if discovery is started.
3989 status = resolvService->setPrefix64(TEST_NETID, "");
3990 EXPECT_FALSE(status.isOk());
3991 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3992 EXPECT_EQ(ENOENT, status.getServiceSpecificError());
3993
3994 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3995 ASSERT_FALSE(result == nullptr);
3996 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3997
3998 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
3999 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_NOT_FOUND));
Lorenzo Colitti61f796b2020-05-21 00:57:49 +09004000
4001 EXPECT_EQ(0, sDnsMetricsListener->getUnexpectedNat64PrefixUpdates());
Lorenzo Colittie51091d2020-05-20 02:48:44 +09004002}
4003
Luke Huang9807e6b2019-05-20 16:17:12 +08004004namespace {
4005
Luke Huang0d592bc2019-05-25 18:24:03 +08004006class ScopedSetNetworkForProcess {
4007 public:
4008 explicit ScopedSetNetworkForProcess(unsigned netId) {
4009 mStoredNetId = getNetworkForProcess();
4010 if (netId == mStoredNetId) return;
4011 EXPECT_EQ(0, setNetworkForProcess(netId));
4012 }
4013 ~ScopedSetNetworkForProcess() { EXPECT_EQ(0, setNetworkForProcess(mStoredNetId)); }
4014
4015 private:
4016 unsigned mStoredNetId;
4017};
4018
4019class ScopedSetNetworkForResolv {
4020 public:
4021 explicit ScopedSetNetworkForResolv(unsigned netId) { EXPECT_EQ(0, setNetworkForResolv(netId)); }
4022 ~ScopedSetNetworkForResolv() { EXPECT_EQ(0, setNetworkForResolv(NETID_UNSET)); }
4023};
4024
Luke Huang9807e6b2019-05-20 16:17:12 +08004025void sendCommand(int fd, const std::string& cmd) {
4026 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size() + 1));
4027 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size() + 1));
4028}
4029
4030int32_t readBE32(int fd) {
4031 int32_t tmp;
4032 int n = TEMP_FAILURE_RETRY(read(fd, &tmp, sizeof(tmp)));
4033 EXPECT_TRUE(n > 0);
4034 return ntohl(tmp);
4035}
4036
Luke Huang0d592bc2019-05-25 18:24:03 +08004037int readResponseCode(int fd) {
Luke Huang9807e6b2019-05-20 16:17:12 +08004038 char buf[4];
4039 int n = TEMP_FAILURE_RETRY(read(fd, &buf, sizeof(buf)));
4040 EXPECT_TRUE(n > 0);
4041 // The format of response code is that 4 bytes for the code & null.
4042 buf[3] = '\0';
4043 int result;
4044 EXPECT_TRUE(ParseInt(buf, &result));
4045 return result;
4046}
4047
Luke Huang0d592bc2019-05-25 18:24:03 +08004048bool checkAndClearUseLocalNameserversFlag(unsigned* netid) {
4049 if (netid == nullptr || ((*netid) & NETID_USE_LOCAL_NAMESERVERS) == 0) {
4050 return false;
4051 }
4052 *netid = (*netid) & ~NETID_USE_LOCAL_NAMESERVERS;
4053 return true;
4054}
4055
Luke Huangf8215372019-11-22 11:53:41 +08004056aidl::android::net::UidRangeParcel makeUidRangeParcel(int start, int stop) {
4057 aidl::android::net::UidRangeParcel res;
Luke Huang0d592bc2019-05-25 18:24:03 +08004058 res.start = start;
4059 res.stop = stop;
4060
4061 return res;
4062}
4063
4064void expectNetIdWithLocalNameserversFlag(unsigned netId) {
4065 unsigned dnsNetId = 0;
4066 EXPECT_EQ(0, getNetworkForDns(&dnsNetId));
4067 EXPECT_TRUE(checkAndClearUseLocalNameserversFlag(&dnsNetId));
4068 EXPECT_EQ(netId, static_cast<unsigned>(dnsNetId));
4069}
4070
4071void expectDnsNetIdEquals(unsigned netId) {
4072 unsigned dnsNetId = 0;
4073 EXPECT_EQ(0, getNetworkForDns(&dnsNetId));
4074 EXPECT_EQ(netId, static_cast<unsigned>(dnsNetId));
4075}
4076
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004077void expectDnsNetIdIsDefaultNetwork(INetd* netdService) {
Luke Huang0d592bc2019-05-25 18:24:03 +08004078 int currentNetid;
4079 EXPECT_TRUE(netdService->networkGetDefault(&currentNetid).isOk());
4080 expectDnsNetIdEquals(currentNetid);
4081}
4082
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004083void expectDnsNetIdWithVpn(INetd* netdService, unsigned vpnNetId, unsigned expectedNetId) {
Luke Huang0d592bc2019-05-25 18:24:03 +08004084 EXPECT_TRUE(netdService->networkCreateVpn(vpnNetId, false /* secure */).isOk());
4085 uid_t uid = getuid();
4086 // Add uid to VPN
4087 EXPECT_TRUE(netdService->networkAddUidRanges(vpnNetId, {makeUidRangeParcel(uid, uid)}).isOk());
4088 expectDnsNetIdEquals(expectedNetId);
4089 EXPECT_TRUE(netdService->networkDestroy(vpnNetId).isOk());
4090}
4091
Luke Huang9807e6b2019-05-20 16:17:12 +08004092} // namespace
4093
4094TEST_F(ResolverTest, getDnsNetId) {
4095 // We've called setNetworkForProcess in SetupOemNetwork, so reset to default first.
4096 setNetworkForProcess(NETID_UNSET);
Luke Huang0d592bc2019-05-25 18:24:03 +08004097
4098 expectDnsNetIdIsDefaultNetwork(mDnsClient.netdService());
4099 expectDnsNetIdWithVpn(mDnsClient.netdService(), TEST_VPN_NETID, TEST_VPN_NETID);
Luke Huang9807e6b2019-05-20 16:17:12 +08004100
4101 // Test with setNetworkForProcess
Luke Huang0d592bc2019-05-25 18:24:03 +08004102 {
4103 ScopedSetNetworkForProcess scopedSetNetworkForProcess(TEST_NETID);
4104 expectDnsNetIdEquals(TEST_NETID);
4105 }
4106
4107 // Test with setNetworkForProcess with NETID_USE_LOCAL_NAMESERVERS
4108 {
4109 ScopedSetNetworkForProcess scopedSetNetworkForProcess(TEST_NETID |
4110 NETID_USE_LOCAL_NAMESERVERS);
4111 expectNetIdWithLocalNameserversFlag(TEST_NETID);
4112 }
Luke Huang9807e6b2019-05-20 16:17:12 +08004113
4114 // Test with setNetworkForResolv
Luke Huang0d592bc2019-05-25 18:24:03 +08004115 {
4116 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID);
4117 expectDnsNetIdEquals(TEST_NETID);
4118 }
4119
4120 // Test with setNetworkForResolv with NETID_USE_LOCAL_NAMESERVERS
4121 {
4122 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID |
4123 NETID_USE_LOCAL_NAMESERVERS);
4124 expectNetIdWithLocalNameserversFlag(TEST_NETID);
4125 }
4126
4127 // Test with setNetworkForResolv under bypassable vpn
4128 {
4129 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID);
4130 expectDnsNetIdWithVpn(mDnsClient.netdService(), TEST_VPN_NETID, TEST_NETID);
4131 }
Luke Huang9807e6b2019-05-20 16:17:12 +08004132
4133 // Create socket connected to DnsProxyListener
4134 int fd = dns_open_proxy();
4135 EXPECT_TRUE(fd > 0);
4136 unique_fd ufd(fd);
4137
4138 // Test command with wrong netId
4139 sendCommand(fd, "getdnsnetid abc");
Luke Huang0d592bc2019-05-25 18:24:03 +08004140 EXPECT_EQ(ResponseCode::DnsProxyQueryResult, readResponseCode(fd));
Luke Huang9807e6b2019-05-20 16:17:12 +08004141 EXPECT_EQ(-EINVAL, readBE32(fd));
4142
4143 // Test unsupported command
4144 sendCommand(fd, "getdnsnetidNotSupported");
4145 // Keep in sync with FrameworkListener.cpp (500, "Command not recognized")
Luke Huang0d592bc2019-05-25 18:24:03 +08004146 EXPECT_EQ(500, readResponseCode(fd));
Luke Huang9807e6b2019-05-20 16:17:12 +08004147}
Sehee Park2c118782019-05-07 13:02:45 +09004148
4149TEST_F(ResolverTest, BlockDnsQueryWithUidRule) {
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004150 // This test relies on blocking traffic on loopback, which xt_qtaguid does not do.
4151 // See aosp/358413 and b/34444781 for why.
4152 SKIP_IF_BPF_NOT_SUPPORTED;
4153
Sehee Park2c118782019-05-07 13:02:45 +09004154 constexpr char listen_addr1[] = "127.0.0.4";
4155 constexpr char listen_addr2[] = "::1";
4156 constexpr char host_name[] = "howdy.example.com.";
4157 const std::vector<DnsRecord> records = {
4158 {host_name, ns_type::ns_t_a, "1.2.3.4"},
4159 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
4160 };
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004161 INetd* netdService = mDnsClient.netdService();
Sehee Park2c118782019-05-07 13:02:45 +09004162
4163 test::DNSResponder dns1(listen_addr1);
4164 test::DNSResponder dns2(listen_addr2);
4165 StartDns(dns1, records);
4166 StartDns(dns2, records);
4167
4168 std::vector<std::string> servers = {listen_addr1, listen_addr2};
4169 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
4170 dns1.clearQueries();
4171 dns2.clearQueries();
4172
Luke Huangeb618ef2020-05-26 14:17:02 +08004173 ScopeBlockedUIDRule scopeBlockUidRule(netdService, TEST_UID);
Sehee Park2c118782019-05-07 13:02:45 +09004174 // Dns Query
4175 int fd1 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_a, 0);
4176 int fd2 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_aaaa, 0);
4177 EXPECT_TRUE(fd1 != -1);
4178 EXPECT_TRUE(fd2 != -1);
4179
Luke Huang5729afc2020-07-30 23:12:17 +08004180 uint8_t buf1[MAXPACKET] = {};
4181 uint8_t buf2[MAXPACKET] = {};
Sehee Park2c118782019-05-07 13:02:45 +09004182 int rcode;
Luke Huang5729afc2020-07-30 23:12:17 +08004183 int res2 = getAsyncResponse(fd2, &rcode, buf2, MAXPACKET);
4184 int res1 = getAsyncResponse(fd1, &rcode, buf1, MAXPACKET);
4185 // If API level >= 30 (R+), these queries should be blocked.
4186 if (isAtLeastR) {
4187 EXPECT_EQ(res2, -ECONNREFUSED);
4188 EXPECT_EQ(res1, -ECONNREFUSED);
4189 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, EAI_SYSTEM, "howdy.example.com", {});
4190 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, EAI_SYSTEM, "howdy.example.com", {});
4191 } else {
4192 EXPECT_GT(res2, 0);
4193 EXPECT_EQ("::1.2.3.4", toString(buf2, res2, AF_INET6));
4194 EXPECT_GT(res1, 0);
4195 EXPECT_EQ("1.2.3.4", toString(buf1, res1, AF_INET));
4196 // To avoid flaky test, do not evaluate DnsEvent since event order is not guaranteed.
4197 }
Sehee Park2c118782019-05-07 13:02:45 +09004198}
Mike Yua772c202019-09-23 17:47:21 +08004199
Ken Chenbc481b82020-05-21 23:30:01 +08004200TEST_F(ResolverTest, EnforceDnsUid) {
4201 SKIP_IF_BPF_NOT_SUPPORTED;
4202
4203 constexpr char listen_addr1[] = "127.0.0.4";
4204 constexpr char listen_addr2[] = "::1";
4205 constexpr char host_name[] = "howdy.example.com.";
4206 const std::vector<DnsRecord> records = {
4207 {host_name, ns_type::ns_t_a, "1.2.3.4"},
4208 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
4209 };
4210 INetd* netdService = mDnsClient.netdService();
4211
4212 test::DNSResponder dns1(listen_addr1);
4213 test::DNSResponder dns2(listen_addr2);
4214 StartDns(dns1, records);
4215 StartDns(dns2, records);
4216
4217 // switch uid of DNS queries from applications to AID_DNS
4218 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4219 parcel.servers = {listen_addr1, listen_addr2};
4220 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk());
4221
4222 uint8_t buf[MAXPACKET] = {};
Luke Huang5729afc2020-07-30 23:12:17 +08004223 uint8_t buf2[MAXPACKET] = {};
Ken Chenbc481b82020-05-21 23:30:01 +08004224 int rcode;
4225 {
4226 ScopeBlockedUIDRule scopeBlockUidRule(netdService, TEST_UID);
4227 // Dns Queries should be blocked
Luke Huang5729afc2020-07-30 23:12:17 +08004228 const int fd1 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_a, 0);
4229 const int fd2 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_aaaa, 0);
Ken Chenbc481b82020-05-21 23:30:01 +08004230 EXPECT_TRUE(fd1 != -1);
4231 EXPECT_TRUE(fd2 != -1);
4232
Luke Huang5729afc2020-07-30 23:12:17 +08004233 const int res2 = getAsyncResponse(fd2, &rcode, buf2, MAXPACKET);
4234 const int res1 = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
4235 // If API level >= 30 (R+), the query should be blocked.
4236 if (isAtLeastR) {
4237 EXPECT_EQ(res2, -ECONNREFUSED);
4238 EXPECT_EQ(res1, -ECONNREFUSED);
4239 } else {
4240 EXPECT_GT(res2, 0);
4241 EXPECT_EQ("::1.2.3.4", toString(buf2, res2, AF_INET6));
4242 EXPECT_GT(res1, 0);
4243 EXPECT_EQ("1.2.3.4", toString(buf, res1, AF_INET));
4244 }
Ken Chenbc481b82020-05-21 23:30:01 +08004245 }
4246
Luke Huang5729afc2020-07-30 23:12:17 +08004247 memset(buf, 0, MAXPACKET);
Ken Chenbc481b82020-05-21 23:30:01 +08004248 parcel.resolverOptions.enforceDnsUid = true;
4249 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk());
4250 {
4251 ScopeBlockedUIDRule scopeBlockUidRule(netdService, TEST_UID);
4252 // Dns Queries should NOT be blocked
4253 int fd1 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_a, 0);
4254 int fd2 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_aaaa, 0);
4255 EXPECT_TRUE(fd1 != -1);
4256 EXPECT_TRUE(fd2 != -1);
4257
4258 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
4259 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
4260
4261 memset(buf, 0, MAXPACKET);
4262 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
4263 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
4264
4265 // @TODO: So far we know that uid of DNS queries are no more set to DNS requester. But we
4266 // don't check if they are actually being set to AID_DNS, because system uids are always
4267 // allowed in bpf_owner_match(). Audit by firewallSetUidRule(AID_DNS) + sending queries is
4268 // infeasible. Fix it if the behavior of bpf_owner_match() is changed in the future, or if
4269 // we have better idea to deal with this.
4270 }
4271}
4272
Mike Yua772c202019-09-23 17:47:21 +08004273TEST_F(ResolverTest, ConnectTlsServerTimeout) {
Mike Yu40e67072019-10-09 21:14:09 +08004274 constexpr char hostname1[] = "query1.example.com.";
4275 constexpr char hostname2[] = "query2.example.com.";
Mike Yua772c202019-09-23 17:47:21 +08004276 const std::vector<DnsRecord> records = {
Mike Yu40e67072019-10-09 21:14:09 +08004277 {hostname1, ns_type::ns_t_a, "1.2.3.4"},
4278 {hostname2, ns_type::ns_t_a, "1.2.3.5"},
Mike Yua772c202019-09-23 17:47:21 +08004279 };
4280
Mike Yu40e67072019-10-09 21:14:09 +08004281 // The resolver will adjust the timeout value to 1000ms since the value is too small.
4282 ScopedSystemProperties scopedSystemProperties(kDotConnectTimeoutMsFlag, "100");
Mike Yua772c202019-09-23 17:47:21 +08004283
Mike Yue93d9ae2020-08-25 19:09:51 +08004284 static const struct TestConfig {
4285 bool asyncHandshake;
4286 int expectedTimeout;
4287 } testConfigs[] = {
4288 // expectedTimeout = dotConnectTimeoutMs
4289 {false, 1000},
Mike Yua772c202019-09-23 17:47:21 +08004290
Mike Yue93d9ae2020-08-25 19:09:51 +08004291 // expectedTimeout = dotConnectTimeoutMs * DnsTlsQueryMap::kMaxTries
4292 {true, 3000},
4293 };
Mike Yua772c202019-09-23 17:47:21 +08004294
Mike Yue93d9ae2020-08-25 19:09:51 +08004295 for (const auto& config : testConfigs) {
4296 SCOPED_TRACE(fmt::format("testConfig: [{}]", config.asyncHandshake));
Mike Yua772c202019-09-23 17:47:21 +08004297
Mike Yue93d9ae2020-08-25 19:09:51 +08004298 // Because a DnsTlsTransport lasts at least 5 minutes in spite of network
4299 // destroyed, let the resolver creates an unique DnsTlsTransport every time
4300 // so that the DnsTlsTransport won't interfere the other tests.
4301 const std::string addr = getUniqueIPv4Address();
4302 test::DNSResponder dns(addr);
4303 StartDns(dns, records);
4304 test::DnsTlsFrontend tls(addr, "853", addr, "53");
4305 ASSERT_TRUE(tls.startServer());
Mike Yua772c202019-09-23 17:47:21 +08004306
Mike Yue93d9ae2020-08-25 19:09:51 +08004307 ScopedSystemProperties scopedSystemProperties(kDotAsyncHandshakeFlag,
4308 config.asyncHandshake ? "1" : "0");
4309 resetNetwork();
Mike Yu40e67072019-10-09 21:14:09 +08004310
Mike Yue93d9ae2020-08-25 19:09:51 +08004311 // Set up resolver to opportunistic mode.
4312 auto parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4313 parcel.servers = {addr};
4314 parcel.tlsServers = {addr};
4315 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4316 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
4317 EXPECT_TRUE(tls.waitForQueries(1));
4318 tls.clearQueries();
4319 dns.clearQueries();
Mike Yu40e67072019-10-09 21:14:09 +08004320
Mike Yue93d9ae2020-08-25 19:09:51 +08004321 // The server becomes unresponsive to the handshake request.
4322 tls.setHangOnHandshakeForTesting(true);
Mike Yu40e67072019-10-09 21:14:09 +08004323
Mike Yue93d9ae2020-08-25 19:09:51 +08004324 // Expect the things happening in getaddrinfo():
4325 // 1. Connect to the private DNS server.
4326 // 2. SSL handshake times out.
4327 // 3. Fallback to UDP transport, and then get the answer.
4328 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4329 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(hostname1, nullptr, hints);
4330
4331 EXPECT_NE(nullptr, result);
4332 EXPECT_EQ(0, tls.queries());
4333 EXPECT_EQ(1U, GetNumQueries(dns, hostname1));
4334 EXPECT_EQ(records.at(0).addr, ToString(result));
4335
4336 // A loose upper bound is set by adding 1000ms buffer time. Theoretically, getaddrinfo()
4337 // should just take a bit more than expetTimeout milliseconds.
4338 EXPECT_GE(timeTakenMs, config.expectedTimeout);
4339 EXPECT_LE(timeTakenMs, config.expectedTimeout + 1000);
4340
4341 // Set the server to be responsive. Verify that the resolver will attempt to reconnect
4342 // to the server and then get the result within the timeout.
4343 tls.setHangOnHandshakeForTesting(false);
4344 std::tie(result, timeTakenMs) = safe_getaddrinfo_time_taken(hostname2, nullptr, hints);
4345
4346 EXPECT_NE(nullptr, result);
4347 EXPECT_TRUE(tls.waitForQueries(1));
4348 EXPECT_EQ(1U, GetNumQueries(dns, hostname2));
4349 EXPECT_EQ(records.at(1).addr, ToString(result));
4350
4351 EXPECT_LE(timeTakenMs, 200);
4352 }
4353}
4354
4355TEST_F(ResolverTest, ConnectTlsServerTimeout_ConcurrentQueries) {
4356 constexpr uint32_t cacheFlag = ANDROID_RESOLV_NO_CACHE_LOOKUP;
4357 constexpr char hostname[] = "hello.example.com.";
4358 const std::vector<DnsRecord> records = {
4359 {hostname, ns_type::ns_t_a, "1.2.3.4"},
4360 };
4361
4362 static const struct TestConfig {
4363 bool asyncHandshake;
4364 int dotConnectTimeoutMs;
4365 int concurrency;
4366 int expectedTimeout;
4367 } testConfigs[] = {
4368 // expectedTimeout = dotConnectTimeoutMs * concurrency
4369 {false, 1000, 5, 5000},
4370
4371 // expectedTimeout = dotConnectTimeoutMs * DnsTlsQueryMap::kMaxTries
4372 {true, 1000, 5, 3000},
4373 };
4374
4375 // Launch query threads. Expected behaviors are:
4376 // - when dot_async_handshake is disabled, one of the query threads triggers a
4377 // handshake and then times out. Then same as another query thread, and so forth.
4378 // - when dot_async_handshake is enabled, only one handshake is triggered, and then
4379 // all of the query threads time out at the same time.
4380 for (const auto& config : testConfigs) {
4381 ScopedSystemProperties scopedSystemProperties1(kDotConnectTimeoutMsFlag,
4382 std::to_string(config.dotConnectTimeoutMs));
4383 ScopedSystemProperties scopedSystemProperties2(kDotAsyncHandshakeFlag,
4384 config.asyncHandshake ? "1" : "0");
4385 resetNetwork();
4386
4387 for (const auto& dnsMode : {"OPPORTUNISTIC", "STRICT"}) {
4388 SCOPED_TRACE(fmt::format("testConfig: [{}, {}]", config.asyncHandshake, dnsMode));
4389
4390 // Because a DnsTlsTransport lasts at least 5 minutes in spite of network
4391 // destroyed, let the resolver creates an unique DnsTlsTransport every time
4392 // so that the DnsTlsTransport won't interfere the other tests.
4393 const std::string addr = getUniqueIPv4Address();
4394 test::DNSResponder dns(addr);
4395 StartDns(dns, records);
4396 test::DnsTlsFrontend tls(addr, "853", addr, "53");
4397 ASSERT_TRUE(tls.startServer());
4398
4399 auto parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4400 parcel.servers = {addr};
4401 parcel.tlsServers = {addr};
4402 if (dnsMode == "STRICT") parcel.tlsName = kDefaultPrivateDnsHostName;
4403 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4404 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
4405 EXPECT_TRUE(tls.waitForQueries(1));
4406
4407 // The server becomes unresponsive to the handshake request.
4408 tls.setHangOnHandshakeForTesting(true);
4409
4410 Stopwatch s;
4411 std::vector<std::thread> threads(config.concurrency);
4412 for (std::thread& thread : threads) {
4413 thread = std::thread([&]() {
4414 int fd = resNetworkQuery(TEST_NETID, hostname, ns_c_in, ns_t_a, cacheFlag);
4415 dnsMode == "STRICT" ? expectAnswersNotValid(fd, -ETIMEDOUT)
4416 : expectAnswersValid(fd, AF_INET, "1.2.3.4");
4417 });
4418 }
4419 for (std::thread& thread : threads) {
4420 thread.join();
4421 }
4422
4423 const int timeTakenMs = s.timeTakenUs() / 1000;
4424 // A loose upper bound is set by adding 1000ms buffer time. Theoretically, it should
4425 // just take a bit more than expetTimeout milliseconds for the result.
4426 EXPECT_GE(timeTakenMs, config.expectedTimeout);
4427 EXPECT_LE(timeTakenMs, config.expectedTimeout + 1000);
4428
4429 // Recover the server from being unresponsive and try again.
4430 tls.setHangOnHandshakeForTesting(false);
4431 int fd = resNetworkQuery(TEST_NETID, hostname, ns_c_in, ns_t_a, cacheFlag);
4432 expectAnswersValid(fd, AF_INET, "1.2.3.4");
4433 }
4434 }
Mike Yua772c202019-09-23 17:47:21 +08004435}
Hungming Chenbb90ab32019-10-28 18:20:31 +08004436
Ken Chen766feae2019-10-30 15:13:44 +08004437TEST_F(ResolverTest, FlushNetworkCache) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004438 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004439 test::DNSResponder dns;
4440 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4441 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4442
4443 const hostent* result = gethostbyname("hello");
4444 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4445
4446 // get result from cache
4447 result = gethostbyname("hello");
4448 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4449
4450 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4451
4452 result = gethostbyname("hello");
4453 EXPECT_EQ(2U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4454}
4455
4456TEST_F(ResolverTest, FlushNetworkCache_random) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004457 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004458 constexpr int num_flush = 10;
4459 constexpr int num_queries = 20;
4460 test::DNSResponder dns;
4461 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4462 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4463 const addrinfo hints = {.ai_family = AF_INET};
4464
4465 std::thread t([this]() {
4466 for (int i = 0; i < num_flush; ++i) {
4467 unsigned delay = arc4random_uniform(10 * 1000); // 10ms
4468 usleep(delay);
4469 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4470 }
4471 });
4472
4473 for (int i = 0; i < num_queries; ++i) {
4474 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4475 EXPECT_TRUE(result != nullptr);
4476 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4477 }
4478 t.join();
4479}
4480
4481// flush cache while one query is wait-for-response, another is pending.
4482TEST_F(ResolverTest, FlushNetworkCache_concurrent) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004483 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004484 const char* listen_addr1 = "127.0.0.9";
4485 const char* listen_addr2 = "127.0.0.10";
4486 test::DNSResponder dns1(listen_addr1);
4487 test::DNSResponder dns2(listen_addr2);
4488 StartDns(dns1, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4489 StartDns(dns2, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4490 addrinfo hints = {.ai_family = AF_INET};
4491
4492 // step 1: set server#1 into deferred responding mode
4493 dns1.setDeferredResp(true);
4494 std::thread t1([&listen_addr1, &hints, this]() {
4495 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr1}));
4496 // step 3: query
4497 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4498 // step 9: check result
4499 EXPECT_TRUE(result != nullptr);
4500 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4501 });
4502
4503 // step 2: wait for the query to reach the server
4504 while (GetNumQueries(dns1, kHelloExampleCom) == 0) {
4505 usleep(1000); // 1ms
4506 }
4507
4508 std::thread t2([&listen_addr2, &hints, &dns2, this]() {
4509 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr2}));
4510 // step 5: query (should be blocked in resolver)
4511 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4512 // step 7: check result
4513 EXPECT_TRUE(result != nullptr);
4514 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4515 EXPECT_EQ(1U, GetNumQueriesForType(dns2, ns_type::ns_t_a, kHelloExampleCom));
4516 });
4517
4518 // step 4: wait a bit for the 2nd query to enter pending state
4519 usleep(100 * 1000); // 100ms
4520 // step 6: flush cache (will unblock pending queries)
4521 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4522 t2.join();
4523
4524 // step 8: resume server#1
4525 dns1.setDeferredResp(false);
4526 t1.join();
4527
4528 // step 10: verify if result is correctly cached
4529 dns2.clearQueries();
4530 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4531 EXPECT_EQ(0U, GetNumQueries(dns2, kHelloExampleCom));
4532 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4533}
4534
waynema29253052019-08-20 11:26:08 +08004535// TODO: Perhaps to have a boundary conditions test for TCP and UDP.
4536TEST_F(ResolverTest, TcpQueryWithOversizePayload) {
4537 test::DNSResponder dns;
4538 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4539 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4540
4541 int fd = dns_open_proxy();
4542 ASSERT_TRUE(fd > 0);
4543
4544 // Sending DNS query over TCP once the packet sizes exceed 512 bytes.
4545 // The raw data is combined with Question section and Additional section
4546 // Question section : query "hello.example.com", type A, class IN
4547 // Additional section : type OPT (41), Option PADDING, Option Length 546
4548 // Padding option which allows DNS clients and servers to artificially
4549 // increase the size of a DNS message by a variable number of bytes.
4550 // See also RFC7830, section 3
4551 const std::string query =
4552 "+c0BAAABAAAAAAABBWhlbGxvB2V4YW1wbGUDY29tAAABAAEAACkgAAAAgAACJgAMAiIAAAAAAAAAAAAAAAAAA"
4553 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4554 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4555 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4556 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4557 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4558 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4559 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4560 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4561 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
4562 const std::string cmd =
4563 "resnsend " + std::to_string(TEST_NETID) + " 0 " /* ResNsendFlags */ + query + '\0';
4564 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
4565 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
4566 expectAnswersValid(fd, AF_INET, kHelloExampleComAddrV4);
4567 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom));
4568 EXPECT_EQ(0U, GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom));
4569}
4570
Ken Chen99344882020-01-01 14:59:38 +08004571TEST_F(ResolverTest, TruncatedRspMode) {
4572 constexpr char listen_addr[] = "127.0.0.4";
4573 constexpr char listen_addr2[] = "127.0.0.5";
4574 constexpr char listen_srv[] = "53";
4575
4576 test::DNSResponder dns(listen_addr, listen_srv, static_cast<ns_rcode>(-1));
4577 test::DNSResponder dns2(listen_addr2, listen_srv, static_cast<ns_rcode>(-1));
4578 // dns supports UDP only, dns2 support UDP and TCP
4579 dns.setResponseProbability(0.0, IPPROTO_TCP);
4580 StartDns(dns, kLargeCnameChainRecords);
4581 StartDns(dns2, kLargeCnameChainRecords);
4582
4583 const struct TestConfig {
4584 const std::optional<int32_t> tcMode;
4585 const bool ret;
4586 const unsigned numQueries;
4587 std::string asParameters() const {
4588 return StringPrintf("tcMode: %d, ret: %s, numQueries: %u", tcMode.value_or(-1),
4589 ret ? "true" : "false", numQueries);
4590 }
4591 } testConfigs[]{
4592 // clang-format off
4593 {std::nullopt, true, 0}, /* mode unset */
4594 {aidl::android::net::IDnsResolver::TC_MODE_DEFAULT, true, 0}, /* default mode */
4595 {aidl::android::net::IDnsResolver::TC_MODE_UDP_TCP, true, 1}, /* alternative mode */
4596 {-666, false, 1}, /* invalid input */
4597 // clang-format on
4598 };
4599
4600 for (const auto& config : testConfigs) {
4601 SCOPED_TRACE(config.asParameters());
4602
4603 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4604 parcel.servers = {listen_addr, listen_addr2};
4605 if (config.tcMode) {
Ken Chena6ac2a62020-04-07 17:25:56 +08004606 parcel.resolverOptions.tcMode = config.tcMode.value();
Ken Chen99344882020-01-01 14:59:38 +08004607 }
4608 ASSERT_EQ(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk(), config.ret);
4609
4610 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4611 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4612 ASSERT_TRUE(result != nullptr);
4613 EXPECT_EQ(ToString(result), kHelloExampleComAddrV4);
4614 // TC_MODE_DEFAULT: resolver retries on TCP-only on each name server.
4615 // TC_MODE_UDP_TCP: resolver retries on TCP on the same server, falls back to UDP from next.
4616 ASSERT_EQ(GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom), 1U);
4617 ASSERT_EQ(GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom), 1U);
4618 ASSERT_EQ(GetNumQueriesForProtocol(dns2, IPPROTO_UDP, kHelloExampleCom), config.numQueries);
4619 ASSERT_EQ(GetNumQueriesForProtocol(dns2, IPPROTO_TCP, kHelloExampleCom), 1U);
4620
4621 dns.clearQueries();
4622 dns2.clearQueries();
4623 ASSERT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
Mike Yu61d17262020-02-15 18:56:22 +08004624
4625 // Clear the stats to make the resolver always choose the same server for the first query.
4626 parcel.servers.clear();
4627 parcel.tlsServers.clear();
4628 ASSERT_EQ(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk(), config.ret);
Ken Chen99344882020-01-01 14:59:38 +08004629 }
4630}
4631
Mike Yu153b5b82020-03-04 19:53:54 +08004632TEST_F(ResolverTest, RepeatedSetup_ResolverStatusRemains) {
4633 constexpr char unusable_listen_addr[] = "127.0.0.3";
4634 constexpr char listen_addr[] = "127.0.0.4";
4635 constexpr char hostname[] = "a.hello.query.";
4636 const auto repeatedSetResolversFromParcel = [&](const ResolverParamsParcel& parcel) {
4637 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4638 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4639 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4640 };
4641
4642 test::DNSResponder dns(listen_addr);
4643 StartDns(dns, {{hostname, ns_type::ns_t_a, "1.2.3.3"}});
4644 test::DnsTlsFrontend tls1(listen_addr, "853", listen_addr, "53");
4645 ASSERT_TRUE(tls1.startServer());
4646
4647 // Private DNS off mode.
4648 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4649 parcel.servers = {unusable_listen_addr, listen_addr};
4650 parcel.tlsServers.clear();
4651 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4652
4653 // Send a query.
4654 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4655 EXPECT_NE(safe_getaddrinfo(hostname, nullptr, &hints), nullptr);
4656
4657 // Check the stats as expected.
4658 const std::vector<NameserverStats> expectedCleartextDnsStats = {
4659 NameserverStats(unusable_listen_addr).setInternalErrors(1),
4660 NameserverStats(listen_addr).setSuccesses(1),
4661 };
Mike Yu61d17262020-02-15 18:56:22 +08004662 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu153b5b82020-03-04 19:53:54 +08004663 EXPECT_EQ(GetNumQueries(dns, hostname), 1U);
4664
4665 // The stats is supposed to remain as long as the list of cleartext DNS servers is unchanged.
4666 static const struct TestConfig {
4667 std::vector<std::string> servers;
4668 std::vector<std::string> tlsServers;
4669 std::string tlsName;
4670 } testConfigs[] = {
4671 // Private DNS opportunistic mode.
4672 {{listen_addr, unusable_listen_addr}, {listen_addr, unusable_listen_addr}, ""},
4673 {{unusable_listen_addr, listen_addr}, {unusable_listen_addr, listen_addr}, ""},
4674
4675 // Private DNS strict mode.
4676 {{listen_addr, unusable_listen_addr}, {"127.0.0.100"}, kDefaultPrivateDnsHostName},
4677 {{unusable_listen_addr, listen_addr}, {"127.0.0.100"}, kDefaultPrivateDnsHostName},
4678
4679 // Private DNS off mode.
4680 {{unusable_listen_addr, listen_addr}, {}, ""},
4681 {{listen_addr, unusable_listen_addr}, {}, ""},
4682 };
4683
4684 for (const auto& config : testConfigs) {
4685 SCOPED_TRACE(fmt::format("testConfig: [{}] [{}] [{}]", fmt::join(config.servers, ","),
4686 fmt::join(config.tlsServers, ","), config.tlsName));
4687 parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4688 parcel.servers = config.servers;
4689 parcel.tlsServers = config.tlsServers;
4690 parcel.tlsName = config.tlsName;
4691 repeatedSetResolversFromParcel(parcel);
Mike Yu61d17262020-02-15 18:56:22 +08004692 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu153b5b82020-03-04 19:53:54 +08004693
4694 // The stats remains when the list of search domains changes.
4695 parcel.domains.push_back("tmp.domains");
4696 repeatedSetResolversFromParcel(parcel);
Mike Yu61d17262020-02-15 18:56:22 +08004697 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu153b5b82020-03-04 19:53:54 +08004698
4699 // The stats remains when the parameters change (except maxSamples).
4700 parcel.sampleValiditySeconds++;
4701 parcel.successThreshold++;
4702 parcel.minSamples++;
4703 parcel.baseTimeoutMsec++;
4704 parcel.retryCount++;
4705 repeatedSetResolversFromParcel(parcel);
Mike Yu61d17262020-02-15 18:56:22 +08004706 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu153b5b82020-03-04 19:53:54 +08004707 }
4708
4709 // The cache remains.
4710 EXPECT_NE(safe_getaddrinfo(hostname, nullptr, &hints), nullptr);
4711 EXPECT_EQ(GetNumQueries(dns, hostname), 1U);
4712}
4713
4714TEST_F(ResolverTest, RepeatedSetup_NoRedundantPrivateDnsValidation) {
4715 const std::string addr1 = getUniqueIPv4Address(); // For a workable DNS server.
4716 const std::string addr2 = getUniqueIPv4Address(); // For an unresponsive DNS server.
4717 const std::string unusable_addr = getUniqueIPv4Address();
Mike Yubc4b9502020-03-20 13:14:00 +08004718 const auto waitForPrivateDnsStateUpdated = []() {
4719 // A buffer time for the PrivateDnsConfiguration instance to update its map,
4720 // mPrivateDnsValidateThreads, which is used for tracking validation threads.
4721 // Since there is a time gap between when PrivateDnsConfiguration reports
4722 // onPrivateDnsValidationEvent and when PrivateDnsConfiguration updates the map, this is a
4723 // workaround to avoid the test starts a subsequent resolver setup during the time gap.
4724 // TODO: Report onPrivateDnsValidationEvent after all the relevant updates are complete.
4725 // Reference to b/152009023.
4726 std::this_thread::sleep_for(20ms);
4727 };
Mike Yu153b5b82020-03-04 19:53:54 +08004728
4729 test::DNSResponder dns1(addr1);
4730 test::DNSResponder dns2(addr2);
4731 StartDns(dns1, {});
4732 StartDns(dns2, {});
4733 test::DnsTlsFrontend workableTls(addr1, "853", addr1, "53");
4734 test::DnsTlsFrontend unresponsiveTls(addr2, "853", addr2, "53");
4735 unresponsiveTls.setHangOnHandshakeForTesting(true);
4736 ASSERT_TRUE(workableTls.startServer());
4737 ASSERT_TRUE(unresponsiveTls.startServer());
4738
4739 // First setup.
4740 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4741 parcel.servers = {addr1, addr2, unusable_addr};
4742 parcel.tlsServers = {addr1, addr2, unusable_addr};
4743 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4744
4745 // Check the validation results.
4746 EXPECT_TRUE(WaitForPrivateDnsValidation(workableTls.listen_address(), true));
4747 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4748 EXPECT_EQ(unresponsiveTls.acceptConnectionsCount(), 1); // The validation is still in progress.
4749
4750 static const struct TestConfig {
4751 std::vector<std::string> tlsServers;
4752 std::string tlsName;
4753 } testConfigs[] = {
4754 {{addr1, addr2, unusable_addr}, ""},
4755 {{unusable_addr, addr1, addr2}, ""},
4756 {{unusable_addr, addr1, addr2}, kDefaultPrivateDnsHostName},
4757 {{addr1, addr2, unusable_addr}, kDefaultPrivateDnsHostName},
4758 };
4759
4760 std::string TlsNameLastTime;
4761 for (const auto& config : testConfigs) {
4762 SCOPED_TRACE(fmt::format("testConfig: [{}] [{}]", fmt::join(config.tlsServers, ","),
4763 config.tlsName));
4764 parcel.servers = config.tlsServers;
4765 parcel.tlsServers = config.tlsServers;
4766 parcel.tlsName = config.tlsName;
4767 parcel.caCertificate = config.tlsName.empty() ? "" : kCaCert;
4768
4769 const bool dnsModeChanged = (TlsNameLastTime != config.tlsName);
Mike Yubc4b9502020-03-20 13:14:00 +08004770
4771 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004772 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4773
4774 for (const auto& serverAddr : parcel.tlsServers) {
4775 SCOPED_TRACE(serverAddr);
4776 if (serverAddr == workableTls.listen_address()) {
4777 if (dnsModeChanged) {
4778 // In despite of the identical IP address, the server is regarded as a different
4779 // server when DnsTlsServer.name is different. The resolver treats it as a
4780 // different object and begins the validation process.
4781 EXPECT_TRUE(WaitForPrivateDnsValidation(serverAddr, true));
4782 }
4783 } else if (serverAddr == unresponsiveTls.listen_address()) {
4784 // No revalidation needed for the server which have been marked as in_progesss.
4785 } else {
4786 // Must be unusable_addr.
4787 // In opportunistic mode, when a validation for a private DNS server fails, the
4788 // resolver just marks the server as failed and doesn't re-evaluate it, but the
4789 // server can be re-evaluated when setResolverConfiguration() is called.
4790 // However, in strict mode, the resolver automatically re-evaluates the server and
4791 // marks the server as in_progress until the validation succeeds, so repeated setup
4792 // makes no effect.
4793 if (dnsModeChanged || config.tlsName.empty() /* not in strict mode */) {
4794 EXPECT_TRUE(WaitForPrivateDnsValidation(serverAddr, false));
4795 }
4796 }
4797 }
4798
4799 // Repeated setups make no effect in strict mode.
Mike Yubc4b9502020-03-20 13:14:00 +08004800 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004801 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4802 if (config.tlsName.empty()) {
4803 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4804 }
Mike Yubc4b9502020-03-20 13:14:00 +08004805 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004806 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4807 if (config.tlsName.empty()) {
4808 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4809 }
4810
4811 EXPECT_EQ(unresponsiveTls.acceptConnectionsCount(), 1);
4812
4813 TlsNameLastTime = config.tlsName;
4814 }
4815
4816 // Check that all the validation results are caught.
4817 // Note: it doesn't mean no validation being in progress.
4818 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr1));
4819 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr2));
4820 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(unusable_addr));
4821}
4822
4823TEST_F(ResolverTest, RepeatedSetup_KeepChangingPrivateDnsServers) {
4824 enum TlsServerState { WORKING, UNSUPPORTED, UNRESPONSIVE };
4825 const std::string addr1 = getUniqueIPv4Address();
4826 const std::string addr2 = getUniqueIPv4Address();
Mike Yu9a185882020-03-25 16:02:36 +08004827 const auto waitForPrivateDnsStateUpdated = []() {
4828 // A buffer time for PrivateDnsConfiguration to update its state. It prevents this test
4829 // being flaky. See b/152009023 for the reason.
4830 std::this_thread::sleep_for(20ms);
4831 };
Mike Yu153b5b82020-03-04 19:53:54 +08004832
4833 test::DNSResponder dns1(addr1);
4834 test::DNSResponder dns2(addr2);
4835 StartDns(dns1, {});
4836 StartDns(dns2, {});
4837 test::DnsTlsFrontend tls1(addr1, "853", addr1, "53");
4838 test::DnsTlsFrontend tls2(addr2, "853", addr2, "53");
4839 ASSERT_TRUE(tls1.startServer());
4840 ASSERT_TRUE(tls2.startServer());
4841
4842 static const struct TestConfig {
4843 std::string tlsServer;
4844 std::string tlsName;
4845 bool expectNothingHappenWhenServerUnsupported;
4846 bool expectNothingHappenWhenServerUnresponsive;
4847 std::string asTestName() const {
4848 return fmt::format("{}, {}, {}, {}", tlsServer, tlsName,
4849 expectNothingHappenWhenServerUnsupported,
4850 expectNothingHappenWhenServerUnresponsive);
4851 }
4852 } testConfigs[] = {
4853 {{addr1}, "", false, false},
4854 {{addr2}, "", false, false},
4855 {{addr1}, "", false, true},
4856 {{addr2}, "", false, true},
4857 {{addr1}, kDefaultPrivateDnsHostName, false, true},
4858 {{addr2}, kDefaultPrivateDnsHostName, false, true},
4859 {{addr1}, kDefaultPrivateDnsHostName, true, true},
4860 {{addr2}, kDefaultPrivateDnsHostName, true, true},
4861
4862 // There's no new validation to start because there are already two validation threads
4863 // running (one is for addr1, the other is for addr2). This is because the comparator
4864 // doesn't compare DnsTlsServer.name. Keep the design as-is until it's known to be
4865 // harmful.
4866 {{addr1}, "", true, true},
4867 {{addr2}, "", true, true},
4868 {{addr1}, "", true, true},
4869 {{addr2}, "", true, true},
4870 };
4871
4872 for (const auto& serverState : {WORKING, UNSUPPORTED, UNRESPONSIVE}) {
4873 int testIndex = 0;
4874 for (const auto& config : testConfigs) {
4875 SCOPED_TRACE(fmt::format("serverState:{} testIndex:{} testConfig:[{}]", serverState,
4876 testIndex++, config.asTestName()));
4877 auto& tls = (config.tlsServer == addr1) ? tls1 : tls2;
4878
4879 if (serverState == UNSUPPORTED && tls.running()) ASSERT_TRUE(tls.stopServer());
4880 if (serverState != UNSUPPORTED && !tls.running()) ASSERT_TRUE(tls.startServer());
4881
4882 tls.setHangOnHandshakeForTesting(serverState == UNRESPONSIVE);
4883 const int connectCountsBefore = tls.acceptConnectionsCount();
4884
Mike Yu9a185882020-03-25 16:02:36 +08004885 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004886 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4887 parcel.servers = {config.tlsServer};
4888 parcel.tlsServers = {config.tlsServer};
4889 parcel.tlsName = config.tlsName;
4890 parcel.caCertificate = config.tlsName.empty() ? "" : kCaCert;
4891 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4892
4893 if (serverState == WORKING) {
4894 EXPECT_TRUE(WaitForPrivateDnsValidation(config.tlsServer, true));
4895 } else if (serverState == UNSUPPORTED) {
4896 if (config.expectNothingHappenWhenServerUnsupported) {
4897 // It's possible that the resolver hasn't yet started to
4898 // connect. Wait a while.
4899 // TODO: See if we can get rid of the hard waiting time, such as comparing
4900 // the CountDiff across two tests.
4901 std::this_thread::sleep_for(100ms);
4902 EXPECT_EQ(tls.acceptConnectionsCount(), connectCountsBefore);
4903 } else {
4904 EXPECT_TRUE(WaitForPrivateDnsValidation(config.tlsServer, false));
4905 }
4906 } else {
4907 // Must be UNRESPONSIVE.
4908 // DnsTlsFrontend is the only signal for checking whether or not the resolver starts
4909 // another validation when the server is unresponsive.
4910 const int expectCountDiff =
4911 config.expectNothingHappenWhenServerUnresponsive ? 0 : 1;
4912 if (expectCountDiff == 0) {
4913 // It's possible that the resolver hasn't yet started to
4914 // connect. Wait a while.
4915 std::this_thread::sleep_for(100ms);
4916 }
4917 const auto condition = [&]() {
4918 return tls.acceptConnectionsCount() == connectCountsBefore + expectCountDiff;
4919 };
4920 EXPECT_TRUE(PollForCondition(condition));
4921 }
4922 }
4923
4924 // Set to off mode to reset the PrivateDnsConfiguration state.
4925 ResolverParamsParcel setupOffmode = DnsResponderClient::GetDefaultResolverParamsParcel();
4926 setupOffmode.tlsServers.clear();
4927 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(setupOffmode));
4928 }
4929
4930 // Check that all the validation results are caught.
4931 // Note: it doesn't mean no validation being in progress.
4932 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr1));
4933 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr2));
4934}
4935
Ken Chen26dc2b02020-06-16 18:49:39 +08004936TEST_F(ResolverTest, PermissionCheckOnCertificateInjection) {
4937 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4938 parcel.caCertificate = kCaCert;
4939 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk());
4940
4941 for (const uid_t uid : {AID_SYSTEM, TEST_UID}) {
4942 ScopedChangeUID scopedChangeUID(uid);
4943 auto status = mDnsClient.resolvService()->setResolverConfiguration(parcel);
4944 EXPECT_EQ(status.getExceptionCode(), EX_SECURITY);
4945 }
4946}
4947
Hungming Chenbb90ab32019-10-28 18:20:31 +08004948// Parameterized tests.
4949// TODO: Merge the existing tests as parameterized test if possible.
4950// TODO: Perhaps move parameterized tests to an independent file.
4951enum class CallType { GETADDRINFO, GETHOSTBYNAME };
4952class ResolverParameterizedTest : public ResolverTest,
Hungming Chen63779052019-10-30 15:06:13 +08004953 public testing::WithParamInterface<CallType> {
4954 protected:
Hungming Chen22617fd2019-12-06 12:15:45 +08004955 void VerifyQueryHelloExampleComV4(const test::DNSResponder& dns, const CallType calltype,
4956 const bool verifyNumQueries = true) {
Hungming Chen63779052019-10-30 15:06:13 +08004957 if (calltype == CallType::GETADDRINFO) {
4958 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4959 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4960 ASSERT_TRUE(result != nullptr);
4961 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4962 } else if (calltype == CallType::GETHOSTBYNAME) {
4963 const hostent* result = gethostbyname("hello");
4964 ASSERT_TRUE(result != nullptr);
4965 ASSERT_EQ(4, result->h_length);
4966 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
4967 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4968 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
4969 } else {
4970 FAIL() << "Unsupported call type: " << static_cast<uint32_t>(calltype);
4971 }
Hungming Chen22617fd2019-12-06 12:15:45 +08004972 if (verifyNumQueries) EXPECT_EQ(1U, GetNumQueries(dns, kHelloExampleCom));
Hungming Chen63779052019-10-30 15:06:13 +08004973 }
4974};
Hungming Chenbb90ab32019-10-28 18:20:31 +08004975
Hungming Chen63779052019-10-30 15:06:13 +08004976INSTANTIATE_TEST_SUITE_P(QueryCallTest, ResolverParameterizedTest,
Hungming Chenbb90ab32019-10-28 18:20:31 +08004977 testing::Values(CallType::GETADDRINFO, CallType::GETHOSTBYNAME),
4978 [](const testing::TestParamInfo<CallType>& info) {
Hungming Chenbb90ab32019-10-28 18:20:31 +08004979 switch (info.param) {
4980 case CallType::GETADDRINFO:
Hungming Chen63779052019-10-30 15:06:13 +08004981 return "GetAddrInfo";
Hungming Chenbb90ab32019-10-28 18:20:31 +08004982 case CallType::GETHOSTBYNAME:
Hungming Chen63779052019-10-30 15:06:13 +08004983 return "GetHostByName";
Hungming Chenbb90ab32019-10-28 18:20:31 +08004984 default:
Hungming Chen63779052019-10-30 15:06:13 +08004985 return "InvalidParameter"; // Should not happen.
Hungming Chenbb90ab32019-10-28 18:20:31 +08004986 }
Hungming Chenbb90ab32019-10-28 18:20:31 +08004987 });
4988
4989TEST_P(ResolverParameterizedTest, AuthoritySectionAndAdditionalSection) {
4990 // DNS response may have more information in authority section and additional section.
4991 // Currently, getanswer() of packages/modules/DnsResolver/getaddrinfo.cpp doesn't parse the
4992 // content of authority section and additional section. Test these sections if they crash
4993 // the resolver, just in case. See also RFC 1035 section 4.1.
4994 const auto& calltype = GetParam();
4995 test::DNSHeader header(kDefaultDnsHeader);
4996
4997 // Create a DNS response which has a authoritative nameserver record in authority
4998 // section and its relevant address record in additional section.
4999 //
5000 // Question
5001 // hello.example.com. IN A
5002 // Answer
5003 // hello.example.com. IN A 1.2.3.4
5004 // Authority:
5005 // hello.example.com. IN NS ns1.example.com.
5006 // Additional:
5007 // ns1.example.com. IN A 5.6.7.8
5008 //
5009 // A response may have only question, answer, and authority section. Current testing response
5010 // should be able to cover this condition.
5011
5012 // Question section.
5013 test::DNSQuestion question{
5014 .qname = {.name = kHelloExampleCom},
5015 .qtype = ns_type::ns_t_a,
5016 .qclass = ns_c_in,
5017 };
5018 header.questions.push_back(std::move(question));
5019
5020 // Answer section.
5021 test::DNSRecord recordAnswer{
5022 .name = {.name = kHelloExampleCom},
5023 .rtype = ns_type::ns_t_a,
5024 .rclass = ns_c_in,
5025 .ttl = 0, // no cache
5026 };
Hungming Chen63779052019-10-30 15:06:13 +08005027 EXPECT_TRUE(test::DNSResponder::fillRdata(kHelloExampleComAddrV4, recordAnswer));
Hungming Chenbb90ab32019-10-28 18:20:31 +08005028 header.answers.push_back(std::move(recordAnswer));
5029
5030 // Authority section.
5031 test::DNSRecord recordAuthority{
5032 .name = {.name = kHelloExampleCom},
5033 .rtype = ns_type::ns_t_ns,
5034 .rclass = ns_c_in,
5035 .ttl = 0, // no cache
5036 };
5037 EXPECT_TRUE(test::DNSResponder::fillRdata("ns1.example.com.", recordAuthority));
5038 header.authorities.push_back(std::move(recordAuthority));
5039
5040 // Additional section.
5041 test::DNSRecord recordAdditional{
5042 .name = {.name = "ns1.example.com."},
5043 .rtype = ns_type::ns_t_a,
5044 .rclass = ns_c_in,
5045 .ttl = 0, // no cache
5046 };
5047 EXPECT_TRUE(test::DNSResponder::fillRdata("5.6.7.8", recordAdditional));
5048 header.additionals.push_back(std::move(recordAdditional));
5049
5050 // Start DNS server.
5051 test::DNSResponder dns(test::DNSResponder::MappingType::DNS_HEADER);
5052 dns.addMappingDnsHeader(kHelloExampleCom, ns_type::ns_t_a, header);
5053 ASSERT_TRUE(dns.startServer());
5054 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
5055 dns.clearQueries();
5056
5057 // Expect that get the address and the resolver doesn't crash.
Hungming Chen63779052019-10-30 15:06:13 +08005058 VerifyQueryHelloExampleComV4(dns, calltype);
5059}
5060
5061TEST_P(ResolverParameterizedTest, MessageCompression) {
5062 const auto& calltype = GetParam();
5063
5064 // The response with compressed domain name by a pointer. See RFC 1035 section 4.1.4.
5065 //
5066 // Ignoring the other fields of the message, the domain name of question section and answer
5067 // section are presented as:
5068 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5069 // 12 | 5 | h |
5070 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5071 // 14 | e | l |
5072 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5073 // 16 | l | o |
5074 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5075 // 18 | 7 | e |
5076 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5077 // 20 | x | a |
5078 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5079 // 22 | m | p |
5080 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5081 // 24 | l | e |
5082 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5083 // 26 | 3 | c |
5084 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5085 // 28 | o | m |
5086 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5087 // 30 | 0 | ... |
5088 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5089 //
5090 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5091 // 35 | 1 1| 12 |
5092 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5093 const std::vector<uint8_t> kResponseAPointer = {
5094 /* Header */
5095 0x00, 0x00, /* Transaction ID: 0x0000 */
5096 0x81, 0x80, /* Flags: qr rd ra */
5097 0x00, 0x01, /* Questions: 1 */
5098 0x00, 0x01, /* Answer RRs: 1 */
5099 0x00, 0x00, /* Authority RRs: 0 */
5100 0x00, 0x00, /* Additional RRs: 0 */
5101 /* Queries */
5102 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
5103 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name: hello.example.com */
5104 0x00, 0x01, /* Type: A */
5105 0x00, 0x01, /* Class: IN */
5106 /* Answers */
5107 0xc0, 0x0c, /* Name: hello.example.com (a pointer) */
5108 0x00, 0x01, /* Type: A */
5109 0x00, 0x01, /* Class: IN */
5110 0x00, 0x00, 0x00, 0x00, /* Time to live: 0 */
5111 0x00, 0x04, /* Data length: 4 */
5112 0x01, 0x02, 0x03, 0x04 /* Address: 1.2.3.4 */
5113 };
5114
5115 // The response with compressed domain name by a sequence of labels ending with a pointer. See
5116 // RFC 1035 section 4.1.4.
5117 //
5118 // Ignoring the other fields of the message, the domain name of question section and answer
5119 // section are presented as:
5120 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5121 // 12 | 5 | h |
5122 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5123 // 14 | e | l |
5124 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5125 // 16 | l | o |
5126 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5127 // 18 | 7 | e |
5128 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5129 // 20 | x | a |
5130 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5131 // 22 | m | p |
5132 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5133 // 24 | l | e |
5134 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5135 // 26 | 3 | c |
5136 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5137 // 28 | o | m |
5138 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5139 // 30 | 0 | ... |
5140 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5141 //
5142 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5143 // 35 | 5 | h |
5144 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5145 // 37 | e | l |
5146 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5147 // 39 | l | o |
5148 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5149 // 41 | 1 1| 18 |
5150 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5151 const std::vector<uint8_t> kResponseLabelEndingWithAPointer = {
5152 /* Header */
5153 0x00, 0x00, /* Transaction ID: 0x0000 */
5154 0x81, 0x80, /* Flags: qr rd ra */
5155 0x00, 0x01, /* Questions: 1 */
5156 0x00, 0x01, /* Answer RRs: 1 */
5157 0x00, 0x00, /* Authority RRs: 0 */
5158 0x00, 0x00, /* Additional RRs: 0 */
5159 /* Queries */
5160 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
5161 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name: hello.example.com */
5162 0x00, 0x01, /* Type: A */
5163 0x00, 0x01, /* Class: IN */
5164 /* Answers */
5165 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0xc0,
5166 0x12, /* Name: hello.example.com (a label ending with a pointer) */
5167 0x00, 0x01, /* Type: A */
5168 0x00, 0x01, /* Class: IN */
5169 0x00, 0x00, 0x00, 0x00, /* Time to live: 0 */
5170 0x00, 0x04, /* Data length: 4 */
5171 0x01, 0x02, 0x03, 0x04 /* Address: 1.2.3.4 */
5172 };
5173
5174 for (const auto& response : {kResponseAPointer, kResponseLabelEndingWithAPointer}) {
5175 SCOPED_TRACE(StringPrintf("Hex dump: %s", toHex(makeSlice(response)).c_str()));
5176
5177 test::DNSResponder dns(test::DNSResponder::MappingType::BINARY_PACKET);
5178 dns.addMappingBinaryPacket(kHelloExampleComQueryV4, response);
5179 StartDns(dns, {});
5180 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
5181
5182 // Expect no cache because the TTL of testing responses are 0.
5183 VerifyQueryHelloExampleComV4(dns, calltype);
Hungming Chenbb90ab32019-10-28 18:20:31 +08005184 }
Mike Yu40e67072019-10-09 21:14:09 +08005185}
Hungming Chen22617fd2019-12-06 12:15:45 +08005186
5187TEST_P(ResolverParameterizedTest, TruncatedResponse) {
5188 const auto& calltype = GetParam();
5189
Hungming Chen22617fd2019-12-06 12:15:45 +08005190 test::DNSResponder dns;
Ken Chen99344882020-01-01 14:59:38 +08005191 StartDns(dns, kLargeCnameChainRecords);
Hungming Chen22617fd2019-12-06 12:15:45 +08005192 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
5193
5194 // Expect UDP response is truncated. The resolver retries over TCP. See RFC 1035 section 4.2.1.
5195 VerifyQueryHelloExampleComV4(dns, calltype, false);
5196 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom));
5197 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom));
5198}
Luke Huang420ee622019-11-27 17:52:44 +08005199
5200TEST_F(ResolverTest, KeepListeningUDP) {
5201 constexpr char listen_addr1[] = "127.0.0.4";
5202 constexpr char listen_addr2[] = "127.0.0.5";
5203 constexpr char host_name[] = "howdy.example.com.";
5204 const std::vector<DnsRecord> records = {
5205 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
5206 };
5207 const std::vector<int> params = {300, 25, 8, 8, 1000 /* BASE_TIMEOUT_MSEC */,
5208 1 /* retry count */};
5209 const int delayTimeMs = 1500;
5210
5211 test::DNSResponder neverRespondDns(listen_addr2, "53", static_cast<ns_rcode>(-1));
5212 neverRespondDns.setResponseProbability(0.0);
5213 StartDns(neverRespondDns, records);
Luke Huangf40df9c2020-04-21 08:51:48 +08005214 ScopedSystemProperties scopedSystemProperties(
5215 "persist.device_config.netd_native.keep_listening_udp", "1");
5216 // Re-setup test network to make experiment flag take effect.
5217 resetNetwork();
Luke Huang420ee622019-11-27 17:52:44 +08005218
5219 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr1, listen_addr2},
5220 kDefaultSearchDomains, params));
5221 // There are 2 DNS servers for this test.
5222 // |delayedDns| will be blocked for |delayTimeMs|, then start to respond to requests.
5223 // |neverRespondDns| will never respond.
5224 // In the first try, resolver will send query to |delayedDns| but get timeout error
5225 // because |delayTimeMs| > DNS timeout.
5226 // Then it's the second try, resolver will send query to |neverRespondDns| and
5227 // listen on both servers. Resolver will receive the answer coming from |delayedDns|.
Luke Huang420ee622019-11-27 17:52:44 +08005228
Luke Huang420ee622019-11-27 17:52:44 +08005229 test::DNSResponder delayedDns(listen_addr1);
5230 delayedDns.setResponseDelayMs(delayTimeMs);
5231 StartDns(delayedDns, records);
5232
5233 // Specify hints to ensure resolver doing query only 1 round.
5234 const addrinfo hints = {.ai_family = AF_INET6, .ai_socktype = SOCK_DGRAM};
5235 ScopedAddrinfo result = safe_getaddrinfo(host_name, nullptr, &hints);
5236 EXPECT_TRUE(result != nullptr);
5237
5238 std::string result_str = ToString(result);
5239 EXPECT_TRUE(result_str == "::1.2.3.4") << ", result_str='" << result_str << "'";
5240}
Luke Huang0a0870d2020-02-12 20:41:10 +08005241
5242TEST_F(ResolverTest, GetAddrInfoParallelLookupTimeout) {
5243 constexpr char listen_addr[] = "127.0.0.4";
5244 constexpr char host_name[] = "howdy.example.com.";
5245 constexpr int TIMING_TOLERANCE_MS = 200;
5246 constexpr int DNS_TIMEOUT_MS = 1000;
5247 const std::vector<DnsRecord> records = {
5248 {host_name, ns_type::ns_t_a, "1.2.3.4"},
5249 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
5250 };
5251 const std::vector<int> params = {300, 25, 8, 8, DNS_TIMEOUT_MS /* BASE_TIMEOUT_MSEC */,
5252 1 /* retry count */};
5253 test::DNSResponder neverRespondDns(listen_addr, "53", static_cast<ns_rcode>(-1));
5254 neverRespondDns.setResponseProbability(0.0);
5255 StartDns(neverRespondDns, records);
Luke Huangf40df9c2020-04-21 08:51:48 +08005256 ScopedSystemProperties scopedSystemProperties(
5257 "persist.device_config.netd_native.parallel_lookup", "1");
Luke Huangd1d734f2020-04-30 12:25:40 +08005258 // The default value of parallel_lookup_sleep_time should be very small
5259 // that we can ignore in this test case.
Luke Huangf40df9c2020-04-21 08:51:48 +08005260 // Re-setup test network to make experiment flag take effect.
5261 resetNetwork();
Luke Huang0a0870d2020-02-12 20:41:10 +08005262
5263 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}, kDefaultSearchDomains, params));
5264 neverRespondDns.clearQueries();
5265
Luke Huang0a0870d2020-02-12 20:41:10 +08005266 // Use a never respond DNS server to verify if the A/AAAA queries are sent in parallel.
5267 // The resolver parameters are set to timeout 1s and retry 1 times.
5268 // So we expect the safe_getaddrinfo_time_taken() might take ~1s to
5269 // return when parallel lookup is enabled. And the DNS server should receive 2 queries.
5270 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_DGRAM};
5271 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(host_name, nullptr, hints);
5272
5273 EXPECT_TRUE(result == nullptr);
5274 EXPECT_NEAR(DNS_TIMEOUT_MS, timeTakenMs, TIMING_TOLERANCE_MS)
5275 << "took time should approximate equal timeout";
5276 EXPECT_EQ(2U, GetNumQueries(neverRespondDns, host_name));
Mike Yu532405f2020-06-17 17:46:44 +08005277 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, RCODE_TIMEOUT, host_name, {});
Luke Huang0a0870d2020-02-12 20:41:10 +08005278}
Luke Huangd1d734f2020-04-30 12:25:40 +08005279
5280TEST_F(ResolverTest, GetAddrInfoParallelLookupSleepTime) {
5281 constexpr char listen_addr[] = "127.0.0.4";
5282 constexpr int TIMING_TOLERANCE_MS = 200;
5283 const std::vector<DnsRecord> records = {
5284 {kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4},
5285 {kHelloExampleCom, ns_type::ns_t_aaaa, kHelloExampleComAddrV6},
5286 };
5287 const std::vector<int> params = {300, 25, 8, 8, 1000 /* BASE_TIMEOUT_MSEC */,
5288 1 /* retry count */};
5289 test::DNSResponder dns(listen_addr);
5290 StartDns(dns, records);
5291 ScopedSystemProperties scopedSystemProperties1(
5292 "persist.device_config.netd_native.parallel_lookup", "1");
5293 constexpr int PARALLEL_LOOKUP_SLEEP_TIME_MS = 500;
5294 ScopedSystemProperties scopedSystemProperties2(
5295 "persist.device_config.netd_native.parallel_lookup_sleep_time",
5296 std::to_string(PARALLEL_LOOKUP_SLEEP_TIME_MS));
5297 // Re-setup test network to make experiment flag take effect.
5298 resetNetwork();
5299
5300 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}, kDefaultSearchDomains, params));
5301 dns.clearQueries();
5302
5303 // Expect the safe_getaddrinfo_time_taken() might take ~500ms to return because we set
5304 // parallel_lookup_sleep_time to 500ms.
5305 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_DGRAM};
5306 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(kHelloExampleCom, nullptr, hints);
5307
5308 EXPECT_NE(nullptr, result);
5309 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(
5310 {kHelloExampleComAddrV4, kHelloExampleComAddrV6}));
5311 EXPECT_NEAR(PARALLEL_LOOKUP_SLEEP_TIME_MS, timeTakenMs, TIMING_TOLERANCE_MS)
5312 << "took time should approximate equal timeout";
5313 EXPECT_EQ(2U, GetNumQueries(dns, kHelloExampleCom));
5314
5315 // Expect the PARALLEL_LOOKUP_SLEEP_TIME_MS won't affect the query under cache hit case.
5316 dns.clearQueries();
5317 std::tie(result, timeTakenMs) = safe_getaddrinfo_time_taken(kHelloExampleCom, nullptr, hints);
5318 EXPECT_NE(nullptr, result);
5319 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(
5320 {kHelloExampleComAddrV4, kHelloExampleComAddrV6}));
5321 EXPECT_GT(PARALLEL_LOOKUP_SLEEP_TIME_MS, timeTakenMs);
5322 EXPECT_EQ(0U, GetNumQueries(dns, kHelloExampleCom));
5323}
Luke Huangeb618ef2020-05-26 14:17:02 +08005324
5325TEST_F(ResolverTest, BlockDnsQueryUidDoesNotLeadToBadServer) {
5326 // This test relies on blocking traffic on loopback, which xt_qtaguid does not do.
5327 // See aosp/358413 and b/34444781 for why.
5328 SKIP_IF_BPF_NOT_SUPPORTED;
5329
5330 constexpr char listen_addr1[] = "127.0.0.4";
5331 constexpr char listen_addr2[] = "::1";
5332 test::DNSResponder dns1(listen_addr1);
5333 test::DNSResponder dns2(listen_addr2);
5334 StartDns(dns1, {});
5335 StartDns(dns2, {});
5336
5337 std::vector<std::string> servers = {listen_addr1, listen_addr2};
5338 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
5339 dns1.clearQueries();
5340 dns2.clearQueries();
5341 {
5342 ScopeBlockedUIDRule scopeBlockUidRule(mDnsClient.netdService(), TEST_UID);
5343 // Start querying ten times.
5344 for (int i = 0; i < 10; i++) {
5345 std::string hostName = fmt::format("blocked{}.com", i);
5346 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
Luke Huang5729afc2020-07-30 23:12:17 +08005347 // The query result between R+ and Q would be different, but we don't really care
5348 // about the result here because this test is only used to ensure blocked uid rule
5349 // won't cause bad servers.
5350 safe_getaddrinfo(hostName.c_str(), nullptr, &hints);
Luke Huangeb618ef2020-05-26 14:17:02 +08005351 }
5352 }
Luke Huang5729afc2020-07-30 23:12:17 +08005353 ResolverParamsParcel setupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
5354 // If api level >= 30 (R+), expect all query packets to be blocked, hence we should not see any
5355 // of their stats show up. Otherwise, all queries should succeed.
5356 const std::vector<NameserverStats> expectedDnsStats = {
5357 NameserverStats(listen_addr1).setSuccesses(isAtLeastR ? 0 : setupParams.maxSamples),
Luke Huangeb618ef2020-05-26 14:17:02 +08005358 NameserverStats(listen_addr2),
5359 };
Luke Huang5729afc2020-07-30 23:12:17 +08005360 expectStatsEqualTo(expectedDnsStats);
5361 // If api level >= 30 (R+), expect server won't receive any queries,
5362 // otherwise expect 20 == 10 * (setupParams.domains.size() + 1) queries.
5363 EXPECT_EQ(dns1.queries().size(), isAtLeastR ? 0U : 10 * (setupParams.domains.size() + 1));
Luke Huangeb618ef2020-05-26 14:17:02 +08005364 EXPECT_EQ(dns2.queries().size(), 0U);
5365}
Mike Yu6ce587d2019-12-19 21:30:22 +08005366
Mike Yu10832aa2020-08-25 19:13:11 +08005367TEST_F(ResolverTest, DnsServerSelection) {
5368 test::DNSResponder dns1("127.0.0.3");
5369 test::DNSResponder dns2("127.0.0.4");
5370 test::DNSResponder dns3("127.0.0.5");
5371
5372 dns1.setResponseDelayMs(10);
5373 dns2.setResponseDelayMs(25);
5374 dns3.setResponseDelayMs(50);
5375 StartDns(dns1, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
5376 StartDns(dns2, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
5377 StartDns(dns3, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
5378
5379 ScopedSystemProperties scopedSystemProperties(kSortNameserversFlag, "1");
5380
Mike Yueb8f22c2020-09-22 11:58:13 +08005381 // NOTE: the servers must be sorted alphabetically.
5382 std::vector<std::string> serverList = {
5383 dns1.listen_address(),
5384 dns2.listen_address(),
5385 dns3.listen_address(),
Mike Yu10832aa2020-08-25 19:13:11 +08005386 };
Mike Yueb8f22c2020-09-22 11:58:13 +08005387
5388 do {
Mike Yu10832aa2020-08-25 19:13:11 +08005389 SCOPED_TRACE(fmt::format("testConfig: [{}]", fmt::join(serverList, ", ")));
5390 const int queryNum = 50;
5391 int64_t accumulatedTime = 0;
5392
5393 // Restart the testing network to 1) make the flag take effect and 2) reset the statistics.
5394 resetNetwork();
5395
5396 // DnsServerSelection doesn't apply to private DNS.
5397 ResolverParamsParcel setupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
5398 setupParams.servers = serverList;
5399 setupParams.tlsServers.clear();
5400 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(setupParams));
5401
5402 // DNSResponder doesn't handle queries concurrently, so don't allow more than
5403 // one in-flight query.
5404 for (int i = 0; i < queryNum; i++) {
5405 Stopwatch s;
5406 int fd = resNetworkQuery(TEST_NETID, kHelloExampleCom, ns_c_in, ns_t_a,
5407 ANDROID_RESOLV_NO_CACHE_LOOKUP);
5408 expectAnswersValid(fd, AF_INET, kHelloExampleComAddrV4);
5409 accumulatedTime += s.timeTakenUs();
5410 }
5411
5412 const int dns1Count = dns1.queries().size();
5413 const int dns2Count = dns2.queries().size();
5414 const int dns3Count = dns3.queries().size();
5415
5416 // All of the servers have ever been selected. In addition, the less latency server
5417 // is selected more frequently.
5418 EXPECT_GT(dns1Count, 0);
5419 EXPECT_GT(dns2Count, 0);
5420 EXPECT_GT(dns3Count, 0);
5421 EXPECT_GT(dns1Count, dns2Count);
5422 EXPECT_GT(dns2Count, dns3Count);
5423
Mike Yueb8f22c2020-09-22 11:58:13 +08005424 const int averageTime = accumulatedTime / queryNum;
5425 LOG(INFO) << "ResolverTest#DnsServerSelection: averageTime " << averageTime << "us";
Mike Yu10832aa2020-08-25 19:13:11 +08005426
Mike Yueb8f22c2020-09-22 11:58:13 +08005427 // Since the average Time might differ depending on parameters, set [10ms, 20ms] as
Mike Yu10832aa2020-08-25 19:13:11 +08005428 // acceptable range.
Mike Yueb8f22c2020-09-22 11:58:13 +08005429 EXPECT_GE(averageTime, 10000);
5430 EXPECT_LE(averageTime, 20000);
Mike Yu10832aa2020-08-25 19:13:11 +08005431
5432 dns1.clearQueries();
5433 dns2.clearQueries();
5434 dns3.clearQueries();
Mike Yueb8f22c2020-09-22 11:58:13 +08005435 } while (std::next_permutation(serverList.begin(), serverList.end()));
Mike Yu10832aa2020-08-25 19:13:11 +08005436}
5437
Mike Yu6ce587d2019-12-19 21:30:22 +08005438// ResolverMultinetworkTest is used to verify multinetwork functionality. Here's how it works:
5439// The resolver sends queries to address A, and then there will be a TunForwarder helping forward
5440// the packets to address B, which is the address on which the testing server is listening. The
5441// answer packets responded from the testing server go through the reverse path back to the
5442// resolver.
5443//
5444// To achieve the that, it needs to set up a interface with routing rules. Tests are not
5445// supposed to initiate DNS servers on their own; instead, some utilities are added to the class to
5446// help the setup.
5447//
5448// An example of how to use it:
5449// TEST_F() {
Luke Huang81568fb2020-07-13 00:55:12 +08005450// ScopedPhysicalNetwork network = CreateScopedPhysicalNetwork(V4);
Mike Yu6ce587d2019-12-19 21:30:22 +08005451// network.init();
5452//
5453// auto dns = network.addIpv4Dns();
5454// StartDns(dns.dnsServer, {});
5455//
Luke Huang81568fb2020-07-13 00:55:12 +08005456// network.setDnsConfiguration();
Mike Yu6ce587d2019-12-19 21:30:22 +08005457// network.startTunForwarder();
5458//
5459// // Send queries here
5460// }
5461
5462class ResolverMultinetworkTest : public ResolverTest {
5463 protected:
5464 enum class ConnectivityType { V4, V6, V4V6 };
Luke Huang81568fb2020-07-13 00:55:12 +08005465 static constexpr int TEST_NETID_BASE = 10000;
Mike Yu6ce587d2019-12-19 21:30:22 +08005466
5467 struct DnsServerPair {
Luke Huang81568fb2020-07-13 00:55:12 +08005468 DnsServerPair(std::shared_ptr<test::DNSResponder> server, std::string addr)
5469 : dnsServer(server), dnsAddr(addr) {}
5470 std::shared_ptr<test::DNSResponder> dnsServer;
Mike Yu6ce587d2019-12-19 21:30:22 +08005471 std::string dnsAddr; // The DNS server address used for setResolverConfiguration().
5472 // TODO: Add test::DnsTlsFrontend* and std::string for DoT.
5473 };
5474
5475 class ScopedNetwork {
5476 public:
5477 ScopedNetwork(unsigned netId, ConnectivityType type, INetd* netdSrv,
Luke Huang81568fb2020-07-13 00:55:12 +08005478 IDnsResolver* dnsResolvSrv, const char* networkName)
Mike Yu6ce587d2019-12-19 21:30:22 +08005479 : mNetId(netId),
5480 mConnectivityType(type),
5481 mNetdSrv(netdSrv),
Luke Huang81568fb2020-07-13 00:55:12 +08005482 mDnsResolvSrv(dnsResolvSrv),
5483 mNetworkName(networkName) {
5484 mIfname = fmt::format("testtun{}", netId);
Mike Yu6ce587d2019-12-19 21:30:22 +08005485 }
Luke Huang81568fb2020-07-13 00:55:12 +08005486 virtual ~ScopedNetwork() {
5487 if (mNetdSrv != nullptr) mNetdSrv->networkDestroy(mNetId);
5488 if (mDnsResolvSrv != nullptr) mDnsResolvSrv->destroyNetworkCache(mNetId);
5489 }
Mike Yu6ce587d2019-12-19 21:30:22 +08005490
5491 Result<void> init();
Mike Yu6ce587d2019-12-19 21:30:22 +08005492 Result<DnsServerPair> addIpv4Dns() { return addDns(ConnectivityType::V4); }
5493 Result<DnsServerPair> addIpv6Dns() { return addDns(ConnectivityType::V6); }
5494 bool startTunForwarder() { return mTunForwarder->startForwarding(); }
Luke Huang81568fb2020-07-13 00:55:12 +08005495 bool setDnsConfiguration() const;
5496 bool clearDnsConfiguration() const;
Mike Yu6ce587d2019-12-19 21:30:22 +08005497 unsigned netId() const { return mNetId; }
Luke Huang81568fb2020-07-13 00:55:12 +08005498 std::string name() const { return mNetworkName; }
Mike Yu6ce587d2019-12-19 21:30:22 +08005499
Luke Huang81568fb2020-07-13 00:55:12 +08005500 protected:
5501 // Subclasses should implement it to decide which network should be create.
5502 virtual Result<void> createNetwork() const = 0;
Mike Yu6ce587d2019-12-19 21:30:22 +08005503
5504 const unsigned mNetId;
5505 const ConnectivityType mConnectivityType;
5506 INetd* mNetdSrv;
5507 IDnsResolver* mDnsResolvSrv;
Luke Huang81568fb2020-07-13 00:55:12 +08005508 const std::string mNetworkName;
Mike Yu6ce587d2019-12-19 21:30:22 +08005509 std::string mIfname;
5510 std::unique_ptr<TunForwarder> mTunForwarder;
Luke Huang81568fb2020-07-13 00:55:12 +08005511 std::vector<DnsServerPair> mDnsServerPairs;
5512
5513 private:
5514 Result<DnsServerPair> addDns(ConnectivityType connectivity);
5515 // Assuming mNetId is unique during ResolverMultinetworkTest, make the
5516 // address based on it to avoid conflicts.
5517 std::string makeIpv4AddrString(uint8_t n) const {
5518 return StringPrintf("192.168.%u.%u", (mNetId - TEST_NETID_BASE), n);
5519 }
5520 std::string makeIpv6AddrString(uint8_t n) const {
5521 return StringPrintf("2001:db8:%u::%u", (mNetId - TEST_NETID_BASE), n);
5522 }
5523 };
5524
5525 class ScopedPhysicalNetwork : public ScopedNetwork {
5526 public:
5527 ScopedPhysicalNetwork(unsigned netId, const char* networkName)
5528 : ScopedNetwork(netId, ConnectivityType::V4V6, nullptr, nullptr, networkName) {}
5529 ScopedPhysicalNetwork(unsigned netId, ConnectivityType type, INetd* netdSrv,
5530 IDnsResolver* dnsResolvSrv, const char* name = "Physical")
5531 : ScopedNetwork(netId, type, netdSrv, dnsResolvSrv, name) {}
5532
5533 protected:
5534 Result<void> createNetwork() const override {
5535 if (auto r = mNetdSrv->networkCreatePhysical(mNetId, INetd::PERMISSION_NONE);
5536 !r.isOk()) {
5537 return Error() << r.getMessage();
5538 }
5539 return {};
5540 }
5541 };
5542
5543 class ScopedVirtualNetwork : public ScopedNetwork {
5544 public:
5545 ScopedVirtualNetwork(unsigned netId, ConnectivityType type, INetd* netdSrv,
5546 IDnsResolver* dnsResolvSrv, const char* name, bool isSecure)
5547 : ScopedNetwork(netId, type, netdSrv, dnsResolvSrv, name), mIsSecure(isSecure) {}
5548 ~ScopedVirtualNetwork() {
5549 if (!mVpnIsolationUids.empty()) {
5550 const std::vector<int> tmpUids(mVpnIsolationUids.begin(), mVpnIsolationUids.end());
5551 mNetdSrv->firewallRemoveUidInterfaceRules(tmpUids);
5552 }
5553 }
5554 // Enable VPN isolation. Ensures that uid can only receive packets on mIfname.
5555 Result<void> enableVpnIsolation(int uid) {
5556 if (auto r = mNetdSrv->firewallAddUidInterfaceRules(mIfname, {uid}); !r.isOk()) {
5557 return Error() << r.getMessage();
5558 }
5559 mVpnIsolationUids.insert(uid);
5560 return {};
5561 }
5562 Result<void> disableVpnIsolation(int uid) {
5563 if (auto r = mNetdSrv->firewallRemoveUidInterfaceRules({static_cast<int>(uid)});
5564 !r.isOk()) {
5565 return Error() << r.getMessage();
5566 }
5567 mVpnIsolationUids.erase(uid);
5568 return {};
5569 }
5570 Result<void> addUser(uid_t uid) const { return addUidRange(uid, uid); }
5571 Result<void> addUidRange(uid_t from, uid_t to) const {
5572 if (auto r = mNetdSrv->networkAddUidRanges(mNetId, {makeUidRangeParcel(from, to)});
5573 !r.isOk()) {
5574 return Error() << r.getMessage();
5575 }
5576 return {};
5577 }
5578
5579 protected:
5580 Result<void> createNetwork() const override {
5581 if (auto r = mNetdSrv->networkCreateVpn(mNetId, mIsSecure); !r.isOk()) {
5582 return Error() << r.getMessage();
5583 }
5584 return {};
5585 }
5586
5587 bool mIsSecure = false;
5588 std::unordered_set<int> mVpnIsolationUids;
Mike Yu6ce587d2019-12-19 21:30:22 +08005589 };
5590
5591 void SetUp() override {
5592 ResolverTest::SetUp();
5593 ASSERT_NE(mDnsClient.netdService(), nullptr);
5594 ASSERT_NE(mDnsClient.resolvService(), nullptr);
5595 }
5596
Luke Huang81568fb2020-07-13 00:55:12 +08005597 void TearDown() override {
5598 ResolverTest::TearDown();
5599 // Restore default network
5600 if (mStoredDefaultNetwork >= 0) {
5601 mDnsClient.netdService()->networkSetDefault(mStoredDefaultNetwork);
5602 }
5603 }
Mike Yu6ce587d2019-12-19 21:30:22 +08005604
Luke Huang81568fb2020-07-13 00:55:12 +08005605 ScopedPhysicalNetwork CreateScopedPhysicalNetwork(ConnectivityType type,
5606 const char* name = "Physical") {
5607 return {getFreeNetId(), type, mDnsClient.netdService(), mDnsClient.resolvService(), name};
5608 }
5609 ScopedVirtualNetwork CreateScopedVirtualNetwork(ConnectivityType type, bool isSecure,
5610 const char* name = "Virtual") {
5611 return {getFreeNetId(), type, mDnsClient.netdService(), mDnsClient.resolvService(),
5612 name, isSecure};
5613 }
Mike Yu6ce587d2019-12-19 21:30:22 +08005614 void StartDns(test::DNSResponder& dns, const std::vector<DnsRecord>& records);
Luke Huang81568fb2020-07-13 00:55:12 +08005615 void setDefaultNetwork(int netId) {
5616 // Save current default network at the first call.
5617 std::call_once(defaultNetworkFlag, [&]() {
5618 ASSERT_TRUE(mDnsClient.netdService()->networkGetDefault(&mStoredDefaultNetwork).isOk());
5619 });
5620 ASSERT_TRUE(mDnsClient.netdService()->networkSetDefault(netId).isOk());
5621 }
5622 unsigned getFreeNetId() {
5623 if (mNextNetId == TEST_NETID_BASE + 256) mNextNetId = TEST_NETID_BASE;
5624 return mNextNetId++;
5625 }
Mike Yu6ce587d2019-12-19 21:30:22 +08005626
5627 private:
5628 // Use a different netId because this class inherits from the class ResolverTest which
Luke Huang81568fb2020-07-13 00:55:12 +08005629 // always creates TEST_NETID in setup. It's incremented when CreateScoped{Physical,
5630 // Virtual}Network() is called.
5631 // Note: 255 is the maximum number of (mNextNetId - TEST_NETID_BASE) here as mNextNetId
5632 // is used to create address.
5633 unsigned mNextNetId = TEST_NETID_BASE;
5634 // Use -1 to represent that default network was not modified because
5635 // real netId must be an unsigned value.
5636 int mStoredDefaultNetwork = -1;
5637 std::once_flag defaultNetworkFlag;
Mike Yu6ce587d2019-12-19 21:30:22 +08005638};
5639
Mike Yu6ce587d2019-12-19 21:30:22 +08005640Result<void> ResolverMultinetworkTest::ScopedNetwork::init() {
Luke Huang81568fb2020-07-13 00:55:12 +08005641 if (mNetdSrv == nullptr || mDnsResolvSrv == nullptr) return Error() << "srv not available";
Mike Yu6ce587d2019-12-19 21:30:22 +08005642 unique_fd ufd = TunForwarder::createTun(mIfname);
5643 if (!ufd.ok()) {
5644 return Errorf("createTun for {} failed", mIfname);
5645 }
5646 mTunForwarder = std::make_unique<TunForwarder>(std::move(ufd));
5647
Luke Huang81568fb2020-07-13 00:55:12 +08005648 if (auto r = createNetwork(); !r.ok()) {
5649 return r;
Mike Yu6ce587d2019-12-19 21:30:22 +08005650 }
5651 if (auto r = mDnsResolvSrv->createNetworkCache(mNetId); !r.isOk()) {
5652 return Error() << r.getMessage();
5653 }
5654 if (auto r = mNetdSrv->networkAddInterface(mNetId, mIfname); !r.isOk()) {
5655 return Error() << r.getMessage();
5656 }
5657
5658 if (mConnectivityType == ConnectivityType::V4 || mConnectivityType == ConnectivityType::V4V6) {
5659 const std::string v4Addr = makeIpv4AddrString(1);
5660 if (auto r = mNetdSrv->interfaceAddAddress(mIfname, v4Addr, 32); !r.isOk()) {
5661 return Error() << r.getMessage();
5662 }
5663 if (auto r = mNetdSrv->networkAddRoute(mNetId, mIfname, "0.0.0.0/0", ""); !r.isOk()) {
5664 return Error() << r.getMessage();
5665 }
5666 }
5667 if (mConnectivityType == ConnectivityType::V6 || mConnectivityType == ConnectivityType::V4V6) {
5668 const std::string v6Addr = makeIpv6AddrString(1);
5669 if (auto r = mNetdSrv->interfaceAddAddress(mIfname, v6Addr, 128); !r.isOk()) {
5670 return Error() << r.getMessage();
5671 }
5672 if (auto r = mNetdSrv->networkAddRoute(mNetId, mIfname, "::/0", ""); !r.isOk()) {
5673 return Error() << r.getMessage();
5674 }
5675 }
5676
5677 return {};
5678}
5679
Mike Yu6ce587d2019-12-19 21:30:22 +08005680void ResolverMultinetworkTest::StartDns(test::DNSResponder& dns,
5681 const std::vector<DnsRecord>& records) {
5682 ResolverTest::StartDns(dns, records);
5683
5684 // Bind the DNSResponder's sockets to the network if specified.
5685 if (std::optional<unsigned> netId = dns.getNetwork(); netId.has_value()) {
5686 setNetworkForSocket(netId.value(), dns.getUdpSocket());
5687 setNetworkForSocket(netId.value(), dns.getTcpSocket());
5688 }
5689}
5690
5691Result<ResolverMultinetworkTest::DnsServerPair> ResolverMultinetworkTest::ScopedNetwork::addDns(
5692 ConnectivityType type) {
Luke Huang81568fb2020-07-13 00:55:12 +08005693 const int index = mDnsServerPairs.size();
Mike Yu6ce587d2019-12-19 21:30:22 +08005694 const int prefixLen = (type == ConnectivityType::V4) ? 32 : 128;
5695
5696 const std::function<std::string(unsigned)> makeIpString =
5697 std::bind((type == ConnectivityType::V4) ? &ScopedNetwork::makeIpv4AddrString
5698 : &ScopedNetwork::makeIpv6AddrString,
5699 this, std::placeholders::_1);
5700
5701 std::string src1 = makeIpString(1); // The address from which the resolver will send.
Luke Huang81568fb2020-07-13 00:55:12 +08005702 std::string dst1 = makeIpString(
5703 index + 100 +
5704 (mNetId - TEST_NETID_BASE)); // The address to which the resolver will send.
Mike Yu6ce587d2019-12-19 21:30:22 +08005705 std::string src2 = dst1; // The address translated from src1.
Luke Huang81568fb2020-07-13 00:55:12 +08005706 std::string dst2 = makeIpString(
5707 index + 200 + (mNetId - TEST_NETID_BASE)); // The address translated from dst2.
Mike Yu6ce587d2019-12-19 21:30:22 +08005708
5709 if (!mTunForwarder->addForwardingRule({src1, dst1}, {src2, dst2}) ||
5710 !mTunForwarder->addForwardingRule({dst2, src2}, {dst1, src1})) {
5711 return Errorf("Failed to add the rules ({}, {}, {}, {})", src1, dst1, src2, dst2);
5712 }
5713
5714 if (!mNetdSrv->interfaceAddAddress(mIfname, dst2, prefixLen).isOk()) {
5715 return Errorf("interfaceAddAddress({}, {}, {}) failed", mIfname, dst2, prefixLen);
5716 }
5717
Luke Huang81568fb2020-07-13 00:55:12 +08005718 return mDnsServerPairs.emplace_back(std::make_shared<test::DNSResponder>(mNetId, dst2), dst1);
Mike Yu6ce587d2019-12-19 21:30:22 +08005719}
5720
Luke Huang81568fb2020-07-13 00:55:12 +08005721bool ResolverMultinetworkTest::ScopedNetwork::setDnsConfiguration() const {
5722 if (mDnsResolvSrv == nullptr) return false;
5723 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
5724 parcel.tlsServers.clear();
5725 parcel.netId = mNetId;
5726 parcel.servers.clear();
5727 for (const auto& pair : mDnsServerPairs) {
5728 parcel.servers.push_back(pair.dnsAddr);
5729 }
5730 return mDnsResolvSrv->setResolverConfiguration(parcel).isOk();
5731}
5732
5733bool ResolverMultinetworkTest::ScopedNetwork::clearDnsConfiguration() const {
5734 if (mDnsResolvSrv == nullptr) return false;
5735 return mDnsResolvSrv->destroyNetworkCache(mNetId).isOk() &&
5736 mDnsResolvSrv->createNetworkCache(mNetId).isOk();
5737}
5738
5739namespace {
5740
5741// Convenient wrapper for making getaddrinfo call like framework.
5742Result<ScopedAddrinfo> android_getaddrinfofornet_wrapper(const char* name, int netId) {
5743 // Use the same parameter as libcore/ojluni/src/main/java/java/net/Inet6AddressImpl.java.
5744 static const addrinfo hints = {
5745 .ai_flags = AI_ADDRCONFIG,
5746 .ai_family = AF_UNSPEC,
5747 .ai_socktype = SOCK_STREAM,
5748 };
5749 addrinfo* result = nullptr;
5750 if (int r = android_getaddrinfofornet(name, nullptr, &hints, netId, MARK_UNSET, &result)) {
5751 return Error() << r;
5752 }
5753 return ScopedAddrinfo(result);
5754}
5755
5756void expectDnsWorksForUid(const char* name, unsigned netId, uid_t uid,
5757 const std::vector<std::string>& expectedResult) {
5758 ScopedChangeUID scopedChangeUID(uid);
5759 auto result = android_getaddrinfofornet_wrapper(name, netId);
5760 ASSERT_RESULT_OK(result);
5761 ScopedAddrinfo ai_result(std::move(result.value()));
5762 std::vector<std::string> result_strs = ToStrings(ai_result);
5763 EXPECT_THAT(result_strs, testing::UnorderedElementsAreArray(expectedResult));
5764}
5765
5766} // namespace
5767
Mike Yu6ce587d2019-12-19 21:30:22 +08005768TEST_F(ResolverMultinetworkTest, GetAddrInfo_AI_ADDRCONFIG) {
5769 constexpr char host_name[] = "ohayou.example.com.";
5770
5771 const std::array<ConnectivityType, 3> allTypes = {
5772 ConnectivityType::V4,
5773 ConnectivityType::V6,
5774 ConnectivityType::V4V6,
5775 };
5776 for (const auto& type : allTypes) {
5777 SCOPED_TRACE(StringPrintf("ConnectivityType: %d", type));
5778
5779 // Create a network.
Luke Huang81568fb2020-07-13 00:55:12 +08005780 ScopedPhysicalNetwork network = CreateScopedPhysicalNetwork(type);
Mike Yu6ce587d2019-12-19 21:30:22 +08005781 ASSERT_RESULT_OK(network.init());
5782
5783 // Add a testing DNS server.
5784 const Result<DnsServerPair> dnsPair =
5785 (type == ConnectivityType::V4) ? network.addIpv4Dns() : network.addIpv6Dns();
5786 ASSERT_RESULT_OK(dnsPair);
Luke Huang81568fb2020-07-13 00:55:12 +08005787 StartDns(*dnsPair->dnsServer, {{host_name, ns_type::ns_t_a, "192.0.2.0"},
5788 {host_name, ns_type::ns_t_aaaa, "2001:db8:cafe:d00d::31"}});
Mike Yu6ce587d2019-12-19 21:30:22 +08005789
5790 // Set up resolver and start forwarding.
Luke Huang81568fb2020-07-13 00:55:12 +08005791 ASSERT_TRUE(network.setDnsConfiguration());
Mike Yu6ce587d2019-12-19 21:30:22 +08005792 ASSERT_TRUE(network.startTunForwarder());
5793
Luke Huang81568fb2020-07-13 00:55:12 +08005794 auto result = android_getaddrinfofornet_wrapper(host_name, network.netId());
5795 ASSERT_RESULT_OK(result);
5796 ScopedAddrinfo ai_result(std::move(result.value()));
Mike Yu6ce587d2019-12-19 21:30:22 +08005797 std::vector<std::string> result_strs = ToStrings(ai_result);
5798 std::vector<std::string> expectedResult;
5799 size_t expectedQueries = 0;
5800
5801 if (type == ConnectivityType::V6 || type == ConnectivityType::V4V6) {
5802 expectedResult.emplace_back("2001:db8:cafe:d00d::31");
5803 expectedQueries++;
5804 }
5805 if (type == ConnectivityType::V4 || type == ConnectivityType::V4V6) {
Luke Huang81568fb2020-07-13 00:55:12 +08005806 expectedResult.emplace_back("192.0.2.0");
Mike Yu6ce587d2019-12-19 21:30:22 +08005807 expectedQueries++;
5808 }
5809 EXPECT_THAT(result_strs, testing::UnorderedElementsAreArray(expectedResult));
Luke Huang81568fb2020-07-13 00:55:12 +08005810 EXPECT_EQ(GetNumQueries(*dnsPair->dnsServer, host_name), expectedQueries);
Mike Yu6ce587d2019-12-19 21:30:22 +08005811 }
5812}
5813
5814TEST_F(ResolverMultinetworkTest, NetworkDestroyedDuringQueryInFlight) {
5815 constexpr char host_name[] = "ohayou.example.com.";
5816
5817 // Create a network and add an ipv4 DNS server.
Luke Huang81568fb2020-07-13 00:55:12 +08005818 auto network = std::make_unique<ScopedPhysicalNetwork>(getFreeNetId(), ConnectivityType::V4V6,
5819 mDnsClient.netdService(),
5820 mDnsClient.resolvService());
Mike Yu6ce587d2019-12-19 21:30:22 +08005821 ASSERT_RESULT_OK(network->init());
5822 const Result<DnsServerPair> dnsPair = network->addIpv4Dns();
5823 ASSERT_RESULT_OK(dnsPair);
5824
5825 // Set the DNS server unresponsive.
Luke Huang81568fb2020-07-13 00:55:12 +08005826 dnsPair->dnsServer->setResponseProbability(0.0);
5827 dnsPair->dnsServer->setErrorRcode(static_cast<ns_rcode>(-1));
5828 StartDns(*dnsPair->dnsServer, {});
Mike Yu6ce587d2019-12-19 21:30:22 +08005829
5830 // Set up resolver and start forwarding.
Luke Huang81568fb2020-07-13 00:55:12 +08005831 ASSERT_TRUE(network->setDnsConfiguration());
Mike Yu6ce587d2019-12-19 21:30:22 +08005832 ASSERT_TRUE(network->startTunForwarder());
5833
5834 // Expect the things happening in order:
5835 // 1. The thread sends the query to the dns server which is unresponsive.
5836 // 2. The network is destroyed while the thread is waiting for the response from the dns server.
5837 // 3. After the dns server timeout, the thread retries but fails to connect.
5838 std::thread lookup([&]() {
5839 int fd = resNetworkQuery(network->netId(), host_name, ns_c_in, ns_t_a, 0);
5840 EXPECT_TRUE(fd != -1);
5841 expectAnswersNotValid(fd, -ETIMEDOUT);
5842 });
5843
5844 // Tear down the network as soon as the dns server receives the query.
Luke Huang81568fb2020-07-13 00:55:12 +08005845 const auto condition = [&]() { return GetNumQueries(*dnsPair->dnsServer, host_name) == 1U; };
Mike Yu6ce587d2019-12-19 21:30:22 +08005846 EXPECT_TRUE(PollForCondition(condition));
5847 network.reset();
5848
5849 lookup.join();
5850}
5851
5852TEST_F(ResolverMultinetworkTest, OneCachePerNetwork) {
5853 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
5854 constexpr char host_name[] = "ohayou.example.com.";
5855
Luke Huang81568fb2020-07-13 00:55:12 +08005856 ScopedPhysicalNetwork network1 = CreateScopedPhysicalNetwork(ConnectivityType::V4V6);
5857 ScopedPhysicalNetwork network2 = CreateScopedPhysicalNetwork(ConnectivityType::V4V6);
Mike Yu6ce587d2019-12-19 21:30:22 +08005858 ASSERT_RESULT_OK(network1.init());
5859 ASSERT_RESULT_OK(network2.init());
5860
5861 const Result<DnsServerPair> dnsPair1 = network1.addIpv4Dns();
5862 const Result<DnsServerPair> dnsPair2 = network2.addIpv4Dns();
5863 ASSERT_RESULT_OK(dnsPair1);
5864 ASSERT_RESULT_OK(dnsPair2);
Luke Huang81568fb2020-07-13 00:55:12 +08005865 StartDns(*dnsPair1->dnsServer, {{host_name, ns_type::ns_t_a, "192.0.2.0"}});
5866 StartDns(*dnsPair2->dnsServer, {{host_name, ns_type::ns_t_a, "192.0.2.1"}});
Mike Yu6ce587d2019-12-19 21:30:22 +08005867
5868 // Set up resolver for network 1 and start forwarding.
Luke Huang81568fb2020-07-13 00:55:12 +08005869 ASSERT_TRUE(network1.setDnsConfiguration());
Mike Yu6ce587d2019-12-19 21:30:22 +08005870 ASSERT_TRUE(network1.startTunForwarder());
5871
5872 // Set up resolver for network 2 and start forwarding.
Luke Huang81568fb2020-07-13 00:55:12 +08005873 ASSERT_TRUE(network2.setDnsConfiguration());
Mike Yu6ce587d2019-12-19 21:30:22 +08005874 ASSERT_TRUE(network2.startTunForwarder());
5875
5876 // Send the same queries to both networks.
5877 int fd1 = resNetworkQuery(network1.netId(), host_name, ns_c_in, ns_t_a, 0);
5878 int fd2 = resNetworkQuery(network2.netId(), host_name, ns_c_in, ns_t_a, 0);
5879
Luke Huang81568fb2020-07-13 00:55:12 +08005880 expectAnswersValid(fd1, AF_INET, "192.0.2.0");
5881 expectAnswersValid(fd2, AF_INET, "192.0.2.1");
5882 EXPECT_EQ(GetNumQueries(*dnsPair1->dnsServer, host_name), 1U);
5883 EXPECT_EQ(GetNumQueries(*dnsPair2->dnsServer, host_name), 1U);
Mike Yu6ce587d2019-12-19 21:30:22 +08005884
5885 // Flush the cache of network 1, and send the queries again.
5886 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(network1.netId()).isOk());
5887 fd1 = resNetworkQuery(network1.netId(), host_name, ns_c_in, ns_t_a, 0);
5888 fd2 = resNetworkQuery(network2.netId(), host_name, ns_c_in, ns_t_a, 0);
5889
Luke Huang81568fb2020-07-13 00:55:12 +08005890 expectAnswersValid(fd1, AF_INET, "192.0.2.0");
5891 expectAnswersValid(fd2, AF_INET, "192.0.2.1");
5892 EXPECT_EQ(GetNumQueries(*dnsPair1->dnsServer, host_name), 2U);
5893 EXPECT_EQ(GetNumQueries(*dnsPair2->dnsServer, host_name), 1U);
5894}
5895
5896TEST_F(ResolverMultinetworkTest, DnsWithVpn) {
5897 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
5898 SKIP_IF_BPF_NOT_SUPPORTED;
5899 constexpr char host_name[] = "ohayou.example.com.";
5900 constexpr char ipv4_addr[] = "192.0.2.0";
5901 constexpr char ipv6_addr[] = "2001:db8:cafe:d00d::31";
5902
5903 const std::pair<ConnectivityType, std::vector<std::string>> testPairs[] = {
5904 {ConnectivityType::V4, {ipv4_addr}},
5905 {ConnectivityType::V6, {ipv6_addr}},
5906 {ConnectivityType::V4V6, {ipv6_addr, ipv4_addr}},
5907 };
5908 for (const auto& [type, result] : testPairs) {
5909 SCOPED_TRACE(StringPrintf("ConnectivityType: %d", type));
5910
5911 // Create a network.
5912 ScopedPhysicalNetwork underlyingNetwork = CreateScopedPhysicalNetwork(type, "Underlying");
5913 ScopedVirtualNetwork bypassableVpnNetwork =
5914 CreateScopedVirtualNetwork(type, false, "BypassableVpn");
5915 ScopedVirtualNetwork secureVpnNetwork = CreateScopedVirtualNetwork(type, true, "SecureVpn");
5916
5917 ASSERT_RESULT_OK(underlyingNetwork.init());
5918 ASSERT_RESULT_OK(bypassableVpnNetwork.init());
5919 ASSERT_RESULT_OK(secureVpnNetwork.init());
5920 ASSERT_RESULT_OK(bypassableVpnNetwork.addUser(TEST_UID));
5921 ASSERT_RESULT_OK(secureVpnNetwork.addUser(TEST_UID2));
5922
5923 auto setupDnsFn = [&](std::shared_ptr<test::DNSResponder> dnsServer,
5924 ScopedNetwork* nw) -> void {
5925 StartDns(*dnsServer, {{host_name, ns_type::ns_t_a, ipv4_addr},
5926 {host_name, ns_type::ns_t_aaaa, ipv6_addr}});
5927 ASSERT_TRUE(nw->setDnsConfiguration());
5928 ASSERT_TRUE(nw->startTunForwarder());
5929 };
5930 // Add a testing DNS server to networks.
5931 const Result<DnsServerPair> underlyingPair = (type == ConnectivityType::V4)
5932 ? underlyingNetwork.addIpv4Dns()
5933 : underlyingNetwork.addIpv6Dns();
5934 ASSERT_RESULT_OK(underlyingPair);
5935 const Result<DnsServerPair> bypassableVpnPair = (type == ConnectivityType::V4)
5936 ? bypassableVpnNetwork.addIpv4Dns()
5937 : bypassableVpnNetwork.addIpv6Dns();
5938 ASSERT_RESULT_OK(bypassableVpnPair);
5939 const Result<DnsServerPair> secureVpnPair = (type == ConnectivityType::V4)
5940 ? secureVpnNetwork.addIpv4Dns()
5941 : secureVpnNetwork.addIpv6Dns();
5942 ASSERT_RESULT_OK(secureVpnPair);
5943 // Set up resolver and start forwarding for networks.
5944 setupDnsFn(underlyingPair->dnsServer, &underlyingNetwork);
5945 setupDnsFn(bypassableVpnPair->dnsServer, &bypassableVpnNetwork);
5946 setupDnsFn(secureVpnPair->dnsServer, &secureVpnNetwork);
5947
5948 setDefaultNetwork(underlyingNetwork.netId());
5949 const unsigned underlyingNetId = underlyingNetwork.netId();
5950 const unsigned bypassableVpnNetId = bypassableVpnNetwork.netId();
5951 const unsigned secureVpnNetId = secureVpnNetwork.netId();
5952 // We've called setNetworkForProcess in SetupOemNetwork, so reset to default first.
5953 ScopedSetNetworkForProcess scopedSetNetworkForProcess(NETID_UNSET);
5954 auto expectDnsQueryCountsFn = [&](size_t count,
5955 std::shared_ptr<test::DNSResponder> dnsServer,
5956 unsigned expectedDnsNetId) -> void {
5957 EXPECT_EQ(GetNumQueries(*dnsServer, host_name), count);
5958 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(expectedDnsNetId).isOk());
5959 dnsServer->clearQueries();
5960 // Give DnsResolver some time to clear cache to avoid race.
5961 usleep(5 * 1000);
5962 };
5963
5964 // Create a object to represent default network, do not init it.
5965 ScopedPhysicalNetwork defaultNetwork{NETID_UNSET, "Default"};
5966
5967 // Test VPN with DNS server under 4 different network selection scenarios.
5968 // See the test config for the expectation.
5969 const struct TestConfig {
5970 ScopedNetwork* selectedNetwork;
5971 unsigned expectedDnsNetId;
5972 std::shared_ptr<test::DNSResponder> expectedDnsServer;
5973 } vpnWithDnsServerConfigs[]{
5974 // clang-format off
5975 // Queries use the bypassable VPN by default.
5976 {&defaultNetwork, bypassableVpnNetId, bypassableVpnPair->dnsServer},
5977 // Choosing the underlying network works because the VPN is bypassable.
5978 {&underlyingNetwork, underlyingNetId, underlyingPair->dnsServer},
5979 // Selecting the VPN sends the query on the VPN.
5980 {&bypassableVpnNetwork, bypassableVpnNetId, bypassableVpnPair->dnsServer},
5981 // TEST_UID does not have access to the secure VPN.
5982 {&secureVpnNetwork, bypassableVpnNetId, bypassableVpnPair->dnsServer},
5983 // clang-format on
5984 };
5985 for (const auto& config : vpnWithDnsServerConfigs) {
5986 SCOPED_TRACE(fmt::format("Bypassble VPN with DnsServer, selectedNetwork = {}",
5987 config.selectedNetwork->name()));
5988 expectDnsWorksForUid(host_name, config.selectedNetwork->netId(), TEST_UID, result);
5989 expectDnsQueryCountsFn(result.size(), config.expectedDnsServer,
5990 config.expectedDnsNetId);
5991 }
5992
5993 std::vector<ScopedNetwork*> nwVec{&defaultNetwork, &underlyingNetwork,
5994 &bypassableVpnNetwork, &secureVpnNetwork};
5995 // Test the VPN without DNS server with the same combination as before.
5996 ASSERT_TRUE(bypassableVpnNetwork.clearDnsConfiguration());
5997 // Test bypassable VPN, TEST_UID
5998 for (const auto* selectedNetwork : nwVec) {
5999 SCOPED_TRACE(fmt::format("Bypassble VPN without DnsServer, selectedNetwork = {}",
6000 selectedNetwork->name()));
6001 expectDnsWorksForUid(host_name, selectedNetwork->netId(), TEST_UID, result);
6002 expectDnsQueryCountsFn(result.size(), underlyingPair->dnsServer, underlyingNetId);
6003 }
6004
6005 // The same test scenario as before plus enableVpnIsolation for secure VPN, TEST_UID2.
6006 for (bool enableVpnIsolation : {false, true}) {
6007 SCOPED_TRACE(fmt::format("enableVpnIsolation = {}", enableVpnIsolation));
6008 if (enableVpnIsolation) {
6009 EXPECT_RESULT_OK(secureVpnNetwork.enableVpnIsolation(TEST_UID2));
6010 }
6011
6012 // Test secure VPN without DNS server.
6013 ASSERT_TRUE(secureVpnNetwork.clearDnsConfiguration());
6014 for (const auto* selectedNetwork : nwVec) {
6015 SCOPED_TRACE(fmt::format("Secure VPN without DnsServer, selectedNetwork = {}",
6016 selectedNetwork->name()));
6017 expectDnsWorksForUid(host_name, selectedNetwork->netId(), TEST_UID2, result);
6018 expectDnsQueryCountsFn(result.size(), underlyingPair->dnsServer, underlyingNetId);
6019 }
6020
6021 // Test secure VPN with DNS server.
6022 ASSERT_TRUE(secureVpnNetwork.setDnsConfiguration());
6023 for (const auto* selectedNetwork : nwVec) {
6024 SCOPED_TRACE(fmt::format("Secure VPN with DnsServer, selectedNetwork = {}",
6025 selectedNetwork->name()));
6026 expectDnsWorksForUid(host_name, selectedNetwork->netId(), TEST_UID2, result);
6027 expectDnsQueryCountsFn(result.size(), secureVpnPair->dnsServer, secureVpnNetId);
6028 }
6029
6030 if (enableVpnIsolation) {
6031 EXPECT_RESULT_OK(secureVpnNetwork.disableVpnIsolation(TEST_UID2));
6032 }
6033 }
6034 }
Mike Yu6ce587d2019-12-19 21:30:22 +08006035}