blob: a3231fba86be5ea819ce3e2eecfbd7bd939f8a54 [file] [log] [blame]
Ken Chenb9fa2062018-11-13 21:51:13 +08001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
Lorenzo Colitti0a8b4aa2019-06-26 22:31:03 +090010 * Unless required by applicable law or agreed to in writing, software
Ken Chenb9fa2062018-11-13 21:51:13 +080011 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *
16 */
17
Bernie Innocenti3952ccc2019-03-03 19:39:53 +090018#define LOG_TAG "resolv_integration_test"
Ken Chenb9fa2062018-11-13 21:51:13 +080019
Hungming Chen5bf09772019-04-25 11:16:13 +080020#include <android-base/logging.h>
Bernie Innocenti41b82c42019-06-05 22:38:25 +090021#include <android-base/parseint.h>
Mike Yu40e67072019-10-09 21:14:09 +080022#include <android-base/properties.h>
Mike Yu6ce587d2019-12-19 21:30:22 +080023#include <android-base/result.h>
Bernie Innocenti41b82c42019-06-05 22:38:25 +090024#include <android-base/stringprintf.h>
25#include <android-base/unique_fd.h>
26#include <android/multinetwork.h> // ResNsendFlags
Ken Chenb9fa2062018-11-13 21:51:13 +080027#include <arpa/inet.h>
Luke Huang94b10b92018-11-21 20:13:38 +080028#include <arpa/nameser.h>
Hungming Chene8f970c2019-04-10 17:34:06 +080029#include <binder/ProcessState.h>
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +090030#include <bpf/BpfUtils.h>
Bernie Innocenti41b82c42019-06-05 22:38:25 +090031#include <cutils/sockets.h>
32#include <gmock/gmock-matchers.h>
33#include <gtest/gtest.h>
Ken Chenb9fa2062018-11-13 21:51:13 +080034#include <netdb.h>
Luke Huang9d2d25b2019-06-14 00:34:05 +080035#include <netdutils/InternetAddresses.h>
Luke Huang579ddc72019-06-14 00:59:39 +080036#include <netdutils/NetworkConstants.h> // SHA256_SIZE
Luke Huang9d2d25b2019-06-14 00:34:05 +080037#include <netdutils/ResponseCode.h>
Hungming Chen63779052019-10-30 15:06:13 +080038#include <netdutils/Slice.h>
Luke Huang9d2d25b2019-06-14 00:34:05 +080039#include <netdutils/SocketOption.h>
Mike Yu40e67072019-10-09 21:14:09 +080040#include <netdutils/Stopwatch.h>
Luke Huang94b10b92018-11-21 20:13:38 +080041#include <netinet/in.h>
42#include <poll.h> /* poll */
Bernie Innocenti41b82c42019-06-05 22:38:25 +090043#include <private/android_filesystem_config.h>
Luke Huang94b10b92018-11-21 20:13:38 +080044#include <resolv.h>
Ken Chenb9fa2062018-11-13 21:51:13 +080045#include <stdarg.h>
Ken Chenb9fa2062018-11-13 21:51:13 +080046#include <stdlib.h>
Luke Huang94b10b92018-11-21 20:13:38 +080047#include <sys/socket.h>
48#include <sys/un.h>
Ken Chenb9fa2062018-11-13 21:51:13 +080049#include <unistd.h>
50
51#include <algorithm>
52#include <chrono>
53#include <iterator>
54#include <numeric>
55#include <thread>
Luke Huang81568fb2020-07-13 00:55:12 +080056#include <unordered_set>
Ken Chenb9fa2062018-11-13 21:51:13 +080057
Luke Huang829511c2020-05-26 17:31:15 +080058#include <DnsProxydProtocol.h> // NETID_USE_LOCAL_NAMESERVERS
Luke Huangf8215372019-11-22 11:53:41 +080059#include <aidl/android/net/IDnsResolver.h>
60#include <android/binder_manager.h>
61#include <android/binder_process.h>
Luke Huang5729afc2020-07-30 23:12:17 +080062#include <util.h> // getApiLevel
Bernie Innocenti41b82c42019-06-05 22:38:25 +090063#include "NetdClient.h"
Bernie Innocenti41b82c42019-06-05 22:38:25 +090064#include "ResolverStats.h"
Luke Huangf8215372019-11-22 11:53:41 +080065#include "netid_client.h" // NETID_UNSET
66#include "params.h" // MAXNS
Mike Yu532405f2020-06-17 17:46:44 +080067#include "stats.h" // RCODE_TIMEOUT
Hungming Chene8f970c2019-04-10 17:34:06 +080068#include "tests/dns_metrics_listener/dns_metrics_listener.h"
chenbruceb43ec752019-07-24 20:19:41 +080069#include "tests/dns_responder/dns_responder.h"
Luke Huangf8215372019-11-22 11:53:41 +080070#include "tests/dns_responder/dns_responder_client_ndk.h"
Hungming Chenc6556622019-10-02 16:01:07 +080071#include "tests/dns_responder/dns_tls_certificate.h"
chenbruceb43ec752019-07-24 20:19:41 +080072#include "tests/dns_responder/dns_tls_frontend.h"
Luke Huangfde82482019-06-04 01:04:53 +080073#include "tests/resolv_test_utils.h"
Mike Yu6ce587d2019-12-19 21:30:22 +080074#include "tests/tun_forwarder.h"
Ken Chenb9fa2062018-11-13 21:51:13 +080075
Luke Huang0d592bc2019-05-25 18:24:03 +080076// Valid VPN netId range is 100 ~ 65535
77constexpr int TEST_VPN_NETID = 65502;
Luke Huang94b10b92018-11-21 20:13:38 +080078constexpr int MAXPACKET = (8 * 1024);
Ken Chenb9fa2062018-11-13 21:51:13 +080079
Mike Yu10832aa2020-08-25 19:13:11 +080080const std::string kSortNameserversFlag("persist.device_config.netd_native.sort_nameservers");
81
Ken Chenb9fa2062018-11-13 21:51:13 +080082// Semi-public Bionic hook used by the NDK (frameworks/base/native/android/net.c)
83// Tested here for convenience.
84extern "C" int android_getaddrinfofornet(const char* hostname, const char* servname,
85 const addrinfo* hints, unsigned netid, unsigned mark,
86 struct addrinfo** result);
87
Mike Yu153b5b82020-03-04 19:53:54 +080088using namespace std::chrono_literals;
89
Luke Huang70070852019-11-25 18:25:50 +080090using aidl::android::net::IDnsResolver;
Luke Huangf8215372019-11-22 11:53:41 +080091using aidl::android::net::INetd;
Mike Yu8ac63402019-12-02 15:28:38 +080092using aidl::android::net::ResolverParamsParcel;
Mike Yu532405f2020-06-17 17:46:44 +080093using aidl::android::net::metrics::INetdEventListener;
Mike Yu6ce587d2019-12-19 21:30:22 +080094using android::base::Error;
Luke Huang9807e6b2019-05-20 16:17:12 +080095using android::base::ParseInt;
Mike Yu6ce587d2019-12-19 21:30:22 +080096using android::base::Result;
Ken Chenb9fa2062018-11-13 21:51:13 +080097using android::base::StringPrintf;
Luke Huang9807e6b2019-05-20 16:17:12 +080098using android::base::unique_fd;
Ken Chenb9fa2062018-11-13 21:51:13 +080099using android::net::ResolverStats;
Mike Yu6ce587d2019-12-19 21:30:22 +0800100using android::net::TunForwarder;
Hungming Chene8f970c2019-04-10 17:34:06 +0800101using android::net::metrics::DnsMetricsListener;
Ken Chenb9fa2062018-11-13 21:51:13 +0800102using android::netdutils::enableSockopt;
Hungming Chen63779052019-10-30 15:06:13 +0800103using android::netdutils::makeSlice;
Luke Huang9807e6b2019-05-20 16:17:12 +0800104using android::netdutils::ResponseCode;
Luke Huang9d2d25b2019-06-14 00:34:05 +0800105using android::netdutils::ScopedAddrinfo;
Mike Yu40e67072019-10-09 21:14:09 +0800106using android::netdutils::Stopwatch;
Hungming Chen63779052019-10-30 15:06:13 +0800107using android::netdutils::toHex;
Ken Chenb9fa2062018-11-13 21:51:13 +0800108
109// TODO: move into libnetdutils?
110namespace {
Luke Huangfde82482019-06-04 01:04:53 +0800111
Ken Chenb9fa2062018-11-13 21:51:13 +0800112ScopedAddrinfo safe_getaddrinfo(const char* node, const char* service,
113 const struct addrinfo* hints) {
114 addrinfo* result = nullptr;
115 if (getaddrinfo(node, service, hints, &result) != 0) {
116 result = nullptr; // Should already be the case, but...
117 }
118 return ScopedAddrinfo(result);
119}
Luke Huangfde82482019-06-04 01:04:53 +0800120
Mike Yu40e67072019-10-09 21:14:09 +0800121std::pair<ScopedAddrinfo, int> safe_getaddrinfo_time_taken(const char* node, const char* service,
122 const addrinfo& hints) {
123 Stopwatch s;
124 ScopedAddrinfo result = safe_getaddrinfo(node, service, &hints);
125 return {std::move(result), s.timeTakenUs() / 1000};
126}
127
Mike Yue2162e52020-03-04 18:43:46 +0800128struct NameserverStats {
129 NameserverStats() = delete;
130 NameserverStats(const std::string server) : server(server) {}
131 NameserverStats& setSuccesses(int val) {
132 successes = val;
133 return *this;
134 }
135 NameserverStats& setErrors(int val) {
136 errors = val;
137 return *this;
138 }
139 NameserverStats& setTimeouts(int val) {
140 timeouts = val;
141 return *this;
142 }
143 NameserverStats& setInternalErrors(int val) {
144 internal_errors = val;
145 return *this;
146 }
147
148 const std::string server;
149 int successes = 0;
150 int errors = 0;
151 int timeouts = 0;
152 int internal_errors = 0;
153};
154
Mike Yu61d17262020-02-15 18:56:22 +0800155class ScopedSystemProperties {
156 public:
157 ScopedSystemProperties(const std::string& key, const std::string& value) : mStoredKey(key) {
158 mStoredValue = android::base::GetProperty(key, "");
159 android::base::SetProperty(key, value);
160 }
161 ~ScopedSystemProperties() { android::base::SetProperty(mStoredKey, mStoredValue); }
162
163 private:
164 std::string mStoredKey;
165 std::string mStoredValue;
166};
167
Luke Huang5729afc2020-07-30 23:12:17 +0800168const bool isAtLeastR = (getApiLevel() >= 30);
169
Ken Chenb9fa2062018-11-13 21:51:13 +0800170} // namespace
171
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900172class ResolverTest : public ::testing::Test {
Hungming Chene8f970c2019-04-10 17:34:06 +0800173 public:
Hungming Chen473c4de2020-03-12 11:13:35 +0800174 static void SetUpTestSuite() {
Hungming Chen5bf09772019-04-25 11:16:13 +0800175 // Get binder service.
176 // Note that |mDnsClient| is not used for getting binder service in this static function.
177 // The reason is that wants to keep |mDnsClient| as a non-static data member. |mDnsClient|
178 // which sets up device network configuration could be independent from every test.
Luke Huangf8215372019-11-22 11:53:41 +0800179 // TODO: Perhaps add a static function in resolv_test_binder_utils.{cpp,h} to get binder
180 // service.
181
182 AIBinder* binder = AServiceManager_getService("dnsresolver");
183 ndk::SpAIBinder resolvBinder = ndk::SpAIBinder(binder);
184 auto resolvService = aidl::android::net::IDnsResolver::fromBinder(resolvBinder);
Hungming Chen5bf09772019-04-25 11:16:13 +0800185 ASSERT_NE(nullptr, resolvService.get());
186
187 // Subscribe the death recipient to the service IDnsResolver for detecting Netd death.
Luke Huang70070852019-11-25 18:25:50 +0800188 // GTEST assertion macros are not invoked for generating a test failure in the death
189 // recipient because the macros can't indicate failed test if Netd died between tests.
190 // Moreover, continuing testing may have no meaningful after Netd death. Therefore, the
191 // death recipient aborts process by GTEST_LOG_(FATAL) once Netd died.
Luke Huangf8215372019-11-22 11:53:41 +0800192 sResolvDeathRecipient = AIBinder_DeathRecipient_new([](void*) {
193 constexpr char errorMessage[] = "Netd died";
194 LOG(ERROR) << errorMessage;
195 GTEST_LOG_(FATAL) << errorMessage;
196 });
197 ASSERT_EQ(STATUS_OK, AIBinder_linkToDeath(binder, sResolvDeathRecipient, nullptr));
Hungming Chen5bf09772019-04-25 11:16:13 +0800198
199 // Subscribe the DNS listener for verifying DNS metrics event contents.
Luke Huangf8215372019-11-22 11:53:41 +0800200 sDnsMetricsListener = ndk::SharedRefBase::make<DnsMetricsListener>(
201 TEST_NETID /*monitor specific network*/);
Hungming Chen5bf09772019-04-25 11:16:13 +0800202 ASSERT_TRUE(resolvService->registerEventListener(sDnsMetricsListener).isOk());
203
204 // Start the binder thread pool for listening DNS metrics events and receiving death
205 // recipient.
Luke Huangf8215372019-11-22 11:53:41 +0800206 ABinderProcess_startThreadPool();
Hungming Chene8f970c2019-04-10 17:34:06 +0800207 }
Hungming Chen473c4de2020-03-12 11:13:35 +0800208 static void TearDownTestSuite() { AIBinder_DeathRecipient_delete(sResolvDeathRecipient); }
Hungming Chene8f970c2019-04-10 17:34:06 +0800209
Ken Chenb9fa2062018-11-13 21:51:13 +0800210 protected:
Lorenzo Colitti61f796b2020-05-21 00:57:49 +0900211 void SetUp() {
212 mDnsClient.SetUp();
213 sDnsMetricsListener->reset();
214 }
215
Mike Yu960243d2020-01-17 19:02:15 +0800216 void TearDown() {
217 // Ensure the dump works at the end of each test.
218 DumpResolverService();
219
220 mDnsClient.TearDown();
221 }
nuccachena26cc2a2018-07-17 18:07:23 +0800222
Luke Huangf40df9c2020-04-21 08:51:48 +0800223 void resetNetwork() {
224 mDnsClient.TearDown();
225 mDnsClient.SetupOemNetwork();
226 }
227
Xiao Ma09b71022018-12-11 17:56:32 +0900228 void StartDns(test::DNSResponder& dns, const std::vector<DnsRecord>& records) {
229 for (const auto& r : records) {
230 dns.addMapping(r.host_name, r.type, r.addr);
231 }
232
233 ASSERT_TRUE(dns.startServer());
234 dns.clearQueries();
235 }
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900236
Mike Yu960243d2020-01-17 19:02:15 +0800237 void DumpResolverService() {
238 unique_fd fd(open("/dev/null", O_WRONLY));
239 EXPECT_EQ(mDnsClient.resolvService()->dump(fd, nullptr, 0), 0);
240
241 const char* querylogCmd[] = {"querylog"}; // Keep it sync with DnsQueryLog::DUMP_KEYWORD.
242 EXPECT_EQ(mDnsClient.resolvService()->dump(fd, querylogCmd, std::size(querylogCmd)), 0);
243 }
244
Hungming Chene8f970c2019-04-10 17:34:06 +0800245 bool WaitForNat64Prefix(ExpectNat64PrefixStatus status,
246 std::chrono::milliseconds timeout = std::chrono::milliseconds(1000)) {
Hungming Chen5bf09772019-04-25 11:16:13 +0800247 return sDnsMetricsListener->waitForNat64Prefix(status, timeout);
Hungming Chene8f970c2019-04-10 17:34:06 +0800248 }
249
Mike Yu724f77d2019-08-16 11:14:50 +0800250 bool WaitForPrivateDnsValidation(std::string serverAddr, bool validated) {
251 return sDnsMetricsListener->waitForPrivateDnsValidation(serverAddr, validated);
252 }
253
Mike Yu153b5b82020-03-04 19:53:54 +0800254 bool hasUncaughtPrivateDnsValidation(const std::string& serverAddr) {
255 return sDnsMetricsListener->findValidationRecord(serverAddr);
256 }
257
Mike Yu532405f2020-06-17 17:46:44 +0800258 void ExpectDnsEvent(int32_t eventType, int32_t returnCode, const std::string& hostname,
259 const std::vector<std::string>& ipAddresses) {
260 const DnsMetricsListener::DnsEvent expect = {
261 TEST_NETID, eventType, returnCode,
262 hostname, ipAddresses, static_cast<int32_t>(ipAddresses.size())};
Mike Yub8faac42020-06-20 11:11:44 +0800263 do {
264 // Blocking call until timeout.
265 const auto dnsEvent = sDnsMetricsListener->popDnsEvent();
266 ASSERT_TRUE(dnsEvent.has_value()) << "Expected DnsEvent " << expect;
267 if (dnsEvent.value() == expect) break;
268 LOG(INFO) << "Skip unexpected DnsEvent: " << dnsEvent.value();
269 } while (true);
Mike Yu532405f2020-06-17 17:46:44 +0800270 }
271
Mike Yu61d17262020-02-15 18:56:22 +0800272 enum class StatsCmp { LE, EQ };
273
274 bool expectStatsNotGreaterThan(const std::vector<NameserverStats>& nameserversStats) {
275 return expectStatsFromGetResolverInfo(nameserversStats, StatsCmp::LE);
276 }
277
278 bool expectStatsEqualTo(const std::vector<NameserverStats>& nameserversStats) {
279 return expectStatsFromGetResolverInfo(nameserversStats, StatsCmp::EQ);
280 }
281
282 bool expectStatsFromGetResolverInfo(const std::vector<NameserverStats>& nameserversStats,
283 const StatsCmp cmp) {
Mike Yue2162e52020-03-04 18:43:46 +0800284 std::vector<std::string> res_servers;
285 std::vector<std::string> res_domains;
286 std::vector<std::string> res_tls_servers;
287 res_params res_params;
288 std::vector<ResolverStats> res_stats;
289 int wait_for_pending_req_timeout_count;
290
291 if (!DnsResponderClient::GetResolverInfo(mDnsClient.resolvService(), TEST_NETID,
292 &res_servers, &res_domains, &res_tls_servers,
293 &res_params, &res_stats,
294 &wait_for_pending_req_timeout_count)) {
295 ADD_FAILURE() << "GetResolverInfo failed";
296 return false;
297 }
298
299 if (res_servers.size() != res_stats.size()) {
300 ADD_FAILURE() << fmt::format("res_servers.size() != res_stats.size(): {} != {}",
301 res_servers.size(), res_stats.size());
302 return false;
303 }
304 if (res_servers.size() != nameserversStats.size()) {
305 ADD_FAILURE() << fmt::format("res_servers.size() != nameserversStats.size(): {} != {}",
306 res_servers.size(), nameserversStats.size());
307 return false;
308 }
309
310 for (const auto& stats : nameserversStats) {
311 SCOPED_TRACE(stats.server);
312 const auto it = std::find(res_servers.begin(), res_servers.end(), stats.server);
313 if (it == res_servers.end()) {
314 ADD_FAILURE() << fmt::format("nameserver {} not found in the list {{{}}}",
315 stats.server, fmt::join(res_servers, ", "));
316 return false;
317 }
318 const int index = std::distance(res_servers.begin(), it);
319
320 // The check excludes rtt_avg, last_sample_time, and usable since they will be obsolete
321 // after |res_stats| is retrieved from NetConfig.dnsStats rather than NetConfig.nsstats.
Mike Yu61d17262020-02-15 18:56:22 +0800322 switch (cmp) {
323 case StatsCmp::EQ:
324 EXPECT_EQ(res_stats[index].successes, stats.successes);
325 EXPECT_EQ(res_stats[index].errors, stats.errors);
326 EXPECT_EQ(res_stats[index].timeouts, stats.timeouts);
327 EXPECT_EQ(res_stats[index].internal_errors, stats.internal_errors);
328 break;
329 case StatsCmp::LE:
330 EXPECT_LE(res_stats[index].successes, stats.successes);
331 EXPECT_LE(res_stats[index].errors, stats.errors);
332 EXPECT_LE(res_stats[index].timeouts, stats.timeouts);
333 EXPECT_LE(res_stats[index].internal_errors, stats.internal_errors);
334 break;
335 default:
336 ADD_FAILURE() << "Unknown comparator " << static_cast<int>(cmp);
337 return false;
338 }
Mike Yue2162e52020-03-04 18:43:46 +0800339 }
340
341 return true;
342 }
343
Mike Yu153b5b82020-03-04 19:53:54 +0800344 // Since there's no way to terminate private DNS validation threads at any time. Tests that
345 // focus on the results of private DNS validation can interfere with each other if they use the
346 // same IP address for test servers. getUniqueIPv4Address() is a workaround to reduce the
347 // possibility of tests being flaky. A feasible solution is to forbid the validation threads,
348 // which are considered as outdated (e.g. switch the resolver to private DNS OFF mode), updating
349 // the result to the PrivateDnsConfiguration instance.
350 static std::string getUniqueIPv4Address() {
351 static int counter = 0;
352 return fmt::format("127.0.100.{}", (++counter & 0xff));
353 }
354
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900355 DnsResponderClient mDnsClient;
Xiao Ma09b71022018-12-11 17:56:32 +0900356
Hungming Chen5bf09772019-04-25 11:16:13 +0800357 // Use a shared static DNS listener for all tests to avoid registering lots of listeners
358 // which may be released late until process terminated. Currently, registered DNS listener
359 // is removed by binder death notification which is fired when the process hosting an
360 // IBinder has gone away. If every test in ResolverTest registers its DNS listener, Netd
361 // may temporarily hold lots of dead listeners until the unit test process terminates.
362 // TODO: Perhaps add an unregistering listener binder call or fork a listener process which
363 // could be terminated earlier.
Luke Huangf8215372019-11-22 11:53:41 +0800364 static std::shared_ptr<DnsMetricsListener>
Hungming Chen473c4de2020-03-12 11:13:35 +0800365 sDnsMetricsListener; // Initialized in SetUpTestSuite.
Hungming Chen5bf09772019-04-25 11:16:13 +0800366
367 // Use a shared static death recipient to monitor the service death. The static death
368 // recipient could monitor the death not only during the test but also between tests.
Hungming Chen473c4de2020-03-12 11:13:35 +0800369 static AIBinder_DeathRecipient* sResolvDeathRecipient; // Initialized in SetUpTestSuite.
Ken Chenb9fa2062018-11-13 21:51:13 +0800370};
371
Hungming Chen5bf09772019-04-25 11:16:13 +0800372// Initialize static member of class.
Luke Huangf8215372019-11-22 11:53:41 +0800373std::shared_ptr<DnsMetricsListener> ResolverTest::sDnsMetricsListener;
374AIBinder_DeathRecipient* ResolverTest::sResolvDeathRecipient;
Hungming Chen5bf09772019-04-25 11:16:13 +0800375
Ken Chenb9fa2062018-11-13 21:51:13 +0800376TEST_F(ResolverTest, GetHostByName) {
Xiao Ma09b71022018-12-11 17:56:32 +0900377 constexpr char nonexistent_host_name[] = "nonexistent.example.com.";
378
379 test::DNSResponder dns;
380 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.3"}});
381 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800382
383 const hostent* result;
Ken Chenb9fa2062018-11-13 21:51:13 +0800384 result = gethostbyname("nonexistent");
385 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, nonexistent_host_name));
386 ASSERT_TRUE(result == nullptr);
387 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
388
389 dns.clearQueries();
390 result = gethostbyname("hello");
Xiao Ma09b71022018-12-11 17:56:32 +0900391 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
Ken Chenb9fa2062018-11-13 21:51:13 +0800392 ASSERT_FALSE(result == nullptr);
393 ASSERT_EQ(4, result->h_length);
394 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
395 EXPECT_EQ("1.2.3.3", ToString(result));
396 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800397}
398
lifr4e4a2e02019-01-29 16:53:51 +0800399TEST_F(ResolverTest, GetHostByName_cnames) {
400 constexpr char host_name[] = "host.example.com.";
401 size_t cnamecount = 0;
402 test::DNSResponder dns;
403
404 const std::vector<DnsRecord> records = {
405 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
406 {"a.example.com.", ns_type::ns_t_cname, "b.example.com."},
407 {"b.example.com.", ns_type::ns_t_cname, "c.example.com."},
408 {"c.example.com.", ns_type::ns_t_cname, "d.example.com."},
409 {"d.example.com.", ns_type::ns_t_cname, "e.example.com."},
410 {"e.example.com.", ns_type::ns_t_cname, host_name},
411 {host_name, ns_type::ns_t_a, "1.2.3.3"},
412 {host_name, ns_type::ns_t_aaaa, "2001:db8::42"},
413 };
414 StartDns(dns, records);
415 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
416
417 // using gethostbyname2() to resolve ipv4 hello.example.com. to 1.2.3.3
418 // Ensure the v4 address and cnames are correct
419 const hostent* result;
420 result = gethostbyname2("hello", AF_INET);
421 ASSERT_FALSE(result == nullptr);
422
423 for (int i = 0; result != nullptr && result->h_aliases[i] != nullptr; i++) {
424 std::string domain_name = records[i].host_name.substr(0, records[i].host_name.size() - 1);
425 EXPECT_EQ(result->h_aliases[i], domain_name);
426 cnamecount++;
427 }
428 // The size of "Non-cname type" record in DNS records is 2
429 ASSERT_EQ(cnamecount, records.size() - 2);
430 ASSERT_EQ(4, result->h_length);
431 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
432 EXPECT_EQ("1.2.3.3", ToString(result));
433 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
434 EXPECT_EQ(1U, dns.queries().size()) << dns.dumpQueries();
435
436 // using gethostbyname2() to resolve ipv6 hello.example.com. to 2001:db8::42
437 // Ensure the v6 address and cnames are correct
438 cnamecount = 0;
439 dns.clearQueries();
440 result = gethostbyname2("hello", AF_INET6);
441 for (unsigned i = 0; result != nullptr && result->h_aliases[i] != nullptr; i++) {
442 std::string domain_name = records[i].host_name.substr(0, records[i].host_name.size() - 1);
443 EXPECT_EQ(result->h_aliases[i], domain_name);
444 cnamecount++;
445 }
446 // The size of "Non-cname type" DNS record in records is 2
447 ASSERT_EQ(cnamecount, records.size() - 2);
448 ASSERT_FALSE(result == nullptr);
449 ASSERT_EQ(16, result->h_length);
450 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
451 EXPECT_EQ("2001:db8::42", ToString(result));
452 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
453}
454
455TEST_F(ResolverTest, GetHostByName_cnamesInfiniteLoop) {
456 test::DNSResponder dns;
457 const std::vector<DnsRecord> records = {
458 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
459 {"a.example.com.", ns_type::ns_t_cname, kHelloExampleCom},
460 };
461 StartDns(dns, records);
462 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
463
464 const hostent* result;
465 result = gethostbyname2("hello", AF_INET);
466 ASSERT_TRUE(result == nullptr);
467
468 dns.clearQueries();
469 result = gethostbyname2("hello", AF_INET6);
470 ASSERT_TRUE(result == nullptr);
471}
472
Ken Chenb9fa2062018-11-13 21:51:13 +0800473TEST_F(ResolverTest, GetHostByName_localhost) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800474 constexpr char name_camelcase[] = "LocalHost";
Ken Chenb9fa2062018-11-13 21:51:13 +0800475 constexpr char name_ip6_dot[] = "ip6-localhost.";
476 constexpr char name_ip6_fqdn[] = "ip6-localhost.example.com.";
477
markchien96b09e22020-07-29 14:24:34 +0800478 // Add a no-op nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900479 test::DNSResponder dns;
480 StartDns(dns, {});
481 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800482
483 // Expect no DNS queries; localhost is resolved via /etc/hosts
Xiao Ma09b71022018-12-11 17:56:32 +0900484 const hostent* result = gethostbyname(kLocalHost);
Ken Chenb9fa2062018-11-13 21:51:13 +0800485 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
486 ASSERT_FALSE(result == nullptr);
487 ASSERT_EQ(4, result->h_length);
488 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900489 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800490 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
491
492 // Ensure the hosts file resolver ignores case of hostnames
493 result = gethostbyname(name_camelcase);
494 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
495 ASSERT_FALSE(result == nullptr);
496 ASSERT_EQ(4, result->h_length);
497 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900498 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800499 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
500
501 // The hosts file also contains ip6-localhost, but gethostbyname() won't
chenbruce018fdb22019-06-12 18:08:04 +0800502 // return it. This would be easy to
Ken Chenb9fa2062018-11-13 21:51:13 +0800503 // change, but there's no point in changing the legacy behavior; new code
504 // should be calling getaddrinfo() anyway.
505 // So we check the legacy behavior, which results in amusing A-record
506 // lookups for ip6-localhost, with and without search domains appended.
507 dns.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900508 result = gethostbyname(kIp6LocalHost);
Sehee Parkbbca0202018-11-16 10:53:16 +0900509 EXPECT_EQ(2U, dns.queries().size()) << dns.dumpQueries();
510 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, name_ip6_dot)) << dns.dumpQueries();
511 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, name_ip6_fqdn)) << dns.dumpQueries();
Ken Chenb9fa2062018-11-13 21:51:13 +0800512 ASSERT_TRUE(result == nullptr);
513
514 // Finally, use gethostbyname2() to resolve ip6-localhost to ::1 from
515 // the hosts file.
516 dns.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900517 result = gethostbyname2(kIp6LocalHost, AF_INET6);
Ken Chenb9fa2062018-11-13 21:51:13 +0800518 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
519 ASSERT_FALSE(result == nullptr);
520 ASSERT_EQ(16, result->h_length);
521 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900522 EXPECT_EQ(kIp6LocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800523 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800524}
525
526TEST_F(ResolverTest, GetHostByName_numeric) {
markchien96b09e22020-07-29 14:24:34 +0800527 // Add a no-op nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900528 test::DNSResponder dns;
529 StartDns(dns, {});
530 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800531
532 // Numeric v4 address: expect no DNS queries
533 constexpr char numeric_v4[] = "192.168.0.1";
Ken Chenb9fa2062018-11-13 21:51:13 +0800534 const hostent* result = gethostbyname(numeric_v4);
Sehee Parkbbca0202018-11-16 10:53:16 +0900535 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800536 ASSERT_FALSE(result == nullptr);
537 ASSERT_EQ(4, result->h_length); // v4
538 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
539 EXPECT_EQ(numeric_v4, ToString(result));
540 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
541
542 // gethostbyname() recognizes a v6 address, and fails with no DNS queries
543 constexpr char numeric_v6[] = "2001:db8::42";
544 dns.clearQueries();
545 result = gethostbyname(numeric_v6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900546 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800547 EXPECT_TRUE(result == nullptr);
548
549 // Numeric v6 address with gethostbyname2(): succeeds with no DNS queries
550 dns.clearQueries();
551 result = gethostbyname2(numeric_v6, AF_INET6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900552 EXPECT_EQ(0U, dns.queries().size());
Ken Chenb9fa2062018-11-13 21:51:13 +0800553 ASSERT_FALSE(result == nullptr);
554 ASSERT_EQ(16, result->h_length); // v6
555 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
556 EXPECT_EQ(numeric_v6, ToString(result));
557 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
558
559 // Numeric v6 address with scope work with getaddrinfo(),
560 // but gethostbyname2() does not understand them; it issues two dns
561 // queries, then fails. This hardly ever happens, there's no point
562 // in fixing this. This test simply verifies the current (bogus)
563 // behavior to avoid further regressions (like crashes, or leaks).
564 constexpr char numeric_v6_scope[] = "fe80::1%lo";
565 dns.clearQueries();
566 result = gethostbyname2(numeric_v6_scope, AF_INET6);
Sehee Parkbbca0202018-11-16 10:53:16 +0900567 EXPECT_EQ(2U, dns.queries().size()); // OUCH!
Ken Chenb9fa2062018-11-13 21:51:13 +0800568 ASSERT_TRUE(result == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800569}
570
571TEST_F(ResolverTest, BinderSerialization) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800572 std::vector<int> params_offsets = {
Luke Huang5bd827c2019-03-14 16:10:04 +0800573 IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY,
574 IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD,
575 IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES,
576 IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES,
577 IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC,
578 IDnsResolver::RESOLVER_PARAMS_RETRY_COUNT,
Ken Chenb9fa2062018-11-13 21:51:13 +0800579 };
Bernie Innocentib102dd22018-12-04 14:57:48 +0900580 const int size = static_cast<int>(params_offsets.size());
Luke Huang5bd827c2019-03-14 16:10:04 +0800581 EXPECT_EQ(size, IDnsResolver::RESOLVER_PARAMS_COUNT);
Ken Chenb9fa2062018-11-13 21:51:13 +0800582 std::sort(params_offsets.begin(), params_offsets.end());
Bernie Innocentib102dd22018-12-04 14:57:48 +0900583 for (int i = 0; i < size; ++i) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800584 EXPECT_EQ(params_offsets[i], i);
585 }
586}
587
588TEST_F(ResolverTest, GetHostByName_Binder) {
Luke Huangf8215372019-11-22 11:53:41 +0800589 std::vector<std::string> domains = {"example.com"};
Ken Chenb9fa2062018-11-13 21:51:13 +0800590 std::vector<std::unique_ptr<test::DNSResponder>> dns;
591 std::vector<std::string> servers;
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900592 std::vector<DnsResponderClient::Mapping> mappings;
593 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupMappings(1, domains, &mappings));
594 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupDNSServers(4, mappings, &dns, &servers));
Ken Chenb9fa2062018-11-13 21:51:13 +0800595 ASSERT_EQ(1U, mappings.size());
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900596 const DnsResponderClient::Mapping& mapping = mappings[0];
Ken Chenb9fa2062018-11-13 21:51:13 +0800597
Xiao Ma09b71022018-12-11 17:56:32 +0900598 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains, kDefaultParams));
Ken Chenb9fa2062018-11-13 21:51:13 +0800599
600 const hostent* result = gethostbyname(mapping.host.c_str());
Bernie Innocentib102dd22018-12-04 14:57:48 +0900601 const size_t total_queries =
Luke Huangfde82482019-06-04 01:04:53 +0800602 std::accumulate(dns.begin(), dns.end(), 0, [&mapping](size_t total, auto& d) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800603 return total + GetNumQueriesForType(*d, ns_type::ns_t_a, mapping.entry.c_str());
604 });
605
606 EXPECT_LE(1U, total_queries);
607 ASSERT_FALSE(result == nullptr);
608 ASSERT_EQ(4, result->h_length);
609 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
610 EXPECT_EQ(mapping.ip4, ToString(result));
611 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
612
613 std::vector<std::string> res_servers;
614 std::vector<std::string> res_domains;
Mike Yu0a1c53d2018-11-26 13:26:21 +0900615 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +0900616 res_params res_params;
Ken Chenb9fa2062018-11-13 21:51:13 +0800617 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +0800618 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +0800619 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
620 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
621 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chenb9fa2062018-11-13 21:51:13 +0800622 EXPECT_EQ(servers.size(), res_servers.size());
623 EXPECT_EQ(domains.size(), res_domains.size());
Mike Yu0a1c53d2018-11-26 13:26:21 +0900624 EXPECT_EQ(0U, res_tls_servers.size());
Luke Huang5bd827c2019-03-14 16:10:04 +0800625 ASSERT_EQ(static_cast<size_t>(IDnsResolver::RESOLVER_PARAMS_COUNT), kDefaultParams.size());
626 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY],
627 res_params.sample_validity);
628 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +0900629 res_params.success_threshold);
Luke Huang5bd827c2019-03-14 16:10:04 +0800630 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
631 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
632 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
Ken Chenb9fa2062018-11-13 21:51:13 +0800633 res_params.base_timeout_msec);
634 EXPECT_EQ(servers.size(), res_stats.size());
635
Bernie Innocenti0c067e42019-04-01 15:33:16 +0900636 EXPECT_THAT(res_servers, testing::UnorderedElementsAreArray(servers));
637 EXPECT_THAT(res_domains, testing::UnorderedElementsAreArray(domains));
Ken Chenb9fa2062018-11-13 21:51:13 +0800638}
639
640TEST_F(ResolverTest, GetAddrInfo) {
Xiao Ma09b71022018-12-11 17:56:32 +0900641 constexpr char listen_addr[] = "127.0.0.4";
642 constexpr char listen_addr2[] = "127.0.0.5";
643 constexpr char host_name[] = "howdy.example.com.";
Ken Chenb9fa2062018-11-13 21:51:13 +0800644
Xiao Ma09b71022018-12-11 17:56:32 +0900645 const std::vector<DnsRecord> records = {
646 {host_name, ns_type::ns_t_a, "1.2.3.4"},
647 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
648 };
649 test::DNSResponder dns(listen_addr);
650 test::DNSResponder dns2(listen_addr2);
651 StartDns(dns, records);
652 StartDns(dns2, records);
Ken Chenb9fa2062018-11-13 21:51:13 +0800653
Xiao Ma09b71022018-12-11 17:56:32 +0900654 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}));
Ken Chenb9fa2062018-11-13 21:51:13 +0800655 dns.clearQueries();
656 dns2.clearQueries();
657
658 ScopedAddrinfo result = safe_getaddrinfo("howdy", nullptr, nullptr);
659 EXPECT_TRUE(result != nullptr);
660 size_t found = GetNumQueries(dns, host_name);
661 EXPECT_LE(1U, found);
662 // Could be A or AAAA
663 std::string result_str = ToString(result);
664 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +0800665 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +0800666
667 // Verify that the name is cached.
668 size_t old_found = found;
669 result = safe_getaddrinfo("howdy", nullptr, nullptr);
670 EXPECT_TRUE(result != nullptr);
671 found = GetNumQueries(dns, host_name);
672 EXPECT_LE(1U, found);
673 EXPECT_EQ(old_found, found);
674 result_str = ToString(result);
Luke Huangf8215372019-11-22 11:53:41 +0800675 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4") << result_str;
Ken Chenb9fa2062018-11-13 21:51:13 +0800676
677 // Change the DNS resolver, ensure that queries are still cached.
Xiao Ma09b71022018-12-11 17:56:32 +0900678 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr2}));
Ken Chenb9fa2062018-11-13 21:51:13 +0800679 dns.clearQueries();
680 dns2.clearQueries();
681
682 result = safe_getaddrinfo("howdy", nullptr, nullptr);
683 EXPECT_TRUE(result != nullptr);
684 found = GetNumQueries(dns, host_name);
685 size_t found2 = GetNumQueries(dns2, host_name);
686 EXPECT_EQ(0U, found);
687 EXPECT_LE(0U, found2);
688
689 // Could be A or AAAA
690 result_str = ToString(result);
691 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +0800692 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +0800693}
694
695TEST_F(ResolverTest, GetAddrInfoV4) {
Xiao Ma09b71022018-12-11 17:56:32 +0900696 test::DNSResponder dns;
697 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.5"}});
698 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800699
Xiao Ma09b71022018-12-11 17:56:32 +0900700 const addrinfo hints = {.ai_family = AF_INET};
701 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
Ken Chenb9fa2062018-11-13 21:51:13 +0800702 EXPECT_TRUE(result != nullptr);
Xiao Ma09b71022018-12-11 17:56:32 +0900703 EXPECT_EQ(1U, GetNumQueries(dns, kHelloExampleCom));
Ken Chenb9fa2062018-11-13 21:51:13 +0800704 EXPECT_EQ("1.2.3.5", ToString(result));
705}
706
707TEST_F(ResolverTest, GetAddrInfo_localhost) {
markchien96b09e22020-07-29 14:24:34 +0800708 // Add a no-op nameserver which shouldn't receive any queries
Xiao Ma09b71022018-12-11 17:56:32 +0900709 test::DNSResponder dns;
710 StartDns(dns, {});
711 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800712
Xiao Ma09b71022018-12-11 17:56:32 +0900713 ScopedAddrinfo result = safe_getaddrinfo(kLocalHost, nullptr, nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800714 EXPECT_TRUE(result != nullptr);
715 // Expect no DNS queries; localhost is resolved via /etc/hosts
716 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900717 EXPECT_EQ(kLocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800718
Xiao Ma09b71022018-12-11 17:56:32 +0900719 result = safe_getaddrinfo(kIp6LocalHost, nullptr, nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800720 EXPECT_TRUE(result != nullptr);
721 // Expect no DNS queries; ip6-localhost is resolved via /etc/hosts
722 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Xiao Ma09b71022018-12-11 17:56:32 +0900723 EXPECT_EQ(kIp6LocalHostAddr, ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +0800724}
725
Luke Huangd8ac4752019-06-18 17:05:47 +0800726TEST_F(ResolverTest, GetAddrInfo_InvalidSocketType) {
727 test::DNSResponder dns;
728 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, "1.2.3.5"}});
729 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
730
731 // TODO: Test other invalid socket types.
732 const addrinfo hints = {
733 .ai_family = AF_UNSPEC,
Luke Huangd8ac4752019-06-18 17:05:47 +0800734 .ai_socktype = SOCK_PACKET,
735 };
736 addrinfo* result = nullptr;
737 // This is a valid hint, but the query won't be sent because the socket type is
738 // not supported.
739 EXPECT_EQ(EAI_NODATA, getaddrinfo("hello", nullptr, &hints, &result));
740 ScopedAddrinfo result_cleanup(result);
741 EXPECT_EQ(nullptr, result);
742}
743
Ken Chen92bed612018-12-22 21:46:55 +0800744// Verify if the resolver correctly handle multiple queries simultaneously
745// step 1: set dns server#1 into deferred responding mode.
746// step 2: thread#1 query "hello.example.com." --> resolver send query to server#1.
747// step 3: thread#2 query "hello.example.com." --> resolver hold the request and wait for
748// response of previous pending query sent by thread#1.
749// step 4: thread#3 query "konbanha.example.com." --> resolver send query to server#3. Server
750// respond to resolver immediately.
751// step 5: check if server#1 get 1 query by thread#1, server#2 get 0 query, server#3 get 1 query.
752// step 6: resume dns server#1 to respond dns query in step#2.
753// step 7: thread#1 and #2 should get returned from DNS query after step#6. Also, check the
754// number of queries in server#2 is 0 to ensure thread#2 does not wake up unexpectedly
755// before signaled by thread#1.
756TEST_F(ResolverTest, GetAddrInfoV4_deferred_resp) {
757 const char* listen_addr1 = "127.0.0.9";
758 const char* listen_addr2 = "127.0.0.10";
759 const char* listen_addr3 = "127.0.0.11";
760 const char* listen_srv = "53";
761 const char* host_name_deferred = "hello.example.com.";
762 const char* host_name_normal = "konbanha.example.com.";
Mike Yufc125e42019-05-15 20:41:28 +0800763 test::DNSResponder dns1(listen_addr1, listen_srv, ns_rcode::ns_r_servfail);
764 test::DNSResponder dns2(listen_addr2, listen_srv, ns_rcode::ns_r_servfail);
765 test::DNSResponder dns3(listen_addr3, listen_srv, ns_rcode::ns_r_servfail);
Ken Chen92bed612018-12-22 21:46:55 +0800766 dns1.addMapping(host_name_deferred, ns_type::ns_t_a, "1.2.3.4");
767 dns2.addMapping(host_name_deferred, ns_type::ns_t_a, "1.2.3.4");
768 dns3.addMapping(host_name_normal, ns_type::ns_t_a, "1.2.3.5");
769 ASSERT_TRUE(dns1.startServer());
770 ASSERT_TRUE(dns2.startServer());
771 ASSERT_TRUE(dns3.startServer());
772 const std::vector<std::string> servers_for_t1 = {listen_addr1};
773 const std::vector<std::string> servers_for_t2 = {listen_addr2};
774 const std::vector<std::string> servers_for_t3 = {listen_addr3};
775 addrinfo hints = {.ai_family = AF_INET};
776 const std::vector<int> params = {300, 25, 8, 8, 5000};
777 bool t3_task_done = false;
778
779 dns1.setDeferredResp(true);
780 std::thread t1([&, this]() {
781 ASSERT_TRUE(
782 mDnsClient.SetResolversForNetwork(servers_for_t1, kDefaultSearchDomains, params));
783 ScopedAddrinfo result = safe_getaddrinfo(host_name_deferred, nullptr, &hints);
784 // t3's dns query should got returned first
785 EXPECT_TRUE(t3_task_done);
786 EXPECT_EQ(1U, GetNumQueries(dns1, host_name_deferred));
787 EXPECT_TRUE(result != nullptr);
788 EXPECT_EQ("1.2.3.4", ToString(result));
789 });
790
791 // ensuring t1 and t2 handler functions are processed in order
792 usleep(100 * 1000);
793 std::thread t2([&, this]() {
794 ASSERT_TRUE(
795 mDnsClient.SetResolversForNetwork(servers_for_t2, kDefaultSearchDomains, params));
796 ScopedAddrinfo result = safe_getaddrinfo(host_name_deferred, nullptr, &hints);
797 EXPECT_TRUE(t3_task_done);
798 EXPECT_EQ(0U, GetNumQueries(dns2, host_name_deferred));
799 EXPECT_TRUE(result != nullptr);
800 EXPECT_EQ("1.2.3.4", ToString(result));
801
802 std::vector<std::string> res_servers;
803 std::vector<std::string> res_domains;
804 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +0900805 res_params res_params;
Ken Chen92bed612018-12-22 21:46:55 +0800806 std::vector<ResolverStats> res_stats;
807 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +0800808 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
809 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains,
810 &res_tls_servers, &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chen92bed612018-12-22 21:46:55 +0800811 EXPECT_EQ(0, wait_for_pending_req_timeout_count);
812 });
813
814 // ensuring t2 and t3 handler functions are processed in order
815 usleep(100 * 1000);
816 std::thread t3([&, this]() {
817 ASSERT_TRUE(
818 mDnsClient.SetResolversForNetwork(servers_for_t3, kDefaultSearchDomains, params));
819 ScopedAddrinfo result = safe_getaddrinfo(host_name_normal, nullptr, &hints);
820 EXPECT_EQ(1U, GetNumQueries(dns1, host_name_deferred));
821 EXPECT_EQ(0U, GetNumQueries(dns2, host_name_deferred));
822 EXPECT_EQ(1U, GetNumQueries(dns3, host_name_normal));
823 EXPECT_TRUE(result != nullptr);
824 EXPECT_EQ("1.2.3.5", ToString(result));
825
826 t3_task_done = true;
827 dns1.setDeferredResp(false);
828 });
829 t3.join();
830 t1.join();
831 t2.join();
832}
833
lifr4e4a2e02019-01-29 16:53:51 +0800834TEST_F(ResolverTest, GetAddrInfo_cnames) {
835 constexpr char host_name[] = "host.example.com.";
836 test::DNSResponder dns;
837 const std::vector<DnsRecord> records = {
838 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
839 {"a.example.com.", ns_type::ns_t_cname, "b.example.com."},
840 {"b.example.com.", ns_type::ns_t_cname, "c.example.com."},
841 {"c.example.com.", ns_type::ns_t_cname, "d.example.com."},
842 {"d.example.com.", ns_type::ns_t_cname, "e.example.com."},
843 {"e.example.com.", ns_type::ns_t_cname, host_name},
844 {host_name, ns_type::ns_t_a, "1.2.3.3"},
845 {host_name, ns_type::ns_t_aaaa, "2001:db8::42"},
846 };
847 StartDns(dns, records);
848 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
849
850 addrinfo hints = {.ai_family = AF_INET};
851 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
852 EXPECT_TRUE(result != nullptr);
853 EXPECT_EQ("1.2.3.3", ToString(result));
854
855 dns.clearQueries();
856 hints = {.ai_family = AF_INET6};
857 result = safe_getaddrinfo("hello", nullptr, &hints);
858 EXPECT_TRUE(result != nullptr);
859 EXPECT_EQ("2001:db8::42", ToString(result));
860}
861
862TEST_F(ResolverTest, GetAddrInfo_cnamesNoIpAddress) {
863 test::DNSResponder dns;
864 const std::vector<DnsRecord> records = {
865 {kHelloExampleCom, ns_type::ns_t_cname, "a.example.com."},
866 };
867 StartDns(dns, records);
868 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
869
870 addrinfo hints = {.ai_family = AF_INET};
871 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
872 EXPECT_TRUE(result == nullptr);
873
874 dns.clearQueries();
875 hints = {.ai_family = AF_INET6};
876 result = safe_getaddrinfo("hello", nullptr, &hints);
877 EXPECT_TRUE(result == nullptr);
878}
879
880TEST_F(ResolverTest, GetAddrInfo_cnamesIllegalRdata) {
881 test::DNSResponder dns;
882 const std::vector<DnsRecord> records = {
883 {kHelloExampleCom, ns_type::ns_t_cname, ".!#?"},
884 };
885 StartDns(dns, records);
886 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
887
888 addrinfo hints = {.ai_family = AF_INET};
889 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
890 EXPECT_TRUE(result == nullptr);
891
892 dns.clearQueries();
893 hints = {.ai_family = AF_INET6};
894 result = safe_getaddrinfo("hello", nullptr, &hints);
895 EXPECT_TRUE(result == nullptr);
896}
897
Pabba Prakash66707822020-01-08 15:34:58 +0530898TEST_F(ResolverTest, GetAddrInfoForCaseInSensitiveDomains) {
899 test::DNSResponder dns;
900 const char* host_name = "howdy.example.com.";
901 const char* host_name2 = "HOWDY.example.com.";
902 const std::vector<DnsRecord> records = {
903 {host_name, ns_type::ns_t_a, "1.2.3.4"},
904 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
905 {host_name2, ns_type::ns_t_a, "1.2.3.5"},
906 {host_name2, ns_type::ns_t_aaaa, "::1.2.3.5"},
907 };
908 StartDns(dns, records);
909 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
910
911 ScopedAddrinfo hostname_result = safe_getaddrinfo("howdy", nullptr, nullptr);
912 EXPECT_TRUE(hostname_result != nullptr);
913 const size_t hostname1_count_after_first_query = GetNumQueries(dns, host_name);
914 EXPECT_LE(1U, hostname1_count_after_first_query);
915 // Could be A or AAAA
916 std::string hostname_result_str = ToString(hostname_result);
917 EXPECT_TRUE(hostname_result_str == "1.2.3.4" || hostname_result_str == "::1.2.3.4");
918
919 // Verify that the name is cached.
920 ScopedAddrinfo hostname2_result = safe_getaddrinfo("HOWDY", nullptr, nullptr);
921 EXPECT_TRUE(hostname2_result != nullptr);
922 const size_t hostname1_count_after_second_query = GetNumQueries(dns, host_name);
923 EXPECT_LE(1U, hostname1_count_after_second_query);
924
925 // verify that there is no change in num of queries for howdy.example.com
926 EXPECT_EQ(hostname1_count_after_first_query, hostname1_count_after_second_query);
927
928 // Number of queries for HOWDY.example.com would be >= 1 if domain names
929 // are considered case-sensitive, else number of queries should be 0.
930 const size_t hostname2_count = GetNumQueries(dns, host_name2);
931 EXPECT_EQ(0U,hostname2_count);
932 std::string hostname2_result_str = ToString(hostname2_result);
933 EXPECT_TRUE(hostname2_result_str == "1.2.3.4" || hostname2_result_str == "::1.2.3.4");
934
935 // verify that the result is still the same address even though
936 // mixed-case string is not in the DNS
937 ScopedAddrinfo result = safe_getaddrinfo("HowDY", nullptr, nullptr);
938 EXPECT_TRUE(result != nullptr);
939 std::string result_str = ToString(result);
940 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4");
941}
942
Ken Chenb9fa2062018-11-13 21:51:13 +0800943TEST_F(ResolverTest, MultidomainResolution) {
Xiao Ma09b71022018-12-11 17:56:32 +0900944 constexpr char host_name[] = "nihao.example2.com.";
Luke Huangf8215372019-11-22 11:53:41 +0800945 std::vector<std::string> searchDomains = {"example1.com", "example2.com", "example3.com"};
Ken Chenb9fa2062018-11-13 21:51:13 +0800946
Xiao Ma09b71022018-12-11 17:56:32 +0900947 test::DNSResponder dns("127.0.0.6");
948 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.3"}});
949 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({"127.0.0.6"}, searchDomains));
950
Ken Chenb9fa2062018-11-13 21:51:13 +0800951 const hostent* result = gethostbyname("nihao");
Xiao Ma09b71022018-12-11 17:56:32 +0900952
Ken Chenb9fa2062018-11-13 21:51:13 +0800953 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
954 ASSERT_FALSE(result == nullptr);
955 ASSERT_EQ(4, result->h_length);
956 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
957 EXPECT_EQ("1.2.3.3", ToString(result));
958 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
Ken Chenb9fa2062018-11-13 21:51:13 +0800959}
960
961TEST_F(ResolverTest, GetAddrInfoV6_numeric) {
Ken Chenb9fa2062018-11-13 21:51:13 +0800962 constexpr char host_name[] = "ohayou.example.com.";
963 constexpr char numeric_addr[] = "fe80::1%lo";
964
Xiao Ma09b71022018-12-11 17:56:32 +0900965 test::DNSResponder dns;
Ken Chenb9fa2062018-11-13 21:51:13 +0800966 dns.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900967 StartDns(dns, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
968 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +0800969
970 addrinfo hints = {.ai_family = AF_INET6};
971 ScopedAddrinfo result = safe_getaddrinfo(numeric_addr, nullptr, &hints);
972 EXPECT_TRUE(result != nullptr);
973 EXPECT_EQ(numeric_addr, ToString(result));
974 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
975
976 // Now try a non-numeric hostname query with the AI_NUMERICHOST flag set.
977 // We should fail without sending out a DNS query.
978 hints.ai_flags |= AI_NUMERICHOST;
979 result = safe_getaddrinfo(host_name, nullptr, &hints);
980 EXPECT_TRUE(result == nullptr);
981 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
982}
983
984TEST_F(ResolverTest, GetAddrInfoV6_failing) {
Xiao Ma09b71022018-12-11 17:56:32 +0900985 constexpr char listen_addr0[] = "127.0.0.7";
986 constexpr char listen_addr1[] = "127.0.0.8";
Ken Chenb9fa2062018-11-13 21:51:13 +0800987 const char* host_name = "ohayou.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +0900988
989 test::DNSResponder dns0(listen_addr0);
990 test::DNSResponder dns1(listen_addr1);
Ken Chenb9fa2062018-11-13 21:51:13 +0800991 dns0.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +0900992 StartDns(dns0, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
993 StartDns(dns1, {{host_name, ns_type::ns_t_aaaa, "2001:db8::6"}});
994
Luke Huangf8215372019-11-22 11:53:41 +0800995 std::vector<std::string> servers = {listen_addr0, listen_addr1};
Ken Chenb9fa2062018-11-13 21:51:13 +0800996 // <sample validity in s> <success threshold in percent> <min samples> <max samples>
997 int sample_count = 8;
Luke Huangf8215372019-11-22 11:53:41 +0800998 const std::vector<int> params = {300, 25, sample_count, sample_count};
Xiao Ma09b71022018-12-11 17:56:32 +0900999 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, kDefaultSearchDomains, params));
Ken Chenb9fa2062018-11-13 21:51:13 +08001000
1001 // Repeatedly perform resolutions for non-existing domains until MAXNSSAMPLES resolutions have
1002 // reached the dns0, which is set to fail. No more requests should then arrive at that server
1003 // for the next sample_lifetime seconds.
1004 // TODO: This approach is implementation-dependent, change once metrics reporting is available.
Xiao Ma09b71022018-12-11 17:56:32 +09001005 const addrinfo hints = {.ai_family = AF_INET6};
Bernie Innocentib102dd22018-12-04 14:57:48 +09001006 for (int i = 0; i < sample_count; ++i) {
Ken Chenb9fa2062018-11-13 21:51:13 +08001007 std::string domain = StringPrintf("nonexistent%d", i);
1008 ScopedAddrinfo result = safe_getaddrinfo(domain.c_str(), nullptr, &hints);
1009 }
1010 // Due to 100% errors for all possible samples, the server should be ignored from now on and
1011 // only the second one used for all following queries, until NSSAMPLE_VALIDITY is reached.
1012 dns0.clearQueries();
1013 dns1.clearQueries();
1014 ScopedAddrinfo result = safe_getaddrinfo("ohayou", nullptr, &hints);
1015 EXPECT_TRUE(result != nullptr);
1016 EXPECT_EQ(0U, GetNumQueries(dns0, host_name));
1017 EXPECT_EQ(1U, GetNumQueries(dns1, host_name));
1018}
1019
1020TEST_F(ResolverTest, GetAddrInfoV6_nonresponsive) {
Xiao Ma09b71022018-12-11 17:56:32 +09001021 constexpr char listen_addr0[] = "127.0.0.7";
1022 constexpr char listen_addr1[] = "127.0.0.8";
1023 constexpr char listen_srv[] = "53";
1024 constexpr char host_name1[] = "ohayou.example.com.";
1025 constexpr char host_name2[] = "ciao.example.com.";
Luke Huang483cf332019-06-03 17:24:51 +08001026 const std::vector<std::string> defaultSearchDomain = {"example.com"};
1027 // The minimal timeout is 1000ms, so we can't decrease timeout
1028 // So reduce retry count.
1029 const std::vector<int> reduceRetryParams = {
1030 300, // sample validity in seconds
1031 25, // success threshod in percent
1032 8, 8, // {MIN,MAX}_SAMPLES
1033 1000, // BASE_TIMEOUT_MSEC
1034 1, // retry count
1035 };
Xiao Ma09b71022018-12-11 17:56:32 +09001036 const std::vector<DnsRecord> records0 = {
1037 {host_name1, ns_type::ns_t_aaaa, "2001:db8::5"},
1038 {host_name2, ns_type::ns_t_aaaa, "2001:db8::5"},
1039 };
1040 const std::vector<DnsRecord> records1 = {
1041 {host_name1, ns_type::ns_t_aaaa, "2001:db8::6"},
1042 {host_name2, ns_type::ns_t_aaaa, "2001:db8::6"},
1043 };
Ken Chenb9fa2062018-11-13 21:51:13 +08001044
1045 // dns0 does not respond with 100% probability, while
1046 // dns1 responds normally, at least initially.
Mike Yufc125e42019-05-15 20:41:28 +08001047 test::DNSResponder dns0(listen_addr0, listen_srv, static_cast<ns_rcode>(-1));
1048 test::DNSResponder dns1(listen_addr1, listen_srv, static_cast<ns_rcode>(-1));
Ken Chenb9fa2062018-11-13 21:51:13 +08001049 dns0.setResponseProbability(0.0);
Xiao Ma09b71022018-12-11 17:56:32 +09001050 StartDns(dns0, records0);
1051 StartDns(dns1, records1);
Luke Huang483cf332019-06-03 17:24:51 +08001052 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr0, listen_addr1}, defaultSearchDomain,
1053 reduceRetryParams));
Ken Chenb9fa2062018-11-13 21:51:13 +08001054
Luke Huang483cf332019-06-03 17:24:51 +08001055 // Specify ai_socktype to make getaddrinfo will only query 1 time
1056 const addrinfo hints = {.ai_family = AF_INET6, .ai_socktype = SOCK_STREAM};
Ken Chenb9fa2062018-11-13 21:51:13 +08001057
1058 // dns0 will ignore the request, and we'll fallback to dns1 after the first
1059 // retry.
1060 ScopedAddrinfo result = safe_getaddrinfo(host_name1, nullptr, &hints);
1061 EXPECT_TRUE(result != nullptr);
1062 EXPECT_EQ(1U, GetNumQueries(dns0, host_name1));
1063 EXPECT_EQ(1U, GetNumQueries(dns1, host_name1));
Mike Yu532405f2020-06-17 17:46:44 +08001064 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, 0, host_name1, {"2001:db8::6"});
Ken Chenb9fa2062018-11-13 21:51:13 +08001065
1066 // Now make dns1 also ignore 100% requests... The resolve should alternate
Luke Huang483cf332019-06-03 17:24:51 +08001067 // queries between the nameservers and fail
Ken Chenb9fa2062018-11-13 21:51:13 +08001068 dns1.setResponseProbability(0.0);
1069 addrinfo* result2 = nullptr;
1070 EXPECT_EQ(EAI_NODATA, getaddrinfo(host_name2, nullptr, &hints, &result2));
1071 EXPECT_EQ(nullptr, result2);
Luke Huang483cf332019-06-03 17:24:51 +08001072 EXPECT_EQ(1U, GetNumQueries(dns0, host_name2));
1073 EXPECT_EQ(1U, GetNumQueries(dns1, host_name2));
Mike Yu532405f2020-06-17 17:46:44 +08001074 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, RCODE_TIMEOUT, host_name2, {});
Ken Chenb9fa2062018-11-13 21:51:13 +08001075}
1076
1077TEST_F(ResolverTest, GetAddrInfoV6_concurrent) {
Xiao Ma09b71022018-12-11 17:56:32 +09001078 constexpr char listen_addr0[] = "127.0.0.9";
1079 constexpr char listen_addr1[] = "127.0.0.10";
1080 constexpr char listen_addr2[] = "127.0.0.11";
1081 constexpr char host_name[] = "konbanha.example.com.";
1082
1083 test::DNSResponder dns0(listen_addr0);
1084 test::DNSResponder dns1(listen_addr1);
1085 test::DNSResponder dns2(listen_addr2);
1086 StartDns(dns0, {{host_name, ns_type::ns_t_aaaa, "2001:db8::5"}});
1087 StartDns(dns1, {{host_name, ns_type::ns_t_aaaa, "2001:db8::6"}});
1088 StartDns(dns2, {{host_name, ns_type::ns_t_aaaa, "2001:db8::7"}});
1089
Luke Huangf8215372019-11-22 11:53:41 +08001090 const std::vector<std::string> servers = {listen_addr0, listen_addr1, listen_addr2};
Ken Chenb9fa2062018-11-13 21:51:13 +08001091 std::vector<std::thread> threads(10);
1092 for (std::thread& thread : threads) {
Luke Huangf8215372019-11-22 11:53:41 +08001093 thread = std::thread([this, &servers]() {
1094 unsigned delay = arc4random_uniform(1 * 1000 * 1000); // <= 1s
Ken Chenb9fa2062018-11-13 21:51:13 +08001095 usleep(delay);
1096 std::vector<std::string> serverSubset;
1097 for (const auto& server : servers) {
1098 if (arc4random_uniform(2)) {
1099 serverSubset.push_back(server);
1100 }
1101 }
1102 if (serverSubset.empty()) serverSubset = servers;
Xiao Ma09b71022018-12-11 17:56:32 +09001103 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(serverSubset));
1104 const addrinfo hints = {.ai_family = AF_INET6};
Ken Chenb9fa2062018-11-13 21:51:13 +08001105 addrinfo* result = nullptr;
1106 int rv = getaddrinfo("konbanha", nullptr, &hints, &result);
1107 EXPECT_EQ(0, rv) << "error [" << rv << "] " << gai_strerror(rv);
1108 if (result) {
1109 freeaddrinfo(result);
1110 result = nullptr;
1111 }
1112 });
1113 }
1114 for (std::thread& thread : threads) {
1115 thread.join();
1116 }
Ken Chen92bed612018-12-22 21:46:55 +08001117
1118 std::vector<std::string> res_servers;
1119 std::vector<std::string> res_domains;
1120 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001121 res_params res_params;
Ken Chen92bed612018-12-22 21:46:55 +08001122 std::vector<ResolverStats> res_stats;
1123 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001124 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1125 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1126 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chen92bed612018-12-22 21:46:55 +08001127 EXPECT_EQ(0, wait_for_pending_req_timeout_count);
Ken Chenb9fa2062018-11-13 21:51:13 +08001128}
1129
Mike Yu8ac63402019-12-02 15:28:38 +08001130TEST_F(ResolverTest, SkipBadServersDueToInternalError) {
1131 constexpr char listen_addr1[] = "fe80::1";
1132 constexpr char listen_addr2[] = "255.255.255.255";
1133 constexpr char listen_addr3[] = "127.0.0.3";
Mike Yu61d17262020-02-15 18:56:22 +08001134 int counter = 0; // To generate unique hostnames.
Mike Yu8ac63402019-12-02 15:28:38 +08001135 test::DNSResponder dns(listen_addr3);
1136 ASSERT_TRUE(dns.startServer());
1137
Mike Yu61d17262020-02-15 18:56:22 +08001138 ResolverParamsParcel setupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1139 setupParams.servers = {listen_addr1, listen_addr2, listen_addr3};
1140 setupParams.minSamples = 2; // Recognize bad servers in two attempts when sorting not enabled.
Mike Yu8ac63402019-12-02 15:28:38 +08001141
Mike Yu61d17262020-02-15 18:56:22 +08001142 ResolverParamsParcel cleanupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1143 cleanupParams.servers.clear();
1144 cleanupParams.tlsServers.clear();
Mike Yu8ac63402019-12-02 15:28:38 +08001145
Mike Yu61d17262020-02-15 18:56:22 +08001146 for (const auto& sortNameserversFlag : {"" /* unset */, "0" /* off */, "1" /* on */}) {
1147 SCOPED_TRACE(fmt::format("sortNameversFlag_{}", sortNameserversFlag));
1148 ScopedSystemProperties scopedSystemProperties(kSortNameserversFlag, sortNameserversFlag);
1149
Mike Yu10832aa2020-08-25 19:13:11 +08001150 // Re-setup test network to make experiment flag take effect.
1151 resetNetwork();
1152
Mike Yu61d17262020-02-15 18:56:22 +08001153 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(setupParams));
1154
1155 // Start sending synchronized querying.
1156 for (int i = 0; i < 100; i++) {
1157 std::string hostName = StringPrintf("hello%d.com.", counter++);
1158 dns.addMapping(hostName, ns_type::ns_t_a, "1.2.3.4");
1159 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1160 EXPECT_TRUE(safe_getaddrinfo(hostName.c_str(), nullptr, &hints) != nullptr);
1161 }
1162
1163 const std::vector<NameserverStats> targetStats = {
1164 NameserverStats(listen_addr1).setInternalErrors(5),
1165 NameserverStats(listen_addr2).setInternalErrors(5),
1166 NameserverStats(listen_addr3).setSuccesses(setupParams.maxSamples),
1167 };
1168 EXPECT_TRUE(expectStatsNotGreaterThan(targetStats));
1169
1170 // Also verify the number of queries received in the server because res_stats.successes has
1171 // a maximum.
1172 EXPECT_EQ(dns.queries().size(), 100U);
1173
1174 // Reset the state.
1175 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(cleanupParams));
1176 dns.clearQueries();
Mike Yu8ac63402019-12-02 15:28:38 +08001177 }
Mike Yu8ac63402019-12-02 15:28:38 +08001178}
1179
1180TEST_F(ResolverTest, SkipBadServersDueToTimeout) {
1181 constexpr char listen_addr1[] = "127.0.0.3";
1182 constexpr char listen_addr2[] = "127.0.0.4";
Mike Yu61d17262020-02-15 18:56:22 +08001183 int counter = 0; // To generate unique hostnames.
1184
1185 ResolverParamsParcel setupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1186 setupParams.servers = {listen_addr1, listen_addr2};
1187 setupParams.minSamples = 2; // Recognize bad servers in two attempts when sorting not enabled.
1188
1189 ResolverParamsParcel cleanupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1190 cleanupParams.servers.clear();
1191 cleanupParams.tlsServers.clear();
Mike Yu8ac63402019-12-02 15:28:38 +08001192
1193 // Set dns1 non-responsive and dns2 workable.
1194 test::DNSResponder dns1(listen_addr1, test::kDefaultListenService, static_cast<ns_rcode>(-1));
1195 test::DNSResponder dns2(listen_addr2);
1196 dns1.setResponseProbability(0.0);
1197 ASSERT_TRUE(dns1.startServer());
1198 ASSERT_TRUE(dns2.startServer());
1199
Mike Yu61d17262020-02-15 18:56:22 +08001200 for (const auto& sortNameserversFlag : {"" /* unset */, "0" /* off */, "1" /* on */}) {
1201 SCOPED_TRACE(fmt::format("sortNameversFlag_{}", sortNameserversFlag));
1202 ScopedSystemProperties scopedSystemProperties(kSortNameserversFlag, sortNameserversFlag);
Mike Yu8ac63402019-12-02 15:28:38 +08001203
Mike Yu10832aa2020-08-25 19:13:11 +08001204 // Re-setup test network to make experiment flag take effect.
1205 resetNetwork();
1206
Mike Yu61d17262020-02-15 18:56:22 +08001207 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(setupParams));
Mike Yu8ac63402019-12-02 15:28:38 +08001208
Mike Yu61d17262020-02-15 18:56:22 +08001209 // Start sending synchronized querying.
1210 for (int i = 0; i < 100; i++) {
1211 std::string hostName = StringPrintf("hello%d.com.", counter++);
1212 dns1.addMapping(hostName, ns_type::ns_t_a, "1.2.3.4");
1213 dns2.addMapping(hostName, ns_type::ns_t_a, "1.2.3.5");
1214 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1215 EXPECT_TRUE(safe_getaddrinfo(hostName.c_str(), nullptr, &hints) != nullptr);
1216 }
1217
1218 const std::vector<NameserverStats> targetStats = {
1219 NameserverStats(listen_addr1).setTimeouts(5),
1220 NameserverStats(listen_addr2).setSuccesses(setupParams.maxSamples),
1221 };
1222 EXPECT_TRUE(expectStatsNotGreaterThan(targetStats));
1223
1224 // Also verify the number of queries received in the server because res_stats.successes has
1225 // an upper bound.
1226 EXPECT_GT(dns1.queries().size(), 0U);
1227 EXPECT_LT(dns1.queries().size(), 5U);
1228 EXPECT_EQ(dns2.queries().size(), 100U);
1229
1230 // Reset the state.
1231 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(cleanupParams));
1232 dns1.clearQueries();
1233 dns2.clearQueries();
Mike Yu8ac63402019-12-02 15:28:38 +08001234 }
Mike Yu8ac63402019-12-02 15:28:38 +08001235}
1236
chenbrucefd837fa2019-10-29 18:35:36 +08001237TEST_F(ResolverTest, GetAddrInfoFromCustTable_InvalidInput) {
1238 constexpr char hostnameNoip[] = "noip.example.com.";
1239 constexpr char hostnameInvalidip[] = "invalidip.example.com.";
1240 const std::vector<aidl::android::net::ResolverHostsParcel> invalidCustHosts = {
1241 {"", hostnameNoip},
1242 {"wrong IP", hostnameInvalidip},
1243 };
1244 test::DNSResponder dns;
1245 StartDns(dns, {});
1246 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
Ken Chena6ac2a62020-04-07 17:25:56 +08001247 resolverParams.resolverOptions.hosts = invalidCustHosts;
chenbrucefd837fa2019-10-29 18:35:36 +08001248 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1249 for (const auto& hostname : {hostnameNoip, hostnameInvalidip}) {
1250 // The query won't get data from customized table because of invalid customized table
1251 // and DNSResponder also has no records. hostnameNoip has never registered and
1252 // hostnameInvalidip has registered but wrong IP.
1253 const addrinfo hints = {.ai_family = AF_UNSPEC};
1254 ScopedAddrinfo result = safe_getaddrinfo(hostname, nullptr, &hints);
1255 ASSERT_TRUE(result == nullptr);
1256 EXPECT_EQ(4U, GetNumQueries(dns, hostname));
1257 }
1258}
1259
1260TEST_F(ResolverTest, GetAddrInfoFromCustTable) {
1261 constexpr char hostnameV4[] = "v4only.example.com.";
1262 constexpr char hostnameV6[] = "v6only.example.com.";
1263 constexpr char hostnameV4V6[] = "v4v6.example.com.";
1264 constexpr char custAddrV4[] = "1.2.3.4";
1265 constexpr char custAddrV6[] = "::1.2.3.4";
1266 constexpr char dnsSvAddrV4[] = "1.2.3.5";
1267 constexpr char dnsSvAddrV6[] = "::1.2.3.5";
1268 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4 = {
1269 {custAddrV4, hostnameV4},
1270 };
1271 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV6 = {
1272 {custAddrV6, hostnameV6},
1273 };
1274 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4V6 = {
1275 {custAddrV4, hostnameV4V6},
1276 {custAddrV6, hostnameV4V6},
1277 };
1278 const std::vector<DnsRecord> dnsSvHostV4 = {
1279 {hostnameV4, ns_type::ns_t_a, dnsSvAddrV4},
1280 };
1281 const std::vector<DnsRecord> dnsSvHostV6 = {
1282 {hostnameV6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1283 };
1284 const std::vector<DnsRecord> dnsSvHostV4V6 = {
1285 {hostnameV4V6, ns_type::ns_t_a, dnsSvAddrV4},
1286 {hostnameV4V6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1287 };
1288 struct TestConfig {
1289 const std::string name;
1290 const std::vector<aidl::android::net::ResolverHostsParcel> customizedHosts;
1291 const std::vector<DnsRecord> dnsserverHosts;
1292 const std::vector<std::string> queryResult;
1293 std::string asParameters() const {
1294 return StringPrintf("name: %s, customizedHosts: %s, dnsserverHosts: %s", name.c_str(),
1295 customizedHosts.empty() ? "No" : "Yes",
1296 dnsserverHosts.empty() ? "No" : "Yes");
1297 }
1298 } testConfigs[]{
1299 // clang-format off
1300 {hostnameV4, {}, {}, {}},
1301 {hostnameV4, {}, dnsSvHostV4, {dnsSvAddrV4}},
1302 {hostnameV4, custHostV4, {}, {custAddrV4}},
1303 {hostnameV4, custHostV4, dnsSvHostV4, {custAddrV4}},
1304 {hostnameV6, {}, {}, {}},
1305 {hostnameV6, {}, dnsSvHostV6, {dnsSvAddrV6}},
1306 {hostnameV6, custHostV6, {}, {custAddrV6}},
1307 {hostnameV6, custHostV6, dnsSvHostV6, {custAddrV6}},
1308 {hostnameV4V6, {}, {}, {}},
1309 {hostnameV4V6, {}, dnsSvHostV4V6, {dnsSvAddrV4, dnsSvAddrV6}},
1310 {hostnameV4V6, custHostV4V6, {}, {custAddrV4, custAddrV6}},
1311 {hostnameV4V6, custHostV4V6, dnsSvHostV4V6, {custAddrV4, custAddrV6}},
1312 // clang-format on
1313 };
1314
1315 for (const auto& config : testConfigs) {
1316 SCOPED_TRACE(config.asParameters());
1317
1318 test::DNSResponder dns;
1319 StartDns(dns, config.dnsserverHosts);
1320
1321 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
Ken Chena6ac2a62020-04-07 17:25:56 +08001322 resolverParams.resolverOptions.hosts = config.customizedHosts;
chenbrucefd837fa2019-10-29 18:35:36 +08001323 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1324 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM};
1325 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
1326 if (config.customizedHosts.empty() && config.dnsserverHosts.empty()) {
1327 ASSERT_TRUE(result == nullptr);
1328 EXPECT_EQ(2U, GetNumQueries(dns, config.name.c_str()));
1329 } else {
1330 ASSERT_TRUE(result != nullptr);
1331 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(config.queryResult));
1332 EXPECT_EQ(config.customizedHosts.empty() ? 2U : 0U,
1333 GetNumQueries(dns, config.name.c_str()));
1334 }
1335
1336 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
1337 }
1338}
1339
1340TEST_F(ResolverTest, GetAddrInfoFromCustTable_Modify) {
1341 constexpr char hostnameV4V6[] = "v4v6.example.com.";
1342 constexpr char custAddrV4[] = "1.2.3.4";
1343 constexpr char custAddrV6[] = "::1.2.3.4";
1344 constexpr char dnsSvAddrV4[] = "1.2.3.5";
1345 constexpr char dnsSvAddrV6[] = "::1.2.3.5";
1346 const std::vector<DnsRecord> dnsSvHostV4V6 = {
1347 {hostnameV4V6, ns_type::ns_t_a, dnsSvAddrV4},
1348 {hostnameV4V6, ns_type::ns_t_aaaa, dnsSvAddrV6},
1349 };
1350 const std::vector<aidl::android::net::ResolverHostsParcel> custHostV4V6 = {
1351 {custAddrV4, hostnameV4V6},
1352 {custAddrV6, hostnameV4V6},
1353 };
1354 test::DNSResponder dns;
1355 StartDns(dns, dnsSvHostV4V6);
1356 auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
1357
Ken Chena6ac2a62020-04-07 17:25:56 +08001358 resolverParams.resolverOptions.hosts = custHostV4V6;
chenbrucefd837fa2019-10-29 18:35:36 +08001359 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1360 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM};
1361 ScopedAddrinfo result = safe_getaddrinfo(hostnameV4V6, nullptr, &hints);
1362 ASSERT_TRUE(result != nullptr);
1363 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray({custAddrV4, custAddrV6}));
1364 EXPECT_EQ(0U, GetNumQueries(dns, hostnameV4V6));
1365
Ken Chena6ac2a62020-04-07 17:25:56 +08001366 resolverParams.resolverOptions.hosts = {};
chenbrucefd837fa2019-10-29 18:35:36 +08001367 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
1368 result = safe_getaddrinfo(hostnameV4V6, nullptr, &hints);
1369 ASSERT_TRUE(result != nullptr);
1370 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray({dnsSvAddrV4, dnsSvAddrV6}));
1371 EXPECT_EQ(2U, GetNumQueries(dns, hostnameV4V6));
1372}
1373
Ken Chenb9fa2062018-11-13 21:51:13 +08001374TEST_F(ResolverTest, EmptySetup) {
Ken Chenb9fa2062018-11-13 21:51:13 +08001375 std::vector<std::string> servers;
1376 std::vector<std::string> domains;
Xiao Ma09b71022018-12-11 17:56:32 +09001377 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001378 std::vector<std::string> res_servers;
1379 std::vector<std::string> res_domains;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001380 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001381 res_params res_params;
Ken Chenb9fa2062018-11-13 21:51:13 +08001382 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +08001383 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001384 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1385 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1386 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Ken Chenb9fa2062018-11-13 21:51:13 +08001387 EXPECT_EQ(0U, res_servers.size());
1388 EXPECT_EQ(0U, res_domains.size());
Mike Yu0a1c53d2018-11-26 13:26:21 +09001389 EXPECT_EQ(0U, res_tls_servers.size());
Luke Huang5bd827c2019-03-14 16:10:04 +08001390 ASSERT_EQ(static_cast<size_t>(IDnsResolver::RESOLVER_PARAMS_COUNT), kDefaultParams.size());
1391 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY],
1392 res_params.sample_validity);
1393 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001394 res_params.success_threshold);
Luke Huang5bd827c2019-03-14 16:10:04 +08001395 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
1396 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
1397 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
Ken Chenb9fa2062018-11-13 21:51:13 +08001398 res_params.base_timeout_msec);
Luke Huang5bd827c2019-03-14 16:10:04 +08001399 EXPECT_EQ(kDefaultParams[IDnsResolver::RESOLVER_PARAMS_RETRY_COUNT], res_params.retry_count);
Ken Chenb9fa2062018-11-13 21:51:13 +08001400}
1401
1402TEST_F(ResolverTest, SearchPathChange) {
Xiao Ma09b71022018-12-11 17:56:32 +09001403 constexpr char listen_addr[] = "127.0.0.13";
1404 constexpr char host_name1[] = "test13.domain1.org.";
1405 constexpr char host_name2[] = "test13.domain2.org.";
Luke Huangf8215372019-11-22 11:53:41 +08001406 std::vector<std::string> servers = {listen_addr};
1407 std::vector<std::string> domains = {"domain1.org"};
Xiao Ma09b71022018-12-11 17:56:32 +09001408
1409 const std::vector<DnsRecord> records = {
1410 {host_name1, ns_type::ns_t_aaaa, "2001:db8::13"},
1411 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1:13"},
1412 };
1413 test::DNSResponder dns(listen_addr);
1414 StartDns(dns, records);
1415 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001416
1417 const addrinfo hints = {.ai_family = AF_INET6};
1418 ScopedAddrinfo result = safe_getaddrinfo("test13", nullptr, &hints);
1419 EXPECT_TRUE(result != nullptr);
1420 EXPECT_EQ(1U, dns.queries().size());
1421 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
1422 EXPECT_EQ("2001:db8::13", ToString(result));
1423
1424 // Test that changing the domain search path on its own works.
Luke Huangf8215372019-11-22 11:53:41 +08001425 domains = {"domain2.org"};
Xiao Ma09b71022018-12-11 17:56:32 +09001426 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, domains));
Ken Chenb9fa2062018-11-13 21:51:13 +08001427 dns.clearQueries();
1428
1429 result = safe_getaddrinfo("test13", nullptr, &hints);
1430 EXPECT_TRUE(result != nullptr);
1431 EXPECT_EQ(1U, dns.queries().size());
1432 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
1433 EXPECT_EQ("2001:db8::1:13", ToString(result));
1434}
1435
Luke Huang2dac4382019-06-24 13:28:44 +08001436namespace {
1437
Luke Huangf8215372019-11-22 11:53:41 +08001438std::vector<std::string> getResolverDomains(aidl::android::net::IDnsResolver* dnsResolverService,
Luke Huang2dac4382019-06-24 13:28:44 +08001439 unsigned netId) {
1440 std::vector<std::string> res_servers;
1441 std::vector<std::string> res_domains;
1442 std::vector<std::string> res_tls_servers;
1443 res_params res_params;
1444 std::vector<ResolverStats> res_stats;
1445 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001446 DnsResponderClient::GetResolverInfo(dnsResolverService, netId, &res_servers, &res_domains,
1447 &res_tls_servers, &res_params, &res_stats,
1448 &wait_for_pending_req_timeout_count);
Luke Huang2dac4382019-06-24 13:28:44 +08001449 return res_domains;
1450}
1451
1452} // namespace
1453
1454TEST_F(ResolverTest, SearchPathPrune) {
1455 constexpr size_t DUPLICATED_DOMAIN_NUM = 3;
1456 constexpr char listen_addr[] = "127.0.0.13";
1457 constexpr char domian_name1[] = "domain13.org.";
1458 constexpr char domian_name2[] = "domain14.org.";
1459 constexpr char host_name1[] = "test13.domain13.org.";
1460 constexpr char host_name2[] = "test14.domain14.org.";
1461 std::vector<std::string> servers = {listen_addr};
1462
1463 std::vector<std::string> testDomains1;
1464 std::vector<std::string> testDomains2;
1465 // Domain length should be <= 255
1466 // Max number of domains in search path is 6
1467 for (size_t i = 0; i < MAXDNSRCH + 1; i++) {
1468 // Fill up with invalid domain
1469 testDomains1.push_back(std::string(300, i + '0'));
1470 // Fill up with valid but duplicated domain
1471 testDomains2.push_back(StringPrintf("domain%zu.org", i % DUPLICATED_DOMAIN_NUM));
1472 }
1473
1474 // Add valid domain used for query.
1475 testDomains1.push_back(domian_name1);
1476
1477 // Add valid domain twice used for query.
1478 testDomains2.push_back(domian_name2);
1479 testDomains2.push_back(domian_name2);
1480
1481 const std::vector<DnsRecord> records = {
1482 {host_name1, ns_type::ns_t_aaaa, "2001:db8::13"},
1483 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1:13"},
1484 };
1485 test::DNSResponder dns(listen_addr);
1486 StartDns(dns, records);
1487 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, testDomains1));
1488
1489 const addrinfo hints = {.ai_family = AF_INET6};
1490 ScopedAddrinfo result = safe_getaddrinfo("test13", nullptr, &hints);
1491
1492 EXPECT_TRUE(result != nullptr);
1493
1494 EXPECT_EQ(1U, dns.queries().size());
1495 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
1496 EXPECT_EQ("2001:db8::13", ToString(result));
1497
1498 const auto& res_domains1 = getResolverDomains(mDnsClient.resolvService(), TEST_NETID);
1499 // Expect 1 valid domain, invalid domains are removed.
1500 ASSERT_EQ(1U, res_domains1.size());
1501 EXPECT_EQ(domian_name1, res_domains1[0]);
1502
1503 dns.clearQueries();
1504
1505 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, testDomains2));
1506
1507 result = safe_getaddrinfo("test14", nullptr, &hints);
1508 EXPECT_TRUE(result != nullptr);
1509
1510 // (3 domains * 2 retries) + 1 success query = 7
1511 EXPECT_EQ(7U, dns.queries().size());
1512 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
1513 EXPECT_EQ("2001:db8::1:13", ToString(result));
1514
1515 const auto& res_domains2 = getResolverDomains(mDnsClient.resolvService(), TEST_NETID);
1516 // Expect 4 valid domain, duplicate domains are removed.
1517 EXPECT_EQ(DUPLICATED_DOMAIN_NUM + 1U, res_domains2.size());
1518 EXPECT_THAT(
1519 std::vector<std::string>({"domain0.org", "domain1.org", "domain2.org", domian_name2}),
1520 testing::ElementsAreArray(res_domains2));
1521}
1522
Mike Yu0a1c53d2018-11-26 13:26:21 +09001523// If we move this function to dns_responder_client, it will complicate the dependency need of
1524// dns_tls_frontend.h.
1525static void setupTlsServers(const std::vector<std::string>& servers,
waynema0e73c2e2019-07-31 15:04:08 +08001526 std::vector<std::unique_ptr<test::DnsTlsFrontend>>* tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001527 constexpr char listen_udp[] = "53";
1528 constexpr char listen_tls[] = "853";
Mike Yu0a1c53d2018-11-26 13:26:21 +09001529
1530 for (const auto& server : servers) {
1531 auto t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
1532 t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
1533 t->startServer();
Mike Yu0a1c53d2018-11-26 13:26:21 +09001534 tls->push_back(std::move(t));
1535 }
1536}
1537
Mike Yu0a1c53d2018-11-26 13:26:21 +09001538TEST_F(ResolverTest, MaxServerPrune_Binder) {
Mike Yu0a1c53d2018-11-26 13:26:21 +09001539 std::vector<std::string> domains;
1540 std::vector<std::unique_ptr<test::DNSResponder>> dns;
1541 std::vector<std::unique_ptr<test::DnsTlsFrontend>> tls;
1542 std::vector<std::string> servers;
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001543 std::vector<DnsResponderClient::Mapping> mappings;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001544
1545 for (unsigned i = 0; i < MAXDNSRCH + 1; i++) {
1546 domains.push_back(StringPrintf("example%u.com", i));
1547 }
Bernie Innocentia5c7b7b2019-01-17 21:28:24 +09001548 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupMappings(1, domains, &mappings));
1549 ASSERT_NO_FATAL_FAILURE(mDnsClient.SetupDNSServers(MAXNS + 1, mappings, &dns, &servers));
waynema0e73c2e2019-07-31 15:04:08 +08001550 ASSERT_NO_FATAL_FAILURE(setupTlsServers(servers, &tls));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001551
waynema0e73c2e2019-07-31 15:04:08 +08001552 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, domains, kDefaultParams,
1553 kDefaultPrivateDnsHostName));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001554
Mike Yu383855b2019-01-15 17:53:27 +08001555 // If the private DNS validation hasn't completed yet before backend DNS servers stop,
1556 // TLS servers will get stuck in handleOneRequest(), which causes this test stuck in
1557 // ~DnsTlsFrontend() because the TLS server loop threads can't be terminated.
1558 // So, wait for private DNS validation done before stopping backend DNS servers.
1559 for (int i = 0; i < MAXNS; i++) {
chenbruceaff85842019-05-31 15:46:42 +08001560 LOG(INFO) << "Waiting for private DNS validation on " << tls[i]->listen_address() << ".";
Mike Yu724f77d2019-08-16 11:14:50 +08001561 EXPECT_TRUE(WaitForPrivateDnsValidation(tls[i]->listen_address(), true));
chenbruceaff85842019-05-31 15:46:42 +08001562 LOG(INFO) << "private DNS validation on " << tls[i]->listen_address() << " done.";
Mike Yu383855b2019-01-15 17:53:27 +08001563 }
1564
Mike Yu0a1c53d2018-11-26 13:26:21 +09001565 std::vector<std::string> res_servers;
1566 std::vector<std::string> res_domains;
1567 std::vector<std::string> res_tls_servers;
Bernie Innocenti758005f2019-02-19 18:08:36 +09001568 res_params res_params;
Mike Yu0a1c53d2018-11-26 13:26:21 +09001569 std::vector<ResolverStats> res_stats;
Ken Chen92bed612018-12-22 21:46:55 +08001570 int wait_for_pending_req_timeout_count;
Luke Huangf8215372019-11-22 11:53:41 +08001571 ASSERT_TRUE(DnsResponderClient::GetResolverInfo(
1572 mDnsClient.resolvService(), TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
1573 &res_params, &res_stats, &wait_for_pending_req_timeout_count));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001574
1575 // Check the size of the stats and its contents.
1576 EXPECT_EQ(static_cast<size_t>(MAXNS), res_servers.size());
1577 EXPECT_EQ(static_cast<size_t>(MAXNS), res_tls_servers.size());
1578 EXPECT_EQ(static_cast<size_t>(MAXDNSRCH), res_domains.size());
1579 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_servers.begin()));
1580 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_tls_servers.begin()));
1581 EXPECT_TRUE(std::equal(domains.begin(), domains.begin() + MAXDNSRCH, res_domains.begin()));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001582}
1583
1584TEST_F(ResolverTest, ResolverStats) {
Xiao Ma09b71022018-12-11 17:56:32 +09001585 constexpr char listen_addr1[] = "127.0.0.4";
1586 constexpr char listen_addr2[] = "127.0.0.5";
1587 constexpr char listen_addr3[] = "127.0.0.6";
Mike Yu0a1c53d2018-11-26 13:26:21 +09001588
1589 // Set server 1 timeout.
Mike Yufc125e42019-05-15 20:41:28 +08001590 test::DNSResponder dns1(listen_addr1, "53", static_cast<ns_rcode>(-1));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001591 dns1.setResponseProbability(0.0);
1592 ASSERT_TRUE(dns1.startServer());
1593
1594 // Set server 2 responding server failure.
Xiao Ma09b71022018-12-11 17:56:32 +09001595 test::DNSResponder dns2(listen_addr2);
Mike Yu0a1c53d2018-11-26 13:26:21 +09001596 dns2.setResponseProbability(0.0);
1597 ASSERT_TRUE(dns2.startServer());
1598
1599 // Set server 3 workable.
Xiao Ma09b71022018-12-11 17:56:32 +09001600 test::DNSResponder dns3(listen_addr3);
1601 dns3.addMapping(kHelloExampleCom, ns_type::ns_t_a, "1.2.3.4");
Mike Yu0a1c53d2018-11-26 13:26:21 +09001602 ASSERT_TRUE(dns3.startServer());
1603
1604 std::vector<std::string> servers = {listen_addr1, listen_addr2, listen_addr3};
Xiao Ma09b71022018-12-11 17:56:32 +09001605 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001606
1607 dns3.clearQueries();
Xiao Ma09b71022018-12-11 17:56:32 +09001608 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
Mike Yu0a1c53d2018-11-26 13:26:21 +09001609 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
Xiao Ma09b71022018-12-11 17:56:32 +09001610 size_t found = GetNumQueries(dns3, kHelloExampleCom);
Mike Yu0a1c53d2018-11-26 13:26:21 +09001611 EXPECT_LE(1U, found);
1612 std::string result_str = ToString(result);
1613 EXPECT_TRUE(result_str == "1.2.3.4") << ", result_str='" << result_str << "'";
1614
Mike Yue2162e52020-03-04 18:43:46 +08001615 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1616 NameserverStats(listen_addr1).setTimeouts(1),
1617 NameserverStats(listen_addr2).setErrors(1),
1618 NameserverStats(listen_addr3).setSuccesses(1),
1619 };
Mike Yu61d17262020-02-15 18:56:22 +08001620 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu0a1c53d2018-11-26 13:26:21 +09001621}
1622
Mike Yu15791832020-02-11 13:38:48 +08001623TEST_F(ResolverTest, AlwaysUseLatestSetupParamsInLookups) {
1624 constexpr char listen_addr1[] = "127.0.0.3";
1625 constexpr char listen_addr2[] = "255.255.255.255";
1626 constexpr char listen_addr3[] = "127.0.0.4";
1627 constexpr char hostname[] = "hello";
1628 constexpr char fqdn_with_search_domain[] = "hello.domain2.com.";
1629
1630 test::DNSResponder dns1(listen_addr1, test::kDefaultListenService, static_cast<ns_rcode>(-1));
1631 dns1.setResponseProbability(0.0);
1632 ASSERT_TRUE(dns1.startServer());
1633
1634 test::DNSResponder dns3(listen_addr3);
1635 StartDns(dns3, {{fqdn_with_search_domain, ns_type::ns_t_a, "1.2.3.4"}});
1636
1637 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
1638 parcel.tlsServers.clear();
1639 parcel.servers = {listen_addr1, listen_addr2};
1640 parcel.domains = {"domain1.com", "domain2.com"};
1641 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1642
1643 // Expect the things happening in t1:
1644 // 1. The lookup starts using the first domain for query. It sends queries to the populated
1645 // nameserver list {listen_addr1, listen_addr2} for the hostname "hello.domain1.com".
1646 // 2. A different list of nameservers is updated to the resolver. Revision ID is incremented.
1647 // 3. The query for the hostname times out. The lookup fails to add the timeout record to the
1648 // the stats because of the unmatched revision ID.
1649 // 4. The lookup starts using the second domain for query. It sends queries to the populated
1650 // nameserver list {listen_addr3, listen_addr1, listen_addr2} for another hostname
1651 // "hello.domain2.com".
1652 // 5. The lookup gets the answer and updates a success record to the stats.
1653 std::thread t1([&hostname]() {
1654 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1655 ScopedAddrinfo result = safe_getaddrinfo(hostname, nullptr, &hints);
1656 EXPECT_NE(result.get(), nullptr);
1657 EXPECT_EQ(ToString(result), "1.2.3.4");
1658 });
1659
1660 // Wait for t1 to start the step 1.
1661 while (dns1.queries().size() == 0) {
1662 usleep(1000);
1663 }
1664
1665 // Update the resolver with three nameservers. This will increment the revision ID.
1666 parcel.servers = {listen_addr3, listen_addr1, listen_addr2};
1667 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
1668
1669 t1.join();
1670 EXPECT_EQ(0U, GetNumQueriesForType(dns3, ns_type::ns_t_aaaa, fqdn_with_search_domain));
1671 EXPECT_EQ(1U, GetNumQueriesForType(dns3, ns_type::ns_t_a, fqdn_with_search_domain));
1672
Mike Yue2162e52020-03-04 18:43:46 +08001673 const std::vector<NameserverStats> expectedCleartextDnsStats = {
1674 NameserverStats(listen_addr1),
1675 NameserverStats(listen_addr2),
1676 NameserverStats(listen_addr3).setSuccesses(1),
1677 };
Mike Yu61d17262020-02-15 18:56:22 +08001678 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu15791832020-02-11 13:38:48 +08001679}
1680
Ken Chenb9fa2062018-11-13 21:51:13 +08001681// Test what happens if the specified TLS server is nonexistent.
1682TEST_F(ResolverTest, GetHostByName_TlsMissing) {
Xiao Ma09b71022018-12-11 17:56:32 +09001683 constexpr char listen_addr[] = "127.0.0.3";
1684 constexpr char host_name[] = "tlsmissing.example.com.";
1685
1686 test::DNSResponder dns;
1687 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.3"}});
Luke Huangf8215372019-11-22 11:53:41 +08001688 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001689
1690 // There's nothing listening on this address, so validation will either fail or
1691 /// hang. Either way, queries will continue to flow to the DNSResponder.
waynema0e73c2e2019-07-31 15:04:08 +08001692 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Ken Chenb9fa2062018-11-13 21:51:13 +08001693
1694 const hostent* result;
1695
1696 result = gethostbyname("tlsmissing");
1697 ASSERT_FALSE(result == nullptr);
1698 EXPECT_EQ("1.2.3.3", ToString(result));
1699
1700 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001701 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001702}
1703
1704// Test what happens if the specified TLS server replies with garbage.
1705TEST_F(ResolverTest, GetHostByName_TlsBroken) {
Xiao Ma09b71022018-12-11 17:56:32 +09001706 constexpr char listen_addr[] = "127.0.0.3";
1707 constexpr char host_name1[] = "tlsbroken1.example.com.";
1708 constexpr char host_name2[] = "tlsbroken2.example.com.";
1709 const std::vector<DnsRecord> records = {
1710 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1711 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1712 };
1713
1714 test::DNSResponder dns;
1715 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001716 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001717
1718 // Bind the specified private DNS socket but don't respond to any client sockets yet.
1719 int s = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, IPPROTO_TCP);
1720 ASSERT_TRUE(s >= 0);
1721 struct sockaddr_in tlsServer = {
Luke Huangf8215372019-11-22 11:53:41 +08001722 .sin_family = AF_INET,
1723 .sin_port = htons(853),
Ken Chenb9fa2062018-11-13 21:51:13 +08001724 };
1725 ASSERT_TRUE(inet_pton(AF_INET, listen_addr, &tlsServer.sin_addr));
1726 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEPORT).ok());
1727 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEADDR).ok());
1728 ASSERT_FALSE(bind(s, reinterpret_cast<struct sockaddr*>(&tlsServer), sizeof(tlsServer)));
1729 ASSERT_FALSE(listen(s, 1));
1730
1731 // Trigger TLS validation.
waynema0e73c2e2019-07-31 15:04:08 +08001732 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Ken Chenb9fa2062018-11-13 21:51:13 +08001733
1734 struct sockaddr_storage cliaddr;
1735 socklen_t sin_size = sizeof(cliaddr);
Luke Huangf8215372019-11-22 11:53:41 +08001736 int new_fd = accept4(s, reinterpret_cast<struct sockaddr*>(&cliaddr), &sin_size, SOCK_CLOEXEC);
Ken Chenb9fa2062018-11-13 21:51:13 +08001737 ASSERT_TRUE(new_fd > 0);
1738
1739 // We've received the new file descriptor but not written to it or closed, so the
1740 // validation is still pending. Queries should still flow correctly because the
1741 // server is not used until validation succeeds.
1742 const hostent* result;
1743 result = gethostbyname("tlsbroken1");
1744 ASSERT_FALSE(result == nullptr);
1745 EXPECT_EQ("1.2.3.1", ToString(result));
1746
1747 // Now we cause the validation to fail.
1748 std::string garbage = "definitely not a valid TLS ServerHello";
1749 write(new_fd, garbage.data(), garbage.size());
1750 close(new_fd);
1751
1752 // Validation failure shouldn't interfere with lookups, because lookups won't be sent
1753 // to the TLS server unless validation succeeds.
1754 result = gethostbyname("tlsbroken2");
1755 ASSERT_FALSE(result == nullptr);
1756 EXPECT_EQ("1.2.3.2", ToString(result));
1757
1758 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001759 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001760 close(s);
1761}
1762
1763TEST_F(ResolverTest, GetHostByName_Tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001764 constexpr char listen_addr[] = "127.0.0.3";
1765 constexpr char listen_udp[] = "53";
1766 constexpr char listen_tls[] = "853";
1767 constexpr char host_name1[] = "tls1.example.com.";
1768 constexpr char host_name2[] = "tls2.example.com.";
1769 constexpr char host_name3[] = "tls3.example.com.";
1770 const std::vector<DnsRecord> records = {
1771 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1772 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1773 {host_name3, ns_type::ns_t_a, "1.2.3.3"},
1774 };
1775
1776 test::DNSResponder dns;
1777 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001778 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001779
1780 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1781 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001782 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08001783 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001784
Mike Yu724f77d2019-08-16 11:14:50 +08001785 const hostent* result = gethostbyname("tls1");
Ken Chenb9fa2062018-11-13 21:51:13 +08001786 ASSERT_FALSE(result == nullptr);
1787 EXPECT_EQ("1.2.3.1", ToString(result));
1788
1789 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001790 EXPECT_TRUE(tls.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001791
1792 // Stop the TLS server. Since we're in opportunistic mode, queries will
1793 // fall back to the locally-assigned (clear text) nameservers.
1794 tls.stopServer();
1795
1796 dns.clearQueries();
1797 result = gethostbyname("tls2");
1798 EXPECT_FALSE(result == nullptr);
1799 EXPECT_EQ("1.2.3.2", ToString(result));
1800 const auto queries = dns.queries();
1801 EXPECT_EQ(1U, queries.size());
waynema29253052019-08-20 11:26:08 +08001802 EXPECT_EQ("tls2.example.com.", queries[0].name);
1803 EXPECT_EQ(ns_t_a, queries[0].type);
Ken Chenb9fa2062018-11-13 21:51:13 +08001804
1805 // Reset the resolvers without enabling TLS. Queries should still be routed
1806 // to the UDP endpoint.
Xiao Ma09b71022018-12-11 17:56:32 +09001807 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001808
1809 result = gethostbyname("tls3");
1810 ASSERT_FALSE(result == nullptr);
1811 EXPECT_EQ("1.2.3.3", ToString(result));
Ken Chenb9fa2062018-11-13 21:51:13 +08001812}
1813
Ken Chenb9fa2062018-11-13 21:51:13 +08001814TEST_F(ResolverTest, GetHostByName_TlsFailover) {
Xiao Ma09b71022018-12-11 17:56:32 +09001815 constexpr char listen_addr1[] = "127.0.0.3";
1816 constexpr char listen_addr2[] = "127.0.0.4";
1817 constexpr char listen_udp[] = "53";
1818 constexpr char listen_tls[] = "853";
1819 constexpr char host_name1[] = "tlsfailover1.example.com.";
1820 constexpr char host_name2[] = "tlsfailover2.example.com.";
1821 const std::vector<DnsRecord> records1 = {
1822 {host_name1, ns_type::ns_t_a, "1.2.3.1"},
1823 {host_name2, ns_type::ns_t_a, "1.2.3.2"},
1824 };
1825 const std::vector<DnsRecord> records2 = {
1826 {host_name1, ns_type::ns_t_a, "1.2.3.3"},
1827 {host_name2, ns_type::ns_t_a, "1.2.3.4"},
1828 };
1829
1830 test::DNSResponder dns1(listen_addr1);
1831 test::DNSResponder dns2(listen_addr2);
1832 StartDns(dns1, records1);
1833 StartDns(dns2, records2);
1834
Luke Huangf8215372019-11-22 11:53:41 +08001835 std::vector<std::string> servers = {listen_addr1, listen_addr2};
Ken Chenb9fa2062018-11-13 21:51:13 +08001836
1837 test::DnsTlsFrontend tls1(listen_addr1, listen_tls, listen_addr1, listen_udp);
1838 test::DnsTlsFrontend tls2(listen_addr2, listen_tls, listen_addr2, listen_udp);
1839 ASSERT_TRUE(tls1.startServer());
1840 ASSERT_TRUE(tls2.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001841 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1842 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08001843 EXPECT_TRUE(WaitForPrivateDnsValidation(tls1.listen_address(), true));
1844 EXPECT_TRUE(WaitForPrivateDnsValidation(tls2.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001845
Mike Yu724f77d2019-08-16 11:14:50 +08001846 const hostent* result = gethostbyname("tlsfailover1");
Ken Chenb9fa2062018-11-13 21:51:13 +08001847 ASSERT_FALSE(result == nullptr);
1848 EXPECT_EQ("1.2.3.1", ToString(result));
1849
1850 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001851 EXPECT_TRUE(tls1.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001852 // No new queries should have reached tls2.
Luke Huang0a0870d2020-02-12 20:41:10 +08001853 EXPECT_TRUE(tls2.waitForQueries(1));
Ken Chenb9fa2062018-11-13 21:51:13 +08001854
1855 // Stop tls1. Subsequent queries should attempt to reach tls1, fail, and retry to tls2.
1856 tls1.stopServer();
1857
1858 result = gethostbyname("tlsfailover2");
1859 EXPECT_EQ("1.2.3.4", ToString(result));
1860
1861 // Wait for query to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001862 EXPECT_TRUE(tls2.waitForQueries(2));
Ken Chenb9fa2062018-11-13 21:51:13 +08001863
1864 // No additional queries should have reached the insecure servers.
1865 EXPECT_EQ(2U, dns1.queries().size());
1866 EXPECT_EQ(2U, dns2.queries().size());
1867
1868 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001869 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Ken Chenb9fa2062018-11-13 21:51:13 +08001870}
1871
1872TEST_F(ResolverTest, GetHostByName_BadTlsName) {
Xiao Ma09b71022018-12-11 17:56:32 +09001873 constexpr char listen_addr[] = "127.0.0.3";
1874 constexpr char listen_udp[] = "53";
1875 constexpr char listen_tls[] = "853";
1876 constexpr char host_name[] = "badtlsname.example.com.";
1877
1878 test::DNSResponder dns;
1879 StartDns(dns, {{host_name, ns_type::ns_t_a, "1.2.3.1"}});
Luke Huangf8215372019-11-22 11:53:41 +08001880 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001881
1882 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1883 ASSERT_TRUE(tls.startServer());
Xiao Ma09b71022018-12-11 17:56:32 +09001884 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
waynema0e73c2e2019-07-31 15:04:08 +08001885 kDefaultIncorrectPrivateDnsHostName));
Ken Chenb9fa2062018-11-13 21:51:13 +08001886
waynema0e73c2e2019-07-31 15:04:08 +08001887 // The TLS handshake would fail because the name of TLS server doesn't
1888 // match with TLS server's certificate.
Mike Yu724f77d2019-08-16 11:14:50 +08001889 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), false));
Ken Chenb9fa2062018-11-13 21:51:13 +08001890
1891 // The query should fail hard, because a name was specified.
1892 EXPECT_EQ(nullptr, gethostbyname("badtlsname"));
1893
1894 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001895 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001896}
1897
1898TEST_F(ResolverTest, GetAddrInfo_Tls) {
Xiao Ma09b71022018-12-11 17:56:32 +09001899 constexpr char listen_addr[] = "127.0.0.3";
1900 constexpr char listen_udp[] = "53";
1901 constexpr char listen_tls[] = "853";
1902 constexpr char host_name[] = "addrinfotls.example.com.";
1903 const std::vector<DnsRecord> records = {
1904 {host_name, ns_type::ns_t_a, "1.2.3.4"},
1905 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
1906 };
1907
1908 test::DNSResponder dns;
1909 StartDns(dns, records);
Luke Huangf8215372019-11-22 11:53:41 +08001910 std::vector<std::string> servers = {listen_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001911
1912 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1913 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08001914 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
1915 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08001916 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Ken Chenb9fa2062018-11-13 21:51:13 +08001917
1918 dns.clearQueries();
1919 ScopedAddrinfo result = safe_getaddrinfo("addrinfotls", nullptr, nullptr);
1920 EXPECT_TRUE(result != nullptr);
1921 size_t found = GetNumQueries(dns, host_name);
1922 EXPECT_LE(1U, found);
1923 // Could be A or AAAA
1924 std::string result_str = ToString(result);
1925 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
Luke Huangf8215372019-11-22 11:53:41 +08001926 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08001927 // Wait for both A and AAAA queries to get counted.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09001928 EXPECT_TRUE(tls.waitForQueries(3));
Ken Chenb9fa2062018-11-13 21:51:13 +08001929
1930 // Clear TLS bit.
Xiao Ma09b71022018-12-11 17:56:32 +09001931 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
Ken Chenb9fa2062018-11-13 21:51:13 +08001932}
1933
1934TEST_F(ResolverTest, TlsBypass) {
1935 const char OFF[] = "off";
1936 const char OPPORTUNISTIC[] = "opportunistic";
1937 const char STRICT[] = "strict";
1938
1939 const char GETHOSTBYNAME[] = "gethostbyname";
1940 const char GETADDRINFO[] = "getaddrinfo";
1941 const char GETADDRINFOFORNET[] = "getaddrinfofornet";
1942
1943 const unsigned BYPASS_NETID = NETID_USE_LOCAL_NAMESERVERS | TEST_NETID;
1944
Ken Chenb9fa2062018-11-13 21:51:13 +08001945 const char ADDR4[] = "192.0.2.1";
1946 const char ADDR6[] = "2001:db8::1";
1947
1948 const char cleartext_addr[] = "127.0.0.53";
1949 const char cleartext_port[] = "53";
1950 const char tls_port[] = "853";
Luke Huangf8215372019-11-22 11:53:41 +08001951 const std::vector<std::string> servers = {cleartext_addr};
Ken Chenb9fa2062018-11-13 21:51:13 +08001952
Xiao Ma09b71022018-12-11 17:56:32 +09001953 test::DNSResponder dns(cleartext_addr);
Ken Chenb9fa2062018-11-13 21:51:13 +08001954 ASSERT_TRUE(dns.startServer());
1955
1956 test::DnsTlsFrontend tls(cleartext_addr, tls_port, cleartext_addr, cleartext_port);
Mike Yudd4ac2d2019-05-31 16:52:11 +08001957 ASSERT_TRUE(tls.startServer());
Ken Chenb9fa2062018-11-13 21:51:13 +08001958
Luke Huangf8215372019-11-22 11:53:41 +08001959 // clang-format off
Ken Chenb9fa2062018-11-13 21:51:13 +08001960 struct TestConfig {
1961 const std::string mode;
1962 const bool withWorkingTLS;
1963 const std::string method;
1964
1965 std::string asHostName() const {
Luke Huangf8215372019-11-22 11:53:41 +08001966 return StringPrintf("%s.%s.%s.", mode.c_str(), withWorkingTLS ? "tlsOn" : "tlsOff",
Ken Chenb9fa2062018-11-13 21:51:13 +08001967 method.c_str());
1968 }
1969 } testConfigs[]{
Ken Chenb9fa2062018-11-13 21:51:13 +08001970 {OFF, true, GETHOSTBYNAME},
1971 {OPPORTUNISTIC, true, GETHOSTBYNAME},
1972 {STRICT, true, GETHOSTBYNAME},
Ken Chenb9fa2062018-11-13 21:51:13 +08001973 {OFF, true, GETADDRINFO},
1974 {OPPORTUNISTIC, true, GETADDRINFO},
1975 {STRICT, true, GETADDRINFO},
Ken Chenb9fa2062018-11-13 21:51:13 +08001976 {OFF, true, GETADDRINFOFORNET},
1977 {OPPORTUNISTIC, true, GETADDRINFOFORNET},
1978 {STRICT, true, GETADDRINFOFORNET},
Mike Yudd4ac2d2019-05-31 16:52:11 +08001979 {OFF, false, GETHOSTBYNAME},
1980 {OPPORTUNISTIC, false, GETHOSTBYNAME},
1981 {STRICT, false, GETHOSTBYNAME},
1982 {OFF, false, GETADDRINFO},
1983 {OPPORTUNISTIC, false, GETADDRINFO},
1984 {STRICT, false, GETADDRINFO},
1985 {OFF, false, GETADDRINFOFORNET},
1986 {OPPORTUNISTIC, false, GETADDRINFOFORNET},
1987 {STRICT, false, GETADDRINFOFORNET},
Ken Chenb9fa2062018-11-13 21:51:13 +08001988 };
Luke Huangf8215372019-11-22 11:53:41 +08001989 // clang-format on
Ken Chenb9fa2062018-11-13 21:51:13 +08001990
1991 for (const auto& config : testConfigs) {
1992 const std::string testHostName = config.asHostName();
1993 SCOPED_TRACE(testHostName);
1994
1995 // Don't tempt test bugs due to caching.
1996 const char* host_name = testHostName.c_str();
1997 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
1998 dns.addMapping(host_name, ns_type::ns_t_aaaa, ADDR6);
1999
Mike Yudd4ac2d2019-05-31 16:52:11 +08002000 if (config.withWorkingTLS) {
2001 if (!tls.running()) {
2002 ASSERT_TRUE(tls.startServer());
2003 }
2004 } else {
2005 if (tls.running()) {
2006 ASSERT_TRUE(tls.stopServer());
2007 }
2008 }
Ken Chenb9fa2062018-11-13 21:51:13 +08002009
2010 if (config.mode == OFF) {
Xiao Ma09b71022018-12-11 17:56:32 +09002011 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers, kDefaultSearchDomains,
2012 kDefaultParams));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09002013 } else /* OPPORTUNISTIC or STRICT */ {
2014 const char* tls_hostname = (config.mode == STRICT) ? kDefaultPrivateDnsHostName : "";
Xiao Ma09b71022018-12-11 17:56:32 +09002015 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09002016 kDefaultParams, tls_hostname));
Mike Yu724f77d2019-08-16 11:14:50 +08002017
2018 // Wait for the validation event. If the server is running, the validation should
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09002019 // succeed; otherwise, the validation should fail.
Mike Yu724f77d2019-08-16 11:14:50 +08002020 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), config.withWorkingTLS));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09002021 if (config.withWorkingTLS) {
2022 EXPECT_TRUE(tls.waitForQueries(1));
2023 tls.clearQueries();
2024 }
Ken Chenb9fa2062018-11-13 21:51:13 +08002025 }
Ken Chenb9fa2062018-11-13 21:51:13 +08002026
2027 const hostent* h_result = nullptr;
2028 ScopedAddrinfo ai_result;
2029
2030 if (config.method == GETHOSTBYNAME) {
2031 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
2032 h_result = gethostbyname(host_name);
2033
2034 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
2035 ASSERT_FALSE(h_result == nullptr);
2036 ASSERT_EQ(4, h_result->h_length);
2037 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
2038 EXPECT_EQ(ADDR4, ToString(h_result));
2039 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
2040 } else if (config.method == GETADDRINFO) {
2041 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
2042 ai_result = safe_getaddrinfo(host_name, nullptr, nullptr);
2043 EXPECT_TRUE(ai_result != nullptr);
2044
2045 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2046 // Could be A or AAAA
2047 const std::string result_str = ToString(ai_result);
2048 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
Luke Huangf8215372019-11-22 11:53:41 +08002049 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08002050 } else if (config.method == GETADDRINFOFORNET) {
2051 addrinfo* raw_ai_result = nullptr;
2052 EXPECT_EQ(0, android_getaddrinfofornet(host_name, /*servname=*/nullptr,
2053 /*hints=*/nullptr, BYPASS_NETID, MARK_UNSET,
2054 &raw_ai_result));
2055 ai_result.reset(raw_ai_result);
2056
2057 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2058 // Could be A or AAAA
2059 const std::string result_str = ToString(ai_result);
2060 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
Luke Huangf8215372019-11-22 11:53:41 +08002061 << ", result_str='" << result_str << "'";
Ken Chenb9fa2062018-11-13 21:51:13 +08002062 }
2063
Mike Yudd4ac2d2019-05-31 16:52:11 +08002064 EXPECT_EQ(0, tls.queries());
Ken Chenb9fa2062018-11-13 21:51:13 +08002065
2066 // Clear per-process resolv netid.
2067 ASSERT_EQ(0, setNetworkForResolv(NETID_UNSET));
Ken Chenb9fa2062018-11-13 21:51:13 +08002068 dns.clearQueries();
2069 }
Ken Chenb9fa2062018-11-13 21:51:13 +08002070}
2071
2072TEST_F(ResolverTest, StrictMode_NoTlsServers) {
Xiao Ma09b71022018-12-11 17:56:32 +09002073 constexpr char cleartext_addr[] = "127.0.0.53";
Luke Huangf8215372019-11-22 11:53:41 +08002074 const std::vector<std::string> servers = {cleartext_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002075 constexpr char host_name[] = "strictmode.notlsips.example.com.";
2076 const std::vector<DnsRecord> records = {
2077 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2078 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2079 };
Ken Chenb9fa2062018-11-13 21:51:13 +08002080
Xiao Ma09b71022018-12-11 17:56:32 +09002081 test::DNSResponder dns(cleartext_addr);
2082 StartDns(dns, records);
Ken Chenb9fa2062018-11-13 21:51:13 +08002083
waynema0e73c2e2019-07-31 15:04:08 +08002084 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
2085 kDefaultIncorrectPrivateDnsHostName));
Ken Chenb9fa2062018-11-13 21:51:13 +08002086
2087 addrinfo* ai_result = nullptr;
2088 EXPECT_NE(0, getaddrinfo(host_name, nullptr, nullptr, &ai_result));
2089 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
2090}
Luke Huang94b10b92018-11-21 20:13:38 +08002091
2092namespace {
2093
Luke Huang70931aa2019-01-31 11:57:41 +08002094int getAsyncResponse(int fd, int* rcode, uint8_t* buf, int bufLen) {
Luke Huang94b10b92018-11-21 20:13:38 +08002095 struct pollfd wait_fd[1];
2096 wait_fd[0].fd = fd;
2097 wait_fd[0].events = POLLIN;
2098 short revents;
2099 int ret;
2100
2101 ret = poll(wait_fd, 1, -1);
2102 revents = wait_fd[0].revents;
2103 if (revents & POLLIN) {
2104 int n = resNetworkResult(fd, rcode, buf, bufLen);
Luke Huangba7bef92018-12-26 16:53:03 +08002105 // Verify that resNetworkResult() closed the fd
markchien96b09e22020-07-29 14:24:34 +08002106 char unused;
2107 EXPECT_EQ(-1, read(fd, &unused, sizeof unused));
Luke Huangba7bef92018-12-26 16:53:03 +08002108 EXPECT_EQ(EBADF, errno);
Luke Huang94b10b92018-11-21 20:13:38 +08002109 return n;
2110 }
2111 return -1;
2112}
2113
Luke Huang70931aa2019-01-31 11:57:41 +08002114std::string toString(uint8_t* buf, int bufLen, int ipType) {
Luke Huang94b10b92018-11-21 20:13:38 +08002115 ns_msg handle;
2116 int ancount, n = 0;
2117 ns_rr rr;
2118
Luke Huangf8215372019-11-22 11:53:41 +08002119 if (ns_initparse((const uint8_t*)buf, bufLen, &handle) >= 0) {
Luke Huang94b10b92018-11-21 20:13:38 +08002120 ancount = ns_msg_count(handle, ns_s_an);
2121 if (ns_parserr(&handle, ns_s_an, n, &rr) == 0) {
Luke Huang70931aa2019-01-31 11:57:41 +08002122 const uint8_t* rdata = ns_rr_rdata(rr);
Luke Huang94b10b92018-11-21 20:13:38 +08002123 char buffer[INET6_ADDRSTRLEN];
Luke Huangf8215372019-11-22 11:53:41 +08002124 if (inet_ntop(ipType, (const char*)rdata, buffer, sizeof(buffer))) {
Luke Huang94b10b92018-11-21 20:13:38 +08002125 return buffer;
2126 }
2127 }
2128 }
2129 return "";
2130}
2131
2132int dns_open_proxy() {
2133 int s = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
2134 if (s == -1) {
2135 return -1;
2136 }
2137 const int one = 1;
2138 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
2139
2140 static const struct sockaddr_un proxy_addr = {
2141 .sun_family = AF_UNIX,
2142 .sun_path = "/dev/socket/dnsproxyd",
2143 };
2144
Luke Huangf8215372019-11-22 11:53:41 +08002145 if (TEMP_FAILURE_RETRY(connect(s, (const struct sockaddr*)&proxy_addr, sizeof(proxy_addr))) !=
Luke Huang94b10b92018-11-21 20:13:38 +08002146 0) {
2147 close(s);
2148 return -1;
2149 }
2150
2151 return s;
2152}
2153
Luke Huangba7bef92018-12-26 16:53:03 +08002154void expectAnswersValid(int fd, int ipType, const std::string& expectedAnswer) {
2155 int rcode = -1;
2156 uint8_t buf[MAXPACKET] = {};
2157
2158 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2159 EXPECT_GT(res, 0);
2160 EXPECT_EQ(expectedAnswer, toString(buf, res, ipType));
2161}
2162
2163void expectAnswersNotValid(int fd, int expectedErrno) {
2164 int rcode = -1;
2165 uint8_t buf[MAXPACKET] = {};
2166
2167 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2168 EXPECT_EQ(expectedErrno, res);
2169}
2170
Luke Huang94b10b92018-11-21 20:13:38 +08002171} // namespace
2172
2173TEST_F(ResolverTest, Async_NormalQueryV4V6) {
Xiao Ma09b71022018-12-11 17:56:32 +09002174 constexpr char listen_addr[] = "127.0.0.4";
2175 constexpr char host_name[] = "howdy.example.com.";
2176 const std::vector<DnsRecord> records = {
2177 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2178 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2179 };
2180
2181 test::DNSResponder dns(listen_addr);
2182 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002183 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002184 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002185
Luke Huangba7bef92018-12-26 16:53:03 +08002186 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2187 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002188 EXPECT_TRUE(fd1 != -1);
2189 EXPECT_TRUE(fd2 != -1);
2190
Luke Huang70931aa2019-01-31 11:57:41 +08002191 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002192 int rcode;
2193 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2194 EXPECT_GT(res, 0);
2195 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
2196
2197 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2198 EXPECT_GT(res, 0);
2199 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2200
2201 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
2202
2203 // Re-query verify cache works
Luke Huangba7bef92018-12-26 16:53:03 +08002204 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2205 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002206
2207 EXPECT_TRUE(fd1 != -1);
2208 EXPECT_TRUE(fd2 != -1);
2209
2210 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2211 EXPECT_GT(res, 0);
2212 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
2213
2214 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2215 EXPECT_GT(res, 0);
2216 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2217
2218 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
2219}
2220
2221TEST_F(ResolverTest, Async_BadQuery) {
Xiao Ma09b71022018-12-11 17:56:32 +09002222 constexpr char listen_addr[] = "127.0.0.4";
2223 constexpr char host_name[] = "howdy.example.com.";
2224 const std::vector<DnsRecord> records = {
2225 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2226 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2227 };
2228
2229 test::DNSResponder dns(listen_addr);
2230 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002231 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002232 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002233
2234 static struct {
2235 int fd;
2236 const char* dname;
2237 const int queryType;
2238 const int expectRcode;
2239 } kTestData[] = {
Luke Huangba7bef92018-12-26 16:53:03 +08002240 {-1, "", ns_t_aaaa, 0},
2241 {-1, "as65ass46", ns_t_aaaa, 0},
2242 {-1, "454564564564", ns_t_aaaa, 0},
2243 {-1, "h645235", ns_t_a, 0},
2244 {-1, "www.google.com", ns_t_a, 0},
Luke Huang94b10b92018-11-21 20:13:38 +08002245 };
2246
2247 for (auto& td : kTestData) {
2248 SCOPED_TRACE(td.dname);
Luke Huangba7bef92018-12-26 16:53:03 +08002249 td.fd = resNetworkQuery(TEST_NETID, td.dname, ns_c_in, td.queryType, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002250 EXPECT_TRUE(td.fd != -1);
2251 }
2252
2253 // dns_responder return empty resp(packet only contains query part) with no error currently
2254 for (const auto& td : kTestData) {
Luke Huang70931aa2019-01-31 11:57:41 +08002255 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002256 int rcode;
2257 SCOPED_TRACE(td.dname);
2258 int res = getAsyncResponse(td.fd, &rcode, buf, MAXPACKET);
2259 EXPECT_GT(res, 0);
2260 EXPECT_EQ(rcode, td.expectRcode);
2261 }
2262}
2263
2264TEST_F(ResolverTest, Async_EmptyAnswer) {
Xiao Ma09b71022018-12-11 17:56:32 +09002265 constexpr char listen_addr[] = "127.0.0.4";
2266 constexpr char host_name[] = "howdy.example.com.";
2267 const std::vector<DnsRecord> records = {
2268 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2269 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2270 };
2271
2272 test::DNSResponder dns(listen_addr);
2273 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002274 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002275 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002276
Luke Huang9c264bb2018-12-18 16:44:41 +08002277 // TODO: Disable retry to make this test explicit.
2278 auto& cv = dns.getCv();
2279 auto& cvMutex = dns.getCvMutex();
2280 int fd1;
2281 // Wait on the condition variable to ensure that the DNS server has handled our first query.
2282 {
2283 std::unique_lock lk(cvMutex);
Luke Huangba7bef92018-12-26 16:53:03 +08002284 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang9c264bb2018-12-18 16:44:41 +08002285 EXPECT_TRUE(fd1 != -1);
2286 EXPECT_EQ(std::cv_status::no_timeout, cv.wait_for(lk, std::chrono::seconds(1)));
2287 }
Luke Huang94b10b92018-11-21 20:13:38 +08002288
Luke Huang94b10b92018-11-21 20:13:38 +08002289 dns.setResponseProbability(0.0);
Luke Huang94b10b92018-11-21 20:13:38 +08002290
Luke Huangba7bef92018-12-26 16:53:03 +08002291 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002292 EXPECT_TRUE(fd2 != -1);
2293
Luke Huangba7bef92018-12-26 16:53:03 +08002294 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002295 EXPECT_TRUE(fd3 != -1);
2296
Luke Huang9c264bb2018-12-18 16:44:41 +08002297 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002298 int rcode;
2299
Luke Huang9c264bb2018-12-18 16:44:41 +08002300 // expect no response
2301 int res = getAsyncResponse(fd3, &rcode, buf, MAXPACKET);
2302 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huang94b10b92018-11-21 20:13:38 +08002303
Luke Huang9c264bb2018-12-18 16:44:41 +08002304 // expect no response
Luke Huang94b10b92018-11-21 20:13:38 +08002305 memset(buf, 0, MAXPACKET);
Luke Huang9c264bb2018-12-18 16:44:41 +08002306 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
2307 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huang94b10b92018-11-21 20:13:38 +08002308
Luke Huang94b10b92018-11-21 20:13:38 +08002309 dns.setResponseProbability(1.0);
Luke Huang94b10b92018-11-21 20:13:38 +08002310
Luke Huangba7bef92018-12-26 16:53:03 +08002311 int fd4 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huang94b10b92018-11-21 20:13:38 +08002312 EXPECT_TRUE(fd4 != -1);
2313
2314 memset(buf, 0, MAXPACKET);
2315 res = getAsyncResponse(fd4, &rcode, buf, MAXPACKET);
2316 EXPECT_GT(res, 0);
2317 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2318
2319 memset(buf, 0, MAXPACKET);
2320 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
2321 EXPECT_GT(res, 0);
2322 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
Mike Yu532405f2020-06-17 17:46:44 +08002323
2324 // Trailing dot is removed. Is it intended?
2325 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, 0, "howdy.example.com", {"::1.2.3.4"});
2326 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2327 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2328 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, 0, "howdy.example.com", {"1.2.3.4"});
Luke Huang94b10b92018-11-21 20:13:38 +08002329}
2330
2331TEST_F(ResolverTest, Async_MalformedQuery) {
Xiao Ma09b71022018-12-11 17:56:32 +09002332 constexpr char listen_addr[] = "127.0.0.4";
2333 constexpr char host_name[] = "howdy.example.com.";
2334 const std::vector<DnsRecord> records = {
2335 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2336 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2337 };
2338
2339 test::DNSResponder dns(listen_addr);
2340 StartDns(dns, records);
Luke Huang94b10b92018-11-21 20:13:38 +08002341 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002342 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huang94b10b92018-11-21 20:13:38 +08002343
2344 int fd = dns_open_proxy();
2345 EXPECT_TRUE(fd > 0);
2346
2347 const std::string badMsg = "16-52512#";
Xiao Ma09b71022018-12-11 17:56:32 +09002348 static const struct {
Luke Huang94b10b92018-11-21 20:13:38 +08002349 const std::string cmd;
2350 const int expectErr;
2351 } kTestData[] = {
Luke Huangba7bef92018-12-26 16:53:03 +08002352 // Too few arguments
Luke Huang94b10b92018-11-21 20:13:38 +08002353 {"resnsend " + badMsg + '\0', -EINVAL},
2354 // Bad netId
Luke Huangba7bef92018-12-26 16:53:03 +08002355 {"resnsend badnetId 0 " + badMsg + '\0', -EINVAL},
Luke Huang94b10b92018-11-21 20:13:38 +08002356 // Bad raw data
Luke Huangba7bef92018-12-26 16:53:03 +08002357 {"resnsend " + std::to_string(TEST_NETID) + " 0 " + badMsg + '\0', -EILSEQ},
Luke Huang94b10b92018-11-21 20:13:38 +08002358 };
2359
2360 for (unsigned int i = 0; i < std::size(kTestData); i++) {
2361 auto& td = kTestData[i];
2362 SCOPED_TRACE(td.cmd);
2363 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, td.cmd.c_str(), td.cmd.size()));
2364 EXPECT_EQ(rc, static_cast<ssize_t>(td.cmd.size()));
2365
2366 int32_t tmp;
2367 rc = TEMP_FAILURE_RETRY(read(fd, &tmp, sizeof(tmp)));
2368 EXPECT_TRUE(rc > 0);
2369 EXPECT_EQ(static_cast<int>(ntohl(tmp)), td.expectErr);
2370 }
2371 // Normal query with answer buffer
2372 // This is raw data of query "howdy.example.com" type 1 class 1
2373 std::string query = "81sBAAABAAAAAAAABWhvd2R5B2V4YW1wbGUDY29tAAABAAE=";
Luke Huangba7bef92018-12-26 16:53:03 +08002374 std::string cmd = "resnsend " + std::to_string(TEST_NETID) + " 0 " + query + '\0';
Luke Huang94b10b92018-11-21 20:13:38 +08002375 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
2376 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
2377
Luke Huang70931aa2019-01-31 11:57:41 +08002378 uint8_t smallBuf[1] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002379 int rcode;
2380 rc = getAsyncResponse(fd, &rcode, smallBuf, 1);
Luke Huangba7bef92018-12-26 16:53:03 +08002381 EXPECT_EQ(-EMSGSIZE, rc);
Luke Huang94b10b92018-11-21 20:13:38 +08002382
2383 // Do the normal test with large buffer again
2384 fd = dns_open_proxy();
2385 EXPECT_TRUE(fd > 0);
2386 rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
2387 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
Luke Huang70931aa2019-01-31 11:57:41 +08002388 uint8_t buf[MAXPACKET] = {};
Luke Huang94b10b92018-11-21 20:13:38 +08002389 rc = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2390 EXPECT_EQ("1.2.3.4", toString(buf, rc, AF_INET));
Mike Yu4f3747b2018-12-02 17:54:29 +09002391}
2392
Luke Huangba7bef92018-12-26 16:53:03 +08002393TEST_F(ResolverTest, Async_CacheFlags) {
Xiao Ma09b71022018-12-11 17:56:32 +09002394 constexpr char listen_addr[] = "127.0.0.4";
Luke Huang4eabbe32020-05-28 03:17:32 +08002395 constexpr char host_name1[] = "howdy.example.com.";
2396 constexpr char host_name2[] = "howdy.example2.com.";
2397 constexpr char host_name3[] = "howdy.example3.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002398 const std::vector<DnsRecord> records = {
Luke Huang4eabbe32020-05-28 03:17:32 +08002399 {host_name1, ns_type::ns_t_a, "1.2.3.4"}, {host_name1, ns_type::ns_t_aaaa, "::1.2.3.4"},
2400 {host_name2, ns_type::ns_t_a, "1.2.3.5"}, {host_name2, ns_type::ns_t_aaaa, "::1.2.3.5"},
2401 {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 +09002402 };
2403
2404 test::DNSResponder dns(listen_addr);
2405 StartDns(dns, records);
Luke Huangba7bef92018-12-26 16:53:03 +08002406 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002407 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Luke Huangba7bef92018-12-26 16:53:03 +08002408
2409 // ANDROID_RESOLV_NO_CACHE_STORE
2410 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2411 ANDROID_RESOLV_NO_CACHE_STORE);
2412 EXPECT_TRUE(fd1 != -1);
2413 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2414 ANDROID_RESOLV_NO_CACHE_STORE);
2415 EXPECT_TRUE(fd2 != -1);
2416 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2417 ANDROID_RESOLV_NO_CACHE_STORE);
2418 EXPECT_TRUE(fd3 != -1);
2419
2420 expectAnswersValid(fd3, AF_INET, "1.2.3.4");
2421 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
2422 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2423
2424 // No cache exists, expect 3 queries
Luke Huang4eabbe32020-05-28 03:17:32 +08002425 EXPECT_EQ(3U, GetNumQueries(dns, host_name1));
Luke Huangba7bef92018-12-26 16:53:03 +08002426
Luke Huang4eabbe32020-05-28 03:17:32 +08002427 // Raise a query with no flags to ensure no cache exists. Also make an cache entry for the
2428 // query.
Luke Huangba7bef92018-12-26 16:53:03 +08002429 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2430
2431 EXPECT_TRUE(fd1 != -1);
2432
2433 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2434
Luke Huang4eabbe32020-05-28 03:17:32 +08002435 // Expect 4 queries because there should be no cache before this query.
2436 EXPECT_EQ(4U, GetNumQueries(dns, host_name1));
2437
2438 // Now we have the cache entry, re-query with ANDROID_RESOLV_NO_CACHE_STORE to ensure
2439 // that ANDROID_RESOLV_NO_CACHE_STORE implied ANDROID_RESOLV_NO_CACHE_LOOKUP.
2440 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2441 ANDROID_RESOLV_NO_CACHE_STORE);
2442 EXPECT_TRUE(fd1 != -1);
2443 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2444 // Expect 5 queries because we shouldn't do cache lookup for the query which has
2445 // ANDROID_RESOLV_NO_CACHE_STORE.
2446 EXPECT_EQ(5U, GetNumQueries(dns, host_name1));
Luke Huangba7bef92018-12-26 16:53:03 +08002447
2448 // ANDROID_RESOLV_NO_CACHE_LOOKUP
2449 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2450 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2451 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2452 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2453
2454 EXPECT_TRUE(fd1 != -1);
2455 EXPECT_TRUE(fd2 != -1);
2456
2457 expectAnswersValid(fd2, AF_INET, "1.2.3.4");
2458 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2459
Luke Huang4eabbe32020-05-28 03:17:32 +08002460 // Cache was skipped, expect 2 more queries.
2461 EXPECT_EQ(7U, GetNumQueries(dns, host_name1));
Luke Huangba7bef92018-12-26 16:53:03 +08002462
2463 // Re-query verify cache works
Luke Huang4eabbe32020-05-28 03:17:32 +08002464 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
Luke Huangba7bef92018-12-26 16:53:03 +08002465 EXPECT_TRUE(fd1 != -1);
2466 expectAnswersValid(fd1, AF_INET, "1.2.3.4");
2467
Luke Huang4eabbe32020-05-28 03:17:32 +08002468 // Cache hits, expect still 7 queries
2469 EXPECT_EQ(7U, GetNumQueries(dns, host_name1));
Luke Huanga1d74182019-03-19 17:30:36 +08002470
2471 // Start to verify if ANDROID_RESOLV_NO_CACHE_LOOKUP does write response into cache
2472 dns.clearQueries();
2473
Luke Huang4eabbe32020-05-28 03:17:32 +08002474 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa,
Luke Huanga1d74182019-03-19 17:30:36 +08002475 ANDROID_RESOLV_NO_CACHE_LOOKUP);
Luke Huang4eabbe32020-05-28 03:17:32 +08002476 fd2 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa,
Luke Huanga1d74182019-03-19 17:30:36 +08002477 ANDROID_RESOLV_NO_CACHE_LOOKUP);
2478
2479 EXPECT_TRUE(fd1 != -1);
2480 EXPECT_TRUE(fd2 != -1);
2481
Luke Huang4eabbe32020-05-28 03:17:32 +08002482 expectAnswersValid(fd2, AF_INET6, "::1.2.3.5");
2483 expectAnswersValid(fd1, AF_INET6, "::1.2.3.5");
Luke Huanga1d74182019-03-19 17:30:36 +08002484
2485 // Skip cache, expect 2 queries
Luke Huang4eabbe32020-05-28 03:17:32 +08002486 EXPECT_EQ(2U, GetNumQueries(dns, host_name2));
Luke Huanga1d74182019-03-19 17:30:36 +08002487
2488 // Re-query without flags
Luke Huang4eabbe32020-05-28 03:17:32 +08002489 fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa, 0);
2490 fd2 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa, 0);
Luke Huanga1d74182019-03-19 17:30:36 +08002491
2492 EXPECT_TRUE(fd1 != -1);
2493 EXPECT_TRUE(fd2 != -1);
2494
Luke Huang4eabbe32020-05-28 03:17:32 +08002495 expectAnswersValid(fd2, AF_INET6, "::1.2.3.5");
2496 expectAnswersValid(fd1, AF_INET6, "::1.2.3.5");
Luke Huanga1d74182019-03-19 17:30:36 +08002497
2498 // Cache hits, expect still 2 queries
Luke Huang4eabbe32020-05-28 03:17:32 +08002499 EXPECT_EQ(2U, GetNumQueries(dns, host_name2));
Luke Huang40f5f492019-05-09 19:37:35 +08002500
2501 // Test both ANDROID_RESOLV_NO_CACHE_STORE and ANDROID_RESOLV_NO_CACHE_LOOKUP are set
2502 dns.clearQueries();
2503
Luke Huang4eabbe32020-05-28 03:17:32 +08002504 // Make sure that the cache of "howdy.example3.com" exists.
2505 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_aaaa, 0);
Luke Huang40f5f492019-05-09 19:37:35 +08002506 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002507 expectAnswersValid(fd1, AF_INET6, "::1.2.3.6");
2508 EXPECT_EQ(1U, GetNumQueries(dns, host_name3));
Luke Huang40f5f492019-05-09 19:37:35 +08002509
2510 // Re-query with testFlags
2511 const int testFlag = ANDROID_RESOLV_NO_CACHE_STORE | ANDROID_RESOLV_NO_CACHE_LOOKUP;
Luke Huang4eabbe32020-05-28 03:17:32 +08002512 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_aaaa, testFlag);
Luke Huang40f5f492019-05-09 19:37:35 +08002513 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002514 expectAnswersValid(fd1, AF_INET6, "::1.2.3.6");
Luke Huang40f5f492019-05-09 19:37:35 +08002515 // Expect cache lookup is skipped.
Luke Huang4eabbe32020-05-28 03:17:32 +08002516 EXPECT_EQ(2U, GetNumQueries(dns, host_name3));
Luke Huang40f5f492019-05-09 19:37:35 +08002517
2518 // Do another query with testFlags
Luke Huang4eabbe32020-05-28 03:17:32 +08002519 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_a, testFlag);
Luke Huang40f5f492019-05-09 19:37:35 +08002520 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002521 expectAnswersValid(fd1, AF_INET, "1.2.3.6");
Luke Huang40f5f492019-05-09 19:37:35 +08002522 // Expect cache lookup is skipped.
Luke Huang4eabbe32020-05-28 03:17:32 +08002523 EXPECT_EQ(3U, GetNumQueries(dns, host_name3));
Luke Huang40f5f492019-05-09 19:37:35 +08002524
2525 // Re-query with no flags
Luke Huang4eabbe32020-05-28 03:17:32 +08002526 fd1 = resNetworkQuery(TEST_NETID, "howdy.example3.com", ns_c_in, ns_t_a, 0);
Luke Huang40f5f492019-05-09 19:37:35 +08002527 EXPECT_TRUE(fd1 != -1);
Luke Huang4eabbe32020-05-28 03:17:32 +08002528 expectAnswersValid(fd1, AF_INET, "1.2.3.6");
Luke Huang40f5f492019-05-09 19:37:35 +08002529 // Expect no cache hit because cache storing is also skipped in previous query.
Luke Huang4eabbe32020-05-28 03:17:32 +08002530 EXPECT_EQ(4U, GetNumQueries(dns, host_name3));
Luke Huangba7bef92018-12-26 16:53:03 +08002531}
2532
Luke Huang08b13d22020-02-05 14:46:21 +08002533TEST_F(ResolverTest, Async_NoCacheStoreFlagDoesNotRefreshStaleCacheEntry) {
2534 constexpr char listen_addr[] = "127.0.0.4";
2535 constexpr char host_name[] = "howdy.example.com.";
2536 const std::vector<DnsRecord> records = {
2537 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2538 };
2539
2540 test::DNSResponder dns(listen_addr);
2541 StartDns(dns, records);
2542 std::vector<std::string> servers = {listen_addr};
2543 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
2544
2545 const unsigned SHORT_TTL_SEC = 1;
2546 dns.setTtl(SHORT_TTL_SEC);
2547
2548 // Refer to b/148842821 for the purpose of below test steps.
2549 // Basically, this test is used to ensure stale cache case is handled
2550 // correctly with ANDROID_RESOLV_NO_CACHE_STORE.
2551 int fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2552 EXPECT_TRUE(fd != -1);
2553 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2554
2555 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2556 dns.clearQueries();
2557
2558 // Wait until cache expired
2559 sleep(SHORT_TTL_SEC + 0.5);
2560
2561 // Now request the same hostname again.
2562 // We should see a new DNS query because the entry in cache has become stale.
2563 // Due to ANDROID_RESOLV_NO_CACHE_STORE, this query must *not* refresh that stale entry.
2564 fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2565 ANDROID_RESOLV_NO_CACHE_STORE);
2566 EXPECT_TRUE(fd != -1);
2567 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2568 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2569 dns.clearQueries();
2570
2571 // If the cache is still stale, we expect to see one more DNS query
2572 // (this time the cache will be refreshed, but we're not checking for it).
2573 fd = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2574 EXPECT_TRUE(fd != -1);
2575 expectAnswersValid(fd, AF_INET, "1.2.3.4");
2576 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2577}
2578
Luke Huangba7bef92018-12-26 16:53:03 +08002579TEST_F(ResolverTest, Async_NoRetryFlag) {
Luke Huang70931aa2019-01-31 11:57:41 +08002580 constexpr char listen_addr0[] = "127.0.0.4";
2581 constexpr char listen_addr1[] = "127.0.0.6";
Xiao Ma09b71022018-12-11 17:56:32 +09002582 constexpr char host_name[] = "howdy.example.com.";
2583 const std::vector<DnsRecord> records = {
2584 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2585 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2586 };
2587
Luke Huang70931aa2019-01-31 11:57:41 +08002588 test::DNSResponder dns0(listen_addr0);
2589 test::DNSResponder dns1(listen_addr1);
2590 StartDns(dns0, records);
2591 StartDns(dns1, records);
2592 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr0, listen_addr1}));
Luke Huangba7bef92018-12-26 16:53:03 +08002593
Luke Huang70931aa2019-01-31 11:57:41 +08002594 dns0.clearQueries();
2595 dns1.clearQueries();
2596
2597 dns0.setResponseProbability(0.0);
2598 dns1.setResponseProbability(0.0);
Luke Huangba7bef92018-12-26 16:53:03 +08002599
2600 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a,
2601 ANDROID_RESOLV_NO_RETRY);
2602 EXPECT_TRUE(fd1 != -1);
2603
2604 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa,
2605 ANDROID_RESOLV_NO_RETRY);
2606 EXPECT_TRUE(fd2 != -1);
2607
2608 // expect no response
2609 expectAnswersNotValid(fd1, -ETIMEDOUT);
2610 expectAnswersNotValid(fd2, -ETIMEDOUT);
Mike Yu532405f2020-06-17 17:46:44 +08002611 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2612 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
Luke Huangba7bef92018-12-26 16:53:03 +08002613
Luke Huang70931aa2019-01-31 11:57:41 +08002614 // No retry case, expect total 2 queries. The server is selected randomly.
2615 EXPECT_EQ(2U, GetNumQueries(dns0, host_name) + GetNumQueries(dns1, host_name));
Luke Huangba7bef92018-12-26 16:53:03 +08002616
Luke Huang70931aa2019-01-31 11:57:41 +08002617 dns0.clearQueries();
2618 dns1.clearQueries();
Luke Huangba7bef92018-12-26 16:53:03 +08002619
2620 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_a, 0);
2621 EXPECT_TRUE(fd1 != -1);
2622
2623 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", ns_c_in, ns_t_aaaa, 0);
2624 EXPECT_TRUE(fd2 != -1);
2625
2626 // expect no response
2627 expectAnswersNotValid(fd1, -ETIMEDOUT);
2628 expectAnswersNotValid(fd2, -ETIMEDOUT);
Mike Yu532405f2020-06-17 17:46:44 +08002629 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
2630 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, RCODE_TIMEOUT, "howdy.example.com", {});
Luke Huangba7bef92018-12-26 16:53:03 +08002631
2632 // Retry case, expect 4 queries
Luke Huang70931aa2019-01-31 11:57:41 +08002633 EXPECT_EQ(4U, GetNumQueries(dns0, host_name));
2634 EXPECT_EQ(4U, GetNumQueries(dns1, host_name));
2635}
2636
2637TEST_F(ResolverTest, Async_VerifyQueryID) {
2638 constexpr char listen_addr[] = "127.0.0.4";
2639 constexpr char host_name[] = "howdy.example.com.";
2640 const std::vector<DnsRecord> records = {
2641 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2642 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
2643 };
2644
2645 test::DNSResponder dns(listen_addr);
2646 StartDns(dns, records);
2647 std::vector<std::string> servers = {listen_addr};
2648 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
2649
2650 const uint8_t queryBuf1[] = {
2651 /* Header */
2652 0x55, 0x66, /* Transaction ID */
2653 0x01, 0x00, /* Flags */
2654 0x00, 0x01, /* Questions */
2655 0x00, 0x00, /* Answer RRs */
2656 0x00, 0x00, /* Authority RRs */
2657 0x00, 0x00, /* Additional RRs */
2658 /* Queries */
2659 0x05, 0x68, 0x6f, 0x77, 0x64, 0x79, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
2660 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name */
2661 0x00, 0x01, /* Type */
2662 0x00, 0x01 /* Class */
2663 };
2664
2665 int fd = resNetworkSend(TEST_NETID, queryBuf1, sizeof(queryBuf1), 0);
2666 EXPECT_TRUE(fd != -1);
2667
2668 uint8_t buf[MAXPACKET] = {};
2669 int rcode;
2670
2671 int res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2672 EXPECT_GT(res, 0);
2673 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2674
2675 auto hp = reinterpret_cast<HEADER*>(buf);
2676 EXPECT_EQ(21862U, htons(hp->id));
2677
2678 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2679
2680 const uint8_t queryBuf2[] = {
2681 /* Header */
2682 0x00, 0x53, /* Transaction ID */
2683 0x01, 0x00, /* Flags */
2684 0x00, 0x01, /* Questions */
2685 0x00, 0x00, /* Answer RRs */
2686 0x00, 0x00, /* Authority RRs */
2687 0x00, 0x00, /* Additional RRs */
2688 /* Queries */
2689 0x05, 0x68, 0x6f, 0x77, 0x64, 0x79, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
2690 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name */
2691 0x00, 0x01, /* Type */
2692 0x00, 0x01 /* Class */
2693 };
2694
2695 // Re-query verify cache works and query id is correct
2696 fd = resNetworkSend(TEST_NETID, queryBuf2, sizeof(queryBuf2), 0);
2697
2698 EXPECT_TRUE(fd != -1);
2699
2700 res = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
2701 EXPECT_GT(res, 0);
2702 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
2703
2704 EXPECT_EQ(0x0053U, htons(hp->id));
2705
2706 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
Luke Huangba7bef92018-12-26 16:53:03 +08002707}
2708
Mike Yu4f3747b2018-12-02 17:54:29 +09002709// This test checks that the resolver should not generate the request containing OPT RR when using
Ken Chen0a015532019-01-02 14:59:38 +08002710// cleartext DNS. If we query the DNS server not supporting EDNS0 and it reponds with
2711// FORMERR_ON_EDNS, we will fallback to no EDNS0 and try again. If the server does no response, we
2712// won't retry so that we get no answer.
Mike Yu4f3747b2018-12-02 17:54:29 +09002713TEST_F(ResolverTest, BrokenEdns) {
2714 typedef test::DNSResponder::Edns Edns;
2715 enum ExpectResult { EXPECT_FAILURE, EXPECT_SUCCESS };
2716
Mike Yu3977d482020-02-26 17:18:57 +08002717 // Perform cleartext query in off mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002718 const char OFF[] = "off";
Mike Yu3977d482020-02-26 17:18:57 +08002719
2720 // Perform cleartext query when there's no private DNS server validated in opportunistic mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002721 const char OPPORTUNISTIC_UDP[] = "opportunistic_udp";
Mike Yu3977d482020-02-26 17:18:57 +08002722
2723 // Perform cleartext query when there is a private DNS server validated in opportunistic mode.
2724 const char OPPORTUNISTIC_FALLBACK_UDP[] = "opportunistic_fallback_udp";
2725
2726 // Perform cyphertext query in opportunistic mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002727 const char OPPORTUNISTIC_TLS[] = "opportunistic_tls";
Mike Yu3977d482020-02-26 17:18:57 +08002728
2729 // Perform cyphertext query in strict mode.
Mike Yu4f3747b2018-12-02 17:54:29 +09002730 const char STRICT[] = "strict";
Mike Yu3977d482020-02-26 17:18:57 +08002731
Mike Yu4f3747b2018-12-02 17:54:29 +09002732 const char GETHOSTBYNAME[] = "gethostbyname";
2733 const char GETADDRINFO[] = "getaddrinfo";
Mike Yu4f3747b2018-12-02 17:54:29 +09002734 const char ADDR4[] = "192.0.2.1";
2735 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2736 const char CLEARTEXT_PORT[] = "53";
2737 const char TLS_PORT[] = "853";
Luke Huangf8215372019-11-22 11:53:41 +08002738 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
Mike Yu3977d482020-02-26 17:18:57 +08002739 ResolverParamsParcel paramsForCleanup = DnsResponderClient::GetDefaultResolverParamsParcel();
2740 paramsForCleanup.servers.clear();
2741 paramsForCleanup.tlsServers.clear();
Mike Yu4f3747b2018-12-02 17:54:29 +09002742
Mike Yufc125e42019-05-15 20:41:28 +08002743 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Mike Yu4f3747b2018-12-02 17:54:29 +09002744 ASSERT_TRUE(dns.startServer());
2745
2746 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2747
Luke Huangf8215372019-11-22 11:53:41 +08002748 // clang-format off
Mike Yu4f3747b2018-12-02 17:54:29 +09002749 static const struct TestConfig {
2750 std::string mode;
2751 std::string method;
2752 Edns edns;
2753 ExpectResult expectResult;
2754
2755 std::string asHostName() const {
2756 const char* ednsString;
2757 switch (edns) {
2758 case Edns::ON:
2759 ednsString = "ednsOn";
2760 break;
Ken Chen0a015532019-01-02 14:59:38 +08002761 case Edns::FORMERR_ON_EDNS:
Mike Yu4f3747b2018-12-02 17:54:29 +09002762 ednsString = "ednsFormerr";
2763 break;
2764 case Edns::DROP:
2765 ednsString = "ednsDrop";
2766 break;
2767 default:
2768 ednsString = "";
2769 break;
2770 }
2771 return StringPrintf("%s.%s.%s.", mode.c_str(), method.c_str(), ednsString);
2772 }
2773 } testConfigs[] = {
Mike Yu3977d482020-02-26 17:18:57 +08002774 // In OPPORTUNISTIC_TLS, if the DNS server doesn't support EDNS0 but TLS, the lookup
2775 // fails. Could such server exist? if so, we might need to fix it to fallback to
2776 // cleartext query. If the server still make no response for the queries with EDNS0, we
2777 // might also need to fix it to retry without EDNS0.
Mike Yu4f3747b2018-12-02 17:54:29 +09002778 // Another thing is that {OPPORTUNISTIC_TLS, Edns::DROP} and {STRICT, Edns::DROP} are
2779 // commented out since TLS timeout is not configurable.
2780 // TODO: Uncomment them after TLS timeout is configurable.
Mike Yu3977d482020-02-26 17:18:57 +08002781 {OFF, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2782 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2783 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2784 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2785 {STRICT, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
2786 {OFF, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2787 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2788 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2789 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2790 {STRICT, GETHOSTBYNAME, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2791 {OFF, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2792 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
2793
2794 // The failure is due to no retry on timeout. Maybe fix it?
2795 {OPPORTUNISTIC_FALLBACK_UDP, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2796
2797 //{OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2798 //{STRICT, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
2799 {OFF, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2800 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2801 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2802 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2803 {STRICT, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
2804 {OFF, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2805 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2806 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_SUCCESS},
2807 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2808 {STRICT, GETADDRINFO, Edns::FORMERR_ON_EDNS, EXPECT_FAILURE},
2809 {OFF, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2810 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
2811
2812 // The failure is due to no retry on timeout. Maybe fix it?
2813 {OPPORTUNISTIC_FALLBACK_UDP, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2814
Mike Yu4f3747b2018-12-02 17:54:29 +09002815 //{OPPORTUNISTIC_TLS, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2816 //{STRICT, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
2817 };
Luke Huangf8215372019-11-22 11:53:41 +08002818 // clang-format on
Mike Yu4f3747b2018-12-02 17:54:29 +09002819
2820 for (const auto& config : testConfigs) {
2821 const std::string testHostName = config.asHostName();
2822 SCOPED_TRACE(testHostName);
2823
2824 const char* host_name = testHostName.c_str();
2825 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
2826 dns.setEdns(config.edns);
2827
2828 if (config.mode == OFF) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002829 if (tls.running()) {
2830 ASSERT_TRUE(tls.stopServer());
2831 }
Xiao Ma09b71022018-12-11 17:56:32 +09002832 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
Mike Yu4f3747b2018-12-02 17:54:29 +09002833 } else if (config.mode == OPPORTUNISTIC_UDP) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002834 if (tls.running()) {
2835 ASSERT_TRUE(tls.stopServer());
2836 }
Xiao Ma09b71022018-12-11 17:56:32 +09002837 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002838 kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002839 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), false));
Mike Yu3977d482020-02-26 17:18:57 +08002840 } else if (config.mode == OPPORTUNISTIC_TLS || config.mode == OPPORTUNISTIC_FALLBACK_UDP) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002841 if (!tls.running()) {
2842 ASSERT_TRUE(tls.startServer());
2843 }
Xiao Ma09b71022018-12-11 17:56:32 +09002844 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002845 kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002846 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Mike Yu3977d482020-02-26 17:18:57 +08002847
2848 if (config.mode == OPPORTUNISTIC_FALLBACK_UDP) {
2849 // Force the resolver to fallback to cleartext queries.
2850 ASSERT_TRUE(tls.stopServer());
2851 }
Mike Yu4f3747b2018-12-02 17:54:29 +09002852 } else if (config.mode == STRICT) {
Mike Yu0f20cdd2019-06-11 11:52:37 +08002853 if (!tls.running()) {
2854 ASSERT_TRUE(tls.startServer());
2855 }
Xiao Ma09b71022018-12-11 17:56:32 +09002856 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains,
waynema0e73c2e2019-07-31 15:04:08 +08002857 kDefaultParams, kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08002858 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Mike Yu4f3747b2018-12-02 17:54:29 +09002859 }
2860
2861 if (config.method == GETHOSTBYNAME) {
2862 const hostent* h_result = gethostbyname(host_name);
2863 if (config.expectResult == EXPECT_SUCCESS) {
2864 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2865 ASSERT_TRUE(h_result != nullptr);
2866 ASSERT_EQ(4, h_result->h_length);
2867 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
2868 EXPECT_EQ(ADDR4, ToString(h_result));
2869 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
Mike Yu532405f2020-06-17 17:46:44 +08002870 ExpectDnsEvent(INetdEventListener::EVENT_GETHOSTBYNAME, 0, host_name, {ADDR4});
Mike Yu4f3747b2018-12-02 17:54:29 +09002871 } else {
2872 EXPECT_EQ(0U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
2873 ASSERT_TRUE(h_result == nullptr);
2874 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
Mike Yu532405f2020-06-17 17:46:44 +08002875 int returnCode = (config.edns == Edns::DROP) ? RCODE_TIMEOUT : EAI_FAIL;
2876 ExpectDnsEvent(INetdEventListener::EVENT_GETHOSTBYNAME, returnCode, host_name, {});
Mike Yu4f3747b2018-12-02 17:54:29 +09002877 }
2878 } else if (config.method == GETADDRINFO) {
2879 ScopedAddrinfo ai_result;
2880 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2881 ai_result = safe_getaddrinfo(host_name, nullptr, &hints);
2882 if (config.expectResult == EXPECT_SUCCESS) {
2883 EXPECT_TRUE(ai_result != nullptr);
2884 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
2885 const std::string result_str = ToString(ai_result);
2886 EXPECT_EQ(ADDR4, result_str);
Mike Yu532405f2020-06-17 17:46:44 +08002887 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, 0, host_name, {ADDR4});
Mike Yu4f3747b2018-12-02 17:54:29 +09002888 } else {
2889 EXPECT_TRUE(ai_result == nullptr);
2890 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
Mike Yu532405f2020-06-17 17:46:44 +08002891 int returnCode = (config.edns == Edns::DROP) ? RCODE_TIMEOUT : EAI_FAIL;
2892 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, returnCode, host_name, {});
Mike Yu4f3747b2018-12-02 17:54:29 +09002893 }
2894 } else {
2895 FAIL() << "Unsupported query method: " << config.method;
2896 }
2897
Mike Yudd4ac2d2019-05-31 16:52:11 +08002898 tls.clearQueries();
Mike Yu4f3747b2018-12-02 17:54:29 +09002899 dns.clearQueries();
Mike Yu3977d482020-02-26 17:18:57 +08002900
2901 // Clear the setup to force the resolver to validate private DNS servers in every test.
2902 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(paramsForCleanup));
Mike Yu4f3747b2018-12-02 17:54:29 +09002903 }
Mike Yu4f3747b2018-12-02 17:54:29 +09002904}
nuccachena26cc2a2018-07-17 18:07:23 +08002905
Ken Chen0a015532019-01-02 14:59:38 +08002906// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2907// Resolver should have a reasonable number of retries instead of spinning forever. We don't have
2908// an efficient way to know if resolver is stuck in an infinite loop. However, test case will be
2909// failed due to timeout.
2910TEST_F(ResolverTest, UnstableTls) {
2911 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2912 const char CLEARTEXT_PORT[] = "53";
2913 const char TLS_PORT[] = "853";
2914 const char* host_name1 = "nonexistent1.example.com.";
2915 const char* host_name2 = "nonexistent2.example.com.";
2916 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
2917
Mike Yufc125e42019-05-15 20:41:28 +08002918 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Ken Chen0a015532019-01-02 14:59:38 +08002919 ASSERT_TRUE(dns.startServer());
2920 dns.setEdns(test::DNSResponder::Edns::FORMERR_ON_EDNS);
2921 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2922 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08002923 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002924 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
2925
Ken Chen0a015532019-01-02 14:59:38 +08002926 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
2927 tls.stopServer();
2928
2929 const hostent* h_result = gethostbyname(host_name1);
2930 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
2931 ASSERT_TRUE(h_result == nullptr);
2932 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2933
2934 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2935 ScopedAddrinfo ai_result = safe_getaddrinfo(host_name2, nullptr, &hints);
2936 EXPECT_TRUE(ai_result == nullptr);
2937 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
2938}
2939
2940// DNS-over-TLS validation success, but server does not respond to TLS query after a while.
2941// Moreover, server responds RCODE=FORMERR even on non-EDNS query.
2942TEST_F(ResolverTest, BogusDnsServer) {
2943 const char CLEARTEXT_ADDR[] = "127.0.0.53";
2944 const char CLEARTEXT_PORT[] = "53";
2945 const char TLS_PORT[] = "853";
2946 const char* host_name1 = "nonexistent1.example.com.";
2947 const char* host_name2 = "nonexistent2.example.com.";
2948 const std::vector<std::string> servers = {CLEARTEXT_ADDR};
2949
Mike Yufc125e42019-05-15 20:41:28 +08002950 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, ns_rcode::ns_r_servfail);
Ken Chen0a015532019-01-02 14:59:38 +08002951 ASSERT_TRUE(dns.startServer());
2952 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
2953 ASSERT_TRUE(tls.startServer());
waynema0e73c2e2019-07-31 15:04:08 +08002954 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08002955 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
2956
Ken Chen0a015532019-01-02 14:59:38 +08002957 // Shutdown TLS server to get an error. It's similar to no response case but without waiting.
2958 tls.stopServer();
2959 dns.setEdns(test::DNSResponder::Edns::FORMERR_UNCOND);
2960
2961 const hostent* h_result = gethostbyname(host_name1);
2962 EXPECT_EQ(0U, GetNumQueries(dns, host_name1));
2963 ASSERT_TRUE(h_result == nullptr);
2964 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
2965
2966 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
2967 ScopedAddrinfo ai_result = safe_getaddrinfo(host_name2, nullptr, &hints);
2968 EXPECT_TRUE(ai_result == nullptr);
2969 EXPECT_EQ(0U, GetNumQueries(dns, host_name2));
2970}
2971
nuccachena26cc2a2018-07-17 18:07:23 +08002972TEST_F(ResolverTest, GetAddrInfo_Dns64Synthesize) {
2973 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08002974 constexpr char dns64_name[] = "ipv4only.arpa.";
2975 constexpr char host_name[] = "v4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09002976 const std::vector<DnsRecord> records = {
2977 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
2978 {host_name, ns_type::ns_t_a, "1.2.3.4"},
2979 };
nuccachena26cc2a2018-07-17 18:07:23 +08002980
Xiao Ma09b71022018-12-11 17:56:32 +09002981 test::DNSResponder dns(listen_addr);
Xiao Ma09b71022018-12-11 17:56:32 +09002982 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08002983
2984 std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09002985 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08002986
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002987 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08002988 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08002989 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08002990
2991 // hints are necessary in order to let netd know which type of addresses the caller is
2992 // interested in.
Xiao Ma09b71022018-12-11 17:56:32 +09002993 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08002994 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
2995 EXPECT_TRUE(result != nullptr);
Lorenzo Colittid39345c2019-02-18 10:59:29 +09002996 // TODO: BUG: there should only be two queries, one AAAA (which returns no records) and one A
2997 // (which returns 1.2.3.4). But there is an extra AAAA.
2998 EXPECT_EQ(3U, GetNumQueries(dns, host_name));
nuccachena26cc2a2018-07-17 18:07:23 +08002999
3000 std::string result_str = ToString(result);
3001 EXPECT_EQ(result_str, "64:ff9b::102:304");
3002
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003003 // Stopping NAT64 prefix discovery disables synthesis.
Luke Huang5bd827c2019-03-14 16:10:04 +08003004 EXPECT_TRUE(mDnsClient.resolvService()->stopPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003005 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_NOT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003006
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003007 dns.clearQueries();
nuccachena26cc2a2018-07-17 18:07:23 +08003008
3009 result = safe_getaddrinfo("v4only", nullptr, &hints);
3010 EXPECT_TRUE(result != nullptr);
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003011 // TODO: BUG: there should only be one query, an AAAA (which returns no records), because the
3012 // A is already cached. But there is an extra AAAA.
3013 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
nuccachena26cc2a2018-07-17 18:07:23 +08003014
3015 result_str = ToString(result);
3016 EXPECT_EQ(result_str, "1.2.3.4");
3017}
3018
nuccachena26cc2a2018-07-17 18:07:23 +08003019TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecified) {
3020 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003021 constexpr char dns64_name[] = "ipv4only.arpa.";
3022 constexpr char host_name[] = "v4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003023 const std::vector<DnsRecord> records = {
3024 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3025 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3026 };
nuccachena26cc2a2018-07-17 18:07:23 +08003027
Xiao Ma09b71022018-12-11 17:56:32 +09003028 test::DNSResponder dns(listen_addr);
3029 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003030 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003031 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003032
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003033 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003034 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003035 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003036
3037 // Ensure to synthesize AAAA if AF_INET6 is specified, and not to synthesize AAAA
3038 // in AF_INET case.
3039 addrinfo hints;
3040 memset(&hints, 0, sizeof(hints));
3041 hints.ai_family = AF_INET6;
3042 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
3043 EXPECT_TRUE(result != nullptr);
3044 std::string result_str = ToString(result);
3045 EXPECT_EQ(result_str, "64:ff9b::102:304");
3046
3047 hints.ai_family = AF_INET;
3048 result = safe_getaddrinfo("v4only", nullptr, &hints);
3049 EXPECT_TRUE(result != nullptr);
3050 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3051 result_str = ToString(result);
3052 EXPECT_EQ(result_str, "1.2.3.4");
3053}
nuccachena26cc2a2018-07-17 18:07:23 +08003054
3055TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedV6) {
3056 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003057 constexpr char dns64_name[] = "ipv4only.arpa.";
3058 constexpr char host_name[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003059 const std::vector<DnsRecord> records = {
3060 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3061 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3062 {host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
3063 };
nuccachena26cc2a2018-07-17 18:07:23 +08003064
Xiao Ma09b71022018-12-11 17:56:32 +09003065 test::DNSResponder dns(listen_addr);
3066 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003067 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003068 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003069
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003070 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003071 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003072 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003073
Xiao Ma09b71022018-12-11 17:56:32 +09003074 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08003075 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
3076 EXPECT_TRUE(result != nullptr);
3077 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3078
3079 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
Xiao Ma09b71022018-12-11 17:56:32 +09003080 const std::vector<std::string> result_strs = ToStrings(result);
nuccachena26cc2a2018-07-17 18:07:23 +08003081 for (const auto& str : result_strs) {
3082 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
3083 << ", result_str='" << str << "'";
3084 }
3085}
3086
3087TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedNoV6) {
3088 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003089 constexpr char dns64_name[] = "ipv4only.arpa.";
3090 constexpr char host_name[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003091 const std::vector<DnsRecord> records = {
3092 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3093 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3094 };
nuccachena26cc2a2018-07-17 18:07:23 +08003095
Xiao Ma09b71022018-12-11 17:56:32 +09003096 test::DNSResponder dns(listen_addr);
3097 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003098 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003099 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003100
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003101 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003102 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003103 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003104
Xiao Ma09b71022018-12-11 17:56:32 +09003105 const addrinfo hints = {.ai_family = AF_UNSPEC};
nuccachena26cc2a2018-07-17 18:07:23 +08003106 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
3107 EXPECT_TRUE(result != nullptr);
3108 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3109
3110 // In AF_UNSPEC case, synthesize AAAA if there's no AAAA answer.
3111 std::string result_str = ToString(result);
3112 EXPECT_EQ(result_str, "64:ff9b::102:304");
3113}
3114
3115TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecialUseIPv4Addresses) {
3116 constexpr char THIS_NETWORK[] = "this_network";
3117 constexpr char LOOPBACK[] = "loopback";
3118 constexpr char LINK_LOCAL[] = "link_local";
3119 constexpr char MULTICAST[] = "multicast";
3120 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
3121
3122 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
3123 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
3124 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
3125 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
3126 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
3127
3128 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003129 constexpr char dns64_name[] = "ipv4only.arpa.";
3130
Xiao Ma09b71022018-12-11 17:56:32 +09003131 test::DNSResponder dns(listen_addr);
3132 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003133 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003134 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003135
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003136 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003137 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003138 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003139
Luke Huangf8215372019-11-22 11:53:41 +08003140 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003141 static const struct TestConfig {
3142 std::string name;
3143 std::string addr;
3144
3145 std::string asHostName() const { return StringPrintf("%s.example.com.", name.c_str()); }
3146 } testConfigs[]{
3147 {THIS_NETWORK, ADDR_THIS_NETWORK},
3148 {LOOPBACK, ADDR_LOOPBACK},
3149 {LINK_LOCAL, ADDR_LINK_LOCAL},
3150 {MULTICAST, ADDR_MULTICAST},
3151 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
3152 };
Luke Huangf8215372019-11-22 11:53:41 +08003153 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003154
3155 for (const auto& config : testConfigs) {
3156 const std::string testHostName = config.asHostName();
3157 SCOPED_TRACE(testHostName);
3158
3159 const char* host_name = testHostName.c_str();
3160 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
3161
3162 addrinfo hints;
3163 memset(&hints, 0, sizeof(hints));
3164 hints.ai_family = AF_INET6;
3165 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
3166 // In AF_INET6 case, don't return IPv4 answers
3167 EXPECT_TRUE(result == nullptr);
3168 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3169 dns.clearQueries();
3170
3171 memset(&hints, 0, sizeof(hints));
3172 hints.ai_family = AF_UNSPEC;
3173 result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
3174 EXPECT_TRUE(result != nullptr);
3175 // Expect IPv6 query only. IPv4 answer has been cached in previous query.
3176 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3177 // In AF_UNSPEC case, don't synthesize special use IPv4 address.
3178 std::string result_str = ToString(result);
3179 EXPECT_EQ(result_str, config.addr.c_str());
3180 dns.clearQueries();
3181 }
3182}
3183
3184TEST_F(ResolverTest, GetAddrInfo_Dns64QueryWithNullArgumentHints) {
3185 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003186 constexpr char dns64_name[] = "ipv4only.arpa.";
3187 constexpr char host_name[] = "v4only.example.com.";
3188 constexpr char host_name2[] = "v4v6.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003189 const std::vector<DnsRecord> records = {
3190 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3191 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3192 {host_name2, ns_type::ns_t_a, "1.2.3.4"},
3193 {host_name2, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
3194 };
nuccachena26cc2a2018-07-17 18:07:23 +08003195
Xiao Ma09b71022018-12-11 17:56:32 +09003196 test::DNSResponder dns(listen_addr);
3197 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003198 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003199 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003200
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003201 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003202 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003203 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003204
3205 // Assign argument hints of getaddrinfo() as null is equivalent to set ai_family AF_UNSPEC.
3206 // In AF_UNSPEC case, synthesize AAAA if there has A answer only.
3207 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, nullptr);
3208 EXPECT_TRUE(result != nullptr);
3209 EXPECT_LE(2U, GetNumQueries(dns, host_name));
3210 std::string result_str = ToString(result);
3211 EXPECT_EQ(result_str, "64:ff9b::102:304");
3212 dns.clearQueries();
3213
3214 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
3215 result = safe_getaddrinfo("v4v6", nullptr, nullptr);
3216 EXPECT_TRUE(result != nullptr);
3217 EXPECT_LE(2U, GetNumQueries(dns, host_name2));
3218 std::vector<std::string> result_strs = ToStrings(result);
3219 for (const auto& str : result_strs) {
3220 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
3221 << ", result_str='" << str << "'";
3222 }
3223}
3224
3225TEST_F(ResolverTest, GetAddrInfo_Dns64QueryNullArgumentNode) {
3226 constexpr char ADDR_ANYADDR_V4[] = "0.0.0.0";
3227 constexpr char ADDR_ANYADDR_V6[] = "::";
3228 constexpr char ADDR_LOCALHOST_V4[] = "127.0.0.1";
3229 constexpr char ADDR_LOCALHOST_V6[] = "::1";
3230
3231 constexpr char PORT_NAME_HTTP[] = "http";
3232 constexpr char PORT_NUMBER_HTTP[] = "80";
3233
3234 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003235 constexpr char dns64_name[] = "ipv4only.arpa.";
3236
Xiao Ma09b71022018-12-11 17:56:32 +09003237 test::DNSResponder dns(listen_addr);
3238 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003239 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003240 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003241
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003242 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003243 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003244 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003245
Luke Huangf8215372019-11-22 11:53:41 +08003246 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003247 // If node is null, return address is listed by libc/getaddrinfo.c as follows.
3248 // - passive socket -> anyaddr (0.0.0.0 or ::)
3249 // - non-passive socket -> localhost (127.0.0.1 or ::1)
3250 static const struct TestConfig {
3251 int flag;
3252 std::string addr_v4;
3253 std::string addr_v6;
3254
3255 std::string asParameters() const {
3256 return StringPrintf("flag=%d, addr_v4=%s, addr_v6=%s", flag, addr_v4.c_str(),
3257 addr_v6.c_str());
3258 }
3259 } testConfigs[]{
3260 {0 /* non-passive */, ADDR_LOCALHOST_V4, ADDR_LOCALHOST_V6},
3261 {AI_PASSIVE, ADDR_ANYADDR_V4, ADDR_ANYADDR_V6}
3262 };
Luke Huangf8215372019-11-22 11:53:41 +08003263 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003264
3265 for (const auto& config : testConfigs) {
3266 SCOPED_TRACE(config.asParameters());
3267
Xiao Ma09b71022018-12-11 17:56:32 +09003268 addrinfo hints = {
Nick Desaulnierscd6395a2019-10-11 09:15:24 -07003269 .ai_flags = config.flag,
Xiao Ma09b71022018-12-11 17:56:32 +09003270 .ai_family = AF_UNSPEC, // any address family
3271 .ai_socktype = 0, // any type
3272 .ai_protocol = 0, // any protocol
Xiao Ma09b71022018-12-11 17:56:32 +09003273 };
nuccachena26cc2a2018-07-17 18:07:23 +08003274
3275 // Assign hostname as null and service as port name.
3276 ScopedAddrinfo result = safe_getaddrinfo(nullptr, PORT_NAME_HTTP, &hints);
3277 ASSERT_TRUE(result != nullptr);
3278
3279 // Can't be synthesized because it should not get into Netd.
3280 std::vector<std::string> result_strs = ToStrings(result);
3281 for (const auto& str : result_strs) {
3282 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
3283 << ", result_str='" << str << "'";
3284 }
3285
3286 // Assign hostname as null and service as numeric port number.
3287 hints.ai_flags = config.flag | AI_NUMERICSERV;
3288 result = safe_getaddrinfo(nullptr, PORT_NUMBER_HTTP, &hints);
3289 ASSERT_TRUE(result != nullptr);
3290
3291 // Can't be synthesized because it should not get into Netd.
3292 result_strs = ToStrings(result);
3293 for (const auto& str : result_strs) {
3294 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
3295 << ", result_str='" << str << "'";
3296 }
3297 }
3298}
3299
3300TEST_F(ResolverTest, GetHostByAddr_ReverseDnsQueryWithHavingNat64Prefix) {
3301 struct hostent* result = nullptr;
3302 struct in_addr v4addr;
3303 struct in6_addr v6addr;
3304
3305 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003306 constexpr char dns64_name[] = "ipv4only.arpa.";
3307 constexpr char ptr_name[] = "v4v6.example.com.";
3308 // PTR record for IPv4 address 1.2.3.4
3309 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3310 // PTR record for IPv6 address 2001:db8::102:304
3311 constexpr char ptr_addr_v6[] =
3312 "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 +09003313 const std::vector<DnsRecord> records = {
3314 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3315 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3316 {ptr_addr_v6, ns_type::ns_t_ptr, ptr_name},
3317 };
nuccachena26cc2a2018-07-17 18:07:23 +08003318
Xiao Ma09b71022018-12-11 17:56:32 +09003319 test::DNSResponder dns(listen_addr);
3320 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003321 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003322 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003323
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003324 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003325 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003326 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003327
3328 // Reverse IPv4 DNS query. Prefix should have no effect on it.
3329 inet_pton(AF_INET, "1.2.3.4", &v4addr);
3330 result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
3331 ASSERT_TRUE(result != nullptr);
3332 std::string result_str = result->h_name ? result->h_name : "null";
3333 EXPECT_EQ(result_str, "v4v6.example.com");
3334
3335 // Reverse IPv6 DNS query. Prefix should have no effect on it.
3336 inet_pton(AF_INET6, "2001:db8::102:304", &v6addr);
3337 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3338 ASSERT_TRUE(result != nullptr);
3339 result_str = result->h_name ? result->h_name : "null";
3340 EXPECT_EQ(result_str, "v4v6.example.com");
3341}
3342
3343TEST_F(ResolverTest, GetHostByAddr_ReverseDns64Query) {
3344 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003345 constexpr char dns64_name[] = "ipv4only.arpa.";
3346 constexpr char ptr_name[] = "v4only.example.com.";
3347 // PTR record for IPv4 address 1.2.3.4
3348 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3349 // PTR record for IPv6 address 64:ff9b::1.2.3.4
3350 constexpr char ptr_addr_v6_nomapping[] =
3351 "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.";
3352 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
3353 // PTR record for IPv6 address 64:ff9b::5.6.7.8
3354 constexpr char ptr_addr_v6_synthesis[] =
3355 "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 +09003356 const std::vector<DnsRecord> records = {
3357 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3358 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3359 {ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis},
3360 };
nuccachena26cc2a2018-07-17 18:07:23 +08003361
Xiao Ma09b71022018-12-11 17:56:32 +09003362 test::DNSResponder dns(listen_addr);
3363 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003364 // "ptr_addr_v6_nomapping" is not mapped in DNS server
nuccachena26cc2a2018-07-17 18:07:23 +08003365 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003366 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003367
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003368 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003369 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003370 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003371
3372 // Synthesized PTR record doesn't exist on DNS server
3373 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
3374 // After querying synthesized address failed, expect that prefix is removed from IPv6
3375 // synthesized address and do reverse IPv4 query instead.
3376 struct in6_addr v6addr;
3377 inet_pton(AF_INET6, "64:ff9b::1.2.3.4", &v6addr);
3378 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3379 ASSERT_TRUE(result != nullptr);
3380 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist
3381 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist
3382 std::string result_str = result->h_name ? result->h_name : "null";
3383 EXPECT_EQ(result_str, "v4only.example.com");
3384 // Check that return address has been mapped from IPv4 to IPv6 address because Netd
3385 // removes NAT64 prefix and does IPv4 DNS reverse lookup in this case. Then, Netd
3386 // fakes the return IPv4 address as original queried IPv6 address.
3387 result_str = ToString(result);
3388 EXPECT_EQ(result_str, "64:ff9b::102:304");
3389 dns.clearQueries();
3390
3391 // Synthesized PTR record exists on DNS server
3392 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
3393 // Expect to Netd pass through synthesized address for DNS queries.
3394 inet_pton(AF_INET6, "64:ff9b::5.6.7.8", &v6addr);
3395 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3396 ASSERT_TRUE(result != nullptr);
3397 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
3398 result_str = result->h_name ? result->h_name : "null";
3399 EXPECT_EQ(result_str, "v6synthesis.example.com");
3400}
3401
3402TEST_F(ResolverTest, GetHostByAddr_ReverseDns64QueryFromHostFile) {
3403 constexpr char dns64_name[] = "ipv4only.arpa.";
3404 constexpr char host_name[] = "localhost";
3405 // The address is synthesized by prefix64:localhost.
3406 constexpr char host_addr[] = "64:ff9b::7f00:1";
nuccachena26cc2a2018-07-17 18:07:23 +08003407 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003408
3409 test::DNSResponder dns(listen_addr);
3410 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003411 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003412 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003413
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003414 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003415 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003416 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003417
3418 // Using synthesized "localhost" address to be a trick for resolving host name
3419 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
3420 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
3421 struct in6_addr v6addr;
3422 inet_pton(AF_INET6, host_addr, &v6addr);
3423 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
3424 ASSERT_TRUE(result != nullptr);
3425 // Expect no DNS queries; localhost is resolved via /etc/hosts.
3426 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
3427
Luke Huangf8215372019-11-22 11:53:41 +08003428 ASSERT_EQ(sizeof(in6_addr), (unsigned)result->h_length);
nuccachena26cc2a2018-07-17 18:07:23 +08003429 ASSERT_EQ(AF_INET6, result->h_addrtype);
3430 std::string result_str = ToString(result);
3431 EXPECT_EQ(result_str, host_addr);
3432 result_str = result->h_name ? result->h_name : "null";
3433 EXPECT_EQ(result_str, host_name);
3434}
3435
Hungming Chen9e6185a2019-06-04 16:09:19 +08003436TEST_F(ResolverTest, GetHostByAddr_cnamesClasslessReverseDelegation) {
3437 // IPv4 addresses in the subnet with notation '/' or '-'.
3438 constexpr char addr_slash[] = "192.0.2.1";
3439 constexpr char addr_hyphen[] = "192.0.3.1";
3440
3441 // Used to verify DNS reverse query for classless reverse lookup zone. See detail in RFC 2317
3442 // section 4.
3443 const static std::vector<DnsRecord> records = {
3444 // The records for reverse querying "192.0.2.1" in the subnet with notation '/'.
3445 {"1.2.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0/25.2.0.192.in-addr.arpa."},
3446 {"1.0/25.2.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3447
3448 // The records for reverse querying "192.0.3.1" in the subnet with notation '-'.
3449 {"1.3.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0-127.3.0.192.in-addr.arpa."},
3450 {"1.0-127.3.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3451 };
3452
3453 test::DNSResponder dns;
3454 StartDns(dns, records);
3455 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3456
3457 for (const auto& address : {addr_slash, addr_hyphen}) {
3458 SCOPED_TRACE(address);
3459
3460 in_addr v4addr;
3461 ASSERT_TRUE(inet_pton(AF_INET, address, &v4addr));
3462 hostent* result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
3463 ASSERT_TRUE(result != nullptr);
3464 EXPECT_STREQ("hello.example.com", result->h_name);
3465 }
3466}
3467
nuccachena26cc2a2018-07-17 18:07:23 +08003468TEST_F(ResolverTest, GetNameInfo_ReverseDnsQueryWithHavingNat64Prefix) {
3469 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003470 constexpr char dns64_name[] = "ipv4only.arpa.";
3471 constexpr char ptr_name[] = "v4v6.example.com.";
3472 // PTR record for IPv4 address 1.2.3.4
3473 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3474 // PTR record for IPv6 address 2001:db8::102:304
3475 constexpr char ptr_addr_v6[] =
3476 "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 +09003477 const std::vector<DnsRecord> records = {
3478 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3479 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3480 {ptr_addr_v6, ns_type::ns_t_ptr, ptr_name},
3481 };
nuccachena26cc2a2018-07-17 18:07:23 +08003482
Xiao Ma09b71022018-12-11 17:56:32 +09003483 test::DNSResponder dns(listen_addr);
3484 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003485 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003486 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003487
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003488 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003489 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003490 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003491
Luke Huangf8215372019-11-22 11:53:41 +08003492 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003493 static const struct TestConfig {
3494 int flag;
3495 int family;
3496 std::string addr;
3497 std::string host;
3498
3499 std::string asParameters() const {
3500 return StringPrintf("flag=%d, family=%d, addr=%s, host=%s", flag, family, addr.c_str(),
3501 host.c_str());
3502 }
3503 } testConfigs[]{
3504 {NI_NAMEREQD, AF_INET, "1.2.3.4", "v4v6.example.com"},
3505 {NI_NUMERICHOST, AF_INET, "1.2.3.4", "1.2.3.4"},
3506 {0, AF_INET, "1.2.3.4", "v4v6.example.com"},
3507 {0, AF_INET, "5.6.7.8", "5.6.7.8"}, // unmapped
3508 {NI_NAMEREQD, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
3509 {NI_NUMERICHOST, AF_INET6, "2001:db8::102:304", "2001:db8::102:304"},
3510 {0, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
3511 {0, AF_INET6, "2001:db8::506:708", "2001:db8::506:708"}, // unmapped
3512 };
Luke Huangf8215372019-11-22 11:53:41 +08003513 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003514
3515 // Reverse IPv4/IPv6 DNS query. Prefix should have no effect on it.
3516 for (const auto& config : testConfigs) {
3517 SCOPED_TRACE(config.asParameters());
3518
3519 int rv;
3520 char host[NI_MAXHOST];
3521 struct sockaddr_in sin;
3522 struct sockaddr_in6 sin6;
3523 if (config.family == AF_INET) {
3524 memset(&sin, 0, sizeof(sin));
3525 sin.sin_family = AF_INET;
3526 inet_pton(AF_INET, config.addr.c_str(), &sin.sin_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003527 rv = getnameinfo((const struct sockaddr*)&sin, sizeof(sin), host, sizeof(host), nullptr,
3528 0, config.flag);
nuccachena26cc2a2018-07-17 18:07:23 +08003529 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4));
3530 } else if (config.family == AF_INET6) {
3531 memset(&sin6, 0, sizeof(sin6));
3532 sin6.sin6_family = AF_INET6;
3533 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003534 rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host),
nuccachena26cc2a2018-07-17 18:07:23 +08003535 nullptr, 0, config.flag);
3536 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6));
3537 }
3538 ASSERT_EQ(0, rv);
3539 std::string result_str = host;
3540 EXPECT_EQ(result_str, config.host);
3541 dns.clearQueries();
3542 }
3543}
3544
3545TEST_F(ResolverTest, GetNameInfo_ReverseDns64Query) {
3546 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003547 constexpr char dns64_name[] = "ipv4only.arpa.";
3548 constexpr char ptr_name[] = "v4only.example.com.";
3549 // PTR record for IPv4 address 1.2.3.4
3550 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
3551 // PTR record for IPv6 address 64:ff9b::1.2.3.4
3552 constexpr char ptr_addr_v6_nomapping[] =
3553 "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.";
3554 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
3555 // PTR record for IPv6 address 64:ff9b::5.6.7.8
3556 constexpr char ptr_addr_v6_synthesis[] =
3557 "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 +09003558 const std::vector<DnsRecord> records = {
3559 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3560 {ptr_addr_v4, ns_type::ns_t_ptr, ptr_name},
3561 {ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis},
3562 };
nuccachena26cc2a2018-07-17 18:07:23 +08003563
Xiao Ma09b71022018-12-11 17:56:32 +09003564 test::DNSResponder dns(listen_addr);
3565 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003566 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003567 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003568
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003569 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003570 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003571 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003572
Luke Huangf8215372019-11-22 11:53:41 +08003573 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003574 static const struct TestConfig {
3575 bool hasSynthesizedPtrRecord;
3576 int flag;
3577 std::string addr;
3578 std::string host;
3579
3580 std::string asParameters() const {
3581 return StringPrintf("hasSynthesizedPtrRecord=%d, flag=%d, addr=%s, host=%s",
3582 hasSynthesizedPtrRecord, flag, addr.c_str(), host.c_str());
3583 }
3584 } testConfigs[]{
3585 {false, NI_NAMEREQD, "64:ff9b::102:304", "v4only.example.com"},
3586 {false, NI_NUMERICHOST, "64:ff9b::102:304", "64:ff9b::102:304"},
3587 {false, 0, "64:ff9b::102:304", "v4only.example.com"},
3588 {true, NI_NAMEREQD, "64:ff9b::506:708", "v6synthesis.example.com"},
3589 {true, NI_NUMERICHOST, "64:ff9b::506:708", "64:ff9b::506:708"},
3590 {true, 0, "64:ff9b::506:708", "v6synthesis.example.com"}
3591 };
Luke Huangf8215372019-11-22 11:53:41 +08003592 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003593
3594 // hasSynthesizedPtrRecord = false
3595 // Synthesized PTR record doesn't exist on DNS server
3596 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
3597 // After querying synthesized address failed, expect that prefix is removed from IPv6
3598 // synthesized address and do reverse IPv4 query instead.
3599 //
3600 // hasSynthesizedPtrRecord = true
3601 // Synthesized PTR record exists on DNS server
3602 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
3603 // Expect to just pass through synthesized address for DNS queries.
3604 for (const auto& config : testConfigs) {
3605 SCOPED_TRACE(config.asParameters());
3606
3607 char host[NI_MAXHOST];
3608 struct sockaddr_in6 sin6;
3609 memset(&sin6, 0, sizeof(sin6));
3610 sin6.sin6_family = AF_INET6;
3611 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003612 int rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host),
nuccachena26cc2a2018-07-17 18:07:23 +08003613 nullptr, 0, config.flag);
3614 ASSERT_EQ(0, rv);
3615 if (config.flag == NI_NAMEREQD) {
3616 if (config.hasSynthesizedPtrRecord) {
3617 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
3618 } else {
3619 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist.
3620 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist.
3621 }
3622 }
3623 std::string result_str = host;
3624 EXPECT_EQ(result_str, config.host);
3625 dns.clearQueries();
3626 }
3627}
3628
3629TEST_F(ResolverTest, GetNameInfo_ReverseDns64QueryFromHostFile) {
3630 constexpr char dns64_name[] = "ipv4only.arpa.";
3631 constexpr char host_name[] = "localhost";
3632 // The address is synthesized by prefix64:localhost.
3633 constexpr char host_addr[] = "64:ff9b::7f00:1";
nuccachena26cc2a2018-07-17 18:07:23 +08003634 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003635
3636 test::DNSResponder dns(listen_addr);
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003637
Xiao Ma09b71022018-12-11 17:56:32 +09003638 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003639 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003640 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003641
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003642 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003643 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003644 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003645
3646 // Using synthesized "localhost" address to be a trick for resolving host name
3647 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
3648 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
3649 char host[NI_MAXHOST];
Xiao Ma09b71022018-12-11 17:56:32 +09003650 struct sockaddr_in6 sin6 = {.sin6_family = AF_INET6};
nuccachena26cc2a2018-07-17 18:07:23 +08003651 inet_pton(AF_INET6, host_addr, &sin6.sin6_addr);
Luke Huangf8215372019-11-22 11:53:41 +08003652 int rv = getnameinfo((const struct sockaddr*)&sin6, sizeof(sin6), host, sizeof(host), nullptr,
nuccachena26cc2a2018-07-17 18:07:23 +08003653 0, NI_NAMEREQD);
3654 ASSERT_EQ(0, rv);
3655 // Expect no DNS queries; localhost is resolved via /etc/hosts.
3656 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
3657
3658 std::string result_str = host;
3659 EXPECT_EQ(result_str, host_name);
3660}
3661
Hungming Chen9e6185a2019-06-04 16:09:19 +08003662TEST_F(ResolverTest, GetNameInfo_cnamesClasslessReverseDelegation) {
3663 // IPv4 addresses in the subnet with notation '/' or '-'.
3664 constexpr char addr_slash[] = "192.0.2.1";
3665 constexpr char addr_hyphen[] = "192.0.3.1";
3666
3667 // Used to verify DNS reverse query for classless reverse lookup zone. See detail in RFC 2317
3668 // section 4.
3669 const static std::vector<DnsRecord> records = {
3670 // The records for reverse querying "192.0.2.1" in the subnet with notation '/'.
3671 {"1.2.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0/25.2.0.192.in-addr.arpa."},
3672 {"1.0/25.2.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3673
3674 // The records for reverse querying "192.0.3.1" in the subnet with notation '-'.
3675 {"1.3.0.192.in-addr.arpa.", ns_type::ns_t_cname, "1.0-127.3.0.192.in-addr.arpa."},
3676 {"1.0-127.3.0.192.in-addr.arpa.", ns_type::ns_t_ptr, kHelloExampleCom},
3677 };
3678
3679 test::DNSResponder dns;
3680 StartDns(dns, records);
3681 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
3682
3683 for (const auto& address : {addr_slash, addr_hyphen}) {
3684 SCOPED_TRACE(address);
3685
3686 char host[NI_MAXHOST];
3687 sockaddr_in sin = {.sin_family = AF_INET};
3688 ASSERT_TRUE(inet_pton(AF_INET, address, &sin.sin_addr));
3689 int rv = getnameinfo((const sockaddr*)&sin, sizeof(sin), host, sizeof(host), nullptr, 0,
3690 NI_NAMEREQD);
3691 ASSERT_EQ(0, rv);
3692 EXPECT_STREQ("hello.example.com", host);
3693 }
3694}
3695
nuccachena26cc2a2018-07-17 18:07:23 +08003696TEST_F(ResolverTest, GetHostByName2_Dns64Synthesize) {
Xiao Ma09b71022018-12-11 17:56:32 +09003697 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003698 constexpr char dns64_name[] = "ipv4only.arpa.";
3699 constexpr char host_name[] = "ipv4only.example.com.";
Xiao Ma09b71022018-12-11 17:56:32 +09003700 const std::vector<DnsRecord> records = {
3701 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3702 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3703 };
nuccachena26cc2a2018-07-17 18:07:23 +08003704
Xiao Ma09b71022018-12-11 17:56:32 +09003705 test::DNSResponder dns(listen_addr);
3706 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003707 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003708 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003709
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003710 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003711 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003712 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003713
3714 // Query an IPv4-only hostname. Expect that gets a synthesized address.
3715 struct hostent* result = gethostbyname2("ipv4only", AF_INET6);
3716 ASSERT_TRUE(result != nullptr);
3717 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3718 std::string result_str = ToString(result);
3719 EXPECT_EQ(result_str, "64:ff9b::102:304");
3720}
nuccachena26cc2a2018-07-17 18:07:23 +08003721
3722TEST_F(ResolverTest, GetHostByName2_DnsQueryWithHavingNat64Prefix) {
3723 constexpr char dns64_name[] = "ipv4only.arpa.";
3724 constexpr char host_name[] = "v4v6.example.com.";
nuccachena26cc2a2018-07-17 18:07:23 +08003725 constexpr char listen_addr[] = "::1";
Xiao Ma09b71022018-12-11 17:56:32 +09003726 const std::vector<DnsRecord> records = {
3727 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3728 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3729 {host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4"},
3730 };
3731
3732 test::DNSResponder dns(listen_addr);
3733 StartDns(dns, records);
nuccachena26cc2a2018-07-17 18:07:23 +08003734 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003735 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003736
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003737 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003738 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003739 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003740
3741 // IPv4 DNS query. Prefix should have no effect on it.
3742 struct hostent* result = gethostbyname2("v4v6", AF_INET);
3743 ASSERT_TRUE(result != nullptr);
3744 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3745 std::string result_str = ToString(result);
3746 EXPECT_EQ(result_str, "1.2.3.4");
3747 dns.clearQueries();
3748
3749 // IPv6 DNS query. Prefix should have no effect on it.
3750 result = gethostbyname2("v4v6", AF_INET6);
3751 ASSERT_TRUE(result != nullptr);
3752 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3753 result_str = ToString(result);
3754 EXPECT_EQ(result_str, "2001:db8::102:304");
3755}
3756
3757TEST_F(ResolverTest, GetHostByName2_Dns64QuerySpecialUseIPv4Addresses) {
3758 constexpr char THIS_NETWORK[] = "this_network";
3759 constexpr char LOOPBACK[] = "loopback";
3760 constexpr char LINK_LOCAL[] = "link_local";
3761 constexpr char MULTICAST[] = "multicast";
3762 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
3763
3764 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
3765 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
3766 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
3767 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
3768 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
3769
3770 constexpr char listen_addr[] = "::1";
nuccachena26cc2a2018-07-17 18:07:23 +08003771 constexpr char dns64_name[] = "ipv4only.arpa.";
3772
Xiao Ma09b71022018-12-11 17:56:32 +09003773 test::DNSResponder dns(listen_addr);
3774 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::"}});
nuccachena26cc2a2018-07-17 18:07:23 +08003775 const std::vector<std::string> servers = {listen_addr};
Xiao Ma09b71022018-12-11 17:56:32 +09003776 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
nuccachena26cc2a2018-07-17 18:07:23 +08003777
Lorenzo Colittid39345c2019-02-18 10:59:29 +09003778 // Start NAT64 prefix discovery and wait for it to complete.
Luke Huang5bd827c2019-03-14 16:10:04 +08003779 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003780 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
nuccachena26cc2a2018-07-17 18:07:23 +08003781
Luke Huangf8215372019-11-22 11:53:41 +08003782 // clang-format off
nuccachena26cc2a2018-07-17 18:07:23 +08003783 static const struct TestConfig {
3784 std::string name;
3785 std::string addr;
3786
3787 std::string asHostName() const {
Luke Huangf8215372019-11-22 11:53:41 +08003788 return StringPrintf("%s.example.com.", name.c_str());
nuccachena26cc2a2018-07-17 18:07:23 +08003789 }
3790 } testConfigs[]{
3791 {THIS_NETWORK, ADDR_THIS_NETWORK},
3792 {LOOPBACK, ADDR_LOOPBACK},
3793 {LINK_LOCAL, ADDR_LINK_LOCAL},
3794 {MULTICAST, ADDR_MULTICAST},
3795 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
3796 };
Luke Huangf8215372019-11-22 11:53:41 +08003797 // clang-format on
nuccachena26cc2a2018-07-17 18:07:23 +08003798
3799 for (const auto& config : testConfigs) {
3800 const std::string testHostName = config.asHostName();
3801 SCOPED_TRACE(testHostName);
3802
3803 const char* host_name = testHostName.c_str();
3804 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
3805
3806 struct hostent* result = gethostbyname2(config.name.c_str(), AF_INET6);
3807 EXPECT_LE(1U, GetNumQueries(dns, host_name));
3808
3809 // In AF_INET6 case, don't synthesize special use IPv4 address.
3810 // Expect to have no answer
3811 EXPECT_EQ(nullptr, result);
3812
3813 dns.clearQueries();
3814 }
Bernie Innocenti2fef2b82018-12-20 15:56:40 +09003815}
Mike Yuf14e1a92019-05-10 13:54:58 +08003816
3817TEST_F(ResolverTest, PrefixDiscoveryBypassTls) {
3818 constexpr char listen_addr[] = "::1";
3819 constexpr char cleartext_port[] = "53";
3820 constexpr char tls_port[] = "853";
3821 constexpr char dns64_name[] = "ipv4only.arpa.";
3822 const std::vector<std::string> servers = {listen_addr};
3823
3824 test::DNSResponder dns(listen_addr);
3825 StartDns(dns, {{dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"}});
3826 test::DnsTlsFrontend tls(listen_addr, tls_port, listen_addr, cleartext_port);
3827 ASSERT_TRUE(tls.startServer());
3828
3829 // Setup OPPORTUNISTIC mode and wait for the validation complete.
waynema0e73c2e2019-07-31 15:04:08 +08003830 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams, ""));
Mike Yu724f77d2019-08-16 11:14:50 +08003831 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003832 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yuf14e1a92019-05-10 13:54:58 +08003833 tls.clearQueries();
3834
3835 // Start NAT64 prefix discovery and wait for it complete.
3836 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003837 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
Mike Yuf14e1a92019-05-10 13:54:58 +08003838
3839 // Verify it bypassed TLS even though there's a TLS server available.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003840 EXPECT_EQ(0, tls.queries()) << dns.dumpQueries();
3841 EXPECT_EQ(1U, GetNumQueries(dns, dns64_name)) << dns.dumpQueries();
Mike Yuf14e1a92019-05-10 13:54:58 +08003842
3843 // Restart the testing network to reset the cache.
3844 mDnsClient.TearDown();
3845 mDnsClient.SetUp();
3846 dns.clearQueries();
3847
3848 // Setup STRICT mode and wait for the validation complete.
waynema0e73c2e2019-07-31 15:04:08 +08003849 ASSERT_TRUE(mDnsClient.SetResolversWithTls(servers, kDefaultSearchDomains, kDefaultParams,
3850 kDefaultPrivateDnsHostName));
Mike Yu724f77d2019-08-16 11:14:50 +08003851 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003852 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yuf14e1a92019-05-10 13:54:58 +08003853 tls.clearQueries();
3854
3855 // Start NAT64 prefix discovery and wait for it to complete.
3856 EXPECT_TRUE(mDnsClient.resolvService()->startPrefix64Discovery(TEST_NETID).isOk());
Hungming Chene8f970c2019-04-10 17:34:06 +08003857 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
Mike Yuf14e1a92019-05-10 13:54:58 +08003858
3859 // Verify it bypassed TLS despite STRICT mode.
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09003860 EXPECT_EQ(0, tls.queries()) << dns.dumpQueries();
3861 EXPECT_EQ(1U, GetNumQueries(dns, dns64_name)) << dns.dumpQueries();
Mike Yuf14e1a92019-05-10 13:54:58 +08003862}
Luke Huang9807e6b2019-05-20 16:17:12 +08003863
Lorenzo Colittie51091d2020-05-20 02:48:44 +09003864TEST_F(ResolverTest, SetAndClearNat64Prefix) {
3865 constexpr char host_name[] = "v4.example.com.";
3866 constexpr char listen_addr[] = "::1";
3867 const std::vector<DnsRecord> records = {
3868 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3869 };
3870 const std::string kNat64Prefix1 = "64:ff9b::/96";
3871 const std::string kNat64Prefix2 = "2001:db8:6464::/96";
3872
3873 test::DNSResponder dns(listen_addr);
3874 StartDns(dns, records);
3875 const std::vector<std::string> servers = {listen_addr};
3876 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
3877
3878 auto resolvService = mDnsClient.resolvService();
3879 addrinfo hints = {.ai_family = AF_INET6};
3880
3881 // No NAT64 prefix, no AAAA record.
3882 ScopedAddrinfo result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3883 ASSERT_TRUE(result == nullptr);
3884
3885 // Set the prefix, and expect to get a synthesized AAAA record.
3886 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix2).isOk());
3887 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3888 ASSERT_FALSE(result == nullptr);
3889 EXPECT_EQ("2001:db8:6464::102:304", ToString(result));
3890
3891 // Update the prefix, expect to see AAAA records from the new prefix.
3892 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3893 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3894 ASSERT_FALSE(result == nullptr);
3895 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3896
3897 // Non-/96 prefixes are ignored.
3898 auto status = resolvService->setPrefix64(TEST_NETID, "64:ff9b::/64");
3899 EXPECT_FALSE(status.isOk());
3900 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3901 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3902
3903 // Invalid prefixes are ignored.
3904 status = resolvService->setPrefix64(TEST_NETID, "192.0.2.0/24");
3905 EXPECT_FALSE(status.isOk());
3906 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3907 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3908
3909 status = resolvService->setPrefix64(TEST_NETID, "192.0.2.1");
3910 EXPECT_FALSE(status.isOk());
3911 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3912 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3913
3914 status = resolvService->setPrefix64(TEST_NETID, "hello");
3915 EXPECT_FALSE(status.isOk());
3916 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3917 EXPECT_EQ(EINVAL, status.getServiceSpecificError());
3918
3919 // DNS64 synthesis is still working.
3920 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3921 ASSERT_FALSE(result == nullptr);
3922 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3923
3924 // Clear the prefix. No AAAA records any more.
3925 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, "").isOk());
3926 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3927 EXPECT_TRUE(result == nullptr);
3928
3929 // Calling startPrefix64Discovery clears the prefix.
3930 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3931 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3932 ASSERT_FALSE(result == nullptr);
3933 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3934
3935 EXPECT_TRUE(resolvService->startPrefix64Discovery(TEST_NETID).isOk());
3936 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3937 ASSERT_TRUE(result == nullptr);
3938
3939 // setPrefix64 fails if prefix discovery is started, even if no prefix is yet discovered...
3940 status = resolvService->setPrefix64(TEST_NETID, kNat64Prefix1);
3941 EXPECT_FALSE(status.isOk());
3942 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3943 EXPECT_EQ(EEXIST, status.getServiceSpecificError());
3944
3945 // .. and clearing the prefix also has no effect.
3946 status = resolvService->setPrefix64(TEST_NETID, "");
3947 EXPECT_FALSE(status.isOk());
3948 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3949 EXPECT_EQ(ENOENT, status.getServiceSpecificError());
3950
3951 // setPrefix64 succeeds again when prefix discovery is stopped.
3952 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
3953 EXPECT_TRUE(resolvService->setPrefix64(TEST_NETID, kNat64Prefix1).isOk());
3954 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3955 ASSERT_FALSE(result == nullptr);
3956 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3957
3958 // Calling stopPrefix64Discovery clears the prefix.
3959 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
3960 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3961 ASSERT_TRUE(result == nullptr);
3962
3963 // Set up NAT64 prefix discovery.
3964 constexpr char dns64_name[] = "ipv4only.arpa.";
3965 const std::vector<DnsRecord> newRecords = {
3966 {host_name, ns_type::ns_t_a, "1.2.3.4"},
3967 {dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170"},
3968 };
3969 dns.stopServer();
3970 StartDns(dns, newRecords);
3971
3972 EXPECT_TRUE(resolvService->startPrefix64Discovery(TEST_NETID).isOk());
3973 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_FOUND));
3974 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3975 ASSERT_FALSE(result == nullptr);
3976 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3977
3978 // setPrefix64 fails if NAT64 prefix discovery has succeeded, and the discovered prefix
3979 // continues to be used.
3980 status = resolvService->setPrefix64(TEST_NETID, kNat64Prefix2);
3981 EXPECT_FALSE(status.isOk());
3982 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3983 EXPECT_EQ(EEXIST, status.getServiceSpecificError());
3984
3985 // Clearing the prefix also has no effect if discovery is started.
3986 status = resolvService->setPrefix64(TEST_NETID, "");
3987 EXPECT_FALSE(status.isOk());
3988 EXPECT_EQ(EX_SERVICE_SPECIFIC, status.getExceptionCode());
3989 EXPECT_EQ(ENOENT, status.getServiceSpecificError());
3990
3991 result = safe_getaddrinfo("v4.example.com", nullptr, &hints);
3992 ASSERT_FALSE(result == nullptr);
3993 EXPECT_EQ("64:ff9b::102:304", ToString(result));
3994
3995 EXPECT_TRUE(resolvService->stopPrefix64Discovery(TEST_NETID).isOk());
3996 EXPECT_TRUE(WaitForNat64Prefix(EXPECT_NOT_FOUND));
Lorenzo Colitti61f796b2020-05-21 00:57:49 +09003997
3998 EXPECT_EQ(0, sDnsMetricsListener->getUnexpectedNat64PrefixUpdates());
Lorenzo Colittie51091d2020-05-20 02:48:44 +09003999}
4000
Luke Huang9807e6b2019-05-20 16:17:12 +08004001namespace {
4002
Luke Huang0d592bc2019-05-25 18:24:03 +08004003class ScopedSetNetworkForProcess {
4004 public:
4005 explicit ScopedSetNetworkForProcess(unsigned netId) {
4006 mStoredNetId = getNetworkForProcess();
4007 if (netId == mStoredNetId) return;
4008 EXPECT_EQ(0, setNetworkForProcess(netId));
4009 }
4010 ~ScopedSetNetworkForProcess() { EXPECT_EQ(0, setNetworkForProcess(mStoredNetId)); }
4011
4012 private:
4013 unsigned mStoredNetId;
4014};
4015
4016class ScopedSetNetworkForResolv {
4017 public:
4018 explicit ScopedSetNetworkForResolv(unsigned netId) { EXPECT_EQ(0, setNetworkForResolv(netId)); }
4019 ~ScopedSetNetworkForResolv() { EXPECT_EQ(0, setNetworkForResolv(NETID_UNSET)); }
4020};
4021
Luke Huang9807e6b2019-05-20 16:17:12 +08004022void sendCommand(int fd, const std::string& cmd) {
4023 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size() + 1));
4024 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size() + 1));
4025}
4026
4027int32_t readBE32(int fd) {
4028 int32_t tmp;
4029 int n = TEMP_FAILURE_RETRY(read(fd, &tmp, sizeof(tmp)));
4030 EXPECT_TRUE(n > 0);
4031 return ntohl(tmp);
4032}
4033
Luke Huang0d592bc2019-05-25 18:24:03 +08004034int readResponseCode(int fd) {
Luke Huang9807e6b2019-05-20 16:17:12 +08004035 char buf[4];
4036 int n = TEMP_FAILURE_RETRY(read(fd, &buf, sizeof(buf)));
4037 EXPECT_TRUE(n > 0);
4038 // The format of response code is that 4 bytes for the code & null.
4039 buf[3] = '\0';
4040 int result;
4041 EXPECT_TRUE(ParseInt(buf, &result));
4042 return result;
4043}
4044
Luke Huang0d592bc2019-05-25 18:24:03 +08004045bool checkAndClearUseLocalNameserversFlag(unsigned* netid) {
4046 if (netid == nullptr || ((*netid) & NETID_USE_LOCAL_NAMESERVERS) == 0) {
4047 return false;
4048 }
4049 *netid = (*netid) & ~NETID_USE_LOCAL_NAMESERVERS;
4050 return true;
4051}
4052
Luke Huangf8215372019-11-22 11:53:41 +08004053aidl::android::net::UidRangeParcel makeUidRangeParcel(int start, int stop) {
4054 aidl::android::net::UidRangeParcel res;
Luke Huang0d592bc2019-05-25 18:24:03 +08004055 res.start = start;
4056 res.stop = stop;
4057
4058 return res;
4059}
4060
4061void expectNetIdWithLocalNameserversFlag(unsigned netId) {
4062 unsigned dnsNetId = 0;
4063 EXPECT_EQ(0, getNetworkForDns(&dnsNetId));
4064 EXPECT_TRUE(checkAndClearUseLocalNameserversFlag(&dnsNetId));
4065 EXPECT_EQ(netId, static_cast<unsigned>(dnsNetId));
4066}
4067
4068void expectDnsNetIdEquals(unsigned netId) {
4069 unsigned dnsNetId = 0;
4070 EXPECT_EQ(0, getNetworkForDns(&dnsNetId));
4071 EXPECT_EQ(netId, static_cast<unsigned>(dnsNetId));
4072}
4073
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004074void expectDnsNetIdIsDefaultNetwork(INetd* netdService) {
Luke Huang0d592bc2019-05-25 18:24:03 +08004075 int currentNetid;
4076 EXPECT_TRUE(netdService->networkGetDefault(&currentNetid).isOk());
4077 expectDnsNetIdEquals(currentNetid);
4078}
4079
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004080void expectDnsNetIdWithVpn(INetd* netdService, unsigned vpnNetId, unsigned expectedNetId) {
Luke Huang0d592bc2019-05-25 18:24:03 +08004081 EXPECT_TRUE(netdService->networkCreateVpn(vpnNetId, false /* secure */).isOk());
4082 uid_t uid = getuid();
4083 // Add uid to VPN
4084 EXPECT_TRUE(netdService->networkAddUidRanges(vpnNetId, {makeUidRangeParcel(uid, uid)}).isOk());
4085 expectDnsNetIdEquals(expectedNetId);
4086 EXPECT_TRUE(netdService->networkDestroy(vpnNetId).isOk());
4087}
4088
Luke Huang9807e6b2019-05-20 16:17:12 +08004089} // namespace
4090
4091TEST_F(ResolverTest, getDnsNetId) {
4092 // We've called setNetworkForProcess in SetupOemNetwork, so reset to default first.
4093 setNetworkForProcess(NETID_UNSET);
Luke Huang0d592bc2019-05-25 18:24:03 +08004094
4095 expectDnsNetIdIsDefaultNetwork(mDnsClient.netdService());
4096 expectDnsNetIdWithVpn(mDnsClient.netdService(), TEST_VPN_NETID, TEST_VPN_NETID);
Luke Huang9807e6b2019-05-20 16:17:12 +08004097
4098 // Test with setNetworkForProcess
Luke Huang0d592bc2019-05-25 18:24:03 +08004099 {
4100 ScopedSetNetworkForProcess scopedSetNetworkForProcess(TEST_NETID);
4101 expectDnsNetIdEquals(TEST_NETID);
4102 }
4103
4104 // Test with setNetworkForProcess with NETID_USE_LOCAL_NAMESERVERS
4105 {
4106 ScopedSetNetworkForProcess scopedSetNetworkForProcess(TEST_NETID |
4107 NETID_USE_LOCAL_NAMESERVERS);
4108 expectNetIdWithLocalNameserversFlag(TEST_NETID);
4109 }
Luke Huang9807e6b2019-05-20 16:17:12 +08004110
4111 // Test with setNetworkForResolv
Luke Huang0d592bc2019-05-25 18:24:03 +08004112 {
4113 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID);
4114 expectDnsNetIdEquals(TEST_NETID);
4115 }
4116
4117 // Test with setNetworkForResolv with NETID_USE_LOCAL_NAMESERVERS
4118 {
4119 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID |
4120 NETID_USE_LOCAL_NAMESERVERS);
4121 expectNetIdWithLocalNameserversFlag(TEST_NETID);
4122 }
4123
4124 // Test with setNetworkForResolv under bypassable vpn
4125 {
4126 ScopedSetNetworkForResolv scopedSetNetworkForResolv(TEST_NETID);
4127 expectDnsNetIdWithVpn(mDnsClient.netdService(), TEST_VPN_NETID, TEST_NETID);
4128 }
Luke Huang9807e6b2019-05-20 16:17:12 +08004129
4130 // Create socket connected to DnsProxyListener
4131 int fd = dns_open_proxy();
4132 EXPECT_TRUE(fd > 0);
4133 unique_fd ufd(fd);
4134
4135 // Test command with wrong netId
4136 sendCommand(fd, "getdnsnetid abc");
Luke Huang0d592bc2019-05-25 18:24:03 +08004137 EXPECT_EQ(ResponseCode::DnsProxyQueryResult, readResponseCode(fd));
Luke Huang9807e6b2019-05-20 16:17:12 +08004138 EXPECT_EQ(-EINVAL, readBE32(fd));
4139
4140 // Test unsupported command
4141 sendCommand(fd, "getdnsnetidNotSupported");
4142 // Keep in sync with FrameworkListener.cpp (500, "Command not recognized")
Luke Huang0d592bc2019-05-25 18:24:03 +08004143 EXPECT_EQ(500, readResponseCode(fd));
Luke Huang9807e6b2019-05-20 16:17:12 +08004144}
Sehee Park2c118782019-05-07 13:02:45 +09004145
4146TEST_F(ResolverTest, BlockDnsQueryWithUidRule) {
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004147 // This test relies on blocking traffic on loopback, which xt_qtaguid does not do.
4148 // See aosp/358413 and b/34444781 for why.
4149 SKIP_IF_BPF_NOT_SUPPORTED;
4150
Sehee Park2c118782019-05-07 13:02:45 +09004151 constexpr char listen_addr1[] = "127.0.0.4";
4152 constexpr char listen_addr2[] = "::1";
4153 constexpr char host_name[] = "howdy.example.com.";
4154 const std::vector<DnsRecord> records = {
4155 {host_name, ns_type::ns_t_a, "1.2.3.4"},
4156 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
4157 };
Lorenzo Colittieb9aeec2019-06-26 19:53:55 +09004158 INetd* netdService = mDnsClient.netdService();
Sehee Park2c118782019-05-07 13:02:45 +09004159
4160 test::DNSResponder dns1(listen_addr1);
4161 test::DNSResponder dns2(listen_addr2);
4162 StartDns(dns1, records);
4163 StartDns(dns2, records);
4164
4165 std::vector<std::string> servers = {listen_addr1, listen_addr2};
4166 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
4167 dns1.clearQueries();
4168 dns2.clearQueries();
4169
Luke Huangeb618ef2020-05-26 14:17:02 +08004170 ScopeBlockedUIDRule scopeBlockUidRule(netdService, TEST_UID);
Sehee Park2c118782019-05-07 13:02:45 +09004171 // Dns Query
4172 int fd1 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_a, 0);
4173 int fd2 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_aaaa, 0);
4174 EXPECT_TRUE(fd1 != -1);
4175 EXPECT_TRUE(fd2 != -1);
4176
Luke Huang5729afc2020-07-30 23:12:17 +08004177 uint8_t buf1[MAXPACKET] = {};
4178 uint8_t buf2[MAXPACKET] = {};
Sehee Park2c118782019-05-07 13:02:45 +09004179 int rcode;
Luke Huang5729afc2020-07-30 23:12:17 +08004180 int res2 = getAsyncResponse(fd2, &rcode, buf2, MAXPACKET);
4181 int res1 = getAsyncResponse(fd1, &rcode, buf1, MAXPACKET);
4182 // If API level >= 30 (R+), these queries should be blocked.
4183 if (isAtLeastR) {
4184 EXPECT_EQ(res2, -ECONNREFUSED);
4185 EXPECT_EQ(res1, -ECONNREFUSED);
4186 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, EAI_SYSTEM, "howdy.example.com", {});
4187 ExpectDnsEvent(INetdEventListener::EVENT_RES_NSEND, EAI_SYSTEM, "howdy.example.com", {});
4188 } else {
4189 EXPECT_GT(res2, 0);
4190 EXPECT_EQ("::1.2.3.4", toString(buf2, res2, AF_INET6));
4191 EXPECT_GT(res1, 0);
4192 EXPECT_EQ("1.2.3.4", toString(buf1, res1, AF_INET));
4193 // To avoid flaky test, do not evaluate DnsEvent since event order is not guaranteed.
4194 }
Sehee Park2c118782019-05-07 13:02:45 +09004195}
Mike Yua772c202019-09-23 17:47:21 +08004196
Ken Chenbc481b82020-05-21 23:30:01 +08004197TEST_F(ResolverTest, EnforceDnsUid) {
4198 SKIP_IF_BPF_NOT_SUPPORTED;
4199
4200 constexpr char listen_addr1[] = "127.0.0.4";
4201 constexpr char listen_addr2[] = "::1";
4202 constexpr char host_name[] = "howdy.example.com.";
4203 const std::vector<DnsRecord> records = {
4204 {host_name, ns_type::ns_t_a, "1.2.3.4"},
4205 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
4206 };
4207 INetd* netdService = mDnsClient.netdService();
4208
4209 test::DNSResponder dns1(listen_addr1);
4210 test::DNSResponder dns2(listen_addr2);
4211 StartDns(dns1, records);
4212 StartDns(dns2, records);
4213
4214 // switch uid of DNS queries from applications to AID_DNS
4215 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4216 parcel.servers = {listen_addr1, listen_addr2};
4217 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk());
4218
4219 uint8_t buf[MAXPACKET] = {};
Luke Huang5729afc2020-07-30 23:12:17 +08004220 uint8_t buf2[MAXPACKET] = {};
Ken Chenbc481b82020-05-21 23:30:01 +08004221 int rcode;
4222 {
4223 ScopeBlockedUIDRule scopeBlockUidRule(netdService, TEST_UID);
4224 // Dns Queries should be blocked
Luke Huang5729afc2020-07-30 23:12:17 +08004225 const int fd1 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_a, 0);
4226 const int fd2 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_aaaa, 0);
Ken Chenbc481b82020-05-21 23:30:01 +08004227 EXPECT_TRUE(fd1 != -1);
4228 EXPECT_TRUE(fd2 != -1);
4229
Luke Huang5729afc2020-07-30 23:12:17 +08004230 const int res2 = getAsyncResponse(fd2, &rcode, buf2, MAXPACKET);
4231 const int res1 = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
4232 // If API level >= 30 (R+), the query should be blocked.
4233 if (isAtLeastR) {
4234 EXPECT_EQ(res2, -ECONNREFUSED);
4235 EXPECT_EQ(res1, -ECONNREFUSED);
4236 } else {
4237 EXPECT_GT(res2, 0);
4238 EXPECT_EQ("::1.2.3.4", toString(buf2, res2, AF_INET6));
4239 EXPECT_GT(res1, 0);
4240 EXPECT_EQ("1.2.3.4", toString(buf, res1, AF_INET));
4241 }
Ken Chenbc481b82020-05-21 23:30:01 +08004242 }
4243
Luke Huang5729afc2020-07-30 23:12:17 +08004244 memset(buf, 0, MAXPACKET);
Ken Chenbc481b82020-05-21 23:30:01 +08004245 parcel.resolverOptions.enforceDnsUid = true;
4246 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk());
4247 {
4248 ScopeBlockedUIDRule scopeBlockUidRule(netdService, TEST_UID);
4249 // Dns Queries should NOT be blocked
4250 int fd1 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_a, 0);
4251 int fd2 = resNetworkQuery(TEST_NETID, host_name, ns_c_in, ns_t_aaaa, 0);
4252 EXPECT_TRUE(fd1 != -1);
4253 EXPECT_TRUE(fd2 != -1);
4254
4255 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
4256 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
4257
4258 memset(buf, 0, MAXPACKET);
4259 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
4260 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
4261
4262 // @TODO: So far we know that uid of DNS queries are no more set to DNS requester. But we
4263 // don't check if they are actually being set to AID_DNS, because system uids are always
4264 // allowed in bpf_owner_match(). Audit by firewallSetUidRule(AID_DNS) + sending queries is
4265 // infeasible. Fix it if the behavior of bpf_owner_match() is changed in the future, or if
4266 // we have better idea to deal with this.
4267 }
4268}
4269
Mike Yua772c202019-09-23 17:47:21 +08004270TEST_F(ResolverTest, ConnectTlsServerTimeout) {
Mike Yu61d17262020-02-15 18:56:22 +08004271 const std::string kDotConnectTimeoutMsFlag(
4272 "persist.device_config.netd_native.dot_connect_timeout_ms");
Mike Yu40e67072019-10-09 21:14:09 +08004273 constexpr int expectedTimeout = 1000;
4274 constexpr char hostname1[] = "query1.example.com.";
4275 constexpr char hostname2[] = "query2.example.com.";
Mike Yua772c202019-09-23 17:47:21 +08004276 const std::vector<DnsRecord> records = {
Mike Yu40e67072019-10-09 21:14:09 +08004277 {hostname1, ns_type::ns_t_a, "1.2.3.4"},
4278 {hostname2, ns_type::ns_t_a, "1.2.3.5"},
Mike Yua772c202019-09-23 17:47:21 +08004279 };
4280
4281 test::DNSResponder dns;
4282 StartDns(dns, records);
Mike Yu40e67072019-10-09 21:14:09 +08004283 test::DnsTlsFrontend tls;
Mike Yua772c202019-09-23 17:47:21 +08004284 ASSERT_TRUE(tls.startServer());
4285
Mike Yu40e67072019-10-09 21:14:09 +08004286 // The resolver will adjust the timeout value to 1000ms since the value is too small.
4287 ScopedSystemProperties scopedSystemProperties(kDotConnectTimeoutMsFlag, "100");
Mike Yua772c202019-09-23 17:47:21 +08004288
Mike Yu40e67072019-10-09 21:14:09 +08004289 // Set up resolver to opportunistic mode with the default configuration.
Mike Yu8ac63402019-12-02 15:28:38 +08004290 const ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
Mike Yu40e67072019-10-09 21:14:09 +08004291 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
Mike Yua772c202019-09-23 17:47:21 +08004292 EXPECT_TRUE(WaitForPrivateDnsValidation(tls.listen_address(), true));
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09004293 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yua772c202019-09-23 17:47:21 +08004294 tls.clearQueries();
Bernie Innocenti0ad80e92020-01-23 22:20:44 +09004295 dns.clearQueries();
Mike Yua772c202019-09-23 17:47:21 +08004296
4297 // The server becomes unresponsive to the handshake request.
4298 tls.setHangOnHandshakeForTesting(true);
4299
4300 // Expect the things happening in getaddrinfo():
4301 // 1. Connect to the private DNS server.
4302 // 2. SSL handshake times out.
4303 // 3. Fallback to UDP transport, and then get the answer.
Mike Yu40e67072019-10-09 21:14:09 +08004304 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4305 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(hostname1, nullptr, hints);
Mike Yua772c202019-09-23 17:47:21 +08004306
Mike Yu40e67072019-10-09 21:14:09 +08004307 EXPECT_NE(nullptr, result);
Mike Yua772c202019-09-23 17:47:21 +08004308 EXPECT_EQ(0, tls.queries());
Mike Yu40e67072019-10-09 21:14:09 +08004309 EXPECT_EQ(1U, GetNumQueries(dns, hostname1));
4310 EXPECT_EQ(records.at(0).addr, ToString(result));
Mike Yua772c202019-09-23 17:47:21 +08004311
Mike Yu40e67072019-10-09 21:14:09 +08004312 // A loose upper bound is set by adding 2000ms buffer time. Theoretically, getaddrinfo()
4313 // should just take a bit more than expetTimeout milliseconds.
4314 EXPECT_GE(timeTakenMs, expectedTimeout);
4315 EXPECT_LE(timeTakenMs, expectedTimeout + 2000);
4316
4317 // Set the server to be responsive. Verify that the resolver will attempt to reconnect
4318 // to the server and then get the result within the timeout.
4319 tls.setHangOnHandshakeForTesting(false);
4320 std::tie(result, timeTakenMs) = safe_getaddrinfo_time_taken(hostname2, nullptr, hints);
4321
4322 EXPECT_NE(nullptr, result);
Luke Huang0a0870d2020-02-12 20:41:10 +08004323 EXPECT_TRUE(tls.waitForQueries(1));
Mike Yu40e67072019-10-09 21:14:09 +08004324 EXPECT_EQ(1U, GetNumQueries(dns, hostname2));
4325 EXPECT_EQ(records.at(1).addr, ToString(result));
4326
4327 EXPECT_LE(timeTakenMs, expectedTimeout);
Mike Yua772c202019-09-23 17:47:21 +08004328}
Hungming Chenbb90ab32019-10-28 18:20:31 +08004329
Ken Chen766feae2019-10-30 15:13:44 +08004330TEST_F(ResolverTest, FlushNetworkCache) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004331 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004332 test::DNSResponder dns;
4333 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4334 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4335
4336 const hostent* result = gethostbyname("hello");
4337 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4338
4339 // get result from cache
4340 result = gethostbyname("hello");
4341 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4342
4343 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4344
4345 result = gethostbyname("hello");
4346 EXPECT_EQ(2U, GetNumQueriesForType(dns, ns_type::ns_t_a, kHelloExampleCom));
4347}
4348
4349TEST_F(ResolverTest, FlushNetworkCache_random) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004350 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004351 constexpr int num_flush = 10;
4352 constexpr int num_queries = 20;
4353 test::DNSResponder dns;
4354 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4355 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4356 const addrinfo hints = {.ai_family = AF_INET};
4357
4358 std::thread t([this]() {
4359 for (int i = 0; i < num_flush; ++i) {
4360 unsigned delay = arc4random_uniform(10 * 1000); // 10ms
4361 usleep(delay);
4362 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4363 }
4364 });
4365
4366 for (int i = 0; i < num_queries; ++i) {
4367 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4368 EXPECT_TRUE(result != nullptr);
4369 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4370 }
4371 t.join();
4372}
4373
4374// flush cache while one query is wait-for-response, another is pending.
4375TEST_F(ResolverTest, FlushNetworkCache_concurrent) {
Luke Huang0b5a76c2019-11-23 03:00:00 +08004376 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
Ken Chen766feae2019-10-30 15:13:44 +08004377 const char* listen_addr1 = "127.0.0.9";
4378 const char* listen_addr2 = "127.0.0.10";
4379 test::DNSResponder dns1(listen_addr1);
4380 test::DNSResponder dns2(listen_addr2);
4381 StartDns(dns1, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4382 StartDns(dns2, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4383 addrinfo hints = {.ai_family = AF_INET};
4384
4385 // step 1: set server#1 into deferred responding mode
4386 dns1.setDeferredResp(true);
4387 std::thread t1([&listen_addr1, &hints, this]() {
4388 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr1}));
4389 // step 3: query
4390 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4391 // step 9: check result
4392 EXPECT_TRUE(result != nullptr);
4393 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4394 });
4395
4396 // step 2: wait for the query to reach the server
4397 while (GetNumQueries(dns1, kHelloExampleCom) == 0) {
4398 usleep(1000); // 1ms
4399 }
4400
4401 std::thread t2([&listen_addr2, &hints, &dns2, this]() {
4402 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr2}));
4403 // step 5: query (should be blocked in resolver)
4404 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4405 // step 7: check result
4406 EXPECT_TRUE(result != nullptr);
4407 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4408 EXPECT_EQ(1U, GetNumQueriesForType(dns2, ns_type::ns_t_a, kHelloExampleCom));
4409 });
4410
4411 // step 4: wait a bit for the 2nd query to enter pending state
4412 usleep(100 * 1000); // 100ms
4413 // step 6: flush cache (will unblock pending queries)
4414 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
4415 t2.join();
4416
4417 // step 8: resume server#1
4418 dns1.setDeferredResp(false);
4419 t1.join();
4420
4421 // step 10: verify if result is correctly cached
4422 dns2.clearQueries();
4423 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4424 EXPECT_EQ(0U, GetNumQueries(dns2, kHelloExampleCom));
4425 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4426}
4427
waynema29253052019-08-20 11:26:08 +08004428// TODO: Perhaps to have a boundary conditions test for TCP and UDP.
4429TEST_F(ResolverTest, TcpQueryWithOversizePayload) {
4430 test::DNSResponder dns;
4431 StartDns(dns, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
4432 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4433
4434 int fd = dns_open_proxy();
4435 ASSERT_TRUE(fd > 0);
4436
4437 // Sending DNS query over TCP once the packet sizes exceed 512 bytes.
4438 // The raw data is combined with Question section and Additional section
4439 // Question section : query "hello.example.com", type A, class IN
4440 // Additional section : type OPT (41), Option PADDING, Option Length 546
4441 // Padding option which allows DNS clients and servers to artificially
4442 // increase the size of a DNS message by a variable number of bytes.
4443 // See also RFC7830, section 3
4444 const std::string query =
4445 "+c0BAAABAAAAAAABBWhlbGxvB2V4YW1wbGUDY29tAAABAAEAACkgAAAAgAACJgAMAiIAAAAAAAAAAAAAAAAAA"
4446 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4447 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4448 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4449 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4450 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4451 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4452 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4453 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
4454 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
4455 const std::string cmd =
4456 "resnsend " + std::to_string(TEST_NETID) + " 0 " /* ResNsendFlags */ + query + '\0';
4457 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
4458 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
4459 expectAnswersValid(fd, AF_INET, kHelloExampleComAddrV4);
4460 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom));
4461 EXPECT_EQ(0U, GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom));
4462}
4463
Ken Chen99344882020-01-01 14:59:38 +08004464TEST_F(ResolverTest, TruncatedRspMode) {
4465 constexpr char listen_addr[] = "127.0.0.4";
4466 constexpr char listen_addr2[] = "127.0.0.5";
4467 constexpr char listen_srv[] = "53";
4468
4469 test::DNSResponder dns(listen_addr, listen_srv, static_cast<ns_rcode>(-1));
4470 test::DNSResponder dns2(listen_addr2, listen_srv, static_cast<ns_rcode>(-1));
4471 // dns supports UDP only, dns2 support UDP and TCP
4472 dns.setResponseProbability(0.0, IPPROTO_TCP);
4473 StartDns(dns, kLargeCnameChainRecords);
4474 StartDns(dns2, kLargeCnameChainRecords);
4475
4476 const struct TestConfig {
4477 const std::optional<int32_t> tcMode;
4478 const bool ret;
4479 const unsigned numQueries;
4480 std::string asParameters() const {
4481 return StringPrintf("tcMode: %d, ret: %s, numQueries: %u", tcMode.value_or(-1),
4482 ret ? "true" : "false", numQueries);
4483 }
4484 } testConfigs[]{
4485 // clang-format off
4486 {std::nullopt, true, 0}, /* mode unset */
4487 {aidl::android::net::IDnsResolver::TC_MODE_DEFAULT, true, 0}, /* default mode */
4488 {aidl::android::net::IDnsResolver::TC_MODE_UDP_TCP, true, 1}, /* alternative mode */
4489 {-666, false, 1}, /* invalid input */
4490 // clang-format on
4491 };
4492
4493 for (const auto& config : testConfigs) {
4494 SCOPED_TRACE(config.asParameters());
4495
4496 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4497 parcel.servers = {listen_addr, listen_addr2};
4498 if (config.tcMode) {
Ken Chena6ac2a62020-04-07 17:25:56 +08004499 parcel.resolverOptions.tcMode = config.tcMode.value();
Ken Chen99344882020-01-01 14:59:38 +08004500 }
4501 ASSERT_EQ(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk(), config.ret);
4502
4503 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4504 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4505 ASSERT_TRUE(result != nullptr);
4506 EXPECT_EQ(ToString(result), kHelloExampleComAddrV4);
4507 // TC_MODE_DEFAULT: resolver retries on TCP-only on each name server.
4508 // TC_MODE_UDP_TCP: resolver retries on TCP on the same server, falls back to UDP from next.
4509 ASSERT_EQ(GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom), 1U);
4510 ASSERT_EQ(GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom), 1U);
4511 ASSERT_EQ(GetNumQueriesForProtocol(dns2, IPPROTO_UDP, kHelloExampleCom), config.numQueries);
4512 ASSERT_EQ(GetNumQueriesForProtocol(dns2, IPPROTO_TCP, kHelloExampleCom), 1U);
4513
4514 dns.clearQueries();
4515 dns2.clearQueries();
4516 ASSERT_TRUE(mDnsClient.resolvService()->flushNetworkCache(TEST_NETID).isOk());
Mike Yu61d17262020-02-15 18:56:22 +08004517
4518 // Clear the stats to make the resolver always choose the same server for the first query.
4519 parcel.servers.clear();
4520 parcel.tlsServers.clear();
4521 ASSERT_EQ(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk(), config.ret);
Ken Chen99344882020-01-01 14:59:38 +08004522 }
4523}
4524
Mike Yu153b5b82020-03-04 19:53:54 +08004525TEST_F(ResolverTest, RepeatedSetup_ResolverStatusRemains) {
4526 constexpr char unusable_listen_addr[] = "127.0.0.3";
4527 constexpr char listen_addr[] = "127.0.0.4";
4528 constexpr char hostname[] = "a.hello.query.";
4529 const auto repeatedSetResolversFromParcel = [&](const ResolverParamsParcel& parcel) {
4530 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4531 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4532 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4533 };
4534
4535 test::DNSResponder dns(listen_addr);
4536 StartDns(dns, {{hostname, ns_type::ns_t_a, "1.2.3.3"}});
4537 test::DnsTlsFrontend tls1(listen_addr, "853", listen_addr, "53");
4538 ASSERT_TRUE(tls1.startServer());
4539
4540 // Private DNS off mode.
4541 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4542 parcel.servers = {unusable_listen_addr, listen_addr};
4543 parcel.tlsServers.clear();
4544 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4545
4546 // Send a query.
4547 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4548 EXPECT_NE(safe_getaddrinfo(hostname, nullptr, &hints), nullptr);
4549
4550 // Check the stats as expected.
4551 const std::vector<NameserverStats> expectedCleartextDnsStats = {
4552 NameserverStats(unusable_listen_addr).setInternalErrors(1),
4553 NameserverStats(listen_addr).setSuccesses(1),
4554 };
Mike Yu61d17262020-02-15 18:56:22 +08004555 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu153b5b82020-03-04 19:53:54 +08004556 EXPECT_EQ(GetNumQueries(dns, hostname), 1U);
4557
4558 // The stats is supposed to remain as long as the list of cleartext DNS servers is unchanged.
4559 static const struct TestConfig {
4560 std::vector<std::string> servers;
4561 std::vector<std::string> tlsServers;
4562 std::string tlsName;
4563 } testConfigs[] = {
4564 // Private DNS opportunistic mode.
4565 {{listen_addr, unusable_listen_addr}, {listen_addr, unusable_listen_addr}, ""},
4566 {{unusable_listen_addr, listen_addr}, {unusable_listen_addr, listen_addr}, ""},
4567
4568 // Private DNS strict mode.
4569 {{listen_addr, unusable_listen_addr}, {"127.0.0.100"}, kDefaultPrivateDnsHostName},
4570 {{unusable_listen_addr, listen_addr}, {"127.0.0.100"}, kDefaultPrivateDnsHostName},
4571
4572 // Private DNS off mode.
4573 {{unusable_listen_addr, listen_addr}, {}, ""},
4574 {{listen_addr, unusable_listen_addr}, {}, ""},
4575 };
4576
4577 for (const auto& config : testConfigs) {
4578 SCOPED_TRACE(fmt::format("testConfig: [{}] [{}] [{}]", fmt::join(config.servers, ","),
4579 fmt::join(config.tlsServers, ","), config.tlsName));
4580 parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4581 parcel.servers = config.servers;
4582 parcel.tlsServers = config.tlsServers;
4583 parcel.tlsName = config.tlsName;
4584 repeatedSetResolversFromParcel(parcel);
Mike Yu61d17262020-02-15 18:56:22 +08004585 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu153b5b82020-03-04 19:53:54 +08004586
4587 // The stats remains when the list of search domains changes.
4588 parcel.domains.push_back("tmp.domains");
4589 repeatedSetResolversFromParcel(parcel);
Mike Yu61d17262020-02-15 18:56:22 +08004590 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu153b5b82020-03-04 19:53:54 +08004591
4592 // The stats remains when the parameters change (except maxSamples).
4593 parcel.sampleValiditySeconds++;
4594 parcel.successThreshold++;
4595 parcel.minSamples++;
4596 parcel.baseTimeoutMsec++;
4597 parcel.retryCount++;
4598 repeatedSetResolversFromParcel(parcel);
Mike Yu61d17262020-02-15 18:56:22 +08004599 EXPECT_TRUE(expectStatsEqualTo(expectedCleartextDnsStats));
Mike Yu153b5b82020-03-04 19:53:54 +08004600 }
4601
4602 // The cache remains.
4603 EXPECT_NE(safe_getaddrinfo(hostname, nullptr, &hints), nullptr);
4604 EXPECT_EQ(GetNumQueries(dns, hostname), 1U);
4605}
4606
4607TEST_F(ResolverTest, RepeatedSetup_NoRedundantPrivateDnsValidation) {
4608 const std::string addr1 = getUniqueIPv4Address(); // For a workable DNS server.
4609 const std::string addr2 = getUniqueIPv4Address(); // For an unresponsive DNS server.
4610 const std::string unusable_addr = getUniqueIPv4Address();
Mike Yubc4b9502020-03-20 13:14:00 +08004611 const auto waitForPrivateDnsStateUpdated = []() {
4612 // A buffer time for the PrivateDnsConfiguration instance to update its map,
4613 // mPrivateDnsValidateThreads, which is used for tracking validation threads.
4614 // Since there is a time gap between when PrivateDnsConfiguration reports
4615 // onPrivateDnsValidationEvent and when PrivateDnsConfiguration updates the map, this is a
4616 // workaround to avoid the test starts a subsequent resolver setup during the time gap.
4617 // TODO: Report onPrivateDnsValidationEvent after all the relevant updates are complete.
4618 // Reference to b/152009023.
4619 std::this_thread::sleep_for(20ms);
4620 };
Mike Yu153b5b82020-03-04 19:53:54 +08004621
4622 test::DNSResponder dns1(addr1);
4623 test::DNSResponder dns2(addr2);
4624 StartDns(dns1, {});
4625 StartDns(dns2, {});
4626 test::DnsTlsFrontend workableTls(addr1, "853", addr1, "53");
4627 test::DnsTlsFrontend unresponsiveTls(addr2, "853", addr2, "53");
4628 unresponsiveTls.setHangOnHandshakeForTesting(true);
4629 ASSERT_TRUE(workableTls.startServer());
4630 ASSERT_TRUE(unresponsiveTls.startServer());
4631
4632 // First setup.
4633 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4634 parcel.servers = {addr1, addr2, unusable_addr};
4635 parcel.tlsServers = {addr1, addr2, unusable_addr};
4636 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4637
4638 // Check the validation results.
4639 EXPECT_TRUE(WaitForPrivateDnsValidation(workableTls.listen_address(), true));
4640 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4641 EXPECT_EQ(unresponsiveTls.acceptConnectionsCount(), 1); // The validation is still in progress.
4642
4643 static const struct TestConfig {
4644 std::vector<std::string> tlsServers;
4645 std::string tlsName;
4646 } testConfigs[] = {
4647 {{addr1, addr2, unusable_addr}, ""},
4648 {{unusable_addr, addr1, addr2}, ""},
4649 {{unusable_addr, addr1, addr2}, kDefaultPrivateDnsHostName},
4650 {{addr1, addr2, unusable_addr}, kDefaultPrivateDnsHostName},
4651 };
4652
4653 std::string TlsNameLastTime;
4654 for (const auto& config : testConfigs) {
4655 SCOPED_TRACE(fmt::format("testConfig: [{}] [{}]", fmt::join(config.tlsServers, ","),
4656 config.tlsName));
4657 parcel.servers = config.tlsServers;
4658 parcel.tlsServers = config.tlsServers;
4659 parcel.tlsName = config.tlsName;
4660 parcel.caCertificate = config.tlsName.empty() ? "" : kCaCert;
4661
4662 const bool dnsModeChanged = (TlsNameLastTime != config.tlsName);
Mike Yubc4b9502020-03-20 13:14:00 +08004663
4664 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004665 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4666
4667 for (const auto& serverAddr : parcel.tlsServers) {
4668 SCOPED_TRACE(serverAddr);
4669 if (serverAddr == workableTls.listen_address()) {
4670 if (dnsModeChanged) {
4671 // In despite of the identical IP address, the server is regarded as a different
4672 // server when DnsTlsServer.name is different. The resolver treats it as a
4673 // different object and begins the validation process.
4674 EXPECT_TRUE(WaitForPrivateDnsValidation(serverAddr, true));
4675 }
4676 } else if (serverAddr == unresponsiveTls.listen_address()) {
4677 // No revalidation needed for the server which have been marked as in_progesss.
4678 } else {
4679 // Must be unusable_addr.
4680 // In opportunistic mode, when a validation for a private DNS server fails, the
4681 // resolver just marks the server as failed and doesn't re-evaluate it, but the
4682 // server can be re-evaluated when setResolverConfiguration() is called.
4683 // However, in strict mode, the resolver automatically re-evaluates the server and
4684 // marks the server as in_progress until the validation succeeds, so repeated setup
4685 // makes no effect.
4686 if (dnsModeChanged || config.tlsName.empty() /* not in strict mode */) {
4687 EXPECT_TRUE(WaitForPrivateDnsValidation(serverAddr, false));
4688 }
4689 }
4690 }
4691
4692 // Repeated setups make no effect in strict mode.
Mike Yubc4b9502020-03-20 13:14:00 +08004693 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004694 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4695 if (config.tlsName.empty()) {
4696 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4697 }
Mike Yubc4b9502020-03-20 13:14:00 +08004698 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004699 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4700 if (config.tlsName.empty()) {
4701 EXPECT_TRUE(WaitForPrivateDnsValidation(unusable_addr, false));
4702 }
4703
4704 EXPECT_EQ(unresponsiveTls.acceptConnectionsCount(), 1);
4705
4706 TlsNameLastTime = config.tlsName;
4707 }
4708
4709 // Check that all the validation results are caught.
4710 // Note: it doesn't mean no validation being in progress.
4711 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr1));
4712 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr2));
4713 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(unusable_addr));
4714}
4715
4716TEST_F(ResolverTest, RepeatedSetup_KeepChangingPrivateDnsServers) {
4717 enum TlsServerState { WORKING, UNSUPPORTED, UNRESPONSIVE };
4718 const std::string addr1 = getUniqueIPv4Address();
4719 const std::string addr2 = getUniqueIPv4Address();
Mike Yu9a185882020-03-25 16:02:36 +08004720 const auto waitForPrivateDnsStateUpdated = []() {
4721 // A buffer time for PrivateDnsConfiguration to update its state. It prevents this test
4722 // being flaky. See b/152009023 for the reason.
4723 std::this_thread::sleep_for(20ms);
4724 };
Mike Yu153b5b82020-03-04 19:53:54 +08004725
4726 test::DNSResponder dns1(addr1);
4727 test::DNSResponder dns2(addr2);
4728 StartDns(dns1, {});
4729 StartDns(dns2, {});
4730 test::DnsTlsFrontend tls1(addr1, "853", addr1, "53");
4731 test::DnsTlsFrontend tls2(addr2, "853", addr2, "53");
4732 ASSERT_TRUE(tls1.startServer());
4733 ASSERT_TRUE(tls2.startServer());
4734
4735 static const struct TestConfig {
4736 std::string tlsServer;
4737 std::string tlsName;
4738 bool expectNothingHappenWhenServerUnsupported;
4739 bool expectNothingHappenWhenServerUnresponsive;
4740 std::string asTestName() const {
4741 return fmt::format("{}, {}, {}, {}", tlsServer, tlsName,
4742 expectNothingHappenWhenServerUnsupported,
4743 expectNothingHappenWhenServerUnresponsive);
4744 }
4745 } testConfigs[] = {
4746 {{addr1}, "", false, false},
4747 {{addr2}, "", false, false},
4748 {{addr1}, "", false, true},
4749 {{addr2}, "", false, true},
4750 {{addr1}, kDefaultPrivateDnsHostName, false, true},
4751 {{addr2}, kDefaultPrivateDnsHostName, false, true},
4752 {{addr1}, kDefaultPrivateDnsHostName, true, true},
4753 {{addr2}, kDefaultPrivateDnsHostName, true, true},
4754
4755 // There's no new validation to start because there are already two validation threads
4756 // running (one is for addr1, the other is for addr2). This is because the comparator
4757 // doesn't compare DnsTlsServer.name. Keep the design as-is until it's known to be
4758 // harmful.
4759 {{addr1}, "", true, true},
4760 {{addr2}, "", true, true},
4761 {{addr1}, "", true, true},
4762 {{addr2}, "", true, true},
4763 };
4764
4765 for (const auto& serverState : {WORKING, UNSUPPORTED, UNRESPONSIVE}) {
4766 int testIndex = 0;
4767 for (const auto& config : testConfigs) {
4768 SCOPED_TRACE(fmt::format("serverState:{} testIndex:{} testConfig:[{}]", serverState,
4769 testIndex++, config.asTestName()));
4770 auto& tls = (config.tlsServer == addr1) ? tls1 : tls2;
4771
4772 if (serverState == UNSUPPORTED && tls.running()) ASSERT_TRUE(tls.stopServer());
4773 if (serverState != UNSUPPORTED && !tls.running()) ASSERT_TRUE(tls.startServer());
4774
4775 tls.setHangOnHandshakeForTesting(serverState == UNRESPONSIVE);
4776 const int connectCountsBefore = tls.acceptConnectionsCount();
4777
Mike Yu9a185882020-03-25 16:02:36 +08004778 waitForPrivateDnsStateUpdated();
Mike Yu153b5b82020-03-04 19:53:54 +08004779 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4780 parcel.servers = {config.tlsServer};
4781 parcel.tlsServers = {config.tlsServer};
4782 parcel.tlsName = config.tlsName;
4783 parcel.caCertificate = config.tlsName.empty() ? "" : kCaCert;
4784 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(parcel));
4785
4786 if (serverState == WORKING) {
4787 EXPECT_TRUE(WaitForPrivateDnsValidation(config.tlsServer, true));
4788 } else if (serverState == UNSUPPORTED) {
4789 if (config.expectNothingHappenWhenServerUnsupported) {
4790 // It's possible that the resolver hasn't yet started to
4791 // connect. Wait a while.
4792 // TODO: See if we can get rid of the hard waiting time, such as comparing
4793 // the CountDiff across two tests.
4794 std::this_thread::sleep_for(100ms);
4795 EXPECT_EQ(tls.acceptConnectionsCount(), connectCountsBefore);
4796 } else {
4797 EXPECT_TRUE(WaitForPrivateDnsValidation(config.tlsServer, false));
4798 }
4799 } else {
4800 // Must be UNRESPONSIVE.
4801 // DnsTlsFrontend is the only signal for checking whether or not the resolver starts
4802 // another validation when the server is unresponsive.
4803 const int expectCountDiff =
4804 config.expectNothingHappenWhenServerUnresponsive ? 0 : 1;
4805 if (expectCountDiff == 0) {
4806 // It's possible that the resolver hasn't yet started to
4807 // connect. Wait a while.
4808 std::this_thread::sleep_for(100ms);
4809 }
4810 const auto condition = [&]() {
4811 return tls.acceptConnectionsCount() == connectCountsBefore + expectCountDiff;
4812 };
4813 EXPECT_TRUE(PollForCondition(condition));
4814 }
4815 }
4816
4817 // Set to off mode to reset the PrivateDnsConfiguration state.
4818 ResolverParamsParcel setupOffmode = DnsResponderClient::GetDefaultResolverParamsParcel();
4819 setupOffmode.tlsServers.clear();
4820 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(setupOffmode));
4821 }
4822
4823 // Check that all the validation results are caught.
4824 // Note: it doesn't mean no validation being in progress.
4825 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr1));
4826 EXPECT_FALSE(hasUncaughtPrivateDnsValidation(addr2));
4827}
4828
Ken Chen26dc2b02020-06-16 18:49:39 +08004829TEST_F(ResolverTest, PermissionCheckOnCertificateInjection) {
4830 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
4831 parcel.caCertificate = kCaCert;
4832 ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk());
4833
4834 for (const uid_t uid : {AID_SYSTEM, TEST_UID}) {
4835 ScopedChangeUID scopedChangeUID(uid);
4836 auto status = mDnsClient.resolvService()->setResolverConfiguration(parcel);
4837 EXPECT_EQ(status.getExceptionCode(), EX_SECURITY);
4838 }
4839}
4840
Hungming Chenbb90ab32019-10-28 18:20:31 +08004841// Parameterized tests.
4842// TODO: Merge the existing tests as parameterized test if possible.
4843// TODO: Perhaps move parameterized tests to an independent file.
4844enum class CallType { GETADDRINFO, GETHOSTBYNAME };
4845class ResolverParameterizedTest : public ResolverTest,
Hungming Chen63779052019-10-30 15:06:13 +08004846 public testing::WithParamInterface<CallType> {
4847 protected:
Hungming Chen22617fd2019-12-06 12:15:45 +08004848 void VerifyQueryHelloExampleComV4(const test::DNSResponder& dns, const CallType calltype,
4849 const bool verifyNumQueries = true) {
Hungming Chen63779052019-10-30 15:06:13 +08004850 if (calltype == CallType::GETADDRINFO) {
4851 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
4852 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
4853 ASSERT_TRUE(result != nullptr);
4854 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4855 } else if (calltype == CallType::GETHOSTBYNAME) {
4856 const hostent* result = gethostbyname("hello");
4857 ASSERT_TRUE(result != nullptr);
4858 ASSERT_EQ(4, result->h_length);
4859 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
4860 EXPECT_EQ(kHelloExampleComAddrV4, ToString(result));
4861 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
4862 } else {
4863 FAIL() << "Unsupported call type: " << static_cast<uint32_t>(calltype);
4864 }
Hungming Chen22617fd2019-12-06 12:15:45 +08004865 if (verifyNumQueries) EXPECT_EQ(1U, GetNumQueries(dns, kHelloExampleCom));
Hungming Chen63779052019-10-30 15:06:13 +08004866 }
4867};
Hungming Chenbb90ab32019-10-28 18:20:31 +08004868
Hungming Chen63779052019-10-30 15:06:13 +08004869INSTANTIATE_TEST_SUITE_P(QueryCallTest, ResolverParameterizedTest,
Hungming Chenbb90ab32019-10-28 18:20:31 +08004870 testing::Values(CallType::GETADDRINFO, CallType::GETHOSTBYNAME),
4871 [](const testing::TestParamInfo<CallType>& info) {
Hungming Chenbb90ab32019-10-28 18:20:31 +08004872 switch (info.param) {
4873 case CallType::GETADDRINFO:
Hungming Chen63779052019-10-30 15:06:13 +08004874 return "GetAddrInfo";
Hungming Chenbb90ab32019-10-28 18:20:31 +08004875 case CallType::GETHOSTBYNAME:
Hungming Chen63779052019-10-30 15:06:13 +08004876 return "GetHostByName";
Hungming Chenbb90ab32019-10-28 18:20:31 +08004877 default:
Hungming Chen63779052019-10-30 15:06:13 +08004878 return "InvalidParameter"; // Should not happen.
Hungming Chenbb90ab32019-10-28 18:20:31 +08004879 }
Hungming Chenbb90ab32019-10-28 18:20:31 +08004880 });
4881
4882TEST_P(ResolverParameterizedTest, AuthoritySectionAndAdditionalSection) {
4883 // DNS response may have more information in authority section and additional section.
4884 // Currently, getanswer() of packages/modules/DnsResolver/getaddrinfo.cpp doesn't parse the
4885 // content of authority section and additional section. Test these sections if they crash
4886 // the resolver, just in case. See also RFC 1035 section 4.1.
4887 const auto& calltype = GetParam();
4888 test::DNSHeader header(kDefaultDnsHeader);
4889
4890 // Create a DNS response which has a authoritative nameserver record in authority
4891 // section and its relevant address record in additional section.
4892 //
4893 // Question
4894 // hello.example.com. IN A
4895 // Answer
4896 // hello.example.com. IN A 1.2.3.4
4897 // Authority:
4898 // hello.example.com. IN NS ns1.example.com.
4899 // Additional:
4900 // ns1.example.com. IN A 5.6.7.8
4901 //
4902 // A response may have only question, answer, and authority section. Current testing response
4903 // should be able to cover this condition.
4904
4905 // Question section.
4906 test::DNSQuestion question{
4907 .qname = {.name = kHelloExampleCom},
4908 .qtype = ns_type::ns_t_a,
4909 .qclass = ns_c_in,
4910 };
4911 header.questions.push_back(std::move(question));
4912
4913 // Answer section.
4914 test::DNSRecord recordAnswer{
4915 .name = {.name = kHelloExampleCom},
4916 .rtype = ns_type::ns_t_a,
4917 .rclass = ns_c_in,
4918 .ttl = 0, // no cache
4919 };
Hungming Chen63779052019-10-30 15:06:13 +08004920 EXPECT_TRUE(test::DNSResponder::fillRdata(kHelloExampleComAddrV4, recordAnswer));
Hungming Chenbb90ab32019-10-28 18:20:31 +08004921 header.answers.push_back(std::move(recordAnswer));
4922
4923 // Authority section.
4924 test::DNSRecord recordAuthority{
4925 .name = {.name = kHelloExampleCom},
4926 .rtype = ns_type::ns_t_ns,
4927 .rclass = ns_c_in,
4928 .ttl = 0, // no cache
4929 };
4930 EXPECT_TRUE(test::DNSResponder::fillRdata("ns1.example.com.", recordAuthority));
4931 header.authorities.push_back(std::move(recordAuthority));
4932
4933 // Additional section.
4934 test::DNSRecord recordAdditional{
4935 .name = {.name = "ns1.example.com."},
4936 .rtype = ns_type::ns_t_a,
4937 .rclass = ns_c_in,
4938 .ttl = 0, // no cache
4939 };
4940 EXPECT_TRUE(test::DNSResponder::fillRdata("5.6.7.8", recordAdditional));
4941 header.additionals.push_back(std::move(recordAdditional));
4942
4943 // Start DNS server.
4944 test::DNSResponder dns(test::DNSResponder::MappingType::DNS_HEADER);
4945 dns.addMappingDnsHeader(kHelloExampleCom, ns_type::ns_t_a, header);
4946 ASSERT_TRUE(dns.startServer());
4947 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
4948 dns.clearQueries();
4949
4950 // Expect that get the address and the resolver doesn't crash.
Hungming Chen63779052019-10-30 15:06:13 +08004951 VerifyQueryHelloExampleComV4(dns, calltype);
4952}
4953
4954TEST_P(ResolverParameterizedTest, MessageCompression) {
4955 const auto& calltype = GetParam();
4956
4957 // The response with compressed domain name by a pointer. See RFC 1035 section 4.1.4.
4958 //
4959 // Ignoring the other fields of the message, the domain name of question section and answer
4960 // section are presented as:
4961 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4962 // 12 | 5 | h |
4963 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4964 // 14 | e | l |
4965 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4966 // 16 | l | o |
4967 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4968 // 18 | 7 | e |
4969 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4970 // 20 | x | a |
4971 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4972 // 22 | m | p |
4973 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4974 // 24 | l | e |
4975 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4976 // 26 | 3 | c |
4977 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4978 // 28 | o | m |
4979 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4980 // 30 | 0 | ... |
4981 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4982 //
4983 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4984 // 35 | 1 1| 12 |
4985 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
4986 const std::vector<uint8_t> kResponseAPointer = {
4987 /* Header */
4988 0x00, 0x00, /* Transaction ID: 0x0000 */
4989 0x81, 0x80, /* Flags: qr rd ra */
4990 0x00, 0x01, /* Questions: 1 */
4991 0x00, 0x01, /* Answer RRs: 1 */
4992 0x00, 0x00, /* Authority RRs: 0 */
4993 0x00, 0x00, /* Additional RRs: 0 */
4994 /* Queries */
4995 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
4996 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name: hello.example.com */
4997 0x00, 0x01, /* Type: A */
4998 0x00, 0x01, /* Class: IN */
4999 /* Answers */
5000 0xc0, 0x0c, /* Name: hello.example.com (a pointer) */
5001 0x00, 0x01, /* Type: A */
5002 0x00, 0x01, /* Class: IN */
5003 0x00, 0x00, 0x00, 0x00, /* Time to live: 0 */
5004 0x00, 0x04, /* Data length: 4 */
5005 0x01, 0x02, 0x03, 0x04 /* Address: 1.2.3.4 */
5006 };
5007
5008 // The response with compressed domain name by a sequence of labels ending with a pointer. See
5009 // RFC 1035 section 4.1.4.
5010 //
5011 // Ignoring the other fields of the message, the domain name of question section and answer
5012 // section are presented as:
5013 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5014 // 12 | 5 | h |
5015 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5016 // 14 | e | l |
5017 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5018 // 16 | l | o |
5019 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5020 // 18 | 7 | e |
5021 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5022 // 20 | x | a |
5023 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5024 // 22 | m | p |
5025 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5026 // 24 | l | e |
5027 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5028 // 26 | 3 | c |
5029 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5030 // 28 | o | m |
5031 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5032 // 30 | 0 | ... |
5033 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5034 //
5035 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5036 // 35 | 5 | h |
5037 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5038 // 37 | e | l |
5039 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5040 // 39 | l | o |
5041 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5042 // 41 | 1 1| 18 |
5043 // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
5044 const std::vector<uint8_t> kResponseLabelEndingWithAPointer = {
5045 /* Header */
5046 0x00, 0x00, /* Transaction ID: 0x0000 */
5047 0x81, 0x80, /* Flags: qr rd ra */
5048 0x00, 0x01, /* Questions: 1 */
5049 0x00, 0x01, /* Answer RRs: 1 */
5050 0x00, 0x00, /* Authority RRs: 0 */
5051 0x00, 0x00, /* Additional RRs: 0 */
5052 /* Queries */
5053 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
5054 0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name: hello.example.com */
5055 0x00, 0x01, /* Type: A */
5056 0x00, 0x01, /* Class: IN */
5057 /* Answers */
5058 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0xc0,
5059 0x12, /* Name: hello.example.com (a label ending with a pointer) */
5060 0x00, 0x01, /* Type: A */
5061 0x00, 0x01, /* Class: IN */
5062 0x00, 0x00, 0x00, 0x00, /* Time to live: 0 */
5063 0x00, 0x04, /* Data length: 4 */
5064 0x01, 0x02, 0x03, 0x04 /* Address: 1.2.3.4 */
5065 };
5066
5067 for (const auto& response : {kResponseAPointer, kResponseLabelEndingWithAPointer}) {
5068 SCOPED_TRACE(StringPrintf("Hex dump: %s", toHex(makeSlice(response)).c_str()));
5069
5070 test::DNSResponder dns(test::DNSResponder::MappingType::BINARY_PACKET);
5071 dns.addMappingBinaryPacket(kHelloExampleComQueryV4, response);
5072 StartDns(dns, {});
5073 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
5074
5075 // Expect no cache because the TTL of testing responses are 0.
5076 VerifyQueryHelloExampleComV4(dns, calltype);
Hungming Chenbb90ab32019-10-28 18:20:31 +08005077 }
Mike Yu40e67072019-10-09 21:14:09 +08005078}
Hungming Chen22617fd2019-12-06 12:15:45 +08005079
5080TEST_P(ResolverParameterizedTest, TruncatedResponse) {
5081 const auto& calltype = GetParam();
5082
Hungming Chen22617fd2019-12-06 12:15:45 +08005083 test::DNSResponder dns;
Ken Chen99344882020-01-01 14:59:38 +08005084 StartDns(dns, kLargeCnameChainRecords);
Hungming Chen22617fd2019-12-06 12:15:45 +08005085 ASSERT_TRUE(mDnsClient.SetResolversForNetwork());
5086
5087 // Expect UDP response is truncated. The resolver retries over TCP. See RFC 1035 section 4.2.1.
5088 VerifyQueryHelloExampleComV4(dns, calltype, false);
5089 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_UDP, kHelloExampleCom));
5090 EXPECT_EQ(1U, GetNumQueriesForProtocol(dns, IPPROTO_TCP, kHelloExampleCom));
5091}
Luke Huang420ee622019-11-27 17:52:44 +08005092
5093TEST_F(ResolverTest, KeepListeningUDP) {
5094 constexpr char listen_addr1[] = "127.0.0.4";
5095 constexpr char listen_addr2[] = "127.0.0.5";
5096 constexpr char host_name[] = "howdy.example.com.";
5097 const std::vector<DnsRecord> records = {
5098 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
5099 };
5100 const std::vector<int> params = {300, 25, 8, 8, 1000 /* BASE_TIMEOUT_MSEC */,
5101 1 /* retry count */};
5102 const int delayTimeMs = 1500;
5103
5104 test::DNSResponder neverRespondDns(listen_addr2, "53", static_cast<ns_rcode>(-1));
5105 neverRespondDns.setResponseProbability(0.0);
5106 StartDns(neverRespondDns, records);
Luke Huangf40df9c2020-04-21 08:51:48 +08005107 ScopedSystemProperties scopedSystemProperties(
5108 "persist.device_config.netd_native.keep_listening_udp", "1");
5109 // Re-setup test network to make experiment flag take effect.
5110 resetNetwork();
Luke Huang420ee622019-11-27 17:52:44 +08005111
5112 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr1, listen_addr2},
5113 kDefaultSearchDomains, params));
5114 // There are 2 DNS servers for this test.
5115 // |delayedDns| will be blocked for |delayTimeMs|, then start to respond to requests.
5116 // |neverRespondDns| will never respond.
5117 // In the first try, resolver will send query to |delayedDns| but get timeout error
5118 // because |delayTimeMs| > DNS timeout.
5119 // Then it's the second try, resolver will send query to |neverRespondDns| and
5120 // listen on both servers. Resolver will receive the answer coming from |delayedDns|.
Luke Huang420ee622019-11-27 17:52:44 +08005121
Luke Huang420ee622019-11-27 17:52:44 +08005122 test::DNSResponder delayedDns(listen_addr1);
5123 delayedDns.setResponseDelayMs(delayTimeMs);
5124 StartDns(delayedDns, records);
5125
5126 // Specify hints to ensure resolver doing query only 1 round.
5127 const addrinfo hints = {.ai_family = AF_INET6, .ai_socktype = SOCK_DGRAM};
5128 ScopedAddrinfo result = safe_getaddrinfo(host_name, nullptr, &hints);
5129 EXPECT_TRUE(result != nullptr);
5130
5131 std::string result_str = ToString(result);
5132 EXPECT_TRUE(result_str == "::1.2.3.4") << ", result_str='" << result_str << "'";
5133}
Luke Huang0a0870d2020-02-12 20:41:10 +08005134
5135TEST_F(ResolverTest, GetAddrInfoParallelLookupTimeout) {
5136 constexpr char listen_addr[] = "127.0.0.4";
5137 constexpr char host_name[] = "howdy.example.com.";
5138 constexpr int TIMING_TOLERANCE_MS = 200;
5139 constexpr int DNS_TIMEOUT_MS = 1000;
5140 const std::vector<DnsRecord> records = {
5141 {host_name, ns_type::ns_t_a, "1.2.3.4"},
5142 {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"},
5143 };
5144 const std::vector<int> params = {300, 25, 8, 8, DNS_TIMEOUT_MS /* BASE_TIMEOUT_MSEC */,
5145 1 /* retry count */};
5146 test::DNSResponder neverRespondDns(listen_addr, "53", static_cast<ns_rcode>(-1));
5147 neverRespondDns.setResponseProbability(0.0);
5148 StartDns(neverRespondDns, records);
Luke Huangf40df9c2020-04-21 08:51:48 +08005149 ScopedSystemProperties scopedSystemProperties(
5150 "persist.device_config.netd_native.parallel_lookup", "1");
Luke Huangd1d734f2020-04-30 12:25:40 +08005151 // The default value of parallel_lookup_sleep_time should be very small
5152 // that we can ignore in this test case.
Luke Huangf40df9c2020-04-21 08:51:48 +08005153 // Re-setup test network to make experiment flag take effect.
5154 resetNetwork();
Luke Huang0a0870d2020-02-12 20:41:10 +08005155
5156 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}, kDefaultSearchDomains, params));
5157 neverRespondDns.clearQueries();
5158
Luke Huang0a0870d2020-02-12 20:41:10 +08005159 // Use a never respond DNS server to verify if the A/AAAA queries are sent in parallel.
5160 // The resolver parameters are set to timeout 1s and retry 1 times.
5161 // So we expect the safe_getaddrinfo_time_taken() might take ~1s to
5162 // return when parallel lookup is enabled. And the DNS server should receive 2 queries.
5163 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_DGRAM};
5164 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(host_name, nullptr, hints);
5165
5166 EXPECT_TRUE(result == nullptr);
5167 EXPECT_NEAR(DNS_TIMEOUT_MS, timeTakenMs, TIMING_TOLERANCE_MS)
5168 << "took time should approximate equal timeout";
5169 EXPECT_EQ(2U, GetNumQueries(neverRespondDns, host_name));
Mike Yu532405f2020-06-17 17:46:44 +08005170 ExpectDnsEvent(INetdEventListener::EVENT_GETADDRINFO, RCODE_TIMEOUT, host_name, {});
Luke Huang0a0870d2020-02-12 20:41:10 +08005171}
Luke Huangd1d734f2020-04-30 12:25:40 +08005172
5173TEST_F(ResolverTest, GetAddrInfoParallelLookupSleepTime) {
5174 constexpr char listen_addr[] = "127.0.0.4";
5175 constexpr int TIMING_TOLERANCE_MS = 200;
5176 const std::vector<DnsRecord> records = {
5177 {kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4},
5178 {kHelloExampleCom, ns_type::ns_t_aaaa, kHelloExampleComAddrV6},
5179 };
5180 const std::vector<int> params = {300, 25, 8, 8, 1000 /* BASE_TIMEOUT_MSEC */,
5181 1 /* retry count */};
5182 test::DNSResponder dns(listen_addr);
5183 StartDns(dns, records);
5184 ScopedSystemProperties scopedSystemProperties1(
5185 "persist.device_config.netd_native.parallel_lookup", "1");
5186 constexpr int PARALLEL_LOOKUP_SLEEP_TIME_MS = 500;
5187 ScopedSystemProperties scopedSystemProperties2(
5188 "persist.device_config.netd_native.parallel_lookup_sleep_time",
5189 std::to_string(PARALLEL_LOOKUP_SLEEP_TIME_MS));
5190 // Re-setup test network to make experiment flag take effect.
5191 resetNetwork();
5192
5193 ASSERT_TRUE(mDnsClient.SetResolversForNetwork({listen_addr}, kDefaultSearchDomains, params));
5194 dns.clearQueries();
5195
5196 // Expect the safe_getaddrinfo_time_taken() might take ~500ms to return because we set
5197 // parallel_lookup_sleep_time to 500ms.
5198 const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_DGRAM};
5199 auto [result, timeTakenMs] = safe_getaddrinfo_time_taken(kHelloExampleCom, nullptr, hints);
5200
5201 EXPECT_NE(nullptr, result);
5202 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(
5203 {kHelloExampleComAddrV4, kHelloExampleComAddrV6}));
5204 EXPECT_NEAR(PARALLEL_LOOKUP_SLEEP_TIME_MS, timeTakenMs, TIMING_TOLERANCE_MS)
5205 << "took time should approximate equal timeout";
5206 EXPECT_EQ(2U, GetNumQueries(dns, kHelloExampleCom));
5207
5208 // Expect the PARALLEL_LOOKUP_SLEEP_TIME_MS won't affect the query under cache hit case.
5209 dns.clearQueries();
5210 std::tie(result, timeTakenMs) = safe_getaddrinfo_time_taken(kHelloExampleCom, nullptr, hints);
5211 EXPECT_NE(nullptr, result);
5212 EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray(
5213 {kHelloExampleComAddrV4, kHelloExampleComAddrV6}));
5214 EXPECT_GT(PARALLEL_LOOKUP_SLEEP_TIME_MS, timeTakenMs);
5215 EXPECT_EQ(0U, GetNumQueries(dns, kHelloExampleCom));
5216}
Luke Huangeb618ef2020-05-26 14:17:02 +08005217
5218TEST_F(ResolverTest, BlockDnsQueryUidDoesNotLeadToBadServer) {
5219 // This test relies on blocking traffic on loopback, which xt_qtaguid does not do.
5220 // See aosp/358413 and b/34444781 for why.
5221 SKIP_IF_BPF_NOT_SUPPORTED;
5222
5223 constexpr char listen_addr1[] = "127.0.0.4";
5224 constexpr char listen_addr2[] = "::1";
5225 test::DNSResponder dns1(listen_addr1);
5226 test::DNSResponder dns2(listen_addr2);
5227 StartDns(dns1, {});
5228 StartDns(dns2, {});
5229
5230 std::vector<std::string> servers = {listen_addr1, listen_addr2};
5231 ASSERT_TRUE(mDnsClient.SetResolversForNetwork(servers));
5232 dns1.clearQueries();
5233 dns2.clearQueries();
5234 {
5235 ScopeBlockedUIDRule scopeBlockUidRule(mDnsClient.netdService(), TEST_UID);
5236 // Start querying ten times.
5237 for (int i = 0; i < 10; i++) {
5238 std::string hostName = fmt::format("blocked{}.com", i);
5239 const addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
Luke Huang5729afc2020-07-30 23:12:17 +08005240 // The query result between R+ and Q would be different, but we don't really care
5241 // about the result here because this test is only used to ensure blocked uid rule
5242 // won't cause bad servers.
5243 safe_getaddrinfo(hostName.c_str(), nullptr, &hints);
Luke Huangeb618ef2020-05-26 14:17:02 +08005244 }
5245 }
Luke Huang5729afc2020-07-30 23:12:17 +08005246 ResolverParamsParcel setupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
5247 // If api level >= 30 (R+), expect all query packets to be blocked, hence we should not see any
5248 // of their stats show up. Otherwise, all queries should succeed.
5249 const std::vector<NameserverStats> expectedDnsStats = {
5250 NameserverStats(listen_addr1).setSuccesses(isAtLeastR ? 0 : setupParams.maxSamples),
Luke Huangeb618ef2020-05-26 14:17:02 +08005251 NameserverStats(listen_addr2),
5252 };
Luke Huang5729afc2020-07-30 23:12:17 +08005253 expectStatsEqualTo(expectedDnsStats);
5254 // If api level >= 30 (R+), expect server won't receive any queries,
5255 // otherwise expect 20 == 10 * (setupParams.domains.size() + 1) queries.
5256 EXPECT_EQ(dns1.queries().size(), isAtLeastR ? 0U : 10 * (setupParams.domains.size() + 1));
Luke Huangeb618ef2020-05-26 14:17:02 +08005257 EXPECT_EQ(dns2.queries().size(), 0U);
5258}
Mike Yu6ce587d2019-12-19 21:30:22 +08005259
Mike Yu10832aa2020-08-25 19:13:11 +08005260TEST_F(ResolverTest, DnsServerSelection) {
5261 test::DNSResponder dns1("127.0.0.3");
5262 test::DNSResponder dns2("127.0.0.4");
5263 test::DNSResponder dns3("127.0.0.5");
5264
5265 dns1.setResponseDelayMs(10);
5266 dns2.setResponseDelayMs(25);
5267 dns3.setResponseDelayMs(50);
5268 StartDns(dns1, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
5269 StartDns(dns2, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
5270 StartDns(dns3, {{kHelloExampleCom, ns_type::ns_t_a, kHelloExampleComAddrV4}});
5271
5272 ScopedSystemProperties scopedSystemProperties(kSortNameserversFlag, "1");
5273
Mike Yueb8f22c2020-09-22 11:58:13 +08005274 // NOTE: the servers must be sorted alphabetically.
5275 std::vector<std::string> serverList = {
5276 dns1.listen_address(),
5277 dns2.listen_address(),
5278 dns3.listen_address(),
Mike Yu10832aa2020-08-25 19:13:11 +08005279 };
Mike Yueb8f22c2020-09-22 11:58:13 +08005280
5281 do {
Mike Yu10832aa2020-08-25 19:13:11 +08005282 SCOPED_TRACE(fmt::format("testConfig: [{}]", fmt::join(serverList, ", ")));
5283 const int queryNum = 50;
5284 int64_t accumulatedTime = 0;
5285
5286 // Restart the testing network to 1) make the flag take effect and 2) reset the statistics.
5287 resetNetwork();
5288
5289 // DnsServerSelection doesn't apply to private DNS.
5290 ResolverParamsParcel setupParams = DnsResponderClient::GetDefaultResolverParamsParcel();
5291 setupParams.servers = serverList;
5292 setupParams.tlsServers.clear();
5293 ASSERT_TRUE(mDnsClient.SetResolversFromParcel(setupParams));
5294
5295 // DNSResponder doesn't handle queries concurrently, so don't allow more than
5296 // one in-flight query.
5297 for (int i = 0; i < queryNum; i++) {
5298 Stopwatch s;
5299 int fd = resNetworkQuery(TEST_NETID, kHelloExampleCom, ns_c_in, ns_t_a,
5300 ANDROID_RESOLV_NO_CACHE_LOOKUP);
5301 expectAnswersValid(fd, AF_INET, kHelloExampleComAddrV4);
5302 accumulatedTime += s.timeTakenUs();
5303 }
5304
5305 const int dns1Count = dns1.queries().size();
5306 const int dns2Count = dns2.queries().size();
5307 const int dns3Count = dns3.queries().size();
5308
5309 // All of the servers have ever been selected. In addition, the less latency server
5310 // is selected more frequently.
5311 EXPECT_GT(dns1Count, 0);
5312 EXPECT_GT(dns2Count, 0);
5313 EXPECT_GT(dns3Count, 0);
5314 EXPECT_GT(dns1Count, dns2Count);
5315 EXPECT_GT(dns2Count, dns3Count);
5316
Mike Yueb8f22c2020-09-22 11:58:13 +08005317 const int averageTime = accumulatedTime / queryNum;
5318 LOG(INFO) << "ResolverTest#DnsServerSelection: averageTime " << averageTime << "us";
Mike Yu10832aa2020-08-25 19:13:11 +08005319
Mike Yueb8f22c2020-09-22 11:58:13 +08005320 // Since the average Time might differ depending on parameters, set [10ms, 20ms] as
Mike Yu10832aa2020-08-25 19:13:11 +08005321 // acceptable range.
Mike Yueb8f22c2020-09-22 11:58:13 +08005322 EXPECT_GE(averageTime, 10000);
5323 EXPECT_LE(averageTime, 20000);
Mike Yu10832aa2020-08-25 19:13:11 +08005324
5325 dns1.clearQueries();
5326 dns2.clearQueries();
5327 dns3.clearQueries();
Mike Yueb8f22c2020-09-22 11:58:13 +08005328 } while (std::next_permutation(serverList.begin(), serverList.end()));
Mike Yu10832aa2020-08-25 19:13:11 +08005329}
5330
Mike Yu6ce587d2019-12-19 21:30:22 +08005331// ResolverMultinetworkTest is used to verify multinetwork functionality. Here's how it works:
5332// The resolver sends queries to address A, and then there will be a TunForwarder helping forward
5333// the packets to address B, which is the address on which the testing server is listening. The
5334// answer packets responded from the testing server go through the reverse path back to the
5335// resolver.
5336//
5337// To achieve the that, it needs to set up a interface with routing rules. Tests are not
5338// supposed to initiate DNS servers on their own; instead, some utilities are added to the class to
5339// help the setup.
5340//
5341// An example of how to use it:
5342// TEST_F() {
Luke Huang81568fb2020-07-13 00:55:12 +08005343// ScopedPhysicalNetwork network = CreateScopedPhysicalNetwork(V4);
Mike Yu6ce587d2019-12-19 21:30:22 +08005344// network.init();
5345//
5346// auto dns = network.addIpv4Dns();
5347// StartDns(dns.dnsServer, {});
5348//
Luke Huang81568fb2020-07-13 00:55:12 +08005349// network.setDnsConfiguration();
Mike Yu6ce587d2019-12-19 21:30:22 +08005350// network.startTunForwarder();
5351//
5352// // Send queries here
5353// }
5354
5355class ResolverMultinetworkTest : public ResolverTest {
5356 protected:
5357 enum class ConnectivityType { V4, V6, V4V6 };
Luke Huang81568fb2020-07-13 00:55:12 +08005358 static constexpr int TEST_NETID_BASE = 10000;
Mike Yu6ce587d2019-12-19 21:30:22 +08005359
5360 struct DnsServerPair {
Luke Huang81568fb2020-07-13 00:55:12 +08005361 DnsServerPair(std::shared_ptr<test::DNSResponder> server, std::string addr)
5362 : dnsServer(server), dnsAddr(addr) {}
5363 std::shared_ptr<test::DNSResponder> dnsServer;
Mike Yu6ce587d2019-12-19 21:30:22 +08005364 std::string dnsAddr; // The DNS server address used for setResolverConfiguration().
5365 // TODO: Add test::DnsTlsFrontend* and std::string for DoT.
5366 };
5367
5368 class ScopedNetwork {
5369 public:
5370 ScopedNetwork(unsigned netId, ConnectivityType type, INetd* netdSrv,
Luke Huang81568fb2020-07-13 00:55:12 +08005371 IDnsResolver* dnsResolvSrv, const char* networkName)
Mike Yu6ce587d2019-12-19 21:30:22 +08005372 : mNetId(netId),
5373 mConnectivityType(type),
5374 mNetdSrv(netdSrv),
Luke Huang81568fb2020-07-13 00:55:12 +08005375 mDnsResolvSrv(dnsResolvSrv),
5376 mNetworkName(networkName) {
5377 mIfname = fmt::format("testtun{}", netId);
Mike Yu6ce587d2019-12-19 21:30:22 +08005378 }
Luke Huang81568fb2020-07-13 00:55:12 +08005379 virtual ~ScopedNetwork() {
5380 if (mNetdSrv != nullptr) mNetdSrv->networkDestroy(mNetId);
5381 if (mDnsResolvSrv != nullptr) mDnsResolvSrv->destroyNetworkCache(mNetId);
5382 }
Mike Yu6ce587d2019-12-19 21:30:22 +08005383
5384 Result<void> init();
Mike Yu6ce587d2019-12-19 21:30:22 +08005385 Result<DnsServerPair> addIpv4Dns() { return addDns(ConnectivityType::V4); }
5386 Result<DnsServerPair> addIpv6Dns() { return addDns(ConnectivityType::V6); }
5387 bool startTunForwarder() { return mTunForwarder->startForwarding(); }
Luke Huang81568fb2020-07-13 00:55:12 +08005388 bool setDnsConfiguration() const;
5389 bool clearDnsConfiguration() const;
Mike Yu6ce587d2019-12-19 21:30:22 +08005390 unsigned netId() const { return mNetId; }
Luke Huang81568fb2020-07-13 00:55:12 +08005391 std::string name() const { return mNetworkName; }
Mike Yu6ce587d2019-12-19 21:30:22 +08005392
Luke Huang81568fb2020-07-13 00:55:12 +08005393 protected:
5394 // Subclasses should implement it to decide which network should be create.
5395 virtual Result<void> createNetwork() const = 0;
Mike Yu6ce587d2019-12-19 21:30:22 +08005396
5397 const unsigned mNetId;
5398 const ConnectivityType mConnectivityType;
5399 INetd* mNetdSrv;
5400 IDnsResolver* mDnsResolvSrv;
Luke Huang81568fb2020-07-13 00:55:12 +08005401 const std::string mNetworkName;
Mike Yu6ce587d2019-12-19 21:30:22 +08005402 std::string mIfname;
5403 std::unique_ptr<TunForwarder> mTunForwarder;
Luke Huang81568fb2020-07-13 00:55:12 +08005404 std::vector<DnsServerPair> mDnsServerPairs;
5405
5406 private:
5407 Result<DnsServerPair> addDns(ConnectivityType connectivity);
5408 // Assuming mNetId is unique during ResolverMultinetworkTest, make the
5409 // address based on it to avoid conflicts.
5410 std::string makeIpv4AddrString(uint8_t n) const {
5411 return StringPrintf("192.168.%u.%u", (mNetId - TEST_NETID_BASE), n);
5412 }
5413 std::string makeIpv6AddrString(uint8_t n) const {
5414 return StringPrintf("2001:db8:%u::%u", (mNetId - TEST_NETID_BASE), n);
5415 }
5416 };
5417
5418 class ScopedPhysicalNetwork : public ScopedNetwork {
5419 public:
5420 ScopedPhysicalNetwork(unsigned netId, const char* networkName)
5421 : ScopedNetwork(netId, ConnectivityType::V4V6, nullptr, nullptr, networkName) {}
5422 ScopedPhysicalNetwork(unsigned netId, ConnectivityType type, INetd* netdSrv,
5423 IDnsResolver* dnsResolvSrv, const char* name = "Physical")
5424 : ScopedNetwork(netId, type, netdSrv, dnsResolvSrv, name) {}
5425
5426 protected:
5427 Result<void> createNetwork() const override {
5428 if (auto r = mNetdSrv->networkCreatePhysical(mNetId, INetd::PERMISSION_NONE);
5429 !r.isOk()) {
5430 return Error() << r.getMessage();
5431 }
5432 return {};
5433 }
5434 };
5435
5436 class ScopedVirtualNetwork : public ScopedNetwork {
5437 public:
5438 ScopedVirtualNetwork(unsigned netId, ConnectivityType type, INetd* netdSrv,
5439 IDnsResolver* dnsResolvSrv, const char* name, bool isSecure)
5440 : ScopedNetwork(netId, type, netdSrv, dnsResolvSrv, name), mIsSecure(isSecure) {}
5441 ~ScopedVirtualNetwork() {
5442 if (!mVpnIsolationUids.empty()) {
5443 const std::vector<int> tmpUids(mVpnIsolationUids.begin(), mVpnIsolationUids.end());
5444 mNetdSrv->firewallRemoveUidInterfaceRules(tmpUids);
5445 }
5446 }
5447 // Enable VPN isolation. Ensures that uid can only receive packets on mIfname.
5448 Result<void> enableVpnIsolation(int uid) {
5449 if (auto r = mNetdSrv->firewallAddUidInterfaceRules(mIfname, {uid}); !r.isOk()) {
5450 return Error() << r.getMessage();
5451 }
5452 mVpnIsolationUids.insert(uid);
5453 return {};
5454 }
5455 Result<void> disableVpnIsolation(int uid) {
5456 if (auto r = mNetdSrv->firewallRemoveUidInterfaceRules({static_cast<int>(uid)});
5457 !r.isOk()) {
5458 return Error() << r.getMessage();
5459 }
5460 mVpnIsolationUids.erase(uid);
5461 return {};
5462 }
5463 Result<void> addUser(uid_t uid) const { return addUidRange(uid, uid); }
5464 Result<void> addUidRange(uid_t from, uid_t to) const {
5465 if (auto r = mNetdSrv->networkAddUidRanges(mNetId, {makeUidRangeParcel(from, to)});
5466 !r.isOk()) {
5467 return Error() << r.getMessage();
5468 }
5469 return {};
5470 }
5471
5472 protected:
5473 Result<void> createNetwork() const override {
5474 if (auto r = mNetdSrv->networkCreateVpn(mNetId, mIsSecure); !r.isOk()) {
5475 return Error() << r.getMessage();
5476 }
5477 return {};
5478 }
5479
5480 bool mIsSecure = false;
5481 std::unordered_set<int> mVpnIsolationUids;
Mike Yu6ce587d2019-12-19 21:30:22 +08005482 };
5483
5484 void SetUp() override {
5485 ResolverTest::SetUp();
5486 ASSERT_NE(mDnsClient.netdService(), nullptr);
5487 ASSERT_NE(mDnsClient.resolvService(), nullptr);
5488 }
5489
Luke Huang81568fb2020-07-13 00:55:12 +08005490 void TearDown() override {
5491 ResolverTest::TearDown();
5492 // Restore default network
5493 if (mStoredDefaultNetwork >= 0) {
5494 mDnsClient.netdService()->networkSetDefault(mStoredDefaultNetwork);
5495 }
5496 }
Mike Yu6ce587d2019-12-19 21:30:22 +08005497
Luke Huang81568fb2020-07-13 00:55:12 +08005498 ScopedPhysicalNetwork CreateScopedPhysicalNetwork(ConnectivityType type,
5499 const char* name = "Physical") {
5500 return {getFreeNetId(), type, mDnsClient.netdService(), mDnsClient.resolvService(), name};
5501 }
5502 ScopedVirtualNetwork CreateScopedVirtualNetwork(ConnectivityType type, bool isSecure,
5503 const char* name = "Virtual") {
5504 return {getFreeNetId(), type, mDnsClient.netdService(), mDnsClient.resolvService(),
5505 name, isSecure};
5506 }
Mike Yu6ce587d2019-12-19 21:30:22 +08005507 void StartDns(test::DNSResponder& dns, const std::vector<DnsRecord>& records);
Luke Huang81568fb2020-07-13 00:55:12 +08005508 void setDefaultNetwork(int netId) {
5509 // Save current default network at the first call.
5510 std::call_once(defaultNetworkFlag, [&]() {
5511 ASSERT_TRUE(mDnsClient.netdService()->networkGetDefault(&mStoredDefaultNetwork).isOk());
5512 });
5513 ASSERT_TRUE(mDnsClient.netdService()->networkSetDefault(netId).isOk());
5514 }
5515 unsigned getFreeNetId() {
5516 if (mNextNetId == TEST_NETID_BASE + 256) mNextNetId = TEST_NETID_BASE;
5517 return mNextNetId++;
5518 }
Mike Yu6ce587d2019-12-19 21:30:22 +08005519
5520 private:
5521 // Use a different netId because this class inherits from the class ResolverTest which
Luke Huang81568fb2020-07-13 00:55:12 +08005522 // always creates TEST_NETID in setup. It's incremented when CreateScoped{Physical,
5523 // Virtual}Network() is called.
5524 // Note: 255 is the maximum number of (mNextNetId - TEST_NETID_BASE) here as mNextNetId
5525 // is used to create address.
5526 unsigned mNextNetId = TEST_NETID_BASE;
5527 // Use -1 to represent that default network was not modified because
5528 // real netId must be an unsigned value.
5529 int mStoredDefaultNetwork = -1;
5530 std::once_flag defaultNetworkFlag;
Mike Yu6ce587d2019-12-19 21:30:22 +08005531};
5532
Mike Yu6ce587d2019-12-19 21:30:22 +08005533Result<void> ResolverMultinetworkTest::ScopedNetwork::init() {
Luke Huang81568fb2020-07-13 00:55:12 +08005534 if (mNetdSrv == nullptr || mDnsResolvSrv == nullptr) return Error() << "srv not available";
Mike Yu6ce587d2019-12-19 21:30:22 +08005535 unique_fd ufd = TunForwarder::createTun(mIfname);
5536 if (!ufd.ok()) {
5537 return Errorf("createTun for {} failed", mIfname);
5538 }
5539 mTunForwarder = std::make_unique<TunForwarder>(std::move(ufd));
5540
Luke Huang81568fb2020-07-13 00:55:12 +08005541 if (auto r = createNetwork(); !r.ok()) {
5542 return r;
Mike Yu6ce587d2019-12-19 21:30:22 +08005543 }
5544 if (auto r = mDnsResolvSrv->createNetworkCache(mNetId); !r.isOk()) {
5545 return Error() << r.getMessage();
5546 }
5547 if (auto r = mNetdSrv->networkAddInterface(mNetId, mIfname); !r.isOk()) {
5548 return Error() << r.getMessage();
5549 }
5550
5551 if (mConnectivityType == ConnectivityType::V4 || mConnectivityType == ConnectivityType::V4V6) {
5552 const std::string v4Addr = makeIpv4AddrString(1);
5553 if (auto r = mNetdSrv->interfaceAddAddress(mIfname, v4Addr, 32); !r.isOk()) {
5554 return Error() << r.getMessage();
5555 }
5556 if (auto r = mNetdSrv->networkAddRoute(mNetId, mIfname, "0.0.0.0/0", ""); !r.isOk()) {
5557 return Error() << r.getMessage();
5558 }
5559 }
5560 if (mConnectivityType == ConnectivityType::V6 || mConnectivityType == ConnectivityType::V4V6) {
5561 const std::string v6Addr = makeIpv6AddrString(1);
5562 if (auto r = mNetdSrv->interfaceAddAddress(mIfname, v6Addr, 128); !r.isOk()) {
5563 return Error() << r.getMessage();
5564 }
5565 if (auto r = mNetdSrv->networkAddRoute(mNetId, mIfname, "::/0", ""); !r.isOk()) {
5566 return Error() << r.getMessage();
5567 }
5568 }
5569
5570 return {};
5571}
5572
Mike Yu6ce587d2019-12-19 21:30:22 +08005573void ResolverMultinetworkTest::StartDns(test::DNSResponder& dns,
5574 const std::vector<DnsRecord>& records) {
5575 ResolverTest::StartDns(dns, records);
5576
5577 // Bind the DNSResponder's sockets to the network if specified.
5578 if (std::optional<unsigned> netId = dns.getNetwork(); netId.has_value()) {
5579 setNetworkForSocket(netId.value(), dns.getUdpSocket());
5580 setNetworkForSocket(netId.value(), dns.getTcpSocket());
5581 }
5582}
5583
5584Result<ResolverMultinetworkTest::DnsServerPair> ResolverMultinetworkTest::ScopedNetwork::addDns(
5585 ConnectivityType type) {
Luke Huang81568fb2020-07-13 00:55:12 +08005586 const int index = mDnsServerPairs.size();
Mike Yu6ce587d2019-12-19 21:30:22 +08005587 const int prefixLen = (type == ConnectivityType::V4) ? 32 : 128;
5588
5589 const std::function<std::string(unsigned)> makeIpString =
5590 std::bind((type == ConnectivityType::V4) ? &ScopedNetwork::makeIpv4AddrString
5591 : &ScopedNetwork::makeIpv6AddrString,
5592 this, std::placeholders::_1);
5593
5594 std::string src1 = makeIpString(1); // The address from which the resolver will send.
Luke Huang81568fb2020-07-13 00:55:12 +08005595 std::string dst1 = makeIpString(
5596 index + 100 +
5597 (mNetId - TEST_NETID_BASE)); // The address to which the resolver will send.
Mike Yu6ce587d2019-12-19 21:30:22 +08005598 std::string src2 = dst1; // The address translated from src1.
Luke Huang81568fb2020-07-13 00:55:12 +08005599 std::string dst2 = makeIpString(
5600 index + 200 + (mNetId - TEST_NETID_BASE)); // The address translated from dst2.
Mike Yu6ce587d2019-12-19 21:30:22 +08005601
5602 if (!mTunForwarder->addForwardingRule({src1, dst1}, {src2, dst2}) ||
5603 !mTunForwarder->addForwardingRule({dst2, src2}, {dst1, src1})) {
5604 return Errorf("Failed to add the rules ({}, {}, {}, {})", src1, dst1, src2, dst2);
5605 }
5606
5607 if (!mNetdSrv->interfaceAddAddress(mIfname, dst2, prefixLen).isOk()) {
5608 return Errorf("interfaceAddAddress({}, {}, {}) failed", mIfname, dst2, prefixLen);
5609 }
5610
Luke Huang81568fb2020-07-13 00:55:12 +08005611 return mDnsServerPairs.emplace_back(std::make_shared<test::DNSResponder>(mNetId, dst2), dst1);
Mike Yu6ce587d2019-12-19 21:30:22 +08005612}
5613
Luke Huang81568fb2020-07-13 00:55:12 +08005614bool ResolverMultinetworkTest::ScopedNetwork::setDnsConfiguration() const {
5615 if (mDnsResolvSrv == nullptr) return false;
5616 ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
5617 parcel.tlsServers.clear();
5618 parcel.netId = mNetId;
5619 parcel.servers.clear();
5620 for (const auto& pair : mDnsServerPairs) {
5621 parcel.servers.push_back(pair.dnsAddr);
5622 }
5623 return mDnsResolvSrv->setResolverConfiguration(parcel).isOk();
5624}
5625
5626bool ResolverMultinetworkTest::ScopedNetwork::clearDnsConfiguration() const {
5627 if (mDnsResolvSrv == nullptr) return false;
5628 return mDnsResolvSrv->destroyNetworkCache(mNetId).isOk() &&
5629 mDnsResolvSrv->createNetworkCache(mNetId).isOk();
5630}
5631
5632namespace {
5633
5634// Convenient wrapper for making getaddrinfo call like framework.
5635Result<ScopedAddrinfo> android_getaddrinfofornet_wrapper(const char* name, int netId) {
5636 // Use the same parameter as libcore/ojluni/src/main/java/java/net/Inet6AddressImpl.java.
5637 static const addrinfo hints = {
5638 .ai_flags = AI_ADDRCONFIG,
5639 .ai_family = AF_UNSPEC,
5640 .ai_socktype = SOCK_STREAM,
5641 };
5642 addrinfo* result = nullptr;
5643 if (int r = android_getaddrinfofornet(name, nullptr, &hints, netId, MARK_UNSET, &result)) {
5644 return Error() << r;
5645 }
5646 return ScopedAddrinfo(result);
5647}
5648
5649void expectDnsWorksForUid(const char* name, unsigned netId, uid_t uid,
5650 const std::vector<std::string>& expectedResult) {
5651 ScopedChangeUID scopedChangeUID(uid);
5652 auto result = android_getaddrinfofornet_wrapper(name, netId);
5653 ASSERT_RESULT_OK(result);
5654 ScopedAddrinfo ai_result(std::move(result.value()));
5655 std::vector<std::string> result_strs = ToStrings(ai_result);
5656 EXPECT_THAT(result_strs, testing::UnorderedElementsAreArray(expectedResult));
5657}
5658
5659} // namespace
5660
Mike Yu6ce587d2019-12-19 21:30:22 +08005661TEST_F(ResolverMultinetworkTest, GetAddrInfo_AI_ADDRCONFIG) {
5662 constexpr char host_name[] = "ohayou.example.com.";
5663
5664 const std::array<ConnectivityType, 3> allTypes = {
5665 ConnectivityType::V4,
5666 ConnectivityType::V6,
5667 ConnectivityType::V4V6,
5668 };
5669 for (const auto& type : allTypes) {
5670 SCOPED_TRACE(StringPrintf("ConnectivityType: %d", type));
5671
5672 // Create a network.
Luke Huang81568fb2020-07-13 00:55:12 +08005673 ScopedPhysicalNetwork network = CreateScopedPhysicalNetwork(type);
Mike Yu6ce587d2019-12-19 21:30:22 +08005674 ASSERT_RESULT_OK(network.init());
5675
5676 // Add a testing DNS server.
5677 const Result<DnsServerPair> dnsPair =
5678 (type == ConnectivityType::V4) ? network.addIpv4Dns() : network.addIpv6Dns();
5679 ASSERT_RESULT_OK(dnsPair);
Luke Huang81568fb2020-07-13 00:55:12 +08005680 StartDns(*dnsPair->dnsServer, {{host_name, ns_type::ns_t_a, "192.0.2.0"},
5681 {host_name, ns_type::ns_t_aaaa, "2001:db8:cafe:d00d::31"}});
Mike Yu6ce587d2019-12-19 21:30:22 +08005682
5683 // Set up resolver and start forwarding.
Luke Huang81568fb2020-07-13 00:55:12 +08005684 ASSERT_TRUE(network.setDnsConfiguration());
Mike Yu6ce587d2019-12-19 21:30:22 +08005685 ASSERT_TRUE(network.startTunForwarder());
5686
Luke Huang81568fb2020-07-13 00:55:12 +08005687 auto result = android_getaddrinfofornet_wrapper(host_name, network.netId());
5688 ASSERT_RESULT_OK(result);
5689 ScopedAddrinfo ai_result(std::move(result.value()));
Mike Yu6ce587d2019-12-19 21:30:22 +08005690 std::vector<std::string> result_strs = ToStrings(ai_result);
5691 std::vector<std::string> expectedResult;
5692 size_t expectedQueries = 0;
5693
5694 if (type == ConnectivityType::V6 || type == ConnectivityType::V4V6) {
5695 expectedResult.emplace_back("2001:db8:cafe:d00d::31");
5696 expectedQueries++;
5697 }
5698 if (type == ConnectivityType::V4 || type == ConnectivityType::V4V6) {
Luke Huang81568fb2020-07-13 00:55:12 +08005699 expectedResult.emplace_back("192.0.2.0");
Mike Yu6ce587d2019-12-19 21:30:22 +08005700 expectedQueries++;
5701 }
5702 EXPECT_THAT(result_strs, testing::UnorderedElementsAreArray(expectedResult));
Luke Huang81568fb2020-07-13 00:55:12 +08005703 EXPECT_EQ(GetNumQueries(*dnsPair->dnsServer, host_name), expectedQueries);
Mike Yu6ce587d2019-12-19 21:30:22 +08005704 }
5705}
5706
5707TEST_F(ResolverMultinetworkTest, NetworkDestroyedDuringQueryInFlight) {
5708 constexpr char host_name[] = "ohayou.example.com.";
5709
5710 // Create a network and add an ipv4 DNS server.
Luke Huang81568fb2020-07-13 00:55:12 +08005711 auto network = std::make_unique<ScopedPhysicalNetwork>(getFreeNetId(), ConnectivityType::V4V6,
5712 mDnsClient.netdService(),
5713 mDnsClient.resolvService());
Mike Yu6ce587d2019-12-19 21:30:22 +08005714 ASSERT_RESULT_OK(network->init());
5715 const Result<DnsServerPair> dnsPair = network->addIpv4Dns();
5716 ASSERT_RESULT_OK(dnsPair);
5717
5718 // Set the DNS server unresponsive.
Luke Huang81568fb2020-07-13 00:55:12 +08005719 dnsPair->dnsServer->setResponseProbability(0.0);
5720 dnsPair->dnsServer->setErrorRcode(static_cast<ns_rcode>(-1));
5721 StartDns(*dnsPair->dnsServer, {});
Mike Yu6ce587d2019-12-19 21:30:22 +08005722
5723 // Set up resolver and start forwarding.
Luke Huang81568fb2020-07-13 00:55:12 +08005724 ASSERT_TRUE(network->setDnsConfiguration());
Mike Yu6ce587d2019-12-19 21:30:22 +08005725 ASSERT_TRUE(network->startTunForwarder());
5726
5727 // Expect the things happening in order:
5728 // 1. The thread sends the query to the dns server which is unresponsive.
5729 // 2. The network is destroyed while the thread is waiting for the response from the dns server.
5730 // 3. After the dns server timeout, the thread retries but fails to connect.
5731 std::thread lookup([&]() {
5732 int fd = resNetworkQuery(network->netId(), host_name, ns_c_in, ns_t_a, 0);
5733 EXPECT_TRUE(fd != -1);
5734 expectAnswersNotValid(fd, -ETIMEDOUT);
5735 });
5736
5737 // Tear down the network as soon as the dns server receives the query.
Luke Huang81568fb2020-07-13 00:55:12 +08005738 const auto condition = [&]() { return GetNumQueries(*dnsPair->dnsServer, host_name) == 1U; };
Mike Yu6ce587d2019-12-19 21:30:22 +08005739 EXPECT_TRUE(PollForCondition(condition));
5740 network.reset();
5741
5742 lookup.join();
5743}
5744
5745TEST_F(ResolverMultinetworkTest, OneCachePerNetwork) {
5746 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
5747 constexpr char host_name[] = "ohayou.example.com.";
5748
Luke Huang81568fb2020-07-13 00:55:12 +08005749 ScopedPhysicalNetwork network1 = CreateScopedPhysicalNetwork(ConnectivityType::V4V6);
5750 ScopedPhysicalNetwork network2 = CreateScopedPhysicalNetwork(ConnectivityType::V4V6);
Mike Yu6ce587d2019-12-19 21:30:22 +08005751 ASSERT_RESULT_OK(network1.init());
5752 ASSERT_RESULT_OK(network2.init());
5753
5754 const Result<DnsServerPair> dnsPair1 = network1.addIpv4Dns();
5755 const Result<DnsServerPair> dnsPair2 = network2.addIpv4Dns();
5756 ASSERT_RESULT_OK(dnsPair1);
5757 ASSERT_RESULT_OK(dnsPair2);
Luke Huang81568fb2020-07-13 00:55:12 +08005758 StartDns(*dnsPair1->dnsServer, {{host_name, ns_type::ns_t_a, "192.0.2.0"}});
5759 StartDns(*dnsPair2->dnsServer, {{host_name, ns_type::ns_t_a, "192.0.2.1"}});
Mike Yu6ce587d2019-12-19 21:30:22 +08005760
5761 // Set up resolver for network 1 and start forwarding.
Luke Huang81568fb2020-07-13 00:55:12 +08005762 ASSERT_TRUE(network1.setDnsConfiguration());
Mike Yu6ce587d2019-12-19 21:30:22 +08005763 ASSERT_TRUE(network1.startTunForwarder());
5764
5765 // Set up resolver for network 2 and start forwarding.
Luke Huang81568fb2020-07-13 00:55:12 +08005766 ASSERT_TRUE(network2.setDnsConfiguration());
Mike Yu6ce587d2019-12-19 21:30:22 +08005767 ASSERT_TRUE(network2.startTunForwarder());
5768
5769 // Send the same queries to both networks.
5770 int fd1 = resNetworkQuery(network1.netId(), host_name, ns_c_in, ns_t_a, 0);
5771 int fd2 = resNetworkQuery(network2.netId(), host_name, ns_c_in, ns_t_a, 0);
5772
Luke Huang81568fb2020-07-13 00:55:12 +08005773 expectAnswersValid(fd1, AF_INET, "192.0.2.0");
5774 expectAnswersValid(fd2, AF_INET, "192.0.2.1");
5775 EXPECT_EQ(GetNumQueries(*dnsPair1->dnsServer, host_name), 1U);
5776 EXPECT_EQ(GetNumQueries(*dnsPair2->dnsServer, host_name), 1U);
Mike Yu6ce587d2019-12-19 21:30:22 +08005777
5778 // Flush the cache of network 1, and send the queries again.
5779 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(network1.netId()).isOk());
5780 fd1 = resNetworkQuery(network1.netId(), host_name, ns_c_in, ns_t_a, 0);
5781 fd2 = resNetworkQuery(network2.netId(), host_name, ns_c_in, ns_t_a, 0);
5782
Luke Huang81568fb2020-07-13 00:55:12 +08005783 expectAnswersValid(fd1, AF_INET, "192.0.2.0");
5784 expectAnswersValid(fd2, AF_INET, "192.0.2.1");
5785 EXPECT_EQ(GetNumQueries(*dnsPair1->dnsServer, host_name), 2U);
5786 EXPECT_EQ(GetNumQueries(*dnsPair2->dnsServer, host_name), 1U);
5787}
5788
5789TEST_F(ResolverMultinetworkTest, DnsWithVpn) {
5790 SKIP_IF_REMOTE_VERSION_LESS_THAN(mDnsClient.resolvService(), 4);
5791 SKIP_IF_BPF_NOT_SUPPORTED;
5792 constexpr char host_name[] = "ohayou.example.com.";
5793 constexpr char ipv4_addr[] = "192.0.2.0";
5794 constexpr char ipv6_addr[] = "2001:db8:cafe:d00d::31";
5795
5796 const std::pair<ConnectivityType, std::vector<std::string>> testPairs[] = {
5797 {ConnectivityType::V4, {ipv4_addr}},
5798 {ConnectivityType::V6, {ipv6_addr}},
5799 {ConnectivityType::V4V6, {ipv6_addr, ipv4_addr}},
5800 };
5801 for (const auto& [type, result] : testPairs) {
5802 SCOPED_TRACE(StringPrintf("ConnectivityType: %d", type));
5803
5804 // Create a network.
5805 ScopedPhysicalNetwork underlyingNetwork = CreateScopedPhysicalNetwork(type, "Underlying");
5806 ScopedVirtualNetwork bypassableVpnNetwork =
5807 CreateScopedVirtualNetwork(type, false, "BypassableVpn");
5808 ScopedVirtualNetwork secureVpnNetwork = CreateScopedVirtualNetwork(type, true, "SecureVpn");
5809
5810 ASSERT_RESULT_OK(underlyingNetwork.init());
5811 ASSERT_RESULT_OK(bypassableVpnNetwork.init());
5812 ASSERT_RESULT_OK(secureVpnNetwork.init());
5813 ASSERT_RESULT_OK(bypassableVpnNetwork.addUser(TEST_UID));
5814 ASSERT_RESULT_OK(secureVpnNetwork.addUser(TEST_UID2));
5815
5816 auto setupDnsFn = [&](std::shared_ptr<test::DNSResponder> dnsServer,
5817 ScopedNetwork* nw) -> void {
5818 StartDns(*dnsServer, {{host_name, ns_type::ns_t_a, ipv4_addr},
5819 {host_name, ns_type::ns_t_aaaa, ipv6_addr}});
5820 ASSERT_TRUE(nw->setDnsConfiguration());
5821 ASSERT_TRUE(nw->startTunForwarder());
5822 };
5823 // Add a testing DNS server to networks.
5824 const Result<DnsServerPair> underlyingPair = (type == ConnectivityType::V4)
5825 ? underlyingNetwork.addIpv4Dns()
5826 : underlyingNetwork.addIpv6Dns();
5827 ASSERT_RESULT_OK(underlyingPair);
5828 const Result<DnsServerPair> bypassableVpnPair = (type == ConnectivityType::V4)
5829 ? bypassableVpnNetwork.addIpv4Dns()
5830 : bypassableVpnNetwork.addIpv6Dns();
5831 ASSERT_RESULT_OK(bypassableVpnPair);
5832 const Result<DnsServerPair> secureVpnPair = (type == ConnectivityType::V4)
5833 ? secureVpnNetwork.addIpv4Dns()
5834 : secureVpnNetwork.addIpv6Dns();
5835 ASSERT_RESULT_OK(secureVpnPair);
5836 // Set up resolver and start forwarding for networks.
5837 setupDnsFn(underlyingPair->dnsServer, &underlyingNetwork);
5838 setupDnsFn(bypassableVpnPair->dnsServer, &bypassableVpnNetwork);
5839 setupDnsFn(secureVpnPair->dnsServer, &secureVpnNetwork);
5840
5841 setDefaultNetwork(underlyingNetwork.netId());
5842 const unsigned underlyingNetId = underlyingNetwork.netId();
5843 const unsigned bypassableVpnNetId = bypassableVpnNetwork.netId();
5844 const unsigned secureVpnNetId = secureVpnNetwork.netId();
5845 // We've called setNetworkForProcess in SetupOemNetwork, so reset to default first.
5846 ScopedSetNetworkForProcess scopedSetNetworkForProcess(NETID_UNSET);
5847 auto expectDnsQueryCountsFn = [&](size_t count,
5848 std::shared_ptr<test::DNSResponder> dnsServer,
5849 unsigned expectedDnsNetId) -> void {
5850 EXPECT_EQ(GetNumQueries(*dnsServer, host_name), count);
5851 EXPECT_TRUE(mDnsClient.resolvService()->flushNetworkCache(expectedDnsNetId).isOk());
5852 dnsServer->clearQueries();
5853 // Give DnsResolver some time to clear cache to avoid race.
5854 usleep(5 * 1000);
5855 };
5856
5857 // Create a object to represent default network, do not init it.
5858 ScopedPhysicalNetwork defaultNetwork{NETID_UNSET, "Default"};
5859
5860 // Test VPN with DNS server under 4 different network selection scenarios.
5861 // See the test config for the expectation.
5862 const struct TestConfig {
5863 ScopedNetwork* selectedNetwork;
5864 unsigned expectedDnsNetId;
5865 std::shared_ptr<test::DNSResponder> expectedDnsServer;
5866 } vpnWithDnsServerConfigs[]{
5867 // clang-format off
5868 // Queries use the bypassable VPN by default.
5869 {&defaultNetwork, bypassableVpnNetId, bypassableVpnPair->dnsServer},
5870 // Choosing the underlying network works because the VPN is bypassable.
5871 {&underlyingNetwork, underlyingNetId, underlyingPair->dnsServer},
5872 // Selecting the VPN sends the query on the VPN.
5873 {&bypassableVpnNetwork, bypassableVpnNetId, bypassableVpnPair->dnsServer},
5874 // TEST_UID does not have access to the secure VPN.
5875 {&secureVpnNetwork, bypassableVpnNetId, bypassableVpnPair->dnsServer},
5876 // clang-format on
5877 };
5878 for (const auto& config : vpnWithDnsServerConfigs) {
5879 SCOPED_TRACE(fmt::format("Bypassble VPN with DnsServer, selectedNetwork = {}",
5880 config.selectedNetwork->name()));
5881 expectDnsWorksForUid(host_name, config.selectedNetwork->netId(), TEST_UID, result);
5882 expectDnsQueryCountsFn(result.size(), config.expectedDnsServer,
5883 config.expectedDnsNetId);
5884 }
5885
5886 std::vector<ScopedNetwork*> nwVec{&defaultNetwork, &underlyingNetwork,
5887 &bypassableVpnNetwork, &secureVpnNetwork};
5888 // Test the VPN without DNS server with the same combination as before.
5889 ASSERT_TRUE(bypassableVpnNetwork.clearDnsConfiguration());
5890 // Test bypassable VPN, TEST_UID
5891 for (const auto* selectedNetwork : nwVec) {
5892 SCOPED_TRACE(fmt::format("Bypassble VPN without DnsServer, selectedNetwork = {}",
5893 selectedNetwork->name()));
5894 expectDnsWorksForUid(host_name, selectedNetwork->netId(), TEST_UID, result);
5895 expectDnsQueryCountsFn(result.size(), underlyingPair->dnsServer, underlyingNetId);
5896 }
5897
5898 // The same test scenario as before plus enableVpnIsolation for secure VPN, TEST_UID2.
5899 for (bool enableVpnIsolation : {false, true}) {
5900 SCOPED_TRACE(fmt::format("enableVpnIsolation = {}", enableVpnIsolation));
5901 if (enableVpnIsolation) {
5902 EXPECT_RESULT_OK(secureVpnNetwork.enableVpnIsolation(TEST_UID2));
5903 }
5904
5905 // Test secure VPN without DNS server.
5906 ASSERT_TRUE(secureVpnNetwork.clearDnsConfiguration());
5907 for (const auto* selectedNetwork : nwVec) {
5908 SCOPED_TRACE(fmt::format("Secure VPN without DnsServer, selectedNetwork = {}",
5909 selectedNetwork->name()));
5910 expectDnsWorksForUid(host_name, selectedNetwork->netId(), TEST_UID2, result);
5911 expectDnsQueryCountsFn(result.size(), underlyingPair->dnsServer, underlyingNetId);
5912 }
5913
5914 // Test secure VPN with DNS server.
5915 ASSERT_TRUE(secureVpnNetwork.setDnsConfiguration());
5916 for (const auto* selectedNetwork : nwVec) {
5917 SCOPED_TRACE(fmt::format("Secure VPN with DnsServer, selectedNetwork = {}",
5918 selectedNetwork->name()));
5919 expectDnsWorksForUid(host_name, selectedNetwork->netId(), TEST_UID2, result);
5920 expectDnsQueryCountsFn(result.size(), secureVpnPair->dnsServer, secureVpnNetId);
5921 }
5922
5923 if (enableVpnIsolation) {
5924 EXPECT_RESULT_OK(secureVpnNetwork.disableVpnIsolation(TEST_UID2));
5925 }
5926 }
5927 }
Mike Yu6ce587d2019-12-19 21:30:22 +08005928}