blob: 2c1dc9d7ffd124394421ce2e7436ef55c23fe4c0 [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>
56
Luke Huang829511c2020-05-26 17:31:15 +080057#include <DnsProxydProtocol.h> // NETID_USE_LOCAL_NAMESERVERS
Luke Huangf8215372019-11-22 11:53:41 +080058#include <aidl/android/net/IDnsResolver.h>
59#include <android/binder_manager.h>
60#include <android/binder_process.h>
Luke Huang5729afc2020-07-30 23:12:17 +080061#include <util.h> // getApiLevel
Bernie Innocenti41b82c42019-06-05 22:38:25 +090062#include "NetdClient.h"
Bernie Innocenti41b82c42019-06-05 22:38:25 +090063#include "ResolverStats.h"
Luke Huangf8215372019-11-22 11:53:41 +080064#include "netid_client.h" // NETID_UNSET
65#include "params.h" // MAXNS
Mike Yu532405f2020-06-17 17:46:44 +080066#include "stats.h" // RCODE_TIMEOUT
Hungming Chene8f970c2019-04-10 17:34:06 +080067#include "tests/dns_metrics_listener/dns_metrics_listener.h"
chenbruceb43ec752019-07-24 20:19:41 +080068#include "tests/dns_responder/dns_responder.h"
Luke Huangf8215372019-11-22 11:53:41 +080069#include "tests/dns_responder/dns_responder_client_ndk.h"
Hungming Chenc6556622019-10-02 16:01:07 +080070#include "tests/dns_responder/dns_tls_certificate.h"
chenbruceb43ec752019-07-24 20:19:41 +080071#include "tests/dns_responder/dns_tls_frontend.h"
Luke Huangfde82482019-06-04 01:04:53 +080072#include "tests/resolv_test_utils.h"
Mike Yu6ce587d2019-12-19 21:30:22 +080073#include "tests/tun_forwarder.h"
Ken Chenb9fa2062018-11-13 21:51:13 +080074
Luke Huang0d592bc2019-05-25 18:24:03 +080075// Valid VPN netId range is 100 ~ 65535
76constexpr int TEST_VPN_NETID = 65502;
Luke Huang94b10b92018-11-21 20:13:38 +080077constexpr int MAXPACKET = (8 * 1024);
Ken Chenb9fa2062018-11-13 21:51:13 +080078
79// Semi-public Bionic hook used by the NDK (frameworks/base/native/android/net.c)
80// Tested here for convenience.
81extern "C" int android_getaddrinfofornet(const char* hostname, const char* servname,
82 const addrinfo* hints, unsigned netid, unsigned mark,
83 struct addrinfo** result);
84
Mike Yu153b5b82020-03-04 19:53:54 +080085using namespace std::chrono_literals;
86
Luke Huang70070852019-11-25 18:25:50 +080087using aidl::android::net::IDnsResolver;
Luke Huangf8215372019-11-22 11:53:41 +080088using aidl::android::net::INetd;
Mike Yu8ac63402019-12-02 15:28:38 +080089using aidl::android::net::ResolverParamsParcel;
Mike Yu532405f2020-06-17 17:46:44 +080090using aidl::android::net::metrics::INetdEventListener;
Mike Yu6ce587d2019-12-19 21:30:22 +080091using android::base::Error;
Luke Huang9807e6b2019-05-20 16:17:12 +080092using android::base::ParseInt;
Mike Yu6ce587d2019-12-19 21:30:22 +080093using android::base::Result;
Ken Chenb9fa2062018-11-13 21:51:13 +080094using android::base::StringPrintf;
Luke Huang9807e6b2019-05-20 16:17:12 +080095using android::base::unique_fd;
Ken Chenb9fa2062018-11-13 21:51:13 +080096using android::net::ResolverStats;
Mike Yu6ce587d2019-12-19 21:30:22 +080097using android::net::TunForwarder;
Hungming Chene8f970c2019-04-10 17:34:06 +080098using android::net::metrics::DnsMetricsListener;
Ken Chenb9fa2062018-11-13 21:51:13 +080099using android::netdutils::enableSockopt;
Hungming Chen63779052019-10-30 15:06:13 +0800100using android::netdutils::makeSlice;
Luke Huang9807e6b2019-05-20 16:17:12 +0800101using android::netdutils::ResponseCode;
Luke Huang9d2d25b2019-06-14 00:34:05 +0800102using android::netdutils::ScopedAddrinfo;
Mike Yu40e67072019-10-09 21:14:09 +0800103using android::netdutils::Stopwatch;
Hungming Chen63779052019-10-30 15:06:13 +0800104using android::netdutils::toHex;
Ken Chenb9fa2062018-11-13 21:51:13 +0800105
106// TODO: move into libnetdutils?
107namespace {
Luke Huangfde82482019-06-04 01:04:53 +0800108
Ken Chenb9fa2062018-11-13 21:51:13 +0800109ScopedAddrinfo safe_getaddrinfo(const char* node, const char* service,
110 const struct addrinfo* hints) {
111 addrinfo* result = nullptr;
112 if (getaddrinfo(node, service, hints, &result) != 0) {
113 result = nullptr; // Should already be the case, but...
114 }
115 return ScopedAddrinfo(result);
116}
Luke Huangfde82482019-06-04 01:04:53 +0800117
Mike Yu40e67072019-10-09 21:14:09 +0800118std::pair<ScopedAddrinfo, int> safe_getaddrinfo_time_taken(const char* node, const char* service,
119 const addrinfo& hints) {
120 Stopwatch s;
121 ScopedAddrinfo result = safe_getaddrinfo(node, service, &hints);
122 return {std::move(result), s.timeTakenUs() / 1000};
123}
124
Mike Yue2162e52020-03-04 18:43:46 +0800125struct NameserverStats {
126 NameserverStats() = delete;
127 NameserverStats(const std::string server) : server(server) {}
128 NameserverStats& setSuccesses(int val) {
129 successes = val;
130 return *this;
131 }
132 NameserverStats& setErrors(int val) {
133 errors = val;
134 return *this;
135 }
136 NameserverStats& setTimeouts(int val) {
137 timeouts = val;
138 return *this;
139 }
140 NameserverStats& setInternalErrors(int val) {
141 internal_errors = val;
142 return *this;
143 }
144
145 const std::string server;
146 int successes = 0;
147 int errors = 0;
148 int timeouts = 0;
149 int internal_errors = 0;
150};
151
Mike Yu61d17262020-02-15 18:56:22 +0800152class ScopedSystemProperties {
153 public:
154 ScopedSystemProperties(const std::string& key, const std::string& value) : mStoredKey(key) {
155 mStoredValue = android::base::GetProperty(key, "");
156 android::base::SetProperty(key, value);
157 }
158 ~ScopedSystemProperties() { android::base::SetProperty(mStoredKey, mStoredValue); }
159
160 private:
161 std::string mStoredKey;
162 std::string mStoredValue;
163};
164
Luke Huang5729afc2020-07-30 23:12:17 +0800165const bool isAtLeastR = (getApiLevel() >= 30);
166
Ken Chenb9fa2062018-11-13 21:51:13 +0800167} // namespace
168
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900169class ResolverTest : public ::testing::Test {
Hungming Chene8f970c2019-04-10 17:34:06 +0800170 public:
Hungming Chen473c4de2020-03-12 11:13:35 +0800171 static void SetUpTestSuite() {
Hungming Chen5bf09772019-04-25 11:16:13 +0800172 // Get binder service.
173 // Note that |mDnsClient| is not used for getting binder service in this static function.
174 // The reason is that wants to keep |mDnsClient| as a non-static data member. |mDnsClient|
175 // which sets up device network configuration could be independent from every test.
Luke Huangf8215372019-11-22 11:53:41 +0800176 // TODO: Perhaps add a static function in resolv_test_binder_utils.{cpp,h} to get binder
177 // service.
178
179 AIBinder* binder = AServiceManager_getService("dnsresolver");
180 ndk::SpAIBinder resolvBinder = ndk::SpAIBinder(binder);
181 auto resolvService = aidl::android::net::IDnsResolver::fromBinder(resolvBinder);
Hungming Chen5bf09772019-04-25 11:16:13 +0800182 ASSERT_NE(nullptr, resolvService.get());
183
184 // Subscribe the death recipient to the service IDnsResolver for detecting Netd death.
Luke Huang70070852019-11-25 18:25:50 +0800185 // GTEST assertion macros are not invoked for generating a test failure in the death
186 // recipient because the macros can't indicate failed test if Netd died between tests.
187 // Moreover, continuing testing may have no meaningful after Netd death. Therefore, the
188 // death recipient aborts process by GTEST_LOG_(FATAL) once Netd died.
Luke Huangf8215372019-11-22 11:53:41 +0800189 sResolvDeathRecipient = AIBinder_DeathRecipient_new([](void*) {
190 constexpr char errorMessage[] = "Netd died";
191 LOG(ERROR) << errorMessage;
192 GTEST_LOG_(FATAL) << errorMessage;
193 });
194 ASSERT_EQ(STATUS_OK, AIBinder_linkToDeath(binder, sResolvDeathRecipient, nullptr));
Hungming Chen5bf09772019-04-25 11:16:13 +0800195
196 // Subscribe the DNS listener for verifying DNS metrics event contents.
Luke Huangf8215372019-11-22 11:53:41 +0800197 sDnsMetricsListener = ndk::SharedRefBase::make<DnsMetricsListener>(
198 TEST_NETID /*monitor specific network*/);
Hungming Chen5bf09772019-04-25 11:16:13 +0800199 ASSERT_TRUE(resolvService->registerEventListener(sDnsMetricsListener).isOk());
200
201 // Start the binder thread pool for listening DNS metrics events and receiving death
202 // recipient.
Luke Huangf8215372019-11-22 11:53:41 +0800203 ABinderProcess_startThreadPool();
Hungming Chene8f970c2019-04-10 17:34:06 +0800204 }
Hungming Chen473c4de2020-03-12 11:13:35 +0800205 static void TearDownTestSuite() { AIBinder_DeathRecipient_delete(sResolvDeathRecipient); }
Hungming Chene8f970c2019-04-10 17:34:06 +0800206
Ken Chenb9fa2062018-11-13 21:51:13 +0800207 protected:
Lorenzo Colitti61f796b2020-05-21 00:57:49 +0900208 void SetUp() {
209 mDnsClient.SetUp();
210 sDnsMetricsListener->reset();
211 }
212
Mike Yu960243d2020-01-17 19:02:15 +0800213 void TearDown() {
214 // Ensure the dump works at the end of each test.
215 DumpResolverService();
216
217 mDnsClient.TearDown();
218 }
nuccachena26cc2a2018-07-17 18:07:23 +0800219
Luke Huangf40df9c2020-04-21 08:51:48 +0800220 void resetNetwork() {
221 mDnsClient.TearDown();
222 mDnsClient.SetupOemNetwork();
223 }
224
Xiao Ma09b71022018-12-11 17:56:32 +0900225 void StartDns(test::DNSResponder& dns, const std::vector<DnsRecord>& records) {
226 for (const auto& r : records) {
227 dns.addMapping(r.host_name, r.type, r.addr);
228 }
229
230 ASSERT_TRUE(dns.startServer());
231 dns.clearQueries();
232 }
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900233
Mike Yu960243d2020-01-17 19:02:15 +0800234 void DumpResolverService() {
235 unique_fd fd(open("/dev/null", O_WRONLY));
236 EXPECT_EQ(mDnsClient.resolvService()->dump(fd, nullptr, 0), 0);
237
238 const char* querylogCmd[] = {"querylog"}; // Keep it sync with DnsQueryLog::DUMP_KEYWORD.
239 EXPECT_EQ(mDnsClient.resolvService()->dump(fd, querylogCmd, std::size(querylogCmd)), 0);
240 }
241
Hungming Chene8f970c2019-04-10 17:34:06 +0800242 bool WaitForNat64Prefix(ExpectNat64PrefixStatus status,
243 std::chrono::milliseconds timeout = std::chrono::milliseconds(1000)) {
Hungming Chen5bf09772019-04-25 11:16:13 +0800244 return sDnsMetricsListener->waitForNat64Prefix(status, timeout);
Hungming Chene8f970c2019-04-10 17:34:06 +0800245 }
246
Mike Yu724f77d2019-08-16 11:14:50 +0800247 bool WaitForPrivateDnsValidation(std::string serverAddr, bool validated) {
248 return sDnsMetricsListener->waitForPrivateDnsValidation(serverAddr, validated);
249 }
250
Mike Yu153b5b82020-03-04 19:53:54 +0800251 bool hasUncaughtPrivateDnsValidation(const std::string& serverAddr) {
252 return sDnsMetricsListener->findValidationRecord(serverAddr);
253 }
254
Mike Yu532405f2020-06-17 17:46:44 +0800255 void ExpectDnsEvent(int32_t eventType, int32_t returnCode, const std::string& hostname,
256 const std::vector<std::string>& ipAddresses) {
257 const DnsMetricsListener::DnsEvent expect = {
258 TEST_NETID, eventType, returnCode,
259 hostname, ipAddresses, static_cast<int32_t>(ipAddresses.size())};
Mike Yub8faac42020-06-20 11:11:44 +0800260 do {
261 // Blocking call until timeout.
262 const auto dnsEvent = sDnsMetricsListener->popDnsEvent();
263 ASSERT_TRUE(dnsEvent.has_value()) << "Expected DnsEvent " << expect;
264 if (dnsEvent.value() == expect) break;
265 LOG(INFO) << "Skip unexpected DnsEvent: " << dnsEvent.value();
266 } while (true);
Mike Yu532405f2020-06-17 17:46:44 +0800267 }
268
Mike Yu61d17262020-02-15 18:56:22 +0800269 enum class StatsCmp { LE, EQ };
270
271 bool expectStatsNotGreaterThan(const std::vector<NameserverStats>& nameserversStats) {
272 return expectStatsFromGetResolverInfo(nameserversStats, StatsCmp::LE);
273 }
274
275 bool expectStatsEqualTo(const std::vector<NameserverStats>& nameserversStats) {
276 return expectStatsFromGetResolverInfo(nameserversStats, StatsCmp::EQ);
277 }
278
279 bool expectStatsFromGetResolverInfo(const std::vector<NameserverStats>& nameserversStats,
280 const StatsCmp cmp) {
Mike Yue2162e52020-03-04 18:43:46 +0800281 std::vector<std::string> res_servers;
282 std::vector<std::string> res_domains;
283 std::vector<std::string> res_tls_servers;
284 res_params res_params;
285 std::vector<ResolverStats> res_stats;
286 int wait_for_pending_req_timeout_count;
287
288 if (!DnsResponderClient::GetResolverInfo(mDnsClient.resolvService(), TEST_NETID,
289 &res_servers, &res_domains, &res_tls_servers,
290 &res_params, &res_stats,
291 &wait_for_pending_req_timeout_count)) {
292 ADD_FAILURE() << "GetResolverInfo failed";
293 return false;
294 }
295
296 if (res_servers.size() != res_stats.size()) {
297 ADD_FAILURE() << fmt::format("res_servers.size() != res_stats.size(): {} != {}",
298 res_servers.size(), res_stats.size());
299 return false;
300 }
301 if (res_servers.size() != nameserversStats.size()) {
302 ADD_FAILURE() << fmt::format("res_servers.size() != nameserversStats.size(): {} != {}",
303 res_servers.size(), nameserversStats.size());
304 return false;
305 }
306
307 for (const auto& stats : nameserversStats) {
308 SCOPED_TRACE(stats.server);
309 const auto it = std::find(res_servers.begin(), res_servers.end(), stats.server);
310 if (it == res_servers.end()) {
311 ADD_FAILURE() << fmt::format("nameserver {} not found in the list {{{}}}",
312 stats.server, fmt::join(res_servers, ", "));
313 return false;
314 }
315 const int index = std::distance(res_servers.begin(), it);
316
317 // The check excludes rtt_avg, last_sample_time, and usable since they will be obsolete
318 // after |res_stats| is retrieved from NetConfig.dnsStats rather than NetConfig.nsstats.
Mike Yu61d17262020-02-15 18:56:22 +0800319 switch (cmp) {
320 case StatsCmp::EQ:
321 EXPECT_EQ(res_stats[index].successes, stats.successes);
322 EXPECT_EQ(res_stats[index].errors, stats.errors);
323 EXPECT_EQ(res_stats[index].timeouts, stats.timeouts);
324 EXPECT_EQ(res_stats[index].internal_errors, stats.internal_errors);
325 break;
326 case StatsCmp::LE:
327 EXPECT_LE(res_stats[index].successes, stats.successes);
328 EXPECT_LE(res_stats[index].errors, stats.errors);
329 EXPECT_LE(res_stats[index].timeouts, stats.timeouts);
330 EXPECT_LE(res_stats[index].internal_errors, stats.internal_errors);
331 break;
332 default:
333 ADD_FAILURE() << "Unknown comparator " << static_cast<int>(cmp);
334 return false;
335 }
Mike Yue2162e52020-03-04 18:43:46 +0800336 }
337
338 return true;
339 }
340
Mike Yu153b5b82020-03-04 19:53:54 +0800341 // Since there's no way to terminate private DNS validation threads at any time. Tests that
342 // focus on the results of private DNS validation can interfere with each other if they use the
343 // same IP address for test servers. getUniqueIPv4Address() is a workaround to reduce the
344 // possibility of tests being flaky. A feasible solution is to forbid the validation threads,
345 // which are considered as outdated (e.g. switch the resolver to private DNS OFF mode), updating
346 // the result to the PrivateDnsConfiguration instance.
347 static std::string getUniqueIPv4Address() {
348 static int counter = 0;
349 return fmt::format("127.0.100.{}", (++counter & 0xff));
350 }
351
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900352 DnsResponderClient mDnsClient;
Xiao Ma09b71022018-12-11 17:56:32 +0900353
Hungming Chen5bf09772019-04-25 11:16:13 +0800354 // Use a shared static DNS listener for all tests to avoid registering lots of listeners
355 // which may be released late until process terminated. Currently, registered DNS listener
356 // is removed by binder death notification which is fired when the process hosting an
357 // IBinder has gone away. If every test in ResolverTest registers its DNS listener, Netd
358 // may temporarily hold lots of dead listeners until the unit test process terminates.
359 // TODO: Perhaps add an unregistering listener binder call or fork a listener process which
360 // could be terminated earlier.
Luke Huangf8215372019-11-22 11:53:41 +0800361 static std::shared_ptr<DnsMetricsListener>
Hungming Chen473c4de2020-03-12 11:13:35 +0800362 sDnsMetricsListener; // Initialized in SetUpTestSuite.
Hungming Chen5bf09772019-04-25 11:16:13 +0800363
364 // Use a shared static death recipient to monitor the service death. The static death
365 // recipient could monitor the death not only during the test but also between tests.
Hungming Chen473c4de2020-03-12 11:13:35 +0800366 static AIBinder_DeathRecipient* sResolvDeathRecipient; // Initialized in SetUpTestSuite.
Ken Chenb9fa2062018-11-13 21:51:13 +0800367};
368
Hungming Chen5bf09772019-04-25 11:16:13 +0800369// Initialize static member of class.
Luke Huangf8215372019-11-22 11:53:41 +0800370std::shared_ptr<DnsMetricsListener> ResolverTest::sDnsMetricsListener;
371AIBinder_DeathRecipient* ResolverTest::sResolvDeathRecipient;
Hungming Chen5bf09772019-04-25 11:16:13 +0800372
Ken Chenb9fa2062018-11-13 21:51:13 +0800373TEST_F(ResolverTest, GetHostByName) {
Xiao Ma09b71022018-12-11 17:56:32 +0900374 constexpr char nonexistent_host_name[] = "nonexistent.example.com.";
375
376 test::DNSResponder dns;
377 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.3"}});
378 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800379
380 const hostent* result;
Ken Chenb9fa2062018-11-13 21:51:13 +0800381 result = gethostbyname("nonexistent");
382 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, nonexistent_host_name));
383 ASSERT_TRUE(result == nullptr);
384 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
385
386 dns.clearQueries();
387 result = gethostbyname("hello");
Xiao Ma09b71022018-12-11 17:56:32 +0900388 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
Ken Chenb9fa2062018-11-13 21:51:13 +0800389 ASSERT_FALSE(result == nullptr);
390 ASSERT_EQ(4, result->h_length);
391 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
392 EXPECT_EQ("1.2.3.3", ToString(result));
393 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800394}
395
lifr4e4a2e02019-01-29 16:53:51 +0800396TEST_F(ResolverTest, GetHostByName_cnames) {
397 constexpr char host_name[] = "host.example.com.";
398 size_t cnamecount = 0;
399 test::DNSResponder dns;
400
401 const std::vector<DnsRecord> records = {
402 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
403 {"a.example.com.", ns_type::ns_t_cname, "b.example.com."},
404 {"b.example.com.", ns_type::ns_t_cname, "c.example.com."},
405 {"c.example.com.", ns_type::ns_t_cname, "d.example.com."},
406 {"d.example.com.", ns_type::ns_t_cname, "e.example.com."},
407 {"e.example.com.", ns_type::ns_t_cname, host_name},
408 {host_name, ns_type::ns_t_a, "1.2.3.3"},
409 {host_name, ns_type::ns_t_aaaa, "2001:db8::42"},
410 };
411 StartDns(dns, records);
412 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
413
414 // using gethostbyname2() to resolve ipv4 hello.example.com. to 1.2.3.3
415 // Ensure the v4 address and cnames are correct
416 const hostent* result;
417 result = gethostbyname2("hello", AF_INET);
418 ASSERT_FALSE(result == nullptr);
419
420 for (int i = 0; result != nullptr && result->h_aliases[i] != nullptr; i++) {
421 std::string domain_name = records[i].host_name.substr(0, records[i].host_name.size() - 1);
422 EXPECT_EQ(result->h_aliases[i], domain_name);
423 cnamecount++;
424 }
425 // The size of "Non-cname type" record in DNS records is 2
426 ASSERT_EQ(cnamecount, records.size() - 2);
427 ASSERT_EQ(4, result->h_length);
428 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
429 EXPECT_EQ("1.2.3.3", ToString(result));
430 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
431 EXPECT_EQ(1U, dns.queries().size()) << dns.dumpQueries();
432
433 // using gethostbyname2() to resolve ipv6 hello.example.com. to 2001:db8::42
434 // Ensure the v6 address and cnames are correct
435 cnamecount = 0;
436 dns.clearQueries();
437 result = gethostbyname2("hello", AF_INET6);
438 for (unsigned i = 0; result != nullptr && result->h_aliases[i] != nullptr; i++) {
439 std::string domain_name = records[i].host_name.substr(0, records[i].host_name.size() - 1);
440 EXPECT_EQ(result->h_aliases[i], domain_name);
441 cnamecount++;
442 }
443 // The size of "Non-cname type" DNS record in records is 2
444 ASSERT_EQ(cnamecount, records.size() - 2);
445 ASSERT_FALSE(result == nullptr);
446 ASSERT_EQ(16, result->h_length);
447 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
448 EXPECT_EQ("2001:db8::42", ToString(result));
449 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
450}
451
452TEST_F(ResolverTest, GetHostByName_cnamesInfiniteLoop) {
453 test::DNSResponder dns;
454 const std::vector<DnsRecord> records = {
455 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
456 {"a.example.com.", ns_type::ns_t_cname, kHelloExampleCom},
457 };
458 StartDns(dns, records);
459 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
460
461 const hostent* result;
462 result = gethostbyname2("hello", AF_INET);
463 ASSERT_TRUE(result == nullptr);
464
465 dns.clearQueries();
466 result = gethostbyname2("hello", AF_INET6);
467 ASSERT_TRUE(result == nullptr);
468}
469
Ken Chenb9fa2062018-11-13 21:51:13 +0800470TEST_F(ResolverTest, GetHostByName_localhost) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800471 constexpr char name_camelcase[] = "LocalHost";
Ken Chenb9fa2062018-11-13 21:51:13 +0800472 constexpr char name_ip6_dot[] = "ip6-localhost.";
473 constexpr char name_ip6_fqdn[] = "ip6-localhost.example.com.";
474
markchien96b09e22020-07-29 14:24:34 +0800475 // Add a no-op nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900476 test::DNSResponder dns;
477 StartDns(dns, {});
478 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800479
480 // Expect no DNS queries; localhost is resolved via /etc/hosts
Xiao Ma09b71022018-12-11 17:56:32 +0900481 const hostent* result = gethostbyname(kLocalHost);
Ken Chenb9fa2062018-11-13 21:51:13 +0800482 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
483 ASSERT_FALSE(result == nullptr);
484 ASSERT_EQ(4, result->h_length);
485 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900486 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800487 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
488
489 // Ensure the hosts file resolver ignores case of hostnames
490 result = gethostbyname(name_camelcase);
491 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
492 ASSERT_FALSE(result == nullptr);
493 ASSERT_EQ(4, result->h_length);
494 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900495 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800496 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
497
498 // The hosts file also contains ip6-localhost, but gethostbyname() won't
chenbruce018fdb22019-06-12 18:08:04 +0800499 // return it. This would be easy to
Ken Chenb9fa2062018-11-13 21:51:13 +0800500 // change, but there's no point in changing the legacy behavior; new code
501 // should be calling getaddrinfo() anyway.
502 // So we check the legacy behavior, which results in amusing A-record
503 // lookups for ip6-localhost, with and without search domains appended.
504 dns.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900505 result = gethostbyname(kIp6LocalHost);
Sehee Parkbbca0202018-11-16 10:53:16 +0900506 EXPECT_EQ(2U, dns.queries().size()) << dns.dumpQueries();
507 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, name_ip6_dot)) << dns.dumpQueries();
508 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, name_ip6_fqdn)) << dns.dumpQueries();
Ken Chenb9fa2062018-11-13 21:51:13 +0800509 ASSERT_TRUE(result == nullptr);
510
511 // Finally, use gethostbyname2() to resolve ip6-localhost to ::1 from
512 // the hosts file.
513 dns.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900514 result = gethostbyname2(kIp6LocalHost, AF_INET6);
Ken Chenb9fa2062018-11-13 21:51:13 +0800515 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
516 ASSERT_FALSE(result == nullptr);
517 ASSERT_EQ(16, result->h_length);
518 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900519 EXPECT_EQ(kIp6LocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800520 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800521}
522
523TEST_F(ResolverTest, GetHostByName_numeric) {
markchien96b09e22020-07-29 14:24:34 +0800524 // Add a no-op nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900525 test::DNSResponder dns;
526 StartDns(dns, {});
527 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800528
529 // Numeric v4 address: expect no DNS queries
530 constexpr char numeric_v4[] = "192.168.0.1";
Ken Chenb9fa2062018-11-13 21:51:13 +0800531 const hostent* result = gethostbyname(numeric_v4);
Sehee Parkbbca0202018-11-16 10:53:16 +0900532 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800533 ASSERT_FALSE(result == nullptr);
534 ASSERT_EQ(4, result->h_length); // v4
535 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
536 EXPECT_EQ(numeric_v4, ToString(result));
537 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
538
539 // gethostbyname() recognizes a v6 address, and fails with no DNS queries
540 constexpr char numeric_v6[] = "2001:db8::42";
541 dns.clearQueries();
542 result = gethostbyname(numeric_v6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900543 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800544 EXPECT_TRUE(result == nullptr);
545
546 // Numeric v6 address with gethostbyname2(): succeeds with no DNS queries
547 dns.clearQueries();
548 result = gethostbyname2(numeric_v6, AF_INET6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900549 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800550 ASSERT_FALSE(result == nullptr);
551 ASSERT_EQ(16, result->h_length); // v6
552 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
553 EXPECT_EQ(numeric_v6, ToString(result));
554 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
555
556 // Numeric v6 address with scope work with getaddrinfo(),
557 // but gethostbyname2() does not understand them; it issues two dns
558 // queries, then fails. This hardly ever happens, there's no point
559 // in fixing this. This test simply verifies the current (bogus)
560 // behavior to avoid further regressions (like crashes, or leaks).
561 constexpr char numeric_v6_scope[] = "fe80::1%lo";
562 dns.clearQueries();
563 result = gethostbyname2(numeric_v6_scope, AF_INET6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900564 EXPECT_EQ(2U, dns.queries().size()); // OUCH!
Ken Chenb9fa2062018-11-13 21:51:13 +0800565 ASSERT_TRUE(result == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800566}
567
568TEST_F(ResolverTest, BinderSerialization) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800569 std::vector<int> params_offsets = {
Luke Huang5bd827c2019-03-14 16:10:04 +0800570 IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY,
571 IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD,
572 IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES,
573 IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES,
574 IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC,
575 IDnsResolver::RESOLVER_PARAMS_RETRY_COUNT,
Ken Chenb9fa2062018-11-13 21:51:13 +0800576 };
Bernie Innocentib102dd22018-12-04 14:57:48 +0900577 const int size = static_cast<int>(params_offsets.size());
Luke Huang5bd827c2019-03-14 16:10:04 +0800578 EXPECT_EQ(size, IDnsResolver::RESOLVER_PARAMS_COUNT);
Ken Chenb9fa2062018-11-13 21:51:13 +0800579 std::sort(params_offsets.begin(), params_offsets.end());
Bernie Innocentib102dd22018-12-04 14:57:48 +0900580 for (int i = 0; i < size; ++i) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800581 EXPECT_EQ(params_offsets[i], i);
582 }
583}
584
585TEST_F(ResolverTest, GetHostByName_Binder) {
Luke Huangf8215372019-11-22 11:53:41 +0800586 std::vector<std::string> domains = {"example.com"};
Ken Chenb9fa2062018-11-13 21:51:13 +0800587 std::vector<std::unique_ptr<test::DNSResponder>> dns;
588 std::vector<std::string> servers;
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900589 std::vector<DnsResponderClient::Mapping> mappings;
590 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupMappings(1, domains, &mappings));
591 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupDNSServers(4, mappings, &dns, &servers));
Ken Chenb9fa2062018-11-13 21:51:13 +0800592 ASSERT_EQ(1U, mappings.size());
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900593 const DnsResponderClient::Mapping& mapping = mappings[0];
Ken Chenb9fa2062018-11-13 21:51:13 +0800594
Xiao Ma09b71022018-12-11 17:56:32 +0900595 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains, kDefaultParams));
Ken Chenb9fa2062018-11-13 21:51:13 +0800596
597 const hostent* result = gethostbyname(mapping.host.c_str());
Bernie Innocentib102dd22018-12-04 14:57:48 +0900598 const size_t total_queries =
Luke Huangfde82482019-06-04 01:04:53 +0800599 std::accumulate(dns.begin(), dns.end(), 0, [&mapping](size_t total, auto& d) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800600 return total + GetNumQueriesForType(*d, ns_type::ns_t_a, mapping.entry.c_str());
601 });
602
603 EXPECT_LE(1U, total_queries);
604 ASSERT_FALSE(result == nullptr);
605 ASSERT_EQ(4, result->h_length);
606 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
607 EXPECT_EQ(mapping.ip4, ToString(result));
608 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
609
610 std::vector<std::string> res_servers;
611 std::vector<std::string> res_domains;
Mike Yu0a1c53d2018-11-26 13:26:21 +0900612 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +0900613 res_params res_params;
Ken Chenb9fa2062018-11-13 21:51:13 +0800614 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +0800615 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +0800616 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
617 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
618 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chenb9fa2062018-11-13 21:51:13 +0800619 EXPECT_EQ(servers.size(), res_servers.size());
620 EXPECT_EQ(domains.size(), res_domains.size());
Mike Yu0a1c53d2018-11-26 13:26:21 +0900621 EXPECT_EQ(0U, res_tls_servers.size());
Luke Huang5bd827c2019-03-14 16:10:04 +0800622 ASSERT_EQ(static_cast<size_t>(IDnsResolver::RESOLVER_PARAMS_COUNT), kDefaultParams.size());
623 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY],
624 res_params.sample_validity);
625 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900626 res_params.success_threshold);
Luke Huang5bd827c2019-03-14 16:10:04 +0800627 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
628 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
629 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
Ken Chenb9fa2062018-11-13 21:51:13 +0800630 res_params.base_timeout_msec);
631 EXPECT_EQ(servers.size(), res_stats.size());
632
Bernie Innocenti0c067e42019-04-01 15:33:16 +0900633 EXPECT_THAT(res_servers, testing::UnorderedElementsAreArray(servers));
634 EXPECT_THAT(res_domains, testing::UnorderedElementsAreArray(domains));
Ken Chenb9fa2062018-11-13 21:51:13 +0800635}
636
637TEST_F(ResolverTest, GetAddrInfo) {
Xiao Ma09b71022018-12-11 17:56:32 +0900638 constexpr char listen_addr[] = "127.0.0.4";
639 constexpr char listen_addr2[] = "127.0.0.5";
640 constexpr char host_name[] = "howdy.example.com.";
Ken Chenb9fa2062018-11-13 21:51:13 +0800641
Xiao Ma09b71022018-12-11 17:56:32 +0900642 const std::vector<DnsRecord> records = {
643 {host_name, ns_type::ns_t_a, "1.2.3.4"},
644 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
645 };
646 test::DNSResponder dns(listen_addr);
647 test::DNSResponder dns2(listen_addr2);
648 StartDns(dns, records);
649 StartDns(dns2, records);
Ken Chenb9fa2062018-11-13 21:51:13 +0800650
Xiao Ma09b71022018-12-11 17:56:32 +0900651 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}));
Ken Chenb9fa2062018-11-13 21:51:13 +0800652 dns.clearQueries();
653 dns2.clearQueries();
654
655 ScopedAddrinfo result = safe_getaddrinfo("howdy", nullptr, nullptr);
656 EXPECT_TRUE(result != nullptr);
657 size_t found = GetNumQueries(dns, host_name);
658 EXPECT_LE(1U, found);
659 // Could be A or AAAA
660 std::string result_str = ToString(result);
661 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +0800662 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +0800663
664 // Verify that the name is cached.
665 size_t old_found = found;
666 result = safe_getaddrinfo("howdy", nullptr, nullptr);
667 EXPECT_TRUE(result != nullptr);
668 found = GetNumQueries(dns, host_name);
669 EXPECT_LE(1U, found);
670 EXPECT_EQ(old_found, found);
671 result_str = ToString(result);
Luke Huangf8215372019-11-22 11:53:41 +0800672 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4") << result_str;
Ken Chenb9fa2062018-11-13 21:51:13 +0800673
674 // Change the DNS resolver, ensure that queries are still cached.
Xiao Ma09b71022018-12-11 17:56:32 +0900675 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr2}));
Ken Chenb9fa2062018-11-13 21:51:13 +0800676 dns.clearQueries();
677 dns2.clearQueries();
678
679 result = safe_getaddrinfo("howdy", nullptr, nullptr);
680 EXPECT_TRUE(result != nullptr);
681 found = GetNumQueries(dns, host_name);
682 size_t found2 = GetNumQueries(dns2, host_name);
683 EXPECT_EQ(0U, found);
684 EXPECT_LE(0U, found2);
685
686 // Could be A or AAAA
687 result_str = ToString(result);
688 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +0800689 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +0800690}
691
692TEST_F(ResolverTest, GetAddrInfoV4) {
Xiao Ma09b71022018-12-11 17:56:32 +0900693 test::DNSResponder dns;
694 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.5"}});
695 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800696
Xiao Ma09b71022018-12-11 17:56:32 +0900697 const addrinfo hints = {.ai_family = AF_INET};
698 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
Ken Chenb9fa2062018-11-13 21:51:13 +0800699 EXPECT_TRUE(result != nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900700 EXPECT_EQ(1U, GetNumQueries(dns, kHelloExampleCom));
Ken Chenb9fa2062018-11-13 21:51:13 +0800701 EXPECT_EQ("1.2.3.5", ToString(result));
702}
703
704TEST_F(ResolverTest, GetAddrInfo_localhost) {
markchien96b09e22020-07-29 14:24:34 +0800705 // Add a no-op nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900706 test::DNSResponder dns;
707 StartDns(dns, {});
708 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800709
Xiao Ma09b71022018-12-11 17:56:32 +0900710 ScopedAddrinfo result = safe_getaddrinfo(kLocalHost, nullptr, nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800711 EXPECT_TRUE(result != nullptr);
712 // Expect no DNS queries; localhost is resolved via /etc/hosts
713 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900714 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800715
Xiao Ma09b71022018-12-11 17:56:32 +0900716 result = safe_getaddrinfo(kIp6LocalHost, nullptr, nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800717 EXPECT_TRUE(result != nullptr);
718 // Expect no DNS queries; ip6-localhost is resolved via /etc/hosts
719 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900720 EXPECT_EQ(kIp6LocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800721}
722
Luke Huangd8ac4752019-06-18 17:05:47 +0800723TEST_F(ResolverTest, GetAddrInfo_InvalidSocketType) {
724 test::DNSResponder dns;
725 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.5"}});
726 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
727
728 // TODO: Test other invalid socket types.
729 const addrinfo hints = {
730 .ai_family = AF_UNSPEC,
Luke Huangd8ac4752019-06-18 17:05:47 +0800731 .ai_socktype = SOCK_PACKET,
732 };
733 addrinfo* result = nullptr;
734 // This is a valid hint, but the query won't be sent because the socket type is
735 // not supported.
736 EXPECT_EQ(EAI_NODATA, getaddrinfo("hello", nullptr, &hints, &result));
737 ScopedAddrinfo result_cleanup(result);
738 EXPECT_EQ(nullptr, result);
739}
740
Ken Chen92bed612018-12-22 21:46:55 +0800741// Verify if the resolver correctly handle multiple queries simultaneously
742// step 1: set dns server#1 into deferred responding mode.
743// step 2: thread#1 query "hello.example.com." --> resolver send query to server#1.
744// step 3: thread#2 query "hello.example.com." --> resolver hold the request and wait for
745// response of previous pending query sent by thread#1.
746// step 4: thread#3 query "konbanha.example.com." --> resolver send query to server#3. Server
747// respond to resolver immediately.
748// step 5: check if server#1 get 1 query by thread#1, server#2 get 0 query, server#3 get 1 query.
749// step 6: resume dns server#1 to respond dns query in step#2.
750// step 7: thread#1 and #2 should get returned from DNS query after step#6. Also, check the
751// number of queries in server#2 is 0 to ensure thread#2 does not wake up unexpectedly
752// before signaled by thread#1.
753TEST_F(ResolverTest, GetAddrInfoV4_deferred_resp) {
754 const char* listen_addr1 = "127.0.0.9";
755 const char* listen_addr2 = "127.0.0.10";
756 const char* listen_addr3 = "127.0.0.11";
757 const char* listen_srv = "53";
758 const char* host_name_deferred = "hello.example.com.";
759 const char* host_name_normal = "konbanha.example.com.";
Mike Yufc125e42019-05-15 20:41:28 +0800760 test::DNSResponder dns1(listen_addr1, listen_srv, ns_rcode::ns_r_servfail);
761 test::DNSResponder dns2(listen_addr2, listen_srv, ns_rcode::ns_r_servfail);
762 test::DNSResponder dns3(listen_addr3, listen_srv, ns_rcode::ns_r_servfail);
Ken Chen92bed612018-12-22 21:46:55 +0800763 dns1.addMapping(host_name_deferred, ns_type::ns_t_a, "1.2.3.4");
764 dns2.addMapping(host_name_deferred, ns_type::ns_t_a, "1.2.3.4");
765 dns3.addMapping(host_name_normal, ns_type::ns_t_a, "1.2.3.5");
766 ASSERT_TRUE(dns1.startServer());
767 ASSERT_TRUE(dns2.startServer());
768 ASSERT_TRUE(dns3.startServer());
769 const std::vector<std::string> servers_for_t1 = {listen_addr1};
770 const std::vector<std::string> servers_for_t2 = {listen_addr2};
771 const std::vector<std::string> servers_for_t3 = {listen_addr3};
772 addrinfo hints = {.ai_family = AF_INET};
773 const std::vector<int> params = {300, 25, 8, 8, 5000};
774 bool t3_task_done = false;
775
776 dns1.setDeferredResp(true);
777 std::thread t1([&, this]() {
778 ASSERT_TRUE(
779 mDnsClient.SetResolversForNetwork(servers_for_t1, kDefaultSearchDomains, params));
780 ScopedAddrinfo result = safe_getaddrinfo(host_name_deferred, nullptr, &hints);
781 // t3's dns query should got returned first
782 EXPECT_TRUE(t3_task_done);
783 EXPECT_EQ(1U, GetNumQueries(dns1, host_name_deferred));
784 EXPECT_TRUE(result != nullptr);
785 EXPECT_EQ("1.2.3.4", ToString(result));
786 });
787
788 // ensuring t1 and t2 handler functions are processed in order
789 usleep(100 * 1000);
790 std::thread t2([&, this]() {
791 ASSERT_TRUE(
792 mDnsClient.SetResolversForNetwork(servers_for_t2, kDefaultSearchDomains, params));
793 ScopedAddrinfo result = safe_getaddrinfo(host_name_deferred, nullptr, &hints);
794 EXPECT_TRUE(t3_task_done);
795 EXPECT_EQ(0U, GetNumQueries(dns2, host_name_deferred));
796 EXPECT_TRUE(result != nullptr);
797 EXPECT_EQ("1.2.3.4", ToString(result));
798
799 std::vector<std::string> res_servers;
800 std::vector<std::string> res_domains;
801 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +0900802 res_params res_params;
Ken Chen92bed612018-12-22 21:46:55 +0800803 std::vector<ResolverStats> res_stats;
804 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +0800805 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
806 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains,
807 &res_tls_servers, &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chen92bed612018-12-22 21:46:55 +0800808 EXPECT_EQ(0, wait_for_pending_req_timeout_count);
809 });
810
811 // ensuring t2 and t3 handler functions are processed in order
812 usleep(100 * 1000);
813 std::thread t3([&, this]() {
814 ASSERT_TRUE(
815 mDnsClient.SetResolversForNetwork(servers_for_t3, kDefaultSearchDomains, params));
816 ScopedAddrinfo result = safe_getaddrinfo(host_name_normal, nullptr, &hints);
817 EXPECT_EQ(1U, GetNumQueries(dns1, host_name_deferred));
818 EXPECT_EQ(0U, GetNumQueries(dns2, host_name_deferred));
819 EXPECT_EQ(1U, GetNumQueries(dns3, host_name_normal));
820 EXPECT_TRUE(result != nullptr);
821 EXPECT_EQ("1.2.3.5", ToString(result));
822
823 t3_task_done = true;
824 dns1.setDeferredResp(false);
825 });
826 t3.join();
827 t1.join();
828 t2.join();
829}
830
lifr4e4a2e02019-01-29 16:53:51 +0800831TEST_F(ResolverTest, GetAddrInfo_cnames) {
832 constexpr char host_name[] = "host.example.com.";
833 test::DNSResponder dns;
834 const std::vector<DnsRecord> records = {
835 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
836 {"a.example.com.", ns_type::ns_t_cname, "b.example.com."},
837 {"b.example.com.", ns_type::ns_t_cname, "c.example.com."},
838 {"c.example.com.", ns_type::ns_t_cname, "d.example.com."},
839 {"d.example.com.", ns_type::ns_t_cname, "e.example.com."},
840 {"e.example.com.", ns_type::ns_t_cname, host_name},
841 {host_name, ns_type::ns_t_a, "1.2.3.3"},
842 {host_name, ns_type::ns_t_aaaa, "2001:db8::42"},
843 };
844 StartDns(dns, records);
845 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
846
847 addrinfo hints = {.ai_family = AF_INET};
848 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
849 EXPECT_TRUE(result != nullptr);
850 EXPECT_EQ("1.2.3.3", ToString(result));
851
852 dns.clearQueries();
853 hints = {.ai_family = AF_INET6};
854 result = safe_getaddrinfo("hello", nullptr, &hints);
855 EXPECT_TRUE(result != nullptr);
856 EXPECT_EQ("2001:db8::42", ToString(result));
857}
858
859TEST_F(ResolverTest, GetAddrInfo_cnamesNoIpAddress) {
860 test::DNSResponder dns;
861 const std::vector<DnsRecord> records = {
862 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
863 };
864 StartDns(dns, records);
865 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
866
867 addrinfo hints = {.ai_family = AF_INET};
868 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
869 EXPECT_TRUE(result == nullptr);
870
871 dns.clearQueries();
872 hints = {.ai_family = AF_INET6};
873 result = safe_getaddrinfo("hello", nullptr, &hints);
874 EXPECT_TRUE(result == nullptr);
875}
876
877TEST_F(ResolverTest, GetAddrInfo_cnamesIllegalRdata) {
878 test::DNSResponder dns;
879 const std::vector<DnsRecord> records = {
880 {kHelloExampleCom, ns_type::ns_t_cname, ".!#?"},
881 };
882 StartDns(dns, records);
883 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
884
885 addrinfo hints = {.ai_family = AF_INET};
886 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
887 EXPECT_TRUE(result == nullptr);
888
889 dns.clearQueries();
890 hints = {.ai_family = AF_INET6};
891 result = safe_getaddrinfo("hello", nullptr, &hints);
892 EXPECT_TRUE(result == nullptr);
893}
894
Ken Chenb9fa2062018-11-13 21:51:13 +0800895TEST_F(ResolverTest, MultidomainResolution) {
Xiao Ma09b71022018-12-11 17:56:32 +0900896 constexpr char host_name[] = "nihao.example2.com.";
Luke Huangf8215372019-11-22 11:53:41 +0800897 std::vector<std::string> searchDomains = {"example1.com", "example2.com", "example3.com"};
Ken Chenb9fa2062018-11-13 21:51:13 +0800898
Xiao Ma09b71022018-12-11 17:56:32 +0900899 test::DNSResponder dns("127.0.0.6");
900 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.3"}});
901 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({"127.0.0.6"}, searchDomains));
902
Ken Chenb9fa2062018-11-13 21:51:13 +0800903 const hostent* result = gethostbyname("nihao");
Xiao Ma09b71022018-12-11 17:56:32 +0900904
Ken Chenb9fa2062018-11-13 21:51:13 +0800905 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
906 ASSERT_FALSE(result == nullptr);
907 ASSERT_EQ(4, result->h_length);
908 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
909 EXPECT_EQ("1.2.3.3", ToString(result));
910 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800911}
912
913TEST_F(ResolverTest, GetAddrInfoV6_numeric) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800914 constexpr char host_name[] = "ohayou.example.com.";
915 constexpr char numeric_addr[] = "fe80::1%lo";
916
Xiao Ma09b71022018-12-11 17:56:32 +0900917 test::DNSResponder dns;
Ken Chenb9fa2062018-11-13 21:51:13 +0800918 dns.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900919 StartDns(dns, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
920 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800921
922 addrinfo hints = {.ai_family = AF_INET6};
923 ScopedAddrinfo result = safe_getaddrinfo(numeric_addr, nullptr, &hints);
924 EXPECT_TRUE(result != nullptr);
925 EXPECT_EQ(numeric_addr, ToString(result));
926 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
927
928 // Now try a non-numeric hostname query with the AI_NUMERICHOST flag set.
929 // We should fail without sending out a DNS query.
930 hints.ai_flags |= AI_NUMERICHOST;
931 result = safe_getaddrinfo(host_name, nullptr, &hints);
932 EXPECT_TRUE(result == nullptr);
933 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
934}
935
936TEST_F(ResolverTest, GetAddrInfoV6_failing) {
Xiao Ma09b71022018-12-11 17:56:32 +0900937 constexpr char listen_addr0[] = "127.0.0.7";
938 constexpr char listen_addr1[] = "127.0.0.8";
Ken Chenb9fa2062018-11-13 21:51:13 +0800939 const char* host_name = "ohayou.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +0900940
941 test::DNSResponder dns0(listen_addr0);
942 test::DNSResponder dns1(listen_addr1);
Ken Chenb9fa2062018-11-13 21:51:13 +0800943 dns0.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900944 StartDns(dns0, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
945 StartDns(dns1, {{host_name, ns_type::ns_t_aaaa, "2001:db8::6"}});
946
Luke Huangf8215372019-11-22 11:53:41 +0800947 std::vector<std::string> servers = {listen_addr0, listen_addr1};
Ken Chenb9fa2062018-11-13 21:51:13 +0800948 // <sample validity in s> <success threshold in percent> <min samples> <max samples>
949 int sample_count = 8;
Luke Huangf8215372019-11-22 11:53:41 +0800950 const std::vector<int> params = {300, 25, sample_count, sample_count};
Xiao Ma09b71022018-12-11 17:56:32 +0900951 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, kDefaultSearchDomains, params));
Ken Chenb9fa2062018-11-13 21:51:13 +0800952
953 // Repeatedly perform resolutions for non-existing domains until MAXNSSAMPLES resolutions have
954 // reached the dns0, which is set to fail. No more requests should then arrive at that server
955 // for the next sample_lifetime seconds.
956 // TODO: This approach is implementation-dependent, change once metrics reporting is available.
Xiao Ma09b71022018-12-11 17:56:32 +0900957 const addrinfo hints = {.ai_family = AF_INET6};
Bernie Innocentib102dd22018-12-04 14:57:48 +0900958 for (int i = 0; i < sample_count; ++i) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800959 std::string domain = StringPrintf("nonexistent%d", i);
960 ScopedAddrinfo result = safe_getaddrinfo(domain.c_str(), nullptr, &hints);
961 }
962 // Due to 100% errors for all possible samples, the server should be ignored from now on and
963 // only the second one used for all following queries, until NSSAMPLE_VALIDITY is reached.
964 dns0.clearQueries();
965 dns1.clearQueries();
966 ScopedAddrinfo result = safe_getaddrinfo("ohayou", nullptr, &hints);
967 EXPECT_TRUE(result != nullptr);
968 EXPECT_EQ(0U, GetNumQueries(dns0, host_name));
969 EXPECT_EQ(1U, GetNumQueries(dns1, host_name));
970}
971
972TEST_F(ResolverTest, GetAddrInfoV6_nonresponsive) {
Xiao Ma09b71022018-12-11 17:56:32 +0900973 constexpr char listen_addr0[] = "127.0.0.7";
974 constexpr char listen_addr1[] = "127.0.0.8";
975 constexpr char listen_srv[] = "53";
976 constexpr char host_name1[] = "ohayou.example.com.";
977 constexpr char host_name2[] = "ciao.example.com.";
Luke Huang483cf332019-06-03 17:24:51 +0800978 const std::vector<std::string> defaultSearchDomain = {"example.com"};
979 // The minimal timeout is 1000ms, so we can't decrease timeout
980 // So reduce retry count.
981 const std::vector<int> reduceRetryParams = {
982 300, // sample validity in seconds
983 25, // success threshod in percent
984 8, 8, // {MIN,MAX}_SAMPLES
985 1000, // BASE_TIMEOUT_MSEC
986 1, // retry count
987 };
Xiao Ma09b71022018-12-11 17:56:32 +0900988 const std::vector<DnsRecord> records0 = {
989 {host_name1, ns_type::ns_t_aaaa, "2001:db8::5"},
990 {host_name2, ns_type::ns_t_aaaa, "2001:db8::5"},
991 };
992 const std::vector<DnsRecord> records1 = {
993 {host_name1, ns_type::ns_t_aaaa, "2001:db8::6"},
994 {host_name2, ns_type::ns_t_aaaa, "2001:db8::6"},
995 };
Ken Chenb9fa2062018-11-13 21:51:13 +0800996
997 // dns0 does not respond with 100% probability, while
998 // dns1 responds normally, at least initially.
Mike Yufc125e42019-05-15 20:41:28 +0800999 test::DNSResponder dns0(listen_addr0, listen_srv, static_cast<ns_rcode>(-1));
1000 test::DNSResponder dns1(listen_addr1, listen_srv, static_cast<ns_rcode>(-1));
Ken Chenb9fa2062018-11-13 21:51:13 +08001001 dns0.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +09001002 StartDns(dns0, records0);
1003 StartDns(dns1, records1);
Luke Huang483cf332019-06-03 17:24:51 +08001004 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr0, listen_addr1}, defaultSearchDomain,
1005 reduceRetryParams));
Ken Chenb9fa2062018-11-13 21:51:13 +08001006
Luke Huang483cf332019-06-03 17:24:51 +08001007 // Specify ai_socktype to make getaddrinfo will only query 1 time
1008 const addrinfo hints = {.ai_family = AF_INET6, .ai_socktype = SOCK_STREAM};
Ken Chenb9fa2062018-11-13 21:51:13 +08001009
1010 // dns0 will ignore the request, and we'll fallback to dns1 after the first
1011 // retry.
1012 ScopedAddrinfo result = safe_getaddrinfo(host_name1, nullptr, &hints);
1013 EXPECT_TRUE(result != nullptr);
1014 EXPECT_EQ(1U, GetNumQueries(dns0, host_name1));
1015 EXPECT_EQ(1U, GetNumQueries(dns1, host_name1));
Mike Yu532405f2020-06-17 17:46:44 +08001016 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, 0, host_name1, {"2001:db8::6"});
Ken Chenb9fa2062018-11-13 21:51:13 +08001017
1018 // Now make dns1 also ignore 100% requests... The resolve should alternate
Luke Huang483cf332019-06-03 17:24:51 +08001019 // queries between the nameservers and fail
Ken Chenb9fa2062018-11-13 21:51:13 +08001020 dns1.setResponseProbability(0.0);
1021 addrinfo* result2 = nullptr;
1022 EXPECT_EQ(EAI_NODATA, getaddrinfo(host_name2, nullptr, &hints, &result2));
1023 EXPECT_EQ(nullptr, result2);
Luke Huang483cf332019-06-03 17:24:51 +08001024 EXPECT_EQ(1U, GetNumQueries(dns0, host_name2));
1025 EXPECT_EQ(1U, GetNumQueries(dns1, host_name2));
Mike Yu532405f2020-06-17 17:46:44 +08001026 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, RCODE_TIMEOUT, host_name2, {});
Ken Chenb9fa2062018-11-13 21:51:13 +08001027}
1028
1029TEST_F(ResolverTest, GetAddrInfoV6_concurrent) {
Xiao Ma09b71022018-12-11 17:56:32 +09001030 constexpr char listen_addr0[] = "127.0.0.9";
1031 constexpr char listen_addr1[] = "127.0.0.10";
1032 constexpr char listen_addr2[] = "127.0.0.11";
1033 constexpr char host_name[] = "konbanha.example.com.";
1034
1035 test::DNSResponder dns0(listen_addr0);
1036 test::DNSResponder dns1(listen_addr1);
1037 test::DNSResponder dns2(listen_addr2);
1038 StartDns(dns0, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
1039 StartDns(dns1, {{host_name, ns_type::ns_t_aaaa, "2001:db8::6"}});
1040 StartDns(dns2, {{host_name, ns_type::ns_t_aaaa, "2001:db8::7"}});
1041
Luke Huangf8215372019-11-22 11:53:41 +08001042 const std::vector<std::string> servers = {listen_addr0, listen_addr1, listen_addr2};
Ken Chenb9fa2062018-11-13 21:51:13 +08001043 std::vector<std::thread> threads(10);
1044 for (std::thread& thread : threads) {
Luke Huangf8215372019-11-22 11:53:41 +08001045 thread = std::thread([this, &servers]() {
1046 unsigned delay = arc4random_uniform(1 * 1000 * 1000); // <= 1s
Ken Chenb9fa2062018-11-13 21:51:13 +08001047 usleep(delay);
1048 std::vector<std::string> serverSubset;
1049 for (const auto& server : servers) {
1050 if (arc4random_uniform(2)) {
1051 serverSubset.push_back(server);
1052 }
1053 }
1054 if (serverSubset.empty()) serverSubset = servers;
Xiao Ma09b71022018-12-11 17:56:32 +09001055 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(serverSubset));
1056 const addrinfo hints = {.ai_family = AF_INET6};
Ken Chenb9fa2062018-11-13 21:51:13 +08001057 addrinfo* result = nullptr;
1058 int rv = getaddrinfo("konbanha", nullptr, &hints, &result);
1059 EXPECT_EQ(0, rv) << "error [" << rv << "] " << gai_strerror(rv);
1060 if (result) {
1061 freeaddrinfo(result);
1062 result = nullptr;
1063 }
1064 });
1065 }
1066 for (std::thread& thread : threads) {
1067 thread.join();
1068 }
Ken Chen92bed612018-12-22 21:46:55 +08001069
1070 std::vector<std::string> res_servers;
1071 std::vector<std::string> res_domains;
1072 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001073 res_params res_params;
Ken Chen92bed612018-12-22 21:46:55 +08001074 std::vector<ResolverStats> res_stats;
1075 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001076 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1077 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1078 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chen92bed612018-12-22 21:46:55 +08001079 EXPECT_EQ(0, wait_for_pending_req_timeout_count);
Ken Chenb9fa2062018-11-13 21:51:13 +08001080}
1081
Mike Yu8ac63402019-12-02 15:28:38 +08001082TEST_F(ResolverTest, SkipBadServersDueToInternalError) {
Mike Yu61d17262020-02-15 18:56:22 +08001083 const std::string kSortNameserversFlag("persist.device_config.netd_native.sort_nameservers");
Mike Yu8ac63402019-12-02 15:28:38 +08001084 constexpr char listen_addr1[] = "fe80::1";
1085 constexpr char listen_addr2[] = "255.255.255.255";
1086 constexpr char listen_addr3[] = "127.0.0.3";
Mike Yu61d17262020-02-15 18:56:22 +08001087 int counter = 0; // To generate unique hostnames.
Mike Yu8ac63402019-12-02 15:28:38 +08001088 test::DNSResponder dns(listen_addr3);
1089 ASSERT_TRUE(dns.startServer());
1090
Mike Yu61d17262020-02-15 18:56:22 +08001091 ResolverParamsParcel setupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1092 setupParams.servers = {listen_addr1, listen_addr2, listen_addr3};
1093 setupParams.minSamples = 2; // Recognize bad servers in two attempts when sorting not enabled.
Mike Yu8ac63402019-12-02 15:28:38 +08001094
Mike Yu61d17262020-02-15 18:56:22 +08001095 ResolverParamsParcel cleanupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1096 cleanupParams.servers.clear();
1097 cleanupParams.tlsServers.clear();
Mike Yu8ac63402019-12-02 15:28:38 +08001098
Mike Yu61d17262020-02-15 18:56:22 +08001099 for (const auto& sortNameserversFlag : {"" /* unset */, "0" /* off */, "1" /* on */}) {
1100 SCOPED_TRACE(fmt::format("sortNameversFlag_{}", sortNameserversFlag));
1101 ScopedSystemProperties scopedSystemProperties(kSortNameserversFlag, sortNameserversFlag);
1102
1103 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(setupParams));
1104
1105 // Start sending synchronized querying.
1106 for (int i = 0; i < 100; i++) {
1107 std::string hostName = StringPrintf("hello%d.com.", counter++);
1108 dns.addMapping(hostName, ns_type::ns_t_a, "1.2.3.4");
1109 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1110 EXPECT_TRUE(safe_getaddrinfo(hostName.c_str(), nullptr, &hints) != nullptr);
1111 }
1112
1113 const std::vector<NameserverStats> targetStats = {
1114 NameserverStats(listen_addr1).setInternalErrors(5),
1115 NameserverStats(listen_addr2).setInternalErrors(5),
1116 NameserverStats(listen_addr3).setSuccesses(setupParams.maxSamples),
1117 };
1118 EXPECT_TRUE(expectStatsNotGreaterThan(targetStats));
1119
1120 // Also verify the number of queries received in the server because res_stats.successes has
1121 // a maximum.
1122 EXPECT_EQ(dns.queries().size(), 100U);
1123
1124 // Reset the state.
1125 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(cleanupParams));
1126 dns.clearQueries();
Mike Yu8ac63402019-12-02 15:28:38 +08001127 }
Mike Yu8ac63402019-12-02 15:28:38 +08001128}
1129
1130TEST_F(ResolverTest, SkipBadServersDueToTimeout) {
Mike Yu61d17262020-02-15 18:56:22 +08001131 const std::string kSortNameserversFlag("persist.device_config.netd_native.sort_nameservers");
Mike Yu8ac63402019-12-02 15:28:38 +08001132 constexpr char listen_addr1[] = "127.0.0.3";
1133 constexpr char listen_addr2[] = "127.0.0.4";
Mike Yu61d17262020-02-15 18:56:22 +08001134 int counter = 0; // To generate unique hostnames.
1135
1136 ResolverParamsParcel setupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1137 setupParams.servers = {listen_addr1, listen_addr2};
1138 setupParams.minSamples = 2; // Recognize bad servers in two attempts when sorting not enabled.
1139
1140 ResolverParamsParcel cleanupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1141 cleanupParams.servers.clear();
1142 cleanupParams.tlsServers.clear();
Mike Yu8ac63402019-12-02 15:28:38 +08001143
1144 // Set dns1 non-responsive and dns2 workable.
1145 test::DNSResponder dns1(listen_addr1, test::kDefaultListenService, static_cast<ns_rcode>(-1));
1146 test::DNSResponder dns2(listen_addr2);
1147 dns1.setResponseProbability(0.0);
1148 ASSERT_TRUE(dns1.startServer());
1149 ASSERT_TRUE(dns2.startServer());
1150
Mike Yu61d17262020-02-15 18:56:22 +08001151 for (const auto& sortNameserversFlag : {"" /* unset */, "0" /* off */, "1" /* on */}) {
1152 SCOPED_TRACE(fmt::format("sortNameversFlag_{}", sortNameserversFlag));
1153 ScopedSystemProperties scopedSystemProperties(kSortNameserversFlag, sortNameserversFlag);
Mike Yu8ac63402019-12-02 15:28:38 +08001154
Mike Yu61d17262020-02-15 18:56:22 +08001155 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(setupParams));
Mike Yu8ac63402019-12-02 15:28:38 +08001156
Mike Yu61d17262020-02-15 18:56:22 +08001157 // Start sending synchronized querying.
1158 for (int i = 0; i < 100; i++) {
1159 std::string hostName = StringPrintf("hello%d.com.", counter++);
1160 dns1.addMapping(hostName, ns_type::ns_t_a, "1.2.3.4");
1161 dns2.addMapping(hostName, ns_type::ns_t_a, "1.2.3.5");
1162 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1163 EXPECT_TRUE(safe_getaddrinfo(hostName.c_str(), nullptr, &hints) != nullptr);
1164 }
1165
1166 const std::vector<NameserverStats> targetStats = {
1167 NameserverStats(listen_addr1).setTimeouts(5),
1168 NameserverStats(listen_addr2).setSuccesses(setupParams.maxSamples),
1169 };
1170 EXPECT_TRUE(expectStatsNotGreaterThan(targetStats));
1171
1172 // Also verify the number of queries received in the server because res_stats.successes has
1173 // an upper bound.
1174 EXPECT_GT(dns1.queries().size(), 0U);
1175 EXPECT_LT(dns1.queries().size(), 5U);
1176 EXPECT_EQ(dns2.queries().size(), 100U);
1177
1178 // Reset the state.
1179 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(cleanupParams));
1180 dns1.clearQueries();
1181 dns2.clearQueries();
Mike Yu8ac63402019-12-02 15:28:38 +08001182 }
Mike Yu8ac63402019-12-02 15:28:38 +08001183}
1184
chenbrucefd837fa2019-10-29 18:35:36 +08001185TEST_F(ResolverTest, GetAddrInfoFromCustTable_InvalidInput) {
1186 constexpr char hostnameNoip[] = "noip.example.com.";
1187 constexpr char hostnameInvalidip[] = "invalidip.example.com.";
1188 const std::vector<aidl::android::net::ResolverHostsParcel> invalidCustHosts = {
1189 {"", hostnameNoip},
1190 {"wrong IP", hostnameInvalidip},
1191 };
1192 test::DNSResponder dns;
1193 StartDns(dns, {});
1194 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
Ken Chena6ac2a62020-04-07 17:25:56 +08001195 resolverParams.resolverOptions.hosts = invalidCustHosts;
chenbrucefd837fa2019-10-29 18:35:36 +08001196 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1197 for (const auto& hostname : {hostnameNoip, hostnameInvalidip}) {
1198 // The query won't get data from customized table because of invalid customized table
1199 // and DNSResponder also has no records. hostnameNoip has never registered and
1200 // hostnameInvalidip has registered but wrong IP.
1201 const addrinfo hints = {.ai_family = AF_UNSPEC};
1202 ScopedAddrinfo result = safe_getaddrinfo(hostname, nullptr, &hints);
1203 ASSERT_TRUE(result == nullptr);
1204 EXPECT_EQ(4U, GetNumQueries(dns, hostname));
1205 }
1206}
1207
1208TEST_F(ResolverTest, GetAddrInfoFromCustTable) {
1209 constexpr char hostnameV4[] = "v4only.example.com.";
1210 constexpr char hostnameV6[] = "v6only.example.com.";
1211 constexpr char hostnameV4V6[] = "v4v6.example.com.";
1212 constexpr char custAddrV4[] = "1.2.3.4";
1213 constexpr char custAddrV6[] = "::1.2.3.4";
1214 constexpr char dnsSvAddrV4[] = "1.2.3.5";
1215 constexpr char dnsSvAddrV6[] = "::1.2.3.5";
1216 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4 = {
1217 {custAddrV4, hostnameV4},
1218 };
1219 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV6 = {
1220 {custAddrV6, hostnameV6},
1221 };
1222 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4V6 = {
1223 {custAddrV4, hostnameV4V6},
1224 {custAddrV6, hostnameV4V6},
1225 };
1226 const std::vector<DnsRecord> dnsSvHostV4 = {
1227 {hostnameV4, ns_type::ns_t_a, dnsSvAddrV4},
1228 };
1229 const std::vector<DnsRecord> dnsSvHostV6 = {
1230 {hostnameV6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1231 };
1232 const std::vector<DnsRecord> dnsSvHostV4V6 = {
1233 {hostnameV4V6, ns_type::ns_t_a, dnsSvAddrV4},
1234 {hostnameV4V6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1235 };
1236 struct TestConfig {
1237 const std::string name;
1238 const std::vector<aidl::android::net::ResolverHostsParcel> customizedHosts;
1239 const std::vector<DnsRecord> dnsserverHosts;
1240 const std::vector<std::string> queryResult;
1241 std::string asParameters() const {
1242 return StringPrintf("name: %s, customizedHosts: %s, dnsserverHosts: %s", name.c_str(),
1243 customizedHosts.empty() ? "No" : "Yes",
1244 dnsserverHosts.empty() ? "No" : "Yes");
1245 }
1246 } testConfigs[]{
1247 // clang-format off
1248 {hostnameV4, {}, {}, {}},
1249 {hostnameV4, {}, dnsSvHostV4, {dnsSvAddrV4}},
1250 {hostnameV4, custHostV4, {}, {custAddrV4}},
1251 {hostnameV4, custHostV4, dnsSvHostV4, {custAddrV4}},
1252 {hostnameV6, {}, {}, {}},
1253 {hostnameV6, {}, dnsSvHostV6, {dnsSvAddrV6}},
1254 {hostnameV6, custHostV6, {}, {custAddrV6}},
1255 {hostnameV6, custHostV6, dnsSvHostV6, {custAddrV6}},
1256 {hostnameV4V6, {}, {}, {}},
1257 {hostnameV4V6, {}, dnsSvHostV4V6, {dnsSvAddrV4, dnsSvAddrV6}},
1258 {hostnameV4V6, custHostV4V6, {}, {custAddrV4, custAddrV6}},
1259 {hostnameV4V6, custHostV4V6, dnsSvHostV4V6, {custAddrV4, custAddrV6}},
1260 // clang-format on
1261 };
1262
1263 for (const auto& config : testConfigs) {
1264 SCOPED_TRACE(config.asParameters());
1265
1266 test::DNSResponder dns;
1267 StartDns(dns, config.dnsserverHosts);
1268
1269 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
Ken Chena6ac2a62020-04-07 17:25:56 +08001270 resolverParams.resolverOptions.hosts = config.customizedHosts;
chenbrucefd837fa2019-10-29 18:35:36 +08001271 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1272 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM};
1273 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
1274 if (config.customizedHosts.empty() && config.dnsserverHosts.empty()) {
1275 ASSERT_TRUE(result == nullptr);
1276 EXPECT_EQ(2U, GetNumQueries(dns, config.name.c_str()));
1277 } else {
1278 ASSERT_TRUE(result != nullptr);
1279 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(config.queryResult));
1280 EXPECT_EQ(config.customizedHosts.empty() ? 2U : 0U,
1281 GetNumQueries(dns, config.name.c_str()));
1282 }
1283
1284 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
1285 }
1286}
1287
1288TEST_F(ResolverTest, GetAddrInfoFromCustTable_Modify) {
1289 constexpr char hostnameV4V6[] = "v4v6.example.com.";
1290 constexpr char custAddrV4[] = "1.2.3.4";
1291 constexpr char custAddrV6[] = "::1.2.3.4";
1292 constexpr char dnsSvAddrV4[] = "1.2.3.5";
1293 constexpr char dnsSvAddrV6[] = "::1.2.3.5";
1294 const std::vector<DnsRecord> dnsSvHostV4V6 = {
1295 {hostnameV4V6, ns_type::ns_t_a, dnsSvAddrV4},
1296 {hostnameV4V6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1297 };
1298 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4V6 = {
1299 {custAddrV4, hostnameV4V6},
1300 {custAddrV6, hostnameV4V6},
1301 };
1302 test::DNSResponder dns;
1303 StartDns(dns, dnsSvHostV4V6);
1304 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1305
Ken Chena6ac2a62020-04-07 17:25:56 +08001306 resolverParams.resolverOptions.hosts = custHostV4V6;
chenbrucefd837fa2019-10-29 18:35:36 +08001307 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1308 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM};
1309 ScopedAddrinfo result = safe_getaddrinfo(hostnameV4V6, nullptr, &hints);
1310 ASSERT_TRUE(result != nullptr);
1311 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray({custAddrV4, custAddrV6}));
1312 EXPECT_EQ(0U, GetNumQueries(dns, hostnameV4V6));
1313
Ken Chena6ac2a62020-04-07 17:25:56 +08001314 resolverParams.resolverOptions.hosts = {};
chenbrucefd837fa2019-10-29 18:35:36 +08001315 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1316 result = safe_getaddrinfo(hostnameV4V6, nullptr, &hints);
1317 ASSERT_TRUE(result != nullptr);
1318 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray({dnsSvAddrV4, dnsSvAddrV6}));
1319 EXPECT_EQ(2U, GetNumQueries(dns, hostnameV4V6));
1320}
1321
Ken Chenb9fa2062018-11-13 21:51:13 +08001322TEST_F(ResolverTest, EmptySetup) {
Ken Chenb9fa2062018-11-13 21:51:13 +08001323 std::vector<std::string> servers;
1324 std::vector<std::string> domains;
Xiao Ma09b71022018-12-11 17:56:32 +09001325 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001326 std::vector<std::string> res_servers;
1327 std::vector<std::string> res_domains;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001328 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001329 res_params res_params;
Ken Chenb9fa2062018-11-13 21:51:13 +08001330 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +08001331 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001332 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1333 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1334 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chenb9fa2062018-11-13 21:51:13 +08001335 EXPECT_EQ(0U, res_servers.size());
1336 EXPECT_EQ(0U, res_domains.size());
Mike Yu0a1c53d2018-11-26 13:26:21 +09001337 EXPECT_EQ(0U, res_tls_servers.size());
Luke Huang5bd827c2019-03-14 16:10:04 +08001338 ASSERT_EQ(static_cast<size_t>(IDnsResolver::RESOLVER_PARAMS_COUNT), kDefaultParams.size());
1339 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY],
1340 res_params.sample_validity);
1341 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001342 res_params.success_threshold);
Luke Huang5bd827c2019-03-14 16:10:04 +08001343 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
1344 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
1345 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
Ken Chenb9fa2062018-11-13 21:51:13 +08001346 res_params.base_timeout_msec);
Luke Huang5bd827c2019-03-14 16:10:04 +08001347 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_RETRY_COUNT], res_params.retry_count);
Ken Chenb9fa2062018-11-13 21:51:13 +08001348}
1349
1350TEST_F(ResolverTest, SearchPathChange) {
Xiao Ma09b71022018-12-11 17:56:32 +09001351 constexpr char listen_addr[] = "127.0.0.13";
1352 constexpr char host_name1[] = "test13.domain1.org.";
1353 constexpr char host_name2[] = "test13.domain2.org.";
Luke Huangf8215372019-11-22 11:53:41 +08001354 std::vector<std::string> servers = {listen_addr};
1355 std::vector<std::string> domains = {"domain1.org"};
Xiao Ma09b71022018-12-11 17:56:32 +09001356
1357 const std::vector<DnsRecord> records = {
1358 {host_name1, ns_type::ns_t_aaaa, "2001:db8::13"},
1359 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1:13"},
1360 };
1361 test::DNSResponder dns(listen_addr);
1362 StartDns(dns, records);
1363 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001364
1365 const addrinfo hints = {.ai_family = AF_INET6};
1366 ScopedAddrinfo result = safe_getaddrinfo("test13", nullptr, &hints);
1367 EXPECT_TRUE(result != nullptr);
1368 EXPECT_EQ(1U, dns.queries().size());
1369 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
1370 EXPECT_EQ("2001:db8::13", ToString(result));
1371
1372 // Test that changing the domain search path on its own works.
Luke Huangf8215372019-11-22 11:53:41 +08001373 domains = {"domain2.org"};
Xiao Ma09b71022018-12-11 17:56:32 +09001374 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001375 dns.clearQueries();
1376
1377 result = safe_getaddrinfo("test13", nullptr, &hints);
1378 EXPECT_TRUE(result != nullptr);
1379 EXPECT_EQ(1U, dns.queries().size());
1380 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
1381 EXPECT_EQ("2001:db8::1:13", ToString(result));
1382}
1383
Luke Huang2dac4382019-06-24 13:28:44 +08001384namespace {
1385
Luke Huangf8215372019-11-22 11:53:41 +08001386std::vector<std::string> getResolverDomains(aidl::android::net::IDnsResolver* dnsResolverService,
Luke Huang2dac4382019-06-24 13:28:44 +08001387 unsigned netId) {
1388 std::vector<std::string> res_servers;
1389 std::vector<std::string> res_domains;
1390 std::vector<std::string> res_tls_servers;
1391 res_params res_params;
1392 std::vector<ResolverStats> res_stats;
1393 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001394 DnsResponderClient::GetResolverInfo(dnsResolverService, netId, &res_servers, &res_domains,
1395 &res_tls_servers, &res_params, &res_stats,
1396 &wait_for_pending_req_timeout_count);
Luke Huang2dac4382019-06-24 13:28:44 +08001397 return res_domains;
1398}
1399
1400} // namespace
1401
1402TEST_F(ResolverTest, SearchPathPrune) {
1403 constexpr size_t DUPLICATED_DOMAIN_NUM = 3;
1404 constexpr char listen_addr[] = "127.0.0.13";
1405 constexpr char domian_name1[] = "domain13.org.";
1406 constexpr char domian_name2[] = "domain14.org.";
1407 constexpr char host_name1[] = "test13.domain13.org.";
1408 constexpr char host_name2[] = "test14.domain14.org.";
1409 std::vector<std::string> servers = {listen_addr};
1410
1411 std::vector<std::string> testDomains1;
1412 std::vector<std::string> testDomains2;
1413 // Domain length should be <= 255
1414 // Max number of domains in search path is 6
1415 for (size_t i = 0; i < MAXDNSRCH + 1; i++) {
1416 // Fill up with invalid domain
1417 testDomains1.push_back(std::string(300, i + '0'));
1418 // Fill up with valid but duplicated domain
1419 testDomains2.push_back(StringPrintf("domain%zu.org", i % DUPLICATED_DOMAIN_NUM));
1420 }
1421
1422 // Add valid domain used for query.
1423 testDomains1.push_back(domian_name1);
1424
1425 // Add valid domain twice used for query.
1426 testDomains2.push_back(domian_name2);
1427 testDomains2.push_back(domian_name2);
1428
1429 const std::vector<DnsRecord> records = {
1430 {host_name1, ns_type::ns_t_aaaa, "2001:db8::13"},
1431 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1:13"},
1432 };
1433 test::DNSResponder dns(listen_addr);
1434 StartDns(dns, records);
1435 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, testDomains1));
1436
1437 const addrinfo hints = {.ai_family = AF_INET6};
1438 ScopedAddrinfo result = safe_getaddrinfo("test13", nullptr, &hints);
1439
1440 EXPECT_TRUE(result != nullptr);
1441
1442 EXPECT_EQ(1U, dns.queries().size());
1443 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
1444 EXPECT_EQ("2001:db8::13", ToString(result));
1445
1446 const auto& res_domains1 = getResolverDomains(mDnsClient.resolvService(), TEST_NETID);
1447 // Expect 1 valid domain, invalid domains are removed.
1448 ASSERT_EQ(1U, res_domains1.size());
1449 EXPECT_EQ(domian_name1, res_domains1[0]);
1450
1451 dns.clearQueries();
1452
1453 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, testDomains2));
1454
1455 result = safe_getaddrinfo("test14", nullptr, &hints);
1456 EXPECT_TRUE(result != nullptr);
1457
1458 // (3 domains * 2 retries) + 1 success query = 7
1459 EXPECT_EQ(7U, dns.queries().size());
1460 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
1461 EXPECT_EQ("2001:db8::1:13", ToString(result));
1462
1463 const auto& res_domains2 = getResolverDomains(mDnsClient.resolvService(), TEST_NETID);
1464 // Expect 4 valid domain, duplicate domains are removed.
1465 EXPECT_EQ(DUPLICATED_DOMAIN_NUM + 1U, res_domains2.size());
1466 EXPECT_THAT(
1467 std::vector<std::string>({"domain0.org", "domain1.org", "domain2.org", domian_name2}),
1468 testing::ElementsAreArray(res_domains2));
1469}
1470
Mike Yu0a1c53d2018-11-26 13:26:21 +09001471// If we move this function to dns_responder_client, it will complicate the dependency need of
1472// dns_tls_frontend.h.
1473static void setupTlsServers(const std::vector<std::string>& servers,
waynema0e73c2e2019-07-31 15:04:08 +08001474 std::vector<std::unique_ptr<test::DnsTlsFrontend>>* tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001475 constexpr char listen_udp[] = "53";
1476 constexpr char listen_tls[] = "853";
Mike Yu0a1c53d2018-11-26 13:26:21 +09001477
1478 for (const auto& server : servers) {
1479 auto t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
1480 t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
1481 t->startServer();
Mike Yu0a1c53d2018-11-26 13:26:21 +09001482 tls->push_back(std::move(t));
1483 }
1484}
1485
Mike Yu0a1c53d2018-11-26 13:26:21 +09001486TEST_F(ResolverTest, MaxServerPrune_Binder) {
Mike Yu0a1c53d2018-11-26 13:26:21 +09001487 std::vector<std::string> domains;
1488 std::vector<std::unique_ptr<test::DNSResponder>> dns;
1489 std::vector<std::unique_ptr<test::DnsTlsFrontend>> tls;
1490 std::vector<std::string> servers;
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001491 std::vector<DnsResponderClient::Mapping> mappings;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001492
1493 for (unsigned i = 0; i < MAXDNSRCH + 1; i++) {
1494 domains.push_back(StringPrintf("example%u.com", i));
1495 }
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001496 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupMappings(1, domains, &mappings));
1497 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupDNSServers(MAXNS + 1, mappings, &dns, &servers));
waynema0e73c2e2019-07-31 15:04:08 +08001498 ASSERT_NO_FATAL_FAILURE(setupTlsServers(servers, &tls));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001499
waynema0e73c2e2019-07-31 15:04:08 +08001500 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, domains, kDefaultParams,
1501 kDefaultPrivateDnsHostName));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001502
Mike Yu383855b2019-01-15 17:53:27 +08001503 // If the private DNS validation hasn't completed yet before backend DNS servers stop,
1504 // TLS servers will get stuck in handleOneRequest(), which causes this test stuck in
1505 // ~DnsTlsFrontend() because the TLS server loop threads can't be terminated.
1506 // So, wait for private DNS validation done before stopping backend DNS servers.
1507 for (int i = 0; i < MAXNS; i++) {
chenbruceaff85842019-05-31 15:46:42 +08001508 LOG(INFO) << "Waiting for private DNS validation on " << tls[i]->listen_address() << ".";
Mike Yu724f77d2019-08-16 11:14:50 +08001509 EXPECT_TRUE(WaitForPrivateDnsValidation(tls[i]->listen_address(), true));
chenbruceaff85842019-05-31 15:46:42 +08001510 LOG(INFO) << "private DNS validation on " << tls[i]->listen_address() << " done.";
Mike Yu383855b2019-01-15 17:53:27 +08001511 }
1512
Mike Yu0a1c53d2018-11-26 13:26:21 +09001513 std::vector<std::string> res_servers;
1514 std::vector<std::string> res_domains;
1515 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001516 res_params res_params;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001517 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +08001518 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001519 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1520 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1521 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001522
1523 // Check the size of the stats and its contents.
1524 EXPECT_EQ(static_cast<size_t>(MAXNS), res_servers.size());
1525 EXPECT_EQ(static_cast<size_t>(MAXNS), res_tls_servers.size());
1526 EXPECT_EQ(static_cast<size_t>(MAXDNSRCH), res_domains.size());
1527 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_servers.begin()));
1528 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_tls_servers.begin()));
1529 EXPECT_TRUE(std::equal(domains.begin(), domains.begin() + MAXDNSRCH, res_domains.begin()));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001530}
1531
1532TEST_F(ResolverTest, ResolverStats) {
Xiao Ma09b71022018-12-11 17:56:32 +09001533 constexpr char listen_addr1[] = "127.0.0.4";
1534 constexpr char listen_addr2[] = "127.0.0.5";
1535 constexpr char listen_addr3[] = "127.0.0.6";
Mike Yu0a1c53d2018-11-26 13:26:21 +09001536
1537 // Set server 1 timeout.
Mike Yufc125e42019-05-15 20:41:28 +08001538 test::DNSResponder dns1(listen_addr1, "53", static_cast<ns_rcode>(-1));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001539 dns1.setResponseProbability(0.0);
1540 ASSERT_TRUE(dns1.startServer());
1541
1542 // Set server 2 responding server failure.
Xiao Ma09b71022018-12-11 17:56:32 +09001543 test::DNSResponder dns2(listen_addr2);
Mike Yu0a1c53d2018-11-26 13:26:21 +09001544 dns2.setResponseProbability(0.0);
1545 ASSERT_TRUE(dns2.startServer());
1546
1547 // Set server 3 workable.
Xiao Ma09b71022018-12-11 17:56:32 +09001548 test::DNSResponder dns3(listen_addr3);
1549 dns3.addMapping(kHelloExampleCom, ns_type::ns_t_a, "1.2.3.4");
Mike Yu0a1c53d2018-11-26 13:26:21 +09001550 ASSERT_TRUE(dns3.startServer());
1551
1552 std::vector<std::string> servers = {listen_addr1, listen_addr2, listen_addr3};
Xiao Ma09b71022018-12-11 17:56:32 +09001553 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001554
1555 dns3.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +09001556 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
Mike Yu0a1c53d2018-11-26 13:26:21 +09001557 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
Xiao Ma09b71022018-12-11 17:56:32 +09001558 size_t found = GetNumQueries(dns3, kHelloExampleCom);
Mike Yu0a1c53d2018-11-26 13:26:21 +09001559 EXPECT_LE(1U, found);
1560 std::string result_str = ToString(result);
1561 EXPECT_TRUE(result_str == "1.2.3.4") << ", result_str='" << result_str << "'";
1562
Mike Yue2162e52020-03-04 18:43:46 +08001563 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1564 NameserverStats(listen_addr1).setTimeouts(1),
1565 NameserverStats(listen_addr2).setErrors(1),
1566 NameserverStats(listen_addr3).setSuccesses(1),
1567 };
Mike Yu61d17262020-02-15 18:56:22 +08001568 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001569}
1570
Mike Yu15791832020-02-11 13:38:48 +08001571TEST_F(ResolverTest, AlwaysUseLatestSetupParamsInLookups) {
1572 constexpr char listen_addr1[] = "127.0.0.3";
1573 constexpr char listen_addr2[] = "255.255.255.255";
1574 constexpr char listen_addr3[] = "127.0.0.4";
1575 constexpr char hostname[] = "hello";
1576 constexpr char fqdn_with_search_domain[] = "hello.domain2.com.";
1577
1578 test::DNSResponder dns1(listen_addr1, test::kDefaultListenService, static_cast<ns_rcode>(-1));
1579 dns1.setResponseProbability(0.0);
1580 ASSERT_TRUE(dns1.startServer());
1581
1582 test::DNSResponder dns3(listen_addr3);
1583 StartDns(dns3, {{fqdn_with_search_domain, ns_type::ns_t_a, "1.2.3.4"}});
1584
1585 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
1586 parcel.tlsServers.clear();
1587 parcel.servers = {listen_addr1, listen_addr2};
1588 parcel.domains = {"domain1.com", "domain2.com"};
1589 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1590
1591 // Expect the things happening in t1:
1592 // 1. The lookup starts using the first domain for query. It sends queries to the populated
1593 // nameserver list {listen_addr1, listen_addr2} for the hostname "hello.domain1.com".
1594 // 2. A different list of nameservers is updated to the resolver. Revision ID is incremented.
1595 // 3. The query for the hostname times out. The lookup fails to add the timeout record to the
1596 // the stats because of the unmatched revision ID.
1597 // 4. The lookup starts using the second domain for query. It sends queries to the populated
1598 // nameserver list {listen_addr3, listen_addr1, listen_addr2} for another hostname
1599 // "hello.domain2.com".
1600 // 5. The lookup gets the answer and updates a success record to the stats.
1601 std::thread t1([&hostname]() {
1602 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1603 ScopedAddrinfo result = safe_getaddrinfo(hostname, nullptr, &hints);
1604 EXPECT_NE(result.get(), nullptr);
1605 EXPECT_EQ(ToString(result), "1.2.3.4");
1606 });
1607
1608 // Wait for t1 to start the step 1.
1609 while (dns1.queries().size() == 0) {
1610 usleep(1000);
1611 }
1612
1613 // Update the resolver with three nameservers. This will increment the revision ID.
1614 parcel.servers = {listen_addr3, listen_addr1, listen_addr2};
1615 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1616
1617 t1.join();
1618 EXPECT_EQ(0U, GetNumQueriesForType(dns3, ns_type::ns_t_aaaa, fqdn_with_search_domain));
1619 EXPECT_EQ(1U, GetNumQueriesForType(dns3, ns_type::ns_t_a, fqdn_with_search_domain));
1620
Mike Yue2162e52020-03-04 18:43:46 +08001621 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1622 NameserverStats(listen_addr1),
1623 NameserverStats(listen_addr2),
1624 NameserverStats(listen_addr3).setSuccesses(1),
1625 };
Mike Yu61d17262020-02-15 18:56:22 +08001626 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu15791832020-02-11 13:38:48 +08001627}
1628
Ken Chenb9fa2062018-11-13 21:51:13 +08001629// Test what happens if the specified TLS server is nonexistent.
1630TEST_F(ResolverTest, GetHostByName_TlsMissing) {
Xiao Ma09b71022018-12-11 17:56:32 +09001631 constexpr char listen_addr[] = "127.0.0.3";
1632 constexpr char host_name[] = "tlsmissing.example.com.";
1633
1634 test::DNSResponder dns;
1635 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.3"}});
Luke Huangf8215372019-11-22 11:53:41 +08001636 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001637
1638 // There's nothing listening on this address, so validation will either fail or
1639 /// hang. Either way, queries will continue to flow to the DNSResponder.
waynema0e73c2e2019-07-31 15:04:08 +08001640 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Ken Chenb9fa2062018-11-13 21:51:13 +08001641
1642 const hostent* result;
1643
1644 result = gethostbyname("tlsmissing");
1645 ASSERT_FALSE(result == nullptr);
1646 EXPECT_EQ("1.2.3.3", ToString(result));
1647
1648 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001649 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001650}
1651
1652// Test what happens if the specified TLS server replies with garbage.
1653TEST_F(ResolverTest, GetHostByName_TlsBroken) {
Xiao Ma09b71022018-12-11 17:56:32 +09001654 constexpr char listen_addr[] = "127.0.0.3";
1655 constexpr char host_name1[] = "tlsbroken1.example.com.";
1656 constexpr char host_name2[] = "tlsbroken2.example.com.";
1657 const std::vector<DnsRecord> records = {
1658 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1659 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1660 };
1661
1662 test::DNSResponder dns;
1663 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001664 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001665
1666 // Bind the specified private DNS socket but don't respond to any client sockets yet.
1667 int s = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, IPPROTO_TCP);
1668 ASSERT_TRUE(s >= 0);
1669 struct sockaddr_in tlsServer = {
Luke Huangf8215372019-11-22 11:53:41 +08001670 .sin_family = AF_INET,
1671 .sin_port = htons(853),
Ken Chenb9fa2062018-11-13 21:51:13 +08001672 };
1673 ASSERT_TRUE(inet_pton(AF_INET, listen_addr, &tlsServer.sin_addr));
1674 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEPORT).ok());
1675 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEADDR).ok());
1676 ASSERT_FALSE(bind(s, reinterpret_cast<struct sockaddr*>(&tlsServer), sizeof(tlsServer)));
1677 ASSERT_FALSE(listen(s, 1));
1678
1679 // Trigger TLS validation.
waynema0e73c2e2019-07-31 15:04:08 +08001680 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Ken Chenb9fa2062018-11-13 21:51:13 +08001681
1682 struct sockaddr_storage cliaddr;
1683 socklen_t sin_size = sizeof(cliaddr);
Luke Huangf8215372019-11-22 11:53:41 +08001684 int new_fd = accept4(s, reinterpret_cast<struct sockaddr*>(&cliaddr), &sin_size, SOCK_CLOEXEC);
Ken Chenb9fa2062018-11-13 21:51:13 +08001685 ASSERT_TRUE(new_fd > 0);
1686
1687 // We've received the new file descriptor but not written to it or closed, so the
1688 // validation is still pending. Queries should still flow correctly because the
1689 // server is not used until validation succeeds.
1690 const hostent* result;
1691 result = gethostbyname("tlsbroken1");
1692 ASSERT_FALSE(result == nullptr);
1693 EXPECT_EQ("1.2.3.1", ToString(result));
1694
1695 // Now we cause the validation to fail.
1696 std::string garbage = "definitely not a valid TLS ServerHello";
1697 write(new_fd, garbage.data(), garbage.size());
1698 close(new_fd);
1699
1700 // Validation failure shouldn't interfere with lookups, because lookups won't be sent
1701 // to the TLS server unless validation succeeds.
1702 result = gethostbyname("tlsbroken2");
1703 ASSERT_FALSE(result == nullptr);
1704 EXPECT_EQ("1.2.3.2", ToString(result));
1705
1706 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001707 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001708 close(s);
1709}
1710
1711TEST_F(ResolverTest, GetHostByName_Tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001712 constexpr char listen_addr[] = "127.0.0.3";
1713 constexpr char listen_udp[] = "53";
1714 constexpr char listen_tls[] = "853";
1715 constexpr char host_name1[] = "tls1.example.com.";
1716 constexpr char host_name2[] = "tls2.example.com.";
1717 constexpr char host_name3[] = "tls3.example.com.";
1718 const std::vector<DnsRecord> records = {
1719 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1720 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1721 {host_name3, ns_type::ns_t_a, "1.2.3.3"},
1722 };
1723
1724 test::DNSResponder dns;
1725 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001726 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001727
1728 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1729 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001730 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08001731 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001732
Mike Yu724f77d2019-08-16 11:14:50 +08001733 const hostent* result = gethostbyname("tls1");
Ken Chenb9fa2062018-11-13 21:51:13 +08001734 ASSERT_FALSE(result == nullptr);
1735 EXPECT_EQ("1.2.3.1", ToString(result));
1736
1737 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001738 EXPECT_TRUE(tls.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001739
1740 // Stop the TLS server. Since we're in opportunistic mode, queries will
1741 // fall back to the locally-assigned (clear text) nameservers.
1742 tls.stopServer();
1743
1744 dns.clearQueries();
1745 result = gethostbyname("tls2");
1746 EXPECT_FALSE(result == nullptr);
1747 EXPECT_EQ("1.2.3.2", ToString(result));
1748 const auto queries = dns.queries();
1749 EXPECT_EQ(1U, queries.size());
waynema29253052019-08-20 11:26:08 +08001750 EXPECT_EQ("tls2.example.com.", queries[0].name);
1751 EXPECT_EQ(ns_t_a, queries[0].type);
Ken Chenb9fa2062018-11-13 21:51:13 +08001752
1753 // Reset the resolvers without enabling TLS. Queries should still be routed
1754 // to the UDP endpoint.
Xiao Ma09b71022018-12-11 17:56:32 +09001755 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001756
1757 result = gethostbyname("tls3");
1758 ASSERT_FALSE(result == nullptr);
1759 EXPECT_EQ("1.2.3.3", ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +08001760}
1761
Ken Chenb9fa2062018-11-13 21:51:13 +08001762TEST_F(ResolverTest, GetHostByName_TlsFailover) {
Xiao Ma09b71022018-12-11 17:56:32 +09001763 constexpr char listen_addr1[] = "127.0.0.3";
1764 constexpr char listen_addr2[] = "127.0.0.4";
1765 constexpr char listen_udp[] = "53";
1766 constexpr char listen_tls[] = "853";
1767 constexpr char host_name1[] = "tlsfailover1.example.com.";
1768 constexpr char host_name2[] = "tlsfailover2.example.com.";
1769 const std::vector<DnsRecord> records1 = {
1770 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1771 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1772 };
1773 const std::vector<DnsRecord> records2 = {
1774 {host_name1, ns_type::ns_t_a, "1.2.3.3"},
1775 {host_name2, ns_type::ns_t_a, "1.2.3.4"},
1776 };
1777
1778 test::DNSResponder dns1(listen_addr1);
1779 test::DNSResponder dns2(listen_addr2);
1780 StartDns(dns1, records1);
1781 StartDns(dns2, records2);
1782
Luke Huangf8215372019-11-22 11:53:41 +08001783 std::vector<std::string> servers = {listen_addr1, listen_addr2};
Ken Chenb9fa2062018-11-13 21:51:13 +08001784
1785 test::DnsTlsFrontend tls1(listen_addr1, listen_tls, listen_addr1, listen_udp);
1786 test::DnsTlsFrontend tls2(listen_addr2, listen_tls, listen_addr2, listen_udp);
1787 ASSERT_TRUE(tls1.startServer());
1788 ASSERT_TRUE(tls2.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001789 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1790 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08001791 EXPECT_TRUE(WaitForPrivateDnsValidation(tls1.listen_address(), true));
1792 EXPECT_TRUE(WaitForPrivateDnsValidation(tls2.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001793
Mike Yu724f77d2019-08-16 11:14:50 +08001794 const hostent* result = gethostbyname("tlsfailover1");
Ken Chenb9fa2062018-11-13 21:51:13 +08001795 ASSERT_FALSE(result == nullptr);
1796 EXPECT_EQ("1.2.3.1", ToString(result));
1797
1798 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001799 EXPECT_TRUE(tls1.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001800 // No new queries should have reached tls2.
Luke Huang0a0870d2020-02-12 20:41:10 +08001801 EXPECT_TRUE(tls2.waitForQueries(1));
Ken Chenb9fa2062018-11-13 21:51:13 +08001802
1803 // Stop tls1. Subsequent queries should attempt to reach tls1, fail, and retry to tls2.
1804 tls1.stopServer();
1805
1806 result = gethostbyname("tlsfailover2");
1807 EXPECT_EQ("1.2.3.4", ToString(result));
1808
1809 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001810 EXPECT_TRUE(tls2.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001811
1812 // No additional queries should have reached the insecure servers.
1813 EXPECT_EQ(2U, dns1.queries().size());
1814 EXPECT_EQ(2U, dns2.queries().size());
1815
1816 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001817 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Ken Chenb9fa2062018-11-13 21:51:13 +08001818}
1819
1820TEST_F(ResolverTest, GetHostByName_BadTlsName) {
Xiao Ma09b71022018-12-11 17:56:32 +09001821 constexpr char listen_addr[] = "127.0.0.3";
1822 constexpr char listen_udp[] = "53";
1823 constexpr char listen_tls[] = "853";
1824 constexpr char host_name[] = "badtlsname.example.com.";
1825
1826 test::DNSResponder dns;
1827 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.1"}});
Luke Huangf8215372019-11-22 11:53:41 +08001828 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001829
1830 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1831 ASSERT_TRUE(tls.startServer());
Xiao Ma09b71022018-12-11 17:56:32 +09001832 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
waynema0e73c2e2019-07-31 15:04:08 +08001833 kDefaultIncorrectPrivateDnsHostName));
Ken Chenb9fa2062018-11-13 21:51:13 +08001834
waynema0e73c2e2019-07-31 15:04:08 +08001835 // The TLS handshake would fail because the name of TLS server doesn't
1836 // match with TLS server's certificate.
Mike Yu724f77d2019-08-16 11:14:50 +08001837 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), false));
Ken Chenb9fa2062018-11-13 21:51:13 +08001838
1839 // The query should fail hard, because a name was specified.
1840 EXPECT_EQ(nullptr, gethostbyname("badtlsname"));
1841
1842 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001843 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001844}
1845
1846TEST_F(ResolverTest, GetAddrInfo_Tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001847 constexpr char listen_addr[] = "127.0.0.3";
1848 constexpr char listen_udp[] = "53";
1849 constexpr char listen_tls[] = "853";
1850 constexpr char host_name[] = "addrinfotls.example.com.";
1851 const std::vector<DnsRecord> records = {
1852 {host_name, ns_type::ns_t_a, "1.2.3.4"},
1853 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
1854 };
1855
1856 test::DNSResponder dns;
1857 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001858 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001859
1860 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1861 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001862 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1863 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08001864 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001865
1866 dns.clearQueries();
1867 ScopedAddrinfo result = safe_getaddrinfo("addrinfotls", nullptr, nullptr);
1868 EXPECT_TRUE(result != nullptr);
1869 size_t found = GetNumQueries(dns, host_name);
1870 EXPECT_LE(1U, found);
1871 // Could be A or AAAA
1872 std::string result_str = ToString(result);
1873 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +08001874 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08001875 // Wait for both A and AAAA queries to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001876 EXPECT_TRUE(tls.waitForQueries(3));
Ken Chenb9fa2062018-11-13 21:51:13 +08001877
1878 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001879 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001880}
1881
1882TEST_F(ResolverTest, TlsBypass) {
1883 const char OFF[] = "off";
1884 const char OPPORTUNISTIC[] = "opportunistic";
1885 const char STRICT[] = "strict";
1886
1887 const char GETHOSTBYNAME[] = "gethostbyname";
1888 const char GETADDRINFO[] = "getaddrinfo";
1889 const char GETADDRINFOFORNET[] = "getaddrinfofornet";
1890
1891 const unsigned BYPASS_NETID = NETID_USE_LOCAL_NAMESERVERS | TEST_NETID;
1892
Ken Chenb9fa2062018-11-13 21:51:13 +08001893 const char ADDR4[] = "192.0.2.1";
1894 const char ADDR6[] = "2001:db8::1";
1895
1896 const char cleartext_addr[] = "127.0.0.53";
1897 const char cleartext_port[] = "53";
1898 const char tls_port[] = "853";
Luke Huangf8215372019-11-22 11:53:41 +08001899 const std::vector<std::string> servers = {cleartext_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001900
Xiao Ma09b71022018-12-11 17:56:32 +09001901 test::DNSResponder dns(cleartext_addr);
Ken Chenb9fa2062018-11-13 21:51:13 +08001902 ASSERT_TRUE(dns.startServer());
1903
1904 test::DnsTlsFrontend tls(cleartext_addr, tls_port, cleartext_addr, cleartext_port);
Mike Yudd4ac2d2019-05-31 16:52:11 +08001905 ASSERT_TRUE(tls.startServer());
Ken Chenb9fa2062018-11-13 21:51:13 +08001906
Luke Huangf8215372019-11-22 11:53:41 +08001907 // clang-format off
Ken Chenb9fa2062018-11-13 21:51:13 +08001908 struct TestConfig {
1909 const std::string mode;
1910 const bool withWorkingTLS;
1911 const std::string method;
1912
1913 std::string asHostName() const {
Luke Huangf8215372019-11-22 11:53:41 +08001914 return StringPrintf("%s.%s.%s.", mode.c_str(), withWorkingTLS ? "tlsOn" : "tlsOff",
Ken Chenb9fa2062018-11-13 21:51:13 +08001915 method.c_str());
1916 }
1917 } testConfigs[]{
Ken Chenb9fa2062018-11-13 21:51:13 +08001918 {OFF, true, GETHOSTBYNAME},
1919 {OPPORTUNISTIC, true, GETHOSTBYNAME},
1920 {STRICT, true, GETHOSTBYNAME},
Ken Chenb9fa2062018-11-13 21:51:13 +08001921 {OFF, true, GETADDRINFO},
1922 {OPPORTUNISTIC, true, GETADDRINFO},
1923 {STRICT, true, GETADDRINFO},
Ken Chenb9fa2062018-11-13 21:51:13 +08001924 {OFF, true, GETADDRINFOFORNET},
1925 {OPPORTUNISTIC, true, GETADDRINFOFORNET},
1926 {STRICT, true, GETADDRINFOFORNET},
Mike Yudd4ac2d2019-05-31 16:52:11 +08001927 {OFF, false, GETHOSTBYNAME},
1928 {OPPORTUNISTIC, false, GETHOSTBYNAME},
1929 {STRICT, false, GETHOSTBYNAME},
1930 {OFF, false, GETADDRINFO},
1931 {OPPORTUNISTIC, false, GETADDRINFO},
1932 {STRICT, false, GETADDRINFO},
1933 {OFF, false, GETADDRINFOFORNET},
1934 {OPPORTUNISTIC, false, GETADDRINFOFORNET},
1935 {STRICT, false, GETADDRINFOFORNET},
Ken Chenb9fa2062018-11-13 21:51:13 +08001936 };
Luke Huangf8215372019-11-22 11:53:41 +08001937 // clang-format on
Ken Chenb9fa2062018-11-13 21:51:13 +08001938
1939 for (const auto& config : testConfigs) {
1940 const std::string testHostName = config.asHostName();
1941 SCOPED_TRACE(testHostName);
1942
1943 // Don't tempt test bugs due to caching.
1944 const char* host_name = testHostName.c_str();
1945 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
1946 dns.addMapping(host_name, ns_type::ns_t_aaaa, ADDR6);
1947
Mike Yudd4ac2d2019-05-31 16:52:11 +08001948 if (config.withWorkingTLS) {
1949 if (!tls.running()) {
1950 ASSERT_TRUE(tls.startServer());
1951 }
1952 } else {
1953 if (tls.running()) {
1954 ASSERT_TRUE(tls.stopServer());
1955 }
1956 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001957
1958 if (config.mode == OFF) {
Xiao Ma09b71022018-12-11 17:56:32 +09001959 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, kDefaultSearchDomains,
1960 kDefaultParams));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001961 } else /* OPPORTUNISTIC or STRICT */ {
1962 const char* tls_hostname = (config.mode == STRICT) ? kDefaultPrivateDnsHostName : "";
Xiao Ma09b71022018-12-11 17:56:32 +09001963 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001964 kDefaultParams, tls_hostname));
Mike Yu724f77d2019-08-16 11:14:50 +08001965
1966 // Wait for the validation event. If the server is running, the validation should
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001967 // succeed; otherwise, the validation should fail.
Mike Yu724f77d2019-08-16 11:14:50 +08001968 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), config.withWorkingTLS));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001969 if (config.withWorkingTLS) {
1970 EXPECT_TRUE(tls.waitForQueries(1));
1971 tls.clearQueries();
1972 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001973 }
Ken Chenb9fa2062018-11-13 21:51:13 +08001974
1975 const hostent* h_result = nullptr;
1976 ScopedAddrinfo ai_result;
1977
1978 if (config.method == GETHOSTBYNAME) {
1979 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
1980 h_result = gethostbyname(host_name);
1981
1982 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
1983 ASSERT_FALSE(h_result == nullptr);
1984 ASSERT_EQ(4, h_result->h_length);
1985 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
1986 EXPECT_EQ(ADDR4, ToString(h_result));
1987 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
1988 } else if (config.method == GETADDRINFO) {
1989 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
1990 ai_result = safe_getaddrinfo(host_name, nullptr, nullptr);
1991 EXPECT_TRUE(ai_result != nullptr);
1992
1993 EXPECT_LE(1U, GetNumQueries(dns, host_name));
1994 // Could be A or AAAA
1995 const std::string result_str = ToString(ai_result);
1996 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
Luke Huangf8215372019-11-22 11:53:41 +08001997 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08001998 } else if (config.method == GETADDRINFOFORNET) {
1999 addrinfo* raw_ai_result = nullptr;
2000 EXPECT_EQ(0, android_getaddrinfofornet(host_name, /*servname=*/nullptr,
2001 /*hints=*/nullptr, BYPASS_NETID, MARK_UNSET,
2002 &raw_ai_result));
2003 ai_result.reset(raw_ai_result);
2004
2005 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2006 // Could be A or AAAA
2007 const std::string result_str = ToString(ai_result);
2008 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
Luke Huangf8215372019-11-22 11:53:41 +08002009 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08002010 }
2011
Mike Yudd4ac2d2019-05-31 16:52:11 +08002012 EXPECT_EQ(0, tls.queries());
Ken Chenb9fa2062018-11-13 21:51:13 +08002013
2014 // Clear per-process resolv netid.
2015 ASSERT_EQ(0, setNetworkForResolv(NETID_UNSET));
Ken Chenb9fa2062018-11-13 21:51:13 +08002016 dns.clearQueries();
2017 }
Ken Chenb9fa2062018-11-13 21:51:13 +08002018}
2019
2020TEST_F(ResolverTest, StrictMode_NoTlsServers) {
Xiao Ma09b71022018-12-11 17:56:32 +09002021 constexpr char cleartext_addr[] = "127.0.0.53";
Luke Huangf8215372019-11-22 11:53:41 +08002022 const std::vector<std::string> servers = {cleartext_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002023 constexpr char host_name[] = "strictmode.notlsips.example.com.";
2024 const std::vector<DnsRecord> records = {
2025 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2026 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2027 };
Ken Chenb9fa2062018-11-13 21:51:13 +08002028
Xiao Ma09b71022018-12-11 17:56:32 +09002029 test::DNSResponder dns(cleartext_addr);
2030 StartDns(dns, records);
Ken Chenb9fa2062018-11-13 21:51:13 +08002031
waynema0e73c2e2019-07-31 15:04:08 +08002032 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
2033 kDefaultIncorrectPrivateDnsHostName));
Ken Chenb9fa2062018-11-13 21:51:13 +08002034
2035 addrinfo* ai_result = nullptr;
2036 EXPECT_NE(0, getaddrinfo(host_name, nullptr, nullptr, &ai_result));
2037 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
2038}
Luke Huang94b10b92018-11-21 20:13:38 +08002039
2040namespace {
2041
Luke Huang70931aa2019-01-31 11:57:41 +08002042int getAsyncResponse(int fd, int* rcode, uint8_t* buf, int bufLen) {
Luke Huang94b10b92018-11-21 20:13:38 +08002043 struct pollfd wait_fd[1];
2044 wait_fd[0].fd = fd;
2045 wait_fd[0].events = POLLIN;
2046 short revents;
2047 int ret;
2048
2049 ret = poll(wait_fd, 1, -1);
2050 revents = wait_fd[0].revents;
2051 if (revents & POLLIN) {
2052 int n = resNetworkResult(fd, rcode, buf, bufLen);
Luke Huangba7bef92018-12-26 16:53:03 +08002053 // Verify that resNetworkResult() closed the fd
markchien96b09e22020-07-29 14:24:34 +08002054 char unused;
2055 EXPECT_EQ(-1, read(fd, &unused, sizeof unused));
Luke Huangba7bef92018-12-26 16:53:03 +08002056 EXPECT_EQ(EBADF, errno);
Luke Huang94b10b92018-11-21 20:13:38 +08002057 return n;
2058 }
2059 return -1;
2060}
2061
Luke Huang70931aa2019-01-31 11:57:41 +08002062std::string toString(uint8_t* buf, int bufLen, int ipType) {
Luke Huang94b10b92018-11-21 20:13:38 +08002063 ns_msg handle;
2064 int ancount, n = 0;
2065 ns_rr rr;
2066
Luke Huangf8215372019-11-22 11:53:41 +08002067 if (ns_initparse((const uint8_t*)buf, bufLen, &handle) >= 0) {
Luke Huang94b10b92018-11-21 20:13:38 +08002068 ancount = ns_msg_count(handle, ns_s_an);
2069 if (ns_parserr(&handle, ns_s_an, n, &rr) == 0) {
Luke Huang70931aa2019-01-31 11:57:41 +08002070 const uint8_t* rdata = ns_rr_rdata(rr);
Luke Huang94b10b92018-11-21 20:13:38 +08002071 char buffer[INET6_ADDRSTRLEN];
Luke Huangf8215372019-11-22 11:53:41 +08002072 if (inet_ntop(ipType, (const char*)rdata, buffer, sizeof(buffer))) {
Luke Huang94b10b92018-11-21 20:13:38 +08002073 return buffer;
2074 }
2075 }
2076 }
2077 return "";
2078}
2079
2080int dns_open_proxy() {
2081 int s = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
2082 if (s == -1) {
2083 return -1;
2084 }
2085 const int one = 1;
2086 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
2087
2088 static const struct sockaddr_un proxy_addr = {
2089 .sun_family = AF_UNIX,
2090 .sun_path = "/dev/socket/dnsproxyd",
2091 };
2092
Luke Huangf8215372019-11-22 11:53:41 +08002093 if (TEMP_FAILURE_RETRY(connect(s, (const struct sockaddr*)&proxy_addr, sizeof(proxy_addr))) !=
Luke Huang94b10b92018-11-21 20:13:38 +08002094 0) {
2095 close(s);
2096 return -1;
2097 }
2098
2099 return s;
2100}
2101
Luke Huangba7bef92018-12-26 16:53:03 +08002102void expectAnswersValid(int fd, int ipType, const std::string& expectedAnswer) {
2103 int rcode = -1;
2104 uint8_t buf[MAXPACKET] = {};
2105
2106 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2107 EXPECT_GT(res, 0);
2108 EXPECT_EQ(expectedAnswer, toString(buf, res, ipType));
2109}
2110
2111void expectAnswersNotValid(int fd, int expectedErrno) {
2112 int rcode = -1;
2113 uint8_t buf[MAXPACKET] = {};
2114
2115 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2116 EXPECT_EQ(expectedErrno, res);
2117}
2118
Luke Huang94b10b92018-11-21 20:13:38 +08002119} // namespace
2120
2121TEST_F(ResolverTest, Async_NormalQueryV4V6) {
Xiao Ma09b71022018-12-11 17:56:32 +09002122 constexpr char listen_addr[] = "127.0.0.4";
2123 constexpr char host_name[] = "howdy.example.com.";
2124 const std::vector<DnsRecord> records = {
2125 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2126 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2127 };
2128
2129 test::DNSResponder dns(listen_addr);
2130 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002131 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002132 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002133
Luke Huangba7bef92018-12-26 16:53:03 +08002134 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2135 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002136 EXPECT_TRUE(fd1 != -1);
2137 EXPECT_TRUE(fd2 != -1);
2138
Luke Huang70931aa2019-01-31 11:57:41 +08002139 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002140 int rcode;
2141 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2142 EXPECT_GT(res, 0);
2143 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
2144
2145 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2146 EXPECT_GT(res, 0);
2147 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2148
2149 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
2150
2151 // Re-query verify cache works
Luke Huangba7bef92018-12-26 16:53:03 +08002152 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2153 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002154
2155 EXPECT_TRUE(fd1 != -1);
2156 EXPECT_TRUE(fd2 != -1);
2157
2158 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2159 EXPECT_GT(res, 0);
2160 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
2161
2162 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2163 EXPECT_GT(res, 0);
2164 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2165
2166 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
2167}
2168
2169TEST_F(ResolverTest, Async_BadQuery) {
Xiao Ma09b71022018-12-11 17:56:32 +09002170 constexpr char listen_addr[] = "127.0.0.4";
2171 constexpr char host_name[] = "howdy.example.com.";
2172 const std::vector<DnsRecord> records = {
2173 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2174 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2175 };
2176
2177 test::DNSResponder dns(listen_addr);
2178 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002179 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002180 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002181
2182 static struct {
2183 int fd;
2184 const char* dname;
2185 const int queryType;
2186 const int expectRcode;
2187 } kTestData[] = {
Luke Huangba7bef92018-12-26 16:53:03 +08002188 {-1, "", ns_t_aaaa, 0},
2189 {-1, "as65ass46", ns_t_aaaa, 0},
2190 {-1, "454564564564", ns_t_aaaa, 0},
2191 {-1, "h645235", ns_t_a, 0},
2192 {-1, "www.google.com", ns_t_a, 0},
Luke Huang94b10b92018-11-21 20:13:38 +08002193 };
2194
2195 for (auto& td : kTestData) {
2196 SCOPED_TRACE(td.dname);
Luke Huangba7bef92018-12-26 16:53:03 +08002197 td.fd = resNetworkQuery(TEST_NETID, td.dname, ns_c_in, td.queryType, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002198 EXPECT_TRUE(td.fd != -1);
2199 }
2200
2201 // dns_responder return empty resp(packet only contains query part) with no error currently
2202 for (const auto& td : kTestData) {
Luke Huang70931aa2019-01-31 11:57:41 +08002203 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002204 int rcode;
2205 SCOPED_TRACE(td.dname);
2206 int res = getAsyncResponse(td.fd, &rcode, buf, MAXPACKET);
2207 EXPECT_GT(res, 0);
2208 EXPECT_EQ(rcode, td.expectRcode);
2209 }
2210}
2211
2212TEST_F(ResolverTest, Async_EmptyAnswer) {
Xiao Ma09b71022018-12-11 17:56:32 +09002213 constexpr char listen_addr[] = "127.0.0.4";
2214 constexpr char host_name[] = "howdy.example.com.";
2215 const std::vector<DnsRecord> records = {
2216 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2217 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2218 };
2219
2220 test::DNSResponder dns(listen_addr);
2221 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002222 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002223 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002224
Luke Huang9c264bb2018-12-18 16:44:41 +08002225 // TODO: Disable retry to make this test explicit.
2226 auto& cv = dns.getCv();
2227 auto& cvMutex = dns.getCvMutex();
2228 int fd1;
2229 // Wait on the condition variable to ensure that the DNS server has handled our first query.
2230 {
2231 std::unique_lock lk(cvMutex);
Luke Huangba7bef92018-12-26 16:53:03 +08002232 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang9c264bb2018-12-18 16:44:41 +08002233 EXPECT_TRUE(fd1 != -1);
2234 EXPECT_EQ(std::cv_status::no_timeout, cv.wait_for(lk, std::chrono::seconds(1)));
2235 }
Luke Huang94b10b92018-11-21 20:13:38 +08002236
Luke Huang94b10b92018-11-21 20:13:38 +08002237 dns.setResponseProbability(0.0);
Luke Huang94b10b92018-11-21 20:13:38 +08002238
Luke Huangba7bef92018-12-26 16:53:03 +08002239 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002240 EXPECT_TRUE(fd2 != -1);
2241
Luke Huangba7bef92018-12-26 16:53:03 +08002242 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002243 EXPECT_TRUE(fd3 != -1);
2244
Luke Huang9c264bb2018-12-18 16:44:41 +08002245 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002246 int rcode;
2247
Luke Huang9c264bb2018-12-18 16:44:41 +08002248 // expect no response
2249 int res = getAsyncResponse(fd3, &rcode, buf, MAXPACKET);
2250 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huang94b10b92018-11-21 20:13:38 +08002251
Luke Huang9c264bb2018-12-18 16:44:41 +08002252 // expect no response
Luke Huang94b10b92018-11-21 20:13:38 +08002253 memset(buf, 0, MAXPACKET);
Luke Huang9c264bb2018-12-18 16:44:41 +08002254 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2255 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huang94b10b92018-11-21 20:13:38 +08002256
Luke Huang94b10b92018-11-21 20:13:38 +08002257 dns.setResponseProbability(1.0);
Luke Huang94b10b92018-11-21 20:13:38 +08002258
Luke Huangba7bef92018-12-26 16:53:03 +08002259 int fd4 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002260 EXPECT_TRUE(fd4 != -1);
2261
2262 memset(buf, 0, MAXPACKET);
2263 res = getAsyncResponse(fd4, &rcode, buf, MAXPACKET);
2264 EXPECT_GT(res, 0);
2265 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2266
2267 memset(buf, 0, MAXPACKET);
2268 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2269 EXPECT_GT(res, 0);
2270 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
Mike Yu532405f2020-06-17 17:46:44 +08002271
2272 // Trailing dot is removed. Is it intended?
2273 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, 0, "howdy.example.com", {"::1.2.3.4"});
2274 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2275 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2276 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, 0, "howdy.example.com", {"1.2.3.4"});
Luke Huang94b10b92018-11-21 20:13:38 +08002277}
2278
2279TEST_F(ResolverTest, Async_MalformedQuery) {
Xiao Ma09b71022018-12-11 17:56:32 +09002280 constexpr char listen_addr[] = "127.0.0.4";
2281 constexpr char host_name[] = "howdy.example.com.";
2282 const std::vector<DnsRecord> records = {
2283 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2284 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2285 };
2286
2287 test::DNSResponder dns(listen_addr);
2288 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002289 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002290 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002291
2292 int fd = dns_open_proxy();
2293 EXPECT_TRUE(fd > 0);
2294
2295 const std::string badMsg = "16-52512#";
Xiao Ma09b71022018-12-11 17:56:32 +09002296 static const struct {
Luke Huang94b10b92018-11-21 20:13:38 +08002297 const std::string cmd;
2298 const int expectErr;
2299 } kTestData[] = {
Luke Huangba7bef92018-12-26 16:53:03 +08002300 // Too few arguments
Luke Huang94b10b92018-11-21 20:13:38 +08002301 {"resnsend " + badMsg + '\0', -EINVAL},
2302 // Bad netId
Luke Huangba7bef92018-12-26 16:53:03 +08002303 {"resnsend badnetId 0 " + badMsg + '\0', -EINVAL},
Luke Huang94b10b92018-11-21 20:13:38 +08002304 // Bad raw data
Luke Huangba7bef92018-12-26 16:53:03 +08002305 {"resnsend " + std::to_string(TEST_NETID) + " 0 " + badMsg + '\0', -EILSEQ},
Luke Huang94b10b92018-11-21 20:13:38 +08002306 };
2307
2308 for (unsigned int i = 0; i < std::size(kTestData); i++) {
2309 auto& td = kTestData[i];
2310 SCOPED_TRACE(td.cmd);
2311 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, td.cmd.c_str(), td.cmd.size()));
2312 EXPECT_EQ(rc, static_cast<ssize_t>(td.cmd.size()));
2313
2314 int32_t tmp;
2315 rc = TEMP_FAILURE_RETRY(read(fd, &tmp, sizeof(tmp)));
2316 EXPECT_TRUE(rc > 0);
2317 EXPECT_EQ(static_cast<int>(ntohl(tmp)), td.expectErr);
2318 }
2319 // Normal query with answer buffer
2320 // This is raw data of query "howdy.example.com" type 1 class 1
2321 std::string query = "81sBAAABAAAAAAAABWhvd2R5B2V4YW1wbGUDY29tAAABAAE=";
Luke Huangba7bef92018-12-26 16:53:03 +08002322 std::string cmd = "resnsend " + std::to_string(TEST_NETID) + " 0 " + query + '\0';
Luke Huang94b10b92018-11-21 20:13:38 +08002323 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
2324 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
2325
Luke Huang70931aa2019-01-31 11:57:41 +08002326 uint8_t smallBuf[1] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002327 int rcode;
2328 rc = getAsyncResponse(fd, &rcode, smallBuf, 1);
Luke Huangba7bef92018-12-26 16:53:03 +08002329 EXPECT_EQ(-EMSGSIZE, rc);
Luke Huang94b10b92018-11-21 20:13:38 +08002330
2331 // Do the normal test with large buffer again
2332 fd = dns_open_proxy();
2333 EXPECT_TRUE(fd > 0);
2334 rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
2335 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
Luke Huang70931aa2019-01-31 11:57:41 +08002336 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002337 rc = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2338 EXPECT_EQ("1.2.3.4", toString(buf, rc, AF_INET));
Mike Yu4f3747b2018-12-02 17:54:29 +09002339}
2340
Luke Huangba7bef92018-12-26 16:53:03 +08002341TEST_F(ResolverTest, Async_CacheFlags) {
Xiao Ma09b71022018-12-11 17:56:32 +09002342 constexpr char listen_addr[] = "127.0.0.4";
Luke Huang4eabbe32020-05-28 03:17:32 +08002343 constexpr char host_name1[] = "howdy.example.com.";
2344 constexpr char host_name2[] = "howdy.example2.com.";
2345 constexpr char host_name3[] = "howdy.example3.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002346 const std::vector<DnsRecord> records = {
Luke Huang4eabbe32020-05-28 03:17:32 +08002347 {host_name1, ns_type::ns_t_a, "1.2.3.4"}, {host_name1, ns_type::ns_t_aaaa, "::1.2.3.4"},
2348 {host_name2, ns_type::ns_t_a, "1.2.3.5"}, {host_name2, ns_type::ns_t_aaaa, "::1.2.3.5"},
2349 {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 +09002350 };
2351
2352 test::DNSResponder dns(listen_addr);
2353 StartDns(dns, records);
Luke Huangba7bef92018-12-26 16:53:03 +08002354 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002355 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huangba7bef92018-12-26 16:53:03 +08002356
2357 // ANDROID_RESOLV_NO_CACHE_STORE
2358 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2359 ANDROID_RESOLV_NO_CACHE_STORE);
2360 EXPECT_TRUE(fd1 != -1);
2361 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2362 ANDROID_RESOLV_NO_CACHE_STORE);
2363 EXPECT_TRUE(fd2 != -1);
2364 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2365 ANDROID_RESOLV_NO_CACHE_STORE);
2366 EXPECT_TRUE(fd3 != -1);
2367
2368 expectAnswersValid(fd3, AF_INET, "1.2.3.4");
2369 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
2370 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2371
2372 // No cache exists, expect 3 queries
Luke Huang4eabbe32020-05-28 03:17:32 +08002373 EXPECT_EQ(3U, GetNumQueries(dns, host_name1));
Luke Huangba7bef92018-12-26 16:53:03 +08002374
Luke Huang4eabbe32020-05-28 03:17:32 +08002375 // Raise a query with no flags to ensure no cache exists. Also make an cache entry for the
2376 // query.
Luke Huangba7bef92018-12-26 16:53:03 +08002377 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2378
2379 EXPECT_TRUE(fd1 != -1);
2380
2381 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2382
Luke Huang4eabbe32020-05-28 03:17:32 +08002383 // Expect 4 queries because there should be no cache before this query.
2384 EXPECT_EQ(4U, GetNumQueries(dns, host_name1));
2385
2386 // Now we have the cache entry, re-query with ANDROID_RESOLV_NO_CACHE_STORE to ensure
2387 // that ANDROID_RESOLV_NO_CACHE_STORE implied ANDROID_RESOLV_NO_CACHE_LOOKUP.
2388 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2389 ANDROID_RESOLV_NO_CACHE_STORE);
2390 EXPECT_TRUE(fd1 != -1);
2391 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2392 // Expect 5 queries because we shouldn't do cache lookup for the query which has
2393 // ANDROID_RESOLV_NO_CACHE_STORE.
2394 EXPECT_EQ(5U, GetNumQueries(dns, host_name1));
Luke Huangba7bef92018-12-26 16:53:03 +08002395
2396 // ANDROID_RESOLV_NO_CACHE_LOOKUP
2397 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2398 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2399 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2400 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2401
2402 EXPECT_TRUE(fd1 != -1);
2403 EXPECT_TRUE(fd2 != -1);
2404
2405 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
2406 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2407
Luke Huang4eabbe32020-05-28 03:17:32 +08002408 // Cache was skipped, expect 2 more queries.
2409 EXPECT_EQ(7U, GetNumQueries(dns, host_name1));
Luke Huangba7bef92018-12-26 16:53:03 +08002410
2411 // Re-query verify cache works
Luke Huang4eabbe32020-05-28 03:17:32 +08002412 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huangba7bef92018-12-26 16:53:03 +08002413 EXPECT_TRUE(fd1 != -1);
2414 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2415
Luke Huang4eabbe32020-05-28 03:17:32 +08002416 // Cache hits, expect still 7 queries
2417 EXPECT_EQ(7U, GetNumQueries(dns, host_name1));
Luke Huanga1d74182019-03-19 17:30:36 +08002418
2419 // Start to verify if ANDROID_RESOLV_NO_CACHE_LOOKUP does write response into cache
2420 dns.clearQueries();
2421
Luke Huang4eabbe32020-05-28 03:17:32 +08002422 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa,
Luke Huanga1d74182019-03-19 17:30:36 +08002423 ANDROID_RESOLV_NO_CACHE_LOOKUP);
Luke Huang4eabbe32020-05-28 03:17:32 +08002424 fd2 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa,
Luke Huanga1d74182019-03-19 17:30:36 +08002425 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2426
2427 EXPECT_TRUE(fd1 != -1);
2428 EXPECT_TRUE(fd2 != -1);
2429
Luke Huang4eabbe32020-05-28 03:17:32 +08002430 expectAnswersValid(fd2, AF_INET6, "::1.2.3.5");
2431 expectAnswersValid(fd1, AF_INET6, "::1.2.3.5");
Luke Huanga1d74182019-03-19 17:30:36 +08002432
2433 // Skip cache, expect 2 queries
Luke Huang4eabbe32020-05-28 03:17:32 +08002434 EXPECT_EQ(2U, GetNumQueries(dns, host_name2));
Luke Huanga1d74182019-03-19 17:30:36 +08002435
2436 // Re-query without flags
Luke Huang4eabbe32020-05-28 03:17:32 +08002437 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa, 0);
2438 fd2 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa, 0);
Luke Huanga1d74182019-03-19 17:30:36 +08002439
2440 EXPECT_TRUE(fd1 != -1);
2441 EXPECT_TRUE(fd2 != -1);
2442
Luke Huang4eabbe32020-05-28 03:17:32 +08002443 expectAnswersValid(fd2, AF_INET6, "::1.2.3.5");
2444 expectAnswersValid(fd1, AF_INET6, "::1.2.3.5");
Luke Huanga1d74182019-03-19 17:30:36 +08002445
2446 // Cache hits, expect still 2 queries
Luke Huang4eabbe32020-05-28 03:17:32 +08002447 EXPECT_EQ(2U, GetNumQueries(dns, host_name2));
Luke Huang40f5f492019-05-09 19:37:35 +08002448
2449 // Test both ANDROID_RESOLV_NO_CACHE_STORE and ANDROID_RESOLV_NO_CACHE_LOOKUP are set
2450 dns.clearQueries();
2451
Luke Huang4eabbe32020-05-28 03:17:32 +08002452 // Make sure that the cache of "howdy.example3.com" exists.
2453 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang40f5f492019-05-09 19:37:35 +08002454 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002455 expectAnswersValid(fd1, AF_INET6, "::1.2.3.6");
2456 EXPECT_EQ(1U, GetNumQueries(dns, host_name3));
Luke Huang40f5f492019-05-09 19:37:35 +08002457
2458 // Re-query with testFlags
2459 const int testFlag = ANDROID_RESOLV_NO_CACHE_STORE | ANDROID_RESOLV_NO_CACHE_LOOKUP;
Luke Huang4eabbe32020-05-28 03:17:32 +08002460 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_aaaa, testFlag);
Luke Huang40f5f492019-05-09 19:37:35 +08002461 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002462 expectAnswersValid(fd1, AF_INET6, "::1.2.3.6");
Luke Huang40f5f492019-05-09 19:37:35 +08002463 // Expect cache lookup is skipped.
Luke Huang4eabbe32020-05-28 03:17:32 +08002464 EXPECT_EQ(2U, GetNumQueries(dns, host_name3));
Luke Huang40f5f492019-05-09 19:37:35 +08002465
2466 // Do another query with testFlags
Luke Huang4eabbe32020-05-28 03:17:32 +08002467 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_a, testFlag);
Luke Huang40f5f492019-05-09 19:37:35 +08002468 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002469 expectAnswersValid(fd1, AF_INET, "1.2.3.6");
Luke Huang40f5f492019-05-09 19:37:35 +08002470 // Expect cache lookup is skipped.
Luke Huang4eabbe32020-05-28 03:17:32 +08002471 EXPECT_EQ(3U, GetNumQueries(dns, host_name3));
Luke Huang40f5f492019-05-09 19:37:35 +08002472
2473 // Re-query with no flags
Luke Huang4eabbe32020-05-28 03:17:32 +08002474 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_a, 0);
Luke Huang40f5f492019-05-09 19:37:35 +08002475 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002476 expectAnswersValid(fd1, AF_INET, "1.2.3.6");
Luke Huang40f5f492019-05-09 19:37:35 +08002477 // Expect no cache hit because cache storing is also skipped in previous query.
Luke Huang4eabbe32020-05-28 03:17:32 +08002478 EXPECT_EQ(4U, GetNumQueries(dns, host_name3));
Luke Huangba7bef92018-12-26 16:53:03 +08002479}
2480
Luke Huang08b13d22020-02-05 14:46:21 +08002481TEST_F(ResolverTest, Async_NoCacheStoreFlagDoesNotRefreshStaleCacheEntry) {
2482 constexpr char listen_addr[] = "127.0.0.4";
2483 constexpr char host_name[] = "howdy.example.com.";
2484 const std::vector<DnsRecord> records = {
2485 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2486 };
2487
2488 test::DNSResponder dns(listen_addr);
2489 StartDns(dns, records);
2490 std::vector<std::string> servers = {listen_addr};
2491 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
2492
2493 const unsigned SHORT_TTL_SEC = 1;
2494 dns.setTtl(SHORT_TTL_SEC);
2495
2496 // Refer to b/148842821 for the purpose of below test steps.
2497 // Basically, this test is used to ensure stale cache case is handled
2498 // correctly with ANDROID_RESOLV_NO_CACHE_STORE.
2499 int fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2500 EXPECT_TRUE(fd != -1);
2501 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2502
2503 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2504 dns.clearQueries();
2505
2506 // Wait until cache expired
2507 sleep(SHORT_TTL_SEC + 0.5);
2508
2509 // Now request the same hostname again.
2510 // We should see a new DNS query because the entry in cache has become stale.
2511 // Due to ANDROID_RESOLV_NO_CACHE_STORE, this query must *not* refresh that stale entry.
2512 fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2513 ANDROID_RESOLV_NO_CACHE_STORE);
2514 EXPECT_TRUE(fd != -1);
2515 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2516 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2517 dns.clearQueries();
2518
2519 // If the cache is still stale, we expect to see one more DNS query
2520 // (this time the cache will be refreshed, but we're not checking for it).
2521 fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2522 EXPECT_TRUE(fd != -1);
2523 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2524 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2525}
2526
Luke Huangba7bef92018-12-26 16:53:03 +08002527TEST_F(ResolverTest, Async_NoRetryFlag) {
Luke Huang70931aa2019-01-31 11:57:41 +08002528 constexpr char listen_addr0[] = "127.0.0.4";
2529 constexpr char listen_addr1[] = "127.0.0.6";
Xiao Ma09b71022018-12-11 17:56:32 +09002530 constexpr char host_name[] = "howdy.example.com.";
2531 const std::vector<DnsRecord> records = {
2532 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2533 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2534 };
2535
Luke Huang70931aa2019-01-31 11:57:41 +08002536 test::DNSResponder dns0(listen_addr0);
2537 test::DNSResponder dns1(listen_addr1);
2538 StartDns(dns0, records);
2539 StartDns(dns1, records);
2540 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr0, listen_addr1}));
Luke Huangba7bef92018-12-26 16:53:03 +08002541
Luke Huang70931aa2019-01-31 11:57:41 +08002542 dns0.clearQueries();
2543 dns1.clearQueries();
2544
2545 dns0.setResponseProbability(0.0);
2546 dns1.setResponseProbability(0.0);
Luke Huangba7bef92018-12-26 16:53:03 +08002547
2548 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2549 ANDROID_RESOLV_NO_RETRY);
2550 EXPECT_TRUE(fd1 != -1);
2551
2552 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa,
2553 ANDROID_RESOLV_NO_RETRY);
2554 EXPECT_TRUE(fd2 != -1);
2555
2556 // expect no response
2557 expectAnswersNotValid(fd1, -ETIMEDOUT);
2558 expectAnswersNotValid(fd2, -ETIMEDOUT);
Mike Yu532405f2020-06-17 17:46:44 +08002559 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2560 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
Luke Huangba7bef92018-12-26 16:53:03 +08002561
Luke Huang70931aa2019-01-31 11:57:41 +08002562 // No retry case, expect total 2 queries. The server is selected randomly.
2563 EXPECT_EQ(2U, GetNumQueries(dns0, host_name) + GetNumQueries(dns1, host_name));
Luke Huangba7bef92018-12-26 16:53:03 +08002564
Luke Huang70931aa2019-01-31 11:57:41 +08002565 dns0.clearQueries();
2566 dns1.clearQueries();
Luke Huangba7bef92018-12-26 16:53:03 +08002567
2568 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2569 EXPECT_TRUE(fd1 != -1);
2570
2571 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
2572 EXPECT_TRUE(fd2 != -1);
2573
2574 // expect no response
2575 expectAnswersNotValid(fd1, -ETIMEDOUT);
2576 expectAnswersNotValid(fd2, -ETIMEDOUT);
Mike Yu532405f2020-06-17 17:46:44 +08002577 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2578 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
Luke Huangba7bef92018-12-26 16:53:03 +08002579
2580 // Retry case, expect 4 queries
Luke Huang70931aa2019-01-31 11:57:41 +08002581 EXPECT_EQ(4U, GetNumQueries(dns0, host_name));
2582 EXPECT_EQ(4U, GetNumQueries(dns1, host_name));
2583}
2584
2585TEST_F(ResolverTest, Async_VerifyQueryID) {
2586 constexpr char listen_addr[] = "127.0.0.4";
2587 constexpr char host_name[] = "howdy.example.com.";
2588 const std::vector<DnsRecord> records = {
2589 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2590 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2591 };
2592
2593 test::DNSResponder dns(listen_addr);
2594 StartDns(dns, records);
2595 std::vector<std::string> servers = {listen_addr};
2596 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
2597
2598 const uint8_t queryBuf1[] = {
2599 /* Header */
2600 0x55, 0x66, /* Transaction ID */
2601 0x01, 0x00, /* Flags */
2602 0x00, 0x01, /* Questions */
2603 0x00, 0x00, /* Answer RRs */
2604 0x00, 0x00, /* Authority RRs */
2605 0x00, 0x00, /* Additional RRs */
2606 /* Queries */
2607 0x05, 0x68, 0x6f, 0x77, 0x64, 0x79, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
2608 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name */
2609 0x00, 0x01, /* Type */
2610 0x00, 0x01 /* Class */
2611 };
2612
2613 int fd = resNetworkSend(TEST_NETID, queryBuf1, sizeof(queryBuf1), 0);
2614 EXPECT_TRUE(fd != -1);
2615
2616 uint8_t buf[MAXPACKET] = {};
2617 int rcode;
2618
2619 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2620 EXPECT_GT(res, 0);
2621 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2622
2623 auto hp = reinterpret_cast<HEADER*>(buf);
2624 EXPECT_EQ(21862U, htons(hp->id));
2625
2626 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2627
2628 const uint8_t queryBuf2[] = {
2629 /* Header */
2630 0x00, 0x53, /* Transaction ID */
2631 0x01, 0x00, /* Flags */
2632 0x00, 0x01, /* Questions */
2633 0x00, 0x00, /* Answer RRs */
2634 0x00, 0x00, /* Authority RRs */
2635 0x00, 0x00, /* Additional RRs */
2636 /* Queries */
2637 0x05, 0x68, 0x6f, 0x77, 0x64, 0x79, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
2638 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name */
2639 0x00, 0x01, /* Type */
2640 0x00, 0x01 /* Class */
2641 };
2642
2643 // Re-query verify cache works and query id is correct
2644 fd = resNetworkSend(TEST_NETID, queryBuf2, sizeof(queryBuf2), 0);
2645
2646 EXPECT_TRUE(fd != -1);
2647
2648 res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2649 EXPECT_GT(res, 0);
2650 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2651
2652 EXPECT_EQ(0x0053U, htons(hp->id));
2653
2654 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
Luke Huangba7bef92018-12-26 16:53:03 +08002655}
2656
Mike Yu4f3747b2018-12-02 17:54:29 +09002657// This test checks that the resolver should not generate the request containing OPT RR when using
Ken Chen0a015532019-01-02 14:59:38 +08002658// cleartext DNS. If we query the DNS server not supporting EDNS0 and it reponds with
2659// FORMERR_ON_EDNS, we will fallback to no EDNS0 and try again. If the server does no response, we
2660// won't retry so that we get no answer.
Mike Yu4f3747b2018-12-02 17:54:29 +09002661TEST_F(ResolverTest, BrokenEdns) {
2662 typedef test::DNSResponder::Edns Edns;
2663 enum ExpectResult { EXPECT_FAILURE, EXPECT_SUCCESS };
2664
Mike Yu3977d482020-02-26 17:18:57 +08002665 // Perform cleartext query in off mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002666 const char OFF[] = "off";
Mike Yu3977d482020-02-26 17:18:57 +08002667
2668 // Perform cleartext query when there's no private DNS server validated in opportunistic mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002669 const char OPPORTUNISTIC_UDP[] = "opportunistic_udp";
Mike Yu3977d482020-02-26 17:18:57 +08002670
2671 // Perform cleartext query when there is a private DNS server validated in opportunistic mode.
2672 const char OPPORTUNISTIC_FALLBACK_UDP[] = "opportunistic_fallback_udp";
2673
2674 // Perform cyphertext query in opportunistic mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002675 const char OPPORTUNISTIC_TLS[] = "opportunistic_tls";
Mike Yu3977d482020-02-26 17:18:57 +08002676
2677 // Perform cyphertext query in strict mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002678 const char STRICT[] = "strict";
Mike Yu3977d482020-02-26 17:18:57 +08002679
Mike Yu4f3747b2018-12-02 17:54:29 +09002680 const char GETHOSTBYNAME[] = "gethostbyname";
2681 const char GETADDRINFO[] = "getaddrinfo";
Mike Yu4f3747b2018-12-02 17:54:29 +09002682 const char ADDR4[] = "192.0.2.1";
2683 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2684 const char CLEARTEXT_PORT[] = "53";
2685 const char TLS_PORT[] = "853";
Luke Huangf8215372019-11-22 11:53:41 +08002686 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
Mike Yu3977d482020-02-26 17:18:57 +08002687 ResolverParamsParcel paramsForCleanup = DnsResponderClient::GetDefaultResolverParamsParcel();
2688 paramsForCleanup.servers.clear();
2689 paramsForCleanup.tlsServers.clear();
Mike Yu4f3747b2018-12-02 17:54:29 +09002690
Mike Yufc125e42019-05-15 20:41:28 +08002691 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Mike Yu4f3747b2018-12-02 17:54:29 +09002692 ASSERT_TRUE(dns.startServer());
2693
2694 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2695
Luke Huangf8215372019-11-22 11:53:41 +08002696 // clang-format off
Mike Yu4f3747b2018-12-02 17:54:29 +09002697 static const struct TestConfig {
2698 std::string mode;
2699 std::string method;
2700 Edns edns;
2701 ExpectResult expectResult;
2702
2703 std::string asHostName() const {
2704 const char* ednsString;
2705 switch (edns) {
2706 case Edns::ON:
2707 ednsString = "ednsOn";
2708 break;
Ken Chen0a015532019-01-02 14:59:38 +08002709 case Edns::FORMERR_ON_EDNS:
Mike Yu4f3747b2018-12-02 17:54:29 +09002710 ednsString = "ednsFormerr";
2711 break;
2712 case Edns::DROP:
2713 ednsString = "ednsDrop";
2714 break;
2715 default:
2716 ednsString = "";
2717 break;
2718 }
2719 return StringPrintf("%s.%s.%s.", mode.c_str(), method.c_str(), ednsString);
2720 }
2721 } testConfigs[] = {
Mike Yu3977d482020-02-26 17:18:57 +08002722 // In OPPORTUNISTIC_TLS, if the DNS server doesn't support EDNS0 but TLS, the lookup
2723 // fails. Could such server exist? if so, we might need to fix it to fallback to
2724 // cleartext query. If the server still make no response for the queries with EDNS0, we
2725 // might also need to fix it to retry without EDNS0.
Mike Yu4f3747b2018-12-02 17:54:29 +09002726 // Another thing is that {OPPORTUNISTIC_TLS, Edns::DROP} and {STRICT, Edns::DROP} are
2727 // commented out since TLS timeout is not configurable.
2728 // TODO: Uncomment them after TLS timeout is configurable.
Mike Yu3977d482020-02-26 17:18:57 +08002729 {OFF, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2730 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2731 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2732 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2733 {STRICT, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2734 {OFF, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2735 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2736 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2737 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2738 {STRICT, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2739 {OFF, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2740 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2741
2742 // The failure is due to no retry on timeout. Maybe fix it?
2743 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2744
2745 //{OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2746 //{STRICT, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2747 {OFF, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2748 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2749 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2750 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2751 {STRICT, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2752 {OFF, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2753 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2754 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2755 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2756 {STRICT, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2757 {OFF, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2758 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2759
2760 // The failure is due to no retry on timeout. Maybe fix it?
2761 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2762
Mike Yu4f3747b2018-12-02 17:54:29 +09002763 //{OPPORTUNISTIC_TLS, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2764 //{STRICT, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2765 };
Luke Huangf8215372019-11-22 11:53:41 +08002766 // clang-format on
Mike Yu4f3747b2018-12-02 17:54:29 +09002767
2768 for (const auto& config : testConfigs) {
2769 const std::string testHostName = config.asHostName();
2770 SCOPED_TRACE(testHostName);
2771
2772 const char* host_name = testHostName.c_str();
2773 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
2774 dns.setEdns(config.edns);
2775
2776 if (config.mode == OFF) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002777 if (tls.running()) {
2778 ASSERT_TRUE(tls.stopServer());
2779 }
Xiao Ma09b71022018-12-11 17:56:32 +09002780 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Mike Yu4f3747b2018-12-02 17:54:29 +09002781 } else if (config.mode == OPPORTUNISTIC_UDP) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002782 if (tls.running()) {
2783 ASSERT_TRUE(tls.stopServer());
2784 }
Xiao Ma09b71022018-12-11 17:56:32 +09002785 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002786 kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002787 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), false));
Mike Yu3977d482020-02-26 17:18:57 +08002788 } else if (config.mode == OPPORTUNISTIC_TLS || config.mode == OPPORTUNISTIC_FALLBACK_UDP) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002789 if (!tls.running()) {
2790 ASSERT_TRUE(tls.startServer());
2791 }
Xiao Ma09b71022018-12-11 17:56:32 +09002792 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002793 kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002794 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Mike Yu3977d482020-02-26 17:18:57 +08002795
2796 if (config.mode == OPPORTUNISTIC_FALLBACK_UDP) {
2797 // Force the resolver to fallback to cleartext queries.
2798 ASSERT_TRUE(tls.stopServer());
2799 }
Mike Yu4f3747b2018-12-02 17:54:29 +09002800 } else if (config.mode == STRICT) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002801 if (!tls.running()) {
2802 ASSERT_TRUE(tls.startServer());
2803 }
Xiao Ma09b71022018-12-11 17:56:32 +09002804 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002805 kDefaultParams, kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08002806 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Mike Yu4f3747b2018-12-02 17:54:29 +09002807 }
2808
2809 if (config.method == GETHOSTBYNAME) {
2810 const hostent* h_result = gethostbyname(host_name);
2811 if (config.expectResult == EXPECT_SUCCESS) {
2812 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2813 ASSERT_TRUE(h_result != nullptr);
2814 ASSERT_EQ(4, h_result->h_length);
2815 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
2816 EXPECT_EQ(ADDR4, ToString(h_result));
2817 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
Mike Yu532405f2020-06-17 17:46:44 +08002818 ExpectDnsEvent(INetdEventListener::EVENT_GETHOSTBYNAME, 0, host_name, {ADDR4});
Mike Yu4f3747b2018-12-02 17:54:29 +09002819 } else {
2820 EXPECT_EQ(0U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
2821 ASSERT_TRUE(h_result == nullptr);
2822 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
Mike Yu532405f2020-06-17 17:46:44 +08002823 int returnCode = (config.edns == Edns::DROP) ? RCODE_TIMEOUT : EAI_FAIL;
2824 ExpectDnsEvent(INetdEventListener::EVENT_GETHOSTBYNAME, returnCode, host_name, {});
Mike Yu4f3747b2018-12-02 17:54:29 +09002825 }
2826 } else if (config.method == GETADDRINFO) {
2827 ScopedAddrinfo ai_result;
2828 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2829 ai_result = safe_getaddrinfo(host_name, nullptr, &hints);
2830 if (config.expectResult == EXPECT_SUCCESS) {
2831 EXPECT_TRUE(ai_result != nullptr);
2832 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2833 const std::string result_str = ToString(ai_result);
2834 EXPECT_EQ(ADDR4, result_str);
Mike Yu532405f2020-06-17 17:46:44 +08002835 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, 0, host_name, {ADDR4});
Mike Yu4f3747b2018-12-02 17:54:29 +09002836 } else {
2837 EXPECT_TRUE(ai_result == nullptr);
2838 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
Mike Yu532405f2020-06-17 17:46:44 +08002839 int returnCode = (config.edns == Edns::DROP) ? RCODE_TIMEOUT : EAI_FAIL;
2840 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, returnCode, host_name, {});
Mike Yu4f3747b2018-12-02 17:54:29 +09002841 }
2842 } else {
2843 FAIL() << "Unsupported query method: " << config.method;
2844 }
2845
Mike Yudd4ac2d2019-05-31 16:52:11 +08002846 tls.clearQueries();
Mike Yu4f3747b2018-12-02 17:54:29 +09002847 dns.clearQueries();
Mike Yu3977d482020-02-26 17:18:57 +08002848
2849 // Clear the setup to force the resolver to validate private DNS servers in every test.
2850 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(paramsForCleanup));
Mike Yu4f3747b2018-12-02 17:54:29 +09002851 }
Mike Yu4f3747b2018-12-02 17:54:29 +09002852}
nuccachena26cc2a2018-07-17 18:07:23 +08002853
Ken Chen0a015532019-01-02 14:59:38 +08002854// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2855// Resolver should have a reasonable number of retries instead of spinning forever. We don't have
2856// an efficient way to know if resolver is stuck in an infinite loop. However, test case will be
2857// failed due to timeout.
2858TEST_F(ResolverTest, UnstableTls) {
2859 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2860 const char CLEARTEXT_PORT[] = "53";
2861 const char TLS_PORT[] = "853";
2862 const char* host_name1 = "nonexistent1.example.com.";
2863 const char* host_name2 = "nonexistent2.example.com.";
2864 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
2865
Mike Yufc125e42019-05-15 20:41:28 +08002866 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Ken Chen0a015532019-01-02 14:59:38 +08002867 ASSERT_TRUE(dns.startServer());
2868 dns.setEdns(test::DNSResponder::Edns::FORMERR_ON_EDNS);
2869 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2870 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08002871 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002872 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
2873
Ken Chen0a015532019-01-02 14:59:38 +08002874 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
2875 tls.stopServer();
2876
2877 const hostent* h_result = gethostbyname(host_name1);
2878 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
2879 ASSERT_TRUE(h_result == nullptr);
2880 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2881
2882 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2883 ScopedAddrinfo ai_result = safe_getaddrinfo(host_name2, nullptr, &hints);
2884 EXPECT_TRUE(ai_result == nullptr);
2885 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
2886}
2887
2888// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2889// Moreover, server responds RCODE=FORMERR even on non-EDNS query.
2890TEST_F(ResolverTest, BogusDnsServer) {
2891 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2892 const char CLEARTEXT_PORT[] = "53";
2893 const char TLS_PORT[] = "853";
2894 const char* host_name1 = "nonexistent1.example.com.";
2895 const char* host_name2 = "nonexistent2.example.com.";
2896 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
2897
Mike Yufc125e42019-05-15 20:41:28 +08002898 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Ken Chen0a015532019-01-02 14:59:38 +08002899 ASSERT_TRUE(dns.startServer());
2900 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2901 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08002902 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002903 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
2904
Ken Chen0a015532019-01-02 14:59:38 +08002905 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
2906 tls.stopServer();
2907 dns.setEdns(test::DNSResponder::Edns::FORMERR_UNCOND);
2908
2909 const hostent* h_result = gethostbyname(host_name1);
2910 EXPECT_EQ(0U, GetNumQueries(dns, host_name1));
2911 ASSERT_TRUE(h_result == nullptr);
2912 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2913
2914 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2915 ScopedAddrinfo ai_result = safe_getaddrinfo(host_name2, nullptr, &hints);
2916 EXPECT_TRUE(ai_result == nullptr);
2917 EXPECT_EQ(0U, GetNumQueries(dns, host_name2));
2918}
2919
nuccachena26cc2a2018-07-17 18:07:23 +08002920TEST_F(ResolverTest, GetAddrInfo_Dns64Synthesize) {
2921 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002922 constexpr char dns64_name[] = "ipv4only.arpa.";
2923 constexpr char host_name[] = "v4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002924 const std::vector<DnsRecord> records = {
2925 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2926 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2927 };
nuccachena26cc2a2018-07-17 18:07:23 +08002928
Xiao Ma09b71022018-12-11 17:56:32 +09002929 test::DNSResponder dns(listen_addr);
Xiao Ma09b71022018-12-11 17:56:32 +09002930 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002931
2932 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002933 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002934
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002935 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002936 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002937 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002938
2939 // hints are necessary in order to let netd know which type of addresses the caller is
2940 // interested in.
Xiao Ma09b71022018-12-11 17:56:32 +09002941 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08002942 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
2943 EXPECT_TRUE(result != nullptr);
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002944 // TODO: BUG: there should only be two queries, one AAAA (which returns no records) and one A
2945 // (which returns 1.2.3.4). But there is an extra AAAA.
2946 EXPECT_EQ(3U, GetNumQueries(dns, host_name));
nuccachena26cc2a2018-07-17 18:07:23 +08002947
2948 std::string result_str = ToString(result);
2949 EXPECT_EQ(result_str, "64:ff9b::102:304");
2950
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002951 // Stopping NAT64 prefix discovery disables synthesis.
Luke Huang5bd827c2019-03-14 16:10:04 +08002952 EXPECT_TRUE(mDnsClient.resolvService()->stopPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002953 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_NOT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002954
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002955 dns.clearQueries();
nuccachena26cc2a2018-07-17 18:07:23 +08002956
2957 result = safe_getaddrinfo("v4only", nullptr, &hints);
2958 EXPECT_TRUE(result != nullptr);
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002959 // TODO: BUG: there should only be one query, an AAAA (which returns no records), because the
2960 // A is already cached. But there is an extra AAAA.
2961 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
nuccachena26cc2a2018-07-17 18:07:23 +08002962
2963 result_str = ToString(result);
2964 EXPECT_EQ(result_str, "1.2.3.4");
2965}
2966
nuccachena26cc2a2018-07-17 18:07:23 +08002967TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecified) {
2968 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002969 constexpr char dns64_name[] = "ipv4only.arpa.";
2970 constexpr char host_name[] = "v4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002971 const std::vector<DnsRecord> records = {
2972 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2973 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2974 };
nuccachena26cc2a2018-07-17 18:07:23 +08002975
Xiao Ma09b71022018-12-11 17:56:32 +09002976 test::DNSResponder dns(listen_addr);
2977 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002978 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002979 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002980
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002981 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002982 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002983 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002984
2985 // Ensure to synthesize AAAA if AF_INET6 is specified, and not to synthesize AAAA
2986 // in AF_INET case.
2987 addrinfo hints;
2988 memset(&hints, 0, sizeof(hints));
2989 hints.ai_family = AF_INET6;
2990 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
2991 EXPECT_TRUE(result != nullptr);
2992 std::string result_str = ToString(result);
2993 EXPECT_EQ(result_str, "64:ff9b::102:304");
2994
2995 hints.ai_family = AF_INET;
2996 result = safe_getaddrinfo("v4only", nullptr, &hints);
2997 EXPECT_TRUE(result != nullptr);
2998 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2999 result_str = ToString(result);
3000 EXPECT_EQ(result_str, "1.2.3.4");
3001}
nuccachena26cc2a2018-07-17 18:07:23 +08003002
3003TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedV6) {
3004 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003005 constexpr char dns64_name[] = "ipv4only.arpa.";
3006 constexpr char host_name[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003007 const std::vector<DnsRecord> records = {
3008 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3009 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3010 {host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
3011 };
nuccachena26cc2a2018-07-17 18:07:23 +08003012
Xiao Ma09b71022018-12-11 17:56:32 +09003013 test::DNSResponder dns(listen_addr);
3014 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003015 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003016 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003017
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003018 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003019 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003020 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003021
Xiao Ma09b71022018-12-11 17:56:32 +09003022 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08003023 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
3024 EXPECT_TRUE(result != nullptr);
3025 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3026
3027 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
Xiao Ma09b71022018-12-11 17:56:32 +09003028 const std::vector<std::string> result_strs = ToStrings(result);
nuccachena26cc2a2018-07-17 18:07:23 +08003029 for (const auto& str : result_strs) {
3030 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
3031 << ", result_str='" << str << "'";
3032 }
3033}
3034
3035TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedNoV6) {
3036 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003037 constexpr char dns64_name[] = "ipv4only.arpa.";
3038 constexpr char host_name[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003039 const std::vector<DnsRecord> records = {
3040 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3041 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3042 };
nuccachena26cc2a2018-07-17 18:07:23 +08003043
Xiao Ma09b71022018-12-11 17:56:32 +09003044 test::DNSResponder dns(listen_addr);
3045 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003046 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003047 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003048
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003049 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003050 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003051 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003052
Xiao Ma09b71022018-12-11 17:56:32 +09003053 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08003054 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
3055 EXPECT_TRUE(result != nullptr);
3056 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3057
3058 // In AF_UNSPEC case, synthesize AAAA if there's no AAAA answer.
3059 std::string result_str = ToString(result);
3060 EXPECT_EQ(result_str, "64:ff9b::102:304");
3061}
3062
3063TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecialUseIPv4Addresses) {
3064 constexpr char THIS_NETWORK[] = "this_network";
3065 constexpr char LOOPBACK[] = "loopback";
3066 constexpr char LINK_LOCAL[] = "link_local";
3067 constexpr char MULTICAST[] = "multicast";
3068 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
3069
3070 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
3071 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
3072 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
3073 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
3074 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
3075
3076 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003077 constexpr char dns64_name[] = "ipv4only.arpa.";
3078
Xiao Ma09b71022018-12-11 17:56:32 +09003079 test::DNSResponder dns(listen_addr);
3080 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003081 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003082 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003083
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003084 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003085 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003086 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003087
Luke Huangf8215372019-11-22 11:53:41 +08003088 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003089 static const struct TestConfig {
3090 std::string name;
3091 std::string addr;
3092
3093 std::string asHostName() const { return StringPrintf("%s.example.com.", name.c_str()); }
3094 } testConfigs[]{
3095 {THIS_NETWORK, ADDR_THIS_NETWORK},
3096 {LOOPBACK, ADDR_LOOPBACK},
3097 {LINK_LOCAL, ADDR_LINK_LOCAL},
3098 {MULTICAST, ADDR_MULTICAST},
3099 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
3100 };
Luke Huangf8215372019-11-22 11:53:41 +08003101 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003102
3103 for (const auto& config : testConfigs) {
3104 const std::string testHostName = config.asHostName();
3105 SCOPED_TRACE(testHostName);
3106
3107 const char* host_name = testHostName.c_str();
3108 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
3109
3110 addrinfo hints;
3111 memset(&hints, 0, sizeof(hints));
3112 hints.ai_family = AF_INET6;
3113 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
3114 // In AF_INET6 case, don't return IPv4 answers
3115 EXPECT_TRUE(result == nullptr);
3116 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3117 dns.clearQueries();
3118
3119 memset(&hints, 0, sizeof(hints));
3120 hints.ai_family = AF_UNSPEC;
3121 result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
3122 EXPECT_TRUE(result != nullptr);
3123 // Expect IPv6 query only. IPv4 answer has been cached in previous query.
3124 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3125 // In AF_UNSPEC case, don't synthesize special use IPv4 address.
3126 std::string result_str = ToString(result);
3127 EXPECT_EQ(result_str, config.addr.c_str());
3128 dns.clearQueries();
3129 }
3130}
3131
3132TEST_F(ResolverTest, GetAddrInfo_Dns64QueryWithNullArgumentHints) {
3133 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003134 constexpr char dns64_name[] = "ipv4only.arpa.";
3135 constexpr char host_name[] = "v4only.example.com.";
3136 constexpr char host_name2[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003137 const std::vector<DnsRecord> records = {
3138 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3139 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3140 {host_name2, ns_type::ns_t_a, "1.2.3.4"},
3141 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
3142 };
nuccachena26cc2a2018-07-17 18:07:23 +08003143
Xiao Ma09b71022018-12-11 17:56:32 +09003144 test::DNSResponder dns(listen_addr);
3145 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003146 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003147 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003148
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003149 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003150 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003151 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003152
3153 // Assign argument hints of getaddrinfo() as null is equivalent to set ai_family AF_UNSPEC.
3154 // In AF_UNSPEC case, synthesize AAAA if there has A answer only.
3155 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, nullptr);
3156 EXPECT_TRUE(result != nullptr);
3157 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3158 std::string result_str = ToString(result);
3159 EXPECT_EQ(result_str, "64:ff9b::102:304");
3160 dns.clearQueries();
3161
3162 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
3163 result = safe_getaddrinfo("v4v6", nullptr, nullptr);
3164 EXPECT_TRUE(result != nullptr);
3165 EXPECT_LE(2U, GetNumQueries(dns, host_name2));
3166 std::vector<std::string> result_strs = ToStrings(result);
3167 for (const auto& str : result_strs) {
3168 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
3169 << ", result_str='" << str << "'";
3170 }
3171}
3172
3173TEST_F(ResolverTest, GetAddrInfo_Dns64QueryNullArgumentNode) {
3174 constexpr char ADDR_ANYADDR_V4[] = "0.0.0.0";
3175 constexpr char ADDR_ANYADDR_V6[] = "::";
3176 constexpr char ADDR_LOCALHOST_V4[] = "127.0.0.1";
3177 constexpr char ADDR_LOCALHOST_V6[] = "::1";
3178
3179 constexpr char PORT_NAME_HTTP[] = "http";
3180 constexpr char PORT_NUMBER_HTTP[] = "80";
3181
3182 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003183 constexpr char dns64_name[] = "ipv4only.arpa.";
3184
Xiao Ma09b71022018-12-11 17:56:32 +09003185 test::DNSResponder dns(listen_addr);
3186 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003187 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003188 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003189
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003190 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003191 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003192 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003193
Luke Huangf8215372019-11-22 11:53:41 +08003194 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003195 // If node is null, return address is listed by libc/getaddrinfo.c as follows.
3196 // - passive socket -> anyaddr (0.0.0.0 or ::)
3197 // - non-passive socket -> localhost (127.0.0.1 or ::1)
3198 static const struct TestConfig {
3199 int flag;
3200 std::string addr_v4;
3201 std::string addr_v6;
3202
3203 std::string asParameters() const {
3204 return StringPrintf("flag=%d, addr_v4=%s, addr_v6=%s", flag, addr_v4.c_str(),
3205 addr_v6.c_str());
3206 }
3207 } testConfigs[]{
3208 {0 /* non-passive */, ADDR_LOCALHOST_V4, ADDR_LOCALHOST_V6},
3209 {AI_PASSIVE, ADDR_ANYADDR_V4, ADDR_ANYADDR_V6}
3210 };
Luke Huangf8215372019-11-22 11:53:41 +08003211 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003212
3213 for (const auto& config : testConfigs) {
3214 SCOPED_TRACE(config.asParameters());
3215
Xiao Ma09b71022018-12-11 17:56:32 +09003216 addrinfo hints = {
Nick Desaulnierscd6395a2019-10-11 09:15:24 -07003217 .ai_flags = config.flag,
Xiao Ma09b71022018-12-11 17:56:32 +09003218 .ai_family = AF_UNSPEC, // any address family
3219 .ai_socktype = 0, // any type
3220 .ai_protocol = 0, // any protocol
Xiao Ma09b71022018-12-11 17:56:32 +09003221 };
nuccachena26cc2a2018-07-17 18:07:23 +08003222
3223 // Assign hostname as null and service as port name.
3224 ScopedAddrinfo result = safe_getaddrinfo(nullptr, PORT_NAME_HTTP, &hints);
3225 ASSERT_TRUE(result != nullptr);
3226
3227 // Can't be synthesized because it should not get into Netd.
3228 std::vector<std::string> result_strs = ToStrings(result);
3229 for (const auto& str : result_strs) {
3230 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
3231 << ", result_str='" << str << "'";
3232 }
3233
3234 // Assign hostname as null and service as numeric port number.
3235 hints.ai_flags = config.flag | AI_NUMERICSERV;
3236 result = safe_getaddrinfo(nullptr, PORT_NUMBER_HTTP, &hints);
3237 ASSERT_TRUE(result != nullptr);
3238
3239 // Can't be synthesized because it should not get into Netd.
3240 result_strs = ToStrings(result);
3241 for (const auto& str : result_strs) {
3242 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
3243 << ", result_str='" << str << "'";
3244 }
3245 }
3246}
3247
3248TEST_F(ResolverTest, GetHostByAddr_ReverseDnsQueryWithHavingNat64Prefix) {
3249 struct hostent* result = nullptr;
3250 struct in_addr v4addr;
3251 struct in6_addr v6addr;
3252
3253 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003254 constexpr char dns64_name[] = "ipv4only.arpa.";
3255 constexpr char ptr_name[] = "v4v6.example.com.";
3256 // PTR record for IPv4 address 1.2.3.4
3257 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3258 // PTR record for IPv6 address 2001:db8::102:304
3259 constexpr char ptr_addr_v6[] =
3260 "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 +09003261 const std::vector<DnsRecord> records = {
3262 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3263 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3264 {ptr_addr_v6, ns_type::ns_t_ptr, ptr_name},
3265 };
nuccachena26cc2a2018-07-17 18:07:23 +08003266
Xiao Ma09b71022018-12-11 17:56:32 +09003267 test::DNSResponder dns(listen_addr);
3268 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003269 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003270 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003271
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003272 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003273 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003274 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003275
3276 // Reverse IPv4 DNS query. Prefix should have no effect on it.
3277 inet_pton(AF_INET, "1.2.3.4", &v4addr);
3278 result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
3279 ASSERT_TRUE(result != nullptr);
3280 std::string result_str = result->h_name ? result->h_name : "null";
3281 EXPECT_EQ(result_str, "v4v6.example.com");
3282
3283 // Reverse IPv6 DNS query. Prefix should have no effect on it.
3284 inet_pton(AF_INET6, "2001:db8::102:304", &v6addr);
3285 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3286 ASSERT_TRUE(result != nullptr);
3287 result_str = result->h_name ? result->h_name : "null";
3288 EXPECT_EQ(result_str, "v4v6.example.com");
3289}
3290
3291TEST_F(ResolverTest, GetHostByAddr_ReverseDns64Query) {
3292 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003293 constexpr char dns64_name[] = "ipv4only.arpa.";
3294 constexpr char ptr_name[] = "v4only.example.com.";
3295 // PTR record for IPv4 address 1.2.3.4
3296 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3297 // PTR record for IPv6 address 64:ff9b::1.2.3.4
3298 constexpr char ptr_addr_v6_nomapping[] =
3299 "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.";
3300 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
3301 // PTR record for IPv6 address 64:ff9b::5.6.7.8
3302 constexpr char ptr_addr_v6_synthesis[] =
3303 "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 +09003304 const std::vector<DnsRecord> records = {
3305 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3306 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3307 {ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis},
3308 };
nuccachena26cc2a2018-07-17 18:07:23 +08003309
Xiao Ma09b71022018-12-11 17:56:32 +09003310 test::DNSResponder dns(listen_addr);
3311 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003312 // "ptr_addr_v6_nomapping" is not mapped in DNS server
nuccachena26cc2a2018-07-17 18:07:23 +08003313 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003314 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003315
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003316 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003317 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003318 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003319
3320 // Synthesized PTR record doesn't exist on DNS server
3321 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
3322 // After querying synthesized address failed, expect that prefix is removed from IPv6
3323 // synthesized address and do reverse IPv4 query instead.
3324 struct in6_addr v6addr;
3325 inet_pton(AF_INET6, "64:ff9b::1.2.3.4", &v6addr);
3326 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3327 ASSERT_TRUE(result != nullptr);
3328 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist
3329 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist
3330 std::string result_str = result->h_name ? result->h_name : "null";
3331 EXPECT_EQ(result_str, "v4only.example.com");
3332 // Check that return address has been mapped from IPv4 to IPv6 address because Netd
3333 // removes NAT64 prefix and does IPv4 DNS reverse lookup in this case. Then, Netd
3334 // fakes the return IPv4 address as original queried IPv6 address.
3335 result_str = ToString(result);
3336 EXPECT_EQ(result_str, "64:ff9b::102:304");
3337 dns.clearQueries();
3338
3339 // Synthesized PTR record exists on DNS server
3340 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
3341 // Expect to Netd pass through synthesized address for DNS queries.
3342 inet_pton(AF_INET6, "64:ff9b::5.6.7.8", &v6addr);
3343 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3344 ASSERT_TRUE(result != nullptr);
3345 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
3346 result_str = result->h_name ? result->h_name : "null";
3347 EXPECT_EQ(result_str, "v6synthesis.example.com");
3348}
3349
3350TEST_F(ResolverTest, GetHostByAddr_ReverseDns64QueryFromHostFile) {
3351 constexpr char dns64_name[] = "ipv4only.arpa.";
3352 constexpr char host_name[] = "localhost";
3353 // The address is synthesized by prefix64:localhost.
3354 constexpr char host_addr[] = "64:ff9b::7f00:1";
nuccachena26cc2a2018-07-17 18:07:23 +08003355 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003356
3357 test::DNSResponder dns(listen_addr);
3358 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003359 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003360 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003361
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003362 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003363 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003364 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003365
3366 // Using synthesized "localhost" address to be a trick for resolving host name
3367 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
3368 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
3369 struct in6_addr v6addr;
3370 inet_pton(AF_INET6, host_addr, &v6addr);
3371 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3372 ASSERT_TRUE(result != nullptr);
3373 // Expect no DNS queries; localhost is resolved via /etc/hosts.
3374 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
3375
Luke Huangf8215372019-11-22 11:53:41 +08003376 ASSERT_EQ(sizeof(in6_addr), (unsigned)result->h_length);
nuccachena26cc2a2018-07-17 18:07:23 +08003377 ASSERT_EQ(AF_INET6, result->h_addrtype);
3378 std::string result_str = ToString(result);
3379 EXPECT_EQ(result_str, host_addr);
3380 result_str = result->h_name ? result->h_name : "null";
3381 EXPECT_EQ(result_str, host_name);
3382}
3383
Hungming Chen9e6185a2019-06-04 16:09:19 +08003384TEST_F(ResolverTest, GetHostByAddr_cnamesClasslessReverseDelegation) {
3385 // IPv4 addresses in the subnet with notation '/' or '-'.
3386 constexpr char addr_slash[] = "192.0.2.1";
3387 constexpr char addr_hyphen[] = "192.0.3.1";
3388
3389 // Used to verify DNS reverse query for classless reverse lookup zone. See detail in RFC 2317
3390 // section 4.
3391 const static std::vector<DnsRecord> records = {
3392 // The records for reverse querying "192.0.2.1" in the subnet with notation '/'.
3393 {"1.2.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0/25.2.0.192.in-addr.arpa."},
3394 {"1.0/25.2.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3395
3396 // The records for reverse querying "192.0.3.1" in the subnet with notation '-'.
3397 {"1.3.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0-127.3.0.192.in-addr.arpa."},
3398 {"1.0-127.3.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3399 };
3400
3401 test::DNSResponder dns;
3402 StartDns(dns, records);
3403 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3404
3405 for (const auto& address : {addr_slash, addr_hyphen}) {
3406 SCOPED_TRACE(address);
3407
3408 in_addr v4addr;
3409 ASSERT_TRUE(inet_pton(AF_INET, address, &v4addr));
3410 hostent* result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
3411 ASSERT_TRUE(result != nullptr);
3412 EXPECT_STREQ("hello.example.com", result->h_name);
3413 }
3414}
3415
nuccachena26cc2a2018-07-17 18:07:23 +08003416TEST_F(ResolverTest, GetNameInfo_ReverseDnsQueryWithHavingNat64Prefix) {
3417 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003418 constexpr char dns64_name[] = "ipv4only.arpa.";
3419 constexpr char ptr_name[] = "v4v6.example.com.";
3420 // PTR record for IPv4 address 1.2.3.4
3421 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3422 // PTR record for IPv6 address 2001:db8::102:304
3423 constexpr char ptr_addr_v6[] =
3424 "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 +09003425 const std::vector<DnsRecord> records = {
3426 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3427 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3428 {ptr_addr_v6, ns_type::ns_t_ptr, ptr_name},
3429 };
nuccachena26cc2a2018-07-17 18:07:23 +08003430
Xiao Ma09b71022018-12-11 17:56:32 +09003431 test::DNSResponder dns(listen_addr);
3432 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003433 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003434 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003435
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003436 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003437 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003438 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003439
Luke Huangf8215372019-11-22 11:53:41 +08003440 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003441 static const struct TestConfig {
3442 int flag;
3443 int family;
3444 std::string addr;
3445 std::string host;
3446
3447 std::string asParameters() const {
3448 return StringPrintf("flag=%d, family=%d, addr=%s, host=%s", flag, family, addr.c_str(),
3449 host.c_str());
3450 }
3451 } testConfigs[]{
3452 {NI_NAMEREQD, AF_INET, "1.2.3.4", "v4v6.example.com"},
3453 {NI_NUMERICHOST, AF_INET, "1.2.3.4", "1.2.3.4"},
3454 {0, AF_INET, "1.2.3.4", "v4v6.example.com"},
3455 {0, AF_INET, "5.6.7.8", "5.6.7.8"}, // unmapped
3456 {NI_NAMEREQD, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
3457 {NI_NUMERICHOST, AF_INET6, "2001:db8::102:304", "2001:db8::102:304"},
3458 {0, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
3459 {0, AF_INET6, "2001:db8::506:708", "2001:db8::506:708"}, // unmapped
3460 };
Luke Huangf8215372019-11-22 11:53:41 +08003461 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003462
3463 // Reverse IPv4/IPv6 DNS query. Prefix should have no effect on it.
3464 for (const auto& config : testConfigs) {
3465 SCOPED_TRACE(config.asParameters());
3466
3467 int rv;
3468 char host[NI_MAXHOST];
3469 struct sockaddr_in sin;
3470 struct sockaddr_in6 sin6;
3471 if (config.family == AF_INET) {
3472 memset(&sin, 0, sizeof(sin));
3473 sin.sin_family = AF_INET;
3474 inet_pton(AF_INET, config.addr.c_str(), &sin.sin_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003475 rv = getnameinfo((const struct sockaddr*)&sin, sizeof(sin), host, sizeof(host), nullptr,
3476 0, config.flag);
nuccachena26cc2a2018-07-17 18:07:23 +08003477 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4));
3478 } else if (config.family == AF_INET6) {
3479 memset(&sin6, 0, sizeof(sin6));
3480 sin6.sin6_family = AF_INET6;
3481 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003482 rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host),
nuccachena26cc2a2018-07-17 18:07:23 +08003483 nullptr, 0, config.flag);
3484 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6));
3485 }
3486 ASSERT_EQ(0, rv);
3487 std::string result_str = host;
3488 EXPECT_EQ(result_str, config.host);
3489 dns.clearQueries();
3490 }
3491}
3492
3493TEST_F(ResolverTest, GetNameInfo_ReverseDns64Query) {
3494 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003495 constexpr char dns64_name[] = "ipv4only.arpa.";
3496 constexpr char ptr_name[] = "v4only.example.com.";
3497 // PTR record for IPv4 address 1.2.3.4
3498 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3499 // PTR record for IPv6 address 64:ff9b::1.2.3.4
3500 constexpr char ptr_addr_v6_nomapping[] =
3501 "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.";
3502 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
3503 // PTR record for IPv6 address 64:ff9b::5.6.7.8
3504 constexpr char ptr_addr_v6_synthesis[] =
3505 "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 +09003506 const std::vector<DnsRecord> records = {
3507 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3508 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3509 {ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis},
3510 };
nuccachena26cc2a2018-07-17 18:07:23 +08003511
Xiao Ma09b71022018-12-11 17:56:32 +09003512 test::DNSResponder dns(listen_addr);
3513 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003514 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003515 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003516
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003517 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003518 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003519 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003520
Luke Huangf8215372019-11-22 11:53:41 +08003521 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003522 static const struct TestConfig {
3523 bool hasSynthesizedPtrRecord;
3524 int flag;
3525 std::string addr;
3526 std::string host;
3527
3528 std::string asParameters() const {
3529 return StringPrintf("hasSynthesizedPtrRecord=%d, flag=%d, addr=%s, host=%s",
3530 hasSynthesizedPtrRecord, flag, addr.c_str(), host.c_str());
3531 }
3532 } testConfigs[]{
3533 {false, NI_NAMEREQD, "64:ff9b::102:304", "v4only.example.com"},
3534 {false, NI_NUMERICHOST, "64:ff9b::102:304", "64:ff9b::102:304"},
3535 {false, 0, "64:ff9b::102:304", "v4only.example.com"},
3536 {true, NI_NAMEREQD, "64:ff9b::506:708", "v6synthesis.example.com"},
3537 {true, NI_NUMERICHOST, "64:ff9b::506:708", "64:ff9b::506:708"},
3538 {true, 0, "64:ff9b::506:708", "v6synthesis.example.com"}
3539 };
Luke Huangf8215372019-11-22 11:53:41 +08003540 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003541
3542 // hasSynthesizedPtrRecord = false
3543 // Synthesized PTR record doesn't exist on DNS server
3544 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
3545 // After querying synthesized address failed, expect that prefix is removed from IPv6
3546 // synthesized address and do reverse IPv4 query instead.
3547 //
3548 // hasSynthesizedPtrRecord = true
3549 // Synthesized PTR record exists on DNS server
3550 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
3551 // Expect to just pass through synthesized address for DNS queries.
3552 for (const auto& config : testConfigs) {
3553 SCOPED_TRACE(config.asParameters());
3554
3555 char host[NI_MAXHOST];
3556 struct sockaddr_in6 sin6;
3557 memset(&sin6, 0, sizeof(sin6));
3558 sin6.sin6_family = AF_INET6;
3559 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003560 int rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host),
nuccachena26cc2a2018-07-17 18:07:23 +08003561 nullptr, 0, config.flag);
3562 ASSERT_EQ(0, rv);
3563 if (config.flag == NI_NAMEREQD) {
3564 if (config.hasSynthesizedPtrRecord) {
3565 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
3566 } else {
3567 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist.
3568 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist.
3569 }
3570 }
3571 std::string result_str = host;
3572 EXPECT_EQ(result_str, config.host);
3573 dns.clearQueries();
3574 }
3575}
3576
3577TEST_F(ResolverTest, GetNameInfo_ReverseDns64QueryFromHostFile) {
3578 constexpr char dns64_name[] = "ipv4only.arpa.";
3579 constexpr char host_name[] = "localhost";
3580 // The address is synthesized by prefix64:localhost.
3581 constexpr char host_addr[] = "64:ff9b::7f00:1";
nuccachena26cc2a2018-07-17 18:07:23 +08003582 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003583
3584 test::DNSResponder dns(listen_addr);
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003585
Xiao Ma09b71022018-12-11 17:56:32 +09003586 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003587 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003588 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003589
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003590 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003591 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003592 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003593
3594 // Using synthesized "localhost" address to be a trick for resolving host name
3595 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
3596 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
3597 char host[NI_MAXHOST];
Xiao Ma09b71022018-12-11 17:56:32 +09003598 struct sockaddr_in6 sin6 = {.sin6_family = AF_INET6};
nuccachena26cc2a2018-07-17 18:07:23 +08003599 inet_pton(AF_INET6, host_addr, &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003600 int rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host), nullptr,
nuccachena26cc2a2018-07-17 18:07:23 +08003601 0, NI_NAMEREQD);
3602 ASSERT_EQ(0, rv);
3603 // Expect no DNS queries; localhost is resolved via /etc/hosts.
3604 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
3605
3606 std::string result_str = host;
3607 EXPECT_EQ(result_str, host_name);
3608}
3609
Hungming Chen9e6185a2019-06-04 16:09:19 +08003610TEST_F(ResolverTest, GetNameInfo_cnamesClasslessReverseDelegation) {
3611 // IPv4 addresses in the subnet with notation '/' or '-'.
3612 constexpr char addr_slash[] = "192.0.2.1";
3613 constexpr char addr_hyphen[] = "192.0.3.1";
3614
3615 // Used to verify DNS reverse query for classless reverse lookup zone. See detail in RFC 2317
3616 // section 4.
3617 const static std::vector<DnsRecord> records = {
3618 // The records for reverse querying "192.0.2.1" in the subnet with notation '/'.
3619 {"1.2.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0/25.2.0.192.in-addr.arpa."},
3620 {"1.0/25.2.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3621
3622 // The records for reverse querying "192.0.3.1" in the subnet with notation '-'.
3623 {"1.3.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0-127.3.0.192.in-addr.arpa."},
3624 {"1.0-127.3.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3625 };
3626
3627 test::DNSResponder dns;
3628 StartDns(dns, records);
3629 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3630
3631 for (const auto& address : {addr_slash, addr_hyphen}) {
3632 SCOPED_TRACE(address);
3633
3634 char host[NI_MAXHOST];
3635 sockaddr_in sin = {.sin_family = AF_INET};
3636 ASSERT_TRUE(inet_pton(AF_INET, address, &sin.sin_addr));
3637 int rv = getnameinfo((const sockaddr*)&sin, sizeof(sin), host, sizeof(host), nullptr, 0,
3638 NI_NAMEREQD);
3639 ASSERT_EQ(0, rv);
3640 EXPECT_STREQ("hello.example.com", host);
3641 }
3642}
3643
nuccachena26cc2a2018-07-17 18:07:23 +08003644TEST_F(ResolverTest, GetHostByName2_Dns64Synthesize) {
Xiao Ma09b71022018-12-11 17:56:32 +09003645 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003646 constexpr char dns64_name[] = "ipv4only.arpa.";
3647 constexpr char host_name[] = "ipv4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003648 const std::vector<DnsRecord> records = {
3649 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3650 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3651 };
nuccachena26cc2a2018-07-17 18:07:23 +08003652
Xiao Ma09b71022018-12-11 17:56:32 +09003653 test::DNSResponder dns(listen_addr);
3654 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003655 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003656 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003657
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003658 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003659 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003660 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003661
3662 // Query an IPv4-only hostname. Expect that gets a synthesized address.
3663 struct hostent* result = gethostbyname2("ipv4only", AF_INET6);
3664 ASSERT_TRUE(result != nullptr);
3665 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3666 std::string result_str = ToString(result);
3667 EXPECT_EQ(result_str, "64:ff9b::102:304");
3668}
nuccachena26cc2a2018-07-17 18:07:23 +08003669
3670TEST_F(ResolverTest, GetHostByName2_DnsQueryWithHavingNat64Prefix) {
3671 constexpr char dns64_name[] = "ipv4only.arpa.";
3672 constexpr char host_name[] = "v4v6.example.com.";
nuccachena26cc2a2018-07-17 18:07:23 +08003673 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003674 const std::vector<DnsRecord> records = {
3675 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3676 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3677 {host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
3678 };
3679
3680 test::DNSResponder dns(listen_addr);
3681 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003682 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003683 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003684
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003685 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003686 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003687 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003688
3689 // IPv4 DNS query. Prefix should have no effect on it.
3690 struct hostent* result = gethostbyname2("v4v6", AF_INET);
3691 ASSERT_TRUE(result != nullptr);
3692 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3693 std::string result_str = ToString(result);
3694 EXPECT_EQ(result_str, "1.2.3.4");
3695 dns.clearQueries();
3696
3697 // IPv6 DNS query. Prefix should have no effect on it.
3698 result = gethostbyname2("v4v6", AF_INET6);
3699 ASSERT_TRUE(result != nullptr);
3700 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3701 result_str = ToString(result);
3702 EXPECT_EQ(result_str, "2001:db8::102:304");
3703}
3704
3705TEST_F(ResolverTest, GetHostByName2_Dns64QuerySpecialUseIPv4Addresses) {
3706 constexpr char THIS_NETWORK[] = "this_network";
3707 constexpr char LOOPBACK[] = "loopback";
3708 constexpr char LINK_LOCAL[] = "link_local";
3709 constexpr char MULTICAST[] = "multicast";
3710 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
3711
3712 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
3713 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
3714 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
3715 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
3716 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
3717
3718 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003719 constexpr char dns64_name[] = "ipv4only.arpa.";
3720
Xiao Ma09b71022018-12-11 17:56:32 +09003721 test::DNSResponder dns(listen_addr);
3722 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003723 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003724 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003725
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003726 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003727 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003728 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003729
Luke Huangf8215372019-11-22 11:53:41 +08003730 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003731 static const struct TestConfig {
3732 std::string name;
3733 std::string addr;
3734
3735 std::string asHostName() const {
Luke Huangf8215372019-11-22 11:53:41 +08003736 return StringPrintf("%s.example.com.", name.c_str());
nuccachena26cc2a2018-07-17 18:07:23 +08003737 }
3738 } testConfigs[]{
3739 {THIS_NETWORK, ADDR_THIS_NETWORK},
3740 {LOOPBACK, ADDR_LOOPBACK},
3741 {LINK_LOCAL, ADDR_LINK_LOCAL},
3742 {MULTICAST, ADDR_MULTICAST},
3743 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
3744 };
Luke Huangf8215372019-11-22 11:53:41 +08003745 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003746
3747 for (const auto& config : testConfigs) {
3748 const std::string testHostName = config.asHostName();
3749 SCOPED_TRACE(testHostName);
3750
3751 const char* host_name = testHostName.c_str();
3752 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
3753
3754 struct hostent* result = gethostbyname2(config.name.c_str(), AF_INET6);
3755 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3756
3757 // In AF_INET6 case, don't synthesize special use IPv4 address.
3758 // Expect to have no answer
3759 EXPECT_EQ(nullptr, result);
3760
3761 dns.clearQueries();
3762 }
Bernie Innocenti2fef2b82018-12-20 15:56:40 +09003763}
Mike Yuf14e1a92019-05-10 13:54:58 +08003764
3765TEST_F(ResolverTest, PrefixDiscoveryBypassTls) {
3766 constexpr char listen_addr[] = "::1";
3767 constexpr char cleartext_port[] = "53";
3768 constexpr char tls_port[] = "853";
3769 constexpr char dns64_name[] = "ipv4only.arpa.";
3770 const std::vector<std::string> servers = {listen_addr};
3771
3772 test::DNSResponder dns(listen_addr);
3773 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
3774 test::DnsTlsFrontend tls(listen_addr, tls_port, listen_addr, cleartext_port);
3775 ASSERT_TRUE(tls.startServer());
3776
3777 // Setup OPPORTUNISTIC mode and wait for the validation complete.
waynema0e73c2e2019-07-31 15:04:08 +08003778 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08003779 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003780 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yuf14e1a92019-05-10 13:54:58 +08003781 tls.clearQueries();
3782
3783 // Start NAT64 prefix discovery and wait for it complete.
3784 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003785 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
Mike Yuf14e1a92019-05-10 13:54:58 +08003786
3787 // Verify it bypassed TLS even though there's a TLS server available.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003788 EXPECT_EQ(0, tls.queries()) << dns.dumpQueries();
3789 EXPECT_EQ(1U, GetNumQueries(dns, dns64_name)) << dns.dumpQueries();
Mike Yuf14e1a92019-05-10 13:54:58 +08003790
3791 // Restart the testing network to reset the cache.
3792 mDnsClient.TearDown();
3793 mDnsClient.SetUp();
3794 dns.clearQueries();
3795
3796 // Setup STRICT mode and wait for the validation complete.
waynema0e73c2e2019-07-31 15:04:08 +08003797 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
3798 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08003799 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003800 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yuf14e1a92019-05-10 13:54:58 +08003801 tls.clearQueries();
3802
3803 // Start NAT64 prefix discovery and wait for it to complete.
3804 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003805 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
Mike Yuf14e1a92019-05-10 13:54:58 +08003806
3807 // Verify it bypassed TLS despite STRICT mode.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003808 EXPECT_EQ(0, tls.queries()) << dns.dumpQueries();
3809 EXPECT_EQ(1U, GetNumQueries(dns, dns64_name)) << dns.dumpQueries();
Mike Yuf14e1a92019-05-10 13:54:58 +08003810}
Luke Huang9807e6b2019-05-20 16:17:12 +08003811
Lorenzo Colittie51091d2020-05-20 02:48:44 +09003812TEST_F(ResolverTest, SetAndClearNat64Prefix) {
3813 constexpr char host_name[] = "v4.example.com.";
3814 constexpr char listen_addr[] = "::1";
3815 const std::vector<DnsRecord> records = {
3816 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3817 };
3818 const std::string kNat64Prefix1 = "64:ff9b::/96";
3819 const std::string kNat64Prefix2 = "2001:db8:6464::/96";
3820
3821 test::DNSResponder dns(listen_addr);
3822 StartDns(dns, records);
3823 const std::vector<std::string> servers = {listen_addr};
3824 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
3825
3826 auto resolvService = mDnsClient.resolvService();
3827 addrinfo hints = {.ai_family = AF_INET6};
3828
3829 // No NAT64 prefix, no AAAA record.
3830 ScopedAddrinfo result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3831 ASSERT_TRUE(result == nullptr);
3832
3833 // Set the prefix, and expect to get a synthesized AAAA record.
3834 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix2).isOk());
3835 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3836 ASSERT_FALSE(result == nullptr);
3837 EXPECT_EQ("2001:db8:6464::102:304", ToString(result));
3838
3839 // Update the prefix, expect to see AAAA records from the new prefix.
3840 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3841 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3842 ASSERT_FALSE(result == nullptr);
3843 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3844
3845 // Non-/96 prefixes are ignored.
3846 auto status = resolvService->setPrefix64(TEST_NETID, "64:ff9b::/64");
3847 EXPECT_FALSE(status.isOk());
3848 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3849 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3850
3851 // Invalid prefixes are ignored.
3852 status = resolvService->setPrefix64(TEST_NETID, "192.0.2.0/24");
3853 EXPECT_FALSE(status.isOk());
3854 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3855 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3856
3857 status = resolvService->setPrefix64(TEST_NETID, "192.0.2.1");
3858 EXPECT_FALSE(status.isOk());
3859 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3860 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3861
3862 status = resolvService->setPrefix64(TEST_NETID, "hello");
3863 EXPECT_FALSE(status.isOk());
3864 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3865 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3866
3867 // DNS64 synthesis is still working.
3868 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3869 ASSERT_FALSE(result == nullptr);
3870 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3871
3872 // Clear the prefix. No AAAA records any more.
3873 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, "").isOk());
3874 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3875 EXPECT_TRUE(result == nullptr);
3876
3877 // Calling startPrefix64Discovery clears the prefix.
3878 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3879 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3880 ASSERT_FALSE(result == nullptr);
3881 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3882
3883 EXPECT_TRUE(resolvService->startPrefix64Discovery(TEST_NETID).isOk());
3884 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3885 ASSERT_TRUE(result == nullptr);
3886
3887 // setPrefix64 fails if prefix discovery is started, even if no prefix is yet discovered...
3888 status = resolvService->setPrefix64(TEST_NETID, kNat64Prefix1);
3889 EXPECT_FALSE(status.isOk());
3890 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3891 EXPECT_EQ(EEXIST, status.getServiceSpecificError());
3892
3893 // .. and clearing the prefix also has no effect.
3894 status = resolvService->setPrefix64(TEST_NETID, "");
3895 EXPECT_FALSE(status.isOk());
3896 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3897 EXPECT_EQ(ENOENT, status.getServiceSpecificError());
3898
3899 // setPrefix64 succeeds again when prefix discovery is stopped.
3900 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
3901 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3902 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3903 ASSERT_FALSE(result == nullptr);
3904 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3905
3906 // Calling stopPrefix64Discovery clears the prefix.
3907 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
3908 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3909 ASSERT_TRUE(result == nullptr);
3910
3911 // Set up NAT64 prefix discovery.
3912 constexpr char dns64_name[] = "ipv4only.arpa.";
3913 const std::vector<DnsRecord> newRecords = {
3914 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3915 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3916 };
3917 dns.stopServer();
3918 StartDns(dns, newRecords);
3919
3920 EXPECT_TRUE(resolvService->startPrefix64Discovery(TEST_NETID).isOk());
3921 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
3922 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3923 ASSERT_FALSE(result == nullptr);
3924 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3925
3926 // setPrefix64 fails if NAT64 prefix discovery has succeeded, and the discovered prefix
3927 // continues to be used.
3928 status = resolvService->setPrefix64(TEST_NETID, kNat64Prefix2);
3929 EXPECT_FALSE(status.isOk());
3930 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3931 EXPECT_EQ(EEXIST, status.getServiceSpecificError());
3932
3933 // Clearing the prefix also has no effect if discovery is started.
3934 status = resolvService->setPrefix64(TEST_NETID, "");
3935 EXPECT_FALSE(status.isOk());
3936 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3937 EXPECT_EQ(ENOENT, status.getServiceSpecificError());
3938
3939 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3940 ASSERT_FALSE(result == nullptr);
3941 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3942
3943 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
3944 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_NOT_FOUND));
Lorenzo Colitti61f796b2020-05-21 00:57:49 +09003945
3946 EXPECT_EQ(0, sDnsMetricsListener->getUnexpectedNat64PrefixUpdates());
Lorenzo Colittie51091d2020-05-20 02:48:44 +09003947}
3948
Luke Huang9807e6b2019-05-20 16:17:12 +08003949namespace {
3950
Luke Huang0d592bc2019-05-25 18:24:03 +08003951class ScopedSetNetworkForProcess {
3952 public:
3953 explicit ScopedSetNetworkForProcess(unsigned netId) {
3954 mStoredNetId = getNetworkForProcess();
3955 if (netId == mStoredNetId) return;
3956 EXPECT_EQ(0, setNetworkForProcess(netId));
3957 }
3958 ~ScopedSetNetworkForProcess() { EXPECT_EQ(0, setNetworkForProcess(mStoredNetId)); }
3959
3960 private:
3961 unsigned mStoredNetId;
3962};
3963
3964class ScopedSetNetworkForResolv {
3965 public:
3966 explicit ScopedSetNetworkForResolv(unsigned netId) { EXPECT_EQ(0, setNetworkForResolv(netId)); }
3967 ~ScopedSetNetworkForResolv() { EXPECT_EQ(0, setNetworkForResolv(NETID_UNSET)); }
3968};
3969
Luke Huang9807e6b2019-05-20 16:17:12 +08003970void sendCommand(int fd, const std::string& cmd) {
3971 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size() + 1));
3972 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size() + 1));
3973}
3974
3975int32_t readBE32(int fd) {
3976 int32_t tmp;
3977 int n = TEMP_FAILURE_RETRY(read(fd, &tmp, sizeof(tmp)));
3978 EXPECT_TRUE(n > 0);
3979 return ntohl(tmp);
3980}
3981
Luke Huang0d592bc2019-05-25 18:24:03 +08003982int readResponseCode(int fd) {
Luke Huang9807e6b2019-05-20 16:17:12 +08003983 char buf[4];
3984 int n = TEMP_FAILURE_RETRY(read(fd, &buf, sizeof(buf)));
3985 EXPECT_TRUE(n > 0);
3986 // The format of response code is that 4 bytes for the code & null.
3987 buf[3] = '\0';
3988 int result;
3989 EXPECT_TRUE(ParseInt(buf, &result));
3990 return result;
3991}
3992
Luke Huang0d592bc2019-05-25 18:24:03 +08003993bool checkAndClearUseLocalNameserversFlag(unsigned* netid) {
3994 if (netid == nullptr || ((*netid) & NETID_USE_LOCAL_NAMESERVERS) == 0) {
3995 return false;
3996 }
3997 *netid = (*netid) & ~NETID_USE_LOCAL_NAMESERVERS;
3998 return true;
3999}
4000
Luke Huangf8215372019-11-22 11:53:41 +08004001aidl::android::net::UidRangeParcel makeUidRangeParcel(int start, int stop) {
4002 aidl::android::net::UidRangeParcel res;
Luke Huang0d592bc2019-05-25 18:24:03 +08004003 res.start = start;
4004 res.stop = stop;
4005
4006 return res;
4007}
4008
4009void expectNetIdWithLocalNameserversFlag(unsigned netId) {
4010 unsigned dnsNetId = 0;
4011 EXPECT_EQ(0, getNetworkForDns(&dnsNetId));
4012 EXPECT_TRUE(checkAndClearUseLocalNameserversFlag(&dnsNetId));
4013 EXPECT_EQ(netId, static_cast<unsigned>(dnsNetId));
4014}
4015
4016void expectDnsNetIdEquals(unsigned netId) {
4017 unsigned dnsNetId = 0;
4018 EXPECT_EQ(0, getNetworkForDns(&dnsNetId));
4019 EXPECT_EQ(netId, static_cast<unsigned>(dnsNetId));
4020}
4021
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004022void expectDnsNetIdIsDefaultNetwork(INetd* netdService) {
Luke Huang0d592bc2019-05-25 18:24:03 +08004023 int currentNetid;
4024 EXPECT_TRUE(netdService->networkGetDefault(&currentNetid).isOk());
4025 expectDnsNetIdEquals(currentNetid);
4026}
4027
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004028void expectDnsNetIdWithVpn(INetd* netdService, unsigned vpnNetId, unsigned expectedNetId) {
Luke Huang0d592bc2019-05-25 18:24:03 +08004029 EXPECT_TRUE(netdService->networkCreateVpn(vpnNetId, false /* secure */).isOk());
4030 uid_t uid = getuid();
4031 // Add uid to VPN
4032 EXPECT_TRUE(netdService->networkAddUidRanges(vpnNetId, {makeUidRangeParcel(uid, uid)}).isOk());
4033 expectDnsNetIdEquals(expectedNetId);
4034 EXPECT_TRUE(netdService->networkDestroy(vpnNetId).isOk());
4035}
4036
Luke Huang9807e6b2019-05-20 16:17:12 +08004037} // namespace
4038
4039TEST_F(ResolverTest, getDnsNetId) {
4040 // We've called setNetworkForProcess in SetupOemNetwork, so reset to default first.
4041 setNetworkForProcess(NETID_UNSET);
Luke Huang0d592bc2019-05-25 18:24:03 +08004042
4043 expectDnsNetIdIsDefaultNetwork(mDnsClient.netdService());
4044 expectDnsNetIdWithVpn(mDnsClient.netdService(), TEST_VPN_NETID, TEST_VPN_NETID);
Luke Huang9807e6b2019-05-20 16:17:12 +08004045
4046 // Test with setNetworkForProcess
Luke Huang0d592bc2019-05-25 18:24:03 +08004047 {
4048 ScopedSetNetworkForProcess scopedSetNetworkForProcess(TEST_NETID);
4049 expectDnsNetIdEquals(TEST_NETID);
4050 }
4051
4052 // Test with setNetworkForProcess with NETID_USE_LOCAL_NAMESERVERS
4053 {
4054 ScopedSetNetworkForProcess scopedSetNetworkForProcess(TEST_NETID |
4055 NETID_USE_LOCAL_NAMESERVERS);
4056 expectNetIdWithLocalNameserversFlag(TEST_NETID);
4057 }
Luke Huang9807e6b2019-05-20 16:17:12 +08004058
4059 // Test with setNetworkForResolv
Luke Huang0d592bc2019-05-25 18:24:03 +08004060 {
4061 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID);
4062 expectDnsNetIdEquals(TEST_NETID);
4063 }
4064
4065 // Test with setNetworkForResolv with NETID_USE_LOCAL_NAMESERVERS
4066 {
4067 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID |
4068 NETID_USE_LOCAL_NAMESERVERS);
4069 expectNetIdWithLocalNameserversFlag(TEST_NETID);
4070 }
4071
4072 // Test with setNetworkForResolv under bypassable vpn
4073 {
4074 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID);
4075 expectDnsNetIdWithVpn(mDnsClient.netdService(), TEST_VPN_NETID, TEST_NETID);
4076 }
Luke Huang9807e6b2019-05-20 16:17:12 +08004077
4078 // Create socket connected to DnsProxyListener
4079 int fd = dns_open_proxy();
4080 EXPECT_TRUE(fd > 0);
4081 unique_fd ufd(fd);
4082
4083 // Test command with wrong netId
4084 sendCommand(fd, "getdnsnetid abc");
Luke Huang0d592bc2019-05-25 18:24:03 +08004085 EXPECT_EQ(ResponseCode::DnsProxyQueryResult, readResponseCode(fd));
Luke Huang9807e6b2019-05-20 16:17:12 +08004086 EXPECT_EQ(-EINVAL, readBE32(fd));
4087
4088 // Test unsupported command
4089 sendCommand(fd, "getdnsnetidNotSupported");
4090 // Keep in sync with FrameworkListener.cpp (500, "Command not recognized")
Luke Huang0d592bc2019-05-25 18:24:03 +08004091 EXPECT_EQ(500, readResponseCode(fd));
Luke Huang9807e6b2019-05-20 16:17:12 +08004092}
Sehee Park2c118782019-05-07 13:02:45 +09004093
4094TEST_F(ResolverTest, BlockDnsQueryWithUidRule) {
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004095 // This test relies on blocking traffic on loopback, which xt_qtaguid does not do.
4096 // See aosp/358413 and b/34444781 for why.
4097 SKIP_IF_BPF_NOT_SUPPORTED;
4098
Sehee Park2c118782019-05-07 13:02:45 +09004099 constexpr char listen_addr1[] = "127.0.0.4";
4100 constexpr char listen_addr2[] = "::1";
4101 constexpr char host_name[] = "howdy.example.com.";
4102 const std::vector<DnsRecord> records = {
4103 {host_name, ns_type::ns_t_a, "1.2.3.4"},
4104 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
4105 };
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004106 INetd* netdService = mDnsClient.netdService();
Sehee Park2c118782019-05-07 13:02:45 +09004107
4108 test::DNSResponder dns1(listen_addr1);
4109 test::DNSResponder dns2(listen_addr2);
4110 StartDns(dns1, records);
4111 StartDns(dns2, records);
4112
4113 std::vector<std::string> servers = {listen_addr1, listen_addr2};
4114 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
4115 dns1.clearQueries();
4116 dns2.clearQueries();
4117
Luke Huangeb618ef2020-05-26 14:17:02 +08004118 ScopeBlockedUIDRule scopeBlockUidRule(netdService, TEST_UID);
Sehee Park2c118782019-05-07 13:02:45 +09004119 // Dns Query
4120 int fd1 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_a, 0);
4121 int fd2 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_aaaa, 0);
4122 EXPECT_TRUE(fd1 != -1);
4123 EXPECT_TRUE(fd2 != -1);
4124
Luke Huang5729afc2020-07-30 23:12:17 +08004125 uint8_t buf1[MAXPACKET] = {};
4126 uint8_t buf2[MAXPACKET] = {};
Sehee Park2c118782019-05-07 13:02:45 +09004127 int rcode;
Luke Huang5729afc2020-07-30 23:12:17 +08004128 int res2 = getAsyncResponse(fd2, &rcode, buf2, MAXPACKET);
4129 int res1 = getAsyncResponse(fd1, &rcode, buf1, MAXPACKET);
4130 // If API level >= 30 (R+), these queries should be blocked.
4131 if (isAtLeastR) {
4132 EXPECT_EQ(res2, -ECONNREFUSED);
4133 EXPECT_EQ(res1, -ECONNREFUSED);
4134 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, EAI_SYSTEM, "howdy.example.com", {});
4135 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, EAI_SYSTEM, "howdy.example.com", {});
4136 } else {
4137 EXPECT_GT(res2, 0);
4138 EXPECT_EQ("::1.2.3.4", toString(buf2, res2, AF_INET6));
4139 EXPECT_GT(res1, 0);
4140 EXPECT_EQ("1.2.3.4", toString(buf1, res1, AF_INET));
4141 // To avoid flaky test, do not evaluate DnsEvent since event order is not guaranteed.
4142 }
Sehee Park2c118782019-05-07 13:02:45 +09004143}
Mike Yua772c202019-09-23 17:47:21 +08004144
Ken Chenbc481b82020-05-21 23:30:01 +08004145TEST_F(ResolverTest, EnforceDnsUid) {
4146 SKIP_IF_BPF_NOT_SUPPORTED;
4147
4148 constexpr char listen_addr1[] = "127.0.0.4";
4149 constexpr char listen_addr2[] = "::1";
4150 constexpr char host_name[] = "howdy.example.com.";
4151 const std::vector<DnsRecord> records = {
4152 {host_name, ns_type::ns_t_a, "1.2.3.4"},
4153 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
4154 };
4155 INetd* netdService = mDnsClient.netdService();
4156
4157 test::DNSResponder dns1(listen_addr1);
4158 test::DNSResponder dns2(listen_addr2);
4159 StartDns(dns1, records);
4160 StartDns(dns2, records);
4161
4162 // switch uid of DNS queries from applications to AID_DNS
4163 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4164 parcel.servers = {listen_addr1, listen_addr2};
4165 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk());
4166
4167 uint8_t buf[MAXPACKET] = {};
Luke Huang5729afc2020-07-30 23:12:17 +08004168 uint8_t buf2[MAXPACKET] = {};
Ken Chenbc481b82020-05-21 23:30:01 +08004169 int rcode;
4170 {
4171 ScopeBlockedUIDRule scopeBlockUidRule(netdService, TEST_UID);
4172 // Dns Queries should be blocked
Luke Huang5729afc2020-07-30 23:12:17 +08004173 const int fd1 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_a, 0);
4174 const int fd2 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_aaaa, 0);
Ken Chenbc481b82020-05-21 23:30:01 +08004175 EXPECT_TRUE(fd1 != -1);
4176 EXPECT_TRUE(fd2 != -1);
4177
Luke Huang5729afc2020-07-30 23:12:17 +08004178 const int res2 = getAsyncResponse(fd2, &rcode, buf2, MAXPACKET);
4179 const int res1 = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
4180 // If API level >= 30 (R+), the query should be blocked.
4181 if (isAtLeastR) {
4182 EXPECT_EQ(res2, -ECONNREFUSED);
4183 EXPECT_EQ(res1, -ECONNREFUSED);
4184 } else {
4185 EXPECT_GT(res2, 0);
4186 EXPECT_EQ("::1.2.3.4", toString(buf2, res2, AF_INET6));
4187 EXPECT_GT(res1, 0);
4188 EXPECT_EQ("1.2.3.4", toString(buf, res1, AF_INET));
4189 }
Ken Chenbc481b82020-05-21 23:30:01 +08004190 }
4191
Luke Huang5729afc2020-07-30 23:12:17 +08004192 memset(buf, 0, MAXPACKET);
Ken Chenbc481b82020-05-21 23:30:01 +08004193 parcel.resolverOptions.enforceDnsUid = true;
4194 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk());
4195 {
4196 ScopeBlockedUIDRule scopeBlockUidRule(netdService, TEST_UID);
4197 // Dns Queries should NOT be blocked
4198 int fd1 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_a, 0);
4199 int fd2 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_aaaa, 0);
4200 EXPECT_TRUE(fd1 != -1);
4201 EXPECT_TRUE(fd2 != -1);
4202
4203 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
4204 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
4205
4206 memset(buf, 0, MAXPACKET);
4207 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
4208 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
4209
4210 // @TODO: So far we know that uid of DNS queries are no more set to DNS requester. But we
4211 // don't check if they are actually being set to AID_DNS, because system uids are always
4212 // allowed in bpf_owner_match(). Audit by firewallSetUidRule(AID_DNS) + sending queries is
4213 // infeasible. Fix it if the behavior of bpf_owner_match() is changed in the future, or if
4214 // we have better idea to deal with this.
4215 }
4216}
4217
Mike Yua772c202019-09-23 17:47:21 +08004218TEST_F(ResolverTest, ConnectTlsServerTimeout) {
Mike Yu61d17262020-02-15 18:56:22 +08004219 const std::string kDotConnectTimeoutMsFlag(
4220 "persist.device_config.netd_native.dot_connect_timeout_ms");
Mike Yu40e67072019-10-09 21:14:09 +08004221 constexpr int expectedTimeout = 1000;
4222 constexpr char hostname1[] = "query1.example.com.";
4223 constexpr char hostname2[] = "query2.example.com.";
Mike Yua772c202019-09-23 17:47:21 +08004224 const std::vector<DnsRecord> records = {
Mike Yu40e67072019-10-09 21:14:09 +08004225 {hostname1, ns_type::ns_t_a, "1.2.3.4"},
4226 {hostname2, ns_type::ns_t_a, "1.2.3.5"},
Mike Yua772c202019-09-23 17:47:21 +08004227 };
4228
4229 test::DNSResponder dns;
4230 StartDns(dns, records);
Mike Yu40e67072019-10-09 21:14:09 +08004231 test::DnsTlsFrontend tls;
Mike Yua772c202019-09-23 17:47:21 +08004232 ASSERT_TRUE(tls.startServer());
4233
Mike Yu40e67072019-10-09 21:14:09 +08004234 // The resolver will adjust the timeout value to 1000ms since the value is too small.
4235 ScopedSystemProperties scopedSystemProperties(kDotConnectTimeoutMsFlag, "100");
Mike Yua772c202019-09-23 17:47:21 +08004236
Mike Yu40e67072019-10-09 21:14:09 +08004237 // Set up resolver to opportunistic mode with the default configuration.
Mike Yu8ac63402019-12-02 15:28:38 +08004238 const ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
Mike Yu40e67072019-10-09 21:14:09 +08004239 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
Mike Yua772c202019-09-23 17:47:21 +08004240 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09004241 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yua772c202019-09-23 17:47:21 +08004242 tls.clearQueries();
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09004243 dns.clearQueries();
Mike Yua772c202019-09-23 17:47:21 +08004244
4245 // The server becomes unresponsive to the handshake request.
4246 tls.setHangOnHandshakeForTesting(true);
4247
4248 // Expect the things happening in getaddrinfo():
4249 // 1. Connect to the private DNS server.
4250 // 2. SSL handshake times out.
4251 // 3. Fallback to UDP transport, and then get the answer.
Mike Yu40e67072019-10-09 21:14:09 +08004252 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4253 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(hostname1, nullptr, hints);
Mike Yua772c202019-09-23 17:47:21 +08004254
Mike Yu40e67072019-10-09 21:14:09 +08004255 EXPECT_NE(nullptr, result);
Mike Yua772c202019-09-23 17:47:21 +08004256 EXPECT_EQ(0, tls.queries());
Mike Yu40e67072019-10-09 21:14:09 +08004257 EXPECT_EQ(1U, GetNumQueries(dns, hostname1));
4258 EXPECT_EQ(records.at(0).addr, ToString(result));
Mike Yua772c202019-09-23 17:47:21 +08004259
Mike Yu40e67072019-10-09 21:14:09 +08004260 // A loose upper bound is set by adding 2000ms buffer time. Theoretically, getaddrinfo()
4261 // should just take a bit more than expetTimeout milliseconds.
4262 EXPECT_GE(timeTakenMs, expectedTimeout);
4263 EXPECT_LE(timeTakenMs, expectedTimeout + 2000);
4264
4265 // Set the server to be responsive. Verify that the resolver will attempt to reconnect
4266 // to the server and then get the result within the timeout.
4267 tls.setHangOnHandshakeForTesting(false);
4268 std::tie(result, timeTakenMs) = safe_getaddrinfo_time_taken(hostname2, nullptr, hints);
4269
4270 EXPECT_NE(nullptr, result);
Luke Huang0a0870d2020-02-12 20:41:10 +08004271 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yu40e67072019-10-09 21:14:09 +08004272 EXPECT_EQ(1U, GetNumQueries(dns, hostname2));
4273 EXPECT_EQ(records.at(1).addr, ToString(result));
4274
4275 EXPECT_LE(timeTakenMs, expectedTimeout);
Mike Yua772c202019-09-23 17:47:21 +08004276}
Hungming Chenbb90ab32019-10-28 18:20:31 +08004277
Ken Chen766feae2019-10-30 15:13:44 +08004278TEST_F(ResolverTest, FlushNetworkCache) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004279 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004280 test::DNSResponder dns;
4281 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4282 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4283
4284 const hostent* result = gethostbyname("hello");
4285 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4286
4287 // get result from cache
4288 result = gethostbyname("hello");
4289 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4290
4291 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4292
4293 result = gethostbyname("hello");
4294 EXPECT_EQ(2U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4295}
4296
4297TEST_F(ResolverTest, FlushNetworkCache_random) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004298 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004299 constexpr int num_flush = 10;
4300 constexpr int num_queries = 20;
4301 test::DNSResponder dns;
4302 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4303 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4304 const addrinfo hints = {.ai_family = AF_INET};
4305
4306 std::thread t([this]() {
4307 for (int i = 0; i < num_flush; ++i) {
4308 unsigned delay = arc4random_uniform(10 * 1000); // 10ms
4309 usleep(delay);
4310 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4311 }
4312 });
4313
4314 for (int i = 0; i < num_queries; ++i) {
4315 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4316 EXPECT_TRUE(result != nullptr);
4317 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4318 }
4319 t.join();
4320}
4321
4322// flush cache while one query is wait-for-response, another is pending.
4323TEST_F(ResolverTest, FlushNetworkCache_concurrent) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004324 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004325 const char* listen_addr1 = "127.0.0.9";
4326 const char* listen_addr2 = "127.0.0.10";
4327 test::DNSResponder dns1(listen_addr1);
4328 test::DNSResponder dns2(listen_addr2);
4329 StartDns(dns1, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4330 StartDns(dns2, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4331 addrinfo hints = {.ai_family = AF_INET};
4332
4333 // step 1: set server#1 into deferred responding mode
4334 dns1.setDeferredResp(true);
4335 std::thread t1([&listen_addr1, &hints, this]() {
4336 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr1}));
4337 // step 3: query
4338 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4339 // step 9: check result
4340 EXPECT_TRUE(result != nullptr);
4341 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4342 });
4343
4344 // step 2: wait for the query to reach the server
4345 while (GetNumQueries(dns1, kHelloExampleCom) == 0) {
4346 usleep(1000); // 1ms
4347 }
4348
4349 std::thread t2([&listen_addr2, &hints, &dns2, this]() {
4350 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr2}));
4351 // step 5: query (should be blocked in resolver)
4352 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4353 // step 7: check result
4354 EXPECT_TRUE(result != nullptr);
4355 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4356 EXPECT_EQ(1U, GetNumQueriesForType(dns2, ns_type::ns_t_a, kHelloExampleCom));
4357 });
4358
4359 // step 4: wait a bit for the 2nd query to enter pending state
4360 usleep(100 * 1000); // 100ms
4361 // step 6: flush cache (will unblock pending queries)
4362 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4363 t2.join();
4364
4365 // step 8: resume server#1
4366 dns1.setDeferredResp(false);
4367 t1.join();
4368
4369 // step 10: verify if result is correctly cached
4370 dns2.clearQueries();
4371 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4372 EXPECT_EQ(0U, GetNumQueries(dns2, kHelloExampleCom));
4373 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4374}
4375
waynema29253052019-08-20 11:26:08 +08004376// TODO: Perhaps to have a boundary conditions test for TCP and UDP.
4377TEST_F(ResolverTest, TcpQueryWithOversizePayload) {
4378 test::DNSResponder dns;
4379 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4380 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4381
4382 int fd = dns_open_proxy();
4383 ASSERT_TRUE(fd > 0);
4384
4385 // Sending DNS query over TCP once the packet sizes exceed 512 bytes.
4386 // The raw data is combined with Question section and Additional section
4387 // Question section : query "hello.example.com", type A, class IN
4388 // Additional section : type OPT (41), Option PADDING, Option Length 546
4389 // Padding option which allows DNS clients and servers to artificially
4390 // increase the size of a DNS message by a variable number of bytes.
4391 // See also RFC7830, section 3
4392 const std::string query =
4393 "+c0BAAABAAAAAAABBWhlbGxvB2V4YW1wbGUDY29tAAABAAEAACkgAAAAgAACJgAMAiIAAAAAAAAAAAAAAAAAA"
4394 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4395 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4396 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4397 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4398 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4399 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4400 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4401 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4402 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
4403 const std::string cmd =
4404 "resnsend " + std::to_string(TEST_NETID) + " 0 " /* ResNsendFlags */ + query + '\0';
4405 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
4406 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
4407 expectAnswersValid(fd, AF_INET, kHelloExampleComAddrV4);
4408 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom));
4409 EXPECT_EQ(0U, GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom));
4410}
4411
Ken Chen99344882020-01-01 14:59:38 +08004412TEST_F(ResolverTest, TruncatedRspMode) {
4413 constexpr char listen_addr[] = "127.0.0.4";
4414 constexpr char listen_addr2[] = "127.0.0.5";
4415 constexpr char listen_srv[] = "53";
4416
4417 test::DNSResponder dns(listen_addr, listen_srv, static_cast<ns_rcode>(-1));
4418 test::DNSResponder dns2(listen_addr2, listen_srv, static_cast<ns_rcode>(-1));
4419 // dns supports UDP only, dns2 support UDP and TCP
4420 dns.setResponseProbability(0.0, IPPROTO_TCP);
4421 StartDns(dns, kLargeCnameChainRecords);
4422 StartDns(dns2, kLargeCnameChainRecords);
4423
4424 const struct TestConfig {
4425 const std::optional<int32_t> tcMode;
4426 const bool ret;
4427 const unsigned numQueries;
4428 std::string asParameters() const {
4429 return StringPrintf("tcMode: %d, ret: %s, numQueries: %u", tcMode.value_or(-1),
4430 ret ? "true" : "false", numQueries);
4431 }
4432 } testConfigs[]{
4433 // clang-format off
4434 {std::nullopt, true, 0}, /* mode unset */
4435 {aidl::android::net::IDnsResolver::TC_MODE_DEFAULT, true, 0}, /* default mode */
4436 {aidl::android::net::IDnsResolver::TC_MODE_UDP_TCP, true, 1}, /* alternative mode */
4437 {-666, false, 1}, /* invalid input */
4438 // clang-format on
4439 };
4440
4441 for (const auto& config : testConfigs) {
4442 SCOPED_TRACE(config.asParameters());
4443
4444 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4445 parcel.servers = {listen_addr, listen_addr2};
4446 if (config.tcMode) {
Ken Chena6ac2a62020-04-07 17:25:56 +08004447 parcel.resolverOptions.tcMode = config.tcMode.value();
Ken Chen99344882020-01-01 14:59:38 +08004448 }
4449 ASSERT_EQ(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk(), config.ret);
4450
4451 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4452 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4453 ASSERT_TRUE(result != nullptr);
4454 EXPECT_EQ(ToString(result), kHelloExampleComAddrV4);
4455 // TC_MODE_DEFAULT: resolver retries on TCP-only on each name server.
4456 // TC_MODE_UDP_TCP: resolver retries on TCP on the same server, falls back to UDP from next.
4457 ASSERT_EQ(GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom), 1U);
4458 ASSERT_EQ(GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom), 1U);
4459 ASSERT_EQ(GetNumQueriesForProtocol(dns2, IPPROTO_UDP, kHelloExampleCom), config.numQueries);
4460 ASSERT_EQ(GetNumQueriesForProtocol(dns2, IPPROTO_TCP, kHelloExampleCom), 1U);
4461
4462 dns.clearQueries();
4463 dns2.clearQueries();
4464 ASSERT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
Mike Yu61d17262020-02-15 18:56:22 +08004465
4466 // Clear the stats to make the resolver always choose the same server for the first query.
4467 parcel.servers.clear();
4468 parcel.tlsServers.clear();
4469 ASSERT_EQ(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk(), config.ret);
Ken Chen99344882020-01-01 14:59:38 +08004470 }
4471}
4472
Mike Yu153b5b82020-03-04 19:53:54 +08004473TEST_F(ResolverTest, RepeatedSetup_ResolverStatusRemains) {
4474 constexpr char unusable_listen_addr[] = "127.0.0.3";
4475 constexpr char listen_addr[] = "127.0.0.4";
4476 constexpr char hostname[] = "a.hello.query.";
4477 const auto repeatedSetResolversFromParcel = [&](const ResolverParamsParcel& parcel) {
4478 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4479 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4480 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4481 };
4482
4483 test::DNSResponder dns(listen_addr);
4484 StartDns(dns, {{hostname, ns_type::ns_t_a, "1.2.3.3"}});
4485 test::DnsTlsFrontend tls1(listen_addr, "853", listen_addr, "53");
4486 ASSERT_TRUE(tls1.startServer());
4487
4488 // Private DNS off mode.
4489 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4490 parcel.servers = {unusable_listen_addr, listen_addr};
4491 parcel.tlsServers.clear();
4492 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4493
4494 // Send a query.
4495 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4496 EXPECT_NE(safe_getaddrinfo(hostname, nullptr, &hints), nullptr);
4497
4498 // Check the stats as expected.
4499 const std::vector<NameserverStats> expectedCleartextDnsStats = {
4500 NameserverStats(unusable_listen_addr).setInternalErrors(1),
4501 NameserverStats(listen_addr).setSuccesses(1),
4502 };
Mike Yu61d17262020-02-15 18:56:22 +08004503 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu153b5b82020-03-04 19:53:54 +08004504 EXPECT_EQ(GetNumQueries(dns, hostname), 1U);
4505
4506 // The stats is supposed to remain as long as the list of cleartext DNS servers is unchanged.
4507 static const struct TestConfig {
4508 std::vector<std::string> servers;
4509 std::vector<std::string> tlsServers;
4510 std::string tlsName;
4511 } testConfigs[] = {
4512 // Private DNS opportunistic mode.
4513 {{listen_addr, unusable_listen_addr}, {listen_addr, unusable_listen_addr}, ""},
4514 {{unusable_listen_addr, listen_addr}, {unusable_listen_addr, listen_addr}, ""},
4515
4516 // Private DNS strict mode.
4517 {{listen_addr, unusable_listen_addr}, {"127.0.0.100"}, kDefaultPrivateDnsHostName},
4518 {{unusable_listen_addr, listen_addr}, {"127.0.0.100"}, kDefaultPrivateDnsHostName},
4519
4520 // Private DNS off mode.
4521 {{unusable_listen_addr, listen_addr}, {}, ""},
4522 {{listen_addr, unusable_listen_addr}, {}, ""},
4523 };
4524
4525 for (const auto& config : testConfigs) {
4526 SCOPED_TRACE(fmt::format("testConfig: [{}] [{}] [{}]", fmt::join(config.servers, ","),
4527 fmt::join(config.tlsServers, ","), config.tlsName));
4528 parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4529 parcel.servers = config.servers;
4530 parcel.tlsServers = config.tlsServers;
4531 parcel.tlsName = config.tlsName;
4532 repeatedSetResolversFromParcel(parcel);
Mike Yu61d17262020-02-15 18:56:22 +08004533 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu153b5b82020-03-04 19:53:54 +08004534
4535 // The stats remains when the list of search domains changes.
4536 parcel.domains.push_back("tmp.domains");
4537 repeatedSetResolversFromParcel(parcel);
Mike Yu61d17262020-02-15 18:56:22 +08004538 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu153b5b82020-03-04 19:53:54 +08004539
4540 // The stats remains when the parameters change (except maxSamples).
4541 parcel.sampleValiditySeconds++;
4542 parcel.successThreshold++;
4543 parcel.minSamples++;
4544 parcel.baseTimeoutMsec++;
4545 parcel.retryCount++;
4546 repeatedSetResolversFromParcel(parcel);
Mike Yu61d17262020-02-15 18:56:22 +08004547 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu153b5b82020-03-04 19:53:54 +08004548 }
4549
4550 // The cache remains.
4551 EXPECT_NE(safe_getaddrinfo(hostname, nullptr, &hints), nullptr);
4552 EXPECT_EQ(GetNumQueries(dns, hostname), 1U);
4553}
4554
4555TEST_F(ResolverTest, RepeatedSetup_NoRedundantPrivateDnsValidation) {
4556 const std::string addr1 = getUniqueIPv4Address(); // For a workable DNS server.
4557 const std::string addr2 = getUniqueIPv4Address(); // For an unresponsive DNS server.
4558 const std::string unusable_addr = getUniqueIPv4Address();
Mike Yubc4b9502020-03-20 13:14:00 +08004559 const auto waitForPrivateDnsStateUpdated = []() {
4560 // A buffer time for the PrivateDnsConfiguration instance to update its map,
4561 // mPrivateDnsValidateThreads, which is used for tracking validation threads.
4562 // Since there is a time gap between when PrivateDnsConfiguration reports
4563 // onPrivateDnsValidationEvent and when PrivateDnsConfiguration updates the map, this is a
4564 // workaround to avoid the test starts a subsequent resolver setup during the time gap.
4565 // TODO: Report onPrivateDnsValidationEvent after all the relevant updates are complete.
4566 // Reference to b/152009023.
4567 std::this_thread::sleep_for(20ms);
4568 };
Mike Yu153b5b82020-03-04 19:53:54 +08004569
4570 test::DNSResponder dns1(addr1);
4571 test::DNSResponder dns2(addr2);
4572 StartDns(dns1, {});
4573 StartDns(dns2, {});
4574 test::DnsTlsFrontend workableTls(addr1, "853", addr1, "53");
4575 test::DnsTlsFrontend unresponsiveTls(addr2, "853", addr2, "53");
4576 unresponsiveTls.setHangOnHandshakeForTesting(true);
4577 ASSERT_TRUE(workableTls.startServer());
4578 ASSERT_TRUE(unresponsiveTls.startServer());
4579
4580 // First setup.
4581 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4582 parcel.servers = {addr1, addr2, unusable_addr};
4583 parcel.tlsServers = {addr1, addr2, unusable_addr};
4584 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4585
4586 // Check the validation results.
4587 EXPECT_TRUE(WaitForPrivateDnsValidation(workableTls.listen_address(), true));
4588 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4589 EXPECT_EQ(unresponsiveTls.acceptConnectionsCount(), 1); // The validation is still in progress.
4590
4591 static const struct TestConfig {
4592 std::vector<std::string> tlsServers;
4593 std::string tlsName;
4594 } testConfigs[] = {
4595 {{addr1, addr2, unusable_addr}, ""},
4596 {{unusable_addr, addr1, addr2}, ""},
4597 {{unusable_addr, addr1, addr2}, kDefaultPrivateDnsHostName},
4598 {{addr1, addr2, unusable_addr}, kDefaultPrivateDnsHostName},
4599 };
4600
4601 std::string TlsNameLastTime;
4602 for (const auto& config : testConfigs) {
4603 SCOPED_TRACE(fmt::format("testConfig: [{}] [{}]", fmt::join(config.tlsServers, ","),
4604 config.tlsName));
4605 parcel.servers = config.tlsServers;
4606 parcel.tlsServers = config.tlsServers;
4607 parcel.tlsName = config.tlsName;
4608 parcel.caCertificate = config.tlsName.empty() ? "" : kCaCert;
4609
4610 const bool dnsModeChanged = (TlsNameLastTime != config.tlsName);
Mike Yubc4b9502020-03-20 13:14:00 +08004611
4612 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004613 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4614
4615 for (const auto& serverAddr : parcel.tlsServers) {
4616 SCOPED_TRACE(serverAddr);
4617 if (serverAddr == workableTls.listen_address()) {
4618 if (dnsModeChanged) {
4619 // In despite of the identical IP address, the server is regarded as a different
4620 // server when DnsTlsServer.name is different. The resolver treats it as a
4621 // different object and begins the validation process.
4622 EXPECT_TRUE(WaitForPrivateDnsValidation(serverAddr, true));
4623 }
4624 } else if (serverAddr == unresponsiveTls.listen_address()) {
4625 // No revalidation needed for the server which have been marked as in_progesss.
4626 } else {
4627 // Must be unusable_addr.
4628 // In opportunistic mode, when a validation for a private DNS server fails, the
4629 // resolver just marks the server as failed and doesn't re-evaluate it, but the
4630 // server can be re-evaluated when setResolverConfiguration() is called.
4631 // However, in strict mode, the resolver automatically re-evaluates the server and
4632 // marks the server as in_progress until the validation succeeds, so repeated setup
4633 // makes no effect.
4634 if (dnsModeChanged || config.tlsName.empty() /* not in strict mode */) {
4635 EXPECT_TRUE(WaitForPrivateDnsValidation(serverAddr, false));
4636 }
4637 }
4638 }
4639
4640 // Repeated setups make no effect in strict mode.
Mike Yubc4b9502020-03-20 13:14:00 +08004641 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004642 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4643 if (config.tlsName.empty()) {
4644 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4645 }
Mike Yubc4b9502020-03-20 13:14:00 +08004646 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004647 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4648 if (config.tlsName.empty()) {
4649 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4650 }
4651
4652 EXPECT_EQ(unresponsiveTls.acceptConnectionsCount(), 1);
4653
4654 TlsNameLastTime = config.tlsName;
4655 }
4656
4657 // Check that all the validation results are caught.
4658 // Note: it doesn't mean no validation being in progress.
4659 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr1));
4660 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr2));
4661 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(unusable_addr));
4662}
4663
4664TEST_F(ResolverTest, RepeatedSetup_KeepChangingPrivateDnsServers) {
4665 enum TlsServerState { WORKING, UNSUPPORTED, UNRESPONSIVE };
4666 const std::string addr1 = getUniqueIPv4Address();
4667 const std::string addr2 = getUniqueIPv4Address();
Mike Yu9a185882020-03-25 16:02:36 +08004668 const auto waitForPrivateDnsStateUpdated = []() {
4669 // A buffer time for PrivateDnsConfiguration to update its state. It prevents this test
4670 // being flaky. See b/152009023 for the reason.
4671 std::this_thread::sleep_for(20ms);
4672 };
Mike Yu153b5b82020-03-04 19:53:54 +08004673
4674 test::DNSResponder dns1(addr1);
4675 test::DNSResponder dns2(addr2);
4676 StartDns(dns1, {});
4677 StartDns(dns2, {});
4678 test::DnsTlsFrontend tls1(addr1, "853", addr1, "53");
4679 test::DnsTlsFrontend tls2(addr2, "853", addr2, "53");
4680 ASSERT_TRUE(tls1.startServer());
4681 ASSERT_TRUE(tls2.startServer());
4682
4683 static const struct TestConfig {
4684 std::string tlsServer;
4685 std::string tlsName;
4686 bool expectNothingHappenWhenServerUnsupported;
4687 bool expectNothingHappenWhenServerUnresponsive;
4688 std::string asTestName() const {
4689 return fmt::format("{}, {}, {}, {}", tlsServer, tlsName,
4690 expectNothingHappenWhenServerUnsupported,
4691 expectNothingHappenWhenServerUnresponsive);
4692 }
4693 } testConfigs[] = {
4694 {{addr1}, "", false, false},
4695 {{addr2}, "", false, false},
4696 {{addr1}, "", false, true},
4697 {{addr2}, "", false, true},
4698 {{addr1}, kDefaultPrivateDnsHostName, false, true},
4699 {{addr2}, kDefaultPrivateDnsHostName, false, true},
4700 {{addr1}, kDefaultPrivateDnsHostName, true, true},
4701 {{addr2}, kDefaultPrivateDnsHostName, true, true},
4702
4703 // There's no new validation to start because there are already two validation threads
4704 // running (one is for addr1, the other is for addr2). This is because the comparator
4705 // doesn't compare DnsTlsServer.name. Keep the design as-is until it's known to be
4706 // harmful.
4707 {{addr1}, "", true, true},
4708 {{addr2}, "", true, true},
4709 {{addr1}, "", true, true},
4710 {{addr2}, "", true, true},
4711 };
4712
4713 for (const auto& serverState : {WORKING, UNSUPPORTED, UNRESPONSIVE}) {
4714 int testIndex = 0;
4715 for (const auto& config : testConfigs) {
4716 SCOPED_TRACE(fmt::format("serverState:{} testIndex:{} testConfig:[{}]", serverState,
4717 testIndex++, config.asTestName()));
4718 auto& tls = (config.tlsServer == addr1) ? tls1 : tls2;
4719
4720 if (serverState == UNSUPPORTED && tls.running()) ASSERT_TRUE(tls.stopServer());
4721 if (serverState != UNSUPPORTED && !tls.running()) ASSERT_TRUE(tls.startServer());
4722
4723 tls.setHangOnHandshakeForTesting(serverState == UNRESPONSIVE);
4724 const int connectCountsBefore = tls.acceptConnectionsCount();
4725
Mike Yu9a185882020-03-25 16:02:36 +08004726 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004727 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4728 parcel.servers = {config.tlsServer};
4729 parcel.tlsServers = {config.tlsServer};
4730 parcel.tlsName = config.tlsName;
4731 parcel.caCertificate = config.tlsName.empty() ? "" : kCaCert;
4732 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4733
4734 if (serverState == WORKING) {
4735 EXPECT_TRUE(WaitForPrivateDnsValidation(config.tlsServer, true));
4736 } else if (serverState == UNSUPPORTED) {
4737 if (config.expectNothingHappenWhenServerUnsupported) {
4738 // It's possible that the resolver hasn't yet started to
4739 // connect. Wait a while.
4740 // TODO: See if we can get rid of the hard waiting time, such as comparing
4741 // the CountDiff across two tests.
4742 std::this_thread::sleep_for(100ms);
4743 EXPECT_EQ(tls.acceptConnectionsCount(), connectCountsBefore);
4744 } else {
4745 EXPECT_TRUE(WaitForPrivateDnsValidation(config.tlsServer, false));
4746 }
4747 } else {
4748 // Must be UNRESPONSIVE.
4749 // DnsTlsFrontend is the only signal for checking whether or not the resolver starts
4750 // another validation when the server is unresponsive.
4751 const int expectCountDiff =
4752 config.expectNothingHappenWhenServerUnresponsive ? 0 : 1;
4753 if (expectCountDiff == 0) {
4754 // It's possible that the resolver hasn't yet started to
4755 // connect. Wait a while.
4756 std::this_thread::sleep_for(100ms);
4757 }
4758 const auto condition = [&]() {
4759 return tls.acceptConnectionsCount() == connectCountsBefore + expectCountDiff;
4760 };
4761 EXPECT_TRUE(PollForCondition(condition));
4762 }
4763 }
4764
4765 // Set to off mode to reset the PrivateDnsConfiguration state.
4766 ResolverParamsParcel setupOffmode = DnsResponderClient::GetDefaultResolverParamsParcel();
4767 setupOffmode.tlsServers.clear();
4768 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(setupOffmode));
4769 }
4770
4771 // Check that all the validation results are caught.
4772 // Note: it doesn't mean no validation being in progress.
4773 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr1));
4774 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr2));
4775}
4776
Ken Chen26dc2b02020-06-16 18:49:39 +08004777TEST_F(ResolverTest, PermissionCheckOnCertificateInjection) {
4778 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4779 parcel.caCertificate = kCaCert;
4780 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk());
4781
4782 for (const uid_t uid : {AID_SYSTEM, TEST_UID}) {
4783 ScopedChangeUID scopedChangeUID(uid);
4784 auto status = mDnsClient.resolvService()->setResolverConfiguration(parcel);
4785 EXPECT_EQ(status.getExceptionCode(), EX_SECURITY);
4786 }
4787}
4788
Hungming Chenbb90ab32019-10-28 18:20:31 +08004789// Parameterized tests.
4790// TODO: Merge the existing tests as parameterized test if possible.
4791// TODO: Perhaps move parameterized tests to an independent file.
4792enum class CallType { GETADDRINFO, GETHOSTBYNAME };
4793class ResolverParameterizedTest : public ResolverTest,
Hungming Chen63779052019-10-30 15:06:13 +08004794 public testing::WithParamInterface<CallType> {
4795 protected:
Hungming Chen22617fd2019-12-06 12:15:45 +08004796 void VerifyQueryHelloExampleComV4(const test::DNSResponder& dns, const CallType calltype,
4797 const bool verifyNumQueries = true) {
Hungming Chen63779052019-10-30 15:06:13 +08004798 if (calltype == CallType::GETADDRINFO) {
4799 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4800 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4801 ASSERT_TRUE(result != nullptr);
4802 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4803 } else if (calltype == CallType::GETHOSTBYNAME) {
4804 const hostent* result = gethostbyname("hello");
4805 ASSERT_TRUE(result != nullptr);
4806 ASSERT_EQ(4, result->h_length);
4807 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
4808 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4809 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
4810 } else {
4811 FAIL() << "Unsupported call type: " << static_cast<uint32_t>(calltype);
4812 }
Hungming Chen22617fd2019-12-06 12:15:45 +08004813 if (verifyNumQueries) EXPECT_EQ(1U, GetNumQueries(dns, kHelloExampleCom));
Hungming Chen63779052019-10-30 15:06:13 +08004814 }
4815};
Hungming Chenbb90ab32019-10-28 18:20:31 +08004816
Hungming Chen63779052019-10-30 15:06:13 +08004817INSTANTIATE_TEST_SUITE_P(QueryCallTest, ResolverParameterizedTest,
Hungming Chenbb90ab32019-10-28 18:20:31 +08004818 testing::Values(CallType::GETADDRINFO, CallType::GETHOSTBYNAME),
4819 [](const testing::TestParamInfo<CallType>& info) {
Hungming Chenbb90ab32019-10-28 18:20:31 +08004820 switch (info.param) {
4821 case CallType::GETADDRINFO:
Hungming Chen63779052019-10-30 15:06:13 +08004822 return "GetAddrInfo";
Hungming Chenbb90ab32019-10-28 18:20:31 +08004823 case CallType::GETHOSTBYNAME:
Hungming Chen63779052019-10-30 15:06:13 +08004824 return "GetHostByName";
Hungming Chenbb90ab32019-10-28 18:20:31 +08004825 default:
Hungming Chen63779052019-10-30 15:06:13 +08004826 return "InvalidParameter"; // Should not happen.
Hungming Chenbb90ab32019-10-28 18:20:31 +08004827 }
Hungming Chenbb90ab32019-10-28 18:20:31 +08004828 });
4829
4830TEST_P(ResolverParameterizedTest, AuthoritySectionAndAdditionalSection) {
4831 // DNS response may have more information in authority section and additional section.
4832 // Currently, getanswer() of packages/modules/DnsResolver/getaddrinfo.cpp doesn't parse the
4833 // content of authority section and additional section. Test these sections if they crash
4834 // the resolver, just in case. See also RFC 1035 section 4.1.
4835 const auto& calltype = GetParam();
4836 test::DNSHeader header(kDefaultDnsHeader);
4837
4838 // Create a DNS response which has a authoritative nameserver record in authority
4839 // section and its relevant address record in additional section.
4840 //
4841 // Question
4842 // hello.example.com. IN A
4843 // Answer
4844 // hello.example.com. IN A 1.2.3.4
4845 // Authority:
4846 // hello.example.com. IN NS ns1.example.com.
4847 // Additional:
4848 // ns1.example.com. IN A 5.6.7.8
4849 //
4850 // A response may have only question, answer, and authority section. Current testing response
4851 // should be able to cover this condition.
4852
4853 // Question section.
4854 test::DNSQuestion question{
4855 .qname = {.name = kHelloExampleCom},
4856 .qtype = ns_type::ns_t_a,
4857 .qclass = ns_c_in,
4858 };
4859 header.questions.push_back(std::move(question));
4860
4861 // Answer section.
4862 test::DNSRecord recordAnswer{
4863 .name = {.name = kHelloExampleCom},
4864 .rtype = ns_type::ns_t_a,
4865 .rclass = ns_c_in,
4866 .ttl = 0, // no cache
4867 };
Hungming Chen63779052019-10-30 15:06:13 +08004868 EXPECT_TRUE(test::DNSResponder::fillRdata(kHelloExampleComAddrV4, recordAnswer));
Hungming Chenbb90ab32019-10-28 18:20:31 +08004869 header.answers.push_back(std::move(recordAnswer));
4870
4871 // Authority section.
4872 test::DNSRecord recordAuthority{
4873 .name = {.name = kHelloExampleCom},
4874 .rtype = ns_type::ns_t_ns,
4875 .rclass = ns_c_in,
4876 .ttl = 0, // no cache
4877 };
4878 EXPECT_TRUE(test::DNSResponder::fillRdata("ns1.example.com.", recordAuthority));
4879 header.authorities.push_back(std::move(recordAuthority));
4880
4881 // Additional section.
4882 test::DNSRecord recordAdditional{
4883 .name = {.name = "ns1.example.com."},
4884 .rtype = ns_type::ns_t_a,
4885 .rclass = ns_c_in,
4886 .ttl = 0, // no cache
4887 };
4888 EXPECT_TRUE(test::DNSResponder::fillRdata("5.6.7.8", recordAdditional));
4889 header.additionals.push_back(std::move(recordAdditional));
4890
4891 // Start DNS server.
4892 test::DNSResponder dns(test::DNSResponder::MappingType::DNS_HEADER);
4893 dns.addMappingDnsHeader(kHelloExampleCom, ns_type::ns_t_a, header);
4894 ASSERT_TRUE(dns.startServer());
4895 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4896 dns.clearQueries();
4897
4898 // Expect that get the address and the resolver doesn't crash.
Hungming Chen63779052019-10-30 15:06:13 +08004899 VerifyQueryHelloExampleComV4(dns, calltype);
4900}
4901
4902TEST_P(ResolverParameterizedTest, MessageCompression) {
4903 const auto& calltype = GetParam();
4904
4905 // The response with compressed domain name by a pointer. See RFC 1035 section 4.1.4.
4906 //
4907 // Ignoring the other fields of the message, the domain name of question section and answer
4908 // section are presented as:
4909 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4910 // 12 | 5 | h |
4911 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4912 // 14 | e | l |
4913 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4914 // 16 | l | o |
4915 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4916 // 18 | 7 | e |
4917 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4918 // 20 | x | a |
4919 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4920 // 22 | m | p |
4921 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4922 // 24 | l | e |
4923 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4924 // 26 | 3 | c |
4925 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4926 // 28 | o | m |
4927 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4928 // 30 | 0 | ... |
4929 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4930 //
4931 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4932 // 35 | 1 1| 12 |
4933 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4934 const std::vector<uint8_t> kResponseAPointer = {
4935 /* Header */
4936 0x00, 0x00, /* Transaction ID: 0x0000 */
4937 0x81, 0x80, /* Flags: qr rd ra */
4938 0x00, 0x01, /* Questions: 1 */
4939 0x00, 0x01, /* Answer RRs: 1 */
4940 0x00, 0x00, /* Authority RRs: 0 */
4941 0x00, 0x00, /* Additional RRs: 0 */
4942 /* Queries */
4943 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
4944 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name: hello.example.com */
4945 0x00, 0x01, /* Type: A */
4946 0x00, 0x01, /* Class: IN */
4947 /* Answers */
4948 0xc0, 0x0c, /* Name: hello.example.com (a pointer) */
4949 0x00, 0x01, /* Type: A */
4950 0x00, 0x01, /* Class: IN */
4951 0x00, 0x00, 0x00, 0x00, /* Time to live: 0 */
4952 0x00, 0x04, /* Data length: 4 */
4953 0x01, 0x02, 0x03, 0x04 /* Address: 1.2.3.4 */
4954 };
4955
4956 // The response with compressed domain name by a sequence of labels ending with a pointer. See
4957 // RFC 1035 section 4.1.4.
4958 //
4959 // Ignoring the other fields of the message, the domain name of question section and answer
4960 // section are presented as:
4961 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4962 // 12 | 5 | h |
4963 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4964 // 14 | e | l |
4965 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4966 // 16 | l | o |
4967 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4968 // 18 | 7 | e |
4969 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4970 // 20 | x | a |
4971 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4972 // 22 | m | p |
4973 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4974 // 24 | l | e |
4975 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4976 // 26 | 3 | c |
4977 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4978 // 28 | o | m |
4979 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4980 // 30 | 0 | ... |
4981 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4982 //
4983 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4984 // 35 | 5 | h |
4985 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4986 // 37 | e | l |
4987 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4988 // 39 | l | o |
4989 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4990 // 41 | 1 1| 18 |
4991 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4992 const std::vector<uint8_t> kResponseLabelEndingWithAPointer = {
4993 /* Header */
4994 0x00, 0x00, /* Transaction ID: 0x0000 */
4995 0x81, 0x80, /* Flags: qr rd ra */
4996 0x00, 0x01, /* Questions: 1 */
4997 0x00, 0x01, /* Answer RRs: 1 */
4998 0x00, 0x00, /* Authority RRs: 0 */
4999 0x00, 0x00, /* Additional RRs: 0 */
5000 /* Queries */
5001 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
5002 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name: hello.example.com */
5003 0x00, 0x01, /* Type: A */
5004 0x00, 0x01, /* Class: IN */
5005 /* Answers */
5006 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0xc0,
5007 0x12, /* Name: hello.example.com (a label ending with a pointer) */
5008 0x00, 0x01, /* Type: A */
5009 0x00, 0x01, /* Class: IN */
5010 0x00, 0x00, 0x00, 0x00, /* Time to live: 0 */
5011 0x00, 0x04, /* Data length: 4 */
5012 0x01, 0x02, 0x03, 0x04 /* Address: 1.2.3.4 */
5013 };
5014
5015 for (const auto& response : {kResponseAPointer, kResponseLabelEndingWithAPointer}) {
5016 SCOPED_TRACE(StringPrintf("Hex dump: %s", toHex(makeSlice(response)).c_str()));
5017
5018 test::DNSResponder dns(test::DNSResponder::MappingType::BINARY_PACKET);
5019 dns.addMappingBinaryPacket(kHelloExampleComQueryV4, response);
5020 StartDns(dns, {});
5021 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
5022
5023 // Expect no cache because the TTL of testing responses are 0.
5024 VerifyQueryHelloExampleComV4(dns, calltype);
Hungming Chenbb90ab32019-10-28 18:20:31 +08005025 }
Mike Yu40e67072019-10-09 21:14:09 +08005026}
Hungming Chen22617fd2019-12-06 12:15:45 +08005027
5028TEST_P(ResolverParameterizedTest, TruncatedResponse) {
5029 const auto& calltype = GetParam();
5030
Hungming Chen22617fd2019-12-06 12:15:45 +08005031 test::DNSResponder dns;
Ken Chen99344882020-01-01 14:59:38 +08005032 StartDns(dns, kLargeCnameChainRecords);
Hungming Chen22617fd2019-12-06 12:15:45 +08005033 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
5034
5035 // Expect UDP response is truncated. The resolver retries over TCP. See RFC 1035 section 4.2.1.
5036 VerifyQueryHelloExampleComV4(dns, calltype, false);
5037 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom));
5038 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom));
5039}
Luke Huang420ee622019-11-27 17:52:44 +08005040
5041TEST_F(ResolverTest, KeepListeningUDP) {
5042 constexpr char listen_addr1[] = "127.0.0.4";
5043 constexpr char listen_addr2[] = "127.0.0.5";
5044 constexpr char host_name[] = "howdy.example.com.";
5045 const std::vector<DnsRecord> records = {
5046 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
5047 };
5048 const std::vector<int> params = {300, 25, 8, 8, 1000 /* BASE_TIMEOUT_MSEC */,
5049 1 /* retry count */};
5050 const int delayTimeMs = 1500;
5051
5052 test::DNSResponder neverRespondDns(listen_addr2, "53", static_cast<ns_rcode>(-1));
5053 neverRespondDns.setResponseProbability(0.0);
5054 StartDns(neverRespondDns, records);
Luke Huangf40df9c2020-04-21 08:51:48 +08005055 ScopedSystemProperties scopedSystemProperties(
5056 "persist.device_config.netd_native.keep_listening_udp", "1");
5057 // Re-setup test network to make experiment flag take effect.
5058 resetNetwork();
Luke Huang420ee622019-11-27 17:52:44 +08005059
5060 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr1, listen_addr2},
5061 kDefaultSearchDomains, params));
5062 // There are 2 DNS servers for this test.
5063 // |delayedDns| will be blocked for |delayTimeMs|, then start to respond to requests.
5064 // |neverRespondDns| will never respond.
5065 // In the first try, resolver will send query to |delayedDns| but get timeout error
5066 // because |delayTimeMs| > DNS timeout.
5067 // Then it's the second try, resolver will send query to |neverRespondDns| and
5068 // listen on both servers. Resolver will receive the answer coming from |delayedDns|.
Luke Huang420ee622019-11-27 17:52:44 +08005069
Luke Huang420ee622019-11-27 17:52:44 +08005070 test::DNSResponder delayedDns(listen_addr1);
5071 delayedDns.setResponseDelayMs(delayTimeMs);
5072 StartDns(delayedDns, records);
5073
5074 // Specify hints to ensure resolver doing query only 1 round.
5075 const addrinfo hints = {.ai_family = AF_INET6, .ai_socktype = SOCK_DGRAM};
5076 ScopedAddrinfo result = safe_getaddrinfo(host_name, nullptr, &hints);
5077 EXPECT_TRUE(result != nullptr);
5078
5079 std::string result_str = ToString(result);
5080 EXPECT_TRUE(result_str == "::1.2.3.4") << ", result_str='" << result_str << "'";
5081}
Luke Huang0a0870d2020-02-12 20:41:10 +08005082
5083TEST_F(ResolverTest, GetAddrInfoParallelLookupTimeout) {
5084 constexpr char listen_addr[] = "127.0.0.4";
5085 constexpr char host_name[] = "howdy.example.com.";
5086 constexpr int TIMING_TOLERANCE_MS = 200;
5087 constexpr int DNS_TIMEOUT_MS = 1000;
5088 const std::vector<DnsRecord> records = {
5089 {host_name, ns_type::ns_t_a, "1.2.3.4"},
5090 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
5091 };
5092 const std::vector<int> params = {300, 25, 8, 8, DNS_TIMEOUT_MS /* BASE_TIMEOUT_MSEC */,
5093 1 /* retry count */};
5094 test::DNSResponder neverRespondDns(listen_addr, "53", static_cast<ns_rcode>(-1));
5095 neverRespondDns.setResponseProbability(0.0);
5096 StartDns(neverRespondDns, records);
Luke Huangf40df9c2020-04-21 08:51:48 +08005097 ScopedSystemProperties scopedSystemProperties(
5098 "persist.device_config.netd_native.parallel_lookup", "1");
Luke Huangd1d734f2020-04-30 12:25:40 +08005099 // The default value of parallel_lookup_sleep_time should be very small
5100 // that we can ignore in this test case.
Luke Huangf40df9c2020-04-21 08:51:48 +08005101 // Re-setup test network to make experiment flag take effect.
5102 resetNetwork();
Luke Huang0a0870d2020-02-12 20:41:10 +08005103
5104 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}, kDefaultSearchDomains, params));
5105 neverRespondDns.clearQueries();
5106
Luke Huang0a0870d2020-02-12 20:41:10 +08005107 // Use a never respond DNS server to verify if the A/AAAA queries are sent in parallel.
5108 // The resolver parameters are set to timeout 1s and retry 1 times.
5109 // So we expect the safe_getaddrinfo_time_taken() might take ~1s to
5110 // return when parallel lookup is enabled. And the DNS server should receive 2 queries.
5111 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_DGRAM};
5112 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(host_name, nullptr, hints);
5113
5114 EXPECT_TRUE(result == nullptr);
5115 EXPECT_NEAR(DNS_TIMEOUT_MS, timeTakenMs, TIMING_TOLERANCE_MS)
5116 << "took time should approximate equal timeout";
5117 EXPECT_EQ(2U, GetNumQueries(neverRespondDns, host_name));
Mike Yu532405f2020-06-17 17:46:44 +08005118 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, RCODE_TIMEOUT, host_name, {});
Luke Huang0a0870d2020-02-12 20:41:10 +08005119}
Luke Huangd1d734f2020-04-30 12:25:40 +08005120
5121TEST_F(ResolverTest, GetAddrInfoParallelLookupSleepTime) {
5122 constexpr char listen_addr[] = "127.0.0.4";
5123 constexpr int TIMING_TOLERANCE_MS = 200;
5124 const std::vector<DnsRecord> records = {
5125 {kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4},
5126 {kHelloExampleCom, ns_type::ns_t_aaaa, kHelloExampleComAddrV6},
5127 };
5128 const std::vector<int> params = {300, 25, 8, 8, 1000 /* BASE_TIMEOUT_MSEC */,
5129 1 /* retry count */};
5130 test::DNSResponder dns(listen_addr);
5131 StartDns(dns, records);
5132 ScopedSystemProperties scopedSystemProperties1(
5133 "persist.device_config.netd_native.parallel_lookup", "1");
5134 constexpr int PARALLEL_LOOKUP_SLEEP_TIME_MS = 500;
5135 ScopedSystemProperties scopedSystemProperties2(
5136 "persist.device_config.netd_native.parallel_lookup_sleep_time",
5137 std::to_string(PARALLEL_LOOKUP_SLEEP_TIME_MS));
5138 // Re-setup test network to make experiment flag take effect.
5139 resetNetwork();
5140
5141 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}, kDefaultSearchDomains, params));
5142 dns.clearQueries();
5143
5144 // Expect the safe_getaddrinfo_time_taken() might take ~500ms to return because we set
5145 // parallel_lookup_sleep_time to 500ms.
5146 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_DGRAM};
5147 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(kHelloExampleCom, nullptr, hints);
5148
5149 EXPECT_NE(nullptr, result);
5150 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(
5151 {kHelloExampleComAddrV4, kHelloExampleComAddrV6}));
5152 EXPECT_NEAR(PARALLEL_LOOKUP_SLEEP_TIME_MS, timeTakenMs, TIMING_TOLERANCE_MS)
5153 << "took time should approximate equal timeout";
5154 EXPECT_EQ(2U, GetNumQueries(dns, kHelloExampleCom));
5155
5156 // Expect the PARALLEL_LOOKUP_SLEEP_TIME_MS won't affect the query under cache hit case.
5157 dns.clearQueries();
5158 std::tie(result, timeTakenMs) = safe_getaddrinfo_time_taken(kHelloExampleCom, nullptr, hints);
5159 EXPECT_NE(nullptr, result);
5160 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(
5161 {kHelloExampleComAddrV4, kHelloExampleComAddrV6}));
5162 EXPECT_GT(PARALLEL_LOOKUP_SLEEP_TIME_MS, timeTakenMs);
5163 EXPECT_EQ(0U, GetNumQueries(dns, kHelloExampleCom));
5164}
Luke Huangeb618ef2020-05-26 14:17:02 +08005165
5166TEST_F(ResolverTest, BlockDnsQueryUidDoesNotLeadToBadServer) {
5167 // This test relies on blocking traffic on loopback, which xt_qtaguid does not do.
5168 // See aosp/358413 and b/34444781 for why.
5169 SKIP_IF_BPF_NOT_SUPPORTED;
5170
5171 constexpr char listen_addr1[] = "127.0.0.4";
5172 constexpr char listen_addr2[] = "::1";
5173 test::DNSResponder dns1(listen_addr1);
5174 test::DNSResponder dns2(listen_addr2);
5175 StartDns(dns1, {});
5176 StartDns(dns2, {});
5177
5178 std::vector<std::string> servers = {listen_addr1, listen_addr2};
5179 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
5180 dns1.clearQueries();
5181 dns2.clearQueries();
5182 {
5183 ScopeBlockedUIDRule scopeBlockUidRule(mDnsClient.netdService(), TEST_UID);
5184 // Start querying ten times.
5185 for (int i = 0; i < 10; i++) {
5186 std::string hostName = fmt::format("blocked{}.com", i);
5187 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
Luke Huang5729afc2020-07-30 23:12:17 +08005188 // The query result between R+ and Q would be different, but we don't really care
5189 // about the result here because this test is only used to ensure blocked uid rule
5190 // won't cause bad servers.
5191 safe_getaddrinfo(hostName.c_str(), nullptr, &hints);
Luke Huangeb618ef2020-05-26 14:17:02 +08005192 }
5193 }
Luke Huang5729afc2020-07-30 23:12:17 +08005194 ResolverParamsParcel setupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
5195 // If api level >= 30 (R+), expect all query packets to be blocked, hence we should not see any
5196 // of their stats show up. Otherwise, all queries should succeed.
5197 const std::vector<NameserverStats> expectedDnsStats = {
5198 NameserverStats(listen_addr1).setSuccesses(isAtLeastR ? 0 : setupParams.maxSamples),
Luke Huangeb618ef2020-05-26 14:17:02 +08005199 NameserverStats(listen_addr2),
5200 };
Luke Huang5729afc2020-07-30 23:12:17 +08005201 expectStatsEqualTo(expectedDnsStats);
5202 // If api level >= 30 (R+), expect server won't receive any queries,
5203 // otherwise expect 20 == 10 * (setupParams.domains.size() + 1) queries.
5204 EXPECT_EQ(dns1.queries().size(), isAtLeastR ? 0U : 10 * (setupParams.domains.size() + 1));
Luke Huangeb618ef2020-05-26 14:17:02 +08005205 EXPECT_EQ(dns2.queries().size(), 0U);
5206}
Mike Yu6ce587d2019-12-19 21:30:22 +08005207
5208// ResolverMultinetworkTest is used to verify multinetwork functionality. Here's how it works:
5209// The resolver sends queries to address A, and then there will be a TunForwarder helping forward
5210// the packets to address B, which is the address on which the testing server is listening. The
5211// answer packets responded from the testing server go through the reverse path back to the
5212// resolver.
5213//
5214// To achieve the that, it needs to set up a interface with routing rules. Tests are not
5215// supposed to initiate DNS servers on their own; instead, some utilities are added to the class to
5216// help the setup.
5217//
5218// An example of how to use it:
5219// TEST_F() {
5220// ScopedNetwork network = CreateScopedNetwork(V4);
5221// network.init();
5222//
5223// auto dns = network.addIpv4Dns();
5224// StartDns(dns.dnsServer, {});
5225//
5226// setResolverConfiguration(...);
5227// network.startTunForwarder();
5228//
5229// // Send queries here
5230// }
5231
5232class ResolverMultinetworkTest : public ResolverTest {
5233 protected:
5234 enum class ConnectivityType { V4, V6, V4V6 };
5235
5236 struct DnsServerPair {
5237 test::DNSResponder& dnsServer;
5238 std::string dnsAddr; // The DNS server address used for setResolverConfiguration().
5239 // TODO: Add test::DnsTlsFrontend* and std::string for DoT.
5240 };
5241
5242 class ScopedNetwork {
5243 public:
5244 ScopedNetwork(unsigned netId, ConnectivityType type, INetd* netdSrv,
5245 IDnsResolver* dnsResolvSrv)
5246 : mNetId(netId),
5247 mConnectivityType(type),
5248 mNetdSrv(netdSrv),
5249 mDnsResolvSrv(dnsResolvSrv) {
5250 mIfname = StringPrintf("testtun%d", netId);
5251 }
5252 ~ScopedNetwork() { destroy(); }
5253
5254 Result<void> init();
5255 void destroy();
5256 Result<DnsServerPair> addIpv4Dns() { return addDns(ConnectivityType::V4); }
5257 Result<DnsServerPair> addIpv6Dns() { return addDns(ConnectivityType::V6); }
5258 bool startTunForwarder() { return mTunForwarder->startForwarding(); }
5259 unsigned netId() const { return mNetId; }
5260
5261 private:
5262 Result<DnsServerPair> addDns(ConnectivityType connectivity);
5263 std::string makeIpv4AddrString(unsigned n) const {
5264 return StringPrintf("192.168.%u.%u", mNetId, n);
5265 }
5266 std::string makeIpv6AddrString(unsigned n) const {
5267 return StringPrintf("2001:db8:%u::%u", mNetId, n);
5268 }
5269
5270 const unsigned mNetId;
5271 const ConnectivityType mConnectivityType;
5272 INetd* mNetdSrv;
5273 IDnsResolver* mDnsResolvSrv;
5274
5275 std::string mIfname;
5276 std::unique_ptr<TunForwarder> mTunForwarder;
5277 std::vector<std::unique_ptr<test::DNSResponder>> mDnsServers;
5278 // TODO: Add std::vector<std::unique_ptr<test::DnsTlsFrontend>>
5279 };
5280
5281 void SetUp() override {
5282 ResolverTest::SetUp();
5283 ASSERT_NE(mDnsClient.netdService(), nullptr);
5284 ASSERT_NE(mDnsClient.resolvService(), nullptr);
5285 }
5286
5287 void TearDown() override { ResolverTest::TearDown(); }
5288
5289 ScopedNetwork CreateScopedNetwork(ConnectivityType type);
5290 void StartDns(test::DNSResponder& dns, const std::vector<DnsRecord>& records);
5291
5292 unsigned getFreeNetId() { return mNextNetId++; }
5293
5294 private:
5295 // Use a different netId because this class inherits from the class ResolverTest which
5296 // always creates TEST_NETID in setup. It's incremented when CreateScopedNetwork() is called.
markchien96b09e22020-07-29 14:24:34 +08005297 // Note: Don't create more than 20 networks in the class since 51 is used for the mock network.
Mike Yu6ce587d2019-12-19 21:30:22 +08005298 unsigned mNextNetId = 31;
5299};
5300
5301ResolverMultinetworkTest::ScopedNetwork ResolverMultinetworkTest::CreateScopedNetwork(
5302 ConnectivityType type) {
5303 return {getFreeNetId(), type, mDnsClient.netdService(), mDnsClient.resolvService()};
5304}
5305
5306Result<void> ResolverMultinetworkTest::ScopedNetwork::init() {
5307 unique_fd ufd = TunForwarder::createTun(mIfname);
5308 if (!ufd.ok()) {
5309 return Errorf("createTun for {} failed", mIfname);
5310 }
5311 mTunForwarder = std::make_unique<TunForwarder>(std::move(ufd));
5312
5313 if (auto r = mNetdSrv->networkCreatePhysical(mNetId, INetd::PERMISSION_SYSTEM); !r.isOk()) {
5314 return Error() << r.getMessage();
5315 }
5316 if (auto r = mDnsResolvSrv->createNetworkCache(mNetId); !r.isOk()) {
5317 return Error() << r.getMessage();
5318 }
5319 if (auto r = mNetdSrv->networkAddInterface(mNetId, mIfname); !r.isOk()) {
5320 return Error() << r.getMessage();
5321 }
5322
5323 if (mConnectivityType == ConnectivityType::V4 || mConnectivityType == ConnectivityType::V4V6) {
5324 const std::string v4Addr = makeIpv4AddrString(1);
5325 if (auto r = mNetdSrv->interfaceAddAddress(mIfname, v4Addr, 32); !r.isOk()) {
5326 return Error() << r.getMessage();
5327 }
5328 if (auto r = mNetdSrv->networkAddRoute(mNetId, mIfname, "0.0.0.0/0", ""); !r.isOk()) {
5329 return Error() << r.getMessage();
5330 }
5331 }
5332 if (mConnectivityType == ConnectivityType::V6 || mConnectivityType == ConnectivityType::V4V6) {
5333 const std::string v6Addr = makeIpv6AddrString(1);
5334 if (auto r = mNetdSrv->interfaceAddAddress(mIfname, v6Addr, 128); !r.isOk()) {
5335 return Error() << r.getMessage();
5336 }
5337 if (auto r = mNetdSrv->networkAddRoute(mNetId, mIfname, "::/0", ""); !r.isOk()) {
5338 return Error() << r.getMessage();
5339 }
5340 }
5341
5342 return {};
5343}
5344
5345void ResolverMultinetworkTest::ScopedNetwork::destroy() {
5346 mNetdSrv->networkDestroy(mNetId);
5347 mDnsResolvSrv->destroyNetworkCache(mNetId);
5348}
5349
5350void ResolverMultinetworkTest::StartDns(test::DNSResponder& dns,
5351 const std::vector<DnsRecord>& records) {
5352 ResolverTest::StartDns(dns, records);
5353
5354 // Bind the DNSResponder's sockets to the network if specified.
5355 if (std::optional<unsigned> netId = dns.getNetwork(); netId.has_value()) {
5356 setNetworkForSocket(netId.value(), dns.getUdpSocket());
5357 setNetworkForSocket(netId.value(), dns.getTcpSocket());
5358 }
5359}
5360
5361Result<ResolverMultinetworkTest::DnsServerPair> ResolverMultinetworkTest::ScopedNetwork::addDns(
5362 ConnectivityType type) {
5363 const int index = mDnsServers.size();
5364 const int prefixLen = (type == ConnectivityType::V4) ? 32 : 128;
5365
5366 const std::function<std::string(unsigned)> makeIpString =
5367 std::bind((type == ConnectivityType::V4) ? &ScopedNetwork::makeIpv4AddrString
5368 : &ScopedNetwork::makeIpv6AddrString,
5369 this, std::placeholders::_1);
5370
5371 std::string src1 = makeIpString(1); // The address from which the resolver will send.
5372 std::string dst1 = makeIpString(index + 100); // The address to which the resolver will send.
5373 std::string src2 = dst1; // The address translated from src1.
5374 std::string dst2 = makeIpString(index + 200); // The address translated from dst2.
5375
5376 if (!mTunForwarder->addForwardingRule({src1, dst1}, {src2, dst2}) ||
5377 !mTunForwarder->addForwardingRule({dst2, src2}, {dst1, src1})) {
5378 return Errorf("Failed to add the rules ({}, {}, {}, {})", src1, dst1, src2, dst2);
5379 }
5380
5381 if (!mNetdSrv->interfaceAddAddress(mIfname, dst2, prefixLen).isOk()) {
5382 return Errorf("interfaceAddAddress({}, {}, {}) failed", mIfname, dst2, prefixLen);
5383 }
5384
5385 // Create a DNSResponder instance.
5386 auto& dnsPtr = mDnsServers.emplace_back(std::make_unique<test::DNSResponder>(dst2));
5387 dnsPtr->setNetwork(mNetId);
5388 return DnsServerPair{
5389 .dnsServer = *dnsPtr,
5390 .dnsAddr = dst1,
5391 };
5392}
5393
5394TEST_F(ResolverMultinetworkTest, GetAddrInfo_AI_ADDRCONFIG) {
5395 constexpr char host_name[] = "ohayou.example.com.";
5396
5397 const std::array<ConnectivityType, 3> allTypes = {
5398 ConnectivityType::V4,
5399 ConnectivityType::V6,
5400 ConnectivityType::V4V6,
5401 };
5402 for (const auto& type : allTypes) {
5403 SCOPED_TRACE(StringPrintf("ConnectivityType: %d", type));
5404
5405 // Create a network.
5406 ScopedNetwork network = CreateScopedNetwork(type);
5407 ASSERT_RESULT_OK(network.init());
5408
5409 // Add a testing DNS server.
5410 const Result<DnsServerPair> dnsPair =
5411 (type == ConnectivityType::V4) ? network.addIpv4Dns() : network.addIpv6Dns();
5412 ASSERT_RESULT_OK(dnsPair);
5413 StartDns(dnsPair->dnsServer, {{host_name, ns_type::ns_t_a, "1.1.1.31"},
5414 {host_name, ns_type::ns_t_aaaa, "2001:db8:cafe:d00d::31"}});
5415
5416 // Set up resolver and start forwarding.
5417 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
5418 parcel.tlsServers.clear();
5419 parcel.netId = network.netId();
5420 parcel.servers = {dnsPair->dnsAddr};
5421 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
5422 ASSERT_TRUE(network.startTunForwarder());
5423
5424 const addrinfo hints = {
5425 .ai_flags = AI_ADDRCONFIG,
5426 .ai_family = AF_UNSPEC,
5427 .ai_socktype = SOCK_DGRAM,
5428 };
5429 addrinfo* raw_ai_result = nullptr;
5430 EXPECT_EQ(0, android_getaddrinfofornet(host_name, nullptr, &hints, network.netId(),
5431 MARK_UNSET, &raw_ai_result));
5432 ScopedAddrinfo ai_result(raw_ai_result);
5433 std::vector<std::string> result_strs = ToStrings(ai_result);
5434 std::vector<std::string> expectedResult;
5435 size_t expectedQueries = 0;
5436
5437 if (type == ConnectivityType::V6 || type == ConnectivityType::V4V6) {
5438 expectedResult.emplace_back("2001:db8:cafe:d00d::31");
5439 expectedQueries++;
5440 }
5441 if (type == ConnectivityType::V4 || type == ConnectivityType::V4V6) {
5442 expectedResult.emplace_back("1.1.1.31");
5443 expectedQueries++;
5444 }
5445 EXPECT_THAT(result_strs, testing::UnorderedElementsAreArray(expectedResult));
5446 EXPECT_EQ(GetNumQueries(dnsPair->dnsServer, host_name), expectedQueries);
5447 }
5448}
5449
5450TEST_F(ResolverMultinetworkTest, NetworkDestroyedDuringQueryInFlight) {
5451 constexpr char host_name[] = "ohayou.example.com.";
5452
5453 // Create a network and add an ipv4 DNS server.
5454 auto network =
5455 std::make_unique<ScopedNetwork>(getFreeNetId(), ConnectivityType::V4V6,
5456 mDnsClient.netdService(), mDnsClient.resolvService());
5457 ASSERT_RESULT_OK(network->init());
5458 const Result<DnsServerPair> dnsPair = network->addIpv4Dns();
5459 ASSERT_RESULT_OK(dnsPair);
5460
5461 // Set the DNS server unresponsive.
5462 dnsPair->dnsServer.setResponseProbability(0.0);
5463 dnsPair->dnsServer.setErrorRcode(static_cast<ns_rcode>(-1));
5464 StartDns(dnsPair->dnsServer, {});
5465
5466 // Set up resolver and start forwarding.
5467 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
5468 parcel.tlsServers.clear();
5469 parcel.netId = network->netId();
5470 parcel.servers = {dnsPair->dnsAddr};
5471 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
5472 ASSERT_TRUE(network->startTunForwarder());
5473
5474 // Expect the things happening in order:
5475 // 1. The thread sends the query to the dns server which is unresponsive.
5476 // 2. The network is destroyed while the thread is waiting for the response from the dns server.
5477 // 3. After the dns server timeout, the thread retries but fails to connect.
5478 std::thread lookup([&]() {
5479 int fd = resNetworkQuery(network->netId(), host_name, ns_c_in, ns_t_a, 0);
5480 EXPECT_TRUE(fd != -1);
5481 expectAnswersNotValid(fd, -ETIMEDOUT);
5482 });
5483
5484 // Tear down the network as soon as the dns server receives the query.
5485 const auto condition = [&]() { return GetNumQueries(dnsPair->dnsServer, host_name) == 1U; };
5486 EXPECT_TRUE(PollForCondition(condition));
5487 network.reset();
5488
5489 lookup.join();
5490}
5491
5492TEST_F(ResolverMultinetworkTest, OneCachePerNetwork) {
5493 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
5494 constexpr char host_name[] = "ohayou.example.com.";
5495
5496 ScopedNetwork network1 = CreateScopedNetwork(ConnectivityType::V4V6);
5497 ScopedNetwork network2 = CreateScopedNetwork(ConnectivityType::V4V6);
5498 ASSERT_RESULT_OK(network1.init());
5499 ASSERT_RESULT_OK(network2.init());
5500
5501 const Result<DnsServerPair> dnsPair1 = network1.addIpv4Dns();
5502 const Result<DnsServerPair> dnsPair2 = network2.addIpv4Dns();
5503 ASSERT_RESULT_OK(dnsPair1);
5504 ASSERT_RESULT_OK(dnsPair2);
5505 StartDns(dnsPair1->dnsServer, {{host_name, ns_type::ns_t_a, "1.1.1.31"}});
5506 StartDns(dnsPair2->dnsServer, {{host_name, ns_type::ns_t_a, "1.1.1.32"}});
5507
5508 // Set up resolver for network 1 and start forwarding.
5509 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
5510 parcel.tlsServers.clear();
5511 parcel.netId = network1.netId();
5512 parcel.servers = {dnsPair1->dnsAddr};
5513 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
5514 ASSERT_TRUE(network1.startTunForwarder());
5515
5516 // Set up resolver for network 2 and start forwarding.
5517 parcel.netId = network2.netId();
5518 parcel.servers = {dnsPair2->dnsAddr};
5519 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
5520 ASSERT_TRUE(network2.startTunForwarder());
5521
5522 // Send the same queries to both networks.
5523 int fd1 = resNetworkQuery(network1.netId(), host_name, ns_c_in, ns_t_a, 0);
5524 int fd2 = resNetworkQuery(network2.netId(), host_name, ns_c_in, ns_t_a, 0);
5525
5526 expectAnswersValid(fd1, AF_INET, "1.1.1.31");
5527 expectAnswersValid(fd2, AF_INET, "1.1.1.32");
5528 EXPECT_EQ(GetNumQueries(dnsPair1->dnsServer, host_name), 1U);
5529 EXPECT_EQ(GetNumQueries(dnsPair2->dnsServer, host_name), 1U);
5530
5531 // Flush the cache of network 1, and send the queries again.
5532 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(network1.netId()).isOk());
5533 fd1 = resNetworkQuery(network1.netId(), host_name, ns_c_in, ns_t_a, 0);
5534 fd2 = resNetworkQuery(network2.netId(), host_name, ns_c_in, ns_t_a, 0);
5535
5536 expectAnswersValid(fd1, AF_INET, "1.1.1.31");
5537 expectAnswersValid(fd2, AF_INET, "1.1.1.32");
5538 EXPECT_EQ(GetNumQueries(dnsPair1->dnsServer, host_name), 2U);
5539 EXPECT_EQ(GetNumQueries(dnsPair2->dnsServer, host_name), 1U);
5540}