blob: e3471260382921c90f0dbe1cc46d34639d79b786 [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
80// Semi-public Bionic hook used by the NDK (frameworks/base/native/android/net.c)
81// Tested here for convenience.
82extern "C" int android_getaddrinfofornet(const char* hostname, const char* servname,
83 const addrinfo* hints, unsigned netid, unsigned mark,
84 struct addrinfo** result);
85
Mike Yu153b5b82020-03-04 19:53:54 +080086using namespace std::chrono_literals;
87
Luke Huang70070852019-11-25 18:25:50 +080088using aidl::android::net::IDnsResolver;
Luke Huangf8215372019-11-22 11:53:41 +080089using aidl::android::net::INetd;
Mike Yu8ac63402019-12-02 15:28:38 +080090using aidl::android::net::ResolverParamsParcel;
Mike Yu532405f2020-06-17 17:46:44 +080091using aidl::android::net::metrics::INetdEventListener;
Mike Yu6ce587d2019-12-19 21:30:22 +080092using android::base::Error;
Luke Huang9807e6b2019-05-20 16:17:12 +080093using android::base::ParseInt;
Mike Yu6ce587d2019-12-19 21:30:22 +080094using android::base::Result;
Ken Chenb9fa2062018-11-13 21:51:13 +080095using android::base::StringPrintf;
Luke Huang9807e6b2019-05-20 16:17:12 +080096using android::base::unique_fd;
Ken Chenb9fa2062018-11-13 21:51:13 +080097using android::net::ResolverStats;
Mike Yu6ce587d2019-12-19 21:30:22 +080098using android::net::TunForwarder;
Hungming Chene8f970c2019-04-10 17:34:06 +080099using android::net::metrics::DnsMetricsListener;
Ken Chenb9fa2062018-11-13 21:51:13 +0800100using android::netdutils::enableSockopt;
Hungming Chen63779052019-10-30 15:06:13 +0800101using android::netdutils::makeSlice;
Luke Huang9807e6b2019-05-20 16:17:12 +0800102using android::netdutils::ResponseCode;
Luke Huang9d2d25b2019-06-14 00:34:05 +0800103using android::netdutils::ScopedAddrinfo;
Mike Yu40e67072019-10-09 21:14:09 +0800104using android::netdutils::Stopwatch;
Hungming Chen63779052019-10-30 15:06:13 +0800105using android::netdutils::toHex;
Ken Chenb9fa2062018-11-13 21:51:13 +0800106
107// TODO: move into libnetdutils?
108namespace {
Luke Huangfde82482019-06-04 01:04:53 +0800109
Ken Chenb9fa2062018-11-13 21:51:13 +0800110ScopedAddrinfo safe_getaddrinfo(const char* node, const char* service,
111 const struct addrinfo* hints) {
112 addrinfo* result = nullptr;
113 if (getaddrinfo(node, service, hints, &result) != 0) {
114 result = nullptr; // Should already be the case, but...
115 }
116 return ScopedAddrinfo(result);
117}
Luke Huangfde82482019-06-04 01:04:53 +0800118
Mike Yu40e67072019-10-09 21:14:09 +0800119std::pair<ScopedAddrinfo, int> safe_getaddrinfo_time_taken(const char* node, const char* service,
120 const addrinfo& hints) {
121 Stopwatch s;
122 ScopedAddrinfo result = safe_getaddrinfo(node, service, &hints);
123 return {std::move(result), s.timeTakenUs() / 1000};
124}
125
Mike Yue2162e52020-03-04 18:43:46 +0800126struct NameserverStats {
127 NameserverStats() = delete;
128 NameserverStats(const std::string server) : server(server) {}
129 NameserverStats& setSuccesses(int val) {
130 successes = val;
131 return *this;
132 }
133 NameserverStats& setErrors(int val) {
134 errors = val;
135 return *this;
136 }
137 NameserverStats& setTimeouts(int val) {
138 timeouts = val;
139 return *this;
140 }
141 NameserverStats& setInternalErrors(int val) {
142 internal_errors = val;
143 return *this;
144 }
145
146 const std::string server;
147 int successes = 0;
148 int errors = 0;
149 int timeouts = 0;
150 int internal_errors = 0;
151};
152
Mike Yu61d17262020-02-15 18:56:22 +0800153class ScopedSystemProperties {
154 public:
155 ScopedSystemProperties(const std::string& key, const std::string& value) : mStoredKey(key) {
156 mStoredValue = android::base::GetProperty(key, "");
157 android::base::SetProperty(key, value);
158 }
159 ~ScopedSystemProperties() { android::base::SetProperty(mStoredKey, mStoredValue); }
160
161 private:
162 std::string mStoredKey;
163 std::string mStoredValue;
164};
165
Luke Huang5729afc2020-07-30 23:12:17 +0800166const bool isAtLeastR = (getApiLevel() >= 30);
167
Ken Chenb9fa2062018-11-13 21:51:13 +0800168} // namespace
169
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900170class ResolverTest : public ::testing::Test {
Hungming Chene8f970c2019-04-10 17:34:06 +0800171 public:
Hungming Chen473c4de2020-03-12 11:13:35 +0800172 static void SetUpTestSuite() {
Hungming Chen5bf09772019-04-25 11:16:13 +0800173 // Get binder service.
174 // Note that |mDnsClient| is not used for getting binder service in this static function.
175 // The reason is that wants to keep |mDnsClient| as a non-static data member. |mDnsClient|
176 // which sets up device network configuration could be independent from every test.
Luke Huangf8215372019-11-22 11:53:41 +0800177 // TODO: Perhaps add a static function in resolv_test_binder_utils.{cpp,h} to get binder
178 // service.
179
180 AIBinder* binder = AServiceManager_getService("dnsresolver");
181 ndk::SpAIBinder resolvBinder = ndk::SpAIBinder(binder);
182 auto resolvService = aidl::android::net::IDnsResolver::fromBinder(resolvBinder);
Hungming Chen5bf09772019-04-25 11:16:13 +0800183 ASSERT_NE(nullptr, resolvService.get());
184
185 // Subscribe the death recipient to the service IDnsResolver for detecting Netd death.
Luke Huang70070852019-11-25 18:25:50 +0800186 // GTEST assertion macros are not invoked for generating a test failure in the death
187 // recipient because the macros can't indicate failed test if Netd died between tests.
188 // Moreover, continuing testing may have no meaningful after Netd death. Therefore, the
189 // death recipient aborts process by GTEST_LOG_(FATAL) once Netd died.
Luke Huangf8215372019-11-22 11:53:41 +0800190 sResolvDeathRecipient = AIBinder_DeathRecipient_new([](void*) {
191 constexpr char errorMessage[] = "Netd died";
192 LOG(ERROR) << errorMessage;
193 GTEST_LOG_(FATAL) << errorMessage;
194 });
195 ASSERT_EQ(STATUS_OK, AIBinder_linkToDeath(binder, sResolvDeathRecipient, nullptr));
Hungming Chen5bf09772019-04-25 11:16:13 +0800196
197 // Subscribe the DNS listener for verifying DNS metrics event contents.
Luke Huangf8215372019-11-22 11:53:41 +0800198 sDnsMetricsListener = ndk::SharedRefBase::make<DnsMetricsListener>(
199 TEST_NETID /*monitor specific network*/);
Hungming Chen5bf09772019-04-25 11:16:13 +0800200 ASSERT_TRUE(resolvService->registerEventListener(sDnsMetricsListener).isOk());
201
202 // Start the binder thread pool for listening DNS metrics events and receiving death
203 // recipient.
Luke Huangf8215372019-11-22 11:53:41 +0800204 ABinderProcess_startThreadPool();
Hungming Chene8f970c2019-04-10 17:34:06 +0800205 }
Hungming Chen473c4de2020-03-12 11:13:35 +0800206 static void TearDownTestSuite() { AIBinder_DeathRecipient_delete(sResolvDeathRecipient); }
Hungming Chene8f970c2019-04-10 17:34:06 +0800207
Ken Chenb9fa2062018-11-13 21:51:13 +0800208 protected:
Lorenzo Colitti61f796b2020-05-21 00:57:49 +0900209 void SetUp() {
210 mDnsClient.SetUp();
211 sDnsMetricsListener->reset();
212 }
213
Mike Yu960243d2020-01-17 19:02:15 +0800214 void TearDown() {
215 // Ensure the dump works at the end of each test.
216 DumpResolverService();
217
218 mDnsClient.TearDown();
219 }
nuccachena26cc2a2018-07-17 18:07:23 +0800220
Luke Huangf40df9c2020-04-21 08:51:48 +0800221 void resetNetwork() {
222 mDnsClient.TearDown();
223 mDnsClient.SetupOemNetwork();
224 }
225
Xiao Ma09b71022018-12-11 17:56:32 +0900226 void StartDns(test::DNSResponder& dns, const std::vector<DnsRecord>& records) {
227 for (const auto& r : records) {
228 dns.addMapping(r.host_name, r.type, r.addr);
229 }
230
231 ASSERT_TRUE(dns.startServer());
232 dns.clearQueries();
233 }
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900234
Mike Yu960243d2020-01-17 19:02:15 +0800235 void DumpResolverService() {
236 unique_fd fd(open("/dev/null", O_WRONLY));
237 EXPECT_EQ(mDnsClient.resolvService()->dump(fd, nullptr, 0), 0);
238
239 const char* querylogCmd[] = {"querylog"}; // Keep it sync with DnsQueryLog::DUMP_KEYWORD.
240 EXPECT_EQ(mDnsClient.resolvService()->dump(fd, querylogCmd, std::size(querylogCmd)), 0);
241 }
242
Hungming Chene8f970c2019-04-10 17:34:06 +0800243 bool WaitForNat64Prefix(ExpectNat64PrefixStatus status,
244 std::chrono::milliseconds timeout = std::chrono::milliseconds(1000)) {
Hungming Chen5bf09772019-04-25 11:16:13 +0800245 return sDnsMetricsListener->waitForNat64Prefix(status, timeout);
Hungming Chene8f970c2019-04-10 17:34:06 +0800246 }
247
Mike Yu724f77d2019-08-16 11:14:50 +0800248 bool WaitForPrivateDnsValidation(std::string serverAddr, bool validated) {
249 return sDnsMetricsListener->waitForPrivateDnsValidation(serverAddr, validated);
250 }
251
Mike Yu153b5b82020-03-04 19:53:54 +0800252 bool hasUncaughtPrivateDnsValidation(const std::string& serverAddr) {
253 return sDnsMetricsListener->findValidationRecord(serverAddr);
254 }
255
Mike Yu532405f2020-06-17 17:46:44 +0800256 void ExpectDnsEvent(int32_t eventType, int32_t returnCode, const std::string& hostname,
257 const std::vector<std::string>& ipAddresses) {
258 const DnsMetricsListener::DnsEvent expect = {
259 TEST_NETID, eventType, returnCode,
260 hostname, ipAddresses, static_cast<int32_t>(ipAddresses.size())};
Mike Yub8faac42020-06-20 11:11:44 +0800261 do {
262 // Blocking call until timeout.
263 const auto dnsEvent = sDnsMetricsListener->popDnsEvent();
264 ASSERT_TRUE(dnsEvent.has_value()) << "Expected DnsEvent " << expect;
265 if (dnsEvent.value() == expect) break;
266 LOG(INFO) << "Skip unexpected DnsEvent: " << dnsEvent.value();
267 } while (true);
Mike Yu532405f2020-06-17 17:46:44 +0800268 }
269
Mike Yu61d17262020-02-15 18:56:22 +0800270 enum class StatsCmp { LE, EQ };
271
272 bool expectStatsNotGreaterThan(const std::vector<NameserverStats>& nameserversStats) {
273 return expectStatsFromGetResolverInfo(nameserversStats, StatsCmp::LE);
274 }
275
276 bool expectStatsEqualTo(const std::vector<NameserverStats>& nameserversStats) {
277 return expectStatsFromGetResolverInfo(nameserversStats, StatsCmp::EQ);
278 }
279
280 bool expectStatsFromGetResolverInfo(const std::vector<NameserverStats>& nameserversStats,
281 const StatsCmp cmp) {
Mike Yue2162e52020-03-04 18:43:46 +0800282 std::vector<std::string> res_servers;
283 std::vector<std::string> res_domains;
284 std::vector<std::string> res_tls_servers;
285 res_params res_params;
286 std::vector<ResolverStats> res_stats;
287 int wait_for_pending_req_timeout_count;
288
289 if (!DnsResponderClient::GetResolverInfo(mDnsClient.resolvService(), TEST_NETID,
290 &res_servers, &res_domains, &res_tls_servers,
291 &res_params, &res_stats,
292 &wait_for_pending_req_timeout_count)) {
293 ADD_FAILURE() << "GetResolverInfo failed";
294 return false;
295 }
296
297 if (res_servers.size() != res_stats.size()) {
298 ADD_FAILURE() << fmt::format("res_servers.size() != res_stats.size(): {} != {}",
299 res_servers.size(), res_stats.size());
300 return false;
301 }
302 if (res_servers.size() != nameserversStats.size()) {
303 ADD_FAILURE() << fmt::format("res_servers.size() != nameserversStats.size(): {} != {}",
304 res_servers.size(), nameserversStats.size());
305 return false;
306 }
307
308 for (const auto& stats : nameserversStats) {
309 SCOPED_TRACE(stats.server);
310 const auto it = std::find(res_servers.begin(), res_servers.end(), stats.server);
311 if (it == res_servers.end()) {
312 ADD_FAILURE() << fmt::format("nameserver {} not found in the list {{{}}}",
313 stats.server, fmt::join(res_servers, ", "));
314 return false;
315 }
316 const int index = std::distance(res_servers.begin(), it);
317
318 // The check excludes rtt_avg, last_sample_time, and usable since they will be obsolete
319 // after |res_stats| is retrieved from NetConfig.dnsStats rather than NetConfig.nsstats.
Mike Yu61d17262020-02-15 18:56:22 +0800320 switch (cmp) {
321 case StatsCmp::EQ:
322 EXPECT_EQ(res_stats[index].successes, stats.successes);
323 EXPECT_EQ(res_stats[index].errors, stats.errors);
324 EXPECT_EQ(res_stats[index].timeouts, stats.timeouts);
325 EXPECT_EQ(res_stats[index].internal_errors, stats.internal_errors);
326 break;
327 case StatsCmp::LE:
328 EXPECT_LE(res_stats[index].successes, stats.successes);
329 EXPECT_LE(res_stats[index].errors, stats.errors);
330 EXPECT_LE(res_stats[index].timeouts, stats.timeouts);
331 EXPECT_LE(res_stats[index].internal_errors, stats.internal_errors);
332 break;
333 default:
334 ADD_FAILURE() << "Unknown comparator " << static_cast<int>(cmp);
335 return false;
336 }
Mike Yue2162e52020-03-04 18:43:46 +0800337 }
338
339 return true;
340 }
341
Mike Yu153b5b82020-03-04 19:53:54 +0800342 // Since there's no way to terminate private DNS validation threads at any time. Tests that
343 // focus on the results of private DNS validation can interfere with each other if they use the
344 // same IP address for test servers. getUniqueIPv4Address() is a workaround to reduce the
345 // possibility of tests being flaky. A feasible solution is to forbid the validation threads,
346 // which are considered as outdated (e.g. switch the resolver to private DNS OFF mode), updating
347 // the result to the PrivateDnsConfiguration instance.
348 static std::string getUniqueIPv4Address() {
349 static int counter = 0;
350 return fmt::format("127.0.100.{}", (++counter & 0xff));
351 }
352
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900353 DnsResponderClient mDnsClient;
Xiao Ma09b71022018-12-11 17:56:32 +0900354
Hungming Chen5bf09772019-04-25 11:16:13 +0800355 // Use a shared static DNS listener for all tests to avoid registering lots of listeners
356 // which may be released late until process terminated. Currently, registered DNS listener
357 // is removed by binder death notification which is fired when the process hosting an
358 // IBinder has gone away. If every test in ResolverTest registers its DNS listener, Netd
359 // may temporarily hold lots of dead listeners until the unit test process terminates.
360 // TODO: Perhaps add an unregistering listener binder call or fork a listener process which
361 // could be terminated earlier.
Luke Huangf8215372019-11-22 11:53:41 +0800362 static std::shared_ptr<DnsMetricsListener>
Hungming Chen473c4de2020-03-12 11:13:35 +0800363 sDnsMetricsListener; // Initialized in SetUpTestSuite.
Hungming Chen5bf09772019-04-25 11:16:13 +0800364
365 // Use a shared static death recipient to monitor the service death. The static death
366 // recipient could monitor the death not only during the test but also between tests.
Hungming Chen473c4de2020-03-12 11:13:35 +0800367 static AIBinder_DeathRecipient* sResolvDeathRecipient; // Initialized in SetUpTestSuite.
Ken Chenb9fa2062018-11-13 21:51:13 +0800368};
369
Hungming Chen5bf09772019-04-25 11:16:13 +0800370// Initialize static member of class.
Luke Huangf8215372019-11-22 11:53:41 +0800371std::shared_ptr<DnsMetricsListener> ResolverTest::sDnsMetricsListener;
372AIBinder_DeathRecipient* ResolverTest::sResolvDeathRecipient;
Hungming Chen5bf09772019-04-25 11:16:13 +0800373
Ken Chenb9fa2062018-11-13 21:51:13 +0800374TEST_F(ResolverTest, GetHostByName) {
Xiao Ma09b71022018-12-11 17:56:32 +0900375 constexpr char nonexistent_host_name[] = "nonexistent.example.com.";
376
377 test::DNSResponder dns;
378 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.3"}});
379 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800380
381 const hostent* result;
Ken Chenb9fa2062018-11-13 21:51:13 +0800382 result = gethostbyname("nonexistent");
383 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, nonexistent_host_name));
384 ASSERT_TRUE(result == nullptr);
385 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
386
387 dns.clearQueries();
388 result = gethostbyname("hello");
Xiao Ma09b71022018-12-11 17:56:32 +0900389 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
Ken Chenb9fa2062018-11-13 21:51:13 +0800390 ASSERT_FALSE(result == nullptr);
391 ASSERT_EQ(4, result->h_length);
392 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
393 EXPECT_EQ("1.2.3.3", ToString(result));
394 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800395}
396
lifr4e4a2e02019-01-29 16:53:51 +0800397TEST_F(ResolverTest, GetHostByName_cnames) {
398 constexpr char host_name[] = "host.example.com.";
399 size_t cnamecount = 0;
400 test::DNSResponder dns;
401
402 const std::vector<DnsRecord> records = {
403 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
404 {"a.example.com.", ns_type::ns_t_cname, "b.example.com."},
405 {"b.example.com.", ns_type::ns_t_cname, "c.example.com."},
406 {"c.example.com.", ns_type::ns_t_cname, "d.example.com."},
407 {"d.example.com.", ns_type::ns_t_cname, "e.example.com."},
408 {"e.example.com.", ns_type::ns_t_cname, host_name},
409 {host_name, ns_type::ns_t_a, "1.2.3.3"},
410 {host_name, ns_type::ns_t_aaaa, "2001:db8::42"},
411 };
412 StartDns(dns, records);
413 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
414
415 // using gethostbyname2() to resolve ipv4 hello.example.com. to 1.2.3.3
416 // Ensure the v4 address and cnames are correct
417 const hostent* result;
418 result = gethostbyname2("hello", AF_INET);
419 ASSERT_FALSE(result == nullptr);
420
421 for (int i = 0; result != nullptr && result->h_aliases[i] != nullptr; i++) {
422 std::string domain_name = records[i].host_name.substr(0, records[i].host_name.size() - 1);
423 EXPECT_EQ(result->h_aliases[i], domain_name);
424 cnamecount++;
425 }
426 // The size of "Non-cname type" record in DNS records is 2
427 ASSERT_EQ(cnamecount, records.size() - 2);
428 ASSERT_EQ(4, result->h_length);
429 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
430 EXPECT_EQ("1.2.3.3", ToString(result));
431 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
432 EXPECT_EQ(1U, dns.queries().size()) << dns.dumpQueries();
433
434 // using gethostbyname2() to resolve ipv6 hello.example.com. to 2001:db8::42
435 // Ensure the v6 address and cnames are correct
436 cnamecount = 0;
437 dns.clearQueries();
438 result = gethostbyname2("hello", AF_INET6);
439 for (unsigned i = 0; result != nullptr && result->h_aliases[i] != nullptr; i++) {
440 std::string domain_name = records[i].host_name.substr(0, records[i].host_name.size() - 1);
441 EXPECT_EQ(result->h_aliases[i], domain_name);
442 cnamecount++;
443 }
444 // The size of "Non-cname type" DNS record in records is 2
445 ASSERT_EQ(cnamecount, records.size() - 2);
446 ASSERT_FALSE(result == nullptr);
447 ASSERT_EQ(16, result->h_length);
448 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
449 EXPECT_EQ("2001:db8::42", ToString(result));
450 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
451}
452
453TEST_F(ResolverTest, GetHostByName_cnamesInfiniteLoop) {
454 test::DNSResponder dns;
455 const std::vector<DnsRecord> records = {
456 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
457 {"a.example.com.", ns_type::ns_t_cname, kHelloExampleCom},
458 };
459 StartDns(dns, records);
460 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
461
462 const hostent* result;
463 result = gethostbyname2("hello", AF_INET);
464 ASSERT_TRUE(result == nullptr);
465
466 dns.clearQueries();
467 result = gethostbyname2("hello", AF_INET6);
468 ASSERT_TRUE(result == nullptr);
469}
470
Ken Chenb9fa2062018-11-13 21:51:13 +0800471TEST_F(ResolverTest, GetHostByName_localhost) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800472 constexpr char name_camelcase[] = "LocalHost";
Ken Chenb9fa2062018-11-13 21:51:13 +0800473 constexpr char name_ip6_dot[] = "ip6-localhost.";
474 constexpr char name_ip6_fqdn[] = "ip6-localhost.example.com.";
475
markchien96b09e22020-07-29 14:24:34 +0800476 // Add a no-op nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900477 test::DNSResponder dns;
478 StartDns(dns, {});
479 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800480
481 // Expect no DNS queries; localhost is resolved via /etc/hosts
Xiao Ma09b71022018-12-11 17:56:32 +0900482 const hostent* result = gethostbyname(kLocalHost);
Ken Chenb9fa2062018-11-13 21:51:13 +0800483 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
484 ASSERT_FALSE(result == nullptr);
485 ASSERT_EQ(4, result->h_length);
486 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900487 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800488 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
489
490 // Ensure the hosts file resolver ignores case of hostnames
491 result = gethostbyname(name_camelcase);
492 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
493 ASSERT_FALSE(result == nullptr);
494 ASSERT_EQ(4, result->h_length);
495 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900496 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800497 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
498
499 // The hosts file also contains ip6-localhost, but gethostbyname() won't
chenbruce018fdb22019-06-12 18:08:04 +0800500 // return it. This would be easy to
Ken Chenb9fa2062018-11-13 21:51:13 +0800501 // change, but there's no point in changing the legacy behavior; new code
502 // should be calling getaddrinfo() anyway.
503 // So we check the legacy behavior, which results in amusing A-record
504 // lookups for ip6-localhost, with and without search domains appended.
505 dns.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900506 result = gethostbyname(kIp6LocalHost);
Sehee Parkbbca0202018-11-16 10:53:16 +0900507 EXPECT_EQ(2U, dns.queries().size()) << dns.dumpQueries();
508 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, name_ip6_dot)) << dns.dumpQueries();
509 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, name_ip6_fqdn)) << dns.dumpQueries();
Ken Chenb9fa2062018-11-13 21:51:13 +0800510 ASSERT_TRUE(result == nullptr);
511
512 // Finally, use gethostbyname2() to resolve ip6-localhost to ::1 from
513 // the hosts file.
514 dns.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900515 result = gethostbyname2(kIp6LocalHost, AF_INET6);
Ken Chenb9fa2062018-11-13 21:51:13 +0800516 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
517 ASSERT_FALSE(result == nullptr);
518 ASSERT_EQ(16, result->h_length);
519 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900520 EXPECT_EQ(kIp6LocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800521 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800522}
523
524TEST_F(ResolverTest, GetHostByName_numeric) {
markchien96b09e22020-07-29 14:24:34 +0800525 // Add a no-op nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900526 test::DNSResponder dns;
527 StartDns(dns, {});
528 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800529
530 // Numeric v4 address: expect no DNS queries
531 constexpr char numeric_v4[] = "192.168.0.1";
Ken Chenb9fa2062018-11-13 21:51:13 +0800532 const hostent* result = gethostbyname(numeric_v4);
Sehee Parkbbca0202018-11-16 10:53:16 +0900533 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800534 ASSERT_FALSE(result == nullptr);
535 ASSERT_EQ(4, result->h_length); // v4
536 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
537 EXPECT_EQ(numeric_v4, ToString(result));
538 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
539
540 // gethostbyname() recognizes a v6 address, and fails with no DNS queries
541 constexpr char numeric_v6[] = "2001:db8::42";
542 dns.clearQueries();
543 result = gethostbyname(numeric_v6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900544 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800545 EXPECT_TRUE(result == nullptr);
546
547 // Numeric v6 address with gethostbyname2(): succeeds with no DNS queries
548 dns.clearQueries();
549 result = gethostbyname2(numeric_v6, AF_INET6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900550 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800551 ASSERT_FALSE(result == nullptr);
552 ASSERT_EQ(16, result->h_length); // v6
553 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
554 EXPECT_EQ(numeric_v6, ToString(result));
555 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
556
557 // Numeric v6 address with scope work with getaddrinfo(),
558 // but gethostbyname2() does not understand them; it issues two dns
559 // queries, then fails. This hardly ever happens, there's no point
560 // in fixing this. This test simply verifies the current (bogus)
561 // behavior to avoid further regressions (like crashes, or leaks).
562 constexpr char numeric_v6_scope[] = "fe80::1%lo";
563 dns.clearQueries();
564 result = gethostbyname2(numeric_v6_scope, AF_INET6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900565 EXPECT_EQ(2U, dns.queries().size()); // OUCH!
Ken Chenb9fa2062018-11-13 21:51:13 +0800566 ASSERT_TRUE(result == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800567}
568
569TEST_F(ResolverTest, BinderSerialization) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800570 std::vector<int> params_offsets = {
Luke Huang5bd827c2019-03-14 16:10:04 +0800571 IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY,
572 IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD,
573 IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES,
574 IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES,
575 IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC,
576 IDnsResolver::RESOLVER_PARAMS_RETRY_COUNT,
Ken Chenb9fa2062018-11-13 21:51:13 +0800577 };
Bernie Innocentib102dd22018-12-04 14:57:48 +0900578 const int size = static_cast<int>(params_offsets.size());
Luke Huang5bd827c2019-03-14 16:10:04 +0800579 EXPECT_EQ(size, IDnsResolver::RESOLVER_PARAMS_COUNT);
Ken Chenb9fa2062018-11-13 21:51:13 +0800580 std::sort(params_offsets.begin(), params_offsets.end());
Bernie Innocentib102dd22018-12-04 14:57:48 +0900581 for (int i = 0; i < size; ++i) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800582 EXPECT_EQ(params_offsets[i], i);
583 }
584}
585
586TEST_F(ResolverTest, GetHostByName_Binder) {
Luke Huangf8215372019-11-22 11:53:41 +0800587 std::vector<std::string> domains = {"example.com"};
Ken Chenb9fa2062018-11-13 21:51:13 +0800588 std::vector<std::unique_ptr<test::DNSResponder>> dns;
589 std::vector<std::string> servers;
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900590 std::vector<DnsResponderClient::Mapping> mappings;
591 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupMappings(1, domains, &mappings));
592 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupDNSServers(4, mappings, &dns, &servers));
Ken Chenb9fa2062018-11-13 21:51:13 +0800593 ASSERT_EQ(1U, mappings.size());
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900594 const DnsResponderClient::Mapping& mapping = mappings[0];
Ken Chenb9fa2062018-11-13 21:51:13 +0800595
Xiao Ma09b71022018-12-11 17:56:32 +0900596 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains, kDefaultParams));
Ken Chenb9fa2062018-11-13 21:51:13 +0800597
598 const hostent* result = gethostbyname(mapping.host.c_str());
Bernie Innocentib102dd22018-12-04 14:57:48 +0900599 const size_t total_queries =
Luke Huangfde82482019-06-04 01:04:53 +0800600 std::accumulate(dns.begin(), dns.end(), 0, [&mapping](size_t total, auto& d) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800601 return total + GetNumQueriesForType(*d, ns_type::ns_t_a, mapping.entry.c_str());
602 });
603
604 EXPECT_LE(1U, total_queries);
605 ASSERT_FALSE(result == nullptr);
606 ASSERT_EQ(4, result->h_length);
607 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
608 EXPECT_EQ(mapping.ip4, ToString(result));
609 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
610
611 std::vector<std::string> res_servers;
612 std::vector<std::string> res_domains;
Mike Yu0a1c53d2018-11-26 13:26:21 +0900613 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +0900614 res_params res_params;
Ken Chenb9fa2062018-11-13 21:51:13 +0800615 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +0800616 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +0800617 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
618 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
619 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chenb9fa2062018-11-13 21:51:13 +0800620 EXPECT_EQ(servers.size(), res_servers.size());
621 EXPECT_EQ(domains.size(), res_domains.size());
Mike Yu0a1c53d2018-11-26 13:26:21 +0900622 EXPECT_EQ(0U, res_tls_servers.size());
Luke Huang5bd827c2019-03-14 16:10:04 +0800623 ASSERT_EQ(static_cast<size_t>(IDnsResolver::RESOLVER_PARAMS_COUNT), kDefaultParams.size());
624 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY],
625 res_params.sample_validity);
626 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900627 res_params.success_threshold);
Luke Huang5bd827c2019-03-14 16:10:04 +0800628 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
629 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
630 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
Ken Chenb9fa2062018-11-13 21:51:13 +0800631 res_params.base_timeout_msec);
632 EXPECT_EQ(servers.size(), res_stats.size());
633
Bernie Innocenti0c067e42019-04-01 15:33:16 +0900634 EXPECT_THAT(res_servers, testing::UnorderedElementsAreArray(servers));
635 EXPECT_THAT(res_domains, testing::UnorderedElementsAreArray(domains));
Ken Chenb9fa2062018-11-13 21:51:13 +0800636}
637
638TEST_F(ResolverTest, GetAddrInfo) {
Xiao Ma09b71022018-12-11 17:56:32 +0900639 constexpr char listen_addr[] = "127.0.0.4";
640 constexpr char listen_addr2[] = "127.0.0.5";
641 constexpr char host_name[] = "howdy.example.com.";
Ken Chenb9fa2062018-11-13 21:51:13 +0800642
Xiao Ma09b71022018-12-11 17:56:32 +0900643 const std::vector<DnsRecord> records = {
644 {host_name, ns_type::ns_t_a, "1.2.3.4"},
645 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
646 };
647 test::DNSResponder dns(listen_addr);
648 test::DNSResponder dns2(listen_addr2);
649 StartDns(dns, records);
650 StartDns(dns2, records);
Ken Chenb9fa2062018-11-13 21:51:13 +0800651
Xiao Ma09b71022018-12-11 17:56:32 +0900652 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}));
Ken Chenb9fa2062018-11-13 21:51:13 +0800653 dns.clearQueries();
654 dns2.clearQueries();
655
656 ScopedAddrinfo result = safe_getaddrinfo("howdy", nullptr, nullptr);
657 EXPECT_TRUE(result != nullptr);
658 size_t found = GetNumQueries(dns, host_name);
659 EXPECT_LE(1U, found);
660 // Could be A or AAAA
661 std::string result_str = ToString(result);
662 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +0800663 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +0800664
665 // Verify that the name is cached.
666 size_t old_found = found;
667 result = safe_getaddrinfo("howdy", nullptr, nullptr);
668 EXPECT_TRUE(result != nullptr);
669 found = GetNumQueries(dns, host_name);
670 EXPECT_LE(1U, found);
671 EXPECT_EQ(old_found, found);
672 result_str = ToString(result);
Luke Huangf8215372019-11-22 11:53:41 +0800673 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4") << result_str;
Ken Chenb9fa2062018-11-13 21:51:13 +0800674
675 // Change the DNS resolver, ensure that queries are still cached.
Xiao Ma09b71022018-12-11 17:56:32 +0900676 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr2}));
Ken Chenb9fa2062018-11-13 21:51:13 +0800677 dns.clearQueries();
678 dns2.clearQueries();
679
680 result = safe_getaddrinfo("howdy", nullptr, nullptr);
681 EXPECT_TRUE(result != nullptr);
682 found = GetNumQueries(dns, host_name);
683 size_t found2 = GetNumQueries(dns2, host_name);
684 EXPECT_EQ(0U, found);
685 EXPECT_LE(0U, found2);
686
687 // Could be A or AAAA
688 result_str = ToString(result);
689 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +0800690 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +0800691}
692
693TEST_F(ResolverTest, GetAddrInfoV4) {
Xiao Ma09b71022018-12-11 17:56:32 +0900694 test::DNSResponder dns;
695 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.5"}});
696 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800697
Xiao Ma09b71022018-12-11 17:56:32 +0900698 const addrinfo hints = {.ai_family = AF_INET};
699 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
Ken Chenb9fa2062018-11-13 21:51:13 +0800700 EXPECT_TRUE(result != nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900701 EXPECT_EQ(1U, GetNumQueries(dns, kHelloExampleCom));
Ken Chenb9fa2062018-11-13 21:51:13 +0800702 EXPECT_EQ("1.2.3.5", ToString(result));
703}
704
705TEST_F(ResolverTest, GetAddrInfo_localhost) {
markchien96b09e22020-07-29 14:24:34 +0800706 // Add a no-op nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900707 test::DNSResponder dns;
708 StartDns(dns, {});
709 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800710
Xiao Ma09b71022018-12-11 17:56:32 +0900711 ScopedAddrinfo result = safe_getaddrinfo(kLocalHost, nullptr, nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800712 EXPECT_TRUE(result != nullptr);
713 // Expect no DNS queries; localhost is resolved via /etc/hosts
714 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900715 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800716
Xiao Ma09b71022018-12-11 17:56:32 +0900717 result = safe_getaddrinfo(kIp6LocalHost, nullptr, nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800718 EXPECT_TRUE(result != nullptr);
719 // Expect no DNS queries; ip6-localhost is resolved via /etc/hosts
720 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900721 EXPECT_EQ(kIp6LocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800722}
723
Luke Huangd8ac4752019-06-18 17:05:47 +0800724TEST_F(ResolverTest, GetAddrInfo_InvalidSocketType) {
725 test::DNSResponder dns;
726 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.5"}});
727 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
728
729 // TODO: Test other invalid socket types.
730 const addrinfo hints = {
731 .ai_family = AF_UNSPEC,
Luke Huangd8ac4752019-06-18 17:05:47 +0800732 .ai_socktype = SOCK_PACKET,
733 };
734 addrinfo* result = nullptr;
735 // This is a valid hint, but the query won't be sent because the socket type is
736 // not supported.
737 EXPECT_EQ(EAI_NODATA, getaddrinfo("hello", nullptr, &hints, &result));
738 ScopedAddrinfo result_cleanup(result);
739 EXPECT_EQ(nullptr, result);
740}
741
Ken Chen92bed612018-12-22 21:46:55 +0800742// Verify if the resolver correctly handle multiple queries simultaneously
743// step 1: set dns server#1 into deferred responding mode.
744// step 2: thread#1 query "hello.example.com." --> resolver send query to server#1.
745// step 3: thread#2 query "hello.example.com." --> resolver hold the request and wait for
746// response of previous pending query sent by thread#1.
747// step 4: thread#3 query "konbanha.example.com." --> resolver send query to server#3. Server
748// respond to resolver immediately.
749// step 5: check if server#1 get 1 query by thread#1, server#2 get 0 query, server#3 get 1 query.
750// step 6: resume dns server#1 to respond dns query in step#2.
751// step 7: thread#1 and #2 should get returned from DNS query after step#6. Also, check the
752// number of queries in server#2 is 0 to ensure thread#2 does not wake up unexpectedly
753// before signaled by thread#1.
754TEST_F(ResolverTest, GetAddrInfoV4_deferred_resp) {
755 const char* listen_addr1 = "127.0.0.9";
756 const char* listen_addr2 = "127.0.0.10";
757 const char* listen_addr3 = "127.0.0.11";
758 const char* listen_srv = "53";
759 const char* host_name_deferred = "hello.example.com.";
760 const char* host_name_normal = "konbanha.example.com.";
Mike Yufc125e42019-05-15 20:41:28 +0800761 test::DNSResponder dns1(listen_addr1, listen_srv, ns_rcode::ns_r_servfail);
762 test::DNSResponder dns2(listen_addr2, listen_srv, ns_rcode::ns_r_servfail);
763 test::DNSResponder dns3(listen_addr3, listen_srv, ns_rcode::ns_r_servfail);
Ken Chen92bed612018-12-22 21:46:55 +0800764 dns1.addMapping(host_name_deferred, ns_type::ns_t_a, "1.2.3.4");
765 dns2.addMapping(host_name_deferred, ns_type::ns_t_a, "1.2.3.4");
766 dns3.addMapping(host_name_normal, ns_type::ns_t_a, "1.2.3.5");
767 ASSERT_TRUE(dns1.startServer());
768 ASSERT_TRUE(dns2.startServer());
769 ASSERT_TRUE(dns3.startServer());
770 const std::vector<std::string> servers_for_t1 = {listen_addr1};
771 const std::vector<std::string> servers_for_t2 = {listen_addr2};
772 const std::vector<std::string> servers_for_t3 = {listen_addr3};
773 addrinfo hints = {.ai_family = AF_INET};
774 const std::vector<int> params = {300, 25, 8, 8, 5000};
775 bool t3_task_done = false;
776
777 dns1.setDeferredResp(true);
778 std::thread t1([&, this]() {
779 ASSERT_TRUE(
780 mDnsClient.SetResolversForNetwork(servers_for_t1, kDefaultSearchDomains, params));
781 ScopedAddrinfo result = safe_getaddrinfo(host_name_deferred, nullptr, &hints);
782 // t3's dns query should got returned first
783 EXPECT_TRUE(t3_task_done);
784 EXPECT_EQ(1U, GetNumQueries(dns1, host_name_deferred));
785 EXPECT_TRUE(result != nullptr);
786 EXPECT_EQ("1.2.3.4", ToString(result));
787 });
788
789 // ensuring t1 and t2 handler functions are processed in order
790 usleep(100 * 1000);
791 std::thread t2([&, this]() {
792 ASSERT_TRUE(
793 mDnsClient.SetResolversForNetwork(servers_for_t2, kDefaultSearchDomains, params));
794 ScopedAddrinfo result = safe_getaddrinfo(host_name_deferred, nullptr, &hints);
795 EXPECT_TRUE(t3_task_done);
796 EXPECT_EQ(0U, GetNumQueries(dns2, host_name_deferred));
797 EXPECT_TRUE(result != nullptr);
798 EXPECT_EQ("1.2.3.4", ToString(result));
799
800 std::vector<std::string> res_servers;
801 std::vector<std::string> res_domains;
802 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +0900803 res_params res_params;
Ken Chen92bed612018-12-22 21:46:55 +0800804 std::vector<ResolverStats> res_stats;
805 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +0800806 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
807 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains,
808 &res_tls_servers, &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chen92bed612018-12-22 21:46:55 +0800809 EXPECT_EQ(0, wait_for_pending_req_timeout_count);
810 });
811
812 // ensuring t2 and t3 handler functions are processed in order
813 usleep(100 * 1000);
814 std::thread t3([&, this]() {
815 ASSERT_TRUE(
816 mDnsClient.SetResolversForNetwork(servers_for_t3, kDefaultSearchDomains, params));
817 ScopedAddrinfo result = safe_getaddrinfo(host_name_normal, nullptr, &hints);
818 EXPECT_EQ(1U, GetNumQueries(dns1, host_name_deferred));
819 EXPECT_EQ(0U, GetNumQueries(dns2, host_name_deferred));
820 EXPECT_EQ(1U, GetNumQueries(dns3, host_name_normal));
821 EXPECT_TRUE(result != nullptr);
822 EXPECT_EQ("1.2.3.5", ToString(result));
823
824 t3_task_done = true;
825 dns1.setDeferredResp(false);
826 });
827 t3.join();
828 t1.join();
829 t2.join();
830}
831
lifr4e4a2e02019-01-29 16:53:51 +0800832TEST_F(ResolverTest, GetAddrInfo_cnames) {
833 constexpr char host_name[] = "host.example.com.";
834 test::DNSResponder dns;
835 const std::vector<DnsRecord> records = {
836 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
837 {"a.example.com.", ns_type::ns_t_cname, "b.example.com."},
838 {"b.example.com.", ns_type::ns_t_cname, "c.example.com."},
839 {"c.example.com.", ns_type::ns_t_cname, "d.example.com."},
840 {"d.example.com.", ns_type::ns_t_cname, "e.example.com."},
841 {"e.example.com.", ns_type::ns_t_cname, host_name},
842 {host_name, ns_type::ns_t_a, "1.2.3.3"},
843 {host_name, ns_type::ns_t_aaaa, "2001:db8::42"},
844 };
845 StartDns(dns, records);
846 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
847
848 addrinfo hints = {.ai_family = AF_INET};
849 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
850 EXPECT_TRUE(result != nullptr);
851 EXPECT_EQ("1.2.3.3", ToString(result));
852
853 dns.clearQueries();
854 hints = {.ai_family = AF_INET6};
855 result = safe_getaddrinfo("hello", nullptr, &hints);
856 EXPECT_TRUE(result != nullptr);
857 EXPECT_EQ("2001:db8::42", ToString(result));
858}
859
860TEST_F(ResolverTest, GetAddrInfo_cnamesNoIpAddress) {
861 test::DNSResponder dns;
862 const std::vector<DnsRecord> records = {
863 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
864 };
865 StartDns(dns, records);
866 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
867
868 addrinfo hints = {.ai_family = AF_INET};
869 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
870 EXPECT_TRUE(result == nullptr);
871
872 dns.clearQueries();
873 hints = {.ai_family = AF_INET6};
874 result = safe_getaddrinfo("hello", nullptr, &hints);
875 EXPECT_TRUE(result == nullptr);
876}
877
878TEST_F(ResolverTest, GetAddrInfo_cnamesIllegalRdata) {
879 test::DNSResponder dns;
880 const std::vector<DnsRecord> records = {
881 {kHelloExampleCom, ns_type::ns_t_cname, ".!#?"},
882 };
883 StartDns(dns, records);
884 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
885
886 addrinfo hints = {.ai_family = AF_INET};
887 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
888 EXPECT_TRUE(result == nullptr);
889
890 dns.clearQueries();
891 hints = {.ai_family = AF_INET6};
892 result = safe_getaddrinfo("hello", nullptr, &hints);
893 EXPECT_TRUE(result == nullptr);
894}
895
Ken Chenb9fa2062018-11-13 21:51:13 +0800896TEST_F(ResolverTest, MultidomainResolution) {
Xiao Ma09b71022018-12-11 17:56:32 +0900897 constexpr char host_name[] = "nihao.example2.com.";
Luke Huangf8215372019-11-22 11:53:41 +0800898 std::vector<std::string> searchDomains = {"example1.com", "example2.com", "example3.com"};
Ken Chenb9fa2062018-11-13 21:51:13 +0800899
Xiao Ma09b71022018-12-11 17:56:32 +0900900 test::DNSResponder dns("127.0.0.6");
901 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.3"}});
902 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({"127.0.0.6"}, searchDomains));
903
Ken Chenb9fa2062018-11-13 21:51:13 +0800904 const hostent* result = gethostbyname("nihao");
Xiao Ma09b71022018-12-11 17:56:32 +0900905
Ken Chenb9fa2062018-11-13 21:51:13 +0800906 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
907 ASSERT_FALSE(result == nullptr);
908 ASSERT_EQ(4, result->h_length);
909 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
910 EXPECT_EQ("1.2.3.3", ToString(result));
911 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800912}
913
914TEST_F(ResolverTest, GetAddrInfoV6_numeric) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800915 constexpr char host_name[] = "ohayou.example.com.";
916 constexpr char numeric_addr[] = "fe80::1%lo";
917
Xiao Ma09b71022018-12-11 17:56:32 +0900918 test::DNSResponder dns;
Ken Chenb9fa2062018-11-13 21:51:13 +0800919 dns.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900920 StartDns(dns, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
921 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800922
923 addrinfo hints = {.ai_family = AF_INET6};
924 ScopedAddrinfo result = safe_getaddrinfo(numeric_addr, nullptr, &hints);
925 EXPECT_TRUE(result != nullptr);
926 EXPECT_EQ(numeric_addr, ToString(result));
927 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
928
929 // Now try a non-numeric hostname query with the AI_NUMERICHOST flag set.
930 // We should fail without sending out a DNS query.
931 hints.ai_flags |= AI_NUMERICHOST;
932 result = safe_getaddrinfo(host_name, nullptr, &hints);
933 EXPECT_TRUE(result == nullptr);
934 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
935}
936
937TEST_F(ResolverTest, GetAddrInfoV6_failing) {
Xiao Ma09b71022018-12-11 17:56:32 +0900938 constexpr char listen_addr0[] = "127.0.0.7";
939 constexpr char listen_addr1[] = "127.0.0.8";
Ken Chenb9fa2062018-11-13 21:51:13 +0800940 const char* host_name = "ohayou.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +0900941
942 test::DNSResponder dns0(listen_addr0);
943 test::DNSResponder dns1(listen_addr1);
Ken Chenb9fa2062018-11-13 21:51:13 +0800944 dns0.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900945 StartDns(dns0, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
946 StartDns(dns1, {{host_name, ns_type::ns_t_aaaa, "2001:db8::6"}});
947
Luke Huangf8215372019-11-22 11:53:41 +0800948 std::vector<std::string> servers = {listen_addr0, listen_addr1};
Ken Chenb9fa2062018-11-13 21:51:13 +0800949 // <sample validity in s> <success threshold in percent> <min samples> <max samples>
950 int sample_count = 8;
Luke Huangf8215372019-11-22 11:53:41 +0800951 const std::vector<int> params = {300, 25, sample_count, sample_count};
Xiao Ma09b71022018-12-11 17:56:32 +0900952 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, kDefaultSearchDomains, params));
Ken Chenb9fa2062018-11-13 21:51:13 +0800953
954 // Repeatedly perform resolutions for non-existing domains until MAXNSSAMPLES resolutions have
955 // reached the dns0, which is set to fail. No more requests should then arrive at that server
956 // for the next sample_lifetime seconds.
957 // TODO: This approach is implementation-dependent, change once metrics reporting is available.
Xiao Ma09b71022018-12-11 17:56:32 +0900958 const addrinfo hints = {.ai_family = AF_INET6};
Bernie Innocentib102dd22018-12-04 14:57:48 +0900959 for (int i = 0; i < sample_count; ++i) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800960 std::string domain = StringPrintf("nonexistent%d", i);
961 ScopedAddrinfo result = safe_getaddrinfo(domain.c_str(), nullptr, &hints);
962 }
963 // Due to 100% errors for all possible samples, the server should be ignored from now on and
964 // only the second one used for all following queries, until NSSAMPLE_VALIDITY is reached.
965 dns0.clearQueries();
966 dns1.clearQueries();
967 ScopedAddrinfo result = safe_getaddrinfo("ohayou", nullptr, &hints);
968 EXPECT_TRUE(result != nullptr);
969 EXPECT_EQ(0U, GetNumQueries(dns0, host_name));
970 EXPECT_EQ(1U, GetNumQueries(dns1, host_name));
971}
972
973TEST_F(ResolverTest, GetAddrInfoV6_nonresponsive) {
Xiao Ma09b71022018-12-11 17:56:32 +0900974 constexpr char listen_addr0[] = "127.0.0.7";
975 constexpr char listen_addr1[] = "127.0.0.8";
976 constexpr char listen_srv[] = "53";
977 constexpr char host_name1[] = "ohayou.example.com.";
978 constexpr char host_name2[] = "ciao.example.com.";
Luke Huang483cf332019-06-03 17:24:51 +0800979 const std::vector<std::string> defaultSearchDomain = {"example.com"};
980 // The minimal timeout is 1000ms, so we can't decrease timeout
981 // So reduce retry count.
982 const std::vector<int> reduceRetryParams = {
983 300, // sample validity in seconds
984 25, // success threshod in percent
985 8, 8, // {MIN,MAX}_SAMPLES
986 1000, // BASE_TIMEOUT_MSEC
987 1, // retry count
988 };
Xiao Ma09b71022018-12-11 17:56:32 +0900989 const std::vector<DnsRecord> records0 = {
990 {host_name1, ns_type::ns_t_aaaa, "2001:db8::5"},
991 {host_name2, ns_type::ns_t_aaaa, "2001:db8::5"},
992 };
993 const std::vector<DnsRecord> records1 = {
994 {host_name1, ns_type::ns_t_aaaa, "2001:db8::6"},
995 {host_name2, ns_type::ns_t_aaaa, "2001:db8::6"},
996 };
Ken Chenb9fa2062018-11-13 21:51:13 +0800997
998 // dns0 does not respond with 100% probability, while
999 // dns1 responds normally, at least initially.
Mike Yufc125e42019-05-15 20:41:28 +08001000 test::DNSResponder dns0(listen_addr0, listen_srv, static_cast<ns_rcode>(-1));
1001 test::DNSResponder dns1(listen_addr1, listen_srv, static_cast<ns_rcode>(-1));
Ken Chenb9fa2062018-11-13 21:51:13 +08001002 dns0.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +09001003 StartDns(dns0, records0);
1004 StartDns(dns1, records1);
Luke Huang483cf332019-06-03 17:24:51 +08001005 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr0, listen_addr1}, defaultSearchDomain,
1006 reduceRetryParams));
Ken Chenb9fa2062018-11-13 21:51:13 +08001007
Luke Huang483cf332019-06-03 17:24:51 +08001008 // Specify ai_socktype to make getaddrinfo will only query 1 time
1009 const addrinfo hints = {.ai_family = AF_INET6, .ai_socktype = SOCK_STREAM};
Ken Chenb9fa2062018-11-13 21:51:13 +08001010
1011 // dns0 will ignore the request, and we'll fallback to dns1 after the first
1012 // retry.
1013 ScopedAddrinfo result = safe_getaddrinfo(host_name1, nullptr, &hints);
1014 EXPECT_TRUE(result != nullptr);
1015 EXPECT_EQ(1U, GetNumQueries(dns0, host_name1));
1016 EXPECT_EQ(1U, GetNumQueries(dns1, host_name1));
Mike Yu532405f2020-06-17 17:46:44 +08001017 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, 0, host_name1, {"2001:db8::6"});
Ken Chenb9fa2062018-11-13 21:51:13 +08001018
1019 // Now make dns1 also ignore 100% requests... The resolve should alternate
Luke Huang483cf332019-06-03 17:24:51 +08001020 // queries between the nameservers and fail
Ken Chenb9fa2062018-11-13 21:51:13 +08001021 dns1.setResponseProbability(0.0);
1022 addrinfo* result2 = nullptr;
1023 EXPECT_EQ(EAI_NODATA, getaddrinfo(host_name2, nullptr, &hints, &result2));
1024 EXPECT_EQ(nullptr, result2);
Luke Huang483cf332019-06-03 17:24:51 +08001025 EXPECT_EQ(1U, GetNumQueries(dns0, host_name2));
1026 EXPECT_EQ(1U, GetNumQueries(dns1, host_name2));
Mike Yu532405f2020-06-17 17:46:44 +08001027 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, RCODE_TIMEOUT, host_name2, {});
Ken Chenb9fa2062018-11-13 21:51:13 +08001028}
1029
1030TEST_F(ResolverTest, GetAddrInfoV6_concurrent) {
Xiao Ma09b71022018-12-11 17:56:32 +09001031 constexpr char listen_addr0[] = "127.0.0.9";
1032 constexpr char listen_addr1[] = "127.0.0.10";
1033 constexpr char listen_addr2[] = "127.0.0.11";
1034 constexpr char host_name[] = "konbanha.example.com.";
1035
1036 test::DNSResponder dns0(listen_addr0);
1037 test::DNSResponder dns1(listen_addr1);
1038 test::DNSResponder dns2(listen_addr2);
1039 StartDns(dns0, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
1040 StartDns(dns1, {{host_name, ns_type::ns_t_aaaa, "2001:db8::6"}});
1041 StartDns(dns2, {{host_name, ns_type::ns_t_aaaa, "2001:db8::7"}});
1042
Luke Huangf8215372019-11-22 11:53:41 +08001043 const std::vector<std::string> servers = {listen_addr0, listen_addr1, listen_addr2};
Ken Chenb9fa2062018-11-13 21:51:13 +08001044 std::vector<std::thread> threads(10);
1045 for (std::thread& thread : threads) {
Luke Huangf8215372019-11-22 11:53:41 +08001046 thread = std::thread([this, &servers]() {
1047 unsigned delay = arc4random_uniform(1 * 1000 * 1000); // <= 1s
Ken Chenb9fa2062018-11-13 21:51:13 +08001048 usleep(delay);
1049 std::vector<std::string> serverSubset;
1050 for (const auto& server : servers) {
1051 if (arc4random_uniform(2)) {
1052 serverSubset.push_back(server);
1053 }
1054 }
1055 if (serverSubset.empty()) serverSubset = servers;
Xiao Ma09b71022018-12-11 17:56:32 +09001056 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(serverSubset));
1057 const addrinfo hints = {.ai_family = AF_INET6};
Ken Chenb9fa2062018-11-13 21:51:13 +08001058 addrinfo* result = nullptr;
1059 int rv = getaddrinfo("konbanha", nullptr, &hints, &result);
1060 EXPECT_EQ(0, rv) << "error [" << rv << "] " << gai_strerror(rv);
1061 if (result) {
1062 freeaddrinfo(result);
1063 result = nullptr;
1064 }
1065 });
1066 }
1067 for (std::thread& thread : threads) {
1068 thread.join();
1069 }
Ken Chen92bed612018-12-22 21:46:55 +08001070
1071 std::vector<std::string> res_servers;
1072 std::vector<std::string> res_domains;
1073 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001074 res_params res_params;
Ken Chen92bed612018-12-22 21:46:55 +08001075 std::vector<ResolverStats> res_stats;
1076 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001077 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1078 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1079 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chen92bed612018-12-22 21:46:55 +08001080 EXPECT_EQ(0, wait_for_pending_req_timeout_count);
Ken Chenb9fa2062018-11-13 21:51:13 +08001081}
1082
Mike Yu8ac63402019-12-02 15:28:38 +08001083TEST_F(ResolverTest, SkipBadServersDueToInternalError) {
Mike Yu61d17262020-02-15 18:56:22 +08001084 const std::string kSortNameserversFlag("persist.device_config.netd_native.sort_nameservers");
Mike Yu8ac63402019-12-02 15:28:38 +08001085 constexpr char listen_addr1[] = "fe80::1";
1086 constexpr char listen_addr2[] = "255.255.255.255";
1087 constexpr char listen_addr3[] = "127.0.0.3";
Mike Yu61d17262020-02-15 18:56:22 +08001088 int counter = 0; // To generate unique hostnames.
Mike Yu8ac63402019-12-02 15:28:38 +08001089 test::DNSResponder dns(listen_addr3);
1090 ASSERT_TRUE(dns.startServer());
1091
Mike Yu61d17262020-02-15 18:56:22 +08001092 ResolverParamsParcel setupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1093 setupParams.servers = {listen_addr1, listen_addr2, listen_addr3};
1094 setupParams.minSamples = 2; // Recognize bad servers in two attempts when sorting not enabled.
Mike Yu8ac63402019-12-02 15:28:38 +08001095
Mike Yu61d17262020-02-15 18:56:22 +08001096 ResolverParamsParcel cleanupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1097 cleanupParams.servers.clear();
1098 cleanupParams.tlsServers.clear();
Mike Yu8ac63402019-12-02 15:28:38 +08001099
Mike Yu61d17262020-02-15 18:56:22 +08001100 for (const auto& sortNameserversFlag : {"" /* unset */, "0" /* off */, "1" /* on */}) {
1101 SCOPED_TRACE(fmt::format("sortNameversFlag_{}", sortNameserversFlag));
1102 ScopedSystemProperties scopedSystemProperties(kSortNameserversFlag, sortNameserversFlag);
1103
1104 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(setupParams));
1105
1106 // Start sending synchronized querying.
1107 for (int i = 0; i < 100; i++) {
1108 std::string hostName = StringPrintf("hello%d.com.", counter++);
1109 dns.addMapping(hostName, ns_type::ns_t_a, "1.2.3.4");
1110 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1111 EXPECT_TRUE(safe_getaddrinfo(hostName.c_str(), nullptr, &hints) != nullptr);
1112 }
1113
1114 const std::vector<NameserverStats> targetStats = {
1115 NameserverStats(listen_addr1).setInternalErrors(5),
1116 NameserverStats(listen_addr2).setInternalErrors(5),
1117 NameserverStats(listen_addr3).setSuccesses(setupParams.maxSamples),
1118 };
1119 EXPECT_TRUE(expectStatsNotGreaterThan(targetStats));
1120
1121 // Also verify the number of queries received in the server because res_stats.successes has
1122 // a maximum.
1123 EXPECT_EQ(dns.queries().size(), 100U);
1124
1125 // Reset the state.
1126 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(cleanupParams));
1127 dns.clearQueries();
Mike Yu8ac63402019-12-02 15:28:38 +08001128 }
Mike Yu8ac63402019-12-02 15:28:38 +08001129}
1130
1131TEST_F(ResolverTest, SkipBadServersDueToTimeout) {
Mike Yu61d17262020-02-15 18:56:22 +08001132 const std::string kSortNameserversFlag("persist.device_config.netd_native.sort_nameservers");
Mike Yu8ac63402019-12-02 15:28:38 +08001133 constexpr char listen_addr1[] = "127.0.0.3";
1134 constexpr char listen_addr2[] = "127.0.0.4";
Mike Yu61d17262020-02-15 18:56:22 +08001135 int counter = 0; // To generate unique hostnames.
1136
1137 ResolverParamsParcel setupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1138 setupParams.servers = {listen_addr1, listen_addr2};
1139 setupParams.minSamples = 2; // Recognize bad servers in two attempts when sorting not enabled.
1140
1141 ResolverParamsParcel cleanupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1142 cleanupParams.servers.clear();
1143 cleanupParams.tlsServers.clear();
Mike Yu8ac63402019-12-02 15:28:38 +08001144
1145 // Set dns1 non-responsive and dns2 workable.
1146 test::DNSResponder dns1(listen_addr1, test::kDefaultListenService, static_cast<ns_rcode>(-1));
1147 test::DNSResponder dns2(listen_addr2);
1148 dns1.setResponseProbability(0.0);
1149 ASSERT_TRUE(dns1.startServer());
1150 ASSERT_TRUE(dns2.startServer());
1151
Mike Yu61d17262020-02-15 18:56:22 +08001152 for (const auto& sortNameserversFlag : {"" /* unset */, "0" /* off */, "1" /* on */}) {
1153 SCOPED_TRACE(fmt::format("sortNameversFlag_{}", sortNameserversFlag));
1154 ScopedSystemProperties scopedSystemProperties(kSortNameserversFlag, sortNameserversFlag);
Mike Yu8ac63402019-12-02 15:28:38 +08001155
Mike Yu61d17262020-02-15 18:56:22 +08001156 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(setupParams));
Mike Yu8ac63402019-12-02 15:28:38 +08001157
Mike Yu61d17262020-02-15 18:56:22 +08001158 // Start sending synchronized querying.
1159 for (int i = 0; i < 100; i++) {
1160 std::string hostName = StringPrintf("hello%d.com.", counter++);
1161 dns1.addMapping(hostName, ns_type::ns_t_a, "1.2.3.4");
1162 dns2.addMapping(hostName, ns_type::ns_t_a, "1.2.3.5");
1163 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1164 EXPECT_TRUE(safe_getaddrinfo(hostName.c_str(), nullptr, &hints) != nullptr);
1165 }
1166
1167 const std::vector<NameserverStats> targetStats = {
1168 NameserverStats(listen_addr1).setTimeouts(5),
1169 NameserverStats(listen_addr2).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 // an upper bound.
1175 EXPECT_GT(dns1.queries().size(), 0U);
1176 EXPECT_LT(dns1.queries().size(), 5U);
1177 EXPECT_EQ(dns2.queries().size(), 100U);
1178
1179 // Reset the state.
1180 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(cleanupParams));
1181 dns1.clearQueries();
1182 dns2.clearQueries();
Mike Yu8ac63402019-12-02 15:28:38 +08001183 }
Mike Yu8ac63402019-12-02 15:28:38 +08001184}
1185
chenbrucefd837fa2019-10-29 18:35:36 +08001186TEST_F(ResolverTest, GetAddrInfoFromCustTable_InvalidInput) {
1187 constexpr char hostnameNoip[] = "noip.example.com.";
1188 constexpr char hostnameInvalidip[] = "invalidip.example.com.";
1189 const std::vector<aidl::android::net::ResolverHostsParcel> invalidCustHosts = {
1190 {"", hostnameNoip},
1191 {"wrong IP", hostnameInvalidip},
1192 };
1193 test::DNSResponder dns;
1194 StartDns(dns, {});
1195 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
Ken Chena6ac2a62020-04-07 17:25:56 +08001196 resolverParams.resolverOptions.hosts = invalidCustHosts;
chenbrucefd837fa2019-10-29 18:35:36 +08001197 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1198 for (const auto& hostname : {hostnameNoip, hostnameInvalidip}) {
1199 // The query won't get data from customized table because of invalid customized table
1200 // and DNSResponder also has no records. hostnameNoip has never registered and
1201 // hostnameInvalidip has registered but wrong IP.
1202 const addrinfo hints = {.ai_family = AF_UNSPEC};
1203 ScopedAddrinfo result = safe_getaddrinfo(hostname, nullptr, &hints);
1204 ASSERT_TRUE(result == nullptr);
1205 EXPECT_EQ(4U, GetNumQueries(dns, hostname));
1206 }
1207}
1208
1209TEST_F(ResolverTest, GetAddrInfoFromCustTable) {
1210 constexpr char hostnameV4[] = "v4only.example.com.";
1211 constexpr char hostnameV6[] = "v6only.example.com.";
1212 constexpr char hostnameV4V6[] = "v4v6.example.com.";
1213 constexpr char custAddrV4[] = "1.2.3.4";
1214 constexpr char custAddrV6[] = "::1.2.3.4";
1215 constexpr char dnsSvAddrV4[] = "1.2.3.5";
1216 constexpr char dnsSvAddrV6[] = "::1.2.3.5";
1217 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4 = {
1218 {custAddrV4, hostnameV4},
1219 };
1220 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV6 = {
1221 {custAddrV6, hostnameV6},
1222 };
1223 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4V6 = {
1224 {custAddrV4, hostnameV4V6},
1225 {custAddrV6, hostnameV4V6},
1226 };
1227 const std::vector<DnsRecord> dnsSvHostV4 = {
1228 {hostnameV4, ns_type::ns_t_a, dnsSvAddrV4},
1229 };
1230 const std::vector<DnsRecord> dnsSvHostV6 = {
1231 {hostnameV6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1232 };
1233 const std::vector<DnsRecord> dnsSvHostV4V6 = {
1234 {hostnameV4V6, ns_type::ns_t_a, dnsSvAddrV4},
1235 {hostnameV4V6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1236 };
1237 struct TestConfig {
1238 const std::string name;
1239 const std::vector<aidl::android::net::ResolverHostsParcel> customizedHosts;
1240 const std::vector<DnsRecord> dnsserverHosts;
1241 const std::vector<std::string> queryResult;
1242 std::string asParameters() const {
1243 return StringPrintf("name: %s, customizedHosts: %s, dnsserverHosts: %s", name.c_str(),
1244 customizedHosts.empty() ? "No" : "Yes",
1245 dnsserverHosts.empty() ? "No" : "Yes");
1246 }
1247 } testConfigs[]{
1248 // clang-format off
1249 {hostnameV4, {}, {}, {}},
1250 {hostnameV4, {}, dnsSvHostV4, {dnsSvAddrV4}},
1251 {hostnameV4, custHostV4, {}, {custAddrV4}},
1252 {hostnameV4, custHostV4, dnsSvHostV4, {custAddrV4}},
1253 {hostnameV6, {}, {}, {}},
1254 {hostnameV6, {}, dnsSvHostV6, {dnsSvAddrV6}},
1255 {hostnameV6, custHostV6, {}, {custAddrV6}},
1256 {hostnameV6, custHostV6, dnsSvHostV6, {custAddrV6}},
1257 {hostnameV4V6, {}, {}, {}},
1258 {hostnameV4V6, {}, dnsSvHostV4V6, {dnsSvAddrV4, dnsSvAddrV6}},
1259 {hostnameV4V6, custHostV4V6, {}, {custAddrV4, custAddrV6}},
1260 {hostnameV4V6, custHostV4V6, dnsSvHostV4V6, {custAddrV4, custAddrV6}},
1261 // clang-format on
1262 };
1263
1264 for (const auto& config : testConfigs) {
1265 SCOPED_TRACE(config.asParameters());
1266
1267 test::DNSResponder dns;
1268 StartDns(dns, config.dnsserverHosts);
1269
1270 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
Ken Chena6ac2a62020-04-07 17:25:56 +08001271 resolverParams.resolverOptions.hosts = config.customizedHosts;
chenbrucefd837fa2019-10-29 18:35:36 +08001272 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1273 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM};
1274 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
1275 if (config.customizedHosts.empty() && config.dnsserverHosts.empty()) {
1276 ASSERT_TRUE(result == nullptr);
1277 EXPECT_EQ(2U, GetNumQueries(dns, config.name.c_str()));
1278 } else {
1279 ASSERT_TRUE(result != nullptr);
1280 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(config.queryResult));
1281 EXPECT_EQ(config.customizedHosts.empty() ? 2U : 0U,
1282 GetNumQueries(dns, config.name.c_str()));
1283 }
1284
1285 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
1286 }
1287}
1288
1289TEST_F(ResolverTest, GetAddrInfoFromCustTable_Modify) {
1290 constexpr char hostnameV4V6[] = "v4v6.example.com.";
1291 constexpr char custAddrV4[] = "1.2.3.4";
1292 constexpr char custAddrV6[] = "::1.2.3.4";
1293 constexpr char dnsSvAddrV4[] = "1.2.3.5";
1294 constexpr char dnsSvAddrV6[] = "::1.2.3.5";
1295 const std::vector<DnsRecord> dnsSvHostV4V6 = {
1296 {hostnameV4V6, ns_type::ns_t_a, dnsSvAddrV4},
1297 {hostnameV4V6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1298 };
1299 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4V6 = {
1300 {custAddrV4, hostnameV4V6},
1301 {custAddrV6, hostnameV4V6},
1302 };
1303 test::DNSResponder dns;
1304 StartDns(dns, dnsSvHostV4V6);
1305 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1306
Ken Chena6ac2a62020-04-07 17:25:56 +08001307 resolverParams.resolverOptions.hosts = custHostV4V6;
chenbrucefd837fa2019-10-29 18:35:36 +08001308 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1309 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM};
1310 ScopedAddrinfo result = safe_getaddrinfo(hostnameV4V6, nullptr, &hints);
1311 ASSERT_TRUE(result != nullptr);
1312 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray({custAddrV4, custAddrV6}));
1313 EXPECT_EQ(0U, GetNumQueries(dns, hostnameV4V6));
1314
Ken Chena6ac2a62020-04-07 17:25:56 +08001315 resolverParams.resolverOptions.hosts = {};
chenbrucefd837fa2019-10-29 18:35:36 +08001316 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1317 result = safe_getaddrinfo(hostnameV4V6, nullptr, &hints);
1318 ASSERT_TRUE(result != nullptr);
1319 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray({dnsSvAddrV4, dnsSvAddrV6}));
1320 EXPECT_EQ(2U, GetNumQueries(dns, hostnameV4V6));
1321}
1322
Ken Chenb9fa2062018-11-13 21:51:13 +08001323TEST_F(ResolverTest, EmptySetup) {
Ken Chenb9fa2062018-11-13 21:51:13 +08001324 std::vector<std::string> servers;
1325 std::vector<std::string> domains;
Xiao Ma09b71022018-12-11 17:56:32 +09001326 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001327 std::vector<std::string> res_servers;
1328 std::vector<std::string> res_domains;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001329 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001330 res_params res_params;
Ken Chenb9fa2062018-11-13 21:51:13 +08001331 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +08001332 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001333 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1334 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1335 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chenb9fa2062018-11-13 21:51:13 +08001336 EXPECT_EQ(0U, res_servers.size());
1337 EXPECT_EQ(0U, res_domains.size());
Mike Yu0a1c53d2018-11-26 13:26:21 +09001338 EXPECT_EQ(0U, res_tls_servers.size());
Luke Huang5bd827c2019-03-14 16:10:04 +08001339 ASSERT_EQ(static_cast<size_t>(IDnsResolver::RESOLVER_PARAMS_COUNT), kDefaultParams.size());
1340 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY],
1341 res_params.sample_validity);
1342 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001343 res_params.success_threshold);
Luke Huang5bd827c2019-03-14 16:10:04 +08001344 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
1345 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
1346 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
Ken Chenb9fa2062018-11-13 21:51:13 +08001347 res_params.base_timeout_msec);
Luke Huang5bd827c2019-03-14 16:10:04 +08001348 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_RETRY_COUNT], res_params.retry_count);
Ken Chenb9fa2062018-11-13 21:51:13 +08001349}
1350
1351TEST_F(ResolverTest, SearchPathChange) {
Xiao Ma09b71022018-12-11 17:56:32 +09001352 constexpr char listen_addr[] = "127.0.0.13";
1353 constexpr char host_name1[] = "test13.domain1.org.";
1354 constexpr char host_name2[] = "test13.domain2.org.";
Luke Huangf8215372019-11-22 11:53:41 +08001355 std::vector<std::string> servers = {listen_addr};
1356 std::vector<std::string> domains = {"domain1.org"};
Xiao Ma09b71022018-12-11 17:56:32 +09001357
1358 const std::vector<DnsRecord> records = {
1359 {host_name1, ns_type::ns_t_aaaa, "2001:db8::13"},
1360 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1:13"},
1361 };
1362 test::DNSResponder dns(listen_addr);
1363 StartDns(dns, records);
1364 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001365
1366 const addrinfo hints = {.ai_family = AF_INET6};
1367 ScopedAddrinfo result = safe_getaddrinfo("test13", nullptr, &hints);
1368 EXPECT_TRUE(result != nullptr);
1369 EXPECT_EQ(1U, dns.queries().size());
1370 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
1371 EXPECT_EQ("2001:db8::13", ToString(result));
1372
1373 // Test that changing the domain search path on its own works.
Luke Huangf8215372019-11-22 11:53:41 +08001374 domains = {"domain2.org"};
Xiao Ma09b71022018-12-11 17:56:32 +09001375 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001376 dns.clearQueries();
1377
1378 result = safe_getaddrinfo("test13", nullptr, &hints);
1379 EXPECT_TRUE(result != nullptr);
1380 EXPECT_EQ(1U, dns.queries().size());
1381 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
1382 EXPECT_EQ("2001:db8::1:13", ToString(result));
1383}
1384
Luke Huang2dac4382019-06-24 13:28:44 +08001385namespace {
1386
Luke Huangf8215372019-11-22 11:53:41 +08001387std::vector<std::string> getResolverDomains(aidl::android::net::IDnsResolver* dnsResolverService,
Luke Huang2dac4382019-06-24 13:28:44 +08001388 unsigned netId) {
1389 std::vector<std::string> res_servers;
1390 std::vector<std::string> res_domains;
1391 std::vector<std::string> res_tls_servers;
1392 res_params res_params;
1393 std::vector<ResolverStats> res_stats;
1394 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001395 DnsResponderClient::GetResolverInfo(dnsResolverService, netId, &res_servers, &res_domains,
1396 &res_tls_servers, &res_params, &res_stats,
1397 &wait_for_pending_req_timeout_count);
Luke Huang2dac4382019-06-24 13:28:44 +08001398 return res_domains;
1399}
1400
1401} // namespace
1402
1403TEST_F(ResolverTest, SearchPathPrune) {
1404 constexpr size_t DUPLICATED_DOMAIN_NUM = 3;
1405 constexpr char listen_addr[] = "127.0.0.13";
1406 constexpr char domian_name1[] = "domain13.org.";
1407 constexpr char domian_name2[] = "domain14.org.";
1408 constexpr char host_name1[] = "test13.domain13.org.";
1409 constexpr char host_name2[] = "test14.domain14.org.";
1410 std::vector<std::string> servers = {listen_addr};
1411
1412 std::vector<std::string> testDomains1;
1413 std::vector<std::string> testDomains2;
1414 // Domain length should be <= 255
1415 // Max number of domains in search path is 6
1416 for (size_t i = 0; i < MAXDNSRCH + 1; i++) {
1417 // Fill up with invalid domain
1418 testDomains1.push_back(std::string(300, i + '0'));
1419 // Fill up with valid but duplicated domain
1420 testDomains2.push_back(StringPrintf("domain%zu.org", i % DUPLICATED_DOMAIN_NUM));
1421 }
1422
1423 // Add valid domain used for query.
1424 testDomains1.push_back(domian_name1);
1425
1426 // Add valid domain twice used for query.
1427 testDomains2.push_back(domian_name2);
1428 testDomains2.push_back(domian_name2);
1429
1430 const std::vector<DnsRecord> records = {
1431 {host_name1, ns_type::ns_t_aaaa, "2001:db8::13"},
1432 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1:13"},
1433 };
1434 test::DNSResponder dns(listen_addr);
1435 StartDns(dns, records);
1436 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, testDomains1));
1437
1438 const addrinfo hints = {.ai_family = AF_INET6};
1439 ScopedAddrinfo result = safe_getaddrinfo("test13", nullptr, &hints);
1440
1441 EXPECT_TRUE(result != nullptr);
1442
1443 EXPECT_EQ(1U, dns.queries().size());
1444 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
1445 EXPECT_EQ("2001:db8::13", ToString(result));
1446
1447 const auto& res_domains1 = getResolverDomains(mDnsClient.resolvService(), TEST_NETID);
1448 // Expect 1 valid domain, invalid domains are removed.
1449 ASSERT_EQ(1U, res_domains1.size());
1450 EXPECT_EQ(domian_name1, res_domains1[0]);
1451
1452 dns.clearQueries();
1453
1454 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, testDomains2));
1455
1456 result = safe_getaddrinfo("test14", nullptr, &hints);
1457 EXPECT_TRUE(result != nullptr);
1458
1459 // (3 domains * 2 retries) + 1 success query = 7
1460 EXPECT_EQ(7U, dns.queries().size());
1461 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
1462 EXPECT_EQ("2001:db8::1:13", ToString(result));
1463
1464 const auto& res_domains2 = getResolverDomains(mDnsClient.resolvService(), TEST_NETID);
1465 // Expect 4 valid domain, duplicate domains are removed.
1466 EXPECT_EQ(DUPLICATED_DOMAIN_NUM + 1U, res_domains2.size());
1467 EXPECT_THAT(
1468 std::vector<std::string>({"domain0.org", "domain1.org", "domain2.org", domian_name2}),
1469 testing::ElementsAreArray(res_domains2));
1470}
1471
Mike Yu0a1c53d2018-11-26 13:26:21 +09001472// If we move this function to dns_responder_client, it will complicate the dependency need of
1473// dns_tls_frontend.h.
1474static void setupTlsServers(const std::vector<std::string>& servers,
waynema0e73c2e2019-07-31 15:04:08 +08001475 std::vector<std::unique_ptr<test::DnsTlsFrontend>>* tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001476 constexpr char listen_udp[] = "53";
1477 constexpr char listen_tls[] = "853";
Mike Yu0a1c53d2018-11-26 13:26:21 +09001478
1479 for (const auto& server : servers) {
1480 auto t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
1481 t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
1482 t->startServer();
Mike Yu0a1c53d2018-11-26 13:26:21 +09001483 tls->push_back(std::move(t));
1484 }
1485}
1486
Mike Yu0a1c53d2018-11-26 13:26:21 +09001487TEST_F(ResolverTest, MaxServerPrune_Binder) {
Mike Yu0a1c53d2018-11-26 13:26:21 +09001488 std::vector<std::string> domains;
1489 std::vector<std::unique_ptr<test::DNSResponder>> dns;
1490 std::vector<std::unique_ptr<test::DnsTlsFrontend>> tls;
1491 std::vector<std::string> servers;
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001492 std::vector<DnsResponderClient::Mapping> mappings;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001493
1494 for (unsigned i = 0; i < MAXDNSRCH + 1; i++) {
1495 domains.push_back(StringPrintf("example%u.com", i));
1496 }
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001497 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupMappings(1, domains, &mappings));
1498 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupDNSServers(MAXNS + 1, mappings, &dns, &servers));
waynema0e73c2e2019-07-31 15:04:08 +08001499 ASSERT_NO_FATAL_FAILURE(setupTlsServers(servers, &tls));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001500
waynema0e73c2e2019-07-31 15:04:08 +08001501 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, domains, kDefaultParams,
1502 kDefaultPrivateDnsHostName));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001503
Mike Yu383855b2019-01-15 17:53:27 +08001504 // If the private DNS validation hasn't completed yet before backend DNS servers stop,
1505 // TLS servers will get stuck in handleOneRequest(), which causes this test stuck in
1506 // ~DnsTlsFrontend() because the TLS server loop threads can't be terminated.
1507 // So, wait for private DNS validation done before stopping backend DNS servers.
1508 for (int i = 0; i < MAXNS; i++) {
chenbruceaff85842019-05-31 15:46:42 +08001509 LOG(INFO) << "Waiting for private DNS validation on " << tls[i]->listen_address() << ".";
Mike Yu724f77d2019-08-16 11:14:50 +08001510 EXPECT_TRUE(WaitForPrivateDnsValidation(tls[i]->listen_address(), true));
chenbruceaff85842019-05-31 15:46:42 +08001511 LOG(INFO) << "private DNS validation on " << tls[i]->listen_address() << " done.";
Mike Yu383855b2019-01-15 17:53:27 +08001512 }
1513
Mike Yu0a1c53d2018-11-26 13:26:21 +09001514 std::vector<std::string> res_servers;
1515 std::vector<std::string> res_domains;
1516 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001517 res_params res_params;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001518 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +08001519 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001520 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1521 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1522 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001523
1524 // Check the size of the stats and its contents.
1525 EXPECT_EQ(static_cast<size_t>(MAXNS), res_servers.size());
1526 EXPECT_EQ(static_cast<size_t>(MAXNS), res_tls_servers.size());
1527 EXPECT_EQ(static_cast<size_t>(MAXDNSRCH), res_domains.size());
1528 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_servers.begin()));
1529 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_tls_servers.begin()));
1530 EXPECT_TRUE(std::equal(domains.begin(), domains.begin() + MAXDNSRCH, res_domains.begin()));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001531}
1532
1533TEST_F(ResolverTest, ResolverStats) {
Xiao Ma09b71022018-12-11 17:56:32 +09001534 constexpr char listen_addr1[] = "127.0.0.4";
1535 constexpr char listen_addr2[] = "127.0.0.5";
1536 constexpr char listen_addr3[] = "127.0.0.6";
Mike Yu0a1c53d2018-11-26 13:26:21 +09001537
1538 // Set server 1 timeout.
Mike Yufc125e42019-05-15 20:41:28 +08001539 test::DNSResponder dns1(listen_addr1, "53", static_cast<ns_rcode>(-1));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001540 dns1.setResponseProbability(0.0);
1541 ASSERT_TRUE(dns1.startServer());
1542
1543 // Set server 2 responding server failure.
Xiao Ma09b71022018-12-11 17:56:32 +09001544 test::DNSResponder dns2(listen_addr2);
Mike Yu0a1c53d2018-11-26 13:26:21 +09001545 dns2.setResponseProbability(0.0);
1546 ASSERT_TRUE(dns2.startServer());
1547
1548 // Set server 3 workable.
Xiao Ma09b71022018-12-11 17:56:32 +09001549 test::DNSResponder dns3(listen_addr3);
1550 dns3.addMapping(kHelloExampleCom, ns_type::ns_t_a, "1.2.3.4");
Mike Yu0a1c53d2018-11-26 13:26:21 +09001551 ASSERT_TRUE(dns3.startServer());
1552
1553 std::vector<std::string> servers = {listen_addr1, listen_addr2, listen_addr3};
Xiao Ma09b71022018-12-11 17:56:32 +09001554 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001555
1556 dns3.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +09001557 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
Mike Yu0a1c53d2018-11-26 13:26:21 +09001558 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
Xiao Ma09b71022018-12-11 17:56:32 +09001559 size_t found = GetNumQueries(dns3, kHelloExampleCom);
Mike Yu0a1c53d2018-11-26 13:26:21 +09001560 EXPECT_LE(1U, found);
1561 std::string result_str = ToString(result);
1562 EXPECT_TRUE(result_str == "1.2.3.4") << ", result_str='" << result_str << "'";
1563
Mike Yue2162e52020-03-04 18:43:46 +08001564 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1565 NameserverStats(listen_addr1).setTimeouts(1),
1566 NameserverStats(listen_addr2).setErrors(1),
1567 NameserverStats(listen_addr3).setSuccesses(1),
1568 };
Mike Yu61d17262020-02-15 18:56:22 +08001569 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001570}
1571
Mike Yu15791832020-02-11 13:38:48 +08001572TEST_F(ResolverTest, AlwaysUseLatestSetupParamsInLookups) {
1573 constexpr char listen_addr1[] = "127.0.0.3";
1574 constexpr char listen_addr2[] = "255.255.255.255";
1575 constexpr char listen_addr3[] = "127.0.0.4";
1576 constexpr char hostname[] = "hello";
1577 constexpr char fqdn_with_search_domain[] = "hello.domain2.com.";
1578
1579 test::DNSResponder dns1(listen_addr1, test::kDefaultListenService, static_cast<ns_rcode>(-1));
1580 dns1.setResponseProbability(0.0);
1581 ASSERT_TRUE(dns1.startServer());
1582
1583 test::DNSResponder dns3(listen_addr3);
1584 StartDns(dns3, {{fqdn_with_search_domain, ns_type::ns_t_a, "1.2.3.4"}});
1585
1586 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
1587 parcel.tlsServers.clear();
1588 parcel.servers = {listen_addr1, listen_addr2};
1589 parcel.domains = {"domain1.com", "domain2.com"};
1590 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1591
1592 // Expect the things happening in t1:
1593 // 1. The lookup starts using the first domain for query. It sends queries to the populated
1594 // nameserver list {listen_addr1, listen_addr2} for the hostname "hello.domain1.com".
1595 // 2. A different list of nameservers is updated to the resolver. Revision ID is incremented.
1596 // 3. The query for the hostname times out. The lookup fails to add the timeout record to the
1597 // the stats because of the unmatched revision ID.
1598 // 4. The lookup starts using the second domain for query. It sends queries to the populated
1599 // nameserver list {listen_addr3, listen_addr1, listen_addr2} for another hostname
1600 // "hello.domain2.com".
1601 // 5. The lookup gets the answer and updates a success record to the stats.
1602 std::thread t1([&hostname]() {
1603 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1604 ScopedAddrinfo result = safe_getaddrinfo(hostname, nullptr, &hints);
1605 EXPECT_NE(result.get(), nullptr);
1606 EXPECT_EQ(ToString(result), "1.2.3.4");
1607 });
1608
1609 // Wait for t1 to start the step 1.
1610 while (dns1.queries().size() == 0) {
1611 usleep(1000);
1612 }
1613
1614 // Update the resolver with three nameservers. This will increment the revision ID.
1615 parcel.servers = {listen_addr3, listen_addr1, listen_addr2};
1616 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1617
1618 t1.join();
1619 EXPECT_EQ(0U, GetNumQueriesForType(dns3, ns_type::ns_t_aaaa, fqdn_with_search_domain));
1620 EXPECT_EQ(1U, GetNumQueriesForType(dns3, ns_type::ns_t_a, fqdn_with_search_domain));
1621
Mike Yue2162e52020-03-04 18:43:46 +08001622 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1623 NameserverStats(listen_addr1),
1624 NameserverStats(listen_addr2),
1625 NameserverStats(listen_addr3).setSuccesses(1),
1626 };
Mike Yu61d17262020-02-15 18:56:22 +08001627 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu15791832020-02-11 13:38:48 +08001628}
1629
Ken Chenb9fa2062018-11-13 21:51:13 +08001630// Test what happens if the specified TLS server is nonexistent.
1631TEST_F(ResolverTest, GetHostByName_TlsMissing) {
Xiao Ma09b71022018-12-11 17:56:32 +09001632 constexpr char listen_addr[] = "127.0.0.3";
1633 constexpr char host_name[] = "tlsmissing.example.com.";
1634
1635 test::DNSResponder dns;
1636 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.3"}});
Luke Huangf8215372019-11-22 11:53:41 +08001637 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001638
1639 // There's nothing listening on this address, so validation will either fail or
1640 /// hang. Either way, queries will continue to flow to the DNSResponder.
waynema0e73c2e2019-07-31 15:04:08 +08001641 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Ken Chenb9fa2062018-11-13 21:51:13 +08001642
1643 const hostent* result;
1644
1645 result = gethostbyname("tlsmissing");
1646 ASSERT_FALSE(result == nullptr);
1647 EXPECT_EQ("1.2.3.3", ToString(result));
1648
1649 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001650 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001651}
1652
1653// Test what happens if the specified TLS server replies with garbage.
1654TEST_F(ResolverTest, GetHostByName_TlsBroken) {
Xiao Ma09b71022018-12-11 17:56:32 +09001655 constexpr char listen_addr[] = "127.0.0.3";
1656 constexpr char host_name1[] = "tlsbroken1.example.com.";
1657 constexpr char host_name2[] = "tlsbroken2.example.com.";
1658 const std::vector<DnsRecord> records = {
1659 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1660 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1661 };
1662
1663 test::DNSResponder dns;
1664 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001665 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001666
1667 // Bind the specified private DNS socket but don't respond to any client sockets yet.
1668 int s = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, IPPROTO_TCP);
1669 ASSERT_TRUE(s >= 0);
1670 struct sockaddr_in tlsServer = {
Luke Huangf8215372019-11-22 11:53:41 +08001671 .sin_family = AF_INET,
1672 .sin_port = htons(853),
Ken Chenb9fa2062018-11-13 21:51:13 +08001673 };
1674 ASSERT_TRUE(inet_pton(AF_INET, listen_addr, &tlsServer.sin_addr));
1675 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEPORT).ok());
1676 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEADDR).ok());
1677 ASSERT_FALSE(bind(s, reinterpret_cast<struct sockaddr*>(&tlsServer), sizeof(tlsServer)));
1678 ASSERT_FALSE(listen(s, 1));
1679
1680 // Trigger TLS validation.
waynema0e73c2e2019-07-31 15:04:08 +08001681 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Ken Chenb9fa2062018-11-13 21:51:13 +08001682
1683 struct sockaddr_storage cliaddr;
1684 socklen_t sin_size = sizeof(cliaddr);
Luke Huangf8215372019-11-22 11:53:41 +08001685 int new_fd = accept4(s, reinterpret_cast<struct sockaddr*>(&cliaddr), &sin_size, SOCK_CLOEXEC);
Ken Chenb9fa2062018-11-13 21:51:13 +08001686 ASSERT_TRUE(new_fd > 0);
1687
1688 // We've received the new file descriptor but not written to it or closed, so the
1689 // validation is still pending. Queries should still flow correctly because the
1690 // server is not used until validation succeeds.
1691 const hostent* result;
1692 result = gethostbyname("tlsbroken1");
1693 ASSERT_FALSE(result == nullptr);
1694 EXPECT_EQ("1.2.3.1", ToString(result));
1695
1696 // Now we cause the validation to fail.
1697 std::string garbage = "definitely not a valid TLS ServerHello";
1698 write(new_fd, garbage.data(), garbage.size());
1699 close(new_fd);
1700
1701 // Validation failure shouldn't interfere with lookups, because lookups won't be sent
1702 // to the TLS server unless validation succeeds.
1703 result = gethostbyname("tlsbroken2");
1704 ASSERT_FALSE(result == nullptr);
1705 EXPECT_EQ("1.2.3.2", ToString(result));
1706
1707 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001708 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001709 close(s);
1710}
1711
1712TEST_F(ResolverTest, GetHostByName_Tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001713 constexpr char listen_addr[] = "127.0.0.3";
1714 constexpr char listen_udp[] = "53";
1715 constexpr char listen_tls[] = "853";
1716 constexpr char host_name1[] = "tls1.example.com.";
1717 constexpr char host_name2[] = "tls2.example.com.";
1718 constexpr char host_name3[] = "tls3.example.com.";
1719 const std::vector<DnsRecord> records = {
1720 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1721 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1722 {host_name3, ns_type::ns_t_a, "1.2.3.3"},
1723 };
1724
1725 test::DNSResponder dns;
1726 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001727 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001728
1729 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1730 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001731 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08001732 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001733
Mike Yu724f77d2019-08-16 11:14:50 +08001734 const hostent* result = gethostbyname("tls1");
Ken Chenb9fa2062018-11-13 21:51:13 +08001735 ASSERT_FALSE(result == nullptr);
1736 EXPECT_EQ("1.2.3.1", ToString(result));
1737
1738 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001739 EXPECT_TRUE(tls.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001740
1741 // Stop the TLS server. Since we're in opportunistic mode, queries will
1742 // fall back to the locally-assigned (clear text) nameservers.
1743 tls.stopServer();
1744
1745 dns.clearQueries();
1746 result = gethostbyname("tls2");
1747 EXPECT_FALSE(result == nullptr);
1748 EXPECT_EQ("1.2.3.2", ToString(result));
1749 const auto queries = dns.queries();
1750 EXPECT_EQ(1U, queries.size());
waynema29253052019-08-20 11:26:08 +08001751 EXPECT_EQ("tls2.example.com.", queries[0].name);
1752 EXPECT_EQ(ns_t_a, queries[0].type);
Ken Chenb9fa2062018-11-13 21:51:13 +08001753
1754 // Reset the resolvers without enabling TLS. Queries should still be routed
1755 // to the UDP endpoint.
Xiao Ma09b71022018-12-11 17:56:32 +09001756 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001757
1758 result = gethostbyname("tls3");
1759 ASSERT_FALSE(result == nullptr);
1760 EXPECT_EQ("1.2.3.3", ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +08001761}
1762
Ken Chenb9fa2062018-11-13 21:51:13 +08001763TEST_F(ResolverTest, GetHostByName_TlsFailover) {
Xiao Ma09b71022018-12-11 17:56:32 +09001764 constexpr char listen_addr1[] = "127.0.0.3";
1765 constexpr char listen_addr2[] = "127.0.0.4";
1766 constexpr char listen_udp[] = "53";
1767 constexpr char listen_tls[] = "853";
1768 constexpr char host_name1[] = "tlsfailover1.example.com.";
1769 constexpr char host_name2[] = "tlsfailover2.example.com.";
1770 const std::vector<DnsRecord> records1 = {
1771 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1772 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1773 };
1774 const std::vector<DnsRecord> records2 = {
1775 {host_name1, ns_type::ns_t_a, "1.2.3.3"},
1776 {host_name2, ns_type::ns_t_a, "1.2.3.4"},
1777 };
1778
1779 test::DNSResponder dns1(listen_addr1);
1780 test::DNSResponder dns2(listen_addr2);
1781 StartDns(dns1, records1);
1782 StartDns(dns2, records2);
1783
Luke Huangf8215372019-11-22 11:53:41 +08001784 std::vector<std::string> servers = {listen_addr1, listen_addr2};
Ken Chenb9fa2062018-11-13 21:51:13 +08001785
1786 test::DnsTlsFrontend tls1(listen_addr1, listen_tls, listen_addr1, listen_udp);
1787 test::DnsTlsFrontend tls2(listen_addr2, listen_tls, listen_addr2, listen_udp);
1788 ASSERT_TRUE(tls1.startServer());
1789 ASSERT_TRUE(tls2.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001790 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1791 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08001792 EXPECT_TRUE(WaitForPrivateDnsValidation(tls1.listen_address(), true));
1793 EXPECT_TRUE(WaitForPrivateDnsValidation(tls2.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001794
Mike Yu724f77d2019-08-16 11:14:50 +08001795 const hostent* result = gethostbyname("tlsfailover1");
Ken Chenb9fa2062018-11-13 21:51:13 +08001796 ASSERT_FALSE(result == nullptr);
1797 EXPECT_EQ("1.2.3.1", ToString(result));
1798
1799 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001800 EXPECT_TRUE(tls1.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001801 // No new queries should have reached tls2.
Luke Huang0a0870d2020-02-12 20:41:10 +08001802 EXPECT_TRUE(tls2.waitForQueries(1));
Ken Chenb9fa2062018-11-13 21:51:13 +08001803
1804 // Stop tls1. Subsequent queries should attempt to reach tls1, fail, and retry to tls2.
1805 tls1.stopServer();
1806
1807 result = gethostbyname("tlsfailover2");
1808 EXPECT_EQ("1.2.3.4", ToString(result));
1809
1810 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001811 EXPECT_TRUE(tls2.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001812
1813 // No additional queries should have reached the insecure servers.
1814 EXPECT_EQ(2U, dns1.queries().size());
1815 EXPECT_EQ(2U, dns2.queries().size());
1816
1817 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001818 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Ken Chenb9fa2062018-11-13 21:51:13 +08001819}
1820
1821TEST_F(ResolverTest, GetHostByName_BadTlsName) {
Xiao Ma09b71022018-12-11 17:56:32 +09001822 constexpr char listen_addr[] = "127.0.0.3";
1823 constexpr char listen_udp[] = "53";
1824 constexpr char listen_tls[] = "853";
1825 constexpr char host_name[] = "badtlsname.example.com.";
1826
1827 test::DNSResponder dns;
1828 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.1"}});
Luke Huangf8215372019-11-22 11:53:41 +08001829 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001830
1831 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1832 ASSERT_TRUE(tls.startServer());
Xiao Ma09b71022018-12-11 17:56:32 +09001833 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
waynema0e73c2e2019-07-31 15:04:08 +08001834 kDefaultIncorrectPrivateDnsHostName));
Ken Chenb9fa2062018-11-13 21:51:13 +08001835
waynema0e73c2e2019-07-31 15:04:08 +08001836 // The TLS handshake would fail because the name of TLS server doesn't
1837 // match with TLS server's certificate.
Mike Yu724f77d2019-08-16 11:14:50 +08001838 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), false));
Ken Chenb9fa2062018-11-13 21:51:13 +08001839
1840 // The query should fail hard, because a name was specified.
1841 EXPECT_EQ(nullptr, gethostbyname("badtlsname"));
1842
1843 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001844 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001845}
1846
1847TEST_F(ResolverTest, GetAddrInfo_Tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001848 constexpr char listen_addr[] = "127.0.0.3";
1849 constexpr char listen_udp[] = "53";
1850 constexpr char listen_tls[] = "853";
1851 constexpr char host_name[] = "addrinfotls.example.com.";
1852 const std::vector<DnsRecord> records = {
1853 {host_name, ns_type::ns_t_a, "1.2.3.4"},
1854 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
1855 };
1856
1857 test::DNSResponder dns;
1858 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001859 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001860
1861 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1862 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001863 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1864 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08001865 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001866
1867 dns.clearQueries();
1868 ScopedAddrinfo result = safe_getaddrinfo("addrinfotls", nullptr, nullptr);
1869 EXPECT_TRUE(result != nullptr);
1870 size_t found = GetNumQueries(dns, host_name);
1871 EXPECT_LE(1U, found);
1872 // Could be A or AAAA
1873 std::string result_str = ToString(result);
1874 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +08001875 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08001876 // Wait for both A and AAAA queries to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001877 EXPECT_TRUE(tls.waitForQueries(3));
Ken Chenb9fa2062018-11-13 21:51:13 +08001878
1879 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001880 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001881}
1882
1883TEST_F(ResolverTest, TlsBypass) {
1884 const char OFF[] = "off";
1885 const char OPPORTUNISTIC[] = "opportunistic";
1886 const char STRICT[] = "strict";
1887
1888 const char GETHOSTBYNAME[] = "gethostbyname";
1889 const char GETADDRINFO[] = "getaddrinfo";
1890 const char GETADDRINFOFORNET[] = "getaddrinfofornet";
1891
1892 const unsigned BYPASS_NETID = NETID_USE_LOCAL_NAMESERVERS | TEST_NETID;
1893
Ken Chenb9fa2062018-11-13 21:51:13 +08001894 const char ADDR4[] = "192.0.2.1";
1895 const char ADDR6[] = "2001:db8::1";
1896
1897 const char cleartext_addr[] = "127.0.0.53";
1898 const char cleartext_port[] = "53";
1899 const char tls_port[] = "853";
Luke Huangf8215372019-11-22 11:53:41 +08001900 const std::vector<std::string> servers = {cleartext_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001901
Xiao Ma09b71022018-12-11 17:56:32 +09001902 test::DNSResponder dns(cleartext_addr);
Ken Chenb9fa2062018-11-13 21:51:13 +08001903 ASSERT_TRUE(dns.startServer());
1904
1905 test::DnsTlsFrontend tls(cleartext_addr, tls_port, cleartext_addr, cleartext_port);
Mike Yudd4ac2d2019-05-31 16:52:11 +08001906 ASSERT_TRUE(tls.startServer());
Ken Chenb9fa2062018-11-13 21:51:13 +08001907
Luke Huangf8215372019-11-22 11:53:41 +08001908 // clang-format off
Ken Chenb9fa2062018-11-13 21:51:13 +08001909 struct TestConfig {
1910 const std::string mode;
1911 const bool withWorkingTLS;
1912 const std::string method;
1913
1914 std::string asHostName() const {
Luke Huangf8215372019-11-22 11:53:41 +08001915 return StringPrintf("%s.%s.%s.", mode.c_str(), withWorkingTLS ? "tlsOn" : "tlsOff",
Ken Chenb9fa2062018-11-13 21:51:13 +08001916 method.c_str());
1917 }
1918 } testConfigs[]{
Ken Chenb9fa2062018-11-13 21:51:13 +08001919 {OFF, true, GETHOSTBYNAME},
1920 {OPPORTUNISTIC, true, GETHOSTBYNAME},
1921 {STRICT, true, GETHOSTBYNAME},
Ken Chenb9fa2062018-11-13 21:51:13 +08001922 {OFF, true, GETADDRINFO},
1923 {OPPORTUNISTIC, true, GETADDRINFO},
1924 {STRICT, true, GETADDRINFO},
Ken Chenb9fa2062018-11-13 21:51:13 +08001925 {OFF, true, GETADDRINFOFORNET},
1926 {OPPORTUNISTIC, true, GETADDRINFOFORNET},
1927 {STRICT, true, GETADDRINFOFORNET},
Mike Yudd4ac2d2019-05-31 16:52:11 +08001928 {OFF, false, GETHOSTBYNAME},
1929 {OPPORTUNISTIC, false, GETHOSTBYNAME},
1930 {STRICT, false, GETHOSTBYNAME},
1931 {OFF, false, GETADDRINFO},
1932 {OPPORTUNISTIC, false, GETADDRINFO},
1933 {STRICT, false, GETADDRINFO},
1934 {OFF, false, GETADDRINFOFORNET},
1935 {OPPORTUNISTIC, false, GETADDRINFOFORNET},
1936 {STRICT, false, GETADDRINFOFORNET},
Ken Chenb9fa2062018-11-13 21:51:13 +08001937 };
Luke Huangf8215372019-11-22 11:53:41 +08001938 // clang-format on
Ken Chenb9fa2062018-11-13 21:51:13 +08001939
1940 for (const auto& config : testConfigs) {
1941 const std::string testHostName = config.asHostName();
1942 SCOPED_TRACE(testHostName);
1943
1944 // Don't tempt test bugs due to caching.
1945 const char* host_name = testHostName.c_str();
1946 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
1947 dns.addMapping(host_name, ns_type::ns_t_aaaa, ADDR6);
1948
Mike Yudd4ac2d2019-05-31 16:52:11 +08001949 if (config.withWorkingTLS) {
1950 if (!tls.running()) {
1951 ASSERT_TRUE(tls.startServer());
1952 }
1953 } else {
1954 if (tls.running()) {
1955 ASSERT_TRUE(tls.stopServer());
1956 }
1957 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001958
1959 if (config.mode == OFF) {
Xiao Ma09b71022018-12-11 17:56:32 +09001960 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, kDefaultSearchDomains,
1961 kDefaultParams));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001962 } else /* OPPORTUNISTIC or STRICT */ {
1963 const char* tls_hostname = (config.mode == STRICT) ? kDefaultPrivateDnsHostName : "";
Xiao Ma09b71022018-12-11 17:56:32 +09001964 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001965 kDefaultParams, tls_hostname));
Mike Yu724f77d2019-08-16 11:14:50 +08001966
1967 // Wait for the validation event. If the server is running, the validation should
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001968 // succeed; otherwise, the validation should fail.
Mike Yu724f77d2019-08-16 11:14:50 +08001969 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), config.withWorkingTLS));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001970 if (config.withWorkingTLS) {
1971 EXPECT_TRUE(tls.waitForQueries(1));
1972 tls.clearQueries();
1973 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001974 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001975
1976 const hostent* h_result = nullptr;
1977 ScopedAddrinfo ai_result;
1978
1979 if (config.method == GETHOSTBYNAME) {
1980 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
1981 h_result = gethostbyname(host_name);
1982
1983 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
1984 ASSERT_FALSE(h_result == nullptr);
1985 ASSERT_EQ(4, h_result->h_length);
1986 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
1987 EXPECT_EQ(ADDR4, ToString(h_result));
1988 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
1989 } else if (config.method == GETADDRINFO) {
1990 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
1991 ai_result = safe_getaddrinfo(host_name, nullptr, nullptr);
1992 EXPECT_TRUE(ai_result != nullptr);
1993
1994 EXPECT_LE(1U, GetNumQueries(dns, host_name));
1995 // Could be A or AAAA
1996 const std::string result_str = ToString(ai_result);
1997 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
Luke Huangf8215372019-11-22 11:53:41 +08001998 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08001999 } else if (config.method == GETADDRINFOFORNET) {
2000 addrinfo* raw_ai_result = nullptr;
2001 EXPECT_EQ(0, android_getaddrinfofornet(host_name, /*servname=*/nullptr,
2002 /*hints=*/nullptr, BYPASS_NETID, MARK_UNSET,
2003 &raw_ai_result));
2004 ai_result.reset(raw_ai_result);
2005
2006 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2007 // Could be A or AAAA
2008 const std::string result_str = ToString(ai_result);
2009 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
Luke Huangf8215372019-11-22 11:53:41 +08002010 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08002011 }
2012
Mike Yudd4ac2d2019-05-31 16:52:11 +08002013 EXPECT_EQ(0, tls.queries());
Ken Chenb9fa2062018-11-13 21:51:13 +08002014
2015 // Clear per-process resolv netid.
2016 ASSERT_EQ(0, setNetworkForResolv(NETID_UNSET));
Ken Chenb9fa2062018-11-13 21:51:13 +08002017 dns.clearQueries();
2018 }
Ken Chenb9fa2062018-11-13 21:51:13 +08002019}
2020
2021TEST_F(ResolverTest, StrictMode_NoTlsServers) {
Xiao Ma09b71022018-12-11 17:56:32 +09002022 constexpr char cleartext_addr[] = "127.0.0.53";
Luke Huangf8215372019-11-22 11:53:41 +08002023 const std::vector<std::string> servers = {cleartext_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002024 constexpr char host_name[] = "strictmode.notlsips.example.com.";
2025 const std::vector<DnsRecord> records = {
2026 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2027 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2028 };
Ken Chenb9fa2062018-11-13 21:51:13 +08002029
Xiao Ma09b71022018-12-11 17:56:32 +09002030 test::DNSResponder dns(cleartext_addr);
2031 StartDns(dns, records);
Ken Chenb9fa2062018-11-13 21:51:13 +08002032
waynema0e73c2e2019-07-31 15:04:08 +08002033 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
2034 kDefaultIncorrectPrivateDnsHostName));
Ken Chenb9fa2062018-11-13 21:51:13 +08002035
2036 addrinfo* ai_result = nullptr;
2037 EXPECT_NE(0, getaddrinfo(host_name, nullptr, nullptr, &ai_result));
2038 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
2039}
Luke Huang94b10b92018-11-21 20:13:38 +08002040
2041namespace {
2042
Luke Huang70931aa2019-01-31 11:57:41 +08002043int getAsyncResponse(int fd, int* rcode, uint8_t* buf, int bufLen) {
Luke Huang94b10b92018-11-21 20:13:38 +08002044 struct pollfd wait_fd[1];
2045 wait_fd[0].fd = fd;
2046 wait_fd[0].events = POLLIN;
2047 short revents;
2048 int ret;
2049
2050 ret = poll(wait_fd, 1, -1);
2051 revents = wait_fd[0].revents;
2052 if (revents & POLLIN) {
2053 int n = resNetworkResult(fd, rcode, buf, bufLen);
Luke Huangba7bef92018-12-26 16:53:03 +08002054 // Verify that resNetworkResult() closed the fd
markchien96b09e22020-07-29 14:24:34 +08002055 char unused;
2056 EXPECT_EQ(-1, read(fd, &unused, sizeof unused));
Luke Huangba7bef92018-12-26 16:53:03 +08002057 EXPECT_EQ(EBADF, errno);
Luke Huang94b10b92018-11-21 20:13:38 +08002058 return n;
2059 }
2060 return -1;
2061}
2062
Luke Huang70931aa2019-01-31 11:57:41 +08002063std::string toString(uint8_t* buf, int bufLen, int ipType) {
Luke Huang94b10b92018-11-21 20:13:38 +08002064 ns_msg handle;
2065 int ancount, n = 0;
2066 ns_rr rr;
2067
Luke Huangf8215372019-11-22 11:53:41 +08002068 if (ns_initparse((const uint8_t*)buf, bufLen, &handle) >= 0) {
Luke Huang94b10b92018-11-21 20:13:38 +08002069 ancount = ns_msg_count(handle, ns_s_an);
2070 if (ns_parserr(&handle, ns_s_an, n, &rr) == 0) {
Luke Huang70931aa2019-01-31 11:57:41 +08002071 const uint8_t* rdata = ns_rr_rdata(rr);
Luke Huang94b10b92018-11-21 20:13:38 +08002072 char buffer[INET6_ADDRSTRLEN];
Luke Huangf8215372019-11-22 11:53:41 +08002073 if (inet_ntop(ipType, (const char*)rdata, buffer, sizeof(buffer))) {
Luke Huang94b10b92018-11-21 20:13:38 +08002074 return buffer;
2075 }
2076 }
2077 }
2078 return "";
2079}
2080
2081int dns_open_proxy() {
2082 int s = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
2083 if (s == -1) {
2084 return -1;
2085 }
2086 const int one = 1;
2087 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
2088
2089 static const struct sockaddr_un proxy_addr = {
2090 .sun_family = AF_UNIX,
2091 .sun_path = "/dev/socket/dnsproxyd",
2092 };
2093
Luke Huangf8215372019-11-22 11:53:41 +08002094 if (TEMP_FAILURE_RETRY(connect(s, (const struct sockaddr*)&proxy_addr, sizeof(proxy_addr))) !=
Luke Huang94b10b92018-11-21 20:13:38 +08002095 0) {
2096 close(s);
2097 return -1;
2098 }
2099
2100 return s;
2101}
2102
Luke Huangba7bef92018-12-26 16:53:03 +08002103void expectAnswersValid(int fd, int ipType, const std::string& expectedAnswer) {
2104 int rcode = -1;
2105 uint8_t buf[MAXPACKET] = {};
2106
2107 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2108 EXPECT_GT(res, 0);
2109 EXPECT_EQ(expectedAnswer, toString(buf, res, ipType));
2110}
2111
2112void expectAnswersNotValid(int fd, int expectedErrno) {
2113 int rcode = -1;
2114 uint8_t buf[MAXPACKET] = {};
2115
2116 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2117 EXPECT_EQ(expectedErrno, res);
2118}
2119
Luke Huang94b10b92018-11-21 20:13:38 +08002120} // namespace
2121
2122TEST_F(ResolverTest, Async_NormalQueryV4V6) {
Xiao Ma09b71022018-12-11 17:56:32 +09002123 constexpr char listen_addr[] = "127.0.0.4";
2124 constexpr char host_name[] = "howdy.example.com.";
2125 const std::vector<DnsRecord> records = {
2126 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2127 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2128 };
2129
2130 test::DNSResponder dns(listen_addr);
2131 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002132 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002133 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002134
Luke Huangba7bef92018-12-26 16:53:03 +08002135 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2136 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002137 EXPECT_TRUE(fd1 != -1);
2138 EXPECT_TRUE(fd2 != -1);
2139
Luke Huang70931aa2019-01-31 11:57:41 +08002140 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002141 int rcode;
2142 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2143 EXPECT_GT(res, 0);
2144 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
2145
2146 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2147 EXPECT_GT(res, 0);
2148 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2149
2150 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
2151
2152 // Re-query verify cache works
Luke Huangba7bef92018-12-26 16:53:03 +08002153 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2154 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002155
2156 EXPECT_TRUE(fd1 != -1);
2157 EXPECT_TRUE(fd2 != -1);
2158
2159 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2160 EXPECT_GT(res, 0);
2161 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
2162
2163 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2164 EXPECT_GT(res, 0);
2165 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2166
2167 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
2168}
2169
2170TEST_F(ResolverTest, Async_BadQuery) {
Xiao Ma09b71022018-12-11 17:56:32 +09002171 constexpr char listen_addr[] = "127.0.0.4";
2172 constexpr char host_name[] = "howdy.example.com.";
2173 const std::vector<DnsRecord> records = {
2174 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2175 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2176 };
2177
2178 test::DNSResponder dns(listen_addr);
2179 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002180 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002181 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002182
2183 static struct {
2184 int fd;
2185 const char* dname;
2186 const int queryType;
2187 const int expectRcode;
2188 } kTestData[] = {
Luke Huangba7bef92018-12-26 16:53:03 +08002189 {-1, "", ns_t_aaaa, 0},
2190 {-1, "as65ass46", ns_t_aaaa, 0},
2191 {-1, "454564564564", ns_t_aaaa, 0},
2192 {-1, "h645235", ns_t_a, 0},
2193 {-1, "www.google.com", ns_t_a, 0},
Luke Huang94b10b92018-11-21 20:13:38 +08002194 };
2195
2196 for (auto& td : kTestData) {
2197 SCOPED_TRACE(td.dname);
Luke Huangba7bef92018-12-26 16:53:03 +08002198 td.fd = resNetworkQuery(TEST_NETID, td.dname, ns_c_in, td.queryType, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002199 EXPECT_TRUE(td.fd != -1);
2200 }
2201
2202 // dns_responder return empty resp(packet only contains query part) with no error currently
2203 for (const auto& td : kTestData) {
Luke Huang70931aa2019-01-31 11:57:41 +08002204 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002205 int rcode;
2206 SCOPED_TRACE(td.dname);
2207 int res = getAsyncResponse(td.fd, &rcode, buf, MAXPACKET);
2208 EXPECT_GT(res, 0);
2209 EXPECT_EQ(rcode, td.expectRcode);
2210 }
2211}
2212
2213TEST_F(ResolverTest, Async_EmptyAnswer) {
Xiao Ma09b71022018-12-11 17:56:32 +09002214 constexpr char listen_addr[] = "127.0.0.4";
2215 constexpr char host_name[] = "howdy.example.com.";
2216 const std::vector<DnsRecord> records = {
2217 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2218 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2219 };
2220
2221 test::DNSResponder dns(listen_addr);
2222 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002223 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002224 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002225
Luke Huang9c264bb2018-12-18 16:44:41 +08002226 // TODO: Disable retry to make this test explicit.
2227 auto& cv = dns.getCv();
2228 auto& cvMutex = dns.getCvMutex();
2229 int fd1;
2230 // Wait on the condition variable to ensure that the DNS server has handled our first query.
2231 {
2232 std::unique_lock lk(cvMutex);
Luke Huangba7bef92018-12-26 16:53:03 +08002233 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang9c264bb2018-12-18 16:44:41 +08002234 EXPECT_TRUE(fd1 != -1);
2235 EXPECT_EQ(std::cv_status::no_timeout, cv.wait_for(lk, std::chrono::seconds(1)));
2236 }
Luke Huang94b10b92018-11-21 20:13:38 +08002237
Luke Huang94b10b92018-11-21 20:13:38 +08002238 dns.setResponseProbability(0.0);
Luke Huang94b10b92018-11-21 20:13:38 +08002239
Luke Huangba7bef92018-12-26 16:53:03 +08002240 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002241 EXPECT_TRUE(fd2 != -1);
2242
Luke Huangba7bef92018-12-26 16:53:03 +08002243 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002244 EXPECT_TRUE(fd3 != -1);
2245
Luke Huang9c264bb2018-12-18 16:44:41 +08002246 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002247 int rcode;
2248
Luke Huang9c264bb2018-12-18 16:44:41 +08002249 // expect no response
2250 int res = getAsyncResponse(fd3, &rcode, buf, MAXPACKET);
2251 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huang94b10b92018-11-21 20:13:38 +08002252
Luke Huang9c264bb2018-12-18 16:44:41 +08002253 // expect no response
Luke Huang94b10b92018-11-21 20:13:38 +08002254 memset(buf, 0, MAXPACKET);
Luke Huang9c264bb2018-12-18 16:44:41 +08002255 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2256 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huang94b10b92018-11-21 20:13:38 +08002257
Luke Huang94b10b92018-11-21 20:13:38 +08002258 dns.setResponseProbability(1.0);
Luke Huang94b10b92018-11-21 20:13:38 +08002259
Luke Huangba7bef92018-12-26 16:53:03 +08002260 int fd4 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002261 EXPECT_TRUE(fd4 != -1);
2262
2263 memset(buf, 0, MAXPACKET);
2264 res = getAsyncResponse(fd4, &rcode, buf, MAXPACKET);
2265 EXPECT_GT(res, 0);
2266 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2267
2268 memset(buf, 0, MAXPACKET);
2269 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2270 EXPECT_GT(res, 0);
2271 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
Mike Yu532405f2020-06-17 17:46:44 +08002272
2273 // Trailing dot is removed. Is it intended?
2274 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, 0, "howdy.example.com", {"::1.2.3.4"});
2275 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2276 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2277 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, 0, "howdy.example.com", {"1.2.3.4"});
Luke Huang94b10b92018-11-21 20:13:38 +08002278}
2279
2280TEST_F(ResolverTest, Async_MalformedQuery) {
Xiao Ma09b71022018-12-11 17:56:32 +09002281 constexpr char listen_addr[] = "127.0.0.4";
2282 constexpr char host_name[] = "howdy.example.com.";
2283 const std::vector<DnsRecord> records = {
2284 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2285 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2286 };
2287
2288 test::DNSResponder dns(listen_addr);
2289 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002290 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002291 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002292
2293 int fd = dns_open_proxy();
2294 EXPECT_TRUE(fd > 0);
2295
2296 const std::string badMsg = "16-52512#";
Xiao Ma09b71022018-12-11 17:56:32 +09002297 static const struct {
Luke Huang94b10b92018-11-21 20:13:38 +08002298 const std::string cmd;
2299 const int expectErr;
2300 } kTestData[] = {
Luke Huangba7bef92018-12-26 16:53:03 +08002301 // Too few arguments
Luke Huang94b10b92018-11-21 20:13:38 +08002302 {"resnsend " + badMsg + '\0', -EINVAL},
2303 // Bad netId
Luke Huangba7bef92018-12-26 16:53:03 +08002304 {"resnsend badnetId 0 " + badMsg + '\0', -EINVAL},
Luke Huang94b10b92018-11-21 20:13:38 +08002305 // Bad raw data
Luke Huangba7bef92018-12-26 16:53:03 +08002306 {"resnsend " + std::to_string(TEST_NETID) + " 0 " + badMsg + '\0', -EILSEQ},
Luke Huang94b10b92018-11-21 20:13:38 +08002307 };
2308
2309 for (unsigned int i = 0; i < std::size(kTestData); i++) {
2310 auto& td = kTestData[i];
2311 SCOPED_TRACE(td.cmd);
2312 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, td.cmd.c_str(), td.cmd.size()));
2313 EXPECT_EQ(rc, static_cast<ssize_t>(td.cmd.size()));
2314
2315 int32_t tmp;
2316 rc = TEMP_FAILURE_RETRY(read(fd, &tmp, sizeof(tmp)));
2317 EXPECT_TRUE(rc > 0);
2318 EXPECT_EQ(static_cast<int>(ntohl(tmp)), td.expectErr);
2319 }
2320 // Normal query with answer buffer
2321 // This is raw data of query "howdy.example.com" type 1 class 1
2322 std::string query = "81sBAAABAAAAAAAABWhvd2R5B2V4YW1wbGUDY29tAAABAAE=";
Luke Huangba7bef92018-12-26 16:53:03 +08002323 std::string cmd = "resnsend " + std::to_string(TEST_NETID) + " 0 " + query + '\0';
Luke Huang94b10b92018-11-21 20:13:38 +08002324 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
2325 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
2326
Luke Huang70931aa2019-01-31 11:57:41 +08002327 uint8_t smallBuf[1] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002328 int rcode;
2329 rc = getAsyncResponse(fd, &rcode, smallBuf, 1);
Luke Huangba7bef92018-12-26 16:53:03 +08002330 EXPECT_EQ(-EMSGSIZE, rc);
Luke Huang94b10b92018-11-21 20:13:38 +08002331
2332 // Do the normal test with large buffer again
2333 fd = dns_open_proxy();
2334 EXPECT_TRUE(fd > 0);
2335 rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
2336 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
Luke Huang70931aa2019-01-31 11:57:41 +08002337 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002338 rc = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2339 EXPECT_EQ("1.2.3.4", toString(buf, rc, AF_INET));
Mike Yu4f3747b2018-12-02 17:54:29 +09002340}
2341
Luke Huangba7bef92018-12-26 16:53:03 +08002342TEST_F(ResolverTest, Async_CacheFlags) {
Xiao Ma09b71022018-12-11 17:56:32 +09002343 constexpr char listen_addr[] = "127.0.0.4";
Luke Huang4eabbe32020-05-28 03:17:32 +08002344 constexpr char host_name1[] = "howdy.example.com.";
2345 constexpr char host_name2[] = "howdy.example2.com.";
2346 constexpr char host_name3[] = "howdy.example3.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002347 const std::vector<DnsRecord> records = {
Luke Huang4eabbe32020-05-28 03:17:32 +08002348 {host_name1, ns_type::ns_t_a, "1.2.3.4"}, {host_name1, ns_type::ns_t_aaaa, "::1.2.3.4"},
2349 {host_name2, ns_type::ns_t_a, "1.2.3.5"}, {host_name2, ns_type::ns_t_aaaa, "::1.2.3.5"},
2350 {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 +09002351 };
2352
2353 test::DNSResponder dns(listen_addr);
2354 StartDns(dns, records);
Luke Huangba7bef92018-12-26 16:53:03 +08002355 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002356 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huangba7bef92018-12-26 16:53:03 +08002357
2358 // ANDROID_RESOLV_NO_CACHE_STORE
2359 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2360 ANDROID_RESOLV_NO_CACHE_STORE);
2361 EXPECT_TRUE(fd1 != -1);
2362 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2363 ANDROID_RESOLV_NO_CACHE_STORE);
2364 EXPECT_TRUE(fd2 != -1);
2365 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2366 ANDROID_RESOLV_NO_CACHE_STORE);
2367 EXPECT_TRUE(fd3 != -1);
2368
2369 expectAnswersValid(fd3, AF_INET, "1.2.3.4");
2370 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
2371 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2372
2373 // No cache exists, expect 3 queries
Luke Huang4eabbe32020-05-28 03:17:32 +08002374 EXPECT_EQ(3U, GetNumQueries(dns, host_name1));
Luke Huangba7bef92018-12-26 16:53:03 +08002375
Luke Huang4eabbe32020-05-28 03:17:32 +08002376 // Raise a query with no flags to ensure no cache exists. Also make an cache entry for the
2377 // query.
Luke Huangba7bef92018-12-26 16:53:03 +08002378 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2379
2380 EXPECT_TRUE(fd1 != -1);
2381
2382 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2383
Luke Huang4eabbe32020-05-28 03:17:32 +08002384 // Expect 4 queries because there should be no cache before this query.
2385 EXPECT_EQ(4U, GetNumQueries(dns, host_name1));
2386
2387 // Now we have the cache entry, re-query with ANDROID_RESOLV_NO_CACHE_STORE to ensure
2388 // that ANDROID_RESOLV_NO_CACHE_STORE implied ANDROID_RESOLV_NO_CACHE_LOOKUP.
2389 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2390 ANDROID_RESOLV_NO_CACHE_STORE);
2391 EXPECT_TRUE(fd1 != -1);
2392 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2393 // Expect 5 queries because we shouldn't do cache lookup for the query which has
2394 // ANDROID_RESOLV_NO_CACHE_STORE.
2395 EXPECT_EQ(5U, GetNumQueries(dns, host_name1));
Luke Huangba7bef92018-12-26 16:53:03 +08002396
2397 // ANDROID_RESOLV_NO_CACHE_LOOKUP
2398 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2399 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2400 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2401 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2402
2403 EXPECT_TRUE(fd1 != -1);
2404 EXPECT_TRUE(fd2 != -1);
2405
2406 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
2407 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2408
Luke Huang4eabbe32020-05-28 03:17:32 +08002409 // Cache was skipped, expect 2 more queries.
2410 EXPECT_EQ(7U, GetNumQueries(dns, host_name1));
Luke Huangba7bef92018-12-26 16:53:03 +08002411
2412 // Re-query verify cache works
Luke Huang4eabbe32020-05-28 03:17:32 +08002413 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huangba7bef92018-12-26 16:53:03 +08002414 EXPECT_TRUE(fd1 != -1);
2415 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2416
Luke Huang4eabbe32020-05-28 03:17:32 +08002417 // Cache hits, expect still 7 queries
2418 EXPECT_EQ(7U, GetNumQueries(dns, host_name1));
Luke Huanga1d74182019-03-19 17:30:36 +08002419
2420 // Start to verify if ANDROID_RESOLV_NO_CACHE_LOOKUP does write response into cache
2421 dns.clearQueries();
2422
Luke Huang4eabbe32020-05-28 03:17:32 +08002423 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa,
Luke Huanga1d74182019-03-19 17:30:36 +08002424 ANDROID_RESOLV_NO_CACHE_LOOKUP);
Luke Huang4eabbe32020-05-28 03:17:32 +08002425 fd2 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa,
Luke Huanga1d74182019-03-19 17:30:36 +08002426 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2427
2428 EXPECT_TRUE(fd1 != -1);
2429 EXPECT_TRUE(fd2 != -1);
2430
Luke Huang4eabbe32020-05-28 03:17:32 +08002431 expectAnswersValid(fd2, AF_INET6, "::1.2.3.5");
2432 expectAnswersValid(fd1, AF_INET6, "::1.2.3.5");
Luke Huanga1d74182019-03-19 17:30:36 +08002433
2434 // Skip cache, expect 2 queries
Luke Huang4eabbe32020-05-28 03:17:32 +08002435 EXPECT_EQ(2U, GetNumQueries(dns, host_name2));
Luke Huanga1d74182019-03-19 17:30:36 +08002436
2437 // Re-query without flags
Luke Huang4eabbe32020-05-28 03:17:32 +08002438 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa, 0);
2439 fd2 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa, 0);
Luke Huanga1d74182019-03-19 17:30:36 +08002440
2441 EXPECT_TRUE(fd1 != -1);
2442 EXPECT_TRUE(fd2 != -1);
2443
Luke Huang4eabbe32020-05-28 03:17:32 +08002444 expectAnswersValid(fd2, AF_INET6, "::1.2.3.5");
2445 expectAnswersValid(fd1, AF_INET6, "::1.2.3.5");
Luke Huanga1d74182019-03-19 17:30:36 +08002446
2447 // Cache hits, expect still 2 queries
Luke Huang4eabbe32020-05-28 03:17:32 +08002448 EXPECT_EQ(2U, GetNumQueries(dns, host_name2));
Luke Huang40f5f492019-05-09 19:37:35 +08002449
2450 // Test both ANDROID_RESOLV_NO_CACHE_STORE and ANDROID_RESOLV_NO_CACHE_LOOKUP are set
2451 dns.clearQueries();
2452
Luke Huang4eabbe32020-05-28 03:17:32 +08002453 // Make sure that the cache of "howdy.example3.com" exists.
2454 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang40f5f492019-05-09 19:37:35 +08002455 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002456 expectAnswersValid(fd1, AF_INET6, "::1.2.3.6");
2457 EXPECT_EQ(1U, GetNumQueries(dns, host_name3));
Luke Huang40f5f492019-05-09 19:37:35 +08002458
2459 // Re-query with testFlags
2460 const int testFlag = ANDROID_RESOLV_NO_CACHE_STORE | ANDROID_RESOLV_NO_CACHE_LOOKUP;
Luke Huang4eabbe32020-05-28 03:17:32 +08002461 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_aaaa, testFlag);
Luke Huang40f5f492019-05-09 19:37:35 +08002462 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002463 expectAnswersValid(fd1, AF_INET6, "::1.2.3.6");
Luke Huang40f5f492019-05-09 19:37:35 +08002464 // Expect cache lookup is skipped.
Luke Huang4eabbe32020-05-28 03:17:32 +08002465 EXPECT_EQ(2U, GetNumQueries(dns, host_name3));
Luke Huang40f5f492019-05-09 19:37:35 +08002466
2467 // Do another query with testFlags
Luke Huang4eabbe32020-05-28 03:17:32 +08002468 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_a, testFlag);
Luke Huang40f5f492019-05-09 19:37:35 +08002469 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002470 expectAnswersValid(fd1, AF_INET, "1.2.3.6");
Luke Huang40f5f492019-05-09 19:37:35 +08002471 // Expect cache lookup is skipped.
Luke Huang4eabbe32020-05-28 03:17:32 +08002472 EXPECT_EQ(3U, GetNumQueries(dns, host_name3));
Luke Huang40f5f492019-05-09 19:37:35 +08002473
2474 // Re-query with no flags
Luke Huang4eabbe32020-05-28 03:17:32 +08002475 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_a, 0);
Luke Huang40f5f492019-05-09 19:37:35 +08002476 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002477 expectAnswersValid(fd1, AF_INET, "1.2.3.6");
Luke Huang40f5f492019-05-09 19:37:35 +08002478 // Expect no cache hit because cache storing is also skipped in previous query.
Luke Huang4eabbe32020-05-28 03:17:32 +08002479 EXPECT_EQ(4U, GetNumQueries(dns, host_name3));
Luke Huangba7bef92018-12-26 16:53:03 +08002480}
2481
Luke Huang08b13d22020-02-05 14:46:21 +08002482TEST_F(ResolverTest, Async_NoCacheStoreFlagDoesNotRefreshStaleCacheEntry) {
2483 constexpr char listen_addr[] = "127.0.0.4";
2484 constexpr char host_name[] = "howdy.example.com.";
2485 const std::vector<DnsRecord> records = {
2486 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2487 };
2488
2489 test::DNSResponder dns(listen_addr);
2490 StartDns(dns, records);
2491 std::vector<std::string> servers = {listen_addr};
2492 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
2493
2494 const unsigned SHORT_TTL_SEC = 1;
2495 dns.setTtl(SHORT_TTL_SEC);
2496
2497 // Refer to b/148842821 for the purpose of below test steps.
2498 // Basically, this test is used to ensure stale cache case is handled
2499 // correctly with ANDROID_RESOLV_NO_CACHE_STORE.
2500 int fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2501 EXPECT_TRUE(fd != -1);
2502 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2503
2504 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2505 dns.clearQueries();
2506
2507 // Wait until cache expired
2508 sleep(SHORT_TTL_SEC + 0.5);
2509
2510 // Now request the same hostname again.
2511 // We should see a new DNS query because the entry in cache has become stale.
2512 // Due to ANDROID_RESOLV_NO_CACHE_STORE, this query must *not* refresh that stale entry.
2513 fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2514 ANDROID_RESOLV_NO_CACHE_STORE);
2515 EXPECT_TRUE(fd != -1);
2516 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2517 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2518 dns.clearQueries();
2519
2520 // If the cache is still stale, we expect to see one more DNS query
2521 // (this time the cache will be refreshed, but we're not checking for it).
2522 fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2523 EXPECT_TRUE(fd != -1);
2524 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2525 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2526}
2527
Luke Huangba7bef92018-12-26 16:53:03 +08002528TEST_F(ResolverTest, Async_NoRetryFlag) {
Luke Huang70931aa2019-01-31 11:57:41 +08002529 constexpr char listen_addr0[] = "127.0.0.4";
2530 constexpr char listen_addr1[] = "127.0.0.6";
Xiao Ma09b71022018-12-11 17:56:32 +09002531 constexpr char host_name[] = "howdy.example.com.";
2532 const std::vector<DnsRecord> records = {
2533 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2534 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2535 };
2536
Luke Huang70931aa2019-01-31 11:57:41 +08002537 test::DNSResponder dns0(listen_addr0);
2538 test::DNSResponder dns1(listen_addr1);
2539 StartDns(dns0, records);
2540 StartDns(dns1, records);
2541 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr0, listen_addr1}));
Luke Huangba7bef92018-12-26 16:53:03 +08002542
Luke Huang70931aa2019-01-31 11:57:41 +08002543 dns0.clearQueries();
2544 dns1.clearQueries();
2545
2546 dns0.setResponseProbability(0.0);
2547 dns1.setResponseProbability(0.0);
Luke Huangba7bef92018-12-26 16:53:03 +08002548
2549 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2550 ANDROID_RESOLV_NO_RETRY);
2551 EXPECT_TRUE(fd1 != -1);
2552
2553 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa,
2554 ANDROID_RESOLV_NO_RETRY);
2555 EXPECT_TRUE(fd2 != -1);
2556
2557 // expect no response
2558 expectAnswersNotValid(fd1, -ETIMEDOUT);
2559 expectAnswersNotValid(fd2, -ETIMEDOUT);
Mike Yu532405f2020-06-17 17:46:44 +08002560 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2561 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
Luke Huangba7bef92018-12-26 16:53:03 +08002562
Luke Huang70931aa2019-01-31 11:57:41 +08002563 // No retry case, expect total 2 queries. The server is selected randomly.
2564 EXPECT_EQ(2U, GetNumQueries(dns0, host_name) + GetNumQueries(dns1, host_name));
Luke Huangba7bef92018-12-26 16:53:03 +08002565
Luke Huang70931aa2019-01-31 11:57:41 +08002566 dns0.clearQueries();
2567 dns1.clearQueries();
Luke Huangba7bef92018-12-26 16:53:03 +08002568
2569 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2570 EXPECT_TRUE(fd1 != -1);
2571
2572 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
2573 EXPECT_TRUE(fd2 != -1);
2574
2575 // expect no response
2576 expectAnswersNotValid(fd1, -ETIMEDOUT);
2577 expectAnswersNotValid(fd2, -ETIMEDOUT);
Mike Yu532405f2020-06-17 17:46:44 +08002578 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2579 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
Luke Huangba7bef92018-12-26 16:53:03 +08002580
2581 // Retry case, expect 4 queries
Luke Huang70931aa2019-01-31 11:57:41 +08002582 EXPECT_EQ(4U, GetNumQueries(dns0, host_name));
2583 EXPECT_EQ(4U, GetNumQueries(dns1, host_name));
2584}
2585
2586TEST_F(ResolverTest, Async_VerifyQueryID) {
2587 constexpr char listen_addr[] = "127.0.0.4";
2588 constexpr char host_name[] = "howdy.example.com.";
2589 const std::vector<DnsRecord> records = {
2590 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2591 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2592 };
2593
2594 test::DNSResponder dns(listen_addr);
2595 StartDns(dns, records);
2596 std::vector<std::string> servers = {listen_addr};
2597 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
2598
2599 const uint8_t queryBuf1[] = {
2600 /* Header */
2601 0x55, 0x66, /* Transaction ID */
2602 0x01, 0x00, /* Flags */
2603 0x00, 0x01, /* Questions */
2604 0x00, 0x00, /* Answer RRs */
2605 0x00, 0x00, /* Authority RRs */
2606 0x00, 0x00, /* Additional RRs */
2607 /* Queries */
2608 0x05, 0x68, 0x6f, 0x77, 0x64, 0x79, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
2609 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name */
2610 0x00, 0x01, /* Type */
2611 0x00, 0x01 /* Class */
2612 };
2613
2614 int fd = resNetworkSend(TEST_NETID, queryBuf1, sizeof(queryBuf1), 0);
2615 EXPECT_TRUE(fd != -1);
2616
2617 uint8_t buf[MAXPACKET] = {};
2618 int rcode;
2619
2620 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2621 EXPECT_GT(res, 0);
2622 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2623
2624 auto hp = reinterpret_cast<HEADER*>(buf);
2625 EXPECT_EQ(21862U, htons(hp->id));
2626
2627 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2628
2629 const uint8_t queryBuf2[] = {
2630 /* Header */
2631 0x00, 0x53, /* Transaction ID */
2632 0x01, 0x00, /* Flags */
2633 0x00, 0x01, /* Questions */
2634 0x00, 0x00, /* Answer RRs */
2635 0x00, 0x00, /* Authority RRs */
2636 0x00, 0x00, /* Additional RRs */
2637 /* Queries */
2638 0x05, 0x68, 0x6f, 0x77, 0x64, 0x79, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
2639 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name */
2640 0x00, 0x01, /* Type */
2641 0x00, 0x01 /* Class */
2642 };
2643
2644 // Re-query verify cache works and query id is correct
2645 fd = resNetworkSend(TEST_NETID, queryBuf2, sizeof(queryBuf2), 0);
2646
2647 EXPECT_TRUE(fd != -1);
2648
2649 res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2650 EXPECT_GT(res, 0);
2651 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2652
2653 EXPECT_EQ(0x0053U, htons(hp->id));
2654
2655 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
Luke Huangba7bef92018-12-26 16:53:03 +08002656}
2657
Mike Yu4f3747b2018-12-02 17:54:29 +09002658// This test checks that the resolver should not generate the request containing OPT RR when using
Ken Chen0a015532019-01-02 14:59:38 +08002659// cleartext DNS. If we query the DNS server not supporting EDNS0 and it reponds with
2660// FORMERR_ON_EDNS, we will fallback to no EDNS0 and try again. If the server does no response, we
2661// won't retry so that we get no answer.
Mike Yu4f3747b2018-12-02 17:54:29 +09002662TEST_F(ResolverTest, BrokenEdns) {
2663 typedef test::DNSResponder::Edns Edns;
2664 enum ExpectResult { EXPECT_FAILURE, EXPECT_SUCCESS };
2665
Mike Yu3977d482020-02-26 17:18:57 +08002666 // Perform cleartext query in off mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002667 const char OFF[] = "off";
Mike Yu3977d482020-02-26 17:18:57 +08002668
2669 // Perform cleartext query when there's no private DNS server validated in opportunistic mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002670 const char OPPORTUNISTIC_UDP[] = "opportunistic_udp";
Mike Yu3977d482020-02-26 17:18:57 +08002671
2672 // Perform cleartext query when there is a private DNS server validated in opportunistic mode.
2673 const char OPPORTUNISTIC_FALLBACK_UDP[] = "opportunistic_fallback_udp";
2674
2675 // Perform cyphertext query in opportunistic mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002676 const char OPPORTUNISTIC_TLS[] = "opportunistic_tls";
Mike Yu3977d482020-02-26 17:18:57 +08002677
2678 // Perform cyphertext query in strict mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002679 const char STRICT[] = "strict";
Mike Yu3977d482020-02-26 17:18:57 +08002680
Mike Yu4f3747b2018-12-02 17:54:29 +09002681 const char GETHOSTBYNAME[] = "gethostbyname";
2682 const char GETADDRINFO[] = "getaddrinfo";
Mike Yu4f3747b2018-12-02 17:54:29 +09002683 const char ADDR4[] = "192.0.2.1";
2684 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2685 const char CLEARTEXT_PORT[] = "53";
2686 const char TLS_PORT[] = "853";
Luke Huangf8215372019-11-22 11:53:41 +08002687 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
Mike Yu3977d482020-02-26 17:18:57 +08002688 ResolverParamsParcel paramsForCleanup = DnsResponderClient::GetDefaultResolverParamsParcel();
2689 paramsForCleanup.servers.clear();
2690 paramsForCleanup.tlsServers.clear();
Mike Yu4f3747b2018-12-02 17:54:29 +09002691
Mike Yufc125e42019-05-15 20:41:28 +08002692 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Mike Yu4f3747b2018-12-02 17:54:29 +09002693 ASSERT_TRUE(dns.startServer());
2694
2695 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2696
Luke Huangf8215372019-11-22 11:53:41 +08002697 // clang-format off
Mike Yu4f3747b2018-12-02 17:54:29 +09002698 static const struct TestConfig {
2699 std::string mode;
2700 std::string method;
2701 Edns edns;
2702 ExpectResult expectResult;
2703
2704 std::string asHostName() const {
2705 const char* ednsString;
2706 switch (edns) {
2707 case Edns::ON:
2708 ednsString = "ednsOn";
2709 break;
Ken Chen0a015532019-01-02 14:59:38 +08002710 case Edns::FORMERR_ON_EDNS:
Mike Yu4f3747b2018-12-02 17:54:29 +09002711 ednsString = "ednsFormerr";
2712 break;
2713 case Edns::DROP:
2714 ednsString = "ednsDrop";
2715 break;
2716 default:
2717 ednsString = "";
2718 break;
2719 }
2720 return StringPrintf("%s.%s.%s.", mode.c_str(), method.c_str(), ednsString);
2721 }
2722 } testConfigs[] = {
Mike Yu3977d482020-02-26 17:18:57 +08002723 // In OPPORTUNISTIC_TLS, if the DNS server doesn't support EDNS0 but TLS, the lookup
2724 // fails. Could such server exist? if so, we might need to fix it to fallback to
2725 // cleartext query. If the server still make no response for the queries with EDNS0, we
2726 // might also need to fix it to retry without EDNS0.
Mike Yu4f3747b2018-12-02 17:54:29 +09002727 // Another thing is that {OPPORTUNISTIC_TLS, Edns::DROP} and {STRICT, Edns::DROP} are
2728 // commented out since TLS timeout is not configurable.
2729 // TODO: Uncomment them after TLS timeout is configurable.
Mike Yu3977d482020-02-26 17:18:57 +08002730 {OFF, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2731 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2732 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2733 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2734 {STRICT, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2735 {OFF, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2736 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2737 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2738 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2739 {STRICT, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2740 {OFF, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2741 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2742
2743 // The failure is due to no retry on timeout. Maybe fix it?
2744 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2745
2746 //{OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2747 //{STRICT, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2748 {OFF, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2749 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2750 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2751 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2752 {STRICT, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2753 {OFF, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2754 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2755 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2756 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2757 {STRICT, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2758 {OFF, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2759 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2760
2761 // The failure is due to no retry on timeout. Maybe fix it?
2762 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2763
Mike Yu4f3747b2018-12-02 17:54:29 +09002764 //{OPPORTUNISTIC_TLS, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2765 //{STRICT, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2766 };
Luke Huangf8215372019-11-22 11:53:41 +08002767 // clang-format on
Mike Yu4f3747b2018-12-02 17:54:29 +09002768
2769 for (const auto& config : testConfigs) {
2770 const std::string testHostName = config.asHostName();
2771 SCOPED_TRACE(testHostName);
2772
2773 const char* host_name = testHostName.c_str();
2774 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
2775 dns.setEdns(config.edns);
2776
2777 if (config.mode == OFF) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002778 if (tls.running()) {
2779 ASSERT_TRUE(tls.stopServer());
2780 }
Xiao Ma09b71022018-12-11 17:56:32 +09002781 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Mike Yu4f3747b2018-12-02 17:54:29 +09002782 } else if (config.mode == OPPORTUNISTIC_UDP) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002783 if (tls.running()) {
2784 ASSERT_TRUE(tls.stopServer());
2785 }
Xiao Ma09b71022018-12-11 17:56:32 +09002786 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002787 kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002788 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), false));
Mike Yu3977d482020-02-26 17:18:57 +08002789 } else if (config.mode == OPPORTUNISTIC_TLS || config.mode == OPPORTUNISTIC_FALLBACK_UDP) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002790 if (!tls.running()) {
2791 ASSERT_TRUE(tls.startServer());
2792 }
Xiao Ma09b71022018-12-11 17:56:32 +09002793 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002794 kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002795 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Mike Yu3977d482020-02-26 17:18:57 +08002796
2797 if (config.mode == OPPORTUNISTIC_FALLBACK_UDP) {
2798 // Force the resolver to fallback to cleartext queries.
2799 ASSERT_TRUE(tls.stopServer());
2800 }
Mike Yu4f3747b2018-12-02 17:54:29 +09002801 } else if (config.mode == STRICT) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002802 if (!tls.running()) {
2803 ASSERT_TRUE(tls.startServer());
2804 }
Xiao Ma09b71022018-12-11 17:56:32 +09002805 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002806 kDefaultParams, kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08002807 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Mike Yu4f3747b2018-12-02 17:54:29 +09002808 }
2809
2810 if (config.method == GETHOSTBYNAME) {
2811 const hostent* h_result = gethostbyname(host_name);
2812 if (config.expectResult == EXPECT_SUCCESS) {
2813 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2814 ASSERT_TRUE(h_result != nullptr);
2815 ASSERT_EQ(4, h_result->h_length);
2816 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
2817 EXPECT_EQ(ADDR4, ToString(h_result));
2818 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
Mike Yu532405f2020-06-17 17:46:44 +08002819 ExpectDnsEvent(INetdEventListener::EVENT_GETHOSTBYNAME, 0, host_name, {ADDR4});
Mike Yu4f3747b2018-12-02 17:54:29 +09002820 } else {
2821 EXPECT_EQ(0U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
2822 ASSERT_TRUE(h_result == nullptr);
2823 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
Mike Yu532405f2020-06-17 17:46:44 +08002824 int returnCode = (config.edns == Edns::DROP) ? RCODE_TIMEOUT : EAI_FAIL;
2825 ExpectDnsEvent(INetdEventListener::EVENT_GETHOSTBYNAME, returnCode, host_name, {});
Mike Yu4f3747b2018-12-02 17:54:29 +09002826 }
2827 } else if (config.method == GETADDRINFO) {
2828 ScopedAddrinfo ai_result;
2829 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2830 ai_result = safe_getaddrinfo(host_name, nullptr, &hints);
2831 if (config.expectResult == EXPECT_SUCCESS) {
2832 EXPECT_TRUE(ai_result != nullptr);
2833 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2834 const std::string result_str = ToString(ai_result);
2835 EXPECT_EQ(ADDR4, result_str);
Mike Yu532405f2020-06-17 17:46:44 +08002836 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, 0, host_name, {ADDR4});
Mike Yu4f3747b2018-12-02 17:54:29 +09002837 } else {
2838 EXPECT_TRUE(ai_result == nullptr);
2839 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
Mike Yu532405f2020-06-17 17:46:44 +08002840 int returnCode = (config.edns == Edns::DROP) ? RCODE_TIMEOUT : EAI_FAIL;
2841 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, returnCode, host_name, {});
Mike Yu4f3747b2018-12-02 17:54:29 +09002842 }
2843 } else {
2844 FAIL() << "Unsupported query method: " << config.method;
2845 }
2846
Mike Yudd4ac2d2019-05-31 16:52:11 +08002847 tls.clearQueries();
Mike Yu4f3747b2018-12-02 17:54:29 +09002848 dns.clearQueries();
Mike Yu3977d482020-02-26 17:18:57 +08002849
2850 // Clear the setup to force the resolver to validate private DNS servers in every test.
2851 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(paramsForCleanup));
Mike Yu4f3747b2018-12-02 17:54:29 +09002852 }
Mike Yu4f3747b2018-12-02 17:54:29 +09002853}
nuccachena26cc2a2018-07-17 18:07:23 +08002854
Ken Chen0a015532019-01-02 14:59:38 +08002855// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2856// Resolver should have a reasonable number of retries instead of spinning forever. We don't have
2857// an efficient way to know if resolver is stuck in an infinite loop. However, test case will be
2858// failed due to timeout.
2859TEST_F(ResolverTest, UnstableTls) {
2860 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2861 const char CLEARTEXT_PORT[] = "53";
2862 const char TLS_PORT[] = "853";
2863 const char* host_name1 = "nonexistent1.example.com.";
2864 const char* host_name2 = "nonexistent2.example.com.";
2865 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
2866
Mike Yufc125e42019-05-15 20:41:28 +08002867 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Ken Chen0a015532019-01-02 14:59:38 +08002868 ASSERT_TRUE(dns.startServer());
2869 dns.setEdns(test::DNSResponder::Edns::FORMERR_ON_EDNS);
2870 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2871 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08002872 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002873 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
2874
Ken Chen0a015532019-01-02 14:59:38 +08002875 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
2876 tls.stopServer();
2877
2878 const hostent* h_result = gethostbyname(host_name1);
2879 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
2880 ASSERT_TRUE(h_result == nullptr);
2881 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2882
2883 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2884 ScopedAddrinfo ai_result = safe_getaddrinfo(host_name2, nullptr, &hints);
2885 EXPECT_TRUE(ai_result == nullptr);
2886 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
2887}
2888
2889// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2890// Moreover, server responds RCODE=FORMERR even on non-EDNS query.
2891TEST_F(ResolverTest, BogusDnsServer) {
2892 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2893 const char CLEARTEXT_PORT[] = "53";
2894 const char TLS_PORT[] = "853";
2895 const char* host_name1 = "nonexistent1.example.com.";
2896 const char* host_name2 = "nonexistent2.example.com.";
2897 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
2898
Mike Yufc125e42019-05-15 20:41:28 +08002899 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Ken Chen0a015532019-01-02 14:59:38 +08002900 ASSERT_TRUE(dns.startServer());
2901 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2902 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08002903 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002904 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
2905
Ken Chen0a015532019-01-02 14:59:38 +08002906 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
2907 tls.stopServer();
2908 dns.setEdns(test::DNSResponder::Edns::FORMERR_UNCOND);
2909
2910 const hostent* h_result = gethostbyname(host_name1);
2911 EXPECT_EQ(0U, GetNumQueries(dns, host_name1));
2912 ASSERT_TRUE(h_result == nullptr);
2913 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2914
2915 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2916 ScopedAddrinfo ai_result = safe_getaddrinfo(host_name2, nullptr, &hints);
2917 EXPECT_TRUE(ai_result == nullptr);
2918 EXPECT_EQ(0U, GetNumQueries(dns, host_name2));
2919}
2920
nuccachena26cc2a2018-07-17 18:07:23 +08002921TEST_F(ResolverTest, GetAddrInfo_Dns64Synthesize) {
2922 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002923 constexpr char dns64_name[] = "ipv4only.arpa.";
2924 constexpr char host_name[] = "v4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002925 const std::vector<DnsRecord> records = {
2926 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2927 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2928 };
nuccachena26cc2a2018-07-17 18:07:23 +08002929
Xiao Ma09b71022018-12-11 17:56:32 +09002930 test::DNSResponder dns(listen_addr);
Xiao Ma09b71022018-12-11 17:56:32 +09002931 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002932
2933 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002934 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002935
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002936 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002937 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002938 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002939
2940 // hints are necessary in order to let netd know which type of addresses the caller is
2941 // interested in.
Xiao Ma09b71022018-12-11 17:56:32 +09002942 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08002943 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
2944 EXPECT_TRUE(result != nullptr);
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002945 // TODO: BUG: there should only be two queries, one AAAA (which returns no records) and one A
2946 // (which returns 1.2.3.4). But there is an extra AAAA.
2947 EXPECT_EQ(3U, GetNumQueries(dns, host_name));
nuccachena26cc2a2018-07-17 18:07:23 +08002948
2949 std::string result_str = ToString(result);
2950 EXPECT_EQ(result_str, "64:ff9b::102:304");
2951
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002952 // Stopping NAT64 prefix discovery disables synthesis.
Luke Huang5bd827c2019-03-14 16:10:04 +08002953 EXPECT_TRUE(mDnsClient.resolvService()->stopPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002954 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_NOT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002955
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002956 dns.clearQueries();
nuccachena26cc2a2018-07-17 18:07:23 +08002957
2958 result = safe_getaddrinfo("v4only", nullptr, &hints);
2959 EXPECT_TRUE(result != nullptr);
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002960 // TODO: BUG: there should only be one query, an AAAA (which returns no records), because the
2961 // A is already cached. But there is an extra AAAA.
2962 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
nuccachena26cc2a2018-07-17 18:07:23 +08002963
2964 result_str = ToString(result);
2965 EXPECT_EQ(result_str, "1.2.3.4");
2966}
2967
nuccachena26cc2a2018-07-17 18:07:23 +08002968TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecified) {
2969 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002970 constexpr char dns64_name[] = "ipv4only.arpa.";
2971 constexpr char host_name[] = "v4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002972 const std::vector<DnsRecord> records = {
2973 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2974 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2975 };
nuccachena26cc2a2018-07-17 18:07:23 +08002976
Xiao Ma09b71022018-12-11 17:56:32 +09002977 test::DNSResponder dns(listen_addr);
2978 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002979 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002980 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002981
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002982 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002983 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002984 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002985
2986 // Ensure to synthesize AAAA if AF_INET6 is specified, and not to synthesize AAAA
2987 // in AF_INET case.
2988 addrinfo hints;
2989 memset(&hints, 0, sizeof(hints));
2990 hints.ai_family = AF_INET6;
2991 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
2992 EXPECT_TRUE(result != nullptr);
2993 std::string result_str = ToString(result);
2994 EXPECT_EQ(result_str, "64:ff9b::102:304");
2995
2996 hints.ai_family = AF_INET;
2997 result = safe_getaddrinfo("v4only", nullptr, &hints);
2998 EXPECT_TRUE(result != nullptr);
2999 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3000 result_str = ToString(result);
3001 EXPECT_EQ(result_str, "1.2.3.4");
3002}
nuccachena26cc2a2018-07-17 18:07:23 +08003003
3004TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedV6) {
3005 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003006 constexpr char dns64_name[] = "ipv4only.arpa.";
3007 constexpr char host_name[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003008 const std::vector<DnsRecord> records = {
3009 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3010 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3011 {host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
3012 };
nuccachena26cc2a2018-07-17 18:07:23 +08003013
Xiao Ma09b71022018-12-11 17:56:32 +09003014 test::DNSResponder dns(listen_addr);
3015 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003016 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003017 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003018
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003019 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003020 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003021 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003022
Xiao Ma09b71022018-12-11 17:56:32 +09003023 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08003024 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
3025 EXPECT_TRUE(result != nullptr);
3026 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3027
3028 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
Xiao Ma09b71022018-12-11 17:56:32 +09003029 const std::vector<std::string> result_strs = ToStrings(result);
nuccachena26cc2a2018-07-17 18:07:23 +08003030 for (const auto& str : result_strs) {
3031 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
3032 << ", result_str='" << str << "'";
3033 }
3034}
3035
3036TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedNoV6) {
3037 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003038 constexpr char dns64_name[] = "ipv4only.arpa.";
3039 constexpr char host_name[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003040 const std::vector<DnsRecord> records = {
3041 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3042 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3043 };
nuccachena26cc2a2018-07-17 18:07:23 +08003044
Xiao Ma09b71022018-12-11 17:56:32 +09003045 test::DNSResponder dns(listen_addr);
3046 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003047 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003048 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003049
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003050 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003051 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003052 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003053
Xiao Ma09b71022018-12-11 17:56:32 +09003054 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08003055 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
3056 EXPECT_TRUE(result != nullptr);
3057 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3058
3059 // In AF_UNSPEC case, synthesize AAAA if there's no AAAA answer.
3060 std::string result_str = ToString(result);
3061 EXPECT_EQ(result_str, "64:ff9b::102:304");
3062}
3063
3064TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecialUseIPv4Addresses) {
3065 constexpr char THIS_NETWORK[] = "this_network";
3066 constexpr char LOOPBACK[] = "loopback";
3067 constexpr char LINK_LOCAL[] = "link_local";
3068 constexpr char MULTICAST[] = "multicast";
3069 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
3070
3071 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
3072 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
3073 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
3074 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
3075 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
3076
3077 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003078 constexpr char dns64_name[] = "ipv4only.arpa.";
3079
Xiao Ma09b71022018-12-11 17:56:32 +09003080 test::DNSResponder dns(listen_addr);
3081 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003082 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003083 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003084
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003085 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003086 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003087 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003088
Luke Huangf8215372019-11-22 11:53:41 +08003089 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003090 static const struct TestConfig {
3091 std::string name;
3092 std::string addr;
3093
3094 std::string asHostName() const { return StringPrintf("%s.example.com.", name.c_str()); }
3095 } testConfigs[]{
3096 {THIS_NETWORK, ADDR_THIS_NETWORK},
3097 {LOOPBACK, ADDR_LOOPBACK},
3098 {LINK_LOCAL, ADDR_LINK_LOCAL},
3099 {MULTICAST, ADDR_MULTICAST},
3100 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
3101 };
Luke Huangf8215372019-11-22 11:53:41 +08003102 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003103
3104 for (const auto& config : testConfigs) {
3105 const std::string testHostName = config.asHostName();
3106 SCOPED_TRACE(testHostName);
3107
3108 const char* host_name = testHostName.c_str();
3109 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
3110
3111 addrinfo hints;
3112 memset(&hints, 0, sizeof(hints));
3113 hints.ai_family = AF_INET6;
3114 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
3115 // In AF_INET6 case, don't return IPv4 answers
3116 EXPECT_TRUE(result == nullptr);
3117 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3118 dns.clearQueries();
3119
3120 memset(&hints, 0, sizeof(hints));
3121 hints.ai_family = AF_UNSPEC;
3122 result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
3123 EXPECT_TRUE(result != nullptr);
3124 // Expect IPv6 query only. IPv4 answer has been cached in previous query.
3125 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3126 // In AF_UNSPEC case, don't synthesize special use IPv4 address.
3127 std::string result_str = ToString(result);
3128 EXPECT_EQ(result_str, config.addr.c_str());
3129 dns.clearQueries();
3130 }
3131}
3132
3133TEST_F(ResolverTest, GetAddrInfo_Dns64QueryWithNullArgumentHints) {
3134 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003135 constexpr char dns64_name[] = "ipv4only.arpa.";
3136 constexpr char host_name[] = "v4only.example.com.";
3137 constexpr char host_name2[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003138 const std::vector<DnsRecord> records = {
3139 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3140 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3141 {host_name2, ns_type::ns_t_a, "1.2.3.4"},
3142 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
3143 };
nuccachena26cc2a2018-07-17 18:07:23 +08003144
Xiao Ma09b71022018-12-11 17:56:32 +09003145 test::DNSResponder dns(listen_addr);
3146 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003147 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003148 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003149
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003150 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003151 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003152 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003153
3154 // Assign argument hints of getaddrinfo() as null is equivalent to set ai_family AF_UNSPEC.
3155 // In AF_UNSPEC case, synthesize AAAA if there has A answer only.
3156 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, nullptr);
3157 EXPECT_TRUE(result != nullptr);
3158 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3159 std::string result_str = ToString(result);
3160 EXPECT_EQ(result_str, "64:ff9b::102:304");
3161 dns.clearQueries();
3162
3163 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
3164 result = safe_getaddrinfo("v4v6", nullptr, nullptr);
3165 EXPECT_TRUE(result != nullptr);
3166 EXPECT_LE(2U, GetNumQueries(dns, host_name2));
3167 std::vector<std::string> result_strs = ToStrings(result);
3168 for (const auto& str : result_strs) {
3169 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
3170 << ", result_str='" << str << "'";
3171 }
3172}
3173
3174TEST_F(ResolverTest, GetAddrInfo_Dns64QueryNullArgumentNode) {
3175 constexpr char ADDR_ANYADDR_V4[] = "0.0.0.0";
3176 constexpr char ADDR_ANYADDR_V6[] = "::";
3177 constexpr char ADDR_LOCALHOST_V4[] = "127.0.0.1";
3178 constexpr char ADDR_LOCALHOST_V6[] = "::1";
3179
3180 constexpr char PORT_NAME_HTTP[] = "http";
3181 constexpr char PORT_NUMBER_HTTP[] = "80";
3182
3183 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003184 constexpr char dns64_name[] = "ipv4only.arpa.";
3185
Xiao Ma09b71022018-12-11 17:56:32 +09003186 test::DNSResponder dns(listen_addr);
3187 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003188 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003189 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003190
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003191 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003192 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003193 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003194
Luke Huangf8215372019-11-22 11:53:41 +08003195 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003196 // If node is null, return address is listed by libc/getaddrinfo.c as follows.
3197 // - passive socket -> anyaddr (0.0.0.0 or ::)
3198 // - non-passive socket -> localhost (127.0.0.1 or ::1)
3199 static const struct TestConfig {
3200 int flag;
3201 std::string addr_v4;
3202 std::string addr_v6;
3203
3204 std::string asParameters() const {
3205 return StringPrintf("flag=%d, addr_v4=%s, addr_v6=%s", flag, addr_v4.c_str(),
3206 addr_v6.c_str());
3207 }
3208 } testConfigs[]{
3209 {0 /* non-passive */, ADDR_LOCALHOST_V4, ADDR_LOCALHOST_V6},
3210 {AI_PASSIVE, ADDR_ANYADDR_V4, ADDR_ANYADDR_V6}
3211 };
Luke Huangf8215372019-11-22 11:53:41 +08003212 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003213
3214 for (const auto& config : testConfigs) {
3215 SCOPED_TRACE(config.asParameters());
3216
Xiao Ma09b71022018-12-11 17:56:32 +09003217 addrinfo hints = {
Nick Desaulnierscd6395a2019-10-11 09:15:24 -07003218 .ai_flags = config.flag,
Xiao Ma09b71022018-12-11 17:56:32 +09003219 .ai_family = AF_UNSPEC, // any address family
3220 .ai_socktype = 0, // any type
3221 .ai_protocol = 0, // any protocol
Xiao Ma09b71022018-12-11 17:56:32 +09003222 };
nuccachena26cc2a2018-07-17 18:07:23 +08003223
3224 // Assign hostname as null and service as port name.
3225 ScopedAddrinfo result = safe_getaddrinfo(nullptr, PORT_NAME_HTTP, &hints);
3226 ASSERT_TRUE(result != nullptr);
3227
3228 // Can't be synthesized because it should not get into Netd.
3229 std::vector<std::string> result_strs = ToStrings(result);
3230 for (const auto& str : result_strs) {
3231 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
3232 << ", result_str='" << str << "'";
3233 }
3234
3235 // Assign hostname as null and service as numeric port number.
3236 hints.ai_flags = config.flag | AI_NUMERICSERV;
3237 result = safe_getaddrinfo(nullptr, PORT_NUMBER_HTTP, &hints);
3238 ASSERT_TRUE(result != nullptr);
3239
3240 // Can't be synthesized because it should not get into Netd.
3241 result_strs = ToStrings(result);
3242 for (const auto& str : result_strs) {
3243 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
3244 << ", result_str='" << str << "'";
3245 }
3246 }
3247}
3248
3249TEST_F(ResolverTest, GetHostByAddr_ReverseDnsQueryWithHavingNat64Prefix) {
3250 struct hostent* result = nullptr;
3251 struct in_addr v4addr;
3252 struct in6_addr v6addr;
3253
3254 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003255 constexpr char dns64_name[] = "ipv4only.arpa.";
3256 constexpr char ptr_name[] = "v4v6.example.com.";
3257 // PTR record for IPv4 address 1.2.3.4
3258 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3259 // PTR record for IPv6 address 2001:db8::102:304
3260 constexpr char ptr_addr_v6[] =
3261 "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 +09003262 const std::vector<DnsRecord> records = {
3263 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3264 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3265 {ptr_addr_v6, ns_type::ns_t_ptr, ptr_name},
3266 };
nuccachena26cc2a2018-07-17 18:07:23 +08003267
Xiao Ma09b71022018-12-11 17:56:32 +09003268 test::DNSResponder dns(listen_addr);
3269 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003270 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003271 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003272
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003273 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003274 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003275 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003276
3277 // Reverse IPv4 DNS query. Prefix should have no effect on it.
3278 inet_pton(AF_INET, "1.2.3.4", &v4addr);
3279 result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
3280 ASSERT_TRUE(result != nullptr);
3281 std::string result_str = result->h_name ? result->h_name : "null";
3282 EXPECT_EQ(result_str, "v4v6.example.com");
3283
3284 // Reverse IPv6 DNS query. Prefix should have no effect on it.
3285 inet_pton(AF_INET6, "2001:db8::102:304", &v6addr);
3286 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3287 ASSERT_TRUE(result != nullptr);
3288 result_str = result->h_name ? result->h_name : "null";
3289 EXPECT_EQ(result_str, "v4v6.example.com");
3290}
3291
3292TEST_F(ResolverTest, GetHostByAddr_ReverseDns64Query) {
3293 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003294 constexpr char dns64_name[] = "ipv4only.arpa.";
3295 constexpr char ptr_name[] = "v4only.example.com.";
3296 // PTR record for IPv4 address 1.2.3.4
3297 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3298 // PTR record for IPv6 address 64:ff9b::1.2.3.4
3299 constexpr char ptr_addr_v6_nomapping[] =
3300 "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.";
3301 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
3302 // PTR record for IPv6 address 64:ff9b::5.6.7.8
3303 constexpr char ptr_addr_v6_synthesis[] =
3304 "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 +09003305 const std::vector<DnsRecord> records = {
3306 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3307 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3308 {ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis},
3309 };
nuccachena26cc2a2018-07-17 18:07:23 +08003310
Xiao Ma09b71022018-12-11 17:56:32 +09003311 test::DNSResponder dns(listen_addr);
3312 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003313 // "ptr_addr_v6_nomapping" is not mapped in DNS server
nuccachena26cc2a2018-07-17 18:07:23 +08003314 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003315 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003316
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003317 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003318 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003319 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003320
3321 // Synthesized PTR record doesn't exist on DNS server
3322 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
3323 // After querying synthesized address failed, expect that prefix is removed from IPv6
3324 // synthesized address and do reverse IPv4 query instead.
3325 struct in6_addr v6addr;
3326 inet_pton(AF_INET6, "64:ff9b::1.2.3.4", &v6addr);
3327 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3328 ASSERT_TRUE(result != nullptr);
3329 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist
3330 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist
3331 std::string result_str = result->h_name ? result->h_name : "null";
3332 EXPECT_EQ(result_str, "v4only.example.com");
3333 // Check that return address has been mapped from IPv4 to IPv6 address because Netd
3334 // removes NAT64 prefix and does IPv4 DNS reverse lookup in this case. Then, Netd
3335 // fakes the return IPv4 address as original queried IPv6 address.
3336 result_str = ToString(result);
3337 EXPECT_EQ(result_str, "64:ff9b::102:304");
3338 dns.clearQueries();
3339
3340 // Synthesized PTR record exists on DNS server
3341 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
3342 // Expect to Netd pass through synthesized address for DNS queries.
3343 inet_pton(AF_INET6, "64:ff9b::5.6.7.8", &v6addr);
3344 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3345 ASSERT_TRUE(result != nullptr);
3346 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
3347 result_str = result->h_name ? result->h_name : "null";
3348 EXPECT_EQ(result_str, "v6synthesis.example.com");
3349}
3350
3351TEST_F(ResolverTest, GetHostByAddr_ReverseDns64QueryFromHostFile) {
3352 constexpr char dns64_name[] = "ipv4only.arpa.";
3353 constexpr char host_name[] = "localhost";
3354 // The address is synthesized by prefix64:localhost.
3355 constexpr char host_addr[] = "64:ff9b::7f00:1";
nuccachena26cc2a2018-07-17 18:07:23 +08003356 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003357
3358 test::DNSResponder dns(listen_addr);
3359 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003360 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003361 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003362
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003363 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003364 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003365 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003366
3367 // Using synthesized "localhost" address to be a trick for resolving host name
3368 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
3369 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
3370 struct in6_addr v6addr;
3371 inet_pton(AF_INET6, host_addr, &v6addr);
3372 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3373 ASSERT_TRUE(result != nullptr);
3374 // Expect no DNS queries; localhost is resolved via /etc/hosts.
3375 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
3376
Luke Huangf8215372019-11-22 11:53:41 +08003377 ASSERT_EQ(sizeof(in6_addr), (unsigned)result->h_length);
nuccachena26cc2a2018-07-17 18:07:23 +08003378 ASSERT_EQ(AF_INET6, result->h_addrtype);
3379 std::string result_str = ToString(result);
3380 EXPECT_EQ(result_str, host_addr);
3381 result_str = result->h_name ? result->h_name : "null";
3382 EXPECT_EQ(result_str, host_name);
3383}
3384
Hungming Chen9e6185a2019-06-04 16:09:19 +08003385TEST_F(ResolverTest, GetHostByAddr_cnamesClasslessReverseDelegation) {
3386 // IPv4 addresses in the subnet with notation '/' or '-'.
3387 constexpr char addr_slash[] = "192.0.2.1";
3388 constexpr char addr_hyphen[] = "192.0.3.1";
3389
3390 // Used to verify DNS reverse query for classless reverse lookup zone. See detail in RFC 2317
3391 // section 4.
3392 const static std::vector<DnsRecord> records = {
3393 // The records for reverse querying "192.0.2.1" in the subnet with notation '/'.
3394 {"1.2.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0/25.2.0.192.in-addr.arpa."},
3395 {"1.0/25.2.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3396
3397 // The records for reverse querying "192.0.3.1" in the subnet with notation '-'.
3398 {"1.3.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0-127.3.0.192.in-addr.arpa."},
3399 {"1.0-127.3.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3400 };
3401
3402 test::DNSResponder dns;
3403 StartDns(dns, records);
3404 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3405
3406 for (const auto& address : {addr_slash, addr_hyphen}) {
3407 SCOPED_TRACE(address);
3408
3409 in_addr v4addr;
3410 ASSERT_TRUE(inet_pton(AF_INET, address, &v4addr));
3411 hostent* result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
3412 ASSERT_TRUE(result != nullptr);
3413 EXPECT_STREQ("hello.example.com", result->h_name);
3414 }
3415}
3416
nuccachena26cc2a2018-07-17 18:07:23 +08003417TEST_F(ResolverTest, GetNameInfo_ReverseDnsQueryWithHavingNat64Prefix) {
3418 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003419 constexpr char dns64_name[] = "ipv4only.arpa.";
3420 constexpr char ptr_name[] = "v4v6.example.com.";
3421 // PTR record for IPv4 address 1.2.3.4
3422 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3423 // PTR record for IPv6 address 2001:db8::102:304
3424 constexpr char ptr_addr_v6[] =
3425 "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 +09003426 const std::vector<DnsRecord> records = {
3427 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3428 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3429 {ptr_addr_v6, ns_type::ns_t_ptr, ptr_name},
3430 };
nuccachena26cc2a2018-07-17 18:07:23 +08003431
Xiao Ma09b71022018-12-11 17:56:32 +09003432 test::DNSResponder dns(listen_addr);
3433 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003434 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003435 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003436
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003437 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003438 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003439 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003440
Luke Huangf8215372019-11-22 11:53:41 +08003441 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003442 static const struct TestConfig {
3443 int flag;
3444 int family;
3445 std::string addr;
3446 std::string host;
3447
3448 std::string asParameters() const {
3449 return StringPrintf("flag=%d, family=%d, addr=%s, host=%s", flag, family, addr.c_str(),
3450 host.c_str());
3451 }
3452 } testConfigs[]{
3453 {NI_NAMEREQD, AF_INET, "1.2.3.4", "v4v6.example.com"},
3454 {NI_NUMERICHOST, AF_INET, "1.2.3.4", "1.2.3.4"},
3455 {0, AF_INET, "1.2.3.4", "v4v6.example.com"},
3456 {0, AF_INET, "5.6.7.8", "5.6.7.8"}, // unmapped
3457 {NI_NAMEREQD, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
3458 {NI_NUMERICHOST, AF_INET6, "2001:db8::102:304", "2001:db8::102:304"},
3459 {0, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
3460 {0, AF_INET6, "2001:db8::506:708", "2001:db8::506:708"}, // unmapped
3461 };
Luke Huangf8215372019-11-22 11:53:41 +08003462 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003463
3464 // Reverse IPv4/IPv6 DNS query. Prefix should have no effect on it.
3465 for (const auto& config : testConfigs) {
3466 SCOPED_TRACE(config.asParameters());
3467
3468 int rv;
3469 char host[NI_MAXHOST];
3470 struct sockaddr_in sin;
3471 struct sockaddr_in6 sin6;
3472 if (config.family == AF_INET) {
3473 memset(&sin, 0, sizeof(sin));
3474 sin.sin_family = AF_INET;
3475 inet_pton(AF_INET, config.addr.c_str(), &sin.sin_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003476 rv = getnameinfo((const struct sockaddr*)&sin, sizeof(sin), host, sizeof(host), nullptr,
3477 0, config.flag);
nuccachena26cc2a2018-07-17 18:07:23 +08003478 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4));
3479 } else if (config.family == AF_INET6) {
3480 memset(&sin6, 0, sizeof(sin6));
3481 sin6.sin6_family = AF_INET6;
3482 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003483 rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host),
nuccachena26cc2a2018-07-17 18:07:23 +08003484 nullptr, 0, config.flag);
3485 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6));
3486 }
3487 ASSERT_EQ(0, rv);
3488 std::string result_str = host;
3489 EXPECT_EQ(result_str, config.host);
3490 dns.clearQueries();
3491 }
3492}
3493
3494TEST_F(ResolverTest, GetNameInfo_ReverseDns64Query) {
3495 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003496 constexpr char dns64_name[] = "ipv4only.arpa.";
3497 constexpr char ptr_name[] = "v4only.example.com.";
3498 // PTR record for IPv4 address 1.2.3.4
3499 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3500 // PTR record for IPv6 address 64:ff9b::1.2.3.4
3501 constexpr char ptr_addr_v6_nomapping[] =
3502 "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.";
3503 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
3504 // PTR record for IPv6 address 64:ff9b::5.6.7.8
3505 constexpr char ptr_addr_v6_synthesis[] =
3506 "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 +09003507 const std::vector<DnsRecord> records = {
3508 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3509 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3510 {ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis},
3511 };
nuccachena26cc2a2018-07-17 18:07:23 +08003512
Xiao Ma09b71022018-12-11 17:56:32 +09003513 test::DNSResponder dns(listen_addr);
3514 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003515 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003516 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003517
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003518 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003519 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003520 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003521
Luke Huangf8215372019-11-22 11:53:41 +08003522 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003523 static const struct TestConfig {
3524 bool hasSynthesizedPtrRecord;
3525 int flag;
3526 std::string addr;
3527 std::string host;
3528
3529 std::string asParameters() const {
3530 return StringPrintf("hasSynthesizedPtrRecord=%d, flag=%d, addr=%s, host=%s",
3531 hasSynthesizedPtrRecord, flag, addr.c_str(), host.c_str());
3532 }
3533 } testConfigs[]{
3534 {false, NI_NAMEREQD, "64:ff9b::102:304", "v4only.example.com"},
3535 {false, NI_NUMERICHOST, "64:ff9b::102:304", "64:ff9b::102:304"},
3536 {false, 0, "64:ff9b::102:304", "v4only.example.com"},
3537 {true, NI_NAMEREQD, "64:ff9b::506:708", "v6synthesis.example.com"},
3538 {true, NI_NUMERICHOST, "64:ff9b::506:708", "64:ff9b::506:708"},
3539 {true, 0, "64:ff9b::506:708", "v6synthesis.example.com"}
3540 };
Luke Huangf8215372019-11-22 11:53:41 +08003541 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003542
3543 // hasSynthesizedPtrRecord = false
3544 // Synthesized PTR record doesn't exist on DNS server
3545 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
3546 // After querying synthesized address failed, expect that prefix is removed from IPv6
3547 // synthesized address and do reverse IPv4 query instead.
3548 //
3549 // hasSynthesizedPtrRecord = true
3550 // Synthesized PTR record exists on DNS server
3551 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
3552 // Expect to just pass through synthesized address for DNS queries.
3553 for (const auto& config : testConfigs) {
3554 SCOPED_TRACE(config.asParameters());
3555
3556 char host[NI_MAXHOST];
3557 struct sockaddr_in6 sin6;
3558 memset(&sin6, 0, sizeof(sin6));
3559 sin6.sin6_family = AF_INET6;
3560 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003561 int rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host),
nuccachena26cc2a2018-07-17 18:07:23 +08003562 nullptr, 0, config.flag);
3563 ASSERT_EQ(0, rv);
3564 if (config.flag == NI_NAMEREQD) {
3565 if (config.hasSynthesizedPtrRecord) {
3566 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
3567 } else {
3568 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist.
3569 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist.
3570 }
3571 }
3572 std::string result_str = host;
3573 EXPECT_EQ(result_str, config.host);
3574 dns.clearQueries();
3575 }
3576}
3577
3578TEST_F(ResolverTest, GetNameInfo_ReverseDns64QueryFromHostFile) {
3579 constexpr char dns64_name[] = "ipv4only.arpa.";
3580 constexpr char host_name[] = "localhost";
3581 // The address is synthesized by prefix64:localhost.
3582 constexpr char host_addr[] = "64:ff9b::7f00:1";
nuccachena26cc2a2018-07-17 18:07:23 +08003583 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003584
3585 test::DNSResponder dns(listen_addr);
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003586
Xiao Ma09b71022018-12-11 17:56:32 +09003587 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003588 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003589 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003590
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003591 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003592 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003593 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003594
3595 // Using synthesized "localhost" address to be a trick for resolving host name
3596 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
3597 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
3598 char host[NI_MAXHOST];
Xiao Ma09b71022018-12-11 17:56:32 +09003599 struct sockaddr_in6 sin6 = {.sin6_family = AF_INET6};
nuccachena26cc2a2018-07-17 18:07:23 +08003600 inet_pton(AF_INET6, host_addr, &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003601 int rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host), nullptr,
nuccachena26cc2a2018-07-17 18:07:23 +08003602 0, NI_NAMEREQD);
3603 ASSERT_EQ(0, rv);
3604 // Expect no DNS queries; localhost is resolved via /etc/hosts.
3605 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
3606
3607 std::string result_str = host;
3608 EXPECT_EQ(result_str, host_name);
3609}
3610
Hungming Chen9e6185a2019-06-04 16:09:19 +08003611TEST_F(ResolverTest, GetNameInfo_cnamesClasslessReverseDelegation) {
3612 // IPv4 addresses in the subnet with notation '/' or '-'.
3613 constexpr char addr_slash[] = "192.0.2.1";
3614 constexpr char addr_hyphen[] = "192.0.3.1";
3615
3616 // Used to verify DNS reverse query for classless reverse lookup zone. See detail in RFC 2317
3617 // section 4.
3618 const static std::vector<DnsRecord> records = {
3619 // The records for reverse querying "192.0.2.1" in the subnet with notation '/'.
3620 {"1.2.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0/25.2.0.192.in-addr.arpa."},
3621 {"1.0/25.2.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3622
3623 // The records for reverse querying "192.0.3.1" in the subnet with notation '-'.
3624 {"1.3.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0-127.3.0.192.in-addr.arpa."},
3625 {"1.0-127.3.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3626 };
3627
3628 test::DNSResponder dns;
3629 StartDns(dns, records);
3630 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3631
3632 for (const auto& address : {addr_slash, addr_hyphen}) {
3633 SCOPED_TRACE(address);
3634
3635 char host[NI_MAXHOST];
3636 sockaddr_in sin = {.sin_family = AF_INET};
3637 ASSERT_TRUE(inet_pton(AF_INET, address, &sin.sin_addr));
3638 int rv = getnameinfo((const sockaddr*)&sin, sizeof(sin), host, sizeof(host), nullptr, 0,
3639 NI_NAMEREQD);
3640 ASSERT_EQ(0, rv);
3641 EXPECT_STREQ("hello.example.com", host);
3642 }
3643}
3644
nuccachena26cc2a2018-07-17 18:07:23 +08003645TEST_F(ResolverTest, GetHostByName2_Dns64Synthesize) {
Xiao Ma09b71022018-12-11 17:56:32 +09003646 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003647 constexpr char dns64_name[] = "ipv4only.arpa.";
3648 constexpr char host_name[] = "ipv4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003649 const std::vector<DnsRecord> records = {
3650 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3651 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3652 };
nuccachena26cc2a2018-07-17 18:07:23 +08003653
Xiao Ma09b71022018-12-11 17:56:32 +09003654 test::DNSResponder dns(listen_addr);
3655 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003656 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003657 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003658
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003659 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003660 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003661 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003662
3663 // Query an IPv4-only hostname. Expect that gets a synthesized address.
3664 struct hostent* result = gethostbyname2("ipv4only", AF_INET6);
3665 ASSERT_TRUE(result != nullptr);
3666 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3667 std::string result_str = ToString(result);
3668 EXPECT_EQ(result_str, "64:ff9b::102:304");
3669}
nuccachena26cc2a2018-07-17 18:07:23 +08003670
3671TEST_F(ResolverTest, GetHostByName2_DnsQueryWithHavingNat64Prefix) {
3672 constexpr char dns64_name[] = "ipv4only.arpa.";
3673 constexpr char host_name[] = "v4v6.example.com.";
nuccachena26cc2a2018-07-17 18:07:23 +08003674 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003675 const std::vector<DnsRecord> records = {
3676 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3677 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3678 {host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
3679 };
3680
3681 test::DNSResponder dns(listen_addr);
3682 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003683 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003684 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003685
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003686 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003687 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003688 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003689
3690 // IPv4 DNS query. Prefix should have no effect on it.
3691 struct hostent* result = gethostbyname2("v4v6", AF_INET);
3692 ASSERT_TRUE(result != nullptr);
3693 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3694 std::string result_str = ToString(result);
3695 EXPECT_EQ(result_str, "1.2.3.4");
3696 dns.clearQueries();
3697
3698 // IPv6 DNS query. Prefix should have no effect on it.
3699 result = gethostbyname2("v4v6", AF_INET6);
3700 ASSERT_TRUE(result != nullptr);
3701 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3702 result_str = ToString(result);
3703 EXPECT_EQ(result_str, "2001:db8::102:304");
3704}
3705
3706TEST_F(ResolverTest, GetHostByName2_Dns64QuerySpecialUseIPv4Addresses) {
3707 constexpr char THIS_NETWORK[] = "this_network";
3708 constexpr char LOOPBACK[] = "loopback";
3709 constexpr char LINK_LOCAL[] = "link_local";
3710 constexpr char MULTICAST[] = "multicast";
3711 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
3712
3713 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
3714 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
3715 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
3716 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
3717 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
3718
3719 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003720 constexpr char dns64_name[] = "ipv4only.arpa.";
3721
Xiao Ma09b71022018-12-11 17:56:32 +09003722 test::DNSResponder dns(listen_addr);
3723 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003724 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003725 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003726
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003727 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003728 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003729 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003730
Luke Huangf8215372019-11-22 11:53:41 +08003731 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003732 static const struct TestConfig {
3733 std::string name;
3734 std::string addr;
3735
3736 std::string asHostName() const {
Luke Huangf8215372019-11-22 11:53:41 +08003737 return StringPrintf("%s.example.com.", name.c_str());
nuccachena26cc2a2018-07-17 18:07:23 +08003738 }
3739 } testConfigs[]{
3740 {THIS_NETWORK, ADDR_THIS_NETWORK},
3741 {LOOPBACK, ADDR_LOOPBACK},
3742 {LINK_LOCAL, ADDR_LINK_LOCAL},
3743 {MULTICAST, ADDR_MULTICAST},
3744 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
3745 };
Luke Huangf8215372019-11-22 11:53:41 +08003746 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003747
3748 for (const auto& config : testConfigs) {
3749 const std::string testHostName = config.asHostName();
3750 SCOPED_TRACE(testHostName);
3751
3752 const char* host_name = testHostName.c_str();
3753 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
3754
3755 struct hostent* result = gethostbyname2(config.name.c_str(), AF_INET6);
3756 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3757
3758 // In AF_INET6 case, don't synthesize special use IPv4 address.
3759 // Expect to have no answer
3760 EXPECT_EQ(nullptr, result);
3761
3762 dns.clearQueries();
3763 }
Bernie Innocenti2fef2b82018-12-20 15:56:40 +09003764}
Mike Yuf14e1a92019-05-10 13:54:58 +08003765
3766TEST_F(ResolverTest, PrefixDiscoveryBypassTls) {
3767 constexpr char listen_addr[] = "::1";
3768 constexpr char cleartext_port[] = "53";
3769 constexpr char tls_port[] = "853";
3770 constexpr char dns64_name[] = "ipv4only.arpa.";
3771 const std::vector<std::string> servers = {listen_addr};
3772
3773 test::DNSResponder dns(listen_addr);
3774 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
3775 test::DnsTlsFrontend tls(listen_addr, tls_port, listen_addr, cleartext_port);
3776 ASSERT_TRUE(tls.startServer());
3777
3778 // Setup OPPORTUNISTIC mode and wait for the validation complete.
waynema0e73c2e2019-07-31 15:04:08 +08003779 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08003780 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003781 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yuf14e1a92019-05-10 13:54:58 +08003782 tls.clearQueries();
3783
3784 // Start NAT64 prefix discovery and wait for it complete.
3785 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003786 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
Mike Yuf14e1a92019-05-10 13:54:58 +08003787
3788 // Verify it bypassed TLS even though there's a TLS server available.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003789 EXPECT_EQ(0, tls.queries()) << dns.dumpQueries();
3790 EXPECT_EQ(1U, GetNumQueries(dns, dns64_name)) << dns.dumpQueries();
Mike Yuf14e1a92019-05-10 13:54:58 +08003791
3792 // Restart the testing network to reset the cache.
3793 mDnsClient.TearDown();
3794 mDnsClient.SetUp();
3795 dns.clearQueries();
3796
3797 // Setup STRICT mode and wait for the validation complete.
waynema0e73c2e2019-07-31 15:04:08 +08003798 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
3799 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08003800 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003801 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yuf14e1a92019-05-10 13:54:58 +08003802 tls.clearQueries();
3803
3804 // Start NAT64 prefix discovery and wait for it to complete.
3805 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003806 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
Mike Yuf14e1a92019-05-10 13:54:58 +08003807
3808 // Verify it bypassed TLS despite STRICT mode.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003809 EXPECT_EQ(0, tls.queries()) << dns.dumpQueries();
3810 EXPECT_EQ(1U, GetNumQueries(dns, dns64_name)) << dns.dumpQueries();
Mike Yuf14e1a92019-05-10 13:54:58 +08003811}
Luke Huang9807e6b2019-05-20 16:17:12 +08003812
Lorenzo Colittie51091d2020-05-20 02:48:44 +09003813TEST_F(ResolverTest, SetAndClearNat64Prefix) {
3814 constexpr char host_name[] = "v4.example.com.";
3815 constexpr char listen_addr[] = "::1";
3816 const std::vector<DnsRecord> records = {
3817 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3818 };
3819 const std::string kNat64Prefix1 = "64:ff9b::/96";
3820 const std::string kNat64Prefix2 = "2001:db8:6464::/96";
3821
3822 test::DNSResponder dns(listen_addr);
3823 StartDns(dns, records);
3824 const std::vector<std::string> servers = {listen_addr};
3825 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
3826
3827 auto resolvService = mDnsClient.resolvService();
3828 addrinfo hints = {.ai_family = AF_INET6};
3829
3830 // No NAT64 prefix, no AAAA record.
3831 ScopedAddrinfo result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3832 ASSERT_TRUE(result == nullptr);
3833
3834 // Set the prefix, and expect to get a synthesized AAAA record.
3835 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix2).isOk());
3836 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3837 ASSERT_FALSE(result == nullptr);
3838 EXPECT_EQ("2001:db8:6464::102:304", ToString(result));
3839
3840 // Update the prefix, expect to see AAAA records from the new prefix.
3841 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3842 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3843 ASSERT_FALSE(result == nullptr);
3844 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3845
3846 // Non-/96 prefixes are ignored.
3847 auto status = resolvService->setPrefix64(TEST_NETID, "64:ff9b::/64");
3848 EXPECT_FALSE(status.isOk());
3849 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3850 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3851
3852 // Invalid prefixes are ignored.
3853 status = resolvService->setPrefix64(TEST_NETID, "192.0.2.0/24");
3854 EXPECT_FALSE(status.isOk());
3855 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3856 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3857
3858 status = resolvService->setPrefix64(TEST_NETID, "192.0.2.1");
3859 EXPECT_FALSE(status.isOk());
3860 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3861 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3862
3863 status = resolvService->setPrefix64(TEST_NETID, "hello");
3864 EXPECT_FALSE(status.isOk());
3865 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3866 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3867
3868 // DNS64 synthesis is still working.
3869 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3870 ASSERT_FALSE(result == nullptr);
3871 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3872
3873 // Clear the prefix. No AAAA records any more.
3874 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, "").isOk());
3875 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3876 EXPECT_TRUE(result == nullptr);
3877
3878 // Calling startPrefix64Discovery clears the prefix.
3879 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3880 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3881 ASSERT_FALSE(result == nullptr);
3882 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3883
3884 EXPECT_TRUE(resolvService->startPrefix64Discovery(TEST_NETID).isOk());
3885 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3886 ASSERT_TRUE(result == nullptr);
3887
3888 // setPrefix64 fails if prefix discovery is started, even if no prefix is yet discovered...
3889 status = resolvService->setPrefix64(TEST_NETID, kNat64Prefix1);
3890 EXPECT_FALSE(status.isOk());
3891 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3892 EXPECT_EQ(EEXIST, status.getServiceSpecificError());
3893
3894 // .. and clearing the prefix also has no effect.
3895 status = resolvService->setPrefix64(TEST_NETID, "");
3896 EXPECT_FALSE(status.isOk());
3897 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3898 EXPECT_EQ(ENOENT, status.getServiceSpecificError());
3899
3900 // setPrefix64 succeeds again when prefix discovery is stopped.
3901 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
3902 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3903 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3904 ASSERT_FALSE(result == nullptr);
3905 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3906
3907 // Calling stopPrefix64Discovery clears the prefix.
3908 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
3909 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3910 ASSERT_TRUE(result == nullptr);
3911
3912 // Set up NAT64 prefix discovery.
3913 constexpr char dns64_name[] = "ipv4only.arpa.";
3914 const std::vector<DnsRecord> newRecords = {
3915 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3916 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3917 };
3918 dns.stopServer();
3919 StartDns(dns, newRecords);
3920
3921 EXPECT_TRUE(resolvService->startPrefix64Discovery(TEST_NETID).isOk());
3922 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
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 // setPrefix64 fails if NAT64 prefix discovery has succeeded, and the discovered prefix
3928 // continues to be used.
3929 status = resolvService->setPrefix64(TEST_NETID, kNat64Prefix2);
3930 EXPECT_FALSE(status.isOk());
3931 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3932 EXPECT_EQ(EEXIST, status.getServiceSpecificError());
3933
3934 // Clearing the prefix also has no effect if discovery is started.
3935 status = resolvService->setPrefix64(TEST_NETID, "");
3936 EXPECT_FALSE(status.isOk());
3937 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3938 EXPECT_EQ(ENOENT, status.getServiceSpecificError());
3939
3940 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3941 ASSERT_FALSE(result == nullptr);
3942 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3943
3944 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
3945 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_NOT_FOUND));
Lorenzo Colitti61f796b2020-05-21 00:57:49 +09003946
3947 EXPECT_EQ(0, sDnsMetricsListener->getUnexpectedNat64PrefixUpdates());
Lorenzo Colittie51091d2020-05-20 02:48:44 +09003948}
3949
Luke Huang9807e6b2019-05-20 16:17:12 +08003950namespace {
3951
Luke Huang0d592bc2019-05-25 18:24:03 +08003952class ScopedSetNetworkForProcess {
3953 public:
3954 explicit ScopedSetNetworkForProcess(unsigned netId) {
3955 mStoredNetId = getNetworkForProcess();
3956 if (netId == mStoredNetId) return;
3957 EXPECT_EQ(0, setNetworkForProcess(netId));
3958 }
3959 ~ScopedSetNetworkForProcess() { EXPECT_EQ(0, setNetworkForProcess(mStoredNetId)); }
3960
3961 private:
3962 unsigned mStoredNetId;
3963};
3964
3965class ScopedSetNetworkForResolv {
3966 public:
3967 explicit ScopedSetNetworkForResolv(unsigned netId) { EXPECT_EQ(0, setNetworkForResolv(netId)); }
3968 ~ScopedSetNetworkForResolv() { EXPECT_EQ(0, setNetworkForResolv(NETID_UNSET)); }
3969};
3970
Luke Huang9807e6b2019-05-20 16:17:12 +08003971void sendCommand(int fd, const std::string& cmd) {
3972 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size() + 1));
3973 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size() + 1));
3974}
3975
3976int32_t readBE32(int fd) {
3977 int32_t tmp;
3978 int n = TEMP_FAILURE_RETRY(read(fd, &tmp, sizeof(tmp)));
3979 EXPECT_TRUE(n > 0);
3980 return ntohl(tmp);
3981}
3982
Luke Huang0d592bc2019-05-25 18:24:03 +08003983int readResponseCode(int fd) {
Luke Huang9807e6b2019-05-20 16:17:12 +08003984 char buf[4];
3985 int n = TEMP_FAILURE_RETRY(read(fd, &buf, sizeof(buf)));
3986 EXPECT_TRUE(n > 0);
3987 // The format of response code is that 4 bytes for the code & null.
3988 buf[3] = '\0';
3989 int result;
3990 EXPECT_TRUE(ParseInt(buf, &result));
3991 return result;
3992}
3993
Luke Huang0d592bc2019-05-25 18:24:03 +08003994bool checkAndClearUseLocalNameserversFlag(unsigned* netid) {
3995 if (netid == nullptr || ((*netid) & NETID_USE_LOCAL_NAMESERVERS) == 0) {
3996 return false;
3997 }
3998 *netid = (*netid) & ~NETID_USE_LOCAL_NAMESERVERS;
3999 return true;
4000}
4001
Luke Huangf8215372019-11-22 11:53:41 +08004002aidl::android::net::UidRangeParcel makeUidRangeParcel(int start, int stop) {
4003 aidl::android::net::UidRangeParcel res;
Luke Huang0d592bc2019-05-25 18:24:03 +08004004 res.start = start;
4005 res.stop = stop;
4006
4007 return res;
4008}
4009
4010void expectNetIdWithLocalNameserversFlag(unsigned netId) {
4011 unsigned dnsNetId = 0;
4012 EXPECT_EQ(0, getNetworkForDns(&dnsNetId));
4013 EXPECT_TRUE(checkAndClearUseLocalNameserversFlag(&dnsNetId));
4014 EXPECT_EQ(netId, static_cast<unsigned>(dnsNetId));
4015}
4016
4017void expectDnsNetIdEquals(unsigned netId) {
4018 unsigned dnsNetId = 0;
4019 EXPECT_EQ(0, getNetworkForDns(&dnsNetId));
4020 EXPECT_EQ(netId, static_cast<unsigned>(dnsNetId));
4021}
4022
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004023void expectDnsNetIdIsDefaultNetwork(INetd* netdService) {
Luke Huang0d592bc2019-05-25 18:24:03 +08004024 int currentNetid;
4025 EXPECT_TRUE(netdService->networkGetDefault(&currentNetid).isOk());
4026 expectDnsNetIdEquals(currentNetid);
4027}
4028
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004029void expectDnsNetIdWithVpn(INetd* netdService, unsigned vpnNetId, unsigned expectedNetId) {
Luke Huang0d592bc2019-05-25 18:24:03 +08004030 EXPECT_TRUE(netdService->networkCreateVpn(vpnNetId, false /* secure */).isOk());
4031 uid_t uid = getuid();
4032 // Add uid to VPN
4033 EXPECT_TRUE(netdService->networkAddUidRanges(vpnNetId, {makeUidRangeParcel(uid, uid)}).isOk());
4034 expectDnsNetIdEquals(expectedNetId);
4035 EXPECT_TRUE(netdService->networkDestroy(vpnNetId).isOk());
4036}
4037
Luke Huang9807e6b2019-05-20 16:17:12 +08004038} // namespace
4039
4040TEST_F(ResolverTest, getDnsNetId) {
4041 // We've called setNetworkForProcess in SetupOemNetwork, so reset to default first.
4042 setNetworkForProcess(NETID_UNSET);
Luke Huang0d592bc2019-05-25 18:24:03 +08004043
4044 expectDnsNetIdIsDefaultNetwork(mDnsClient.netdService());
4045 expectDnsNetIdWithVpn(mDnsClient.netdService(), TEST_VPN_NETID, TEST_VPN_NETID);
Luke Huang9807e6b2019-05-20 16:17:12 +08004046
4047 // Test with setNetworkForProcess
Luke Huang0d592bc2019-05-25 18:24:03 +08004048 {
4049 ScopedSetNetworkForProcess scopedSetNetworkForProcess(TEST_NETID);
4050 expectDnsNetIdEquals(TEST_NETID);
4051 }
4052
4053 // Test with setNetworkForProcess with NETID_USE_LOCAL_NAMESERVERS
4054 {
4055 ScopedSetNetworkForProcess scopedSetNetworkForProcess(TEST_NETID |
4056 NETID_USE_LOCAL_NAMESERVERS);
4057 expectNetIdWithLocalNameserversFlag(TEST_NETID);
4058 }
Luke Huang9807e6b2019-05-20 16:17:12 +08004059
4060 // Test with setNetworkForResolv
Luke Huang0d592bc2019-05-25 18:24:03 +08004061 {
4062 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID);
4063 expectDnsNetIdEquals(TEST_NETID);
4064 }
4065
4066 // Test with setNetworkForResolv with NETID_USE_LOCAL_NAMESERVERS
4067 {
4068 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID |
4069 NETID_USE_LOCAL_NAMESERVERS);
4070 expectNetIdWithLocalNameserversFlag(TEST_NETID);
4071 }
4072
4073 // Test with setNetworkForResolv under bypassable vpn
4074 {
4075 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID);
4076 expectDnsNetIdWithVpn(mDnsClient.netdService(), TEST_VPN_NETID, TEST_NETID);
4077 }
Luke Huang9807e6b2019-05-20 16:17:12 +08004078
4079 // Create socket connected to DnsProxyListener
4080 int fd = dns_open_proxy();
4081 EXPECT_TRUE(fd > 0);
4082 unique_fd ufd(fd);
4083
4084 // Test command with wrong netId
4085 sendCommand(fd, "getdnsnetid abc");
Luke Huang0d592bc2019-05-25 18:24:03 +08004086 EXPECT_EQ(ResponseCode::DnsProxyQueryResult, readResponseCode(fd));
Luke Huang9807e6b2019-05-20 16:17:12 +08004087 EXPECT_EQ(-EINVAL, readBE32(fd));
4088
4089 // Test unsupported command
4090 sendCommand(fd, "getdnsnetidNotSupported");
4091 // Keep in sync with FrameworkListener.cpp (500, "Command not recognized")
Luke Huang0d592bc2019-05-25 18:24:03 +08004092 EXPECT_EQ(500, readResponseCode(fd));
Luke Huang9807e6b2019-05-20 16:17:12 +08004093}
Sehee Park2c118782019-05-07 13:02:45 +09004094
4095TEST_F(ResolverTest, BlockDnsQueryWithUidRule) {
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004096 // This test relies on blocking traffic on loopback, which xt_qtaguid does not do.
4097 // See aosp/358413 and b/34444781 for why.
4098 SKIP_IF_BPF_NOT_SUPPORTED;
4099
Sehee Park2c118782019-05-07 13:02:45 +09004100 constexpr char listen_addr1[] = "127.0.0.4";
4101 constexpr char listen_addr2[] = "::1";
4102 constexpr char host_name[] = "howdy.example.com.";
4103 const std::vector<DnsRecord> records = {
4104 {host_name, ns_type::ns_t_a, "1.2.3.4"},
4105 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
4106 };
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004107 INetd* netdService = mDnsClient.netdService();
Sehee Park2c118782019-05-07 13:02:45 +09004108
4109 test::DNSResponder dns1(listen_addr1);
4110 test::DNSResponder dns2(listen_addr2);
4111 StartDns(dns1, records);
4112 StartDns(dns2, records);
4113
4114 std::vector<std::string> servers = {listen_addr1, listen_addr2};
4115 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
4116 dns1.clearQueries();
4117 dns2.clearQueries();
4118
Luke Huangeb618ef2020-05-26 14:17:02 +08004119 ScopeBlockedUIDRule scopeBlockUidRule(netdService, TEST_UID);
Sehee Park2c118782019-05-07 13:02:45 +09004120 // Dns Query
4121 int fd1 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_a, 0);
4122 int fd2 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_aaaa, 0);
4123 EXPECT_TRUE(fd1 != -1);
4124 EXPECT_TRUE(fd2 != -1);
4125
Luke Huang5729afc2020-07-30 23:12:17 +08004126 uint8_t buf1[MAXPACKET] = {};
4127 uint8_t buf2[MAXPACKET] = {};
Sehee Park2c118782019-05-07 13:02:45 +09004128 int rcode;
Luke Huang5729afc2020-07-30 23:12:17 +08004129 int res2 = getAsyncResponse(fd2, &rcode, buf2, MAXPACKET);
4130 int res1 = getAsyncResponse(fd1, &rcode, buf1, MAXPACKET);
4131 // If API level >= 30 (R+), these queries should be blocked.
4132 if (isAtLeastR) {
4133 EXPECT_EQ(res2, -ECONNREFUSED);
4134 EXPECT_EQ(res1, -ECONNREFUSED);
4135 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, EAI_SYSTEM, "howdy.example.com", {});
4136 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, EAI_SYSTEM, "howdy.example.com", {});
4137 } else {
4138 EXPECT_GT(res2, 0);
4139 EXPECT_EQ("::1.2.3.4", toString(buf2, res2, AF_INET6));
4140 EXPECT_GT(res1, 0);
4141 EXPECT_EQ("1.2.3.4", toString(buf1, res1, AF_INET));
4142 // To avoid flaky test, do not evaluate DnsEvent since event order is not guaranteed.
4143 }
Sehee Park2c118782019-05-07 13:02:45 +09004144}
Mike Yua772c202019-09-23 17:47:21 +08004145
Ken Chenbc481b82020-05-21 23:30:01 +08004146TEST_F(ResolverTest, EnforceDnsUid) {
4147 SKIP_IF_BPF_NOT_SUPPORTED;
4148
4149 constexpr char listen_addr1[] = "127.0.0.4";
4150 constexpr char listen_addr2[] = "::1";
4151 constexpr char host_name[] = "howdy.example.com.";
4152 const std::vector<DnsRecord> records = {
4153 {host_name, ns_type::ns_t_a, "1.2.3.4"},
4154 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
4155 };
4156 INetd* netdService = mDnsClient.netdService();
4157
4158 test::DNSResponder dns1(listen_addr1);
4159 test::DNSResponder dns2(listen_addr2);
4160 StartDns(dns1, records);
4161 StartDns(dns2, records);
4162
4163 // switch uid of DNS queries from applications to AID_DNS
4164 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4165 parcel.servers = {listen_addr1, listen_addr2};
4166 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk());
4167
4168 uint8_t buf[MAXPACKET] = {};
Luke Huang5729afc2020-07-30 23:12:17 +08004169 uint8_t buf2[MAXPACKET] = {};
Ken Chenbc481b82020-05-21 23:30:01 +08004170 int rcode;
4171 {
4172 ScopeBlockedUIDRule scopeBlockUidRule(netdService, TEST_UID);
4173 // Dns Queries should be blocked
Luke Huang5729afc2020-07-30 23:12:17 +08004174 const int fd1 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_a, 0);
4175 const int fd2 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_aaaa, 0);
Ken Chenbc481b82020-05-21 23:30:01 +08004176 EXPECT_TRUE(fd1 != -1);
4177 EXPECT_TRUE(fd2 != -1);
4178
Luke Huang5729afc2020-07-30 23:12:17 +08004179 const int res2 = getAsyncResponse(fd2, &rcode, buf2, MAXPACKET);
4180 const int res1 = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
4181 // If API level >= 30 (R+), the query should be blocked.
4182 if (isAtLeastR) {
4183 EXPECT_EQ(res2, -ECONNREFUSED);
4184 EXPECT_EQ(res1, -ECONNREFUSED);
4185 } else {
4186 EXPECT_GT(res2, 0);
4187 EXPECT_EQ("::1.2.3.4", toString(buf2, res2, AF_INET6));
4188 EXPECT_GT(res1, 0);
4189 EXPECT_EQ("1.2.3.4", toString(buf, res1, AF_INET));
4190 }
Ken Chenbc481b82020-05-21 23:30:01 +08004191 }
4192
Luke Huang5729afc2020-07-30 23:12:17 +08004193 memset(buf, 0, MAXPACKET);
Ken Chenbc481b82020-05-21 23:30:01 +08004194 parcel.resolverOptions.enforceDnsUid = true;
4195 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk());
4196 {
4197 ScopeBlockedUIDRule scopeBlockUidRule(netdService, TEST_UID);
4198 // Dns Queries should NOT be blocked
4199 int fd1 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_a, 0);
4200 int fd2 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_aaaa, 0);
4201 EXPECT_TRUE(fd1 != -1);
4202 EXPECT_TRUE(fd2 != -1);
4203
4204 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
4205 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
4206
4207 memset(buf, 0, MAXPACKET);
4208 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
4209 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
4210
4211 // @TODO: So far we know that uid of DNS queries are no more set to DNS requester. But we
4212 // don't check if they are actually being set to AID_DNS, because system uids are always
4213 // allowed in bpf_owner_match(). Audit by firewallSetUidRule(AID_DNS) + sending queries is
4214 // infeasible. Fix it if the behavior of bpf_owner_match() is changed in the future, or if
4215 // we have better idea to deal with this.
4216 }
4217}
4218
Mike Yua772c202019-09-23 17:47:21 +08004219TEST_F(ResolverTest, ConnectTlsServerTimeout) {
Mike Yu61d17262020-02-15 18:56:22 +08004220 const std::string kDotConnectTimeoutMsFlag(
4221 "persist.device_config.netd_native.dot_connect_timeout_ms");
Mike Yu40e67072019-10-09 21:14:09 +08004222 constexpr int expectedTimeout = 1000;
4223 constexpr char hostname1[] = "query1.example.com.";
4224 constexpr char hostname2[] = "query2.example.com.";
Mike Yua772c202019-09-23 17:47:21 +08004225 const std::vector<DnsRecord> records = {
Mike Yu40e67072019-10-09 21:14:09 +08004226 {hostname1, ns_type::ns_t_a, "1.2.3.4"},
4227 {hostname2, ns_type::ns_t_a, "1.2.3.5"},
Mike Yua772c202019-09-23 17:47:21 +08004228 };
4229
4230 test::DNSResponder dns;
4231 StartDns(dns, records);
Mike Yu40e67072019-10-09 21:14:09 +08004232 test::DnsTlsFrontend tls;
Mike Yua772c202019-09-23 17:47:21 +08004233 ASSERT_TRUE(tls.startServer());
4234
Mike Yu40e67072019-10-09 21:14:09 +08004235 // The resolver will adjust the timeout value to 1000ms since the value is too small.
4236 ScopedSystemProperties scopedSystemProperties(kDotConnectTimeoutMsFlag, "100");
Mike Yua772c202019-09-23 17:47:21 +08004237
Mike Yu40e67072019-10-09 21:14:09 +08004238 // Set up resolver to opportunistic mode with the default configuration.
Mike Yu8ac63402019-12-02 15:28:38 +08004239 const ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
Mike Yu40e67072019-10-09 21:14:09 +08004240 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
Mike Yua772c202019-09-23 17:47:21 +08004241 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09004242 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yua772c202019-09-23 17:47:21 +08004243 tls.clearQueries();
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09004244 dns.clearQueries();
Mike Yua772c202019-09-23 17:47:21 +08004245
4246 // The server becomes unresponsive to the handshake request.
4247 tls.setHangOnHandshakeForTesting(true);
4248
4249 // Expect the things happening in getaddrinfo():
4250 // 1. Connect to the private DNS server.
4251 // 2. SSL handshake times out.
4252 // 3. Fallback to UDP transport, and then get the answer.
Mike Yu40e67072019-10-09 21:14:09 +08004253 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4254 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(hostname1, nullptr, hints);
Mike Yua772c202019-09-23 17:47:21 +08004255
Mike Yu40e67072019-10-09 21:14:09 +08004256 EXPECT_NE(nullptr, result);
Mike Yua772c202019-09-23 17:47:21 +08004257 EXPECT_EQ(0, tls.queries());
Mike Yu40e67072019-10-09 21:14:09 +08004258 EXPECT_EQ(1U, GetNumQueries(dns, hostname1));
4259 EXPECT_EQ(records.at(0).addr, ToString(result));
Mike Yua772c202019-09-23 17:47:21 +08004260
Mike Yu40e67072019-10-09 21:14:09 +08004261 // A loose upper bound is set by adding 2000ms buffer time. Theoretically, getaddrinfo()
4262 // should just take a bit more than expetTimeout milliseconds.
4263 EXPECT_GE(timeTakenMs, expectedTimeout);
4264 EXPECT_LE(timeTakenMs, expectedTimeout + 2000);
4265
4266 // Set the server to be responsive. Verify that the resolver will attempt to reconnect
4267 // to the server and then get the result within the timeout.
4268 tls.setHangOnHandshakeForTesting(false);
4269 std::tie(result, timeTakenMs) = safe_getaddrinfo_time_taken(hostname2, nullptr, hints);
4270
4271 EXPECT_NE(nullptr, result);
Luke Huang0a0870d2020-02-12 20:41:10 +08004272 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yu40e67072019-10-09 21:14:09 +08004273 EXPECT_EQ(1U, GetNumQueries(dns, hostname2));
4274 EXPECT_EQ(records.at(1).addr, ToString(result));
4275
4276 EXPECT_LE(timeTakenMs, expectedTimeout);
Mike Yua772c202019-09-23 17:47:21 +08004277}
Hungming Chenbb90ab32019-10-28 18:20:31 +08004278
Ken Chen766feae2019-10-30 15:13:44 +08004279TEST_F(ResolverTest, FlushNetworkCache) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004280 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004281 test::DNSResponder dns;
4282 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4283 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4284
4285 const hostent* result = gethostbyname("hello");
4286 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4287
4288 // get result from cache
4289 result = gethostbyname("hello");
4290 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4291
4292 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4293
4294 result = gethostbyname("hello");
4295 EXPECT_EQ(2U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4296}
4297
4298TEST_F(ResolverTest, FlushNetworkCache_random) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004299 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004300 constexpr int num_flush = 10;
4301 constexpr int num_queries = 20;
4302 test::DNSResponder dns;
4303 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4304 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4305 const addrinfo hints = {.ai_family = AF_INET};
4306
4307 std::thread t([this]() {
4308 for (int i = 0; i < num_flush; ++i) {
4309 unsigned delay = arc4random_uniform(10 * 1000); // 10ms
4310 usleep(delay);
4311 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4312 }
4313 });
4314
4315 for (int i = 0; i < num_queries; ++i) {
4316 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4317 EXPECT_TRUE(result != nullptr);
4318 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4319 }
4320 t.join();
4321}
4322
4323// flush cache while one query is wait-for-response, another is pending.
4324TEST_F(ResolverTest, FlushNetworkCache_concurrent) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004325 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004326 const char* listen_addr1 = "127.0.0.9";
4327 const char* listen_addr2 = "127.0.0.10";
4328 test::DNSResponder dns1(listen_addr1);
4329 test::DNSResponder dns2(listen_addr2);
4330 StartDns(dns1, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4331 StartDns(dns2, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4332 addrinfo hints = {.ai_family = AF_INET};
4333
4334 // step 1: set server#1 into deferred responding mode
4335 dns1.setDeferredResp(true);
4336 std::thread t1([&listen_addr1, &hints, this]() {
4337 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr1}));
4338 // step 3: query
4339 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4340 // step 9: check result
4341 EXPECT_TRUE(result != nullptr);
4342 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4343 });
4344
4345 // step 2: wait for the query to reach the server
4346 while (GetNumQueries(dns1, kHelloExampleCom) == 0) {
4347 usleep(1000); // 1ms
4348 }
4349
4350 std::thread t2([&listen_addr2, &hints, &dns2, this]() {
4351 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr2}));
4352 // step 5: query (should be blocked in resolver)
4353 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4354 // step 7: check result
4355 EXPECT_TRUE(result != nullptr);
4356 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4357 EXPECT_EQ(1U, GetNumQueriesForType(dns2, ns_type::ns_t_a, kHelloExampleCom));
4358 });
4359
4360 // step 4: wait a bit for the 2nd query to enter pending state
4361 usleep(100 * 1000); // 100ms
4362 // step 6: flush cache (will unblock pending queries)
4363 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4364 t2.join();
4365
4366 // step 8: resume server#1
4367 dns1.setDeferredResp(false);
4368 t1.join();
4369
4370 // step 10: verify if result is correctly cached
4371 dns2.clearQueries();
4372 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4373 EXPECT_EQ(0U, GetNumQueries(dns2, kHelloExampleCom));
4374 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4375}
4376
waynema29253052019-08-20 11:26:08 +08004377// TODO: Perhaps to have a boundary conditions test for TCP and UDP.
4378TEST_F(ResolverTest, TcpQueryWithOversizePayload) {
4379 test::DNSResponder dns;
4380 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4381 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4382
4383 int fd = dns_open_proxy();
4384 ASSERT_TRUE(fd > 0);
4385
4386 // Sending DNS query over TCP once the packet sizes exceed 512 bytes.
4387 // The raw data is combined with Question section and Additional section
4388 // Question section : query "hello.example.com", type A, class IN
4389 // Additional section : type OPT (41), Option PADDING, Option Length 546
4390 // Padding option which allows DNS clients and servers to artificially
4391 // increase the size of a DNS message by a variable number of bytes.
4392 // See also RFC7830, section 3
4393 const std::string query =
4394 "+c0BAAABAAAAAAABBWhlbGxvB2V4YW1wbGUDY29tAAABAAEAACkgAAAAgAACJgAMAiIAAAAAAAAAAAAAAAAAA"
4395 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4396 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4397 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4398 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4399 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4400 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4401 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4402 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4403 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
4404 const std::string cmd =
4405 "resnsend " + std::to_string(TEST_NETID) + " 0 " /* ResNsendFlags */ + query + '\0';
4406 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
4407 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
4408 expectAnswersValid(fd, AF_INET, kHelloExampleComAddrV4);
4409 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom));
4410 EXPECT_EQ(0U, GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom));
4411}
4412
Ken Chen99344882020-01-01 14:59:38 +08004413TEST_F(ResolverTest, TruncatedRspMode) {
4414 constexpr char listen_addr[] = "127.0.0.4";
4415 constexpr char listen_addr2[] = "127.0.0.5";
4416 constexpr char listen_srv[] = "53";
4417
4418 test::DNSResponder dns(listen_addr, listen_srv, static_cast<ns_rcode>(-1));
4419 test::DNSResponder dns2(listen_addr2, listen_srv, static_cast<ns_rcode>(-1));
4420 // dns supports UDP only, dns2 support UDP and TCP
4421 dns.setResponseProbability(0.0, IPPROTO_TCP);
4422 StartDns(dns, kLargeCnameChainRecords);
4423 StartDns(dns2, kLargeCnameChainRecords);
4424
4425 const struct TestConfig {
4426 const std::optional<int32_t> tcMode;
4427 const bool ret;
4428 const unsigned numQueries;
4429 std::string asParameters() const {
4430 return StringPrintf("tcMode: %d, ret: %s, numQueries: %u", tcMode.value_or(-1),
4431 ret ? "true" : "false", numQueries);
4432 }
4433 } testConfigs[]{
4434 // clang-format off
4435 {std::nullopt, true, 0}, /* mode unset */
4436 {aidl::android::net::IDnsResolver::TC_MODE_DEFAULT, true, 0}, /* default mode */
4437 {aidl::android::net::IDnsResolver::TC_MODE_UDP_TCP, true, 1}, /* alternative mode */
4438 {-666, false, 1}, /* invalid input */
4439 // clang-format on
4440 };
4441
4442 for (const auto& config : testConfigs) {
4443 SCOPED_TRACE(config.asParameters());
4444
4445 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4446 parcel.servers = {listen_addr, listen_addr2};
4447 if (config.tcMode) {
Ken Chena6ac2a62020-04-07 17:25:56 +08004448 parcel.resolverOptions.tcMode = config.tcMode.value();
Ken Chen99344882020-01-01 14:59:38 +08004449 }
4450 ASSERT_EQ(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk(), config.ret);
4451
4452 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4453 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4454 ASSERT_TRUE(result != nullptr);
4455 EXPECT_EQ(ToString(result), kHelloExampleComAddrV4);
4456 // TC_MODE_DEFAULT: resolver retries on TCP-only on each name server.
4457 // TC_MODE_UDP_TCP: resolver retries on TCP on the same server, falls back to UDP from next.
4458 ASSERT_EQ(GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom), 1U);
4459 ASSERT_EQ(GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom), 1U);
4460 ASSERT_EQ(GetNumQueriesForProtocol(dns2, IPPROTO_UDP, kHelloExampleCom), config.numQueries);
4461 ASSERT_EQ(GetNumQueriesForProtocol(dns2, IPPROTO_TCP, kHelloExampleCom), 1U);
4462
4463 dns.clearQueries();
4464 dns2.clearQueries();
4465 ASSERT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
Mike Yu61d17262020-02-15 18:56:22 +08004466
4467 // Clear the stats to make the resolver always choose the same server for the first query.
4468 parcel.servers.clear();
4469 parcel.tlsServers.clear();
4470 ASSERT_EQ(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk(), config.ret);
Ken Chen99344882020-01-01 14:59:38 +08004471 }
4472}
4473
Mike Yu153b5b82020-03-04 19:53:54 +08004474TEST_F(ResolverTest, RepeatedSetup_ResolverStatusRemains) {
4475 constexpr char unusable_listen_addr[] = "127.0.0.3";
4476 constexpr char listen_addr[] = "127.0.0.4";
4477 constexpr char hostname[] = "a.hello.query.";
4478 const auto repeatedSetResolversFromParcel = [&](const ResolverParamsParcel& parcel) {
4479 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4480 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4481 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4482 };
4483
4484 test::DNSResponder dns(listen_addr);
4485 StartDns(dns, {{hostname, ns_type::ns_t_a, "1.2.3.3"}});
4486 test::DnsTlsFrontend tls1(listen_addr, "853", listen_addr, "53");
4487 ASSERT_TRUE(tls1.startServer());
4488
4489 // Private DNS off mode.
4490 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4491 parcel.servers = {unusable_listen_addr, listen_addr};
4492 parcel.tlsServers.clear();
4493 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4494
4495 // Send a query.
4496 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4497 EXPECT_NE(safe_getaddrinfo(hostname, nullptr, &hints), nullptr);
4498
4499 // Check the stats as expected.
4500 const std::vector<NameserverStats> expectedCleartextDnsStats = {
4501 NameserverStats(unusable_listen_addr).setInternalErrors(1),
4502 NameserverStats(listen_addr).setSuccesses(1),
4503 };
Mike Yu61d17262020-02-15 18:56:22 +08004504 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu153b5b82020-03-04 19:53:54 +08004505 EXPECT_EQ(GetNumQueries(dns, hostname), 1U);
4506
4507 // The stats is supposed to remain as long as the list of cleartext DNS servers is unchanged.
4508 static const struct TestConfig {
4509 std::vector<std::string> servers;
4510 std::vector<std::string> tlsServers;
4511 std::string tlsName;
4512 } testConfigs[] = {
4513 // Private DNS opportunistic mode.
4514 {{listen_addr, unusable_listen_addr}, {listen_addr, unusable_listen_addr}, ""},
4515 {{unusable_listen_addr, listen_addr}, {unusable_listen_addr, listen_addr}, ""},
4516
4517 // Private DNS strict mode.
4518 {{listen_addr, unusable_listen_addr}, {"127.0.0.100"}, kDefaultPrivateDnsHostName},
4519 {{unusable_listen_addr, listen_addr}, {"127.0.0.100"}, kDefaultPrivateDnsHostName},
4520
4521 // Private DNS off mode.
4522 {{unusable_listen_addr, listen_addr}, {}, ""},
4523 {{listen_addr, unusable_listen_addr}, {}, ""},
4524 };
4525
4526 for (const auto& config : testConfigs) {
4527 SCOPED_TRACE(fmt::format("testConfig: [{}] [{}] [{}]", fmt::join(config.servers, ","),
4528 fmt::join(config.tlsServers, ","), config.tlsName));
4529 parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4530 parcel.servers = config.servers;
4531 parcel.tlsServers = config.tlsServers;
4532 parcel.tlsName = config.tlsName;
4533 repeatedSetResolversFromParcel(parcel);
Mike Yu61d17262020-02-15 18:56:22 +08004534 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu153b5b82020-03-04 19:53:54 +08004535
4536 // The stats remains when the list of search domains changes.
4537 parcel.domains.push_back("tmp.domains");
4538 repeatedSetResolversFromParcel(parcel);
Mike Yu61d17262020-02-15 18:56:22 +08004539 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu153b5b82020-03-04 19:53:54 +08004540
4541 // The stats remains when the parameters change (except maxSamples).
4542 parcel.sampleValiditySeconds++;
4543 parcel.successThreshold++;
4544 parcel.minSamples++;
4545 parcel.baseTimeoutMsec++;
4546 parcel.retryCount++;
4547 repeatedSetResolversFromParcel(parcel);
Mike Yu61d17262020-02-15 18:56:22 +08004548 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu153b5b82020-03-04 19:53:54 +08004549 }
4550
4551 // The cache remains.
4552 EXPECT_NE(safe_getaddrinfo(hostname, nullptr, &hints), nullptr);
4553 EXPECT_EQ(GetNumQueries(dns, hostname), 1U);
4554}
4555
4556TEST_F(ResolverTest, RepeatedSetup_NoRedundantPrivateDnsValidation) {
4557 const std::string addr1 = getUniqueIPv4Address(); // For a workable DNS server.
4558 const std::string addr2 = getUniqueIPv4Address(); // For an unresponsive DNS server.
4559 const std::string unusable_addr = getUniqueIPv4Address();
Mike Yubc4b9502020-03-20 13:14:00 +08004560 const auto waitForPrivateDnsStateUpdated = []() {
4561 // A buffer time for the PrivateDnsConfiguration instance to update its map,
4562 // mPrivateDnsValidateThreads, which is used for tracking validation threads.
4563 // Since there is a time gap between when PrivateDnsConfiguration reports
4564 // onPrivateDnsValidationEvent and when PrivateDnsConfiguration updates the map, this is a
4565 // workaround to avoid the test starts a subsequent resolver setup during the time gap.
4566 // TODO: Report onPrivateDnsValidationEvent after all the relevant updates are complete.
4567 // Reference to b/152009023.
4568 std::this_thread::sleep_for(20ms);
4569 };
Mike Yu153b5b82020-03-04 19:53:54 +08004570
4571 test::DNSResponder dns1(addr1);
4572 test::DNSResponder dns2(addr2);
4573 StartDns(dns1, {});
4574 StartDns(dns2, {});
4575 test::DnsTlsFrontend workableTls(addr1, "853", addr1, "53");
4576 test::DnsTlsFrontend unresponsiveTls(addr2, "853", addr2, "53");
4577 unresponsiveTls.setHangOnHandshakeForTesting(true);
4578 ASSERT_TRUE(workableTls.startServer());
4579 ASSERT_TRUE(unresponsiveTls.startServer());
4580
4581 // First setup.
4582 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4583 parcel.servers = {addr1, addr2, unusable_addr};
4584 parcel.tlsServers = {addr1, addr2, unusable_addr};
4585 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4586
4587 // Check the validation results.
4588 EXPECT_TRUE(WaitForPrivateDnsValidation(workableTls.listen_address(), true));
4589 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4590 EXPECT_EQ(unresponsiveTls.acceptConnectionsCount(), 1); // The validation is still in progress.
4591
4592 static const struct TestConfig {
4593 std::vector<std::string> tlsServers;
4594 std::string tlsName;
4595 } testConfigs[] = {
4596 {{addr1, addr2, unusable_addr}, ""},
4597 {{unusable_addr, addr1, addr2}, ""},
4598 {{unusable_addr, addr1, addr2}, kDefaultPrivateDnsHostName},
4599 {{addr1, addr2, unusable_addr}, kDefaultPrivateDnsHostName},
4600 };
4601
4602 std::string TlsNameLastTime;
4603 for (const auto& config : testConfigs) {
4604 SCOPED_TRACE(fmt::format("testConfig: [{}] [{}]", fmt::join(config.tlsServers, ","),
4605 config.tlsName));
4606 parcel.servers = config.tlsServers;
4607 parcel.tlsServers = config.tlsServers;
4608 parcel.tlsName = config.tlsName;
4609 parcel.caCertificate = config.tlsName.empty() ? "" : kCaCert;
4610
4611 const bool dnsModeChanged = (TlsNameLastTime != config.tlsName);
Mike Yubc4b9502020-03-20 13:14:00 +08004612
4613 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004614 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4615
4616 for (const auto& serverAddr : parcel.tlsServers) {
4617 SCOPED_TRACE(serverAddr);
4618 if (serverAddr == workableTls.listen_address()) {
4619 if (dnsModeChanged) {
4620 // In despite of the identical IP address, the server is regarded as a different
4621 // server when DnsTlsServer.name is different. The resolver treats it as a
4622 // different object and begins the validation process.
4623 EXPECT_TRUE(WaitForPrivateDnsValidation(serverAddr, true));
4624 }
4625 } else if (serverAddr == unresponsiveTls.listen_address()) {
4626 // No revalidation needed for the server which have been marked as in_progesss.
4627 } else {
4628 // Must be unusable_addr.
4629 // In opportunistic mode, when a validation for a private DNS server fails, the
4630 // resolver just marks the server as failed and doesn't re-evaluate it, but the
4631 // server can be re-evaluated when setResolverConfiguration() is called.
4632 // However, in strict mode, the resolver automatically re-evaluates the server and
4633 // marks the server as in_progress until the validation succeeds, so repeated setup
4634 // makes no effect.
4635 if (dnsModeChanged || config.tlsName.empty() /* not in strict mode */) {
4636 EXPECT_TRUE(WaitForPrivateDnsValidation(serverAddr, false));
4637 }
4638 }
4639 }
4640
4641 // Repeated setups make no effect in strict mode.
Mike Yubc4b9502020-03-20 13:14:00 +08004642 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004643 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4644 if (config.tlsName.empty()) {
4645 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4646 }
Mike Yubc4b9502020-03-20 13:14:00 +08004647 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004648 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4649 if (config.tlsName.empty()) {
4650 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4651 }
4652
4653 EXPECT_EQ(unresponsiveTls.acceptConnectionsCount(), 1);
4654
4655 TlsNameLastTime = config.tlsName;
4656 }
4657
4658 // Check that all the validation results are caught.
4659 // Note: it doesn't mean no validation being in progress.
4660 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr1));
4661 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr2));
4662 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(unusable_addr));
4663}
4664
4665TEST_F(ResolverTest, RepeatedSetup_KeepChangingPrivateDnsServers) {
4666 enum TlsServerState { WORKING, UNSUPPORTED, UNRESPONSIVE };
4667 const std::string addr1 = getUniqueIPv4Address();
4668 const std::string addr2 = getUniqueIPv4Address();
Mike Yu9a185882020-03-25 16:02:36 +08004669 const auto waitForPrivateDnsStateUpdated = []() {
4670 // A buffer time for PrivateDnsConfiguration to update its state. It prevents this test
4671 // being flaky. See b/152009023 for the reason.
4672 std::this_thread::sleep_for(20ms);
4673 };
Mike Yu153b5b82020-03-04 19:53:54 +08004674
4675 test::DNSResponder dns1(addr1);
4676 test::DNSResponder dns2(addr2);
4677 StartDns(dns1, {});
4678 StartDns(dns2, {});
4679 test::DnsTlsFrontend tls1(addr1, "853", addr1, "53");
4680 test::DnsTlsFrontend tls2(addr2, "853", addr2, "53");
4681 ASSERT_TRUE(tls1.startServer());
4682 ASSERT_TRUE(tls2.startServer());
4683
4684 static const struct TestConfig {
4685 std::string tlsServer;
4686 std::string tlsName;
4687 bool expectNothingHappenWhenServerUnsupported;
4688 bool expectNothingHappenWhenServerUnresponsive;
4689 std::string asTestName() const {
4690 return fmt::format("{}, {}, {}, {}", tlsServer, tlsName,
4691 expectNothingHappenWhenServerUnsupported,
4692 expectNothingHappenWhenServerUnresponsive);
4693 }
4694 } testConfigs[] = {
4695 {{addr1}, "", false, false},
4696 {{addr2}, "", false, false},
4697 {{addr1}, "", false, true},
4698 {{addr2}, "", false, true},
4699 {{addr1}, kDefaultPrivateDnsHostName, false, true},
4700 {{addr2}, kDefaultPrivateDnsHostName, false, true},
4701 {{addr1}, kDefaultPrivateDnsHostName, true, true},
4702 {{addr2}, kDefaultPrivateDnsHostName, true, true},
4703
4704 // There's no new validation to start because there are already two validation threads
4705 // running (one is for addr1, the other is for addr2). This is because the comparator
4706 // doesn't compare DnsTlsServer.name. Keep the design as-is until it's known to be
4707 // harmful.
4708 {{addr1}, "", true, true},
4709 {{addr2}, "", true, true},
4710 {{addr1}, "", true, true},
4711 {{addr2}, "", true, true},
4712 };
4713
4714 for (const auto& serverState : {WORKING, UNSUPPORTED, UNRESPONSIVE}) {
4715 int testIndex = 0;
4716 for (const auto& config : testConfigs) {
4717 SCOPED_TRACE(fmt::format("serverState:{} testIndex:{} testConfig:[{}]", serverState,
4718 testIndex++, config.asTestName()));
4719 auto& tls = (config.tlsServer == addr1) ? tls1 : tls2;
4720
4721 if (serverState == UNSUPPORTED && tls.running()) ASSERT_TRUE(tls.stopServer());
4722 if (serverState != UNSUPPORTED && !tls.running()) ASSERT_TRUE(tls.startServer());
4723
4724 tls.setHangOnHandshakeForTesting(serverState == UNRESPONSIVE);
4725 const int connectCountsBefore = tls.acceptConnectionsCount();
4726
Mike Yu9a185882020-03-25 16:02:36 +08004727 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004728 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4729 parcel.servers = {config.tlsServer};
4730 parcel.tlsServers = {config.tlsServer};
4731 parcel.tlsName = config.tlsName;
4732 parcel.caCertificate = config.tlsName.empty() ? "" : kCaCert;
4733 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4734
4735 if (serverState == WORKING) {
4736 EXPECT_TRUE(WaitForPrivateDnsValidation(config.tlsServer, true));
4737 } else if (serverState == UNSUPPORTED) {
4738 if (config.expectNothingHappenWhenServerUnsupported) {
4739 // It's possible that the resolver hasn't yet started to
4740 // connect. Wait a while.
4741 // TODO: See if we can get rid of the hard waiting time, such as comparing
4742 // the CountDiff across two tests.
4743 std::this_thread::sleep_for(100ms);
4744 EXPECT_EQ(tls.acceptConnectionsCount(), connectCountsBefore);
4745 } else {
4746 EXPECT_TRUE(WaitForPrivateDnsValidation(config.tlsServer, false));
4747 }
4748 } else {
4749 // Must be UNRESPONSIVE.
4750 // DnsTlsFrontend is the only signal for checking whether or not the resolver starts
4751 // another validation when the server is unresponsive.
4752 const int expectCountDiff =
4753 config.expectNothingHappenWhenServerUnresponsive ? 0 : 1;
4754 if (expectCountDiff == 0) {
4755 // It's possible that the resolver hasn't yet started to
4756 // connect. Wait a while.
4757 std::this_thread::sleep_for(100ms);
4758 }
4759 const auto condition = [&]() {
4760 return tls.acceptConnectionsCount() == connectCountsBefore + expectCountDiff;
4761 };
4762 EXPECT_TRUE(PollForCondition(condition));
4763 }
4764 }
4765
4766 // Set to off mode to reset the PrivateDnsConfiguration state.
4767 ResolverParamsParcel setupOffmode = DnsResponderClient::GetDefaultResolverParamsParcel();
4768 setupOffmode.tlsServers.clear();
4769 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(setupOffmode));
4770 }
4771
4772 // Check that all the validation results are caught.
4773 // Note: it doesn't mean no validation being in progress.
4774 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr1));
4775 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr2));
4776}
4777
Ken Chen26dc2b02020-06-16 18:49:39 +08004778TEST_F(ResolverTest, PermissionCheckOnCertificateInjection) {
4779 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4780 parcel.caCertificate = kCaCert;
4781 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk());
4782
4783 for (const uid_t uid : {AID_SYSTEM, TEST_UID}) {
4784 ScopedChangeUID scopedChangeUID(uid);
4785 auto status = mDnsClient.resolvService()->setResolverConfiguration(parcel);
4786 EXPECT_EQ(status.getExceptionCode(), EX_SECURITY);
4787 }
4788}
4789
Hungming Chenbb90ab32019-10-28 18:20:31 +08004790// Parameterized tests.
4791// TODO: Merge the existing tests as parameterized test if possible.
4792// TODO: Perhaps move parameterized tests to an independent file.
4793enum class CallType { GETADDRINFO, GETHOSTBYNAME };
4794class ResolverParameterizedTest : public ResolverTest,
Hungming Chen63779052019-10-30 15:06:13 +08004795 public testing::WithParamInterface<CallType> {
4796 protected:
Hungming Chen22617fd2019-12-06 12:15:45 +08004797 void VerifyQueryHelloExampleComV4(const test::DNSResponder& dns, const CallType calltype,
4798 const bool verifyNumQueries = true) {
Hungming Chen63779052019-10-30 15:06:13 +08004799 if (calltype == CallType::GETADDRINFO) {
4800 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4801 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4802 ASSERT_TRUE(result != nullptr);
4803 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4804 } else if (calltype == CallType::GETHOSTBYNAME) {
4805 const hostent* result = gethostbyname("hello");
4806 ASSERT_TRUE(result != nullptr);
4807 ASSERT_EQ(4, result->h_length);
4808 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
4809 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4810 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
4811 } else {
4812 FAIL() << "Unsupported call type: " << static_cast<uint32_t>(calltype);
4813 }
Hungming Chen22617fd2019-12-06 12:15:45 +08004814 if (verifyNumQueries) EXPECT_EQ(1U, GetNumQueries(dns, kHelloExampleCom));
Hungming Chen63779052019-10-30 15:06:13 +08004815 }
4816};
Hungming Chenbb90ab32019-10-28 18:20:31 +08004817
Hungming Chen63779052019-10-30 15:06:13 +08004818INSTANTIATE_TEST_SUITE_P(QueryCallTest, ResolverParameterizedTest,
Hungming Chenbb90ab32019-10-28 18:20:31 +08004819 testing::Values(CallType::GETADDRINFO, CallType::GETHOSTBYNAME),
4820 [](const testing::TestParamInfo<CallType>& info) {
Hungming Chenbb90ab32019-10-28 18:20:31 +08004821 switch (info.param) {
4822 case CallType::GETADDRINFO:
Hungming Chen63779052019-10-30 15:06:13 +08004823 return "GetAddrInfo";
Hungming Chenbb90ab32019-10-28 18:20:31 +08004824 case CallType::GETHOSTBYNAME:
Hungming Chen63779052019-10-30 15:06:13 +08004825 return "GetHostByName";
Hungming Chenbb90ab32019-10-28 18:20:31 +08004826 default:
Hungming Chen63779052019-10-30 15:06:13 +08004827 return "InvalidParameter"; // Should not happen.
Hungming Chenbb90ab32019-10-28 18:20:31 +08004828 }
Hungming Chenbb90ab32019-10-28 18:20:31 +08004829 });
4830
4831TEST_P(ResolverParameterizedTest, AuthoritySectionAndAdditionalSection) {
4832 // DNS response may have more information in authority section and additional section.
4833 // Currently, getanswer() of packages/modules/DnsResolver/getaddrinfo.cpp doesn't parse the
4834 // content of authority section and additional section. Test these sections if they crash
4835 // the resolver, just in case. See also RFC 1035 section 4.1.
4836 const auto& calltype = GetParam();
4837 test::DNSHeader header(kDefaultDnsHeader);
4838
4839 // Create a DNS response which has a authoritative nameserver record in authority
4840 // section and its relevant address record in additional section.
4841 //
4842 // Question
4843 // hello.example.com. IN A
4844 // Answer
4845 // hello.example.com. IN A 1.2.3.4
4846 // Authority:
4847 // hello.example.com. IN NS ns1.example.com.
4848 // Additional:
4849 // ns1.example.com. IN A 5.6.7.8
4850 //
4851 // A response may have only question, answer, and authority section. Current testing response
4852 // should be able to cover this condition.
4853
4854 // Question section.
4855 test::DNSQuestion question{
4856 .qname = {.name = kHelloExampleCom},
4857 .qtype = ns_type::ns_t_a,
4858 .qclass = ns_c_in,
4859 };
4860 header.questions.push_back(std::move(question));
4861
4862 // Answer section.
4863 test::DNSRecord recordAnswer{
4864 .name = {.name = kHelloExampleCom},
4865 .rtype = ns_type::ns_t_a,
4866 .rclass = ns_c_in,
4867 .ttl = 0, // no cache
4868 };
Hungming Chen63779052019-10-30 15:06:13 +08004869 EXPECT_TRUE(test::DNSResponder::fillRdata(kHelloExampleComAddrV4, recordAnswer));
Hungming Chenbb90ab32019-10-28 18:20:31 +08004870 header.answers.push_back(std::move(recordAnswer));
4871
4872 // Authority section.
4873 test::DNSRecord recordAuthority{
4874 .name = {.name = kHelloExampleCom},
4875 .rtype = ns_type::ns_t_ns,
4876 .rclass = ns_c_in,
4877 .ttl = 0, // no cache
4878 };
4879 EXPECT_TRUE(test::DNSResponder::fillRdata("ns1.example.com.", recordAuthority));
4880 header.authorities.push_back(std::move(recordAuthority));
4881
4882 // Additional section.
4883 test::DNSRecord recordAdditional{
4884 .name = {.name = "ns1.example.com."},
4885 .rtype = ns_type::ns_t_a,
4886 .rclass = ns_c_in,
4887 .ttl = 0, // no cache
4888 };
4889 EXPECT_TRUE(test::DNSResponder::fillRdata("5.6.7.8", recordAdditional));
4890 header.additionals.push_back(std::move(recordAdditional));
4891
4892 // Start DNS server.
4893 test::DNSResponder dns(test::DNSResponder::MappingType::DNS_HEADER);
4894 dns.addMappingDnsHeader(kHelloExampleCom, ns_type::ns_t_a, header);
4895 ASSERT_TRUE(dns.startServer());
4896 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4897 dns.clearQueries();
4898
4899 // Expect that get the address and the resolver doesn't crash.
Hungming Chen63779052019-10-30 15:06:13 +08004900 VerifyQueryHelloExampleComV4(dns, calltype);
4901}
4902
4903TEST_P(ResolverParameterizedTest, MessageCompression) {
4904 const auto& calltype = GetParam();
4905
4906 // The response with compressed domain name by a pointer. See RFC 1035 section 4.1.4.
4907 //
4908 // Ignoring the other fields of the message, the domain name of question section and answer
4909 // section are presented as:
4910 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4911 // 12 | 5 | h |
4912 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4913 // 14 | e | l |
4914 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4915 // 16 | l | o |
4916 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4917 // 18 | 7 | e |
4918 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4919 // 20 | x | a |
4920 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4921 // 22 | m | p |
4922 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4923 // 24 | l | e |
4924 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4925 // 26 | 3 | c |
4926 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4927 // 28 | o | m |
4928 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4929 // 30 | 0 | ... |
4930 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4931 //
4932 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4933 // 35 | 1 1| 12 |
4934 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4935 const std::vector<uint8_t> kResponseAPointer = {
4936 /* Header */
4937 0x00, 0x00, /* Transaction ID: 0x0000 */
4938 0x81, 0x80, /* Flags: qr rd ra */
4939 0x00, 0x01, /* Questions: 1 */
4940 0x00, 0x01, /* Answer RRs: 1 */
4941 0x00, 0x00, /* Authority RRs: 0 */
4942 0x00, 0x00, /* Additional RRs: 0 */
4943 /* Queries */
4944 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
4945 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name: hello.example.com */
4946 0x00, 0x01, /* Type: A */
4947 0x00, 0x01, /* Class: IN */
4948 /* Answers */
4949 0xc0, 0x0c, /* Name: hello.example.com (a pointer) */
4950 0x00, 0x01, /* Type: A */
4951 0x00, 0x01, /* Class: IN */
4952 0x00, 0x00, 0x00, 0x00, /* Time to live: 0 */
4953 0x00, 0x04, /* Data length: 4 */
4954 0x01, 0x02, 0x03, 0x04 /* Address: 1.2.3.4 */
4955 };
4956
4957 // The response with compressed domain name by a sequence of labels ending with a pointer. See
4958 // RFC 1035 section 4.1.4.
4959 //
4960 // Ignoring the other fields of the message, the domain name of question section and answer
4961 // section are presented as:
4962 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4963 // 12 | 5 | h |
4964 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4965 // 14 | e | l |
4966 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4967 // 16 | l | o |
4968 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4969 // 18 | 7 | e |
4970 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4971 // 20 | x | a |
4972 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4973 // 22 | m | p |
4974 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4975 // 24 | l | e |
4976 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4977 // 26 | 3 | c |
4978 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4979 // 28 | o | m |
4980 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4981 // 30 | 0 | ... |
4982 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4983 //
4984 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4985 // 35 | 5 | h |
4986 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4987 // 37 | e | l |
4988 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4989 // 39 | l | o |
4990 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4991 // 41 | 1 1| 18 |
4992 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4993 const std::vector<uint8_t> kResponseLabelEndingWithAPointer = {
4994 /* Header */
4995 0x00, 0x00, /* Transaction ID: 0x0000 */
4996 0x81, 0x80, /* Flags: qr rd ra */
4997 0x00, 0x01, /* Questions: 1 */
4998 0x00, 0x01, /* Answer RRs: 1 */
4999 0x00, 0x00, /* Authority RRs: 0 */
5000 0x00, 0x00, /* Additional RRs: 0 */
5001 /* Queries */
5002 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
5003 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name: hello.example.com */
5004 0x00, 0x01, /* Type: A */
5005 0x00, 0x01, /* Class: IN */
5006 /* Answers */
5007 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0xc0,
5008 0x12, /* Name: hello.example.com (a label ending with a pointer) */
5009 0x00, 0x01, /* Type: A */
5010 0x00, 0x01, /* Class: IN */
5011 0x00, 0x00, 0x00, 0x00, /* Time to live: 0 */
5012 0x00, 0x04, /* Data length: 4 */
5013 0x01, 0x02, 0x03, 0x04 /* Address: 1.2.3.4 */
5014 };
5015
5016 for (const auto& response : {kResponseAPointer, kResponseLabelEndingWithAPointer}) {
5017 SCOPED_TRACE(StringPrintf("Hex dump: %s", toHex(makeSlice(response)).c_str()));
5018
5019 test::DNSResponder dns(test::DNSResponder::MappingType::BINARY_PACKET);
5020 dns.addMappingBinaryPacket(kHelloExampleComQueryV4, response);
5021 StartDns(dns, {});
5022 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
5023
5024 // Expect no cache because the TTL of testing responses are 0.
5025 VerifyQueryHelloExampleComV4(dns, calltype);
Hungming Chenbb90ab32019-10-28 18:20:31 +08005026 }
Mike Yu40e67072019-10-09 21:14:09 +08005027}
Hungming Chen22617fd2019-12-06 12:15:45 +08005028
5029TEST_P(ResolverParameterizedTest, TruncatedResponse) {
5030 const auto& calltype = GetParam();
5031
Hungming Chen22617fd2019-12-06 12:15:45 +08005032 test::DNSResponder dns;
Ken Chen99344882020-01-01 14:59:38 +08005033 StartDns(dns, kLargeCnameChainRecords);
Hungming Chen22617fd2019-12-06 12:15:45 +08005034 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
5035
5036 // Expect UDP response is truncated. The resolver retries over TCP. See RFC 1035 section 4.2.1.
5037 VerifyQueryHelloExampleComV4(dns, calltype, false);
5038 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom));
5039 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom));
5040}
Luke Huang420ee622019-11-27 17:52:44 +08005041
5042TEST_F(ResolverTest, KeepListeningUDP) {
5043 constexpr char listen_addr1[] = "127.0.0.4";
5044 constexpr char listen_addr2[] = "127.0.0.5";
5045 constexpr char host_name[] = "howdy.example.com.";
5046 const std::vector<DnsRecord> records = {
5047 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
5048 };
5049 const std::vector<int> params = {300, 25, 8, 8, 1000 /* BASE_TIMEOUT_MSEC */,
5050 1 /* retry count */};
5051 const int delayTimeMs = 1500;
5052
5053 test::DNSResponder neverRespondDns(listen_addr2, "53", static_cast<ns_rcode>(-1));
5054 neverRespondDns.setResponseProbability(0.0);
5055 StartDns(neverRespondDns, records);
Luke Huangf40df9c2020-04-21 08:51:48 +08005056 ScopedSystemProperties scopedSystemProperties(
5057 "persist.device_config.netd_native.keep_listening_udp", "1");
5058 // Re-setup test network to make experiment flag take effect.
5059 resetNetwork();
Luke Huang420ee622019-11-27 17:52:44 +08005060
5061 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr1, listen_addr2},
5062 kDefaultSearchDomains, params));
5063 // There are 2 DNS servers for this test.
5064 // |delayedDns| will be blocked for |delayTimeMs|, then start to respond to requests.
5065 // |neverRespondDns| will never respond.
5066 // In the first try, resolver will send query to |delayedDns| but get timeout error
5067 // because |delayTimeMs| > DNS timeout.
5068 // Then it's the second try, resolver will send query to |neverRespondDns| and
5069 // listen on both servers. Resolver will receive the answer coming from |delayedDns|.
Luke Huang420ee622019-11-27 17:52:44 +08005070
Luke Huang420ee622019-11-27 17:52:44 +08005071 test::DNSResponder delayedDns(listen_addr1);
5072 delayedDns.setResponseDelayMs(delayTimeMs);
5073 StartDns(delayedDns, records);
5074
5075 // Specify hints to ensure resolver doing query only 1 round.
5076 const addrinfo hints = {.ai_family = AF_INET6, .ai_socktype = SOCK_DGRAM};
5077 ScopedAddrinfo result = safe_getaddrinfo(host_name, nullptr, &hints);
5078 EXPECT_TRUE(result != nullptr);
5079
5080 std::string result_str = ToString(result);
5081 EXPECT_TRUE(result_str == "::1.2.3.4") << ", result_str='" << result_str << "'";
5082}
Luke Huang0a0870d2020-02-12 20:41:10 +08005083
5084TEST_F(ResolverTest, GetAddrInfoParallelLookupTimeout) {
5085 constexpr char listen_addr[] = "127.0.0.4";
5086 constexpr char host_name[] = "howdy.example.com.";
5087 constexpr int TIMING_TOLERANCE_MS = 200;
5088 constexpr int DNS_TIMEOUT_MS = 1000;
5089 const std::vector<DnsRecord> records = {
5090 {host_name, ns_type::ns_t_a, "1.2.3.4"},
5091 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
5092 };
5093 const std::vector<int> params = {300, 25, 8, 8, DNS_TIMEOUT_MS /* BASE_TIMEOUT_MSEC */,
5094 1 /* retry count */};
5095 test::DNSResponder neverRespondDns(listen_addr, "53", static_cast<ns_rcode>(-1));
5096 neverRespondDns.setResponseProbability(0.0);
5097 StartDns(neverRespondDns, records);
Luke Huangf40df9c2020-04-21 08:51:48 +08005098 ScopedSystemProperties scopedSystemProperties(
5099 "persist.device_config.netd_native.parallel_lookup", "1");
Luke Huangd1d734f2020-04-30 12:25:40 +08005100 // The default value of parallel_lookup_sleep_time should be very small
5101 // that we can ignore in this test case.
Luke Huangf40df9c2020-04-21 08:51:48 +08005102 // Re-setup test network to make experiment flag take effect.
5103 resetNetwork();
Luke Huang0a0870d2020-02-12 20:41:10 +08005104
5105 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}, kDefaultSearchDomains, params));
5106 neverRespondDns.clearQueries();
5107
Luke Huang0a0870d2020-02-12 20:41:10 +08005108 // Use a never respond DNS server to verify if the A/AAAA queries are sent in parallel.
5109 // The resolver parameters are set to timeout 1s and retry 1 times.
5110 // So we expect the safe_getaddrinfo_time_taken() might take ~1s to
5111 // return when parallel lookup is enabled. And the DNS server should receive 2 queries.
5112 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_DGRAM};
5113 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(host_name, nullptr, hints);
5114
5115 EXPECT_TRUE(result == nullptr);
5116 EXPECT_NEAR(DNS_TIMEOUT_MS, timeTakenMs, TIMING_TOLERANCE_MS)
5117 << "took time should approximate equal timeout";
5118 EXPECT_EQ(2U, GetNumQueries(neverRespondDns, host_name));
Mike Yu532405f2020-06-17 17:46:44 +08005119 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, RCODE_TIMEOUT, host_name, {});
Luke Huang0a0870d2020-02-12 20:41:10 +08005120}
Luke Huangd1d734f2020-04-30 12:25:40 +08005121
5122TEST_F(ResolverTest, GetAddrInfoParallelLookupSleepTime) {
5123 constexpr char listen_addr[] = "127.0.0.4";
5124 constexpr int TIMING_TOLERANCE_MS = 200;
5125 const std::vector<DnsRecord> records = {
5126 {kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4},
5127 {kHelloExampleCom, ns_type::ns_t_aaaa, kHelloExampleComAddrV6},
5128 };
5129 const std::vector<int> params = {300, 25, 8, 8, 1000 /* BASE_TIMEOUT_MSEC */,
5130 1 /* retry count */};
5131 test::DNSResponder dns(listen_addr);
5132 StartDns(dns, records);
5133 ScopedSystemProperties scopedSystemProperties1(
5134 "persist.device_config.netd_native.parallel_lookup", "1");
5135 constexpr int PARALLEL_LOOKUP_SLEEP_TIME_MS = 500;
5136 ScopedSystemProperties scopedSystemProperties2(
5137 "persist.device_config.netd_native.parallel_lookup_sleep_time",
5138 std::to_string(PARALLEL_LOOKUP_SLEEP_TIME_MS));
5139 // Re-setup test network to make experiment flag take effect.
5140 resetNetwork();
5141
5142 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}, kDefaultSearchDomains, params));
5143 dns.clearQueries();
5144
5145 // Expect the safe_getaddrinfo_time_taken() might take ~500ms to return because we set
5146 // parallel_lookup_sleep_time to 500ms.
5147 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_DGRAM};
5148 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(kHelloExampleCom, nullptr, hints);
5149
5150 EXPECT_NE(nullptr, result);
5151 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(
5152 {kHelloExampleComAddrV4, kHelloExampleComAddrV6}));
5153 EXPECT_NEAR(PARALLEL_LOOKUP_SLEEP_TIME_MS, timeTakenMs, TIMING_TOLERANCE_MS)
5154 << "took time should approximate equal timeout";
5155 EXPECT_EQ(2U, GetNumQueries(dns, kHelloExampleCom));
5156
5157 // Expect the PARALLEL_LOOKUP_SLEEP_TIME_MS won't affect the query under cache hit case.
5158 dns.clearQueries();
5159 std::tie(result, timeTakenMs) = safe_getaddrinfo_time_taken(kHelloExampleCom, nullptr, hints);
5160 EXPECT_NE(nullptr, result);
5161 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(
5162 {kHelloExampleComAddrV4, kHelloExampleComAddrV6}));
5163 EXPECT_GT(PARALLEL_LOOKUP_SLEEP_TIME_MS, timeTakenMs);
5164 EXPECT_EQ(0U, GetNumQueries(dns, kHelloExampleCom));
5165}
Luke Huangeb618ef2020-05-26 14:17:02 +08005166
5167TEST_F(ResolverTest, BlockDnsQueryUidDoesNotLeadToBadServer) {
5168 // This test relies on blocking traffic on loopback, which xt_qtaguid does not do.
5169 // See aosp/358413 and b/34444781 for why.
5170 SKIP_IF_BPF_NOT_SUPPORTED;
5171
5172 constexpr char listen_addr1[] = "127.0.0.4";
5173 constexpr char listen_addr2[] = "::1";
5174 test::DNSResponder dns1(listen_addr1);
5175 test::DNSResponder dns2(listen_addr2);
5176 StartDns(dns1, {});
5177 StartDns(dns2, {});
5178
5179 std::vector<std::string> servers = {listen_addr1, listen_addr2};
5180 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
5181 dns1.clearQueries();
5182 dns2.clearQueries();
5183 {
5184 ScopeBlockedUIDRule scopeBlockUidRule(mDnsClient.netdService(), TEST_UID);
5185 // Start querying ten times.
5186 for (int i = 0; i < 10; i++) {
5187 std::string hostName = fmt::format("blocked{}.com", i);
5188 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
Luke Huang5729afc2020-07-30 23:12:17 +08005189 // The query result between R+ and Q would be different, but we don't really care
5190 // about the result here because this test is only used to ensure blocked uid rule
5191 // won't cause bad servers.
5192 safe_getaddrinfo(hostName.c_str(), nullptr, &hints);
Luke Huangeb618ef2020-05-26 14:17:02 +08005193 }
5194 }
Luke Huang5729afc2020-07-30 23:12:17 +08005195 ResolverParamsParcel setupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
5196 // If api level >= 30 (R+), expect all query packets to be blocked, hence we should not see any
5197 // of their stats show up. Otherwise, all queries should succeed.
5198 const std::vector<NameserverStats> expectedDnsStats = {
5199 NameserverStats(listen_addr1).setSuccesses(isAtLeastR ? 0 : setupParams.maxSamples),
Luke Huangeb618ef2020-05-26 14:17:02 +08005200 NameserverStats(listen_addr2),
5201 };
Luke Huang5729afc2020-07-30 23:12:17 +08005202 expectStatsEqualTo(expectedDnsStats);
5203 // If api level >= 30 (R+), expect server won't receive any queries,
5204 // otherwise expect 20 == 10 * (setupParams.domains.size() + 1) queries.
5205 EXPECT_EQ(dns1.queries().size(), isAtLeastR ? 0U : 10 * (setupParams.domains.size() + 1));
Luke Huangeb618ef2020-05-26 14:17:02 +08005206 EXPECT_EQ(dns2.queries().size(), 0U);
5207}
Mike Yu6ce587d2019-12-19 21:30:22 +08005208
5209// ResolverMultinetworkTest is used to verify multinetwork functionality. Here's how it works:
5210// The resolver sends queries to address A, and then there will be a TunForwarder helping forward
5211// the packets to address B, which is the address on which the testing server is listening. The
5212// answer packets responded from the testing server go through the reverse path back to the
5213// resolver.
5214//
5215// To achieve the that, it needs to set up a interface with routing rules. Tests are not
5216// supposed to initiate DNS servers on their own; instead, some utilities are added to the class to
5217// help the setup.
5218//
5219// An example of how to use it:
5220// TEST_F() {
Luke Huang81568fb2020-07-13 00:55:12 +08005221// ScopedPhysicalNetwork network = CreateScopedPhysicalNetwork(V4);
Mike Yu6ce587d2019-12-19 21:30:22 +08005222// network.init();
5223//
5224// auto dns = network.addIpv4Dns();
5225// StartDns(dns.dnsServer, {});
5226//
Luke Huang81568fb2020-07-13 00:55:12 +08005227// network.setDnsConfiguration();
Mike Yu6ce587d2019-12-19 21:30:22 +08005228// network.startTunForwarder();
5229//
5230// // Send queries here
5231// }
5232
5233class ResolverMultinetworkTest : public ResolverTest {
5234 protected:
5235 enum class ConnectivityType { V4, V6, V4V6 };
Luke Huang81568fb2020-07-13 00:55:12 +08005236 static constexpr int TEST_NETID_BASE = 10000;
Mike Yu6ce587d2019-12-19 21:30:22 +08005237
5238 struct DnsServerPair {
Luke Huang81568fb2020-07-13 00:55:12 +08005239 DnsServerPair(std::shared_ptr<test::DNSResponder> server, std::string addr)
5240 : dnsServer(server), dnsAddr(addr) {}
5241 std::shared_ptr<test::DNSResponder> dnsServer;
Mike Yu6ce587d2019-12-19 21:30:22 +08005242 std::string dnsAddr; // The DNS server address used for setResolverConfiguration().
5243 // TODO: Add test::DnsTlsFrontend* and std::string for DoT.
5244 };
5245
5246 class ScopedNetwork {
5247 public:
5248 ScopedNetwork(unsigned netId, ConnectivityType type, INetd* netdSrv,
Luke Huang81568fb2020-07-13 00:55:12 +08005249 IDnsResolver* dnsResolvSrv, const char* networkName)
Mike Yu6ce587d2019-12-19 21:30:22 +08005250 : mNetId(netId),
5251 mConnectivityType(type),
5252 mNetdSrv(netdSrv),
Luke Huang81568fb2020-07-13 00:55:12 +08005253 mDnsResolvSrv(dnsResolvSrv),
5254 mNetworkName(networkName) {
5255 mIfname = fmt::format("testtun{}", netId);
Mike Yu6ce587d2019-12-19 21:30:22 +08005256 }
Luke Huang81568fb2020-07-13 00:55:12 +08005257 virtual ~ScopedNetwork() {
5258 if (mNetdSrv != nullptr) mNetdSrv->networkDestroy(mNetId);
5259 if (mDnsResolvSrv != nullptr) mDnsResolvSrv->destroyNetworkCache(mNetId);
5260 }
Mike Yu6ce587d2019-12-19 21:30:22 +08005261
5262 Result<void> init();
Mike Yu6ce587d2019-12-19 21:30:22 +08005263 Result<DnsServerPair> addIpv4Dns() { return addDns(ConnectivityType::V4); }
5264 Result<DnsServerPair> addIpv6Dns() { return addDns(ConnectivityType::V6); }
5265 bool startTunForwarder() { return mTunForwarder->startForwarding(); }
Luke Huang81568fb2020-07-13 00:55:12 +08005266 bool setDnsConfiguration() const;
5267 bool clearDnsConfiguration() const;
Mike Yu6ce587d2019-12-19 21:30:22 +08005268 unsigned netId() const { return mNetId; }
Luke Huang81568fb2020-07-13 00:55:12 +08005269 std::string name() const { return mNetworkName; }
Mike Yu6ce587d2019-12-19 21:30:22 +08005270
Luke Huang81568fb2020-07-13 00:55:12 +08005271 protected:
5272 // Subclasses should implement it to decide which network should be create.
5273 virtual Result<void> createNetwork() const = 0;
Mike Yu6ce587d2019-12-19 21:30:22 +08005274
5275 const unsigned mNetId;
5276 const ConnectivityType mConnectivityType;
5277 INetd* mNetdSrv;
5278 IDnsResolver* mDnsResolvSrv;
Luke Huang81568fb2020-07-13 00:55:12 +08005279 const std::string mNetworkName;
Mike Yu6ce587d2019-12-19 21:30:22 +08005280 std::string mIfname;
5281 std::unique_ptr<TunForwarder> mTunForwarder;
Luke Huang81568fb2020-07-13 00:55:12 +08005282 std::vector<DnsServerPair> mDnsServerPairs;
5283
5284 private:
5285 Result<DnsServerPair> addDns(ConnectivityType connectivity);
5286 // Assuming mNetId is unique during ResolverMultinetworkTest, make the
5287 // address based on it to avoid conflicts.
5288 std::string makeIpv4AddrString(uint8_t n) const {
5289 return StringPrintf("192.168.%u.%u", (mNetId - TEST_NETID_BASE), n);
5290 }
5291 std::string makeIpv6AddrString(uint8_t n) const {
5292 return StringPrintf("2001:db8:%u::%u", (mNetId - TEST_NETID_BASE), n);
5293 }
5294 };
5295
5296 class ScopedPhysicalNetwork : public ScopedNetwork {
5297 public:
5298 ScopedPhysicalNetwork(unsigned netId, const char* networkName)
5299 : ScopedNetwork(netId, ConnectivityType::V4V6, nullptr, nullptr, networkName) {}
5300 ScopedPhysicalNetwork(unsigned netId, ConnectivityType type, INetd* netdSrv,
5301 IDnsResolver* dnsResolvSrv, const char* name = "Physical")
5302 : ScopedNetwork(netId, type, netdSrv, dnsResolvSrv, name) {}
5303
5304 protected:
5305 Result<void> createNetwork() const override {
5306 if (auto r = mNetdSrv->networkCreatePhysical(mNetId, INetd::PERMISSION_NONE);
5307 !r.isOk()) {
5308 return Error() << r.getMessage();
5309 }
5310 return {};
5311 }
5312 };
5313
5314 class ScopedVirtualNetwork : public ScopedNetwork {
5315 public:
5316 ScopedVirtualNetwork(unsigned netId, ConnectivityType type, INetd* netdSrv,
5317 IDnsResolver* dnsResolvSrv, const char* name, bool isSecure)
5318 : ScopedNetwork(netId, type, netdSrv, dnsResolvSrv, name), mIsSecure(isSecure) {}
5319 ~ScopedVirtualNetwork() {
5320 if (!mVpnIsolationUids.empty()) {
5321 const std::vector<int> tmpUids(mVpnIsolationUids.begin(), mVpnIsolationUids.end());
5322 mNetdSrv->firewallRemoveUidInterfaceRules(tmpUids);
5323 }
5324 }
5325 // Enable VPN isolation. Ensures that uid can only receive packets on mIfname.
5326 Result<void> enableVpnIsolation(int uid) {
5327 if (auto r = mNetdSrv->firewallAddUidInterfaceRules(mIfname, {uid}); !r.isOk()) {
5328 return Error() << r.getMessage();
5329 }
5330 mVpnIsolationUids.insert(uid);
5331 return {};
5332 }
5333 Result<void> disableVpnIsolation(int uid) {
5334 if (auto r = mNetdSrv->firewallRemoveUidInterfaceRules({static_cast<int>(uid)});
5335 !r.isOk()) {
5336 return Error() << r.getMessage();
5337 }
5338 mVpnIsolationUids.erase(uid);
5339 return {};
5340 }
5341 Result<void> addUser(uid_t uid) const { return addUidRange(uid, uid); }
5342 Result<void> addUidRange(uid_t from, uid_t to) const {
5343 if (auto r = mNetdSrv->networkAddUidRanges(mNetId, {makeUidRangeParcel(from, to)});
5344 !r.isOk()) {
5345 return Error() << r.getMessage();
5346 }
5347 return {};
5348 }
5349
5350 protected:
5351 Result<void> createNetwork() const override {
5352 if (auto r = mNetdSrv->networkCreateVpn(mNetId, mIsSecure); !r.isOk()) {
5353 return Error() << r.getMessage();
5354 }
5355 return {};
5356 }
5357
5358 bool mIsSecure = false;
5359 std::unordered_set<int> mVpnIsolationUids;
Mike Yu6ce587d2019-12-19 21:30:22 +08005360 };
5361
5362 void SetUp() override {
5363 ResolverTest::SetUp();
5364 ASSERT_NE(mDnsClient.netdService(), nullptr);
5365 ASSERT_NE(mDnsClient.resolvService(), nullptr);
5366 }
5367
Luke Huang81568fb2020-07-13 00:55:12 +08005368 void TearDown() override {
5369 ResolverTest::TearDown();
5370 // Restore default network
5371 if (mStoredDefaultNetwork >= 0) {
5372 mDnsClient.netdService()->networkSetDefault(mStoredDefaultNetwork);
5373 }
5374 }
Mike Yu6ce587d2019-12-19 21:30:22 +08005375
Luke Huang81568fb2020-07-13 00:55:12 +08005376 ScopedPhysicalNetwork CreateScopedPhysicalNetwork(ConnectivityType type,
5377 const char* name = "Physical") {
5378 return {getFreeNetId(), type, mDnsClient.netdService(), mDnsClient.resolvService(), name};
5379 }
5380 ScopedVirtualNetwork CreateScopedVirtualNetwork(ConnectivityType type, bool isSecure,
5381 const char* name = "Virtual") {
5382 return {getFreeNetId(), type, mDnsClient.netdService(), mDnsClient.resolvService(),
5383 name, isSecure};
5384 }
Mike Yu6ce587d2019-12-19 21:30:22 +08005385 void StartDns(test::DNSResponder& dns, const std::vector<DnsRecord>& records);
Luke Huang81568fb2020-07-13 00:55:12 +08005386 void setDefaultNetwork(int netId) {
5387 // Save current default network at the first call.
5388 std::call_once(defaultNetworkFlag, [&]() {
5389 ASSERT_TRUE(mDnsClient.netdService()->networkGetDefault(&mStoredDefaultNetwork).isOk());
5390 });
5391 ASSERT_TRUE(mDnsClient.netdService()->networkSetDefault(netId).isOk());
5392 }
5393 unsigned getFreeNetId() {
5394 if (mNextNetId == TEST_NETID_BASE + 256) mNextNetId = TEST_NETID_BASE;
5395 return mNextNetId++;
5396 }
Mike Yu6ce587d2019-12-19 21:30:22 +08005397
5398 private:
5399 // Use a different netId because this class inherits from the class ResolverTest which
Luke Huang81568fb2020-07-13 00:55:12 +08005400 // always creates TEST_NETID in setup. It's incremented when CreateScoped{Physical,
5401 // Virtual}Network() is called.
5402 // Note: 255 is the maximum number of (mNextNetId - TEST_NETID_BASE) here as mNextNetId
5403 // is used to create address.
5404 unsigned mNextNetId = TEST_NETID_BASE;
5405 // Use -1 to represent that default network was not modified because
5406 // real netId must be an unsigned value.
5407 int mStoredDefaultNetwork = -1;
5408 std::once_flag defaultNetworkFlag;
Mike Yu6ce587d2019-12-19 21:30:22 +08005409};
5410
Mike Yu6ce587d2019-12-19 21:30:22 +08005411Result<void> ResolverMultinetworkTest::ScopedNetwork::init() {
Luke Huang81568fb2020-07-13 00:55:12 +08005412 if (mNetdSrv == nullptr || mDnsResolvSrv == nullptr) return Error() << "srv not available";
Mike Yu6ce587d2019-12-19 21:30:22 +08005413 unique_fd ufd = TunForwarder::createTun(mIfname);
5414 if (!ufd.ok()) {
5415 return Errorf("createTun for {} failed", mIfname);
5416 }
5417 mTunForwarder = std::make_unique<TunForwarder>(std::move(ufd));
5418
Luke Huang81568fb2020-07-13 00:55:12 +08005419 if (auto r = createNetwork(); !r.ok()) {
5420 return r;
Mike Yu6ce587d2019-12-19 21:30:22 +08005421 }
5422 if (auto r = mDnsResolvSrv->createNetworkCache(mNetId); !r.isOk()) {
5423 return Error() << r.getMessage();
5424 }
5425 if (auto r = mNetdSrv->networkAddInterface(mNetId, mIfname); !r.isOk()) {
5426 return Error() << r.getMessage();
5427 }
5428
5429 if (mConnectivityType == ConnectivityType::V4 || mConnectivityType == ConnectivityType::V4V6) {
5430 const std::string v4Addr = makeIpv4AddrString(1);
5431 if (auto r = mNetdSrv->interfaceAddAddress(mIfname, v4Addr, 32); !r.isOk()) {
5432 return Error() << r.getMessage();
5433 }
5434 if (auto r = mNetdSrv->networkAddRoute(mNetId, mIfname, "0.0.0.0/0", ""); !r.isOk()) {
5435 return Error() << r.getMessage();
5436 }
5437 }
5438 if (mConnectivityType == ConnectivityType::V6 || mConnectivityType == ConnectivityType::V4V6) {
5439 const std::string v6Addr = makeIpv6AddrString(1);
5440 if (auto r = mNetdSrv->interfaceAddAddress(mIfname, v6Addr, 128); !r.isOk()) {
5441 return Error() << r.getMessage();
5442 }
5443 if (auto r = mNetdSrv->networkAddRoute(mNetId, mIfname, "::/0", ""); !r.isOk()) {
5444 return Error() << r.getMessage();
5445 }
5446 }
5447
5448 return {};
5449}
5450
Mike Yu6ce587d2019-12-19 21:30:22 +08005451void ResolverMultinetworkTest::StartDns(test::DNSResponder& dns,
5452 const std::vector<DnsRecord>& records) {
5453 ResolverTest::StartDns(dns, records);
5454
5455 // Bind the DNSResponder's sockets to the network if specified.
5456 if (std::optional<unsigned> netId = dns.getNetwork(); netId.has_value()) {
5457 setNetworkForSocket(netId.value(), dns.getUdpSocket());
5458 setNetworkForSocket(netId.value(), dns.getTcpSocket());
5459 }
5460}
5461
5462Result<ResolverMultinetworkTest::DnsServerPair> ResolverMultinetworkTest::ScopedNetwork::addDns(
5463 ConnectivityType type) {
Luke Huang81568fb2020-07-13 00:55:12 +08005464 const int index = mDnsServerPairs.size();
Mike Yu6ce587d2019-12-19 21:30:22 +08005465 const int prefixLen = (type == ConnectivityType::V4) ? 32 : 128;
5466
5467 const std::function<std::string(unsigned)> makeIpString =
5468 std::bind((type == ConnectivityType::V4) ? &ScopedNetwork::makeIpv4AddrString
5469 : &ScopedNetwork::makeIpv6AddrString,
5470 this, std::placeholders::_1);
5471
5472 std::string src1 = makeIpString(1); // The address from which the resolver will send.
Luke Huang81568fb2020-07-13 00:55:12 +08005473 std::string dst1 = makeIpString(
5474 index + 100 +
5475 (mNetId - TEST_NETID_BASE)); // The address to which the resolver will send.
Mike Yu6ce587d2019-12-19 21:30:22 +08005476 std::string src2 = dst1; // The address translated from src1.
Luke Huang81568fb2020-07-13 00:55:12 +08005477 std::string dst2 = makeIpString(
5478 index + 200 + (mNetId - TEST_NETID_BASE)); // The address translated from dst2.
Mike Yu6ce587d2019-12-19 21:30:22 +08005479
5480 if (!mTunForwarder->addForwardingRule({src1, dst1}, {src2, dst2}) ||
5481 !mTunForwarder->addForwardingRule({dst2, src2}, {dst1, src1})) {
5482 return Errorf("Failed to add the rules ({}, {}, {}, {})", src1, dst1, src2, dst2);
5483 }
5484
5485 if (!mNetdSrv->interfaceAddAddress(mIfname, dst2, prefixLen).isOk()) {
5486 return Errorf("interfaceAddAddress({}, {}, {}) failed", mIfname, dst2, prefixLen);
5487 }
5488
Luke Huang81568fb2020-07-13 00:55:12 +08005489 return mDnsServerPairs.emplace_back(std::make_shared<test::DNSResponder>(mNetId, dst2), dst1);
Mike Yu6ce587d2019-12-19 21:30:22 +08005490}
5491
Luke Huang81568fb2020-07-13 00:55:12 +08005492bool ResolverMultinetworkTest::ScopedNetwork::setDnsConfiguration() const {
5493 if (mDnsResolvSrv == nullptr) return false;
5494 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
5495 parcel.tlsServers.clear();
5496 parcel.netId = mNetId;
5497 parcel.servers.clear();
5498 for (const auto& pair : mDnsServerPairs) {
5499 parcel.servers.push_back(pair.dnsAddr);
5500 }
5501 return mDnsResolvSrv->setResolverConfiguration(parcel).isOk();
5502}
5503
5504bool ResolverMultinetworkTest::ScopedNetwork::clearDnsConfiguration() const {
5505 if (mDnsResolvSrv == nullptr) return false;
5506 return mDnsResolvSrv->destroyNetworkCache(mNetId).isOk() &&
5507 mDnsResolvSrv->createNetworkCache(mNetId).isOk();
5508}
5509
5510namespace {
5511
5512// Convenient wrapper for making getaddrinfo call like framework.
5513Result<ScopedAddrinfo> android_getaddrinfofornet_wrapper(const char* name, int netId) {
5514 // Use the same parameter as libcore/ojluni/src/main/java/java/net/Inet6AddressImpl.java.
5515 static const addrinfo hints = {
5516 .ai_flags = AI_ADDRCONFIG,
5517 .ai_family = AF_UNSPEC,
5518 .ai_socktype = SOCK_STREAM,
5519 };
5520 addrinfo* result = nullptr;
5521 if (int r = android_getaddrinfofornet(name, nullptr, &hints, netId, MARK_UNSET, &result)) {
5522 return Error() << r;
5523 }
5524 return ScopedAddrinfo(result);
5525}
5526
5527void expectDnsWorksForUid(const char* name, unsigned netId, uid_t uid,
5528 const std::vector<std::string>& expectedResult) {
5529 ScopedChangeUID scopedChangeUID(uid);
5530 auto result = android_getaddrinfofornet_wrapper(name, netId);
5531 ASSERT_RESULT_OK(result);
5532 ScopedAddrinfo ai_result(std::move(result.value()));
5533 std::vector<std::string> result_strs = ToStrings(ai_result);
5534 EXPECT_THAT(result_strs, testing::UnorderedElementsAreArray(expectedResult));
5535}
5536
5537} // namespace
5538
Mike Yu6ce587d2019-12-19 21:30:22 +08005539TEST_F(ResolverMultinetworkTest, GetAddrInfo_AI_ADDRCONFIG) {
5540 constexpr char host_name[] = "ohayou.example.com.";
5541
5542 const std::array<ConnectivityType, 3> allTypes = {
5543 ConnectivityType::V4,
5544 ConnectivityType::V6,
5545 ConnectivityType::V4V6,
5546 };
5547 for (const auto& type : allTypes) {
5548 SCOPED_TRACE(StringPrintf("ConnectivityType: %d", type));
5549
5550 // Create a network.
Luke Huang81568fb2020-07-13 00:55:12 +08005551 ScopedPhysicalNetwork network = CreateScopedPhysicalNetwork(type);
Mike Yu6ce587d2019-12-19 21:30:22 +08005552 ASSERT_RESULT_OK(network.init());
5553
5554 // Add a testing DNS server.
5555 const Result<DnsServerPair> dnsPair =
5556 (type == ConnectivityType::V4) ? network.addIpv4Dns() : network.addIpv6Dns();
5557 ASSERT_RESULT_OK(dnsPair);
Luke Huang81568fb2020-07-13 00:55:12 +08005558 StartDns(*dnsPair->dnsServer, {{host_name, ns_type::ns_t_a, "192.0.2.0"},
5559 {host_name, ns_type::ns_t_aaaa, "2001:db8:cafe:d00d::31"}});
Mike Yu6ce587d2019-12-19 21:30:22 +08005560
5561 // Set up resolver and start forwarding.
Luke Huang81568fb2020-07-13 00:55:12 +08005562 ASSERT_TRUE(network.setDnsConfiguration());
Mike Yu6ce587d2019-12-19 21:30:22 +08005563 ASSERT_TRUE(network.startTunForwarder());
5564
Luke Huang81568fb2020-07-13 00:55:12 +08005565 auto result = android_getaddrinfofornet_wrapper(host_name, network.netId());
5566 ASSERT_RESULT_OK(result);
5567 ScopedAddrinfo ai_result(std::move(result.value()));
Mike Yu6ce587d2019-12-19 21:30:22 +08005568 std::vector<std::string> result_strs = ToStrings(ai_result);
5569 std::vector<std::string> expectedResult;
5570 size_t expectedQueries = 0;
5571
5572 if (type == ConnectivityType::V6 || type == ConnectivityType::V4V6) {
5573 expectedResult.emplace_back("2001:db8:cafe:d00d::31");
5574 expectedQueries++;
5575 }
5576 if (type == ConnectivityType::V4 || type == ConnectivityType::V4V6) {
Luke Huang81568fb2020-07-13 00:55:12 +08005577 expectedResult.emplace_back("192.0.2.0");
Mike Yu6ce587d2019-12-19 21:30:22 +08005578 expectedQueries++;
5579 }
5580 EXPECT_THAT(result_strs, testing::UnorderedElementsAreArray(expectedResult));
Luke Huang81568fb2020-07-13 00:55:12 +08005581 EXPECT_EQ(GetNumQueries(*dnsPair->dnsServer, host_name), expectedQueries);
Mike Yu6ce587d2019-12-19 21:30:22 +08005582 }
5583}
5584
5585TEST_F(ResolverMultinetworkTest, NetworkDestroyedDuringQueryInFlight) {
5586 constexpr char host_name[] = "ohayou.example.com.";
5587
5588 // Create a network and add an ipv4 DNS server.
Luke Huang81568fb2020-07-13 00:55:12 +08005589 auto network = std::make_unique<ScopedPhysicalNetwork>(getFreeNetId(), ConnectivityType::V4V6,
5590 mDnsClient.netdService(),
5591 mDnsClient.resolvService());
Mike Yu6ce587d2019-12-19 21:30:22 +08005592 ASSERT_RESULT_OK(network->init());
5593 const Result<DnsServerPair> dnsPair = network->addIpv4Dns();
5594 ASSERT_RESULT_OK(dnsPair);
5595
5596 // Set the DNS server unresponsive.
Luke Huang81568fb2020-07-13 00:55:12 +08005597 dnsPair->dnsServer->setResponseProbability(0.0);
5598 dnsPair->dnsServer->setErrorRcode(static_cast<ns_rcode>(-1));
5599 StartDns(*dnsPair->dnsServer, {});
Mike Yu6ce587d2019-12-19 21:30:22 +08005600
5601 // Set up resolver and start forwarding.
Luke Huang81568fb2020-07-13 00:55:12 +08005602 ASSERT_TRUE(network->setDnsConfiguration());
Mike Yu6ce587d2019-12-19 21:30:22 +08005603 ASSERT_TRUE(network->startTunForwarder());
5604
5605 // Expect the things happening in order:
5606 // 1. The thread sends the query to the dns server which is unresponsive.
5607 // 2. The network is destroyed while the thread is waiting for the response from the dns server.
5608 // 3. After the dns server timeout, the thread retries but fails to connect.
5609 std::thread lookup([&]() {
5610 int fd = resNetworkQuery(network->netId(), host_name, ns_c_in, ns_t_a, 0);
5611 EXPECT_TRUE(fd != -1);
5612 expectAnswersNotValid(fd, -ETIMEDOUT);
5613 });
5614
5615 // Tear down the network as soon as the dns server receives the query.
Luke Huang81568fb2020-07-13 00:55:12 +08005616 const auto condition = [&]() { return GetNumQueries(*dnsPair->dnsServer, host_name) == 1U; };
Mike Yu6ce587d2019-12-19 21:30:22 +08005617 EXPECT_TRUE(PollForCondition(condition));
5618 network.reset();
5619
5620 lookup.join();
5621}
5622
5623TEST_F(ResolverMultinetworkTest, OneCachePerNetwork) {
5624 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
5625 constexpr char host_name[] = "ohayou.example.com.";
5626
Luke Huang81568fb2020-07-13 00:55:12 +08005627 ScopedPhysicalNetwork network1 = CreateScopedPhysicalNetwork(ConnectivityType::V4V6);
5628 ScopedPhysicalNetwork network2 = CreateScopedPhysicalNetwork(ConnectivityType::V4V6);
Mike Yu6ce587d2019-12-19 21:30:22 +08005629 ASSERT_RESULT_OK(network1.init());
5630 ASSERT_RESULT_OK(network2.init());
5631
5632 const Result<DnsServerPair> dnsPair1 = network1.addIpv4Dns();
5633 const Result<DnsServerPair> dnsPair2 = network2.addIpv4Dns();
5634 ASSERT_RESULT_OK(dnsPair1);
5635 ASSERT_RESULT_OK(dnsPair2);
Luke Huang81568fb2020-07-13 00:55:12 +08005636 StartDns(*dnsPair1->dnsServer, {{host_name, ns_type::ns_t_a, "192.0.2.0"}});
5637 StartDns(*dnsPair2->dnsServer, {{host_name, ns_type::ns_t_a, "192.0.2.1"}});
Mike Yu6ce587d2019-12-19 21:30:22 +08005638
5639 // Set up resolver for network 1 and start forwarding.
Luke Huang81568fb2020-07-13 00:55:12 +08005640 ASSERT_TRUE(network1.setDnsConfiguration());
Mike Yu6ce587d2019-12-19 21:30:22 +08005641 ASSERT_TRUE(network1.startTunForwarder());
5642
5643 // Set up resolver for network 2 and start forwarding.
Luke Huang81568fb2020-07-13 00:55:12 +08005644 ASSERT_TRUE(network2.setDnsConfiguration());
Mike Yu6ce587d2019-12-19 21:30:22 +08005645 ASSERT_TRUE(network2.startTunForwarder());
5646
5647 // Send the same queries to both networks.
5648 int fd1 = resNetworkQuery(network1.netId(), host_name, ns_c_in, ns_t_a, 0);
5649 int fd2 = resNetworkQuery(network2.netId(), host_name, ns_c_in, ns_t_a, 0);
5650
Luke Huang81568fb2020-07-13 00:55:12 +08005651 expectAnswersValid(fd1, AF_INET, "192.0.2.0");
5652 expectAnswersValid(fd2, AF_INET, "192.0.2.1");
5653 EXPECT_EQ(GetNumQueries(*dnsPair1->dnsServer, host_name), 1U);
5654 EXPECT_EQ(GetNumQueries(*dnsPair2->dnsServer, host_name), 1U);
Mike Yu6ce587d2019-12-19 21:30:22 +08005655
5656 // Flush the cache of network 1, and send the queries again.
5657 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(network1.netId()).isOk());
5658 fd1 = resNetworkQuery(network1.netId(), host_name, ns_c_in, ns_t_a, 0);
5659 fd2 = resNetworkQuery(network2.netId(), host_name, ns_c_in, ns_t_a, 0);
5660
Luke Huang81568fb2020-07-13 00:55:12 +08005661 expectAnswersValid(fd1, AF_INET, "192.0.2.0");
5662 expectAnswersValid(fd2, AF_INET, "192.0.2.1");
5663 EXPECT_EQ(GetNumQueries(*dnsPair1->dnsServer, host_name), 2U);
5664 EXPECT_EQ(GetNumQueries(*dnsPair2->dnsServer, host_name), 1U);
5665}
5666
5667TEST_F(ResolverMultinetworkTest, DnsWithVpn) {
5668 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
5669 SKIP_IF_BPF_NOT_SUPPORTED;
5670 constexpr char host_name[] = "ohayou.example.com.";
5671 constexpr char ipv4_addr[] = "192.0.2.0";
5672 constexpr char ipv6_addr[] = "2001:db8:cafe:d00d::31";
5673
5674 const std::pair<ConnectivityType, std::vector<std::string>> testPairs[] = {
5675 {ConnectivityType::V4, {ipv4_addr}},
5676 {ConnectivityType::V6, {ipv6_addr}},
5677 {ConnectivityType::V4V6, {ipv6_addr, ipv4_addr}},
5678 };
5679 for (const auto& [type, result] : testPairs) {
5680 SCOPED_TRACE(StringPrintf("ConnectivityType: %d", type));
5681
5682 // Create a network.
5683 ScopedPhysicalNetwork underlyingNetwork = CreateScopedPhysicalNetwork(type, "Underlying");
5684 ScopedVirtualNetwork bypassableVpnNetwork =
5685 CreateScopedVirtualNetwork(type, false, "BypassableVpn");
5686 ScopedVirtualNetwork secureVpnNetwork = CreateScopedVirtualNetwork(type, true, "SecureVpn");
5687
5688 ASSERT_RESULT_OK(underlyingNetwork.init());
5689 ASSERT_RESULT_OK(bypassableVpnNetwork.init());
5690 ASSERT_RESULT_OK(secureVpnNetwork.init());
5691 ASSERT_RESULT_OK(bypassableVpnNetwork.addUser(TEST_UID));
5692 ASSERT_RESULT_OK(secureVpnNetwork.addUser(TEST_UID2));
5693
5694 auto setupDnsFn = [&](std::shared_ptr<test::DNSResponder> dnsServer,
5695 ScopedNetwork* nw) -> void {
5696 StartDns(*dnsServer, {{host_name, ns_type::ns_t_a, ipv4_addr},
5697 {host_name, ns_type::ns_t_aaaa, ipv6_addr}});
5698 ASSERT_TRUE(nw->setDnsConfiguration());
5699 ASSERT_TRUE(nw->startTunForwarder());
5700 };
5701 // Add a testing DNS server to networks.
5702 const Result<DnsServerPair> underlyingPair = (type == ConnectivityType::V4)
5703 ? underlyingNetwork.addIpv4Dns()
5704 : underlyingNetwork.addIpv6Dns();
5705 ASSERT_RESULT_OK(underlyingPair);
5706 const Result<DnsServerPair> bypassableVpnPair = (type == ConnectivityType::V4)
5707 ? bypassableVpnNetwork.addIpv4Dns()
5708 : bypassableVpnNetwork.addIpv6Dns();
5709 ASSERT_RESULT_OK(bypassableVpnPair);
5710 const Result<DnsServerPair> secureVpnPair = (type == ConnectivityType::V4)
5711 ? secureVpnNetwork.addIpv4Dns()
5712 : secureVpnNetwork.addIpv6Dns();
5713 ASSERT_RESULT_OK(secureVpnPair);
5714 // Set up resolver and start forwarding for networks.
5715 setupDnsFn(underlyingPair->dnsServer, &underlyingNetwork);
5716 setupDnsFn(bypassableVpnPair->dnsServer, &bypassableVpnNetwork);
5717 setupDnsFn(secureVpnPair->dnsServer, &secureVpnNetwork);
5718
5719 setDefaultNetwork(underlyingNetwork.netId());
5720 const unsigned underlyingNetId = underlyingNetwork.netId();
5721 const unsigned bypassableVpnNetId = bypassableVpnNetwork.netId();
5722 const unsigned secureVpnNetId = secureVpnNetwork.netId();
5723 // We've called setNetworkForProcess in SetupOemNetwork, so reset to default first.
5724 ScopedSetNetworkForProcess scopedSetNetworkForProcess(NETID_UNSET);
5725 auto expectDnsQueryCountsFn = [&](size_t count,
5726 std::shared_ptr<test::DNSResponder> dnsServer,
5727 unsigned expectedDnsNetId) -> void {
5728 EXPECT_EQ(GetNumQueries(*dnsServer, host_name), count);
5729 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(expectedDnsNetId).isOk());
5730 dnsServer->clearQueries();
5731 // Give DnsResolver some time to clear cache to avoid race.
5732 usleep(5 * 1000);
5733 };
5734
5735 // Create a object to represent default network, do not init it.
5736 ScopedPhysicalNetwork defaultNetwork{NETID_UNSET, "Default"};
5737
5738 // Test VPN with DNS server under 4 different network selection scenarios.
5739 // See the test config for the expectation.
5740 const struct TestConfig {
5741 ScopedNetwork* selectedNetwork;
5742 unsigned expectedDnsNetId;
5743 std::shared_ptr<test::DNSResponder> expectedDnsServer;
5744 } vpnWithDnsServerConfigs[]{
5745 // clang-format off
5746 // Queries use the bypassable VPN by default.
5747 {&defaultNetwork, bypassableVpnNetId, bypassableVpnPair->dnsServer},
5748 // Choosing the underlying network works because the VPN is bypassable.
5749 {&underlyingNetwork, underlyingNetId, underlyingPair->dnsServer},
5750 // Selecting the VPN sends the query on the VPN.
5751 {&bypassableVpnNetwork, bypassableVpnNetId, bypassableVpnPair->dnsServer},
5752 // TEST_UID does not have access to the secure VPN.
5753 {&secureVpnNetwork, bypassableVpnNetId, bypassableVpnPair->dnsServer},
5754 // clang-format on
5755 };
5756 for (const auto& config : vpnWithDnsServerConfigs) {
5757 SCOPED_TRACE(fmt::format("Bypassble VPN with DnsServer, selectedNetwork = {}",
5758 config.selectedNetwork->name()));
5759 expectDnsWorksForUid(host_name, config.selectedNetwork->netId(), TEST_UID, result);
5760 expectDnsQueryCountsFn(result.size(), config.expectedDnsServer,
5761 config.expectedDnsNetId);
5762 }
5763
5764 std::vector<ScopedNetwork*> nwVec{&defaultNetwork, &underlyingNetwork,
5765 &bypassableVpnNetwork, &secureVpnNetwork};
5766 // Test the VPN without DNS server with the same combination as before.
5767 ASSERT_TRUE(bypassableVpnNetwork.clearDnsConfiguration());
5768 // Test bypassable VPN, TEST_UID
5769 for (const auto* selectedNetwork : nwVec) {
5770 SCOPED_TRACE(fmt::format("Bypassble VPN without DnsServer, selectedNetwork = {}",
5771 selectedNetwork->name()));
5772 expectDnsWorksForUid(host_name, selectedNetwork->netId(), TEST_UID, result);
5773 expectDnsQueryCountsFn(result.size(), underlyingPair->dnsServer, underlyingNetId);
5774 }
5775
5776 // The same test scenario as before plus enableVpnIsolation for secure VPN, TEST_UID2.
5777 for (bool enableVpnIsolation : {false, true}) {
5778 SCOPED_TRACE(fmt::format("enableVpnIsolation = {}", enableVpnIsolation));
5779 if (enableVpnIsolation) {
5780 EXPECT_RESULT_OK(secureVpnNetwork.enableVpnIsolation(TEST_UID2));
5781 }
5782
5783 // Test secure VPN without DNS server.
5784 ASSERT_TRUE(secureVpnNetwork.clearDnsConfiguration());
5785 for (const auto* selectedNetwork : nwVec) {
5786 SCOPED_TRACE(fmt::format("Secure VPN without DnsServer, selectedNetwork = {}",
5787 selectedNetwork->name()));
5788 expectDnsWorksForUid(host_name, selectedNetwork->netId(), TEST_UID2, result);
5789 expectDnsQueryCountsFn(result.size(), underlyingPair->dnsServer, underlyingNetId);
5790 }
5791
5792 // Test secure VPN with DNS server.
5793 ASSERT_TRUE(secureVpnNetwork.setDnsConfiguration());
5794 for (const auto* selectedNetwork : nwVec) {
5795 SCOPED_TRACE(fmt::format("Secure VPN with DnsServer, selectedNetwork = {}",
5796 selectedNetwork->name()));
5797 expectDnsWorksForUid(host_name, selectedNetwork->netId(), TEST_UID2, result);
5798 expectDnsQueryCountsFn(result.size(), secureVpnPair->dnsServer, secureVpnNetId);
5799 }
5800
5801 if (enableVpnIsolation) {
5802 EXPECT_RESULT_OK(secureVpnNetwork.disableVpnIsolation(TEST_UID2));
5803 }
5804 }
5805 }
Mike Yu6ce587d2019-12-19 21:30:22 +08005806}