blob: 2bb30af989eb2767771b191eba02118aa0cc3703 [file] [log] [blame]
Ken Chenb9fa2062018-11-13 21:51:13 +08001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
Lorenzo Colitti0a8b4aa2019-06-26 22:31:03 +090010 * Unless required by applicable law or agreed to in writing, software
Ken Chenb9fa2062018-11-13 21:51:13 +080011 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *
16 */
17
Bernie Innocenti3952ccc2019-03-03 19:39:53 +090018#define LOG_TAG "resolv_integration_test"
Ken Chenb9fa2062018-11-13 21:51:13 +080019
Hungming Chen5bf09772019-04-25 11:16:13 +080020#include <android-base/logging.h>
Bernie Innocenti41b82c42019-06-05 22:38:25 +090021#include <android-base/parseint.h>
Mike Yu40e67072019-10-09 21:14:09 +080022#include <android-base/properties.h>
Mike Yu6ce587d2019-12-19 21:30:22 +080023#include <android-base/result.h>
Bernie Innocenti41b82c42019-06-05 22:38:25 +090024#include <android-base/stringprintf.h>
25#include <android-base/unique_fd.h>
26#include <android/multinetwork.h> // ResNsendFlags
Ken Chenb9fa2062018-11-13 21:51:13 +080027#include <arpa/inet.h>
Luke Huang94b10b92018-11-21 20:13:38 +080028#include <arpa/nameser.h>
Hungming Chene8f970c2019-04-10 17:34:06 +080029#include <binder/ProcessState.h>
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +090030#include <bpf/BpfUtils.h>
Bernie Innocenti41b82c42019-06-05 22:38:25 +090031#include <cutils/sockets.h>
32#include <gmock/gmock-matchers.h>
33#include <gtest/gtest.h>
Ken Chenb9fa2062018-11-13 21:51:13 +080034#include <netdb.h>
Luke Huang9d2d25b2019-06-14 00:34:05 +080035#include <netdutils/InternetAddresses.h>
Luke Huang579ddc72019-06-14 00:59:39 +080036#include <netdutils/NetworkConstants.h> // SHA256_SIZE
Luke Huang9d2d25b2019-06-14 00:34:05 +080037#include <netdutils/ResponseCode.h>
Hungming Chen63779052019-10-30 15:06:13 +080038#include <netdutils/Slice.h>
Luke Huang9d2d25b2019-06-14 00:34:05 +080039#include <netdutils/SocketOption.h>
Mike Yu40e67072019-10-09 21:14:09 +080040#include <netdutils/Stopwatch.h>
Luke Huang94b10b92018-11-21 20:13:38 +080041#include <netinet/in.h>
42#include <poll.h> /* poll */
Bernie Innocenti41b82c42019-06-05 22:38:25 +090043#include <private/android_filesystem_config.h>
Luke Huang94b10b92018-11-21 20:13:38 +080044#include <resolv.h>
Ken Chenb9fa2062018-11-13 21:51:13 +080045#include <stdarg.h>
Ken Chenb9fa2062018-11-13 21:51:13 +080046#include <stdlib.h>
Luke Huang94b10b92018-11-21 20:13:38 +080047#include <sys/socket.h>
48#include <sys/un.h>
Ken Chenb9fa2062018-11-13 21:51:13 +080049#include <unistd.h>
50
51#include <algorithm>
52#include <chrono>
53#include <iterator>
54#include <numeric>
55#include <thread>
Luke Huang81568fb2020-07-13 00:55:12 +080056#include <unordered_set>
Ken Chenb9fa2062018-11-13 21:51:13 +080057
Luke Huang829511c2020-05-26 17:31:15 +080058#include <DnsProxydProtocol.h> // NETID_USE_LOCAL_NAMESERVERS
Luke Huangf8215372019-11-22 11:53:41 +080059#include <aidl/android/net/IDnsResolver.h>
60#include <android/binder_manager.h>
61#include <android/binder_process.h>
Luke Huang5729afc2020-07-30 23:12:17 +080062#include <util.h> // getApiLevel
Bernie Innocenti41b82c42019-06-05 22:38:25 +090063#include "NetdClient.h"
Bernie Innocenti41b82c42019-06-05 22:38:25 +090064#include "ResolverStats.h"
Luke Huangf8215372019-11-22 11:53:41 +080065#include "netid_client.h" // NETID_UNSET
66#include "params.h" // MAXNS
Mike Yu532405f2020-06-17 17:46:44 +080067#include "stats.h" // RCODE_TIMEOUT
Hungming Chene8f970c2019-04-10 17:34:06 +080068#include "tests/dns_metrics_listener/dns_metrics_listener.h"
chenbruceb43ec752019-07-24 20:19:41 +080069#include "tests/dns_responder/dns_responder.h"
Luke Huangf8215372019-11-22 11:53:41 +080070#include "tests/dns_responder/dns_responder_client_ndk.h"
Hungming Chenc6556622019-10-02 16:01:07 +080071#include "tests/dns_responder/dns_tls_certificate.h"
chenbruceb43ec752019-07-24 20:19:41 +080072#include "tests/dns_responder/dns_tls_frontend.h"
Luke Huangfde82482019-06-04 01:04:53 +080073#include "tests/resolv_test_utils.h"
Mike Yu6ce587d2019-12-19 21:30:22 +080074#include "tests/tun_forwarder.h"
Ken Chenb9fa2062018-11-13 21:51:13 +080075
Luke Huang0d592bc2019-05-25 18:24:03 +080076// Valid VPN netId range is 100 ~ 65535
77constexpr int TEST_VPN_NETID = 65502;
Luke Huang94b10b92018-11-21 20:13:38 +080078constexpr int MAXPACKET = (8 * 1024);
Ken Chenb9fa2062018-11-13 21:51:13 +080079
80// Semi-public Bionic hook used by the NDK (frameworks/base/native/android/net.c)
81// Tested here for convenience.
82extern "C" int android_getaddrinfofornet(const char* hostname, const char* servname,
83 const addrinfo* hints, unsigned netid, unsigned mark,
84 struct addrinfo** result);
85
Mike Yu153b5b82020-03-04 19:53:54 +080086using namespace std::chrono_literals;
87
Luke Huang70070852019-11-25 18:25:50 +080088using aidl::android::net::IDnsResolver;
Luke Huangf8215372019-11-22 11:53:41 +080089using aidl::android::net::INetd;
Mike Yu8ac63402019-12-02 15:28:38 +080090using aidl::android::net::ResolverParamsParcel;
Mike Yu532405f2020-06-17 17:46:44 +080091using aidl::android::net::metrics::INetdEventListener;
Mike Yu6ce587d2019-12-19 21:30:22 +080092using android::base::Error;
Luke Huang9807e6b2019-05-20 16:17:12 +080093using android::base::ParseInt;
Mike Yu6ce587d2019-12-19 21:30:22 +080094using android::base::Result;
Ken Chenb9fa2062018-11-13 21:51:13 +080095using android::base::StringPrintf;
Luke Huang9807e6b2019-05-20 16:17:12 +080096using android::base::unique_fd;
Ken Chenb9fa2062018-11-13 21:51:13 +080097using android::net::ResolverStats;
Mike Yu6ce587d2019-12-19 21:30:22 +080098using android::net::TunForwarder;
Hungming Chene8f970c2019-04-10 17:34:06 +080099using android::net::metrics::DnsMetricsListener;
Ken Chenb9fa2062018-11-13 21:51:13 +0800100using android::netdutils::enableSockopt;
Hungming Chen63779052019-10-30 15:06:13 +0800101using android::netdutils::makeSlice;
Luke Huang9807e6b2019-05-20 16:17:12 +0800102using android::netdutils::ResponseCode;
Luke Huang9d2d25b2019-06-14 00:34:05 +0800103using android::netdutils::ScopedAddrinfo;
Mike Yu40e67072019-10-09 21:14:09 +0800104using android::netdutils::Stopwatch;
Hungming Chen63779052019-10-30 15:06:13 +0800105using android::netdutils::toHex;
Ken Chenb9fa2062018-11-13 21:51:13 +0800106
107// TODO: move into libnetdutils?
108namespace {
Luke Huangfde82482019-06-04 01:04:53 +0800109
Ken Chenb9fa2062018-11-13 21:51:13 +0800110ScopedAddrinfo safe_getaddrinfo(const char* node, const char* service,
111 const struct addrinfo* hints) {
112 addrinfo* result = nullptr;
113 if (getaddrinfo(node, service, hints, &result) != 0) {
114 result = nullptr; // Should already be the case, but...
115 }
116 return ScopedAddrinfo(result);
117}
Luke Huangfde82482019-06-04 01:04:53 +0800118
Mike Yu40e67072019-10-09 21:14:09 +0800119std::pair<ScopedAddrinfo, int> safe_getaddrinfo_time_taken(const char* node, const char* service,
120 const addrinfo& hints) {
121 Stopwatch s;
122 ScopedAddrinfo result = safe_getaddrinfo(node, service, &hints);
123 return {std::move(result), s.timeTakenUs() / 1000};
124}
125
Mike Yue2162e52020-03-04 18:43:46 +0800126struct NameserverStats {
127 NameserverStats() = delete;
128 NameserverStats(const std::string server) : server(server) {}
129 NameserverStats& setSuccesses(int val) {
130 successes = val;
131 return *this;
132 }
133 NameserverStats& setErrors(int val) {
134 errors = val;
135 return *this;
136 }
137 NameserverStats& setTimeouts(int val) {
138 timeouts = val;
139 return *this;
140 }
141 NameserverStats& setInternalErrors(int val) {
142 internal_errors = val;
143 return *this;
144 }
145
146 const std::string server;
147 int successes = 0;
148 int errors = 0;
149 int timeouts = 0;
150 int internal_errors = 0;
151};
152
Mike Yu61d17262020-02-15 18:56:22 +0800153class ScopedSystemProperties {
154 public:
155 ScopedSystemProperties(const std::string& key, const std::string& value) : mStoredKey(key) {
156 mStoredValue = android::base::GetProperty(key, "");
157 android::base::SetProperty(key, value);
158 }
159 ~ScopedSystemProperties() { android::base::SetProperty(mStoredKey, mStoredValue); }
160
161 private:
162 std::string mStoredKey;
163 std::string mStoredValue;
164};
165
Luke Huang5729afc2020-07-30 23:12:17 +0800166const bool isAtLeastR = (getApiLevel() >= 30);
167
Ken Chenb9fa2062018-11-13 21:51:13 +0800168} // namespace
169
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900170class ResolverTest : public ::testing::Test {
Hungming Chene8f970c2019-04-10 17:34:06 +0800171 public:
Hungming Chen473c4de2020-03-12 11:13:35 +0800172 static void SetUpTestSuite() {
Hungming Chen5bf09772019-04-25 11:16:13 +0800173 // Get binder service.
174 // Note that |mDnsClient| is not used for getting binder service in this static function.
175 // The reason is that wants to keep |mDnsClient| as a non-static data member. |mDnsClient|
176 // which sets up device network configuration could be independent from every test.
Luke Huangf8215372019-11-22 11:53:41 +0800177 // TODO: Perhaps add a static function in resolv_test_binder_utils.{cpp,h} to get binder
178 // service.
179
180 AIBinder* binder = AServiceManager_getService("dnsresolver");
181 ndk::SpAIBinder resolvBinder = ndk::SpAIBinder(binder);
182 auto resolvService = aidl::android::net::IDnsResolver::fromBinder(resolvBinder);
Hungming Chen5bf09772019-04-25 11:16:13 +0800183 ASSERT_NE(nullptr, resolvService.get());
184
185 // Subscribe the death recipient to the service IDnsResolver for detecting Netd death.
Luke Huang70070852019-11-25 18:25:50 +0800186 // GTEST assertion macros are not invoked for generating a test failure in the death
187 // recipient because the macros can't indicate failed test if Netd died between tests.
188 // Moreover, continuing testing may have no meaningful after Netd death. Therefore, the
189 // death recipient aborts process by GTEST_LOG_(FATAL) once Netd died.
Luke Huangf8215372019-11-22 11:53:41 +0800190 sResolvDeathRecipient = AIBinder_DeathRecipient_new([](void*) {
191 constexpr char errorMessage[] = "Netd died";
192 LOG(ERROR) << errorMessage;
193 GTEST_LOG_(FATAL) << errorMessage;
194 });
195 ASSERT_EQ(STATUS_OK, AIBinder_linkToDeath(binder, sResolvDeathRecipient, nullptr));
Hungming Chen5bf09772019-04-25 11:16:13 +0800196
197 // Subscribe the DNS listener for verifying DNS metrics event contents.
Luke Huangf8215372019-11-22 11:53:41 +0800198 sDnsMetricsListener = ndk::SharedRefBase::make<DnsMetricsListener>(
199 TEST_NETID /*monitor specific network*/);
Hungming Chen5bf09772019-04-25 11:16:13 +0800200 ASSERT_TRUE(resolvService->registerEventListener(sDnsMetricsListener).isOk());
201
202 // Start the binder thread pool for listening DNS metrics events and receiving death
203 // recipient.
Luke Huangf8215372019-11-22 11:53:41 +0800204 ABinderProcess_startThreadPool();
Hungming Chene8f970c2019-04-10 17:34:06 +0800205 }
Hungming Chen473c4de2020-03-12 11:13:35 +0800206 static void TearDownTestSuite() { AIBinder_DeathRecipient_delete(sResolvDeathRecipient); }
Hungming Chene8f970c2019-04-10 17:34:06 +0800207
Ken Chenb9fa2062018-11-13 21:51:13 +0800208 protected:
Lorenzo Colitti61f796b2020-05-21 00:57:49 +0900209 void SetUp() {
210 mDnsClient.SetUp();
211 sDnsMetricsListener->reset();
212 }
213
Mike Yu960243d2020-01-17 19:02:15 +0800214 void TearDown() {
215 // Ensure the dump works at the end of each test.
216 DumpResolverService();
217
218 mDnsClient.TearDown();
219 }
nuccachena26cc2a2018-07-17 18:07:23 +0800220
Luke Huangf40df9c2020-04-21 08:51:48 +0800221 void resetNetwork() {
222 mDnsClient.TearDown();
223 mDnsClient.SetupOemNetwork();
224 }
225
Xiao Ma09b71022018-12-11 17:56:32 +0900226 void StartDns(test::DNSResponder& dns, const std::vector<DnsRecord>& records) {
227 for (const auto& r : records) {
228 dns.addMapping(r.host_name, r.type, r.addr);
229 }
230
231 ASSERT_TRUE(dns.startServer());
232 dns.clearQueries();
233 }
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900234
Mike Yu960243d2020-01-17 19:02:15 +0800235 void DumpResolverService() {
236 unique_fd fd(open("/dev/null", O_WRONLY));
237 EXPECT_EQ(mDnsClient.resolvService()->dump(fd, nullptr, 0), 0);
238
239 const char* querylogCmd[] = {"querylog"}; // Keep it sync with DnsQueryLog::DUMP_KEYWORD.
240 EXPECT_EQ(mDnsClient.resolvService()->dump(fd, querylogCmd, std::size(querylogCmd)), 0);
241 }
242
Hungming Chene8f970c2019-04-10 17:34:06 +0800243 bool WaitForNat64Prefix(ExpectNat64PrefixStatus status,
244 std::chrono::milliseconds timeout = std::chrono::milliseconds(1000)) {
Hungming Chen5bf09772019-04-25 11:16:13 +0800245 return sDnsMetricsListener->waitForNat64Prefix(status, timeout);
Hungming Chene8f970c2019-04-10 17:34:06 +0800246 }
247
Mike Yu724f77d2019-08-16 11:14:50 +0800248 bool WaitForPrivateDnsValidation(std::string serverAddr, bool validated) {
249 return sDnsMetricsListener->waitForPrivateDnsValidation(serverAddr, validated);
250 }
251
Mike Yu153b5b82020-03-04 19:53:54 +0800252 bool hasUncaughtPrivateDnsValidation(const std::string& serverAddr) {
253 return sDnsMetricsListener->findValidationRecord(serverAddr);
254 }
255
Mike Yu532405f2020-06-17 17:46:44 +0800256 void ExpectDnsEvent(int32_t eventType, int32_t returnCode, const std::string& hostname,
257 const std::vector<std::string>& ipAddresses) {
258 const DnsMetricsListener::DnsEvent expect = {
259 TEST_NETID, eventType, returnCode,
260 hostname, ipAddresses, static_cast<int32_t>(ipAddresses.size())};
Mike Yub8faac42020-06-20 11:11:44 +0800261 do {
262 // Blocking call until timeout.
263 const auto dnsEvent = sDnsMetricsListener->popDnsEvent();
264 ASSERT_TRUE(dnsEvent.has_value()) << "Expected DnsEvent " << expect;
265 if (dnsEvent.value() == expect) break;
266 LOG(INFO) << "Skip unexpected DnsEvent: " << dnsEvent.value();
267 } while (true);
Mike Yu532405f2020-06-17 17:46:44 +0800268 }
269
Mike Yu61d17262020-02-15 18:56:22 +0800270 enum class StatsCmp { LE, EQ };
271
272 bool expectStatsNotGreaterThan(const std::vector<NameserverStats>& nameserversStats) {
273 return expectStatsFromGetResolverInfo(nameserversStats, StatsCmp::LE);
274 }
275
276 bool expectStatsEqualTo(const std::vector<NameserverStats>& nameserversStats) {
277 return expectStatsFromGetResolverInfo(nameserversStats, StatsCmp::EQ);
278 }
279
280 bool expectStatsFromGetResolverInfo(const std::vector<NameserverStats>& nameserversStats,
281 const StatsCmp cmp) {
Mike Yue2162e52020-03-04 18:43:46 +0800282 std::vector<std::string> res_servers;
283 std::vector<std::string> res_domains;
284 std::vector<std::string> res_tls_servers;
285 res_params res_params;
286 std::vector<ResolverStats> res_stats;
287 int wait_for_pending_req_timeout_count;
288
289 if (!DnsResponderClient::GetResolverInfo(mDnsClient.resolvService(), TEST_NETID,
290 &res_servers, &res_domains, &res_tls_servers,
291 &res_params, &res_stats,
292 &wait_for_pending_req_timeout_count)) {
293 ADD_FAILURE() << "GetResolverInfo failed";
294 return false;
295 }
296
297 if (res_servers.size() != res_stats.size()) {
298 ADD_FAILURE() << fmt::format("res_servers.size() != res_stats.size(): {} != {}",
299 res_servers.size(), res_stats.size());
300 return false;
301 }
302 if (res_servers.size() != nameserversStats.size()) {
303 ADD_FAILURE() << fmt::format("res_servers.size() != nameserversStats.size(): {} != {}",
304 res_servers.size(), nameserversStats.size());
305 return false;
306 }
307
308 for (const auto& stats : nameserversStats) {
309 SCOPED_TRACE(stats.server);
310 const auto it = std::find(res_servers.begin(), res_servers.end(), stats.server);
311 if (it == res_servers.end()) {
312 ADD_FAILURE() << fmt::format("nameserver {} not found in the list {{{}}}",
313 stats.server, fmt::join(res_servers, ", "));
314 return false;
315 }
316 const int index = std::distance(res_servers.begin(), it);
317
318 // The check excludes rtt_avg, last_sample_time, and usable since they will be obsolete
319 // after |res_stats| is retrieved from NetConfig.dnsStats rather than NetConfig.nsstats.
Mike Yu61d17262020-02-15 18:56:22 +0800320 switch (cmp) {
321 case StatsCmp::EQ:
322 EXPECT_EQ(res_stats[index].successes, stats.successes);
323 EXPECT_EQ(res_stats[index].errors, stats.errors);
324 EXPECT_EQ(res_stats[index].timeouts, stats.timeouts);
325 EXPECT_EQ(res_stats[index].internal_errors, stats.internal_errors);
326 break;
327 case StatsCmp::LE:
328 EXPECT_LE(res_stats[index].successes, stats.successes);
329 EXPECT_LE(res_stats[index].errors, stats.errors);
330 EXPECT_LE(res_stats[index].timeouts, stats.timeouts);
331 EXPECT_LE(res_stats[index].internal_errors, stats.internal_errors);
332 break;
333 default:
334 ADD_FAILURE() << "Unknown comparator " << static_cast<int>(cmp);
335 return false;
336 }
Mike Yue2162e52020-03-04 18:43:46 +0800337 }
338
339 return true;
340 }
341
Mike Yu153b5b82020-03-04 19:53:54 +0800342 // Since there's no way to terminate private DNS validation threads at any time. Tests that
343 // focus on the results of private DNS validation can interfere with each other if they use the
344 // same IP address for test servers. getUniqueIPv4Address() is a workaround to reduce the
345 // possibility of tests being flaky. A feasible solution is to forbid the validation threads,
346 // which are considered as outdated (e.g. switch the resolver to private DNS OFF mode), updating
347 // the result to the PrivateDnsConfiguration instance.
348 static std::string getUniqueIPv4Address() {
349 static int counter = 0;
350 return fmt::format("127.0.100.{}", (++counter & 0xff));
351 }
352
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900353 DnsResponderClient mDnsClient;
Xiao Ma09b71022018-12-11 17:56:32 +0900354
Hungming Chen5bf09772019-04-25 11:16:13 +0800355 // Use a shared static DNS listener for all tests to avoid registering lots of listeners
356 // which may be released late until process terminated. Currently, registered DNS listener
357 // is removed by binder death notification which is fired when the process hosting an
358 // IBinder has gone away. If every test in ResolverTest registers its DNS listener, Netd
359 // may temporarily hold lots of dead listeners until the unit test process terminates.
360 // TODO: Perhaps add an unregistering listener binder call or fork a listener process which
361 // could be terminated earlier.
Luke Huangf8215372019-11-22 11:53:41 +0800362 static std::shared_ptr<DnsMetricsListener>
Hungming Chen473c4de2020-03-12 11:13:35 +0800363 sDnsMetricsListener; // Initialized in SetUpTestSuite.
Hungming Chen5bf09772019-04-25 11:16:13 +0800364
365 // Use a shared static death recipient to monitor the service death. The static death
366 // recipient could monitor the death not only during the test but also between tests.
Hungming Chen473c4de2020-03-12 11:13:35 +0800367 static AIBinder_DeathRecipient* sResolvDeathRecipient; // Initialized in SetUpTestSuite.
Ken Chenb9fa2062018-11-13 21:51:13 +0800368};
369
Hungming Chen5bf09772019-04-25 11:16:13 +0800370// Initialize static member of class.
Luke Huangf8215372019-11-22 11:53:41 +0800371std::shared_ptr<DnsMetricsListener> ResolverTest::sDnsMetricsListener;
372AIBinder_DeathRecipient* ResolverTest::sResolvDeathRecipient;
Hungming Chen5bf09772019-04-25 11:16:13 +0800373
Ken Chenb9fa2062018-11-13 21:51:13 +0800374TEST_F(ResolverTest, GetHostByName) {
Xiao Ma09b71022018-12-11 17:56:32 +0900375 constexpr char nonexistent_host_name[] = "nonexistent.example.com.";
376
377 test::DNSResponder dns;
378 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.3"}});
379 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800380
381 const hostent* result;
Ken Chenb9fa2062018-11-13 21:51:13 +0800382 result = gethostbyname("nonexistent");
383 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, nonexistent_host_name));
384 ASSERT_TRUE(result == nullptr);
385 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
386
387 dns.clearQueries();
388 result = gethostbyname("hello");
Xiao Ma09b71022018-12-11 17:56:32 +0900389 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
Ken Chenb9fa2062018-11-13 21:51:13 +0800390 ASSERT_FALSE(result == nullptr);
391 ASSERT_EQ(4, result->h_length);
392 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
393 EXPECT_EQ("1.2.3.3", ToString(result));
394 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800395}
396
lifr4e4a2e02019-01-29 16:53:51 +0800397TEST_F(ResolverTest, GetHostByName_cnames) {
398 constexpr char host_name[] = "host.example.com.";
399 size_t cnamecount = 0;
400 test::DNSResponder dns;
401
402 const std::vector<DnsRecord> records = {
403 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
404 {"a.example.com.", ns_type::ns_t_cname, "b.example.com."},
405 {"b.example.com.", ns_type::ns_t_cname, "c.example.com."},
406 {"c.example.com.", ns_type::ns_t_cname, "d.example.com."},
407 {"d.example.com.", ns_type::ns_t_cname, "e.example.com."},
408 {"e.example.com.", ns_type::ns_t_cname, host_name},
409 {host_name, ns_type::ns_t_a, "1.2.3.3"},
410 {host_name, ns_type::ns_t_aaaa, "2001:db8::42"},
411 };
412 StartDns(dns, records);
413 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
414
415 // using gethostbyname2() to resolve ipv4 hello.example.com. to 1.2.3.3
416 // Ensure the v4 address and cnames are correct
417 const hostent* result;
418 result = gethostbyname2("hello", AF_INET);
419 ASSERT_FALSE(result == nullptr);
420
421 for (int i = 0; result != nullptr && result->h_aliases[i] != nullptr; i++) {
422 std::string domain_name = records[i].host_name.substr(0, records[i].host_name.size() - 1);
423 EXPECT_EQ(result->h_aliases[i], domain_name);
424 cnamecount++;
425 }
426 // The size of "Non-cname type" record in DNS records is 2
427 ASSERT_EQ(cnamecount, records.size() - 2);
428 ASSERT_EQ(4, result->h_length);
429 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
430 EXPECT_EQ("1.2.3.3", ToString(result));
431 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
432 EXPECT_EQ(1U, dns.queries().size()) << dns.dumpQueries();
433
434 // using gethostbyname2() to resolve ipv6 hello.example.com. to 2001:db8::42
435 // Ensure the v6 address and cnames are correct
436 cnamecount = 0;
437 dns.clearQueries();
438 result = gethostbyname2("hello", AF_INET6);
439 for (unsigned i = 0; result != nullptr && result->h_aliases[i] != nullptr; i++) {
440 std::string domain_name = records[i].host_name.substr(0, records[i].host_name.size() - 1);
441 EXPECT_EQ(result->h_aliases[i], domain_name);
442 cnamecount++;
443 }
444 // The size of "Non-cname type" DNS record in records is 2
445 ASSERT_EQ(cnamecount, records.size() - 2);
446 ASSERT_FALSE(result == nullptr);
447 ASSERT_EQ(16, result->h_length);
448 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
449 EXPECT_EQ("2001:db8::42", ToString(result));
450 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
451}
452
453TEST_F(ResolverTest, GetHostByName_cnamesInfiniteLoop) {
454 test::DNSResponder dns;
455 const std::vector<DnsRecord> records = {
456 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
457 {"a.example.com.", ns_type::ns_t_cname, kHelloExampleCom},
458 };
459 StartDns(dns, records);
460 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
461
462 const hostent* result;
463 result = gethostbyname2("hello", AF_INET);
464 ASSERT_TRUE(result == nullptr);
465
466 dns.clearQueries();
467 result = gethostbyname2("hello", AF_INET6);
468 ASSERT_TRUE(result == nullptr);
469}
470
Ken Chenb9fa2062018-11-13 21:51:13 +0800471TEST_F(ResolverTest, GetHostByName_localhost) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800472 constexpr char name_camelcase[] = "LocalHost";
Ken Chenb9fa2062018-11-13 21:51:13 +0800473 constexpr char name_ip6_dot[] = "ip6-localhost.";
474 constexpr char name_ip6_fqdn[] = "ip6-localhost.example.com.";
475
markchien96b09e22020-07-29 14:24:34 +0800476 // Add a no-op nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900477 test::DNSResponder dns;
478 StartDns(dns, {});
479 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800480
481 // Expect no DNS queries; localhost is resolved via /etc/hosts
Xiao Ma09b71022018-12-11 17:56:32 +0900482 const hostent* result = gethostbyname(kLocalHost);
Ken Chenb9fa2062018-11-13 21:51:13 +0800483 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
484 ASSERT_FALSE(result == nullptr);
485 ASSERT_EQ(4, result->h_length);
486 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900487 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800488 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
489
490 // Ensure the hosts file resolver ignores case of hostnames
491 result = gethostbyname(name_camelcase);
492 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
493 ASSERT_FALSE(result == nullptr);
494 ASSERT_EQ(4, result->h_length);
495 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900496 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800497 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
498
499 // The hosts file also contains ip6-localhost, but gethostbyname() won't
chenbruce018fdb22019-06-12 18:08:04 +0800500 // return it. This would be easy to
Ken Chenb9fa2062018-11-13 21:51:13 +0800501 // change, but there's no point in changing the legacy behavior; new code
502 // should be calling getaddrinfo() anyway.
503 // So we check the legacy behavior, which results in amusing A-record
504 // lookups for ip6-localhost, with and without search domains appended.
505 dns.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900506 result = gethostbyname(kIp6LocalHost);
Sehee Parkbbca0202018-11-16 10:53:16 +0900507 EXPECT_EQ(2U, dns.queries().size()) << dns.dumpQueries();
508 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, name_ip6_dot)) << dns.dumpQueries();
509 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, name_ip6_fqdn)) << dns.dumpQueries();
Ken Chenb9fa2062018-11-13 21:51:13 +0800510 ASSERT_TRUE(result == nullptr);
511
512 // Finally, use gethostbyname2() to resolve ip6-localhost to ::1 from
513 // the hosts file.
514 dns.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900515 result = gethostbyname2(kIp6LocalHost, AF_INET6);
Ken Chenb9fa2062018-11-13 21:51:13 +0800516 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
517 ASSERT_FALSE(result == nullptr);
518 ASSERT_EQ(16, result->h_length);
519 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900520 EXPECT_EQ(kIp6LocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800521 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800522}
523
524TEST_F(ResolverTest, GetHostByName_numeric) {
markchien96b09e22020-07-29 14:24:34 +0800525 // Add a no-op nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900526 test::DNSResponder dns;
527 StartDns(dns, {});
528 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800529
530 // Numeric v4 address: expect no DNS queries
531 constexpr char numeric_v4[] = "192.168.0.1";
Ken Chenb9fa2062018-11-13 21:51:13 +0800532 const hostent* result = gethostbyname(numeric_v4);
Sehee Parkbbca0202018-11-16 10:53:16 +0900533 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800534 ASSERT_FALSE(result == nullptr);
535 ASSERT_EQ(4, result->h_length); // v4
536 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
537 EXPECT_EQ(numeric_v4, ToString(result));
538 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
539
540 // gethostbyname() recognizes a v6 address, and fails with no DNS queries
541 constexpr char numeric_v6[] = "2001:db8::42";
542 dns.clearQueries();
543 result = gethostbyname(numeric_v6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900544 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800545 EXPECT_TRUE(result == nullptr);
546
547 // Numeric v6 address with gethostbyname2(): succeeds with no DNS queries
548 dns.clearQueries();
549 result = gethostbyname2(numeric_v6, AF_INET6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900550 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800551 ASSERT_FALSE(result == nullptr);
552 ASSERT_EQ(16, result->h_length); // v6
553 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
554 EXPECT_EQ(numeric_v6, ToString(result));
555 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
556
557 // Numeric v6 address with scope work with getaddrinfo(),
558 // but gethostbyname2() does not understand them; it issues two dns
559 // queries, then fails. This hardly ever happens, there's no point
560 // in fixing this. This test simply verifies the current (bogus)
561 // behavior to avoid further regressions (like crashes, or leaks).
562 constexpr char numeric_v6_scope[] = "fe80::1%lo";
563 dns.clearQueries();
564 result = gethostbyname2(numeric_v6_scope, AF_INET6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900565 EXPECT_EQ(2U, dns.queries().size()); // OUCH!
Ken Chenb9fa2062018-11-13 21:51:13 +0800566 ASSERT_TRUE(result == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800567}
568
569TEST_F(ResolverTest, BinderSerialization) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800570 std::vector<int> params_offsets = {
Luke Huang5bd827c2019-03-14 16:10:04 +0800571 IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY,
572 IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD,
573 IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES,
574 IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES,
575 IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC,
576 IDnsResolver::RESOLVER_PARAMS_RETRY_COUNT,
Ken Chenb9fa2062018-11-13 21:51:13 +0800577 };
Bernie Innocentib102dd22018-12-04 14:57:48 +0900578 const int size = static_cast<int>(params_offsets.size());
Luke Huang5bd827c2019-03-14 16:10:04 +0800579 EXPECT_EQ(size, IDnsResolver::RESOLVER_PARAMS_COUNT);
Ken Chenb9fa2062018-11-13 21:51:13 +0800580 std::sort(params_offsets.begin(), params_offsets.end());
Bernie Innocentib102dd22018-12-04 14:57:48 +0900581 for (int i = 0; i < size; ++i) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800582 EXPECT_EQ(params_offsets[i], i);
583 }
584}
585
586TEST_F(ResolverTest, GetHostByName_Binder) {
Luke Huangf8215372019-11-22 11:53:41 +0800587 std::vector<std::string> domains = {"example.com"};
Ken Chenb9fa2062018-11-13 21:51:13 +0800588 std::vector<std::unique_ptr<test::DNSResponder>> dns;
589 std::vector<std::string> servers;
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900590 std::vector<DnsResponderClient::Mapping> mappings;
591 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupMappings(1, domains, &mappings));
592 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupDNSServers(4, mappings, &dns, &servers));
Ken Chenb9fa2062018-11-13 21:51:13 +0800593 ASSERT_EQ(1U, mappings.size());
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900594 const DnsResponderClient::Mapping& mapping = mappings[0];
Ken Chenb9fa2062018-11-13 21:51:13 +0800595
Xiao Ma09b71022018-12-11 17:56:32 +0900596 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains, kDefaultParams));
Ken Chenb9fa2062018-11-13 21:51:13 +0800597
598 const hostent* result = gethostbyname(mapping.host.c_str());
Bernie Innocentib102dd22018-12-04 14:57:48 +0900599 const size_t total_queries =
Luke Huangfde82482019-06-04 01:04:53 +0800600 std::accumulate(dns.begin(), dns.end(), 0, [&mapping](size_t total, auto& d) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800601 return total + GetNumQueriesForType(*d, ns_type::ns_t_a, mapping.entry.c_str());
602 });
603
604 EXPECT_LE(1U, total_queries);
605 ASSERT_FALSE(result == nullptr);
606 ASSERT_EQ(4, result->h_length);
607 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
608 EXPECT_EQ(mapping.ip4, ToString(result));
609 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
610
611 std::vector<std::string> res_servers;
612 std::vector<std::string> res_domains;
Mike Yu0a1c53d2018-11-26 13:26:21 +0900613 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +0900614 res_params res_params;
Ken Chenb9fa2062018-11-13 21:51:13 +0800615 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +0800616 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +0800617 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
618 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
619 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chenb9fa2062018-11-13 21:51:13 +0800620 EXPECT_EQ(servers.size(), res_servers.size());
621 EXPECT_EQ(domains.size(), res_domains.size());
Mike Yu0a1c53d2018-11-26 13:26:21 +0900622 EXPECT_EQ(0U, res_tls_servers.size());
Luke Huang5bd827c2019-03-14 16:10:04 +0800623 ASSERT_EQ(static_cast<size_t>(IDnsResolver::RESOLVER_PARAMS_COUNT), kDefaultParams.size());
624 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY],
625 res_params.sample_validity);
626 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900627 res_params.success_threshold);
Luke Huang5bd827c2019-03-14 16:10:04 +0800628 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
629 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
630 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
Ken Chenb9fa2062018-11-13 21:51:13 +0800631 res_params.base_timeout_msec);
632 EXPECT_EQ(servers.size(), res_stats.size());
633
Bernie Innocenti0c067e42019-04-01 15:33:16 +0900634 EXPECT_THAT(res_servers, testing::UnorderedElementsAreArray(servers));
635 EXPECT_THAT(res_domains, testing::UnorderedElementsAreArray(domains));
Ken Chenb9fa2062018-11-13 21:51:13 +0800636}
637
638TEST_F(ResolverTest, GetAddrInfo) {
Xiao Ma09b71022018-12-11 17:56:32 +0900639 constexpr char listen_addr[] = "127.0.0.4";
640 constexpr char listen_addr2[] = "127.0.0.5";
641 constexpr char host_name[] = "howdy.example.com.";
Ken Chenb9fa2062018-11-13 21:51:13 +0800642
Xiao Ma09b71022018-12-11 17:56:32 +0900643 const std::vector<DnsRecord> records = {
644 {host_name, ns_type::ns_t_a, "1.2.3.4"},
645 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
646 };
647 test::DNSResponder dns(listen_addr);
648 test::DNSResponder dns2(listen_addr2);
649 StartDns(dns, records);
650 StartDns(dns2, records);
Ken Chenb9fa2062018-11-13 21:51:13 +0800651
Xiao Ma09b71022018-12-11 17:56:32 +0900652 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}));
Ken Chenb9fa2062018-11-13 21:51:13 +0800653 dns.clearQueries();
654 dns2.clearQueries();
655
656 ScopedAddrinfo result = safe_getaddrinfo("howdy", nullptr, nullptr);
657 EXPECT_TRUE(result != nullptr);
658 size_t found = GetNumQueries(dns, host_name);
659 EXPECT_LE(1U, found);
660 // Could be A or AAAA
661 std::string result_str = ToString(result);
662 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +0800663 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +0800664
665 // Verify that the name is cached.
666 size_t old_found = found;
667 result = safe_getaddrinfo("howdy", nullptr, nullptr);
668 EXPECT_TRUE(result != nullptr);
669 found = GetNumQueries(dns, host_name);
670 EXPECT_LE(1U, found);
671 EXPECT_EQ(old_found, found);
672 result_str = ToString(result);
Luke Huangf8215372019-11-22 11:53:41 +0800673 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4") << result_str;
Ken Chenb9fa2062018-11-13 21:51:13 +0800674
675 // Change the DNS resolver, ensure that queries are still cached.
Xiao Ma09b71022018-12-11 17:56:32 +0900676 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr2}));
Ken Chenb9fa2062018-11-13 21:51:13 +0800677 dns.clearQueries();
678 dns2.clearQueries();
679
680 result = safe_getaddrinfo("howdy", nullptr, nullptr);
681 EXPECT_TRUE(result != nullptr);
682 found = GetNumQueries(dns, host_name);
683 size_t found2 = GetNumQueries(dns2, host_name);
684 EXPECT_EQ(0U, found);
685 EXPECT_LE(0U, found2);
686
687 // Could be A or AAAA
688 result_str = ToString(result);
689 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +0800690 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +0800691}
692
693TEST_F(ResolverTest, GetAddrInfoV4) {
Xiao Ma09b71022018-12-11 17:56:32 +0900694 test::DNSResponder dns;
695 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.5"}});
696 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800697
Xiao Ma09b71022018-12-11 17:56:32 +0900698 const addrinfo hints = {.ai_family = AF_INET};
699 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
Ken Chenb9fa2062018-11-13 21:51:13 +0800700 EXPECT_TRUE(result != nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900701 EXPECT_EQ(1U, GetNumQueries(dns, kHelloExampleCom));
Ken Chenb9fa2062018-11-13 21:51:13 +0800702 EXPECT_EQ("1.2.3.5", ToString(result));
703}
704
705TEST_F(ResolverTest, GetAddrInfo_localhost) {
markchien96b09e22020-07-29 14:24:34 +0800706 // Add a no-op nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900707 test::DNSResponder dns;
708 StartDns(dns, {});
709 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800710
Xiao Ma09b71022018-12-11 17:56:32 +0900711 ScopedAddrinfo result = safe_getaddrinfo(kLocalHost, nullptr, nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800712 EXPECT_TRUE(result != nullptr);
713 // Expect no DNS queries; localhost is resolved via /etc/hosts
714 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900715 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800716
Xiao Ma09b71022018-12-11 17:56:32 +0900717 result = safe_getaddrinfo(kIp6LocalHost, nullptr, nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800718 EXPECT_TRUE(result != nullptr);
719 // Expect no DNS queries; ip6-localhost is resolved via /etc/hosts
720 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900721 EXPECT_EQ(kIp6LocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800722}
723
Luke Huangd8ac4752019-06-18 17:05:47 +0800724TEST_F(ResolverTest, GetAddrInfo_InvalidSocketType) {
725 test::DNSResponder dns;
726 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.5"}});
727 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
728
729 // TODO: Test other invalid socket types.
730 const addrinfo hints = {
731 .ai_family = AF_UNSPEC,
Luke Huangd8ac4752019-06-18 17:05:47 +0800732 .ai_socktype = SOCK_PACKET,
733 };
734 addrinfo* result = nullptr;
735 // This is a valid hint, but the query won't be sent because the socket type is
736 // not supported.
737 EXPECT_EQ(EAI_NODATA, getaddrinfo("hello", nullptr, &hints, &result));
738 ScopedAddrinfo result_cleanup(result);
739 EXPECT_EQ(nullptr, result);
740}
741
Ken Chen92bed612018-12-22 21:46:55 +0800742// Verify if the resolver correctly handle multiple queries simultaneously
743// step 1: set dns server#1 into deferred responding mode.
744// step 2: thread#1 query "hello.example.com." --> resolver send query to server#1.
745// step 3: thread#2 query "hello.example.com." --> resolver hold the request and wait for
746// response of previous pending query sent by thread#1.
747// step 4: thread#3 query "konbanha.example.com." --> resolver send query to server#3. Server
748// respond to resolver immediately.
749// step 5: check if server#1 get 1 query by thread#1, server#2 get 0 query, server#3 get 1 query.
750// step 6: resume dns server#1 to respond dns query in step#2.
751// step 7: thread#1 and #2 should get returned from DNS query after step#6. Also, check the
752// number of queries in server#2 is 0 to ensure thread#2 does not wake up unexpectedly
753// before signaled by thread#1.
754TEST_F(ResolverTest, GetAddrInfoV4_deferred_resp) {
755 const char* listen_addr1 = "127.0.0.9";
756 const char* listen_addr2 = "127.0.0.10";
757 const char* listen_addr3 = "127.0.0.11";
758 const char* listen_srv = "53";
759 const char* host_name_deferred = "hello.example.com.";
760 const char* host_name_normal = "konbanha.example.com.";
Mike Yufc125e42019-05-15 20:41:28 +0800761 test::DNSResponder dns1(listen_addr1, listen_srv, ns_rcode::ns_r_servfail);
762 test::DNSResponder dns2(listen_addr2, listen_srv, ns_rcode::ns_r_servfail);
763 test::DNSResponder dns3(listen_addr3, listen_srv, ns_rcode::ns_r_servfail);
Ken Chen92bed612018-12-22 21:46:55 +0800764 dns1.addMapping(host_name_deferred, ns_type::ns_t_a, "1.2.3.4");
765 dns2.addMapping(host_name_deferred, ns_type::ns_t_a, "1.2.3.4");
766 dns3.addMapping(host_name_normal, ns_type::ns_t_a, "1.2.3.5");
767 ASSERT_TRUE(dns1.startServer());
768 ASSERT_TRUE(dns2.startServer());
769 ASSERT_TRUE(dns3.startServer());
770 const std::vector<std::string> servers_for_t1 = {listen_addr1};
771 const std::vector<std::string> servers_for_t2 = {listen_addr2};
772 const std::vector<std::string> servers_for_t3 = {listen_addr3};
773 addrinfo hints = {.ai_family = AF_INET};
774 const std::vector<int> params = {300, 25, 8, 8, 5000};
775 bool t3_task_done = false;
776
777 dns1.setDeferredResp(true);
778 std::thread t1([&, this]() {
779 ASSERT_TRUE(
780 mDnsClient.SetResolversForNetwork(servers_for_t1, kDefaultSearchDomains, params));
781 ScopedAddrinfo result = safe_getaddrinfo(host_name_deferred, nullptr, &hints);
782 // t3's dns query should got returned first
783 EXPECT_TRUE(t3_task_done);
784 EXPECT_EQ(1U, GetNumQueries(dns1, host_name_deferred));
785 EXPECT_TRUE(result != nullptr);
786 EXPECT_EQ("1.2.3.4", ToString(result));
787 });
788
789 // ensuring t1 and t2 handler functions are processed in order
790 usleep(100 * 1000);
791 std::thread t2([&, this]() {
792 ASSERT_TRUE(
793 mDnsClient.SetResolversForNetwork(servers_for_t2, kDefaultSearchDomains, params));
794 ScopedAddrinfo result = safe_getaddrinfo(host_name_deferred, nullptr, &hints);
795 EXPECT_TRUE(t3_task_done);
796 EXPECT_EQ(0U, GetNumQueries(dns2, host_name_deferred));
797 EXPECT_TRUE(result != nullptr);
798 EXPECT_EQ("1.2.3.4", ToString(result));
799
800 std::vector<std::string> res_servers;
801 std::vector<std::string> res_domains;
802 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +0900803 res_params res_params;
Ken Chen92bed612018-12-22 21:46:55 +0800804 std::vector<ResolverStats> res_stats;
805 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +0800806 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
807 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains,
808 &res_tls_servers, &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chen92bed612018-12-22 21:46:55 +0800809 EXPECT_EQ(0, wait_for_pending_req_timeout_count);
810 });
811
812 // ensuring t2 and t3 handler functions are processed in order
813 usleep(100 * 1000);
814 std::thread t3([&, this]() {
815 ASSERT_TRUE(
816 mDnsClient.SetResolversForNetwork(servers_for_t3, kDefaultSearchDomains, params));
817 ScopedAddrinfo result = safe_getaddrinfo(host_name_normal, nullptr, &hints);
818 EXPECT_EQ(1U, GetNumQueries(dns1, host_name_deferred));
819 EXPECT_EQ(0U, GetNumQueries(dns2, host_name_deferred));
820 EXPECT_EQ(1U, GetNumQueries(dns3, host_name_normal));
821 EXPECT_TRUE(result != nullptr);
822 EXPECT_EQ("1.2.3.5", ToString(result));
823
824 t3_task_done = true;
825 dns1.setDeferredResp(false);
826 });
827 t3.join();
828 t1.join();
829 t2.join();
830}
831
lifr4e4a2e02019-01-29 16:53:51 +0800832TEST_F(ResolverTest, GetAddrInfo_cnames) {
833 constexpr char host_name[] = "host.example.com.";
834 test::DNSResponder dns;
835 const std::vector<DnsRecord> records = {
836 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
837 {"a.example.com.", ns_type::ns_t_cname, "b.example.com."},
838 {"b.example.com.", ns_type::ns_t_cname, "c.example.com."},
839 {"c.example.com.", ns_type::ns_t_cname, "d.example.com."},
840 {"d.example.com.", ns_type::ns_t_cname, "e.example.com."},
841 {"e.example.com.", ns_type::ns_t_cname, host_name},
842 {host_name, ns_type::ns_t_a, "1.2.3.3"},
843 {host_name, ns_type::ns_t_aaaa, "2001:db8::42"},
844 };
845 StartDns(dns, records);
846 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
847
848 addrinfo hints = {.ai_family = AF_INET};
849 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
850 EXPECT_TRUE(result != nullptr);
851 EXPECT_EQ("1.2.3.3", ToString(result));
852
853 dns.clearQueries();
854 hints = {.ai_family = AF_INET6};
855 result = safe_getaddrinfo("hello", nullptr, &hints);
856 EXPECT_TRUE(result != nullptr);
857 EXPECT_EQ("2001:db8::42", ToString(result));
858}
859
860TEST_F(ResolverTest, GetAddrInfo_cnamesNoIpAddress) {
861 test::DNSResponder dns;
862 const std::vector<DnsRecord> records = {
863 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
864 };
865 StartDns(dns, records);
866 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
867
868 addrinfo hints = {.ai_family = AF_INET};
869 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
870 EXPECT_TRUE(result == nullptr);
871
872 dns.clearQueries();
873 hints = {.ai_family = AF_INET6};
874 result = safe_getaddrinfo("hello", nullptr, &hints);
875 EXPECT_TRUE(result == nullptr);
876}
877
878TEST_F(ResolverTest, GetAddrInfo_cnamesIllegalRdata) {
879 test::DNSResponder dns;
880 const std::vector<DnsRecord> records = {
881 {kHelloExampleCom, ns_type::ns_t_cname, ".!#?"},
882 };
883 StartDns(dns, records);
884 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
885
886 addrinfo hints = {.ai_family = AF_INET};
887 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
888 EXPECT_TRUE(result == nullptr);
889
890 dns.clearQueries();
891 hints = {.ai_family = AF_INET6};
892 result = safe_getaddrinfo("hello", nullptr, &hints);
893 EXPECT_TRUE(result == nullptr);
894}
895
Pabba Prakash66707822020-01-08 15:34:58 +0530896TEST_F(ResolverTest, GetAddrInfoForCaseInSensitiveDomains) {
897 test::DNSResponder dns;
898 const char* host_name = "howdy.example.com.";
899 const char* host_name2 = "HOWDY.example.com.";
900 const std::vector<DnsRecord> records = {
901 {host_name, ns_type::ns_t_a, "1.2.3.4"},
902 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
903 {host_name2, ns_type::ns_t_a, "1.2.3.5"},
904 {host_name2, ns_type::ns_t_aaaa, "::1.2.3.5"},
905 };
906 StartDns(dns, records);
907 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
908
909 ScopedAddrinfo hostname_result = safe_getaddrinfo("howdy", nullptr, nullptr);
910 EXPECT_TRUE(hostname_result != nullptr);
911 const size_t hostname1_count_after_first_query = GetNumQueries(dns, host_name);
912 EXPECT_LE(1U, hostname1_count_after_first_query);
913 // Could be A or AAAA
914 std::string hostname_result_str = ToString(hostname_result);
915 EXPECT_TRUE(hostname_result_str == "1.2.3.4" || hostname_result_str == "::1.2.3.4");
916
917 // Verify that the name is cached.
918 ScopedAddrinfo hostname2_result = safe_getaddrinfo("HOWDY", nullptr, nullptr);
919 EXPECT_TRUE(hostname2_result != nullptr);
920 const size_t hostname1_count_after_second_query = GetNumQueries(dns, host_name);
921 EXPECT_LE(1U, hostname1_count_after_second_query);
922
923 // verify that there is no change in num of queries for howdy.example.com
924 EXPECT_EQ(hostname1_count_after_first_query, hostname1_count_after_second_query);
925
926 // Number of queries for HOWDY.example.com would be >= 1 if domain names
927 // are considered case-sensitive, else number of queries should be 0.
928 const size_t hostname2_count = GetNumQueries(dns, host_name2);
929 EXPECT_EQ(0U,hostname2_count);
930 std::string hostname2_result_str = ToString(hostname2_result);
931 EXPECT_TRUE(hostname2_result_str == "1.2.3.4" || hostname2_result_str == "::1.2.3.4");
932
933 // verify that the result is still the same address even though
934 // mixed-case string is not in the DNS
935 ScopedAddrinfo result = safe_getaddrinfo("HowDY", nullptr, nullptr);
936 EXPECT_TRUE(result != nullptr);
937 std::string result_str = ToString(result);
938 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4");
939}
940
Ken Chenb9fa2062018-11-13 21:51:13 +0800941TEST_F(ResolverTest, MultidomainResolution) {
Xiao Ma09b71022018-12-11 17:56:32 +0900942 constexpr char host_name[] = "nihao.example2.com.";
Luke Huangf8215372019-11-22 11:53:41 +0800943 std::vector<std::string> searchDomains = {"example1.com", "example2.com", "example3.com"};
Ken Chenb9fa2062018-11-13 21:51:13 +0800944
Xiao Ma09b71022018-12-11 17:56:32 +0900945 test::DNSResponder dns("127.0.0.6");
946 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.3"}});
947 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({"127.0.0.6"}, searchDomains));
948
Ken Chenb9fa2062018-11-13 21:51:13 +0800949 const hostent* result = gethostbyname("nihao");
Xiao Ma09b71022018-12-11 17:56:32 +0900950
Ken Chenb9fa2062018-11-13 21:51:13 +0800951 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
952 ASSERT_FALSE(result == nullptr);
953 ASSERT_EQ(4, result->h_length);
954 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
955 EXPECT_EQ("1.2.3.3", ToString(result));
956 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800957}
958
959TEST_F(ResolverTest, GetAddrInfoV6_numeric) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800960 constexpr char host_name[] = "ohayou.example.com.";
961 constexpr char numeric_addr[] = "fe80::1%lo";
962
Xiao Ma09b71022018-12-11 17:56:32 +0900963 test::DNSResponder dns;
Ken Chenb9fa2062018-11-13 21:51:13 +0800964 dns.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900965 StartDns(dns, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
966 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800967
968 addrinfo hints = {.ai_family = AF_INET6};
969 ScopedAddrinfo result = safe_getaddrinfo(numeric_addr, nullptr, &hints);
970 EXPECT_TRUE(result != nullptr);
971 EXPECT_EQ(numeric_addr, ToString(result));
972 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
973
974 // Now try a non-numeric hostname query with the AI_NUMERICHOST flag set.
975 // We should fail without sending out a DNS query.
976 hints.ai_flags |= AI_NUMERICHOST;
977 result = safe_getaddrinfo(host_name, nullptr, &hints);
978 EXPECT_TRUE(result == nullptr);
979 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
980}
981
982TEST_F(ResolverTest, GetAddrInfoV6_failing) {
Xiao Ma09b71022018-12-11 17:56:32 +0900983 constexpr char listen_addr0[] = "127.0.0.7";
984 constexpr char listen_addr1[] = "127.0.0.8";
Ken Chenb9fa2062018-11-13 21:51:13 +0800985 const char* host_name = "ohayou.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +0900986
987 test::DNSResponder dns0(listen_addr0);
988 test::DNSResponder dns1(listen_addr1);
Ken Chenb9fa2062018-11-13 21:51:13 +0800989 dns0.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900990 StartDns(dns0, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
991 StartDns(dns1, {{host_name, ns_type::ns_t_aaaa, "2001:db8::6"}});
992
Luke Huangf8215372019-11-22 11:53:41 +0800993 std::vector<std::string> servers = {listen_addr0, listen_addr1};
Ken Chenb9fa2062018-11-13 21:51:13 +0800994 // <sample validity in s> <success threshold in percent> <min samples> <max samples>
995 int sample_count = 8;
Luke Huangf8215372019-11-22 11:53:41 +0800996 const std::vector<int> params = {300, 25, sample_count, sample_count};
Xiao Ma09b71022018-12-11 17:56:32 +0900997 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, kDefaultSearchDomains, params));
Ken Chenb9fa2062018-11-13 21:51:13 +0800998
999 // Repeatedly perform resolutions for non-existing domains until MAXNSSAMPLES resolutions have
1000 // reached the dns0, which is set to fail. No more requests should then arrive at that server
1001 // for the next sample_lifetime seconds.
1002 // TODO: This approach is implementation-dependent, change once metrics reporting is available.
Xiao Ma09b71022018-12-11 17:56:32 +09001003 const addrinfo hints = {.ai_family = AF_INET6};
Bernie Innocentib102dd22018-12-04 14:57:48 +09001004 for (int i = 0; i < sample_count; ++i) {
Ken Chenb9fa2062018-11-13 21:51:13 +08001005 std::string domain = StringPrintf("nonexistent%d", i);
1006 ScopedAddrinfo result = safe_getaddrinfo(domain.c_str(), nullptr, &hints);
1007 }
1008 // Due to 100% errors for all possible samples, the server should be ignored from now on and
1009 // only the second one used for all following queries, until NSSAMPLE_VALIDITY is reached.
1010 dns0.clearQueries();
1011 dns1.clearQueries();
1012 ScopedAddrinfo result = safe_getaddrinfo("ohayou", nullptr, &hints);
1013 EXPECT_TRUE(result != nullptr);
1014 EXPECT_EQ(0U, GetNumQueries(dns0, host_name));
1015 EXPECT_EQ(1U, GetNumQueries(dns1, host_name));
1016}
1017
1018TEST_F(ResolverTest, GetAddrInfoV6_nonresponsive) {
Xiao Ma09b71022018-12-11 17:56:32 +09001019 constexpr char listen_addr0[] = "127.0.0.7";
1020 constexpr char listen_addr1[] = "127.0.0.8";
1021 constexpr char listen_srv[] = "53";
1022 constexpr char host_name1[] = "ohayou.example.com.";
1023 constexpr char host_name2[] = "ciao.example.com.";
Luke Huang483cf332019-06-03 17:24:51 +08001024 const std::vector<std::string> defaultSearchDomain = {"example.com"};
1025 // The minimal timeout is 1000ms, so we can't decrease timeout
1026 // So reduce retry count.
1027 const std::vector<int> reduceRetryParams = {
1028 300, // sample validity in seconds
1029 25, // success threshod in percent
1030 8, 8, // {MIN,MAX}_SAMPLES
1031 1000, // BASE_TIMEOUT_MSEC
1032 1, // retry count
1033 };
Xiao Ma09b71022018-12-11 17:56:32 +09001034 const std::vector<DnsRecord> records0 = {
1035 {host_name1, ns_type::ns_t_aaaa, "2001:db8::5"},
1036 {host_name2, ns_type::ns_t_aaaa, "2001:db8::5"},
1037 };
1038 const std::vector<DnsRecord> records1 = {
1039 {host_name1, ns_type::ns_t_aaaa, "2001:db8::6"},
1040 {host_name2, ns_type::ns_t_aaaa, "2001:db8::6"},
1041 };
Ken Chenb9fa2062018-11-13 21:51:13 +08001042
1043 // dns0 does not respond with 100% probability, while
1044 // dns1 responds normally, at least initially.
Mike Yufc125e42019-05-15 20:41:28 +08001045 test::DNSResponder dns0(listen_addr0, listen_srv, static_cast<ns_rcode>(-1));
1046 test::DNSResponder dns1(listen_addr1, listen_srv, static_cast<ns_rcode>(-1));
Ken Chenb9fa2062018-11-13 21:51:13 +08001047 dns0.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +09001048 StartDns(dns0, records0);
1049 StartDns(dns1, records1);
Luke Huang483cf332019-06-03 17:24:51 +08001050 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr0, listen_addr1}, defaultSearchDomain,
1051 reduceRetryParams));
Ken Chenb9fa2062018-11-13 21:51:13 +08001052
Luke Huang483cf332019-06-03 17:24:51 +08001053 // Specify ai_socktype to make getaddrinfo will only query 1 time
1054 const addrinfo hints = {.ai_family = AF_INET6, .ai_socktype = SOCK_STREAM};
Ken Chenb9fa2062018-11-13 21:51:13 +08001055
1056 // dns0 will ignore the request, and we'll fallback to dns1 after the first
1057 // retry.
1058 ScopedAddrinfo result = safe_getaddrinfo(host_name1, nullptr, &hints);
1059 EXPECT_TRUE(result != nullptr);
1060 EXPECT_EQ(1U, GetNumQueries(dns0, host_name1));
1061 EXPECT_EQ(1U, GetNumQueries(dns1, host_name1));
Mike Yu532405f2020-06-17 17:46:44 +08001062 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, 0, host_name1, {"2001:db8::6"});
Ken Chenb9fa2062018-11-13 21:51:13 +08001063
1064 // Now make dns1 also ignore 100% requests... The resolve should alternate
Luke Huang483cf332019-06-03 17:24:51 +08001065 // queries between the nameservers and fail
Ken Chenb9fa2062018-11-13 21:51:13 +08001066 dns1.setResponseProbability(0.0);
1067 addrinfo* result2 = nullptr;
1068 EXPECT_EQ(EAI_NODATA, getaddrinfo(host_name2, nullptr, &hints, &result2));
1069 EXPECT_EQ(nullptr, result2);
Luke Huang483cf332019-06-03 17:24:51 +08001070 EXPECT_EQ(1U, GetNumQueries(dns0, host_name2));
1071 EXPECT_EQ(1U, GetNumQueries(dns1, host_name2));
Mike Yu532405f2020-06-17 17:46:44 +08001072 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, RCODE_TIMEOUT, host_name2, {});
Ken Chenb9fa2062018-11-13 21:51:13 +08001073}
1074
1075TEST_F(ResolverTest, GetAddrInfoV6_concurrent) {
Xiao Ma09b71022018-12-11 17:56:32 +09001076 constexpr char listen_addr0[] = "127.0.0.9";
1077 constexpr char listen_addr1[] = "127.0.0.10";
1078 constexpr char listen_addr2[] = "127.0.0.11";
1079 constexpr char host_name[] = "konbanha.example.com.";
1080
1081 test::DNSResponder dns0(listen_addr0);
1082 test::DNSResponder dns1(listen_addr1);
1083 test::DNSResponder dns2(listen_addr2);
1084 StartDns(dns0, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
1085 StartDns(dns1, {{host_name, ns_type::ns_t_aaaa, "2001:db8::6"}});
1086 StartDns(dns2, {{host_name, ns_type::ns_t_aaaa, "2001:db8::7"}});
1087
Luke Huangf8215372019-11-22 11:53:41 +08001088 const std::vector<std::string> servers = {listen_addr0, listen_addr1, listen_addr2};
Ken Chenb9fa2062018-11-13 21:51:13 +08001089 std::vector<std::thread> threads(10);
1090 for (std::thread& thread : threads) {
Luke Huangf8215372019-11-22 11:53:41 +08001091 thread = std::thread([this, &servers]() {
1092 unsigned delay = arc4random_uniform(1 * 1000 * 1000); // <= 1s
Ken Chenb9fa2062018-11-13 21:51:13 +08001093 usleep(delay);
1094 std::vector<std::string> serverSubset;
1095 for (const auto& server : servers) {
1096 if (arc4random_uniform(2)) {
1097 serverSubset.push_back(server);
1098 }
1099 }
1100 if (serverSubset.empty()) serverSubset = servers;
Xiao Ma09b71022018-12-11 17:56:32 +09001101 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(serverSubset));
1102 const addrinfo hints = {.ai_family = AF_INET6};
Ken Chenb9fa2062018-11-13 21:51:13 +08001103 addrinfo* result = nullptr;
1104 int rv = getaddrinfo("konbanha", nullptr, &hints, &result);
1105 EXPECT_EQ(0, rv) << "error [" << rv << "] " << gai_strerror(rv);
1106 if (result) {
1107 freeaddrinfo(result);
1108 result = nullptr;
1109 }
1110 });
1111 }
1112 for (std::thread& thread : threads) {
1113 thread.join();
1114 }
Ken Chen92bed612018-12-22 21:46:55 +08001115
1116 std::vector<std::string> res_servers;
1117 std::vector<std::string> res_domains;
1118 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001119 res_params res_params;
Ken Chen92bed612018-12-22 21:46:55 +08001120 std::vector<ResolverStats> res_stats;
1121 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001122 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1123 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1124 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chen92bed612018-12-22 21:46:55 +08001125 EXPECT_EQ(0, wait_for_pending_req_timeout_count);
Ken Chenb9fa2062018-11-13 21:51:13 +08001126}
1127
Mike Yu8ac63402019-12-02 15:28:38 +08001128TEST_F(ResolverTest, SkipBadServersDueToInternalError) {
Mike Yu61d17262020-02-15 18:56:22 +08001129 const std::string kSortNameserversFlag("persist.device_config.netd_native.sort_nameservers");
Mike Yu8ac63402019-12-02 15:28:38 +08001130 constexpr char listen_addr1[] = "fe80::1";
1131 constexpr char listen_addr2[] = "255.255.255.255";
1132 constexpr char listen_addr3[] = "127.0.0.3";
Mike Yu61d17262020-02-15 18:56:22 +08001133 int counter = 0; // To generate unique hostnames.
Mike Yu8ac63402019-12-02 15:28:38 +08001134 test::DNSResponder dns(listen_addr3);
1135 ASSERT_TRUE(dns.startServer());
1136
Mike Yu61d17262020-02-15 18:56:22 +08001137 ResolverParamsParcel setupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1138 setupParams.servers = {listen_addr1, listen_addr2, listen_addr3};
1139 setupParams.minSamples = 2; // Recognize bad servers in two attempts when sorting not enabled.
Mike Yu8ac63402019-12-02 15:28:38 +08001140
Mike Yu61d17262020-02-15 18:56:22 +08001141 ResolverParamsParcel cleanupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1142 cleanupParams.servers.clear();
1143 cleanupParams.tlsServers.clear();
Mike Yu8ac63402019-12-02 15:28:38 +08001144
Mike Yu61d17262020-02-15 18:56:22 +08001145 for (const auto& sortNameserversFlag : {"" /* unset */, "0" /* off */, "1" /* on */}) {
1146 SCOPED_TRACE(fmt::format("sortNameversFlag_{}", sortNameserversFlag));
1147 ScopedSystemProperties scopedSystemProperties(kSortNameserversFlag, sortNameserversFlag);
1148
1149 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(setupParams));
1150
1151 // Start sending synchronized querying.
1152 for (int i = 0; i < 100; i++) {
1153 std::string hostName = StringPrintf("hello%d.com.", counter++);
1154 dns.addMapping(hostName, ns_type::ns_t_a, "1.2.3.4");
1155 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1156 EXPECT_TRUE(safe_getaddrinfo(hostName.c_str(), nullptr, &hints) != nullptr);
1157 }
1158
1159 const std::vector<NameserverStats> targetStats = {
1160 NameserverStats(listen_addr1).setInternalErrors(5),
1161 NameserverStats(listen_addr2).setInternalErrors(5),
1162 NameserverStats(listen_addr3).setSuccesses(setupParams.maxSamples),
1163 };
1164 EXPECT_TRUE(expectStatsNotGreaterThan(targetStats));
1165
1166 // Also verify the number of queries received in the server because res_stats.successes has
1167 // a maximum.
1168 EXPECT_EQ(dns.queries().size(), 100U);
1169
1170 // Reset the state.
1171 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(cleanupParams));
1172 dns.clearQueries();
Mike Yu8ac63402019-12-02 15:28:38 +08001173 }
Mike Yu8ac63402019-12-02 15:28:38 +08001174}
1175
1176TEST_F(ResolverTest, SkipBadServersDueToTimeout) {
Mike Yu61d17262020-02-15 18:56:22 +08001177 const std::string kSortNameserversFlag("persist.device_config.netd_native.sort_nameservers");
Mike Yu8ac63402019-12-02 15:28:38 +08001178 constexpr char listen_addr1[] = "127.0.0.3";
1179 constexpr char listen_addr2[] = "127.0.0.4";
Mike Yu61d17262020-02-15 18:56:22 +08001180 int counter = 0; // To generate unique hostnames.
1181
1182 ResolverParamsParcel setupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1183 setupParams.servers = {listen_addr1, listen_addr2};
1184 setupParams.minSamples = 2; // Recognize bad servers in two attempts when sorting not enabled.
1185
1186 ResolverParamsParcel cleanupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1187 cleanupParams.servers.clear();
1188 cleanupParams.tlsServers.clear();
Mike Yu8ac63402019-12-02 15:28:38 +08001189
1190 // Set dns1 non-responsive and dns2 workable.
1191 test::DNSResponder dns1(listen_addr1, test::kDefaultListenService, static_cast<ns_rcode>(-1));
1192 test::DNSResponder dns2(listen_addr2);
1193 dns1.setResponseProbability(0.0);
1194 ASSERT_TRUE(dns1.startServer());
1195 ASSERT_TRUE(dns2.startServer());
1196
Mike Yu61d17262020-02-15 18:56:22 +08001197 for (const auto& sortNameserversFlag : {"" /* unset */, "0" /* off */, "1" /* on */}) {
1198 SCOPED_TRACE(fmt::format("sortNameversFlag_{}", sortNameserversFlag));
1199 ScopedSystemProperties scopedSystemProperties(kSortNameserversFlag, sortNameserversFlag);
Mike Yu8ac63402019-12-02 15:28:38 +08001200
Mike Yu61d17262020-02-15 18:56:22 +08001201 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(setupParams));
Mike Yu8ac63402019-12-02 15:28:38 +08001202
Mike Yu61d17262020-02-15 18:56:22 +08001203 // Start sending synchronized querying.
1204 for (int i = 0; i < 100; i++) {
1205 std::string hostName = StringPrintf("hello%d.com.", counter++);
1206 dns1.addMapping(hostName, ns_type::ns_t_a, "1.2.3.4");
1207 dns2.addMapping(hostName, ns_type::ns_t_a, "1.2.3.5");
1208 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1209 EXPECT_TRUE(safe_getaddrinfo(hostName.c_str(), nullptr, &hints) != nullptr);
1210 }
1211
1212 const std::vector<NameserverStats> targetStats = {
1213 NameserverStats(listen_addr1).setTimeouts(5),
1214 NameserverStats(listen_addr2).setSuccesses(setupParams.maxSamples),
1215 };
1216 EXPECT_TRUE(expectStatsNotGreaterThan(targetStats));
1217
1218 // Also verify the number of queries received in the server because res_stats.successes has
1219 // an upper bound.
1220 EXPECT_GT(dns1.queries().size(), 0U);
1221 EXPECT_LT(dns1.queries().size(), 5U);
1222 EXPECT_EQ(dns2.queries().size(), 100U);
1223
1224 // Reset the state.
1225 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(cleanupParams));
1226 dns1.clearQueries();
1227 dns2.clearQueries();
Mike Yu8ac63402019-12-02 15:28:38 +08001228 }
Mike Yu8ac63402019-12-02 15:28:38 +08001229}
1230
chenbrucefd837fa2019-10-29 18:35:36 +08001231TEST_F(ResolverTest, GetAddrInfoFromCustTable_InvalidInput) {
1232 constexpr char hostnameNoip[] = "noip.example.com.";
1233 constexpr char hostnameInvalidip[] = "invalidip.example.com.";
1234 const std::vector<aidl::android::net::ResolverHostsParcel> invalidCustHosts = {
1235 {"", hostnameNoip},
1236 {"wrong IP", hostnameInvalidip},
1237 };
1238 test::DNSResponder dns;
1239 StartDns(dns, {});
1240 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
Ken Chena6ac2a62020-04-07 17:25:56 +08001241 resolverParams.resolverOptions.hosts = invalidCustHosts;
chenbrucefd837fa2019-10-29 18:35:36 +08001242 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1243 for (const auto& hostname : {hostnameNoip, hostnameInvalidip}) {
1244 // The query won't get data from customized table because of invalid customized table
1245 // and DNSResponder also has no records. hostnameNoip has never registered and
1246 // hostnameInvalidip has registered but wrong IP.
1247 const addrinfo hints = {.ai_family = AF_UNSPEC};
1248 ScopedAddrinfo result = safe_getaddrinfo(hostname, nullptr, &hints);
1249 ASSERT_TRUE(result == nullptr);
1250 EXPECT_EQ(4U, GetNumQueries(dns, hostname));
1251 }
1252}
1253
1254TEST_F(ResolverTest, GetAddrInfoFromCustTable) {
1255 constexpr char hostnameV4[] = "v4only.example.com.";
1256 constexpr char hostnameV6[] = "v6only.example.com.";
1257 constexpr char hostnameV4V6[] = "v4v6.example.com.";
1258 constexpr char custAddrV4[] = "1.2.3.4";
1259 constexpr char custAddrV6[] = "::1.2.3.4";
1260 constexpr char dnsSvAddrV4[] = "1.2.3.5";
1261 constexpr char dnsSvAddrV6[] = "::1.2.3.5";
1262 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4 = {
1263 {custAddrV4, hostnameV4},
1264 };
1265 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV6 = {
1266 {custAddrV6, hostnameV6},
1267 };
1268 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4V6 = {
1269 {custAddrV4, hostnameV4V6},
1270 {custAddrV6, hostnameV4V6},
1271 };
1272 const std::vector<DnsRecord> dnsSvHostV4 = {
1273 {hostnameV4, ns_type::ns_t_a, dnsSvAddrV4},
1274 };
1275 const std::vector<DnsRecord> dnsSvHostV6 = {
1276 {hostnameV6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1277 };
1278 const std::vector<DnsRecord> dnsSvHostV4V6 = {
1279 {hostnameV4V6, ns_type::ns_t_a, dnsSvAddrV4},
1280 {hostnameV4V6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1281 };
1282 struct TestConfig {
1283 const std::string name;
1284 const std::vector<aidl::android::net::ResolverHostsParcel> customizedHosts;
1285 const std::vector<DnsRecord> dnsserverHosts;
1286 const std::vector<std::string> queryResult;
1287 std::string asParameters() const {
1288 return StringPrintf("name: %s, customizedHosts: %s, dnsserverHosts: %s", name.c_str(),
1289 customizedHosts.empty() ? "No" : "Yes",
1290 dnsserverHosts.empty() ? "No" : "Yes");
1291 }
1292 } testConfigs[]{
1293 // clang-format off
1294 {hostnameV4, {}, {}, {}},
1295 {hostnameV4, {}, dnsSvHostV4, {dnsSvAddrV4}},
1296 {hostnameV4, custHostV4, {}, {custAddrV4}},
1297 {hostnameV4, custHostV4, dnsSvHostV4, {custAddrV4}},
1298 {hostnameV6, {}, {}, {}},
1299 {hostnameV6, {}, dnsSvHostV6, {dnsSvAddrV6}},
1300 {hostnameV6, custHostV6, {}, {custAddrV6}},
1301 {hostnameV6, custHostV6, dnsSvHostV6, {custAddrV6}},
1302 {hostnameV4V6, {}, {}, {}},
1303 {hostnameV4V6, {}, dnsSvHostV4V6, {dnsSvAddrV4, dnsSvAddrV6}},
1304 {hostnameV4V6, custHostV4V6, {}, {custAddrV4, custAddrV6}},
1305 {hostnameV4V6, custHostV4V6, dnsSvHostV4V6, {custAddrV4, custAddrV6}},
1306 // clang-format on
1307 };
1308
1309 for (const auto& config : testConfigs) {
1310 SCOPED_TRACE(config.asParameters());
1311
1312 test::DNSResponder dns;
1313 StartDns(dns, config.dnsserverHosts);
1314
1315 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
Ken Chena6ac2a62020-04-07 17:25:56 +08001316 resolverParams.resolverOptions.hosts = config.customizedHosts;
chenbrucefd837fa2019-10-29 18:35:36 +08001317 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1318 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM};
1319 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
1320 if (config.customizedHosts.empty() && config.dnsserverHosts.empty()) {
1321 ASSERT_TRUE(result == nullptr);
1322 EXPECT_EQ(2U, GetNumQueries(dns, config.name.c_str()));
1323 } else {
1324 ASSERT_TRUE(result != nullptr);
1325 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(config.queryResult));
1326 EXPECT_EQ(config.customizedHosts.empty() ? 2U : 0U,
1327 GetNumQueries(dns, config.name.c_str()));
1328 }
1329
1330 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
1331 }
1332}
1333
1334TEST_F(ResolverTest, GetAddrInfoFromCustTable_Modify) {
1335 constexpr char hostnameV4V6[] = "v4v6.example.com.";
1336 constexpr char custAddrV4[] = "1.2.3.4";
1337 constexpr char custAddrV6[] = "::1.2.3.4";
1338 constexpr char dnsSvAddrV4[] = "1.2.3.5";
1339 constexpr char dnsSvAddrV6[] = "::1.2.3.5";
1340 const std::vector<DnsRecord> dnsSvHostV4V6 = {
1341 {hostnameV4V6, ns_type::ns_t_a, dnsSvAddrV4},
1342 {hostnameV4V6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1343 };
1344 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4V6 = {
1345 {custAddrV4, hostnameV4V6},
1346 {custAddrV6, hostnameV4V6},
1347 };
1348 test::DNSResponder dns;
1349 StartDns(dns, dnsSvHostV4V6);
1350 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1351
Ken Chena6ac2a62020-04-07 17:25:56 +08001352 resolverParams.resolverOptions.hosts = custHostV4V6;
chenbrucefd837fa2019-10-29 18:35:36 +08001353 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1354 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM};
1355 ScopedAddrinfo result = safe_getaddrinfo(hostnameV4V6, nullptr, &hints);
1356 ASSERT_TRUE(result != nullptr);
1357 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray({custAddrV4, custAddrV6}));
1358 EXPECT_EQ(0U, GetNumQueries(dns, hostnameV4V6));
1359
Ken Chena6ac2a62020-04-07 17:25:56 +08001360 resolverParams.resolverOptions.hosts = {};
chenbrucefd837fa2019-10-29 18:35:36 +08001361 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1362 result = safe_getaddrinfo(hostnameV4V6, nullptr, &hints);
1363 ASSERT_TRUE(result != nullptr);
1364 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray({dnsSvAddrV4, dnsSvAddrV6}));
1365 EXPECT_EQ(2U, GetNumQueries(dns, hostnameV4V6));
1366}
1367
Ken Chenb9fa2062018-11-13 21:51:13 +08001368TEST_F(ResolverTest, EmptySetup) {
Ken Chenb9fa2062018-11-13 21:51:13 +08001369 std::vector<std::string> servers;
1370 std::vector<std::string> domains;
Xiao Ma09b71022018-12-11 17:56:32 +09001371 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001372 std::vector<std::string> res_servers;
1373 std::vector<std::string> res_domains;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001374 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001375 res_params res_params;
Ken Chenb9fa2062018-11-13 21:51:13 +08001376 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +08001377 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001378 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1379 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1380 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chenb9fa2062018-11-13 21:51:13 +08001381 EXPECT_EQ(0U, res_servers.size());
1382 EXPECT_EQ(0U, res_domains.size());
Mike Yu0a1c53d2018-11-26 13:26:21 +09001383 EXPECT_EQ(0U, res_tls_servers.size());
Luke Huang5bd827c2019-03-14 16:10:04 +08001384 ASSERT_EQ(static_cast<size_t>(IDnsResolver::RESOLVER_PARAMS_COUNT), kDefaultParams.size());
1385 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY],
1386 res_params.sample_validity);
1387 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001388 res_params.success_threshold);
Luke Huang5bd827c2019-03-14 16:10:04 +08001389 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
1390 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
1391 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
Ken Chenb9fa2062018-11-13 21:51:13 +08001392 res_params.base_timeout_msec);
Luke Huang5bd827c2019-03-14 16:10:04 +08001393 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_RETRY_COUNT], res_params.retry_count);
Ken Chenb9fa2062018-11-13 21:51:13 +08001394}
1395
1396TEST_F(ResolverTest, SearchPathChange) {
Xiao Ma09b71022018-12-11 17:56:32 +09001397 constexpr char listen_addr[] = "127.0.0.13";
1398 constexpr char host_name1[] = "test13.domain1.org.";
1399 constexpr char host_name2[] = "test13.domain2.org.";
Luke Huangf8215372019-11-22 11:53:41 +08001400 std::vector<std::string> servers = {listen_addr};
1401 std::vector<std::string> domains = {"domain1.org"};
Xiao Ma09b71022018-12-11 17:56:32 +09001402
1403 const std::vector<DnsRecord> records = {
1404 {host_name1, ns_type::ns_t_aaaa, "2001:db8::13"},
1405 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1:13"},
1406 };
1407 test::DNSResponder dns(listen_addr);
1408 StartDns(dns, records);
1409 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001410
1411 const addrinfo hints = {.ai_family = AF_INET6};
1412 ScopedAddrinfo result = safe_getaddrinfo("test13", nullptr, &hints);
1413 EXPECT_TRUE(result != nullptr);
1414 EXPECT_EQ(1U, dns.queries().size());
1415 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
1416 EXPECT_EQ("2001:db8::13", ToString(result));
1417
1418 // Test that changing the domain search path on its own works.
Luke Huangf8215372019-11-22 11:53:41 +08001419 domains = {"domain2.org"};
Xiao Ma09b71022018-12-11 17:56:32 +09001420 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001421 dns.clearQueries();
1422
1423 result = safe_getaddrinfo("test13", nullptr, &hints);
1424 EXPECT_TRUE(result != nullptr);
1425 EXPECT_EQ(1U, dns.queries().size());
1426 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
1427 EXPECT_EQ("2001:db8::1:13", ToString(result));
1428}
1429
Luke Huang2dac4382019-06-24 13:28:44 +08001430namespace {
1431
Luke Huangf8215372019-11-22 11:53:41 +08001432std::vector<std::string> getResolverDomains(aidl::android::net::IDnsResolver* dnsResolverService,
Luke Huang2dac4382019-06-24 13:28:44 +08001433 unsigned netId) {
1434 std::vector<std::string> res_servers;
1435 std::vector<std::string> res_domains;
1436 std::vector<std::string> res_tls_servers;
1437 res_params res_params;
1438 std::vector<ResolverStats> res_stats;
1439 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001440 DnsResponderClient::GetResolverInfo(dnsResolverService, netId, &res_servers, &res_domains,
1441 &res_tls_servers, &res_params, &res_stats,
1442 &wait_for_pending_req_timeout_count);
Luke Huang2dac4382019-06-24 13:28:44 +08001443 return res_domains;
1444}
1445
1446} // namespace
1447
1448TEST_F(ResolverTest, SearchPathPrune) {
1449 constexpr size_t DUPLICATED_DOMAIN_NUM = 3;
1450 constexpr char listen_addr[] = "127.0.0.13";
1451 constexpr char domian_name1[] = "domain13.org.";
1452 constexpr char domian_name2[] = "domain14.org.";
1453 constexpr char host_name1[] = "test13.domain13.org.";
1454 constexpr char host_name2[] = "test14.domain14.org.";
1455 std::vector<std::string> servers = {listen_addr};
1456
1457 std::vector<std::string> testDomains1;
1458 std::vector<std::string> testDomains2;
1459 // Domain length should be <= 255
1460 // Max number of domains in search path is 6
1461 for (size_t i = 0; i < MAXDNSRCH + 1; i++) {
1462 // Fill up with invalid domain
1463 testDomains1.push_back(std::string(300, i + '0'));
1464 // Fill up with valid but duplicated domain
1465 testDomains2.push_back(StringPrintf("domain%zu.org", i % DUPLICATED_DOMAIN_NUM));
1466 }
1467
1468 // Add valid domain used for query.
1469 testDomains1.push_back(domian_name1);
1470
1471 // Add valid domain twice used for query.
1472 testDomains2.push_back(domian_name2);
1473 testDomains2.push_back(domian_name2);
1474
1475 const std::vector<DnsRecord> records = {
1476 {host_name1, ns_type::ns_t_aaaa, "2001:db8::13"},
1477 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1:13"},
1478 };
1479 test::DNSResponder dns(listen_addr);
1480 StartDns(dns, records);
1481 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, testDomains1));
1482
1483 const addrinfo hints = {.ai_family = AF_INET6};
1484 ScopedAddrinfo result = safe_getaddrinfo("test13", nullptr, &hints);
1485
1486 EXPECT_TRUE(result != nullptr);
1487
1488 EXPECT_EQ(1U, dns.queries().size());
1489 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
1490 EXPECT_EQ("2001:db8::13", ToString(result));
1491
1492 const auto& res_domains1 = getResolverDomains(mDnsClient.resolvService(), TEST_NETID);
1493 // Expect 1 valid domain, invalid domains are removed.
1494 ASSERT_EQ(1U, res_domains1.size());
1495 EXPECT_EQ(domian_name1, res_domains1[0]);
1496
1497 dns.clearQueries();
1498
1499 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, testDomains2));
1500
1501 result = safe_getaddrinfo("test14", nullptr, &hints);
1502 EXPECT_TRUE(result != nullptr);
1503
1504 // (3 domains * 2 retries) + 1 success query = 7
1505 EXPECT_EQ(7U, dns.queries().size());
1506 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
1507 EXPECT_EQ("2001:db8::1:13", ToString(result));
1508
1509 const auto& res_domains2 = getResolverDomains(mDnsClient.resolvService(), TEST_NETID);
1510 // Expect 4 valid domain, duplicate domains are removed.
1511 EXPECT_EQ(DUPLICATED_DOMAIN_NUM + 1U, res_domains2.size());
1512 EXPECT_THAT(
1513 std::vector<std::string>({"domain0.org", "domain1.org", "domain2.org", domian_name2}),
1514 testing::ElementsAreArray(res_domains2));
1515}
1516
Mike Yu0a1c53d2018-11-26 13:26:21 +09001517// If we move this function to dns_responder_client, it will complicate the dependency need of
1518// dns_tls_frontend.h.
1519static void setupTlsServers(const std::vector<std::string>& servers,
waynema0e73c2e2019-07-31 15:04:08 +08001520 std::vector<std::unique_ptr<test::DnsTlsFrontend>>* tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001521 constexpr char listen_udp[] = "53";
1522 constexpr char listen_tls[] = "853";
Mike Yu0a1c53d2018-11-26 13:26:21 +09001523
1524 for (const auto& server : servers) {
1525 auto t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
1526 t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
1527 t->startServer();
Mike Yu0a1c53d2018-11-26 13:26:21 +09001528 tls->push_back(std::move(t));
1529 }
1530}
1531
Mike Yu0a1c53d2018-11-26 13:26:21 +09001532TEST_F(ResolverTest, MaxServerPrune_Binder) {
Mike Yu0a1c53d2018-11-26 13:26:21 +09001533 std::vector<std::string> domains;
1534 std::vector<std::unique_ptr<test::DNSResponder>> dns;
1535 std::vector<std::unique_ptr<test::DnsTlsFrontend>> tls;
1536 std::vector<std::string> servers;
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001537 std::vector<DnsResponderClient::Mapping> mappings;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001538
1539 for (unsigned i = 0; i < MAXDNSRCH + 1; i++) {
1540 domains.push_back(StringPrintf("example%u.com", i));
1541 }
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001542 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupMappings(1, domains, &mappings));
1543 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupDNSServers(MAXNS + 1, mappings, &dns, &servers));
waynema0e73c2e2019-07-31 15:04:08 +08001544 ASSERT_NO_FATAL_FAILURE(setupTlsServers(servers, &tls));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001545
waynema0e73c2e2019-07-31 15:04:08 +08001546 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, domains, kDefaultParams,
1547 kDefaultPrivateDnsHostName));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001548
Mike Yu383855b2019-01-15 17:53:27 +08001549 // If the private DNS validation hasn't completed yet before backend DNS servers stop,
1550 // TLS servers will get stuck in handleOneRequest(), which causes this test stuck in
1551 // ~DnsTlsFrontend() because the TLS server loop threads can't be terminated.
1552 // So, wait for private DNS validation done before stopping backend DNS servers.
1553 for (int i = 0; i < MAXNS; i++) {
chenbruceaff85842019-05-31 15:46:42 +08001554 LOG(INFO) << "Waiting for private DNS validation on " << tls[i]->listen_address() << ".";
Mike Yu724f77d2019-08-16 11:14:50 +08001555 EXPECT_TRUE(WaitForPrivateDnsValidation(tls[i]->listen_address(), true));
chenbruceaff85842019-05-31 15:46:42 +08001556 LOG(INFO) << "private DNS validation on " << tls[i]->listen_address() << " done.";
Mike Yu383855b2019-01-15 17:53:27 +08001557 }
1558
Mike Yu0a1c53d2018-11-26 13:26:21 +09001559 std::vector<std::string> res_servers;
1560 std::vector<std::string> res_domains;
1561 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001562 res_params res_params;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001563 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +08001564 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001565 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1566 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1567 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001568
1569 // Check the size of the stats and its contents.
1570 EXPECT_EQ(static_cast<size_t>(MAXNS), res_servers.size());
1571 EXPECT_EQ(static_cast<size_t>(MAXNS), res_tls_servers.size());
1572 EXPECT_EQ(static_cast<size_t>(MAXDNSRCH), res_domains.size());
1573 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_servers.begin()));
1574 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_tls_servers.begin()));
1575 EXPECT_TRUE(std::equal(domains.begin(), domains.begin() + MAXDNSRCH, res_domains.begin()));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001576}
1577
1578TEST_F(ResolverTest, ResolverStats) {
Xiao Ma09b71022018-12-11 17:56:32 +09001579 constexpr char listen_addr1[] = "127.0.0.4";
1580 constexpr char listen_addr2[] = "127.0.0.5";
1581 constexpr char listen_addr3[] = "127.0.0.6";
Mike Yu0a1c53d2018-11-26 13:26:21 +09001582
1583 // Set server 1 timeout.
Mike Yufc125e42019-05-15 20:41:28 +08001584 test::DNSResponder dns1(listen_addr1, "53", static_cast<ns_rcode>(-1));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001585 dns1.setResponseProbability(0.0);
1586 ASSERT_TRUE(dns1.startServer());
1587
1588 // Set server 2 responding server failure.
Xiao Ma09b71022018-12-11 17:56:32 +09001589 test::DNSResponder dns2(listen_addr2);
Mike Yu0a1c53d2018-11-26 13:26:21 +09001590 dns2.setResponseProbability(0.0);
1591 ASSERT_TRUE(dns2.startServer());
1592
1593 // Set server 3 workable.
Xiao Ma09b71022018-12-11 17:56:32 +09001594 test::DNSResponder dns3(listen_addr3);
1595 dns3.addMapping(kHelloExampleCom, ns_type::ns_t_a, "1.2.3.4");
Mike Yu0a1c53d2018-11-26 13:26:21 +09001596 ASSERT_TRUE(dns3.startServer());
1597
1598 std::vector<std::string> servers = {listen_addr1, listen_addr2, listen_addr3};
Xiao Ma09b71022018-12-11 17:56:32 +09001599 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001600
1601 dns3.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +09001602 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
Mike Yu0a1c53d2018-11-26 13:26:21 +09001603 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
Xiao Ma09b71022018-12-11 17:56:32 +09001604 size_t found = GetNumQueries(dns3, kHelloExampleCom);
Mike Yu0a1c53d2018-11-26 13:26:21 +09001605 EXPECT_LE(1U, found);
1606 std::string result_str = ToString(result);
1607 EXPECT_TRUE(result_str == "1.2.3.4") << ", result_str='" << result_str << "'";
1608
Mike Yue2162e52020-03-04 18:43:46 +08001609 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1610 NameserverStats(listen_addr1).setTimeouts(1),
1611 NameserverStats(listen_addr2).setErrors(1),
1612 NameserverStats(listen_addr3).setSuccesses(1),
1613 };
Mike Yu61d17262020-02-15 18:56:22 +08001614 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001615}
1616
Mike Yu15791832020-02-11 13:38:48 +08001617TEST_F(ResolverTest, AlwaysUseLatestSetupParamsInLookups) {
1618 constexpr char listen_addr1[] = "127.0.0.3";
1619 constexpr char listen_addr2[] = "255.255.255.255";
1620 constexpr char listen_addr3[] = "127.0.0.4";
1621 constexpr char hostname[] = "hello";
1622 constexpr char fqdn_with_search_domain[] = "hello.domain2.com.";
1623
1624 test::DNSResponder dns1(listen_addr1, test::kDefaultListenService, static_cast<ns_rcode>(-1));
1625 dns1.setResponseProbability(0.0);
1626 ASSERT_TRUE(dns1.startServer());
1627
1628 test::DNSResponder dns3(listen_addr3);
1629 StartDns(dns3, {{fqdn_with_search_domain, ns_type::ns_t_a, "1.2.3.4"}});
1630
1631 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
1632 parcel.tlsServers.clear();
1633 parcel.servers = {listen_addr1, listen_addr2};
1634 parcel.domains = {"domain1.com", "domain2.com"};
1635 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1636
1637 // Expect the things happening in t1:
1638 // 1. The lookup starts using the first domain for query. It sends queries to the populated
1639 // nameserver list {listen_addr1, listen_addr2} for the hostname "hello.domain1.com".
1640 // 2. A different list of nameservers is updated to the resolver. Revision ID is incremented.
1641 // 3. The query for the hostname times out. The lookup fails to add the timeout record to the
1642 // the stats because of the unmatched revision ID.
1643 // 4. The lookup starts using the second domain for query. It sends queries to the populated
1644 // nameserver list {listen_addr3, listen_addr1, listen_addr2} for another hostname
1645 // "hello.domain2.com".
1646 // 5. The lookup gets the answer and updates a success record to the stats.
1647 std::thread t1([&hostname]() {
1648 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1649 ScopedAddrinfo result = safe_getaddrinfo(hostname, nullptr, &hints);
1650 EXPECT_NE(result.get(), nullptr);
1651 EXPECT_EQ(ToString(result), "1.2.3.4");
1652 });
1653
1654 // Wait for t1 to start the step 1.
1655 while (dns1.queries().size() == 0) {
1656 usleep(1000);
1657 }
1658
1659 // Update the resolver with three nameservers. This will increment the revision ID.
1660 parcel.servers = {listen_addr3, listen_addr1, listen_addr2};
1661 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1662
1663 t1.join();
1664 EXPECT_EQ(0U, GetNumQueriesForType(dns3, ns_type::ns_t_aaaa, fqdn_with_search_domain));
1665 EXPECT_EQ(1U, GetNumQueriesForType(dns3, ns_type::ns_t_a, fqdn_with_search_domain));
1666
Mike Yue2162e52020-03-04 18:43:46 +08001667 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1668 NameserverStats(listen_addr1),
1669 NameserverStats(listen_addr2),
1670 NameserverStats(listen_addr3).setSuccesses(1),
1671 };
Mike Yu61d17262020-02-15 18:56:22 +08001672 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu15791832020-02-11 13:38:48 +08001673}
1674
Ken Chenb9fa2062018-11-13 21:51:13 +08001675// Test what happens if the specified TLS server is nonexistent.
1676TEST_F(ResolverTest, GetHostByName_TlsMissing) {
Xiao Ma09b71022018-12-11 17:56:32 +09001677 constexpr char listen_addr[] = "127.0.0.3";
1678 constexpr char host_name[] = "tlsmissing.example.com.";
1679
1680 test::DNSResponder dns;
1681 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.3"}});
Luke Huangf8215372019-11-22 11:53:41 +08001682 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001683
1684 // There's nothing listening on this address, so validation will either fail or
1685 /// hang. Either way, queries will continue to flow to the DNSResponder.
waynema0e73c2e2019-07-31 15:04:08 +08001686 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Ken Chenb9fa2062018-11-13 21:51:13 +08001687
1688 const hostent* result;
1689
1690 result = gethostbyname("tlsmissing");
1691 ASSERT_FALSE(result == nullptr);
1692 EXPECT_EQ("1.2.3.3", ToString(result));
1693
1694 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001695 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001696}
1697
1698// Test what happens if the specified TLS server replies with garbage.
1699TEST_F(ResolverTest, GetHostByName_TlsBroken) {
Xiao Ma09b71022018-12-11 17:56:32 +09001700 constexpr char listen_addr[] = "127.0.0.3";
1701 constexpr char host_name1[] = "tlsbroken1.example.com.";
1702 constexpr char host_name2[] = "tlsbroken2.example.com.";
1703 const std::vector<DnsRecord> records = {
1704 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1705 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1706 };
1707
1708 test::DNSResponder dns;
1709 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001710 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001711
1712 // Bind the specified private DNS socket but don't respond to any client sockets yet.
1713 int s = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, IPPROTO_TCP);
1714 ASSERT_TRUE(s >= 0);
1715 struct sockaddr_in tlsServer = {
Luke Huangf8215372019-11-22 11:53:41 +08001716 .sin_family = AF_INET,
1717 .sin_port = htons(853),
Ken Chenb9fa2062018-11-13 21:51:13 +08001718 };
1719 ASSERT_TRUE(inet_pton(AF_INET, listen_addr, &tlsServer.sin_addr));
1720 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEPORT).ok());
1721 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEADDR).ok());
1722 ASSERT_FALSE(bind(s, reinterpret_cast<struct sockaddr*>(&tlsServer), sizeof(tlsServer)));
1723 ASSERT_FALSE(listen(s, 1));
1724
1725 // Trigger TLS validation.
waynema0e73c2e2019-07-31 15:04:08 +08001726 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Ken Chenb9fa2062018-11-13 21:51:13 +08001727
1728 struct sockaddr_storage cliaddr;
1729 socklen_t sin_size = sizeof(cliaddr);
Luke Huangf8215372019-11-22 11:53:41 +08001730 int new_fd = accept4(s, reinterpret_cast<struct sockaddr*>(&cliaddr), &sin_size, SOCK_CLOEXEC);
Ken Chenb9fa2062018-11-13 21:51:13 +08001731 ASSERT_TRUE(new_fd > 0);
1732
1733 // We've received the new file descriptor but not written to it or closed, so the
1734 // validation is still pending. Queries should still flow correctly because the
1735 // server is not used until validation succeeds.
1736 const hostent* result;
1737 result = gethostbyname("tlsbroken1");
1738 ASSERT_FALSE(result == nullptr);
1739 EXPECT_EQ("1.2.3.1", ToString(result));
1740
1741 // Now we cause the validation to fail.
1742 std::string garbage = "definitely not a valid TLS ServerHello";
1743 write(new_fd, garbage.data(), garbage.size());
1744 close(new_fd);
1745
1746 // Validation failure shouldn't interfere with lookups, because lookups won't be sent
1747 // to the TLS server unless validation succeeds.
1748 result = gethostbyname("tlsbroken2");
1749 ASSERT_FALSE(result == nullptr);
1750 EXPECT_EQ("1.2.3.2", ToString(result));
1751
1752 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001753 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001754 close(s);
1755}
1756
1757TEST_F(ResolverTest, GetHostByName_Tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001758 constexpr char listen_addr[] = "127.0.0.3";
1759 constexpr char listen_udp[] = "53";
1760 constexpr char listen_tls[] = "853";
1761 constexpr char host_name1[] = "tls1.example.com.";
1762 constexpr char host_name2[] = "tls2.example.com.";
1763 constexpr char host_name3[] = "tls3.example.com.";
1764 const std::vector<DnsRecord> records = {
1765 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1766 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1767 {host_name3, ns_type::ns_t_a, "1.2.3.3"},
1768 };
1769
1770 test::DNSResponder dns;
1771 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001772 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001773
1774 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1775 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001776 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08001777 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001778
Mike Yu724f77d2019-08-16 11:14:50 +08001779 const hostent* result = gethostbyname("tls1");
Ken Chenb9fa2062018-11-13 21:51:13 +08001780 ASSERT_FALSE(result == nullptr);
1781 EXPECT_EQ("1.2.3.1", ToString(result));
1782
1783 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001784 EXPECT_TRUE(tls.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001785
1786 // Stop the TLS server. Since we're in opportunistic mode, queries will
1787 // fall back to the locally-assigned (clear text) nameservers.
1788 tls.stopServer();
1789
1790 dns.clearQueries();
1791 result = gethostbyname("tls2");
1792 EXPECT_FALSE(result == nullptr);
1793 EXPECT_EQ("1.2.3.2", ToString(result));
1794 const auto queries = dns.queries();
1795 EXPECT_EQ(1U, queries.size());
waynema29253052019-08-20 11:26:08 +08001796 EXPECT_EQ("tls2.example.com.", queries[0].name);
1797 EXPECT_EQ(ns_t_a, queries[0].type);
Ken Chenb9fa2062018-11-13 21:51:13 +08001798
1799 // Reset the resolvers without enabling TLS. Queries should still be routed
1800 // to the UDP endpoint.
Xiao Ma09b71022018-12-11 17:56:32 +09001801 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001802
1803 result = gethostbyname("tls3");
1804 ASSERT_FALSE(result == nullptr);
1805 EXPECT_EQ("1.2.3.3", ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +08001806}
1807
Ken Chenb9fa2062018-11-13 21:51:13 +08001808TEST_F(ResolverTest, GetHostByName_TlsFailover) {
Xiao Ma09b71022018-12-11 17:56:32 +09001809 constexpr char listen_addr1[] = "127.0.0.3";
1810 constexpr char listen_addr2[] = "127.0.0.4";
1811 constexpr char listen_udp[] = "53";
1812 constexpr char listen_tls[] = "853";
1813 constexpr char host_name1[] = "tlsfailover1.example.com.";
1814 constexpr char host_name2[] = "tlsfailover2.example.com.";
1815 const std::vector<DnsRecord> records1 = {
1816 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1817 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1818 };
1819 const std::vector<DnsRecord> records2 = {
1820 {host_name1, ns_type::ns_t_a, "1.2.3.3"},
1821 {host_name2, ns_type::ns_t_a, "1.2.3.4"},
1822 };
1823
1824 test::DNSResponder dns1(listen_addr1);
1825 test::DNSResponder dns2(listen_addr2);
1826 StartDns(dns1, records1);
1827 StartDns(dns2, records2);
1828
Luke Huangf8215372019-11-22 11:53:41 +08001829 std::vector<std::string> servers = {listen_addr1, listen_addr2};
Ken Chenb9fa2062018-11-13 21:51:13 +08001830
1831 test::DnsTlsFrontend tls1(listen_addr1, listen_tls, listen_addr1, listen_udp);
1832 test::DnsTlsFrontend tls2(listen_addr2, listen_tls, listen_addr2, listen_udp);
1833 ASSERT_TRUE(tls1.startServer());
1834 ASSERT_TRUE(tls2.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001835 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1836 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08001837 EXPECT_TRUE(WaitForPrivateDnsValidation(tls1.listen_address(), true));
1838 EXPECT_TRUE(WaitForPrivateDnsValidation(tls2.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001839
Mike Yu724f77d2019-08-16 11:14:50 +08001840 const hostent* result = gethostbyname("tlsfailover1");
Ken Chenb9fa2062018-11-13 21:51:13 +08001841 ASSERT_FALSE(result == nullptr);
1842 EXPECT_EQ("1.2.3.1", ToString(result));
1843
1844 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001845 EXPECT_TRUE(tls1.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001846 // No new queries should have reached tls2.
Luke Huang0a0870d2020-02-12 20:41:10 +08001847 EXPECT_TRUE(tls2.waitForQueries(1));
Ken Chenb9fa2062018-11-13 21:51:13 +08001848
1849 // Stop tls1. Subsequent queries should attempt to reach tls1, fail, and retry to tls2.
1850 tls1.stopServer();
1851
1852 result = gethostbyname("tlsfailover2");
1853 EXPECT_EQ("1.2.3.4", ToString(result));
1854
1855 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001856 EXPECT_TRUE(tls2.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001857
1858 // No additional queries should have reached the insecure servers.
1859 EXPECT_EQ(2U, dns1.queries().size());
1860 EXPECT_EQ(2U, dns2.queries().size());
1861
1862 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001863 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Ken Chenb9fa2062018-11-13 21:51:13 +08001864}
1865
1866TEST_F(ResolverTest, GetHostByName_BadTlsName) {
Xiao Ma09b71022018-12-11 17:56:32 +09001867 constexpr char listen_addr[] = "127.0.0.3";
1868 constexpr char listen_udp[] = "53";
1869 constexpr char listen_tls[] = "853";
1870 constexpr char host_name[] = "badtlsname.example.com.";
1871
1872 test::DNSResponder dns;
1873 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.1"}});
Luke Huangf8215372019-11-22 11:53:41 +08001874 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001875
1876 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1877 ASSERT_TRUE(tls.startServer());
Xiao Ma09b71022018-12-11 17:56:32 +09001878 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
waynema0e73c2e2019-07-31 15:04:08 +08001879 kDefaultIncorrectPrivateDnsHostName));
Ken Chenb9fa2062018-11-13 21:51:13 +08001880
waynema0e73c2e2019-07-31 15:04:08 +08001881 // The TLS handshake would fail because the name of TLS server doesn't
1882 // match with TLS server's certificate.
Mike Yu724f77d2019-08-16 11:14:50 +08001883 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), false));
Ken Chenb9fa2062018-11-13 21:51:13 +08001884
1885 // The query should fail hard, because a name was specified.
1886 EXPECT_EQ(nullptr, gethostbyname("badtlsname"));
1887
1888 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001889 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001890}
1891
1892TEST_F(ResolverTest, GetAddrInfo_Tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001893 constexpr char listen_addr[] = "127.0.0.3";
1894 constexpr char listen_udp[] = "53";
1895 constexpr char listen_tls[] = "853";
1896 constexpr char host_name[] = "addrinfotls.example.com.";
1897 const std::vector<DnsRecord> records = {
1898 {host_name, ns_type::ns_t_a, "1.2.3.4"},
1899 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
1900 };
1901
1902 test::DNSResponder dns;
1903 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001904 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001905
1906 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1907 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001908 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1909 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08001910 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001911
1912 dns.clearQueries();
1913 ScopedAddrinfo result = safe_getaddrinfo("addrinfotls", nullptr, nullptr);
1914 EXPECT_TRUE(result != nullptr);
1915 size_t found = GetNumQueries(dns, host_name);
1916 EXPECT_LE(1U, found);
1917 // Could be A or AAAA
1918 std::string result_str = ToString(result);
1919 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +08001920 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08001921 // Wait for both A and AAAA queries to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001922 EXPECT_TRUE(tls.waitForQueries(3));
Ken Chenb9fa2062018-11-13 21:51:13 +08001923
1924 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001925 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001926}
1927
1928TEST_F(ResolverTest, TlsBypass) {
1929 const char OFF[] = "off";
1930 const char OPPORTUNISTIC[] = "opportunistic";
1931 const char STRICT[] = "strict";
1932
1933 const char GETHOSTBYNAME[] = "gethostbyname";
1934 const char GETADDRINFO[] = "getaddrinfo";
1935 const char GETADDRINFOFORNET[] = "getaddrinfofornet";
1936
1937 const unsigned BYPASS_NETID = NETID_USE_LOCAL_NAMESERVERS | TEST_NETID;
1938
Ken Chenb9fa2062018-11-13 21:51:13 +08001939 const char ADDR4[] = "192.0.2.1";
1940 const char ADDR6[] = "2001:db8::1";
1941
1942 const char cleartext_addr[] = "127.0.0.53";
1943 const char cleartext_port[] = "53";
1944 const char tls_port[] = "853";
Luke Huangf8215372019-11-22 11:53:41 +08001945 const std::vector<std::string> servers = {cleartext_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001946
Xiao Ma09b71022018-12-11 17:56:32 +09001947 test::DNSResponder dns(cleartext_addr);
Ken Chenb9fa2062018-11-13 21:51:13 +08001948 ASSERT_TRUE(dns.startServer());
1949
1950 test::DnsTlsFrontend tls(cleartext_addr, tls_port, cleartext_addr, cleartext_port);
Mike Yudd4ac2d2019-05-31 16:52:11 +08001951 ASSERT_TRUE(tls.startServer());
Ken Chenb9fa2062018-11-13 21:51:13 +08001952
Luke Huangf8215372019-11-22 11:53:41 +08001953 // clang-format off
Ken Chenb9fa2062018-11-13 21:51:13 +08001954 struct TestConfig {
1955 const std::string mode;
1956 const bool withWorkingTLS;
1957 const std::string method;
1958
1959 std::string asHostName() const {
Luke Huangf8215372019-11-22 11:53:41 +08001960 return StringPrintf("%s.%s.%s.", mode.c_str(), withWorkingTLS ? "tlsOn" : "tlsOff",
Ken Chenb9fa2062018-11-13 21:51:13 +08001961 method.c_str());
1962 }
1963 } testConfigs[]{
Ken Chenb9fa2062018-11-13 21:51:13 +08001964 {OFF, true, GETHOSTBYNAME},
1965 {OPPORTUNISTIC, true, GETHOSTBYNAME},
1966 {STRICT, true, GETHOSTBYNAME},
Ken Chenb9fa2062018-11-13 21:51:13 +08001967 {OFF, true, GETADDRINFO},
1968 {OPPORTUNISTIC, true, GETADDRINFO},
1969 {STRICT, true, GETADDRINFO},
Ken Chenb9fa2062018-11-13 21:51:13 +08001970 {OFF, true, GETADDRINFOFORNET},
1971 {OPPORTUNISTIC, true, GETADDRINFOFORNET},
1972 {STRICT, true, GETADDRINFOFORNET},
Mike Yudd4ac2d2019-05-31 16:52:11 +08001973 {OFF, false, GETHOSTBYNAME},
1974 {OPPORTUNISTIC, false, GETHOSTBYNAME},
1975 {STRICT, false, GETHOSTBYNAME},
1976 {OFF, false, GETADDRINFO},
1977 {OPPORTUNISTIC, false, GETADDRINFO},
1978 {STRICT, false, GETADDRINFO},
1979 {OFF, false, GETADDRINFOFORNET},
1980 {OPPORTUNISTIC, false, GETADDRINFOFORNET},
1981 {STRICT, false, GETADDRINFOFORNET},
Ken Chenb9fa2062018-11-13 21:51:13 +08001982 };
Luke Huangf8215372019-11-22 11:53:41 +08001983 // clang-format on
Ken Chenb9fa2062018-11-13 21:51:13 +08001984
1985 for (const auto& config : testConfigs) {
1986 const std::string testHostName = config.asHostName();
1987 SCOPED_TRACE(testHostName);
1988
1989 // Don't tempt test bugs due to caching.
1990 const char* host_name = testHostName.c_str();
1991 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
1992 dns.addMapping(host_name, ns_type::ns_t_aaaa, ADDR6);
1993
Mike Yudd4ac2d2019-05-31 16:52:11 +08001994 if (config.withWorkingTLS) {
1995 if (!tls.running()) {
1996 ASSERT_TRUE(tls.startServer());
1997 }
1998 } else {
1999 if (tls.running()) {
2000 ASSERT_TRUE(tls.stopServer());
2001 }
2002 }
Ken Chenb9fa2062018-11-13 21:51:13 +08002003
2004 if (config.mode == OFF) {
Xiao Ma09b71022018-12-11 17:56:32 +09002005 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, kDefaultSearchDomains,
2006 kDefaultParams));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09002007 } else /* OPPORTUNISTIC or STRICT */ {
2008 const char* tls_hostname = (config.mode == STRICT) ? kDefaultPrivateDnsHostName : "";
Xiao Ma09b71022018-12-11 17:56:32 +09002009 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09002010 kDefaultParams, tls_hostname));
Mike Yu724f77d2019-08-16 11:14:50 +08002011
2012 // Wait for the validation event. If the server is running, the validation should
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09002013 // succeed; otherwise, the validation should fail.
Mike Yu724f77d2019-08-16 11:14:50 +08002014 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), config.withWorkingTLS));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09002015 if (config.withWorkingTLS) {
2016 EXPECT_TRUE(tls.waitForQueries(1));
2017 tls.clearQueries();
2018 }
Ken Chenb9fa2062018-11-13 21:51:13 +08002019 }
Ken Chenb9fa2062018-11-13 21:51:13 +08002020
2021 const hostent* h_result = nullptr;
2022 ScopedAddrinfo ai_result;
2023
2024 if (config.method == GETHOSTBYNAME) {
2025 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
2026 h_result = gethostbyname(host_name);
2027
2028 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
2029 ASSERT_FALSE(h_result == nullptr);
2030 ASSERT_EQ(4, h_result->h_length);
2031 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
2032 EXPECT_EQ(ADDR4, ToString(h_result));
2033 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
2034 } else if (config.method == GETADDRINFO) {
2035 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
2036 ai_result = safe_getaddrinfo(host_name, nullptr, nullptr);
2037 EXPECT_TRUE(ai_result != nullptr);
2038
2039 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2040 // Could be A or AAAA
2041 const std::string result_str = ToString(ai_result);
2042 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
Luke Huangf8215372019-11-22 11:53:41 +08002043 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08002044 } else if (config.method == GETADDRINFOFORNET) {
2045 addrinfo* raw_ai_result = nullptr;
2046 EXPECT_EQ(0, android_getaddrinfofornet(host_name, /*servname=*/nullptr,
2047 /*hints=*/nullptr, BYPASS_NETID, MARK_UNSET,
2048 &raw_ai_result));
2049 ai_result.reset(raw_ai_result);
2050
2051 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2052 // Could be A or AAAA
2053 const std::string result_str = ToString(ai_result);
2054 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
Luke Huangf8215372019-11-22 11:53:41 +08002055 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08002056 }
2057
Mike Yudd4ac2d2019-05-31 16:52:11 +08002058 EXPECT_EQ(0, tls.queries());
Ken Chenb9fa2062018-11-13 21:51:13 +08002059
2060 // Clear per-process resolv netid.
2061 ASSERT_EQ(0, setNetworkForResolv(NETID_UNSET));
Ken Chenb9fa2062018-11-13 21:51:13 +08002062 dns.clearQueries();
2063 }
Ken Chenb9fa2062018-11-13 21:51:13 +08002064}
2065
2066TEST_F(ResolverTest, StrictMode_NoTlsServers) {
Xiao Ma09b71022018-12-11 17:56:32 +09002067 constexpr char cleartext_addr[] = "127.0.0.53";
Luke Huangf8215372019-11-22 11:53:41 +08002068 const std::vector<std::string> servers = {cleartext_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002069 constexpr char host_name[] = "strictmode.notlsips.example.com.";
2070 const std::vector<DnsRecord> records = {
2071 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2072 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2073 };
Ken Chenb9fa2062018-11-13 21:51:13 +08002074
Xiao Ma09b71022018-12-11 17:56:32 +09002075 test::DNSResponder dns(cleartext_addr);
2076 StartDns(dns, records);
Ken Chenb9fa2062018-11-13 21:51:13 +08002077
waynema0e73c2e2019-07-31 15:04:08 +08002078 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
2079 kDefaultIncorrectPrivateDnsHostName));
Ken Chenb9fa2062018-11-13 21:51:13 +08002080
2081 addrinfo* ai_result = nullptr;
2082 EXPECT_NE(0, getaddrinfo(host_name, nullptr, nullptr, &ai_result));
2083 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
2084}
Luke Huang94b10b92018-11-21 20:13:38 +08002085
2086namespace {
2087
Luke Huang70931aa2019-01-31 11:57:41 +08002088int getAsyncResponse(int fd, int* rcode, uint8_t* buf, int bufLen) {
Luke Huang94b10b92018-11-21 20:13:38 +08002089 struct pollfd wait_fd[1];
2090 wait_fd[0].fd = fd;
2091 wait_fd[0].events = POLLIN;
2092 short revents;
2093 int ret;
2094
2095 ret = poll(wait_fd, 1, -1);
2096 revents = wait_fd[0].revents;
2097 if (revents & POLLIN) {
2098 int n = resNetworkResult(fd, rcode, buf, bufLen);
Luke Huangba7bef92018-12-26 16:53:03 +08002099 // Verify that resNetworkResult() closed the fd
markchien96b09e22020-07-29 14:24:34 +08002100 char unused;
2101 EXPECT_EQ(-1, read(fd, &unused, sizeof unused));
Luke Huangba7bef92018-12-26 16:53:03 +08002102 EXPECT_EQ(EBADF, errno);
Luke Huang94b10b92018-11-21 20:13:38 +08002103 return n;
2104 }
2105 return -1;
2106}
2107
Luke Huang70931aa2019-01-31 11:57:41 +08002108std::string toString(uint8_t* buf, int bufLen, int ipType) {
Luke Huang94b10b92018-11-21 20:13:38 +08002109 ns_msg handle;
2110 int ancount, n = 0;
2111 ns_rr rr;
2112
Luke Huangf8215372019-11-22 11:53:41 +08002113 if (ns_initparse((const uint8_t*)buf, bufLen, &handle) >= 0) {
Luke Huang94b10b92018-11-21 20:13:38 +08002114 ancount = ns_msg_count(handle, ns_s_an);
2115 if (ns_parserr(&handle, ns_s_an, n, &rr) == 0) {
Luke Huang70931aa2019-01-31 11:57:41 +08002116 const uint8_t* rdata = ns_rr_rdata(rr);
Luke Huang94b10b92018-11-21 20:13:38 +08002117 char buffer[INET6_ADDRSTRLEN];
Luke Huangf8215372019-11-22 11:53:41 +08002118 if (inet_ntop(ipType, (const char*)rdata, buffer, sizeof(buffer))) {
Luke Huang94b10b92018-11-21 20:13:38 +08002119 return buffer;
2120 }
2121 }
2122 }
2123 return "";
2124}
2125
2126int dns_open_proxy() {
2127 int s = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
2128 if (s == -1) {
2129 return -1;
2130 }
2131 const int one = 1;
2132 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
2133
2134 static const struct sockaddr_un proxy_addr = {
2135 .sun_family = AF_UNIX,
2136 .sun_path = "/dev/socket/dnsproxyd",
2137 };
2138
Luke Huangf8215372019-11-22 11:53:41 +08002139 if (TEMP_FAILURE_RETRY(connect(s, (const struct sockaddr*)&proxy_addr, sizeof(proxy_addr))) !=
Luke Huang94b10b92018-11-21 20:13:38 +08002140 0) {
2141 close(s);
2142 return -1;
2143 }
2144
2145 return s;
2146}
2147
Luke Huangba7bef92018-12-26 16:53:03 +08002148void expectAnswersValid(int fd, int ipType, const std::string& expectedAnswer) {
2149 int rcode = -1;
2150 uint8_t buf[MAXPACKET] = {};
2151
2152 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2153 EXPECT_GT(res, 0);
2154 EXPECT_EQ(expectedAnswer, toString(buf, res, ipType));
2155}
2156
2157void expectAnswersNotValid(int fd, int expectedErrno) {
2158 int rcode = -1;
2159 uint8_t buf[MAXPACKET] = {};
2160
2161 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2162 EXPECT_EQ(expectedErrno, res);
2163}
2164
Luke Huang94b10b92018-11-21 20:13:38 +08002165} // namespace
2166
2167TEST_F(ResolverTest, Async_NormalQueryV4V6) {
Xiao Ma09b71022018-12-11 17:56:32 +09002168 constexpr char listen_addr[] = "127.0.0.4";
2169 constexpr char host_name[] = "howdy.example.com.";
2170 const std::vector<DnsRecord> records = {
2171 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2172 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2173 };
2174
2175 test::DNSResponder dns(listen_addr);
2176 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002177 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002178 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002179
Luke Huangba7bef92018-12-26 16:53:03 +08002180 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2181 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002182 EXPECT_TRUE(fd1 != -1);
2183 EXPECT_TRUE(fd2 != -1);
2184
Luke Huang70931aa2019-01-31 11:57:41 +08002185 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002186 int rcode;
2187 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2188 EXPECT_GT(res, 0);
2189 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
2190
2191 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2192 EXPECT_GT(res, 0);
2193 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2194
2195 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
2196
2197 // Re-query verify cache works
Luke Huangba7bef92018-12-26 16:53:03 +08002198 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2199 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002200
2201 EXPECT_TRUE(fd1 != -1);
2202 EXPECT_TRUE(fd2 != -1);
2203
2204 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2205 EXPECT_GT(res, 0);
2206 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
2207
2208 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2209 EXPECT_GT(res, 0);
2210 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2211
2212 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
2213}
2214
2215TEST_F(ResolverTest, Async_BadQuery) {
Xiao Ma09b71022018-12-11 17:56:32 +09002216 constexpr char listen_addr[] = "127.0.0.4";
2217 constexpr char host_name[] = "howdy.example.com.";
2218 const std::vector<DnsRecord> records = {
2219 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2220 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2221 };
2222
2223 test::DNSResponder dns(listen_addr);
2224 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002225 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002226 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002227
2228 static struct {
2229 int fd;
2230 const char* dname;
2231 const int queryType;
2232 const int expectRcode;
2233 } kTestData[] = {
Luke Huangba7bef92018-12-26 16:53:03 +08002234 {-1, "", ns_t_aaaa, 0},
2235 {-1, "as65ass46", ns_t_aaaa, 0},
2236 {-1, "454564564564", ns_t_aaaa, 0},
2237 {-1, "h645235", ns_t_a, 0},
2238 {-1, "www.google.com", ns_t_a, 0},
Luke Huang94b10b92018-11-21 20:13:38 +08002239 };
2240
2241 for (auto& td : kTestData) {
2242 SCOPED_TRACE(td.dname);
Luke Huangba7bef92018-12-26 16:53:03 +08002243 td.fd = resNetworkQuery(TEST_NETID, td.dname, ns_c_in, td.queryType, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002244 EXPECT_TRUE(td.fd != -1);
2245 }
2246
2247 // dns_responder return empty resp(packet only contains query part) with no error currently
2248 for (const auto& td : kTestData) {
Luke Huang70931aa2019-01-31 11:57:41 +08002249 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002250 int rcode;
2251 SCOPED_TRACE(td.dname);
2252 int res = getAsyncResponse(td.fd, &rcode, buf, MAXPACKET);
2253 EXPECT_GT(res, 0);
2254 EXPECT_EQ(rcode, td.expectRcode);
2255 }
2256}
2257
2258TEST_F(ResolverTest, Async_EmptyAnswer) {
Xiao Ma09b71022018-12-11 17:56:32 +09002259 constexpr char listen_addr[] = "127.0.0.4";
2260 constexpr char host_name[] = "howdy.example.com.";
2261 const std::vector<DnsRecord> records = {
2262 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2263 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2264 };
2265
2266 test::DNSResponder dns(listen_addr);
2267 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002268 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002269 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002270
Luke Huang9c264bb2018-12-18 16:44:41 +08002271 // TODO: Disable retry to make this test explicit.
2272 auto& cv = dns.getCv();
2273 auto& cvMutex = dns.getCvMutex();
2274 int fd1;
2275 // Wait on the condition variable to ensure that the DNS server has handled our first query.
2276 {
2277 std::unique_lock lk(cvMutex);
Luke Huangba7bef92018-12-26 16:53:03 +08002278 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang9c264bb2018-12-18 16:44:41 +08002279 EXPECT_TRUE(fd1 != -1);
2280 EXPECT_EQ(std::cv_status::no_timeout, cv.wait_for(lk, std::chrono::seconds(1)));
2281 }
Luke Huang94b10b92018-11-21 20:13:38 +08002282
Luke Huang94b10b92018-11-21 20:13:38 +08002283 dns.setResponseProbability(0.0);
Luke Huang94b10b92018-11-21 20:13:38 +08002284
Luke Huangba7bef92018-12-26 16:53:03 +08002285 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002286 EXPECT_TRUE(fd2 != -1);
2287
Luke Huangba7bef92018-12-26 16:53:03 +08002288 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002289 EXPECT_TRUE(fd3 != -1);
2290
Luke Huang9c264bb2018-12-18 16:44:41 +08002291 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002292 int rcode;
2293
Luke Huang9c264bb2018-12-18 16:44:41 +08002294 // expect no response
2295 int res = getAsyncResponse(fd3, &rcode, buf, MAXPACKET);
2296 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huang94b10b92018-11-21 20:13:38 +08002297
Luke Huang9c264bb2018-12-18 16:44:41 +08002298 // expect no response
Luke Huang94b10b92018-11-21 20:13:38 +08002299 memset(buf, 0, MAXPACKET);
Luke Huang9c264bb2018-12-18 16:44:41 +08002300 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2301 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huang94b10b92018-11-21 20:13:38 +08002302
Luke Huang94b10b92018-11-21 20:13:38 +08002303 dns.setResponseProbability(1.0);
Luke Huang94b10b92018-11-21 20:13:38 +08002304
Luke Huangba7bef92018-12-26 16:53:03 +08002305 int fd4 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002306 EXPECT_TRUE(fd4 != -1);
2307
2308 memset(buf, 0, MAXPACKET);
2309 res = getAsyncResponse(fd4, &rcode, buf, MAXPACKET);
2310 EXPECT_GT(res, 0);
2311 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2312
2313 memset(buf, 0, MAXPACKET);
2314 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2315 EXPECT_GT(res, 0);
2316 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
Mike Yu532405f2020-06-17 17:46:44 +08002317
2318 // Trailing dot is removed. Is it intended?
2319 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, 0, "howdy.example.com", {"::1.2.3.4"});
2320 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2321 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2322 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, 0, "howdy.example.com", {"1.2.3.4"});
Luke Huang94b10b92018-11-21 20:13:38 +08002323}
2324
2325TEST_F(ResolverTest, Async_MalformedQuery) {
Xiao Ma09b71022018-12-11 17:56:32 +09002326 constexpr char listen_addr[] = "127.0.0.4";
2327 constexpr char host_name[] = "howdy.example.com.";
2328 const std::vector<DnsRecord> records = {
2329 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2330 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2331 };
2332
2333 test::DNSResponder dns(listen_addr);
2334 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002335 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002336 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002337
2338 int fd = dns_open_proxy();
2339 EXPECT_TRUE(fd > 0);
2340
2341 const std::string badMsg = "16-52512#";
Xiao Ma09b71022018-12-11 17:56:32 +09002342 static const struct {
Luke Huang94b10b92018-11-21 20:13:38 +08002343 const std::string cmd;
2344 const int expectErr;
2345 } kTestData[] = {
Luke Huangba7bef92018-12-26 16:53:03 +08002346 // Too few arguments
Luke Huang94b10b92018-11-21 20:13:38 +08002347 {"resnsend " + badMsg + '\0', -EINVAL},
2348 // Bad netId
Luke Huangba7bef92018-12-26 16:53:03 +08002349 {"resnsend badnetId 0 " + badMsg + '\0', -EINVAL},
Luke Huang94b10b92018-11-21 20:13:38 +08002350 // Bad raw data
Luke Huangba7bef92018-12-26 16:53:03 +08002351 {"resnsend " + std::to_string(TEST_NETID) + " 0 " + badMsg + '\0', -EILSEQ},
Luke Huang94b10b92018-11-21 20:13:38 +08002352 };
2353
2354 for (unsigned int i = 0; i < std::size(kTestData); i++) {
2355 auto& td = kTestData[i];
2356 SCOPED_TRACE(td.cmd);
2357 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, td.cmd.c_str(), td.cmd.size()));
2358 EXPECT_EQ(rc, static_cast<ssize_t>(td.cmd.size()));
2359
2360 int32_t tmp;
2361 rc = TEMP_FAILURE_RETRY(read(fd, &tmp, sizeof(tmp)));
2362 EXPECT_TRUE(rc > 0);
2363 EXPECT_EQ(static_cast<int>(ntohl(tmp)), td.expectErr);
2364 }
2365 // Normal query with answer buffer
2366 // This is raw data of query "howdy.example.com" type 1 class 1
2367 std::string query = "81sBAAABAAAAAAAABWhvd2R5B2V4YW1wbGUDY29tAAABAAE=";
Luke Huangba7bef92018-12-26 16:53:03 +08002368 std::string cmd = "resnsend " + std::to_string(TEST_NETID) + " 0 " + query + '\0';
Luke Huang94b10b92018-11-21 20:13:38 +08002369 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
2370 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
2371
Luke Huang70931aa2019-01-31 11:57:41 +08002372 uint8_t smallBuf[1] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002373 int rcode;
2374 rc = getAsyncResponse(fd, &rcode, smallBuf, 1);
Luke Huangba7bef92018-12-26 16:53:03 +08002375 EXPECT_EQ(-EMSGSIZE, rc);
Luke Huang94b10b92018-11-21 20:13:38 +08002376
2377 // Do the normal test with large buffer again
2378 fd = dns_open_proxy();
2379 EXPECT_TRUE(fd > 0);
2380 rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
2381 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
Luke Huang70931aa2019-01-31 11:57:41 +08002382 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002383 rc = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2384 EXPECT_EQ("1.2.3.4", toString(buf, rc, AF_INET));
Mike Yu4f3747b2018-12-02 17:54:29 +09002385}
2386
Luke Huangba7bef92018-12-26 16:53:03 +08002387TEST_F(ResolverTest, Async_CacheFlags) {
Xiao Ma09b71022018-12-11 17:56:32 +09002388 constexpr char listen_addr[] = "127.0.0.4";
Luke Huang4eabbe32020-05-28 03:17:32 +08002389 constexpr char host_name1[] = "howdy.example.com.";
2390 constexpr char host_name2[] = "howdy.example2.com.";
2391 constexpr char host_name3[] = "howdy.example3.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002392 const std::vector<DnsRecord> records = {
Luke Huang4eabbe32020-05-28 03:17:32 +08002393 {host_name1, ns_type::ns_t_a, "1.2.3.4"}, {host_name1, ns_type::ns_t_aaaa, "::1.2.3.4"},
2394 {host_name2, ns_type::ns_t_a, "1.2.3.5"}, {host_name2, ns_type::ns_t_aaaa, "::1.2.3.5"},
2395 {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 +09002396 };
2397
2398 test::DNSResponder dns(listen_addr);
2399 StartDns(dns, records);
Luke Huangba7bef92018-12-26 16:53:03 +08002400 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002401 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huangba7bef92018-12-26 16:53:03 +08002402
2403 // ANDROID_RESOLV_NO_CACHE_STORE
2404 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2405 ANDROID_RESOLV_NO_CACHE_STORE);
2406 EXPECT_TRUE(fd1 != -1);
2407 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2408 ANDROID_RESOLV_NO_CACHE_STORE);
2409 EXPECT_TRUE(fd2 != -1);
2410 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2411 ANDROID_RESOLV_NO_CACHE_STORE);
2412 EXPECT_TRUE(fd3 != -1);
2413
2414 expectAnswersValid(fd3, AF_INET, "1.2.3.4");
2415 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
2416 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2417
2418 // No cache exists, expect 3 queries
Luke Huang4eabbe32020-05-28 03:17:32 +08002419 EXPECT_EQ(3U, GetNumQueries(dns, host_name1));
Luke Huangba7bef92018-12-26 16:53:03 +08002420
Luke Huang4eabbe32020-05-28 03:17:32 +08002421 // Raise a query with no flags to ensure no cache exists. Also make an cache entry for the
2422 // query.
Luke Huangba7bef92018-12-26 16:53:03 +08002423 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2424
2425 EXPECT_TRUE(fd1 != -1);
2426
2427 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2428
Luke Huang4eabbe32020-05-28 03:17:32 +08002429 // Expect 4 queries because there should be no cache before this query.
2430 EXPECT_EQ(4U, GetNumQueries(dns, host_name1));
2431
2432 // Now we have the cache entry, re-query with ANDROID_RESOLV_NO_CACHE_STORE to ensure
2433 // that ANDROID_RESOLV_NO_CACHE_STORE implied ANDROID_RESOLV_NO_CACHE_LOOKUP.
2434 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2435 ANDROID_RESOLV_NO_CACHE_STORE);
2436 EXPECT_TRUE(fd1 != -1);
2437 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2438 // Expect 5 queries because we shouldn't do cache lookup for the query which has
2439 // ANDROID_RESOLV_NO_CACHE_STORE.
2440 EXPECT_EQ(5U, GetNumQueries(dns, host_name1));
Luke Huangba7bef92018-12-26 16:53:03 +08002441
2442 // ANDROID_RESOLV_NO_CACHE_LOOKUP
2443 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2444 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2445 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2446 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2447
2448 EXPECT_TRUE(fd1 != -1);
2449 EXPECT_TRUE(fd2 != -1);
2450
2451 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
2452 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2453
Luke Huang4eabbe32020-05-28 03:17:32 +08002454 // Cache was skipped, expect 2 more queries.
2455 EXPECT_EQ(7U, GetNumQueries(dns, host_name1));
Luke Huangba7bef92018-12-26 16:53:03 +08002456
2457 // Re-query verify cache works
Luke Huang4eabbe32020-05-28 03:17:32 +08002458 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huangba7bef92018-12-26 16:53:03 +08002459 EXPECT_TRUE(fd1 != -1);
2460 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2461
Luke Huang4eabbe32020-05-28 03:17:32 +08002462 // Cache hits, expect still 7 queries
2463 EXPECT_EQ(7U, GetNumQueries(dns, host_name1));
Luke Huanga1d74182019-03-19 17:30:36 +08002464
2465 // Start to verify if ANDROID_RESOLV_NO_CACHE_LOOKUP does write response into cache
2466 dns.clearQueries();
2467
Luke Huang4eabbe32020-05-28 03:17:32 +08002468 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa,
Luke Huanga1d74182019-03-19 17:30:36 +08002469 ANDROID_RESOLV_NO_CACHE_LOOKUP);
Luke Huang4eabbe32020-05-28 03:17:32 +08002470 fd2 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa,
Luke Huanga1d74182019-03-19 17:30:36 +08002471 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2472
2473 EXPECT_TRUE(fd1 != -1);
2474 EXPECT_TRUE(fd2 != -1);
2475
Luke Huang4eabbe32020-05-28 03:17:32 +08002476 expectAnswersValid(fd2, AF_INET6, "::1.2.3.5");
2477 expectAnswersValid(fd1, AF_INET6, "::1.2.3.5");
Luke Huanga1d74182019-03-19 17:30:36 +08002478
2479 // Skip cache, expect 2 queries
Luke Huang4eabbe32020-05-28 03:17:32 +08002480 EXPECT_EQ(2U, GetNumQueries(dns, host_name2));
Luke Huanga1d74182019-03-19 17:30:36 +08002481
2482 // Re-query without flags
Luke Huang4eabbe32020-05-28 03:17:32 +08002483 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa, 0);
2484 fd2 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa, 0);
Luke Huanga1d74182019-03-19 17:30:36 +08002485
2486 EXPECT_TRUE(fd1 != -1);
2487 EXPECT_TRUE(fd2 != -1);
2488
Luke Huang4eabbe32020-05-28 03:17:32 +08002489 expectAnswersValid(fd2, AF_INET6, "::1.2.3.5");
2490 expectAnswersValid(fd1, AF_INET6, "::1.2.3.5");
Luke Huanga1d74182019-03-19 17:30:36 +08002491
2492 // Cache hits, expect still 2 queries
Luke Huang4eabbe32020-05-28 03:17:32 +08002493 EXPECT_EQ(2U, GetNumQueries(dns, host_name2));
Luke Huang40f5f492019-05-09 19:37:35 +08002494
2495 // Test both ANDROID_RESOLV_NO_CACHE_STORE and ANDROID_RESOLV_NO_CACHE_LOOKUP are set
2496 dns.clearQueries();
2497
Luke Huang4eabbe32020-05-28 03:17:32 +08002498 // Make sure that the cache of "howdy.example3.com" exists.
2499 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang40f5f492019-05-09 19:37:35 +08002500 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002501 expectAnswersValid(fd1, AF_INET6, "::1.2.3.6");
2502 EXPECT_EQ(1U, GetNumQueries(dns, host_name3));
Luke Huang40f5f492019-05-09 19:37:35 +08002503
2504 // Re-query with testFlags
2505 const int testFlag = ANDROID_RESOLV_NO_CACHE_STORE | ANDROID_RESOLV_NO_CACHE_LOOKUP;
Luke Huang4eabbe32020-05-28 03:17:32 +08002506 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_aaaa, testFlag);
Luke Huang40f5f492019-05-09 19:37:35 +08002507 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002508 expectAnswersValid(fd1, AF_INET6, "::1.2.3.6");
Luke Huang40f5f492019-05-09 19:37:35 +08002509 // Expect cache lookup is skipped.
Luke Huang4eabbe32020-05-28 03:17:32 +08002510 EXPECT_EQ(2U, GetNumQueries(dns, host_name3));
Luke Huang40f5f492019-05-09 19:37:35 +08002511
2512 // Do another query with testFlags
Luke Huang4eabbe32020-05-28 03:17:32 +08002513 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_a, testFlag);
Luke Huang40f5f492019-05-09 19:37:35 +08002514 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002515 expectAnswersValid(fd1, AF_INET, "1.2.3.6");
Luke Huang40f5f492019-05-09 19:37:35 +08002516 // Expect cache lookup is skipped.
Luke Huang4eabbe32020-05-28 03:17:32 +08002517 EXPECT_EQ(3U, GetNumQueries(dns, host_name3));
Luke Huang40f5f492019-05-09 19:37:35 +08002518
2519 // Re-query with no flags
Luke Huang4eabbe32020-05-28 03:17:32 +08002520 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_a, 0);
Luke Huang40f5f492019-05-09 19:37:35 +08002521 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002522 expectAnswersValid(fd1, AF_INET, "1.2.3.6");
Luke Huang40f5f492019-05-09 19:37:35 +08002523 // Expect no cache hit because cache storing is also skipped in previous query.
Luke Huang4eabbe32020-05-28 03:17:32 +08002524 EXPECT_EQ(4U, GetNumQueries(dns, host_name3));
Luke Huangba7bef92018-12-26 16:53:03 +08002525}
2526
Luke Huang08b13d22020-02-05 14:46:21 +08002527TEST_F(ResolverTest, Async_NoCacheStoreFlagDoesNotRefreshStaleCacheEntry) {
2528 constexpr char listen_addr[] = "127.0.0.4";
2529 constexpr char host_name[] = "howdy.example.com.";
2530 const std::vector<DnsRecord> records = {
2531 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2532 };
2533
2534 test::DNSResponder dns(listen_addr);
2535 StartDns(dns, records);
2536 std::vector<std::string> servers = {listen_addr};
2537 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
2538
2539 const unsigned SHORT_TTL_SEC = 1;
2540 dns.setTtl(SHORT_TTL_SEC);
2541
2542 // Refer to b/148842821 for the purpose of below test steps.
2543 // Basically, this test is used to ensure stale cache case is handled
2544 // correctly with ANDROID_RESOLV_NO_CACHE_STORE.
2545 int fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2546 EXPECT_TRUE(fd != -1);
2547 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2548
2549 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2550 dns.clearQueries();
2551
2552 // Wait until cache expired
2553 sleep(SHORT_TTL_SEC + 0.5);
2554
2555 // Now request the same hostname again.
2556 // We should see a new DNS query because the entry in cache has become stale.
2557 // Due to ANDROID_RESOLV_NO_CACHE_STORE, this query must *not* refresh that stale entry.
2558 fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2559 ANDROID_RESOLV_NO_CACHE_STORE);
2560 EXPECT_TRUE(fd != -1);
2561 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2562 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2563 dns.clearQueries();
2564
2565 // If the cache is still stale, we expect to see one more DNS query
2566 // (this time the cache will be refreshed, but we're not checking for it).
2567 fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2568 EXPECT_TRUE(fd != -1);
2569 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2570 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2571}
2572
Luke Huangba7bef92018-12-26 16:53:03 +08002573TEST_F(ResolverTest, Async_NoRetryFlag) {
Luke Huang70931aa2019-01-31 11:57:41 +08002574 constexpr char listen_addr0[] = "127.0.0.4";
2575 constexpr char listen_addr1[] = "127.0.0.6";
Xiao Ma09b71022018-12-11 17:56:32 +09002576 constexpr char host_name[] = "howdy.example.com.";
2577 const std::vector<DnsRecord> records = {
2578 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2579 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2580 };
2581
Luke Huang70931aa2019-01-31 11:57:41 +08002582 test::DNSResponder dns0(listen_addr0);
2583 test::DNSResponder dns1(listen_addr1);
2584 StartDns(dns0, records);
2585 StartDns(dns1, records);
2586 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr0, listen_addr1}));
Luke Huangba7bef92018-12-26 16:53:03 +08002587
Luke Huang70931aa2019-01-31 11:57:41 +08002588 dns0.clearQueries();
2589 dns1.clearQueries();
2590
2591 dns0.setResponseProbability(0.0);
2592 dns1.setResponseProbability(0.0);
Luke Huangba7bef92018-12-26 16:53:03 +08002593
2594 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2595 ANDROID_RESOLV_NO_RETRY);
2596 EXPECT_TRUE(fd1 != -1);
2597
2598 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa,
2599 ANDROID_RESOLV_NO_RETRY);
2600 EXPECT_TRUE(fd2 != -1);
2601
2602 // expect no response
2603 expectAnswersNotValid(fd1, -ETIMEDOUT);
2604 expectAnswersNotValid(fd2, -ETIMEDOUT);
Mike Yu532405f2020-06-17 17:46:44 +08002605 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2606 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
Luke Huangba7bef92018-12-26 16:53:03 +08002607
Luke Huang70931aa2019-01-31 11:57:41 +08002608 // No retry case, expect total 2 queries. The server is selected randomly.
2609 EXPECT_EQ(2U, GetNumQueries(dns0, host_name) + GetNumQueries(dns1, host_name));
Luke Huangba7bef92018-12-26 16:53:03 +08002610
Luke Huang70931aa2019-01-31 11:57:41 +08002611 dns0.clearQueries();
2612 dns1.clearQueries();
Luke Huangba7bef92018-12-26 16:53:03 +08002613
2614 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2615 EXPECT_TRUE(fd1 != -1);
2616
2617 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
2618 EXPECT_TRUE(fd2 != -1);
2619
2620 // expect no response
2621 expectAnswersNotValid(fd1, -ETIMEDOUT);
2622 expectAnswersNotValid(fd2, -ETIMEDOUT);
Mike Yu532405f2020-06-17 17:46:44 +08002623 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2624 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
Luke Huangba7bef92018-12-26 16:53:03 +08002625
2626 // Retry case, expect 4 queries
Luke Huang70931aa2019-01-31 11:57:41 +08002627 EXPECT_EQ(4U, GetNumQueries(dns0, host_name));
2628 EXPECT_EQ(4U, GetNumQueries(dns1, host_name));
2629}
2630
2631TEST_F(ResolverTest, Async_VerifyQueryID) {
2632 constexpr char listen_addr[] = "127.0.0.4";
2633 constexpr char host_name[] = "howdy.example.com.";
2634 const std::vector<DnsRecord> records = {
2635 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2636 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2637 };
2638
2639 test::DNSResponder dns(listen_addr);
2640 StartDns(dns, records);
2641 std::vector<std::string> servers = {listen_addr};
2642 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
2643
2644 const uint8_t queryBuf1[] = {
2645 /* Header */
2646 0x55, 0x66, /* Transaction ID */
2647 0x01, 0x00, /* Flags */
2648 0x00, 0x01, /* Questions */
2649 0x00, 0x00, /* Answer RRs */
2650 0x00, 0x00, /* Authority RRs */
2651 0x00, 0x00, /* Additional RRs */
2652 /* Queries */
2653 0x05, 0x68, 0x6f, 0x77, 0x64, 0x79, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
2654 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name */
2655 0x00, 0x01, /* Type */
2656 0x00, 0x01 /* Class */
2657 };
2658
2659 int fd = resNetworkSend(TEST_NETID, queryBuf1, sizeof(queryBuf1), 0);
2660 EXPECT_TRUE(fd != -1);
2661
2662 uint8_t buf[MAXPACKET] = {};
2663 int rcode;
2664
2665 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2666 EXPECT_GT(res, 0);
2667 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2668
2669 auto hp = reinterpret_cast<HEADER*>(buf);
2670 EXPECT_EQ(21862U, htons(hp->id));
2671
2672 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2673
2674 const uint8_t queryBuf2[] = {
2675 /* Header */
2676 0x00, 0x53, /* Transaction ID */
2677 0x01, 0x00, /* Flags */
2678 0x00, 0x01, /* Questions */
2679 0x00, 0x00, /* Answer RRs */
2680 0x00, 0x00, /* Authority RRs */
2681 0x00, 0x00, /* Additional RRs */
2682 /* Queries */
2683 0x05, 0x68, 0x6f, 0x77, 0x64, 0x79, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
2684 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name */
2685 0x00, 0x01, /* Type */
2686 0x00, 0x01 /* Class */
2687 };
2688
2689 // Re-query verify cache works and query id is correct
2690 fd = resNetworkSend(TEST_NETID, queryBuf2, sizeof(queryBuf2), 0);
2691
2692 EXPECT_TRUE(fd != -1);
2693
2694 res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2695 EXPECT_GT(res, 0);
2696 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2697
2698 EXPECT_EQ(0x0053U, htons(hp->id));
2699
2700 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
Luke Huangba7bef92018-12-26 16:53:03 +08002701}
2702
Mike Yu4f3747b2018-12-02 17:54:29 +09002703// This test checks that the resolver should not generate the request containing OPT RR when using
Ken Chen0a015532019-01-02 14:59:38 +08002704// cleartext DNS. If we query the DNS server not supporting EDNS0 and it reponds with
2705// FORMERR_ON_EDNS, we will fallback to no EDNS0 and try again. If the server does no response, we
2706// won't retry so that we get no answer.
Mike Yu4f3747b2018-12-02 17:54:29 +09002707TEST_F(ResolverTest, BrokenEdns) {
2708 typedef test::DNSResponder::Edns Edns;
2709 enum ExpectResult { EXPECT_FAILURE, EXPECT_SUCCESS };
2710
Mike Yu3977d482020-02-26 17:18:57 +08002711 // Perform cleartext query in off mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002712 const char OFF[] = "off";
Mike Yu3977d482020-02-26 17:18:57 +08002713
2714 // Perform cleartext query when there's no private DNS server validated in opportunistic mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002715 const char OPPORTUNISTIC_UDP[] = "opportunistic_udp";
Mike Yu3977d482020-02-26 17:18:57 +08002716
2717 // Perform cleartext query when there is a private DNS server validated in opportunistic mode.
2718 const char OPPORTUNISTIC_FALLBACK_UDP[] = "opportunistic_fallback_udp";
2719
2720 // Perform cyphertext query in opportunistic mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002721 const char OPPORTUNISTIC_TLS[] = "opportunistic_tls";
Mike Yu3977d482020-02-26 17:18:57 +08002722
2723 // Perform cyphertext query in strict mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002724 const char STRICT[] = "strict";
Mike Yu3977d482020-02-26 17:18:57 +08002725
Mike Yu4f3747b2018-12-02 17:54:29 +09002726 const char GETHOSTBYNAME[] = "gethostbyname";
2727 const char GETADDRINFO[] = "getaddrinfo";
Mike Yu4f3747b2018-12-02 17:54:29 +09002728 const char ADDR4[] = "192.0.2.1";
2729 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2730 const char CLEARTEXT_PORT[] = "53";
2731 const char TLS_PORT[] = "853";
Luke Huangf8215372019-11-22 11:53:41 +08002732 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
Mike Yu3977d482020-02-26 17:18:57 +08002733 ResolverParamsParcel paramsForCleanup = DnsResponderClient::GetDefaultResolverParamsParcel();
2734 paramsForCleanup.servers.clear();
2735 paramsForCleanup.tlsServers.clear();
Mike Yu4f3747b2018-12-02 17:54:29 +09002736
Mike Yufc125e42019-05-15 20:41:28 +08002737 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Mike Yu4f3747b2018-12-02 17:54:29 +09002738 ASSERT_TRUE(dns.startServer());
2739
2740 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2741
Luke Huangf8215372019-11-22 11:53:41 +08002742 // clang-format off
Mike Yu4f3747b2018-12-02 17:54:29 +09002743 static const struct TestConfig {
2744 std::string mode;
2745 std::string method;
2746 Edns edns;
2747 ExpectResult expectResult;
2748
2749 std::string asHostName() const {
2750 const char* ednsString;
2751 switch (edns) {
2752 case Edns::ON:
2753 ednsString = "ednsOn";
2754 break;
Ken Chen0a015532019-01-02 14:59:38 +08002755 case Edns::FORMERR_ON_EDNS:
Mike Yu4f3747b2018-12-02 17:54:29 +09002756 ednsString = "ednsFormerr";
2757 break;
2758 case Edns::DROP:
2759 ednsString = "ednsDrop";
2760 break;
2761 default:
2762 ednsString = "";
2763 break;
2764 }
2765 return StringPrintf("%s.%s.%s.", mode.c_str(), method.c_str(), ednsString);
2766 }
2767 } testConfigs[] = {
Mike Yu3977d482020-02-26 17:18:57 +08002768 // In OPPORTUNISTIC_TLS, if the DNS server doesn't support EDNS0 but TLS, the lookup
2769 // fails. Could such server exist? if so, we might need to fix it to fallback to
2770 // cleartext query. If the server still make no response for the queries with EDNS0, we
2771 // might also need to fix it to retry without EDNS0.
Mike Yu4f3747b2018-12-02 17:54:29 +09002772 // Another thing is that {OPPORTUNISTIC_TLS, Edns::DROP} and {STRICT, Edns::DROP} are
2773 // commented out since TLS timeout is not configurable.
2774 // TODO: Uncomment them after TLS timeout is configurable.
Mike Yu3977d482020-02-26 17:18:57 +08002775 {OFF, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2776 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2777 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2778 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2779 {STRICT, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2780 {OFF, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2781 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2782 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2783 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2784 {STRICT, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2785 {OFF, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2786 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2787
2788 // The failure is due to no retry on timeout. Maybe fix it?
2789 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2790
2791 //{OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2792 //{STRICT, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2793 {OFF, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2794 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2795 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2796 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2797 {STRICT, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2798 {OFF, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2799 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2800 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2801 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2802 {STRICT, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2803 {OFF, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2804 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2805
2806 // The failure is due to no retry on timeout. Maybe fix it?
2807 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2808
Mike Yu4f3747b2018-12-02 17:54:29 +09002809 //{OPPORTUNISTIC_TLS, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2810 //{STRICT, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2811 };
Luke Huangf8215372019-11-22 11:53:41 +08002812 // clang-format on
Mike Yu4f3747b2018-12-02 17:54:29 +09002813
2814 for (const auto& config : testConfigs) {
2815 const std::string testHostName = config.asHostName();
2816 SCOPED_TRACE(testHostName);
2817
2818 const char* host_name = testHostName.c_str();
2819 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
2820 dns.setEdns(config.edns);
2821
2822 if (config.mode == OFF) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002823 if (tls.running()) {
2824 ASSERT_TRUE(tls.stopServer());
2825 }
Xiao Ma09b71022018-12-11 17:56:32 +09002826 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Mike Yu4f3747b2018-12-02 17:54:29 +09002827 } else if (config.mode == OPPORTUNISTIC_UDP) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002828 if (tls.running()) {
2829 ASSERT_TRUE(tls.stopServer());
2830 }
Xiao Ma09b71022018-12-11 17:56:32 +09002831 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002832 kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002833 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), false));
Mike Yu3977d482020-02-26 17:18:57 +08002834 } else if (config.mode == OPPORTUNISTIC_TLS || config.mode == OPPORTUNISTIC_FALLBACK_UDP) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002835 if (!tls.running()) {
2836 ASSERT_TRUE(tls.startServer());
2837 }
Xiao Ma09b71022018-12-11 17:56:32 +09002838 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002839 kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002840 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Mike Yu3977d482020-02-26 17:18:57 +08002841
2842 if (config.mode == OPPORTUNISTIC_FALLBACK_UDP) {
2843 // Force the resolver to fallback to cleartext queries.
2844 ASSERT_TRUE(tls.stopServer());
2845 }
Mike Yu4f3747b2018-12-02 17:54:29 +09002846 } else if (config.mode == STRICT) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002847 if (!tls.running()) {
2848 ASSERT_TRUE(tls.startServer());
2849 }
Xiao Ma09b71022018-12-11 17:56:32 +09002850 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002851 kDefaultParams, kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08002852 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Mike Yu4f3747b2018-12-02 17:54:29 +09002853 }
2854
2855 if (config.method == GETHOSTBYNAME) {
2856 const hostent* h_result = gethostbyname(host_name);
2857 if (config.expectResult == EXPECT_SUCCESS) {
2858 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2859 ASSERT_TRUE(h_result != nullptr);
2860 ASSERT_EQ(4, h_result->h_length);
2861 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
2862 EXPECT_EQ(ADDR4, ToString(h_result));
2863 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
Mike Yu532405f2020-06-17 17:46:44 +08002864 ExpectDnsEvent(INetdEventListener::EVENT_GETHOSTBYNAME, 0, host_name, {ADDR4});
Mike Yu4f3747b2018-12-02 17:54:29 +09002865 } else {
2866 EXPECT_EQ(0U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
2867 ASSERT_TRUE(h_result == nullptr);
2868 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
Mike Yu532405f2020-06-17 17:46:44 +08002869 int returnCode = (config.edns == Edns::DROP) ? RCODE_TIMEOUT : EAI_FAIL;
2870 ExpectDnsEvent(INetdEventListener::EVENT_GETHOSTBYNAME, returnCode, host_name, {});
Mike Yu4f3747b2018-12-02 17:54:29 +09002871 }
2872 } else if (config.method == GETADDRINFO) {
2873 ScopedAddrinfo ai_result;
2874 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2875 ai_result = safe_getaddrinfo(host_name, nullptr, &hints);
2876 if (config.expectResult == EXPECT_SUCCESS) {
2877 EXPECT_TRUE(ai_result != nullptr);
2878 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2879 const std::string result_str = ToString(ai_result);
2880 EXPECT_EQ(ADDR4, result_str);
Mike Yu532405f2020-06-17 17:46:44 +08002881 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, 0, host_name, {ADDR4});
Mike Yu4f3747b2018-12-02 17:54:29 +09002882 } else {
2883 EXPECT_TRUE(ai_result == nullptr);
2884 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
Mike Yu532405f2020-06-17 17:46:44 +08002885 int returnCode = (config.edns == Edns::DROP) ? RCODE_TIMEOUT : EAI_FAIL;
2886 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, returnCode, host_name, {});
Mike Yu4f3747b2018-12-02 17:54:29 +09002887 }
2888 } else {
2889 FAIL() << "Unsupported query method: " << config.method;
2890 }
2891
Mike Yudd4ac2d2019-05-31 16:52:11 +08002892 tls.clearQueries();
Mike Yu4f3747b2018-12-02 17:54:29 +09002893 dns.clearQueries();
Mike Yu3977d482020-02-26 17:18:57 +08002894
2895 // Clear the setup to force the resolver to validate private DNS servers in every test.
2896 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(paramsForCleanup));
Mike Yu4f3747b2018-12-02 17:54:29 +09002897 }
Mike Yu4f3747b2018-12-02 17:54:29 +09002898}
nuccachena26cc2a2018-07-17 18:07:23 +08002899
Ken Chen0a015532019-01-02 14:59:38 +08002900// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2901// Resolver should have a reasonable number of retries instead of spinning forever. We don't have
2902// an efficient way to know if resolver is stuck in an infinite loop. However, test case will be
2903// failed due to timeout.
2904TEST_F(ResolverTest, UnstableTls) {
2905 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2906 const char CLEARTEXT_PORT[] = "53";
2907 const char TLS_PORT[] = "853";
2908 const char* host_name1 = "nonexistent1.example.com.";
2909 const char* host_name2 = "nonexistent2.example.com.";
2910 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
2911
Mike Yufc125e42019-05-15 20:41:28 +08002912 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Ken Chen0a015532019-01-02 14:59:38 +08002913 ASSERT_TRUE(dns.startServer());
2914 dns.setEdns(test::DNSResponder::Edns::FORMERR_ON_EDNS);
2915 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2916 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08002917 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002918 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
2919
Ken Chen0a015532019-01-02 14:59:38 +08002920 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
2921 tls.stopServer();
2922
2923 const hostent* h_result = gethostbyname(host_name1);
2924 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
2925 ASSERT_TRUE(h_result == nullptr);
2926 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2927
2928 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2929 ScopedAddrinfo ai_result = safe_getaddrinfo(host_name2, nullptr, &hints);
2930 EXPECT_TRUE(ai_result == nullptr);
2931 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
2932}
2933
2934// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2935// Moreover, server responds RCODE=FORMERR even on non-EDNS query.
2936TEST_F(ResolverTest, BogusDnsServer) {
2937 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2938 const char CLEARTEXT_PORT[] = "53";
2939 const char TLS_PORT[] = "853";
2940 const char* host_name1 = "nonexistent1.example.com.";
2941 const char* host_name2 = "nonexistent2.example.com.";
2942 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
2943
Mike Yufc125e42019-05-15 20:41:28 +08002944 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Ken Chen0a015532019-01-02 14:59:38 +08002945 ASSERT_TRUE(dns.startServer());
2946 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2947 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08002948 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002949 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
2950
Ken Chen0a015532019-01-02 14:59:38 +08002951 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
2952 tls.stopServer();
2953 dns.setEdns(test::DNSResponder::Edns::FORMERR_UNCOND);
2954
2955 const hostent* h_result = gethostbyname(host_name1);
2956 EXPECT_EQ(0U, GetNumQueries(dns, host_name1));
2957 ASSERT_TRUE(h_result == nullptr);
2958 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2959
2960 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2961 ScopedAddrinfo ai_result = safe_getaddrinfo(host_name2, nullptr, &hints);
2962 EXPECT_TRUE(ai_result == nullptr);
2963 EXPECT_EQ(0U, GetNumQueries(dns, host_name2));
2964}
2965
nuccachena26cc2a2018-07-17 18:07:23 +08002966TEST_F(ResolverTest, GetAddrInfo_Dns64Synthesize) {
2967 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002968 constexpr char dns64_name[] = "ipv4only.arpa.";
2969 constexpr char host_name[] = "v4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002970 const std::vector<DnsRecord> records = {
2971 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2972 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2973 };
nuccachena26cc2a2018-07-17 18:07:23 +08002974
Xiao Ma09b71022018-12-11 17:56:32 +09002975 test::DNSResponder dns(listen_addr);
Xiao Ma09b71022018-12-11 17:56:32 +09002976 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002977
2978 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 // hints are necessary in order to let netd know which type of addresses the caller is
2986 // interested in.
Xiao Ma09b71022018-12-11 17:56:32 +09002987 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08002988 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
2989 EXPECT_TRUE(result != nullptr);
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002990 // TODO: BUG: there should only be two queries, one AAAA (which returns no records) and one A
2991 // (which returns 1.2.3.4). But there is an extra AAAA.
2992 EXPECT_EQ(3U, GetNumQueries(dns, host_name));
nuccachena26cc2a2018-07-17 18:07:23 +08002993
2994 std::string result_str = ToString(result);
2995 EXPECT_EQ(result_str, "64:ff9b::102:304");
2996
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002997 // Stopping NAT64 prefix discovery disables synthesis.
Luke Huang5bd827c2019-03-14 16:10:04 +08002998 EXPECT_TRUE(mDnsClient.resolvService()->stopPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002999 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_NOT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003000
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003001 dns.clearQueries();
nuccachena26cc2a2018-07-17 18:07:23 +08003002
3003 result = safe_getaddrinfo("v4only", nullptr, &hints);
3004 EXPECT_TRUE(result != nullptr);
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003005 // TODO: BUG: there should only be one query, an AAAA (which returns no records), because the
3006 // A is already cached. But there is an extra AAAA.
3007 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
nuccachena26cc2a2018-07-17 18:07:23 +08003008
3009 result_str = ToString(result);
3010 EXPECT_EQ(result_str, "1.2.3.4");
3011}
3012
nuccachena26cc2a2018-07-17 18:07:23 +08003013TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecified) {
3014 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003015 constexpr char dns64_name[] = "ipv4only.arpa.";
3016 constexpr char host_name[] = "v4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003017 const std::vector<DnsRecord> records = {
3018 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3019 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3020 };
nuccachena26cc2a2018-07-17 18:07:23 +08003021
Xiao Ma09b71022018-12-11 17:56:32 +09003022 test::DNSResponder dns(listen_addr);
3023 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003024 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003025 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003026
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003027 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003028 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003029 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003030
3031 // Ensure to synthesize AAAA if AF_INET6 is specified, and not to synthesize AAAA
3032 // in AF_INET case.
3033 addrinfo hints;
3034 memset(&hints, 0, sizeof(hints));
3035 hints.ai_family = AF_INET6;
3036 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
3037 EXPECT_TRUE(result != nullptr);
3038 std::string result_str = ToString(result);
3039 EXPECT_EQ(result_str, "64:ff9b::102:304");
3040
3041 hints.ai_family = AF_INET;
3042 result = safe_getaddrinfo("v4only", nullptr, &hints);
3043 EXPECT_TRUE(result != nullptr);
3044 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3045 result_str = ToString(result);
3046 EXPECT_EQ(result_str, "1.2.3.4");
3047}
nuccachena26cc2a2018-07-17 18:07:23 +08003048
3049TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedV6) {
3050 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003051 constexpr char dns64_name[] = "ipv4only.arpa.";
3052 constexpr char host_name[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003053 const std::vector<DnsRecord> records = {
3054 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3055 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3056 {host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
3057 };
nuccachena26cc2a2018-07-17 18:07:23 +08003058
Xiao Ma09b71022018-12-11 17:56:32 +09003059 test::DNSResponder dns(listen_addr);
3060 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003061 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003062 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003063
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003064 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003065 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003066 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003067
Xiao Ma09b71022018-12-11 17:56:32 +09003068 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08003069 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
3070 EXPECT_TRUE(result != nullptr);
3071 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3072
3073 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
Xiao Ma09b71022018-12-11 17:56:32 +09003074 const std::vector<std::string> result_strs = ToStrings(result);
nuccachena26cc2a2018-07-17 18:07:23 +08003075 for (const auto& str : result_strs) {
3076 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
3077 << ", result_str='" << str << "'";
3078 }
3079}
3080
3081TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedNoV6) {
3082 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003083 constexpr char dns64_name[] = "ipv4only.arpa.";
3084 constexpr char host_name[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003085 const std::vector<DnsRecord> records = {
3086 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3087 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3088 };
nuccachena26cc2a2018-07-17 18:07:23 +08003089
Xiao Ma09b71022018-12-11 17:56:32 +09003090 test::DNSResponder dns(listen_addr);
3091 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003092 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003093 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003094
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003095 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003096 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003097 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003098
Xiao Ma09b71022018-12-11 17:56:32 +09003099 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08003100 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
3101 EXPECT_TRUE(result != nullptr);
3102 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3103
3104 // In AF_UNSPEC case, synthesize AAAA if there's no AAAA answer.
3105 std::string result_str = ToString(result);
3106 EXPECT_EQ(result_str, "64:ff9b::102:304");
3107}
3108
3109TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecialUseIPv4Addresses) {
3110 constexpr char THIS_NETWORK[] = "this_network";
3111 constexpr char LOOPBACK[] = "loopback";
3112 constexpr char LINK_LOCAL[] = "link_local";
3113 constexpr char MULTICAST[] = "multicast";
3114 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
3115
3116 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
3117 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
3118 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
3119 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
3120 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
3121
3122 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003123 constexpr char dns64_name[] = "ipv4only.arpa.";
3124
Xiao Ma09b71022018-12-11 17:56:32 +09003125 test::DNSResponder dns(listen_addr);
3126 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003127 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003128 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003129
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003130 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003131 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003132 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003133
Luke Huangf8215372019-11-22 11:53:41 +08003134 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003135 static const struct TestConfig {
3136 std::string name;
3137 std::string addr;
3138
3139 std::string asHostName() const { return StringPrintf("%s.example.com.", name.c_str()); }
3140 } testConfigs[]{
3141 {THIS_NETWORK, ADDR_THIS_NETWORK},
3142 {LOOPBACK, ADDR_LOOPBACK},
3143 {LINK_LOCAL, ADDR_LINK_LOCAL},
3144 {MULTICAST, ADDR_MULTICAST},
3145 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
3146 };
Luke Huangf8215372019-11-22 11:53:41 +08003147 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003148
3149 for (const auto& config : testConfigs) {
3150 const std::string testHostName = config.asHostName();
3151 SCOPED_TRACE(testHostName);
3152
3153 const char* host_name = testHostName.c_str();
3154 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
3155
3156 addrinfo hints;
3157 memset(&hints, 0, sizeof(hints));
3158 hints.ai_family = AF_INET6;
3159 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
3160 // In AF_INET6 case, don't return IPv4 answers
3161 EXPECT_TRUE(result == nullptr);
3162 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3163 dns.clearQueries();
3164
3165 memset(&hints, 0, sizeof(hints));
3166 hints.ai_family = AF_UNSPEC;
3167 result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
3168 EXPECT_TRUE(result != nullptr);
3169 // Expect IPv6 query only. IPv4 answer has been cached in previous query.
3170 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3171 // In AF_UNSPEC case, don't synthesize special use IPv4 address.
3172 std::string result_str = ToString(result);
3173 EXPECT_EQ(result_str, config.addr.c_str());
3174 dns.clearQueries();
3175 }
3176}
3177
3178TEST_F(ResolverTest, GetAddrInfo_Dns64QueryWithNullArgumentHints) {
3179 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003180 constexpr char dns64_name[] = "ipv4only.arpa.";
3181 constexpr char host_name[] = "v4only.example.com.";
3182 constexpr char host_name2[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003183 const std::vector<DnsRecord> records = {
3184 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3185 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3186 {host_name2, ns_type::ns_t_a, "1.2.3.4"},
3187 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
3188 };
nuccachena26cc2a2018-07-17 18:07:23 +08003189
Xiao Ma09b71022018-12-11 17:56:32 +09003190 test::DNSResponder dns(listen_addr);
3191 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003192 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003193 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003194
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003195 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003196 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003197 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003198
3199 // Assign argument hints of getaddrinfo() as null is equivalent to set ai_family AF_UNSPEC.
3200 // In AF_UNSPEC case, synthesize AAAA if there has A answer only.
3201 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, nullptr);
3202 EXPECT_TRUE(result != nullptr);
3203 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3204 std::string result_str = ToString(result);
3205 EXPECT_EQ(result_str, "64:ff9b::102:304");
3206 dns.clearQueries();
3207
3208 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
3209 result = safe_getaddrinfo("v4v6", nullptr, nullptr);
3210 EXPECT_TRUE(result != nullptr);
3211 EXPECT_LE(2U, GetNumQueries(dns, host_name2));
3212 std::vector<std::string> result_strs = ToStrings(result);
3213 for (const auto& str : result_strs) {
3214 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
3215 << ", result_str='" << str << "'";
3216 }
3217}
3218
3219TEST_F(ResolverTest, GetAddrInfo_Dns64QueryNullArgumentNode) {
3220 constexpr char ADDR_ANYADDR_V4[] = "0.0.0.0";
3221 constexpr char ADDR_ANYADDR_V6[] = "::";
3222 constexpr char ADDR_LOCALHOST_V4[] = "127.0.0.1";
3223 constexpr char ADDR_LOCALHOST_V6[] = "::1";
3224
3225 constexpr char PORT_NAME_HTTP[] = "http";
3226 constexpr char PORT_NUMBER_HTTP[] = "80";
3227
3228 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003229 constexpr char dns64_name[] = "ipv4only.arpa.";
3230
Xiao Ma09b71022018-12-11 17:56:32 +09003231 test::DNSResponder dns(listen_addr);
3232 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003233 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003234 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003235
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003236 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003237 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003238 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003239
Luke Huangf8215372019-11-22 11:53:41 +08003240 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003241 // If node is null, return address is listed by libc/getaddrinfo.c as follows.
3242 // - passive socket -> anyaddr (0.0.0.0 or ::)
3243 // - non-passive socket -> localhost (127.0.0.1 or ::1)
3244 static const struct TestConfig {
3245 int flag;
3246 std::string addr_v4;
3247 std::string addr_v6;
3248
3249 std::string asParameters() const {
3250 return StringPrintf("flag=%d, addr_v4=%s, addr_v6=%s", flag, addr_v4.c_str(),
3251 addr_v6.c_str());
3252 }
3253 } testConfigs[]{
3254 {0 /* non-passive */, ADDR_LOCALHOST_V4, ADDR_LOCALHOST_V6},
3255 {AI_PASSIVE, ADDR_ANYADDR_V4, ADDR_ANYADDR_V6}
3256 };
Luke Huangf8215372019-11-22 11:53:41 +08003257 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003258
3259 for (const auto& config : testConfigs) {
3260 SCOPED_TRACE(config.asParameters());
3261
Xiao Ma09b71022018-12-11 17:56:32 +09003262 addrinfo hints = {
Nick Desaulnierscd6395a2019-10-11 09:15:24 -07003263 .ai_flags = config.flag,
Xiao Ma09b71022018-12-11 17:56:32 +09003264 .ai_family = AF_UNSPEC, // any address family
3265 .ai_socktype = 0, // any type
3266 .ai_protocol = 0, // any protocol
Xiao Ma09b71022018-12-11 17:56:32 +09003267 };
nuccachena26cc2a2018-07-17 18:07:23 +08003268
3269 // Assign hostname as null and service as port name.
3270 ScopedAddrinfo result = safe_getaddrinfo(nullptr, PORT_NAME_HTTP, &hints);
3271 ASSERT_TRUE(result != nullptr);
3272
3273 // Can't be synthesized because it should not get into Netd.
3274 std::vector<std::string> result_strs = ToStrings(result);
3275 for (const auto& str : result_strs) {
3276 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
3277 << ", result_str='" << str << "'";
3278 }
3279
3280 // Assign hostname as null and service as numeric port number.
3281 hints.ai_flags = config.flag | AI_NUMERICSERV;
3282 result = safe_getaddrinfo(nullptr, PORT_NUMBER_HTTP, &hints);
3283 ASSERT_TRUE(result != nullptr);
3284
3285 // Can't be synthesized because it should not get into Netd.
3286 result_strs = ToStrings(result);
3287 for (const auto& str : result_strs) {
3288 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
3289 << ", result_str='" << str << "'";
3290 }
3291 }
3292}
3293
3294TEST_F(ResolverTest, GetHostByAddr_ReverseDnsQueryWithHavingNat64Prefix) {
3295 struct hostent* result = nullptr;
3296 struct in_addr v4addr;
3297 struct in6_addr v6addr;
3298
3299 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003300 constexpr char dns64_name[] = "ipv4only.arpa.";
3301 constexpr char ptr_name[] = "v4v6.example.com.";
3302 // PTR record for IPv4 address 1.2.3.4
3303 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3304 // PTR record for IPv6 address 2001:db8::102:304
3305 constexpr char ptr_addr_v6[] =
3306 "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 +09003307 const std::vector<DnsRecord> records = {
3308 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3309 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3310 {ptr_addr_v6, ns_type::ns_t_ptr, ptr_name},
3311 };
nuccachena26cc2a2018-07-17 18:07:23 +08003312
Xiao Ma09b71022018-12-11 17:56:32 +09003313 test::DNSResponder dns(listen_addr);
3314 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003315 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003316 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003317
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003318 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003319 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003320 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003321
3322 // Reverse IPv4 DNS query. Prefix should have no effect on it.
3323 inet_pton(AF_INET, "1.2.3.4", &v4addr);
3324 result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
3325 ASSERT_TRUE(result != nullptr);
3326 std::string result_str = result->h_name ? result->h_name : "null";
3327 EXPECT_EQ(result_str, "v4v6.example.com");
3328
3329 // Reverse IPv6 DNS query. Prefix should have no effect on it.
3330 inet_pton(AF_INET6, "2001:db8::102:304", &v6addr);
3331 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3332 ASSERT_TRUE(result != nullptr);
3333 result_str = result->h_name ? result->h_name : "null";
3334 EXPECT_EQ(result_str, "v4v6.example.com");
3335}
3336
3337TEST_F(ResolverTest, GetHostByAddr_ReverseDns64Query) {
3338 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003339 constexpr char dns64_name[] = "ipv4only.arpa.";
3340 constexpr char ptr_name[] = "v4only.example.com.";
3341 // PTR record for IPv4 address 1.2.3.4
3342 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3343 // PTR record for IPv6 address 64:ff9b::1.2.3.4
3344 constexpr char ptr_addr_v6_nomapping[] =
3345 "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.";
3346 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
3347 // PTR record for IPv6 address 64:ff9b::5.6.7.8
3348 constexpr char ptr_addr_v6_synthesis[] =
3349 "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 +09003350 const std::vector<DnsRecord> records = {
3351 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3352 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3353 {ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis},
3354 };
nuccachena26cc2a2018-07-17 18:07:23 +08003355
Xiao Ma09b71022018-12-11 17:56:32 +09003356 test::DNSResponder dns(listen_addr);
3357 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003358 // "ptr_addr_v6_nomapping" is not mapped in DNS server
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 // Synthesized PTR record doesn't exist on DNS server
3367 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
3368 // After querying synthesized address failed, expect that prefix is removed from IPv6
3369 // synthesized address and do reverse IPv4 query instead.
3370 struct in6_addr v6addr;
3371 inet_pton(AF_INET6, "64:ff9b::1.2.3.4", &v6addr);
3372 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3373 ASSERT_TRUE(result != nullptr);
3374 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist
3375 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist
3376 std::string result_str = result->h_name ? result->h_name : "null";
3377 EXPECT_EQ(result_str, "v4only.example.com");
3378 // Check that return address has been mapped from IPv4 to IPv6 address because Netd
3379 // removes NAT64 prefix and does IPv4 DNS reverse lookup in this case. Then, Netd
3380 // fakes the return IPv4 address as original queried IPv6 address.
3381 result_str = ToString(result);
3382 EXPECT_EQ(result_str, "64:ff9b::102:304");
3383 dns.clearQueries();
3384
3385 // Synthesized PTR record exists on DNS server
3386 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
3387 // Expect to Netd pass through synthesized address for DNS queries.
3388 inet_pton(AF_INET6, "64:ff9b::5.6.7.8", &v6addr);
3389 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3390 ASSERT_TRUE(result != nullptr);
3391 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
3392 result_str = result->h_name ? result->h_name : "null";
3393 EXPECT_EQ(result_str, "v6synthesis.example.com");
3394}
3395
3396TEST_F(ResolverTest, GetHostByAddr_ReverseDns64QueryFromHostFile) {
3397 constexpr char dns64_name[] = "ipv4only.arpa.";
3398 constexpr char host_name[] = "localhost";
3399 // The address is synthesized by prefix64:localhost.
3400 constexpr char host_addr[] = "64:ff9b::7f00:1";
nuccachena26cc2a2018-07-17 18:07:23 +08003401 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003402
3403 test::DNSResponder dns(listen_addr);
3404 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003405 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003406 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003407
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003408 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003409 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003410 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003411
3412 // Using synthesized "localhost" address to be a trick for resolving host name
3413 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
3414 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
3415 struct in6_addr v6addr;
3416 inet_pton(AF_INET6, host_addr, &v6addr);
3417 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3418 ASSERT_TRUE(result != nullptr);
3419 // Expect no DNS queries; localhost is resolved via /etc/hosts.
3420 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
3421
Luke Huangf8215372019-11-22 11:53:41 +08003422 ASSERT_EQ(sizeof(in6_addr), (unsigned)result->h_length);
nuccachena26cc2a2018-07-17 18:07:23 +08003423 ASSERT_EQ(AF_INET6, result->h_addrtype);
3424 std::string result_str = ToString(result);
3425 EXPECT_EQ(result_str, host_addr);
3426 result_str = result->h_name ? result->h_name : "null";
3427 EXPECT_EQ(result_str, host_name);
3428}
3429
Hungming Chen9e6185a2019-06-04 16:09:19 +08003430TEST_F(ResolverTest, GetHostByAddr_cnamesClasslessReverseDelegation) {
3431 // IPv4 addresses in the subnet with notation '/' or '-'.
3432 constexpr char addr_slash[] = "192.0.2.1";
3433 constexpr char addr_hyphen[] = "192.0.3.1";
3434
3435 // Used to verify DNS reverse query for classless reverse lookup zone. See detail in RFC 2317
3436 // section 4.
3437 const static std::vector<DnsRecord> records = {
3438 // The records for reverse querying "192.0.2.1" in the subnet with notation '/'.
3439 {"1.2.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0/25.2.0.192.in-addr.arpa."},
3440 {"1.0/25.2.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3441
3442 // The records for reverse querying "192.0.3.1" in the subnet with notation '-'.
3443 {"1.3.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0-127.3.0.192.in-addr.arpa."},
3444 {"1.0-127.3.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3445 };
3446
3447 test::DNSResponder dns;
3448 StartDns(dns, records);
3449 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3450
3451 for (const auto& address : {addr_slash, addr_hyphen}) {
3452 SCOPED_TRACE(address);
3453
3454 in_addr v4addr;
3455 ASSERT_TRUE(inet_pton(AF_INET, address, &v4addr));
3456 hostent* result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
3457 ASSERT_TRUE(result != nullptr);
3458 EXPECT_STREQ("hello.example.com", result->h_name);
3459 }
3460}
3461
nuccachena26cc2a2018-07-17 18:07:23 +08003462TEST_F(ResolverTest, GetNameInfo_ReverseDnsQueryWithHavingNat64Prefix) {
3463 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003464 constexpr char dns64_name[] = "ipv4only.arpa.";
3465 constexpr char ptr_name[] = "v4v6.example.com.";
3466 // PTR record for IPv4 address 1.2.3.4
3467 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3468 // PTR record for IPv6 address 2001:db8::102:304
3469 constexpr char ptr_addr_v6[] =
3470 "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 +09003471 const std::vector<DnsRecord> records = {
3472 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3473 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3474 {ptr_addr_v6, ns_type::ns_t_ptr, ptr_name},
3475 };
nuccachena26cc2a2018-07-17 18:07:23 +08003476
Xiao Ma09b71022018-12-11 17:56:32 +09003477 test::DNSResponder dns(listen_addr);
3478 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003479 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003480 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003481
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003482 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003483 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003484 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003485
Luke Huangf8215372019-11-22 11:53:41 +08003486 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003487 static const struct TestConfig {
3488 int flag;
3489 int family;
3490 std::string addr;
3491 std::string host;
3492
3493 std::string asParameters() const {
3494 return StringPrintf("flag=%d, family=%d, addr=%s, host=%s", flag, family, addr.c_str(),
3495 host.c_str());
3496 }
3497 } testConfigs[]{
3498 {NI_NAMEREQD, AF_INET, "1.2.3.4", "v4v6.example.com"},
3499 {NI_NUMERICHOST, AF_INET, "1.2.3.4", "1.2.3.4"},
3500 {0, AF_INET, "1.2.3.4", "v4v6.example.com"},
3501 {0, AF_INET, "5.6.7.8", "5.6.7.8"}, // unmapped
3502 {NI_NAMEREQD, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
3503 {NI_NUMERICHOST, AF_INET6, "2001:db8::102:304", "2001:db8::102:304"},
3504 {0, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
3505 {0, AF_INET6, "2001:db8::506:708", "2001:db8::506:708"}, // unmapped
3506 };
Luke Huangf8215372019-11-22 11:53:41 +08003507 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003508
3509 // Reverse IPv4/IPv6 DNS query. Prefix should have no effect on it.
3510 for (const auto& config : testConfigs) {
3511 SCOPED_TRACE(config.asParameters());
3512
3513 int rv;
3514 char host[NI_MAXHOST];
3515 struct sockaddr_in sin;
3516 struct sockaddr_in6 sin6;
3517 if (config.family == AF_INET) {
3518 memset(&sin, 0, sizeof(sin));
3519 sin.sin_family = AF_INET;
3520 inet_pton(AF_INET, config.addr.c_str(), &sin.sin_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003521 rv = getnameinfo((const struct sockaddr*)&sin, sizeof(sin), host, sizeof(host), nullptr,
3522 0, config.flag);
nuccachena26cc2a2018-07-17 18:07:23 +08003523 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4));
3524 } else if (config.family == AF_INET6) {
3525 memset(&sin6, 0, sizeof(sin6));
3526 sin6.sin6_family = AF_INET6;
3527 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003528 rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host),
nuccachena26cc2a2018-07-17 18:07:23 +08003529 nullptr, 0, config.flag);
3530 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6));
3531 }
3532 ASSERT_EQ(0, rv);
3533 std::string result_str = host;
3534 EXPECT_EQ(result_str, config.host);
3535 dns.clearQueries();
3536 }
3537}
3538
3539TEST_F(ResolverTest, GetNameInfo_ReverseDns64Query) {
3540 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003541 constexpr char dns64_name[] = "ipv4only.arpa.";
3542 constexpr char ptr_name[] = "v4only.example.com.";
3543 // PTR record for IPv4 address 1.2.3.4
3544 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3545 // PTR record for IPv6 address 64:ff9b::1.2.3.4
3546 constexpr char ptr_addr_v6_nomapping[] =
3547 "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.";
3548 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
3549 // PTR record for IPv6 address 64:ff9b::5.6.7.8
3550 constexpr char ptr_addr_v6_synthesis[] =
3551 "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 +09003552 const std::vector<DnsRecord> records = {
3553 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3554 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3555 {ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis},
3556 };
nuccachena26cc2a2018-07-17 18:07:23 +08003557
Xiao Ma09b71022018-12-11 17:56:32 +09003558 test::DNSResponder dns(listen_addr);
3559 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003560 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003561 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003562
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003563 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003564 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003565 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003566
Luke Huangf8215372019-11-22 11:53:41 +08003567 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003568 static const struct TestConfig {
3569 bool hasSynthesizedPtrRecord;
3570 int flag;
3571 std::string addr;
3572 std::string host;
3573
3574 std::string asParameters() const {
3575 return StringPrintf("hasSynthesizedPtrRecord=%d, flag=%d, addr=%s, host=%s",
3576 hasSynthesizedPtrRecord, flag, addr.c_str(), host.c_str());
3577 }
3578 } testConfigs[]{
3579 {false, NI_NAMEREQD, "64:ff9b::102:304", "v4only.example.com"},
3580 {false, NI_NUMERICHOST, "64:ff9b::102:304", "64:ff9b::102:304"},
3581 {false, 0, "64:ff9b::102:304", "v4only.example.com"},
3582 {true, NI_NAMEREQD, "64:ff9b::506:708", "v6synthesis.example.com"},
3583 {true, NI_NUMERICHOST, "64:ff9b::506:708", "64:ff9b::506:708"},
3584 {true, 0, "64:ff9b::506:708", "v6synthesis.example.com"}
3585 };
Luke Huangf8215372019-11-22 11:53:41 +08003586 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003587
3588 // hasSynthesizedPtrRecord = false
3589 // Synthesized PTR record doesn't exist on DNS server
3590 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
3591 // After querying synthesized address failed, expect that prefix is removed from IPv6
3592 // synthesized address and do reverse IPv4 query instead.
3593 //
3594 // hasSynthesizedPtrRecord = true
3595 // Synthesized PTR record exists on DNS server
3596 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
3597 // Expect to just pass through synthesized address for DNS queries.
3598 for (const auto& config : testConfigs) {
3599 SCOPED_TRACE(config.asParameters());
3600
3601 char host[NI_MAXHOST];
3602 struct sockaddr_in6 sin6;
3603 memset(&sin6, 0, sizeof(sin6));
3604 sin6.sin6_family = AF_INET6;
3605 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003606 int rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host),
nuccachena26cc2a2018-07-17 18:07:23 +08003607 nullptr, 0, config.flag);
3608 ASSERT_EQ(0, rv);
3609 if (config.flag == NI_NAMEREQD) {
3610 if (config.hasSynthesizedPtrRecord) {
3611 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
3612 } else {
3613 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist.
3614 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist.
3615 }
3616 }
3617 std::string result_str = host;
3618 EXPECT_EQ(result_str, config.host);
3619 dns.clearQueries();
3620 }
3621}
3622
3623TEST_F(ResolverTest, GetNameInfo_ReverseDns64QueryFromHostFile) {
3624 constexpr char dns64_name[] = "ipv4only.arpa.";
3625 constexpr char host_name[] = "localhost";
3626 // The address is synthesized by prefix64:localhost.
3627 constexpr char host_addr[] = "64:ff9b::7f00:1";
nuccachena26cc2a2018-07-17 18:07:23 +08003628 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003629
3630 test::DNSResponder dns(listen_addr);
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003631
Xiao Ma09b71022018-12-11 17:56:32 +09003632 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003633 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003634 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003635
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003636 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003637 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003638 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003639
3640 // Using synthesized "localhost" address to be a trick for resolving host name
3641 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
3642 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
3643 char host[NI_MAXHOST];
Xiao Ma09b71022018-12-11 17:56:32 +09003644 struct sockaddr_in6 sin6 = {.sin6_family = AF_INET6};
nuccachena26cc2a2018-07-17 18:07:23 +08003645 inet_pton(AF_INET6, host_addr, &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003646 int rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host), nullptr,
nuccachena26cc2a2018-07-17 18:07:23 +08003647 0, NI_NAMEREQD);
3648 ASSERT_EQ(0, rv);
3649 // Expect no DNS queries; localhost is resolved via /etc/hosts.
3650 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
3651
3652 std::string result_str = host;
3653 EXPECT_EQ(result_str, host_name);
3654}
3655
Hungming Chen9e6185a2019-06-04 16:09:19 +08003656TEST_F(ResolverTest, GetNameInfo_cnamesClasslessReverseDelegation) {
3657 // IPv4 addresses in the subnet with notation '/' or '-'.
3658 constexpr char addr_slash[] = "192.0.2.1";
3659 constexpr char addr_hyphen[] = "192.0.3.1";
3660
3661 // Used to verify DNS reverse query for classless reverse lookup zone. See detail in RFC 2317
3662 // section 4.
3663 const static std::vector<DnsRecord> records = {
3664 // The records for reverse querying "192.0.2.1" in the subnet with notation '/'.
3665 {"1.2.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0/25.2.0.192.in-addr.arpa."},
3666 {"1.0/25.2.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3667
3668 // The records for reverse querying "192.0.3.1" in the subnet with notation '-'.
3669 {"1.3.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0-127.3.0.192.in-addr.arpa."},
3670 {"1.0-127.3.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3671 };
3672
3673 test::DNSResponder dns;
3674 StartDns(dns, records);
3675 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3676
3677 for (const auto& address : {addr_slash, addr_hyphen}) {
3678 SCOPED_TRACE(address);
3679
3680 char host[NI_MAXHOST];
3681 sockaddr_in sin = {.sin_family = AF_INET};
3682 ASSERT_TRUE(inet_pton(AF_INET, address, &sin.sin_addr));
3683 int rv = getnameinfo((const sockaddr*)&sin, sizeof(sin), host, sizeof(host), nullptr, 0,
3684 NI_NAMEREQD);
3685 ASSERT_EQ(0, rv);
3686 EXPECT_STREQ("hello.example.com", host);
3687 }
3688}
3689
nuccachena26cc2a2018-07-17 18:07:23 +08003690TEST_F(ResolverTest, GetHostByName2_Dns64Synthesize) {
Xiao Ma09b71022018-12-11 17:56:32 +09003691 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003692 constexpr char dns64_name[] = "ipv4only.arpa.";
3693 constexpr char host_name[] = "ipv4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003694 const std::vector<DnsRecord> records = {
3695 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3696 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3697 };
nuccachena26cc2a2018-07-17 18:07:23 +08003698
Xiao Ma09b71022018-12-11 17:56:32 +09003699 test::DNSResponder dns(listen_addr);
3700 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003701 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003702 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003703
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003704 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003705 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003706 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003707
3708 // Query an IPv4-only hostname. Expect that gets a synthesized address.
3709 struct hostent* result = gethostbyname2("ipv4only", AF_INET6);
3710 ASSERT_TRUE(result != nullptr);
3711 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3712 std::string result_str = ToString(result);
3713 EXPECT_EQ(result_str, "64:ff9b::102:304");
3714}
nuccachena26cc2a2018-07-17 18:07:23 +08003715
3716TEST_F(ResolverTest, GetHostByName2_DnsQueryWithHavingNat64Prefix) {
3717 constexpr char dns64_name[] = "ipv4only.arpa.";
3718 constexpr char host_name[] = "v4v6.example.com.";
nuccachena26cc2a2018-07-17 18:07:23 +08003719 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003720 const std::vector<DnsRecord> records = {
3721 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3722 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3723 {host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
3724 };
3725
3726 test::DNSResponder dns(listen_addr);
3727 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003728 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003729 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003730
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003731 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003732 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003733 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003734
3735 // IPv4 DNS query. Prefix should have no effect on it.
3736 struct hostent* result = gethostbyname2("v4v6", AF_INET);
3737 ASSERT_TRUE(result != nullptr);
3738 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3739 std::string result_str = ToString(result);
3740 EXPECT_EQ(result_str, "1.2.3.4");
3741 dns.clearQueries();
3742
3743 // IPv6 DNS query. Prefix should have no effect on it.
3744 result = gethostbyname2("v4v6", AF_INET6);
3745 ASSERT_TRUE(result != nullptr);
3746 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3747 result_str = ToString(result);
3748 EXPECT_EQ(result_str, "2001:db8::102:304");
3749}
3750
3751TEST_F(ResolverTest, GetHostByName2_Dns64QuerySpecialUseIPv4Addresses) {
3752 constexpr char THIS_NETWORK[] = "this_network";
3753 constexpr char LOOPBACK[] = "loopback";
3754 constexpr char LINK_LOCAL[] = "link_local";
3755 constexpr char MULTICAST[] = "multicast";
3756 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
3757
3758 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
3759 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
3760 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
3761 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
3762 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
3763
3764 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003765 constexpr char dns64_name[] = "ipv4only.arpa.";
3766
Xiao Ma09b71022018-12-11 17:56:32 +09003767 test::DNSResponder dns(listen_addr);
3768 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003769 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003770 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003771
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003772 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003773 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003774 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003775
Luke Huangf8215372019-11-22 11:53:41 +08003776 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003777 static const struct TestConfig {
3778 std::string name;
3779 std::string addr;
3780
3781 std::string asHostName() const {
Luke Huangf8215372019-11-22 11:53:41 +08003782 return StringPrintf("%s.example.com.", name.c_str());
nuccachena26cc2a2018-07-17 18:07:23 +08003783 }
3784 } testConfigs[]{
3785 {THIS_NETWORK, ADDR_THIS_NETWORK},
3786 {LOOPBACK, ADDR_LOOPBACK},
3787 {LINK_LOCAL, ADDR_LINK_LOCAL},
3788 {MULTICAST, ADDR_MULTICAST},
3789 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
3790 };
Luke Huangf8215372019-11-22 11:53:41 +08003791 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003792
3793 for (const auto& config : testConfigs) {
3794 const std::string testHostName = config.asHostName();
3795 SCOPED_TRACE(testHostName);
3796
3797 const char* host_name = testHostName.c_str();
3798 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
3799
3800 struct hostent* result = gethostbyname2(config.name.c_str(), AF_INET6);
3801 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3802
3803 // In AF_INET6 case, don't synthesize special use IPv4 address.
3804 // Expect to have no answer
3805 EXPECT_EQ(nullptr, result);
3806
3807 dns.clearQueries();
3808 }
Bernie Innocenti2fef2b82018-12-20 15:56:40 +09003809}
Mike Yuf14e1a92019-05-10 13:54:58 +08003810
3811TEST_F(ResolverTest, PrefixDiscoveryBypassTls) {
3812 constexpr char listen_addr[] = "::1";
3813 constexpr char cleartext_port[] = "53";
3814 constexpr char tls_port[] = "853";
3815 constexpr char dns64_name[] = "ipv4only.arpa.";
3816 const std::vector<std::string> servers = {listen_addr};
3817
3818 test::DNSResponder dns(listen_addr);
3819 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
3820 test::DnsTlsFrontend tls(listen_addr, tls_port, listen_addr, cleartext_port);
3821 ASSERT_TRUE(tls.startServer());
3822
3823 // Setup OPPORTUNISTIC mode and wait for the validation complete.
waynema0e73c2e2019-07-31 15:04:08 +08003824 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08003825 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003826 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yuf14e1a92019-05-10 13:54:58 +08003827 tls.clearQueries();
3828
3829 // Start NAT64 prefix discovery and wait for it complete.
3830 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003831 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
Mike Yuf14e1a92019-05-10 13:54:58 +08003832
3833 // Verify it bypassed TLS even though there's a TLS server available.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003834 EXPECT_EQ(0, tls.queries()) << dns.dumpQueries();
3835 EXPECT_EQ(1U, GetNumQueries(dns, dns64_name)) << dns.dumpQueries();
Mike Yuf14e1a92019-05-10 13:54:58 +08003836
3837 // Restart the testing network to reset the cache.
3838 mDnsClient.TearDown();
3839 mDnsClient.SetUp();
3840 dns.clearQueries();
3841
3842 // Setup STRICT mode and wait for the validation complete.
waynema0e73c2e2019-07-31 15:04:08 +08003843 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
3844 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08003845 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003846 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yuf14e1a92019-05-10 13:54:58 +08003847 tls.clearQueries();
3848
3849 // Start NAT64 prefix discovery and wait for it to complete.
3850 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003851 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
Mike Yuf14e1a92019-05-10 13:54:58 +08003852
3853 // Verify it bypassed TLS despite STRICT mode.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003854 EXPECT_EQ(0, tls.queries()) << dns.dumpQueries();
3855 EXPECT_EQ(1U, GetNumQueries(dns, dns64_name)) << dns.dumpQueries();
Mike Yuf14e1a92019-05-10 13:54:58 +08003856}
Luke Huang9807e6b2019-05-20 16:17:12 +08003857
Lorenzo Colittie51091d2020-05-20 02:48:44 +09003858TEST_F(ResolverTest, SetAndClearNat64Prefix) {
3859 constexpr char host_name[] = "v4.example.com.";
3860 constexpr char listen_addr[] = "::1";
3861 const std::vector<DnsRecord> records = {
3862 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3863 };
3864 const std::string kNat64Prefix1 = "64:ff9b::/96";
3865 const std::string kNat64Prefix2 = "2001:db8:6464::/96";
3866
3867 test::DNSResponder dns(listen_addr);
3868 StartDns(dns, records);
3869 const std::vector<std::string> servers = {listen_addr};
3870 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
3871
3872 auto resolvService = mDnsClient.resolvService();
3873 addrinfo hints = {.ai_family = AF_INET6};
3874
3875 // No NAT64 prefix, no AAAA record.
3876 ScopedAddrinfo result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3877 ASSERT_TRUE(result == nullptr);
3878
3879 // Set the prefix, and expect to get a synthesized AAAA record.
3880 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix2).isOk());
3881 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3882 ASSERT_FALSE(result == nullptr);
3883 EXPECT_EQ("2001:db8:6464::102:304", ToString(result));
3884
3885 // Update the prefix, expect to see AAAA records from the new prefix.
3886 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3887 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3888 ASSERT_FALSE(result == nullptr);
3889 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3890
3891 // Non-/96 prefixes are ignored.
3892 auto status = resolvService->setPrefix64(TEST_NETID, "64:ff9b::/64");
3893 EXPECT_FALSE(status.isOk());
3894 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3895 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3896
3897 // Invalid prefixes are ignored.
3898 status = resolvService->setPrefix64(TEST_NETID, "192.0.2.0/24");
3899 EXPECT_FALSE(status.isOk());
3900 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3901 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3902
3903 status = resolvService->setPrefix64(TEST_NETID, "192.0.2.1");
3904 EXPECT_FALSE(status.isOk());
3905 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3906 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3907
3908 status = resolvService->setPrefix64(TEST_NETID, "hello");
3909 EXPECT_FALSE(status.isOk());
3910 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3911 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3912
3913 // DNS64 synthesis is still working.
3914 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3915 ASSERT_FALSE(result == nullptr);
3916 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3917
3918 // Clear the prefix. No AAAA records any more.
3919 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, "").isOk());
3920 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3921 EXPECT_TRUE(result == nullptr);
3922
3923 // Calling startPrefix64Discovery clears the prefix.
3924 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3925 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3926 ASSERT_FALSE(result == nullptr);
3927 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3928
3929 EXPECT_TRUE(resolvService->startPrefix64Discovery(TEST_NETID).isOk());
3930 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3931 ASSERT_TRUE(result == nullptr);
3932
3933 // setPrefix64 fails if prefix discovery is started, even if no prefix is yet discovered...
3934 status = resolvService->setPrefix64(TEST_NETID, kNat64Prefix1);
3935 EXPECT_FALSE(status.isOk());
3936 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3937 EXPECT_EQ(EEXIST, status.getServiceSpecificError());
3938
3939 // .. and clearing the prefix also has no effect.
3940 status = resolvService->setPrefix64(TEST_NETID, "");
3941 EXPECT_FALSE(status.isOk());
3942 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3943 EXPECT_EQ(ENOENT, status.getServiceSpecificError());
3944
3945 // setPrefix64 succeeds again when prefix discovery is stopped.
3946 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
3947 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3948 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3949 ASSERT_FALSE(result == nullptr);
3950 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3951
3952 // Calling stopPrefix64Discovery clears the prefix.
3953 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
3954 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3955 ASSERT_TRUE(result == nullptr);
3956
3957 // Set up NAT64 prefix discovery.
3958 constexpr char dns64_name[] = "ipv4only.arpa.";
3959 const std::vector<DnsRecord> newRecords = {
3960 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3961 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3962 };
3963 dns.stopServer();
3964 StartDns(dns, newRecords);
3965
3966 EXPECT_TRUE(resolvService->startPrefix64Discovery(TEST_NETID).isOk());
3967 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
3968 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3969 ASSERT_FALSE(result == nullptr);
3970 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3971
3972 // setPrefix64 fails if NAT64 prefix discovery has succeeded, and the discovered prefix
3973 // continues to be used.
3974 status = resolvService->setPrefix64(TEST_NETID, kNat64Prefix2);
3975 EXPECT_FALSE(status.isOk());
3976 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3977 EXPECT_EQ(EEXIST, status.getServiceSpecificError());
3978
3979 // Clearing the prefix also has no effect if discovery is started.
3980 status = resolvService->setPrefix64(TEST_NETID, "");
3981 EXPECT_FALSE(status.isOk());
3982 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3983 EXPECT_EQ(ENOENT, status.getServiceSpecificError());
3984
3985 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3986 ASSERT_FALSE(result == nullptr);
3987 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3988
3989 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
3990 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_NOT_FOUND));
Lorenzo Colitti61f796b2020-05-21 00:57:49 +09003991
3992 EXPECT_EQ(0, sDnsMetricsListener->getUnexpectedNat64PrefixUpdates());
Lorenzo Colittie51091d2020-05-20 02:48:44 +09003993}
3994
Luke Huang9807e6b2019-05-20 16:17:12 +08003995namespace {
3996
Luke Huang0d592bc2019-05-25 18:24:03 +08003997class ScopedSetNetworkForProcess {
3998 public:
3999 explicit ScopedSetNetworkForProcess(unsigned netId) {
4000 mStoredNetId = getNetworkForProcess();
4001 if (netId == mStoredNetId) return;
4002 EXPECT_EQ(0, setNetworkForProcess(netId));
4003 }
4004 ~ScopedSetNetworkForProcess() { EXPECT_EQ(0, setNetworkForProcess(mStoredNetId)); }
4005
4006 private:
4007 unsigned mStoredNetId;
4008};
4009
4010class ScopedSetNetworkForResolv {
4011 public:
4012 explicit ScopedSetNetworkForResolv(unsigned netId) { EXPECT_EQ(0, setNetworkForResolv(netId)); }
4013 ~ScopedSetNetworkForResolv() { EXPECT_EQ(0, setNetworkForResolv(NETID_UNSET)); }
4014};
4015
Luke Huang9807e6b2019-05-20 16:17:12 +08004016void sendCommand(int fd, const std::string& cmd) {
4017 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size() + 1));
4018 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size() + 1));
4019}
4020
4021int32_t readBE32(int fd) {
4022 int32_t tmp;
4023 int n = TEMP_FAILURE_RETRY(read(fd, &tmp, sizeof(tmp)));
4024 EXPECT_TRUE(n > 0);
4025 return ntohl(tmp);
4026}
4027
Luke Huang0d592bc2019-05-25 18:24:03 +08004028int readResponseCode(int fd) {
Luke Huang9807e6b2019-05-20 16:17:12 +08004029 char buf[4];
4030 int n = TEMP_FAILURE_RETRY(read(fd, &buf, sizeof(buf)));
4031 EXPECT_TRUE(n > 0);
4032 // The format of response code is that 4 bytes for the code & null.
4033 buf[3] = '\0';
4034 int result;
4035 EXPECT_TRUE(ParseInt(buf, &result));
4036 return result;
4037}
4038
Luke Huang0d592bc2019-05-25 18:24:03 +08004039bool checkAndClearUseLocalNameserversFlag(unsigned* netid) {
4040 if (netid == nullptr || ((*netid) & NETID_USE_LOCAL_NAMESERVERS) == 0) {
4041 return false;
4042 }
4043 *netid = (*netid) & ~NETID_USE_LOCAL_NAMESERVERS;
4044 return true;
4045}
4046
Luke Huangf8215372019-11-22 11:53:41 +08004047aidl::android::net::UidRangeParcel makeUidRangeParcel(int start, int stop) {
4048 aidl::android::net::UidRangeParcel res;
Luke Huang0d592bc2019-05-25 18:24:03 +08004049 res.start = start;
4050 res.stop = stop;
4051
4052 return res;
4053}
4054
4055void expectNetIdWithLocalNameserversFlag(unsigned netId) {
4056 unsigned dnsNetId = 0;
4057 EXPECT_EQ(0, getNetworkForDns(&dnsNetId));
4058 EXPECT_TRUE(checkAndClearUseLocalNameserversFlag(&dnsNetId));
4059 EXPECT_EQ(netId, static_cast<unsigned>(dnsNetId));
4060}
4061
4062void expectDnsNetIdEquals(unsigned netId) {
4063 unsigned dnsNetId = 0;
4064 EXPECT_EQ(0, getNetworkForDns(&dnsNetId));
4065 EXPECT_EQ(netId, static_cast<unsigned>(dnsNetId));
4066}
4067
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004068void expectDnsNetIdIsDefaultNetwork(INetd* netdService) {
Luke Huang0d592bc2019-05-25 18:24:03 +08004069 int currentNetid;
4070 EXPECT_TRUE(netdService->networkGetDefault(&currentNetid).isOk());
4071 expectDnsNetIdEquals(currentNetid);
4072}
4073
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004074void expectDnsNetIdWithVpn(INetd* netdService, unsigned vpnNetId, unsigned expectedNetId) {
Luke Huang0d592bc2019-05-25 18:24:03 +08004075 EXPECT_TRUE(netdService->networkCreateVpn(vpnNetId, false /* secure */).isOk());
4076 uid_t uid = getuid();
4077 // Add uid to VPN
4078 EXPECT_TRUE(netdService->networkAddUidRanges(vpnNetId, {makeUidRangeParcel(uid, uid)}).isOk());
4079 expectDnsNetIdEquals(expectedNetId);
4080 EXPECT_TRUE(netdService->networkDestroy(vpnNetId).isOk());
4081}
4082
Luke Huang9807e6b2019-05-20 16:17:12 +08004083} // namespace
4084
4085TEST_F(ResolverTest, getDnsNetId) {
4086 // We've called setNetworkForProcess in SetupOemNetwork, so reset to default first.
4087 setNetworkForProcess(NETID_UNSET);
Luke Huang0d592bc2019-05-25 18:24:03 +08004088
4089 expectDnsNetIdIsDefaultNetwork(mDnsClient.netdService());
4090 expectDnsNetIdWithVpn(mDnsClient.netdService(), TEST_VPN_NETID, TEST_VPN_NETID);
Luke Huang9807e6b2019-05-20 16:17:12 +08004091
4092 // Test with setNetworkForProcess
Luke Huang0d592bc2019-05-25 18:24:03 +08004093 {
4094 ScopedSetNetworkForProcess scopedSetNetworkForProcess(TEST_NETID);
4095 expectDnsNetIdEquals(TEST_NETID);
4096 }
4097
4098 // Test with setNetworkForProcess with NETID_USE_LOCAL_NAMESERVERS
4099 {
4100 ScopedSetNetworkForProcess scopedSetNetworkForProcess(TEST_NETID |
4101 NETID_USE_LOCAL_NAMESERVERS);
4102 expectNetIdWithLocalNameserversFlag(TEST_NETID);
4103 }
Luke Huang9807e6b2019-05-20 16:17:12 +08004104
4105 // Test with setNetworkForResolv
Luke Huang0d592bc2019-05-25 18:24:03 +08004106 {
4107 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID);
4108 expectDnsNetIdEquals(TEST_NETID);
4109 }
4110
4111 // Test with setNetworkForResolv with NETID_USE_LOCAL_NAMESERVERS
4112 {
4113 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID |
4114 NETID_USE_LOCAL_NAMESERVERS);
4115 expectNetIdWithLocalNameserversFlag(TEST_NETID);
4116 }
4117
4118 // Test with setNetworkForResolv under bypassable vpn
4119 {
4120 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID);
4121 expectDnsNetIdWithVpn(mDnsClient.netdService(), TEST_VPN_NETID, TEST_NETID);
4122 }
Luke Huang9807e6b2019-05-20 16:17:12 +08004123
4124 // Create socket connected to DnsProxyListener
4125 int fd = dns_open_proxy();
4126 EXPECT_TRUE(fd > 0);
4127 unique_fd ufd(fd);
4128
4129 // Test command with wrong netId
4130 sendCommand(fd, "getdnsnetid abc");
Luke Huang0d592bc2019-05-25 18:24:03 +08004131 EXPECT_EQ(ResponseCode::DnsProxyQueryResult, readResponseCode(fd));
Luke Huang9807e6b2019-05-20 16:17:12 +08004132 EXPECT_EQ(-EINVAL, readBE32(fd));
4133
4134 // Test unsupported command
4135 sendCommand(fd, "getdnsnetidNotSupported");
4136 // Keep in sync with FrameworkListener.cpp (500, "Command not recognized")
Luke Huang0d592bc2019-05-25 18:24:03 +08004137 EXPECT_EQ(500, readResponseCode(fd));
Luke Huang9807e6b2019-05-20 16:17:12 +08004138}
Sehee Park2c118782019-05-07 13:02:45 +09004139
4140TEST_F(ResolverTest, BlockDnsQueryWithUidRule) {
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004141 // This test relies on blocking traffic on loopback, which xt_qtaguid does not do.
4142 // See aosp/358413 and b/34444781 for why.
4143 SKIP_IF_BPF_NOT_SUPPORTED;
4144
Sehee Park2c118782019-05-07 13:02:45 +09004145 constexpr char listen_addr1[] = "127.0.0.4";
4146 constexpr char listen_addr2[] = "::1";
4147 constexpr char host_name[] = "howdy.example.com.";
4148 const std::vector<DnsRecord> records = {
4149 {host_name, ns_type::ns_t_a, "1.2.3.4"},
4150 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
4151 };
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004152 INetd* netdService = mDnsClient.netdService();
Sehee Park2c118782019-05-07 13:02:45 +09004153
4154 test::DNSResponder dns1(listen_addr1);
4155 test::DNSResponder dns2(listen_addr2);
4156 StartDns(dns1, records);
4157 StartDns(dns2, records);
4158
4159 std::vector<std::string> servers = {listen_addr1, listen_addr2};
4160 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
4161 dns1.clearQueries();
4162 dns2.clearQueries();
4163
Luke Huangeb618ef2020-05-26 14:17:02 +08004164 ScopeBlockedUIDRule scopeBlockUidRule(netdService, TEST_UID);
Sehee Park2c118782019-05-07 13:02:45 +09004165 // Dns Query
4166 int fd1 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_a, 0);
4167 int fd2 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_aaaa, 0);
4168 EXPECT_TRUE(fd1 != -1);
4169 EXPECT_TRUE(fd2 != -1);
4170
Luke Huang5729afc2020-07-30 23:12:17 +08004171 uint8_t buf1[MAXPACKET] = {};
4172 uint8_t buf2[MAXPACKET] = {};
Sehee Park2c118782019-05-07 13:02:45 +09004173 int rcode;
Luke Huang5729afc2020-07-30 23:12:17 +08004174 int res2 = getAsyncResponse(fd2, &rcode, buf2, MAXPACKET);
4175 int res1 = getAsyncResponse(fd1, &rcode, buf1, MAXPACKET);
4176 // If API level >= 30 (R+), these queries should be blocked.
4177 if (isAtLeastR) {
4178 EXPECT_EQ(res2, -ECONNREFUSED);
4179 EXPECT_EQ(res1, -ECONNREFUSED);
4180 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, EAI_SYSTEM, "howdy.example.com", {});
4181 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, EAI_SYSTEM, "howdy.example.com", {});
4182 } else {
4183 EXPECT_GT(res2, 0);
4184 EXPECT_EQ("::1.2.3.4", toString(buf2, res2, AF_INET6));
4185 EXPECT_GT(res1, 0);
4186 EXPECT_EQ("1.2.3.4", toString(buf1, res1, AF_INET));
4187 // To avoid flaky test, do not evaluate DnsEvent since event order is not guaranteed.
4188 }
Sehee Park2c118782019-05-07 13:02:45 +09004189}
Mike Yua772c202019-09-23 17:47:21 +08004190
Ken Chenbc481b82020-05-21 23:30:01 +08004191TEST_F(ResolverTest, EnforceDnsUid) {
4192 SKIP_IF_BPF_NOT_SUPPORTED;
4193
4194 constexpr char listen_addr1[] = "127.0.0.4";
4195 constexpr char listen_addr2[] = "::1";
4196 constexpr char host_name[] = "howdy.example.com.";
4197 const std::vector<DnsRecord> records = {
4198 {host_name, ns_type::ns_t_a, "1.2.3.4"},
4199 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
4200 };
4201 INetd* netdService = mDnsClient.netdService();
4202
4203 test::DNSResponder dns1(listen_addr1);
4204 test::DNSResponder dns2(listen_addr2);
4205 StartDns(dns1, records);
4206 StartDns(dns2, records);
4207
4208 // switch uid of DNS queries from applications to AID_DNS
4209 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4210 parcel.servers = {listen_addr1, listen_addr2};
4211 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk());
4212
4213 uint8_t buf[MAXPACKET] = {};
Luke Huang5729afc2020-07-30 23:12:17 +08004214 uint8_t buf2[MAXPACKET] = {};
Ken Chenbc481b82020-05-21 23:30:01 +08004215 int rcode;
4216 {
4217 ScopeBlockedUIDRule scopeBlockUidRule(netdService, TEST_UID);
4218 // Dns Queries should be blocked
Luke Huang5729afc2020-07-30 23:12:17 +08004219 const int fd1 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_a, 0);
4220 const int fd2 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_aaaa, 0);
Ken Chenbc481b82020-05-21 23:30:01 +08004221 EXPECT_TRUE(fd1 != -1);
4222 EXPECT_TRUE(fd2 != -1);
4223
Luke Huang5729afc2020-07-30 23:12:17 +08004224 const int res2 = getAsyncResponse(fd2, &rcode, buf2, MAXPACKET);
4225 const int res1 = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
4226 // If API level >= 30 (R+), the query should be blocked.
4227 if (isAtLeastR) {
4228 EXPECT_EQ(res2, -ECONNREFUSED);
4229 EXPECT_EQ(res1, -ECONNREFUSED);
4230 } else {
4231 EXPECT_GT(res2, 0);
4232 EXPECT_EQ("::1.2.3.4", toString(buf2, res2, AF_INET6));
4233 EXPECT_GT(res1, 0);
4234 EXPECT_EQ("1.2.3.4", toString(buf, res1, AF_INET));
4235 }
Ken Chenbc481b82020-05-21 23:30:01 +08004236 }
4237
Luke Huang5729afc2020-07-30 23:12:17 +08004238 memset(buf, 0, MAXPACKET);
Ken Chenbc481b82020-05-21 23:30:01 +08004239 parcel.resolverOptions.enforceDnsUid = true;
4240 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk());
4241 {
4242 ScopeBlockedUIDRule scopeBlockUidRule(netdService, TEST_UID);
4243 // Dns Queries should NOT be blocked
4244 int fd1 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_a, 0);
4245 int fd2 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_aaaa, 0);
4246 EXPECT_TRUE(fd1 != -1);
4247 EXPECT_TRUE(fd2 != -1);
4248
4249 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
4250 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
4251
4252 memset(buf, 0, MAXPACKET);
4253 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
4254 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
4255
4256 // @TODO: So far we know that uid of DNS queries are no more set to DNS requester. But we
4257 // don't check if they are actually being set to AID_DNS, because system uids are always
4258 // allowed in bpf_owner_match(). Audit by firewallSetUidRule(AID_DNS) + sending queries is
4259 // infeasible. Fix it if the behavior of bpf_owner_match() is changed in the future, or if
4260 // we have better idea to deal with this.
4261 }
4262}
4263
Mike Yua772c202019-09-23 17:47:21 +08004264TEST_F(ResolverTest, ConnectTlsServerTimeout) {
Mike Yu61d17262020-02-15 18:56:22 +08004265 const std::string kDotConnectTimeoutMsFlag(
4266 "persist.device_config.netd_native.dot_connect_timeout_ms");
Mike Yu40e67072019-10-09 21:14:09 +08004267 constexpr int expectedTimeout = 1000;
4268 constexpr char hostname1[] = "query1.example.com.";
4269 constexpr char hostname2[] = "query2.example.com.";
Mike Yua772c202019-09-23 17:47:21 +08004270 const std::vector<DnsRecord> records = {
Mike Yu40e67072019-10-09 21:14:09 +08004271 {hostname1, ns_type::ns_t_a, "1.2.3.4"},
4272 {hostname2, ns_type::ns_t_a, "1.2.3.5"},
Mike Yua772c202019-09-23 17:47:21 +08004273 };
4274
4275 test::DNSResponder dns;
4276 StartDns(dns, records);
Mike Yu40e67072019-10-09 21:14:09 +08004277 test::DnsTlsFrontend tls;
Mike Yua772c202019-09-23 17:47:21 +08004278 ASSERT_TRUE(tls.startServer());
4279
Mike Yu40e67072019-10-09 21:14:09 +08004280 // The resolver will adjust the timeout value to 1000ms since the value is too small.
4281 ScopedSystemProperties scopedSystemProperties(kDotConnectTimeoutMsFlag, "100");
Mike Yua772c202019-09-23 17:47:21 +08004282
Mike Yu40e67072019-10-09 21:14:09 +08004283 // Set up resolver to opportunistic mode with the default configuration.
Mike Yu8ac63402019-12-02 15:28:38 +08004284 const ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
Mike Yu40e67072019-10-09 21:14:09 +08004285 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
Mike Yua772c202019-09-23 17:47:21 +08004286 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09004287 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yua772c202019-09-23 17:47:21 +08004288 tls.clearQueries();
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09004289 dns.clearQueries();
Mike Yua772c202019-09-23 17:47:21 +08004290
4291 // The server becomes unresponsive to the handshake request.
4292 tls.setHangOnHandshakeForTesting(true);
4293
4294 // Expect the things happening in getaddrinfo():
4295 // 1. Connect to the private DNS server.
4296 // 2. SSL handshake times out.
4297 // 3. Fallback to UDP transport, and then get the answer.
Mike Yu40e67072019-10-09 21:14:09 +08004298 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4299 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(hostname1, nullptr, hints);
Mike Yua772c202019-09-23 17:47:21 +08004300
Mike Yu40e67072019-10-09 21:14:09 +08004301 EXPECT_NE(nullptr, result);
Mike Yua772c202019-09-23 17:47:21 +08004302 EXPECT_EQ(0, tls.queries());
Mike Yu40e67072019-10-09 21:14:09 +08004303 EXPECT_EQ(1U, GetNumQueries(dns, hostname1));
4304 EXPECT_EQ(records.at(0).addr, ToString(result));
Mike Yua772c202019-09-23 17:47:21 +08004305
Mike Yu40e67072019-10-09 21:14:09 +08004306 // A loose upper bound is set by adding 2000ms buffer time. Theoretically, getaddrinfo()
4307 // should just take a bit more than expetTimeout milliseconds.
4308 EXPECT_GE(timeTakenMs, expectedTimeout);
4309 EXPECT_LE(timeTakenMs, expectedTimeout + 2000);
4310
4311 // Set the server to be responsive. Verify that the resolver will attempt to reconnect
4312 // to the server and then get the result within the timeout.
4313 tls.setHangOnHandshakeForTesting(false);
4314 std::tie(result, timeTakenMs) = safe_getaddrinfo_time_taken(hostname2, nullptr, hints);
4315
4316 EXPECT_NE(nullptr, result);
Luke Huang0a0870d2020-02-12 20:41:10 +08004317 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yu40e67072019-10-09 21:14:09 +08004318 EXPECT_EQ(1U, GetNumQueries(dns, hostname2));
4319 EXPECT_EQ(records.at(1).addr, ToString(result));
4320
4321 EXPECT_LE(timeTakenMs, expectedTimeout);
Mike Yua772c202019-09-23 17:47:21 +08004322}
Hungming Chenbb90ab32019-10-28 18:20:31 +08004323
Ken Chen766feae2019-10-30 15:13:44 +08004324TEST_F(ResolverTest, FlushNetworkCache) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004325 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004326 test::DNSResponder dns;
4327 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4328 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4329
4330 const hostent* result = gethostbyname("hello");
4331 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4332
4333 // get result from cache
4334 result = gethostbyname("hello");
4335 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4336
4337 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4338
4339 result = gethostbyname("hello");
4340 EXPECT_EQ(2U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4341}
4342
4343TEST_F(ResolverTest, FlushNetworkCache_random) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004344 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004345 constexpr int num_flush = 10;
4346 constexpr int num_queries = 20;
4347 test::DNSResponder dns;
4348 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4349 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4350 const addrinfo hints = {.ai_family = AF_INET};
4351
4352 std::thread t([this]() {
4353 for (int i = 0; i < num_flush; ++i) {
4354 unsigned delay = arc4random_uniform(10 * 1000); // 10ms
4355 usleep(delay);
4356 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4357 }
4358 });
4359
4360 for (int i = 0; i < num_queries; ++i) {
4361 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4362 EXPECT_TRUE(result != nullptr);
4363 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4364 }
4365 t.join();
4366}
4367
4368// flush cache while one query is wait-for-response, another is pending.
4369TEST_F(ResolverTest, FlushNetworkCache_concurrent) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004370 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004371 const char* listen_addr1 = "127.0.0.9";
4372 const char* listen_addr2 = "127.0.0.10";
4373 test::DNSResponder dns1(listen_addr1);
4374 test::DNSResponder dns2(listen_addr2);
4375 StartDns(dns1, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4376 StartDns(dns2, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4377 addrinfo hints = {.ai_family = AF_INET};
4378
4379 // step 1: set server#1 into deferred responding mode
4380 dns1.setDeferredResp(true);
4381 std::thread t1([&listen_addr1, &hints, this]() {
4382 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr1}));
4383 // step 3: query
4384 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4385 // step 9: check result
4386 EXPECT_TRUE(result != nullptr);
4387 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4388 });
4389
4390 // step 2: wait for the query to reach the server
4391 while (GetNumQueries(dns1, kHelloExampleCom) == 0) {
4392 usleep(1000); // 1ms
4393 }
4394
4395 std::thread t2([&listen_addr2, &hints, &dns2, this]() {
4396 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr2}));
4397 // step 5: query (should be blocked in resolver)
4398 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4399 // step 7: check result
4400 EXPECT_TRUE(result != nullptr);
4401 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4402 EXPECT_EQ(1U, GetNumQueriesForType(dns2, ns_type::ns_t_a, kHelloExampleCom));
4403 });
4404
4405 // step 4: wait a bit for the 2nd query to enter pending state
4406 usleep(100 * 1000); // 100ms
4407 // step 6: flush cache (will unblock pending queries)
4408 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4409 t2.join();
4410
4411 // step 8: resume server#1
4412 dns1.setDeferredResp(false);
4413 t1.join();
4414
4415 // step 10: verify if result is correctly cached
4416 dns2.clearQueries();
4417 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4418 EXPECT_EQ(0U, GetNumQueries(dns2, kHelloExampleCom));
4419 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4420}
4421
waynema29253052019-08-20 11:26:08 +08004422// TODO: Perhaps to have a boundary conditions test for TCP and UDP.
4423TEST_F(ResolverTest, TcpQueryWithOversizePayload) {
4424 test::DNSResponder dns;
4425 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4426 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4427
4428 int fd = dns_open_proxy();
4429 ASSERT_TRUE(fd > 0);
4430
4431 // Sending DNS query over TCP once the packet sizes exceed 512 bytes.
4432 // The raw data is combined with Question section and Additional section
4433 // Question section : query "hello.example.com", type A, class IN
4434 // Additional section : type OPT (41), Option PADDING, Option Length 546
4435 // Padding option which allows DNS clients and servers to artificially
4436 // increase the size of a DNS message by a variable number of bytes.
4437 // See also RFC7830, section 3
4438 const std::string query =
4439 "+c0BAAABAAAAAAABBWhlbGxvB2V4YW1wbGUDY29tAAABAAEAACkgAAAAgAACJgAMAiIAAAAAAAAAAAAAAAAAA"
4440 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4441 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4442 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4443 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4444 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4445 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4446 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4447 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4448 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
4449 const std::string cmd =
4450 "resnsend " + std::to_string(TEST_NETID) + " 0 " /* ResNsendFlags */ + query + '\0';
4451 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
4452 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
4453 expectAnswersValid(fd, AF_INET, kHelloExampleComAddrV4);
4454 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom));
4455 EXPECT_EQ(0U, GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom));
4456}
4457
Ken Chen99344882020-01-01 14:59:38 +08004458TEST_F(ResolverTest, TruncatedRspMode) {
4459 constexpr char listen_addr[] = "127.0.0.4";
4460 constexpr char listen_addr2[] = "127.0.0.5";
4461 constexpr char listen_srv[] = "53";
4462
4463 test::DNSResponder dns(listen_addr, listen_srv, static_cast<ns_rcode>(-1));
4464 test::DNSResponder dns2(listen_addr2, listen_srv, static_cast<ns_rcode>(-1));
4465 // dns supports UDP only, dns2 support UDP and TCP
4466 dns.setResponseProbability(0.0, IPPROTO_TCP);
4467 StartDns(dns, kLargeCnameChainRecords);
4468 StartDns(dns2, kLargeCnameChainRecords);
4469
4470 const struct TestConfig {
4471 const std::optional<int32_t> tcMode;
4472 const bool ret;
4473 const unsigned numQueries;
4474 std::string asParameters() const {
4475 return StringPrintf("tcMode: %d, ret: %s, numQueries: %u", tcMode.value_or(-1),
4476 ret ? "true" : "false", numQueries);
4477 }
4478 } testConfigs[]{
4479 // clang-format off
4480 {std::nullopt, true, 0}, /* mode unset */
4481 {aidl::android::net::IDnsResolver::TC_MODE_DEFAULT, true, 0}, /* default mode */
4482 {aidl::android::net::IDnsResolver::TC_MODE_UDP_TCP, true, 1}, /* alternative mode */
4483 {-666, false, 1}, /* invalid input */
4484 // clang-format on
4485 };
4486
4487 for (const auto& config : testConfigs) {
4488 SCOPED_TRACE(config.asParameters());
4489
4490 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4491 parcel.servers = {listen_addr, listen_addr2};
4492 if (config.tcMode) {
Ken Chena6ac2a62020-04-07 17:25:56 +08004493 parcel.resolverOptions.tcMode = config.tcMode.value();
Ken Chen99344882020-01-01 14:59:38 +08004494 }
4495 ASSERT_EQ(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk(), config.ret);
4496
4497 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4498 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4499 ASSERT_TRUE(result != nullptr);
4500 EXPECT_EQ(ToString(result), kHelloExampleComAddrV4);
4501 // TC_MODE_DEFAULT: resolver retries on TCP-only on each name server.
4502 // TC_MODE_UDP_TCP: resolver retries on TCP on the same server, falls back to UDP from next.
4503 ASSERT_EQ(GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom), 1U);
4504 ASSERT_EQ(GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom), 1U);
4505 ASSERT_EQ(GetNumQueriesForProtocol(dns2, IPPROTO_UDP, kHelloExampleCom), config.numQueries);
4506 ASSERT_EQ(GetNumQueriesForProtocol(dns2, IPPROTO_TCP, kHelloExampleCom), 1U);
4507
4508 dns.clearQueries();
4509 dns2.clearQueries();
4510 ASSERT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
Mike Yu61d17262020-02-15 18:56:22 +08004511
4512 // Clear the stats to make the resolver always choose the same server for the first query.
4513 parcel.servers.clear();
4514 parcel.tlsServers.clear();
4515 ASSERT_EQ(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk(), config.ret);
Ken Chen99344882020-01-01 14:59:38 +08004516 }
4517}
4518
Mike Yu153b5b82020-03-04 19:53:54 +08004519TEST_F(ResolverTest, RepeatedSetup_ResolverStatusRemains) {
4520 constexpr char unusable_listen_addr[] = "127.0.0.3";
4521 constexpr char listen_addr[] = "127.0.0.4";
4522 constexpr char hostname[] = "a.hello.query.";
4523 const auto repeatedSetResolversFromParcel = [&](const ResolverParamsParcel& parcel) {
4524 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4525 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4526 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4527 };
4528
4529 test::DNSResponder dns(listen_addr);
4530 StartDns(dns, {{hostname, ns_type::ns_t_a, "1.2.3.3"}});
4531 test::DnsTlsFrontend tls1(listen_addr, "853", listen_addr, "53");
4532 ASSERT_TRUE(tls1.startServer());
4533
4534 // Private DNS off mode.
4535 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4536 parcel.servers = {unusable_listen_addr, listen_addr};
4537 parcel.tlsServers.clear();
4538 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4539
4540 // Send a query.
4541 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4542 EXPECT_NE(safe_getaddrinfo(hostname, nullptr, &hints), nullptr);
4543
4544 // Check the stats as expected.
4545 const std::vector<NameserverStats> expectedCleartextDnsStats = {
4546 NameserverStats(unusable_listen_addr).setInternalErrors(1),
4547 NameserverStats(listen_addr).setSuccesses(1),
4548 };
Mike Yu61d17262020-02-15 18:56:22 +08004549 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu153b5b82020-03-04 19:53:54 +08004550 EXPECT_EQ(GetNumQueries(dns, hostname), 1U);
4551
4552 // The stats is supposed to remain as long as the list of cleartext DNS servers is unchanged.
4553 static const struct TestConfig {
4554 std::vector<std::string> servers;
4555 std::vector<std::string> tlsServers;
4556 std::string tlsName;
4557 } testConfigs[] = {
4558 // Private DNS opportunistic mode.
4559 {{listen_addr, unusable_listen_addr}, {listen_addr, unusable_listen_addr}, ""},
4560 {{unusable_listen_addr, listen_addr}, {unusable_listen_addr, listen_addr}, ""},
4561
4562 // Private DNS strict mode.
4563 {{listen_addr, unusable_listen_addr}, {"127.0.0.100"}, kDefaultPrivateDnsHostName},
4564 {{unusable_listen_addr, listen_addr}, {"127.0.0.100"}, kDefaultPrivateDnsHostName},
4565
4566 // Private DNS off mode.
4567 {{unusable_listen_addr, listen_addr}, {}, ""},
4568 {{listen_addr, unusable_listen_addr}, {}, ""},
4569 };
4570
4571 for (const auto& config : testConfigs) {
4572 SCOPED_TRACE(fmt::format("testConfig: [{}] [{}] [{}]", fmt::join(config.servers, ","),
4573 fmt::join(config.tlsServers, ","), config.tlsName));
4574 parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4575 parcel.servers = config.servers;
4576 parcel.tlsServers = config.tlsServers;
4577 parcel.tlsName = config.tlsName;
4578 repeatedSetResolversFromParcel(parcel);
Mike Yu61d17262020-02-15 18:56:22 +08004579 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu153b5b82020-03-04 19:53:54 +08004580
4581 // The stats remains when the list of search domains changes.
4582 parcel.domains.push_back("tmp.domains");
4583 repeatedSetResolversFromParcel(parcel);
Mike Yu61d17262020-02-15 18:56:22 +08004584 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu153b5b82020-03-04 19:53:54 +08004585
4586 // The stats remains when the parameters change (except maxSamples).
4587 parcel.sampleValiditySeconds++;
4588 parcel.successThreshold++;
4589 parcel.minSamples++;
4590 parcel.baseTimeoutMsec++;
4591 parcel.retryCount++;
4592 repeatedSetResolversFromParcel(parcel);
Mike Yu61d17262020-02-15 18:56:22 +08004593 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu153b5b82020-03-04 19:53:54 +08004594 }
4595
4596 // The cache remains.
4597 EXPECT_NE(safe_getaddrinfo(hostname, nullptr, &hints), nullptr);
4598 EXPECT_EQ(GetNumQueries(dns, hostname), 1U);
4599}
4600
4601TEST_F(ResolverTest, RepeatedSetup_NoRedundantPrivateDnsValidation) {
4602 const std::string addr1 = getUniqueIPv4Address(); // For a workable DNS server.
4603 const std::string addr2 = getUniqueIPv4Address(); // For an unresponsive DNS server.
4604 const std::string unusable_addr = getUniqueIPv4Address();
Mike Yubc4b9502020-03-20 13:14:00 +08004605 const auto waitForPrivateDnsStateUpdated = []() {
4606 // A buffer time for the PrivateDnsConfiguration instance to update its map,
4607 // mPrivateDnsValidateThreads, which is used for tracking validation threads.
4608 // Since there is a time gap between when PrivateDnsConfiguration reports
4609 // onPrivateDnsValidationEvent and when PrivateDnsConfiguration updates the map, this is a
4610 // workaround to avoid the test starts a subsequent resolver setup during the time gap.
4611 // TODO: Report onPrivateDnsValidationEvent after all the relevant updates are complete.
4612 // Reference to b/152009023.
4613 std::this_thread::sleep_for(20ms);
4614 };
Mike Yu153b5b82020-03-04 19:53:54 +08004615
4616 test::DNSResponder dns1(addr1);
4617 test::DNSResponder dns2(addr2);
4618 StartDns(dns1, {});
4619 StartDns(dns2, {});
4620 test::DnsTlsFrontend workableTls(addr1, "853", addr1, "53");
4621 test::DnsTlsFrontend unresponsiveTls(addr2, "853", addr2, "53");
4622 unresponsiveTls.setHangOnHandshakeForTesting(true);
4623 ASSERT_TRUE(workableTls.startServer());
4624 ASSERT_TRUE(unresponsiveTls.startServer());
4625
4626 // First setup.
4627 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4628 parcel.servers = {addr1, addr2, unusable_addr};
4629 parcel.tlsServers = {addr1, addr2, unusable_addr};
4630 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4631
4632 // Check the validation results.
4633 EXPECT_TRUE(WaitForPrivateDnsValidation(workableTls.listen_address(), true));
4634 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4635 EXPECT_EQ(unresponsiveTls.acceptConnectionsCount(), 1); // The validation is still in progress.
4636
4637 static const struct TestConfig {
4638 std::vector<std::string> tlsServers;
4639 std::string tlsName;
4640 } testConfigs[] = {
4641 {{addr1, addr2, unusable_addr}, ""},
4642 {{unusable_addr, addr1, addr2}, ""},
4643 {{unusable_addr, addr1, addr2}, kDefaultPrivateDnsHostName},
4644 {{addr1, addr2, unusable_addr}, kDefaultPrivateDnsHostName},
4645 };
4646
4647 std::string TlsNameLastTime;
4648 for (const auto& config : testConfigs) {
4649 SCOPED_TRACE(fmt::format("testConfig: [{}] [{}]", fmt::join(config.tlsServers, ","),
4650 config.tlsName));
4651 parcel.servers = config.tlsServers;
4652 parcel.tlsServers = config.tlsServers;
4653 parcel.tlsName = config.tlsName;
4654 parcel.caCertificate = config.tlsName.empty() ? "" : kCaCert;
4655
4656 const bool dnsModeChanged = (TlsNameLastTime != config.tlsName);
Mike Yubc4b9502020-03-20 13:14:00 +08004657
4658 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004659 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4660
4661 for (const auto& serverAddr : parcel.tlsServers) {
4662 SCOPED_TRACE(serverAddr);
4663 if (serverAddr == workableTls.listen_address()) {
4664 if (dnsModeChanged) {
4665 // In despite of the identical IP address, the server is regarded as a different
4666 // server when DnsTlsServer.name is different. The resolver treats it as a
4667 // different object and begins the validation process.
4668 EXPECT_TRUE(WaitForPrivateDnsValidation(serverAddr, true));
4669 }
4670 } else if (serverAddr == unresponsiveTls.listen_address()) {
4671 // No revalidation needed for the server which have been marked as in_progesss.
4672 } else {
4673 // Must be unusable_addr.
4674 // In opportunistic mode, when a validation for a private DNS server fails, the
4675 // resolver just marks the server as failed and doesn't re-evaluate it, but the
4676 // server can be re-evaluated when setResolverConfiguration() is called.
4677 // However, in strict mode, the resolver automatically re-evaluates the server and
4678 // marks the server as in_progress until the validation succeeds, so repeated setup
4679 // makes no effect.
4680 if (dnsModeChanged || config.tlsName.empty() /* not in strict mode */) {
4681 EXPECT_TRUE(WaitForPrivateDnsValidation(serverAddr, false));
4682 }
4683 }
4684 }
4685
4686 // Repeated setups make no effect in strict mode.
Mike Yubc4b9502020-03-20 13:14:00 +08004687 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004688 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4689 if (config.tlsName.empty()) {
4690 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4691 }
Mike Yubc4b9502020-03-20 13:14:00 +08004692 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004693 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4694 if (config.tlsName.empty()) {
4695 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4696 }
4697
4698 EXPECT_EQ(unresponsiveTls.acceptConnectionsCount(), 1);
4699
4700 TlsNameLastTime = config.tlsName;
4701 }
4702
4703 // Check that all the validation results are caught.
4704 // Note: it doesn't mean no validation being in progress.
4705 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr1));
4706 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr2));
4707 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(unusable_addr));
4708}
4709
4710TEST_F(ResolverTest, RepeatedSetup_KeepChangingPrivateDnsServers) {
4711 enum TlsServerState { WORKING, UNSUPPORTED, UNRESPONSIVE };
4712 const std::string addr1 = getUniqueIPv4Address();
4713 const std::string addr2 = getUniqueIPv4Address();
Mike Yu9a185882020-03-25 16:02:36 +08004714 const auto waitForPrivateDnsStateUpdated = []() {
4715 // A buffer time for PrivateDnsConfiguration to update its state. It prevents this test
4716 // being flaky. See b/152009023 for the reason.
4717 std::this_thread::sleep_for(20ms);
4718 };
Mike Yu153b5b82020-03-04 19:53:54 +08004719
4720 test::DNSResponder dns1(addr1);
4721 test::DNSResponder dns2(addr2);
4722 StartDns(dns1, {});
4723 StartDns(dns2, {});
4724 test::DnsTlsFrontend tls1(addr1, "853", addr1, "53");
4725 test::DnsTlsFrontend tls2(addr2, "853", addr2, "53");
4726 ASSERT_TRUE(tls1.startServer());
4727 ASSERT_TRUE(tls2.startServer());
4728
4729 static const struct TestConfig {
4730 std::string tlsServer;
4731 std::string tlsName;
4732 bool expectNothingHappenWhenServerUnsupported;
4733 bool expectNothingHappenWhenServerUnresponsive;
4734 std::string asTestName() const {
4735 return fmt::format("{}, {}, {}, {}", tlsServer, tlsName,
4736 expectNothingHappenWhenServerUnsupported,
4737 expectNothingHappenWhenServerUnresponsive);
4738 }
4739 } testConfigs[] = {
4740 {{addr1}, "", false, false},
4741 {{addr2}, "", false, false},
4742 {{addr1}, "", false, true},
4743 {{addr2}, "", false, true},
4744 {{addr1}, kDefaultPrivateDnsHostName, false, true},
4745 {{addr2}, kDefaultPrivateDnsHostName, false, true},
4746 {{addr1}, kDefaultPrivateDnsHostName, true, true},
4747 {{addr2}, kDefaultPrivateDnsHostName, true, true},
4748
4749 // There's no new validation to start because there are already two validation threads
4750 // running (one is for addr1, the other is for addr2). This is because the comparator
4751 // doesn't compare DnsTlsServer.name. Keep the design as-is until it's known to be
4752 // harmful.
4753 {{addr1}, "", true, true},
4754 {{addr2}, "", true, true},
4755 {{addr1}, "", true, true},
4756 {{addr2}, "", true, true},
4757 };
4758
4759 for (const auto& serverState : {WORKING, UNSUPPORTED, UNRESPONSIVE}) {
4760 int testIndex = 0;
4761 for (const auto& config : testConfigs) {
4762 SCOPED_TRACE(fmt::format("serverState:{} testIndex:{} testConfig:[{}]", serverState,
4763 testIndex++, config.asTestName()));
4764 auto& tls = (config.tlsServer == addr1) ? tls1 : tls2;
4765
4766 if (serverState == UNSUPPORTED && tls.running()) ASSERT_TRUE(tls.stopServer());
4767 if (serverState != UNSUPPORTED && !tls.running()) ASSERT_TRUE(tls.startServer());
4768
4769 tls.setHangOnHandshakeForTesting(serverState == UNRESPONSIVE);
4770 const int connectCountsBefore = tls.acceptConnectionsCount();
4771
Mike Yu9a185882020-03-25 16:02:36 +08004772 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004773 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4774 parcel.servers = {config.tlsServer};
4775 parcel.tlsServers = {config.tlsServer};
4776 parcel.tlsName = config.tlsName;
4777 parcel.caCertificate = config.tlsName.empty() ? "" : kCaCert;
4778 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4779
4780 if (serverState == WORKING) {
4781 EXPECT_TRUE(WaitForPrivateDnsValidation(config.tlsServer, true));
4782 } else if (serverState == UNSUPPORTED) {
4783 if (config.expectNothingHappenWhenServerUnsupported) {
4784 // It's possible that the resolver hasn't yet started to
4785 // connect. Wait a while.
4786 // TODO: See if we can get rid of the hard waiting time, such as comparing
4787 // the CountDiff across two tests.
4788 std::this_thread::sleep_for(100ms);
4789 EXPECT_EQ(tls.acceptConnectionsCount(), connectCountsBefore);
4790 } else {
4791 EXPECT_TRUE(WaitForPrivateDnsValidation(config.tlsServer, false));
4792 }
4793 } else {
4794 // Must be UNRESPONSIVE.
4795 // DnsTlsFrontend is the only signal for checking whether or not the resolver starts
4796 // another validation when the server is unresponsive.
4797 const int expectCountDiff =
4798 config.expectNothingHappenWhenServerUnresponsive ? 0 : 1;
4799 if (expectCountDiff == 0) {
4800 // It's possible that the resolver hasn't yet started to
4801 // connect. Wait a while.
4802 std::this_thread::sleep_for(100ms);
4803 }
4804 const auto condition = [&]() {
4805 return tls.acceptConnectionsCount() == connectCountsBefore + expectCountDiff;
4806 };
4807 EXPECT_TRUE(PollForCondition(condition));
4808 }
4809 }
4810
4811 // Set to off mode to reset the PrivateDnsConfiguration state.
4812 ResolverParamsParcel setupOffmode = DnsResponderClient::GetDefaultResolverParamsParcel();
4813 setupOffmode.tlsServers.clear();
4814 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(setupOffmode));
4815 }
4816
4817 // Check that all the validation results are caught.
4818 // Note: it doesn't mean no validation being in progress.
4819 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr1));
4820 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr2));
4821}
4822
Ken Chen26dc2b02020-06-16 18:49:39 +08004823TEST_F(ResolverTest, PermissionCheckOnCertificateInjection) {
4824 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4825 parcel.caCertificate = kCaCert;
4826 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk());
4827
4828 for (const uid_t uid : {AID_SYSTEM, TEST_UID}) {
4829 ScopedChangeUID scopedChangeUID(uid);
4830 auto status = mDnsClient.resolvService()->setResolverConfiguration(parcel);
4831 EXPECT_EQ(status.getExceptionCode(), EX_SECURITY);
4832 }
4833}
4834
Hungming Chenbb90ab32019-10-28 18:20:31 +08004835// Parameterized tests.
4836// TODO: Merge the existing tests as parameterized test if possible.
4837// TODO: Perhaps move parameterized tests to an independent file.
4838enum class CallType { GETADDRINFO, GETHOSTBYNAME };
4839class ResolverParameterizedTest : public ResolverTest,
Hungming Chen63779052019-10-30 15:06:13 +08004840 public testing::WithParamInterface<CallType> {
4841 protected:
Hungming Chen22617fd2019-12-06 12:15:45 +08004842 void VerifyQueryHelloExampleComV4(const test::DNSResponder& dns, const CallType calltype,
4843 const bool verifyNumQueries = true) {
Hungming Chen63779052019-10-30 15:06:13 +08004844 if (calltype == CallType::GETADDRINFO) {
4845 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4846 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4847 ASSERT_TRUE(result != nullptr);
4848 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4849 } else if (calltype == CallType::GETHOSTBYNAME) {
4850 const hostent* result = gethostbyname("hello");
4851 ASSERT_TRUE(result != nullptr);
4852 ASSERT_EQ(4, result->h_length);
4853 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
4854 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4855 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
4856 } else {
4857 FAIL() << "Unsupported call type: " << static_cast<uint32_t>(calltype);
4858 }
Hungming Chen22617fd2019-12-06 12:15:45 +08004859 if (verifyNumQueries) EXPECT_EQ(1U, GetNumQueries(dns, kHelloExampleCom));
Hungming Chen63779052019-10-30 15:06:13 +08004860 }
4861};
Hungming Chenbb90ab32019-10-28 18:20:31 +08004862
Hungming Chen63779052019-10-30 15:06:13 +08004863INSTANTIATE_TEST_SUITE_P(QueryCallTest, ResolverParameterizedTest,
Hungming Chenbb90ab32019-10-28 18:20:31 +08004864 testing::Values(CallType::GETADDRINFO, CallType::GETHOSTBYNAME),
4865 [](const testing::TestParamInfo<CallType>& info) {
Hungming Chenbb90ab32019-10-28 18:20:31 +08004866 switch (info.param) {
4867 case CallType::GETADDRINFO:
Hungming Chen63779052019-10-30 15:06:13 +08004868 return "GetAddrInfo";
Hungming Chenbb90ab32019-10-28 18:20:31 +08004869 case CallType::GETHOSTBYNAME:
Hungming Chen63779052019-10-30 15:06:13 +08004870 return "GetHostByName";
Hungming Chenbb90ab32019-10-28 18:20:31 +08004871 default:
Hungming Chen63779052019-10-30 15:06:13 +08004872 return "InvalidParameter"; // Should not happen.
Hungming Chenbb90ab32019-10-28 18:20:31 +08004873 }
Hungming Chenbb90ab32019-10-28 18:20:31 +08004874 });
4875
4876TEST_P(ResolverParameterizedTest, AuthoritySectionAndAdditionalSection) {
4877 // DNS response may have more information in authority section and additional section.
4878 // Currently, getanswer() of packages/modules/DnsResolver/getaddrinfo.cpp doesn't parse the
4879 // content of authority section and additional section. Test these sections if they crash
4880 // the resolver, just in case. See also RFC 1035 section 4.1.
4881 const auto& calltype = GetParam();
4882 test::DNSHeader header(kDefaultDnsHeader);
4883
4884 // Create a DNS response which has a authoritative nameserver record in authority
4885 // section and its relevant address record in additional section.
4886 //
4887 // Question
4888 // hello.example.com. IN A
4889 // Answer
4890 // hello.example.com. IN A 1.2.3.4
4891 // Authority:
4892 // hello.example.com. IN NS ns1.example.com.
4893 // Additional:
4894 // ns1.example.com. IN A 5.6.7.8
4895 //
4896 // A response may have only question, answer, and authority section. Current testing response
4897 // should be able to cover this condition.
4898
4899 // Question section.
4900 test::DNSQuestion question{
4901 .qname = {.name = kHelloExampleCom},
4902 .qtype = ns_type::ns_t_a,
4903 .qclass = ns_c_in,
4904 };
4905 header.questions.push_back(std::move(question));
4906
4907 // Answer section.
4908 test::DNSRecord recordAnswer{
4909 .name = {.name = kHelloExampleCom},
4910 .rtype = ns_type::ns_t_a,
4911 .rclass = ns_c_in,
4912 .ttl = 0, // no cache
4913 };
Hungming Chen63779052019-10-30 15:06:13 +08004914 EXPECT_TRUE(test::DNSResponder::fillRdata(kHelloExampleComAddrV4, recordAnswer));
Hungming Chenbb90ab32019-10-28 18:20:31 +08004915 header.answers.push_back(std::move(recordAnswer));
4916
4917 // Authority section.
4918 test::DNSRecord recordAuthority{
4919 .name = {.name = kHelloExampleCom},
4920 .rtype = ns_type::ns_t_ns,
4921 .rclass = ns_c_in,
4922 .ttl = 0, // no cache
4923 };
4924 EXPECT_TRUE(test::DNSResponder::fillRdata("ns1.example.com.", recordAuthority));
4925 header.authorities.push_back(std::move(recordAuthority));
4926
4927 // Additional section.
4928 test::DNSRecord recordAdditional{
4929 .name = {.name = "ns1.example.com."},
4930 .rtype = ns_type::ns_t_a,
4931 .rclass = ns_c_in,
4932 .ttl = 0, // no cache
4933 };
4934 EXPECT_TRUE(test::DNSResponder::fillRdata("5.6.7.8", recordAdditional));
4935 header.additionals.push_back(std::move(recordAdditional));
4936
4937 // Start DNS server.
4938 test::DNSResponder dns(test::DNSResponder::MappingType::DNS_HEADER);
4939 dns.addMappingDnsHeader(kHelloExampleCom, ns_type::ns_t_a, header);
4940 ASSERT_TRUE(dns.startServer());
4941 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4942 dns.clearQueries();
4943
4944 // Expect that get the address and the resolver doesn't crash.
Hungming Chen63779052019-10-30 15:06:13 +08004945 VerifyQueryHelloExampleComV4(dns, calltype);
4946}
4947
4948TEST_P(ResolverParameterizedTest, MessageCompression) {
4949 const auto& calltype = GetParam();
4950
4951 // The response with compressed domain name by a pointer. See RFC 1035 section 4.1.4.
4952 //
4953 // Ignoring the other fields of the message, the domain name of question section and answer
4954 // section are presented as:
4955 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4956 // 12 | 5 | h |
4957 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4958 // 14 | e | l |
4959 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4960 // 16 | l | o |
4961 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4962 // 18 | 7 | e |
4963 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4964 // 20 | x | a |
4965 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4966 // 22 | m | p |
4967 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4968 // 24 | l | e |
4969 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4970 // 26 | 3 | c |
4971 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4972 // 28 | o | m |
4973 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4974 // 30 | 0 | ... |
4975 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4976 //
4977 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4978 // 35 | 1 1| 12 |
4979 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4980 const std::vector<uint8_t> kResponseAPointer = {
4981 /* Header */
4982 0x00, 0x00, /* Transaction ID: 0x0000 */
4983 0x81, 0x80, /* Flags: qr rd ra */
4984 0x00, 0x01, /* Questions: 1 */
4985 0x00, 0x01, /* Answer RRs: 1 */
4986 0x00, 0x00, /* Authority RRs: 0 */
4987 0x00, 0x00, /* Additional RRs: 0 */
4988 /* Queries */
4989 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
4990 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name: hello.example.com */
4991 0x00, 0x01, /* Type: A */
4992 0x00, 0x01, /* Class: IN */
4993 /* Answers */
4994 0xc0, 0x0c, /* Name: hello.example.com (a pointer) */
4995 0x00, 0x01, /* Type: A */
4996 0x00, 0x01, /* Class: IN */
4997 0x00, 0x00, 0x00, 0x00, /* Time to live: 0 */
4998 0x00, 0x04, /* Data length: 4 */
4999 0x01, 0x02, 0x03, 0x04 /* Address: 1.2.3.4 */
5000 };
5001
5002 // The response with compressed domain name by a sequence of labels ending with a pointer. See
5003 // RFC 1035 section 4.1.4.
5004 //
5005 // Ignoring the other fields of the message, the domain name of question section and answer
5006 // section are presented as:
5007 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5008 // 12 | 5 | h |
5009 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5010 // 14 | e | l |
5011 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5012 // 16 | l | o |
5013 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5014 // 18 | 7 | e |
5015 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5016 // 20 | x | a |
5017 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5018 // 22 | m | p |
5019 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5020 // 24 | l | e |
5021 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5022 // 26 | 3 | c |
5023 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5024 // 28 | o | m |
5025 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5026 // 30 | 0 | ... |
5027 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5028 //
5029 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5030 // 35 | 5 | h |
5031 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5032 // 37 | e | l |
5033 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5034 // 39 | l | o |
5035 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5036 // 41 | 1 1| 18 |
5037 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5038 const std::vector<uint8_t> kResponseLabelEndingWithAPointer = {
5039 /* Header */
5040 0x00, 0x00, /* Transaction ID: 0x0000 */
5041 0x81, 0x80, /* Flags: qr rd ra */
5042 0x00, 0x01, /* Questions: 1 */
5043 0x00, 0x01, /* Answer RRs: 1 */
5044 0x00, 0x00, /* Authority RRs: 0 */
5045 0x00, 0x00, /* Additional RRs: 0 */
5046 /* Queries */
5047 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
5048 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name: hello.example.com */
5049 0x00, 0x01, /* Type: A */
5050 0x00, 0x01, /* Class: IN */
5051 /* Answers */
5052 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0xc0,
5053 0x12, /* Name: hello.example.com (a label ending with a pointer) */
5054 0x00, 0x01, /* Type: A */
5055 0x00, 0x01, /* Class: IN */
5056 0x00, 0x00, 0x00, 0x00, /* Time to live: 0 */
5057 0x00, 0x04, /* Data length: 4 */
5058 0x01, 0x02, 0x03, 0x04 /* Address: 1.2.3.4 */
5059 };
5060
5061 for (const auto& response : {kResponseAPointer, kResponseLabelEndingWithAPointer}) {
5062 SCOPED_TRACE(StringPrintf("Hex dump: %s", toHex(makeSlice(response)).c_str()));
5063
5064 test::DNSResponder dns(test::DNSResponder::MappingType::BINARY_PACKET);
5065 dns.addMappingBinaryPacket(kHelloExampleComQueryV4, response);
5066 StartDns(dns, {});
5067 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
5068
5069 // Expect no cache because the TTL of testing responses are 0.
5070 VerifyQueryHelloExampleComV4(dns, calltype);
Hungming Chenbb90ab32019-10-28 18:20:31 +08005071 }
Mike Yu40e67072019-10-09 21:14:09 +08005072}
Hungming Chen22617fd2019-12-06 12:15:45 +08005073
5074TEST_P(ResolverParameterizedTest, TruncatedResponse) {
5075 const auto& calltype = GetParam();
5076
Hungming Chen22617fd2019-12-06 12:15:45 +08005077 test::DNSResponder dns;
Ken Chen99344882020-01-01 14:59:38 +08005078 StartDns(dns, kLargeCnameChainRecords);
Hungming Chen22617fd2019-12-06 12:15:45 +08005079 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
5080
5081 // Expect UDP response is truncated. The resolver retries over TCP. See RFC 1035 section 4.2.1.
5082 VerifyQueryHelloExampleComV4(dns, calltype, false);
5083 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom));
5084 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom));
5085}
Luke Huang420ee622019-11-27 17:52:44 +08005086
5087TEST_F(ResolverTest, KeepListeningUDP) {
5088 constexpr char listen_addr1[] = "127.0.0.4";
5089 constexpr char listen_addr2[] = "127.0.0.5";
5090 constexpr char host_name[] = "howdy.example.com.";
5091 const std::vector<DnsRecord> records = {
5092 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
5093 };
5094 const std::vector<int> params = {300, 25, 8, 8, 1000 /* BASE_TIMEOUT_MSEC */,
5095 1 /* retry count */};
5096 const int delayTimeMs = 1500;
5097
5098 test::DNSResponder neverRespondDns(listen_addr2, "53", static_cast<ns_rcode>(-1));
5099 neverRespondDns.setResponseProbability(0.0);
5100 StartDns(neverRespondDns, records);
Luke Huangf40df9c2020-04-21 08:51:48 +08005101 ScopedSystemProperties scopedSystemProperties(
5102 "persist.device_config.netd_native.keep_listening_udp", "1");
5103 // Re-setup test network to make experiment flag take effect.
5104 resetNetwork();
Luke Huang420ee622019-11-27 17:52:44 +08005105
5106 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr1, listen_addr2},
5107 kDefaultSearchDomains, params));
5108 // There are 2 DNS servers for this test.
5109 // |delayedDns| will be blocked for |delayTimeMs|, then start to respond to requests.
5110 // |neverRespondDns| will never respond.
5111 // In the first try, resolver will send query to |delayedDns| but get timeout error
5112 // because |delayTimeMs| > DNS timeout.
5113 // Then it's the second try, resolver will send query to |neverRespondDns| and
5114 // listen on both servers. Resolver will receive the answer coming from |delayedDns|.
Luke Huang420ee622019-11-27 17:52:44 +08005115
Luke Huang420ee622019-11-27 17:52:44 +08005116 test::DNSResponder delayedDns(listen_addr1);
5117 delayedDns.setResponseDelayMs(delayTimeMs);
5118 StartDns(delayedDns, records);
5119
5120 // Specify hints to ensure resolver doing query only 1 round.
5121 const addrinfo hints = {.ai_family = AF_INET6, .ai_socktype = SOCK_DGRAM};
5122 ScopedAddrinfo result = safe_getaddrinfo(host_name, nullptr, &hints);
5123 EXPECT_TRUE(result != nullptr);
5124
5125 std::string result_str = ToString(result);
5126 EXPECT_TRUE(result_str == "::1.2.3.4") << ", result_str='" << result_str << "'";
5127}
Luke Huang0a0870d2020-02-12 20:41:10 +08005128
5129TEST_F(ResolverTest, GetAddrInfoParallelLookupTimeout) {
5130 constexpr char listen_addr[] = "127.0.0.4";
5131 constexpr char host_name[] = "howdy.example.com.";
5132 constexpr int TIMING_TOLERANCE_MS = 200;
5133 constexpr int DNS_TIMEOUT_MS = 1000;
5134 const std::vector<DnsRecord> records = {
5135 {host_name, ns_type::ns_t_a, "1.2.3.4"},
5136 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
5137 };
5138 const std::vector<int> params = {300, 25, 8, 8, DNS_TIMEOUT_MS /* BASE_TIMEOUT_MSEC */,
5139 1 /* retry count */};
5140 test::DNSResponder neverRespondDns(listen_addr, "53", static_cast<ns_rcode>(-1));
5141 neverRespondDns.setResponseProbability(0.0);
5142 StartDns(neverRespondDns, records);
Luke Huangf40df9c2020-04-21 08:51:48 +08005143 ScopedSystemProperties scopedSystemProperties(
5144 "persist.device_config.netd_native.parallel_lookup", "1");
Luke Huangd1d734f2020-04-30 12:25:40 +08005145 // The default value of parallel_lookup_sleep_time should be very small
5146 // that we can ignore in this test case.
Luke Huangf40df9c2020-04-21 08:51:48 +08005147 // Re-setup test network to make experiment flag take effect.
5148 resetNetwork();
Luke Huang0a0870d2020-02-12 20:41:10 +08005149
5150 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}, kDefaultSearchDomains, params));
5151 neverRespondDns.clearQueries();
5152
Luke Huang0a0870d2020-02-12 20:41:10 +08005153 // Use a never respond DNS server to verify if the A/AAAA queries are sent in parallel.
5154 // The resolver parameters are set to timeout 1s and retry 1 times.
5155 // So we expect the safe_getaddrinfo_time_taken() might take ~1s to
5156 // return when parallel lookup is enabled. And the DNS server should receive 2 queries.
5157 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_DGRAM};
5158 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(host_name, nullptr, hints);
5159
5160 EXPECT_TRUE(result == nullptr);
5161 EXPECT_NEAR(DNS_TIMEOUT_MS, timeTakenMs, TIMING_TOLERANCE_MS)
5162 << "took time should approximate equal timeout";
5163 EXPECT_EQ(2U, GetNumQueries(neverRespondDns, host_name));
Mike Yu532405f2020-06-17 17:46:44 +08005164 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, RCODE_TIMEOUT, host_name, {});
Luke Huang0a0870d2020-02-12 20:41:10 +08005165}
Luke Huangd1d734f2020-04-30 12:25:40 +08005166
5167TEST_F(ResolverTest, GetAddrInfoParallelLookupSleepTime) {
5168 constexpr char listen_addr[] = "127.0.0.4";
5169 constexpr int TIMING_TOLERANCE_MS = 200;
5170 const std::vector<DnsRecord> records = {
5171 {kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4},
5172 {kHelloExampleCom, ns_type::ns_t_aaaa, kHelloExampleComAddrV6},
5173 };
5174 const std::vector<int> params = {300, 25, 8, 8, 1000 /* BASE_TIMEOUT_MSEC */,
5175 1 /* retry count */};
5176 test::DNSResponder dns(listen_addr);
5177 StartDns(dns, records);
5178 ScopedSystemProperties scopedSystemProperties1(
5179 "persist.device_config.netd_native.parallel_lookup", "1");
5180 constexpr int PARALLEL_LOOKUP_SLEEP_TIME_MS = 500;
5181 ScopedSystemProperties scopedSystemProperties2(
5182 "persist.device_config.netd_native.parallel_lookup_sleep_time",
5183 std::to_string(PARALLEL_LOOKUP_SLEEP_TIME_MS));
5184 // Re-setup test network to make experiment flag take effect.
5185 resetNetwork();
5186
5187 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}, kDefaultSearchDomains, params));
5188 dns.clearQueries();
5189
5190 // Expect the safe_getaddrinfo_time_taken() might take ~500ms to return because we set
5191 // parallel_lookup_sleep_time to 500ms.
5192 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_DGRAM};
5193 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(kHelloExampleCom, nullptr, hints);
5194
5195 EXPECT_NE(nullptr, result);
5196 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(
5197 {kHelloExampleComAddrV4, kHelloExampleComAddrV6}));
5198 EXPECT_NEAR(PARALLEL_LOOKUP_SLEEP_TIME_MS, timeTakenMs, TIMING_TOLERANCE_MS)
5199 << "took time should approximate equal timeout";
5200 EXPECT_EQ(2U, GetNumQueries(dns, kHelloExampleCom));
5201
5202 // Expect the PARALLEL_LOOKUP_SLEEP_TIME_MS won't affect the query under cache hit case.
5203 dns.clearQueries();
5204 std::tie(result, timeTakenMs) = safe_getaddrinfo_time_taken(kHelloExampleCom, nullptr, hints);
5205 EXPECT_NE(nullptr, result);
5206 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(
5207 {kHelloExampleComAddrV4, kHelloExampleComAddrV6}));
5208 EXPECT_GT(PARALLEL_LOOKUP_SLEEP_TIME_MS, timeTakenMs);
5209 EXPECT_EQ(0U, GetNumQueries(dns, kHelloExampleCom));
5210}
Luke Huangeb618ef2020-05-26 14:17:02 +08005211
5212TEST_F(ResolverTest, BlockDnsQueryUidDoesNotLeadToBadServer) {
5213 // This test relies on blocking traffic on loopback, which xt_qtaguid does not do.
5214 // See aosp/358413 and b/34444781 for why.
5215 SKIP_IF_BPF_NOT_SUPPORTED;
5216
5217 constexpr char listen_addr1[] = "127.0.0.4";
5218 constexpr char listen_addr2[] = "::1";
5219 test::DNSResponder dns1(listen_addr1);
5220 test::DNSResponder dns2(listen_addr2);
5221 StartDns(dns1, {});
5222 StartDns(dns2, {});
5223
5224 std::vector<std::string> servers = {listen_addr1, listen_addr2};
5225 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
5226 dns1.clearQueries();
5227 dns2.clearQueries();
5228 {
5229 ScopeBlockedUIDRule scopeBlockUidRule(mDnsClient.netdService(), TEST_UID);
5230 // Start querying ten times.
5231 for (int i = 0; i < 10; i++) {
5232 std::string hostName = fmt::format("blocked{}.com", i);
5233 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
Luke Huang5729afc2020-07-30 23:12:17 +08005234 // The query result between R+ and Q would be different, but we don't really care
5235 // about the result here because this test is only used to ensure blocked uid rule
5236 // won't cause bad servers.
5237 safe_getaddrinfo(hostName.c_str(), nullptr, &hints);
Luke Huangeb618ef2020-05-26 14:17:02 +08005238 }
5239 }
Luke Huang5729afc2020-07-30 23:12:17 +08005240 ResolverParamsParcel setupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
5241 // If api level >= 30 (R+), expect all query packets to be blocked, hence we should not see any
5242 // of their stats show up. Otherwise, all queries should succeed.
5243 const std::vector<NameserverStats> expectedDnsStats = {
5244 NameserverStats(listen_addr1).setSuccesses(isAtLeastR ? 0 : setupParams.maxSamples),
Luke Huangeb618ef2020-05-26 14:17:02 +08005245 NameserverStats(listen_addr2),
5246 };
Luke Huang5729afc2020-07-30 23:12:17 +08005247 expectStatsEqualTo(expectedDnsStats);
5248 // If api level >= 30 (R+), expect server won't receive any queries,
5249 // otherwise expect 20 == 10 * (setupParams.domains.size() + 1) queries.
5250 EXPECT_EQ(dns1.queries().size(), isAtLeastR ? 0U : 10 * (setupParams.domains.size() + 1));
Luke Huangeb618ef2020-05-26 14:17:02 +08005251 EXPECT_EQ(dns2.queries().size(), 0U);
5252}
Mike Yu6ce587d2019-12-19 21:30:22 +08005253
5254// ResolverMultinetworkTest is used to verify multinetwork functionality. Here's how it works:
5255// The resolver sends queries to address A, and then there will be a TunForwarder helping forward
5256// the packets to address B, which is the address on which the testing server is listening. The
5257// answer packets responded from the testing server go through the reverse path back to the
5258// resolver.
5259//
5260// To achieve the that, it needs to set up a interface with routing rules. Tests are not
5261// supposed to initiate DNS servers on their own; instead, some utilities are added to the class to
5262// help the setup.
5263//
5264// An example of how to use it:
5265// TEST_F() {
Luke Huang81568fb2020-07-13 00:55:12 +08005266// ScopedPhysicalNetwork network = CreateScopedPhysicalNetwork(V4);
Mike Yu6ce587d2019-12-19 21:30:22 +08005267// network.init();
5268//
5269// auto dns = network.addIpv4Dns();
5270// StartDns(dns.dnsServer, {});
5271//
Luke Huang81568fb2020-07-13 00:55:12 +08005272// network.setDnsConfiguration();
Mike Yu6ce587d2019-12-19 21:30:22 +08005273// network.startTunForwarder();
5274//
5275// // Send queries here
5276// }
5277
5278class ResolverMultinetworkTest : public ResolverTest {
5279 protected:
5280 enum class ConnectivityType { V4, V6, V4V6 };
Luke Huang81568fb2020-07-13 00:55:12 +08005281 static constexpr int TEST_NETID_BASE = 10000;
Mike Yu6ce587d2019-12-19 21:30:22 +08005282
5283 struct DnsServerPair {
Luke Huang81568fb2020-07-13 00:55:12 +08005284 DnsServerPair(std::shared_ptr<test::DNSResponder> server, std::string addr)
5285 : dnsServer(server), dnsAddr(addr) {}
5286 std::shared_ptr<test::DNSResponder> dnsServer;
Mike Yu6ce587d2019-12-19 21:30:22 +08005287 std::string dnsAddr; // The DNS server address used for setResolverConfiguration().
5288 // TODO: Add test::DnsTlsFrontend* and std::string for DoT.
5289 };
5290
5291 class ScopedNetwork {
5292 public:
5293 ScopedNetwork(unsigned netId, ConnectivityType type, INetd* netdSrv,
Luke Huang81568fb2020-07-13 00:55:12 +08005294 IDnsResolver* dnsResolvSrv, const char* networkName)
Mike Yu6ce587d2019-12-19 21:30:22 +08005295 : mNetId(netId),
5296 mConnectivityType(type),
5297 mNetdSrv(netdSrv),
Luke Huang81568fb2020-07-13 00:55:12 +08005298 mDnsResolvSrv(dnsResolvSrv),
5299 mNetworkName(networkName) {
5300 mIfname = fmt::format("testtun{}", netId);
Mike Yu6ce587d2019-12-19 21:30:22 +08005301 }
Luke Huang81568fb2020-07-13 00:55:12 +08005302 virtual ~ScopedNetwork() {
5303 if (mNetdSrv != nullptr) mNetdSrv->networkDestroy(mNetId);
5304 if (mDnsResolvSrv != nullptr) mDnsResolvSrv->destroyNetworkCache(mNetId);
5305 }
Mike Yu6ce587d2019-12-19 21:30:22 +08005306
5307 Result<void> init();
Mike Yu6ce587d2019-12-19 21:30:22 +08005308 Result<DnsServerPair> addIpv4Dns() { return addDns(ConnectivityType::V4); }
5309 Result<DnsServerPair> addIpv6Dns() { return addDns(ConnectivityType::V6); }
5310 bool startTunForwarder() { return mTunForwarder->startForwarding(); }
Luke Huang81568fb2020-07-13 00:55:12 +08005311 bool setDnsConfiguration() const;
5312 bool clearDnsConfiguration() const;
Mike Yu6ce587d2019-12-19 21:30:22 +08005313 unsigned netId() const { return mNetId; }
Luke Huang81568fb2020-07-13 00:55:12 +08005314 std::string name() const { return mNetworkName; }
Mike Yu6ce587d2019-12-19 21:30:22 +08005315
Luke Huang81568fb2020-07-13 00:55:12 +08005316 protected:
5317 // Subclasses should implement it to decide which network should be create.
5318 virtual Result<void> createNetwork() const = 0;
Mike Yu6ce587d2019-12-19 21:30:22 +08005319
5320 const unsigned mNetId;
5321 const ConnectivityType mConnectivityType;
5322 INetd* mNetdSrv;
5323 IDnsResolver* mDnsResolvSrv;
Luke Huang81568fb2020-07-13 00:55:12 +08005324 const std::string mNetworkName;
Mike Yu6ce587d2019-12-19 21:30:22 +08005325 std::string mIfname;
5326 std::unique_ptr<TunForwarder> mTunForwarder;
Luke Huang81568fb2020-07-13 00:55:12 +08005327 std::vector<DnsServerPair> mDnsServerPairs;
5328
5329 private:
5330 Result<DnsServerPair> addDns(ConnectivityType connectivity);
5331 // Assuming mNetId is unique during ResolverMultinetworkTest, make the
5332 // address based on it to avoid conflicts.
5333 std::string makeIpv4AddrString(uint8_t n) const {
5334 return StringPrintf("192.168.%u.%u", (mNetId - TEST_NETID_BASE), n);
5335 }
5336 std::string makeIpv6AddrString(uint8_t n) const {
5337 return StringPrintf("2001:db8:%u::%u", (mNetId - TEST_NETID_BASE), n);
5338 }
5339 };
5340
5341 class ScopedPhysicalNetwork : public ScopedNetwork {
5342 public:
5343 ScopedPhysicalNetwork(unsigned netId, const char* networkName)
5344 : ScopedNetwork(netId, ConnectivityType::V4V6, nullptr, nullptr, networkName) {}
5345 ScopedPhysicalNetwork(unsigned netId, ConnectivityType type, INetd* netdSrv,
5346 IDnsResolver* dnsResolvSrv, const char* name = "Physical")
5347 : ScopedNetwork(netId, type, netdSrv, dnsResolvSrv, name) {}
5348
5349 protected:
5350 Result<void> createNetwork() const override {
5351 if (auto r = mNetdSrv->networkCreatePhysical(mNetId, INetd::PERMISSION_NONE);
5352 !r.isOk()) {
5353 return Error() << r.getMessage();
5354 }
5355 return {};
5356 }
5357 };
5358
5359 class ScopedVirtualNetwork : public ScopedNetwork {
5360 public:
5361 ScopedVirtualNetwork(unsigned netId, ConnectivityType type, INetd* netdSrv,
5362 IDnsResolver* dnsResolvSrv, const char* name, bool isSecure)
5363 : ScopedNetwork(netId, type, netdSrv, dnsResolvSrv, name), mIsSecure(isSecure) {}
5364 ~ScopedVirtualNetwork() {
5365 if (!mVpnIsolationUids.empty()) {
5366 const std::vector<int> tmpUids(mVpnIsolationUids.begin(), mVpnIsolationUids.end());
5367 mNetdSrv->firewallRemoveUidInterfaceRules(tmpUids);
5368 }
5369 }
5370 // Enable VPN isolation. Ensures that uid can only receive packets on mIfname.
5371 Result<void> enableVpnIsolation(int uid) {
5372 if (auto r = mNetdSrv->firewallAddUidInterfaceRules(mIfname, {uid}); !r.isOk()) {
5373 return Error() << r.getMessage();
5374 }
5375 mVpnIsolationUids.insert(uid);
5376 return {};
5377 }
5378 Result<void> disableVpnIsolation(int uid) {
5379 if (auto r = mNetdSrv->firewallRemoveUidInterfaceRules({static_cast<int>(uid)});
5380 !r.isOk()) {
5381 return Error() << r.getMessage();
5382 }
5383 mVpnIsolationUids.erase(uid);
5384 return {};
5385 }
5386 Result<void> addUser(uid_t uid) const { return addUidRange(uid, uid); }
5387 Result<void> addUidRange(uid_t from, uid_t to) const {
5388 if (auto r = mNetdSrv->networkAddUidRanges(mNetId, {makeUidRangeParcel(from, to)});
5389 !r.isOk()) {
5390 return Error() << r.getMessage();
5391 }
5392 return {};
5393 }
5394
5395 protected:
5396 Result<void> createNetwork() const override {
5397 if (auto r = mNetdSrv->networkCreateVpn(mNetId, mIsSecure); !r.isOk()) {
5398 return Error() << r.getMessage();
5399 }
5400 return {};
5401 }
5402
5403 bool mIsSecure = false;
5404 std::unordered_set<int> mVpnIsolationUids;
Mike Yu6ce587d2019-12-19 21:30:22 +08005405 };
5406
5407 void SetUp() override {
5408 ResolverTest::SetUp();
5409 ASSERT_NE(mDnsClient.netdService(), nullptr);
5410 ASSERT_NE(mDnsClient.resolvService(), nullptr);
5411 }
5412
Luke Huang81568fb2020-07-13 00:55:12 +08005413 void TearDown() override {
5414 ResolverTest::TearDown();
5415 // Restore default network
5416 if (mStoredDefaultNetwork >= 0) {
5417 mDnsClient.netdService()->networkSetDefault(mStoredDefaultNetwork);
5418 }
5419 }
Mike Yu6ce587d2019-12-19 21:30:22 +08005420
Luke Huang81568fb2020-07-13 00:55:12 +08005421 ScopedPhysicalNetwork CreateScopedPhysicalNetwork(ConnectivityType type,
5422 const char* name = "Physical") {
5423 return {getFreeNetId(), type, mDnsClient.netdService(), mDnsClient.resolvService(), name};
5424 }
5425 ScopedVirtualNetwork CreateScopedVirtualNetwork(ConnectivityType type, bool isSecure,
5426 const char* name = "Virtual") {
5427 return {getFreeNetId(), type, mDnsClient.netdService(), mDnsClient.resolvService(),
5428 name, isSecure};
5429 }
Mike Yu6ce587d2019-12-19 21:30:22 +08005430 void StartDns(test::DNSResponder& dns, const std::vector<DnsRecord>& records);
Luke Huang81568fb2020-07-13 00:55:12 +08005431 void setDefaultNetwork(int netId) {
5432 // Save current default network at the first call.
5433 std::call_once(defaultNetworkFlag, [&]() {
5434 ASSERT_TRUE(mDnsClient.netdService()->networkGetDefault(&mStoredDefaultNetwork).isOk());
5435 });
5436 ASSERT_TRUE(mDnsClient.netdService()->networkSetDefault(netId).isOk());
5437 }
5438 unsigned getFreeNetId() {
5439 if (mNextNetId == TEST_NETID_BASE + 256) mNextNetId = TEST_NETID_BASE;
5440 return mNextNetId++;
5441 }
Mike Yu6ce587d2019-12-19 21:30:22 +08005442
5443 private:
5444 // Use a different netId because this class inherits from the class ResolverTest which
Luke Huang81568fb2020-07-13 00:55:12 +08005445 // always creates TEST_NETID in setup. It's incremented when CreateScoped{Physical,
5446 // Virtual}Network() is called.
5447 // Note: 255 is the maximum number of (mNextNetId - TEST_NETID_BASE) here as mNextNetId
5448 // is used to create address.
5449 unsigned mNextNetId = TEST_NETID_BASE;
5450 // Use -1 to represent that default network was not modified because
5451 // real netId must be an unsigned value.
5452 int mStoredDefaultNetwork = -1;
5453 std::once_flag defaultNetworkFlag;
Mike Yu6ce587d2019-12-19 21:30:22 +08005454};
5455
Mike Yu6ce587d2019-12-19 21:30:22 +08005456Result<void> ResolverMultinetworkTest::ScopedNetwork::init() {
Luke Huang81568fb2020-07-13 00:55:12 +08005457 if (mNetdSrv == nullptr || mDnsResolvSrv == nullptr) return Error() << "srv not available";
Mike Yu6ce587d2019-12-19 21:30:22 +08005458 unique_fd ufd = TunForwarder::createTun(mIfname);
5459 if (!ufd.ok()) {
5460 return Errorf("createTun for {} failed", mIfname);
5461 }
5462 mTunForwarder = std::make_unique<TunForwarder>(std::move(ufd));
5463
Luke Huang81568fb2020-07-13 00:55:12 +08005464 if (auto r = createNetwork(); !r.ok()) {
5465 return r;
Mike Yu6ce587d2019-12-19 21:30:22 +08005466 }
5467 if (auto r = mDnsResolvSrv->createNetworkCache(mNetId); !r.isOk()) {
5468 return Error() << r.getMessage();
5469 }
5470 if (auto r = mNetdSrv->networkAddInterface(mNetId, mIfname); !r.isOk()) {
5471 return Error() << r.getMessage();
5472 }
5473
5474 if (mConnectivityType == ConnectivityType::V4 || mConnectivityType == ConnectivityType::V4V6) {
5475 const std::string v4Addr = makeIpv4AddrString(1);
5476 if (auto r = mNetdSrv->interfaceAddAddress(mIfname, v4Addr, 32); !r.isOk()) {
5477 return Error() << r.getMessage();
5478 }
5479 if (auto r = mNetdSrv->networkAddRoute(mNetId, mIfname, "0.0.0.0/0", ""); !r.isOk()) {
5480 return Error() << r.getMessage();
5481 }
5482 }
5483 if (mConnectivityType == ConnectivityType::V6 || mConnectivityType == ConnectivityType::V4V6) {
5484 const std::string v6Addr = makeIpv6AddrString(1);
5485 if (auto r = mNetdSrv->interfaceAddAddress(mIfname, v6Addr, 128); !r.isOk()) {
5486 return Error() << r.getMessage();
5487 }
5488 if (auto r = mNetdSrv->networkAddRoute(mNetId, mIfname, "::/0", ""); !r.isOk()) {
5489 return Error() << r.getMessage();
5490 }
5491 }
5492
5493 return {};
5494}
5495
Mike Yu6ce587d2019-12-19 21:30:22 +08005496void ResolverMultinetworkTest::StartDns(test::DNSResponder& dns,
5497 const std::vector<DnsRecord>& records) {
5498 ResolverTest::StartDns(dns, records);
5499
5500 // Bind the DNSResponder's sockets to the network if specified.
5501 if (std::optional<unsigned> netId = dns.getNetwork(); netId.has_value()) {
5502 setNetworkForSocket(netId.value(), dns.getUdpSocket());
5503 setNetworkForSocket(netId.value(), dns.getTcpSocket());
5504 }
5505}
5506
5507Result<ResolverMultinetworkTest::DnsServerPair> ResolverMultinetworkTest::ScopedNetwork::addDns(
5508 ConnectivityType type) {
Luke Huang81568fb2020-07-13 00:55:12 +08005509 const int index = mDnsServerPairs.size();
Mike Yu6ce587d2019-12-19 21:30:22 +08005510 const int prefixLen = (type == ConnectivityType::V4) ? 32 : 128;
5511
5512 const std::function<std::string(unsigned)> makeIpString =
5513 std::bind((type == ConnectivityType::V4) ? &ScopedNetwork::makeIpv4AddrString
5514 : &ScopedNetwork::makeIpv6AddrString,
5515 this, std::placeholders::_1);
5516
5517 std::string src1 = makeIpString(1); // The address from which the resolver will send.
Luke Huang81568fb2020-07-13 00:55:12 +08005518 std::string dst1 = makeIpString(
5519 index + 100 +
5520 (mNetId - TEST_NETID_BASE)); // The address to which the resolver will send.
Mike Yu6ce587d2019-12-19 21:30:22 +08005521 std::string src2 = dst1; // The address translated from src1.
Luke Huang81568fb2020-07-13 00:55:12 +08005522 std::string dst2 = makeIpString(
5523 index + 200 + (mNetId - TEST_NETID_BASE)); // The address translated from dst2.
Mike Yu6ce587d2019-12-19 21:30:22 +08005524
5525 if (!mTunForwarder->addForwardingRule({src1, dst1}, {src2, dst2}) ||
5526 !mTunForwarder->addForwardingRule({dst2, src2}, {dst1, src1})) {
5527 return Errorf("Failed to add the rules ({}, {}, {}, {})", src1, dst1, src2, dst2);
5528 }
5529
5530 if (!mNetdSrv->interfaceAddAddress(mIfname, dst2, prefixLen).isOk()) {
5531 return Errorf("interfaceAddAddress({}, {}, {}) failed", mIfname, dst2, prefixLen);
5532 }
5533
Luke Huang81568fb2020-07-13 00:55:12 +08005534 return mDnsServerPairs.emplace_back(std::make_shared<test::DNSResponder>(mNetId, dst2), dst1);
Mike Yu6ce587d2019-12-19 21:30:22 +08005535}
5536
Luke Huang81568fb2020-07-13 00:55:12 +08005537bool ResolverMultinetworkTest::ScopedNetwork::setDnsConfiguration() const {
5538 if (mDnsResolvSrv == nullptr) return false;
5539 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
5540 parcel.tlsServers.clear();
5541 parcel.netId = mNetId;
5542 parcel.servers.clear();
5543 for (const auto& pair : mDnsServerPairs) {
5544 parcel.servers.push_back(pair.dnsAddr);
5545 }
5546 return mDnsResolvSrv->setResolverConfiguration(parcel).isOk();
5547}
5548
5549bool ResolverMultinetworkTest::ScopedNetwork::clearDnsConfiguration() const {
5550 if (mDnsResolvSrv == nullptr) return false;
5551 return mDnsResolvSrv->destroyNetworkCache(mNetId).isOk() &&
5552 mDnsResolvSrv->createNetworkCache(mNetId).isOk();
5553}
5554
5555namespace {
5556
5557// Convenient wrapper for making getaddrinfo call like framework.
5558Result<ScopedAddrinfo> android_getaddrinfofornet_wrapper(const char* name, int netId) {
5559 // Use the same parameter as libcore/ojluni/src/main/java/java/net/Inet6AddressImpl.java.
5560 static const addrinfo hints = {
5561 .ai_flags = AI_ADDRCONFIG,
5562 .ai_family = AF_UNSPEC,
5563 .ai_socktype = SOCK_STREAM,
5564 };
5565 addrinfo* result = nullptr;
5566 if (int r = android_getaddrinfofornet(name, nullptr, &hints, netId, MARK_UNSET, &result)) {
5567 return Error() << r;
5568 }
5569 return ScopedAddrinfo(result);
5570}
5571
5572void expectDnsWorksForUid(const char* name, unsigned netId, uid_t uid,
5573 const std::vector<std::string>& expectedResult) {
5574 ScopedChangeUID scopedChangeUID(uid);
5575 auto result = android_getaddrinfofornet_wrapper(name, netId);
5576 ASSERT_RESULT_OK(result);
5577 ScopedAddrinfo ai_result(std::move(result.value()));
5578 std::vector<std::string> result_strs = ToStrings(ai_result);
5579 EXPECT_THAT(result_strs, testing::UnorderedElementsAreArray(expectedResult));
5580}
5581
5582} // namespace
5583
Mike Yu6ce587d2019-12-19 21:30:22 +08005584TEST_F(ResolverMultinetworkTest, GetAddrInfo_AI_ADDRCONFIG) {
5585 constexpr char host_name[] = "ohayou.example.com.";
5586
5587 const std::array<ConnectivityType, 3> allTypes = {
5588 ConnectivityType::V4,
5589 ConnectivityType::V6,
5590 ConnectivityType::V4V6,
5591 };
5592 for (const auto& type : allTypes) {
5593 SCOPED_TRACE(StringPrintf("ConnectivityType: %d", type));
5594
5595 // Create a network.
Luke Huang81568fb2020-07-13 00:55:12 +08005596 ScopedPhysicalNetwork network = CreateScopedPhysicalNetwork(type);
Mike Yu6ce587d2019-12-19 21:30:22 +08005597 ASSERT_RESULT_OK(network.init());
5598
5599 // Add a testing DNS server.
5600 const Result<DnsServerPair> dnsPair =
5601 (type == ConnectivityType::V4) ? network.addIpv4Dns() : network.addIpv6Dns();
5602 ASSERT_RESULT_OK(dnsPair);
Luke Huang81568fb2020-07-13 00:55:12 +08005603 StartDns(*dnsPair->dnsServer, {{host_name, ns_type::ns_t_a, "192.0.2.0"},
5604 {host_name, ns_type::ns_t_aaaa, "2001:db8:cafe:d00d::31"}});
Mike Yu6ce587d2019-12-19 21:30:22 +08005605
5606 // Set up resolver and start forwarding.
Luke Huang81568fb2020-07-13 00:55:12 +08005607 ASSERT_TRUE(network.setDnsConfiguration());
Mike Yu6ce587d2019-12-19 21:30:22 +08005608 ASSERT_TRUE(network.startTunForwarder());
5609
Luke Huang81568fb2020-07-13 00:55:12 +08005610 auto result = android_getaddrinfofornet_wrapper(host_name, network.netId());
5611 ASSERT_RESULT_OK(result);
5612 ScopedAddrinfo ai_result(std::move(result.value()));
Mike Yu6ce587d2019-12-19 21:30:22 +08005613 std::vector<std::string> result_strs = ToStrings(ai_result);
5614 std::vector<std::string> expectedResult;
5615 size_t expectedQueries = 0;
5616
5617 if (type == ConnectivityType::V6 || type == ConnectivityType::V4V6) {
5618 expectedResult.emplace_back("2001:db8:cafe:d00d::31");
5619 expectedQueries++;
5620 }
5621 if (type == ConnectivityType::V4 || type == ConnectivityType::V4V6) {
Luke Huang81568fb2020-07-13 00:55:12 +08005622 expectedResult.emplace_back("192.0.2.0");
Mike Yu6ce587d2019-12-19 21:30:22 +08005623 expectedQueries++;
5624 }
5625 EXPECT_THAT(result_strs, testing::UnorderedElementsAreArray(expectedResult));
Luke Huang81568fb2020-07-13 00:55:12 +08005626 EXPECT_EQ(GetNumQueries(*dnsPair->dnsServer, host_name), expectedQueries);
Mike Yu6ce587d2019-12-19 21:30:22 +08005627 }
5628}
5629
5630TEST_F(ResolverMultinetworkTest, NetworkDestroyedDuringQueryInFlight) {
5631 constexpr char host_name[] = "ohayou.example.com.";
5632
5633 // Create a network and add an ipv4 DNS server.
Luke Huang81568fb2020-07-13 00:55:12 +08005634 auto network = std::make_unique<ScopedPhysicalNetwork>(getFreeNetId(), ConnectivityType::V4V6,
5635 mDnsClient.netdService(),
5636 mDnsClient.resolvService());
Mike Yu6ce587d2019-12-19 21:30:22 +08005637 ASSERT_RESULT_OK(network->init());
5638 const Result<DnsServerPair> dnsPair = network->addIpv4Dns();
5639 ASSERT_RESULT_OK(dnsPair);
5640
5641 // Set the DNS server unresponsive.
Luke Huang81568fb2020-07-13 00:55:12 +08005642 dnsPair->dnsServer->setResponseProbability(0.0);
5643 dnsPair->dnsServer->setErrorRcode(static_cast<ns_rcode>(-1));
5644 StartDns(*dnsPair->dnsServer, {});
Mike Yu6ce587d2019-12-19 21:30:22 +08005645
5646 // Set up resolver and start forwarding.
Luke Huang81568fb2020-07-13 00:55:12 +08005647 ASSERT_TRUE(network->setDnsConfiguration());
Mike Yu6ce587d2019-12-19 21:30:22 +08005648 ASSERT_TRUE(network->startTunForwarder());
5649
5650 // Expect the things happening in order:
5651 // 1. The thread sends the query to the dns server which is unresponsive.
5652 // 2. The network is destroyed while the thread is waiting for the response from the dns server.
5653 // 3. After the dns server timeout, the thread retries but fails to connect.
5654 std::thread lookup([&]() {
5655 int fd = resNetworkQuery(network->netId(), host_name, ns_c_in, ns_t_a, 0);
5656 EXPECT_TRUE(fd != -1);
5657 expectAnswersNotValid(fd, -ETIMEDOUT);
5658 });
5659
5660 // Tear down the network as soon as the dns server receives the query.
Luke Huang81568fb2020-07-13 00:55:12 +08005661 const auto condition = [&]() { return GetNumQueries(*dnsPair->dnsServer, host_name) == 1U; };
Mike Yu6ce587d2019-12-19 21:30:22 +08005662 EXPECT_TRUE(PollForCondition(condition));
5663 network.reset();
5664
5665 lookup.join();
5666}
5667
5668TEST_F(ResolverMultinetworkTest, OneCachePerNetwork) {
5669 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
5670 constexpr char host_name[] = "ohayou.example.com.";
5671
Luke Huang81568fb2020-07-13 00:55:12 +08005672 ScopedPhysicalNetwork network1 = CreateScopedPhysicalNetwork(ConnectivityType::V4V6);
5673 ScopedPhysicalNetwork network2 = CreateScopedPhysicalNetwork(ConnectivityType::V4V6);
Mike Yu6ce587d2019-12-19 21:30:22 +08005674 ASSERT_RESULT_OK(network1.init());
5675 ASSERT_RESULT_OK(network2.init());
5676
5677 const Result<DnsServerPair> dnsPair1 = network1.addIpv4Dns();
5678 const Result<DnsServerPair> dnsPair2 = network2.addIpv4Dns();
5679 ASSERT_RESULT_OK(dnsPair1);
5680 ASSERT_RESULT_OK(dnsPair2);
Luke Huang81568fb2020-07-13 00:55:12 +08005681 StartDns(*dnsPair1->dnsServer, {{host_name, ns_type::ns_t_a, "192.0.2.0"}});
5682 StartDns(*dnsPair2->dnsServer, {{host_name, ns_type::ns_t_a, "192.0.2.1"}});
Mike Yu6ce587d2019-12-19 21:30:22 +08005683
5684 // Set up resolver for network 1 and start forwarding.
Luke Huang81568fb2020-07-13 00:55:12 +08005685 ASSERT_TRUE(network1.setDnsConfiguration());
Mike Yu6ce587d2019-12-19 21:30:22 +08005686 ASSERT_TRUE(network1.startTunForwarder());
5687
5688 // Set up resolver for network 2 and start forwarding.
Luke Huang81568fb2020-07-13 00:55:12 +08005689 ASSERT_TRUE(network2.setDnsConfiguration());
Mike Yu6ce587d2019-12-19 21:30:22 +08005690 ASSERT_TRUE(network2.startTunForwarder());
5691
5692 // Send the same queries to both networks.
5693 int fd1 = resNetworkQuery(network1.netId(), host_name, ns_c_in, ns_t_a, 0);
5694 int fd2 = resNetworkQuery(network2.netId(), host_name, ns_c_in, ns_t_a, 0);
5695
Luke Huang81568fb2020-07-13 00:55:12 +08005696 expectAnswersValid(fd1, AF_INET, "192.0.2.0");
5697 expectAnswersValid(fd2, AF_INET, "192.0.2.1");
5698 EXPECT_EQ(GetNumQueries(*dnsPair1->dnsServer, host_name), 1U);
5699 EXPECT_EQ(GetNumQueries(*dnsPair2->dnsServer, host_name), 1U);
Mike Yu6ce587d2019-12-19 21:30:22 +08005700
5701 // Flush the cache of network 1, and send the queries again.
5702 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(network1.netId()).isOk());
5703 fd1 = resNetworkQuery(network1.netId(), host_name, ns_c_in, ns_t_a, 0);
5704 fd2 = resNetworkQuery(network2.netId(), host_name, ns_c_in, ns_t_a, 0);
5705
Luke Huang81568fb2020-07-13 00:55:12 +08005706 expectAnswersValid(fd1, AF_INET, "192.0.2.0");
5707 expectAnswersValid(fd2, AF_INET, "192.0.2.1");
5708 EXPECT_EQ(GetNumQueries(*dnsPair1->dnsServer, host_name), 2U);
5709 EXPECT_EQ(GetNumQueries(*dnsPair2->dnsServer, host_name), 1U);
5710}
5711
5712TEST_F(ResolverMultinetworkTest, DnsWithVpn) {
5713 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
5714 SKIP_IF_BPF_NOT_SUPPORTED;
5715 constexpr char host_name[] = "ohayou.example.com.";
5716 constexpr char ipv4_addr[] = "192.0.2.0";
5717 constexpr char ipv6_addr[] = "2001:db8:cafe:d00d::31";
5718
5719 const std::pair<ConnectivityType, std::vector<std::string>> testPairs[] = {
5720 {ConnectivityType::V4, {ipv4_addr}},
5721 {ConnectivityType::V6, {ipv6_addr}},
5722 {ConnectivityType::V4V6, {ipv6_addr, ipv4_addr}},
5723 };
5724 for (const auto& [type, result] : testPairs) {
5725 SCOPED_TRACE(StringPrintf("ConnectivityType: %d", type));
5726
5727 // Create a network.
5728 ScopedPhysicalNetwork underlyingNetwork = CreateScopedPhysicalNetwork(type, "Underlying");
5729 ScopedVirtualNetwork bypassableVpnNetwork =
5730 CreateScopedVirtualNetwork(type, false, "BypassableVpn");
5731 ScopedVirtualNetwork secureVpnNetwork = CreateScopedVirtualNetwork(type, true, "SecureVpn");
5732
5733 ASSERT_RESULT_OK(underlyingNetwork.init());
5734 ASSERT_RESULT_OK(bypassableVpnNetwork.init());
5735 ASSERT_RESULT_OK(secureVpnNetwork.init());
5736 ASSERT_RESULT_OK(bypassableVpnNetwork.addUser(TEST_UID));
5737 ASSERT_RESULT_OK(secureVpnNetwork.addUser(TEST_UID2));
5738
5739 auto setupDnsFn = [&](std::shared_ptr<test::DNSResponder> dnsServer,
5740 ScopedNetwork* nw) -> void {
5741 StartDns(*dnsServer, {{host_name, ns_type::ns_t_a, ipv4_addr},
5742 {host_name, ns_type::ns_t_aaaa, ipv6_addr}});
5743 ASSERT_TRUE(nw->setDnsConfiguration());
5744 ASSERT_TRUE(nw->startTunForwarder());
5745 };
5746 // Add a testing DNS server to networks.
5747 const Result<DnsServerPair> underlyingPair = (type == ConnectivityType::V4)
5748 ? underlyingNetwork.addIpv4Dns()
5749 : underlyingNetwork.addIpv6Dns();
5750 ASSERT_RESULT_OK(underlyingPair);
5751 const Result<DnsServerPair> bypassableVpnPair = (type == ConnectivityType::V4)
5752 ? bypassableVpnNetwork.addIpv4Dns()
5753 : bypassableVpnNetwork.addIpv6Dns();
5754 ASSERT_RESULT_OK(bypassableVpnPair);
5755 const Result<DnsServerPair> secureVpnPair = (type == ConnectivityType::V4)
5756 ? secureVpnNetwork.addIpv4Dns()
5757 : secureVpnNetwork.addIpv6Dns();
5758 ASSERT_RESULT_OK(secureVpnPair);
5759 // Set up resolver and start forwarding for networks.
5760 setupDnsFn(underlyingPair->dnsServer, &underlyingNetwork);
5761 setupDnsFn(bypassableVpnPair->dnsServer, &bypassableVpnNetwork);
5762 setupDnsFn(secureVpnPair->dnsServer, &secureVpnNetwork);
5763
5764 setDefaultNetwork(underlyingNetwork.netId());
5765 const unsigned underlyingNetId = underlyingNetwork.netId();
5766 const unsigned bypassableVpnNetId = bypassableVpnNetwork.netId();
5767 const unsigned secureVpnNetId = secureVpnNetwork.netId();
5768 // We've called setNetworkForProcess in SetupOemNetwork, so reset to default first.
5769 ScopedSetNetworkForProcess scopedSetNetworkForProcess(NETID_UNSET);
5770 auto expectDnsQueryCountsFn = [&](size_t count,
5771 std::shared_ptr<test::DNSResponder> dnsServer,
5772 unsigned expectedDnsNetId) -> void {
5773 EXPECT_EQ(GetNumQueries(*dnsServer, host_name), count);
5774 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(expectedDnsNetId).isOk());
5775 dnsServer->clearQueries();
5776 // Give DnsResolver some time to clear cache to avoid race.
5777 usleep(5 * 1000);
5778 };
5779
5780 // Create a object to represent default network, do not init it.
5781 ScopedPhysicalNetwork defaultNetwork{NETID_UNSET, "Default"};
5782
5783 // Test VPN with DNS server under 4 different network selection scenarios.
5784 // See the test config for the expectation.
5785 const struct TestConfig {
5786 ScopedNetwork* selectedNetwork;
5787 unsigned expectedDnsNetId;
5788 std::shared_ptr<test::DNSResponder> expectedDnsServer;
5789 } vpnWithDnsServerConfigs[]{
5790 // clang-format off
5791 // Queries use the bypassable VPN by default.
5792 {&defaultNetwork, bypassableVpnNetId, bypassableVpnPair->dnsServer},
5793 // Choosing the underlying network works because the VPN is bypassable.
5794 {&underlyingNetwork, underlyingNetId, underlyingPair->dnsServer},
5795 // Selecting the VPN sends the query on the VPN.
5796 {&bypassableVpnNetwork, bypassableVpnNetId, bypassableVpnPair->dnsServer},
5797 // TEST_UID does not have access to the secure VPN.
5798 {&secureVpnNetwork, bypassableVpnNetId, bypassableVpnPair->dnsServer},
5799 // clang-format on
5800 };
5801 for (const auto& config : vpnWithDnsServerConfigs) {
5802 SCOPED_TRACE(fmt::format("Bypassble VPN with DnsServer, selectedNetwork = {}",
5803 config.selectedNetwork->name()));
5804 expectDnsWorksForUid(host_name, config.selectedNetwork->netId(), TEST_UID, result);
5805 expectDnsQueryCountsFn(result.size(), config.expectedDnsServer,
5806 config.expectedDnsNetId);
5807 }
5808
5809 std::vector<ScopedNetwork*> nwVec{&defaultNetwork, &underlyingNetwork,
5810 &bypassableVpnNetwork, &secureVpnNetwork};
5811 // Test the VPN without DNS server with the same combination as before.
5812 ASSERT_TRUE(bypassableVpnNetwork.clearDnsConfiguration());
5813 // Test bypassable VPN, TEST_UID
5814 for (const auto* selectedNetwork : nwVec) {
5815 SCOPED_TRACE(fmt::format("Bypassble VPN without DnsServer, selectedNetwork = {}",
5816 selectedNetwork->name()));
5817 expectDnsWorksForUid(host_name, selectedNetwork->netId(), TEST_UID, result);
5818 expectDnsQueryCountsFn(result.size(), underlyingPair->dnsServer, underlyingNetId);
5819 }
5820
5821 // The same test scenario as before plus enableVpnIsolation for secure VPN, TEST_UID2.
5822 for (bool enableVpnIsolation : {false, true}) {
5823 SCOPED_TRACE(fmt::format("enableVpnIsolation = {}", enableVpnIsolation));
5824 if (enableVpnIsolation) {
5825 EXPECT_RESULT_OK(secureVpnNetwork.enableVpnIsolation(TEST_UID2));
5826 }
5827
5828 // Test secure VPN without DNS server.
5829 ASSERT_TRUE(secureVpnNetwork.clearDnsConfiguration());
5830 for (const auto* selectedNetwork : nwVec) {
5831 SCOPED_TRACE(fmt::format("Secure VPN without DnsServer, selectedNetwork = {}",
5832 selectedNetwork->name()));
5833 expectDnsWorksForUid(host_name, selectedNetwork->netId(), TEST_UID2, result);
5834 expectDnsQueryCountsFn(result.size(), underlyingPair->dnsServer, underlyingNetId);
5835 }
5836
5837 // Test secure VPN with DNS server.
5838 ASSERT_TRUE(secureVpnNetwork.setDnsConfiguration());
5839 for (const auto* selectedNetwork : nwVec) {
5840 SCOPED_TRACE(fmt::format("Secure VPN with DnsServer, selectedNetwork = {}",
5841 selectedNetwork->name()));
5842 expectDnsWorksForUid(host_name, selectedNetwork->netId(), TEST_UID2, result);
5843 expectDnsQueryCountsFn(result.size(), secureVpnPair->dnsServer, secureVpnNetId);
5844 }
5845
5846 if (enableVpnIsolation) {
5847 EXPECT_RESULT_OK(secureVpnNetwork.disableVpnIsolation(TEST_UID2));
5848 }
5849 }
5850 }
Mike Yu6ce587d2019-12-19 21:30:22 +08005851}